tungsten 0.2.18 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/tungsten/_icons.js +1 -1
- data/app/assets/stylesheets/tungsten/components/_cards.scss +20 -2
- data/app/assets/stylesheets/tungsten/components/_notices.scss +34 -0
- data/app/assets/stylesheets/tungsten/components/_toggle-nav.scss +51 -0
- data/app/assets/stylesheets/tungsten/core/_nav-tabs.scss +4 -2
- data/app/assets/stylesheets/tungsten/form/_check-radio.scss +16 -1
- data/app/helpers/tungsten/notice_helper.rb +10 -0
- data/app/helpers/tungsten/toggle_nav_helper.rb +1 -0
- data/lib/tungsten/version.rb +1 -1
- data/public/{code-0.2.18.js → code-0.2.19.js} +0 -0
- data/public/{code-0.2.18.js.gz → code-0.2.19.js.gz} +0 -0
- data/public/{tungsten-0.2.18.css → tungsten-0.2.19.css} +87 -12
- data/public/tungsten-0.2.19.css.gz +0 -0
- data/public/{tungsten-0.2.18.js → tungsten-0.2.19.js} +66 -104
- data/public/tungsten-0.2.19.js.gz +0 -0
- metadata +8 -8
- data/public/tungsten-0.2.18.css.gz +0 -0
- data/public/tungsten-0.2.18.js.gz +0 -0
|
Binary file
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
|
|
78
78
|
function embed() {
|
|
79
79
|
if (!document.querySelector('#esvg-svg-icons')) {
|
|
80
|
-
document.querySelector('body').insertAdjacentHTML('afterbegin', '<svg id="esvg-svg-icons" data-symbol-class="svg-symbol" data-prefix="svg" version="1.1" style="height:0;position:absolute" data-turbolinks-permanent><symbol id="svg-angle-down" data-name="angle-down" viewBox="0 0 27 15" width="27" height="15" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M25.304.005c.092.012.116.012.206.036.135.036.263.096.377.176.348.244.545.665.508 1.088a1.196 1.196 0 0 1-.277.666c-.022.027-.047.052-.07.078l-12 12c-.026.023-.051.048-.078.07a1.198 1.198 0 0 1-1.542 0c-.027-.022-.052-.047-.077-.07l-12-12C.288 1.98.27 1.965.216 1.888a1.193 1.193 0 0 1-.176-.377A1.21 1.21 0 0 1 .789.072a1.2 1.2 0 0 1 1.098.145c.077.053.092.072.161.134l11.151 11.152L24.351.351l.077-.07c.073-.057.09-.074.171-.12.121-.07.254-.119.392-.143.092-.016.115-.014.208-.018l.105.005z" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-down-circle" data-name="arrow-down-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.218 18.943l-5.243 5.243a1.217 1.217 0 0 1-.951.479c-.005 0-.01-.005-.017-.005-.008 0-.013.005-.02.005-.315 0-.629-.121-.87-.359l-5.361-5.363a1.225 1.225 0 0 1 0-1.738 1.23 1.23 0 0 1 1.738 0l3.301 3.301V9.322a1.23 1.23 0 0 1 2.458 0V20.43l3.227-3.225a1.23 1.23 0 0 1 1.738 0 1.23 1.23 0 0 1 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-up-circle" data-name="arrow-up-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.294 14.798a1.225 1.225 0 0 1-.87.359c-.315 0-.627-.118-.868-.359l-3.303-3.305v11.188a1.23 1.23 0 0 1-2.458 0V11.569l-3.227 3.229a1.229 1.229 0 0 1-1.738-1.737l5.243-5.248a1.22 1.22 0 0 1 .951-.479c.007 0 .012.005.019.005.008 0 .013-.005.02-.005.327 0 .639.13.868.359l5.363 5.368a1.23 1.23 0 0 1 0 1.737" fill-rule="nonzero"/></symbol><symbol id="svg-backup" data-name="backup" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.039 23.889a33.24 33.24 0 0 1-2.705.111C8.047 24 2.483 22.656 0 20.483v2.85c0 3.364 5.856 6 13.334 6 1.358 0 2.661-.088 3.888-.25A8.609 8.609 0 0 1 16 24.667c0-.263.015-.522.039-.778zm-2.706-1.222c1.004 0 1.988-.047 2.943-.131a8.686 8.686 0 0 1 3.807-5.212 34.585 34.585 0 0 1-6.75.676C8.047 18 2.483 16.656 0 14.483V18c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.439V8.892C23.819 10.807 18.377 12 13.333 12 8.047 12 2.483 10.656 0 8.483V12c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.438V6c0-3.364-5.858-6-13.334-6S0 2.636 0 6c0 2.113 5.948 4.667 13.333 4.667z" fill-opacity=".502"/><path d="M28 25.333h-2.667V28A.667.667 0 0 1 24 28v-2.667h-2.667a.666.666 0 1 1 0-1.333H24v-2.667a.667.667 0 0 1 1.333 0V24H28a.667.667 0 0 1 0 1.333m-3.333-8c-4.044 0-7.334 3.29-7.334 7.334S20.623 32 24.667 32C28.709 32 32 28.711 32 24.667c0-4.044-3.291-7.334-7.333-7.334" fill-rule="nonzero"/></symbol><symbol id="svg-check-circle" data-name="check-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M24.925 12.745L14.704 23.944l-7.589-7.587a1.22 1.22 0 0 1 0-1.732 1.216 1.216 0 0 1 1.732 0l5.776 5.775 8.491-9.307a1.226 1.226 0 1 1 1.811 1.652" fill-rule="nonzero"/></symbol><symbol id="svg-cluster" data-name="cluster" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 32a2.906 2.906 0 0 1-.505-.045 2.836 2.836 0 0 1-1.475-.768A2936.603 2936.603 0 0 1 .813 17.98a2.813 2.813 0 0 1 0-3.96C5.201 9.604 9.604 5.201 14.02.813a2.813 2.813 0 0 1 3.96 0c4.416 4.388 8.819 8.791 13.207 13.207a2.813 2.813 0 0 1 0 3.96A2936.603 2936.603 0 0 1 17.98 31.187a2.878 2.878 0 0 1-.533.414 2.81 2.81 0 0 1-1.379.398L16 32zm0-1.883a.927.927 0 0 0 .657-.27c4.412-4.384 8.839-8.755 13.195-13.195a.901.901 0 0 0 .181-.263.947.947 0 0 0-.106-.954.901.901 0 0 0-.075-.087 977.85 977.85 0 0 0-13.2-13.2.901.901 0 0 0-.263-.181.947.947 0 0 0-.95.102 1.145 1.145 0 0 0-.091.079 977.85 977.85 0 0 0-13.2 13.2.962.962 0 0 0-.181.263.947.947 0 0 0 .106.954c.023.031.049.06.075.087a977.85 977.85 0 0 0 13.2 13.2.92.92 0 0 0 .635.265H16z" fill-opacity=".502" fill-rule="nonzero"/><path d="M17.482 26.929l-.847.847a.897.897 0 0 1-1.27 0L4.224 16.635a.897.897 0 0 1 0-1.27L15.365 4.224a.897.897 0 0 1 1.27 0l4.049 4.049v5.457a2.353 2.353 0 0 0-1.708 1.971 2.352 2.352 0 0 0 2.335 2.654l.061-.001a2.382 2.382 0 0 0 .948-.226 2.357 2.357 0 0 0-.132-4.314 2.6 2.6 0 0 0-.249-.084V9.528l5.837 5.837a.897.897 0 0 1 0 1.27l-6.639 6.639-4.509-4.51v-6.508a2.377 2.377 0 0 0 1.494-1.249 2.366 2.366 0 0 0 .205-1.379 2.365 2.365 0 0 0-1.897-1.957 2.363 2.363 0 0 0-1.36.151 2.377 2.377 0 0 0-1.204 1.169 2.34 2.34 0 0 0-.178 1.44 2.366 2.366 0 0 0 1.684 1.825v6.768c.002.049.001.061.01.109.016.09.051.177.104.251.028.04.037.048.07.084l4.693 4.694-1.879 1.879-6.962-6.961v-.81a2.359 2.359 0 0 0 1.482-3.317 2.38 2.38 0 0 0-1.679-1.268 2.372 2.372 0 0 0-1.36.151 2.353 2.353 0 0 0-1.406 1.865 2.352 2.352 0 0 0 1.708 2.569v1.07c.001.039.001.049.006.089a.642.642 0 0 0 .147.322l.031.032 7.145 7.146zm-6.701-9.83a1.07 1.07 0 0 0 .728-.277 1.107 1.107 0 0 0 .343-.573 1.106 1.106 0 0 0-.638-1.259 1.097 1.097 0 0 0-1.419.522 1.09 1.09 0 0 0-.093.703 1.1 1.1 0 0 0 1.05.884h.029zm10.53 0a1.07 1.07 0 0 0 .739-.285c.087-.079.161-.172.219-.273a1.099 1.099 0 1 0-.986.558h.028zM16 11.085a1.081 1.081 0 0 0 .729-.277 1.091 1.091 0 0 0 .361-.963 1.095 1.095 0 0 0-1.076-.958 1.095 1.095 0 0 0-1.099.924 1.088 1.088 0 0 0 .337.979 1.08 1.08 0 0 0 .719.295H16z"/></symbol><symbol id="svg-copy" data-name="copy" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill-rule="nonzero"><path d="M22.667 4.667A.667.667 0 0 0 22 4h-3.333v10.495a9.916 9.916 0 0 1 4-1.127V4.667zM4 25.333V4H.667A.667.667 0 0 0 0 4.667V26a3.338 3.338 0 0 0 3.333 3.333h12.019a9.95 9.95 0 0 1-1.817-4H4z" fill-opacity=".302"/><path d="M14 12H7.333a.667.667 0 0 0 0 1.333H14A.667.667 0 1 0 14 12M14 14.667H7.333a.666.666 0 1 0 0 1.333H14a.667.667 0 0 0 0-1.333M14.667 18a.667.667 0 0 0-.667-.667H7.333a.667.667 0 0 0 0 1.334H14a.667.667 0 0 0 .667-.667M7.333 20a.667.667 0 0 0 0 1.333h4a.667.667 0 1 0 0-1.333h-4z" fill-opacity=".502"/><path d="M6 9.333h10.667a.666.666 0 0 0 .666-.666V3.333a.666.666 0 0 0-.666-.666h-2.06C14.331 1.115 13.087 0 11.333 0 9.687 0 8.363 1.001 8.06 2.667H6a.667.667 0 0 0-.667.666v5.334c0 .368.299.666.667.666" fill-opacity=".302"/><path d="M26.969 24H24v2.969a.667.667 0 0 1-1.333 0V24h-2.97a.667.667 0 0 1 0-1.333h2.97v-2.97a.666.666 0 1 1 1.333 0v2.97h2.969a.667.667 0 1 1 0 1.333m-3.636-9.333c-4.78 0-8.666 3.888-8.666 8.666 0 4.779 3.886 8.667 8.666 8.667C28.112 32 32 28.112 32 23.333c0-4.778-3.888-8.666-8.667-8.666"/></g></symbol><symbol id="svg-deployment" data-name="deployment" viewBox="0 0 176 201" width="176" height="201" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M88 5.985l82.272 47.5v95L88 195.985l-82.272-47.5v-95L88 5.985z"/></symbol><symbol id="svg-dice" data-name="dice" viewBox="0 0 45 32" width="45" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M30.762 10.232a2.478 2.478 0 0 1 .906 3.382l-9.9 17.148a2.477 2.477 0 0 1-3.382.906l-17.148-9.9a2.478 2.478 0 0 1-.906-3.382l9.9-17.148a2.478 2.478 0 0 1 3.382-.906l17.148 9.9z" fill-opacity=".149"/><path d="M22.13 5.249l.061-.001h19.802a2.476 2.476 0 0 1 2.475 2.475v19.802A2.476 2.476 0 0 1 41.993 30H22.208l2.441-4.229a2.34 2.34 0 0 0 3.218-2.169c0-.749-.353-1.416-.901-1.844l4.702-8.144a2.478 2.478 0 0 0-.906-3.382L22.13 5.249zm16.35 16.014a2.34 2.34 0 0 1 0 4.678 2.34 2.34 0 0 1-2.34-2.339 2.34 2.34 0 0 1 2.34-2.339zm0-11.956a2.34 2.34 0 0 1 0 4.678 2.34 2.34 0 0 1-2.34-2.339 2.34 2.34 0 0 1 2.34-2.339zM19.712 22.345a2.341 2.341 0 0 1 .857 3.196 2.34 2.34 0 0 1-4.052-2.34 2.34 2.34 0 0 1 3.195-.856zM17.093 13.93a2.34 2.34 0 1 1-2.34 4.051 2.34 2.34 0 0 1 2.34-4.051zM14.473 5.514a2.34 2.34 0 1 1-2.34 4.052 2.34 2.34 0 0 1 2.34-4.052z"/></symbol><symbol id="svg-download" data-name="download" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><rect fill="none"/><path d="M15.501 28.627V16.92a.993.993 0 0 1 .559-.89c.113-.054.231-.081.355-.095.074-.003.074-.003.148 0a1.1 1.1 0 0 1 .355.095.996.996 0 0 1 .515.599c.029.096.04.192.044.291v11.707l2.541-2.541.042-.039a.994.994 0 0 1 .8-.24.997.997 0 0 1 .834.835.979.979 0 0 1-.137.662c-.03.049-.065.093-.102.138-1.38 1.462-2.842 2.844-4.264 4.266l-.03.029a1.005 1.005 0 0 1-.599.26.967.967 0 0 1-.567-.129.99.99 0 0 1-.206-.158c-1.448-1.369-2.818-2.818-4.226-4.227a1.038 1.038 0 0 1-.24-.387.998.998 0 0 1 .42-1.152c.149-.092.315-.136.49-.147a1.086 1.086 0 0 1 .284.034c.17.045.316.135.443.255l2.541 2.541zm10.423-4.984h-4.52c-.036-.002-.072-.002-.107-.006a.985.985 0 0 1-.646-.343.995.995 0 0 1 .073-1.356.992.992 0 0 1 .467-.248c.093-.02.118-.018.213-.023h4.444a7.281 7.281 0 0 0 1.264-.348c1.132-.419 2.194-1.102 2.908-2.09.165-.228.31-.47.433-.723.287-.59.451-1.234.516-1.886.038-.383.046-.771.016-1.155a5.684 5.684 0 0 0-.249-1.285 5.798 5.798 0 0 0-2.123-2.932 5.69 5.69 0 0 0-3.576-1.074l-.103-.002c-.091-.012-.115-.011-.204-.037a.991.991 0 0 1-.505-.345c-.056-.073-.064-.095-.108-.176a8.604 8.604 0 0 0-1.438-2.13 8.517 8.517 0 0 0-2.063-1.634 8.35 8.35 0 0 0-2.659-.952 8.535 8.535 0 0 0-2.404-.076 8.396 8.396 0 0 0-4.718 2.125 8.484 8.484 0 0 0-1.887 2.479 8.41 8.41 0 0 0-.881 3.291l-.012.104c-.008.034-.014.069-.024.103a.995.995 0 0 1-.936.716c-.035.001-.07-.003-.106-.004-.136-.02-.271-.048-.407-.068a4.134 4.134 0 0 0-1.483.073 4.113 4.113 0 0 0-2.467 1.739 4 4 0 0 0-.635 1.799c-.04.393-.025.795.03 1.185.075.536.243 1.061.539 1.517.09.138.19.269.3.392.633.704 1.547 1.091 2.459 1.275.341.069.692.116 1.04.119h5.17l.107.006c.094.015.118.015.209.046a.988.988 0 0 1-.209 1.918c-.035.004-.071.004-.107.006-1.744 0-3.489.014-5.233-.001a7.898 7.898 0 0 1-1.247-.133c-1.186-.222-2.346-.7-3.253-1.511a5.15 5.15 0 0 1-.949-1.129 5.694 5.694 0 0 1-.765-2.107 7.23 7.23 0 0 1-.057-1.781c.046-.456.144-.906.291-1.339a6.066 6.066 0 0 1 3.997-3.836 6.067 6.067 0 0 1 1.889-.248c.019-.115.04-.23.061-.345a10.418 10.418 0 0 1 3.697-6.121 10.4 10.4 0 0 1 2.947-1.667 10.405 10.405 0 0 1 3.674-.63c.918.012 1.831.137 2.715.385a10.458 10.458 0 0 1 6.308 5.016l.004.006a7.477 7.477 0 0 1 1.265.162 7.628 7.628 0 0 1 1.658.556 7.74 7.74 0 0 1 4.165 4.942 8.146 8.146 0 0 1 .218 3.097 7.492 7.492 0 0 1-.69 2.412 6.901 6.901 0 0 1-1.103 1.624c-.903.993-2.076 1.713-3.33 2.177a8.884 8.884 0 0 1-1.712.458c-.047.006-.046.006-.093.01l-.068.003z"/></symbol><symbol id="svg-gear-circle" data-name="gear-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M24.253 6.971a.975.975 0 0 1 .445.238c.054.053.064.069.111.129 1.095 1.709 2.034 3.514 3.049 5.272a.927.927 0 0 1-.08 1.037c-.073.09-.16.158-.257.22l-1.64.948c.021.155.033.309.047.465.013.193.023.385.026.579.003.424-.023.843-.069 1.264l-.002.013 1.642.949.071.045c.069.053.131.107.186.174a.929.929 0 0 1 .119.962c-.933 1.803-2.026 3.519-3.041 5.277a1.05 1.05 0 0 1-.156.201c-.206.2-.5.293-.783.249a1.03 1.03 0 0 1-.319-.113l-1.635-.949c-.129.097-.262.187-.396.278-.191.124-.19.123-.385.243-.389.229-.787.435-1.199.623l-.014.006v1.908l-.004.085a1.105 1.105 0 0 1-.058.248.927.927 0 0 1-.773.583c-2.029.094-4.062.004-6.094.004a.925.925 0 0 1-.857-.587 1.056 1.056 0 0 1-.063-.333v-1.907c-.142-.061-.282-.128-.422-.195-.203-.102-.203-.101-.404-.207a12.071 12.071 0 0 1-1.168-.731l-.027-.02-1.659.953-.075.038a.924.924 0 0 1-1.134-.305c-1.095-1.71-2.034-3.515-3.049-5.274a1.003 1.003 0 0 1-.112-.319.926.926 0 0 1 .248-.781c.061-.063.128-.11.201-.156l1.641-.948c-.021-.156-.033-.311-.046-.467-.014-.231-.014-.23-.023-.461-.006-.463.018-.921.069-1.381l.001-.014-1.639-.947-.071-.046a1.096 1.096 0 0 1-.186-.174.93.93 0 0 1-.192-.718c.014-.086.041-.164.074-.244.934-1.803 2.029-3.518 3.046-5.276.062-.097.129-.183.22-.256a.928.928 0 0 1 .8-.176c.084.021.159.056.235.096l1.652.951c.07-.053.143-.103.214-.153.191-.129.19-.129.385-.253.454-.278.921-.523 1.407-.743l.014-.006V4.962l.004-.085a.925.925 0 0 1 .584-.773c.081-.031.162-.046.248-.058 2.028-.094 4.062-.004 6.093-.004.115.006.224.02.332.062a.93.93 0 0 1 .553.607c.023.083.031.165.035.251V6.87c.142.061.281.129.42.196.202.102.201.102.401.208.399.224.781.466 1.153.733l.02.014 1.628-.947.076-.039c.137-.056.265-.082.413-.085.085.007.085.006.169.021zm-2.229 14.94c.117.024.218.059.324.114l1.379.8 2.081-3.607-1.389-.802c-.065-.041-.083-.05-.141-.1a.919.919 0 0 1-.317-.768c.027-.216.068-.43.097-.645.04-.369.067-.739.055-1.11a9.525 9.525 0 0 0-.143-1.304l-.01-.085a.921.921 0 0 1 .316-.768c.058-.051.076-.059.141-.1l1.387-.802-2.081-3.605-1.374.799c-.068.035-.084.046-.157.072a.93.93 0 0 1-.594.006 1.114 1.114 0 0 1-.232-.115c-.123-.093-.24-.195-.362-.291a8.935 8.935 0 0 0-1.093-.711 9.705 9.705 0 0 0-1.188-.541l-.078-.034c-.066-.037-.084-.044-.145-.089a.932.932 0 0 1-.332-.484 1.07 1.07 0 0 1-.035-.252V5.882h-4.168v1.607a.929.929 0 0 1-.368.736c-.061.045-.079.052-.145.089-.199.087-.402.161-.602.246-.745.337-1.446.748-2.072 1.276l-.069.052a.919.919 0 0 1-.826.113c-.073-.025-.089-.036-.157-.072L8.33 9.126l-2.086 3.608 1.387.802c.065.041.082.05.141.1a.922.922 0 0 1 .316.77c-.02.154-.049.307-.073.46a8.157 8.157 0 0 0-.08 1.297c.011.437.065.868.14 1.297l.011.086c.003.077.006.096-.002.172a.928.928 0 0 1-.455.698l-1.389.802 2.084 3.611 1.403-.806a.923.923 0 0 1 .831-.043c.071.032.086.044.151.085.121.092.237.192.357.286.3.225.611.432.938.617.44.249.899.455 1.371.636l.078.034c.066.037.084.044.144.089a.918.918 0 0 1 .368.736v1.606h4.168v-1.606a1.08 1.08 0 0 1 .035-.253.927.927 0 0 1 .332-.483c.06-.045.078-.052.144-.089.197-.086.4-.161.598-.246a9.4 9.4 0 0 0 1.311-.716 8.67 8.67 0 0 0 .744-.561l.069-.053c.065-.04.081-.052.151-.083.108-.048.218-.067.335-.077.086.001.086 0 .172.009z"/><path d="M16.148 11.052a5.048 5.048 0 0 1 2.009.484 4.948 4.948 0 0 1 2.402 2.523 4.94 4.94 0 0 1 .287 2.909 4.964 4.964 0 0 1-2.797 3.497 4.929 4.929 0 0 1-5.339-.843 4.893 4.893 0 0 1-1.537-2.775 4.942 4.942 0 0 1 .409-3.006 4.968 4.968 0 0 1 1.987-2.138 5.041 5.041 0 0 1 2.074-.638 6.08 6.08 0 0 1 .505-.013zm-.206 1.839a3.16 3.16 0 0 0-1.257.303 3.116 3.116 0 0 0-1.652 2.01 3.116 3.116 0 0 0 .175 2.042 3.091 3.091 0 0 0 1.544 1.542 3.095 3.095 0 0 0 2.401.059 3.102 3.102 0 0 0 1.616-1.467 3.085 3.085 0 0 0-2.827-4.489z"/></g></symbol><symbol id="svg-gear" data-name="gear" viewBox="0 0 32 33" width="32" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M23.018 1.842a2.342 2.342 0 0 1 1.654.884c.336.431.486.969.495 1.509.007.384-.054.762-.139 1.135l-.585 2.148.021.021.019.02 2.141-.584c.098-.024.098-.023.197-.046.2-.04.401-.073.605-.087.42-.03.849.01 1.246.157.27.1.522.25.736.443.397.36.668.867.741 1.399.036.26.024.525-.031.781-.095.444-.313.851-.583 1.212a6.074 6.074 0 0 1-.403.474l-1.572 1.559.008.03.01.036c.716.189 1.426.399 2.148.567.091.026.09.026.181.055.194.065.384.137.568.227.362.176.699.41.963.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.091.224-.22.432-.377.615-.286.333-.659.579-1.055.76-.22.101-.449.18-.68.251l-2.142.566-.01.036-.008.03 1.567 1.554a4.501 4.501 0 0 1 .517.628c.236.349.416.74.488 1.156.049.285.045.577-.016.859a2.349 2.349 0 0 1-.841 1.343 2.254 2.254 0 0 1-.638.345c-.413.145-.859.171-1.292.129a5.396 5.396 0 0 1-.715-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.099.024.099.047.198.04.2.072.401.087.605a3.02 3.02 0 0 1-.139 1.191 2.29 2.29 0 0 1-.42.741 2.34 2.34 0 0 1-1.442.79c-.26.036-.524.024-.78-.031-.654-.139-1.207-.54-1.688-.988l-1.556-1.569-.031.008-.037.01-.563 2.133c-.029.098-.028.097-.059.194-.054.161-.112.32-.182.474-.189.415-.451.802-.803 1.094a2.3 2.3 0 0 1-.69.395 2.348 2.348 0 0 1-1.586-.014 2.269 2.269 0 0 1-.674-.401c-.359-.308-.616-.717-.801-1.148a6.1 6.1 0 0 1-.21-.586l-.565-2.141-.036-.01-.03-.008-1.555 1.567c-.073.07-.073.07-.147.138a4.842 4.842 0 0 1-.395.32 3.082 3.082 0 0 1-1.186.536c-.28.054-.57.058-.852.006a2.347 2.347 0 0 1-1.366-.804 2.248 2.248 0 0 1-.385-.687c-.156-.446-.175-.927-.12-1.394a6.04 6.04 0 0 1 .112-.612l.585-2.149-.02-.02-.019-.02-2.141.582c-.099.024-.098.024-.197.046a4.994 4.994 0 0 1-.502.08 3.059 3.059 0 0 1-1.296-.128 2.294 2.294 0 0 1-.742-.42 2.357 2.357 0 0 1-.79-1.442 2.272 2.272 0 0 1 .019-.722c.127-.677.538-1.251.998-1.745l1.571-1.56-.009-.03-.009-.036-2.134-.563-.194-.058a4.872 4.872 0 0 1-.568-.227 2.972 2.972 0 0 1-1.001-.759 2.293 2.293 0 0 1-.394-.689 2.342 2.342 0 0 1 .037-1.645c.099-.242.242-.466.417-.66.446-.496 1.069-.774 1.696-.968l2.141-.565.009-.035.009-.031-1.566-1.554c-.07-.073-.07-.073-.139-.148-.414-.467-.76-1.015-.866-1.639a2.307 2.307 0 0 1 .004-.795 2.349 2.349 0 0 1 .807-1.366c.203-.167.435-.296.683-.383.414-.145.859-.172 1.293-.131.242.023.479.069.716.123l2.147.585.021-.021.02-.02-.584-2.141c-.025-.099-.025-.099-.047-.199a4.75 4.75 0 0 1-.087-.604c-.03-.42.01-.85.157-1.246.093-.25.229-.484.402-.687.349-.407.851-.69 1.379-.778.26-.044.527-.04.786.009.431.081.829.281 1.184.533.198.141.381.299.559.464l1.559 1.571.031-.008.035-.01.563-2.136.059-.193c.054-.161.112-.32.183-.474a3.06 3.06 0 0 1 .758-1.056c.232-.201.502-.358.794-.452a2.344 2.344 0 0 1 1.527.035c.246.092.474.23.674.401.358.308.615.716.8 1.147.082.191.148.387.21.585l.565 2.143.035.009.032.009 1.553-1.566c.073-.07.073-.07.148-.139.453-.401.979-.739 1.581-.855.158-.031.318-.043.479-.043.062.001.061.001.123.005zm-6.932 7.479a6.678 6.678 0 0 1 2.738.624 6.736 6.736 0 0 1 2.971 2.73 6.67 6.67 0 0 1 .82 4.258 6.66 6.66 0 0 1-1.948 3.847 6.69 6.69 0 0 1-2.066 1.375 6.707 6.707 0 0 1-5.05.062 6.695 6.695 0 0 1-4.153-5.201 6.68 6.68 0 0 1 6.688-7.695z" fill-opacity=".149"/><path d="M23.018 1.842a2.342 2.342 0 0 1 1.654.884c.336.431.486.969.495 1.509.007.384-.054.762-.139 1.135l-.585 2.148.021.021.019.02 2.141-.584c.098-.024.098-.023.197-.046.2-.04.401-.073.605-.087.42-.03.849.01 1.246.157.27.1.522.25.736.443.397.36.668.867.741 1.399.036.26.024.525-.031.781-.095.444-.313.851-.583 1.212a6.074 6.074 0 0 1-.403.474l-1.572 1.559.008.03.01.036c.716.189 1.426.399 2.148.567.091.026.09.026.181.055.194.065.384.137.568.227.362.176.699.41.963.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.091.224-.22.432-.377.615-.286.333-.659.579-1.055.76-.22.101-.449.18-.68.251l-2.142.566-.01.036-.008.03 1.567 1.554a4.501 4.501 0 0 1 .517.628c.236.349.416.74.488 1.156.049.285.045.577-.016.859a2.349 2.349 0 0 1-.841 1.343 2.254 2.254 0 0 1-.638.345c-.413.145-.859.171-1.292.129a5.396 5.396 0 0 1-.715-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.099.024.099.047.198.04.2.072.401.087.605a3.02 3.02 0 0 1-.139 1.191 2.29 2.29 0 0 1-.42.741 2.34 2.34 0 0 1-1.442.79c-.26.036-.524.024-.78-.031-.654-.139-1.207-.54-1.688-.988l-1.556-1.569-.031.008-.037.01-.563 2.133c-.029.098-.028.097-.059.194-.054.161-.112.32-.182.474-.189.415-.451.802-.803 1.094a2.3 2.3 0 0 1-.69.395 2.348 2.348 0 0 1-1.586-.014 2.269 2.269 0 0 1-.674-.401c-.359-.308-.616-.717-.801-1.148a6.1 6.1 0 0 1-.21-.586l-.565-2.141-.036-.01-.03-.008-1.555 1.567c-.073.07-.073.07-.147.138a4.842 4.842 0 0 1-.395.32 3.082 3.082 0 0 1-1.186.536c-.28.054-.57.058-.852.006a2.347 2.347 0 0 1-1.366-.804 2.248 2.248 0 0 1-.385-.687c-.156-.446-.175-.927-.12-1.394a6.04 6.04 0 0 1 .112-.612l.585-2.149-.02-.02-.019-.02-2.141.582c-.099.024-.098.024-.197.046a4.994 4.994 0 0 1-.502.08 3.059 3.059 0 0 1-1.296-.128 2.294 2.294 0 0 1-.742-.42 2.357 2.357 0 0 1-.79-1.442 2.272 2.272 0 0 1 .019-.722c.127-.677.538-1.251.998-1.745l1.571-1.56-.009-.03-.009-.036-2.134-.563-.194-.058a4.872 4.872 0 0 1-.568-.227 2.972 2.972 0 0 1-1.001-.759 2.293 2.293 0 0 1-.394-.689 2.342 2.342 0 0 1 .037-1.645c.099-.242.242-.466.417-.66.446-.496 1.069-.774 1.696-.968l2.141-.565.009-.035.009-.031-1.566-1.554c-.07-.073-.07-.073-.139-.148-.414-.467-.76-1.015-.866-1.639a2.307 2.307 0 0 1 .004-.795 2.349 2.349 0 0 1 .807-1.366c.203-.167.435-.296.683-.383.414-.145.859-.172 1.293-.131.242.023.479.069.716.123l2.147.585.021-.021.02-.02-.584-2.141c-.025-.099-.025-.099-.047-.199a4.75 4.75 0 0 1-.087-.604c-.03-.42.01-.85.157-1.246.093-.25.229-.484.402-.687.349-.407.851-.69 1.379-.778.26-.044.527-.04.786.009.431.081.829.281 1.184.533.198.141.381.299.559.464l1.559 1.571.031-.008.035-.01.563-2.136.059-.193c.054-.161.112-.32.183-.474a3.06 3.06 0 0 1 .758-1.056c.232-.201.502-.358.794-.452a2.344 2.344 0 0 1 1.527.035c.246.092.474.23.674.401.358.308.615.716.8 1.147.082.191.148.387.21.585l.565 2.143.035.009.032.009 1.553-1.566c.073-.07.073-.07.148-.139.453-.401.979-.739 1.581-.855.158-.031.318-.043.479-.043.062.001.061.001.123.005zM12.783 25.575l.1.026c.126.04.252.079.38.116.211.059.423.111.638.158l.1.027c.085.034.108.04.187.087.147.09.269.22.348.373.043.082.046.105.075.192l.698 2.647a3.58 3.58 0 0 0 .154.416 1.473 1.473 0 0 0 .096.186c.066.11.154.235.278.286a.454.454 0 0 0 .219.025.366.366 0 0 0 .145-.048.592.592 0 0 0 .145-.129c.061-.073.112-.155.156-.239.081-.156.139-.322.188-.49l.7-2.654c.029-.087.032-.11.075-.192a.943.943 0 0 1 .439-.421c.144-.067.304-.089.457-.125.127-.031.126-.031.253-.064.169-.047.336-.097.502-.151l.101-.026c.091-.014.113-.021.206-.019a.947.947 0 0 1 .49.148c.077.05.092.068.16.13l1.929 1.945a3.993 3.993 0 0 0 .341.284 1.804 1.804 0 0 0 .177.113c.111.062.25.127.382.108a.451.451 0 0 0 .306-.203.576.576 0 0 0 .061-.185c.017-.094.02-.19.016-.285a2.729 2.729 0 0 0-.081-.517l-.725-2.662c-.019-.09-.028-.112-.032-.204a.942.942 0 0 1 .171-.586c.091-.128.217-.226.331-.332.093-.089.184-.18.275-.271.091-.095.181-.191.27-.288l.074-.072c.072-.056.088-.074.168-.118a.95.95 0 0 1 .495-.114c.092.004.114.013.203.032l2.653.72a3.743 3.743 0 0 0 .438.076 1.993 1.993 0 0 0 .209.009c.127-.002.28-.015.385-.096a.469.469 0 0 0 .133-.181.345.345 0 0 0 .031-.148.592.592 0 0 0-.04-.19 1.264 1.264 0 0 0-.129-.254 2.69 2.69 0 0 0-.33-.408l-1.95-1.935c-.062-.068-.08-.083-.13-.16a.952.952 0 0 1-.145-.592c.009-.092.018-.114.041-.203a12.8 12.8 0 0 0 .117-.38c.058-.211.111-.423.158-.637l.028-.099c.034-.085.039-.109.087-.187a.946.946 0 0 1 .372-.349c.082-.042.105-.045.192-.074l2.648-.699a3.58 3.58 0 0 0 .416-.153l.099-.048.087-.049c.109-.065.235-.153.285-.276a.454.454 0 0 0-.023-.367.59.59 0 0 0-.128-.145 1.267 1.267 0 0 0-.24-.156 2.656 2.656 0 0 0-.489-.188l-2.654-.7c-.088-.028-.111-.032-.193-.074a.95.95 0 0 1-.421-.44c-.066-.143-.089-.303-.125-.455a13.154 13.154 0 0 0-.099-.378c-.038-.127-.076-.254-.117-.38l-.026-.1c-.013-.091-.02-.114-.018-.206a.944.944 0 0 1 .148-.489c.05-.077.068-.092.13-.16l1.945-1.929a3.138 3.138 0 0 0 .284-.341c.021-.03.042-.06.061-.091a1.51 1.51 0 0 0 .052-.086c.062-.111.127-.25.109-.382a.464.464 0 0 0-.083-.195.364.364 0 0 0-.12-.111.632.632 0 0 0-.184-.061 1.304 1.304 0 0 0-.286-.015 2.66 2.66 0 0 0-.518.081l-2.659.725c-.089.019-.112.028-.203.032a.947.947 0 0 1-.585-.17c-.075-.052-.089-.071-.154-.136a18.376 18.376 0 0 0-.27-.288 12.506 12.506 0 0 0-.47-.451l-.072-.074c-.057-.072-.074-.088-.119-.168a.949.949 0 0 1-.115-.497c.004-.092.013-.114.032-.204l.723-2.654a2.767 2.767 0 0 0 .082-.544l.001-.101c-.002-.127-.015-.28-.097-.385a.472.472 0 0 0-.331-.164.605.605 0 0 0-.188.038c-.09.033-.174.078-.255.13a2.69 2.69 0 0 0-.408.33l-1.933 1.948c-.068.062-.082.08-.16.13a.95.95 0 0 1-.59.145c-.092-.008-.114-.018-.202-.04a18.34 18.34 0 0 0-.38-.116c-.212-.058-.424-.11-.639-.157l-.1-.027c-.085-.034-.109-.039-.188-.087a.935.935 0 0 1-.349-.373c-.043-.082-.046-.105-.075-.193l-.698-2.648a3.77 3.77 0 0 0-.153-.415 2.427 2.427 0 0 0-.121-.225c-.065-.1-.148-.208-.263-.251a.459.459 0 0 0-.356.026.582.582 0 0 0-.143.128 1.297 1.297 0 0 0-.157.239 2.782 2.782 0 0 0-.189.491l-.699 2.655c-.029.088-.032.111-.075.193a.94.94 0 0 1-.441.422c-.143.066-.303.088-.456.123a16.05 16.05 0 0 0-.377.099c-.128.037-.255.076-.381.116l-.1.025c-.091.013-.113.02-.205.018a.937.937 0 0 1-.487-.148c-.077-.05-.092-.068-.16-.13L10 4.222a4.017 4.017 0 0 0-.341-.283 2.956 2.956 0 0 0-.177-.113c-.112-.062-.25-.127-.382-.108a.46.46 0 0 0-.308.204.565.565 0 0 0-.06.182c-.017.094-.019.19-.015.285.007.175.039.347.081.516l.726 2.661c.019.089.027.111.032.203a.945.945 0 0 1-.169.583c-.053.076-.072.09-.136.155-.097.089-.193.18-.288.271-.155.153-.305.309-.451.47l-.074.072c-.072.057-.088.075-.169.119a.947.947 0 0 1-.497.116c-.092-.004-.115-.013-.204-.032L4.914 8.8a4.258 4.258 0 0 0-.436-.075 3.79 3.79 0 0 0-.11-.008l-.099-.001c-.132.002-.288.016-.395.104a.45.45 0 0 0-.155.322.59.59 0 0 0 .039.19c.032.089.078.174.129.255.095.148.209.281.33.407l1.948 1.934c.062.068.08.083.13.16a.947.947 0 0 1 .145.591c-.008.091-.018.113-.041.202-.04.126-.078.253-.116.381-.058.211-.11.423-.157.638l-.027.099c-.034.086-.04.109-.087.188a.963.963 0 0 1-.373.349c-.082.042-.105.046-.193.074l-2.647.698a3.554 3.554 0 0 0-.415.153 1.518 1.518 0 0 0-.186.097c-.109.066-.236.154-.286.277a.458.458 0 0 0 .022.367c.033.056.08.103.129.145.073.061.155.112.24.156.155.081.321.138.489.187l2.655.701c.087.029.11.032.192.075a.94.94 0 0 1 .421.44c.067.143.089.303.124.455.032.126.065.252.099.377.038.128.076.255.116.381l.026.1c.013.091.02.114.018.205a.937.937 0 0 1-.148.488c-.05.077-.068.092-.129.16l-1.944 1.93a4.522 4.522 0 0 0-.172.195 2.552 2.552 0 0 0-.224.323c-.062.112-.127.25-.109.382.01.071.044.138.083.196a.368.368 0 0 0 .121.111.582.582 0 0 0 .182.06c.094.017.19.019.285.015.176-.008.349-.041.519-.083l2.662-.722c.089-.019.111-.028.203-.032a.949.949 0 0 1 .583.169c.075.053.089.072.154.136.089.097.179.192.271.287.153.156.31.306.47.454l.072.073c.057.072.074.088.118.169a.943.943 0 0 1 .115.496c-.004.092-.013.114-.032.203L8.8 27.087a2.74 2.74 0 0 0-.082.547c-.002.034-.002.065-.002.099.003.128.016.281.098.386a.466.466 0 0 0 .18.133.35.35 0 0 0 .149.031.58.58 0 0 0 .189-.039c.09-.033.175-.078.255-.13.148-.094.281-.208.407-.329l1.935-1.95c.068-.062.083-.08.16-.13a.954.954 0 0 1 .385-.141c.092-.011.115-.007.207-.004l.102.015zm3.303-16.254a6.678 6.678 0 0 1 2.738.624 6.736 6.736 0 0 1 2.971 2.73 6.67 6.67 0 0 1 .82 4.258 6.66 6.66 0 0 1-1.948 3.847 6.69 6.69 0 0 1-2.066 1.375 6.707 6.707 0 0 1-5.05.062 6.695 6.695 0 0 1-4.153-5.201 6.68 6.68 0 0 1 6.688-7.695zm-.148 1.883a4.83 4.83 0 0 0-1.964.447 4.814 4.814 0 0 0-2.371 2.428 4.796 4.796 0 0 0-.263 3.064c.092.379.231.747.414 1.092a4.841 4.841 0 0 0 2.38 2.186c.57.242 1.186.369 1.804.376a4.783 4.783 0 0 0 3.33-1.284 4.839 4.839 0 0 0 1.032-1.381c.21-.422.356-.875.433-1.34a4.833 4.833 0 0 0 0-1.583 4.775 4.775 0 0 0-.408-1.288 4.834 4.834 0 0 0-2.245-2.245 4.84 4.84 0 0 0-2.142-.472z" fill-rule="nonzero"/></symbol><symbol id="svg-heart-circle" data-name="heart-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M11.228 6.829c.451.028.894.101 1.326.235 1.488.461 2.712 1.564 3.469 2.912.082-.146.173-.287.264-.427.489-.718 1.086-1.354 1.816-1.83a5.524 5.524 0 0 1 1.785-.761 5.478 5.478 0 0 1 1.727-.112 5.757 5.757 0 0 1 2.599.914 6.212 6.212 0 0 1 2.174 2.473 6.98 6.98 0 0 1 .661 2.336c.039.375.055.754.033 1.13-.044.793-.254 1.57-.549 2.305-.442 1.098-1.072 2.116-1.77 3.068-1.224 1.671-2.674 3.174-4.193 4.577a47.056 47.056 0 0 1-3.944 3.283l-.071.048a1.042 1.042 0 0 1-.83.106 1.152 1.152 0 0 1-.235-.106c-.177-.12-.346-.253-.517-.383a51.994 51.994 0 0 1-3.497-2.948c-1.176-1.087-2.303-2.233-3.325-3.467-.702-.848-1.356-1.739-1.906-2.693-.409-.71-.762-1.458-.998-2.243a6.77 6.77 0 0 1-.282-1.546 6.979 6.979 0 0 1 .018-.97c.081-.96.346-1.906.809-2.753A6.214 6.214 0 0 1 7.61 7.913a5.93 5.93 0 0 1 1.285-.7 5.86 5.86 0 0 1 1.802-.385c.178-.006.354-.006.531.001zm9.778 2.025c-.31.012-.615.058-.912.15-.224.07-.441.162-.646.275-1.169.641-1.877 1.871-2.267 3.107a9.602 9.602 0 0 0-.173.624l-.026.086c-.067.17-.159.32-.299.44a1.027 1.027 0 0 1-1.386-.061 1.11 1.11 0 0 1-.234-.379c-.055-.186-.099-.375-.153-.562-.377-1.234-1.023-2.467-2.154-3.163a3.405 3.405 0 0 0-1.631-.513 3.512 3.512 0 0 0-1.001.093 3.78 3.78 0 0 0-.804.294c-.833.418-1.49 1.131-1.88 1.973a4.96 4.96 0 0 0-.422 1.563c-.042.406-.044.815.02 1.219.104.646.344 1.267.633 1.852.445.902 1.019 1.738 1.637 2.529.806 1.032 1.701 1.993 2.636 2.909a48.365 48.365 0 0 0 4.043 3.524l.036.027a47.011 47.011 0 0 0 2.945-2.479 39.099 39.099 0 0 0 2.276-2.24c.978-1.05 1.903-2.167 2.649-3.395.472-.777.888-1.617 1.076-2.512.099-.474.11-.953.06-1.433a4.955 4.955 0 0 0-.38-1.471 4.181 4.181 0 0 0-1.692-1.94 3.687 3.687 0 0 0-1.782-.517h-.169z" fill-rule="nonzero"/></symbol><symbol id="svg-lock-circle" data-name="lock-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M9.558 11.134c.001-.338.007-.676.011-1.014a6.646 6.646 0 0 1 .445-2.194 6.482 6.482 0 0 1 3.775-3.683 6.645 6.645 0 0 1 2.045-.388c.166-.002.165-.002.332 0a6.645 6.645 0 0 1 2.045.388 6.485 6.485 0 0 1 3.775 3.683c.277.702.416 1.441.445 2.194.004.338.01.676.012 1.014.634.02 1.269.044 1.903.07a.926.926 0 0 1 .766.546 1 1 0 0 1 .074.294c.179 4.31.004 8.627.004 12.941a1.075 1.075 0 0 1-.05.298.926.926 0 0 1-.794.618c-5.534.229-11.078.003-16.617.003a.923.923 0 0 1-.915-.843c-.179-4.31-.004-8.628-.004-12.941.005-.103.017-.201.05-.299a.926.926 0 0 1 .5-.543c.095-.041.192-.062.294-.074.634-.026 1.269-.05 1.904-.07zm13.794 1.905H8.648v11.027h14.704V13.039zm-8.303 5.248a1.86 1.86 0 0 1-.885-1.667 1.84 1.84 0 0 1 .419-1.077c.15-.181.335-.333.542-.445.243-.132.506-.199.781-.219.095-.003.094-.003.188 0 .275.02.538.087.781.219.207.112.393.264.543.445.132.161.237.344.309.539.063.173.099.355.109.538a1.86 1.86 0 0 1-.902 1.677c.023 1.029.043 2.059-.018 3.085a.948.948 0 0 1-.136.413.926.926 0 0 1-1.341.242.92.92 0 0 1-.355-.655 32.27 32.27 0 0 1-.035-3.095zm5.542-7.204c.002-.305.006-.611.002-.917a4.716 4.716 0 0 0-.359-1.669 4.635 4.635 0 0 0-2.868-2.6 4.602 4.602 0 0 0-1.603-.2 4.583 4.583 0 0 0-3.905 2.596 4.712 4.712 0 0 0-.451 1.873c-.004.306 0 .612.003.917 3.059-.069 6.121-.069 9.181 0z"/></symbol><symbol id="svg-logo" data-name="logo" viewBox="0 0 54 32" width="54" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M32.207 25.946L21.721 32l-11.235-6.486L0 19.459V6.486L11.235 0l10.486 6.054L32.206 0l11.235 6.486 10.486 6.055v12.973L42.693 32l-10.486-6.054zm.661-1.343V14.27l9.053 5.19.002 10.378-9.055-5.235zm-20.885.046V14.27l9.085 5.218.002 10.441-9.086-5.28h-.001zM1.498 18.595V8.216l8.988 5.189v10.379l-8.988-5.189zM21.721 7.784l8.988 5.189-8.988 5.19-8.989-5.19 8.989-5.189zm20.972 0l8.988 5.189-8.988 5.19-8.989-5.19 8.989-5.189zM11.235 1.729l8.988 5.19-8.988 5.189-8.989-5.189 8.989-5.189v-.001zm20.971 0l8.989 5.19-8.989 5.189-8.988-5.189 8.988-5.189v-.001z"/><path d="M1.437 18.643L1.442 8.11l19.652 11.35.009 10.545L1.437 18.643zm31.369 5.999l.03-10.463 9.148 5.244-.009 10.582-9.169-5.363z" fill-opacity=".345"/></symbol><symbol id="svg-message-circle" data-name="message-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M17.342 23.582l-3.531 3.531-.065.058a.98.98 0 0 1-.392.186.9.9 0 0 1-.961-.455.978.978 0 0 1-.106-.42v-2.9l-.261-.003c-.204-.008-.204-.008-.408-.021a7.968 7.968 0 0 1-2.851-.769 8.118 8.118 0 0 1-3.273-2.902 8.01 8.01 0 0 1-1.012-2.313 7.987 7.987 0 0 1 .304-4.925 8.07 8.07 0 0 1 3.982-4.281 7.95 7.95 0 0 1 3.258-.79c2.665-.034 5.331-.034 7.996 0a7.926 7.926 0 0 1 3.258.791 8.054 8.054 0 0 1 3.981 4.28 7.956 7.956 0 0 1-.708 7.238 8.107 8.107 0 0 1-3.627 3.063 7.962 7.962 0 0 1-3.104.632h-2.48zm.123-5.826c.128.01.25.04.364.099a.904.904 0 0 1 .26.204.902.902 0 0 1 .059 1.101.908.908 0 0 1-.198.203.925.925 0 0 1-.485.175c-2.205.059-4.412.059-6.617 0a.925.925 0 0 1-.485-.175.9.9 0 0 1-.29-1.063.889.889 0 0 1 .775-.544c2.205-.059 4.412-.059 6.617 0zm3.747-2.847a.924.924 0 0 1 .493.19.9.9 0 0 1 .166 1.229.9.9 0 0 1-.264.239.95.95 0 0 1-.395.122 154.73 154.73 0 0 1-10.376 0 .927.927 0 0 1-.494-.19.9.9 0 0 1-.165-1.229.9.9 0 0 1 .264-.239.945.945 0 0 1 .395-.122 154.73 154.73 0 0 1 10.376 0zm0-2.848a.95.95 0 0 1 .395.122.9.9 0 0 1 .264.239.9.9 0 0 1-.166 1.229.933.933 0 0 1-.493.191c-3.457.115-6.919.115-10.376 0a.936.936 0 0 1-.494-.191.9.9 0 0 1-.165-1.229.9.9 0 0 1 .264-.239.945.945 0 0 1 .395-.122 154.73 154.73 0 0 1 10.376 0z"/></symbol><symbol id="svg-no-circle" data-name="no-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M16.288 3.931c.48.017.958.051 1.434.12 1.199.173 2.37.529 3.463 1.052a12.074 12.074 0 0 1 5.153 4.727 11.932 11.932 0 0 1 1.319 3.242 12.062 12.062 0 0 1-.429 7.099 12.093 12.093 0 0 1-6.713 6.878 12.046 12.046 0 0 1-9.03 0 12.09 12.09 0 0 1-5.589-4.643 11.953 11.953 0 0 1-1.893-6.19 12.031 12.031 0 0 1 .412-3.425c.318-1.181.82-2.312 1.481-3.342a12.089 12.089 0 0 1 4.919-4.346 11.968 11.968 0 0 1 4.897-1.172c.289-.004.288-.004.576 0zm7.383 5.868L9.873 23.598a9.778 9.778 0 0 0 2.432 1.429 9.853 9.853 0 0 0 7.39 0 9.893 9.893 0 0 0 5.491-5.626 9.865 9.865 0 0 0 .292-6.041 9.757 9.757 0 0 0-1.807-3.561zm-1.543-1.542a9.737 9.737 0 0 0-4.718-2.046c-.39-.057-.781-.084-1.175-.099-.235-.003-.234-.003-.471 0a9.799 9.799 0 0 0-4.007.959 9.899 9.899 0 0 0-4.025 3.558 9.728 9.728 0 0 0-1.21 2.731 9.895 9.895 0 0 0-.338 2.803 9.753 9.753 0 0 0 2.145 5.893L22.128 8.257z"/></symbol><symbol id="svg-pencil-circle" data-name="pencil-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.925 18.165c3.857-4.193 8.057-8.058 12.086-12.087a.987.987 0 0 1 .416-.241c.07-.018.088-.018.16-.028.081-.003.081-.003.162 0 .071.01.089.01.159.028.134.036.248.102.357.186 1.634 1.497 3.137 3.132 4.704 4.699a.937.937 0 0 1 .216.975 1.01 1.01 0 0 1-.161.279c-3.864 4.217-8.086 8.092-12.131 12.136a.933.933 0 0 1-.327.212c-2.164.718-4.384 1.256-6.577 1.882a1.003 1.003 0 0 1-.408.024.94.94 0 0 1-.747-.684 1.02 1.02 0 0 1-.013-.408c.529-2.219 1.251-4.389 1.877-6.582l.02-.055a.939.939 0 0 1 .148-.268l.016-.021.017-.02.026-.027zm.161 5.796l3.334-.953a75.719 75.719 0 0 1-2.39-2.351l-.944 3.304zm5.184-1.853l7.013-7.013-3.331-3.331-7.031 7.031c1.139 1.082 2.28 2.164 3.349 3.313zm4.996-11.658l3.331 3.331 2.402-2.402-3.331-3.331-2.402 2.402z"/></symbol><symbol id="svg-plus-circle" data-name="plus-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.24 17.376h-5.792v5.792a1.448 1.448 0 0 1-2.896 0v-5.792H8.76a1.449 1.449 0 0 1 0-2.896h5.792V8.688a1.449 1.449 0 0 1 2.896 0v5.792h5.792a1.449 1.449 0 0 1 0 2.896" fill-rule="nonzero"/></symbol><symbol id="svg-progress-circle" data-name="progress-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M16 21.288c-.579 0-1.048.469-1.048 1.048v3.521a1.048 1.048 0 1 0 2.096 0v-3.521c0-.579-.47-1.048-1.048-1.048" fill-opacity=".502"/><path d="M25.955 14.899l-3.458-.007c-.597.013-1.05.467-1.05 1.046a1.047 1.047 0 0 0 1.046 1.05l3.458.007h.002a1.05 1.05 0 0 0 .002-2.096" fill-opacity=".251"/><path d="M16.025 2.832h-.003c-.577 0-1.045.468-1.047 1.046l-.011 5.46a1.048 1.048 0 0 0 1.045 1.05h.003c.578 0 1.046-.467 1.047-1.045l.011-5.461a1.046 1.046 0 0 0-1.045-1.05"/><path d="M13.751 20.811a1.047 1.047 0 0 0-1.372.564l-1.374 3.298a1.053 1.053 0 0 0 .966 1.452c.411 0 .8-.243.968-.647l1.374-3.297a1.045 1.045 0 0 0-.562-1.37" fill-opacity=".6"/><path d="M19.604 21.393a1.047 1.047 0 1 0-1.938.796l1.355 3.299a1.05 1.05 0 0 0 1.939-.795l-1.356-3.3z" fill-opacity=".4"/><path d="M9.5 16.964h.002a1.049 1.049 0 0 0 .002-2.096l-3.455-.007h-.002a1.047 1.047 0 0 0-.002 2.096l3.455.007z" fill-opacity=".902"/><path d="M21.075 13.829a1.046 1.046 0 0 0 1.368.57l3.158-1.295c.534-.22.79-.833.569-1.366a1.044 1.044 0 0 0-1.367-.57l-3.158 1.294c-.536.22-.79.833-.57 1.367" fill-opacity=".2"/><path d="M10.992 17.99a1.043 1.043 0 0 0-1.367-.57l-3.228 1.332a1.047 1.047 0 0 0 .399 2.016c.132 0 1.558-.558 1.689-.613l1.938-.798c.535-.22.79-.833.569-1.367" fill-opacity=".8"/><path d="M21.281 19.75a1.047 1.047 0 1 0-1.483 1.48l2.482 2.49a1.045 1.045 0 0 0 1.482.002 1.047 1.047 0 0 0 .004-1.482l-2.485-2.49z" fill-opacity=".349"/><path d="M19.902 12.04a1.048 1.048 0 0 0 1.483.003l2.405-2.397a1.048 1.048 0 0 0-1.479-1.485l-2.404 2.397a1.047 1.047 0 0 0-.005 1.482" fill-opacity=".149"/><path d="M18.13 10.813a1.05 1.05 0 0 0 1.371-.565l1.291-3.107a1.047 1.047 0 1 0-1.935-.804l-1.291 3.106c-.222.534.03 1.147.564 1.37" fill-opacity=".102"/><path d="M13.176 6.326a1.049 1.049 0 0 0-1.937.8l1.286 3.115a1.045 1.045 0 0 0 1.367.569c.536-.22.79-.833.57-1.367l-1.286-3.117zM10.626 12.015a1.05 1.05 0 0 0 1.482.003 1.048 1.048 0 0 0 .002-1.482L9.717 8.137a1.047 1.047 0 1 0-1.485 1.479l2.394 2.399z"/><path d="M12.186 19.729a1.047 1.047 0 0 0-1.482-.003L8.208 22.21a1.047 1.047 0 0 0 1.479 1.485l2.495-2.485c.41-.408.411-1.071.004-1.481" fill-opacity=".702"/><path d="M25.59 18.787l-3.214-1.338a1.047 1.047 0 1 0-.805 1.935l3.213 1.338a1.05 1.05 0 0 0 .806-1.935" fill-opacity=".302"/><path d="M6.407 13.069l3.159 1.315a1.047 1.047 0 0 0 1.369-.566 1.048 1.048 0 0 0-.564-1.37l-3.157-1.314a1.049 1.049 0 0 0-.807 1.935"/></g></symbol><symbol id="svg-progress" data-name="progress" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill="none"/><g fill-rule="nonzero"><path d="M16 22.915c-.758 0-1.37.613-1.37 1.37v4.605a1.37 1.37 0 1 0 2.74 0v-4.605a1.37 1.37 0 0 0-1.37-1.37" fill-opacity=".502"/><path d="M29.018 14.561l-4.522-.009c-.781.016-1.373.609-1.373 1.367a1.37 1.37 0 0 0 1.368 1.373l4.521.009h.003a1.371 1.371 0 0 0 .003-2.74" fill-opacity=".251"/><path d="M16.033.242h-.002a1.37 1.37 0 0 0-1.37 1.367l-.016 5.68a1.371 1.371 0 0 0 1.367 1.373h.003a1.37 1.37 0 0 0 1.37-1.368l.016-5.679A1.368 1.368 0 0 0 16.033.242"/><path d="M13.059 22.291a1.37 1.37 0 0 0-1.794.737l-1.797 4.313c-.291.698.039 1.5.736 1.79a1.36 1.36 0 0 0 1.794-.737l1.796-4.311a1.368 1.368 0 0 0-.735-1.792" fill-opacity=".6"/><path d="M20.713 23.052a1.37 1.37 0 1 0-2.535 1.041l1.773 4.314a1.37 1.37 0 1 0 2.536-1.039l-1.774-4.316z" fill-opacity=".4"/><path d="M7.501 17.26h.002a1.37 1.37 0 0 0 .003-2.74l-4.518-.009h-.003c-.756 0-1.37.611-1.37 1.367a1.368 1.368 0 0 0 1.367 1.373l4.519.009z" fill-opacity=".902"/><path d="M22.636 13.162a1.37 1.37 0 0 0 1.789.745l4.13-1.694a1.368 1.368 0 0 0 .744-1.786 1.365 1.365 0 0 0-1.788-.745l-4.13 1.692a1.369 1.369 0 0 0-.745 1.788" fill-opacity=".2"/><path d="M9.451 18.602a1.363 1.363 0 0 0-1.788-.745l-4.22 1.741a1.369 1.369 0 0 0-.745 1.787c.217.53.728.851 1.267.851.172 0 2.036-.731 2.208-.802l2.534-1.044a1.368 1.368 0 0 0 .744-1.788" fill-opacity=".8"/><path d="M22.906 20.904a1.37 1.37 0 0 0-1.94 1.935l3.246 3.256a1.37 1.37 0 1 0 1.943-1.935l-3.249-3.256z" fill-opacity=".349"/><path d="M21.103 10.822a1.371 1.371 0 0 0 1.939.004l3.145-3.135a1.37 1.37 0 1 0-1.935-1.942l-3.143 3.135a1.369 1.369 0 0 0-.006 1.938" fill-opacity=".149"/><path d="M18.786 9.217a1.373 1.373 0 0 0 1.792-.738l1.689-4.063a1.37 1.37 0 0 0-2.531-1.052l-1.689 4.061c-.29.699.04 1.5.739 1.792" fill-opacity=".102"/><path d="M12.307 3.35a1.37 1.37 0 0 0-2.533 1.046l1.682 4.074a1.368 1.368 0 0 0 1.788.743 1.368 1.368 0 0 0 .745-1.787L12.307 3.35zM8.973 10.789a1.37 1.37 0 0 0 1.937.004 1.369 1.369 0 0 0 .003-1.938L7.784 5.718a1.369 1.369 0 0 0-1.937-.004 1.369 1.369 0 0 0-.004 1.938l3.13 3.137z"/><path d="M11.012 20.876a1.369 1.369 0 0 0-1.937-.004L5.81 24.121a1.37 1.37 0 0 0 .969 2.34c.348 0 .699-.131.966-.399l3.263-3.249a1.37 1.37 0 0 0 .004-1.937" fill-opacity=".702"/><path d="M28.54 19.645l-4.203-1.751c-.697-.29-1.5.041-1.789.739a1.37 1.37 0 0 0 .737 1.792l4.202 1.75a1.37 1.37 0 0 0 1.79-.737 1.37 1.37 0 0 0-.737-1.793" fill-opacity=".302"/><path d="M3.456 12.167l4.131 1.719a1.366 1.366 0 0 0 1.789-.74 1.367 1.367 0 0 0-.737-1.79L4.511 9.637a1.37 1.37 0 1 0-1.055 2.53"/></g></symbol><symbol id="svg-question-circle" data-name="question-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M17.461 17.292v3.053a1.46 1.46 0 1 1-2.922 0v-4.33c0-.804.654-1.461 1.461-1.461a2.869 2.869 0 1 0-2.87-2.867 1.461 1.461 0 0 1-2.922 0A5.798 5.798 0 0 1 16 5.895a5.798 5.798 0 0 1 5.792 5.792 5.799 5.799 0 0 1-4.331 5.605M16 25.398a1.441 1.441 0 1 1 0-2.882 1.44 1.44 0 1 1 0 2.882" fill-rule="nonzero"/></symbol><symbol id="svg-refresh-circle" data-name="refresh-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.628 10.107l-1.048 4.12c-.012.046-.044.086-.064.135a1.238 1.238 0 0 1-1.129.794c-.034 0-.066-.01-.101-.012-.032-.003-.061-.008-.091-.013-.037-.007-.076-.005-.113-.014l-4.117-1.051a1.23 1.23 0 0 1-.893-1.496 1.228 1.228 0 0 1 1.502-.89l1.462.37a6.307 6.307 0 0 0-1.842-1.531 6.248 6.248 0 0 0-4.775-.525 6.238 6.238 0 0 0-3.75 3.01 6.216 6.216 0 0 0-.525 4.777c.967 3.326 4.46 5.246 7.785 4.275a1.233 1.233 0 1 1 .688 2.369 8.81 8.81 0 0 1-2.44.348c-3.789 0-7.29-2.485-8.402-6.301a8.694 8.694 0 0 1 .732-6.656 8.713 8.713 0 0 1 5.224-4.189 8.691 8.691 0 0 1 6.649.73 8.76 8.76 0 0 1 2.598 2.172l.261-1.028a1.226 1.226 0 0 1 1.499-.89 1.23 1.23 0 0 1 .89 1.496" fill-rule="nonzero"/></symbol><symbol id="svg-restore" data-name="restore" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill="none"/><path d="M24.341 7.216a12.123 12.123 0 0 0-8.752-3.273c-3.395.119-6.638 1.703-8.899 4.348a12.3 12.3 0 0 0-2.777 5.887l-1.456-2.193A1.162 1.162 0 1 0 .52 13.271l3.478 5.239c.415.658 1.42.695 1.901.057l4.018-4.575a1.164 1.164 0 0 0-.106-1.642 1.166 1.166 0 0 0-1.641.107l-1.982 2.256a9.977 9.977 0 0 1 2.271-4.911c1.837-2.151 4.466-3.438 7.211-3.535a9.801 9.801 0 0 1 7.085 2.65 9.82 9.82 0 0 1 3.136 6.883 9.813 9.813 0 0 1-2.648 7.085 9.823 9.823 0 0 1-6.884 3.136 1.162 1.162 0 0 0 .041 2.324h.04a12.127 12.127 0 0 0 8.503-3.874 12.123 12.123 0 0 0 3.272-8.752 12.133 12.133 0 0 0-3.874-8.503" fill-rule="nonzero"/></symbol><symbol id="svg-search-circle" data-name="search-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.716 13.771a6.112 6.112 0 0 1 6.105-6.103c3.362 0 6.098 2.74 6.098 6.103 0 3.364-2.736 6.104-6.098 6.104a6.112 6.112 0 0 1-6.105-6.104m18.19 10.784l-5.88-5.882c1.073-1.353 1.739-3.042 1.739-4.902 0-4.382-3.563-7.949-7.944-7.949-4.384 0-7.951 3.567-7.951 7.949 0 4.383 3.567 7.95 7.951 7.95 1.856 0 3.547-.67 4.9-1.743l5.882 5.882c.179.181.415.27.652.27a.911.911 0 0 0 .651-.27.92.92 0 0 0 0-1.305" fill-rule="nonzero"/></symbol><symbol id="svg-star-circle" data-name="star-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.08 5.155a.987.987 0 0 1 .711.367c.052.067.089.137.125.213l2.607 6.106h6.059l.083.004c.169.022.325.071.466.169a.966.966 0 0 1 .316 1.189c-.061.13-.149.233-.254.328l-5.213 4.341 2.629 7.014.026.08c.039.167.048.331.004.499a.966.966 0 0 1-1.013.709 1.026 1.026 0 0 1-.467-.174l-6.135-4.379L9.889 26l-.071.046c-.151.08-.307.131-.48.132a.966.966 0 0 1-.947-.796 1.021 1.021 0 0 1 .048-.496l2.629-7.014-5.213-4.341-.062-.056a1.039 1.039 0 0 1-.224-.349.966.966 0 0 1 .419-1.157c.149-.086.308-.121.478-.128h6.062l2.632-6.109.036-.074c.042-.072.086-.139.144-.201a.993.993 0 0 1 .576-.295c.082-.007.082-.007.164-.007zm-2.045 8.02a.967.967 0 0 1-.878.578H9.108l3.705 3.084.062.057c.058.063.111.125.154.2a.969.969 0 0 1 .124.567 1.205 1.205 0 0 1-.057.246l-1.768 4.717 4.141-2.955.071-.046a.968.968 0 0 1 .816-.073c.081.03.151.072.223.119l4.141 2.955-1.768-4.717-.026-.08a.955.955 0 0 1 .31-.99l3.704-3.084h-4.049l-.079-.004a1.174 1.174 0 0 1-.234-.049.987.987 0 0 1-.566-.528l-1.979-4.637-1.998 4.64z" fill-rule="nonzero"/></symbol><symbol id="svg-status-failed" data-name="status-failed" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.217 26.669a1.36 1.36 0 1 1-.004-2.72 1.36 1.36 0 0 1 .004 2.72m-1.248-13.607a1.248 1.248 0 0 1 2.495 0v8.163a1.247 1.247 0 1 1-2.495 0v-8.163zm17.424 17.319L17.649.891c-.025-.048-.058-.08-.085-.125a1.566 1.566 0 0 0-.816-.661s.003-.003.005-.003A1.57 1.57 0 0 0 16.217 0c-.567 0-1.063.294-1.348.761-.024.042-.057.075-.079.117L.133 30.194a1.24 1.24 0 0 0 .052 1.212c.23.369.629.594 1.063.594H31.21c.689 0 1.247-.559 1.247-1.247 0-.13-.027-.252-.064-.372" fill-rule="nonzero"/></symbol><symbol id="svg-status-partial" data-name="status-partial" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm.013 2.472v27.055l.102.01a13.494 13.494 0 0 0 9.337-3.855 13.634 13.634 0 0 0 2.821-3.97 13.428 13.428 0 0 0 1.134-3.819c.207-1.478.17-2.989-.111-4.454a13.411 13.411 0 0 0-1.239-3.593 13.696 13.696 0 0 0-6.049-5.977 13.475 13.475 0 0 0-5.484-1.398c-.171-.005-.341-.016-.511.001z"/><path d="M16.013 2.472v27.055l.102.01a13.494 13.494 0 0 0 9.337-3.855 13.634 13.634 0 0 0 2.821-3.97 13.428 13.428 0 0 0 1.134-3.819c.207-1.478.17-2.989-.111-4.454a13.411 13.411 0 0 0-1.239-3.593 13.696 13.696 0 0 0-6.049-5.977 13.475 13.475 0 0 0-5.484-1.398c-.171-.005-.341-.016-.511.001z" fill-opacity=".149"/></symbol><symbol id="svg-status-pending" data-name="status-pending" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M20 18.666h-6.666V8A1.332 1.332 0 1 1 16 8v8h4a1.332 1.332 0 1 1 0 2.666M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol><symbol id="svg-sync-circle" data-name="sync-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.754 19.267a9.828 9.828 0 0 1-9.254 6.538c-2.776 0-5.451-1.168-7.36-3.014v.832c0 .68-.547 1.227-1.227 1.227a1.226 1.226 0 0 1-1.227-1.227v-4.771c0-.677.55-1.227 1.227-1.227h4.771a1.227 1.227 0 1 1 0 2.454h-2.668c1.409 1.959 3.88 3.272 6.484 3.272a7.376 7.376 0 0 0 6.943-4.904 1.224 1.224 0 0 1 1.565-.748c.638.226.972.93.746 1.568M6.293 12.781a9.831 9.831 0 0 1 9.255-6.538c2.775 0 5.453 1.17 7.36 3.018v-.836a1.227 1.227 0 0 1 2.454 0v4.77c0 .68-.55 1.227-1.227 1.227h-4.771a1.226 1.226 0 1 1 0-2.454h2.667c-1.408-1.956-3.882-3.271-6.483-3.271A7.371 7.371 0 0 0 8.607 13.6a1.23 1.23 0 0 1-1.565.749 1.229 1.229 0 0 1-.749-1.568" fill-rule="nonzero"/></symbol><symbol id="svg-thumbs-up-circle" data-name="thumbs-up-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.07 18.601a1.413 1.413 0 0 1 0 2.828h-.943a1.414 1.414 0 1 1 0 2.828H16c-3.77 0-2.828-1.886-10.369-1.886v-8.483h2.828c3.299 0 7.07-3.037 7.07-7.541 0-1.49 2.828-1.679 2.828 1.149 0 1.885-.943 5.449-.943 5.449h7.541a1.415 1.415 0 0 1 0 2.828h-.943a1.414 1.414 0 1 1 0 2.828h-.942" fill-rule="nonzero"/></symbol><symbol id="svg-warning-circle" data-name="warning-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.898 17.985a.892.892 0 0 1-1.783 0v-4.864a.891.891 0 0 1 1.783 0v4.864zm-.892 3.242a.811.811 0 1 1 .004-1.622.811.811 0 0 1-.004 1.622m9.614 1.837L16.803 5.429c-.303-.604-1.291-.604-1.594 0L6.294 23.26a.883.883 0 0 0 .039.866.89.89 0 0 0 .758.425h17.831c.012-.002.023 0 .035 0a.893.893 0 0 0 .663-1.487" fill-rule="nonzero"/></symbol><symbol id="svg-x-circle" data-name="x-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.484 21.679a1.226 1.226 0 0 1-1.733 1.733L16 17.661l-5.749 5.751a1.224 1.224 0 0 1-1.735 0 1.226 1.226 0 0 1 0-1.733l5.752-5.751-5.752-5.749a1.225 1.225 0 1 1 1.735-1.732L16 14.196l5.751-5.749a1.225 1.225 0 0 1 1.733 1.732l-5.752 5.749 5.752 5.751z" fill-rule="nonzero"/></symbol><symbol id="svg-buttons" data-name="buttons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M326.9 41c1.6 0 3 1.4 3 3v29.8c0 1.6-1.4 3-3 3H140.8c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h186.1m0-5H140.8c-4.4 0-8 3.6-8 8v29.8c0 4.4 3.6 8 8 8h186.1c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8z"/><rect fill="#8c9ba5" x="198.7" y="54.1"/><path fill="#dd2f41" d="M327.4 94.1H140.6c-4.2 0-7.7 3.5-7.7 7.7v30.4c0 4.2 3.5 7.7 7.7 7.7h186.7c4.2 0 7.7-3.5 7.7-7.7v-30.4c.1-4.2-3.4-7.7-7.6-7.7zm-58.6 27.7h-70.2v-9.6h70.2v9.6z"/><path fill="#297adf" d="M327.1 152.2H140.9c-4.4 0-7.9 3.6-7.9 7.9V190c0 4.4 3.6 7.9 7.9 7.9h186.2c4.4 0 7.9-3.6 7.9-7.9v-29.9c.1-4.3-3.5-7.9-7.9-7.9zm-58.3 27.6h-70.2v-9.6h70.2v9.6z"/></symbol><symbol id="svg-cards" data-name="cards" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M405.9 36H258.5c-4.5 0-8.1 3.6-8.1 8.1v145.8c0 4.5 3.6 8.1 8.1 8.1h147.4c4.5 0 8.1-3.6 8.1-8.1V44.1c0-4.5-3.6-8.1-8.1-8.1zm-150.4 8.1c0-1.6 1.4-3 3-3h147.4c1.6 0 3 1.4 3 3V156H255.5V44.1zM209.6 40.7c1.6 0 3 1.4 3 3v146.1c0 1.6-1.4 3-3 3H61.9c-1.6 0-3-1.4-3-3v-146c0-1.6 1.4-3 3-3h147.7m0-5.1H61.9c-4.5 0-8.1 3.7-8.1 8.1v146.1c0 4.5 3.7 8.1 8.1 8.1h147.7c4.5 0 8.1-3.7 8.1-8.1V43.8c.1-4.5-3.6-8.1-8.1-8.1z"/><path fill="#fff" d="M401.5 187.1h-53.6c-1.9 0-3.5-1.6-3.5-3.5v-12.7c0-1.9 1.6-3.5 3.5-3.5h53.6c1.9 0 3.5 1.6 3.5 3.5v12.7c0 1.9-1.6 3.5-3.5 3.5z"/></symbol><symbol id="svg-color-wheel" data-name="color-wheel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#2ac84f" d="M306.8 81.8c-7.9-16.1-20.9-29.1-37-37-.8.8-1.4 1.8-1.9 2.8l-11.3 26.2-11.2 26.2c-2.1 4.8 1.4 8.2 6.2 6.2l26.2-11.3L304 83.6c1-.4 2-1.1 2.8-1.8z"/><path fill="#59a702" d="M310.6 91.1c-1.1 0-2.2.3-3.3.7l-26.5 10.6-26.5 10.6c-4.9 1.9-4.9 6.8 0 8.7l26.5 10.6 26.5 10.6c1.1.4 2.2.6 3.3.7 2.8-8.2 4.3-17 4.3-26.2s-1.5-18.1-4.3-26.3z"/><path fill="#efc102" d="M306.8 152.7c-.8-.8-1.8-1.4-2.8-1.9l-26.2-11.3-26.2-11.3c-4.8-2.1-8.2 1.4-6.2 6.2l11.3 26.2 11.3 26.2c.5 1.1 1.1 2 1.9 2.8 15.9-7.8 29-20.8 36.9-36.9z"/><path fill="#f69524" d="M234.3 197.9c9.2 0 18-1.5 26.2-4.3 0-1.1-.3-2.2-.7-3.3l-10.6-26.5-10.6-26.5c-1.9-4.9-6.8-4.9-8.7 0l-10.6 26.5-10.6 26.5c-.4 1.1-.6 2.2-.7 3.3 8.3 2.8 17.1 4.3 26.3 4.3z"/><path fill="#f96623" d="M217.1 128.3l-26.2 11.3-26.2 11.3c-1.1.5-2 1.1-2.8 1.9 7.9 16.1 20.9 29.1 37 37 .8-.8 1.4-1.8 1.9-2.8l11.3-26.2 11.3-26.2c1.9-4.9-1.5-8.3-6.3-6.3z"/><path fill="#a81d27" d="M214.3 112.9l-26.5-10.6-26.5-10.6c-1.1-.4-2.2-.6-3.3-.7-2.8 8.2-4.3 17-4.3 26.2s1.5 18 4.3 26.2c1.1 0 2.2-.3 3.3-.7l26.5-10.6 26.5-10.6c4.8-1.8 4.8-6.7 0-8.6z"/><path fill="#a346ce" d="M161.8 81.8c.8.8 1.8 1.4 2.8 1.9L190.8 95l26.2 11.3c4.8 2.1 8.2-1.4 6.2-6.2L212 73.8l-11.3-26.2c-.5-1.1-1.1-2-1.9-2.8-16 7.8-29.1 20.9-37 37z"/><path fill="#297adf" d="M234.3 36.6c-9.2 0-18 1.5-26.2 4.3 0 1.1.3 2.2.7 3.3l10.6 26.5L230 97.2c1.9 4.9 6.8 4.9 8.7 0l10.6-26.5 10.6-26.5c.4-1.1.6-2.2.7-3.3-8.3-2.8-17.1-4.3-26.3-4.3z"/></symbol><symbol id="svg-dialog" data-name="dialog" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#fff" d="M177.8 170.8c-3 0-5.5-2.5-5.5-5.5V63.7c0-3 2.5-5.5 5.5-5.5h112.4c3 0 5.5 2.5 5.5 5.5v101.6c0 3-2.5 5.5-5.5 5.5H177.8z"/><path fill="#d6dde7" d="M290.2 60.7c1.6 0 3 1.4 3 3v101.6c0 1.6-1.4 3-3 3H177.8c-1.6 0-3-1.4-3-3V63.7c0-1.6 1.4-3 3-3h112.4m0-5H177.8c-4.4 0-8 3.6-8 8v101.6c0 4.4 3.6 8 8 8h112.4c4.4 0 8-3.6 8-8V63.7c0-4.4-3.6-8-8-8z"/><path fill="#297adf" d="M260.4 158.2h-52.9c-1.9 0-3.5-1.6-3.5-3.5v-12.5c0-1.9 1.6-3.5 3.5-3.5h52.9c1.9 0 3.5 1.6 3.5 3.5v12.5c0 1.9-1.5 3.5-3.5 3.5z"/></symbol><symbol id="svg-feedback" data-name="feedback" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill="#f96623"><rect fill-opacity=".48" x="277.6" y="104.2" transform="rotate(112.086 282.995 136.868)"/><rect x="179.6" y="64.5" transform="rotate(112.086 185.008 97.116)"/><path fill-opacity=".24" d="M206.906 198.23l-10.1-4.098 24.553-60.507 10.1 4.098z"/><path fill-opacity=".72" d="M246.706 100.272l-10.1-4.098 24.553-60.507 10.1 4.098z"/><path fill-opacity=".36" d="M272.328 193.588l-10.04 4.245-25.428-60.148 10.04-4.244z"/><path fill-opacity=".84" d="M231.086 96.223l-10.04 4.244-25.428-60.148 10.04-4.244z"/><path fill-opacity=".12" d="M157.389 155.246l-4.245-10.04 60.148-25.428 4.244 10.04z"/><path fill-opacity=".6" d="M254.762 114.076l-4.245-10.04 60.148-25.428 4.244 10.04z"/></g></symbol><symbol id="svg-icons" data-name="icons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f0f3f6" d="M334.8 119s-50.5 62.4-112.8 62.4S109.3 119 109.3 119s50.5-62.4 112.8-62.4S334.8 119 334.8 119z"/><path fill="#d6dde7" d="M222.1 183.9c-18.1 0-47-5.5-81.3-31.7-20.4-15.6-32.9-31-33.5-31.6L106 119l1.3-1.6c.5-.6 13-16 33.5-31.6 34.3-26.2 63.1-31.7 81.3-31.7 18.1 0 47 5.5 81.3 31.7 20.4 15.6 32.9 31 33.5 31.6l1.3 1.6-1.3 1.6c-.5.6-13 16-33.5 31.6-34.4 26.2-63.2 31.7-81.3 31.7zM112.6 119c8.3 9.6 54.6 59.9 109.5 59.9s101.2-50.3 109.5-59.9c-8.3-9.6-54.6-59.9-109.5-59.9S120.9 109.4 112.6 119z"/><path fill="#59a702" d="M222.1 69.4c-27 0-49 21.9-49 49s21.9 49 49 49c27 0 49-21.9 49-49s-22-49-49-49zm11.5 40.9c-6.4 0-11.5-5.2-11.5-11.5s5.2-11.5 11.5-11.5c6.4 0 11.5 5.2 11.5 11.5s-5.2 11.5-11.5 11.5z"/><path fill="#549103" d="M233.6 110.3c-6.4 0-11.5-5.2-11.5-11.5 0-.6.1-1.3.2-1.9h-.2c-11.9 0-21.5 9.6-21.5 21.5s9.6 21.5 21.5 21.5 21.5-9.6 21.5-21.5c0-3.8-1-7.4-2.8-10.6-2 1.6-4.5 2.5-7.2 2.5z"/></symbol><symbol id="svg-inputs" data-name="inputs" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M278.9 64.2h-89.8c-29.1 0-52.8 23.8-52.8 52.8 0 29.1 23.8 52.8 52.8 52.8h89.8c29.1 0 52.8-23.8 52.8-52.8 0-29.1-23.7-52.8-52.8-52.8zm-.8 95.8c-23.3 0-42.2-18.9-42.2-42.2 0-23.3 18.9-42.2 42.2-42.2 23.3 0 42.2 18.9 42.2 42.2 0 23.3-18.9 42.2-42.2 42.2z"/></symbol><symbol id="svg-messages" data-name="messages" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" class="st0" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#59a702" d="M327.1 80.3H140.6c-2.1 0-3.8-1.7-3.8-3.8V36h194.1v40.5c0 2.1-1.7 3.8-3.8 3.8z"/><path fill="#549103" d="M140.6 80.3h40.5V36h-44.3v40.5c0 2.1 1.7 3.8 3.8 3.8z"/><circle fill="#7bc117" cx="307.7" cy="58.1" r="11.8"/></symbol><symbol id="svg-panel" data-name="panel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M371.4 41c1.6 0 3 1.4 3 3v56c0 1.6-1.4 3-3 3H96.6c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h274.8m0-5H96.6c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h274.8c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8zM371.4 198H96.6c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h274.8c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8z"/></symbol><symbol id="svg-progress-bars" data-name="progress-bars" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dfe3e6" d="M401.6 129.5H66.4c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h335.3c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.6 12.5z"/><path fill="#efc102" d="M333.4 129.5h-267c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h267c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.5 12.5z"/></symbol><symbol id="svg-section" data-name="section" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f69524" d="M228.9 112.3h-76.1V55.9c0-10.9 8.8-19.7 19.7-19.7h56.4v76.1z"/><path fill="#d6dde7" d="M228.9 197.8h-56.6c-10.8 0-19.5-8.7-19.5-19.5v-56.6h76.1v76.1zM315.2 112.3h-76.1V36.2H296c10.6 0 19.2 8.6 19.2 19.2v56.9zM295.7 197.8h-56.6v-76.1h76.1v56.6c0 10.7-8.7 19.5-19.5 19.5z"/></symbol><symbol id="svg-sliders" data-name="sliders" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#297adf" cx="164.6" cy="117" r="6.6"/><path fill="#297adf" d="M145.7 117c0-1.7.3-3.4.7-5H80.2c-2-5-6.8-8.5-12.5-8.5-7.5 0-13.5 6-13.5 13.5s6 13.5 13.5 13.5c5.7 0 10.5-3.5 12.5-8.5h66.2c-.5-1.6-.7-3.3-.7-5z"/><path fill="#d6dde7" d="M400.3 103.5c-5.7 0-10.5 3.5-12.5 8.5H246.5c-2-5-6.8-8.5-12.5-8.5s-10.5 3.5-12.5 8.5h-38.6c-2.2-8-9.5-13.9-18.2-13.9-10.4 0-18.9 8.5-18.9 18.9 0 10.4 8.5 18.9 18.9 18.9 8.7 0 16-5.9 18.2-13.9h38.6c2 5 6.8 8.5 12.5 8.5s10.5-3.5 12.5-8.5h141.3c2 5 6.8 8.5 12.5 8.5 7.5 0 13.5-6 13.5-13.5s-6-13.5-13.5-13.5zm-235.7 27.4c-7.7 0-13.9-6.2-13.9-13.9s6.2-13.9 13.9-13.9 13.9 6.2 13.9 13.9-6.2 13.9-13.9 13.9zm18.9-12.3c0-.5.1-1.1.1-1.6s0-1.1-.1-1.6c0 .5.1 1.1.1 1.6s-.1 1.1-.1 1.6zm-.2 1.4c0-.2.1-.5.1-.7 0 .3-.1.5-.1.7zm0-6c0 .2.1.5.1.7 0-.3-.1-.5-.1-.7z"/></symbol><symbol id="svg-tables" data-name="tables" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M366.6 197.9c4.4 0 8.1-3.6 8.1-8.1V44.2c0-4.4-3.6-8.1-8.1-8.1H101.4c-4.4 0-8.1 3.6-8.1 8.1V189.8c0 4.4 3.6 8.1 8.1 8.1h265.2zm3-153.7v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zm-180 43.6V41.2h88.7v46.6h-88.7zm88.8 5.1V142h-88.7V92.9h88.7zm-180-48.7c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2zm0 48.7h86.2V142H98.4V92.9zm3 99.9c-1.6 0-3-1.4-3-3V147h86.2v45.8h-83.2zm88.2 0V147h88.7v45.8h-88.7zm180-3c0 1.6-1.4 3-3 3h-83.2V147h86.2v42.8zm0-47.8h-86.2V92.9h86.2V142z"/><path fill="#a346ce" d="M369.6 44.2v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3z"/><rect fill="#a346ce" x="189.6" y="41.2"/><path fill="#a346ce" d="M98.4 44.2c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2z"/></symbol><symbol id="svg-text" data-name="text" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M228 172.7l-8.3-21.8h-52.1l-8.3 21.8h-22.6l44.6-113.5h24.9l44.6 113.5H228zm-34.3-93.4l-20.4 54.1h40.9l-20.5-54.1zM313.5 172.7v-8.9c-6.1 7-15.7 10.9-26.6 10.9-13.4 0-28.6-9-28.6-27.2 0-18.9 15.1-26.7 28.6-26.7 11.1 0 20.6 3.6 26.6 10.6v-12.3c0-9.5-7.8-15.3-19.2-15.3-9.2 0-17.2 3.4-24.3 10.4l-7.3-12.4c9.5-9 21.4-13.3 34.6-13.3 18.2 0 34.2 7.7 34.2 29.8v54.5h-18zm0-18.7v-12.4c-4.1-5.6-11.7-8.5-19.6-8.5-10 0-17.5 5.8-17.5 14.8 0 8.9 7.5 14.6 17.5 14.6 7.8 0 15.5-2.9 19.6-8.5z"/></symbol><symbol id="svg-time" data-name="time" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#c3cddb" cx="234" cy="117" r="80.8"/><path fill="#fff" d="M261.1 148.1c-1 0-2-.4-2.8-1.2l-27.1-27.1c-.8-.8-1.2-1.8-1.2-2.8V56.2c0-2.2 1.8-4 4-4s4 1.8 4 4v59.2l25.9 25.9c1.6 1.6 1.6 4.1 0 5.7-.8.7-1.8 1.1-2.8 1.1z"/></symbol><symbol id="svg-validation" data-name="validation" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dd2f41" d="M332 69.7H136c-4.4 0-8 3.6-8 8v83.2c0 1.9 1.5 3.4 3.4 3.4h205.2c1.9 0 3.4-1.5 3.4-3.4V77.7c0-4.4-3.6-8-8-8zm-141.7 75.5h-52.1v-9.3h52.1v9.3zM335 111.8H133V77.7c0-1.6 1.4-3 3-3h196c1.6 0 3 1.4 3 3v34.1z"/></symbol><symbol id="svg-status-completed" data-name="status-completed" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M24.965 12.802l-10.267 11.25-7.626-7.621a1.232 1.232 0 0 1 0-1.741 1.224 1.224 0 0 1 1.74 0l5.805 5.802 8.531-9.349a1.23 1.23 0 0 1 1.817 1.659M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol></svg>')
|
|
80
|
+
document.querySelector('body').insertAdjacentHTML('afterbegin', '<svg id="esvg-svg-icons" data-symbol-class="svg-symbol" data-prefix="svg" version="1.1" style="height:0;position:absolute" data-turbolinks-permanent><symbol id="svg-angle-down" data-name="angle-down" viewBox="0 0 27 15" width="27" height="15" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M25.304.005c.092.012.116.012.206.036.135.036.263.096.377.176.348.244.545.665.508 1.088a1.196 1.196 0 0 1-.277.666c-.022.027-.047.052-.07.078l-12 12c-.026.023-.051.048-.078.07a1.198 1.198 0 0 1-1.542 0c-.027-.022-.052-.047-.077-.07l-12-12C.288 1.98.27 1.965.216 1.888a1.193 1.193 0 0 1-.176-.377A1.21 1.21 0 0 1 .789.072a1.2 1.2 0 0 1 1.098.145c.077.053.092.072.161.134l11.151 11.152L24.351.351l.077-.07c.073-.057.09-.074.171-.12.121-.07.254-.119.392-.143.092-.016.115-.014.208-.018l.105.005z" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-down-circle" data-name="arrow-down-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.218 18.943l-5.243 5.243a1.217 1.217 0 0 1-.951.479c-.005 0-.01-.005-.017-.005-.008 0-.013.005-.02.005-.315 0-.629-.121-.87-.359l-5.361-5.363a1.225 1.225 0 0 1 0-1.738 1.23 1.23 0 0 1 1.738 0l3.301 3.301V9.322a1.23 1.23 0 0 1 2.458 0V20.43l3.227-3.225a1.23 1.23 0 0 1 1.738 0 1.23 1.23 0 0 1 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-up-circle" data-name="arrow-up-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.294 14.798a1.225 1.225 0 0 1-.87.359c-.315 0-.627-.118-.868-.359l-3.303-3.305v11.188a1.23 1.23 0 0 1-2.458 0V11.569l-3.227 3.229a1.229 1.229 0 0 1-1.738-1.737l5.243-5.248a1.22 1.22 0 0 1 .951-.479c.007 0 .012.005.019.005.008 0 .013-.005.02-.005.327 0 .639.13.868.359l5.363 5.368a1.23 1.23 0 0 1 0 1.737" fill-rule="nonzero"/></symbol><symbol id="svg-backup" data-name="backup" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.039 23.889a33.24 33.24 0 0 1-2.705.111C8.047 24 2.483 22.656 0 20.483v2.85c0 3.364 5.856 6 13.334 6 1.358 0 2.661-.088 3.888-.25A8.609 8.609 0 0 1 16 24.667c0-.263.015-.522.039-.778zm-2.706-1.222c1.004 0 1.988-.047 2.943-.131a8.686 8.686 0 0 1 3.807-5.212 34.585 34.585 0 0 1-6.75.676C8.047 18 2.483 16.656 0 14.483V18c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.439V8.892C23.819 10.807 18.377 12 13.333 12 8.047 12 2.483 10.656 0 8.483V12c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.438V6c0-3.364-5.858-6-13.334-6S0 2.636 0 6c0 2.113 5.948 4.667 13.333 4.667z" fill-opacity=".502"/><path d="M28 25.333h-2.667V28A.667.667 0 0 1 24 28v-2.667h-2.667a.666.666 0 1 1 0-1.333H24v-2.667a.667.667 0 0 1 1.333 0V24H28a.667.667 0 0 1 0 1.333m-3.333-8c-4.044 0-7.334 3.29-7.334 7.334S20.623 32 24.667 32C28.709 32 32 28.711 32 24.667c0-4.044-3.291-7.334-7.333-7.334" fill-rule="nonzero"/></symbol><symbol id="svg-check-circle" data-name="check-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M24.925 12.745L14.704 23.944l-7.589-7.587a1.22 1.22 0 0 1 0-1.732 1.216 1.216 0 0 1 1.732 0l5.776 5.775 8.491-9.307a1.226 1.226 0 1 1 1.811 1.652" fill-rule="nonzero"/></symbol><symbol id="svg-cluster" data-name="cluster" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 32a2.906 2.906 0 0 1-.505-.045 2.836 2.836 0 0 1-1.475-.768A2936.603 2936.603 0 0 1 .813 17.98a2.813 2.813 0 0 1 0-3.96C5.201 9.604 9.604 5.201 14.02.813a2.813 2.813 0 0 1 3.96 0c4.416 4.388 8.819 8.791 13.207 13.207a2.813 2.813 0 0 1 0 3.96A2936.603 2936.603 0 0 1 17.98 31.187a2.878 2.878 0 0 1-.533.414 2.81 2.81 0 0 1-1.379.398L16 32zm0-1.883a.927.927 0 0 0 .657-.27c4.412-4.384 8.839-8.755 13.195-13.195a.901.901 0 0 0 .181-.263.947.947 0 0 0-.106-.954.901.901 0 0 0-.075-.087 977.85 977.85 0 0 0-13.2-13.2.901.901 0 0 0-.263-.181.947.947 0 0 0-.95.102 1.145 1.145 0 0 0-.091.079 977.85 977.85 0 0 0-13.2 13.2.962.962 0 0 0-.181.263.947.947 0 0 0 .106.954c.023.031.049.06.075.087a977.85 977.85 0 0 0 13.2 13.2.92.92 0 0 0 .635.265H16z" fill-opacity=".502" fill-rule="nonzero"/><path d="M17.482 26.929l-.847.847a.897.897 0 0 1-1.27 0L4.224 16.635a.897.897 0 0 1 0-1.27L15.365 4.224a.897.897 0 0 1 1.27 0l4.049 4.049v5.457a2.353 2.353 0 0 0-1.708 1.971 2.352 2.352 0 0 0 2.335 2.654l.061-.001a2.382 2.382 0 0 0 .948-.226 2.357 2.357 0 0 0-.132-4.314 2.6 2.6 0 0 0-.249-.084V9.528l5.837 5.837a.897.897 0 0 1 0 1.27l-6.639 6.639-4.509-4.51v-6.508a2.377 2.377 0 0 0 1.494-1.249 2.366 2.366 0 0 0 .205-1.379 2.365 2.365 0 0 0-1.897-1.957 2.363 2.363 0 0 0-1.36.151 2.377 2.377 0 0 0-1.204 1.169 2.34 2.34 0 0 0-.178 1.44 2.366 2.366 0 0 0 1.684 1.825v6.768c.002.049.001.061.01.109.016.09.051.177.104.251.028.04.037.048.07.084l4.693 4.694-1.879 1.879-6.962-6.961v-.81a2.359 2.359 0 0 0 1.482-3.317 2.38 2.38 0 0 0-1.679-1.268 2.372 2.372 0 0 0-1.36.151 2.353 2.353 0 0 0-1.406 1.865 2.352 2.352 0 0 0 1.708 2.569v1.07c.001.039.001.049.006.089a.642.642 0 0 0 .147.322l.031.032 7.145 7.146zm-6.701-9.83a1.07 1.07 0 0 0 .728-.277 1.107 1.107 0 0 0 .343-.573 1.106 1.106 0 0 0-.638-1.259 1.097 1.097 0 0 0-1.419.522 1.09 1.09 0 0 0-.093.703 1.1 1.1 0 0 0 1.05.884h.029zm10.53 0a1.07 1.07 0 0 0 .739-.285c.087-.079.161-.172.219-.273a1.099 1.099 0 1 0-.986.558h.028zM16 11.085a1.081 1.081 0 0 0 .729-.277 1.091 1.091 0 0 0 .361-.963 1.095 1.095 0 0 0-1.076-.958 1.095 1.095 0 0 0-1.099.924 1.088 1.088 0 0 0 .337.979 1.08 1.08 0 0 0 .719.295H16z"/></symbol><symbol id="svg-copy" data-name="copy" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill-rule="nonzero"><path d="M22.667 4.667A.667.667 0 0 0 22 4h-3.333v10.495a9.916 9.916 0 0 1 4-1.127V4.667zM4 25.333V4H.667A.667.667 0 0 0 0 4.667V26a3.338 3.338 0 0 0 3.333 3.333h12.019a9.95 9.95 0 0 1-1.817-4H4z" fill-opacity=".302"/><path d="M14 12H7.333a.667.667 0 0 0 0 1.333H14A.667.667 0 1 0 14 12M14 14.667H7.333a.666.666 0 1 0 0 1.333H14a.667.667 0 0 0 0-1.333M14.667 18a.667.667 0 0 0-.667-.667H7.333a.667.667 0 0 0 0 1.334H14a.667.667 0 0 0 .667-.667M7.333 20a.667.667 0 0 0 0 1.333h4a.667.667 0 1 0 0-1.333h-4z" fill-opacity=".502"/><path d="M6 9.333h10.667a.666.666 0 0 0 .666-.666V3.333a.666.666 0 0 0-.666-.666h-2.06C14.331 1.115 13.087 0 11.333 0 9.687 0 8.363 1.001 8.06 2.667H6a.667.667 0 0 0-.667.666v5.334c0 .368.299.666.667.666" fill-opacity=".302"/><path d="M26.969 24H24v2.969a.667.667 0 0 1-1.333 0V24h-2.97a.667.667 0 0 1 0-1.333h2.97v-2.97a.666.666 0 1 1 1.333 0v2.97h2.969a.667.667 0 1 1 0 1.333m-3.636-9.333c-4.78 0-8.666 3.888-8.666 8.666 0 4.779 3.886 8.667 8.666 8.667C28.112 32 32 28.112 32 23.333c0-4.778-3.888-8.666-8.667-8.666"/></g></symbol><symbol id="svg-deployment" data-name="deployment" viewBox="0 0 176 201" width="176" height="201" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M88 5.985l82.272 47.5v95L88 195.985l-82.272-47.5v-95L88 5.985z"/></symbol><symbol id="svg-dice" data-name="dice" viewBox="0 0 45 32" width="45" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M30.762 10.232a2.478 2.478 0 0 1 .906 3.382l-9.9 17.148a2.477 2.477 0 0 1-3.382.906l-17.148-9.9a2.478 2.478 0 0 1-.906-3.382l9.9-17.148a2.478 2.478 0 0 1 3.382-.906l17.148 9.9z" fill-opacity=".149"/><path d="M22.13 5.249l.061-.001h19.802a2.476 2.476 0 0 1 2.475 2.475v19.802A2.476 2.476 0 0 1 41.993 30H22.208l2.441-4.229a2.34 2.34 0 0 0 3.218-2.169c0-.749-.353-1.416-.901-1.844l4.702-8.144a2.478 2.478 0 0 0-.906-3.382L22.13 5.249zm16.35 16.014a2.34 2.34 0 0 1 0 4.678 2.34 2.34 0 0 1-2.34-2.339 2.34 2.34 0 0 1 2.34-2.339zm0-11.956a2.34 2.34 0 0 1 0 4.678 2.34 2.34 0 0 1-2.34-2.339 2.34 2.34 0 0 1 2.34-2.339zM19.712 22.345a2.341 2.341 0 0 1 .857 3.196 2.34 2.34 0 0 1-4.052-2.34 2.34 2.34 0 0 1 3.195-.856zM17.093 13.93a2.34 2.34 0 1 1-2.34 4.051 2.34 2.34 0 0 1 2.34-4.051zM14.473 5.514a2.34 2.34 0 1 1-2.34 4.052 2.34 2.34 0 0 1 2.34-4.052z"/></symbol><symbol id="svg-download" data-name="download" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><rect fill="none"/><path d="M15.501 28.627V16.92a.993.993 0 0 1 .559-.89c.113-.054.231-.081.355-.095.074-.003.074-.003.148 0a1.1 1.1 0 0 1 .355.095.996.996 0 0 1 .515.599c.029.096.04.192.044.291v11.707l2.541-2.541.042-.039a.994.994 0 0 1 .8-.24.997.997 0 0 1 .834.835.979.979 0 0 1-.137.662c-.03.049-.065.093-.102.138-1.38 1.462-2.842 2.844-4.264 4.266l-.03.029a1.005 1.005 0 0 1-.599.26.967.967 0 0 1-.567-.129.99.99 0 0 1-.206-.158c-1.448-1.369-2.818-2.818-4.226-4.227a1.038 1.038 0 0 1-.24-.387.998.998 0 0 1 .42-1.152c.149-.092.315-.136.49-.147a1.086 1.086 0 0 1 .284.034c.17.045.316.135.443.255l2.541 2.541zm10.423-4.984h-4.52c-.036-.002-.072-.002-.107-.006a.985.985 0 0 1-.646-.343.995.995 0 0 1 .073-1.356.992.992 0 0 1 .467-.248c.093-.02.118-.018.213-.023h4.444a7.281 7.281 0 0 0 1.264-.348c1.132-.419 2.194-1.102 2.908-2.09.165-.228.31-.47.433-.723.287-.59.451-1.234.516-1.886.038-.383.046-.771.016-1.155a5.684 5.684 0 0 0-.249-1.285 5.798 5.798 0 0 0-2.123-2.932 5.69 5.69 0 0 0-3.576-1.074l-.103-.002c-.091-.012-.115-.011-.204-.037a.991.991 0 0 1-.505-.345c-.056-.073-.064-.095-.108-.176a8.604 8.604 0 0 0-1.438-2.13 8.517 8.517 0 0 0-2.063-1.634 8.35 8.35 0 0 0-2.659-.952 8.535 8.535 0 0 0-2.404-.076 8.396 8.396 0 0 0-4.718 2.125 8.484 8.484 0 0 0-1.887 2.479 8.41 8.41 0 0 0-.881 3.291l-.012.104c-.008.034-.014.069-.024.103a.995.995 0 0 1-.936.716c-.035.001-.07-.003-.106-.004-.136-.02-.271-.048-.407-.068a4.134 4.134 0 0 0-1.483.073 4.113 4.113 0 0 0-2.467 1.739 4 4 0 0 0-.635 1.799c-.04.393-.025.795.03 1.185.075.536.243 1.061.539 1.517.09.138.19.269.3.392.633.704 1.547 1.091 2.459 1.275.341.069.692.116 1.04.119h5.17l.107.006c.094.015.118.015.209.046a.988.988 0 0 1-.209 1.918c-.035.004-.071.004-.107.006-1.744 0-3.489.014-5.233-.001a7.898 7.898 0 0 1-1.247-.133c-1.186-.222-2.346-.7-3.253-1.511a5.15 5.15 0 0 1-.949-1.129 5.694 5.694 0 0 1-.765-2.107 7.23 7.23 0 0 1-.057-1.781c.046-.456.144-.906.291-1.339a6.066 6.066 0 0 1 3.997-3.836 6.067 6.067 0 0 1 1.889-.248c.019-.115.04-.23.061-.345a10.418 10.418 0 0 1 3.697-6.121 10.4 10.4 0 0 1 2.947-1.667 10.405 10.405 0 0 1 3.674-.63c.918.012 1.831.137 2.715.385a10.458 10.458 0 0 1 6.308 5.016l.004.006a7.477 7.477 0 0 1 1.265.162 7.628 7.628 0 0 1 1.658.556 7.74 7.74 0 0 1 4.165 4.942 8.146 8.146 0 0 1 .218 3.097 7.492 7.492 0 0 1-.69 2.412 6.901 6.901 0 0 1-1.103 1.624c-.903.993-2.076 1.713-3.33 2.177a8.884 8.884 0 0 1-1.712.458c-.047.006-.046.006-.093.01l-.068.003z"/></symbol><symbol id="svg-gear-circle" data-name="gear-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M24.253 6.971a.975.975 0 0 1 .445.238c.054.053.064.069.111.129 1.095 1.709 2.034 3.514 3.049 5.272a.927.927 0 0 1-.08 1.037c-.073.09-.16.158-.257.22l-1.64.948c.021.155.033.309.047.465.013.193.023.385.026.579.003.424-.023.843-.069 1.264l-.002.013 1.642.949.071.045c.069.053.131.107.186.174a.929.929 0 0 1 .119.962c-.933 1.803-2.026 3.519-3.041 5.277a1.05 1.05 0 0 1-.156.201c-.206.2-.5.293-.783.249a1.03 1.03 0 0 1-.319-.113l-1.635-.949c-.129.097-.262.187-.396.278-.191.124-.19.123-.385.243-.389.229-.787.435-1.199.623l-.014.006v1.908l-.004.085a1.105 1.105 0 0 1-.058.248.927.927 0 0 1-.773.583c-2.029.094-4.062.004-6.094.004a.925.925 0 0 1-.857-.587 1.056 1.056 0 0 1-.063-.333v-1.907c-.142-.061-.282-.128-.422-.195-.203-.102-.203-.101-.404-.207a12.071 12.071 0 0 1-1.168-.731l-.027-.02-1.659.953-.075.038a.924.924 0 0 1-1.134-.305c-1.095-1.71-2.034-3.515-3.049-5.274a1.003 1.003 0 0 1-.112-.319.926.926 0 0 1 .248-.781c.061-.063.128-.11.201-.156l1.641-.948c-.021-.156-.033-.311-.046-.467-.014-.231-.014-.23-.023-.461-.006-.463.018-.921.069-1.381l.001-.014-1.639-.947-.071-.046a1.096 1.096 0 0 1-.186-.174.93.93 0 0 1-.192-.718c.014-.086.041-.164.074-.244.934-1.803 2.029-3.518 3.046-5.276.062-.097.129-.183.22-.256a.928.928 0 0 1 .8-.176c.084.021.159.056.235.096l1.652.951c.07-.053.143-.103.214-.153.191-.129.19-.129.385-.253.454-.278.921-.523 1.407-.743l.014-.006V4.962l.004-.085a.925.925 0 0 1 .584-.773c.081-.031.162-.046.248-.058 2.028-.094 4.062-.004 6.093-.004.115.006.224.02.332.062a.93.93 0 0 1 .553.607c.023.083.031.165.035.251V6.87c.142.061.281.129.42.196.202.102.201.102.401.208.399.224.781.466 1.153.733l.02.014 1.628-.947.076-.039c.137-.056.265-.082.413-.085.085.007.085.006.169.021zm-2.229 14.94c.117.024.218.059.324.114l1.379.8 2.081-3.607-1.389-.802c-.065-.041-.083-.05-.141-.1a.919.919 0 0 1-.317-.768c.027-.216.068-.43.097-.645.04-.369.067-.739.055-1.11a9.525 9.525 0 0 0-.143-1.304l-.01-.085a.921.921 0 0 1 .316-.768c.058-.051.076-.059.141-.1l1.387-.802-2.081-3.605-1.374.799c-.068.035-.084.046-.157.072a.93.93 0 0 1-.594.006 1.114 1.114 0 0 1-.232-.115c-.123-.093-.24-.195-.362-.291a8.935 8.935 0 0 0-1.093-.711 9.705 9.705 0 0 0-1.188-.541l-.078-.034c-.066-.037-.084-.044-.145-.089a.932.932 0 0 1-.332-.484 1.07 1.07 0 0 1-.035-.252V5.882h-4.168v1.607a.929.929 0 0 1-.368.736c-.061.045-.079.052-.145.089-.199.087-.402.161-.602.246-.745.337-1.446.748-2.072 1.276l-.069.052a.919.919 0 0 1-.826.113c-.073-.025-.089-.036-.157-.072L8.33 9.126l-2.086 3.608 1.387.802c.065.041.082.05.141.1a.922.922 0 0 1 .316.77c-.02.154-.049.307-.073.46a8.157 8.157 0 0 0-.08 1.297c.011.437.065.868.14 1.297l.011.086c.003.077.006.096-.002.172a.928.928 0 0 1-.455.698l-1.389.802 2.084 3.611 1.403-.806a.923.923 0 0 1 .831-.043c.071.032.086.044.151.085.121.092.237.192.357.286.3.225.611.432.938.617.44.249.899.455 1.371.636l.078.034c.066.037.084.044.144.089a.918.918 0 0 1 .368.736v1.606h4.168v-1.606a1.08 1.08 0 0 1 .035-.253.927.927 0 0 1 .332-.483c.06-.045.078-.052.144-.089.197-.086.4-.161.598-.246a9.4 9.4 0 0 0 1.311-.716 8.67 8.67 0 0 0 .744-.561l.069-.053c.065-.04.081-.052.151-.083.108-.048.218-.067.335-.077.086.001.086 0 .172.009z"/><path d="M16.148 11.052a5.048 5.048 0 0 1 2.009.484 4.948 4.948 0 0 1 2.402 2.523 4.94 4.94 0 0 1 .287 2.909 4.964 4.964 0 0 1-2.797 3.497 4.929 4.929 0 0 1-5.339-.843 4.893 4.893 0 0 1-1.537-2.775 4.942 4.942 0 0 1 .409-3.006 4.968 4.968 0 0 1 1.987-2.138 5.041 5.041 0 0 1 2.074-.638 6.08 6.08 0 0 1 .505-.013zm-.206 1.839a3.16 3.16 0 0 0-1.257.303 3.116 3.116 0 0 0-1.652 2.01 3.116 3.116 0 0 0 .175 2.042 3.091 3.091 0 0 0 1.544 1.542 3.095 3.095 0 0 0 2.401.059 3.102 3.102 0 0 0 1.616-1.467 3.085 3.085 0 0 0-2.827-4.489z"/></g></symbol><symbol id="svg-gear" data-name="gear" viewBox="0 0 32 33" width="32" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M23.018 1.842a2.342 2.342 0 0 1 1.654.884c.336.431.486.969.495 1.509.007.384-.054.762-.139 1.135l-.585 2.148.021.021.019.02 2.141-.584c.098-.024.098-.023.197-.046.2-.04.401-.073.605-.087.42-.03.849.01 1.246.157.27.1.522.25.736.443.397.36.668.867.741 1.399.036.26.024.525-.031.781-.095.444-.313.851-.583 1.212a6.074 6.074 0 0 1-.403.474l-1.572 1.559.008.03.01.036c.716.189 1.426.399 2.148.567.091.026.09.026.181.055.194.065.384.137.568.227.362.176.699.41.963.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.091.224-.22.432-.377.615-.286.333-.659.579-1.055.76-.22.101-.449.18-.68.251l-2.142.566-.01.036-.008.03 1.567 1.554a4.501 4.501 0 0 1 .517.628c.236.349.416.74.488 1.156.049.285.045.577-.016.859a2.349 2.349 0 0 1-.841 1.343 2.254 2.254 0 0 1-.638.345c-.413.145-.859.171-1.292.129a5.396 5.396 0 0 1-.715-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.099.024.099.047.198.04.2.072.401.087.605a3.02 3.02 0 0 1-.139 1.191 2.29 2.29 0 0 1-.42.741 2.34 2.34 0 0 1-1.442.79c-.26.036-.524.024-.78-.031-.654-.139-1.207-.54-1.688-.988l-1.556-1.569-.031.008-.037.01-.563 2.133c-.029.098-.028.097-.059.194-.054.161-.112.32-.182.474-.189.415-.451.802-.803 1.094a2.3 2.3 0 0 1-.69.395 2.348 2.348 0 0 1-1.586-.014 2.269 2.269 0 0 1-.674-.401c-.359-.308-.616-.717-.801-1.148a6.1 6.1 0 0 1-.21-.586l-.565-2.141-.036-.01-.03-.008-1.555 1.567c-.073.07-.073.07-.147.138a4.842 4.842 0 0 1-.395.32 3.082 3.082 0 0 1-1.186.536c-.28.054-.57.058-.852.006a2.347 2.347 0 0 1-1.366-.804 2.248 2.248 0 0 1-.385-.687c-.156-.446-.175-.927-.12-1.394a6.04 6.04 0 0 1 .112-.612l.585-2.149-.02-.02-.019-.02-2.141.582c-.099.024-.098.024-.197.046a4.994 4.994 0 0 1-.502.08 3.059 3.059 0 0 1-1.296-.128 2.294 2.294 0 0 1-.742-.42 2.357 2.357 0 0 1-.79-1.442 2.272 2.272 0 0 1 .019-.722c.127-.677.538-1.251.998-1.745l1.571-1.56-.009-.03-.009-.036-2.134-.563-.194-.058a4.872 4.872 0 0 1-.568-.227 2.972 2.972 0 0 1-1.001-.759 2.293 2.293 0 0 1-.394-.689 2.342 2.342 0 0 1 .037-1.645c.099-.242.242-.466.417-.66.446-.496 1.069-.774 1.696-.968l2.141-.565.009-.035.009-.031-1.566-1.554c-.07-.073-.07-.073-.139-.148-.414-.467-.76-1.015-.866-1.639a2.307 2.307 0 0 1 .004-.795 2.349 2.349 0 0 1 .807-1.366c.203-.167.435-.296.683-.383.414-.145.859-.172 1.293-.131.242.023.479.069.716.123l2.147.585.021-.021.02-.02-.584-2.141c-.025-.099-.025-.099-.047-.199a4.75 4.75 0 0 1-.087-.604c-.03-.42.01-.85.157-1.246.093-.25.229-.484.402-.687.349-.407.851-.69 1.379-.778.26-.044.527-.04.786.009.431.081.829.281 1.184.533.198.141.381.299.559.464l1.559 1.571.031-.008.035-.01.563-2.136.059-.193c.054-.161.112-.32.183-.474a3.06 3.06 0 0 1 .758-1.056c.232-.201.502-.358.794-.452a2.344 2.344 0 0 1 1.527.035c.246.092.474.23.674.401.358.308.615.716.8 1.147.082.191.148.387.21.585l.565 2.143.035.009.032.009 1.553-1.566c.073-.07.073-.07.148-.139.453-.401.979-.739 1.581-.855.158-.031.318-.043.479-.043.062.001.061.001.123.005zm-6.932 7.479a6.678 6.678 0 0 1 2.738.624 6.736 6.736 0 0 1 2.971 2.73 6.67 6.67 0 0 1 .82 4.258 6.66 6.66 0 0 1-1.948 3.847 6.69 6.69 0 0 1-2.066 1.375 6.707 6.707 0 0 1-5.05.062 6.695 6.695 0 0 1-4.153-5.201 6.68 6.68 0 0 1 6.688-7.695z" fill-opacity=".149"/><path d="M23.018 1.842a2.342 2.342 0 0 1 1.654.884c.336.431.486.969.495 1.509.007.384-.054.762-.139 1.135l-.585 2.148.021.021.019.02 2.141-.584c.098-.024.098-.023.197-.046.2-.04.401-.073.605-.087.42-.03.849.01 1.246.157.27.1.522.25.736.443.397.36.668.867.741 1.399.036.26.024.525-.031.781-.095.444-.313.851-.583 1.212a6.074 6.074 0 0 1-.403.474l-1.572 1.559.008.03.01.036c.716.189 1.426.399 2.148.567.091.026.09.026.181.055.194.065.384.137.568.227.362.176.699.41.963.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.091.224-.22.432-.377.615-.286.333-.659.579-1.055.76-.22.101-.449.18-.68.251l-2.142.566-.01.036-.008.03 1.567 1.554a4.501 4.501 0 0 1 .517.628c.236.349.416.74.488 1.156.049.285.045.577-.016.859a2.349 2.349 0 0 1-.841 1.343 2.254 2.254 0 0 1-.638.345c-.413.145-.859.171-1.292.129a5.396 5.396 0 0 1-.715-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.099.024.099.047.198.04.2.072.401.087.605a3.02 3.02 0 0 1-.139 1.191 2.29 2.29 0 0 1-.42.741 2.34 2.34 0 0 1-1.442.79c-.26.036-.524.024-.78-.031-.654-.139-1.207-.54-1.688-.988l-1.556-1.569-.031.008-.037.01-.563 2.133c-.029.098-.028.097-.059.194-.054.161-.112.32-.182.474-.189.415-.451.802-.803 1.094a2.3 2.3 0 0 1-.69.395 2.348 2.348 0 0 1-1.586-.014 2.269 2.269 0 0 1-.674-.401c-.359-.308-.616-.717-.801-1.148a6.1 6.1 0 0 1-.21-.586l-.565-2.141-.036-.01-.03-.008-1.555 1.567c-.073.07-.073.07-.147.138a4.842 4.842 0 0 1-.395.32 3.082 3.082 0 0 1-1.186.536c-.28.054-.57.058-.852.006a2.347 2.347 0 0 1-1.366-.804 2.248 2.248 0 0 1-.385-.687c-.156-.446-.175-.927-.12-1.394a6.04 6.04 0 0 1 .112-.612l.585-2.149-.02-.02-.019-.02-2.141.582c-.099.024-.098.024-.197.046a4.994 4.994 0 0 1-.502.08 3.059 3.059 0 0 1-1.296-.128 2.294 2.294 0 0 1-.742-.42 2.357 2.357 0 0 1-.79-1.442 2.272 2.272 0 0 1 .019-.722c.127-.677.538-1.251.998-1.745l1.571-1.56-.009-.03-.009-.036-2.134-.563-.194-.058a4.872 4.872 0 0 1-.568-.227 2.972 2.972 0 0 1-1.001-.759 2.293 2.293 0 0 1-.394-.689 2.342 2.342 0 0 1 .037-1.645c.099-.242.242-.466.417-.66.446-.496 1.069-.774 1.696-.968l2.141-.565.009-.035.009-.031-1.566-1.554c-.07-.073-.07-.073-.139-.148-.414-.467-.76-1.015-.866-1.639a2.307 2.307 0 0 1 .004-.795 2.349 2.349 0 0 1 .807-1.366c.203-.167.435-.296.683-.383.414-.145.859-.172 1.293-.131.242.023.479.069.716.123l2.147.585.021-.021.02-.02-.584-2.141c-.025-.099-.025-.099-.047-.199a4.75 4.75 0 0 1-.087-.604c-.03-.42.01-.85.157-1.246.093-.25.229-.484.402-.687.349-.407.851-.69 1.379-.778.26-.044.527-.04.786.009.431.081.829.281 1.184.533.198.141.381.299.559.464l1.559 1.571.031-.008.035-.01.563-2.136.059-.193c.054-.161.112-.32.183-.474a3.06 3.06 0 0 1 .758-1.056c.232-.201.502-.358.794-.452a2.344 2.344 0 0 1 1.527.035c.246.092.474.23.674.401.358.308.615.716.8 1.147.082.191.148.387.21.585l.565 2.143.035.009.032.009 1.553-1.566c.073-.07.073-.07.148-.139.453-.401.979-.739 1.581-.855.158-.031.318-.043.479-.043.062.001.061.001.123.005zM12.783 25.575l.1.026c.126.04.252.079.38.116.211.059.423.111.638.158l.1.027c.085.034.108.04.187.087.147.09.269.22.348.373.043.082.046.105.075.192l.698 2.647a3.58 3.58 0 0 0 .154.416 1.473 1.473 0 0 0 .096.186c.066.11.154.235.278.286a.454.454 0 0 0 .219.025.366.366 0 0 0 .145-.048.592.592 0 0 0 .145-.129c.061-.073.112-.155.156-.239.081-.156.139-.322.188-.49l.7-2.654c.029-.087.032-.11.075-.192a.943.943 0 0 1 .439-.421c.144-.067.304-.089.457-.125.127-.031.126-.031.253-.064.169-.047.336-.097.502-.151l.101-.026c.091-.014.113-.021.206-.019a.947.947 0 0 1 .49.148c.077.05.092.068.16.13l1.929 1.945a3.993 3.993 0 0 0 .341.284 1.804 1.804 0 0 0 .177.113c.111.062.25.127.382.108a.451.451 0 0 0 .306-.203.576.576 0 0 0 .061-.185c.017-.094.02-.19.016-.285a2.729 2.729 0 0 0-.081-.517l-.725-2.662c-.019-.09-.028-.112-.032-.204a.942.942 0 0 1 .171-.586c.091-.128.217-.226.331-.332.093-.089.184-.18.275-.271.091-.095.181-.191.27-.288l.074-.072c.072-.056.088-.074.168-.118a.95.95 0 0 1 .495-.114c.092.004.114.013.203.032l2.653.72a3.743 3.743 0 0 0 .438.076 1.993 1.993 0 0 0 .209.009c.127-.002.28-.015.385-.096a.469.469 0 0 0 .133-.181.345.345 0 0 0 .031-.148.592.592 0 0 0-.04-.19 1.264 1.264 0 0 0-.129-.254 2.69 2.69 0 0 0-.33-.408l-1.95-1.935c-.062-.068-.08-.083-.13-.16a.952.952 0 0 1-.145-.592c.009-.092.018-.114.041-.203a12.8 12.8 0 0 0 .117-.38c.058-.211.111-.423.158-.637l.028-.099c.034-.085.039-.109.087-.187a.946.946 0 0 1 .372-.349c.082-.042.105-.045.192-.074l2.648-.699a3.58 3.58 0 0 0 .416-.153l.099-.048.087-.049c.109-.065.235-.153.285-.276a.454.454 0 0 0-.023-.367.59.59 0 0 0-.128-.145 1.267 1.267 0 0 0-.24-.156 2.656 2.656 0 0 0-.489-.188l-2.654-.7c-.088-.028-.111-.032-.193-.074a.95.95 0 0 1-.421-.44c-.066-.143-.089-.303-.125-.455a13.154 13.154 0 0 0-.099-.378c-.038-.127-.076-.254-.117-.38l-.026-.1c-.013-.091-.02-.114-.018-.206a.944.944 0 0 1 .148-.489c.05-.077.068-.092.13-.16l1.945-1.929a3.138 3.138 0 0 0 .284-.341c.021-.03.042-.06.061-.091a1.51 1.51 0 0 0 .052-.086c.062-.111.127-.25.109-.382a.464.464 0 0 0-.083-.195.364.364 0 0 0-.12-.111.632.632 0 0 0-.184-.061 1.304 1.304 0 0 0-.286-.015 2.66 2.66 0 0 0-.518.081l-2.659.725c-.089.019-.112.028-.203.032a.947.947 0 0 1-.585-.17c-.075-.052-.089-.071-.154-.136a18.376 18.376 0 0 0-.27-.288 12.506 12.506 0 0 0-.47-.451l-.072-.074c-.057-.072-.074-.088-.119-.168a.949.949 0 0 1-.115-.497c.004-.092.013-.114.032-.204l.723-2.654a2.767 2.767 0 0 0 .082-.544l.001-.101c-.002-.127-.015-.28-.097-.385a.472.472 0 0 0-.331-.164.605.605 0 0 0-.188.038c-.09.033-.174.078-.255.13a2.69 2.69 0 0 0-.408.33l-1.933 1.948c-.068.062-.082.08-.16.13a.95.95 0 0 1-.59.145c-.092-.008-.114-.018-.202-.04a18.34 18.34 0 0 0-.38-.116c-.212-.058-.424-.11-.639-.157l-.1-.027c-.085-.034-.109-.039-.188-.087a.935.935 0 0 1-.349-.373c-.043-.082-.046-.105-.075-.193l-.698-2.648a3.77 3.77 0 0 0-.153-.415 2.427 2.427 0 0 0-.121-.225c-.065-.1-.148-.208-.263-.251a.459.459 0 0 0-.356.026.582.582 0 0 0-.143.128 1.297 1.297 0 0 0-.157.239 2.782 2.782 0 0 0-.189.491l-.699 2.655c-.029.088-.032.111-.075.193a.94.94 0 0 1-.441.422c-.143.066-.303.088-.456.123a16.05 16.05 0 0 0-.377.099c-.128.037-.255.076-.381.116l-.1.025c-.091.013-.113.02-.205.018a.937.937 0 0 1-.487-.148c-.077-.05-.092-.068-.16-.13L10 4.222a4.017 4.017 0 0 0-.341-.283 2.956 2.956 0 0 0-.177-.113c-.112-.062-.25-.127-.382-.108a.46.46 0 0 0-.308.204.565.565 0 0 0-.06.182c-.017.094-.019.19-.015.285.007.175.039.347.081.516l.726 2.661c.019.089.027.111.032.203a.945.945 0 0 1-.169.583c-.053.076-.072.09-.136.155-.097.089-.193.18-.288.271-.155.153-.305.309-.451.47l-.074.072c-.072.057-.088.075-.169.119a.947.947 0 0 1-.497.116c-.092-.004-.115-.013-.204-.032L4.914 8.8a4.258 4.258 0 0 0-.436-.075 3.79 3.79 0 0 0-.11-.008l-.099-.001c-.132.002-.288.016-.395.104a.45.45 0 0 0-.155.322.59.59 0 0 0 .039.19c.032.089.078.174.129.255.095.148.209.281.33.407l1.948 1.934c.062.068.08.083.13.16a.947.947 0 0 1 .145.591c-.008.091-.018.113-.041.202-.04.126-.078.253-.116.381-.058.211-.11.423-.157.638l-.027.099c-.034.086-.04.109-.087.188a.963.963 0 0 1-.373.349c-.082.042-.105.046-.193.074l-2.647.698a3.554 3.554 0 0 0-.415.153 1.518 1.518 0 0 0-.186.097c-.109.066-.236.154-.286.277a.458.458 0 0 0 .022.367c.033.056.08.103.129.145.073.061.155.112.24.156.155.081.321.138.489.187l2.655.701c.087.029.11.032.192.075a.94.94 0 0 1 .421.44c.067.143.089.303.124.455.032.126.065.252.099.377.038.128.076.255.116.381l.026.1c.013.091.02.114.018.205a.937.937 0 0 1-.148.488c-.05.077-.068.092-.129.16l-1.944 1.93a4.522 4.522 0 0 0-.172.195 2.552 2.552 0 0 0-.224.323c-.062.112-.127.25-.109.382.01.071.044.138.083.196a.368.368 0 0 0 .121.111.582.582 0 0 0 .182.06c.094.017.19.019.285.015.176-.008.349-.041.519-.083l2.662-.722c.089-.019.111-.028.203-.032a.949.949 0 0 1 .583.169c.075.053.089.072.154.136.089.097.179.192.271.287.153.156.31.306.47.454l.072.073c.057.072.074.088.118.169a.943.943 0 0 1 .115.496c-.004.092-.013.114-.032.203L8.8 27.087a2.74 2.74 0 0 0-.082.547c-.002.034-.002.065-.002.099.003.128.016.281.098.386a.466.466 0 0 0 .18.133.35.35 0 0 0 .149.031.58.58 0 0 0 .189-.039c.09-.033.175-.078.255-.13.148-.094.281-.208.407-.329l1.935-1.95c.068-.062.083-.08.16-.13a.954.954 0 0 1 .385-.141c.092-.011.115-.007.207-.004l.102.015zm3.303-16.254a6.678 6.678 0 0 1 2.738.624 6.736 6.736 0 0 1 2.971 2.73 6.67 6.67 0 0 1 .82 4.258 6.66 6.66 0 0 1-1.948 3.847 6.69 6.69 0 0 1-2.066 1.375 6.707 6.707 0 0 1-5.05.062 6.695 6.695 0 0 1-4.153-5.201 6.68 6.68 0 0 1 6.688-7.695zm-.148 1.883a4.83 4.83 0 0 0-1.964.447 4.814 4.814 0 0 0-2.371 2.428 4.796 4.796 0 0 0-.263 3.064c.092.379.231.747.414 1.092a4.841 4.841 0 0 0 2.38 2.186c.57.242 1.186.369 1.804.376a4.783 4.783 0 0 0 3.33-1.284 4.839 4.839 0 0 0 1.032-1.381c.21-.422.356-.875.433-1.34a4.833 4.833 0 0 0 0-1.583 4.775 4.775 0 0 0-.408-1.288 4.834 4.834 0 0 0-2.245-2.245 4.84 4.84 0 0 0-2.142-.472z" fill-rule="nonzero"/></symbol><symbol id="svg-heart-circle" data-name="heart-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M11.228 6.829c.451.028.894.101 1.326.235 1.488.461 2.712 1.564 3.469 2.912.082-.146.173-.287.264-.427.489-.718 1.086-1.354 1.816-1.83a5.524 5.524 0 0 1 1.785-.761 5.478 5.478 0 0 1 1.727-.112 5.757 5.757 0 0 1 2.599.914 6.212 6.212 0 0 1 2.174 2.473 6.98 6.98 0 0 1 .661 2.336c.039.375.055.754.033 1.13-.044.793-.254 1.57-.549 2.305-.442 1.098-1.072 2.116-1.77 3.068-1.224 1.671-2.674 3.174-4.193 4.577a47.056 47.056 0 0 1-3.944 3.283l-.071.048a1.042 1.042 0 0 1-.83.106 1.152 1.152 0 0 1-.235-.106c-.177-.12-.346-.253-.517-.383a51.994 51.994 0 0 1-3.497-2.948c-1.176-1.087-2.303-2.233-3.325-3.467-.702-.848-1.356-1.739-1.906-2.693-.409-.71-.762-1.458-.998-2.243a6.77 6.77 0 0 1-.282-1.546 6.979 6.979 0 0 1 .018-.97c.081-.96.346-1.906.809-2.753A6.214 6.214 0 0 1 7.61 7.913a5.93 5.93 0 0 1 1.285-.7 5.86 5.86 0 0 1 1.802-.385c.178-.006.354-.006.531.001zm9.778 2.025c-.31.012-.615.058-.912.15-.224.07-.441.162-.646.275-1.169.641-1.877 1.871-2.267 3.107a9.602 9.602 0 0 0-.173.624l-.026.086c-.067.17-.159.32-.299.44a1.027 1.027 0 0 1-1.386-.061 1.11 1.11 0 0 1-.234-.379c-.055-.186-.099-.375-.153-.562-.377-1.234-1.023-2.467-2.154-3.163a3.405 3.405 0 0 0-1.631-.513 3.512 3.512 0 0 0-1.001.093 3.78 3.78 0 0 0-.804.294c-.833.418-1.49 1.131-1.88 1.973a4.96 4.96 0 0 0-.422 1.563c-.042.406-.044.815.02 1.219.104.646.344 1.267.633 1.852.445.902 1.019 1.738 1.637 2.529.806 1.032 1.701 1.993 2.636 2.909a48.365 48.365 0 0 0 4.043 3.524l.036.027a47.011 47.011 0 0 0 2.945-2.479 39.099 39.099 0 0 0 2.276-2.24c.978-1.05 1.903-2.167 2.649-3.395.472-.777.888-1.617 1.076-2.512.099-.474.11-.953.06-1.433a4.955 4.955 0 0 0-.38-1.471 4.181 4.181 0 0 0-1.692-1.94 3.687 3.687 0 0 0-1.782-.517h-.169z" fill-rule="nonzero"/></symbol><symbol id="svg-lock-circle" data-name="lock-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M9.558 11.134c.001-.338.007-.676.011-1.014a6.646 6.646 0 0 1 .445-2.194 6.482 6.482 0 0 1 3.775-3.683 6.645 6.645 0 0 1 2.045-.388c.166-.002.165-.002.332 0a6.645 6.645 0 0 1 2.045.388 6.485 6.485 0 0 1 3.775 3.683c.277.702.416 1.441.445 2.194.004.338.01.676.012 1.014.634.02 1.269.044 1.903.07a.926.926 0 0 1 .766.546 1 1 0 0 1 .074.294c.179 4.31.004 8.627.004 12.941a1.075 1.075 0 0 1-.05.298.926.926 0 0 1-.794.618c-5.534.229-11.078.003-16.617.003a.923.923 0 0 1-.915-.843c-.179-4.31-.004-8.628-.004-12.941.005-.103.017-.201.05-.299a.926.926 0 0 1 .5-.543c.095-.041.192-.062.294-.074.634-.026 1.269-.05 1.904-.07zm13.794 1.905H8.648v11.027h14.704V13.039zm-8.303 5.248a1.86 1.86 0 0 1-.885-1.667 1.84 1.84 0 0 1 .419-1.077c.15-.181.335-.333.542-.445.243-.132.506-.199.781-.219.095-.003.094-.003.188 0 .275.02.538.087.781.219.207.112.393.264.543.445.132.161.237.344.309.539.063.173.099.355.109.538a1.86 1.86 0 0 1-.902 1.677c.023 1.029.043 2.059-.018 3.085a.948.948 0 0 1-.136.413.926.926 0 0 1-1.341.242.92.92 0 0 1-.355-.655 32.27 32.27 0 0 1-.035-3.095zm5.542-7.204c.002-.305.006-.611.002-.917a4.716 4.716 0 0 0-.359-1.669 4.635 4.635 0 0 0-2.868-2.6 4.602 4.602 0 0 0-1.603-.2 4.583 4.583 0 0 0-3.905 2.596 4.712 4.712 0 0 0-.451 1.873c-.004.306 0 .612.003.917 3.059-.069 6.121-.069 9.181 0z"/></symbol><symbol id="svg-logo" data-name="logo" viewBox="0 0 54 32" width="54" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M32.207 25.946L21.721 32l-11.235-6.486L0 19.459V6.486L11.235 0l10.486 6.054L32.206 0l11.235 6.486 10.486 6.055v12.973L42.693 32l-10.486-6.054zm.661-1.343V14.27l9.053 5.19.002 10.378-9.055-5.235zm-20.885.046V14.27l9.085 5.218.002 10.441-9.086-5.28h-.001zM1.498 18.595V8.216l8.988 5.189v10.379l-8.988-5.189zM21.721 7.784l8.988 5.189-8.988 5.19-8.989-5.19 8.989-5.189zm20.972 0l8.988 5.189-8.988 5.19-8.989-5.19 8.989-5.189zM11.235 1.729l8.988 5.19-8.988 5.189-8.989-5.189 8.989-5.189v-.001zm20.971 0l8.989 5.19-8.989 5.189-8.988-5.189 8.988-5.189v-.001z"/><path d="M1.437 18.643L1.442 8.11l19.652 11.35.009 10.545L1.437 18.643zm31.369 5.999l.03-10.463 9.148 5.244-.009 10.582-9.169-5.363z" fill-opacity=".345"/></symbol><symbol id="svg-message-circle" data-name="message-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M17.342 23.582l-3.531 3.531-.065.058a.98.98 0 0 1-.392.186.9.9 0 0 1-.961-.455.978.978 0 0 1-.106-.42v-2.9l-.261-.003c-.204-.008-.204-.008-.408-.021a7.968 7.968 0 0 1-2.851-.769 8.118 8.118 0 0 1-3.273-2.902 8.01 8.01 0 0 1-1.012-2.313 7.987 7.987 0 0 1 .304-4.925 8.07 8.07 0 0 1 3.982-4.281 7.95 7.95 0 0 1 3.258-.79c2.665-.034 5.331-.034 7.996 0a7.926 7.926 0 0 1 3.258.791 8.054 8.054 0 0 1 3.981 4.28 7.956 7.956 0 0 1-.708 7.238 8.107 8.107 0 0 1-3.627 3.063 7.962 7.962 0 0 1-3.104.632h-2.48zm.123-5.826c.128.01.25.04.364.099a.904.904 0 0 1 .26.204.902.902 0 0 1 .059 1.101.908.908 0 0 1-.198.203.925.925 0 0 1-.485.175c-2.205.059-4.412.059-6.617 0a.925.925 0 0 1-.485-.175.9.9 0 0 1-.29-1.063.889.889 0 0 1 .775-.544c2.205-.059 4.412-.059 6.617 0zm3.747-2.847a.924.924 0 0 1 .493.19.9.9 0 0 1 .166 1.229.9.9 0 0 1-.264.239.95.95 0 0 1-.395.122 154.73 154.73 0 0 1-10.376 0 .927.927 0 0 1-.494-.19.9.9 0 0 1-.165-1.229.9.9 0 0 1 .264-.239.945.945 0 0 1 .395-.122 154.73 154.73 0 0 1 10.376 0zm0-2.848a.95.95 0 0 1 .395.122.9.9 0 0 1 .264.239.9.9 0 0 1-.166 1.229.933.933 0 0 1-.493.191c-3.457.115-6.919.115-10.376 0a.936.936 0 0 1-.494-.191.9.9 0 0 1-.165-1.229.9.9 0 0 1 .264-.239.945.945 0 0 1 .395-.122 154.73 154.73 0 0 1 10.376 0z"/></symbol><symbol id="svg-no-circle" data-name="no-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M16.288 3.931c.48.017.958.051 1.434.12 1.199.173 2.37.529 3.463 1.052a12.074 12.074 0 0 1 5.153 4.727 11.932 11.932 0 0 1 1.319 3.242 12.062 12.062 0 0 1-.429 7.099 12.093 12.093 0 0 1-6.713 6.878 12.046 12.046 0 0 1-9.03 0 12.09 12.09 0 0 1-5.589-4.643 11.953 11.953 0 0 1-1.893-6.19 12.031 12.031 0 0 1 .412-3.425c.318-1.181.82-2.312 1.481-3.342a12.089 12.089 0 0 1 4.919-4.346 11.968 11.968 0 0 1 4.897-1.172c.289-.004.288-.004.576 0zm7.383 5.868L9.873 23.598a9.778 9.778 0 0 0 2.432 1.429 9.853 9.853 0 0 0 7.39 0 9.893 9.893 0 0 0 5.491-5.626 9.865 9.865 0 0 0 .292-6.041 9.757 9.757 0 0 0-1.807-3.561zm-1.543-1.542a9.737 9.737 0 0 0-4.718-2.046c-.39-.057-.781-.084-1.175-.099-.235-.003-.234-.003-.471 0a9.799 9.799 0 0 0-4.007.959 9.899 9.899 0 0 0-4.025 3.558 9.728 9.728 0 0 0-1.21 2.731 9.895 9.895 0 0 0-.338 2.803 9.753 9.753 0 0 0 2.145 5.893L22.128 8.257z"/></symbol><symbol id="svg-pencil-circle" data-name="pencil-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.925 18.165c3.857-4.193 8.057-8.058 12.086-12.087a.987.987 0 0 1 .416-.241c.07-.018.088-.018.16-.028.081-.003.081-.003.162 0 .071.01.089.01.159.028.134.036.248.102.357.186 1.634 1.497 3.137 3.132 4.704 4.699a.937.937 0 0 1 .216.975 1.01 1.01 0 0 1-.161.279c-3.864 4.217-8.086 8.092-12.131 12.136a.933.933 0 0 1-.327.212c-2.164.718-4.384 1.256-6.577 1.882a1.003 1.003 0 0 1-.408.024.94.94 0 0 1-.747-.684 1.02 1.02 0 0 1-.013-.408c.529-2.219 1.251-4.389 1.877-6.582l.02-.055a.939.939 0 0 1 .148-.268l.016-.021.017-.02.026-.027zm.161 5.796l3.334-.953a75.719 75.719 0 0 1-2.39-2.351l-.944 3.304zm5.184-1.853l7.013-7.013-3.331-3.331-7.031 7.031c1.139 1.082 2.28 2.164 3.349 3.313zm4.996-11.658l3.331 3.331 2.402-2.402-3.331-3.331-2.402 2.402z"/></symbol><symbol id="svg-plus-circle" data-name="plus-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.24 17.376h-5.792v5.792a1.448 1.448 0 0 1-2.896 0v-5.792H8.76a1.449 1.449 0 0 1 0-2.896h5.792V8.688a1.449 1.449 0 0 1 2.896 0v5.792h5.792a1.449 1.449 0 0 1 0 2.896" fill-rule="nonzero"/></symbol><symbol id="svg-progress-circle" data-name="progress-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M16 21.288c-.579 0-1.048.469-1.048 1.048v3.521a1.048 1.048 0 1 0 2.096 0v-3.521c0-.579-.47-1.048-1.048-1.048" fill-opacity=".502"/><path d="M25.955 14.899l-3.458-.007c-.597.013-1.05.467-1.05 1.046a1.047 1.047 0 0 0 1.046 1.05l3.458.007h.002a1.05 1.05 0 0 0 .002-2.096" fill-opacity=".251"/><path d="M16.025 2.832h-.003c-.577 0-1.045.468-1.047 1.046l-.011 5.46a1.048 1.048 0 0 0 1.045 1.05h.003c.578 0 1.046-.467 1.047-1.045l.011-5.461a1.046 1.046 0 0 0-1.045-1.05"/><path d="M13.751 20.811a1.047 1.047 0 0 0-1.372.564l-1.374 3.298a1.053 1.053 0 0 0 .966 1.452c.411 0 .8-.243.968-.647l1.374-3.297a1.045 1.045 0 0 0-.562-1.37" fill-opacity=".6"/><path d="M19.604 21.393a1.047 1.047 0 1 0-1.938.796l1.355 3.299a1.05 1.05 0 0 0 1.939-.795l-1.356-3.3z" fill-opacity=".4"/><path d="M9.5 16.964h.002a1.049 1.049 0 0 0 .002-2.096l-3.455-.007h-.002a1.047 1.047 0 0 0-.002 2.096l3.455.007z" fill-opacity=".902"/><path d="M21.075 13.829a1.046 1.046 0 0 0 1.368.57l3.158-1.295c.534-.22.79-.833.569-1.366a1.044 1.044 0 0 0-1.367-.57l-3.158 1.294c-.536.22-.79.833-.57 1.367" fill-opacity=".2"/><path d="M10.992 17.99a1.043 1.043 0 0 0-1.367-.57l-3.228 1.332a1.047 1.047 0 0 0 .399 2.016c.132 0 1.558-.558 1.689-.613l1.938-.798c.535-.22.79-.833.569-1.367" fill-opacity=".8"/><path d="M21.281 19.75a1.047 1.047 0 1 0-1.483 1.48l2.482 2.49a1.045 1.045 0 0 0 1.482.002 1.047 1.047 0 0 0 .004-1.482l-2.485-2.49z" fill-opacity=".349"/><path d="M19.902 12.04a1.048 1.048 0 0 0 1.483.003l2.405-2.397a1.048 1.048 0 0 0-1.479-1.485l-2.404 2.397a1.047 1.047 0 0 0-.005 1.482" fill-opacity=".149"/><path d="M18.13 10.813a1.05 1.05 0 0 0 1.371-.565l1.291-3.107a1.047 1.047 0 1 0-1.935-.804l-1.291 3.106c-.222.534.03 1.147.564 1.37" fill-opacity=".102"/><path d="M13.176 6.326a1.049 1.049 0 0 0-1.937.8l1.286 3.115a1.045 1.045 0 0 0 1.367.569c.536-.22.79-.833.57-1.367l-1.286-3.117zM10.626 12.015a1.05 1.05 0 0 0 1.482.003 1.048 1.048 0 0 0 .002-1.482L9.717 8.137a1.047 1.047 0 1 0-1.485 1.479l2.394 2.399z"/><path d="M12.186 19.729a1.047 1.047 0 0 0-1.482-.003L8.208 22.21a1.047 1.047 0 0 0 1.479 1.485l2.495-2.485c.41-.408.411-1.071.004-1.481" fill-opacity=".702"/><path d="M25.59 18.787l-3.214-1.338a1.047 1.047 0 1 0-.805 1.935l3.213 1.338a1.05 1.05 0 0 0 .806-1.935" fill-opacity=".302"/><path d="M6.407 13.069l3.159 1.315a1.047 1.047 0 0 0 1.369-.566 1.048 1.048 0 0 0-.564-1.37l-3.157-1.314a1.049 1.049 0 0 0-.807 1.935"/></g></symbol><symbol id="svg-progress" data-name="progress" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill="none"/><g fill-rule="nonzero"><path d="M16 22.915c-.758 0-1.37.613-1.37 1.37v4.605a1.37 1.37 0 1 0 2.74 0v-4.605a1.37 1.37 0 0 0-1.37-1.37" fill-opacity=".502"/><path d="M29.018 14.561l-4.522-.009c-.781.016-1.373.609-1.373 1.367a1.37 1.37 0 0 0 1.368 1.373l4.521.009h.003a1.371 1.371 0 0 0 .003-2.74" fill-opacity=".251"/><path d="M16.033.242h-.002a1.37 1.37 0 0 0-1.37 1.367l-.016 5.68a1.371 1.371 0 0 0 1.367 1.373h.003a1.37 1.37 0 0 0 1.37-1.368l.016-5.679A1.368 1.368 0 0 0 16.033.242"/><path d="M13.059 22.291a1.37 1.37 0 0 0-1.794.737l-1.797 4.313c-.291.698.039 1.5.736 1.79a1.36 1.36 0 0 0 1.794-.737l1.796-4.311a1.368 1.368 0 0 0-.735-1.792" fill-opacity=".6"/><path d="M20.713 23.052a1.37 1.37 0 1 0-2.535 1.041l1.773 4.314a1.37 1.37 0 1 0 2.536-1.039l-1.774-4.316z" fill-opacity=".4"/><path d="M7.501 17.26h.002a1.37 1.37 0 0 0 .003-2.74l-4.518-.009h-.003c-.756 0-1.37.611-1.37 1.367a1.368 1.368 0 0 0 1.367 1.373l4.519.009z" fill-opacity=".902"/><path d="M22.636 13.162a1.37 1.37 0 0 0 1.789.745l4.13-1.694a1.368 1.368 0 0 0 .744-1.786 1.365 1.365 0 0 0-1.788-.745l-4.13 1.692a1.369 1.369 0 0 0-.745 1.788" fill-opacity=".2"/><path d="M9.451 18.602a1.363 1.363 0 0 0-1.788-.745l-4.22 1.741a1.369 1.369 0 0 0-.745 1.787c.217.53.728.851 1.267.851.172 0 2.036-.731 2.208-.802l2.534-1.044a1.368 1.368 0 0 0 .744-1.788" fill-opacity=".8"/><path d="M22.906 20.904a1.37 1.37 0 0 0-1.94 1.935l3.246 3.256a1.37 1.37 0 1 0 1.943-1.935l-3.249-3.256z" fill-opacity=".349"/><path d="M21.103 10.822a1.371 1.371 0 0 0 1.939.004l3.145-3.135a1.37 1.37 0 1 0-1.935-1.942l-3.143 3.135a1.369 1.369 0 0 0-.006 1.938" fill-opacity=".149"/><path d="M18.786 9.217a1.373 1.373 0 0 0 1.792-.738l1.689-4.063a1.37 1.37 0 0 0-2.531-1.052l-1.689 4.061c-.29.699.04 1.5.739 1.792" fill-opacity=".102"/><path d="M12.307 3.35a1.37 1.37 0 0 0-2.533 1.046l1.682 4.074a1.368 1.368 0 0 0 1.788.743 1.368 1.368 0 0 0 .745-1.787L12.307 3.35zM8.973 10.789a1.37 1.37 0 0 0 1.937.004 1.369 1.369 0 0 0 .003-1.938L7.784 5.718a1.369 1.369 0 0 0-1.937-.004 1.369 1.369 0 0 0-.004 1.938l3.13 3.137z"/><path d="M11.012 20.876a1.369 1.369 0 0 0-1.937-.004L5.81 24.121a1.37 1.37 0 0 0 .969 2.34c.348 0 .699-.131.966-.399l3.263-3.249a1.37 1.37 0 0 0 .004-1.937" fill-opacity=".702"/><path d="M28.54 19.645l-4.203-1.751c-.697-.29-1.5.041-1.789.739a1.37 1.37 0 0 0 .737 1.792l4.202 1.75a1.37 1.37 0 0 0 1.79-.737 1.37 1.37 0 0 0-.737-1.793" fill-opacity=".302"/><path d="M3.456 12.167l4.131 1.719a1.366 1.366 0 0 0 1.789-.74 1.367 1.367 0 0 0-.737-1.79L4.511 9.637a1.37 1.37 0 1 0-1.055 2.53"/></g></symbol><symbol id="svg-question-circle" data-name="question-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M17.461 17.292v3.053a1.46 1.46 0 1 1-2.922 0v-4.33c0-.804.654-1.461 1.461-1.461a2.869 2.869 0 1 0-2.87-2.867 1.461 1.461 0 0 1-2.922 0A5.798 5.798 0 0 1 16 5.895a5.798 5.798 0 0 1 5.792 5.792 5.799 5.799 0 0 1-4.331 5.605M16 25.398a1.441 1.441 0 1 1 0-2.882 1.44 1.44 0 1 1 0 2.882" fill-rule="nonzero"/></symbol><symbol id="svg-refresh-circle" data-name="refresh-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.628 10.107l-1.048 4.12c-.012.046-.044.086-.064.135a1.238 1.238 0 0 1-1.129.794c-.034 0-.066-.01-.101-.012-.032-.003-.061-.008-.091-.013-.037-.007-.076-.005-.113-.014l-4.117-1.051a1.23 1.23 0 0 1-.893-1.496 1.228 1.228 0 0 1 1.502-.89l1.462.37a6.307 6.307 0 0 0-1.842-1.531 6.248 6.248 0 0 0-4.775-.525 6.238 6.238 0 0 0-3.75 3.01 6.216 6.216 0 0 0-.525 4.777c.967 3.326 4.46 5.246 7.785 4.275a1.233 1.233 0 1 1 .688 2.369 8.81 8.81 0 0 1-2.44.348c-3.789 0-7.29-2.485-8.402-6.301a8.694 8.694 0 0 1 .732-6.656 8.713 8.713 0 0 1 5.224-4.189 8.691 8.691 0 0 1 6.649.73 8.76 8.76 0 0 1 2.598 2.172l.261-1.028a1.226 1.226 0 0 1 1.499-.89 1.23 1.23 0 0 1 .89 1.496" fill-rule="nonzero"/></symbol><symbol id="svg-restore" data-name="restore" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill="none"/><path d="M24.341 7.216a12.123 12.123 0 0 0-8.752-3.273c-3.395.119-6.638 1.703-8.899 4.348a12.3 12.3 0 0 0-2.777 5.887l-1.456-2.193A1.162 1.162 0 1 0 .52 13.271l3.478 5.239c.415.658 1.42.695 1.901.057l4.018-4.575a1.164 1.164 0 0 0-.106-1.642 1.166 1.166 0 0 0-1.641.107l-1.982 2.256a9.977 9.977 0 0 1 2.271-4.911c1.837-2.151 4.466-3.438 7.211-3.535a9.801 9.801 0 0 1 7.085 2.65 9.82 9.82 0 0 1 3.136 6.883 9.813 9.813 0 0 1-2.648 7.085 9.823 9.823 0 0 1-6.884 3.136 1.162 1.162 0 0 0 .041 2.324h.04a12.127 12.127 0 0 0 8.503-3.874 12.123 12.123 0 0 0 3.272-8.752 12.133 12.133 0 0 0-3.874-8.503" fill-rule="nonzero"/></symbol><symbol id="svg-search-circle" data-name="search-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.716 13.771a6.112 6.112 0 0 1 6.105-6.103c3.362 0 6.098 2.74 6.098 6.103 0 3.364-2.736 6.104-6.098 6.104a6.112 6.112 0 0 1-6.105-6.104m18.19 10.784l-5.88-5.882c1.073-1.353 1.739-3.042 1.739-4.902 0-4.382-3.563-7.949-7.944-7.949-4.384 0-7.951 3.567-7.951 7.949 0 4.383 3.567 7.95 7.951 7.95 1.856 0 3.547-.67 4.9-1.743l5.882 5.882c.179.181.415.27.652.27a.911.911 0 0 0 .651-.27.92.92 0 0 0 0-1.305" fill-rule="nonzero"/></symbol><symbol id="svg-star-circle" data-name="star-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.08 5.155a.987.987 0 0 1 .711.367c.052.067.089.137.125.213l2.607 6.106h6.059l.083.004c.169.022.325.071.466.169a.966.966 0 0 1 .316 1.189c-.061.13-.149.233-.254.328l-5.213 4.341 2.629 7.014.026.08c.039.167.048.331.004.499a.966.966 0 0 1-1.013.709 1.026 1.026 0 0 1-.467-.174l-6.135-4.379L9.889 26l-.071.046c-.151.08-.307.131-.48.132a.966.966 0 0 1-.947-.796 1.021 1.021 0 0 1 .048-.496l2.629-7.014-5.213-4.341-.062-.056a1.039 1.039 0 0 1-.224-.349.966.966 0 0 1 .419-1.157c.149-.086.308-.121.478-.128h6.062l2.632-6.109.036-.074c.042-.072.086-.139.144-.201a.993.993 0 0 1 .576-.295c.082-.007.082-.007.164-.007zm-2.045 8.02a.967.967 0 0 1-.878.578H9.108l3.705 3.084.062.057c.058.063.111.125.154.2a.969.969 0 0 1 .124.567 1.205 1.205 0 0 1-.057.246l-1.768 4.717 4.141-2.955.071-.046a.968.968 0 0 1 .816-.073c.081.03.151.072.223.119l4.141 2.955-1.768-4.717-.026-.08a.955.955 0 0 1 .31-.99l3.704-3.084h-4.049l-.079-.004a1.174 1.174 0 0 1-.234-.049.987.987 0 0 1-.566-.528l-1.979-4.637-1.998 4.64z" fill-rule="nonzero"/></symbol><symbol id="svg-status-failed" data-name="status-failed" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.217 26.669a1.36 1.36 0 1 1-.004-2.72 1.36 1.36 0 0 1 .004 2.72m-1.248-13.607a1.248 1.248 0 0 1 2.495 0v8.163a1.247 1.247 0 1 1-2.495 0v-8.163zm17.424 17.319L17.649.891c-.025-.048-.058-.08-.085-.125a1.566 1.566 0 0 0-.816-.661s.003-.003.005-.003A1.57 1.57 0 0 0 16.217 0c-.567 0-1.063.294-1.348.761-.024.042-.057.075-.079.117L.133 30.194a1.24 1.24 0 0 0 .052 1.212c.23.369.629.594 1.063.594H31.21c.689 0 1.247-.559 1.247-1.247 0-.13-.027-.252-.064-.372" fill-rule="nonzero"/></symbol><symbol id="svg-status-partial" data-name="status-partial" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm.013 2.472v27.055l.102.01a13.494 13.494 0 0 0 9.337-3.855 13.634 13.634 0 0 0 2.821-3.97 13.428 13.428 0 0 0 1.134-3.819c.207-1.478.17-2.989-.111-4.454a13.411 13.411 0 0 0-1.239-3.593 13.696 13.696 0 0 0-6.049-5.977 13.475 13.475 0 0 0-5.484-1.398c-.171-.005-.341-.016-.511.001z"/><path d="M16.013 2.472v27.055l.102.01a13.494 13.494 0 0 0 9.337-3.855 13.634 13.634 0 0 0 2.821-3.97 13.428 13.428 0 0 0 1.134-3.819c.207-1.478.17-2.989-.111-4.454a13.411 13.411 0 0 0-1.239-3.593 13.696 13.696 0 0 0-6.049-5.977 13.475 13.475 0 0 0-5.484-1.398c-.171-.005-.341-.016-.511.001z" fill-opacity=".149"/></symbol><symbol id="svg-status-pending" data-name="status-pending" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M20 18.666h-6.666V8A1.332 1.332 0 1 1 16 8v8h4a1.332 1.332 0 1 1 0 2.666M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol><symbol id="svg-sync-circle" data-name="sync-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.754 19.267a9.828 9.828 0 0 1-9.254 6.538c-2.776 0-5.451-1.168-7.36-3.014v.832c0 .68-.547 1.227-1.227 1.227a1.226 1.226 0 0 1-1.227-1.227v-4.771c0-.677.55-1.227 1.227-1.227h4.771a1.227 1.227 0 1 1 0 2.454h-2.668c1.409 1.959 3.88 3.272 6.484 3.272a7.376 7.376 0 0 0 6.943-4.904 1.224 1.224 0 0 1 1.565-.748c.638.226.972.93.746 1.568M6.293 12.781a9.831 9.831 0 0 1 9.255-6.538c2.775 0 5.453 1.17 7.36 3.018v-.836a1.227 1.227 0 0 1 2.454 0v4.77c0 .68-.55 1.227-1.227 1.227h-4.771a1.226 1.226 0 1 1 0-2.454h2.667c-1.408-1.956-3.882-3.271-6.483-3.271A7.371 7.371 0 0 0 8.607 13.6a1.23 1.23 0 0 1-1.565.749 1.229 1.229 0 0 1-.749-1.568" fill-rule="nonzero"/></symbol><symbol id="svg-thumbs-up-circle" data-name="thumbs-up-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.07 18.601a1.413 1.413 0 0 1 0 2.828h-.943a1.414 1.414 0 1 1 0 2.828H16c-3.77 0-2.828-1.886-10.369-1.886v-8.483h2.828c3.299 0 7.07-3.037 7.07-7.541 0-1.49 2.828-1.679 2.828 1.149 0 1.885-.943 5.449-.943 5.449h7.541a1.415 1.415 0 0 1 0 2.828h-.943a1.414 1.414 0 1 1 0 2.828h-.942" fill-rule="nonzero"/></symbol><symbol id="svg-warning-circle" data-name="warning-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.898 17.985a.892.892 0 0 1-1.783 0v-4.864a.891.891 0 0 1 1.783 0v4.864zm-.892 3.242a.811.811 0 1 1 .004-1.622.811.811 0 0 1-.004 1.622m9.614 1.837L16.803 5.429c-.303-.604-1.291-.604-1.594 0L6.294 23.26a.883.883 0 0 0 .039.866.89.89 0 0 0 .758.425h17.831c.012-.002.023 0 .035 0a.893.893 0 0 0 .663-1.487" fill-rule="nonzero"/></symbol><symbol id="svg-x-circle" data-name="x-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.484 21.679a1.226 1.226 0 0 1-1.733 1.733L16 17.661l-5.749 5.751a1.224 1.224 0 0 1-1.735 0 1.226 1.226 0 0 1 0-1.733l5.752-5.751-5.752-5.749a1.225 1.225 0 1 1 1.735-1.732L16 14.196l5.751-5.749a1.225 1.225 0 0 1 1.733 1.732l-5.752 5.749 5.752 5.751z" fill-rule="nonzero"/></symbol><symbol id="svg-buttons" data-name="buttons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M326.9 41c1.6 0 3 1.4 3 3v29.8c0 1.6-1.4 3-3 3H140.8c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h186.1m0-5H140.8c-4.4 0-8 3.6-8 8v29.8c0 4.4 3.6 8 8 8h186.1c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8z"/><rect fill="#8c9ba5" x="198.7" y="54.1"/><path fill="#dd2f41" d="M327.4 94.1H140.6c-4.2 0-7.7 3.5-7.7 7.7v30.4c0 4.2 3.5 7.7 7.7 7.7h186.7c4.2 0 7.7-3.5 7.7-7.7v-30.4c.1-4.2-3.4-7.7-7.6-7.7zm-58.6 27.7h-70.2v-9.6h70.2v9.6z"/><path fill="#297adf" d="M327.1 152.2H140.9c-4.4 0-7.9 3.6-7.9 7.9V190c0 4.4 3.6 7.9 7.9 7.9h186.2c4.4 0 7.9-3.6 7.9-7.9v-29.9c.1-4.3-3.5-7.9-7.9-7.9zm-58.3 27.6h-70.2v-9.6h70.2v9.6z"/></symbol><symbol id="svg-cards" data-name="cards" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M405.9 36H258.5c-4.5 0-8.1 3.6-8.1 8.1v145.8c0 4.5 3.6 8.1 8.1 8.1h147.4c4.5 0 8.1-3.6 8.1-8.1V44.1c0-4.5-3.6-8.1-8.1-8.1zm-150.4 8.1c0-1.6 1.4-3 3-3h147.4c1.6 0 3 1.4 3 3V156H255.5V44.1zM209.6 40.7c1.6 0 3 1.4 3 3v146.1c0 1.6-1.4 3-3 3H61.9c-1.6 0-3-1.4-3-3v-146c0-1.6 1.4-3 3-3h147.7m0-5.1H61.9c-4.5 0-8.1 3.7-8.1 8.1v146.1c0 4.5 3.7 8.1 8.1 8.1h147.7c4.5 0 8.1-3.7 8.1-8.1V43.8c.1-4.5-3.6-8.1-8.1-8.1z"/><path fill="#fff" d="M401.5 187.1h-53.6c-1.9 0-3.5-1.6-3.5-3.5v-12.7c0-1.9 1.6-3.5 3.5-3.5h53.6c1.9 0 3.5 1.6 3.5 3.5v12.7c0 1.9-1.6 3.5-3.5 3.5z"/></symbol><symbol id="svg-color-wheel" data-name="color-wheel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#2ac84f" d="M306.8 81.8c-7.9-16.1-20.9-29.1-37-37-.8.8-1.4 1.8-1.9 2.8l-11.3 26.2-11.2 26.2c-2.1 4.8 1.4 8.2 6.2 6.2l26.2-11.3L304 83.6c1-.4 2-1.1 2.8-1.8z"/><path fill="#59a702" d="M310.6 91.1c-1.1 0-2.2.3-3.3.7l-26.5 10.6-26.5 10.6c-4.9 1.9-4.9 6.8 0 8.7l26.5 10.6 26.5 10.6c1.1.4 2.2.6 3.3.7 2.8-8.2 4.3-17 4.3-26.2s-1.5-18.1-4.3-26.3z"/><path fill="#efc102" d="M306.8 152.7c-.8-.8-1.8-1.4-2.8-1.9l-26.2-11.3-26.2-11.3c-4.8-2.1-8.2 1.4-6.2 6.2l11.3 26.2 11.3 26.2c.5 1.1 1.1 2 1.9 2.8 15.9-7.8 29-20.8 36.9-36.9z"/><path fill="#f69524" d="M234.3 197.9c9.2 0 18-1.5 26.2-4.3 0-1.1-.3-2.2-.7-3.3l-10.6-26.5-10.6-26.5c-1.9-4.9-6.8-4.9-8.7 0l-10.6 26.5-10.6 26.5c-.4 1.1-.6 2.2-.7 3.3 8.3 2.8 17.1 4.3 26.3 4.3z"/><path fill="#f96623" d="M217.1 128.3l-26.2 11.3-26.2 11.3c-1.1.5-2 1.1-2.8 1.9 7.9 16.1 20.9 29.1 37 37 .8-.8 1.4-1.8 1.9-2.8l11.3-26.2 11.3-26.2c1.9-4.9-1.5-8.3-6.3-6.3z"/><path fill="#a81d27" d="M214.3 112.9l-26.5-10.6-26.5-10.6c-1.1-.4-2.2-.6-3.3-.7-2.8 8.2-4.3 17-4.3 26.2s1.5 18 4.3 26.2c1.1 0 2.2-.3 3.3-.7l26.5-10.6 26.5-10.6c4.8-1.8 4.8-6.7 0-8.6z"/><path fill="#a346ce" d="M161.8 81.8c.8.8 1.8 1.4 2.8 1.9L190.8 95l26.2 11.3c4.8 2.1 8.2-1.4 6.2-6.2L212 73.8l-11.3-26.2c-.5-1.1-1.1-2-1.9-2.8-16 7.8-29.1 20.9-37 37z"/><path fill="#297adf" d="M234.3 36.6c-9.2 0-18 1.5-26.2 4.3 0 1.1.3 2.2.7 3.3l10.6 26.5L230 97.2c1.9 4.9 6.8 4.9 8.7 0l10.6-26.5 10.6-26.5c.4-1.1.6-2.2.7-3.3-8.3-2.8-17.1-4.3-26.3-4.3z"/></symbol><symbol id="svg-dialog" data-name="dialog" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#fff" d="M177.8 170.8c-3 0-5.5-2.5-5.5-5.5V63.7c0-3 2.5-5.5 5.5-5.5h112.4c3 0 5.5 2.5 5.5 5.5v101.6c0 3-2.5 5.5-5.5 5.5H177.8z"/><path fill="#d6dde7" d="M290.2 60.7c1.6 0 3 1.4 3 3v101.6c0 1.6-1.4 3-3 3H177.8c-1.6 0-3-1.4-3-3V63.7c0-1.6 1.4-3 3-3h112.4m0-5H177.8c-4.4 0-8 3.6-8 8v101.6c0 4.4 3.6 8 8 8h112.4c4.4 0 8-3.6 8-8V63.7c0-4.4-3.6-8-8-8z"/><path fill="#297adf" d="M260.4 158.2h-52.9c-1.9 0-3.5-1.6-3.5-3.5v-12.5c0-1.9 1.6-3.5 3.5-3.5h52.9c1.9 0 3.5 1.6 3.5 3.5v12.5c0 1.9-1.5 3.5-3.5 3.5z"/></symbol><symbol id="svg-feedback" data-name="feedback" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill="#f96623"><rect fill-opacity=".48" x="277.6" y="104.2" transform="rotate(112.086 282.995 136.868)"/><rect x="179.6" y="64.5" transform="rotate(112.086 185.008 97.116)"/><rect fill-opacity=".24" x="208.7" y="133.4" transform="rotate(-157.911 214.13 165.99)"/><rect fill-opacity=".72" x="248.4" y="35.4" transform="rotate(-157.911 253.883 68.002)"/><rect fill-opacity=".36" x="249.1" y="133.1" transform="scale(-1) rotate(-22.916 -817.465 1255.988)"/><rect fill-opacity=".84" x="208" y="35.7" transform="scale(-1) rotate(-22.916 -336.957 1052.853)"/><rect fill-opacity=".12" x="179.9" y="105" transform="scale(-1) rotate(67.084 207.538 -279.508)"/><rect fill-opacity=".6" x="277.3" y="63.8" transform="scale(-1) rotate(67.084 145.429 -426.424)"/></g></symbol><symbol id="svg-icons" data-name="icons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f0f3f6" d="M334.8 119s-50.5 62.4-112.8 62.4S109.3 119 109.3 119s50.5-62.4 112.8-62.4S334.8 119 334.8 119z"/><path fill="#d6dde7" d="M222.1 183.9c-18.1 0-47-5.5-81.3-31.7-20.4-15.6-32.9-31-33.5-31.6L106 119l1.3-1.6c.5-.6 13-16 33.5-31.6 34.3-26.2 63.1-31.7 81.3-31.7 18.1 0 47 5.5 81.3 31.7 20.4 15.6 32.9 31 33.5 31.6l1.3 1.6-1.3 1.6c-.5.6-13 16-33.5 31.6-34.4 26.2-63.2 31.7-81.3 31.7zM112.6 119c8.3 9.6 54.6 59.9 109.5 59.9s101.2-50.3 109.5-59.9c-8.3-9.6-54.6-59.9-109.5-59.9S120.9 109.4 112.6 119z"/><path fill="#59a702" d="M222.1 69.4c-27 0-49 21.9-49 49s21.9 49 49 49c27 0 49-21.9 49-49s-22-49-49-49zm11.5 40.9c-6.4 0-11.5-5.2-11.5-11.5s5.2-11.5 11.5-11.5c6.4 0 11.5 5.2 11.5 11.5s-5.2 11.5-11.5 11.5z"/><path fill="#549103" d="M233.6 110.3c-6.4 0-11.5-5.2-11.5-11.5 0-.6.1-1.3.2-1.9h-.2c-11.9 0-21.5 9.6-21.5 21.5s9.6 21.5 21.5 21.5 21.5-9.6 21.5-21.5c0-3.8-1-7.4-2.8-10.6-2 1.6-4.5 2.5-7.2 2.5z"/></symbol><symbol id="svg-inputs" data-name="inputs" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M278.9 64.2h-89.8c-29.1 0-52.8 23.8-52.8 52.8 0 29.1 23.8 52.8 52.8 52.8h89.8c29.1 0 52.8-23.8 52.8-52.8 0-29.1-23.7-52.8-52.8-52.8zm-.8 95.8c-23.3 0-42.2-18.9-42.2-42.2 0-23.3 18.9-42.2 42.2-42.2 23.3 0 42.2 18.9 42.2 42.2 0 23.3-18.9 42.2-42.2 42.2z"/></symbol><symbol id="svg-messages" data-name="messages" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" class="st0" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#59a702" d="M327.1 80.3H140.6c-2.1 0-3.8-1.7-3.8-3.8V36h194.1v40.5c0 2.1-1.7 3.8-3.8 3.8z"/><path fill="#549103" d="M140.6 80.3h40.5V36h-44.3v40.5c0 2.1 1.7 3.8 3.8 3.8z"/><circle fill="#7bc117" cx="307.7" cy="58.1" r="11.8"/></symbol><symbol id="svg-panel" data-name="panel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M371.4 41c1.6 0 3 1.4 3 3v56c0 1.6-1.4 3-3 3H96.6c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h274.8m0-5H96.6c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h274.8c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8zM371.4 198H96.6c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h274.8c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8z"/></symbol><symbol id="svg-progress-bars" data-name="progress-bars" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dfe3e6" d="M401.6 129.5H66.4c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h335.3c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.6 12.5z"/><path fill="#efc102" d="M333.4 129.5h-267c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h267c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.5 12.5z"/></symbol><symbol id="svg-section" data-name="section" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f69524" d="M228.9 112.3h-76.1V55.9c0-10.9 8.8-19.7 19.7-19.7h56.4v76.1z"/><path fill="#d6dde7" d="M228.9 197.8h-56.6c-10.8 0-19.5-8.7-19.5-19.5v-56.6h76.1v76.1zM315.2 112.3h-76.1V36.2H296c10.6 0 19.2 8.6 19.2 19.2v56.9zM295.7 197.8h-56.6v-76.1h76.1v56.6c0 10.7-8.7 19.5-19.5 19.5z"/></symbol><symbol id="svg-sliders" data-name="sliders" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#297adf" cx="164.6" cy="117" r="6.6"/><path fill="#297adf" d="M145.7 117c0-1.7.3-3.4.7-5H80.2c-2-5-6.8-8.5-12.5-8.5-7.5 0-13.5 6-13.5 13.5s6 13.5 13.5 13.5c5.7 0 10.5-3.5 12.5-8.5h66.2c-.5-1.6-.7-3.3-.7-5z"/><path fill="#d6dde7" d="M400.3 103.5c-5.7 0-10.5 3.5-12.5 8.5H246.5c-2-5-6.8-8.5-12.5-8.5s-10.5 3.5-12.5 8.5h-38.6c-2.2-8-9.5-13.9-18.2-13.9-10.4 0-18.9 8.5-18.9 18.9 0 10.4 8.5 18.9 18.9 18.9 8.7 0 16-5.9 18.2-13.9h38.6c2 5 6.8 8.5 12.5 8.5s10.5-3.5 12.5-8.5h141.3c2 5 6.8 8.5 12.5 8.5 7.5 0 13.5-6 13.5-13.5s-6-13.5-13.5-13.5zm-235.7 27.4c-7.7 0-13.9-6.2-13.9-13.9s6.2-13.9 13.9-13.9 13.9 6.2 13.9 13.9-6.2 13.9-13.9 13.9zm18.9-12.3c0-.5.1-1.1.1-1.6s0-1.1-.1-1.6c0 .5.1 1.1.1 1.6s-.1 1.1-.1 1.6zm-.2 1.4c0-.2.1-.5.1-.7 0 .3-.1.5-.1.7zm0-6c0 .2.1.5.1.7 0-.3-.1-.5-.1-.7z"/></symbol><symbol id="svg-tables" data-name="tables" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M366.6 197.9c4.4 0 8.1-3.6 8.1-8.1V44.2c0-4.4-3.6-8.1-8.1-8.1H101.4c-4.4 0-8.1 3.6-8.1 8.1V189.8c0 4.4 3.6 8.1 8.1 8.1h265.2zm3-153.7v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zm-180 43.6V41.2h88.7v46.6h-88.7zm88.8 5.1V142h-88.7V92.9h88.7zm-180-48.7c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2zm0 48.7h86.2V142H98.4V92.9zm3 99.9c-1.6 0-3-1.4-3-3V147h86.2v45.8h-83.2zm88.2 0V147h88.7v45.8h-88.7zm180-3c0 1.6-1.4 3-3 3h-83.2V147h86.2v42.8zm0-47.8h-86.2V92.9h86.2V142z"/><path fill="#a346ce" d="M369.6 44.2v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3z"/><rect fill="#a346ce" x="189.6" y="41.2"/><path fill="#a346ce" d="M98.4 44.2c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2z"/></symbol><symbol id="svg-text" data-name="text" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M228 172.7l-8.3-21.8h-52.1l-8.3 21.8h-22.6l44.6-113.5h24.9l44.6 113.5H228zm-34.3-93.4l-20.4 54.1h40.9l-20.5-54.1zM313.5 172.7v-8.9c-6.1 7-15.7 10.9-26.6 10.9-13.4 0-28.6-9-28.6-27.2 0-18.9 15.1-26.7 28.6-26.7 11.1 0 20.6 3.6 26.6 10.6v-12.3c0-9.5-7.8-15.3-19.2-15.3-9.2 0-17.2 3.4-24.3 10.4l-7.3-12.4c9.5-9 21.4-13.3 34.6-13.3 18.2 0 34.2 7.7 34.2 29.8v54.5h-18zm0-18.7v-12.4c-4.1-5.6-11.7-8.5-19.6-8.5-10 0-17.5 5.8-17.5 14.8 0 8.9 7.5 14.6 17.5 14.6 7.8 0 15.5-2.9 19.6-8.5z"/></symbol><symbol id="svg-time" data-name="time" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#c3cddb" cx="234" cy="117" r="80.8"/><path fill="#fff" d="M261.1 148.1c-1 0-2-.4-2.8-1.2l-27.1-27.1c-.8-.8-1.2-1.8-1.2-2.8V56.2c0-2.2 1.8-4 4-4s4 1.8 4 4v59.2l25.9 25.9c1.6 1.6 1.6 4.1 0 5.7-.8.7-1.8 1.1-2.8 1.1z"/></symbol><symbol id="svg-validation" data-name="validation" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dd2f41" d="M332 69.7H136c-4.4 0-8 3.6-8 8v83.2c0 1.9 1.5 3.4 3.4 3.4h205.2c1.9 0 3.4-1.5 3.4-3.4V77.7c0-4.4-3.6-8-8-8zm-141.7 75.5h-52.1v-9.3h52.1v9.3zM335 111.8H133V77.7c0-1.6 1.4-3 3-3h196c1.6 0 3 1.4 3 3v34.1z"/></symbol><symbol id="svg-status-completed" data-name="status-completed" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M24.965 12.802l-10.267 11.25-7.626-7.621a1.232 1.232 0 0 1 0-1.741 1.224 1.224 0 0 1 1.74 0l5.805 5.802 8.531-9.349a1.23 1.23 0 0 1 1.817 1.659M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol></svg>')
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -107,7 +107,7 @@ Event.change(function(){
|
|
|
107
107
|
})
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
},{"../modules/notify":11,"compose-toolbox":
|
|
110
|
+
},{"../modules/notify":11,"compose-toolbox":62}],4:[function(require,module,exports){
|
|
111
111
|
var toolbox = require( 'compose-toolbox' )
|
|
112
112
|
var Event = toolbox.event
|
|
113
113
|
var notify = require( '../modules/notify' )
|
|
@@ -181,7 +181,7 @@ window.onpageshow = function(event) {
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
},{"../modules/notify":11,"compose-toolbox":
|
|
184
|
+
},{"../modules/notify":11,"compose-toolbox":62}],5:[function(require,module,exports){
|
|
185
185
|
var Event = require('compose-toolbox').event
|
|
186
186
|
|
|
187
187
|
function numberInputOnly(event) {
|
|
@@ -202,7 +202,7 @@ function numberInputOnly(event) {
|
|
|
202
202
|
// Prevent non numeric input on input type of number
|
|
203
203
|
Event.on( document, 'keydown', 'input[type=number]', numberInputOnly )
|
|
204
204
|
|
|
205
|
-
},{"compose-toolbox":
|
|
205
|
+
},{"compose-toolbox":62}],6:[function(require,module,exports){
|
|
206
206
|
var toolbox = require('compose-toolbox'),
|
|
207
207
|
Event = toolbox.event,
|
|
208
208
|
convert = require('../modules/unit-converter'),
|
|
@@ -274,7 +274,7 @@ Event.change( function() {
|
|
|
274
274
|
Event.on(document, 'input', '[data-unit]', setValue)
|
|
275
275
|
Event.on(document, 'input', '[data-unit-select]', unitChange)
|
|
276
276
|
|
|
277
|
-
},{"../modules/unit-converter":12,"compose-form-up":40,"compose-toolbox":
|
|
277
|
+
},{"../modules/unit-converter":12,"compose-form-up":40,"compose-toolbox":62}],7:[function(require,module,exports){
|
|
278
278
|
var Event = require('compose-toolbox').event
|
|
279
279
|
|
|
280
280
|
Event.change(function(){
|
|
@@ -287,7 +287,7 @@ Event.change(function(){
|
|
|
287
287
|
})
|
|
288
288
|
|
|
289
289
|
|
|
290
|
-
},{"compose-toolbox":
|
|
290
|
+
},{"compose-toolbox":62}],8:[function(require,module,exports){
|
|
291
291
|
var Event = require( 'compose-toolbox' ).event
|
|
292
292
|
|
|
293
293
|
function autoSizeTextarea( textarea ) {
|
|
@@ -322,7 +322,7 @@ Event.on(document, 'keyup toggler:show', 'textarea', function(event){
|
|
|
322
322
|
|
|
323
323
|
|
|
324
324
|
|
|
325
|
-
},{"compose-toolbox":
|
|
325
|
+
},{"compose-toolbox":62}],9:[function(require,module,exports){
|
|
326
326
|
var Event = require('compose-toolbox').event
|
|
327
327
|
|
|
328
328
|
// Check if child select matches parent selected option
|
|
@@ -395,7 +395,7 @@ Event.ready(function(){
|
|
|
395
395
|
Event.on(document, 'change', '.select-parent', function(event){
|
|
396
396
|
test(event.currentTarget)
|
|
397
397
|
})
|
|
398
|
-
},{"compose-toolbox":
|
|
398
|
+
},{"compose-toolbox":62}],10:[function(require,module,exports){
|
|
399
399
|
var event = require( 'compose-toolbox' ).event
|
|
400
400
|
|
|
401
401
|
// Public API function
|
|
@@ -452,7 +452,7 @@ var clipboard = function() {
|
|
|
452
452
|
|
|
453
453
|
module.exports = clipboard
|
|
454
454
|
|
|
455
|
-
},{"compose-toolbox":
|
|
455
|
+
},{"compose-toolbox":62}],11:[function(require,module,exports){
|
|
456
456
|
var toolbox = require( 'compose-toolbox' ),
|
|
457
457
|
Event = toolbox.event,
|
|
458
458
|
esvg = require( '../_esvg' ),
|
|
@@ -572,7 +572,7 @@ notify.remove = remove
|
|
|
572
572
|
|
|
573
573
|
module.exports = notify
|
|
574
574
|
|
|
575
|
-
},{"../_esvg":1,"compose-toolbox":
|
|
575
|
+
},{"../_esvg":1,"compose-toolbox":62}],12:[function(require,module,exports){
|
|
576
576
|
const unitsTable = {
|
|
577
577
|
bit: 1,
|
|
578
578
|
byte: 8,
|
|
@@ -672,7 +672,7 @@ window.Tungsten = module.exports = toolbox.merge( {
|
|
|
672
672
|
dialog : dialog
|
|
673
673
|
}, toolbox )
|
|
674
674
|
|
|
675
|
-
},{"./_esvg":1,"./_icons":2,"./enhancements/flash-messages":3,"./enhancements/form-submit-helpers":4,"./enhancements/input-number-only":5,"./enhancements/input-unit":6,"./enhancements/link-here":7,"./enhancements/textarea-expand":8,"./enhancements/tiered-select":9,"./modules/clipboard":10,"./modules/notify":11,"compose-dialog":16,"compose-form-up":40,"compose-time-toggle":
|
|
675
|
+
},{"./_esvg":1,"./_icons":2,"./enhancements/flash-messages":3,"./enhancements/form-submit-helpers":4,"./enhancements/input-number-only":5,"./enhancements/input-unit":6,"./enhancements/link-here":7,"./enhancements/textarea-expand":8,"./enhancements/tiered-select":9,"./modules/clipboard":10,"./modules/notify":11,"compose-dialog":16,"compose-form-up":40,"compose-time-toggle":57,"compose-toggler":61,"compose-toolbox":62,"superagent":74}],14:[function(require,module,exports){
|
|
676
676
|
/*!
|
|
677
677
|
* Bean - copyright (c) Jacob Thornton 2011-2012
|
|
678
678
|
* https://github.com/fat/bean
|
|
@@ -1929,7 +1929,7 @@ var toolbox = {
|
|
|
1929
1929
|
|
|
1930
1930
|
module.exports = toolbox
|
|
1931
1931
|
|
|
1932
|
-
},{"./lib/ease":18,"./lib/fromtop":19,"./lib/scrollto":20,"./lib/shims/_classlist":21,"./lib/shims/_object.assign":22,"./lib/time":23,"compose-event":24,"luxon":
|
|
1932
|
+
},{"./lib/ease":18,"./lib/fromtop":19,"./lib/scrollto":20,"./lib/shims/_classlist":21,"./lib/shims/_object.assign":22,"./lib/time":23,"compose-event":24,"luxon":71}],18:[function(require,module,exports){
|
|
1933
1933
|
// easing functions http://gizma.com/easing/
|
|
1934
1934
|
var ease = {
|
|
1935
1935
|
|
|
@@ -2390,7 +2390,7 @@ module.exports = {
|
|
|
2390
2390
|
prettyPrint: prettyPrint
|
|
2391
2391
|
}
|
|
2392
2392
|
|
|
2393
|
-
},{"luxon":
|
|
2393
|
+
},{"luxon":71}],24:[function(require,module,exports){
|
|
2394
2394
|
require( './lib/shims/custom-event' )
|
|
2395
2395
|
|
|
2396
2396
|
var bean = require( 'bean' )
|
|
@@ -2630,7 +2630,7 @@ function isEmpty( obj ) {
|
|
|
2630
2630
|
return true;
|
|
2631
2631
|
}
|
|
2632
2632
|
|
|
2633
|
-
},{"./lib/animation-events":25,"./lib/bubble-form-events":26,"./lib/callback-manager":27,"./lib/debounce":28,"./lib/delay":29,"./lib/media":30,"./lib/page":32,"./lib/repeat":33,"./lib/resize":34,"./lib/scroll":35,"./lib/shims/custom-event":36,"./lib/submit":37,"./lib/tap-events":38,"./lib/throttle":39,"bean":14,"keymaster":
|
|
2633
|
+
},{"./lib/animation-events":25,"./lib/bubble-form-events":26,"./lib/callback-manager":27,"./lib/debounce":28,"./lib/delay":29,"./lib/media":30,"./lib/page":32,"./lib/repeat":33,"./lib/resize":34,"./lib/scroll":35,"./lib/shims/custom-event":36,"./lib/submit":37,"./lib/tap-events":38,"./lib/throttle":39,"bean":14,"keymaster":70}],25:[function(require,module,exports){
|
|
2634
2634
|
var cssAnimEventTypes = getAnimationEventTypes()
|
|
2635
2635
|
var supported = cssAnimEventTypes.animationstart !== undefined
|
|
2636
2636
|
|
|
@@ -3379,7 +3379,6 @@ module.exports = throttle
|
|
|
3379
3379
|
|
|
3380
3380
|
},{"./debounce":28}],40:[function(require,module,exports){
|
|
3381
3381
|
var validation = require( './lib/validation' ),
|
|
3382
|
-
tieredSelect = require( './lib/tiered-select' ),
|
|
3383
3382
|
progressive = require( './lib/progressive' ),
|
|
3384
3383
|
getLabel = require( './lib/get-label' ),
|
|
3385
3384
|
diff = require( './lib/diff' ),
|
|
@@ -3392,7 +3391,6 @@ require( './lib/reset' )
|
|
|
3392
3391
|
|
|
3393
3392
|
module.exports = {
|
|
3394
3393
|
validate: validation.validate,
|
|
3395
|
-
tieredSelect: tieredSelect,
|
|
3396
3394
|
invalidateField: validation.invalidateField,
|
|
3397
3395
|
next: progressive.next,
|
|
3398
3396
|
getLabel: getLabel,
|
|
@@ -3403,7 +3401,7 @@ module.exports = {
|
|
|
3403
3401
|
slider: slider
|
|
3404
3402
|
}
|
|
3405
3403
|
|
|
3406
|
-
},{"./lib/diff":41,"./lib/get-label":43,"./lib/input-change":44,"./lib/progressive":46,"./lib/reset":47,"./lib/slider/input":51,"./lib/step-labels":54,"./lib/stepped-number-input":55,"./lib/
|
|
3404
|
+
},{"./lib/diff":41,"./lib/get-label":43,"./lib/input-change":44,"./lib/progressive":46,"./lib/reset":47,"./lib/slider/input":51,"./lib/step-labels":54,"./lib/stepped-number-input":55,"./lib/validation":56}],41:[function(require,module,exports){
|
|
3407
3405
|
var toolbox = require( 'compose-toolbox' ),
|
|
3408
3406
|
Event = toolbox.event,
|
|
3409
3407
|
getLabel = require( './get-label'),
|
|
@@ -3609,7 +3607,7 @@ module.exports = {
|
|
|
3609
3607
|
watch: watch
|
|
3610
3608
|
}
|
|
3611
3609
|
|
|
3612
|
-
},{"./get-label":43,"./input-change":44,"./selector":48,"./slider/helpers":50,"compose-toolbox":
|
|
3610
|
+
},{"./get-label":43,"./input-change":44,"./selector":48,"./slider/helpers":50,"compose-toolbox":62}],42:[function(require,module,exports){
|
|
3613
3611
|
module.exports = function extractData (el, pattern) {
|
|
3614
3612
|
var data = {}
|
|
3615
3613
|
|
|
@@ -3708,7 +3706,7 @@ getLabel.legend = getLegendText
|
|
|
3708
3706
|
|
|
3709
3707
|
module.exports = getLabel
|
|
3710
3708
|
|
|
3711
|
-
},{"./selector":48,"compose-toolbox":
|
|
3709
|
+
},{"./selector":48,"compose-toolbox":62}],44:[function(require,module,exports){
|
|
3712
3710
|
var toolbox = require( 'compose-toolbox' ),
|
|
3713
3711
|
Event = toolbox.event,
|
|
3714
3712
|
getLabel = require( './get-label' ),
|
|
@@ -3794,16 +3792,31 @@ function changeClasses( input, recursive ) {
|
|
|
3794
3792
|
}
|
|
3795
3793
|
}
|
|
3796
3794
|
|
|
3795
|
+
function checkRadioLabel ( input ) {
|
|
3796
|
+
var input = ( input.target || input )
|
|
3797
|
+
var inputName = input.name
|
|
3798
|
+
var radioGroup = document.querySelectorAll('input[name=' + inputName + ']')
|
|
3799
|
+
|
|
3800
|
+
radioGroup.forEach(function(radioInput) {
|
|
3801
|
+
|
|
3802
|
+
var label = toolbox.getClosest( radioInput, 'label' )
|
|
3803
|
+
return (radioInput.checked === true ? label.classList.add('checked-radio') : label.classList.remove('checked-radio'));
|
|
3804
|
+
|
|
3805
|
+
})
|
|
3806
|
+
}
|
|
3807
|
+
|
|
3797
3808
|
function watch () {
|
|
3798
3809
|
if ( watching ) { return }
|
|
3799
3810
|
// Initialize input state
|
|
3800
3811
|
Event.change( function() {
|
|
3801
3812
|
toolbox.each( document.querySelectorAll( inputSelectors ), inputInit )
|
|
3802
3813
|
toolbox.each( document.querySelectorAll('input[type=range],input[type=number]'), trackState )
|
|
3814
|
+
toolbox.each( document.querySelectorAll('input[type=radio]'), checkRadioLabel )
|
|
3803
3815
|
})
|
|
3804
3816
|
|
|
3805
3817
|
// Set input state on input
|
|
3806
3818
|
Event.on( document, 'input', inputSelectors, inputChange )
|
|
3819
|
+
Event.on( document, 'input', 'input[type=radio]', checkRadioLabel )
|
|
3807
3820
|
|
|
3808
3821
|
// Form.reset() doesn't fire input events. This ensures those events are fired.
|
|
3809
3822
|
Event.on( document, 'click', '[type=reset]', resetForm )
|
|
@@ -3840,7 +3853,7 @@ module.exports = {
|
|
|
3840
3853
|
watch: watch
|
|
3841
3854
|
}
|
|
3842
3855
|
|
|
3843
|
-
},{"./get-label":43,"./selector":48,"compose-toolbox":
|
|
3856
|
+
},{"./get-label":43,"./selector":48,"compose-toolbox":62}],45:[function(require,module,exports){
|
|
3844
3857
|
module.exports = function objectSize (object) {
|
|
3845
3858
|
var length = 0; for(var i in object) { length++ }
|
|
3846
3859
|
return length
|
|
@@ -4176,7 +4189,7 @@ module.exports = {
|
|
|
4176
4189
|
new: newForm
|
|
4177
4190
|
}
|
|
4178
4191
|
|
|
4179
|
-
},{"compose-toolbox":
|
|
4192
|
+
},{"compose-toolbox":62}],47:[function(require,module,exports){
|
|
4180
4193
|
var Event = require( 'compose-event' ),
|
|
4181
4194
|
toolbox = require( 'compose-toolbox' ),
|
|
4182
4195
|
getLabel = require( './get-label' )
|
|
@@ -4248,7 +4261,7 @@ Event.on( document, 'click', '[data-reset-input]', resetValue )
|
|
|
4248
4261
|
Event.on( document, 'click', '[data-restore-default]', restoreDefault )
|
|
4249
4262
|
Event.on( document, 'click', '[type=reset]', resetForm )
|
|
4250
4263
|
|
|
4251
|
-
},{"./get-label":43,"compose-event":24,"compose-toolbox":
|
|
4264
|
+
},{"./get-label":43,"compose-event":24,"compose-toolbox":62}],48:[function(require,module,exports){
|
|
4252
4265
|
module.exports = 'input:not([type=hidden]), select, textarea'
|
|
4253
4266
|
|
|
4254
4267
|
},{}],49:[function(require,module,exports){
|
|
@@ -4428,7 +4441,7 @@ module.exports = {
|
|
|
4428
4441
|
getData: getData
|
|
4429
4442
|
}
|
|
4430
4443
|
|
|
4431
|
-
},{"../extract-data":42,"../object-size":45,"../step-index":53,"./helpers":50,"compose-toolbox":
|
|
4444
|
+
},{"../extract-data":42,"../object-size":45,"../step-index":53,"./helpers":50,"compose-toolbox":62}],50:[function(require,module,exports){
|
|
4432
4445
|
function getValues( min, max, values, step ) {
|
|
4433
4446
|
var result = {}
|
|
4434
4447
|
step = step || 1
|
|
@@ -4603,7 +4616,7 @@ module.exports = {
|
|
|
4603
4616
|
getData: events.getData
|
|
4604
4617
|
}
|
|
4605
4618
|
|
|
4606
|
-
},{"./events":49,"./template":52,"compose-toolbox":
|
|
4619
|
+
},{"./events":49,"./template":52,"compose-toolbox":62}],52:[function(require,module,exports){
|
|
4607
4620
|
var objectSize = require('../object-size')
|
|
4608
4621
|
|
|
4609
4622
|
function html( data, sliderHTML ) {
|
|
@@ -4814,7 +4827,7 @@ module.exports = {
|
|
|
4814
4827
|
watch: watch
|
|
4815
4828
|
}
|
|
4816
4829
|
|
|
4817
|
-
},{"./extract-data":42,"./object-size":45,"./step-index":53,"compose-toolbox":
|
|
4830
|
+
},{"./extract-data":42,"./object-size":45,"./step-index":53,"compose-toolbox":62}],55:[function(require,module,exports){
|
|
4818
4831
|
var toolbox = require( 'compose-toolbox' ),
|
|
4819
4832
|
Event = toolbox.event,
|
|
4820
4833
|
watching = false
|
|
@@ -4893,25 +4906,7 @@ module.exports = {
|
|
|
4893
4906
|
round: roundToNearest
|
|
4894
4907
|
}
|
|
4895
4908
|
|
|
4896
|
-
},{"compose-toolbox":
|
|
4897
|
-
// var toolbox = require( 'compose-toolbox' ),
|
|
4898
|
-
// Event = toolbox.event
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
// function setup () {
|
|
4902
|
-
// toolbox.event.on( function() {
|
|
4903
|
-
// var tierChild = document.querySelectorAll('.input');
|
|
4904
|
-
|
|
4905
|
-
// Array.prototype.forEach.call(tierChild, function(el) {
|
|
4906
|
-
// return tierChild;
|
|
4907
|
-
// })
|
|
4908
|
-
// })
|
|
4909
|
-
// }
|
|
4910
|
-
|
|
4911
|
-
// module.exports = {
|
|
4912
|
-
// setup: setup
|
|
4913
|
-
// }
|
|
4914
|
-
},{}],57:[function(require,module,exports){
|
|
4909
|
+
},{"compose-toolbox":62}],56:[function(require,module,exports){
|
|
4915
4910
|
// Dependencies
|
|
4916
4911
|
var toolbox = require( 'compose-toolbox' ),
|
|
4917
4912
|
Event = toolbox.event,
|
|
@@ -4957,7 +4952,6 @@ Event.ready( function(){
|
|
|
4957
4952
|
Event.on( document, 'keydown', '[required]', Event.debounce( checkValidation, 200 ) )
|
|
4958
4953
|
Event.on( document, 'input', 'select[required]', Event.debounce( checkValidation, 200 ) )
|
|
4959
4954
|
Event.on( document, 'change', '[type=checkbox][required]', checkValidation )
|
|
4960
|
-
Event.on( document, 'change', '[data-grouped-validation]', checkValidation )
|
|
4961
4955
|
|
|
4962
4956
|
}
|
|
4963
4957
|
})
|
|
@@ -5037,7 +5031,7 @@ function isValid ( input ) {
|
|
|
5037
5031
|
input.value = ''
|
|
5038
5032
|
|
|
5039
5033
|
// Set a custom validation message for word count
|
|
5040
|
-
var message = checkValue( input ) || checkLength( input ) || checkTime( input ) ||
|
|
5034
|
+
var message = checkValue( input ) || checkLength( input ) || checkTime( input ) || ''
|
|
5041
5035
|
input.setCustomValidity( message )
|
|
5042
5036
|
|
|
5043
5037
|
var valid = input.checkValidity()
|
|
@@ -5157,38 +5151,6 @@ function formatDate( date, options ) {
|
|
|
5157
5151
|
return tTime.prettyPrint( date, options ).replace( ' Z', '')
|
|
5158
5152
|
}
|
|
5159
5153
|
|
|
5160
|
-
function checkSwitchGroup ( input ) {
|
|
5161
|
-
// Check inputs with 'data-grouped-validation'
|
|
5162
|
-
if (input.dataset.groupedValidation) {
|
|
5163
|
-
// If the input has 'data-grouped-validation', find all
|
|
5164
|
-
// checkbox inputs with the same name
|
|
5165
|
-
var inputName = input.name,
|
|
5166
|
-
inputGroup = document.querySelectorAll("input[type='checkbox'][name='" + inputName + "']"),
|
|
5167
|
-
err = '',
|
|
5168
|
-
minOneChecked = false;
|
|
5169
|
-
|
|
5170
|
-
// Check each input to ensure at least one is checked
|
|
5171
|
-
for (i=0; i<inputGroup.length; i++) {
|
|
5172
|
-
if (inputGroup[i].checked === true) {
|
|
5173
|
-
minOneChecked = true;
|
|
5174
|
-
}
|
|
5175
|
-
}
|
|
5176
|
-
|
|
5177
|
-
// If one is not checked, return error message.
|
|
5178
|
-
if (minOneChecked !== true) {
|
|
5179
|
-
for (i=0; i<inputGroup.length; i++) {
|
|
5180
|
-
inputGroup[i].required = true;
|
|
5181
|
-
return "You must select at least one option."
|
|
5182
|
-
}
|
|
5183
|
-
// If at least one is checked, remove required from other inputs.
|
|
5184
|
-
} else {
|
|
5185
|
-
for (i=0; i<inputGroup.length; i++) {
|
|
5186
|
-
inputGroup[i].required = false;
|
|
5187
|
-
}
|
|
5188
|
-
}
|
|
5189
|
-
}
|
|
5190
|
-
}
|
|
5191
|
-
|
|
5192
5154
|
|
|
5193
5155
|
// If input is nested in a label, treat the label as the
|
|
5194
5156
|
// target for assigning status (class names and messages).
|
|
@@ -5272,7 +5234,7 @@ module.exports = {
|
|
|
5272
5234
|
invalidateField: invalidateField
|
|
5273
5235
|
}
|
|
5274
5236
|
|
|
5275
|
-
},{"compose-toolbox":
|
|
5237
|
+
},{"compose-toolbox":62}],57:[function(require,module,exports){
|
|
5276
5238
|
var TimeToggle = require('./lib/toggle.js')
|
|
5277
5239
|
var Event = require('compose-event')
|
|
5278
5240
|
|
|
@@ -5284,7 +5246,7 @@ Event.change(TimeToggle.setup)
|
|
|
5284
5246
|
|
|
5285
5247
|
module.exports = TimeToggle
|
|
5286
5248
|
|
|
5287
|
-
},{"./lib/date-to-html.js":
|
|
5249
|
+
},{"./lib/date-to-html.js":58,"./lib/timeago.js":59,"./lib/toggle.js":60,"compose-event":24}],58:[function(require,module,exports){
|
|
5288
5250
|
// Converts a simple date string into Date + Time + Timezone wrapped in HTML
|
|
5289
5251
|
//
|
|
5290
5252
|
// Input:
|
|
@@ -5369,7 +5331,7 @@ var pad = function datePad(num, pad){
|
|
|
5369
5331
|
|
|
5370
5332
|
module.exports = DateToHTML
|
|
5371
5333
|
|
|
5372
|
-
},{}],
|
|
5334
|
+
},{}],59:[function(require,module,exports){
|
|
5373
5335
|
// Timeago by Brandon Mathis, based on JavaScript Pretty Date Copyright (c) 2011 John Resig
|
|
5374
5336
|
// Returns relative time
|
|
5375
5337
|
|
|
@@ -5464,7 +5426,7 @@ var Timeago = {
|
|
|
5464
5426
|
|
|
5465
5427
|
module.exports = Timeago
|
|
5466
5428
|
|
|
5467
|
-
},{}],
|
|
5429
|
+
},{}],60:[function(require,module,exports){
|
|
5468
5430
|
var Timeago = require('./timeago')
|
|
5469
5431
|
var DateToHTML = require('./date-to-html')
|
|
5470
5432
|
var Event = require('compose-event')
|
|
@@ -5557,7 +5519,7 @@ var Toggle = {
|
|
|
5557
5519
|
|
|
5558
5520
|
module.exports = Toggle
|
|
5559
5521
|
|
|
5560
|
-
},{"./date-to-html":
|
|
5522
|
+
},{"./date-to-html":58,"./timeago":59,"compose-event":24}],61:[function(require,module,exports){
|
|
5561
5523
|
var Event = require('compose-event')
|
|
5562
5524
|
|
|
5563
5525
|
var Toggler = {
|
|
@@ -5976,7 +5938,7 @@ Event.change(Toggler.refresh)
|
|
|
5976
5938
|
|
|
5977
5939
|
module.exports = Toggler
|
|
5978
5940
|
|
|
5979
|
-
},{"compose-event":24}],
|
|
5941
|
+
},{"compose-event":24}],62:[function(require,module,exports){
|
|
5980
5942
|
// Shims
|
|
5981
5943
|
require( './lib/shims/_classlist' )
|
|
5982
5944
|
var merge = require( './lib/shims/_object.assign' ),
|
|
@@ -6074,19 +6036,19 @@ var toolbox = {
|
|
|
6074
6036
|
|
|
6075
6037
|
module.exports = toolbox
|
|
6076
6038
|
|
|
6077
|
-
},{"./lib/ease":
|
|
6039
|
+
},{"./lib/ease":63,"./lib/fromtop":64,"./lib/scrollto":65,"./lib/shims/_classlist":66,"./lib/shims/_object.assign":67,"./lib/time":68,"compose-event":24,"luxon":71}],63:[function(require,module,exports){
|
|
6078
6040
|
arguments[4][18][0].apply(exports,arguments)
|
|
6079
|
-
},{"dup":18}],
|
|
6041
|
+
},{"dup":18}],64:[function(require,module,exports){
|
|
6080
6042
|
arguments[4][19][0].apply(exports,arguments)
|
|
6081
|
-
},{"dup":19}],
|
|
6043
|
+
},{"dup":19}],65:[function(require,module,exports){
|
|
6082
6044
|
arguments[4][20][0].apply(exports,arguments)
|
|
6083
|
-
},{"./ease":
|
|
6045
|
+
},{"./ease":63,"./fromtop":64,"dup":20}],66:[function(require,module,exports){
|
|
6084
6046
|
arguments[4][21][0].apply(exports,arguments)
|
|
6085
|
-
},{"dup":21}],
|
|
6047
|
+
},{"dup":21}],67:[function(require,module,exports){
|
|
6086
6048
|
arguments[4][22][0].apply(exports,arguments)
|
|
6087
|
-
},{"dup":22}],
|
|
6049
|
+
},{"dup":22}],68:[function(require,module,exports){
|
|
6088
6050
|
arguments[4][23][0].apply(exports,arguments)
|
|
6089
|
-
},{"dup":23,"luxon":
|
|
6051
|
+
},{"dup":23,"luxon":71}],69:[function(require,module,exports){
|
|
6090
6052
|
if (typeof Object.create === 'function') {
|
|
6091
6053
|
// implementation from standard node.js 'util' module
|
|
6092
6054
|
module.exports = function inherits(ctor, superCtor) {
|
|
@@ -6111,7 +6073,7 @@ if (typeof Object.create === 'function') {
|
|
|
6111
6073
|
}
|
|
6112
6074
|
}
|
|
6113
6075
|
|
|
6114
|
-
},{}],
|
|
6076
|
+
},{}],70:[function(require,module,exports){
|
|
6115
6077
|
// keymaster.js
|
|
6116
6078
|
// (c) 2011-2013 Thomas Fuchs
|
|
6117
6079
|
// keymaster.js may be freely distributed under the MIT license.
|
|
@@ -6409,7 +6371,7 @@ if (typeof Object.create === 'function') {
|
|
|
6409
6371
|
|
|
6410
6372
|
})(this);
|
|
6411
6373
|
|
|
6412
|
-
},{}],
|
|
6374
|
+
},{}],71:[function(require,module,exports){
|
|
6413
6375
|
'use strict';
|
|
6414
6376
|
|
|
6415
6377
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
@@ -13364,7 +13326,7 @@ exports.LocalZone = LocalZone;
|
|
|
13364
13326
|
exports.Settings = Settings;
|
|
13365
13327
|
|
|
13366
13328
|
|
|
13367
|
-
},{"util":
|
|
13329
|
+
},{"util":80}],72:[function(require,module,exports){
|
|
13368
13330
|
// shim for using process in browser
|
|
13369
13331
|
var process = module.exports = {};
|
|
13370
13332
|
|
|
@@ -13550,7 +13512,7 @@ process.chdir = function (dir) {
|
|
|
13550
13512
|
};
|
|
13551
13513
|
process.umask = function() { return 0; };
|
|
13552
13514
|
|
|
13553
|
-
},{}],
|
|
13515
|
+
},{}],73:[function(require,module,exports){
|
|
13554
13516
|
function Agent() {
|
|
13555
13517
|
this._defaults = [];
|
|
13556
13518
|
}
|
|
@@ -13572,7 +13534,7 @@ Agent.prototype._setDefaults = function(req) {
|
|
|
13572
13534
|
|
|
13573
13535
|
module.exports = Agent;
|
|
13574
13536
|
|
|
13575
|
-
},{}],
|
|
13537
|
+
},{}],74:[function(require,module,exports){
|
|
13576
13538
|
/**
|
|
13577
13539
|
* Root reference for iframes.
|
|
13578
13540
|
*/
|
|
@@ -14494,7 +14456,7 @@ request.put = function(url, data, fn) {
|
|
|
14494
14456
|
return req;
|
|
14495
14457
|
};
|
|
14496
14458
|
|
|
14497
|
-
},{"./agent-base":
|
|
14459
|
+
},{"./agent-base":73,"./is-object":75,"./request-base":76,"./response-base":77,"component-emitter":15}],75:[function(require,module,exports){
|
|
14498
14460
|
'use strict';
|
|
14499
14461
|
|
|
14500
14462
|
/**
|
|
@@ -14511,7 +14473,7 @@ function isObject(obj) {
|
|
|
14511
14473
|
|
|
14512
14474
|
module.exports = isObject;
|
|
14513
14475
|
|
|
14514
|
-
},{}],
|
|
14476
|
+
},{}],76:[function(require,module,exports){
|
|
14515
14477
|
'use strict';
|
|
14516
14478
|
|
|
14517
14479
|
/**
|
|
@@ -15207,7 +15169,7 @@ RequestBase.prototype._setTimeouts = function() {
|
|
|
15207
15169
|
}
|
|
15208
15170
|
};
|
|
15209
15171
|
|
|
15210
|
-
},{"./is-object":
|
|
15172
|
+
},{"./is-object":75}],77:[function(require,module,exports){
|
|
15211
15173
|
'use strict';
|
|
15212
15174
|
|
|
15213
15175
|
/**
|
|
@@ -15345,7 +15307,7 @@ ResponseBase.prototype._setStatusProperties = function(status){
|
|
|
15345
15307
|
this.unprocessableEntity = 422 == status;
|
|
15346
15308
|
};
|
|
15347
15309
|
|
|
15348
|
-
},{"./utils":
|
|
15310
|
+
},{"./utils":78}],78:[function(require,module,exports){
|
|
15349
15311
|
'use strict';
|
|
15350
15312
|
|
|
15351
15313
|
/**
|
|
@@ -15418,14 +15380,14 @@ exports.cleanHeader = function(header, changesOrigin){
|
|
|
15418
15380
|
return header;
|
|
15419
15381
|
};
|
|
15420
15382
|
|
|
15421
|
-
},{}],
|
|
15383
|
+
},{}],79:[function(require,module,exports){
|
|
15422
15384
|
module.exports = function isBuffer(arg) {
|
|
15423
15385
|
return arg && typeof arg === 'object'
|
|
15424
15386
|
&& typeof arg.copy === 'function'
|
|
15425
15387
|
&& typeof arg.fill === 'function'
|
|
15426
15388
|
&& typeof arg.readUInt8 === 'function';
|
|
15427
15389
|
}
|
|
15428
|
-
},{}],
|
|
15390
|
+
},{}],80:[function(require,module,exports){
|
|
15429
15391
|
(function (process,global){
|
|
15430
15392
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
15431
15393
|
//
|
|
@@ -16016,7 +15978,7 @@ function hasOwnProperty(obj, prop) {
|
|
|
16016
15978
|
|
|
16017
15979
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
16018
15980
|
|
|
16019
|
-
},{"./support/isBuffer":
|
|
15981
|
+
},{"./support/isBuffer":79,"_process":72,"inherits":69}]},{},[13])(13)
|
|
16020
15982
|
});
|
|
16021
15983
|
|
|
16022
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9mbGFzaC1tZXNzYWdlcy5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2Zvcm0tc3VibWl0LWhlbHBlcnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9pbnB1dC1udW1iZXItb25seS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2lucHV0LXVuaXQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9saW5rLWhlcmUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90ZXh0YXJlYS1leHBhbmQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90aWVyZWQtc2VsZWN0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9tb2R1bGVzL2NsaXBib2FyZC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vbW9kdWxlcy9ub3RpZnkuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL21vZHVsZXMvdW5pdC1jb252ZXJ0ZXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL3R1bmdzdGVuLmpzIiwibm9kZV9tb2R1bGVzL2JlYW4vYmVhbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Vhc2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZnJvbXRvcC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fY2xhc3NsaXN0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hbmltYXRpb24tZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2J1YmJsZS1mb3JtLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9jYWxsYmFjay1tYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2RlYm91bmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2RlbGF5LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL21lZGlhLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL29wdGltaXplZC1ldmVudC1tYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3BhZ2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcmVwZWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Jlc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zY3JvbGwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2hpbXMvY3VzdG9tLWV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3N1Ym1pdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90YXAtZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Rocm90dGxlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2RpZmYuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9leHRyYWN0LWRhdGEuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9nZXQtbGFiZWwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9pbnB1dC1jaGFuZ2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9vYmplY3Qtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3Byb2dyZXNzaXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvcmVzZXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zbGlkZXIvaGVscGVycy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci9pbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci90ZW1wbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3N0ZXAtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zdGVwLWxhYmVscy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3N0ZXBwZWQtbnVtYmVyLWlucHV0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvdGllcmVkLXNlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3ZhbGlkYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi9kYXRlLXRvLWh0bWwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9saWIvdGltZWFnby5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi90b2dnbGUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b2dnbGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2tleW1hc3Rlci9rZXltYXN0ZXIuanMiLCJub2RlX21vZHVsZXMvbHV4b24vYnVpbGQvY2pzLWJyb3dzZXIvbHV4b24uanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2FnZW50LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXF1ZXN0LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVzcG9uc2UtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDenlOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIihmdW5jdGlvbigpe1xuICB2YXIgbmFtZXNcblxuICBmdW5jdGlvbiBhdHRyKCBzb3VyY2UsIG5hbWUgKXtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PSAnb2JqZWN0JylcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkrJ1wiICdcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbmFtZSsnPVwiJytzb3VyY2UrJ1wiICcgfVxuXG4gIGZ1bmN0aW9uIGRhc2hlcml6ZSggaW5wdXQgKSB7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1tcXFcsX10vZywgJy0nKS5yZXBsYWNlKC8tezIsfS9nLCAnLScpXG4gIH1cblxuICBmdW5jdGlvbiBzdmdOYW1lKCBuYW1lICkge1xuICAgIHJldHVybiBcInN2Zy1cIitkYXNoZXJpemUoIG5hbWUgKVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlKCBuYW1lLCBvcHRpb25zICkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgdmFyIGlkID0gZGFzaGVyaXplKCBuYW1lIClcbiAgICB2YXIgc3ltYm9sID0gc3ZncygpW2lkXVxuXG4gICAgaWYgKCBzeW1ib2wgKSB7XG4gICAgICB2YXIgcGFyZW50ID0gc3ltYm9sLnBhcmVudEVsZW1lbnRcbiAgICAgIHZhciBwcmVmaXggPSBwYXJlbnQuZGF0YXNldC5wcmVmaXhcbiAgICAgIHZhciBiYXNlICAgPSBwYXJlbnQuZGF0YXNldC5zeW1ib2xDbGFzc1xuXG4gICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoICc8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiMnICsgcHJlZml4ICsgJy0nICsgaWQgKyAnXCIvPjwvc3ZnPicgKS5maXJzdENoaWxkO1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgYmFzZSArICcgJyArIHByZWZpeCArICctJyArIGlkICsgJyAnICsgKCBvcHRpb25zLmNsYXNzIHx8ICcnICkudHJpbSgpIClcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoICd2aWV3Qm94Jywgc3ltYm9sLmdldEF0dHJpYnV0ZSggJ3ZpZXdCb3gnICkgKVxuXG4gICAgICBpZiAoICEoIG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy5oZWlnaHQgfHwgb3B0aW9ucy5zY2FsZSApICkge1xuXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgIHN5bWJvbC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHN5bWJvbC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKVxuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmICggb3B0aW9ucy53aWR0aCApICBzdmcuc2V0QXR0cmlidXRlKCAnd2lkdGgnLCAgb3B0aW9ucy53aWR0aCApXG4gICAgICAgIGlmICggb3B0aW9ucy5oZWlnaHQgKSBzdmcuc2V0QXR0cmlidXRlKCAnaGVpZ2h0Jywgb3B0aW9ucy5oZWlnaHQgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ZnXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIFwiJytuYW1lKydcIiBzdmcgc3ltYm9sLiBFbnN1cmUgdGhhdCBzdmcgc2NyaXB0cyBhcmUgbG9hZGVkJylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdmdzKCl7XG4gICAgaWYgKCAhbmFtZXMgKSB7XG4gICAgICBuYW1lcyA9IHt9XG4gICAgICB2YXIgc3ltYm9scyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnc3ZnW2lkXj1lc3ZnXSBzeW1ib2wnICkgKVxuICAgICAgc3ltYm9scy5mb3JFYWNoKCBmdW5jdGlvbiggc3ltYm9sICkge1xuICAgICAgICBuYW1lc1tzeW1ib2wuZGF0YXNldC5uYW1lXSA9IHN5bWJvbFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzXG4gIH1cblxuICB2YXIgZXN2ZyA9IHtcbiAgICBzdmdzOiBzdmdzLFxuICAgIHVzZTogdXNlXG4gIH1cblxuICAvLyBIYW5kbGUgVHVyYm9saW5rcyBwYWdlIGNoYW5nZSBldmVudHNcbiAgaWYgKCB3aW5kb3cuVHVyYm9saW5rcyApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcInR1cmJvbGlua3M6bG9hZFwiLCBmdW5jdGlvbiggZXZlbnQgKSB7IG5hbWVzID0gbnVsbDsgZXN2Zy5zdmdzKCkgfSlcbiAgfVxuXG4gIGlmKCB0eXBlb2YoIG1vZHVsZSApICE9ICd1bmRlZmluZWQnICkgeyBtb2R1bGUuZXhwb3J0cyA9IGVzdmcgfVxuICBlbHNlIHdpbmRvdy5lc3ZnID0gZXN2Z1xuXG59KSgpIiwiKGZ1bmN0aW9uKCl7XG5cbiAgZnVuY3Rpb24gZW1iZWQoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXN2Zy1zdmctaWNvbnMnKSkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsICc8c3ZnIGlkPVwiZXN2Zy1zdmctaWNvbnNcIiBkYXRhLXN5bWJvbC1jbGFzcz1cInN2Zy1zeW1ib2xcIiBkYXRhLXByZWZpeD1cInN2Z1wiIHZlcnNpb249XCIxLjFcIiBzdHlsZT1cImhlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlXCIgZGF0YS10dXJib2xpbmtzLXBlcm1hbmVudD48c3ltYm9sIGlkPVwic3ZnLWFuZ2xlLWRvd25cIiBkYXRhLW5hbWU9XCJhbmdsZS1kb3duXCIgdmlld0JveD1cIjAgMCAyNyAxNVwiIHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIxNVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0yNS4zMDQuMDA1Yy4wOTIuMDEyLjExNi4wMTIuMjA2LjAzNi4xMzUuMDM2LjI2My4wOTYuMzc3LjE3Ni4zNDguMjQ0LjU0NS42NjUuNTA4IDEuMDg4YTEuMTk2IDEuMTk2IDAgMCAxLS4yNzcuNjY2Yy0uMDIyLjAyNy0uMDQ3LjA1Mi0uMDcuMDc4bC0xMiAxMmMtLjAyNi4wMjMtLjA1MS4wNDgtLjA3OC4wN2ExLjE5OCAxLjE5OCAwIDAgMS0xLjU0MiAwYy0uMDI3LS4wMjItLjA1Mi0uMDQ3LS4wNzctLjA3bC0xMi0xMkMuMjg4IDEuOTguMjcgMS45NjUuMjE2IDEuODg4YTEuMTkzIDEuMTkzIDAgMCAxLS4xNzYtLjM3N0ExLjIxIDEuMjEgMCAwIDEgLjc4OS4wNzJhMS4yIDEuMiAwIDAgMSAxLjA5OC4xNDVjLjA3Ny4wNTMuMDkyLjA3Mi4xNjEuMTM0bDExLjE1MSAxMS4xNTJMMjQuMzUxLjM1MWwuMDc3LS4wN2MuMDczLS4wNTcuMDktLjA3NC4xNzEtLjEyLjEyMS0uMDcuMjU0LS4xMTkuMzkyLS4xNDMuMDkyLS4wMTYuMTE1LS4wMTQuMjA4LS4wMThsLjEwNS4wMDV6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LWRvd24tY2lyY2xlXCIgZGF0YS1uYW1lPVwiYXJyb3ctZG93bi1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIyLjIxOCAxOC45NDNsLTUuMjQzIDUuMjQzYTEuMjE3IDEuMjE3IDAgMCAxLS45NTEuNDc5Yy0uMDA1IDAtLjAxLS4wMDUtLjAxNy0uMDA1LS4wMDggMC0uMDEzLjAwNS0uMDIuMDA1LS4zMTUgMC0uNjI5LS4xMjEtLjg3LS4zNTlsLTUuMzYxLTUuMzYzYTEuMjI1IDEuMjI1IDAgMCAxIDAtMS43MzggMS4yMyAxLjIzIDAgMCAxIDEuNzM4IDBsMy4zMDEgMy4zMDFWOS4zMjJhMS4yMyAxLjIzIDAgMCAxIDIuNDU4IDBWMjAuNDNsMy4yMjctMy4yMjVhMS4yMyAxLjIzIDAgMCAxIDEuNzM4IDAgMS4yMyAxLjIzIDAgMCAxIDAgMS43MzhcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctYXJyb3ctdXAtY2lyY2xlXCIgZGF0YS1uYW1lPVwiYXJyb3ctdXAtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMi4yOTQgMTQuNzk4YTEuMjI1IDEuMjI1IDAgMCAxLS44Ny4zNTljLS4zMTUgMC0uNjI3LS4xMTgtLjg2OC0uMzU5bC0zLjMwMy0zLjMwNXYxMS4xODhhMS4yMyAxLjIzIDAgMCAxLTIuNDU4IDBWMTEuNTY5bC0zLjIyNyAzLjIyOWExLjIyOSAxLjIyOSAwIDAgMS0xLjczOC0xLjczN2w1LjI0My01LjI0OGExLjIyIDEuMjIgMCAwIDEgLjk1MS0uNDc5Yy4wMDcgMCAuMDEyLjAwNS4wMTkuMDA1LjAwOCAwIC4wMTMtLjAwNS4wMi0uMDA1LjMyNyAwIC42MzkuMTMuODY4LjM1OWw1LjM2MyA1LjM2OGExLjIzIDEuMjMgMCAwIDEgMCAxLjczN1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1iYWNrdXBcIiBkYXRhLW5hbWU9XCJiYWNrdXBcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2LjAzOSAyMy44ODlhMzMuMjQgMzMuMjQgMCAwIDEtMi43MDUuMTExQzguMDQ3IDI0IDIuNDgzIDIyLjY1NiAwIDIwLjQ4M3YyLjg1YzAgMy4zNjQgNS44NTYgNiAxMy4zMzQgNiAxLjM1OCAwIDIuNjYxLS4wODggMy44ODgtLjI1QTguNjA5IDguNjA5IDAgMCAxIDE2IDI0LjY2N2MwLS4yNjMuMDE1LS41MjIuMDM5LS43Nzh6bS0yLjcwNi0xLjIyMmMxLjAwNCAwIDEuOTg4LS4wNDcgMi45NDMtLjEzMWE4LjY4NiA4LjY4NiAwIDAgMSAzLjgwNy01LjIxMiAzNC41ODUgMzQuNTg1IDAgMCAxLTYuNzUuNjc2QzguMDQ3IDE4IDIuNDgzIDE2LjY1NiAwIDE0LjQ4M1YxOGMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40MzlWOC44OTJDMjMuODE5IDEwLjgwNyAxOC4zNzcgMTIgMTMuMzMzIDEyIDguMDQ3IDEyIDIuNDgzIDEwLjY1NiAwIDguNDgzVjEyYzAgMi4xMTMgNS45NDcgNC42NjcgMTMuMzMzIDQuNjY3em0wLTZjNi4xMDYgMCAxMS41LTEuNjgzIDEzLjMzNC0zLjQzOFY2YzAtMy4zNjQtNS44NTgtNi0xMy4zMzQtNlMwIDIuNjM2IDAgNmMwIDIuMTEzIDUuOTQ4IDQuNjY3IDEzLjMzMyA0LjY2N3pcIiBmaWxsLW9wYWNpdHk9XCIuNTAyXCIvPjxwYXRoIGQ9XCJNMjggMjUuMzMzaC0yLjY2N1YyOEEuNjY3LjY2NyAwIDAgMSAyNCAyOHYtMi42NjdoLTIuNjY3YS42NjYuNjY2IDAgMSAxIDAtMS4zMzNIMjR2LTIuNjY3YS42NjcuNjY3IDAgMCAxIDEuMzMzIDBWMjRIMjhhLjY2Ny42NjcgMCAwIDEgMCAxLjMzM20tMy4zMzMtOGMtNC4wNDQgMC03LjMzNCAzLjI5LTcuMzM0IDcuMzM0UzIwLjYyMyAzMiAyNC42NjcgMzJDMjguNzA5IDMyIDMyIDI4LjcxMSAzMiAyNC42NjdjMC00LjA0NC0zLjI5MS03LjMzNC03LjMzMy03LjMzNFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jaGVjay1jaXJjbGVcIiBkYXRhLW5hbWU9XCJjaGVjay1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTZcIiBjeT1cIjE2XCIgcj1cIjE2XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTI0LjkyNSAxMi43NDVMMTQuNzA0IDIzLjk0NGwtNy41ODktNy41ODdhMS4yMiAxLjIyIDAgMCAxIDAtMS43MzIgMS4yMTYgMS4yMTYgMCAwIDEgMS43MzIgMGw1Ljc3NiA1Ljc3NSA4LjQ5MS05LjMwN2ExLjIyNiAxLjIyNiAwIDEgMSAxLjgxMSAxLjY1MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jbHVzdGVyXCIgZGF0YS1uYW1lPVwiY2x1c3RlclwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMTYgMzJhMi45MDYgMi45MDYgMCAwIDEtLjUwNS0uMDQ1IDIuODM2IDIuODM2IDAgMCAxLTEuNDc1LS43NjhBMjkzNi42MDMgMjkzNi42MDMgMCAwIDEgLjgxMyAxNy45OGEyLjgxMyAyLjgxMyAwIDAgMSAwLTMuOTZDNS4yMDEgOS42MDQgOS42MDQgNS4yMDEgMTQuMDIuODEzYTIuODEzIDIuODEzIDAgMCAxIDMuOTYgMGM0LjQxNiA0LjM4OCA4LjgxOSA4Ljc5MSAxMy4yMDcgMTMuMjA3YTIuODEzIDIuODEzIDAgMCAxIDAgMy45NkEyOTM2LjYwMyAyOTM2LjYwMyAwIDAgMSAxNy45OCAzMS4xODdhMi44NzggMi44NzggMCAwIDEtLjUzMy40MTQgMi44MSAyLjgxIDAgMCAxLTEuMzc5LjM5OEwxNiAzMnptMC0xLjg4M2EuOTI3LjkyNyAwIDAgMCAuNjU3LS4yN2M0LjQxMi00LjM4NCA4LjgzOS04Ljc1NSAxMy4xOTUtMTMuMTk1YS45MDEuOTAxIDAgMCAwIC4xODEtLjI2My45NDcuOTQ3IDAgMCAwLS4xMDYtLjk1NC45MDEuOTAxIDAgMCAwLS4wNzUtLjA4NyA5NzcuODUgOTc3Ljg1IDAgMCAwLTEzLjItMTMuMi45MDEuOTAxIDAgMCAwLS4yNjMtLjE4MS45NDcuOTQ3IDAgMCAwLS45NS4xMDIgMS4xNDUgMS4xNDUgMCAwIDAtLjA5MS4wNzkgOTc3Ljg1IDk3Ny44NSAwIDAgMC0xMy4yIDEzLjIuOTYyLjk2MiAwIDAgMC0uMTgxLjI2My45NDcuOTQ3IDAgMCAwIC4xMDYuOTU0Yy4wMjMuMDMxLjA0OS4wNi4wNzUuMDg3YTk3Ny44NSA5NzcuODUgMCAwIDAgMTMuMiAxMy4yLjkyLjkyIDAgMCAwIC42MzUuMjY1SDE2elwiIGZpbGwtb3BhY2l0eT1cIi41MDJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjxwYXRoIGQ9XCJNMTcuNDgyIDI2LjkyOWwtLjg0Ny44NDdhLjg5Ny44OTcgMCAwIDEtMS4yNyAwTDQuMjI0IDE2LjYzNWEuODk3Ljg5NyAwIDAgMSAwLTEuMjdMMTUuMzY1IDQuMjI0YS44OTcuODk3IDAgMCAxIDEuMjcgMGw0LjA0OSA0LjA0OXY1LjQ1N2EyLjM1MyAyLjM1MyAwIDAgMC0xLjcwOCAxLjk3MSAyLjM1MiAyLjM1MiAwIDAgMCAyLjMzNSAyLjY1NGwuMDYxLS4wMDFhMi4zODIgMi4zODIgMCAwIDAgLjk0OC0uMjI2IDIuMzU3IDIuMzU3IDAgMCAwLS4xMzItNC4zMTQgMi42IDIuNiAwIDAgMC0uMjQ5LS4wODRWOS41MjhsNS44MzcgNS44MzdhLjg5Ny44OTcgMCAwIDEgMCAxLjI3bC02LjYzOSA2LjYzOS00LjUwOS00LjUxdi02LjUwOGEyLjM3NyAyLjM3NyAwIDAgMCAxLjQ5NC0xLjI0OSAyLjM2NiAyLjM2NiAwIDAgMCAuMjA1LTEuMzc5IDIuMzY1IDIuMzY1IDAgMCAwLTEuODk3LTEuOTU3IDIuMzYzIDIuMzYzIDAgMCAwLTEuMzYuMTUxIDIuMzc3IDIuMzc3IDAgMCAwLTEuMjA0IDEuMTY5IDIuMzQgMi4zNCAwIDAgMC0uMTc4IDEuNDQgMi4zNjYgMi4zNjYgMCAwIDAgMS42ODQgMS44MjV2Ni43NjhjLjAwMi4wNDkuMDAxLjA2MS4wMS4xMDkuMDE2LjA5LjA1MS4xNzcuMTA0LjI1MS4wMjguMDQuMDM3LjA0OC4wNy4wODRsNC42OTMgNC42OTQtMS44NzkgMS44NzktNi45NjItNi45NjF2LS44MWEyLjM1OSAyLjM1OSAwIDAgMCAxLjQ4Mi0zLjMxNyAyLjM4IDIuMzggMCAwIDAtMS42NzktMS4yNjggMi4zNzIgMi4zNzIgMCAwIDAtMS4zNi4xNTEgMi4zNTMgMi4zNTMgMCAwIDAtMS40MDYgMS44NjUgMi4zNTIgMi4zNTIgMCAwIDAgMS43MDggMi41Njl2MS4wN2MuMDAxLjAzOS4wMDEuMDQ5LjAwNi4wODlhLjY0Mi42NDIgMCAwIDAgLjE0Ny4zMjJsLjAzMS4wMzIgNy4xNDUgNy4xNDZ6bS02LjcwMS05LjgzYTEuMDcgMS4wNyAwIDAgMCAuNzI4LS4yNzcgMS4xMDcgMS4xMDcgMCAwIDAgLjM0My0uNTczIDEuMTA2IDEuMTA2IDAgMCAwLS42MzgtMS4yNTkgMS4wOTcgMS4wOTcgMCAwIDAtMS40MTkuNTIyIDEuMDkgMS4wOSAwIDAgMC0uMDkzLjcwMyAxLjEgMS4xIDAgMCAwIDEuMDUuODg0aC4wMjl6bTEwLjUzIDBhMS4wNyAxLjA3IDAgMCAwIC43MzktLjI4NWMuMDg3LS4wNzkuMTYxLS4xNzIuMjE5LS4yNzNhMS4wOTkgMS4wOTkgMCAxIDAtLjk4Ni41NThoLjAyOHpNMTYgMTEuMDg1YTEuMDgxIDEuMDgxIDAgMCAwIC43MjktLjI3NyAxLjA5MSAxLjA5MSAwIDAgMCAuMzYxLS45NjMgMS4wOTUgMS4wOTUgMCAwIDAtMS4wNzYtLjk1OCAxLjA5NSAxLjA5NSAwIDAgMC0xLjA5OS45MjQgMS4wODggMS4wODggMCAwIDAgLjMzNy45NzkgMS4wOCAxLjA4IDAgMCAwIC43MTkuMjk1SDE2elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNvcHlcIiBkYXRhLW5hbWU9XCJjb3B5XCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGcgZmlsbC1ydWxlPVwibm9uemVyb1wiPjxwYXRoIGQ9XCJNMjIuNjY3IDQuNjY3QS42NjcuNjY3IDAgMCAwIDIyIDRoLTMuMzMzdjEwLjQ5NWE5LjkxNiA5LjkxNiAwIDAgMSA0LTEuMTI3VjQuNjY3ek00IDI1LjMzM1Y0SC42NjdBLjY2Ny42NjcgMCAwIDAgMCA0LjY2N1YyNmEzLjMzOCAzLjMzOCAwIDAgMCAzLjMzMyAzLjMzM2gxMi4wMTlhOS45NSA5Ljk1IDAgMCAxLTEuODE3LTRINHpcIiBmaWxsLW9wYWNpdHk9XCIuMzAyXCIvPjxwYXRoIGQ9XCJNMTQgMTJINy4zMzNhLjY2Ny42NjcgMCAwIDAgMCAxLjMzM0gxNEEuNjY3LjY2NyAwIDEgMCAxNCAxMk0xNCAxNC42NjdINy4zMzNhLjY2Ni42NjYgMCAxIDAgMCAxLjMzM0gxNGEuNjY3LjY2NyAwIDAgMCAwLTEuMzMzTTE0LjY2NyAxOGEuNjY3LjY2NyAwIDAgMC0uNjY3LS42NjdINy4zMzNhLjY2Ny42NjcgMCAwIDAgMCAxLjMzNEgxNGEuNjY3LjY2NyAwIDAgMCAuNjY3LS42NjdNNy4zMzMgMjBhLjY2Ny42NjcgMCAwIDAgMCAxLjMzM2g0YS42NjcuNjY3IDAgMSAwIDAtMS4zMzNoLTR6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTYgOS4zMzNoMTAuNjY3YS42NjYuNjY2IDAgMCAwIC42NjYtLjY2NlYzLjMzM2EuNjY2LjY2NiAwIDAgMC0uNjY2LS42NjZoLTIuMDZDMTQuMzMxIDEuMTE1IDEzLjA4NyAwIDExLjMzMyAwIDkuNjg3IDAgOC4zNjMgMS4wMDEgOC4wNiAyLjY2N0g2YS42NjcuNjY3IDAgMCAwLS42NjcuNjY2djUuMzM0YzAgLjM2OC4yOTkuNjY2LjY2Ny42NjZcIiBmaWxsLW9wYWNpdHk9XCIuMzAyXCIvPjxwYXRoIGQ9XCJNMjYuOTY5IDI0SDI0djIuOTY5YS42NjcuNjY3IDAgMCAxLTEuMzMzIDBWMjRoLTIuOTdhLjY2Ny42NjcgMCAwIDEgMC0xLjMzM2gyLjk3di0yLjk3YS42NjYuNjY2IDAgMSAxIDEuMzMzIDB2Mi45N2gyLjk2OWEuNjY3LjY2NyAwIDEgMSAwIDEuMzMzbS0zLjYzNi05LjMzM2MtNC43OCAwLTguNjY2IDMuODg4LTguNjY2IDguNjY2IDAgNC43NzkgMy44ODYgOC42NjcgOC42NjYgOC42NjdDMjguMTEyIDMyIDMyIDI4LjExMiAzMiAyMy4zMzNjMC00Ljc3OC0zLjg4OC04LjY2Ni04LjY2Ny04LjY2NlwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1kZXBsb3ltZW50XCIgZGF0YS1uYW1lPVwiZGVwbG95bWVudFwiIHZpZXdCb3g9XCIwIDAgMTc2IDIwMVwiIHdpZHRoPVwiMTc2XCIgaGVpZ2h0PVwiMjAxXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTg4IDUuOTg1bDgyLjI3MiA0Ny41djk1TDg4IDE5NS45ODVsLTgyLjI3Mi00Ny41di05NUw4OCA1Ljk4NXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1kaWNlXCIgZGF0YS1uYW1lPVwiZGljZVwiIHZpZXdCb3g9XCIwIDAgNDUgMzJcIiB3aWR0aD1cIjQ1XCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMzAuNzYyIDEwLjIzMmEyLjQ3OCAyLjQ3OCAwIDAgMSAuOTA2IDMuMzgybC05LjkgMTcuMTQ4YTIuNDc3IDIuNDc3IDAgMCAxLTMuMzgyLjkwNmwtMTcuMTQ4LTkuOWEyLjQ3OCAyLjQ3OCAwIDAgMS0uOTA2LTMuMzgybDkuOS0xNy4xNDhhMi40NzggMi40NzggMCAwIDEgMy4zODItLjkwNmwxNy4xNDggOS45elwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMi4xMyA1LjI0OWwuMDYxLS4wMDFoMTkuODAyYTIuNDc2IDIuNDc2IDAgMCAxIDIuNDc1IDIuNDc1djE5LjgwMkEyLjQ3NiAyLjQ3NiAwIDAgMSA0MS45OTMgMzBIMjIuMjA4bDIuNDQxLTQuMjI5YTIuMzQgMi4zNCAwIDAgMCAzLjIxOC0yLjE2OWMwLS43NDktLjM1My0xLjQxNi0uOTAxLTEuODQ0bDQuNzAyLTguMTQ0YTIuNDc4IDIuNDc4IDAgMCAwLS45MDYtMy4zODJMMjIuMTMgNS4yNDl6bTE2LjM1IDE2LjAxNGEyLjM0IDIuMzQgMCAwIDEgMCA0LjY3OCAyLjM0IDIuMzQgMCAwIDEtMi4zNC0yLjMzOSAyLjM0IDIuMzQgMCAwIDEgMi4zNC0yLjMzOXptMC0xMS45NTZhMi4zNCAyLjM0IDAgMCAxIDAgNC42NzggMi4zNCAyLjM0IDAgMCAxLTIuMzQtMi4zMzkgMi4zNCAyLjM0IDAgMCAxIDIuMzQtMi4zMzl6TTE5LjcxMiAyMi4zNDVhMi4zNDEgMi4zNDEgMCAwIDEgLjg1NyAzLjE5NiAyLjM0IDIuMzQgMCAwIDEtNC4wNTItMi4zNCAyLjM0IDIuMzQgMCAwIDEgMy4xOTUtLjg1NnpNMTcuMDkzIDEzLjkzYTIuMzQgMi4zNCAwIDEgMS0yLjM0IDQuMDUxIDIuMzQgMi4zNCAwIDAgMSAyLjM0LTQuMDUxek0xNC40NzMgNS41MTRhMi4zNCAyLjM0IDAgMSAxLTIuMzQgNC4wNTIgMi4zNCAyLjM0IDAgMCAxIDIuMzQtNC4wNTJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZG93bmxvYWRcIiBkYXRhLW5hbWU9XCJkb3dubG9hZFwiIHZpZXdCb3g9XCIwIDAgMzMgMzJcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxyZWN0IGZpbGw9XCJub25lXCIvPjxwYXRoIGQ9XCJNMTUuNTAxIDI4LjYyN1YxNi45MmEuOTkzLjk5MyAwIDAgMSAuNTU5LS44OWMuMTEzLS4wNTQuMjMxLS4wODEuMzU1LS4wOTUuMDc0LS4wMDMuMDc0LS4wMDMuMTQ4IDBhMS4xIDEuMSAwIDAgMSAuMzU1LjA5NS45OTYuOTk2IDAgMCAxIC41MTUuNTk5Yy4wMjkuMDk2LjA0LjE5Mi4wNDQuMjkxdjExLjcwN2wyLjU0MS0yLjU0MS4wNDItLjAzOWEuOTk0Ljk5NCAwIDAgMSAuOC0uMjQuOTk3Ljk5NyAwIDAgMSAuODM0LjgzNS45NzkuOTc5IDAgMCAxLS4xMzcuNjYyYy0uMDMuMDQ5LS4wNjUuMDkzLS4xMDIuMTM4LTEuMzggMS40NjItMi44NDIgMi44NDQtNC4yNjQgNC4yNjZsLS4wMy4wMjlhMS4wMDUgMS4wMDUgMCAwIDEtLjU5OS4yNi45NjcuOTY3IDAgMCAxLS41NjctLjEyOS45OS45OSAwIDAgMS0uMjA2LS4xNThjLTEuNDQ4LTEuMzY5LTIuODE4LTIuODE4LTQuMjI2LTQuMjI3YTEuMDM4IDEuMDM4IDAgMCAxLS4yNC0uMzg3Ljk5OC45OTggMCAwIDEgLjQyLTEuMTUyYy4xNDktLjA5Mi4zMTUtLjEzNi40OS0uMTQ3YTEuMDg2IDEuMDg2IDAgMCAxIC4yODQuMDM0Yy4xNy4wNDUuMzE2LjEzNS40NDMuMjU1bDIuNTQxIDIuNTQxem0xMC40MjMtNC45ODRoLTQuNTJjLS4wMzYtLjAwMi0uMDcyLS4wMDItLjEwNy0uMDA2YS45ODUuOTg1IDAgMCAxLS42NDYtLjM0My45OTUuOTk1IDAgMCAxIC4wNzMtMS4zNTYuOTkyLjk5MiAwIDAgMSAuNDY3LS4yNDhjLjA5My0uMDIuMTE4LS4wMTguMjEzLS4wMjNoNC40NDRhNy4yODEgNy4yODEgMCAwIDAgMS4yNjQtLjM0OGMxLjEzMi0uNDE5IDIuMTk0LTEuMTAyIDIuOTA4LTIuMDkuMTY1LS4yMjguMzEtLjQ3LjQzMy0uNzIzLjI4Ny0uNTkuNDUxLTEuMjM0LjUxNi0xLjg4Ni4wMzgtLjM4My4wNDYtLjc3MS4wMTYtMS4xNTVhNS42ODQgNS42ODQgMCAwIDAtLjI0OS0xLjI4NSA1Ljc5OCA1Ljc5OCAwIDAgMC0yLjEyMy0yLjkzMiA1LjY5IDUuNjkgMCAwIDAtMy41NzYtMS4wNzRsLS4xMDMtLjAwMmMtLjA5MS0uMDEyLS4xMTUtLjAxMS0uMjA0LS4wMzdhLjk5MS45OTEgMCAwIDEtLjUwNS0uMzQ1Yy0uMDU2LS4wNzMtLjA2NC0uMDk1LS4xMDgtLjE3NmE4LjYwNCA4LjYwNCAwIDAgMC0xLjQzOC0yLjEzIDguNTE3IDguNTE3IDAgMCAwLTIuMDYzLTEuNjM0IDguMzUgOC4zNSAwIDAgMC0yLjY1OS0uOTUyIDguNTM1IDguNTM1IDAgMCAwLTIuNDA0LS4wNzYgOC4zOTYgOC4zOTYgMCAwIDAtNC43MTggMi4xMjUgOC40ODQgOC40ODQgMCAwIDAtMS44ODcgMi40NzkgOC40MSA4LjQxIDAgMCAwLS44ODEgMy4yOTFsLS4wMTIuMTA0Yy0uMDA4LjAzNC0uMDE0LjA2OS0uMDI0LjEwM2EuOTk1Ljk5NSAwIDAgMS0uOTM2LjcxNmMtLjAzNS4wMDEtLjA3LS4wMDMtLjEwNi0uMDA0LS4xMzYtLjAyLS4yNzEtLjA0OC0uNDA3LS4wNjhhNC4xMzQgNC4xMzQgMCAwIDAtMS40ODMuMDczIDQuMTEzIDQuMTEzIDAgMCAwLTIuNDY3IDEuNzM5IDQgNCAwIDAgMC0uNjM1IDEuNzk5Yy0uMDQuMzkzLS4wMjUuNzk1LjAzIDEuMTg1LjA3NS41MzYuMjQzIDEuMDYxLjUzOSAxLjUxNy4wOS4xMzguMTkuMjY5LjMuMzkyLjYzMy43MDQgMS41NDcgMS4wOTEgMi40NTkgMS4yNzUuMzQxLjA2OS42OTIuMTE2IDEuMDQuMTE5aDUuMTdsLjEwNy4wMDZjLjA5NC4wMTUuMTE4LjAxNS4yMDkuMDQ2YS45ODguOTg4IDAgMCAxLS4yMDkgMS45MThjLS4wMzUuMDA0LS4wNzEuMDA0LS4xMDcuMDA2LTEuNzQ0IDAtMy40ODkuMDE0LTUuMjMzLS4wMDFhNy44OTggNy44OTggMCAwIDEtMS4yNDctLjEzM2MtMS4xODYtLjIyMi0yLjM0Ni0uNy0zLjI1My0xLjUxMWE1LjE1IDUuMTUgMCAwIDEtLjk0OS0xLjEyOSA1LjY5NCA1LjY5NCAwIDAgMS0uNzY1LTIuMTA3IDcuMjMgNy4yMyAwIDAgMS0uMDU3LTEuNzgxYy4wNDYtLjQ1Ni4xNDQtLjkwNi4yOTEtMS4zMzlhNi4wNjYgNi4wNjYgMCAwIDEgMy45OTctMy44MzYgNi4wNjcgNi4wNjcgMCAwIDEgMS44ODktLjI0OGMuMDE5LS4xMTUuMDQtLjIzLjA2MS0uMzQ1YTEwLjQxOCAxMC40MTggMCAwIDEgMy42OTctNi4xMjEgMTAuNCAxMC40IDAgMCAxIDIuOTQ3LTEuNjY3IDEwLjQwNSAxMC40MDUgMCAwIDEgMy42NzQtLjYzYy45MTguMDEyIDEuODMxLjEzNyAyLjcxNS4zODVhMTAuNDU4IDEwLjQ1OCAwIDAgMSA2LjMwOCA1LjAxNmwuMDA0LjAwNmE3LjQ3NyA3LjQ3NyAwIDAgMSAxLjI2NS4xNjIgNy42MjggNy42MjggMCAwIDEgMS42NTguNTU2IDcuNzQgNy43NCAwIDAgMSA0LjE2NSA0Ljk0MiA4LjE0NiA4LjE0NiAwIDAgMSAuMjE4IDMuMDk3IDcuNDkyIDcuNDkyIDAgMCAxLS42OSAyLjQxMiA2LjkwMSA2LjkwMSAwIDAgMS0xLjEwMyAxLjYyNGMtLjkwMy45OTMtMi4wNzYgMS43MTMtMy4zMyAyLjE3N2E4Ljg4NCA4Ljg4NCAwIDAgMS0xLjcxMi40NThjLS4wNDcuMDA2LS4wNDYuMDA2LS4wOTMuMDFsLS4wNjguMDAzelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWdlYXItY2lyY2xlXCIgZGF0YS1uYW1lPVwiZ2Vhci1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48ZyBmaWxsLXJ1bGU9XCJub256ZXJvXCI+PHBhdGggZD1cIk0yNC4yNTMgNi45NzFhLjk3NS45NzUgMCAwIDEgLjQ0NS4yMzhjLjA1NC4wNTMuMDY0LjA2OS4xMTEuMTI5IDEuMDk1IDEuNzA5IDIuMDM0IDMuNTE0IDMuMDQ5IDUuMjcyYS45MjcuOTI3IDAgMCAxLS4wOCAxLjAzN2MtLjA3My4wOS0uMTYuMTU4LS4yNTcuMjJsLTEuNjQuOTQ4Yy4wMjEuMTU1LjAzMy4zMDkuMDQ3LjQ2NS4wMTMuMTkzLjAyMy4zODUuMDI2LjU3OS4wMDMuNDI0LS4wMjMuODQzLS4wNjkgMS4yNjRsLS4wMDIuMDEzIDEuNjQyLjk0OS4wNzEuMDQ1Yy4wNjkuMDUzLjEzMS4xMDcuMTg2LjE3NGEuOTI5LjkyOSAwIDAgMSAuMTE5Ljk2MmMtLjkzMyAxLjgwMy0yLjAyNiAzLjUxOS0zLjA0MSA1LjI3N2ExLjA1IDEuMDUgMCAwIDEtLjE1Ni4yMDFjLS4yMDYuMi0uNS4yOTMtLjc4My4yNDlhMS4wMyAxLjAzIDAgMCAxLS4zMTktLjExM2wtMS42MzUtLjk0OWMtLjEyOS4wOTctLjI2Mi4xODctLjM5Ni4yNzgtLjE5MS4xMjQtLjE5LjEyMy0uMzg1LjI0My0uMzg5LjIyOS0uNzg3LjQzNS0xLjE5OS42MjNsLS4wMTQuMDA2djEuOTA4bC0uMDA0LjA4NWExLjEwNSAxLjEwNSAwIDAgMS0uMDU4LjI0OC45MjcuOTI3IDAgMCAxLS43NzMuNTgzYy0yLjAyOS4wOTQtNC4wNjIuMDA0LTYuMDk0LjAwNGEuOTI1LjkyNSAwIDAgMS0uODU3LS41ODcgMS4wNTYgMS4wNTYgMCAwIDEtLjA2My0uMzMzdi0xLjkwN2MtLjE0Mi0uMDYxLS4yODItLjEyOC0uNDIyLS4xOTUtLjIwMy0uMTAyLS4yMDMtLjEwMS0uNDA0LS4yMDdhMTIuMDcxIDEyLjA3MSAwIDAgMS0xLjE2OC0uNzMxbC0uMDI3LS4wMi0xLjY1OS45NTMtLjA3NS4wMzhhLjkyNC45MjQgMCAwIDEtMS4xMzQtLjMwNWMtMS4wOTUtMS43MS0yLjAzNC0zLjUxNS0zLjA0OS01LjI3NGExLjAwMyAxLjAwMyAwIDAgMS0uMTEyLS4zMTkuOTI2LjkyNiAwIDAgMSAuMjQ4LS43ODFjLjA2MS0uMDYzLjEyOC0uMTEuMjAxLS4xNTZsMS42NDEtLjk0OGMtLjAyMS0uMTU2LS4wMzMtLjMxMS0uMDQ2LS40NjctLjAxNC0uMjMxLS4wMTQtLjIzLS4wMjMtLjQ2MS0uMDA2LS40NjMuMDE4LS45MjEuMDY5LTEuMzgxbC4wMDEtLjAxNC0xLjYzOS0uOTQ3LS4wNzEtLjA0NmExLjA5NiAxLjA5NiAwIDAgMS0uMTg2LS4xNzQuOTMuOTMgMCAwIDEtLjE5Mi0uNzE4Yy4wMTQtLjA4Ni4wNDEtLjE2NC4wNzQtLjI0NC45MzQtMS44MDMgMi4wMjktMy41MTggMy4wNDYtNS4yNzYuMDYyLS4wOTcuMTI5LS4xODMuMjItLjI1NmEuOTI4LjkyOCAwIDAgMSAuOC0uMTc2Yy4wODQuMDIxLjE1OS4wNTYuMjM1LjA5NmwxLjY1Mi45NTFjLjA3LS4wNTMuMTQzLS4xMDMuMjE0LS4xNTMuMTkxLS4xMjkuMTktLjEyOS4zODUtLjI1My40NTQtLjI3OC45MjEtLjUyMyAxLjQwNy0uNzQzbC4wMTQtLjAwNlY0Ljk2MmwuMDA0LS4wODVhLjkyNS45MjUgMCAwIDEgLjU4NC0uNzczYy4wODEtLjAzMS4xNjItLjA0Ni4yNDgtLjA1OCAyLjAyOC0uMDk0IDQuMDYyLS4wMDQgNi4wOTMtLjAwNC4xMTUuMDA2LjIyNC4wMi4zMzIuMDYyYS45My45MyAwIDAgMSAuNTUzLjYwN2MuMDIzLjA4My4wMzEuMTY1LjAzNS4yNTFWNi44N2MuMTQyLjA2MS4yODEuMTI5LjQyLjE5Ni4yMDIuMTAyLjIwMS4xMDIuNDAxLjIwOC4zOTkuMjI0Ljc4MS40NjYgMS4xNTMuNzMzbC4wMi4wMTQgMS42MjgtLjk0Ny4wNzYtLjAzOWMuMTM3LS4wNTYuMjY1LS4wODIuNDEzLS4wODUuMDg1LjAwNy4wODUuMDA2LjE2OS4wMjF6bS0yLjIyOSAxNC45NGMuMTE3LjAyNC4yMTguMDU5LjMyNC4xMTRsMS4zNzkuOCAyLjA4MS0zLjYwNy0xLjM4OS0uODAyYy0uMDY1LS4wNDEtLjA4My0uMDUtLjE0MS0uMWEuOTE5LjkxOSAwIDAgMS0uMzE3LS43NjhjLjAyNy0uMjE2LjA2OC0uNDMuMDk3LS42NDUuMDQtLjM2OS4wNjctLjczOS4wNTUtMS4xMWE5LjUyNSA5LjUyNSAwIDAgMC0uMTQzLTEuMzA0bC0uMDEtLjA4NWEuOTIxLjkyMSAwIDAgMSAuMzE2LS43NjhjLjA1OC0uMDUxLjA3Ni0uMDU5LjE0MS0uMWwxLjM4Ny0uODAyLTIuMDgxLTMuNjA1LTEuMzc0Ljc5OWMtLjA2OC4wMzUtLjA4NC4wNDYtLjE1Ny4wNzJhLjkzLjkzIDAgMCAxLS41OTQuMDA2IDEuMTE0IDEuMTE0IDAgMCAxLS4yMzItLjExNWMtLjEyMy0uMDkzLS4yNC0uMTk1LS4zNjItLjI5MWE4LjkzNSA4LjkzNSAwIDAgMC0xLjA5My0uNzExIDkuNzA1IDkuNzA1IDAgMCAwLTEuMTg4LS41NDFsLS4wNzgtLjAzNGMtLjA2Ni0uMDM3LS4wODQtLjA0NC0uMTQ1LS4wODlhLjkzMi45MzIgMCAwIDEtLjMzMi0uNDg0IDEuMDcgMS4wNyAwIDAgMS0uMDM1LS4yNTJWNS44ODJoLTQuMTY4djEuNjA3YS45MjkuOTI5IDAgMCAxLS4zNjguNzM2Yy0uMDYxLjA0NS0uMDc5LjA1Mi0uMTQ1LjA4OS0uMTk5LjA4Ny0uNDAyLjE2MS0uNjAyLjI0Ni0uNzQ1LjMzNy0xLjQ0Ni43NDgtMi4wNzIgMS4yNzZsLS4wNjkuMDUyYS45MTkuOTE5IDAgMCAxLS44MjYuMTEzYy0uMDczLS4wMjUtLjA4OS0uMDM2LS4xNTctLjA3Mkw4LjMzIDkuMTI2bC0yLjA4NiAzLjYwOCAxLjM4Ny44MDJjLjA2NS4wNDEuMDgyLjA1LjE0MS4xYS45MjIuOTIyIDAgMCAxIC4zMTYuNzdjLS4wMi4xNTQtLjA0OS4zMDctLjA3My40NmE4LjE1NyA4LjE1NyAwIDAgMC0uMDggMS4yOTdjLjAxMS40MzcuMDY1Ljg2OC4xNCAxLjI5N2wuMDExLjA4NmMuMDAzLjA3Ny4wMDYuMDk2LS4wMDIuMTcyYS45MjguOTI4IDAgMCAxLS40NTUuNjk4bC0xLjM4OS44MDIgMi4wODQgMy42MTEgMS40MDMtLjgwNmEuOTIzLjkyMyAwIDAgMSAuODMxLS4wNDNjLjA3MS4wMzIuMDg2LjA0NC4xNTEuMDg1LjEyMS4wOTIuMjM3LjE5Mi4zNTcuMjg2LjMuMjI1LjYxMS40MzIuOTM4LjYxNy40NC4yNDkuODk5LjQ1NSAxLjM3MS42MzZsLjA3OC4wMzRjLjA2Ni4wMzcuMDg0LjA0NC4xNDQuMDg5YS45MTguOTE4IDAgMCAxIC4zNjguNzM2djEuNjA2aDQuMTY4di0xLjYwNmExLjA4IDEuMDggMCAwIDEgLjAzNS0uMjUzLjkyNy45MjcgMCAwIDEgLjMzMi0uNDgzYy4wNi0uMDQ1LjA3OC0uMDUyLjE0NC0uMDg5LjE5Ny0uMDg2LjQtLjE2MS41OTgtLjI0NmE5LjQgOS40IDAgMCAwIDEuMzExLS43MTYgOC42NyA4LjY3IDAgMCAwIC43NDQtLjU2MWwuMDY5LS4wNTNjLjA2NS0uMDQuMDgxLS4wNTIuMTUxLS4wODMuMTA4LS4wNDguMjE4LS4wNjcuMzM1LS4wNzcuMDg2LjAwMS4wODYgMCAuMTcyLjAwOXpcIi8+PHBhdGggZD1cIk0xNi4xNDggMTEuMDUyYTUuMDQ4IDUuMDQ4IDAgMCAxIDIuMDA5LjQ4NCA0Ljk0OCA0Ljk0OCAwIDAgMSAyLjQwMiAyLjUyMyA0Ljk0IDQuOTQgMCAwIDEgLjI4NyAyLjkwOSA0Ljk2NCA0Ljk2NCAwIDAgMS0yLjc5NyAzLjQ5NyA0LjkyOSA0LjkyOSAwIDAgMS01LjMzOS0uODQzIDQuODkzIDQuODkzIDAgMCAxLTEuNTM3LTIuNzc1IDQuOTQyIDQuOTQyIDAgMCAxIC40MDktMy4wMDYgNC45NjggNC45NjggMCAwIDEgMS45ODctMi4xMzggNS4wNDEgNS4wNDEgMCAwIDEgMi4wNzQtLjYzOCA2LjA4IDYuMDggMCAwIDEgLjUwNS0uMDEzem0tLjIwNiAxLjgzOWEzLjE2IDMuMTYgMCAwIDAtMS4yNTcuMzAzIDMuMTE2IDMuMTE2IDAgMCAwLTEuNjUyIDIuMDEgMy4xMTYgMy4xMTYgMCAwIDAgLjE3NSAyLjA0MiAzLjA5MSAzLjA5MSAwIDAgMCAxLjU0NCAxLjU0MiAzLjA5NSAzLjA5NSAwIDAgMCAyLjQwMS4wNTkgMy4xMDIgMy4xMDIgMCAwIDAgMS42MTYtMS40NjcgMy4wODUgMy4wODUgMCAwIDAtMi44MjctNC40ODl6XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWdlYXJcIiBkYXRhLW5hbWU9XCJnZWFyXCIgdmlld0JveD1cIjAgMCAzMiAzM1wiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0yMy4wMTggMS44NDJhMi4zNDIgMi4zNDIgMCAwIDEgMS42NTQuODg0Yy4zMzYuNDMxLjQ4Ni45NjkuNDk1IDEuNTA5LjAwNy4zODQtLjA1NC43NjItLjEzOSAxLjEzNWwtLjU4NSAyLjE0OC4wMjEuMDIxLjAxOS4wMiAyLjE0MS0uNTg0Yy4wOTgtLjAyNC4wOTgtLjAyMy4xOTctLjA0Ni4yLS4wNC40MDEtLjA3My42MDUtLjA4Ny40Mi0uMDMuODQ5LjAxIDEuMjQ2LjE1Ny4yNy4xLjUyMi4yNS43MzYuNDQzLjM5Ny4zNi42NjguODY3Ljc0MSAxLjM5OS4wMzYuMjYuMDI0LjUyNS0uMDMxLjc4MS0uMDk1LjQ0NC0uMzEzLjg1MS0uNTgzIDEuMjEyYTYuMDc0IDYuMDc0IDAgMCAxLS40MDMuNDc0bC0xLjU3MiAxLjU1OS4wMDguMDMuMDEuMDM2Yy43MTYuMTg5IDEuNDI2LjM5OSAyLjE0OC41NjcuMDkxLjAyNi4wOS4wMjYuMTgxLjA1NS4xOTQuMDY1LjM4NC4xMzcuNTY4LjIyNy4zNjIuMTc2LjY5OS40MS45NjMuNzE2LjE3NC4yLjMxNS40MjguNDEuNjc2LjIwOC41NC4yMDMgMS4xNjUtLjAxNiAxLjcwMi0uMDkxLjIyNC0uMjIuNDMyLS4zNzcuNjE1LS4yODYuMzMzLS42NTkuNTc5LTEuMDU1Ljc2LS4yMi4xMDEtLjQ0OS4xOC0uNjguMjUxbC0yLjE0Mi41NjYtLjAxLjAzNi0uMDA4LjAzIDEuNTY3IDEuNTU0YTQuNTAxIDQuNTAxIDAgMCAxIC41MTcuNjI4Yy4yMzYuMzQ5LjQxNi43NC40ODggMS4xNTYuMDQ5LjI4NS4wNDUuNTc3LS4wMTYuODU5YTIuMzQ5IDIuMzQ5IDAgMCAxLS44NDEgMS4zNDMgMi4yNTQgMi4yNTQgMCAwIDEtLjYzOC4zNDVjLS40MTMuMTQ1LS44NTkuMTcxLTEuMjkyLjEyOWE1LjM5NiA1LjM5NiAwIDAgMS0uNzE1LS4xMjNsLTIuMTQ3LS41ODMtLjAyLjAyLS4wMi4wMi41ODMgMi4xNDJjLjAyNS4wOTkuMDI0LjA5OS4wNDcuMTk4LjA0LjIuMDcyLjQwMS4wODcuNjA1YTMuMDIgMy4wMiAwIDAgMS0uMTM5IDEuMTkxIDIuMjkgMi4yOSAwIDAgMS0uNDIuNzQxIDIuMzQgMi4zNCAwIDAgMS0xLjQ0Mi43OWMtLjI2LjAzNi0uNTI0LjAyNC0uNzgtLjAzMS0uNjU0LS4xMzktMS4yMDctLjU0LTEuNjg4LS45ODhsLTEuNTU2LTEuNTY5LS4wMzEuMDA4LS4wMzcuMDEtLjU2MyAyLjEzM2MtLjAyOS4wOTgtLjAyOC4wOTctLjA1OS4xOTQtLjA1NC4xNjEtLjExMi4zMi0uMTgyLjQ3NC0uMTg5LjQxNS0uNDUxLjgwMi0uODAzIDEuMDk0YTIuMyAyLjMgMCAwIDEtLjY5LjM5NSAyLjM0OCAyLjM0OCAwIDAgMS0xLjU4Ni0uMDE0IDIuMjY5IDIuMjY5IDAgMCAxLS42NzQtLjQwMWMtLjM1OS0uMzA4LS42MTYtLjcxNy0uODAxLTEuMTQ4YTYuMSA2LjEgMCAwIDEtLjIxLS41ODZsLS41NjUtMi4xNDEtLjAzNi0uMDEtLjAzLS4wMDgtMS41NTUgMS41NjdjLS4wNzMuMDctLjA3My4wNy0uMTQ3LjEzOGE0Ljg0MiA0Ljg0MiAwIDAgMS0uMzk1LjMyIDMuMDgyIDMuMDgyIDAgMCAxLTEuMTg2LjUzNmMtLjI4LjA1NC0uNTcuMDU4LS44NTIuMDA2YTIuMzQ3IDIuMzQ3IDAgMCAxLTEuMzY2LS44MDQgMi4yNDggMi4yNDggMCAwIDEtLjM4NS0uNjg3Yy0uMTU2LS40NDYtLjE3NS0uOTI3LS4xMi0xLjM5NGE2LjA0IDYuMDQgMCAwIDEgLjExMi0uNjEybC41ODUtMi4xNDktLjAyLS4wMi0uMDE5LS4wMi0yLjE0MS41ODJjLS4wOTkuMDI0LS4wOTguMDI0LS4xOTcuMDQ2YTQuOTk0IDQuOTk0IDAgMCAxLS41MDIuMDggMy4wNTkgMy4wNTkgMCAwIDEtMS4yOTYtLjEyOCAyLjI5NCAyLjI5NCAwIDAgMS0uNzQyLS40MiAyLjM1NyAyLjM1NyAwIDAgMS0uNzktMS40NDIgMi4yNzIgMi4yNzIgMCAwIDEgLjAxOS0uNzIyYy4xMjctLjY3Ny41MzgtMS4yNTEuOTk4LTEuNzQ1bDEuNTcxLTEuNTYtLjAwOS0uMDMtLjAwOS0uMDM2LTIuMTM0LS41NjMtLjE5NC0uMDU4YTQuODcyIDQuODcyIDAgMCAxLS41NjgtLjIyNyAyLjk3MiAyLjk3MiAwIDAgMS0xLjAwMS0uNzU5IDIuMjkzIDIuMjkzIDAgMCAxLS4zOTQtLjY4OSAyLjM0MiAyLjM0MiAwIDAgMSAuMDM3LTEuNjQ1Yy4wOTktLjI0Mi4yNDItLjQ2Ni40MTctLjY2LjQ0Ni0uNDk2IDEuMDY5LS43NzQgMS42OTYtLjk2OGwyLjE0MS0uNTY1LjAwOS0uMDM1LjAwOS0uMDMxLTEuNTY2LTEuNTU0Yy0uMDctLjA3My0uMDctLjA3My0uMTM5LS4xNDgtLjQxNC0uNDY3LS43Ni0xLjAxNS0uODY2LTEuNjM5YTIuMzA3IDIuMzA3IDAgMCAxIC4wMDQtLjc5NSAyLjM0OSAyLjM0OSAwIDAgMSAuODA3LTEuMzY2Yy4yMDMtLjE2Ny40MzUtLjI5Ni42ODMtLjM4My40MTQtLjE0NS44NTktLjE3MiAxLjI5My0uMTMxLjI0Mi4wMjMuNDc5LjA2OS43MTYuMTIzbDIuMTQ3LjU4NS4wMjEtLjAyMS4wMi0uMDItLjU4NC0yLjE0MWMtLjAyNS0uMDk5LS4wMjUtLjA5OS0uMDQ3LS4xOTlhNC43NSA0Ljc1IDAgMCAxLS4wODctLjYwNGMtLjAzLS40Mi4wMS0uODUuMTU3LTEuMjQ2LjA5My0uMjUuMjI5LS40ODQuNDAyLS42ODcuMzQ5LS40MDcuODUxLS42OSAxLjM3OS0uNzc4LjI2LS4wNDQuNTI3LS4wNC43ODYuMDA5LjQzMS4wODEuODI5LjI4MSAxLjE4NC41MzMuMTk4LjE0MS4zODEuMjk5LjU1OS40NjRsMS41NTkgMS41NzEuMDMxLS4wMDguMDM1LS4wMS41NjMtMi4xMzYuMDU5LS4xOTNjLjA1NC0uMTYxLjExMi0uMzIuMTgzLS40NzRhMy4wNiAzLjA2IDAgMCAxIC43NTgtMS4wNTZjLjIzMi0uMjAxLjUwMi0uMzU4Ljc5NC0uNDUyYTIuMzQ0IDIuMzQ0IDAgMCAxIDEuNTI3LjAzNWMuMjQ2LjA5Mi40NzQuMjMuNjc0LjQwMS4zNTguMzA4LjYxNS43MTYuOCAxLjE0Ny4wODIuMTkxLjE0OC4zODcuMjEuNTg1bC41NjUgMi4xNDMuMDM1LjAwOS4wMzIuMDA5IDEuNTUzLTEuNTY2Yy4wNzMtLjA3LjA3My0uMDcuMTQ4LS4xMzkuNDUzLS40MDEuOTc5LS43MzkgMS41ODEtLjg1NS4xNTgtLjAzMS4zMTgtLjA0My40NzktLjA0My4wNjIuMDAxLjA2MS4wMDEuMTIzLjAwNXptLTYuOTMyIDcuNDc5YTYuNjc4IDYuNjc4IDAgMCAxIDIuNzM4LjYyNCA2LjczNiA2LjczNiAwIDAgMSAyLjk3MSAyLjczIDYuNjcgNi42NyAwIDAgMSAuODIgNC4yNTggNi42NiA2LjY2IDAgMCAxLTEuOTQ4IDMuODQ3IDYuNjkgNi42OSAwIDAgMS0yLjA2NiAxLjM3NSA2LjcwNyA2LjcwNyAwIDAgMS01LjA1LjA2MiA2LjY5NSA2LjY5NSAwIDAgMS00LjE1My01LjIwMSA2LjY4IDYuNjggMCAwIDEgNi42ODgtNy42OTV6XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIzLjAxOCAxLjg0MmEyLjM0MiAyLjM0MiAwIDAgMSAxLjY1NC44ODRjLjMzNi40MzEuNDg2Ljk2OS40OTUgMS41MDkuMDA3LjM4NC0uMDU0Ljc2Mi0uMTM5IDEuMTM1bC0uNTg1IDIuMTQ4LjAyMS4wMjEuMDE5LjAyIDIuMTQxLS41ODRjLjA5OC0uMDI0LjA5OC0uMDIzLjE5Ny0uMDQ2LjItLjA0LjQwMS0uMDczLjYwNS0uMDg3LjQyLS4wMy44NDkuMDEgMS4yNDYuMTU3LjI3LjEuNTIyLjI1LjczNi40NDMuMzk3LjM2LjY2OC44NjcuNzQxIDEuMzk5LjAzNi4yNi4wMjQuNTI1LS4wMzEuNzgxLS4wOTUuNDQ0LS4zMTMuODUxLS41ODMgMS4yMTJhNi4wNzQgNi4wNzQgMCAwIDEtLjQwMy40NzRsLTEuNTcyIDEuNTU5LjAwOC4wMy4wMS4wMzZjLjcxNi4xODkgMS40MjYuMzk5IDIuMTQ4LjU2Ny4wOTEuMDI2LjA5LjAyNi4xODEuMDU1LjE5NC4wNjUuMzg0LjEzNy41NjguMjI3LjM2Mi4xNzYuNjk5LjQxLjk2My43MTYuMTc0LjIuMzE1LjQyOC40MS42NzYuMjA4LjU0LjIwMyAxLjE2NS0uMDE2IDEuNzAyLS4wOTEuMjI0LS4yMi40MzItLjM3Ny42MTUtLjI4Ni4zMzMtLjY1OS41NzktMS4wNTUuNzYtLjIyLjEwMS0uNDQ5LjE4LS42OC4yNTFsLTIuMTQyLjU2Ni0uMDEuMDM2LS4wMDguMDMgMS41NjcgMS41NTRhNC41MDEgNC41MDEgMCAwIDEgLjUxNy42MjhjLjIzNi4zNDkuNDE2Ljc0LjQ4OCAxLjE1Ni4wNDkuMjg1LjA0NS41NzctLjAxNi44NTlhMi4zNDkgMi4zNDkgMCAwIDEtLjg0MSAxLjM0MyAyLjI1NCAyLjI1NCAwIDAgMS0uNjM4LjM0NWMtLjQxMy4xNDUtLjg1OS4xNzEtMS4yOTIuMTI5YTUuMzk2IDUuMzk2IDAgMCAxLS43MTUtLjEyM2wtMi4xNDctLjU4My0uMDIuMDItLjAyLjAyLjU4MyAyLjE0MmMuMDI1LjA5OS4wMjQuMDk5LjA0Ny4xOTguMDQuMi4wNzIuNDAxLjA4Ny42MDVhMy4wMiAzLjAyIDAgMCAxLS4xMzkgMS4xOTEgMi4yOSAyLjI5IDAgMCAxLS40Mi43NDEgMi4zNCAyLjM0IDAgMCAxLTEuNDQyLjc5Yy0uMjYuMDM2LS41MjQuMDI0LS43OC0uMDMxLS42NTQtLjEzOS0xLjIwNy0uNTQtMS42ODgtLjk4OGwtMS41NTYtMS41NjktLjAzMS4wMDgtLjAzNy4wMS0uNTYzIDIuMTMzYy0uMDI5LjA5OC0uMDI4LjA5Ny0uMDU5LjE5NC0uMDU0LjE2MS0uMTEyLjMyLS4xODIuNDc0LS4xODkuNDE1LS40NTEuODAyLS44MDMgMS4wOTRhMi4zIDIuMyAwIDAgMS0uNjkuMzk1IDIuMzQ4IDIuMzQ4IDAgMCAxLTEuNTg2LS4wMTQgMi4yNjkgMi4yNjkgMCAwIDEtLjY3NC0uNDAxYy0uMzU5LS4zMDgtLjYxNi0uNzE3LS44MDEtMS4xNDhhNi4xIDYuMSAwIDAgMS0uMjEtLjU4NmwtLjU2NS0yLjE0MS0uMDM2LS4wMS0uMDMtLjAwOC0xLjU1NSAxLjU2N2MtLjA3My4wNy0uMDczLjA3LS4xNDcuMTM4YTQuODQyIDQuODQyIDAgMCAxLS4zOTUuMzIgMy4wODIgMy4wODIgMCAwIDEtMS4xODYuNTM2Yy0uMjguMDU0LS41Ny4wNTgtLjg1Mi4wMDZhMi4zNDcgMi4zNDcgMCAwIDEtMS4zNjYtLjgwNCAyLjI0OCAyLjI0OCAwIDAgMS0uMzg1LS42ODdjLS4xNTYtLjQ0Ni0uMTc1LS45MjctLjEyLTEuMzk0YTYuMDQgNi4wNCAwIDAgMSAuMTEyLS42MTJsLjU4NS0yLjE0OS0uMDItLjAyLS4wMTktLjAyLTIuMTQxLjU4MmMtLjA5OS4wMjQtLjA5OC4wMjQtLjE5Ny4wNDZhNC45OTQgNC45OTQgMCAwIDEtLjUwMi4wOCAzLjA1OSAzLjA1OSAwIDAgMS0xLjI5Ni0uMTI4IDIuMjk0IDIuMjk0IDAgMCAxLS43NDItLjQyIDIuMzU3IDIuMzU3IDAgMCAxLS43OS0xLjQ0MiAyLjI3MiAyLjI3MiAwIDAgMSAuMDE5LS43MjJjLjEyNy0uNjc3LjUzOC0xLjI1MS45OTgtMS43NDVsMS41NzEtMS41Ni0uMDA5LS4wMy0uMDA5LS4wMzYtMi4xMzQtLjU2My0uMTk0LS4wNThhNC44NzIgNC44NzIgMCAwIDEtLjU2OC0uMjI3IDIuOTcyIDIuOTcyIDAgMCAxLTEuMDAxLS43NTkgMi4yOTMgMi4yOTMgMCAwIDEtLjM5NC0uNjg5IDIuMzQyIDIuMzQyIDAgMCAxIC4wMzctMS42NDVjLjA5OS0uMjQyLjI0Mi0uNDY2LjQxNy0uNjYuNDQ2LS40OTYgMS4wNjktLjc3NCAxLjY5Ni0uOTY4bDIuMTQxLS41NjUuMDA5LS4wMzUuMDA5LS4wMzEtMS41NjYtMS41NTRjLS4wNy0uMDczLS4wNy0uMDczLS4xMzktLjE0OC0uNDE0LS40NjctLjc2LTEuMDE1LS44NjYtMS42MzlhMi4zMDcgMi4zMDcgMCAwIDEgLjAwNC0uNzk1IDIuMzQ5IDIuMzQ5IDAgMCAxIC44MDctMS4zNjZjLjIwMy0uMTY3LjQzNS0uMjk2LjY4My0uMzgzLjQxNC0uMTQ1Ljg1OS0uMTcyIDEuMjkzLS4xMzEuMjQyLjAyMy40NzkuMDY5LjcxNi4xMjNsMi4xNDcuNTg1LjAyMS0uMDIxLjAyLS4wMi0uNTg0LTIuMTQxYy0uMDI1LS4wOTktLjAyNS0uMDk5LS4wNDctLjE5OWE0Ljc1IDQuNzUgMCAwIDEtLjA4Ny0uNjA0Yy0uMDMtLjQyLjAxLS44NS4xNTctMS4yNDYuMDkzLS4yNS4yMjktLjQ4NC40MDItLjY4Ny4zNDktLjQwNy44NTEtLjY5IDEuMzc5LS43NzguMjYtLjA0NC41MjctLjA0Ljc4Ni4wMDkuNDMxLjA4MS44MjkuMjgxIDEuMTg0LjUzMy4xOTguMTQxLjM4MS4yOTkuNTU5LjQ2NGwxLjU1OSAxLjU3MS4wMzEtLjAwOC4wMzUtLjAxLjU2My0yLjEzNi4wNTktLjE5M2MuMDU0LS4xNjEuMTEyLS4zMi4xODMtLjQ3NGEzLjA2IDMuMDYgMCAwIDEgLjc1OC0xLjA1NmMuMjMyLS4yMDEuNTAyLS4zNTguNzk0LS40NTJhMi4zNDQgMi4zNDQgMCAwIDEgMS41MjcuMDM1Yy4yNDYuMDkyLjQ3NC4yMy42NzQuNDAxLjM1OC4zMDguNjE1LjcxNi44IDEuMTQ3LjA4Mi4xOTEuMTQ4LjM4Ny4yMS41ODVsLjU2NSAyLjE0My4wMzUuMDA5LjAzMi4wMDkgMS41NTMtMS41NjZjLjA3My0uMDcuMDczLS4wNy4xNDgtLjEzOS40NTMtLjQwMS45NzktLjczOSAxLjU4MS0uODU1LjE1OC0uMDMxLjMxOC0uMDQzLjQ3OS0uMDQzLjA2Mi4wMDEuMDYxLjAwMS4xMjMuMDA1ek0xMi43ODMgMjUuNTc1bC4xLjAyNmMuMTI2LjA0LjI1Mi4wNzkuMzguMTE2LjIxMS4wNTkuNDIzLjExMS42MzguMTU4bC4xLjAyN2MuMDg1LjAzNC4xMDguMDQuMTg3LjA4Ny4xNDcuMDkuMjY5LjIyLjM0OC4zNzMuMDQzLjA4Mi4wNDYuMTA1LjA3NS4xOTJsLjY5OCAyLjY0N2EzLjU4IDMuNTggMCAwIDAgLjE1NC40MTYgMS40NzMgMS40NzMgMCAwIDAgLjA5Ni4xODZjLjA2Ni4xMS4xNTQuMjM1LjI3OC4yODZhLjQ1NC40NTQgMCAwIDAgLjIxOS4wMjUuMzY2LjM2NiAwIDAgMCAuMTQ1LS4wNDguNTkyLjU5MiAwIDAgMCAuMTQ1LS4xMjljLjA2MS0uMDczLjExMi0uMTU1LjE1Ni0uMjM5LjA4MS0uMTU2LjEzOS0uMzIyLjE4OC0uNDlsLjctMi42NTRjLjAyOS0uMDg3LjAzMi0uMTEuMDc1LS4xOTJhLjk0My45NDMgMCAwIDEgLjQzOS0uNDIxYy4xNDQtLjA2Ny4zMDQtLjA4OS40NTctLjEyNS4xMjctLjAzMS4xMjYtLjAzMS4yNTMtLjA2NC4xNjktLjA0Ny4zMzYtLjA5Ny41MDItLjE1MWwuMTAxLS4wMjZjLjA5MS0uMDE0LjExMy0uMDIxLjIwNi0uMDE5YS45NDcuOTQ3IDAgMCAxIC40OS4xNDhjLjA3Ny4wNS4wOTIuMDY4LjE2LjEzbDEuOTI5IDEuOTQ1YTMuOTkzIDMuOTkzIDAgMCAwIC4zNDEuMjg0IDEuODA0IDEuODA0IDAgMCAwIC4xNzcuMTEzYy4xMTEuMDYyLjI1LjEyNy4zODIuMTA4YS40NTEuNDUxIDAgMCAwIC4zMDYtLjIwMy41NzYuNTc2IDAgMCAwIC4wNjEtLjE4NWMuMDE3LS4wOTQuMDItLjE5LjAxNi0uMjg1YTIuNzI5IDIuNzI5IDAgMCAwLS4wODEtLjUxN2wtLjcyNS0yLjY2MmMtLjAxOS0uMDktLjAyOC0uMTEyLS4wMzItLjIwNGEuOTQyLjk0MiAwIDAgMSAuMTcxLS41ODZjLjA5MS0uMTI4LjIxNy0uMjI2LjMzMS0uMzMyLjA5My0uMDg5LjE4NC0uMTguMjc1LS4yNzEuMDkxLS4wOTUuMTgxLS4xOTEuMjctLjI4OGwuMDc0LS4wNzJjLjA3Mi0uMDU2LjA4OC0uMDc0LjE2OC0uMTE4YS45NS45NSAwIDAgMSAuNDk1LS4xMTRjLjA5Mi4wMDQuMTE0LjAxMy4yMDMuMDMybDIuNjUzLjcyYTMuNzQzIDMuNzQzIDAgMCAwIC40MzguMDc2IDEuOTkzIDEuOTkzIDAgMCAwIC4yMDkuMDA5Yy4xMjctLjAwMi4yOC0uMDE1LjM4NS0uMDk2YS40NjkuNDY5IDAgMCAwIC4xMzMtLjE4MS4zNDUuMzQ1IDAgMCAwIC4wMzEtLjE0OC41OTIuNTkyIDAgMCAwLS4wNC0uMTkgMS4yNjQgMS4yNjQgMCAwIDAtLjEyOS0uMjU0IDIuNjkgMi42OSAwIDAgMC0uMzMtLjQwOGwtMS45NS0xLjkzNWMtLjA2Mi0uMDY4LS4wOC0uMDgzLS4xMy0uMTZhLjk1Mi45NTIgMCAwIDEtLjE0NS0uNTkyYy4wMDktLjA5Mi4wMTgtLjExNC4wNDEtLjIwM2ExMi44IDEyLjggMCAwIDAgLjExNy0uMzhjLjA1OC0uMjExLjExMS0uNDIzLjE1OC0uNjM3bC4wMjgtLjA5OWMuMDM0LS4wODUuMDM5LS4xMDkuMDg3LS4xODdhLjk0Ni45NDYgMCAwIDEgLjM3Mi0uMzQ5Yy4wODItLjA0Mi4xMDUtLjA0NS4xOTItLjA3NGwyLjY0OC0uNjk5YTMuNTggMy41OCAwIDAgMCAuNDE2LS4xNTNsLjA5OS0uMDQ4LjA4Ny0uMDQ5Yy4xMDktLjA2NS4yMzUtLjE1My4yODUtLjI3NmEuNDU0LjQ1NCAwIDAgMC0uMDIzLS4zNjcuNTkuNTkgMCAwIDAtLjEyOC0uMTQ1IDEuMjY3IDEuMjY3IDAgMCAwLS4yNC0uMTU2IDIuNjU2IDIuNjU2IDAgMCAwLS40ODktLjE4OGwtMi42NTQtLjdjLS4wODgtLjAyOC0uMTExLS4wMzItLjE5My0uMDc0YS45NS45NSAwIDAgMS0uNDIxLS40NGMtLjA2Ni0uMTQzLS4wODktLjMwMy0uMTI1LS40NTVhMTMuMTU0IDEzLjE1NCAwIDAgMC0uMDk5LS4zNzhjLS4wMzgtLjEyNy0uMDc2LS4yNTQtLjExNy0uMzhsLS4wMjYtLjFjLS4wMTMtLjA5MS0uMDItLjExNC0uMDE4LS4yMDZhLjk0NC45NDQgMCAwIDEgLjE0OC0uNDg5Yy4wNS0uMDc3LjA2OC0uMDkyLjEzLS4xNmwxLjk0NS0xLjkyOWEzLjEzOCAzLjEzOCAwIDAgMCAuMjg0LS4zNDFjLjAyMS0uMDMuMDQyLS4wNi4wNjEtLjA5MWExLjUxIDEuNTEgMCAwIDAgLjA1Mi0uMDg2Yy4wNjItLjExMS4xMjctLjI1LjEwOS0uMzgyYS40NjQuNDY0IDAgMCAwLS4wODMtLjE5NS4zNjQuMzY0IDAgMCAwLS4xMi0uMTExLjYzMi42MzIgMCAwIDAtLjE4NC0uMDYxIDEuMzA0IDEuMzA0IDAgMCAwLS4yODYtLjAxNSAyLjY2IDIuNjYgMCAwIDAtLjUxOC4wODFsLTIuNjU5LjcyNWMtLjA4OS4wMTktLjExMi4wMjgtLjIwMy4wMzJhLjk0Ny45NDcgMCAwIDEtLjU4NS0uMTdjLS4wNzUtLjA1Mi0uMDg5LS4wNzEtLjE1NC0uMTM2YTE4LjM3NiAxOC4zNzYgMCAwIDAtLjI3LS4yODggMTIuNTA2IDEyLjUwNiAwIDAgMC0uNDctLjQ1MWwtLjA3Mi0uMDc0Yy0uMDU3LS4wNzItLjA3NC0uMDg4LS4xMTktLjE2OGEuOTQ5Ljk0OSAwIDAgMS0uMTE1LS40OTdjLjAwNC0uMDkyLjAxMy0uMTE0LjAzMi0uMjA0bC43MjMtMi42NTRhMi43NjcgMi43NjcgMCAwIDAgLjA4Mi0uNTQ0bC4wMDEtLjEwMWMtLjAwMi0uMTI3LS4wMTUtLjI4LS4wOTctLjM4NWEuNDcyLjQ3MiAwIDAgMC0uMzMxLS4xNjQuNjA1LjYwNSAwIDAgMC0uMTg4LjAzOGMtLjA5LjAzMy0uMTc0LjA3OC0uMjU1LjEzYTIuNjkgMi42OSAwIDAgMC0uNDA4LjMzbC0xLjkzMyAxLjk0OGMtLjA2OC4wNjItLjA4Mi4wOC0uMTYuMTNhLjk1Ljk1IDAgMCAxLS41OS4xNDVjLS4wOTItLjAwOC0uMTE0LS4wMTgtLjIwMi0uMDRhMTguMzQgMTguMzQgMCAwIDAtLjM4LS4xMTZjLS4yMTItLjA1OC0uNDI0LS4xMS0uNjM5LS4xNTdsLS4xLS4wMjdjLS4wODUtLjAzNC0uMTA5LS4wMzktLjE4OC0uMDg3YS45MzUuOTM1IDAgMCAxLS4zNDktLjM3M2MtLjA0My0uMDgyLS4wNDYtLjEwNS0uMDc1LS4xOTNsLS42OTgtMi42NDhhMy43NyAzLjc3IDAgMCAwLS4xNTMtLjQxNSAyLjQyNyAyLjQyNyAwIDAgMC0uMTIxLS4yMjVjLS4wNjUtLjEtLjE0OC0uMjA4LS4yNjMtLjI1MWEuNDU5LjQ1OSAwIDAgMC0uMzU2LjAyNi41ODIuNTgyIDAgMCAwLS4xNDMuMTI4IDEuMjk3IDEuMjk3IDAgMCAwLS4xNTcuMjM5IDIuNzgyIDIuNzgyIDAgMCAwLS4xODkuNDkxbC0uNjk5IDIuNjU1Yy0uMDI5LjA4OC0uMDMyLjExMS0uMDc1LjE5M2EuOTQuOTQgMCAwIDEtLjQ0MS40MjJjLS4xNDMuMDY2LS4zMDMuMDg4LS40NTYuMTIzYTE2LjA1IDE2LjA1IDAgMCAwLS4zNzcuMDk5Yy0uMTI4LjAzNy0uMjU1LjA3Ni0uMzgxLjExNmwtLjEuMDI1Yy0uMDkxLjAxMy0uMTEzLjAyLS4yMDUuMDE4YS45MzcuOTM3IDAgMCAxLS40ODctLjE0OGMtLjA3Ny0uMDUtLjA5Mi0uMDY4LS4xNi0uMTNMMTAgNC4yMjJhNC4wMTcgNC4wMTcgMCAwIDAtLjM0MS0uMjgzIDIuOTU2IDIuOTU2IDAgMCAwLS4xNzctLjExM2MtLjExMi0uMDYyLS4yNS0uMTI3LS4zODItLjEwOGEuNDYuNDYgMCAwIDAtLjMwOC4yMDQuNTY1LjU2NSAwIDAgMC0uMDYuMTgyYy0uMDE3LjA5NC0uMDE5LjE5LS4wMTUuMjg1LjAwNy4xNzUuMDM5LjM0Ny4wODEuNTE2bC43MjYgMi42NjFjLjAxOS4wODkuMDI3LjExMS4wMzIuMjAzYS45NDUuOTQ1IDAgMCAxLS4xNjkuNTgzYy0uMDUzLjA3Ni0uMDcyLjA5LS4xMzYuMTU1LS4wOTcuMDg5LS4xOTMuMTgtLjI4OC4yNzEtLjE1NS4xNTMtLjMwNS4zMDktLjQ1MS40N2wtLjA3NC4wNzJjLS4wNzIuMDU3LS4wODguMDc1LS4xNjkuMTE5YS45NDcuOTQ3IDAgMCAxLS40OTcuMTE2Yy0uMDkyLS4wMDQtLjExNS0uMDEzLS4yMDQtLjAzMkw0LjkxNCA4LjhhNC4yNTggNC4yNTggMCAwIDAtLjQzNi0uMDc1IDMuNzkgMy43OSAwIDAgMC0uMTEtLjAwOGwtLjA5OS0uMDAxYy0uMTMyLjAwMi0uMjg4LjAxNi0uMzk1LjEwNGEuNDUuNDUgMCAwIDAtLjE1NS4zMjIuNTkuNTkgMCAwIDAgLjAzOS4xOWMuMDMyLjA4OS4wNzguMTc0LjEyOS4yNTUuMDk1LjE0OC4yMDkuMjgxLjMzLjQwN2wxLjk0OCAxLjkzNGMuMDYyLjA2OC4wOC4wODMuMTMuMTZhLjk0Ny45NDcgMCAwIDEgLjE0NS41OTFjLS4wMDguMDkxLS4wMTguMTEzLS4wNDEuMjAyLS4wNC4xMjYtLjA3OC4yNTMtLjExNi4zODEtLjA1OC4yMTEtLjExLjQyMy0uMTU3LjYzOGwtLjAyNy4wOTljLS4wMzQuMDg2LS4wNC4xMDktLjA4Ny4xODhhLjk2My45NjMgMCAwIDEtLjM3My4zNDljLS4wODIuMDQyLS4xMDUuMDQ2LS4xOTMuMDc0bC0yLjY0Ny42OThhMy41NTQgMy41NTQgMCAwIDAtLjQxNS4xNTMgMS41MTggMS41MTggMCAwIDAtLjE4Ni4wOTdjLS4xMDkuMDY2LS4yMzYuMTU0LS4yODYuMjc3YS40NTguNDU4IDAgMCAwIC4wMjIuMzY3Yy4wMzMuMDU2LjA4LjEwMy4xMjkuMTQ1LjA3My4wNjEuMTU1LjExMi4yNC4xNTYuMTU1LjA4MS4zMjEuMTM4LjQ4OS4xODdsMi42NTUuNzAxYy4wODcuMDI5LjExLjAzMi4xOTIuMDc1YS45NC45NCAwIDAgMSAuNDIxLjQ0Yy4wNjcuMTQzLjA4OS4zMDMuMTI0LjQ1NS4wMzIuMTI2LjA2NS4yNTIuMDk5LjM3Ny4wMzguMTI4LjA3Ni4yNTUuMTE2LjM4MWwuMDI2LjFjLjAxMy4wOTEuMDIuMTE0LjAxOC4yMDVhLjkzNy45MzcgMCAwIDEtLjE0OC40ODhjLS4wNS4wNzctLjA2OC4wOTItLjEyOS4xNmwtMS45NDQgMS45M2E0LjUyMiA0LjUyMiAwIDAgMC0uMTcyLjE5NSAyLjU1MiAyLjU1MiAwIDAgMC0uMjI0LjMyM2MtLjA2Mi4xMTItLjEyNy4yNS0uMTA5LjM4Mi4wMS4wNzEuMDQ0LjEzOC4wODMuMTk2YS4zNjguMzY4IDAgMCAwIC4xMjEuMTExLjU4Mi41ODIgMCAwIDAgLjE4Mi4wNmMuMDk0LjAxNy4xOS4wMTkuMjg1LjAxNS4xNzYtLjAwOC4zNDktLjA0MS41MTktLjA4M2wyLjY2Mi0uNzIyYy4wODktLjAxOS4xMTEtLjAyOC4yMDMtLjAzMmEuOTQ5Ljk0OSAwIDAgMSAuNTgzLjE2OWMuMDc1LjA1My4wODkuMDcyLjE1NC4xMzYuMDg5LjA5Ny4xNzkuMTkyLjI3MS4yODcuMTUzLjE1Ni4zMS4zMDYuNDcuNDU0bC4wNzIuMDczYy4wNTcuMDcyLjA3NC4wODguMTE4LjE2OWEuOTQzLjk0MyAwIDAgMSAuMTE1LjQ5NmMtLjAwNC4wOTItLjAxMy4xMTQtLjAzMi4yMDNMOC44IDI3LjA4N2EyLjc0IDIuNzQgMCAwIDAtLjA4Mi41NDdjLS4wMDIuMDM0LS4wMDIuMDY1LS4wMDIuMDk5LjAwMy4xMjguMDE2LjI4MS4wOTguMzg2YS40NjYuNDY2IDAgMCAwIC4xOC4xMzMuMzUuMzUgMCAwIDAgLjE0OS4wMzEuNTguNTggMCAwIDAgLjE4OS0uMDM5Yy4wOS0uMDMzLjE3NS0uMDc4LjI1NS0uMTMuMTQ4LS4wOTQuMjgxLS4yMDguNDA3LS4zMjlsMS45MzUtMS45NWMuMDY4LS4wNjIuMDgzLS4wOC4xNi0uMTNhLjk1NC45NTQgMCAwIDEgLjM4NS0uMTQxYy4wOTItLjAxMS4xMTUtLjAwNy4yMDctLjAwNGwuMTAyLjAxNXptMy4zMDMtMTYuMjU0YTYuNjc4IDYuNjc4IDAgMCAxIDIuNzM4LjYyNCA2LjczNiA2LjczNiAwIDAgMSAyLjk3MSAyLjczIDYuNjcgNi42NyAwIDAgMSAuODIgNC4yNTggNi42NiA2LjY2IDAgMCAxLTEuOTQ4IDMuODQ3IDYuNjkgNi42OSAwIDAgMS0yLjA2NiAxLjM3NSA2LjcwNyA2LjcwNyAwIDAgMS01LjA1LjA2MiA2LjY5NSA2LjY5NSAwIDAgMS00LjE1My01LjIwMSA2LjY4IDYuNjggMCAwIDEgNi42ODgtNy42OTV6bS0uMTQ4IDEuODgzYTQuODMgNC44MyAwIDAgMC0xLjk2NC40NDcgNC44MTQgNC44MTQgMCAwIDAtMi4zNzEgMi40MjggNC43OTYgNC43OTYgMCAwIDAtLjI2MyAzLjA2NGMuMDkyLjM3OS4yMzEuNzQ3LjQxNCAxLjA5MmE0Ljg0MSA0Ljg0MSAwIDAgMCAyLjM4IDIuMTg2Yy41Ny4yNDIgMS4xODYuMzY5IDEuODA0LjM3NmE0Ljc4MyA0Ljc4MyAwIDAgMCAzLjMzLTEuMjg0IDQuODM5IDQuODM5IDAgMCAwIDEuMDMyLTEuMzgxYy4yMS0uNDIyLjM1Ni0uODc1LjQzMy0xLjM0YTQuODMzIDQuODMzIDAgMCAwIDAtMS41ODMgNC43NzUgNC43NzUgMCAwIDAtLjQwOC0xLjI4OCA0LjgzNCA0LjgzNCAwIDAgMC0yLjI0NS0yLjI0NSA0Ljg0IDQuODQgMCAwIDAtMi4xNDItLjQ3MnpcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctaGVhcnQtY2lyY2xlXCIgZGF0YS1uYW1lPVwiaGVhcnQtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xMS4yMjggNi44MjljLjQ1MS4wMjguODk0LjEwMSAxLjMyNi4yMzUgMS40ODguNDYxIDIuNzEyIDEuNTY0IDMuNDY5IDIuOTEyLjA4Mi0uMTQ2LjE3My0uMjg3LjI2NC0uNDI3LjQ4OS0uNzE4IDEuMDg2LTEuMzU0IDEuODE2LTEuODNhNS41MjQgNS41MjQgMCAwIDEgMS43ODUtLjc2MSA1LjQ3OCA1LjQ3OCAwIDAgMSAxLjcyNy0uMTEyIDUuNzU3IDUuNzU3IDAgMCAxIDIuNTk5LjkxNCA2LjIxMiA2LjIxMiAwIDAgMSAyLjE3NCAyLjQ3MyA2Ljk4IDYuOTggMCAwIDEgLjY2MSAyLjMzNmMuMDM5LjM3NS4wNTUuNzU0LjAzMyAxLjEzLS4wNDQuNzkzLS4yNTQgMS41Ny0uNTQ5IDIuMzA1LS40NDIgMS4wOTgtMS4wNzIgMi4xMTYtMS43NyAzLjA2OC0xLjIyNCAxLjY3MS0yLjY3NCAzLjE3NC00LjE5MyA0LjU3N2E0Ny4wNTYgNDcuMDU2IDAgMCAxLTMuOTQ0IDMuMjgzbC0uMDcxLjA0OGExLjA0MiAxLjA0MiAwIDAgMS0uODMuMTA2IDEuMTUyIDEuMTUyIDAgMCAxLS4yMzUtLjEwNmMtLjE3Ny0uMTItLjM0Ni0uMjUzLS41MTctLjM4M2E1MS45OTQgNTEuOTk0IDAgMCAxLTMuNDk3LTIuOTQ4Yy0xLjE3Ni0xLjA4Ny0yLjMwMy0yLjIzMy0zLjMyNS0zLjQ2Ny0uNzAyLS44NDgtMS4zNTYtMS43MzktMS45MDYtMi42OTMtLjQwOS0uNzEtLjc2Mi0xLjQ1OC0uOTk4LTIuMjQzYTYuNzcgNi43NyAwIDAgMS0uMjgyLTEuNTQ2IDYuOTc5IDYuOTc5IDAgMCAxIC4wMTgtLjk3Yy4wODEtLjk2LjM0Ni0xLjkwNi44MDktMi43NTNBNi4yMTQgNi4yMTQgMCAwIDEgNy42MSA3LjkxM2E1LjkzIDUuOTMgMCAwIDEgMS4yODUtLjcgNS44NiA1Ljg2IDAgMCAxIDEuODAyLS4zODVjLjE3OC0uMDA2LjM1NC0uMDA2LjUzMS4wMDF6bTkuNzc4IDIuMDI1Yy0uMzEuMDEyLS42MTUuMDU4LS45MTIuMTUtLjIyNC4wNy0uNDQxLjE2Mi0uNjQ2LjI3NS0xLjE2OS42NDEtMS44NzcgMS44NzEtMi4yNjcgMy4xMDdhOS42MDIgOS42MDIgMCAwIDAtLjE3My42MjRsLS4wMjYuMDg2Yy0uMDY3LjE3LS4xNTkuMzItLjI5OS40NGExLjAyNyAxLjAyNyAwIDAgMS0xLjM4Ni0uMDYxIDEuMTEgMS4xMSAwIDAgMS0uMjM0LS4zNzljLS4wNTUtLjE4Ni0uMDk5LS4zNzUtLjE1My0uNTYyLS4zNzctMS4yMzQtMS4wMjMtMi40NjctMi4xNTQtMy4xNjNhMy40MDUgMy40MDUgMCAwIDAtMS42MzEtLjUxMyAzLjUxMiAzLjUxMiAwIDAgMC0xLjAwMS4wOTMgMy43OCAzLjc4IDAgMCAwLS44MDQuMjk0Yy0uODMzLjQxOC0xLjQ5IDEuMTMxLTEuODggMS45NzNhNC45NiA0Ljk2IDAgMCAwLS40MjIgMS41NjNjLS4wNDIuNDA2LS4wNDQuODE1LjAyIDEuMjE5LjEwNC42NDYuMzQ0IDEuMjY3LjYzMyAxLjg1Mi40NDUuOTAyIDEuMDE5IDEuNzM4IDEuNjM3IDIuNTI5LjgwNiAxLjAzMiAxLjcwMSAxLjk5MyAyLjYzNiAyLjkwOWE0OC4zNjUgNDguMzY1IDAgMCAwIDQuMDQzIDMuNTI0bC4wMzYuMDI3YTQ3LjAxMSA0Ny4wMTEgMCAwIDAgMi45NDUtMi40NzkgMzkuMDk5IDM5LjA5OSAwIDAgMCAyLjI3Ni0yLjI0Yy45NzgtMS4wNSAxLjkwMy0yLjE2NyAyLjY0OS0zLjM5NS40NzItLjc3Ny44ODgtMS42MTcgMS4wNzYtMi41MTIuMDk5LS40NzQuMTEtLjk1My4wNi0xLjQzM2E0Ljk1NSA0Ljk1NSAwIDAgMC0uMzgtMS40NzEgNC4xODEgNC4xODEgMCAwIDAtMS42OTItMS45NCAzLjY4NyAzLjY4NyAwIDAgMC0xLjc4Mi0uNTE3aC0uMTY5elwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1sb2NrLWNpcmNsZVwiIGRhdGEtbmFtZT1cImxvY2stY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk05LjU1OCAxMS4xMzRjLjAwMS0uMzM4LjAwNy0uNjc2LjAxMS0xLjAxNGE2LjY0NiA2LjY0NiAwIDAgMSAuNDQ1LTIuMTk0IDYuNDgyIDYuNDgyIDAgMCAxIDMuNzc1LTMuNjgzIDYuNjQ1IDYuNjQ1IDAgMCAxIDIuMDQ1LS4zODhjLjE2Ni0uMDAyLjE2NS0uMDAyLjMzMiAwYTYuNjQ1IDYuNjQ1IDAgMCAxIDIuMDQ1LjM4OCA2LjQ4NSA2LjQ4NSAwIDAgMSAzLjc3NSAzLjY4M2MuMjc3LjcwMi40MTYgMS40NDEuNDQ1IDIuMTk0LjAwNC4zMzguMDEuNjc2LjAxMiAxLjAxNC42MzQuMDIgMS4yNjkuMDQ0IDEuOTAzLjA3YS45MjYuOTI2IDAgMCAxIC43NjYuNTQ2IDEgMSAwIDAgMSAuMDc0LjI5NGMuMTc5IDQuMzEuMDA0IDguNjI3LjAwNCAxMi45NDFhMS4wNzUgMS4wNzUgMCAwIDEtLjA1LjI5OC45MjYuOTI2IDAgMCAxLS43OTQuNjE4Yy01LjUzNC4yMjktMTEuMDc4LjAwMy0xNi42MTcuMDAzYS45MjMuOTIzIDAgMCAxLS45MTUtLjg0M2MtLjE3OS00LjMxLS4wMDQtOC42MjgtLjAwNC0xMi45NDEuMDA1LS4xMDMuMDE3LS4yMDEuMDUtLjI5OWEuOTI2LjkyNiAwIDAgMSAuNS0uNTQzYy4wOTUtLjA0MS4xOTItLjA2Mi4yOTQtLjA3NC42MzQtLjAyNiAxLjI2OS0uMDUgMS45MDQtLjA3em0xMy43OTQgMS45MDVIOC42NDh2MTEuMDI3aDE0LjcwNFYxMy4wMzl6bS04LjMwMyA1LjI0OGExLjg2IDEuODYgMCAwIDEtLjg4NS0xLjY2NyAxLjg0IDEuODQgMCAwIDEgLjQxOS0xLjA3N2MuMTUtLjE4MS4zMzUtLjMzMy41NDItLjQ0NS4yNDMtLjEzMi41MDYtLjE5OS43ODEtLjIxOS4wOTUtLjAwMy4wOTQtLjAwMy4xODggMCAuMjc1LjAyLjUzOC4wODcuNzgxLjIxOS4yMDcuMTEyLjM5My4yNjQuNTQzLjQ0NS4xMzIuMTYxLjIzNy4zNDQuMzA5LjUzOS4wNjMuMTczLjA5OS4zNTUuMTA5LjUzOGExLjg2IDEuODYgMCAwIDEtLjkwMiAxLjY3N2MuMDIzIDEuMDI5LjA0MyAyLjA1OS0uMDE4IDMuMDg1YS45NDguOTQ4IDAgMCAxLS4xMzYuNDEzLjkyNi45MjYgMCAwIDEtMS4zNDEuMjQyLjkyLjkyIDAgMCAxLS4zNTUtLjY1NSAzMi4yNyAzMi4yNyAwIDAgMS0uMDM1LTMuMDk1em01LjU0Mi03LjIwNGMuMDAyLS4zMDUuMDA2LS42MTEuMDAyLS45MTdhNC43MTYgNC43MTYgMCAwIDAtLjM1OS0xLjY2OSA0LjYzNSA0LjYzNSAwIDAgMC0yLjg2OC0yLjYgNC42MDIgNC42MDIgMCAwIDAtMS42MDMtLjIgNC41ODMgNC41ODMgMCAwIDAtMy45MDUgMi41OTYgNC43MTIgNC43MTIgMCAwIDAtLjQ1MSAxLjg3M2MtLjAwNC4zMDYgMCAuNjEyLjAwMy45MTcgMy4wNTktLjA2OSA2LjEyMS0uMDY5IDkuMTgxIDB6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbG9nb1wiIGRhdGEtbmFtZT1cImxvZ29cIiB2aWV3Qm94PVwiMCAwIDU0IDMyXCIgd2lkdGg9XCI1NFwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTMyLjIwNyAyNS45NDZMMjEuNzIxIDMybC0xMS4yMzUtNi40ODZMMCAxOS40NTlWNi40ODZMMTEuMjM1IDBsMTAuNDg2IDYuMDU0TDMyLjIwNiAwbDExLjIzNSA2LjQ4NiAxMC40ODYgNi4wNTV2MTIuOTczTDQyLjY5MyAzMmwtMTAuNDg2LTYuMDU0em0uNjYxLTEuMzQzVjE0LjI3bDkuMDUzIDUuMTkuMDAyIDEwLjM3OC05LjA1NS01LjIzNXptLTIwLjg4NS4wNDZWMTQuMjdsOS4wODUgNS4yMTguMDAyIDEwLjQ0MS05LjA4Ni01LjI4aC0uMDAxek0xLjQ5OCAxOC41OTVWOC4yMTZsOC45ODggNS4xODl2MTAuMzc5bC04Ljk4OC01LjE4OXpNMjEuNzIxIDcuNzg0bDguOTg4IDUuMTg5LTguOTg4IDUuMTktOC45ODktNS4xOSA4Ljk4OS01LjE4OXptMjAuOTcyIDBsOC45ODggNS4xODktOC45ODggNS4xOS04Ljk4OS01LjE5IDguOTg5LTUuMTg5ek0xMS4yMzUgMS43MjlsOC45ODggNS4xOS04Ljk4OCA1LjE4OS04Ljk4OS01LjE4OSA4Ljk4OS01LjE4OXYtLjAwMXptMjAuOTcxIDBsOC45ODkgNS4xOS04Ljk4OSA1LjE4OS04Ljk4OC01LjE4OSA4Ljk4OC01LjE4OXYtLjAwMXpcIi8+PHBhdGggZD1cIk0xLjQzNyAxOC42NDNMMS40NDIgOC4xMWwxOS42NTIgMTEuMzUuMDA5IDEwLjU0NUwxLjQzNyAxOC42NDN6bTMxLjM2OSA1Ljk5OWwuMDMtMTAuNDYzIDkuMTQ4IDUuMjQ0LS4wMDkgMTAuNTgyLTkuMTY5LTUuMzYzelwiIGZpbGwtb3BhY2l0eT1cIi4zNDVcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1tZXNzYWdlLWNpcmNsZVwiIGRhdGEtbmFtZT1cIm1lc3NhZ2UtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNy4zNDIgMjMuNTgybC0zLjUzMSAzLjUzMS0uMDY1LjA1OGEuOTguOTggMCAwIDEtLjM5Mi4xODYuOS45IDAgMCAxLS45NjEtLjQ1NS45NzguOTc4IDAgMCAxLS4xMDYtLjQydi0yLjlsLS4yNjEtLjAwM2MtLjIwNC0uMDA4LS4yMDQtLjAwOC0uNDA4LS4wMjFhNy45NjggNy45NjggMCAwIDEtMi44NTEtLjc2OSA4LjExOCA4LjExOCAwIDAgMS0zLjI3My0yLjkwMiA4LjAxIDguMDEgMCAwIDEtMS4wMTItMi4zMTMgNy45ODcgNy45ODcgMCAwIDEgLjMwNC00LjkyNSA4LjA3IDguMDcgMCAwIDEgMy45ODItNC4yODEgNy45NSA3Ljk1IDAgMCAxIDMuMjU4LS43OWMyLjY2NS0uMDM0IDUuMzMxLS4wMzQgNy45OTYgMGE3LjkyNiA3LjkyNiAwIDAgMSAzLjI1OC43OTEgOC4wNTQgOC4wNTQgMCAwIDEgMy45ODEgNC4yOCA3Ljk1NiA3Ljk1NiAwIDAgMS0uNzA4IDcuMjM4IDguMTA3IDguMTA3IDAgMCAxLTMuNjI3IDMuMDYzIDcuOTYyIDcuOTYyIDAgMCAxLTMuMTA0LjYzMmgtMi40OHptLjEyMy01LjgyNmMuMTI4LjAxLjI1LjA0LjM2NC4wOTlhLjkwNC45MDQgMCAwIDEgLjI2LjIwNC45MDIuOTAyIDAgMCAxIC4wNTkgMS4xMDEuOTA4LjkwOCAwIDAgMS0uMTk4LjIwMy45MjUuOTI1IDAgMCAxLS40ODUuMTc1Yy0yLjIwNS4wNTktNC40MTIuMDU5LTYuNjE3IDBhLjkyNS45MjUgMCAwIDEtLjQ4NS0uMTc1LjkuOSAwIDAgMS0uMjktMS4wNjMuODg5Ljg4OSAwIDAgMSAuNzc1LS41NDRjMi4yMDUtLjA1OSA0LjQxMi0uMDU5IDYuNjE3IDB6bTMuNzQ3LTIuODQ3YS45MjQuOTI0IDAgMCAxIC40OTMuMTkuOS45IDAgMCAxIC4xNjYgMS4yMjkuOS45IDAgMCAxLS4yNjQuMjM5Ljk1Ljk1IDAgMCAxLS4zOTUuMTIyIDE1NC43MyAxNTQuNzMgMCAwIDEtMTAuMzc2IDAgLjkyNy45MjcgMCAwIDEtLjQ5NC0uMTkuOS45IDAgMCAxLS4xNjUtMS4yMjkuOS45IDAgMCAxIC4yNjQtLjIzOS45NDUuOTQ1IDAgMCAxIC4zOTUtLjEyMiAxNTQuNzMgMTU0LjczIDAgMCAxIDEwLjM3NiAwem0wLTIuODQ4YS45NS45NSAwIDAgMSAuMzk1LjEyMi45LjkgMCAwIDEgLjI2NC4yMzkuOS45IDAgMCAxLS4xNjYgMS4yMjkuOTMzLjkzMyAwIDAgMS0uNDkzLjE5MWMtMy40NTcuMTE1LTYuOTE5LjExNS0xMC4zNzYgMGEuOTM2LjkzNiAwIDAgMS0uNDk0LS4xOTEuOS45IDAgMCAxLS4xNjUtMS4yMjkuOS45IDAgMCAxIC4yNjQtLjIzOS45NDUuOTQ1IDAgMCAxIC4zOTUtLjEyMiAxNTQuNzMgMTU0LjczIDAgMCAxIDEwLjM3NiAwelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLW5vLWNpcmNsZVwiIGRhdGEtbmFtZT1cIm5vLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTYuMjg4IDMuOTMxYy40OC4wMTcuOTU4LjA1MSAxLjQzNC4xMiAxLjE5OS4xNzMgMi4zNy41MjkgMy40NjMgMS4wNTJhMTIuMDc0IDEyLjA3NCAwIDAgMSA1LjE1MyA0LjcyNyAxMS45MzIgMTEuOTMyIDAgMCAxIDEuMzE5IDMuMjQyIDEyLjA2MiAxMi4wNjIgMCAwIDEtLjQyOSA3LjA5OSAxMi4wOTMgMTIuMDkzIDAgMCAxLTYuNzEzIDYuODc4IDEyLjA0NiAxMi4wNDYgMCAwIDEtOS4wMyAwIDEyLjA5IDEyLjA5IDAgMCAxLTUuNTg5LTQuNjQzIDExLjk1MyAxMS45NTMgMCAwIDEtMS44OTMtNi4xOSAxMi4wMzEgMTIuMDMxIDAgMCAxIC40MTItMy40MjVjLjMxOC0xLjE4MS44Mi0yLjMxMiAxLjQ4MS0zLjM0MmExMi4wODkgMTIuMDg5IDAgMCAxIDQuOTE5LTQuMzQ2IDExLjk2OCAxMS45NjggMCAwIDEgNC44OTctMS4xNzJjLjI4OS0uMDA0LjI4OC0uMDA0LjU3NiAwem03LjM4MyA1Ljg2OEw5Ljg3MyAyMy41OThhOS43NzggOS43NzggMCAwIDAgMi40MzIgMS40MjkgOS44NTMgOS44NTMgMCAwIDAgNy4zOSAwIDkuODkzIDkuODkzIDAgMCAwIDUuNDkxLTUuNjI2IDkuODY1IDkuODY1IDAgMCAwIC4yOTItNi4wNDEgOS43NTcgOS43NTcgMCAwIDAtMS44MDctMy41NjF6bS0xLjU0My0xLjU0MmE5LjczNyA5LjczNyAwIDAgMC00LjcxOC0yLjA0NmMtLjM5LS4wNTctLjc4MS0uMDg0LTEuMTc1LS4wOTktLjIzNS0uMDAzLS4yMzQtLjAwMy0uNDcxIDBhOS43OTkgOS43OTkgMCAwIDAtNC4wMDcuOTU5IDkuODk5IDkuODk5IDAgMCAwLTQuMDI1IDMuNTU4IDkuNzI4IDkuNzI4IDAgMCAwLTEuMjEgMi43MzEgOS44OTUgOS44OTUgMCAwIDAtLjMzOCAyLjgwMyA5Ljc1MyA5Ljc1MyAwIDAgMCAyLjE0NSA1Ljg5M0wyMi4xMjggOC4yNTd6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGVuY2lsLWNpcmNsZVwiIGRhdGEtbmFtZT1cInBlbmNpbC1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTcuOTI1IDE4LjE2NWMzLjg1Ny00LjE5MyA4LjA1Ny04LjA1OCAxMi4wODYtMTIuMDg3YS45ODcuOTg3IDAgMCAxIC40MTYtLjI0MWMuMDctLjAxOC4wODgtLjAxOC4xNi0uMDI4LjA4MS0uMDAzLjA4MS0uMDAzLjE2MiAwIC4wNzEuMDEuMDg5LjAxLjE1OS4wMjguMTM0LjAzNi4yNDguMTAyLjM1Ny4xODYgMS42MzQgMS40OTcgMy4xMzcgMy4xMzIgNC43MDQgNC42OTlhLjkzNy45MzcgMCAwIDEgLjIxNi45NzUgMS4wMSAxLjAxIDAgMCAxLS4xNjEuMjc5Yy0zLjg2NCA0LjIxNy04LjA4NiA4LjA5Mi0xMi4xMzEgMTIuMTM2YS45MzMuOTMzIDAgMCAxLS4zMjcuMjEyYy0yLjE2NC43MTgtNC4zODQgMS4yNTYtNi41NzcgMS44ODJhMS4wMDMgMS4wMDMgMCAwIDEtLjQwOC4wMjQuOTQuOTQgMCAwIDEtLjc0Ny0uNjg0IDEuMDIgMS4wMiAwIDAgMS0uMDEzLS40MDhjLjUyOS0yLjIxOSAxLjI1MS00LjM4OSAxLjg3Ny02LjU4MmwuMDItLjA1NWEuOTM5LjkzOSAwIDAgMSAuMTQ4LS4yNjhsLjAxNi0uMDIxLjAxNy0uMDIuMDI2LS4wMjd6bS4xNjEgNS43OTZsMy4zMzQtLjk1M2E3NS43MTkgNzUuNzE5IDAgMCAxLTIuMzktMi4zNTFsLS45NDQgMy4zMDR6bTUuMTg0LTEuODUzbDcuMDEzLTcuMDEzLTMuMzMxLTMuMzMxLTcuMDMxIDcuMDMxYzEuMTM5IDEuMDgyIDIuMjggMi4xNjQgMy4zNDkgMy4zMTN6bTQuOTk2LTExLjY1OGwzLjMzMSAzLjMzMSAyLjQwMi0yLjQwMi0zLjMzMS0zLjMzMS0yLjQwMiAyLjQwMnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wbHVzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInBsdXMtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy4yNCAxNy4zNzZoLTUuNzkydjUuNzkyYTEuNDQ4IDEuNDQ4IDAgMCAxLTIuODk2IDB2LTUuNzkySDguNzZhMS40NDkgMS40NDkgMCAwIDEgMC0yLjg5Nmg1Ljc5MlY4LjY4OGExLjQ0OSAxLjQ0OSAwIDAgMSAyLjg5NiAwdjUuNzkyaDUuNzkyYTEuNDQ5IDEuNDQ5IDAgMCAxIDAgMi44OTZcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcHJvZ3Jlc3MtY2lyY2xlXCIgZGF0YS1uYW1lPVwicHJvZ3Jlc3MtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PGcgZmlsbC1ydWxlPVwibm9uemVyb1wiPjxwYXRoIGQ9XCJNMTYgMjEuMjg4Yy0uNTc5IDAtMS4wNDguNDY5LTEuMDQ4IDEuMDQ4djMuNTIxYTEuMDQ4IDEuMDQ4IDAgMSAwIDIuMDk2IDB2LTMuNTIxYzAtLjU3OS0uNDctMS4wNDgtMS4wNDgtMS4wNDhcIiBmaWxsLW9wYWNpdHk9XCIuNTAyXCIvPjxwYXRoIGQ9XCJNMjUuOTU1IDE0Ljg5OWwtMy40NTgtLjAwN2MtLjU5Ny4wMTMtMS4wNS40NjctMS4wNSAxLjA0NmExLjA0NyAxLjA0NyAwIDAgMCAxLjA0NiAxLjA1bDMuNDU4LjAwN2guMDAyYTEuMDUgMS4wNSAwIDAgMCAuMDAyLTIuMDk2XCIgZmlsbC1vcGFjaXR5PVwiLjI1MVwiLz48cGF0aCBkPVwiTTE2LjAyNSAyLjgzMmgtLjAwM2MtLjU3NyAwLTEuMDQ1LjQ2OC0xLjA0NyAxLjA0NmwtLjAxMSA1LjQ2YTEuMDQ4IDEuMDQ4IDAgMCAwIDEuMDQ1IDEuMDVoLjAwM2MuNTc4IDAgMS4wNDYtLjQ2NyAxLjA0Ny0xLjA0NWwuMDExLTUuNDYxYTEuMDQ2IDEuMDQ2IDAgMCAwLTEuMDQ1LTEuMDVcIi8+PHBhdGggZD1cIk0xMy43NTEgMjAuODExYTEuMDQ3IDEuMDQ3IDAgMCAwLTEuMzcyLjU2NGwtMS4zNzQgMy4yOThhMS4wNTMgMS4wNTMgMCAwIDAgLjk2NiAxLjQ1MmMuNDExIDAgLjgtLjI0My45NjgtLjY0N2wxLjM3NC0zLjI5N2ExLjA0NSAxLjA0NSAwIDAgMC0uNTYyLTEuMzdcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTE5LjYwNCAyMS4zOTNhMS4wNDcgMS4wNDcgMCAxIDAtMS45MzguNzk2bDEuMzU1IDMuMjk5YTEuMDUgMS4wNSAwIDAgMCAxLjkzOS0uNzk1bC0xLjM1Ni0zLjN6XCIgZmlsbC1vcGFjaXR5PVwiLjRcIi8+PHBhdGggZD1cIk05LjUgMTYuOTY0aC4wMDJhMS4wNDkgMS4wNDkgMCAwIDAgLjAwMi0yLjA5NmwtMy40NTUtLjAwN2gtLjAwMmExLjA0NyAxLjA0NyAwIDAgMC0uMDAyIDIuMDk2bDMuNDU1LjAwN3pcIiBmaWxsLW9wYWNpdHk9XCIuOTAyXCIvPjxwYXRoIGQ9XCJNMjEuMDc1IDEzLjgyOWExLjA0NiAxLjA0NiAwIDAgMCAxLjM2OC41N2wzLjE1OC0xLjI5NWMuNTM0LS4yMi43OS0uODMzLjU2OS0xLjM2NmExLjA0NCAxLjA0NCAwIDAgMC0xLjM2Ny0uNTdsLTMuMTU4IDEuMjk0Yy0uNTM2LjIyLS43OS44MzMtLjU3IDEuMzY3XCIgZmlsbC1vcGFjaXR5PVwiLjJcIi8+PHBhdGggZD1cIk0xMC45OTIgMTcuOTlhMS4wNDMgMS4wNDMgMCAwIDAtMS4zNjctLjU3bC0zLjIyOCAxLjMzMmExLjA0NyAxLjA0NyAwIDAgMCAuMzk5IDIuMDE2Yy4xMzIgMCAxLjU1OC0uNTU4IDEuNjg5LS42MTNsMS45MzgtLjc5OGMuNTM1LS4yMi43OS0uODMzLjU2OS0xLjM2N1wiIGZpbGwtb3BhY2l0eT1cIi44XCIvPjxwYXRoIGQ9XCJNMjEuMjgxIDE5Ljc1YTEuMDQ3IDEuMDQ3IDAgMSAwLTEuNDgzIDEuNDhsMi40ODIgMi40OWExLjA0NSAxLjA0NSAwIDAgMCAxLjQ4Mi4wMDIgMS4wNDcgMS4wNDcgMCAwIDAgLjAwNC0xLjQ4MmwtMi40ODUtMi40OXpcIiBmaWxsLW9wYWNpdHk9XCIuMzQ5XCIvPjxwYXRoIGQ9XCJNMTkuOTAyIDEyLjA0YTEuMDQ4IDEuMDQ4IDAgMCAwIDEuNDgzLjAwM2wyLjQwNS0yLjM5N2ExLjA0OCAxLjA0OCAwIDAgMC0xLjQ3OS0xLjQ4NWwtMi40MDQgMi4zOTdhMS4wNDcgMS4wNDcgMCAwIDAtLjAwNSAxLjQ4MlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xOC4xMyAxMC44MTNhMS4wNSAxLjA1IDAgMCAwIDEuMzcxLS41NjVsMS4yOTEtMy4xMDdhMS4wNDcgMS4wNDcgMCAxIDAtMS45MzUtLjgwNGwtMS4yOTEgMy4xMDZjLS4yMjIuNTM0LjAzIDEuMTQ3LjU2NCAxLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjEwMlwiLz48cGF0aCBkPVwiTTEzLjE3NiA2LjMyNmExLjA0OSAxLjA0OSAwIDAgMC0xLjkzNy44bDEuMjg2IDMuMTE1YTEuMDQ1IDEuMDQ1IDAgMCAwIDEuMzY3LjU2OWMuNTM2LS4yMi43OS0uODMzLjU3LTEuMzY3bC0xLjI4Ni0zLjExN3pNMTAuNjI2IDEyLjAxNWExLjA1IDEuMDUgMCAwIDAgMS40ODIuMDAzIDEuMDQ4IDEuMDQ4IDAgMCAwIC4wMDItMS40ODJMOS43MTcgOC4xMzdhMS4wNDcgMS4wNDcgMCAxIDAtMS40ODUgMS40NzlsMi4zOTQgMi4zOTl6XCIvPjxwYXRoIGQ9XCJNMTIuMTg2IDE5LjcyOWExLjA0NyAxLjA0NyAwIDAgMC0xLjQ4Mi0uMDAzTDguMjA4IDIyLjIxYTEuMDQ3IDEuMDQ3IDAgMCAwIDEuNDc5IDEuNDg1bDIuNDk1LTIuNDg1Yy40MS0uNDA4LjQxMS0xLjA3MS4wMDQtMS40ODFcIiBmaWxsLW9wYWNpdHk9XCIuNzAyXCIvPjxwYXRoIGQ9XCJNMjUuNTkgMTguNzg3bC0zLjIxNC0xLjMzOGExLjA0NyAxLjA0NyAwIDEgMC0uODA1IDEuOTM1bDMuMjEzIDEuMzM4YTEuMDUgMS4wNSAwIDAgMCAuODA2LTEuOTM1XCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTYuNDA3IDEzLjA2OWwzLjE1OSAxLjMxNWExLjA0NyAxLjA0NyAwIDAgMCAxLjM2OS0uNTY2IDEuMDQ4IDEuMDQ4IDAgMCAwLS41NjQtMS4zN2wtMy4xNTctMS4zMTRhMS4wNDkgMS4wNDkgMCAwIDAtLjgwNyAxLjkzNVwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wcm9ncmVzc1wiIGRhdGEtbmFtZT1cInByb2dyZXNzXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGw9XCJub25lXCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIyLjkxNWMtLjc1OCAwLTEuMzcuNjEzLTEuMzcgMS4zN3Y0LjYwNWExLjM3IDEuMzcgMCAxIDAgMi43NCAwdi00LjYwNWExLjM3IDEuMzcgMCAwIDAtMS4zNy0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI5LjAxOCAxNC41NjFsLTQuNTIyLS4wMDljLS43ODEuMDE2LTEuMzczLjYwOS0xLjM3MyAxLjM2N2ExLjM3IDEuMzcgMCAwIDAgMS4zNjggMS4zNzNsNC41MjEuMDA5aC4wMDNhMS4zNzEgMS4zNzEgMCAwIDAgLjAwMy0yLjc0XCIgZmlsbC1vcGFjaXR5PVwiLjI1MVwiLz48cGF0aCBkPVwiTTE2LjAzMy4yNDJoLS4wMDJhMS4zNyAxLjM3IDAgMCAwLTEuMzcgMS4zNjdsLS4wMTYgNS42OGExLjM3MSAxLjM3MSAwIDAgMCAxLjM2NyAxLjM3M2guMDAzYTEuMzcgMS4zNyAwIDAgMCAxLjM3LTEuMzY4bC4wMTYtNS42NzlBMS4zNjggMS4zNjggMCAwIDAgMTYuMDMzLjI0MlwiLz48cGF0aCBkPVwiTTEzLjA1OSAyMi4yOTFhMS4zNyAxLjM3IDAgMCAwLTEuNzk0LjczN2wtMS43OTcgNC4zMTNjLS4yOTEuNjk4LjAzOSAxLjUuNzM2IDEuNzlhMS4zNiAxLjM2IDAgMCAwIDEuNzk0LS43MzdsMS43OTYtNC4zMTFhMS4zNjggMS4zNjggMCAwIDAtLjczNS0xLjc5MlwiIGZpbGwtb3BhY2l0eT1cIi42XCIvPjxwYXRoIGQ9XCJNMjAuNzEzIDIzLjA1MmExLjM3IDEuMzcgMCAxIDAtMi41MzUgMS4wNDFsMS43NzMgNC4zMTRhMS4zNyAxLjM3IDAgMSAwIDIuNTM2LTEuMDM5bC0xLjc3NC00LjMxNnpcIiBmaWxsLW9wYWNpdHk9XCIuNFwiLz48cGF0aCBkPVwiTTcuNTAxIDE3LjI2aC4wMDJhMS4zNyAxLjM3IDAgMCAwIC4wMDMtMi43NGwtNC41MTgtLjAwOWgtLjAwM2MtLjc1NiAwLTEuMzcuNjExLTEuMzcgMS4zNjdhMS4zNjggMS4zNjggMCAwIDAgMS4zNjcgMS4zNzNsNC41MTkuMDA5elwiIGZpbGwtb3BhY2l0eT1cIi45MDJcIi8+PHBhdGggZD1cIk0yMi42MzYgMTMuMTYyYTEuMzcgMS4zNyAwIDAgMCAxLjc4OS43NDVsNC4xMy0xLjY5NGExLjM2OCAxLjM2OCAwIDAgMCAuNzQ0LTEuNzg2IDEuMzY1IDEuMzY1IDAgMCAwLTEuNzg4LS43NDVsLTQuMTMgMS42OTJhMS4zNjkgMS4zNjkgMCAwIDAtLjc0NSAxLjc4OFwiIGZpbGwtb3BhY2l0eT1cIi4yXCIvPjxwYXRoIGQ9XCJNOS40NTEgMTguNjAyYTEuMzYzIDEuMzYzIDAgMCAwLTEuNzg4LS43NDVsLTQuMjIgMS43NDFhMS4zNjkgMS4zNjkgMCAwIDAtLjc0NSAxLjc4N2MuMjE3LjUzLjcyOC44NTEgMS4yNjcuODUxLjE3MiAwIDIuMDM2LS43MzEgMi4yMDgtLjgwMmwyLjUzNC0xLjA0NGExLjM2OCAxLjM2OCAwIDAgMCAuNzQ0LTEuNzg4XCIgZmlsbC1vcGFjaXR5PVwiLjhcIi8+PHBhdGggZD1cIk0yMi45MDYgMjAuOTA0YTEuMzcgMS4zNyAwIDAgMC0xLjk0IDEuOTM1bDMuMjQ2IDMuMjU2YTEuMzcgMS4zNyAwIDEgMCAxLjk0My0xLjkzNWwtMy4yNDktMy4yNTZ6XCIgZmlsbC1vcGFjaXR5PVwiLjM0OVwiLz48cGF0aCBkPVwiTTIxLjEwMyAxMC44MjJhMS4zNzEgMS4zNzEgMCAwIDAgMS45MzkuMDA0bDMuMTQ1LTMuMTM1YTEuMzcgMS4zNyAwIDEgMC0xLjkzNS0xLjk0MmwtMy4xNDMgMy4xMzVhMS4zNjkgMS4zNjkgMCAwIDAtLjAwNiAxLjkzOFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xOC43ODYgOS4yMTdhMS4zNzMgMS4zNzMgMCAwIDAgMS43OTItLjczOGwxLjY4OS00LjA2M2ExLjM3IDEuMzcgMCAwIDAtMi41MzEtMS4wNTJsLTEuNjg5IDQuMDYxYy0uMjkuNjk5LjA0IDEuNS43MzkgMS43OTJcIiBmaWxsLW9wYWNpdHk9XCIuMTAyXCIvPjxwYXRoIGQ9XCJNMTIuMzA3IDMuMzVhMS4zNyAxLjM3IDAgMCAwLTIuNTMzIDEuMDQ2bDEuNjgyIDQuMDc0YTEuMzY4IDEuMzY4IDAgMCAwIDEuNzg4Ljc0MyAxLjM2OCAxLjM2OCAwIDAgMCAuNzQ1LTEuNzg3TDEyLjMwNyAzLjM1ek04Ljk3MyAxMC43ODlhMS4zNyAxLjM3IDAgMCAwIDEuOTM3LjAwNCAxLjM2OSAxLjM2OSAwIDAgMCAuMDAzLTEuOTM4TDcuNzg0IDUuNzE4YTEuMzY5IDEuMzY5IDAgMCAwLTEuOTM3LS4wMDQgMS4zNjkgMS4zNjkgMCAwIDAtLjAwNCAxLjkzOGwzLjEzIDMuMTM3elwiLz48cGF0aCBkPVwiTTExLjAxMiAyMC44NzZhMS4zNjkgMS4zNjkgMCAwIDAtMS45MzctLjAwNEw1LjgxIDI0LjEyMWExLjM3IDEuMzcgMCAwIDAgLjk2OSAyLjM0Yy4zNDggMCAuNjk5LS4xMzEuOTY2LS4zOTlsMy4yNjMtMy4yNDlhMS4zNyAxLjM3IDAgMCAwIC4wMDQtMS45MzdcIiBmaWxsLW9wYWNpdHk9XCIuNzAyXCIvPjxwYXRoIGQ9XCJNMjguNTQgMTkuNjQ1bC00LjIwMy0xLjc1MWMtLjY5Ny0uMjktMS41LjA0MS0xLjc4OS43MzlhMS4zNyAxLjM3IDAgMCAwIC43MzcgMS43OTJsNC4yMDIgMS43NWExLjM3IDEuMzcgMCAwIDAgMS43OS0uNzM3IDEuMzcgMS4zNyAwIDAgMC0uNzM3LTEuNzkzXCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTMuNDU2IDEyLjE2N2w0LjEzMSAxLjcxOWExLjM2NiAxLjM2NiAwIDAgMCAxLjc4OS0uNzQgMS4zNjcgMS4zNjcgMCAwIDAtLjczNy0xLjc5TDQuNTExIDkuNjM3YTEuMzcgMS4zNyAwIDEgMC0xLjA1NSAyLjUzXCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXF1ZXN0aW9uLWNpcmNsZVwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTcuNDYxIDE3LjI5MnYzLjA1M2ExLjQ2IDEuNDYgMCAxIDEtMi45MjIgMHYtNC4zM2MwLS44MDQuNjU0LTEuNDYxIDEuNDYxLTEuNDYxYTIuODY5IDIuODY5IDAgMSAwLTIuODctMi44NjcgMS40NjEgMS40NjEgMCAwIDEtMi45MjIgMEE1Ljc5OCA1Ljc5OCAwIDAgMSAxNiA1Ljg5NWE1Ljc5OCA1Ljc5OCAwIDAgMSA1Ljc5MiA1Ljc5MiA1Ljc5OSA1Ljc5OSAwIDAgMS00LjMzMSA1LjYwNU0xNiAyNS4zOThhMS40NDEgMS40NDEgMCAxIDEgMC0yLjg4MiAxLjQ0IDEuNDQgMCAxIDEgMCAyLjg4MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZWZyZXNoLWNpcmNsZVwiIGRhdGEtbmFtZT1cInJlZnJlc2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNS42MjggMTAuMTA3bC0xLjA0OCA0LjEyYy0uMDEyLjA0Ni0uMDQ0LjA4Ni0uMDY0LjEzNWExLjIzOCAxLjIzOCAwIDAgMS0xLjEyOS43OTRjLS4wMzQgMC0uMDY2LS4wMS0uMTAxLS4wMTItLjAzMi0uMDAzLS4wNjEtLjAwOC0uMDkxLS4wMTMtLjAzNy0uMDA3LS4wNzYtLjAwNS0uMTEzLS4wMTRsLTQuMTE3LTEuMDUxYTEuMjMgMS4yMyAwIDAgMS0uODkzLTEuNDk2IDEuMjI4IDEuMjI4IDAgMCAxIDEuNTAyLS44OWwxLjQ2Mi4zN2E2LjMwNyA2LjMwNyAwIDAgMC0xLjg0Mi0xLjUzMSA2LjI0OCA2LjI0OCAwIDAgMC00Ljc3NS0uNTI1IDYuMjM4IDYuMjM4IDAgMCAwLTMuNzUgMy4wMSA2LjIxNiA2LjIxNiAwIDAgMC0uNTI1IDQuNzc3Yy45NjcgMy4zMjYgNC40NiA1LjI0NiA3Ljc4NSA0LjI3NWExLjIzMyAxLjIzMyAwIDEgMSAuNjg4IDIuMzY5IDguODEgOC44MSAwIDAgMS0yLjQ0LjM0OGMtMy43ODkgMC03LjI5LTIuNDg1LTguNDAyLTYuMzAxYTguNjk0IDguNjk0IDAgMCAxIC43MzItNi42NTYgOC43MTMgOC43MTMgMCAwIDEgNS4yMjQtNC4xODkgOC42OTEgOC42OTEgMCAwIDEgNi42NDkuNzMgOC43NiA4Ljc2IDAgMCAxIDIuNTk4IDIuMTcybC4yNjEtMS4wMjhhMS4yMjYgMS4yMjYgMCAwIDEgMS40OTktLjg5IDEuMjMgMS4yMyAwIDAgMSAuODkgMS40OTZcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcmVzdG9yZVwiIGRhdGEtbmFtZT1cInJlc3RvcmVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbD1cIm5vbmVcIi8+PHBhdGggZD1cIk0yNC4zNDEgNy4yMTZhMTIuMTIzIDEyLjEyMyAwIDAgMC04Ljc1Mi0zLjI3M2MtMy4zOTUuMTE5LTYuNjM4IDEuNzAzLTguODk5IDQuMzQ4YTEyLjMgMTIuMyAwIDAgMC0yLjc3NyA1Ljg4N2wtMS40NTYtMi4xOTNBMS4xNjIgMS4xNjIgMCAxIDAgLjUyIDEzLjI3MWwzLjQ3OCA1LjIzOWMuNDE1LjY1OCAxLjQyLjY5NSAxLjkwMS4wNTdsNC4wMTgtNC41NzVhMS4xNjQgMS4xNjQgMCAwIDAtLjEwNi0xLjY0MiAxLjE2NiAxLjE2NiAwIDAgMC0xLjY0MS4xMDdsLTEuOTgyIDIuMjU2YTkuOTc3IDkuOTc3IDAgMCAxIDIuMjcxLTQuOTExYzEuODM3LTIuMTUxIDQuNDY2LTMuNDM4IDcuMjExLTMuNTM1YTkuODAxIDkuODAxIDAgMCAxIDcuMDg1IDIuNjUgOS44MiA5LjgyIDAgMCAxIDMuMTM2IDYuODgzIDkuODEzIDkuODEzIDAgMCAxLTIuNjQ4IDcuMDg1IDkuODIzIDkuODIzIDAgMCAxLTYuODg0IDMuMTM2IDEuMTYyIDEuMTYyIDAgMCAwIC4wNDEgMi4zMjRoLjA0YTEyLjEyNyAxMi4xMjcgMCAwIDAgOC41MDMtMy44NzQgMTIuMTIzIDEyLjEyMyAwIDAgMCAzLjI3Mi04Ljc1MiAxMi4xMzMgMTIuMTMzIDAgMCAwLTMuODc0LTguNTAzXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlYXJjaC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzZWFyY2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjcxNiAxMy43NzFhNi4xMTIgNi4xMTIgMCAwIDEgNi4xMDUtNi4xMDNjMy4zNjIgMCA2LjA5OCAyLjc0IDYuMDk4IDYuMTAzIDAgMy4zNjQtMi43MzYgNi4xMDQtNi4wOTggNi4xMDRhNi4xMTIgNi4xMTIgMCAwIDEtNi4xMDUtNi4xMDRtMTguMTkgMTAuNzg0bC01Ljg4LTUuODgyYzEuMDczLTEuMzUzIDEuNzM5LTMuMDQyIDEuNzM5LTQuOTAyIDAtNC4zODItMy41NjMtNy45NDktNy45NDQtNy45NDktNC4zODQgMC03Ljk1MSAzLjU2Ny03Ljk1MSA3Ljk0OSAwIDQuMzgzIDMuNTY3IDcuOTUgNy45NTEgNy45NSAxLjg1NiAwIDMuNTQ3LS42NyA0LjktMS43NDNsNS44ODIgNS44ODJjLjE3OS4xODEuNDE1LjI3LjY1Mi4yN2EuOTExLjkxMSAwIDAgMCAuNjUxLS4yNy45Mi45MiAwIDAgMCAwLTEuMzA1XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXItY2lyY2xlXCIgZGF0YS1uYW1lPVwic3Rhci1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE2LjA4IDUuMTU1YS45ODcuOTg3IDAgMCAxIC43MTEuMzY3Yy4wNTIuMDY3LjA4OS4xMzcuMTI1LjIxM2wyLjYwNyA2LjEwNmg2LjA1OWwuMDgzLjAwNGMuMTY5LjAyMi4zMjUuMDcxLjQ2Ni4xNjlhLjk2Ni45NjYgMCAwIDEgLjMxNiAxLjE4OWMtLjA2MS4xMy0uMTQ5LjIzMy0uMjU0LjMyOGwtNS4yMTMgNC4zNDEgMi42MjkgNy4wMTQuMDI2LjA4Yy4wMzkuMTY3LjA0OC4zMzEuMDA0LjQ5OWEuOTY2Ljk2NiAwIDAgMS0xLjAxMy43MDkgMS4wMjYgMS4wMjYgMCAwIDEtLjQ2Ny0uMTc0bC02LjEzNS00LjM3OUw5Ljg4OSAyNmwtLjA3MS4wNDZjLS4xNTEuMDgtLjMwNy4xMzEtLjQ4LjEzMmEuOTY2Ljk2NiAwIDAgMS0uOTQ3LS43OTYgMS4wMjEgMS4wMjEgMCAwIDEgLjA0OC0uNDk2bDIuNjI5LTcuMDE0LTUuMjEzLTQuMzQxLS4wNjItLjA1NmExLjAzOSAxLjAzOSAwIDAgMS0uMjI0LS4zNDkuOTY2Ljk2NiAwIDAgMSAuNDE5LTEuMTU3Yy4xNDktLjA4Ni4zMDgtLjEyMS40NzgtLjEyOGg2LjA2MmwyLjYzMi02LjEwOS4wMzYtLjA3NGMuMDQyLS4wNzIuMDg2LS4xMzkuMTQ0LS4yMDFhLjk5My45OTMgMCAwIDEgLjU3Ni0uMjk1Yy4wODItLjAwNy4wODItLjAwNy4xNjQtLjAwN3ptLTIuMDQ1IDguMDJhLjk2Ny45NjcgMCAwIDEtLjg3OC41NzhIOS4xMDhsMy43MDUgMy4wODQuMDYyLjA1N2MuMDU4LjA2My4xMTEuMTI1LjE1NC4yYS45NjkuOTY5IDAgMCAxIC4xMjQuNTY3IDEuMjA1IDEuMjA1IDAgMCAxLS4wNTcuMjQ2bC0xLjc2OCA0LjcxNyA0LjE0MS0yLjk1NS4wNzEtLjA0NmEuOTY4Ljk2OCAwIDAgMSAuODE2LS4wNzNjLjA4MS4wMy4xNTEuMDcyLjIyMy4xMTlsNC4xNDEgMi45NTUtMS43NjgtNC43MTctLjAyNi0uMDhhLjk1NS45NTUgMCAwIDEgLjMxLS45OWwzLjcwNC0zLjA4NGgtNC4wNDlsLS4wNzktLjAwNGExLjE3NCAxLjE3NCAwIDAgMS0uMjM0LS4wNDkuOTg3Ljk4NyAwIDAgMS0uNTY2LS41MjhsLTEuOTc5LTQuNjM3LTEuOTk4IDQuNjR6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXR1cy1mYWlsZWRcIiBkYXRhLW5hbWU9XCJzdGF0dXMtZmFpbGVkXCIgdmlld0JveD1cIjAgMCAzMyAzMlwiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0xNi4yMTcgMjYuNjY5YTEuMzYgMS4zNiAwIDEgMS0uMDA0LTIuNzIgMS4zNiAxLjM2IDAgMCAxIC4wMDQgMi43Mm0tMS4yNDgtMTMuNjA3YTEuMjQ4IDEuMjQ4IDAgMCAxIDIuNDk1IDB2OC4xNjNhMS4yNDcgMS4yNDcgMCAxIDEtMi40OTUgMHYtOC4xNjN6bTE3LjQyNCAxNy4zMTlMMTcuNjQ5Ljg5MWMtLjAyNS0uMDQ4LS4wNTgtLjA4LS4wODUtLjEyNWExLjU2NiAxLjU2NiAwIDAgMC0uODE2LS42NjFzLjAwMy0uMDAzLjAwNS0uMDAzQTEuNTcgMS41NyAwIDAgMCAxNi4yMTcgMGMtLjU2NyAwLTEuMDYzLjI5NC0xLjM0OC43NjEtLjAyNC4wNDItLjA1Ny4wNzUtLjA3OS4xMTdMLjEzMyAzMC4xOTRhMS4yNCAxLjI0IDAgMCAwIC4wNTIgMS4yMTJjLjIzLjM2OS42MjkuNTk0IDEuMDYzLjU5NEgzMS4yMWMuNjg5IDAgMS4yNDctLjU1OSAxLjI0Ny0xLjI0NyAwLS4xMy0uMDI3LS4yNTItLjA2NC0uMzcyXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXR1cy1wYXJ0aWFsXCIgZGF0YS1uYW1lPVwic3RhdHVzLXBhcnRpYWxcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2IDBDNy4xNzggMCAwIDcuMTc4IDAgMTZzNy4xNzggMTYgMTYgMTYgMTYtNy4xNzggMTYtMTZTMjQuODIyIDAgMTYgMHptLjAxMyAyLjQ3MnYyNy4wNTVsLjEwMi4wMWExMy40OTQgMTMuNDk0IDAgMCAwIDkuMzM3LTMuODU1IDEzLjYzNCAxMy42MzQgMCAwIDAgMi44MjEtMy45NyAxMy40MjggMTMuNDI4IDAgMCAwIDEuMTM0LTMuODE5Yy4yMDctMS40NzguMTctMi45ODktLjExMS00LjQ1NGExMy40MTEgMTMuNDExIDAgMCAwLTEuMjM5LTMuNTkzIDEzLjY5NiAxMy42OTYgMCAwIDAtNi4wNDktNS45NzcgMTMuNDc1IDEzLjQ3NSAwIDAgMC01LjQ4NC0xLjM5OGMtLjE3MS0uMDA1LS4zNDEtLjAxNi0uNTExLjAwMXpcIi8+PHBhdGggZD1cIk0xNi4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFhMTMuNDk0IDEzLjQ5NCAwIDAgMCA5LjMzNy0zLjg1NSAxMy42MzQgMTMuNjM0IDAgMCAwIDIuODIxLTMuOTcgMTMuNDI4IDEzLjQyOCAwIDAgMCAxLjEzNC0zLjgxOWMuMjA3LTEuNDc4LjE3LTIuOTg5LS4xMTEtNC40NTRhMTMuNDExIDEzLjQxMSAwIDAgMC0xLjIzOS0zLjU5MyAxMy42OTYgMTMuNjk2IDAgMCAwLTYuMDQ5LTUuOTc3IDEzLjQ3NSAxMy40NzUgMCAwIDAtNS40ODQtMS4zOThjLS4xNzEtLjAwNS0uMzQxLS4wMTYtLjUxMS4wMDF6XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXR1cy1wZW5kaW5nXCIgZGF0YS1uYW1lPVwic3RhdHVzLXBlbmRpbmdcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTIwIDE4LjY2NmgtNi42NjZWOEExLjMzMiAxLjMzMiAwIDEgMSAxNiA4djhoNGExLjMzMiAxLjMzMiAwIDEgMSAwIDIuNjY2TTE2IDBDNy4xNzggMCAwIDcuMTc4IDAgMTZzNy4xNzggMTYgMTYgMTYgMTYtNy4xNzggMTYtMTZTMjQuODIyIDAgMTYgMFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zeW5jLWNpcmNsZVwiIGRhdGEtbmFtZT1cInN5bmMtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNS43NTQgMTkuMjY3YTkuODI4IDkuODI4IDAgMCAxLTkuMjU0IDYuNTM4Yy0yLjc3NiAwLTUuNDUxLTEuMTY4LTcuMzYtMy4wMTR2LjgzMmMwIC42OC0uNTQ3IDEuMjI3LTEuMjI3IDEuMjI3YTEuMjI2IDEuMjI2IDAgMCAxLTEuMjI3LTEuMjI3di00Ljc3MWMwLS42NzcuNTUtMS4yMjcgMS4yMjctMS4yMjdoNC43NzFhMS4yMjcgMS4yMjcgMCAxIDEgMCAyLjQ1NGgtMi42NjhjMS40MDkgMS45NTkgMy44OCAzLjI3MiA2LjQ4NCAzLjI3MmE3LjM3NiA3LjM3NiAwIDAgMCA2Ljk0My00LjkwNCAxLjIyNCAxLjIyNCAwIDAgMSAxLjU2NS0uNzQ4Yy42MzguMjI2Ljk3Mi45My43NDYgMS41NjhNNi4yOTMgMTIuNzgxYTkuODMxIDkuODMxIDAgMCAxIDkuMjU1LTYuNTM4YzIuNzc1IDAgNS40NTMgMS4xNyA3LjM2IDMuMDE4di0uODM2YTEuMjI3IDEuMjI3IDAgMCAxIDIuNDU0IDB2NC43N2MwIC42OC0uNTUgMS4yMjctMS4yMjcgMS4yMjdoLTQuNzcxYTEuMjI2IDEuMjI2IDAgMSAxIDAtMi40NTRoMi42NjdjLTEuNDA4LTEuOTU2LTMuODgyLTMuMjcxLTYuNDgzLTMuMjcxQTcuMzcxIDcuMzcxIDAgMCAwIDguNjA3IDEzLjZhMS4yMyAxLjIzIDAgMCAxLTEuNTY1Ljc0OSAxLjIyOSAxLjIyOSAwIDAgMS0uNzQ5LTEuNTY4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRodW1icy11cC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJ0aHVtYnMtdXAtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy4wNyAxOC42MDFhMS40MTMgMS40MTMgMCAwIDEgMCAyLjgyOGgtLjk0M2ExLjQxNCAxLjQxNCAwIDEgMSAwIDIuODI4SDE2Yy0zLjc3IDAtMi44MjgtMS44ODYtMTAuMzY5LTEuODg2di04LjQ4M2gyLjgyOGMzLjI5OSAwIDcuMDctMy4wMzcgNy4wNy03LjU0MSAwLTEuNDkgMi44MjgtMS42NzkgMi44MjggMS4xNDkgMCAxLjg4NS0uOTQzIDUuNDQ5LS45NDMgNS40NDloNy41NDFhMS40MTUgMS40MTUgMCAwIDEgMCAyLjgyOGgtLjk0M2ExLjQxNCAxLjQxNCAwIDEgMSAwIDIuODI4aC0uOTQyXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXdhcm5pbmctY2lyY2xlXCIgZGF0YS1uYW1lPVwid2FybmluZy1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE2Ljg5OCAxNy45ODVhLjg5Mi44OTIgMCAwIDEtMS43ODMgMHYtNC44NjRhLjg5MS44OTEgMCAwIDEgMS43ODMgMHY0Ljg2NHptLS44OTIgMy4yNDJhLjgxMS44MTEgMCAxIDEgLjAwNC0xLjYyMi44MTEuODExIDAgMCAxLS4wMDQgMS42MjJtOS42MTQgMS44MzdMMTYuODAzIDUuNDI5Yy0uMzAzLS42MDQtMS4yOTEtLjYwNC0xLjU5NCAwTDYuMjk0IDIzLjI2YS44ODMuODgzIDAgMCAwIC4wMzkuODY2Ljg5Ljg5IDAgMCAwIC43NTguNDI1aDE3LjgzMWMuMDEyLS4wMDIuMDIzIDAgLjAzNSAwYS44OTMuODkzIDAgMCAwIC42NjMtMS40ODdcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmcteC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJ4LWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjMuNDg0IDIxLjY3OWExLjIyNiAxLjIyNiAwIDAgMS0xLjczMyAxLjczM0wxNiAxNy42NjFsLTUuNzQ5IDUuNzUxYTEuMjI0IDEuMjI0IDAgMCAxLTEuNzM1IDAgMS4yMjYgMS4yMjYgMCAwIDEgMC0xLjczM2w1Ljc1Mi01Ljc1MS01Ljc1Mi01Ljc0OWExLjIyNSAxLjIyNSAwIDEgMSAxLjczNS0xLjczMkwxNiAxNC4xOTZsNS43NTEtNS43NDlhMS4yMjUgMS4yMjUgMCAwIDEgMS43MzMgMS43MzJsLTUuNzUyIDUuNzQ5IDUuNzUyIDUuNzUxelwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1idXR0b25zXCIgZGF0YS1uYW1lPVwiYnV0dG9uc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2MzY2RkYlwiIGQ9XCJNMzI2LjkgNDFjMS42IDAgMyAxLjQgMyAzdjI5LjhjMCAxLjYtMS40IDMtMyAzSDE0MC44Yy0xLjYgMC0zLTEuNC0zLTNWNDRjMC0xLjYgMS40LTMgMy0zaDE4Ni4xbTAtNUgxNDAuOGMtNC40IDAtOCAzLjYtOCA4djI5LjhjMCA0LjQgMy42IDggOCA4aDE4Ni4xYzQuNCAwIDgtMy42IDgtOFY0NGMwLTQuNC0zLjYtOC04LTh6XCIvPjxyZWN0IGZpbGw9XCIjOGM5YmE1XCIgeD1cIjE5OC43XCIgeT1cIjU0LjFcIi8+PHBhdGggZmlsbD1cIiNkZDJmNDFcIiBkPVwiTTMyNy40IDk0LjFIMTQwLjZjLTQuMiAwLTcuNyAzLjUtNy43IDcuN3YzMC40YzAgNC4yIDMuNSA3LjcgNy43IDcuN2gxODYuN2M0LjIgMCA3LjctMy41IDcuNy03Ljd2LTMwLjRjLjEtNC4yLTMuNC03LjctNy42LTcuN3ptLTU4LjYgMjcuN2gtNzAuMnYtOS42aDcwLjJ2OS42elwiLz48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMzI3LjEgMTUyLjJIMTQwLjljLTQuNCAwLTcuOSAzLjYtNy45IDcuOVYxOTBjMCA0LjQgMy42IDcuOSA3LjkgNy45aDE4Ni4yYzQuNCAwIDcuOS0zLjYgNy45LTcuOXYtMjkuOWMuMS00LjMtMy41LTcuOS03LjktNy45em0tNTguMyAyNy42aC03MC4ydi05LjZoNzAuMnY5LjZ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2FyZHNcIiBkYXRhLW5hbWU9XCJjYXJkc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNNDA1LjkgMzZIMjU4LjVjLTQuNSAwLTguMSAzLjYtOC4xIDguMXYxNDUuOGMwIDQuNSAzLjYgOC4xIDguMSA4LjFoMTQ3LjRjNC41IDAgOC4xLTMuNiA4LjEtOC4xVjQ0LjFjMC00LjUtMy42LTguMS04LjEtOC4xem0tMTUwLjQgOC4xYzAtMS42IDEuNC0zIDMtM2gxNDcuNGMxLjYgMCAzIDEuNCAzIDNWMTU2SDI1NS41VjQ0LjF6TTIwOS42IDQwLjdjMS42IDAgMyAxLjQgMyAzdjE0Ni4xYzAgMS42LTEuNCAzLTMgM0g2MS45Yy0xLjYgMC0zLTEuNC0zLTN2LTE0NmMwLTEuNiAxLjQtMyAzLTNoMTQ3LjdtMC01LjFINjEuOWMtNC41IDAtOC4xIDMuNy04LjEgOC4xdjE0Ni4xYzAgNC41IDMuNyA4LjEgOC4xIDguMWgxNDcuN2M0LjUgMCA4LjEtMy43IDguMS04LjFWNDMuOGMuMS00LjUtMy42LTguMS04LjEtOC4xelwiLz48cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNNDAxLjUgMTg3LjFoLTUzLjZjLTEuOSAwLTMuNS0xLjYtMy41LTMuNXYtMTIuN2MwLTEuOSAxLjYtMy41IDMuNS0zLjVoNTMuNmMxLjkgMCAzLjUgMS42IDMuNSAzLjV2MTIuN2MwIDEuOS0xLjYgMy41LTMuNSAzLjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY29sb3Itd2hlZWxcIiBkYXRhLW5hbWU9XCJjb2xvci13aGVlbFwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiIzJhYzg0ZlwiIGQ9XCJNMzA2LjggODEuOGMtNy45LTE2LjEtMjAuOS0yOS4xLTM3LTM3LS44LjgtMS40IDEuOC0xLjkgMi44bC0xMS4zIDI2LjItMTEuMiAyNi4yYy0yLjEgNC44IDEuNCA4LjIgNi4yIDYuMmwyNi4yLTExLjNMMzA0IDgzLjZjMS0uNCAyLTEuMSAyLjgtMS44elwiLz48cGF0aCBmaWxsPVwiIzU5YTcwMlwiIGQ9XCJNMzEwLjYgOTEuMWMtMS4xIDAtMi4yLjMtMy4zLjdsLTI2LjUgMTAuNi0yNi41IDEwLjZjLTQuOSAxLjktNC45IDYuOCAwIDguN2wyNi41IDEwLjYgMjYuNSAxMC42YzEuMS40IDIuMi42IDMuMy43IDIuOC04LjIgNC4zLTE3IDQuMy0yNi4ycy0xLjUtMTguMS00LjMtMjYuM3pcIi8+PHBhdGggZmlsbD1cIiNlZmMxMDJcIiBkPVwiTTMwNi44IDE1Mi43Yy0uOC0uOC0xLjgtMS40LTIuOC0xLjlsLTI2LjItMTEuMy0yNi4yLTExLjNjLTQuOC0yLjEtOC4yIDEuNC02LjIgNi4ybDExLjMgMjYuMiAxMS4zIDI2LjJjLjUgMS4xIDEuMSAyIDEuOSAyLjggMTUuOS03LjggMjktMjAuOCAzNi45LTM2Ljl6XCIvPjxwYXRoIGZpbGw9XCIjZjY5NTI0XCIgZD1cIk0yMzQuMyAxOTcuOWM5LjIgMCAxOC0xLjUgMjYuMi00LjMgMC0xLjEtLjMtMi4yLS43LTMuM2wtMTAuNi0yNi41LTEwLjYtMjYuNWMtMS45LTQuOS02LjgtNC45LTguNyAwbC0xMC42IDI2LjUtMTAuNiAyNi41Yy0uNCAxLjEtLjYgMi4yLS43IDMuMyA4LjMgMi44IDE3LjEgNC4zIDI2LjMgNC4zelwiLz48cGF0aCBmaWxsPVwiI2Y5NjYyM1wiIGQ9XCJNMjE3LjEgMTI4LjNsLTI2LjIgMTEuMy0yNi4yIDExLjNjLTEuMS41LTIgMS4xLTIuOCAxLjkgNy45IDE2LjEgMjAuOSAyOS4xIDM3IDM3IC44LS44IDEuNC0xLjggMS45LTIuOGwxMS4zLTI2LjIgMTEuMy0yNi4yYzEuOS00LjktMS41LTguMy02LjMtNi4zelwiLz48cGF0aCBmaWxsPVwiI2E4MWQyN1wiIGQ9XCJNMjE0LjMgMTEyLjlsLTI2LjUtMTAuNi0yNi41LTEwLjZjLTEuMS0uNC0yLjItLjYtMy4zLS43LTIuOCA4LjItNC4zIDE3LTQuMyAyNi4yczEuNSAxOCA0LjMgMjYuMmMxLjEgMCAyLjItLjMgMy4zLS43bDI2LjUtMTAuNiAyNi41LTEwLjZjNC44LTEuOCA0LjgtNi43IDAtOC42elwiLz48cGF0aCBmaWxsPVwiI2EzNDZjZVwiIGQ9XCJNMTYxLjggODEuOGMuOC44IDEuOCAxLjQgMi44IDEuOUwxOTAuOCA5NWwyNi4yIDExLjNjNC44IDIuMSA4LjItMS40IDYuMi02LjJMMjEyIDczLjhsLTExLjMtMjYuMmMtLjUtMS4xLTEuMS0yLTEuOS0yLjgtMTYgNy44LTI5LjEgMjAuOS0zNyAzN3pcIi8+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTIzNC4zIDM2LjZjLTkuMiAwLTE4IDEuNS0yNi4yIDQuMyAwIDEuMS4zIDIuMi43IDMuM2wxMC42IDI2LjVMMjMwIDk3LjJjMS45IDQuOSA2LjggNC45IDguNyAwbDEwLjYtMjYuNSAxMC42LTI2LjVjLjQtMS4xLjYtMi4yLjctMy4zLTguMy0yLjgtMTcuMS00LjMtMjYuMy00LjN6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZGlhbG9nXCIgZGF0YS1uYW1lPVwiZGlhbG9nXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0zNDkuMSAxOTcuM0gxMTguOWMtMS44IDAtMy4zLTEuNS0zLjMtMy4zVjM5LjRjMC0xLjggMS41LTMuMyAzLjMtMy4zaDIzMC4yYzEuOCAwIDMuMyAxLjUgMy4zIDMuM1YxOTRjMCAxLjgtMS41IDMuMy0zLjMgMy4zelwiLz48cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMTc3LjggMTcwLjhjLTMgMC01LjUtMi41LTUuNS01LjVWNjMuN2MwLTMgMi41LTUuNSA1LjUtNS41aDExMi40YzMgMCA1LjUgMi41IDUuNSA1LjV2MTAxLjZjMCAzLTIuNSA1LjUtNS41IDUuNUgxNzcuOHpcIi8+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTI5MC4yIDYwLjdjMS42IDAgMyAxLjQgMyAzdjEwMS42YzAgMS42LTEuNCAzLTMgM0gxNzcuOGMtMS42IDAtMy0xLjQtMy0zVjYzLjdjMC0xLjYgMS40LTMgMy0zaDExMi40bTAtNUgxNzcuOGMtNC40IDAtOCAzLjYtOCA4djEwMS42YzAgNC40IDMuNiA4IDggOGgxMTIuNGM0LjQgMCA4LTMuNiA4LThWNjMuN2MwLTQuNC0zLjYtOC04LTh6XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0yNjAuNCAxNTguMmgtNTIuOWMtMS45IDAtMy41LTEuNi0zLjUtMy41di0xMi41YzAtMS45IDEuNi0zLjUgMy41LTMuNWg1Mi45YzEuOSAwIDMuNSAxLjYgMy41IDMuNXYxMi41YzAgMS45LTEuNSAzLjUtMy41IDMuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1mZWVkYmFja1wiIGRhdGEtbmFtZT1cImZlZWRiYWNrXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxnIGZpbGw9XCIjZjk2NjIzXCI+PHJlY3QgZmlsbC1vcGFjaXR5PVwiLjQ4XCIgeD1cIjI3Ny42XCIgeT1cIjEwNC4yXCIgdHJhbnNmb3JtPVwicm90YXRlKDExMi4wODYgMjgyLjk5NSAxMzYuODY4KVwiLz48cmVjdCB4PVwiMTc5LjZcIiB5PVwiNjQuNVwiIHRyYW5zZm9ybT1cInJvdGF0ZSgxMTIuMDg2IDE4NS4wMDggOTcuMTE2KVwiLz48cGF0aCBmaWxsLW9wYWNpdHk9XCIuMjRcIiBkPVwiTTIwNi45MDYgMTk4LjIzbC0xMC4xLTQuMDk4IDI0LjU1My02MC41MDcgMTAuMSA0LjA5OHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjcyXCIgZD1cIk0yNDYuNzA2IDEwMC4yNzJsLTEwLjEtNC4wOTggMjQuNTUzLTYwLjUwNyAxMC4xIDQuMDk4elwiLz48cGF0aCBmaWxsLW9wYWNpdHk9XCIuMzZcIiBkPVwiTTI3Mi4zMjggMTkzLjU4OGwtMTAuMDQgNC4yNDUtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjg0XCIgZD1cIk0yMzEuMDg2IDk2LjIyM2wtMTAuMDQgNC4yNDQtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjEyXCIgZD1cIk0xNTcuMzg5IDE1NS4yNDZsLTQuMjQ1LTEwLjA0IDYwLjE0OC0yNS40MjggNC4yNDQgMTAuMDR6XCIvPjxwYXRoIGZpbGwtb3BhY2l0eT1cIi42XCIgZD1cIk0yNTQuNzYyIDExNC4wNzZsLTQuMjQ1LTEwLjA0IDYwLjE0OC0yNS40MjggNC4yNDQgMTAuMDR6XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWljb25zXCIgZGF0YS1uYW1lPVwiaWNvbnNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNmMGYzZjZcIiBkPVwiTTMzNC44IDExOXMtNTAuNSA2Mi40LTExMi44IDYyLjRTMTA5LjMgMTE5IDEwOS4zIDExOXM1MC41LTYyLjQgMTEyLjgtNjIuNFMzMzQuOCAxMTkgMzM0LjggMTE5elwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMjIyLjEgMTgzLjljLTE4LjEgMC00Ny01LjUtODEuMy0zMS43LTIwLjQtMTUuNi0zMi45LTMxLTMzLjUtMzEuNkwxMDYgMTE5bDEuMy0xLjZjLjUtLjYgMTMtMTYgMzMuNS0zMS42IDM0LjMtMjYuMiA2My4xLTMxLjcgODEuMy0zMS43IDE4LjEgMCA0NyA1LjUgODEuMyAzMS43IDIwLjQgMTUuNiAzMi45IDMxIDMzLjUgMzEuNmwxLjMgMS42LTEuMyAxLjZjLS41LjYtMTMgMTYtMzMuNSAzMS42LTM0LjQgMjYuMi02My4yIDMxLjctODEuMyAzMS43ek0xMTIuNiAxMTljOC4zIDkuNiA1NC42IDU5LjkgMTA5LjUgNTkuOXMxMDEuMi01MC4zIDEwOS41LTU5LjljLTguMy05LjYtNTQuNi01OS45LTEwOS41LTU5LjlTMTIwLjkgMTA5LjQgMTEyLjYgMTE5elwiLz48cGF0aCBmaWxsPVwiIzU5YTcwMlwiIGQ9XCJNMjIyLjEgNjkuNGMtMjcgMC00OSAyMS45LTQ5IDQ5czIxLjkgNDkgNDkgNDljMjcgMCA0OS0yMS45IDQ5LTQ5cy0yMi00OS00OS00OXptMTEuNSA0MC45Yy02LjQgMC0xMS41LTUuMi0xMS41LTExLjVzNS4yLTExLjUgMTEuNS0xMS41YzYuNCAwIDExLjUgNS4yIDExLjUgMTEuNXMtNS4yIDExLjUtMTEuNSAxMS41elwiLz48cGF0aCBmaWxsPVwiIzU0OTEwM1wiIGQ9XCJNMjMzLjYgMTEwLjNjLTYuNCAwLTExLjUtNS4yLTExLjUtMTEuNSAwLS42LjEtMS4zLjItMS45aC0uMmMtMTEuOSAwLTIxLjUgOS42LTIxLjUgMjEuNXM5LjYgMjEuNSAyMS41IDIxLjUgMjEuNS05LjYgMjEuNS0yMS41YzAtMy44LTEtNy40LTIuOC0xMC42LTIgMS42LTQuNSAyLjUtNy4yIDIuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pbnB1dHNcIiBkYXRhLW5hbWU9XCJpbnB1dHNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTI3OC45IDY0LjJoLTg5LjhjLTI5LjEgMC01Mi44IDIzLjgtNTIuOCA1Mi44IDAgMjkuMSAyMy44IDUyLjggNTIuOCA1Mi44aDg5LjhjMjkuMSAwIDUyLjgtMjMuOCA1Mi44LTUyLjggMC0yOS4xLTIzLjctNTIuOC01Mi44LTUyLjh6bS0uOCA5NS44Yy0yMy4zIDAtNDIuMi0xOC45LTQyLjItNDIuMiAwLTIzLjMgMTguOS00Mi4yIDQyLjItNDIuMiAyMy4zIDAgNDIuMiAxOC45IDQyLjIgNDIuMiAwIDIzLjMtMTguOSA0Mi4yLTQyLjIgNDIuMnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1tZXNzYWdlc1wiIGRhdGEtbmFtZT1cIm1lc3NhZ2VzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgY2xhc3M9XCJzdDBcIiBkPVwiTTM0OS4xIDE5Ny4zSDExOC45Yy0xLjggMC0zLjMtMS41LTMuMy0zLjNWMzkuNGMwLTEuOCAxLjUtMy4zIDMuMy0zLjNoMjMwLjJjMS44IDAgMy4zIDEuNSAzLjMgMy4zVjE5NGMwIDEuOC0xLjUgMy4zLTMuMyAzLjN6XCIvPjxwYXRoIGZpbGw9XCIjNTlhNzAyXCIgZD1cIk0zMjcuMSA4MC4zSDE0MC42Yy0yLjEgMC0zLjgtMS43LTMuOC0zLjhWMzZoMTk0LjF2NDAuNWMwIDIuMS0xLjcgMy44LTMuOCAzLjh6XCIvPjxwYXRoIGZpbGw9XCIjNTQ5MTAzXCIgZD1cIk0xNDAuNiA4MC4zaDQwLjVWMzZoLTQ0LjN2NDAuNWMwIDIuMSAxLjcgMy44IDMuOCAzLjh6XCIvPjxjaXJjbGUgZmlsbD1cIiM3YmMxMTdcIiBjeD1cIjMwNy43XCIgY3k9XCI1OC4xXCIgcj1cIjExLjhcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wYW5lbFwiIGRhdGEtbmFtZT1cInBhbmVsXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0zNzEuNCA0MWMxLjYgMCAzIDEuNCAzIDN2NTZjMCAxLjYtMS40IDMtMyAzSDk2LjZjLTEuNiAwLTMtMS40LTMtM1Y0NGMwLTEuNiAxLjQtMyAzLTNoMjc0LjhtMC01SDk2LjZjLTQuNCAwLTggMy42LTggOHY1NmMwIDQuNCAzLjYgOCA4IDhoMjc0LjhjNC40IDAgOC0zLjYgOC04VjQ0YzAtNC40LTMuNi04LTgtOHpNMzcxLjQgMTk4SDk2LjZjLTQuNCAwLTgtMy42LTgtOHYtNTZjMC00LjQgMy42LTggOC04aDI3NC44YzQuNCAwIDggMy42IDggOHY1NmMwIDQuNC0zLjYgOC04IDh6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcHJvZ3Jlc3MtYmFyc1wiIGRhdGEtbmFtZT1cInByb2dyZXNzLWJhcnNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkZmUzZTZcIiBkPVwiTTQwMS42IDEyOS41SDY2LjRjLTYuOSAwLTEyLjUtNS42LTEyLjUtMTIuNXM1LjYtMTIuNSAxMi41LTEyLjVoMzM1LjNjNi45IDAgMTIuNSA1LjYgMTIuNSAxMi41LS4xIDYuOS01LjcgMTIuNS0xMi42IDEyLjV6XCIvPjxwYXRoIGZpbGw9XCIjZWZjMTAyXCIgZD1cIk0zMzMuNCAxMjkuNWgtMjY3Yy02LjkgMC0xMi41LTUuNi0xMi41LTEyLjVzNS42LTEyLjUgMTIuNS0xMi41aDI2N2M2LjkgMCAxMi41IDUuNiAxMi41IDEyLjUtLjEgNi45LTUuNyAxMi41LTEyLjUgMTIuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZWN0aW9uXCIgZGF0YS1uYW1lPVwic2VjdGlvblwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2Y2OTUyNFwiIGQ9XCJNMjI4LjkgMTEyLjNoLTc2LjFWNTUuOWMwLTEwLjkgOC44LTE5LjcgMTkuNy0xOS43aDU2LjR2NzYuMXpcIi8+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTIyOC45IDE5Ny44aC01Ni42Yy0xMC44IDAtMTkuNS04LjctMTkuNS0xOS41di01Ni42aDc2LjF2NzYuMXpNMzE1LjIgMTEyLjNoLTc2LjFWMzYuMkgyOTZjMTAuNiAwIDE5LjIgOC42IDE5LjIgMTkuMnY1Ni45ek0yOTUuNyAxOTcuOGgtNTYuNnYtNzYuMWg3Ni4xdjU2LjZjMCAxMC43LTguNyAxOS41LTE5LjUgMTkuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zbGlkZXJzXCIgZGF0YS1uYW1lPVwic2xpZGVyc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGZpbGw9XCIjMjk3YWRmXCIgY3g9XCIxNjQuNlwiIGN5PVwiMTE3XCIgcj1cIjYuNlwiLz48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMTQ1LjcgMTE3YzAtMS43LjMtMy40LjctNUg4MC4yYy0yLTUtNi44LTguNS0xMi41LTguNS03LjUgMC0xMy41IDYtMTMuNSAxMy41czYgMTMuNSAxMy41IDEzLjVjNS43IDAgMTAuNS0zLjUgMTIuNS04LjVoNjYuMmMtLjUtMS42LS43LTMuMy0uNy01elwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNNDAwLjMgMTAzLjVjLTUuNyAwLTEwLjUgMy41LTEyLjUgOC41SDI0Ni41Yy0yLTUtNi44LTguNS0xMi41LTguNXMtMTAuNSAzLjUtMTIuNSA4LjVoLTM4LjZjLTIuMi04LTkuNS0xMy45LTE4LjItMTMuOS0xMC40IDAtMTguOSA4LjUtMTguOSAxOC45IDAgMTAuNCA4LjUgMTguOSAxOC45IDE4LjkgOC43IDAgMTYtNS45IDE4LjItMTMuOWgzOC42YzIgNSA2LjggOC41IDEyLjUgOC41czEwLjUtMy41IDEyLjUtOC41aDE0MS4zYzIgNSA2LjggOC41IDEyLjUgOC41IDcuNSAwIDEzLjUtNiAxMy41LTEzLjVzLTYtMTMuNS0xMy41LTEzLjV6bS0yMzUuNyAyNy40Yy03LjcgMC0xMy45LTYuMi0xMy45LTEzLjlzNi4yLTEzLjkgMTMuOS0xMy45IDEzLjkgNi4yIDEzLjkgMTMuOS02LjIgMTMuOS0xMy45IDEzLjl6bTE4LjktMTIuM2MwLS41LjEtMS4xLjEtMS42czAtMS4xLS4xLTEuNmMwIC41LjEgMS4xLjEgMS42cy0uMSAxLjEtLjEgMS42em0tLjIgMS40YzAtLjIuMS0uNS4xLS43IDAgLjMtLjEuNS0uMS43em0wLTZjMCAuMi4xLjUuMS43IDAtLjMtLjEtLjUtLjEtLjd6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdGFibGVzXCIgZGF0YS1uYW1lPVwidGFibGVzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjYzNjZGRiXCIgZD1cIk0zNjYuNiAxOTcuOWM0LjQgMCA4LjEtMy42IDguMS04LjFWNDQuMmMwLTQuNC0zLjYtOC4xLTguMS04LjFIMTAxLjRjLTQuNCAwLTguMSAzLjYtOC4xIDguMVYxODkuOGMwIDQuNCAzLjYgOC4xIDguMSA4LjFoMjY1LjJ6bTMtMTUzLjd2NDMuNmgtODYuMlY0MS4yaDgzLjJjMS42IDAgMyAxLjQgMyAzem0tMTgwIDQzLjZWNDEuMmg4OC43djQ2LjZoLTg4Ljd6bTg4LjggNS4xVjE0MmgtODguN1Y5Mi45aDg4Ljd6bS0xODAtNDguN2MwLTEuNiAxLjQtMyAzLTNoODMuMnY0Ni42SDk4LjRWNDQuMnptMCA0OC43aDg2LjJWMTQySDk4LjRWOTIuOXptMyA5OS45Yy0xLjYgMC0zLTEuNC0zLTNWMTQ3aDg2LjJ2NDUuOGgtODMuMnptODguMiAwVjE0N2g4OC43djQ1LjhoLTg4Ljd6bTE4MC0zYzAgMS42LTEuNCAzLTMgM2gtODMuMlYxNDdoODYuMnY0Mi44em0wLTQ3LjhoLTg2LjJWOTIuOWg4Ni4yVjE0MnpcIi8+PHBhdGggZmlsbD1cIiNhMzQ2Y2VcIiBkPVwiTTM2OS42IDQ0LjJ2NDMuNmgtODYuMlY0MS4yaDgzLjJjMS42IDAgMyAxLjQgMyAzelwiLz48cmVjdCBmaWxsPVwiI2EzNDZjZVwiIHg9XCIxODkuNlwiIHk9XCI0MS4yXCIvPjxwYXRoIGZpbGw9XCIjYTM0NmNlXCIgZD1cIk05OC40IDQ0LjJjMC0xLjYgMS40LTMgMy0zaDgzLjJ2NDYuNkg5OC40VjQ0LjJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdGV4dFwiIGRhdGEtbmFtZT1cInRleHRcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTIyOCAxNzIuN2wtOC4zLTIxLjhoLTUyLjFsLTguMyAyMS44aC0yMi42bDQ0LjYtMTEzLjVoMjQuOWw0NC42IDExMy41SDIyOHptLTM0LjMtOTMuNGwtMjAuNCA1NC4xaDQwLjlsLTIwLjUtNTQuMXpNMzEzLjUgMTcyLjd2LTguOWMtNi4xIDctMTUuNyAxMC45LTI2LjYgMTAuOS0xMy40IDAtMjguNi05LTI4LjYtMjcuMiAwLTE4LjkgMTUuMS0yNi43IDI4LjYtMjYuNyAxMS4xIDAgMjAuNiAzLjYgMjYuNiAxMC42di0xMi4zYzAtOS41LTcuOC0xNS4zLTE5LjItMTUuMy05LjIgMC0xNy4yIDMuNC0yNC4zIDEwLjRsLTcuMy0xMi40YzkuNS05IDIxLjQtMTMuMyAzNC42LTEzLjMgMTguMiAwIDM0LjIgNy43IDM0LjIgMjkuOHY1NC41aC0xOHptMC0xOC43di0xMi40Yy00LjEtNS42LTExLjctOC41LTE5LjYtOC41LTEwIDAtMTcuNSA1LjgtMTcuNSAxNC44IDAgOC45IDcuNSAxNC42IDE3LjUgMTQuNiA3LjggMCAxNS41LTIuOSAxOS42LTguNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aW1lXCIgZGF0YS1uYW1lPVwidGltZVwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGZpbGw9XCIjYzNjZGRiXCIgY3g9XCIyMzRcIiBjeT1cIjExN1wiIHI9XCI4MC44XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0yNjEuMSAxNDguMWMtMSAwLTItLjQtMi44LTEuMmwtMjcuMS0yNy4xYy0uOC0uOC0xLjItMS44LTEuMi0yLjhWNTYuMmMwLTIuMiAxLjgtNCA0LTRzNCAxLjggNCA0djU5LjJsMjUuOSAyNS45YzEuNiAxLjYgMS42IDQuMSAwIDUuNy0uOC43LTEuOCAxLjEtMi44IDEuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy12YWxpZGF0aW9uXCIgZGF0YS1uYW1lPVwidmFsaWRhdGlvblwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2RkMmY0MVwiIGQ9XCJNMzMyIDY5LjdIMTM2Yy00LjQgMC04IDMuNi04IDh2ODMuMmMwIDEuOSAxLjUgMy40IDMuNCAzLjRoMjA1LjJjMS45IDAgMy40LTEuNSAzLjQtMy40Vjc3LjdjMC00LjQtMy42LTgtOC04em0tMTQxLjcgNzUuNWgtNTIuMXYtOS4zaDUyLjF2OS4zek0zMzUgMTExLjhIMTMzVjc3LjdjMC0xLjYgMS40LTMgMy0zaDE5NmMxLjYgMCAzIDEuNCAzIDN2MzQuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtY29tcGxldGVkXCIgZGF0YS1uYW1lPVwic3RhdHVzLWNvbXBsZXRlZFwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjQuOTY1IDEyLjgwMmwtMTAuMjY3IDExLjI1LTcuNjI2LTcuNjIxYTEuMjMyIDEuMjMyIDAgMCAxIDAtMS43NDEgMS4yMjQgMS4yMjQgMCAwIDEgMS43NCAwbDUuODA1IDUuODAyIDguNTMxLTkuMzQ5YTEuMjMgMS4yMyAwIDAgMSAxLjgxNyAxLjY1OU0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjwvc3ZnPicpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgRE9NIGlzIGFscmVhZHkgcmVhZHksIGVtYmVkIFNWR3NcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgeyBlbWJlZCgpIH1cblxuICAvLyBIYW5kbGUgVHVyYm9saW5rcyBwYWdlIGNoYW5nZSBldmVudHNcbiAgaWYgKCB3aW5kb3cuVHVyYm9saW5rcyApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHVyYm9saW5rczpsb2FkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdGFuZGFyZCBET00gcmVhZHkgZXZlbnRzXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbn0pKCkiLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKS5ldmVudFxudmFyIG5vdGlmeSA9IHJlcXVpcmUoJy4uL21vZHVsZXMvbm90aWZ5JylcblxuLy8gSWYgYSBwYWdlIGhhcyBhbiBlbGVtZW50IC5mb3JtLWZsYXNoLCB0cmlnZ2VyIGEgbm90aWZpY2F0aW9uXG4vL1xuRXZlbnQuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gIHZhciBmbGFzaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mbGFzaC1tZXNzYWdlOm5vdCguZmlyZWQpJylcbiAgaWYgKGZsYXNoKSB7XG4gICAgZmxhc2guY2xhc3NMaXN0LmFkZCgnaGlkZGVuJywnZmlyZWQnKVxuICAgIG5vdGlmeShmbGFzaC5kYXRhc2V0LnR5cGUsIGZsYXNoLmlubmVySFRNTC50cmltKCkpXG4gIH1cbn0pXG5cbiIsInZhciB0b29sYm94ICAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIEV2ZW50ICAgICAgICAgPSB0b29sYm94LmV2ZW50XG52YXIgbm90aWZ5ICAgICAgICA9IHJlcXVpcmUoICcuLi9tb2R1bGVzL25vdGlmeScgKVxuXG5cbi8vIEhhbmRsZSBzdWJtaXQgYmVoYXZpb3JzOlxuLy8gIC0gZGlzYWJsZSBidXR0b24gb24gc3VibWl0XG4vLyAgLSBzdWJtaXQgbWVzc2FnZXNcbi8vXG5FdmVudC5vbiggZG9jdW1lbnQsICdzdWJtaXQnLCBmdW5jdGlvbihldmVudCkge1xuXG4gIC8vIFNlbmQgZm9ybSBtZXNzYWdlc1xuICAvLyBMb29rIGZvciBhbiBlbGVtZW50IHdpdGggdGhlIGRhdGEtc3VibWl0LW1lc3NhZ2Ugb3IgdXNlIHRoZSBmb3JtIGl0c2VsZlxuICB2YXIgbWVzc2FnZSA9ICggZXZlbnQudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN1Ym1pdC1tZXNzYWdlXScpIHx8IGV2ZW50LnRhcmdldCApLmRhdGFzZXQuc3VibWl0TWVzc2FnZVxuICBpZiAoIG1lc3NhZ2UgKSBub3RpZnkoICdmb3JtLWFjdGlvbicsIG1lc3NhZ2UgKVxuXG4gIHZhciBidXR0b24gPSBldmVudC50YXJnZXQucXVlcnlTZWxlY3RvcignW3R5cGU9c3VibWl0XScpXG4gIGlmICggYnV0dG9uLmRhdGFzZXQuZGlzYWJsZU9uU3VibWl0ID09ICdmYWxzZScgKSByZXR1cm5cblxuICBpZiAoIWJ1dHRvbi5kYXRhc2V0LmRpc2FibGVXaXRoKSBidXR0b24uZGF0YXNldC5kaXNhYmxlT25TdWJtaXQgPSB0cnVlXG4gIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWVcblxuICAvLyBMb29rIGZvciBlbGVtZW50cyB3aXRoIGRpc2FibGUtd2l0aCB0ZXh0IGFuZCByZXBsYWNlIHRoZSB0ZXh0XG4gIHZhciBlbGVtZW50cyA9IGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kaXNhYmxlLXdpdGhdJylcblxuICB0b29sYm94LmVhY2goIGVsZW1lbnRzLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgdmFyIGJ1dHRvblRleHQgPSBlbC5xdWVyeVNlbGVjdG9yKCcuYnV0dG9uLXRleHQnKSB8fCBlbFxuXG4gICAgZWwuZGF0YXNldC5lbmFibGVkVGV4dCA9IGJ1dHRvblRleHQuaW5uZXJIVE1MXG4gICAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBlbC5kYXRhc2V0LmRpc2FibGVXaXRoXG4gIH0pXG5cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHN1Ym1pdCBmdW5jdGlvbnMgdG8gb2NjdXJcbiAgdG9vbGJveC5ldmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbCcpXG4gIH0pXG5cbiAgaWYgKCBkb2N1bWVudC5ib2R5LmRhdGFzZXQuZmFrZVN1Ym1pdCApIHtcbiAgICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoJ2Zha2Utc3VibWl0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pXG4gICAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2ICkgXG4gIH0gZWxzZSB7XG4gICAgZXZlbnQudGFyZ2V0LnN1Ym1pdCgpXG4gIH1cblxufSlcblxuLy8gV2hlbiBhIGJhY2sgYnV0dG9uIGlzIHVzZWQ6XG4vLyAgLSBEaXNhYmxlZCBidXR0b25zIHJlbWFpbiBkaXNhYmxlZFxuLy8gIC0gUHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyByZW1haW4gYWN0aXZlXG4vL1xuLy8gVGhpcyByZW5hYmxlcyBidXR0b25zIGFuZCBoaWRlcyBub3RpZmljYXRpb25zLlxud2luZG93Lm9ucGFnZXNob3cgPSBmdW5jdGlvbihldmVudCkge1xuXG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwnKVxuICBcbiAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc2FibGUtd2l0aF1bZGlzYWJsZWRdLFtkYXRhLWRpc2FibGUtb24tc3VibWl0XVtkaXNhYmxlZF0nKVxuICBpZiAoIGJ1dHRvbiApIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlXG5cbiAgaWYgKCBidXR0b24gJiYgYnV0dG9uLmRhdGFzZXQuZW5hYmxlZFRleHQgKSB7XG4gICAgdmFyIGJ1dHRvblRleHQgPSBidXR0b24ucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykgfHwgYnV0dG9uXG4gICAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBidXR0b24uZGF0YXNldC5lbmFibGVkVGV4dFxuICB9XG5cbiAgLy8gRGlzbWlzcyBsZWZ0b3ZlciBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gIGlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5ub3RpZmljYXRpb24uZm9ybS1hY3Rpb24nICkgKSB7XG4gICAgbm90aWZ5LnJlbW92ZSgpXG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtdG9vbGJveCcpLmV2ZW50XG5cbmZ1bmN0aW9uIG51bWJlcklucHV0T25seShldmVudCkge1xuICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSxcbiAgICAgIG51bWJlcktleXMgPSAoIDQ3IDwga2V5ICYmIGtleSA8IDU4ICksXG4gICAgICBudW1QYWRLZXlzID0gKCA5NSA8IGtleSAmJiBrZXkgPCAxMDYgKSxcbiAgICAgIGRlY2ltYWxzICAgPSAoIGtleSA9PSAxMTAgfHwga2V5ID09IDE5MCApLFxuICAgICAgbW9kaWZpZXJzICA9ICggRXZlbnQua2V5LmFsdCB8fCBFdmVudC5rZXkuc2hpZnQgKSxcbiAgICAgIGlucHV0S2V5ICAgPSAhKCgga2V5IDwgNDYgJiYga2V5ICE9IDMyICkgfHwgRXZlbnQua2V5LmNvbW1hbmQgKSxcbiAgICAgIG51bUlucHV0ICAgPSAoKCBudW1iZXJLZXlzIHx8IG51bVBhZEtleXMgfHwgZGVjaW1hbHMgKSAmJiAhKCBtb2RpZmllcnMgJiYgNDcgPCBrZXkgKSApXG5cbiAgaWYgKCAhbnVtSW5wdXQgJiYgaW5wdXRLZXkgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gIH1cbn1cblxuLy8gUHJldmVudCBub24gbnVtZXJpYyBpbnB1dCBvbiBpbnB1dCB0eXBlIG9mIG51bWJlclxuRXZlbnQub24oIGRvY3VtZW50LCAna2V5ZG93bicsICdpbnB1dFt0eXBlPW51bWJlcl0nLCBudW1iZXJJbnB1dE9ubHkgKVxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgY29udmVydCA9IHJlcXVpcmUoJy4uL21vZHVsZXMvdW5pdC1jb252ZXJ0ZXInKSxcbiAgICBmb3JtVXAgPSByZXF1aXJlKCAnY29tcG9zZS1mb3JtLXVwJyApXG5cbmZ1bmN0aW9uIHNldHVwKGVsKSB7XG4gIGVsLmRhdGFzZXQudW5pdEtleSA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zcGxpdCgnLicpWzFdXG5cbiAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoICdhZnRlcmVuZCcsIHNldHVwSW5wdXQoZWwpIClcbiAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJlbmQnLCBzZXR1cFNlbGVjdChlbCkgKVxuXG4gIHZhciBzZWxlY3QgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmdcblxuICBzZXRWYWx1ZShlbClcbiAgLy8gQWRkIHNvbWUgcGFkZGluZyBiZXR3ZWVuIGlucHV0IGVudHJ5IGFuZCBzZWxlY3QsIGJhc2VkIG9uIHdpZHRoIG9mIHNlbGVjdFxuICBlbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAoZWwub2Zmc2V0V2lkdGggLSBzZWxlY3Qub2Zmc2V0TGVmdCArIDEwKSArICdweCdcbn1cblxuZnVuY3Rpb24gcmFuZElEICgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygzKVxufVxuXG5mdW5jdGlvbiBzZXR1cFNlbGVjdChlbCkge1xuICB2YXIgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXSxcbiAgICAgIHNlbGVjdElkID0gYGlucHV0LXVuaXQtJHtyYW5kSUQoKX1gLFxuICAgICAgc2VsZWN0ID0gYDxzcGFuIGNsYXNzPSdpbnB1dC11bml0IHVuaXQtc2VsZWN0Jz48c2VsZWN0IGNsYXNzPSdpbnB1dC11bml0LW5hbWUnIGlkPScke3NlbGVjdElkfScgdGFiaW5kZXg9Jy0xJyBhcmlhLWxhYmVsPSd1bml0cycgZGF0YS1kZWZhdWx0PScke2VsLmRhdGFzZXQudW5pdH0nIGRhdGEtaW5pdGlhbC12YWx1ZT0nJHtlbC5kYXRhc2V0LnVuaXR9JyBkYXRhLXVuaXQtc2VsZWN0PScke2VsLmRhdGFzZXQudW5pdEtleX0nPmAsXG4gICAgICBzZWxlY3RlZCA9IGVsLmRhdGFzZXQudW5pdCxcbiAgICAgIHdyYXBwZXIgPSB0b29sYm94LmdldENsb3Nlc3QoIGVsLCAnbGFiZWwnICksXG4gICAgICBjaGVja2VkXG5cbiAgdW5pdHMuZm9yRWFjaChmdW5jdGlvbih1bml0KSB7XG4gICAgY2hlY2tlZCA9ICggKHNlbGVjdGVkID09IHVuaXQpID8gJyBzZWxlY3RlZCcgOiAnJyApXG4gICAgc2VsZWN0ICs9IGA8b3B0aW9uJHtjaGVja2VkfT4ke3VuaXR9PC9vcHRpb24+YFxuICB9KVxuXG4gIGlmICggd3JhcHBlciApIHtcbiAgICB2YXIgZGVmYXVsdElucHV0ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZXN0b3JlLWRlZmF1bHRdJylcbiAgICBpZiAoIGRlZmF1bHRJbnB1dCApIGRlZmF1bHRJbnB1dC5kYXRhc2V0LnJlc3RvcmVEZWZhdWx0ICs9IGAsICMke3NlbGVjdElkfWBcbiAgfVxuXG4gIHNlbGVjdCA9IHNlbGVjdCArIFwiPC9zZWxlY3Q+PC9zcGFuPlwiXG5cbiAgcmV0dXJuIHNlbGVjdFxufVxuXG5mdW5jdGlvbiBzZXR1cElucHV0KGVsKSB7XG4gIG5hbWUgPSBlbC5uYW1lXG4gIGVsLm5hbWUgPSBuYW1lICsgJ192YWx1ZSdcbiAgcmV0dXJuICc8aW5wdXQgZGF0YS11bml0LWlucHV0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJytuYW1lKydcIj4nXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlKGVsKSB7XG4gIGVsID0gZWwudGFyZ2V0IHx8IGVsXG4gIHZhciBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQtaW5wdXQ9XCInK2VsLmRhdGFzZXQudW5pdEtleSsnXCJdJylcbiAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQtc2VsZWN0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiXScpXG4gIGlucHV0LnZhbHVlID0gY29udmVydChlbC52YWx1ZSwgc2VsZWN0LnZhbHVlLCBlbC5kYXRhc2V0LnVuaXQpLnZhbHVlXG59XG5cbmZ1bmN0aW9uIHVuaXRDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHVuaXRLZXkgPSBldmVudC50YXJnZXQuZGF0YXNldC51bml0U2VsZWN0XG4gIHZhciBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQta2V5PVwiJyt1bml0S2V5KydcIl0nKVxuICBzZXRWYWx1ZShlbClcbn1cblxuRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdW5pdF0nICksIHNldHVwIClcbn0pXG5cbkV2ZW50Lm9uKGRvY3VtZW50LCAnaW5wdXQnLCAnW2RhdGEtdW5pdF0nLCBzZXRWYWx1ZSlcbkV2ZW50Lm9uKGRvY3VtZW50LCAnaW5wdXQnLCAnW2RhdGEtdW5pdC1zZWxlY3RdJywgdW5pdENoYW5nZSlcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtdG9vbGJveCcpLmV2ZW50XG5cbkV2ZW50LmNoYW5nZShmdW5jdGlvbigpe1xuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1hdGNoLXVybF0nKSwgZnVuY3Rpb24obm9kZSl7XG4gICAgdmFyIG1hdGNoZXIgPSBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1tYXRjaC11cmwnKVxuICAgIGlmIChtYXRjaGVyICYmIG5ldyBSZWdFeHAobm9kZS5kYXRhc2V0Lm1hdGNoVXJsLCBcImlcIikudGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnaGVyZScpXG4gICAgfVxuICB9KVxufSlcblxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKS5ldmVudFxuXG5mdW5jdGlvbiBhdXRvU2l6ZVRleHRhcmVhKCB0ZXh0YXJlYSApIHtcbiAgdmFyIHBhcmVudCA9IHRleHRhcmVhLnBhcmVudEVsZW1lbnRcblxuICBpZiAoIHRleHRhcmVhLnZhbHVlID09ICcnICkgcmV0dXJuXG4gIGlmICggcGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnaW5wdXQtd3JhcHBlcicpICkge1xuXG4gICAgcGFyZW50LnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnN0eWxlLmhlaWdodFxuICAgIHZhciBvZmZzZXQgPSB0ZXh0YXJlYS5vZmZzZXRIZWlnaHQgLSB0ZXh0YXJlYS5jbGllbnRIZWlnaHRcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0bydcbiAgICB2YXIgbmV3SGVpZ2h0ID0gKCB0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgKyBvZmZzZXQgKVxuICAgIHZhciBtYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiAuOTVcblxuICAgIGlmICggbmV3SGVpZ2h0IDwgbWF4SGVpZ2h0IClcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCdcbiAgICBlbHNlXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBtYXhIZWlnaHQgKyAncHgnXG5cbiAgICBwYXJlbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gIH1cbn1cblxuRXZlbnQuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gIHZhciB0ZXh0YXJlYXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYScpXG4gIEV2ZW50LmRlbGF5KCBmdW5jdGlvbigpeyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRleHRhcmVhcywgYXV0b1NpemVUZXh0YXJlYSkgfSApXG59KVxuXG5FdmVudC5vbihkb2N1bWVudCwgJ2tleXVwIHRvZ2dsZXI6c2hvdycsICd0ZXh0YXJlYScsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgYXV0b1NpemVUZXh0YXJlYShldmVudC5jdXJyZW50VGFyZ2V0KVxufSlcblxuXG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKS5ldmVudFxuXG4vLyBDaGVjayBpZiBjaGlsZCBzZWxlY3QgbWF0Y2hlcyBwYXJlbnQgc2VsZWN0ZWQgb3B0aW9uXG5mdW5jdGlvbiBtYXRjaFBhcmVudFNlbGVjdGVkKGNoaWxkLHBhcmVudE9wdGlvbikge1xuICBmb3IgKHZhciBpPTA7IGk8Y2hpbGQubGVuZ3RoOyBpKyspe1xuICAgIC8vIElmIGNoaWxkIHNlbGVjdCBvcHRncm91cCBkb2VzIG5vdCBtYXRjaCwgaGlkZSBvcHRpb25zXG4gICAgaWYgKGNoaWxkW2ldLmRhdGFzZXQudGllclBhcmVudCAhPT0gcGFyZW50T3B0aW9uKSB7XG4gICAgICBjaGlsZFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cbn1cblxuLy8gUmVtb3Zpbmcgb3B0Z3JvdXAgdG8gaGlkZSBzZWxlY3Qgc2VjdGlvbiBsYWJlbHNcbmZ1bmN0aW9uIHNldHVwIChlbCkge1xuICBlbC5jbGFzc05hbWUgKz0gXCIgc2VsZWN0LWNoaWxkXCI7XG4gIHZhciB0aWVyU2VsZWN0b3IgPSBlbC5nZXRBdHRyaWJ1dGUoJ3RpZXJfcGFyZW50Jyk7XG4gIHZhciB0aWVyUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGllclNlbGVjdG9yKTtcbiAgdGllclBhcmVudC5jbGFzc05hbWUgKz0gXCIgc2VsZWN0LXBhcmVudFwiO1xufVxuICBcbmZ1bmN0aW9uIHJlbW92ZU9wdGdyb3VwV3JhcHBlciAoZWwpIHtcbiAgLy8gR2V0IGxhYmVsIG9mIGVhY2ggb3B0Z3JvdXBcbiAgdmFyIGNoaWxkTGFiZWxzID0gZWwubGFiZWw7XG4gIHZhciBvcHRpb25zID0gZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29wdGlvbicpO1xuICAvLyBGb3IgZWFjaCBvcHRpb24gaW4gYW4gb3B0Z3JvdXAsIGFkZCB0aGUgZGF0YS10aWVyLXBhcmVudFxuICAvLyBhdHRyaWJ1dGUgYW5kIHJlbW92ZSB0aGUgb3B0Z3JvdXAgd3JhcHBlclxuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiB7XG4gICAgb3B0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS10aWVyLXBhcmVudCcsIGNoaWxkTGFiZWxzKTtcbiAgfSlcbiAgZWwub3V0ZXJIVE1MID0gZWwuaW5uZXJIVE1MO1xufVxuXG5mdW5jdGlvbiBjaGVja01hdGNoIChlbCkge1xuICAvLyBDaGVjayBpZiBhbnkgb3B0aW9ucyBtYXRjaCB0aGUgc2VsZWN0IHBhcmVudCBsYWJlbFxuICB2YXIgY2hpbGRPcHRpb25zID0gZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGllci1wYXJlbnRdJyk7XG4gIHZhciB0aWVyU2VsZWN0b3IgPSBlbC5nZXRBdHRyaWJ1dGUoJ3RpZXJfcGFyZW50Jyk7XG4gIHZhciB0aWVyUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGllclNlbGVjdG9yKTtcbiAgdmFyIHBhcmVudFNlbGVjdGVkID0gdGllclBhcmVudC5zZWxlY3RlZE9wdGlvbnNbMF0ubGFiZWw7XG4gIG1hdGNoUGFyZW50U2VsZWN0ZWQoY2hpbGRPcHRpb25zLCBwYXJlbnRTZWxlY3RlZClcbn1cblxuZnVuY3Rpb24gdGVzdCAoZWwpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbdGllcl9wYXJlbnQ9XCInICsgZWwuaWQgKyAnXCJdJyk7XG4gICAgXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkxvZ2dpbmcgY2hhbmdlXCIpO1xuICAgICAgY2hlY2tNYXRjaChjaGlsZClcbiAgICAgIHdoaWxlIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdC1wYXJlbnQnKSkge1xuICAgICAgICB2YXIgbmVzdGVkQ2hpbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbdGllcl9wYXJlbnQ9XCInICsgY2hpbGQuaWQgKyAnXCJdJyk7XG4gICAgICAgIG5lc3RlZENoaWxkLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICBjaGlsZCA9IG5lc3RlZENoaWxkO1xuICAgICAgfVxuICAgIH0pXG4gICAgLy8gdmFyIHBhcmVudFNlbGVjdGVkID0gcGFyZW50LnNlbGVjdGVkT3B0aW9uc1swXS5sYWJlbDtcbiAgfVxuRXZlbnQucmVhZHkoZnVuY3Rpb24oKXtcbiAgdmFyIHRpZXJDaGlsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdFt0aWVyX3BhcmVudF0nKTtcbiAgdGllckNoaWxkLmZvckVhY2goc2V0dXApXG4gIHRpZXJDaGlsZC5mb3JFYWNoKGNoZWNrTWF0Y2gpXG59KVxuXG5FdmVudC5yZWFkeShmdW5jdGlvbigpe1xuICB2YXIgdGllck9wdGdyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W3RpZXJfcGFyZW50XSBvcHRncm91cCcpO1xuICB0aWVyT3B0Z3JvdXAuZm9yRWFjaChyZW1vdmVPcHRncm91cFdyYXBwZXIpXG59KVxuXG5FdmVudC5vbihkb2N1bWVudCwgJ2NoYW5nZScsICcuc2VsZWN0LXBhcmVudCcsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGVzdChldmVudC5jdXJyZW50VGFyZ2V0KVxufSkiLCJ2YXIgZXZlbnQgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLmV2ZW50XG5cbi8vIFB1YmxpYyBBUEkgZnVuY3Rpb25cbnZhciBjbGlwYm9hcmQgPSBmdW5jdGlvbigpIHtcblxuICAvLyBMaXN0ZW4gZm9yIGNsaWNrIGV2ZW50c1xuICBldmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1jb3B5LXRhcmdldF0nLCBjb3B5IClcblxuICAvLyBDb3B5IHRvIGNsaXBib2FyZCBoYW5kbGVyXG4gIGZ1bmN0aW9uIGNvcHkoIGV2ZW50ICkge1xuXG4gICAgLy8gQXNzaWdubWVudFxuICAgIHZhciBjb3B5VHJpZ2dlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGNvcHlFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggY29weVRyaWdnZXIuZGF0YXNldC5jb3B5VGFyZ2V0IClcblxuICAgIC8vIFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIElzIHRoZSBlbGVtZW50IHNlbGVjdGFibGU/XG4gICAgaWYgKCBjb3B5RWxlbWVudCAmJiBjb3B5RWxlbWVudC5zZWxlY3QgKSB7XG5cbiAgICAgIC8vIFNlbGVjdCB0ZXh0XG4gICAgICBjb3B5RWxlbWVudC5zZWxlY3QoKTtcblxuICAgICAgLy8gR2l2ZSBpdCBhIHRyeVxuICAgICAgdHJ5IHtcblxuICAgICAgICAvLyBDb3B5IHRleHRcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoICdjb3B5JyApXG5cbiAgICAgICAgLy8gQmx1ciB0aGUgZWxlbWVudFxuICAgICAgICBjb3B5RWxlbWVudC5ibHVyKClcblxuICAgICAgICAvLyBUcmlnZ2VyIGNvcGllZCBzdGF0ZVxuICAgICAgICBjb3B5VHJpZ2dlci5jbGFzc0xpc3QuYWRkKCAnY29waWVkJyApXG5cbiAgICAgICAgLy8gUmVtb3ZlIGNvcGllZCBzdGF0ZSBhZnRlciBhIGNvdXBsZSBzZWNvbmRzXG4gICAgICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvcHlUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoICdjb3BpZWQnIClcbiAgICAgICAgfSwgMjAwMCApXG5cbiAgICAgIC8vIElmIGl0IGJvcmtzXG4gICAgICB9IGNhdGNoICggZXJyICkge1xuXG4gICAgICAgIC8vIEdvIG51Y2xlYXJcbiAgICAgICAgYWxlcnQoICdwbGVhc2UgcHJlc3MgQ3RybC9DbWQrQyB0byBjb3B5JyApXG5cbiAgICAgIH1cblxuICAgIH1cblxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcGJvYXJkXG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgPSB0b29sYm94LmV2ZW50LFxuICAgIGVzdmcgID0gcmVxdWlyZSggJy4uL19lc3ZnJyApLFxuXG4gICAgZGVmYXVsdHNCeVR5cGUgPSB7XG4gICAgICBzdWNjZXNzOiB7IGRpc21pc3NBZnRlcjogMzUwMCB9LFxuICAgIH0sXG5cbiAgICBpY29uc0J5VHlwZSA9IHtcbiAgICAgIG1lc3NhZ2U6ICAgICAgICBcIm1lc3NhZ2UtY2lyY2xlXCIsXG4gICAgICBlcnJvcjogICAgICAgICAgXCJuby1jaXJjbGVcIixcbiAgICAgIHByb2dyZXNzOiAgICAgICBcInByb2dyZXNzLWNpcmNsZVwiLFxuICAgICAgJ2Zvcm0tYWN0aW9uJzogIFwicHJvZ3Jlc3MtY2lyY2xlXCIsXG4gICAgICBzdWNjZXNzOiAgICAgICAgXCJ0aHVtYnMtdXAtY2lyY2xlXCIsXG4gICAgfSxcblxuICAgIGF1dG9EaXNtaXNzVGltZW91dCxcbiAgICBtZXNzYWdlRWwsXG5cbiAgICB0ZW1wbGF0ZSA9ICdcXFxuPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvblwiPlxcXG4gIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tY29udGVudFwiPlxcXG4gICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1tZXNzYWdlXCIgcm9sZT1cImFsZXJ0XCI+PC9kaXY+XFxcbiAgICA8YnV0dG9uIGNsYXNzPVwibm90aWZpY2F0aW9uLWNsb3NlXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cImNsb3NlIG1lc3NhZ2VcIj5cXFxuICAgIDwvYnV0dG9uPlxcXG4gIDwvZGl2PlxcXG48L2Rpdj5cXFxuJ1xuXG5mdW5jdGlvbiBub3RpZnkgKHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMpIHtcblxuICBpZiAoICFvcHRpb25zICYmIHR5cGVvZiBtZXNzYWdlID09ICdvYmplY3QnICkge1xuICAgIG9wdGlvbnMgPSBtZXNzYWdlXG4gICAgbWVzc2FnZSA9IHR5cGVcbiAgICB0eXBlID0gJ21lc3NhZ2UnXG4gIH1cblxuICBpZiAoICFtZXNzYWdlICkge1xuICAgIG1lc3NhZ2UgPSB0eXBlXG4gICAgdHlwZSA9ICdtZXNzYWdlJ1xuICB9XG5cbiAgcmV0dXJuIHNob3coIHR5cGUsIG1lc3NhZ2UsIHRvb2xib3gubWVyZ2UoIGRlZmF1bHRzQnlUeXBlW3R5cGVdLCBvcHRpb25zIHx8IHt9ICkgKVxufVxuXG5mdW5jdGlvbiBzaG93ICggdHlwZSwgbWVzc2FnZSwgb3B0aW9ucyApIHtcblxuICBjbGVhclRpbWVvdXQoIGF1dG9EaXNtaXNzVGltZW91dCApXG4gIGlmICggbWVzc2FnZUVsICkgcmV0dXJuIGRpc21pc3MoIGZ1bmN0aW9uKCl7IHNob3coIHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMgKSB9KVxuXG4gIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYmVmb3JlZW5kJywgdGVtcGxhdGUgKVxuICBtZXNzYWdlRWwgICAgID0gZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGRcbiAgdmFyIHR5cGVJY29uICA9IGVzdmcudXNlKCBpY29uc0J5VHlwZVt0eXBlXSB8fCB0eXBlIClcbiAgdmFyIGNsb3NlSWNvbiA9IGVzdmcudXNlKCAneC1jaXJjbGUnLCB7ICdzY2FsZSc6IHRydWUsICdjbGFzcyc6ICdjbG9zZS1pY29uJyB9IClcblxuICB2YXIgbXNnID0gbWVzc2FnZUVsLnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLW1lc3NhZ2UnIClcbiAgbXNnLmlubmVySFRNTCA9IG1lc3NhZ2VcblxuICBpZiAoIHR5cGVJY29uICkgbXNnLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWJlZ2luJywgXCI8c3BhbiBjbGFzcz0nbm90aWZpY2F0aW9uLXR5cGUtaWNvbic+XCIgKyB0eXBlSWNvbi5vdXRlckhUTUwgKyBcIjwvc3Bhbj5cIiApXG4gIGlmICggY2xvc2VJY29uICkgbWVzc2FnZUVsLnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLWNsb3NlJyApLmlubmVySFRNTCA9IGNsb3NlSWNvbi5vdXRlckhUTUxcblxuICBpZiAoIHR5cGUgKSB7XG5cbiAgICBtZXNzYWdlRWwuY2xhc3NMaXN0LmFkZCggdHlwZSApXG5cbiAgICBpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNtaXNzQWZ0ZXIgKXtcbiAgICAgIGF1dG9EaXNtaXNzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBkaXNtaXNzLCBvcHRpb25zLmRpc21pc3NBZnRlciApXG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZUVsID0gZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGRcblxuICBFdmVudC5rZXlPbmUoICdlc2MnLCBkaXNtaXNzIClcbiAgRXZlbnQub25lKCBtZXNzYWdlRWwsICdjbGljaycsICcubm90aWZpY2F0aW9uLWNsb3NlJywgZGlzbWlzcyApXG5cbiAgcmV0dXJuIHtcbiAgICBkaXNtaXNzOiBkaXNtaXNzXG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzbWlzcyAoIGNhbGxiYWNrICkge1xuXG4gIGlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5vdGlmaWNhdGlvbicpID09IG51bGwgKSB7IHJldHVybiB9XG5cbiAgY2xlYXJUaW1lb3V0KCBhdXRvRGlzbWlzc1RpbWVvdXQgKVxuXG4gIHZhciBjYlxuXG4gIGlmICggdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgKSB7XG4gICAgY2IgPSBmdW5jdGlvbigpIHsgcmVtb3ZlKCk7IGNhbGxiYWNrKCkgfVxuICB9IGVsc2Uge1xuICAgIGNiID0gcmVtb3ZlO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggY2IsIDUwMCApXG5cbiAgRXZlbnQub25lKCBtZXNzYWdlRWwsICdhbmltYXRpb25zdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgIGNsZWFyVGltZW91dCggdGltZW91dCApXG5cbiAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggbWVzc2FnZUVsLCBjYiApXG4gIH0pXG5cbiAgbWVzc2FnZUVsLmNsYXNzTGlzdC5hZGQoICdkaXNtaXNzJyApXG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAoKSB7XG4gIG1lc3NhZ2VFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHkgPiAubm90aWZpY2F0aW9uJylcblxuICBpZiAobWVzc2FnZUVsKSB7XG4gICAgbWVzc2FnZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG1lc3NhZ2VFbCApXG4gIH1cbiAgbWVzc2FnZUVsID0gbnVsbFxufVxuXG5ub3RpZnkuZGlzbWlzcyA9IGRpc21pc3Ncbm5vdGlmeS5yZW1vdmUgPSByZW1vdmVcblxubW9kdWxlLmV4cG9ydHMgPSBub3RpZnlcbiIsImNvbnN0IHVuaXRzVGFibGUgPSB7XG4gIGJpdDogMSxcbiAgYnl0ZTogOCxcbiAga2lsb2J5dGU6IDEwMDAgKiA4LFxuICBtZWdhYnl0ZTogMTAwMCAqIDEwMDAgKiA4LFxuICBnaWdhYnl0ZTogMTAwMCAqIDEwMDAgKiAxMDAwICogOCxcbiAgdGVyYWJ5dGU6IDEwMDAgKiAxMDAwICogMTAwMCAqIDEwMDAgKiA4ICBcbn1cbmNvbnN0IGFsaWFzZXMgPSB7XG4gIGI6ICdiaXQnLFxuICBCOiAnYnl0ZScsXG4gIEtCOiAna2lsb2J5dGUnLFxuICBNQjogJ21lZ2FieXRlJyxcbiAgR0I6ICdnaWdhYnl0ZScsXG4gIFRCOiAndGVyYWJ5dGUnXG59XG5cbmZ1bmN0aW9uIHNob3J0VW5pdCh1bml0KSB7XG4gIGZvciAobGV0IGtleSBpbiBhbGlhc2VzKSB7XG4gICAgaWYgKGFsaWFzZXNba2V5XSA9PSB1bml0KSB1bml0ID0ga2V5XG4gIH1cblxuICByZXR1cm4gdW5pdFxufVxuZnVuY3Rpb24gbG9uZ1VuaXQoc2l6ZSwgdW5pdCkge1xuICByZXR1cm4gcGx1cmFsaXplKHNpemUsIHVuaXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB1bml0LnNsaWNlKDEpKVxufVxuXG5mdW5jdGlvbiBhbGlhcyh1bml0KSB7XG4gIHJldHVybiBhbGlhc2VzW3VuaXRdIHx8IHVuaXQudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBwbHVyYWxpemUodmFsLCB1bml0KSB7XG4gIGlmICggdmFsICE9IDEgKSB1bml0ICs9ICdzJ1xuICByZXR1cm4gdW5pdFxufVxuXG5mdW5jdGlvbiBjb252ZXJ0KG51bSwgYXMsIHRvKSB7XG4gIHZhciB0byAgICAgPSBhbGlhcyh0byksXG4gICAgICBiYXNlICAgPSB1bml0c1RhYmxlW2FsaWFzKGFzKV0sXG4gICAgICB0YXJnZXQgPSB1bml0c1RhYmxlW3RvXVxuICB2YXIgbnVtICAgID0gKG51bSAqIGJhc2UgLyB0YXJnZXQpXG4gIFxuICBcbiAgdmFyIGNvbnZlcnNpb24gPSB7IFxuICAgIHZhbHVlOiBudW0sXG4gICAgdW5pdDogIHNob3J0VW5pdCh0byksXG4gICAgbG9uZzogIGxvbmdVbml0KG51bSwgdG8pXG4gIH1cbiAgcmV0dXJuIGNvbnZlcnNpb25cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0XG4iLCIvLyBJY29ucyBtdXN0IGNvbWUgYmVmb3JlIGV2ZW50IHJlZ2lzdHJhdGlvbnNcbnJlcXVpcmUoICcuL19pY29ucycgKSAvLyBJbXBvcnQgc3ZnIGljb25zIChmcm9tIEVzdmcpXG52YXIgZXN2ZyA9IHJlcXVpcmUoICcuL19lc3ZnJyApXG5cbnZhciB0b29sYm94ICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIHRpbWVUb2dnbGUgPSByZXF1aXJlKCAnY29tcG9zZS10aW1lLXRvZ2dsZScgKSAvLyBTd2l0Y2ggdGltZSBlbGVtZW50cyBiZXR3ZWVuIGxvY2FsIGFuZCBVVENcbnZhciB0b2dnbGVyICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9nZ2xlcicgKVxudmFyIGZvcm1VcCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS1mb3JtLXVwJyApXG52YXIgZGlhbG9nICAgICA9IHJlcXVpcmUoICdjb21wb3NlLWRpYWxvZycgKVxudmFyIGFqYXggICAgICAgPSByZXF1aXJlKCAnc3VwZXJhZ2VudCcgKVxudmFyIGNsaXBib2FyZCAgPSByZXF1aXJlKCAnLi9tb2R1bGVzL2NsaXBib2FyZCcgKVxudmFyIG5vdGlmeSAgICAgPSByZXF1aXJlKCAnLi9tb2R1bGVzL25vdGlmeScgKVxudmFyIGV2ZW50ICAgICAgPSB0b29sYm94LmV2ZW50XG5cbmV2ZW50LnNjcm9sbC5kaXNhYmxlUG9pbnRlcigpICAgICAgICAvLyBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzIG9uIHNjcm9sbCBmb3IgcGVyZm9ybWFuY2UgKHRvIGF2b2lkIGV4dHJhIHJlcGFpbnRzKVxuZXZlbnQucmVzaXplLmRpc2FibGVBbmltYXRpb24oKSAgICAgICAgLy8gZGlzYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBzY3JvbGwgZm9yIHBlcmZvcm1hbmNlICh0byBhdm9pZCBleHRyYSByZXBhaW50cylcbmNsaXBib2FyZCgpO1xuXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvZmxhc2gtbWVzc2FnZXMnIClcbnJlcXVpcmUoICcuL2VuaGFuY2VtZW50cy9mb3JtLXN1Ym1pdC1oZWxwZXJzJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvaW5wdXQtbnVtYmVyLW9ubHknIClcbnJlcXVpcmUoICcuL2VuaGFuY2VtZW50cy9pbnB1dC11bml0JyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvbGluay1oZXJlJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvdGV4dGFyZWEtZXhwYW5kJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvdGllcmVkLXNlbGVjdCcgKVxuXG5ldmVudC5jaGFuZ2UoIHRpbWVUb2dnbGUudGltZWFnby5zZXR1cCApXG5mb3JtVXAuZGlmZi53YXRjaCgpXG5mb3JtVXAuc3RlcHBlZE51bWJlcklucHV0LndhdGNoKClcbmZvcm1VcC5zdGVwTGFiZWxzLndhdGNoKClcbmZvcm1VcC5zbGlkZXIuc2V0dXAoKVxuXG4vLyBQdWJsaWMgQVBJIG9iamVjdFxud2luZG93LlR1bmdzdGVuID0gbW9kdWxlLmV4cG9ydHMgPSB0b29sYm94Lm1lcmdlKCB7XG4gIGFqYXggICAgICAgIDogYWpheCxcbiAgZm9ybSAgICAgICAgOiBmb3JtVXAsXG4gIHRvZ2dsZXIgICAgIDogdG9nZ2xlcixcbiAgY2xpcGJvYXJkICAgOiBjbGlwYm9hcmQsXG4gIG5vdGlmeSAgICAgIDogbm90aWZ5LFxuICBlc3ZnICAgICAgICA6IGVzdmcsXG4gIHRpbWVUb2dnbGUgIDogdGltZVRvZ2dsZSxcbiAgZGlhbG9nICAgICAgOiBkaWFsb2dcbn0sIHRvb2xib3ggKVxuIiwiLyohXG4gICogQmVhbiAtIGNvcHlyaWdodCAoYykgSmFjb2IgVGhvcm50b24gMjAxMS0yMDEyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2ZhdC9iZWFuXG4gICogTUlUIGxpY2Vuc2VcbiAgKi9cbihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIGNvbnRleHRbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0pKCdiZWFuJywgdGhpcywgZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgbmFtZSAgICA9IG5hbWUgICAgfHwgJ2JlYW4nXG4gIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXNcblxuICB2YXIgd2luICAgICAgICAgICAgPSB3aW5kb3dcbiAgICAsIG9sZCAgICAgICAgICAgID0gY29udGV4dFtuYW1lXVxuICAgICwgbmFtZXNwYWNlUmVnZXggPSAvW15cXC5dKig/PVxcLi4qKVxcLnwuKi9cbiAgICAsIG5hbWVSZWdleCAgICAgID0gL1xcLi4qL1xuICAgICwgYWRkRXZlbnQgICAgICAgPSAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICAsIHJlbW92ZUV2ZW50ICAgID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInXG4gICAgLCBkb2MgICAgICAgICAgICA9IGRvY3VtZW50IHx8IHt9XG4gICAgLCByb290ICAgICAgICAgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQgfHwge31cbiAgICAsIFczQ19NT0RFTCAgICAgID0gcm9vdFthZGRFdmVudF1cbiAgICAsIGV2ZW50U3VwcG9ydCAgID0gVzNDX01PREVMID8gYWRkRXZlbnQgOiAnYXR0YWNoRXZlbnQnXG4gICAgLCBPTkUgICAgICAgICAgICA9IHt9IC8vIHNpbmdsZXRvbiBmb3IgcXVpY2sgbWF0Y2hpbmcgbWFraW5nIGFkZCgpIGRvIG9uZSgpXG5cbiAgICAsIHNsaWNlICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgLCBzdHIyYXJyICAgICAgICA9IGZ1bmN0aW9uIChzLCBkKSB7IHJldHVybiBzLnNwbGl0KGQgfHwgJyAnKSB9XG4gICAgLCBpc1N0cmluZyAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnc3RyaW5nJyB9XG4gICAgLCBpc0Z1bmN0aW9uICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnZnVuY3Rpb24nIH1cbiAgICAsIGlzT2JqZWN0ICAgICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdvYmplY3QnIH1cblxuICAgIC8vIFRyeSB0byBidWlsZCBhbiBvcHRpb25zIG9iamVjdC4gSWYgYW55IGtleSBpbiBgbWF5YmVPcHRpb25zYFxuICAgIC8vIG1hdGNoZXMgYSBrZXkgaW4gYGRlZmF1bHRzYCwgaXQgd2lsbCBiZSBjb3BpZWQgaW50byBhIGNsb25lXG4gICAgLy8gb2YgYGRlZmF1bHRzYCwgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0LlxuICAgICwgYnVpbGRPcHRpb25zID0gZnVuY3Rpb24gKG9yaWdpbmFsRGVmYXVsdHMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7fVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcmlnaW5hbERlZmF1bHRzKSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsRGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9yaWdpbmFsRGVmYXVsdHNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2JqZWN0KG1heWJlT3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG1heWJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gbWF5YmVPcHRpb25zW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdHNcbiAgICAgIH1cblxuICAgICAgLy8gZXZlbnRzIHRoYXQgd2UgY29uc2lkZXIgdG8gYmUgJ25hdGl2ZScsIGFueXRoaW5nIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbFxuICAgICAgLy8gYmUgdHJlYXRlZCBhcyBhIGN1c3RvbSBldmVudFxuICAgICwgc3RhbmRhcmROYXRpdmVFdmVudHMgPVxuICAgICAgICAnY2xpY2sgZGJsY2xpY2sgbW91c2V1cCBtb3VzZWRvd24gY29udGV4dG1lbnUgJyAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnbW91c2V3aGVlbCBtb3VzZW11bHRpd2hlZWwgRE9NTW91c2VTY3JvbGwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2Ugd2hlZWxcbiAgICAgICAgJ21vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgc2VsZWN0c3RhcnQgc2VsZWN0ZW5kICcgICAgICAgICAgICArIC8vIG1vdXNlIG1vdmVtZW50XG4gICAgICAgICdrZXlkb3duIGtleXByZXNzIGtleXVwICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBrZXlib2FyZFxuICAgICAgICAnb3JpZW50YXRpb25jaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW9iaWxlXG4gICAgICAgICdmb2N1cyBibHVyIGNoYW5nZSByZXNldCBzZWxlY3Qgc3VibWl0ICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBmb3JtIGVsZW1lbnRzXG4gICAgICAgICdsb2FkIHVubG9hZCBiZWZvcmV1bmxvYWQgcmVzaXplIG1vdmUgRE9NQ29udGVudExvYWRlZCAnICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgbWVzc2FnZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnZXJyb3IgYWJvcnQgc2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzY1xuICAgICAgLy8gZWxlbWVudC5maXJlRXZlbnQoJ29uWFlaJy4uLiBpcyBub3QgZm9yZ2l2aW5nIGlmIHdlIHRyeSB0byBmaXJlIGFuIGV2ZW50XG4gICAgICAvLyB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoZXNlIG9uIG5ld2VyIGJyb3dzZXJzXG4gICAgLCB3M2NOYXRpdmVFdmVudHMgPVxuICAgICAgICAnc2hvdyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnaW5wdXQgaW52YWxpZCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gdG91Y2hcbiAgICAgICAgJ2dlc3R1cmVzdGFydCBnZXN0dXJlY2hhbmdlIGdlc3R1cmVlbmQgJyAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGdlc3R1cmVcbiAgICAgICAgJ3RleHRpbnB1dCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIFRleHRFdmVudFxuICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZSBwYWdlc2hvdyBwYWdlaGlkZSBwb3BzdGF0ZSAnICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdoYXNoY2hhbmdlIG9mZmxpbmUgb25saW5lICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2FmdGVycHJpbnQgYmVmb3JlcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHByaW50aW5nXG4gICAgICAgICdkcmFnc3RhcnQgZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcmFnIGRyb3AgZHJhZ2VuZCAnICAgICAgKyAvLyBkbmRcbiAgICAgICAgJ2xvYWRzdGFydCBwcm9ncmVzcyBzdXNwZW5kIGVtcHRpZWQgc3RhbGxlZCBsb2FkbWV0YWRhdGEgJyAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdsb2FkZWRkYXRhIGNhbnBsYXkgY2FucGxheXRocm91Z2ggcGxheWluZyB3YWl0aW5nIHNlZWtpbmcgJyAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnc2Vla2VkIGVuZGVkIGR1cmF0aW9uY2hhbmdlIHRpbWV1cGRhdGUgcGxheSBwYXVzZSByYXRlY2hhbmdlICcgICsgLy8gbWVkaWFcbiAgICAgICAgJ3ZvbHVtZWNoYW5nZSBjdWVjaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdjaGVja2luZyBub3VwZGF0ZSBkb3dubG9hZGluZyBjYWNoZWQgdXBkYXRlcmVhZHkgb2Jzb2xldGUgJyAgICAgICAvLyBhcHBjYWNoZVxuXG4gICAgICAvLyBjb252ZXJ0IHRvIGEgaGFzaCBmb3IgcXVpY2sgbG9va3Vwc1xuICAgICwgbmF0aXZlRXZlbnRzID0gKGZ1bmN0aW9uIChoYXNoLCBldmVudHMsIGkpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgZXZlbnRzW2ldICYmIChoYXNoW2V2ZW50c1tpXV0gPSAxKVxuICAgICAgICByZXR1cm4gaGFzaFxuICAgICAgfSh7fSwgc3RyMmFycihzdGFuZGFyZE5hdGl2ZUV2ZW50cyArIChXM0NfTU9ERUwgPyB3M2NOYXRpdmVFdmVudHMgOiAnJykpKSlcblxuICAgICAgLy8gY3VzdG9tIGV2ZW50cyBhcmUgZXZlbnRzIHRoYXQgd2UgKmZha2UqLCB0aGV5IGFyZSBub3QgcHJvdmlkZWQgbmF0aXZlbHkgYnV0XG4gICAgICAvLyB3ZSBjYW4gdXNlIG5hdGl2ZSBldmVudHMgdG8gZ2VuZXJhdGUgdGhlbVxuICAgICwgY3VzdG9tRXZlbnRzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzQW5jZXN0b3IgPSAnY29tcGFyZURvY3VtZW50UG9zaXRpb24nIGluIHJvb3RcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIChjb250YWluZXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudCkgJiAxNikgPT09IDE2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6ICdjb250YWlucycgaW4gcm9vdFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDkgfHwgY29udGFpbmVyID09PSB3aW5kb3cgPyByb290IDogY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIgIT09IGVsZW1lbnQgJiYgY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSByZXR1cm4gMVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICwgY2hlY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgIHJldHVybiAhcmVsYXRlZFxuICAgICAgICAgICAgICAgID8gcmVsYXRlZCA9PSBudWxsXG4gICAgICAgICAgICAgICAgOiAocmVsYXRlZCAhPT0gdGhpcyAmJiByZWxhdGVkLnByZWZpeCAhPT0gJ3h1bCcgJiYgIS9kb2N1bWVudC8udGVzdCh0aGlzLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICYmICFpc0FuY2VzdG9yKHJlbGF0ZWQsIHRoaXMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3VzZWVudGVyOiB7IGJhc2U6ICdtb3VzZW92ZXInLCBjb25kaXRpb246IGNoZWNrIH1cbiAgICAgICAgICAsIG1vdXNlbGVhdmU6IHsgYmFzZTogJ21vdXNlb3V0JywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZXdoZWVsOiB7IGJhc2U6IC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdoZWVsJyB9XG4gICAgICAgIH1cbiAgICAgIH0oKSlcblxuICAgICAgLy8gd2UgcHJvdmlkZSBhIGNvbnNpc3RlbnQgRXZlbnQgb2JqZWN0IGFjcm9zcyBicm93c2VycyBieSB0YWtpbmcgdGhlIGFjdHVhbCBET01cbiAgICAgIC8vIGV2ZW50IG9iamVjdCBhbmQgZ2VuZXJhdGluZyBhIG5ldyBvbmUgZnJvbSBpdHMgcHJvcGVydGllcy5cbiAgICAsIEV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGEgd2hpdGVsaXN0IG9mIHByb3BlcnRpZXMgKGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMpIHRlbGxzIHVzIHdoYXQgdG8gY2hlY2sgZm9yIGFuZCBjb3B5XG4gICAgICAgIHZhciBjb21tb25Qcm9wcyAgPSBzdHIyYXJyKCdhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0ICcgK1xuICAgICAgICAgICAgICAnZGV0YWlsIGV2ZW50UGhhc2UgZ2V0TW9kaWZpZXJTdGF0ZSBpc1RydXN0ZWQgbWV0YUtleSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5ICcgICtcbiAgICAgICAgICAgICAgJ3NyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0eXBlIHZpZXcgd2hpY2ggcHJvcGVydHlOYW1lIHBhdGgnKVxuICAgICAgICAgICwgbW91c2VQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2J1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBkYXRhVHJhbnNmZXIgJyAgICAgICtcbiAgICAgICAgICAgICAgJ2Zyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IG1vdmVtZW50WCBtb3ZlbWVudFkgcmVnaW9uJykpXG4gICAgICAgICAgLCBtb3VzZVdoZWVsUHJvcHMgPSBtb3VzZVByb3BzLmNvbmNhdChzdHIyYXJyKCd3aGVlbERlbHRhIHdoZWVsRGVsdGFYIHdoZWVsRGVsdGFZIHdoZWVsRGVsdGFaICcgK1xuICAgICAgICAgICAgICAnYXhpcycpKSAvLyAnYXhpcycgaXMgRkYgc3BlY2lmaWNcbiAgICAgICAgICAsIGtleVByb3BzICAgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIGtleUlkZW50aWZpZXIgJyAgICAgICAgICArXG4gICAgICAgICAgICAgICdrZXlMb2NhdGlvbiBsb2NhdGlvbiBpc0NvbXBvc2luZyBjb2RlJykpXG4gICAgICAgICAgLCB0ZXh0UHJvcHMgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignZGF0YScpKVxuICAgICAgICAgICwgdG91Y2hQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3RvdWNoZXMgdGFyZ2V0VG91Y2hlcyBjaGFuZ2VkVG91Y2hlcyBzY2FsZSByb3RhdGlvbicpKVxuICAgICAgICAgICwgbWVzc2FnZVByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEgb3JpZ2luIHNvdXJjZScpKVxuICAgICAgICAgICwgc3RhdGVQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3N0YXRlJykpXG4gICAgICAgICAgLCBvdmVyT3V0UmVnZXggPSAvb3ZlcnxvdXQvXG4gICAgICAgICAgICAvLyBzb21lIGV2ZW50IHR5cGVzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBhbmQgc29tZSBuZWVkIHNwZWNpYWwgcHJvcGVydGllcywgZG8gdGhhdCBhbGwgaGVyZVxuICAgICAgICAgICwgdHlwZUZpeGVycyAgID0gW1xuICAgICAgICAgICAgICAgIHsgLy8ga2V5IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9rZXkvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5rZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL2NsaWNrfG1vdXNlKD8hKC4qd2hlZWx8c2Nyb2xsKSl8bWVudXxkcmFnfGRyb3AvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yaWdodENsaWNrID0gZXZlbnQud2hpY2ggPT09IDMgfHwgZXZlbnQuYnV0dG9uID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucG9zID0geyB4OiAwLCB5OiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFnZVggfHwgZXZlbnQucGFnZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5wYWdlWFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5jbGllbnRYICsgZG9jLmJvZHkuc2Nyb2xsTGVmdCArIHJvb3Quc2Nyb2xsTGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LmNsaWVudFkgKyBkb2MuYm9keS5zY3JvbGxUb3AgKyByb290LnNjcm9sbFRvcFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3Zlck91dFJlZ2V4LnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50Wyh0eXBlID09ICdtb3VzZW92ZXInID8gJ2Zyb20nIDogJ3RvJykgKyAnRWxlbWVudCddXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3VzZVByb3BzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtb3VzZSB3aGVlbCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvbW91c2UuKih3aGVlbHxzY3JvbGwpL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtb3VzZVdoZWVsUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIFRleHRFdmVudFxuICAgICAgICAgICAgICAgICAgICByZWc6IC9edGV4dC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGV4dFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyB0b3VjaCBhbmQgZ2VzdHVyZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRvdWNofF5nZXN0dXJlL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0b3VjaFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtZXNzYWdlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ebWVzc2FnZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gcG9wc3RhdGUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL15wb3BzdGF0ZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0YXRlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZWc6IC8uKi9cbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tb25Qcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgICwgdHlwZUZpeGVyTWFwID0ge30gLy8gdXNlZCB0byBtYXAgZXZlbnQgdHlwZXMgdG8gZml4ZXIgZnVuY3Rpb25zIChhYm92ZSksIGEgYmFzaWMgY2FjaGUgbWVjaGFuaXNtXG5cbiAgICAgICAgICAsIEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVyblxuICAgICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8ICgoZWxlbWVudC5vd25lckRvY3VtZW50IHx8IGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCkucGFyZW50V2luZG93IHx8IHdpbikuZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgICA9IGlzTmF0aXZlXG4gICAgICAgICAgICAgIHRoaXMuaXNCZWFuICAgICAgICAgPSB0cnVlXG5cbiAgICAgICAgICAgICAgaWYgKCFldmVudCkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgdmFyIHR5cGUgICA9IGV2ZW50LnR5cGVcbiAgICAgICAgICAgICAgICAsIHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50XG4gICAgICAgICAgICAgICAgLCBpLCBsLCBwLCBwcm9wcywgZml4ZXJcblxuICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT09IDMgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldFxuXG4gICAgICAgICAgICAgIGlmIChpc05hdGl2ZSkgeyAvLyB3ZSBvbmx5IG5lZWQgYmFzaWMgYXVnbWVudGF0aW9uIG9uIGN1c3RvbSBldmVudHMsIHRoZSByZXN0IGV4cGVuc2l2ZSAmIHBvaW50bGVzc1xuICAgICAgICAgICAgICAgIGZpeGVyID0gdHlwZUZpeGVyTWFwW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKCFmaXhlcikgeyAvLyBoYXZlbid0IGVuY291bnRlcmVkIHRoaXMgZXZlbnQgdHlwZSBiZWZvcmUsIG1hcCBhIGZpeGVyIGZ1bmN0aW9uIGZvciBpdFxuICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHR5cGVGaXhlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRml4ZXJzW2ldLnJlZy50ZXN0KHR5cGUpKSB7IC8vIGd1YXJhbnRlZWQgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lLCBsYXN0IGlzIC4qXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZUZpeGVyTWFwW3R5cGVdID0gZml4ZXIgPSB0eXBlRml4ZXJzW2ldLmZpeFxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGZpeGVyKGV2ZW50LCB0aGlzLCB0eXBlKVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IHByb3BzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoKHAgPSBwcm9wc1tpXSkgaW4gdGhpcykgJiYgcCBpbiBldmVudCkgdGhpc1twXSA9IGV2ZW50W3BdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQoKSBhbmQgc3RvcFByb3BhZ2F0aW9uKCkgYXJlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gdGhvc2UgZnVuY3Rpb25zXG4gICAgICAgIC8vIG9uIHRoZSBET00sIHN0b3AoKSBpcyBhbiBhbGlhcyBmb3IgYm90aCBvZiB0aGVtIHRvZ2V0aGVyXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KSB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGVsc2UgdGhpcy5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICAvLyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgdG8gYmUgaGFuZGxlZCBpbnRlcm5hbGx5IGJlY2F1c2Ugd2UgbWFuYWdlIHRoZSBldmVudCBsaXN0IGZvclxuICAgICAgICAvLyBlYWNoIGVsZW1lbnRcbiAgICAgICAgLy8gbm90ZSB0aGF0IG9yaWdpbmFsRWxlbWVudCBtYXkgYmUgYSBCZWFuI0V2ZW50IG9iamVjdCBpbiBzb21lIHNpdHVhdGlvbnNcbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkICYmIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgaXMgcmlwZSBmb3Igb3B0aW1pc2F0aW9uLCBuZXcgZXZlbnRzIGFyZSAqZXhwZW5zaXZlKlxuICAgICAgICAgIC8vIGltcHJvdmluZyB0aGlzIHdpbGwgc3BlZWQgdXAgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIHZhciBuZSA9IG5ldyBFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMuaXNOYXRpdmUpXG4gICAgICAgICAgbmUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICByZXR1cm4gbmVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudFxuICAgICAgfSgpKVxuXG4gICAgICAvLyBpZiB3ZSdyZSBpbiBvbGQgSUUgd2UgY2FuJ3QgZG8gb25wcm9wZXJ0eWNoYW5nZSBvbiBkb2Mgb3Igd2luIHNvIHdlIHVzZSBkb2MuZG9jdW1lbnRFbGVtZW50IGZvciBib3RoXG4gICAgLCB0YXJnZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGlzTmF0aXZlKSB7XG4gICAgICAgIHJldHVybiAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiAoZWxlbWVudCA9PT0gZG9jIHx8IGVsZW1lbnQgPT09IHdpbikgPyByb290IDogZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBCZWFuIG1haW50YWlucyBhbiBpbnRlcm5hbCByZWdpc3RyeSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBXZSBkb24ndCB0b3VjaCBlbGVtZW50cywgb2JqZWN0c1xuICAgICAgICAqIG9yIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB0aGVtLCBpbnN0ZWFkIHdlIHN0b3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICAqIEVhY2ggZXZlbnQgbGlzdGVuZXIgaGFzIGEgUmVnRW50cnkgb2JqZWN0LCB3ZSBoYXZlIG9uZSAncmVnaXN0cnknIGZvciB0aGUgd2hvbGUgaW5zdGFuY2UuXG4gICAgICAgICovXG4gICAgLCBSZWdFbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVhY2ggaGFuZGxlciBpcyB3cmFwcGVkIHNvIHdlIGNhbiBoYW5kbGUgZGVsZWdhdGlvbiBhbmQgY3VzdG9tIGV2ZW50c1xuICAgICAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZm4sIGNvbmRpdGlvbiwgYXJncykge1xuICAgICAgICAgICAgdmFyIGNhbGwgPSBmdW5jdGlvbiAoZXZlbnQsIGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgYXJncyA/IHNsaWNlLmNhbGwoZWFyZ3MsIGV2ZW50ID8gMCA6IDEpLmNvbmNhdChhcmdzKSA6IGVhcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKGV2ZW50LCBldmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5fX2JlYW5EZWwgPyBmbi5fX2JlYW5EZWwuZnQoZXZlbnQudGFyZ2V0LCBlbGVtZW50KSA6IGV2ZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBoYW5kbGVyID0gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBmaW5kVGFyZ2V0KGV2ZW50LCB0aGlzKSAvLyBkZWxlYXRlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQpIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChmbi5fX2JlYW5EZWwpIGV2ZW50ID0gZXZlbnQuY2xvbmUoZmluZFRhcmdldChldmVudCkpIC8vIGRlbGVnYXRlZCBldmVudCwgZml4IHRoZSBmaXhcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IGZuLl9fYmVhbkRlbFxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICAgICAgICB9XG5cbiAgICAgICAgLCBSZWdFbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcmlnaW5hbCwgbmFtZXNwYWNlcywgYXJncywgcm9vdCkge1xuICAgICAgICAgICAgdmFyIGN1c3RvbVR5cGUgICAgID0gY3VzdG9tRXZlbnRzW3R5cGVdXG4gICAgICAgICAgICAgICwgaXNOYXRpdmVcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3VubG9hZCcpIHtcbiAgICAgICAgICAgICAgLy8gc2VsZiBjbGVhbi11cFxuICAgICAgICAgICAgICBoYW5kbGVyID0gb25jZShyZW1vdmVMaXN0ZW5lciwgZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21UeXBlKSB7XG4gICAgICAgICAgICAgIGlmIChjdXN0b21UeXBlLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjdXN0b21UeXBlLmNvbmRpdGlvbiwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlID0gY3VzdG9tVHlwZS5iYXNlIHx8IHR5cGVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgID0gaXNOYXRpdmUgPSBuYXRpdmVFdmVudHNbdHlwZV0gJiYgISFlbGVtZW50W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tVHlwZSAgICA9ICFXM0NfTU9ERUwgJiYgIWlzTmF0aXZlICYmIHR5cGVcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCAgICAgICA9IGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgICAgICA9IG9yaWdpbmFsXG4gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXMgICAgPSBuYW1lc3BhY2VzXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSAgICAgPSBXM0NfTU9ERUwgfHwgaXNOYXRpdmUgPyB0eXBlIDogJ3Byb3BlcnR5Y2hhbmdlJ1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgICAgICAgID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgICAgIHRoaXNbZXZlbnRTdXBwb3J0XSA9ICEhdGhpcy50YXJnZXRbZXZlbnRTdXBwb3J0XVxuICAgICAgICAgICAgdGhpcy5yb290ICAgICAgICAgID0gcm9vdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyICAgICAgID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgbnVsbCwgYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzcGFjZXMsIGlzIG91ciBlbnRyeSBpbiBhbnkgb2YgdGhlbT9cbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLmluTmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChjaGVja05hbWVzcGFjZXMpIHtcbiAgICAgICAgICB2YXIgaSwgaiwgYyA9IDBcbiAgICAgICAgICBpZiAoIWNoZWNrTmFtZXNwYWNlcykgcmV0dXJuIHRydWVcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZXNwYWNlcykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgZm9yIChpID0gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgZm9yIChqID0gdGhpcy5uYW1lc3BhY2VzLmxlbmd0aDsgai0tOykge1xuICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lc3BhY2VzW2ldID09IHRoaXMubmFtZXNwYWNlc1tqXSkgYysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja05hbWVzcGFjZXMubGVuZ3RoID09PSBjXG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaCBieSBlbGVtZW50LCBvcmlnaW5hbCBmbiAob3B0KSwgaGFuZGxlciBmbiAob3B0KVxuICAgICAgICBSZWdFbnRyeS5wcm90b3R5cGUubWF0Y2hlcyA9IGZ1bmN0aW9uIChjaGVja0VsZW1lbnQsIGNoZWNrT3JpZ2luYWwsIGNoZWNrSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgPT09IGNoZWNrRWxlbWVudCAmJlxuICAgICAgICAgICAgKCFjaGVja09yaWdpbmFsIHx8IHRoaXMub3JpZ2luYWwgPT09IGNoZWNrT3JpZ2luYWwpICYmXG4gICAgICAgICAgICAoIWNoZWNrSGFuZGxlciB8fCB0aGlzLmhhbmRsZXIgPT09IGNoZWNrSGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWdFbnRyeVxuICAgICAgfSgpKVxuXG4gICAgLCByZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIG91ciBtYXAgc3RvcmVzIGFycmF5cyBieSBldmVudCB0eXBlLCBqdXN0IGJlY2F1c2UgaXQncyBiZXR0ZXIgdGhhbiBzdG9yaW5nXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgYXJyYXkuXG4gICAgICAgIC8vIHVzZXMgJyQnIGFzIGEgcHJlZml4IGZvciB0aGUga2V5cyBmb3Igc2FmZXR5IGFuZCAncicgYXMgYSBzcGVjaWFsIHByZWZpeCBmb3JcbiAgICAgICAgLy8gcm9vdExpc3RlbmVycyBzbyB3ZSBjYW4gbG9vayB0aGVtIHVwIGZhc3RcbiAgICAgICAgdmFyIG1hcCA9IHt9XG5cbiAgICAgICAgICAvLyBnZW5lcmljIGZ1bmN0aW9uYWwgc2VhcmNoIG9mIG91ciByZWdpc3RyeSBmb3IgbWF0Y2hpbmcgbGlzdGVuZXJzLFxuICAgICAgICAgIC8vIGBmbmAgcmV0dXJucyBmYWxzZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3BcbiAgICAgICAgICAsIGZvckFsbCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgaGFuZGxlciwgcm9vdCwgZm4pIHtcbiAgICAgICAgICAgICAgdmFyIHBmeCA9IHJvb3QgPyAncicgOiAnJCdcbiAgICAgICAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VhcmNoIHRoZSB3aG9sZSByZWdpc3RyeVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gcGZ4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckFsbChlbGVtZW50LCB0LnN1YnN0cigxKSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGwsIGxpc3QgPSBtYXBbcGZ4ICsgdHlwZV0sIGFsbCA9IGVsZW1lbnQgPT0gJyonXG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0KSByZXR1cm5cbiAgICAgICAgICAgICAgICBmb3IgKGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKChhbGwgfHwgbGlzdFtpXS5tYXRjaGVzKGVsZW1lbnQsIG9yaWdpbmFsLCBoYW5kbGVyKSkgJiYgIWZuKGxpc3RbaV0sIGxpc3QsIGksIHR5cGUpKSByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgaGFzID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCB1c2luZyBmb3JBbGwgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCdzIGEgYml0IHNsb3dlciBhbmQgdGhpc1xuICAgICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBmYXN0XG4gICAgICAgICAgICAgIHZhciBpLCBsaXN0ID0gbWFwWyhyb290ID8gJ3InIDogJyQnKSArIHR5cGVdXG4gICAgICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghbGlzdFtpXS5yb290ICYmIGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgbnVsbCkpIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBnZXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIHJvb3QpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBbXVxuICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIG51bGwsIHJvb3QsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIHB1dCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICB2YXIgaGFzID0gIWVudHJ5LnJvb3QgJiYgIXRoaXMuaGFzKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICAgICAgICwga2V5ID0gKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZVxuICAgICAgICAgICAgICA7KG1hcFtrZXldIHx8IChtYXBba2V5XSA9IFtdKSkucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgcmV0dXJuIGhhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBkZWwgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgZm9yQWxsKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGVudHJ5LmhhbmRsZXIsIGVudHJ5LnJvb3QsIGZ1bmN0aW9uIChlbnRyeSwgbGlzdCwgaSkge1xuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIGRlbGV0ZSBtYXBbKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZV1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZHVtcCBhbGwgZW50cmllcywgdXNlZCBmb3Igb251bmxvYWRcbiAgICAgICAgICAsIGVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciB0LCBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yICh0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0LmNoYXJBdCgwKSA9PSAnJCcpIGVudHJpZXMgPSBlbnRyaWVzLmNvbmNhdChtYXBbdF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBoYXM6IGhhcywgZ2V0OiBnZXQsIHB1dDogcHV0LCBkZWw6IGRlbCwgZW50cmllczogZW50cmllcyB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIG5lZWQgYSBzZWxlY3RvciBlbmdpbmUgZm9yIGRlbGVnYXRlZCBldmVudHMsIHVzZSBxdWVyeVNlbGVjdG9yQWxsIGlmIGl0IGV4aXN0c1xuICAgICAgLy8gYnV0IGZvciBvbGRlciBicm93c2VycyB3ZSBuZWVkIFF3ZXJ5LCBTaXp6bGUgb3Igc2ltaWxhclxuICAgICwgc2VsZWN0b3JFbmdpbmVcbiAgICAsIHNldFNlbGVjdG9yRW5naW5lID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBkb2MucXVlcnlTZWxlY3RvckFsbFxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocywgcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnF1ZXJ5U2VsZWN0b3JBbGwocylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZWFuOiBObyBzZWxlY3RvciBlbmdpbmUgaW5zdGFsbGVkJykgLy8gZWVla1xuICAgICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gd2UgYXR0YWNoIHRoaXMgbGlzdGVuZXIgdG8gZWFjaCBET00gZXZlbnQgdGhhdCB3ZSBuZWVkIHRvIGxpc3RlbiB0bywgb25seSBvbmNlXG4gICAgICAvLyBwZXIgZXZlbnQgdHlwZSBwZXIgRE9NIGVsZW1lbnRcbiAgICAsIHJvb3RMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgdHlwZSkge1xuICAgICAgICBpZiAoIVczQ19NT0RFTCAmJiB0eXBlICYmIGV2ZW50ICYmIGV2ZW50LnByb3BlcnR5TmFtZSAhPSAnX29uJyArIHR5cGUpIHJldHVyblxuXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSByZWdpc3RyeS5nZXQodGhpcywgdHlwZSB8fCBldmVudC50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCB0aGlzLCB0cnVlKVxuICAgICAgICBpZiAodHlwZSkgZXZlbnQudHlwZSA9IHR5cGVcblxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgY2FsbGluZyB0aGVtIHVubGVzcyB0aGV5IGhhdmVcbiAgICAgICAgLy8gYmVlbiByZW1vdmVkIGJ5IGEgcHJldmlvdXMgaGFuZGxlciBvciBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgZm9yICg7IGkgPCBsICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXS5yZW1vdmVkKSBsaXN0ZW5lcnNbaV0uaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVycyB0byBET00gZWxlbWVudHNcbiAgICAsIGxpc3RlbmVyID0gVzNDX01PREVMXG4gICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgICAgICAvLyBuZXcgYnJvd3NlcnNcbiAgICAgICAgICAgIGVsZW1lbnRbYWRkID8gYWRkRXZlbnQgOiByZW1vdmVFdmVudF0odHlwZSwgcm9vdExpc3RlbmVyLCB1c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYWRkLCBjdXN0b20gLyosIHVzZUNhcHR1cmUgKi8pIHtcbiAgICAgICAgICAgIC8vIElFOCBhbmQgYmVsb3csIHVzZSBhdHRhY2hFdmVudC9kZXRhY2hFdmVudCBhbmQgd2UgaGF2ZSB0byBwaWdneS1iYWNrIHByb3BlcnR5Y2hhbmdlIGV2ZW50c1xuICAgICAgICAgICAgLy8gdG8gc2ltdWxhdGUgZXZlbnQgYnViYmxpbmcgZXRjLlxuICAgICAgICAgICAgdmFyIGVudHJ5XG4gICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgIHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAsIGN1c3RvbSB8fCB0eXBlXG4gICAgICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXZlbnQpIHsgLy8gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICByb290TGlzdGVuZXIuY2FsbChlbGVtZW50LCBldmVudCwgY3VzdG9tKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICwgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCB0cnVlIC8vIGlzIHJvb3RcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgaWYgKGN1c3RvbSAmJiBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9PSBudWxsKSBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9IDBcbiAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyeSA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCBjdXN0b20gfHwgdHlwZSwgcm9vdExpc3RlbmVyLCB0cnVlKVswXVxuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50YXJnZXQuZGV0YWNoRXZlbnQoJ29uJyArIGVudHJ5LmV2ZW50VHlwZSwgZW50cnkuaGFuZGxlcilcbiAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWwoZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAsIG9uY2UgPSBmdW5jdGlvbiAocm0sIGVsZW1lbnQsIHR5cGUsIGZuLCBvcmlnaW5hbEZuKSB7XG4gICAgICAgIC8vIHdyYXAgdGhlIGhhbmRsZXIgaW4gYSBoYW5kbGVyIHRoYXQgZG9lcyBhIHJlbW92ZSBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIHJtKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICwgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3JnVHlwZSwgaGFuZGxlciwgbmFtZXNwYWNlcywgdXNlQ2FwdHVyZSkge1xuICAgICAgICB2YXIgdHlwZSAgICAgPSBvcmdUeXBlICYmIG9yZ1R5cGUucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICAgICwgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCByZW1vdmVkICA9IHt9XG4gICAgICAgICAgLCBpLCBsXG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcnNbaV0ub3JpZ2luYWwgPT09IGhhbmRsZXIpICYmIGhhbmRsZXJzW2ldLmluTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UgaGF2ZSBhIHJlZ2lzdHJ5LmdldCgpIGFuZCByZWdpc3RyeS5kZWwoKSB0aGF0XG4gICAgICAgICAgICAvLyBib3RoIGRvIHJlZ2lzdHJ5IHNlYXJjaGVzIHNvIHdlIHdhc3RlIGN5Y2xlcyBkb2luZyB0aGlzLiBOZWVkcyB0byBiZSByb2xsZWQgaW50b1xuICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVnaXN0cnkuZm9yQWxsKGZuKSB0aGF0IHJlbW92ZXMgd2hpbGUgZmluZGluZywgYnV0IHRoZSBjYXRjaCBpcyB0aGF0XG4gICAgICAgICAgICAvLyB3ZSdsbCBiZSBzcGxpY2luZyB0aGUgYXJyYXlzIHRoYXQgd2UncmUgaXRlcmF0aW5nIG92ZXIuIE5lZWRzIGV4dHJhIHRlc3RzIHRvXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2NyZXcgaXQgdXAuIEBydmFnZ1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGhhbmRsZXJzW2ldKVxuICAgICAgICAgICAgaWYgKCFyZW1vdmVkW2hhbmRsZXJzW2ldLmV2ZW50VHlwZV0gJiYgaGFuZGxlcnNbaV1bZXZlbnRTdXBwb3J0XSlcbiAgICAgICAgICAgICAgcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdID0geyB0OiBoYW5kbGVyc1tpXS5ldmVudFR5cGUsIGM6IGhhbmRsZXJzW2ldLnR5cGUgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBlYWNoIHR5cGUvZWxlbWVudCBmb3IgcmVtb3ZlZCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyIHdoZXJlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZFxuICAgICAgICBmb3IgKGkgaW4gcmVtb3ZlZCkge1xuICAgICAgICAgIGlmICghcmVnaXN0cnkuaGFzKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgbnVsbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGxpc3RlbmVyIG9mIHRoaXMgdHlwZSwgcmVtb3ZlIHRoZSByb290TGlzdGVuZXJcbiAgICAgICAgICAgIGxpc3RlbmVyKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgZmFsc2UsIHJlbW92ZWRbaV0uYywgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIGEgZGVsZWdhdGUgaGVscGVyIHVzaW5nIHRoZSBnaXZlbiBzZWxlY3Rvciwgd3JhcCB0aGUgaGFuZGxlciBmdW5jdGlvblxuICAgICwgZGVsZWdhdGUgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIC8vVE9ETzogZmluZFRhcmdldCAodGhlcmVmb3JlICQpIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgbWF0Y2ggYW5kIG9uY2UgZm9yXG4gICAgICAgIC8vIHNldHRpbmcgZS5jdXJyZW50VGFyZ2V0LCBmaXggdGhpcyBzbyBpdCdzIG9ubHkgbmVlZGVkIG9uY2VcbiAgICAgICAgdmFyIGZpbmRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBpLCBhcnJheSA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IHNlbGVjdG9yRW5naW5lKHNlbGVjdG9yLCByb290KSA6IHNlbGVjdG9yXG4gICAgICAgICAgICAgIGZvciAoOyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSByb290OyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSB0YXJnZXQpIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kVGFyZ2V0KGUudGFyZ2V0LCB0aGlzKVxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIGZuLmFwcGx5KG1hdGNoLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gX19iZWFuRGVsIGlzbid0IHBsZWFzYW50IGJ1dCBpdCdzIGEgcHJpdmF0ZSBmdW5jdGlvbiwgbm90IGV4cG9zZWQgb3V0c2lkZSBvZiBCZWFuXG4gICAgICAgIGhhbmRsZXIuX19iZWFuRGVsID0ge1xuICAgICAgICAgICAgZnQgICAgICAgOiBmaW5kVGFyZ2V0IC8vIGF0dGFjaCBpdCBoZXJlIGZvciBjdXN0b21FdmVudHMgdG8gdXNlIHRvb1xuICAgICAgICAgICwgc2VsZWN0b3IgOiBzZWxlY3RvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICB9XG5cbiAgICAsIGZpcmVMaXN0ZW5lciA9IFczQ19NT0RFTCA/IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBtb2Rlcm4gYnJvd3NlcnMsIGRvIGEgcHJvcGVyIGRpc3BhdGNoRXZlbnQoKVxuICAgICAgICB2YXIgZXZ0ID0gZG9jLmNyZWF0ZUV2ZW50KGlzTmF0aXZlID8gJ0hUTUxFdmVudHMnIDogJ1VJRXZlbnRzJylcbiAgICAgICAgZXZ0W2lzTmF0aXZlID8gJ2luaXRFdmVudCcgOiAnaW5pdFVJRXZlbnQnXSh0eXBlLCB0cnVlLCB0cnVlLCB3aW4sIDEpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgICB9IDogZnVuY3Rpb24gKGlzTmF0aXZlLCB0eXBlLCBlbGVtZW50KSB7XG4gICAgICAgIC8vIG9sZCBicm93c2VyIHVzZSBvbnByb3BlcnR5Y2hhbmdlLCBqdXN0IGluY3JlbWVudCBhIGN1c3RvbSBwcm9wZXJ0eSB0byB0cmlnZ2VyIHRoZSBldmVudFxuICAgICAgICBlbGVtZW50ID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgaXNOYXRpdmUgPyBlbGVtZW50LmZpcmVFdmVudCgnb24nICsgdHlwZSwgZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KCkpIDogZWxlbWVudFsnX29uJyArIHR5cGVdKytcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogUHVibGljIEFQSTogb2ZmKCksIG9uKCksIGFkZCgpLCAocmVtb3ZlKCkpLCBvbmUoKSwgZmlyZSgpLCBjbG9uZSgpXG4gICAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9mZihlbGVtZW50WywgZXZlbnRUeXBlKHMpWywgaGFuZGxlciBdLCBvcHRpb25zXSlcbiAgICAgICAgKi9cbiAgICAsIG9mZiA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlU3BlYywgZm4pIHtcbiAgICAgICAgdmFyIGlzVHlwZVN0ciA9IGlzU3RyaW5nKHR5cGVTcGVjKSxcbiAgICAgICAgICBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgICwgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSlcbiAgICAgICAgICAsIGssIHR5cGUsIG5hbWVzcGFjZXMsIGlcblxuICAgICAgICBpZiAoaXNUeXBlU3RyICYmIHR5cGVTcGVjLmluZGV4T2YoJyAnKSA+IDApIHtcbiAgICAgICAgICAvLyBvZmYoZWwsICd0MSB0MiB0MycsIGZuKSBvciBvZmYoZWwsICd0MSB0MiB0MycpXG4gICAgICAgICAgdHlwZVNwZWMgPSBzdHIyYXJyKHR5cGVTcGVjKVxuICAgICAgICAgIGZvciAoaSA9IHR5cGVTcGVjLmxlbmd0aDsgaS0tOylcbiAgICAgICAgICAgIG9mZihlbGVtZW50LCB0eXBlU3BlY1tpXSwgZm4pXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICBpZiAodHlwZSAmJiBjdXN0b21FdmVudHNbdHlwZV0pIHR5cGUgPSBjdXN0b21FdmVudHNbdHlwZV0uYmFzZVxuXG4gICAgICAgIGlmICghdHlwZVNwZWMgfHwgaXNUeXBlU3RyKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsKSBvciBvZmYoZWwsIHQxLm5zKSBvciBvZmYoZWwsIC5ucykgb3Igb2ZmKGVsLCAubnMxLm5zMi5uczMpXG4gICAgICAgICAgaWYgKG5hbWVzcGFjZXMgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lc3BhY2VzID0gc3RyMmFycihuYW1lc3BhY2VzLCAnLicpXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZm4sIG5hbWVzcGFjZXMsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHR5cGVTcGVjKSkge1xuICAgICAgICAgIC8vIG9mZihlbCwgZm4pXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgbnVsbCwgdHlwZVNwZWMsIG51bGwsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIHsgdDE6IGZuMSwgdDIsIGZuMiB9KVxuICAgICAgICAgIGZvciAoayBpbiB0eXBlU3BlYykge1xuICAgICAgICAgICAgaWYgKHR5cGVTcGVjLmhhc093blByb3BlcnR5KGspKSBvZmYoZWxlbWVudCwgaywgdHlwZVNwZWNba10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogb24oZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdLCBbb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50cywgc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEZuLCB0eXBlLCB0eXBlcywgaSwgYXJncywgZW50cnksIGZpcnN0LCBvcHRzXG5cbiAgICAgICAgLy9UT0RPOiB0aGUgdW5kZWZpbmVkIGNoZWNrIG1lYW5zIHlvdSBjYW4ndCBwYXNzIGFuICdhcmdzJyBhcmd1bWVudCwgZml4IHRoaXMgcGVyaGFwcz9cbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGV2ZW50cyA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vVE9ETzogdGhpcyBjYW4ndCBoYW5kbGUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcbiAgICAgICAgICAgICAgb24uY2FsbCh0aGlzLCBlbGVtZW50LCB0eXBlLCBldmVudHNbdHlwZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICAgIG9yaWdpbmFsRm4gPSBmblxuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgNClcbiAgICAgICAgICBmbiAgICAgICAgID0gZGVsZWdhdGUoc2VsZWN0b3IsIG9yaWdpbmFsRm4sIHNlbGVjdG9yRW5naW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMylcbiAgICAgICAgICBmbiAgICAgICAgID0gb3JpZ2luYWxGbiA9IHNlbGVjdG9yXG4gICAgICAgIH1cblxuICAgICAgICBvcHRzID0gYnVpbGRPcHRpb25zKGRlZmF1bHRPcHRzLCBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pXG4gICAgICAgIHR5cGVzID0gc3RyMmFycihldmVudHMpXG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBvbmUoKSwgd3JhcCBpbiBhIHNlbGYtcmVtb3ZpbmcgaGFuZGxlclxuICAgICAgICBpZiAodGhpcyA9PT0gT05FKSB7XG4gICAgICAgICAgZm4gPSBvbmNlKG9mZiwgZWxlbWVudCwgZXZlbnRzLCBmbiwgb3JpZ2luYWxGbilcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIC8vIGFkZCBuZXcgaGFuZGxlciB0byB0aGUgcmVnaXN0cnkgYW5kIGNoZWNrIGlmIGl0J3MgdGhlIGZpcnN0IGZvciB0aGlzIGVsZW1lbnQvdHlwZVxuICAgICAgICAgIGZpcnN0ID0gcmVnaXN0cnkucHV0KGVudHJ5ID0gbmV3IFJlZ0VudHJ5KFxuICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAsIHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJykgLy8gZXZlbnQgdHlwZVxuICAgICAgICAgICAgLCBmblxuICAgICAgICAgICAgLCBvcmlnaW5hbEZuXG4gICAgICAgICAgICAsIHN0cjJhcnIodHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpLCAnLicpIC8vIG5hbWVzcGFjZXNcbiAgICAgICAgICAgICwgYXJnc1xuICAgICAgICAgICAgLCBmYWxzZSAvLyBub3Qgcm9vdFxuICAgICAgICAgICkpXG4gICAgICAgICAgaWYgKGVudHJ5W2V2ZW50U3VwcG9ydF0gJiYgZmlyc3QpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGV2ZW50IG9mIHRoaXMgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGFkZCByb290IGxpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCBlbnRyeS5ldmVudFR5cGUsIHRydWUsIGVudHJ5LmN1c3RvbVR5cGUsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBhZGQoZWxlbWVudFssIHNlbGVjdG9yXSwgZXZlbnRUeXBlKHMpLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogRGVwcmVjYXRlZDoga2VwdCAoZm9yIG5vdykgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHlcbiAgICAgICAgKi9cbiAgICAsIGFkZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudHMsIGZuLCBkZWxmbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgLCAhaXNTdHJpbmcoZm4pXG4gICAgICAgICAgICAgID8gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIDogWyBlbGVtZW50LCBmbiwgZXZlbnRzLCBkZWxmbiBdLmNvbmNhdChhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCA0KSA6IFtdKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uZShlbGVtZW50LCBldmVudFR5cGUocylbLCBzZWxlY3Rvcl0sIGhhbmRsZXJbLCBhcmdzIF0pXG4gICAgICAgICovXG4gICAgLCBvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvbi5hcHBseShPTkUsIGFyZ3VtZW50cylcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogZmlyZShlbGVtZW50LCBldmVudFR5cGUocylbLCBhcmdzIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUaGUgb3B0aW9uYWwgJ2FyZ3MnIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXksIGlmIG5vICdhcmdzJyBhcmd1bWVudCBpcyBwcm92aWRlZFxuICAgICAgICAqIHRoZW4gd2UgY2FuIHVzZSB0aGUgYnJvd3NlcidzIERPTSBldmVudCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB0cmlnZ2VyIGhhbmRsZXJzIG1hbnVhbGx5XG4gICAgICAgICovXG4gICAgLCBmaXJlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gc3RyMmFycih0eXBlKVxuICAgICAgICAgICwgaSwgaiwgbCwgbmFtZXMsIGhhbmRsZXJzXG5cbiAgICAgICAgZm9yIChpID0gdHlwZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdHlwZSA9IHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICBpZiAobmFtZXMgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpIG5hbWVzID0gc3RyMmFycihuYW1lcywgJy4nKVxuICAgICAgICAgIGlmICghbmFtZXMgJiYgIWFyZ3MgJiYgZWxlbWVudFtldmVudFN1cHBvcnRdKSB7XG4gICAgICAgICAgICBmaXJlTGlzdGVuZXIobmF0aXZlRXZlbnRzW3R5cGVdLCB0eXBlLCBlbGVtZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub24tbmF0aXZlIGV2ZW50LCBlaXRoZXIgYmVjYXVzZSBvZiBhIG5hbWVzcGFjZSwgYXJndW1lbnRzIG9yIGEgbm9uIERPTSBlbGVtZW50XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGxpc3RlbmVycyBhbmQgbWFudWFsbHkgJ2ZpcmUnXG4gICAgICAgICAgICBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgIGFyZ3MgPSBbZmFsc2VdLmNvbmNhdChhcmdzKVxuICAgICAgICAgICAgZm9yIChqID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcnNbal0uaW5OYW1lc3BhY2VzKG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmhhbmRsZXIuYXBwbHkoZWxlbWVudCwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBjbG9uZShkc3RFbGVtZW50LCBzcmNFbGVtZW50WywgZXZlbnRUeXBlIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUT0RPOiBwZXJoYXBzIGZvciBjb25zaXN0ZW5jeSB3ZSBzaG91bGQgYWxsb3cgdGhlIHNhbWUgZmxleGliaWxpdHkgaW4gdHlwZSBzcGVjaWZpZXJzP1xuICAgICAgICAqL1xuICAgICwgY2xvbmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgZnJvbSwgdHlwZSkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZnJvbSwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gaGFuZGxlcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuICAgICAgICAgICwgYXJncywgYmVhbkRlbFxuXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBhcmdzID0gWyBlbGVtZW50LCBoYW5kbGVyc1tpXS50eXBlIF1cbiAgICAgICAgICAgIGlmIChiZWFuRGVsID0gaGFuZGxlcnNbaV0uaGFuZGxlci5fX2JlYW5EZWwpIGFyZ3MucHVzaChiZWFuRGVsLnNlbGVjdG9yKVxuICAgICAgICAgICAgYXJncy5wdXNoKGhhbmRsZXJzW2ldLm9yaWdpbmFsKVxuICAgICAgICAgICAgb24uYXBwbHkobnVsbCwgYXJncylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICwgYmVhbiA9IHtcbiAgICAgICAgICAnb24nICAgICAgICAgICAgICAgIDogb25cbiAgICAgICAgLCAnYWRkJyAgICAgICAgICAgICAgIDogYWRkXG4gICAgICAgICwgJ29uZScgICAgICAgICAgICAgICA6IG9uZVxuICAgICAgICAsICdvZmYnICAgICAgICAgICAgICAgOiBvZmZcbiAgICAgICAgLCAncmVtb3ZlJyAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ2Nsb25lJyAgICAgICAgICAgICA6IGNsb25lXG4gICAgICAgICwgJ2ZpcmUnICAgICAgICAgICAgICA6IGZpcmVcbiAgICAgICAgLCAnRXZlbnQnICAgICAgICAgICAgIDogRXZlbnRcbiAgICAgICAgLCAnc2V0U2VsZWN0b3JFbmdpbmUnIDogc2V0U2VsZWN0b3JFbmdpbmVcbiAgICAgICAgLCAnbm9Db25mbGljdCcgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udGV4dFtuYW1lXSA9IG9sZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgLy8gZm9yIElFLCBjbGVhbiB1cCBvbiB1bmxvYWQgdG8gYXZvaWQgbGVha3NcbiAgaWYgKHdpbi5hdHRhY2hFdmVudCkge1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGksIGVudHJpZXMgPSByZWdpc3RyeS5lbnRyaWVzKClcbiAgICAgIGZvciAoaSBpbiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2ldLnR5cGUgJiYgZW50cmllc1tpXS50eXBlICE9PSAndW5sb2FkJykgb2ZmKGVudHJpZXNbaV0uZWxlbWVudCwgZW50cmllc1tpXS50eXBlKVxuICAgICAgfVxuICAgICAgd2luLmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gICAgICB3aW4uQ29sbGVjdEdhcmJhZ2UgJiYgd2luLkNvbGxlY3RHYXJiYWdlKClcbiAgICB9XG4gICAgd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gIH1cblxuICAvLyBpbml0aWFsaXplIHNlbGVjdG9yIGVuZ2luZSB0byBpbnRlcm5hbCBkZWZhdWx0IChxU0Egb3IgdGhyb3cgRXJyb3IpXG4gIHNldFNlbGVjdG9yRW5naW5lKClcblxuICByZXR1cm4gYmVhblxufSk7XG4iLCJcclxuLyoqXHJcbiAqIEV4cG9zZSBgRW1pdHRlcmAuXHJcbiAqL1xyXG5cclxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgbW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xyXG59XHJcblxyXG4vKipcclxuICogSW5pdGlhbGl6ZSBhIG5ldyBgRW1pdHRlcmAuXHJcbiAqXHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gRW1pdHRlcihvYmopIHtcclxuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXHJcbiAqIEByZXR1cm4ge09iamVjdH1cclxuICogQGFwaSBwcml2YXRlXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XHJcbiAgZm9yICh2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKSB7XHJcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XHJcbiAgfVxyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICAodGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gfHwgW10pXHJcbiAgICAucHVzaChmbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBgZXZlbnRgIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGEgc2luZ2xlXHJcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIGZ1bmN0aW9uIG9uKCkge1xyXG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcclxuICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgfVxyXG5cclxuICBvbi5mbiA9IGZuO1xyXG4gIHRoaXMub24oZXZlbnQsIG9uKTtcclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBgZXZlbnRgIG9yIGFsbFxyXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub2ZmID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcblxyXG4gIC8vIGFsbFxyXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLyBzcGVjaWZpYyBldmVudFxyXG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcclxuXHJcbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xyXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxyXG4gIHZhciBjYjtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgY2IgPSBjYWxsYmFja3NbaV07XHJcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xyXG4gICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogRW1pdCBgZXZlbnRgIHdpdGggdGhlIGdpdmVuIGFyZ3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge01peGVkfSAuLi5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxyXG4gICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG5cclxuICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgIGNhbGxiYWNrc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoaXMgZW1pdHRlciBoYXMgYGV2ZW50YCBoYW5kbGVycy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xyXG59O1xyXG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoJ2NvbXBvc2UtdG9vbGJveCcpLFxuICAgIEV2ZW50ICAgPSB0b29sYm94LmV2ZW50LFxuICAgIG9wdGlvbnMgPSB7fSxcbiAgICB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgZGlhbG9nRWwsXG4gICAgZm9jdXNlZEVsLFxuICAgIGRlZmF1bHRzID0ge1xuICAgICAgb25TaG93OiBmdW5jdGlvbigpe30sXG4gICAgICBvbkNsb3NlOiBmdW5jdGlvbigpe30sXG4gICAgICBidXR0b25UZW1wbGF0ZTogJzxidXR0b24gcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwiYnV0dG9uXCI+PC9idXR0b24+JyxcbiAgICAgIGRpYWxvZ1RlbXBsYXRlOiAnPGRpdiByb2xlPVwiZGlhbG9nXCIgY2xhc3M9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2ctdGl0bGVcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZGlhbG9nLWRlc2NyaXB0aW9uXCI+XFxcbiAgPGRpdiBjbGFzcz1cImRpYWxvZy1jYXJkXCI+XFxcbiAgICA8aGVhZGVyIGNsYXNzPVwiZGlhbG9nLWhlYWRlclwiPlxcXG4gICAgICA8aDIgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBpZD1cImRpYWxvZy10aXRsZVwiPjwvaDI+XFxcbiAgICA8L2hlYWRlcj5cXFxuICAgIDxwIGNsYXNzPVwiZGlhbG9nLWRlc2NyaXB0aW9uXCIgaWQ9XCJkaWFsb2ctZGVzY3JpcHRpb25cIj48L3A+XFxcbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXJlc3BvbnNlXCI+XFxcbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYWN0aW9uc1wiPjwvZGl2PlxcXG4gICAgPC9kaXY+XFxcbiAgPC9kaXY+XFxcbjwvZGl2Pid9XG5cbmZ1bmN0aW9uIHNob3coIG9wdHMgKSB7XG4gIGlmICggdHlwZW9mIG9wdHMgIT0gJ29iamVjdCcgKSB7IHJldHVybiBjb25zb2xlLmVycm9yKCdJbnZhbGlkIG9wdGlvbnMgcGFzc2VkIGZvciBEaWFsb2cnLCBvcHRzKSB9XG5cbiAgaWYgKCAhb3B0cy50aXRsZSApIHsgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0RpYWxvZyBtdXN0IGhhdmUgYSB0aXRsZScsIG9wdHMpIH1cblxuICBmb2N1c2VkRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gIG9wdGlvbnMgPSBvcHRzXG4gIGRpYWxvZ0VsID0gdGVtcGxhdGUoIGRlZmF1bHRzLmRpYWxvZ1RlbXBsYXRlIClcblxuICBhZGRUZXh0KClcbiAgYWRkQnV0dG9ucygpXG5cbiAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoICdhZnRlcmJlZ2luJywgZGlhbG9nRWwgKVxuXG4gIGxpc3RlbigpXG5cbiAgZGVmYXVsdHMub25TaG93KClcbn1cblxuZnVuY3Rpb24gbGlzdGVuKCkge1xuXG4gIEV2ZW50Lm9uKCBkaWFsb2dFbCwgJ2NsaWNrJywgJy5kaWFsb2ctY29udGludWUnLCBjb250aW51ZUFjdGlvbiApXG4gIEV2ZW50Lm9uKCBkaWFsb2dFbCwgJ2NsaWNrJywgJy5kaWFsb2ctY2FuY2VsJywgY2FuY2VsQWN0aW9uIClcbiAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGRpYWxvZ0VsLCB0YWIsIHRydWUgKVxuXG4gIEV2ZW50LmtleU9uKCAgJ3RhYicsICAgJ2RpYWxvZycsIHRhYiApXG4gIEV2ZW50LmtleU9uZSggJ2VudGVyJywgJ2RpYWxvZycsIGNvbnRpbnVlQWN0aW9uIClcbiAgRXZlbnQua2V5T25lKCAnZXNjJywgICAnZGlhbG9nJywgY2FuY2VsQWN0aW9uIClcblxuICBFdmVudC5rZXkuc2V0U2NvcGUoICdkaWFsb2cnIClcbn1cblxuLy8gQWRkIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmcm9tIG9wdGlvbnNcbmZ1bmN0aW9uIGFkZFRleHQoKSB7XG5cbiAgLy8gQWRkIHRpdGxlXG4gIGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3IoICcjZGlhbG9nLXRpdGxlJyApLmlubmVySFRNTCA9IG9wdGlvbnMudGl0bGVcblxuICAvLyBBZGQgb3B0aW9uYWwgZGVzY3JpcHRpb25cbiAgdmFyIGRlc2NyaXB0aW9uRWwgPSBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCAnI2RpYWxvZy1kZXNjcmlwdGlvbicgKVxuXG4gIGlmICggb3B0aW9ucy5kZXNjcmlwdGlvbiApIHtcbiAgICBkZXNjcmlwdGlvbkVsLmlubmVySFRNTCA9IG9wdGlvbnMuZGVzY3JpcHRpb25cbiAgfSBlbHNlIHtcbiAgICBkZXNjcmlwdGlvbkVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGRlc2NyaXB0aW9uRWwgKVxuICAgIGRpYWxvZ0VsLnJlbW92ZUF0dHJpYnV0ZSggJ2FyaWEtbGFiZWxsZWRieScgKVxuICB9XG5cbn1cblxuLy8gQWRkIENhbmNlbCBhbmQgQ29udGludWUgYnV0dG9ucyAoaWYgbmVjZXNzYXJ5KVxuZnVuY3Rpb24gYWRkQnV0dG9ucygpIHtcblxuICBpZiAoIG9wdGlvbnMuY29udGludWUgfHwgb3B0aW9ucy5mb2xsb3cgfHwgb3B0aW9ucy5zdWJtaXQgKSB7XG5cbiAgICB2YXIgY29udGludWVCdXR0b24gPSB0ZW1wbGF0ZSggZGVmYXVsdHMuYnV0dG9uVGVtcGxhdGUgKVxuICAgIGNvbnRpbnVlQnV0dG9uLmNsYXNzTGlzdC5hZGQoICdkaWFsb2ctY29udGludWUnIClcbiAgICBpZiAoIG9wdGlvbnMuZGVzdHJ1Y3RpdmUgKSB7IGNvbnRpbnVlQnV0dG9uLmNsYXNzTGlzdC5hZGQoICdkZXN0cnVjdGl2ZScgKSB9XG4gICAgY29udGludWVCdXR0b24uaW5uZXJIVE1MID0gb3B0aW9ucy5jb250aW51ZSB8fCAnQ29udGludWUnXG5cbiAgICBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCcuZGlhbG9nLWFjdGlvbnMnKS5hcHBlbmRDaGlsZCggY29udGludWVCdXR0b24gKVxuXG4gICAgb3B0aW9ucy5jYW5jZWwgPSBvcHRpb25zLmNhbmNlbCB8fCAnQ2FuY2VsJ1xuICB9XG5cbiAgdmFyIGNhbmNlbEJ1dHRvbiA9IHRlbXBsYXRlKCBkZWZhdWx0cy5idXR0b25UZW1wbGF0ZSApXG5cbiAgY2FuY2VsQnV0dG9uLmNsYXNzTGlzdC5hZGQoICdkaWFsb2ctY2FuY2VsJyApXG4gIGNhbmNlbEJ1dHRvbi5pbm5lckhUTUwgPSBvcHRpb25zLmNhbmNlbCB8fCAoIG9wdGlvbnMuY29udGludWUgPyAnQ2FuY2VsJyA6ICdPSycgKVxuXG4gIGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3IoJy5kaWFsb2ctYWN0aW9ucycpLmFwcGVuZENoaWxkKCBjYW5jZWxCdXR0b24gKVxuXG59XG5cbi8vIEluIGEgbW9kYWwgd2luZG93LCBgdGFiYCBtdXN0IGN5Y2xlIGJldHdlZW4gZWxlbWVudHMgaW4gdGhlIG1vZGFsLlxuZnVuY3Rpb24gdGFiKCBldmVudCApIHtcblxuICAvLyBGaW5kIGFsbCBmb2N1c2FibGUgZWxlbWVudHMgaW4gdGhlIGRpYWxvZyBjYXJkXG4gIHZhciBmb2N1c2FibGUgICA9IGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uJyksXG4gICAgICBsYXN0ICAgICAgICA9IGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0sXG4gICAgICBmb2N1c2VkICAgICA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcblxuICAvLyBJZiBmb2N1c2VkIG9uIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50LCB0YWIgdG8gdGhlIGZpcnN0IGVsZW1lbnQuXG4gIGlmICggZm9jdXNlZCA9PSBsYXN0ICkge1xuICAgIGlmICggZXZlbnQgKXsgZXZlbnQucHJldmVudERlZmF1bHQoKSB9XG4gICAgZm9jdXNhYmxlWzBdLmZvY3VzKClcbiAgfVxuXG4gIC8vIEZvY3VzIG9uIHRoZSBsYXN0IGVsZW1lbnQgaWYgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgZGlhbG9nXG4gIGlmICggIWZvY3VzZWQgfHwgIXRvb2xib3guY2hpbGRPZiggZm9jdXNlZCwgZGlhbG9nRWwgKSApIHtcbiAgICBsYXN0LmZvY3VzKClcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQnV0dG9uKCBzZWxlY3RvciApIHtcbiAgdmFyIGJ1dHRvbiA9IGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yIClcblxuICBidXR0b24uZm9jdXMoKVxuICBidXR0b24uY2xhc3NMaXN0LmFkZCggJ2FjdGl2ZScgKVxufVxuXG5mdW5jdGlvbiBjYW5jZWxBY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChldmVudCl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuXG4gIHRyaWdnZXJCdXR0b24oICcuZGlhbG9nLWNhbmNlbCcgKVxuXG4gIGNsb3NlKCBvcHRpb25zLm9uRGlzbWlzcyApXG59XG5cbmZ1bmN0aW9uIGNvbnRpbnVlQWN0aW9uICggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQgKXsgZXZlbnQucHJldmVudERlZmF1bHQoKSB9XG5cbiAgdHJpZ2dlckJ1dHRvbiggJy5kaWFsb2ctY29udGludWUnIClcblxuICBjbG9zZSggZnVuY3Rpb24oKSB7XG4gICAgaWYgKCBvcHRpb25zLnN1Ym1pdCApIHtcblxuICAgICAgLy8gSXMgaXQgYW4gZWxlbWVudCBvciBhIHN0cmluZ1xuICAgICAgdmFyIGZvcm0gPSAoIG9wdGlvbnMuc3VibWl0Lm5vZGVUeXBlID8gb3B0aW9ucy5zdWJtaXQgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMuc3VibWl0KSApXG5cbiAgICAgIEV2ZW50LnN1Ym1pdCggZm9ybSApXG5cbiAgICB9IGVsc2UgaWYgKCBvcHRpb25zLmZvbGxvdyApIHtcbiAgICAgIGlmKCBvcHRpb25zLmZvbGxvdy5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vKSApXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG9wdGlvbnMuZm9sbG93XG4gICAgICBlbHNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gb3B0aW9ucy5mb2xsb3dcbiAgICB9XG5cbiAgICBpZiAoIG9wdGlvbnMub25Db25maXJtICkgb3B0aW9ucy5vbkNvbmZpcm0oKVxuICB9KVxufVxuXG5mdW5jdGlvbiBjbG9zZSggY2FsbGJhY2sgKXtcbiAgZGlhbG9nRWwuY2xhc3NMaXN0LmFkZCggJ2Rpc21pc3MnIClcblxuICBFdmVudC5hZnRlckFuaW1hdGlvbiggZGlhbG9nRWwsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBpZiAoIGNhbGxiYWNrICkgeyBjYWxsYmFjaygpIH1cbiAgICByZW1vdmUoKVxuICB9LCB0cnVlKVxufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZSgpe1xuXG4gIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gIEV2ZW50LmtleS5kZWxldGVTY29wZSggJ2RpYWxvZycgKVxuICBFdmVudC5vZmYoIGRpYWxvZ0VsLCAnY2xpY2snIClcblxuICAvLyBSZW1vdmUgdGhlIGVsZW1lbnRcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCggZGlhbG9nRWwgKVxuXG4gIC8vIEZpcmUgb24gY2xvc2UgY2FsbGJhY2tcbiAgZGVmYXVsdHMub25DbG9zZSgpXG5cbiAgLy8gUmV0dXJuIGZvY3VzIHRvIHRoZSBmb2N1c2VkIGVsZW1lbnQgYmVmb3JlIHRoZSBkaWFsb2cgd2FzIHNob3duXG4gIGZvY3VzZWRFbC5mb2N1cygpXG59XG5cbmZ1bmN0aW9uIHRlbXBsYXRlKCBodG1sICkge1xuICB3cmFwLmlubmVySFRNTCA9IGh0bWxcbiAgdmFyIGVsID0gd3JhcC5maXJzdENoaWxkXG4gIHdyYXAucmVtb3ZlQ2hpbGQoIGVsIClcbiAgcmV0dXJuIGVsXG59XG5cbi8vIEdldCBhbGwgb3B0aW9ucyBmcm9tIGRhdGEtZGlhbG9nLSpcbmZ1bmN0aW9uIGV4dHJhY3RPcHRpb25zKCBlbCApIHtcbiAgdmFyIG9wdHMgPSB7XG4gICAgaWY6ICAgICAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ0lmLFxuICAgIGZvbGxvdzogICAgICAgZWwuZGF0YXNldC5kaWFsb2dGb2xsb3csXG4gICAgdGl0bGU6ICAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ1RpdGxlLFxuICAgIGRlc2NyaXB0aW9uOiAgZWwuZGF0YXNldC5kaWFsb2dEZXNjcmlwdGlvbixcbiAgICBzdWJtaXQ6ICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nU3VibWl0LFxuICAgIGNvbnRpbnVlOiAgICAgZWwuZGF0YXNldC5kaWFsb2dDb250aW51ZSxcbiAgICBjYW5jZWw6ICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nQ2FuY2VsLFxuICAgIGNvbmZpcm06ICAgICAgZWwuZGF0YXNldC5kaWFsb2dDb25maXJtLFxuICAgIGRlc3RydWN0aXZlOiAgZWwuZGF0YXNldC5kaWFsb2dEZXN0cnVjdGl2ZVxuICB9XG5cbiAgaWYgKCBvcHRzLmNvbmZpcm0gKSB7XG4gICAgb3B0cy5jb250aW51ZSA9IG9wdHMuY29udGludWUgfHwgZWwuaW5uZXJIVE1MXG4gICAgb3B0cy5zdWJtaXQgICA9IG9wdHMuc3VibWl0ICAgfHwgdG9vbGJveC5nZXRDbG9zZXN0KCBlbCwgJ2Zvcm0nIClcbiAgfVxuXG4gIHJldHVybiBvcHRzXG59XG5cbkV2ZW50LnJlYWR5KGZ1bmN0aW9uKCkge1xuXG4gIC8vIFRyaWdnZXIgaXMgY2FsbGVkIHdoZW4gYSBET00gZWxlbWVudCB3aXRoIGRhdGEtdHJpZ2dlcj1kaWFsb2cgaXMgY2xpY2tlZFxuICAvLyBUaGUgZGF0YSBhdHRyaWJ1dGVzIGFyZSB1c2VkIGFzIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgZGlhbG9nXG4gIC8vXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1tkYXRhLWRpYWxvZy10aXRsZV0nLCBmdW5jdGlvbihldmVudCl7XG4gICAgdmFyIG9wdHMgPSBleHRyYWN0T3B0aW9ucyggZXZlbnQuY3VycmVudFRhcmdldCApXG4gICAgaWYgKCAhb3B0cy5pZiB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdHMuaWYpICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgIHNob3coIG9wdHMgKVxuICAgIH1cbiAgfSlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaG93OiBzaG93LFxuICBjYW5jZWw6IGNhbmNlbEFjdGlvbixcbiAgY29udGludWU6IGNvbnRpbnVlQWN0aW9uLFxuICBkZWZhdWx0czogZGVmYXVsdHNcbn1cbiIsIi8vIFNoaW1zXG5yZXF1aXJlKCAnLi9saWIvc2hpbXMvX2NsYXNzbGlzdCcgKVxudmFyIG1lcmdlICAgID0gcmVxdWlyZSggJy4vbGliL3NoaW1zL19vYmplY3QuYXNzaWduJyApLFxuICAgIGV2ZW50ICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtZXZlbnQnICksXG4gICAgbHV4b24gICAgPSByZXF1aXJlKCAnbHV4b24nICksXG4gICAgdGltZSAgICAgPSBtZXJnZShyZXF1aXJlKCAnLi9saWIvdGltZScgKSwgbHV4b24pLFxuICAgIHNjcm9sbFRvID0gcmVxdWlyZSggJy4vbGliL3Njcm9sbHRvJyApLFxuICAgIGZyb21Ub3AgID0gcmVxdWlyZSggJy4vbGliL2Zyb210b3AnICksXG4gICAgZWFzZSAgICAgPSByZXF1aXJlKCAnLi9saWIvZWFzZScgKVxuXG52YXIgdG9vbGJveCA9IHtcblxuICBldmVudDogZXZlbnQsXG4gIHNjcm9sbFRvOiBzY3JvbGxUbyxcbiAgZnJvbVRvcDogZnJvbVRvcCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBlYXNlOiBlYXNlLFxuICB0aW1lOiB0aW1lLFxuXG4gIC8vIEdldCBjbG9zZXN0IERPTSBlbGVtZW50IHVwIHRoZSB0cmVlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yXG4gIGdldENsb3Nlc3Q6IGZ1bmN0aW9uICggZWwsIHNlbGVjdG9yICkge1xuICAgIGZvciAoIDsgZWwgJiYgZWwgIT09IGRvY3VtZW50OyBlbCA9IGVsLnBhcmVudE5vZGUgKSB7XG4gICAgICBpZiAoIHRvb2xib3gubWF0Y2hlcyggZWwsIHNlbGVjdG9yICkgKSByZXR1cm4gZWxcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgY2hpbGRPZjogZnVuY3Rpb24gKCBlbCwgcGFyZW50ICkge1xuICAgIGZvciAoIDsgZWwgJiYgZWwgIT09IGRvY3VtZW50OyBlbCA9IGVsLnBhcmVudE5vZGUgKSB7XG4gICAgICBpZiAoIGVsID09IHBhcmVudCApIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSxcblxuICAvLyBHZXQgbmV4dCBET00gZWxlbWVudCB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXROZXh0OiBmdW5jdGlvbiggZWwsIHNlbGVjdG9yICkge1xuICAgIGZvciAoIDsgZWwgJiYgZWwgIT09IGRvY3VtZW50OyBlbCA9IGVsLnBhcmVudE5vZGUgKSB7XG4gICAgICBpZiAoIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICkgKSByZXR1cm4gZWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8vIE1hdGNoZXMgc2VsZWN0b3IgZnVuY3Rpb25cbiAgLy8gQHJlZmVyZW5jZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9tYXRjaGVzXG4gIG1hdGNoZXM6IGZ1bmN0aW9uICggZWwsIHNlbGVjdG9yICkge1xuICAgIHJldHVybiAoIGVsLm1hdGNoZXMgfHwgZWwubWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWwub01hdGNoZXNTZWxlY3RvciApLmNhbGwoIGVsLCBzZWxlY3RvciApO1xuICB9LFxuXG4gIHdvcmRDb3VudDogZnVuY3Rpb24oIHN0ciApIHtcbiAgICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaCggL1xcUysvZyApO1xuICAgIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlcy5sZW5ndGggOiAwO1xuICB9LFxuXG4gIC8vIEVhc3kgYWNjZXNzIHRvIHNsaWNlIGZvciBjb252ZXJ0aW5nIG9iamVjdHMgaW50byBhcnJheXMgb2YgdmFsdWVzLlxuICBzbGljZTogZnVuY3Rpb24oIG9iaiwgY291bnQgKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBvYmosIGNvdW50IClcbiAgfSxcblxuICBlYWNoOiBmdW5jdGlvbiggY29sbGVjdGlvbiwgY2FsbGJhY2sgKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGNvbGxlY3Rpb24sIGNhbGxiYWNrIClcbiAgfSxcblxuICBmb3JtRGF0YTogZnVuY3Rpb24oIHJvb3RFbCApIHtcbiAgICB2YXIgZm9ybURhdGEgID0gbmV3IEZvcm1EYXRhKCksXG4gICAgICAgIGZpZWxkcyA9IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCAnaW5wdXRbbmFtZV0nIClcblxuICAgIC8vIExvb3Agb3ZlciBmaWVsZHNcbiAgICB0b29sYm94LmVhY2goIGZpZWxkcywgZnVuY3Rpb24oIGZpZWxkICkge1xuICAgICAgLy8gQXBwZW5kIGN1cnJlbnQgZmllbGTigJlzIG5hbWUvdmFsdWUgdG8gbmV3IGZvcm1EYXRhIG9iamVjdFxuICAgICAgZm9ybURhdGEuYXBwZW5kKCBmaWVsZC5uYW1lLCBmaWVsZC52YWx1ZSApO1xuICAgIH0pXG5cbiAgICAvLyBUaGVuIHJldHVybiBzYWlkIGZvcm1EYXRhIG9iamVjdFxuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0b29sYm94XG4iLCIvLyBlYXNpbmcgZnVuY3Rpb25zIGh0dHA6Ly9naXptYS5jb20vZWFzaW5nL1xudmFyIGVhc2UgPSB7XG5cbiAgaW5PdXRRdWFkOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yXG4gICAgaWYgKHQgPCAxKSB7IHJldHVybiBjLzIqdCp0ICsgYiB9XG4gICAgdC0tXG4gICAgcmV0dXJuIC1jLzIgKiAodCoodC0yKSAtIDEpICsgYlxuICB9LFxuXG4gIGluT3V0Q3ViaWM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG5cdHQgLz0gZC8yO1xuXHRpZiAodCA8IDEpIHJldHVybiBjLzIqdCp0KnQgKyBiO1xuXHR0IC09IDI7XG5cdHJldHVybiBjLzIqKHQqdCp0ICsgMikgKyBiO1xuICB9LFxuXG4gIGluT3V0UXVpbnQ6IGZ1bmN0aW9uKHQsIGIsIGMsIGQpIHtcbiAgICB2YXIgdHMgPSAodC89ZCkqdCxcbiAgICB0YyA9IHRzKnQ7XG4gICAgcmV0dXJuIGIrYyooNip0Yyp0cyArIC0xNSp0cyp0cyArIDEwKnRjKTtcbiAgfSxcblxuICBpbk91dENpcmM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG4gICAgdCAvPSBkLzI7XG4gICAgaWYgKHQgPCAxKSByZXR1cm4gLWMvMiAqIChNYXRoLnNxcnQoMSAtIHQqdCkgLSAxKSArIGI7XG4gICAgdCAtPSAyO1xuICAgIHJldHVybiBjLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpICsgMSkgKyBiO1xuICB9XG5cbn1cblxuZWFzZS5kZWZhdWx0ID0gZWFzZS5pbk91dFF1YWRcblxubW9kdWxlLmV4cG9ydHMgPSBlYXNlXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCBlbCApIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCApO1xufVxuIiwidmFyIGVhc2UgICAgPSByZXF1aXJlKCAnLi9lYXNlJyApXG52YXIgZnJvbVRvcCA9IHJlcXVpcmUoICcuL2Zyb210b3AnIClcblxuZnVuY3Rpb24gbW92ZShhbW91bnQpIHtcblxuICAvLyBTY3JvbGwgYWxsIGJlY2F1c2UgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCBpcyBzdGlsbCBleHBpcmVtZW50YWxcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBhbW91bnQ7XG5cbn1cblxuZnVuY3Rpb24gcG9zaXRpb24oKSB7XG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHRvLCBjYWxsYmFjaywgZHVyYXRpb24pIHtcblxuICAvLyBNYWtpbmcgYXJncyBmbGV4aWJsZVxuICAvL1xuICAvLyBBbGxvdyBmb3IgZWxlbWVudCBvciB5LWNvb3JkaW5hdGVzXG4gIGlmKCB0eXBlb2YoIHRvICkgPT09ICdvYmplY3QnICkgeyB0byA9IGZyb21Ub3AoIHRvICkgfVxuXG4gIC8vIEFjY2VwdCBkdXJhdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gIGlmKCB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdudW1iZXInICkgeyBkdXJhdGlvbiA9IGNhbGxiYWNrOyBjYWxsYmFjayA9IG51bGwgfVxuXG4gIC8vIERlZmF1bHQgZHVyYXRpb24gPSA1MDBcbiAgZHVyYXRpb24gPSAoIHR5cGVvZiggZHVyYXRpb24gKSA9PT0gJ3VuZGVmaW5lZCcgKSA/IDUwMCA6IGR1cmF0aW9uXG5cbiAgdmFyIHN0YXJ0ID0gcG9zaXRpb24oKSxcbiAgICBjaGFuZ2UgPSB0byAtIHN0YXJ0LFxuICAgIGN1cnJlbnRUaW1lID0gMCxcbiAgICBpbmNyZW1lbnQgPSAyMDtcblxuXG4gIHZhciBhbmltYXRlU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBpbmNyZW1lbnQgdGhlIHRpbWVcbiAgICBjdXJyZW50VGltZSArPSBpbmNyZW1lbnRcblxuICAgIC8vIGZpbmQgdGhlIHZhbHVlIHdpdGggdGhlIHF1YWRyYXRpYyBpbi1vdXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgdmFyIHZhbCA9IGVhc2UuZGVmYXVsdChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXG5cbiAgICAvLyBtb3ZlIHRoZSBkb2N1bWVudC5ib2R5XG4gICAgbW92ZSh2YWwpO1xuXG4gICAgLy8gZG8gdGhlIGFuaW1hdGlvbiB1bmxlc3MgaXRzIG92ZXJcbiAgICBpZiAoIGN1cnJlbnRUaW1lIDwgZHVyYXRpb24gKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGVTY3JvbGwgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIGNhbGxiYWNrICYmIHR5cGVvZiggY2FsbGJhY2sgKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYW5pbWF0ZVNjcm9sbCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG9cbiIsIi8qKlxuICogQ2xhc3NMaXN0IHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgZWxlbWVudC5jbGFzc0xpc3QgaW1wbGVtZW50YXRpb25cbiAqIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL2NsYXNzTGlzdC5qcy9ibG9iL21hc3Rlci9jbGFzc0xpc3QuanNcbiAqIEBhdXRob3IgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb21cbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoICdkb2N1bWVudCcgaW4gc2VsZiApIHtcblxuICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG4gIGlmICggISggJ2NsYXNzTGlzdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ18nICkgKSApIHtcblxuICAgICggZnVuY3Rpb24oIHZpZXcgKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBpZiAoICEoICdFbGVtZW50JyBpbiB2aWV3ICkgKSByZXR1cm47XG5cbiAgICB2YXJcbiAgICAgIGNsYXNzTGlzdFByb3AgPSAnY2xhc3NMaXN0JyxcbiAgICAgIHByb3RvUHJvcCAgICAgPSAncHJvdG90eXBlJyxcbiAgICAgIGVsZW1DdHJQcm90byAgPSB2aWV3LkVsZW1lbnRbIHByb3RvUHJvcCBdLFxuICAgICAgb2JqQ3RyICAgICAgICA9IE9iamVjdCxcblxuICAgICAgc3RyVHJpbSA9IFN0cmluZ1sgcHJvdG9Qcm9wIF0udHJpbSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSggL15cXHMrfFxccyskL2csICcnICk7XG4gICAgICB9LFxuXG4gICAgICBhcnJJbmRleE9mID0gQXJyYXlbIHByb3RvUHJvcCBdLmluZGV4T2YgfHwgZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgaWYgKCBpIGluIHRoaXMgJiYgdGhpc1sgaSBdID09PSBpdGVtICkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG5cbiAgICAgIERPTUV4ID0gZnVuY3Rpb24oIHR5cGUsIG1lc3NhZ2UgKSB7XG4gICAgICAgIHRoaXMubmFtZSAgICA9IHR5cGU7XG4gICAgICAgIHRoaXMuY29kZSAgICA9IERPTUV4Y2VwdGlvblsgdHlwZSBdO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSxcblxuICAgICAgY2hlY2tUb2tlbkFuZEdldEluZGV4ID0gZnVuY3Rpb24oIGNsYXNzTGlzdCwgdG9rZW4gKSB7XG4gICAgICAgIGlmICggdG9rZW4gPT09ICcnICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdTWU5UQVhfRVJSJyxcbiAgICAgICAgICAgICdBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIC9cXHMvLnRlc3QoIHRva2VuICkgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFxuICAgICAgICAgICAgJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsXG4gICAgICAgICAgICAnU3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbCggY2xhc3NMaXN0LCB0b2tlbiApO1xuICAgICAgfSxcblxuICAgICAgQ2xhc3NMaXN0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbCggZWxlbS5nZXRBdHRyaWJ1dGUoICdjbGFzcycgKSB8fCAnJyApLFxuICAgICAgICAgICAgY2xhc3NlcyA9IHRyaW1tZWRDbGFzc2VzID8gdHJpbW1lZENsYXNzZXMuc3BsaXQoIC9cXHMrLyApIDogW107XG5cbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICB0aGlzLnB1c2goIGNsYXNzZXNbIGkgXSApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIHRoaXMudG9TdHJpbmcoKSApO1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbIHByb3RvUHJvcCBdID0gW10sXG5cbiAgICAgIGNsYXNzTGlzdEdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdCggdGhpcyApO1xuICAgICAgfTtcblxuICAgIERPTUV4WyBwcm90b1Byb3AgXSA9IEVycm9yWyBwcm90b1Byb3AgXTtcblxuICAgIGNsYXNzTGlzdFByb3RvLml0ZW0gPSBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiB0aGlzWyBpIF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiggdG9rZW4gKSB7XG4gICAgICB0b2tlbiArPSAnJztcbiAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgIT09IC0xO1xuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW47XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpZiAoIGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKSA9PT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCB0b2tlbiApO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICggKytpdGVyIDwgbGVuICk7XG5cbiAgICAgIGlmICggdXBkYXRlZCApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyXG4gICAgICAgIHRva2VucyAgPSBhcmd1bWVudHMsXG4gICAgICAgIGl0ZXIgICAgPSAwLFxuICAgICAgICBsZW4gICAgID0gdG9rZW5zLmxlbmd0aCxcbiAgICAgICAgdXBkYXRlZCA9IGZhbHNlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgaW5kZXg7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcblxuICAgICAgICB3aGlsZSAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgICB0aGlzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG5cbiAgICAgIHZhclxuICAgICAgICByZXN1bHQgPSB0aGlzLmNvbnRhaW5zKCB0b2tlbiApLFxuICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiAncmVtb3ZlJyA6IGZvcmNlICE9PSBmYWxzZSAmJiAnYWRkJztcblxuICAgICAgaWYgKCBtZXRob2QgKSB7XG4gICAgICAgIHRoaXNbIG1ldGhvZCBdKCB0b2tlbiApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIGZvcmNlID09PSB0cnVlIHx8IGZvcmNlID09PSBmYWxzZSApIHtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5qb2luKCAnICcgKTtcbiAgICB9O1xuXG4gICAgaWYgKCBvYmpDdHIuZGVmaW5lUHJvcGVydHkgKSB7XG4gICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG4gICAgICAgICAgZ2V0ICAgICAgICAgIDogY2xhc3NMaXN0R2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGUgICA6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICB9XG5cbiAgICAgIGNhdGNoICggZXggKSB7XG4gICAgICAgIGlmICggZXgubnVtYmVyID09PSAtMHg3RkY1RUM1NCApIHtcbiAgICAgICAgICBjbGFzc0xpc3RQcm9wRGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoIG9iakN0clsgcHJvdG9Qcm9wIF0uX19kZWZpbmVHZXR0ZXJfXyApIHtcbiAgICAgIGVsZW1DdHJQcm90by5fX2RlZmluZUdldHRlcl9fKCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIgKTtcbiAgICB9XG5cbiAgICB9KCBzZWxmICkpO1xuXG4gIH0gZWxzZSB7XG5cbiAgICAoIGZ1bmN0aW9uKCkge1xuXG4gICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApO1xuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYzEnLCAnYzInICk7XG5cbiAgICAgIGlmICggIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MyJyApICkge1xuICAgICAgICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXTtcblxuICAgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgICAgICAgdmFyIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG4gICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzWyBpIF07XG4gICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAnYWRkJyApO1xuICAgICAgICBjcmVhdGVNZXRob2QoICdyZW1vdmUnICk7XG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoICdjMycsIGZhbHNlICk7XG5cbiAgICAgIGlmICggdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnYzMnICkgKSB7XG4gICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgICAgIGlmICggMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnMoIHRva2VuICkgPT09ICFmb3JjZSApIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIH1cblxuICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgfSgpKTtcblxuICB9XG59XG4iLCIvKipcbiAqIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbiAqIENyb3NzLWJyb3dzZXIgZnVsbCBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24jUG9seWZpbGxcbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoIHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicgKSB7XG4gICggZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG4gICAgICBmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KysgKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG4gICAgICAgIGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuICAgICAgICAgIGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcbiAgICAgICAgICAgIGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcbiAgICAgICAgICAgICAgb3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSkoKTtcbn1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIG1lcmdlIG9iamVjdHMgd2l0aG91dCBvdmVyd3JpdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0c1xudmFyIG1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gW3t9XS5jb25jYXQoIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG4gIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KCB0aGlzLCBhcmdzIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuIiwidmFyIERhdGVUaW1lID0gcmVxdWlyZSggJ2x1eG9uJyApLkRhdGVUaW1lXG5cbmZ1bmN0aW9uIGlzQmVmb3JlKCBkYXRlLCBlbmQgKSB7XG4gIGVuZCA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5taW4oIGVuZCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXIoIGRhdGUsIHN0YXJ0ICkge1xuICBzdGFydCA9IHBhcnNlKCBzdGFydCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4oIGRhdGUsIGRhdGUxLCBkYXRlMiApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgZGF0ZTEgPSBwYXJzZSggZGF0ZTEgKVxuICBkYXRlMiA9IHBhcnNlKCBkYXRlMiApXG5cbiAgaWYgKCBkYXRlLmlzVmFsaWQgJiYgZGF0ZTEuaXNWYWxpZCAmJiBkYXRlMi5pc1ZhbGlkICkge1xuICAgIC8vIERldGVybWluZSBzdGFydCBhbmQgZW5kIGRhdGVzICh0byBhbGxvdyBhbnkgb3JkZXIgaW4gYXJncylcbiAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5taW4oIGRhdGUxLCBkYXRlMiApXG4gICAgdmFyIGVuZCA9IERhdGVUaW1lLm1heCggZGF0ZTEsIGRhdGUyIClcblxuICAgIHJldHVybiBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlICkgPT0gRGF0ZVRpbWUubWluKCBkYXRlLCBlbmQgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlKCBkYXRlLCBvcHRpb25zICkge1xuICB2YXIgZm9ybWF0cyA9IFsgXCJJU09cIiwgXCJTUUxcIiwgXCJIVFRQXCIsIFwiUkZDMjgyMlwiIF0sXG4gICAgICBwYXJzZWREYXRlXG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoIG9wdGlvbnMubWlsbGlzICYmICFpc05hTiggZGF0ZSApICkge1xuICAgIGRhdGUgPSBOdW1iZXIoIGRhdGUgKVxuICAgIGZvcm1hdHMudW5zaGlmdCgnTWlsbGlzJylcbiAgfVxuXG4gIGlmICggdHlwZW9mIGRhdGUgPT0gJ29iamVjdCcgKSB7XG4gICAgXG4gICAgLy8gSXMgYWxyZWFkeSBhIERhdGVUaW1lIG9iamVjdFxuICAgIGlmICggZGF0ZS50b0lTTyApIHJldHVybiBkYXRlXG4gICAgZWxzZSBmb3JtYXRzLnVuc2hpZnQoICdPYmplY3QnIClcblxuICAvLyBQYXJzZSBzdHJpbmcgZm9ybWF0c1xuICB9XG5cbiAgZm9ybWF0cy5mb3JFYWNoKCBmdW5jdGlvbiggZm9ybWF0ICkge1xuICAgIGlmICgoICFwYXJzZWREYXRlIHx8ICFwYXJzZWREYXRlLmlzVmFsaWQgKSAmJiBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSApIHtcbiAgICAgIHBhcnNlZERhdGUgPSBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSggZGF0ZSwgb3B0aW9ucyApXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBwYXJzZWREYXRlLmlzVmFsaWQgPyBwYXJzZWREYXRlIDogZmFsc2Vcbn1cblxuLy8gUmVtb3ZlIGluc2lnbmlmaWNhbnQgZGlnaXRzXG5mdW5jdGlvbiBwcmV0dHlQcmludCggZGF0ZSwgb3B0aW9ucyApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlLCBvcHRpb25zIClcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnpvbmUpIGRhdGUgPSBkYXRlLnNldFpvbmUob3B0aW9ucy56b25lKVxuXG4gIGlmICggZGF0ZSApIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTTygpLnJlcGxhY2UoJ1QnLCAnICcpLnJlcGxhY2UoJy4wMDAnLCcgJykucmVwbGFjZSgnOjAwICcsJyAnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlVucGFyc2VhYmxlIGRhdGUgc3RyaW5nXCIgXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQmVmb3JlOiBpc0JlZm9yZSxcbiAgaXNBZnRlcjogaXNBZnRlcixcbiAgaXNCZXR3ZWVuOiBpc0JldHdlZW4sXG4gIHBhcnNlOiBwYXJzZSxcbiAgcHJldHR5UHJpbnQ6IHByZXR0eVByaW50XG59XG4iLCJyZXF1aXJlKCAnLi9saWIvc2hpbXMvY3VzdG9tLWV2ZW50JyApXG5cbnZhciBiZWFuID0gcmVxdWlyZSggJ2JlYW4nIClcbnZhciBrZXkgID0gcmVxdWlyZSggJ2tleW1hc3RlcicgKSBcbnZhciBhbmltYXRpb25FdmVudCAgICA9IHJlcXVpcmUoICcuL2xpYi9hbmltYXRpb24tZXZlbnRzJyApXG52YXIgcGFnZSAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcGFnZScgKVxudmFyIHRhcCAgICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3RhcC1ldmVudHMnIClcbnZhciBkZWJvdW5jZSAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9kZWJvdW5jZScgKVxudmFyIHRocm90dGxlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Rocm90dGxlJyApXG52YXIgZGVsYXkgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvZGVsYXknIClcbnZhciByZXBlYXQgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXBlYXQnIClcbnZhciBidWJibGVGb3JtRXZlbnRzICA9IHJlcXVpcmUoICcuL2xpYi9idWJibGUtZm9ybS1ldmVudHMnIClcbnZhciBzdWJtaXQgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9zdWJtaXQnIClcbnZhciBzY3JvbGwgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGwnIClcbnZhciByZXNpemUgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXNpemUnIClcbnZhciBjYWxsYmFja01hbmFnZXIgICA9IHJlcXVpcmUoICcuL2xpYi9jYWxsYmFjay1tYW5hZ2VyJyApXG52YXIgbWVkaWEgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvbWVkaWEnIClcblxudmFyIHNsaWNlICAgICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG52YXIgZm9ybUJ1YmJsaW5nICAgICAgPSBmYWxzZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvLyBET00gZXZlbnRzXG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIG9uZTogb25lLFxuICBmaXJlOiBmaXJlLFxuICBjbG9uZTogYmVhbi5jbG9uZSxcbiAgcmVhZHk6IHBhZ2UucmVhZHksXG4gIGNoYW5nZTogcGFnZS5jaGFuZ2UsXG4gIGFmdGVyQW5pbWF0aW9uOiBhZnRlckFuaW1hdGlvbixcblxuICAvLyBNZWRpYSBxdWVyeSBldmVudHNcbiAgbWVkaWE6IG1lZGlhLFxuXG4gIC8vIEtleWJvYXJkIGV2ZW50c1xuICBrZXk6IGtleSxcbiAga2V5T246IGtleSxcbiAga2V5T2ZmOiBrZXkudW5iaW5kLFxuICBrZXlPbmU6IGtleU9uZSxcblxuICAvLyBUaW1pbmcgdXRpbGl0aWVzXG4gIGRlYm91bmNlOiBkZWJvdW5jZSxcbiAgdGhyb3R0bGU6IHRocm90dGxlLFxuICBkZWxheTogICAgZGVsYXksXG4gIHJlcGVhdDogICByZXBlYXQsXG5cbiAgLy8gT3B0aW1pemVkIEV2ZW50IE1hbmFnZXJzXG4gIHNjcm9sbDogICAgICBzY3JvbGwsXG4gIHJlc2l6ZTogICAgICByZXNpemUsXG5cbiAgY2FsbGJhY2tNYW5hZ2VyOiBjYWxsYmFja01hbmFnZXIsXG4gIGNhbGxiYWNrOiBjYWxsYmFja01hbmFnZXIuY2FsbGJhY2ssXG5cbiAgLy8gQnViYmxpbmcgZml4XG4gIGJ1YmJsZUZvcm1FdmVudHM6IGJ1YmJsZUZvcm1FdmVudHMsXG5cbiAgc3VibWl0OiBzdWJtaXRcbn1cblxuLy8gQmVhbiBkb2Vzbid0IGFjY291bnQgZm9yIGNyb3NzLWJyb3dzZXIgc3VwcG9ydCBvbiBhbmltYXRpb24gZXZlbnRzXG4vLyBTbyByYXRoZXIgdGhhbiBwYXNzIHRocm91Z2ggZXZlbnRzIHRvIGJlYW4sIHdlIHByb2Nlc3MgdGhlbSB0byBhZGRcbi8vIHZlbmRvciBwcmVmaXhlcyBvciByZW1vdmUgZXZlbnRzIGlmIGJyb3dzZXJzIGRvIG5vdCBzdXBwb3IgdGhlbVxuLy9cbmZ1bmN0aW9uIG9uICgpIHtcbiAgc2V0RXZlbnQoICdvbicsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gb2ZmICgpIHtcbiAgc2V0RXZlbnQoICdvZmYnLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9uZSAoKSB7XG4gIHNldEV2ZW50KCAnb25lJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBmaXJlICgpIHtcblxuICBhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgdmFyIGVsID0gYXJnc1swXVxuICB2YXIgZXZlbnRzID0gW11cblxuICBhcmdzWzFdLnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuXG4gICAgdmFyIGV2ZW50ID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBldmVudCApXG4gICAgaWYgKCAhaXNFbXB0eSggZXZlbnQgKSApIGV2ZW50cy5wdXNoKCBldmVudCApXG5cbiAgfSlcblxuICBpZiAoICFpc0VtcHR5KCBldmVudHMgKSApIHtcblxuICAgIGFyZ3NbMV0gPSBldmVudHMuam9pbiggJyAnIClcbiAgICBiZWFuLmZpcmUuYXBwbHkoIHRoaXMsIGFyZ3MgKVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnQoIHJlZ2lzdGVyVHlwZSwgYXJncyApIHtcblxuICB0cmFuc2Zvcm1BcmdzKCBhcmdzICkuZm9yRWFjaCggZnVuY3Rpb24oIGFyZyApIHtcbiAgICBiZWFuWyByZWdpc3RlclR5cGUgXS5hcHBseSggbnVsbCwgYXJnIClcbiAgfSlcblxufVxuXG4vLyBBZGQgc3VwcG9ydCBmb3IgdW5iaW5kaW5nIGEga2V5IGV2ZW50IGFmdGVyIGl0IGlzIGNhbGxlZFxuLy9cbmZ1bmN0aW9uIGtleU9uZSAoIGtleXMsIHNjb3BlLCBmbiApIHtcblxuICBpZiAoIHR5cGVvZiBzY29wZSA9PSAnZnVuY3Rpb24nICkge1xuICAgIGZuID0gc2NvcGVcbiAgICBzY29wZSA9ICdhbGwnXG4gIH1cblxuICBrZXkoIGtleXMsIHNjb3BlLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAga2V5LnVuYmluZCgga2V5cywgc2NvcGUgKVxuICAgIGZuKCBldmVudCApXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGFmdGVyQW5pbWF0aW9uKCBlbCwgY2FsbGJhY2ssIGNoZWNrU3RhcnQgKSB7XG4gIHZhciBoYXNBbmltYXRpb24gPSAhIXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbCApLmdldFByb3BlcnR5VmFsdWUoICdhbmltYXRpb24tZHVyYXRpb24nIClcblxuICBpZiAoIGhhc0FuaW1hdGlvbiApIHtcbiAgICBcbiAgICAvLyBJZiBlbGVtZW50IGlzIG5vdCBhbmltYXRpbmcgYWZ0ZXIgZGVsYXksIGZpcmUgY2FsbGJhY2tcbiAgICBpZiAoIGNoZWNrU3RhcnQgKSB7XG5cbiAgICAgIHZhciB0aW1lID0gKCh0eXBlb2YgY2hlY2tTdGFydCA9PSBcIm51bWJlclwiKSA/IGNoZWNrU3RhcnQgOiAyMCksXG4gICAgICAgICAgZGVsYXllZEV2ZW50ID0gZGVsYXkoIGNhbGxiYWNrLCB0aW1lIClcblxuICAgICAgLy8gRGVsYXkgd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZmlyZSBjYWxsYmFjayBvbmx5IGFmdGVyIFxuICAgICAgLy8gYXQgbGVhc3Qgb25lIGFuaW1hdGlvbiBmcmFtZSBoYXMgcGFzc2VkXG5cbiAgICAgIG9uZSggZWwsICdhbmltYXRpb25zdGFydCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIC8vIGNhbmNlbCBkZWxheWVkIGZpcmVcbiAgICAgICAgZGVsYXllZEV2ZW50LnN0b3AoKVxuXG4gICAgICAgIC8vIHdhdGNoIGZvciBhbmltYXRpb24gdG8gZmluaXNoXG4gICAgICAgIG9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG4gICAgICB9KVxuXG5cbiAgICB9IGVsc2Uge1xuICAgICAgb25lKCBlbCwgJ2FuaW1hdGlvbmVuZCcsIGNhbGxiYWNrIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbi8vIFRyYW5zZm9ybSBldmVudCBhcmd1bWVudHMgdG8gaGFuZGxlIHRhcCBldmVudCBhbmQgY3Jvc3MtYnJvd3NlciBhbmltYXRpb24gZXZlbnRzXG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGV2ZW50cyB0byBiZSByZWdpc3RlcmVkIGluZGl2aWR1YWxseVxuLy9cbmZ1bmN0aW9uIHRyYW5zZm9ybUFyZ3MoIGFyZ3MgKSB7XG5cbiAgdmFyIHRyYW5zZm9ybWVkQXJncyA9IFtdXG4gIHZhciBuZXdFdmVudHMgPSB7fVxuICB2YXIgZWxlbWVudCA9IGFyZ3Muc2hpZnQoKSAvLyByZXRyaWV2ZSBlbGVtZW50XG4gIHZhciBldmVudHMgPSBhcmdzLnNoaWZ0KClcblxuICAvLyBkZXRlY3QgZXZlbnQgZGVsZWdhdGUgc2VsZWN0b3JcbiAgaWYgKCB0eXBlb2YgYXJnc1swXSAhPSAnZnVuY3Rpb24nICkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IGFyZ3Muc2hpZnQoKVxuICB9XG5cbiAgLy8gY29udmVydCBldmVudCBzdHJpbmdzIHRvIG9iamVjdCBiYXNlZCBldmVudHMgZm9yIGNvZGUgc2ltcGxpZmljYXRpb25cbiAgLy8gZXhhbXBsZTogYXJndW1lbnRzICgnaG92ZXIgZm9jdXMnLCBmdW5jdGlvbikgd291bGQgYmVjb21lICh7ICdob3ZlciBmb2N1cyc6IGZ1bmN0aW9uIH0pXG4gIGlmICggdHlwZW9mIGV2ZW50cyA9PSAnc3RyaW5nJyApIHtcbiAgICB2YXIgb2JqRXZlbnRzID0ge31cbiAgICBvYmpFdmVudHNbZXZlbnRzXSA9IGFyZ3Muc2hpZnQoKVxuICAgIGV2ZW50cyA9IG9iakV2ZW50c1xuICB9XG5cbiAgLy8gV2FsayB0aHJvdWdoIGVhY2gga2V5IGluIHRoZSBldmVudHMgb2JqZWN0IGFuZCBhZGQgdmVuZG9yIHByZWZpeGVzIHRvICdhbmltYXRpb24nIGV2ZW50c1xuICAvLyBhbmQgd3JhcCBjYWxsYmFjayBpbiB0aGUgdGFwIGZ1bmN0aW9uIGZvciBhbGwgJ3RhcCcgZXZlbnRzLlxuICAvL1xuICBmb3IgKCBldmVudCBpbiBldmVudHMgKSB7XG5cbiAgICBpZiAoIGV2ZW50cy5oYXNPd25Qcm9wZXJ0eSggZXZlbnQgKSApIHtcbiAgICAgIHZhciBjYWxsYmFjayA9IGV2ZW50c1tldmVudF1cblxuICAgICAgLy8gRXZlbnRzIGNhbiBiZSByZWdpc3RlcmVkIGFzIHNwYWNlIHNlcGFyYXRlZCBncm91cHMgbGlrZSBcImhvdmVyIGZvY3VzXCJcbiAgICAgIC8vIFRoaXMgaGFuZGxlcyBlYWNoIGV2ZW50IGluZGVwZW5kYW50bHlcbiAgICAgIC8vXG4gICAgICBldmVudC5zcGxpdCgnICcpLmZvckVhY2goIGZ1bmN0aW9uKCBlICl7XG5cbiAgICAgICAgLy8gSWYgaXQgaXMgYW4gYW5pbWF0aW9uIGV2ZW50LCB2ZW5kb3IgcHJlZml4IGl0LCBvciBmaXJlIHRoZSBjYWxsYmFjayBhY2NvcmRpbmcgdG8gYnJvd3NlciBzdXBwb3J0XG4gICAgICAgIGUgPSBhbmltYXRpb25FdmVudC50cmFuc2Zvcm0oIGUgKVxuXG4gICAgICAgIGlmICggaXNFbXB0eSggZSApICkge1xuICAgICAgICAgIC8vIElmIGl0J3MgZW1wdHksIGl0IGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgYW5pbWF0aW9uIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHRyaWdnZXIgdGhlIGV2ZW50IGltbWVkaWF0ZWx5XG4gICAgICAgICAgY2FsbGJhY2soKVxuXG4gICAgICAgIH0gZWxzZSBpZiAoIGUubWF0Y2goIC90YXAvICkgKSB7XG5cbiAgICAgICAgICAvLyBJZiBpdCdzIGEgdGFwIGV2ZW50LCB3cmFwIHRoZSBjYWxsYmFjayBhbmQgc2V0IHRoZSBldmVudCB0byAndG91Y2hzdGFydCdcbiAgICAgICAgICAvLyBUYXAgaXNuJ3QgYSByZWFsIG5hdGl2ZSBldmVudCwgYnV0IHRoaXMgd3JhcHBlciBsZXRzIHVzIHNpbXVsYXRlIHdoYXQgYVxuICAgICAgICAgIC8vIG5hdGl2ZSB0YXAgZXZlbnQgd291bGQgYmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBuZXdFdmVudHMudG91Y2hzdGFydCA9IHRhcCggY2FsbGJhY2sgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0V2ZW50c1sgZSBdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmb3IgKCBldmVudCBpbiBuZXdFdmVudHMgKSB7XG4gICAgdmFyIGEgPSBbXVxuICAgIGEucHVzaCggZWxlbWVudCwgZXZlbnQgKVxuXG4gICAgaWYgKCBkZWxlZ2F0ZSApIGEucHVzaCggZGVsZWdhdGUgKVxuXG4gICAgYS5wdXNoKCBuZXdFdmVudHNbIGV2ZW50IF0gKVxuICAgIHRyYW5zZm9ybWVkQXJncy5wdXNoKCBhLmNvbmNhdCggYXJncyApIClcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZEFyZ3Ncbn1cblxuXG5mdW5jdGlvbiBpc0VtcHR5KCBvYmogKSB7XG5cbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG4gIGlmICggb2JqID09IG51bGwgfHwgb2JqLmxlbmd0aCA9PT0gMCApIHJldHVybiB0cnVlXG5cbiAgaWYgKCAwIDwgb2JqLmxlbmd0aCApIHJldHVybiBmYWxzZVxuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoIGhhc093blByb3BlcnR5LmNhbGwoIG9iaiwga2V5ICkgKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwidmFyIGNzc0FuaW1FdmVudFR5cGVzID0gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpXG52YXIgc3VwcG9ydGVkID0gY3NzQW5pbUV2ZW50VHlwZXMuYW5pbWF0aW9uc3RhcnQgIT09IHVuZGVmaW5lZFxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHNcbn1cblxuZnVuY3Rpb24gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgYW5pbWF0aW9uc3RhcnQ6IHByZWZpeCArICdBbmltYXRpb25TdGFydCcsXG4gICAgYW5pbWF0aW9uZW5kOiBwcmVmaXggKyAnQW5pbWF0aW9uRW5kJyxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IHByZWZpeCArICdBbmltYXRpb25JdGVyYXRpb24nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ2FuaW1hdGlvbmVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnYW5pbWF0aW9uaXRlcmF0aW9uJ1xuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gQW5pbWF0aW9uIGV2ZW50IHR5cGVzIHthbmltYXRpb25zdGFydCwgYW5pbWF0aW9uZW5kLCBhbmltYXRpb25pdGVyYXRpb259XG4gKi9cblxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpIHtcbiAgdmFyIHByZWZpeGVzID0gWyd3ZWJraXQnLCAnTW96JywgJ08nLCAnJ107XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxuICAvLyBicm93c2VyIGNvbXBsaWFudFxuICBpZiAodW5kZWZpbmVkICE9PSBzdHlsZS5hbmltYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMoKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcmVmaXhlcy5sZW5ndGgsIHByZWZpeDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcHJlZml4ID0gcHJlZml4ZXNbaV07XG5cbiAgICBpZiAodW5kZWZpbmVkICE9PSBzdHlsZVtwcmVmaXggKyAnQW5pbWF0aW9uTmFtZSddKSB7XG4gICAgICAvLyBXZWJraXRcbiAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2VFdmVudFR5cGVzKHByZWZpeC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGVsc2UgaWYgKDEgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIE9wZXJhXG4gICAgICBlbHNlIGlmICgyID09PSBpKSB7XG4gICAgICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKHByZWZpeC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cblxuLy8gQWRkcyBuZWNlc3NhcnkgYWRkIHZlbmRvciBwcmVmaXhlcyBvciBjYW1lbENhc2VkIGV2ZW50IG5hbWVzXG4vL1xuZnVuY3Rpb24gdHJhbnNmb3JtQW5pbWF0aW9uRXZlbnRzIChldmVudCkge1xuICBpZiAoIWV2ZW50Lm1hdGNoKC9hbmltYXRpb24vaSkpIHtcbiAgICByZXR1cm4gZXZlbnRcbiAgfSBlbHNlIHtcbiAgICBpZiAoY3NzQW5pbUV2ZW50VHlwZXNbZXZlbnRdKSB7XG4gICAgICByZXR1cm4gY3NzQW5pbUV2ZW50VHlwZXNbZXZlbnRdXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHdpbmRvdy5lbnYgIT0gJ3Rlc3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1wiJyArIGV2ZW50ICsgJ1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBhbmltYXRpb24gZXZlbnQnKVxuICAgICAgfVxuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG59XG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCAnYmVhbicgKSxcbiAgICBwYWdlICA9IHJlcXVpcmUoICcuL3BhZ2UnICksXG4gICAgZm9ybUVscztcblxudmFyIGZvcm1CdWJibGluZyA9IGZhbHNlXG5cbnZhciBmaXJlQnViYmxlID0gZnVuY3Rpb24gKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5kZXRhaWwgJiYgZXZlbnQuZGV0YWlsLnRyaWdnZXJlZCApIHsgcmV0dXJuIGZhbHNlIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoIGV2ZW50LnR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IHRyaWdnZXJlZDogdHJ1ZSB9IH0gKVxuXG4gIC8vIFN0b3Agb25seSAnc3VibWl0JyBldmVudHMuIFN0b3BwaW5nIGJsdXIgb3IgZm91Y3MgZXZlbnRzIHNlZW1zIHRvIGJyZWFrIEZpcmVGb3ggaW5wdXQgaW50ZXJhY3Rpb25zLlxuICBpZiAoIGV2ZW50LnR5cGUgPT0gJ3N1Ym1pdCcgKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IG9uIG9yaWdpbmFsIGV2ZW50IGlmIGN1c3RvbSBldmVudCBpcyBwcmV2ZW50ZWRcbiAgaWYgKCBldi5kZWZhdWx0UHJldmVudGVkICkgZXZlbnQucHJldmVudERlZmF1bHQoKSBcbn1cblxuLy8gU2ltcGxpZnkgc2V0dGluZyB0aGUgZXZlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZWxlbWVudFxudmFyIGV2ZW50VHlwZSA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIHJldHVybiAoIGVsLnRhZ05hbWUgPT0gJ0ZPUk0nICkgPyAnc3VibWl0JyA6ICdmb2N1cyBibHVyJ1xufVxuXG4vLyBBZGQgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlT24gPSBmdW5jdGlvbiAoIGVsICkge1xuICBFdmVudC5vbiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPZmYgPSBmdW5jdGlvbiAoIGVsICkge1xuICBFdmVudC5vZmYoIGVsLCBldmVudFR5cGUoIGVsICksIGZpcmVCdWJibGUgKVxufVxuXG4vLyBBZGQvUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZUZvcm1FdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICggZm9ybUJ1YmJsaW5nICkgeyByZXR1cm4gfSBcbiAgcGFnZS5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gUmVtb3ZlIGxpc3RlbmVycyBmcm9tIHByZXZpb3VzIHBhZ2VcbiAgICBpZiAoIGZvcm1FbHMgKSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPZmYgKVxuXG4gICAgLy8gQWRkIG5ldyBsaXN0ZW5lcnMgdG8gdGhpcyBwYWdlXG4gICAgZm9ybUVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdmb3JtLCBpbnB1dCcgKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggZm9ybUVscywgYnViYmxlT24gKVxuICB9KVxuXG4gIHZhciBmb3JtQnViYmxpbmcgPSB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnViYmxlRm9ybUV2ZW50c1xuIiwidmFyIE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hbmFnZXIgPSB7XG5cbiAgICAgIGNhbGxiYWNrczogW10sXG5cbiAgICAgIGFkZDogZnVuY3Rpb24oIGZuICkge1xuXG4gICAgICAgIHZhciBjYiA9IE1hbmFnZXIuY2FsbGJhY2submV3KCBmbiApXG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLnB1c2goIGNiIClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjYlxuXG4gICAgICB9LFxuXG4gICAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdG9wKCkgfSApXG4gICAgICB9LFxuXG4gICAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2Iuc3RhcnQoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHRvZ2dsZTogZnVuY3Rpb24oIGJvb2wgKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2IudG9nZ2xlKCBib29sICkgfSApXG4gICAgICB9LFxuXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcyA9IFtdXG4gICAgICB9LFxuXG4gICAgICBmaXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGZuICkgeyBmbi5hcHBseSggdGhpcywgYXJncyApIH0gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYW5hZ2VyXG4gIH0sXG5cbiAgY2FsbGJhY2s6IHtcbiAgICBuZXc6IGZ1bmN0aW9uKCBmbiApIHtcbiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIGNiLmVuYWJsZWQgKSB7IGZuLmFwcGx5KCBmbiwgYXJndW1lbnRzICkgfVxuICAgICAgfVxuXG4gICAgICBjYi5zdG9wICAgPSBmdW5jdGlvbigpIHsgY2IuZW5hYmxlZCA9IGZhbHNlIH1cbiAgICAgIGNiLnN0YXJ0ICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gdHJ1ZSB9XG4gICAgICBjYi50b2dnbGUgPSBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgY2IuZW5hYmxlZCA9ICggMCBpbiBhcmd1bWVudHMgKSA/IGJvb2wgOiAhY2IuZW5hYmxlZFxuICAgICAgfVxuICAgICAgY2IuZW5hYmxlZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGNiXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWFuYWdlclxuIiwidmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKVxufVxuXG52YXIgcGlja0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmb3VuZFxuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBjYW5kaWRhdGUgKSB7XG4gICAgaWYgKCB0eXBlb2YoIGNhbmRpZGF0ZSApID09ICdmdW5jdGlvbicgJiYgIWZvdW5kICkgeyBmb3VuZCA9IGNhbmRpZGF0ZSB9XG4gIH0pXG5cbiAgcmV0dXJuIGZvdW5kXG59XG5cbnZhciBkZWJvdW5jZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICAvLyBBbGxvdyBvcHRpb25zIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnRcbiAgaWYgKCB0eXBlb2YoIGZuICkgPT0gJ29iamVjdCcgKSB7IG9wdGlvbnMgPSBmbiB9IFxuXG4gIC8vIE9wdGlvbnMgd29uJ3QgYmUgbnVsbFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIHdhaXQgPSBvcHRpb25zLndhaXQgfHwgd2FpdCB8fCAwXG5cbiAgdmFyIG1heCAgICAgICAgICAgID0gb3B0aW9ucy5tYXggfHwgZmFsc2UsXG4gICAgICBsZWFkaW5nICAgICAgICA9ICggKCAnbGVhZGluZycgIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMubGVhZGluZyAgOiBmYWxzZSApLFxuICAgICAgdHJhaWxpbmcgICAgICAgPSAoICggJ3RyYWlsaW5nJyBpbiBvcHRpb25zICkgPyBvcHRpb25zLnRyYWlsaW5nIDogdHJ1ZSApLFxuICAgICAgXG4gICAgICAvLyBHcmFiIGZ1bmN0aW9ucyBmcm9tIG9wdGlvbnMgb3IgZGVmYXVsdCB0byBmaXJzdCBhcmd1bWVudFxuICAgICAgbGVhZGluZ0ZuICAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy50cmFpbGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcbiAgICAgIHRyYWlsaW5nRm4gICAgID0gcGlja0Z1bmN0aW9uKCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmxlYWRpbmcsIG9wdGlvbnMuY2FsbGJhY2ssIGZuICksXG5cbiAgICAgIC8vIFN0YXRlIHRyYWNraW5nIHZhcnNcbiAgICAgIGFyZ3MsICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBhcmd1bWVudHMgcGFzc2VkIHRvIGRlYm91bmNlZCBjYWxsYmFja1xuICAgICAgcXVldWVkICAgICAgICAgPSBmYWxzZSwgIC8vIEhhcyBhIGNhbGxiYWNrIGJlZW4gYWRkZWQgdG8gdGhlIGFuaW1hdGlvbiBsb29wP1xuICAgICAgaGFuZGxlICAgICAgICAgPSB7fSwgICAgIC8vIE9iamVjdCBmb3IgdHJhY2tpbmcgZnVuY3Rpb25zIGFuZCBjYWxsYmFja3NcbiAgICAgIGxhc3RDYWxsZWQgICAgID0gMCwgICAgICAvLyBLZWVwIGEgdGltZXIgZm9yIGRlYm91bmNpbmdcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMCwgICAgICAvLyBLZWVwIGEgdGltZXIgZm9yIG1heFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZTsgIC8vIFRyYWNrIGxlYWRpbmcsIHRocm90dGxpbmcgc3Vic2VxdWVudCBsZWFkaW5nIGNhbGxzXG5cbiAgLy8gUXVldWUgdGhlIGZ1bmN0aW9uIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gIHZhciBpbnZva2UgPSBmdW5jdGlvbiggY2FsbFR5cGUgKSB7XG5cbiAgICBsYXN0Q2FsbGVkID0gbm93KClcbiAgICBsYXN0SW52b2tlZCA9IG5vdygpXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBsZWFkaW5nQmxvY2tlZCA9IHRydWVcblxuICAgIGlmICggY2FsbFR5cGUgPT09ICdsZWFkaW5nJyApIHtcbiAgICAgIGxlYWRpbmdGbi5hcHBseSggbGVhZGluZ0ZuLCBhcmdzICkgfVxuICAgIGVsc2Uge1xuICAgICAgdHJhaWxpbmdGbi5hcHBseSggdHJhaWxpbmdGbiwgYXJncyApIH1cblxuICB9XG5cbiAgLy8gTG9hZCB0aGUgbG9vcCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWVcbiAgdmFyIGFkZFRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoICFxdWV1ZWQgKSB7XG4gICAgICBxdWV1ZWQgPSB0cnVlXG4gICAgICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGxvb3AgKSAgLy8gQWRkIHRvIGJyb3dzZXIncyBhbmltYXRpb24gcXVldWVcbiAgICB9XG5cbiAgfVxuXG4gIC8vIFJlbW92ZSBmcm9tIGFuaW1hdGlvbiBxdWV1ZSBhbmQgcmVzZXQgZGVib3VuY2UgXG4gIHZhciByZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbigpIHtcblxuICAgIGlmICggXCJ2YWx1ZVwiIGluIGhhbmRsZSApIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUudmFsdWUgKVxuICAgICAgcXVldWVkICAgICAgICAgPSBmYWxzZVxuICAgICAgbGFzdENhbGxlZCAgICAgPSAwXG4gICAgICBsYXN0SW52b2tlZCAgICA9IDBcbiAgICAgIGxlYWRpbmdCbG9ja2VkID0gZmFsc2VcbiAgICB9XG4gICAgXG4gIH1cblxuICAvLyBwcmV2ZW50IGluZmluaXRlIGRlYm91bmNpbmcgKCBpZiBvcHRpb25zLm1heCBpcyBzZXQgKVxuICB2YXIgbWF4UGFzc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbWF4ICYmIG5vdygpIC0gbGFzdEludm9rZWQgPj0gbWF4IClcbiAgfVxuXG4gIHZhciB3YWl0UmVhY2hlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoIG5vdygpIC0gbGFzdENhbGxlZCApID49IHdhaXRcbiAgfVxuXG4gIC8vIFRoaXMgZ2V0cyBsb2FkZWQgaW50byB0aGUgYW5pbWF0aW9uIHF1ZXVlIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gaXZva2UgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHtcbiAgXG4gICAgLy8gTG9vcCB3YXMgZXhlY3V0ZWQgc28gaXQncyBubyBsb25nZXIgaW4gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgXG4gICAgaWYgKCBsZWFkaW5nICYmICFsZWFkaW5nQmxvY2tlZCApIHtcbiAgICAgIGludm9rZSggJ2xlYWRpbmcnIClcbiAgICB9XG5cbiAgICAvLyBJZiBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgdG8gZnJlcXVlbnRseSB0byBleGVjdXRlXG4gICAgZWxzZSBpZiAoIG1heFBhc3NlZCgpICkge1xuXG4gICAgICBpZiAoIGxlYWRpbmcgKSB7IGludm9rZSggJ2xlYWRpbmcnICkgIH1cbiAgICAgIGVsc2UgICAgICAgICAgIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgfSBcbiAgICBcbiAgICAvLyBJZiBmdW5jdGlvbiBoYXNuJ3QgYmVlbiBjYWxsZWQgc2luY2UgbGFzdCB3YWl0XG4gICAgZWxzZSBpZiAoIHdhaXRSZWFjaGVkKCkgKSB7XG5cbiAgICAgIC8vIElmIHRyYWlsaW5nIGl0J3Mgc2FmZSB0byBpbnZva2VcbiAgICAgIGlmICggdHJhaWxpbmcgKSB7IGludm9rZSggJ3RyYWlsaW5nJyApIH1cblxuICAgICAgLy8gSWYgbGVhZGluZywgaXQncyBzYWZlIHRvIHJlbW92ZSBibG9ja1xuICAgICAgaWYgKCBsZWFkaW5nICkgIHsgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZSB9XG4gICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRUb1F1ZXVlKClcbiAgICB9XG5cbiAgfVxuXG4gIC8vIEEgd3JhcHBlciBmdW5jdGlvbiBmb3IgcXVldWVpbmcgdXAgZnVuY3Rpb24gY2FsbHNcbiAgLy9cbiAgdmFyIGRlYm91bmNlZCA9IGZ1bmN0aW9uKCkge1xuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGFyZ3MgPSBhcmd1bWVudHNcbiAgICBhZGRUb1F1ZXVlKClcbiAgfVxuXG4gIGRlYm91bmNlZC5zdG9wID0gcmVtb3ZlRnJvbVF1ZXVlXG5cbiAgcmV0dXJuIGRlYm91bmNlZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBkZWxheSA9IGZ1bmN0aW9uICggZm4sIHdhaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9ICggd2FpdCAhPSBudWxsICkgPyAyIDogMTtcbiAgdmFyIGhhbmRsZSA9IHt9XG5cbiAgaGFuZGxlLmFyZ3MgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgYXJnc1N0YXJ0IClcbiAgaGFuZGxlLndhaXQgID0gd2FpdCB8fCAwXG4gIGhhbmRsZS5zdGFydCA9IG5vdygpXG5cbiAgaGFuZGxlLnN0b3AgID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICggXCJ2YWx1ZVwiIGluIGhhbmRsZSApIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUudmFsdWUgKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGUubG9vcCAgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAvLyBJZiB3YWl0IGxpbWl0IGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIG5vdygpIC0gaGFuZGxlLnN0YXJ0ID49IGhhbmRsZS53YWl0ICkge1xuICAgICAgZm4uYXBwbHkoIGZuLCBoYW5kbGUuYXJncyApXG5cbiAgICAgIC8vIElmIHJlcGVhdCBpcyBzZXQgYW5kIGlzIG5vdCAwXG4gICAgICBpZiAoICEhaGFuZGxlLnJlcGVhdCApIHtcbiAgICAgICAgaGFuZGxlLnJlcGVhdCA9IGhhbmRsZS5yZXBlYXQgLSAxXG4gICAgICAgIGhhbmRsZS5zdGFydCA9IG5vdygpXG4gICAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgICB9IGVsc2UgaWYgKCBoYW5kbGUucmVwZWF0ID09PSAwICYmIGhhbmRsZS5jb21wbGV0ZSApIHtcbiAgICAgICAgaGFuZGxlLmNvbXBsZXRlKClcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZURlbGF5KCBoYW5kbGUgKVxuICAgIH1cblxuICB9XG5cblxuICByZXR1cm4gcXVldWVEZWxheSggaGFuZGxlIClcbn1cblxudmFyIHF1ZXVlRGVsYXkgPSBmdW5jdGlvbiAoIGhhbmRsZSApIHtcbiAgaGFuZGxlLnZhbHVlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUubG9vcCApXG4gIHJldHVybiBoYW5kbGVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxheVxuIiwiLy8gVGhpcyBzaW1wbGlmaWVzIGNvbW1vbiB1c2VzIGZvciB3aW5kb3cubWF0Y2hNZWRpYSBcbi8vIG5hbWVseSwgYWRkaW5nIGxpc3RlbmVycyBmb3Igd2lkdGggYW5kIGhlaWdodCBxdWVyaWVzXG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkoIHF1ZXJ5LCBkaW1lbnNpb24gKSB7XG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIGlmICggdHlwZW9mKCBxdWVyeSApID09PSAnc3RyaW5nJyApIHsgcmV0dXJuIHF1ZXJ5IH1cblxuICByZXN1bHQubWluID0gc2l6ZSggcXVlcnkubWluLCAnbWluLScgKyBkaW1lbnNpb24gKVxuICByZXN1bHQubWF4ID0gc2l6ZSggcXVlcnkubWF4LCAnbWF4LScgKyBkaW1lbnNpb24gKVxuXG4gIGlmICggcmVzdWx0Lm1pbiAmJiByZXN1bHQubWF4IClcbiAgICByZXN1bHQucXVlcnkgPSByZXN1bHQubWluICsgJyBhbmQgJyArIHJlc3VsdC5tYXhcblxuICByZXR1cm4gcmVzdWx0LnF1ZXJ5IHx8IHJlc3VsdC5taW4gfHwgcmVzdWx0Lm1heFxufVxuXG5mdW5jdGlvbiBzaXplKCBudW0sIGxpbWl0ICkge1xuICByZXR1cm4gKCBudW0gKSA/ICcoJytsaW1pdCsnOiAnICsgdG9QeCggbnVtICkgKyAnKScgOiBudWxsXG59XG5cbmZ1bmN0aW9uIHRvUHgoIHdpZHRoICkge1xuICBpZiAoIHR5cGVvZiggd2lkdGggKSA9PT0gJ251bWJlcicgKSB7IHJldHVybiB3aWR0aCArICdweCd9XG4gIHJldHVybiB3aWR0aFxufVxuXG52YXIgbWVkaWEgPSB7XG5cbiAgd2lkdGg6IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgcmV0dXJuIG1lZGlhLmxpc3RlbiggcGFyc2VRdWVyeSggcXVlcnksICd3aWR0aCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbldpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtaW46IHNpemUgfSwgZm4gKSB9LFxuICBtYXhXaWR0aDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEud2lkdGgoIHsgbWF4OiBzaXplIH0sIGZuICkgfSxcblxuICBoZWlnaHQ6IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgcmV0dXJuIG1lZGlhLmxpc3RlbiggcGFyc2VRdWVyeSggcXVlcnksICdoZWlnaHQnICksIGZuIClcbiAgfSxcblxuICBtaW5IZWlnaHQ6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLmhlaWdodCggeyBtaW46IHNpemUgfSwgZm4gKSB9LFxuICBtYXhIZWlnaHQ6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLmhlaWdodCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICB2YXIgbWF0Y2ggPSB3aW5kb3cubWF0Y2hNZWRpYSggcXVlcnkgKVxuXG4gICAgaWYgKCBmbiApIHtcbiAgICAgIGZuKCBtYXRjaCApXG4gICAgICBtYXRjaC5hZGRMaXN0ZW5lciggZm4gKVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaFxuICB9XG5cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lZGlhXG4iLCJ2YXIgRXZlbnQgICAgICAgICAgID0gcmVxdWlyZSggJ2JlYW4nIClcbnZhciBjYWxsYmFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9jYWxsYmFjay1tYW5hZ2VyJyApXG52YXIgdGhyb3R0bGUgICAgICAgID0gcmVxdWlyZSggJy4vdGhyb3R0bGUnIClcbnZhciBkZWJvdW5jZSAgICAgICAgPSByZXF1aXJlKCAnLi9kZWJvdW5jZScgKVxuXG52YXIgb3B0aW1pemVkRXZlbnRNYW5hZ2VyID0ge1xuICBuZXc6IGZ1bmN0aW9uKCBuYW1lICkge1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNhbGxiYWNrIG1hbmFnZXJcbiAgICB2YXIgbWFuYWdlciA9IHtcbiAgICAgIHJ1bjogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RhcnQ6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgICAgIHN0b3A6IGNhbGxiYWNrTWFuYWdlci5uZXcoKVxuICAgIH1cblxuICAgIC8vIHJ1biBjYWxsYmFja3Mgd2hlbiBldmVudCBoYXBwZW5zIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHJ1bm5pbmcgPSB0aHJvdHRsZSggbWFuYWdlci5ydW4uZmlyZSApXG5cbiAgICAvLyBmaXJlIGNhbGxiYWNrcyB3aGVuIGV2ZW50IHN0YXJ0cyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBzdGFydGVkID0gZGVib3VuY2Uoe1xuICAgICAgbGVhZGluZzogbWFuYWdlci5zdGFydC5maXJlLFxuICAgICAgdHJhaWxpbmc6IGZhbHNlLFxuICAgICAgd2FpdDogMTUwXG4gICAgfSlcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0b3BwZWQgPSBkZWJvdW5jZSggbWFuYWdlci5zdG9wLmZpcmUsIDE1MCApXG5cbiAgICBFdmVudC5vbiggd2luZG93LCBuYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHJ1bm5pbmcoKVxuICAgICAgc3RhcnRlZCgpXG4gICAgICBzdG9wcGVkKClcbiAgICB9KVxuXG4gICAgLy8gUHVibGljIEFQSVxuICAgIHZhciBydW4gICA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnJ1bi5hZGQoIGZuICkgfVxuICAgIHJ1bi5zdGFydCA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnN0YXJ0LmFkZCggZm4gKSB9XG4gICAgcnVuLnN0b3AgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RvcC5hZGQoIGZuICkgfVxuXG4gICAgLy8gQWRkIGN1c3RvbSBldmVudHMgZm9yIHRvIHJ1biBvcHRpbWl6ZWQgbGlzdGVuZXJzLiAoIG5hbWUgLT4gTmFtZSApXG4gICAgcnVuKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCAnb3B0aW1pemVkJyArICBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKSApIH0gKVxuICAgIHJ1bi5zdGFydCggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgbmFtZSArICdTdGFydCcgKSB9IClcbiAgICBydW4uc3RvcCggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgbmFtZSArICdTdG9wJyApIH0gKVxuXG4gICAgcmV0dXJuIHJ1blxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3B0aW1pemVkRXZlbnRNYW5hZ2VyXG4iLCJ2YXIgRXZlbnQgICAgICAgICAgID0gcmVxdWlyZSggJ2JlYW4nIClcbnZhciBjYWxsYmFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9jYWxsYmFjay1tYW5hZ2VyJyApXG5cbi8vIENyZWF0ZSBhIG5ldyBwYWdlIGV2ZW50IG1hbmFnZXJcbnZhciBtYW5hZ2VyID0ge1xuICByZWFkeTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICBjaGFuZ2U6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgcmVhZHlBbHJlYWR5OiBmYWxzZSxcbiAgY2hhbmdlZDogZmFsc2UsXG59XG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpe1xuICBtYW5hZ2VyLnJlYWR5QWxyZWFkeSA9IHRydWUgXG59KVxuXG5tYW5hZ2VyLnJlYWR5LmFkZCggZnVuY3Rpb24oKXsgXG4gIGlmICggIXdpbmRvdy5UdXJib2xpbmtzICYmICFtYW5hZ2VyLmNoYW5nZWQgKSB7IFxuICAgIG1hbmFnZXIuY2hhbmdlZCA9IHRydWUgXG4gICAgbWFuYWdlci5jaGFuZ2UuZmlyZSgpXG4gIH1cbn0pXG5cbnZhciByZWFkeSA9IGZ1bmN0aW9uICggZm4gKSB7XG4gIGlmICggbWFuYWdlci5yZWFkeUFscmVhZHkgKSB7IGZuKCkgfVxuICByZXR1cm4gbWFuYWdlci5yZWFkeS5hZGQoIGZuICkgfVxuXG52YXIgY2hhbmdlID0gZnVuY3Rpb24oIGZuICkge1xuICBpZiAoIG1hbmFnZXIuY2hhbmdlZCApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLmNoYW5nZS5hZGQoIGZuICkgfVxuXG4vLyBNYWtlIGl0IGVhc3kgdG8gdHJpZ2dlciByZWFkeSBjYWxsYmFja3NcbnJlYWR5LmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIucmVhZHkuZmlyZSgpXG4gIC8vIEJlIHN1cmUgcmVhZHkgY2FuIG9ubHkgYmUgZmlyZWQgb25jZVxuICBtYW5hZ2VyLnJlYWR5LnN0b3AoKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIGNoYW5nZSBjYWxsYmFja3NcbmNoYW5nZS5maXJlID0gZnVuY3Rpb24gKCkge1xuICBtYW5hZ2VyLmNoYW5nZS5maXJlKCkgfVxuXG5FdmVudC5vbiggZG9jdW1lbnQsICdET01Db250ZW50TG9hZGVkJywgcmVhZHkuZmlyZSApXG5FdmVudC5vbiggZG9jdW1lbnQsICdwYWdlOmNoYW5nZSB0dXJib2xpbmtzOmxvYWQnLCBjaGFuZ2UuZmlyZSApIC8vIFN1cHBvcnQgY3VzdG9tIGFuZCByYWlscyB0dXJib2xpbmtzIHBhZ2UgbG9hZCBldmVudHNcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlYWR5OiByZWFkeSxcbiAgY2hhbmdlOiBjaGFuZ2Vcbn1cbiIsInZhciBkZWxheSA9IHJlcXVpcmUoICcuL2RlbGF5JyApXG5cbnZhciByZXBlYXQgPSBmdW5jdGlvbiggZm4sIHdhaXQsIGxpbWl0ICkge1xuXG4gIHZhciBhcmdzU3RhcnQgPSAxLFxuICAgICAgaGFuZGxlID0gZGVsYXkgKCBmbiwgd2FpdCApO1xuXG4gIGlmICAgICAgKCBsaW1pdCAhPSBudWxsICkgeyBhcmdzU3RhcnQgPSAzIH1cbiAgZWxzZSBpZiAoIHdhaXQgICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDIgfVxuXG4gIC8vIEVuYWJsZSByZXBlYXQgKCAtMSB3aWxsIHJlcGVhdCBmb3JldmVyIClcbiAgaGFuZGxlLnJlcGVhdCA9IGxpbWl0IHx8IC0xXG4gIGhhbmRsZS5hcmdzICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUuc3RvcCAgID0gaGFuZGxlLmNhbmNlbFxuXG4gIHJldHVybiBoYW5kbGVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXRcbiIsInZhciBtYW5hZ2VyID0gcmVxdWlyZSggJy4vb3B0aW1pemVkLWV2ZW50LW1hbmFnZXInIClcbnZhciByZXNpemUgID0gbWFuYWdlci5uZXcoICdyZXNpemUnIClcblxuLy8gUGF1c2UgYW5pbWF0aW9ucyBkdXJpbmcgcmVzaXppbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxucmVzaXplLmRpc2FibGVBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlID0gJzxzdHlsZSBpZD1cImZ1bGxzdG9wXCI+Lm5vLWFuaW1hdGlvbiAqLCAubm8tYW5pbWF0aW9uICo6YWZ0ZXIsIC5uby1hbmltYXRpb24gKjpiZWZvcmUge1xcXG4gICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OyBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudFxcXG4gIH08L3N0eWxlPidcblxuICAvLyBJbmplY3Qgc3R5bGUgZm9yIGVhc3kgY2xhc3NuYW1lIG1hbmlwdWxhdGlvblxuICBpZiAoICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdHlsZSNmdWxsc3RvcCcpICkgeyBcbiAgICBkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgc3R5bGUpXG4gIH1cblxuICByZXNpemUuc3RhcnQoIGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICduby1hbmltYXRpb24nICkgfSApXG4gIHJlc2l6ZS5zdG9wKCBmdW5jdGlvbigpIHsgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSggJ25vLWFuaW1hdGlvbicgKSB9IClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXNpemVcbiIsInZhciBtYW5hZ2VyID0gcmVxdWlyZSggJy4vb3B0aW1pemVkLWV2ZW50LW1hbmFnZXInIClcbnZhciBzY3JvbGwgID0gbWFuYWdlci5uZXcoICdzY3JvbGwnIClcblxuc2Nyb2xsLmRpc2FibGVQb2ludGVyID0gZnVuY3Rpb24oKSB7XG5cbiAgLy8gRGlzYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdGFydCggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgfSlcblxuICAvLyBFbmFibGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICBzY3JvbGwuc3RvcCggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJ1xuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjcm9sbFxuIiwiLy8gQ3VzdG9tIEV2ZW50IFBvbHlmaWxsXG4oZnVuY3Rpb24gKCkge1xuXG4gIGlmICggdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiICkgcmV0dXJuIGZhbHNlO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICggZXZlbnQsIHBhcmFtcyApIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkIH07XG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCAnQ3VzdG9tRXZlbnQnICk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudCggZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCApO1xuICAgIHJldHVybiBldnQ7XG4gICB9XG5cbiAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblxuICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn0pKClcbiIsIi8vIE1hbnVhbGx5IHRyaWdnZXIgYSBjYW5jZWxhYmxlIGZvcm0gc3VibWl0IGV2ZW50LlxuZnVuY3Rpb24gc3VibWl0KCBmb3JtICkge1xuICBpZiAoICFmb3JtLnRhZ05hbWUgfHwgZm9ybS50YWdOYW1lICE9ICdGT1JNJyApIHtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvciggJ1RyaWdnZXIgdGhpcyBldmVudCBvbiBhIGZvcm0gZWxlbWVudCcgKVxuICB9XG5cbiAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCAnc3VibWl0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG4gIGZvcm0uZGlzcGF0Y2hFdmVudCggZXYgKVxuXG4gIC8vIFN1Ym1pdCBmb3JtIHVubGVzcyBldmVudCBkZWZhdWx0IGlzIHByZXZlbnRlZFxuICBpZiAoICFldi5kZWZhdWx0UHJldmVudGVkICkgZm9ybS5zdWJtaXQoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1Ym1pdFxuIiwidmFyIGVuZEV2ZW50cyA9IFtcbiAgJ3RvdWNoZW5kJ1xuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRhcFxuXG4vLyBkZWZhdWx0IHRhcCB0aW1lb3V0IGluIG1zXG5UYXAudGltZW91dCA9IDIwMFxuXG5mdW5jdGlvbiBUYXAoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgLy8gaWYgdGhlIHVzZXIgaG9sZHMgaGlzL2hlciBmaW5nZXIgZG93biBmb3IgbW9yZSB0aGFuIDIwMG1zLFxuICAvLyB0aGVuIGl0J3Mgbm90IHJlYWxseSBjb25zaWRlcmVkIGEgdGFwLlxuICAvLyBob3dldmVyLCB5b3UgY2FuIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIHZhciB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IFRhcC50aW1lb3V0XG5cbiAgLy8gdG8ga2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwgbGlzdGVuZXJcbiAgbGlzdGVuZXIuaGFuZGxlciA9IGNhbGxiYWNrXG5cbiAgcmV0dXJuIGxpc3RlbmVyXG5cbiAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGxpc3RlbmVyKVxuICBmdW5jdGlvbiBsaXN0ZW5lcihlMSkge1xuICAgIC8vIHRhcCBzaG91bGQgb25seSBoYXBwZW4gd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICBpZiAoIWUxLnRvdWNoZXMgfHwgZTEudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm5cblxuICAgIHZhciBlbCA9IGUxLnRhcmdldFxuICAgIHZhciBjb250ZXh0ID0gdGhpc1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgdmFyIHRpbWVvdXRfaWQgPSBzZXRUaW1lb3V0KGNsZWFudXAsIHRpbWVvdXQpXG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBjbGVhbnVwKVxuXG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBkb25lKGUyKSB7XG4gICAgICAvLyBzaW5jZSB0b3VjaHN0YXJ0IGlzIGFkZGVkIG9uIHRoZSBzYW1lIHRpY2tcbiAgICAgIC8vIGFuZCBiZWNhdXNlIG9mIGJ1YmJsaW5nLFxuICAgICAgLy8gaXQnbGwgZXhlY3V0ZSB0aGlzIG9uIHRoZSBzYW1lIHRvdWNoc3RhcnQuXG4gICAgICAvLyB0aGlzIGZpbHRlcnMgb3V0IHRoZSBzYW1lIHRvdWNoc3RhcnQgZXZlbnQuXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIC8vIGFscmVhZHkgaGFuZGxlZFxuICAgICAgaWYgKGUyLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVyblxuXG4gICAgICAvLyBvdmVyd3JpdGUgdGhlc2UgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSBhbGwgdG8gYm90aCBzdGFydCBhbmQgZXZlbnRzLlxuICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZTEucHJldmVudERlZmF1bHRcbiAgICAgIHZhciBzdG9wUHJvcGFnYXRpb24gPSBlMS5zdG9wUHJvcGFnYXRpb25cblxuICAgICAgZTEuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMSlcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uLmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIGUxLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdC5jYWxsKGUxKVxuICAgICAgICBwcmV2ZW50RGVmYXVsdC5jYWxsKGUyKVxuICAgICAgfVxuXG4gICAgICAvLyBjYWxscyB0aGUgaGFuZGxlciB3aXRoIHRoZSBgZW5kYCBldmVudCxcbiAgICAgIC8vIGJ1dCBpIGRvbid0IHRoaW5rIGl0IG1hdHRlcnMuXG4gICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKVxuICAgIH1cblxuICAgIC8vIGNsZWFudXAgZW5kIGV2ZW50c1xuICAgIC8vIHRvIGNhbmNlbCB0aGUgdGFwLCBqdXN0IHJ1biB0aGlzIGVhcmx5XG4gICAgZnVuY3Rpb24gY2xlYW51cChlMikge1xuICAgICAgLy8gaWYgaXQncyB0aGUgc2FtZSBldmVudCBhcyB0aGUgb3JpZ2luLFxuICAgICAgLy8gdGhlbiBkb24ndCBhY3R1YWxseSBjbGVhbnVwLlxuICAgICAgLy8gaGl0IGlzc3VlcyB3aXRoIHRoaXMgLSBkb24ndCByZW1lbWJlclxuICAgICAgaWYgKGUxID09PSBlMikgcmV0dXJuXG5cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0X2lkKVxuXG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBjbGVhbnVwKVxuXG4gICAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZG9uZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCJ2YXIgZGVib3VuY2UgPSByZXF1aXJlKCAnLi9kZWJvdW5jZScgKVxuXG52YXIgdGhyb3R0bGUgPSBmdW5jdGlvbiggZm4sIHdhaXQsIG9wdGlvbnMgKSB7XG5cbiAgaWYgKCB0eXBlb2YoIGZuICkgPT0gJ29iamVjdCcgKSB7IG9wdGlvbnMgPSBmbjsgZm4gPSB1bmRlZmluZWQgfSBcbiAgZWxzZSB7IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9IH1cblxuICBvcHRpb25zLndhaXQgPSBvcHRpb25zLndhaXQgfHwgd2FpdCB8fCAwXG4gIG9wdGlvbnMubWF4ICA9IG9wdGlvbnMubWF4IHx8IG9wdGlvbnMud2FpdFxuICBvcHRpb25zLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmblxuICBvcHRpb25zLmxlYWRpbmcgID0gdHJ1ZVxuICBvcHRpb25zLnRyYWlsaW5nID0gdHJ1ZVxuXG4gIHJldHVybiBkZWJvdW5jZShvcHRpb25zKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGVcbiIsInZhciB2YWxpZGF0aW9uICAgPSByZXF1aXJlKCAnLi9saWIvdmFsaWRhdGlvbicgKSxcbiAgICB0aWVyZWRTZWxlY3QgPSByZXF1aXJlKCAnLi9saWIvdGllcmVkLXNlbGVjdCcgKSxcbiAgICBwcm9ncmVzc2l2ZSAgPSByZXF1aXJlKCAnLi9saWIvcHJvZ3Jlc3NpdmUnICksXG4gICAgZ2V0TGFiZWwgICAgID0gcmVxdWlyZSggJy4vbGliL2dldC1sYWJlbCcgKSxcbiAgICBkaWZmICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvZGlmZicgKSxcbiAgICBpbnB1dENoYW5nZSAgPSByZXF1aXJlKCAnLi9saWIvaW5wdXQtY2hhbmdlJyApLFxuICAgIHN0ZXBwZWRJbnB1dCA9IHJlcXVpcmUoICcuL2xpYi9zdGVwcGVkLW51bWJlci1pbnB1dCcgKSxcbiAgICBzdGVwTGFiZWxzICAgPSByZXF1aXJlKCAnLi9saWIvc3RlcC1sYWJlbHMnICksXG4gICAgc2xpZGVyICAgICAgID0gcmVxdWlyZSggJy4vbGliL3NsaWRlci9pbnB1dCcgKVxuXG5yZXF1aXJlKCAnLi9saWIvcmVzZXQnIClcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlOiB2YWxpZGF0aW9uLnZhbGlkYXRlLFxuICB0aWVyZWRTZWxlY3Q6IHRpZXJlZFNlbGVjdCxcbiAgaW52YWxpZGF0ZUZpZWxkOiB2YWxpZGF0aW9uLmludmFsaWRhdGVGaWVsZCxcbiAgbmV4dDogcHJvZ3Jlc3NpdmUubmV4dCxcbiAgZ2V0TGFiZWw6IGdldExhYmVsLFxuICBkaWZmOiBkaWZmLFxuICBpbnB1dENoYW5nZTogaW5wdXRDaGFuZ2UsXG4gIHN0ZXBwZWROdW1iZXJJbnB1dDogc3RlcHBlZElucHV0LFxuICBzdGVwTGFiZWxzOiBzdGVwTGFiZWxzLFxuICBzbGlkZXI6IHNsaWRlclxufVxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ID0gdG9vbGJveC5ldmVudCxcbiAgICBnZXRMYWJlbCA9IHJlcXVpcmUoICcuL2dldC1sYWJlbCcpLFxuICAgIGlucHV0Q2hhbmdlID0gcmVxdWlyZSggJy4vaW5wdXQtY2hhbmdlJyApLFxuICAgIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcbiAgICBzbGlkZXJIZWxwZXJzID0gcmVxdWlyZSggJy4vc2xpZGVyL2hlbHBlcnMnIClcblxuZnVuY3Rpb24gZGlmZkZvcm0oIGV2ZW50ICkge1xuICB2YXIgZm9ybSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICB2YXIgZGlmZnMgPSBbXSxcbiAgICAgIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcblxuICBpZiAoIGRpZmZFbCA9PSBudWxsICkgeyByZXR1cm4gfVxuXG4gIGluaXREaWZmSWRzKCBmb3JtIClcblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJy5jaGFuZ2VkLXZhbHVlJyApLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgdmFyIGRpZmYgPSBkaWZmSW5wdXQoIGVsIClcblxuICAgIC8vIE9ubHkgc2hvdyBvbmUgaW5wdXQgZGlmZiBwZXIgbGFiZWxcbiAgICAvLyBJZiBkaWZmcyBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgbGFiZWwsIGRvIG5vdCBhZGQgaXQuXG4gICAgaWYgKCAhZGlmZnMuZmluZCggZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbCA9PSBkaWZmLmxhYmVsIH0gKSApIGRpZmZzLnB1c2goIGRpZmYgKVxuICB9KVxuXG4gIGlmICggZGlmZnMubGVuZ3RoID09IDAgKSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gJydcbiAgZWxzZSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gYDx0YWJsZSBjbGFzcz0naW5wdXQtZGlmZnMnPiR7IGRpZmZzLm1hcCggZGlmZlJvdyApLmpvaW4oJycpIH08L3RhYmxlPmBcblxuICB0b2dnbGVEaWZmRWxzKCBmb3JtIClcbn1cblxuZnVuY3Rpb24gdG9nZ2xlRGlmZkVscyggZm9ybSApIHtcbiAgdmFyIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcbiAgaWYgKCBkaWZmRWwgKSB7XG5cbiAgICB2YXIgZWxlbWVudHNUb1RvZ2dsZSA9IHRvb2xib3guc2xpY2UoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGRpZmZFbC5kYXRhc2V0LmhpZGVXaGVuRW1wdHkgKSlcbiAgICBlbGVtZW50c1RvVG9nZ2xlLnB1c2goIGRpZmZFbCApXG5cbiAgICB0b29sYm94LmVhY2goIGVsZW1lbnRzVG9Ub2dnbGUsIGZ1bmN0aW9uKCBlbCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2Zvcm0tZGlmZi1oaWRkZW4nLCBkaWZmRWwuY2hpbGRyZW4ubGVuZ3RoID09IDAgKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gQ3JlYXRlIGEgZGlmZiB0YWJsZSByb3dcbmZ1bmN0aW9uIGRpZmZSb3cgKCBkaWZmICkge1xuXG4gIHZhciByb3cgPSBgPHRyIGNsYXNzPSdpbnB1dC1kaWZmICR7ZGlmZlsnY2xhc3MnXS5qb2luKCcgJyl9JyBkYXRhLWRpZmYtbmFtZT0nJHtkaWZmLm5hbWV9Jz5gXG5cbiAgICAvLyBBZGQgbGFiZWwgYW5kIGRpZmYgbm90ZVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLWxhYmVsJz48c3Bhbj4ke2RpZmYubGFiZWx9PC9zcGFuPmBcbiAgICBpZiAoZGlmZi5ub3RlLmxlbmd0aCA+IDApIHJvdyArPSBgIDxzcGFuIGNsYXNzPSdkaWZmLW5vdGUnPiR7ZGlmZi5ub3RlLmpvaW4oJyAnKX08L3NwYW4+YFxuICAgIHJvdyArPSBcIjwvdGQ+XCJcblxuICAgIC8vIEFkZCBpbml0aWFsIHZhbHVlIGNvZGUgY2VsbFxuICAgIHJvdyArPSBkaWZmQ2VsbCggZGlmZi5pbml0aWFsLCAnaW5pdGlhbCcgKVxuXG4gICAgLy8gQWRkIGFycm93IG1hcmtlclxuICAgIHJvdyArPSBcIjx0ZCBjbGFzcz0naW5wdXQtZGlmZi1tYXJrZXInPjxzcGFuPuKGkjwvc3Bhbj48L3RkPlwiXG5cbiAgICAvLyBBZGQgY3VycmVudCB2YWx1ZSBjb2RlIGNlbGxcbiAgICByb3cgKz0gZGlmZkNlbGwoIGRpZmYudmFsdWUsICd2YWx1ZScgKVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLXVuZG8nPjxzcGFuPjxidXR0b24gY2xhc3M9J2Zvcm0tZGlmZi1idXR0b24nIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nUmVzZXQgdmFsdWUnIGRhdGEtcmVzZXQtaW5wdXQ9JyR7ZGlmZi5zZWxlY3Rvcn0nPuKclTwvYnV0dG9uPjwvc3Bhbj48L3RkPmBcblxuICByZXR1cm4gcm93ICsgXCI8L3RyPlwiXG59XG5cbmZ1bmN0aW9uIGRpZmZDZWxsICh2YWx1ZSwgbmFtZSkge1xuICB2YXIgdGRDbGFzcyA9IGBpbnB1dC1kaWZmLSR7bmFtZX1gXG4gIGlmICggIXZhbHVlIHx8IHZhbHVlID09ICdubyBzZWxlY3Rpb24nICkgdGRDbGFzcyArPSAnIG51bGwtdmFsdWUnXG5cbiAgcmV0dXJuIGA8dGQgY2xhc3M9JyR7dGRDbGFzc30nPjxjb2RlPiR7KCB2YWx1ZSB8fCAnbnVsbCcgKX08L2NvZGU+PC90ZD5gXG59XG5cbi8vIEFkZCB1bmlxdWUgaWRzIGZvciBlYWNoIGlucHV0IGluIGEgZm9ybVxuZnVuY3Rpb24gaW5pdERpZmZJZHMoIGZvcm0gKSB7XG4gIGlmICggZm9ybS5kYXRhc2V0LmRpZmZJZHMgKSByZXR1cm5cblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggU2VsZWN0b3IgKSwgZnVuY3Rpb24gKCBlbCwgaW5kZXggKSB7XG4gICAgZWwuZGF0YXNldC5mb3JtRGlmZklkID0gYGZvcm0tZGlmZi0ke3JhbmRJRCgpfS0ke2luZGV4fWBcbiAgfSlcblxuICBmb3JtLmRhdGFzZXQuZGlmZklkcyA9IHRydWVcbn1cblxuZnVuY3Rpb24gcmFuZElEICgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygzKVxufVxuXG4vLyBSZXR1cm5zOiB7IGlucHV0OiBpbnB1dCBlbGVtZW50LCBpbml0aWFsOiAnb2xkIHZhbHVlJywgdmFsdWU6ICduZXcgdmFsdWUnIH1cbmZ1bmN0aW9uIGRpZmZJbnB1dCggaW5wdXQgKSB7XG4gIHZhciBkaWZmID0ge1xuICAgIGluaXRpYWw6ICBbXSxcbiAgICB2YWx1ZTogICAgW10sXG4gICAgbmFtZTogICAgIFtdLFxuICAgIGNsYXNzOiAgICBbXSxcbiAgICBub3RlOiAgICAgW10sXG4gICAgc2VsZWN0b3I6IFtdXG4gIH0sXG4gICAgaW5wdXRzXG5cbiAgdmFyIGxhYmVsID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2xhYmVsJyApXG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2Zvcm0nIClcblxuICBpZiAoIGxhYmVsICkge1xuICAgIC8vIEdldCB0ZXh0IGxhYmVsIGZyb20gdGhlIGZpcnN0IGlucHV0IGluIGEgbGFiZWxcbiAgICBkaWZmLmxhYmVsID0gZ2V0TGFiZWwudGV4dCggbGFiZWwucXVlcnlTZWxlY3RvciggU2VsZWN0b3IgKSApXG5cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnB1dHMgdW5kZXIgYSBzaW5nbGUgbGFiZWxcbiAgICAvLyBHcm91cCB0aG9zZSBpbnB1dCB2YWx1ZXMgaW4gdGhlIGZvcm0gZGlmZiBhbmQgdHJlYXRcbiAgICAvLyB0aGVtIGFzIGEgc2luZ2xlIHZhbHVlXG4gICAgdmFyIGxhYmVsSW5wdXRzID0gdG9vbGJveC5zbGljZSggbGFiZWwucXVlcnlTZWxlY3RvckFsbCggU2VsZWN0b3IgKSApXG5cbiAgICAvLyBJZiBtdWx0aXBsZSBpbnB1dHMgYXJlIHVuZGVyIGEgc2luZ2xlIGxhYmVsLCB1c2UgdGhvc2VcbiAgICAvLyBvdGhlcndpc2UgdXNlIGlucHV0IGFzIGFuIGFycmF5ICh0byBzaW1wbGlmeSB0aGlzKVxuICAgIGlucHV0cyA9ICggbGFiZWxJbnB1dHMubGVuZ3RoID4gMCApID8gbGFiZWxJbnB1dHMgOiBbIGlucHV0IF1cbiAgfSBlbHNlIHtcbiAgICBpbnB1dHMgPSBbIGlucHV0IF1cbiAgfVxuXG4gIGRpZmYubGFiZWwgPSBkaWZmLmxhYmVsIHx8IGdldExhYmVsLnRleHQoIGlucHV0ICkgfHwgaW5wdXQuZ2V0QXR0cmlidXRlKCAnbmFtZScgKVxuXG4gIHRvb2xib3guZWFjaCggaW5wdXRzLCBmdW5jdGlvbiAoIGlucHV0ICkge1xuXG4gICAgaWYgKCBpbnB1dC50eXBlID09ICdyYW5nZScgJiYgaW5wdXQuZGF0YXNldC5pbnB1dCApIHtcbiAgICAgIHNsaWRlcklucHV0ID0gc2xpZGVySGVscGVycy5nZXRJbnB1dCggaW5wdXQgKVxuXG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggc2xpZGVySW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBzbGlkZXJJbnB1dC52YWx1ZSApXG5cbiAgICAvLyBHZXQgc2VsZWN0IGxhYmVsIG5hbWVzIChyYXRoZXIgdGhhbiB2YWx1ZXMpIGlmIHByZXNlbnRcbiAgICB9IGVsc2UgaWYgKCBpbnB1dC50YWdOYW1lID09ICdTRUxFQ1QnICkge1xuXG4gICAgICAvLyBTaG93IG9wdGlvbiBsYWJlbHMgaW5zdGVhZCBvZiB2YWx1ZXMgaWYgcHJlc2VudFxuICAgICAgdmFyIG9wdGlvbnMgPSB7fVxuICAgICAgdG9vbGJveC5lYWNoKGlucHV0LmNoaWxkcmVuLCBmdW5jdGlvbiAoIG8gKSB7XG4gICAgICAgIG9wdGlvbnNbby52YWx1ZV0gPSBvLnZhbHVlID8gby50ZXh0IDogJ25vIHNlbGVjdGlvbidcbiAgICAgIH0pXG5cbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBvcHRpb25zWyBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSBdIHx8IGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlIClcbiAgICAgIGRpZmYudmFsdWUucHVzaCggb3B0aW9uc1sgaW5wdXQudmFsdWUgXSB8fCBpbnB1dC52YWx1ZSApXG5cbiAgICAvLyBHZXQgcmFkaW8gbGFiZWwgbmFtZXMgKHJhdGhlciB0aGFuIHZhbHVlcykgaWYgcHJlc2VudFxuICAgIH0gZWxzZSBpZiAoIGlucHV0LnR5cGUgPT0gJ3JhZGlvJyApIHtcblxuICAgICAgZGlmZi5sYWJlbCA9IGdldExhYmVsLmxlZ2VuZCggaW5wdXQgKSB8fCBkaWZmLmxhYmVsXG5cbiAgICAgIHZhciByYWRpb0lucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCggYGlucHV0W25hbWU9XCIke2lucHV0Lm5hbWV9XCJdYCApXG4gICAgICB2YXIgcmFkaW9Jbml0aWFsLCByYWRpb1ZhbHVlXG5cbiAgICAgIHJhZGlvSW5wdXRzLmZvckVhY2goIGZ1bmN0aW9uKCByYWRpbyApIHtcbiAgICAgICAgaWYgKCByYWRpby5kYXRhc2V0LmluaXRpYWxWYWx1ZSA9PSAndHJ1ZScgKSByYWRpb0luaXRpYWwgPSBnZXRMYWJlbC50ZXh0KCByYWRpbyApXG4gICAgICAgIGlmICggcmFkaW8uY2hlY2tlZCApIGRpZmYudmFsdWUucHVzaCggZ2V0TGFiZWwudGV4dCggcmFkaW8gKSApXG4gICAgICB9KVxuXG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggcmFkaW9Jbml0aWFsIHx8ICdubyBzZWxlY3Rpb24nIClcblxuICAgIC8vIFRyYWNrIGNoZWNrZWQgc3RhdGUgZm9yIGNoZWNrYm94ZXMgKHJhdGhlciB0aGFuIHZhbHVlKVxuICAgIH0gZWxzZSBpZiAoIGlucHV0LnR5cGUgPT0gJ2NoZWNrYm94JyApIHtcbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSApXG4gICAgICBkaWZmLnZhbHVlLnB1c2goIGlucHV0LmNoZWNrZWQgKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBpbnB1dC52YWx1ZSApXG4gICAgfVxuXG4gICAgaWYoaW5wdXQuZGF0YXNldC5kaWZmTm90ZSkgZGlmZi5ub3RlLnB1c2goaW5wdXQuZGF0YXNldC5kaWZmTm90ZSlcbiAgICBpZihpbnB1dC5kYXRhc2V0LmRpZmZDbGFzcykgZGlmZlsnY2xhc3MnXS5wdXNoKGlucHV0LmRhdGFzZXQuZGlmZkNsYXNzKVxuXG4gICAgaWYgKCBpbnB1dC50eXBlID09ICdyYW5nZScgJiYgaW5wdXQubmFtZSA9PSAnJyAmJiBpbnB1dC5kYXRhc2V0LmlucHV0ICkge1xuICAgICAgZGlmZi5uYW1lLnB1c2goIGlucHV0LmRhdGFzZXQuaW5wdXQgKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmLm5hbWUucHVzaCggaW5wdXQubmFtZSApXG4gICAgfVxuICAgIGRpZmYuc2VsZWN0b3IucHVzaCggaW5wdXQuZGF0YXNldC5mb3JtRGlmZklkIClcbiAgfSlcblxuICBkaWZmLmluaXRpYWwgPSBkaWZmLmluaXRpYWwuam9pbignICcpXG4gIGRpZmYudmFsdWUgPSBkaWZmLnZhbHVlLmpvaW4oJyAnKVxuICBkaWZmLm5hbWUgPSBkaWZmLm5hbWUuam9pbignICcpXG4gIGRpZmYuc2VsZWN0b3IgPSBkaWZmLnNlbGVjdG9yLm1hcCggZnVuY3Rpb24gKCBzICkgeyByZXR1cm4gYFtkYXRhLWZvcm0tZGlmZi1pZD1cIiR7c31cIl1gIH0gKS5qb2luKCcsICcpXG5cbiAgcmV0dXJuIGRpZmZcbn1cblxuXG5mdW5jdGlvbiB3YXRjaCAoZGVsYXkpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICBpbnB1dENoYW5nZS53YXRjaCgpXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2hhbmdlJywgJ2Zvcm1bZGF0YS1kaWZmLXRhcmdldF0nLCBFdmVudC5kZWJvdW5jZSggZGlmZkZvcm0sIGRlbGF5IHx8IDEwMCApIClcblxuICAgIC8vIEhpZGUgZW1wdHkgZm9ybS1kaWZmc1xuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm1bZGF0YS1kaWZmLXRhcmdldF0nICksIHRvZ2dsZURpZmZFbHMgKVxuXG4gICAgaWYgKCAhZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyNmb3JtLWRpZmYtaGlkZGVuJyApIClcbiAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCAnPHN0eWxlIGlkPVwiZm9ybS1kaWZmLWhpZGRlblwiPi5mb3JtLWRpZmYtaGlkZGVueyBkaXNwbGF5OiBub25lIH08L3N0eWxlPicpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0cmFjdERhdGEgKGVsLCBwYXR0ZXJuKSB7XG4gIHZhciBkYXRhID0ge31cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgIHZhciBuYW1lID0gZWwuYXR0cmlidXRlc1tpXS5ub2RlTmFtZVxuXG4gICAgaWYobmV3IFJlZ0V4cChcIl5cIitwYXR0ZXJuKS50ZXN0KG5hbWUpKSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKHBhdHRlcm4sICcnKS5yZXBsYWNlKC9eLS8sJycpXG4gICAgICBkYXRhW25hbWVdID0gZWwuYXR0cmlidXRlc1tpXS5ub2RlVmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcblxuZnVuY3Rpb24gZ2V0SW5wdXQgKCBpbnB1dCApIHtcbiAgaWYgKCB0eXBlb2YgaW5wdXQgPT0gJ3N0cmluZycgKSBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGlucHV0IClcbiAgcmV0dXJuIGlucHV0XG59XG5cbmZ1bmN0aW9uIGdldExhYmVsICggaW5wdXQgKSB7XG5cbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKVxuICBpZiAoIWlucHV0KSByZXR1cm5cblxuICAvLyBMYWJlbCB3cmFwcyBpbnB1dFxuICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnICkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggYGxhYmVsW2Zvcj1cIiR7aW5wdXQuaWR9XCJdYCApXG5cbiAgcmV0dXJuIGxhYmVsXG59XG5cbmZ1bmN0aW9uIGdldEFyaWFMYWJlbCggaW5wdXQgKSB7XG4gIGlucHV0ID0gZ2V0SW5wdXQoIGlucHV0ICk7IGlmICghaW5wdXQpIHJldHVyblxuICB2YXIgbGFiZWwgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKVxuICB2YXIgbGFiZWxsZWRCeSA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWxsZWRieScgKVxuXG4gIGlmICggIWxhYmVsICYmIGxhYmVsbGVkQnkgKSB7XG5cbiAgICAvLyBhcmlhLWxhYmVsbGVkYnk9J3NvbWVJRCBhbm90aGVySUQnIG11c3QgcmVhZCBtdWx0aXBsZSBlbGVtZW50cyB0ZXh0IGNvbnRlbnQuXG4gICAgLy8gVGhpcyBjcmVhdGVzIGEgc2VsZWN0b3IgKHByZXBlbmRpbmcgdGhlICcjJyBiZWZvcmUgZWFjaCkgdG8gZmluZCB0aGUgbGFiZWxzLlxuICAgIC8vXG4gICAgdmFyIHNlbGVjdG9yID0gbGFiZWxsZWRCeS5zcGxpdCgnICcpLm1hcCggZnVuY3Rpb24gKCBuYW1lICkgeyByZXR1cm4gJyMnK25hbWUgfSApXG5cbiAgICB2YXIgbGFiZWxUZXh0ID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKCBzZWxlY3RvciwgZnVuY3Rpb24oIHMgKSB7IFxuICAgICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggcyApXG4gICAgICBpZiAoIGVsICkgcmV0dXJuIGVsLnRleHRDb250ZW50XG4gICAgICBlbHNlIHJldHVybiBmYWxzZVxuICAgIH0pLmZpbHRlciggZnVuY3Rpb24gKCBlICkgeyByZXR1cm4gZSAhPSBmYWxzZSB9IClcblxuICAgIGlmICggbGFiZWxUZXh0ICkgbGFiZWwgPSBsYWJlbFRleHQuam9pbignICcpXG4gIH1cblxuICByZXR1cm4gbGFiZWxcbn1cblxuLy8gQXJlIGlucHV0cyBpbiBhIGZpZWxkc2V0IHdpdGggYSBsZWdlbmQ/XG4vLyBVc2UgdGhhdCBhcyB0aGUgbGFiZWwgdGV4dFxuZnVuY3Rpb24gZ2V0TGVnZW5kVGV4dCAoIGlucHV0ICkge1xuICBpbnB1dCA9IGdldElucHV0KCBpbnB1dCApOyBpZiAoIWlucHV0KSByZXR1cm5cbiAgdmFyIGxlZ2VuZFRleHRcblxuICB2YXIgZmllbGRzZXQgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZmllbGRzZXQnIClcblxuICBpZiAoIGZpZWxkc2V0ICkge1xuICAgIHZhciBsZWdlbmQgPSBmaWVsZHNldC5xdWVyeVNlbGVjdG9yKCAnbGVnZW5kJyApXG4gICAgaWYgKCBsZWdlbmQgKSBsZWdlbmRUZXh0ID0gbGVnZW5kLnRleHRDb250ZW50LnRyaW0oKVxuICB9XG5cbiAgcmV0dXJuIGxlZ2VuZFRleHRcbn1cblxuXG5mdW5jdGlvbiBnZXRMYWJlbFRleHQgKCBpbnB1dCApIHtcbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKTsgaWYgKCFpbnB1dCkgcmV0dXJuXG5cbiAgdmFyIGxhYmVsID0gZ2V0TGFiZWwoIGlucHV0IClcblxuICAvLyBHcmFiIHRleHQgZnJvbSBpbnB1dCBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnlcbiAgdmFyIGxhYmVsVGV4dCA9IGdldEFyaWFMYWJlbCggaW5wdXQgKVxuXG4gIC8vIFVzZSBvciBsYWJlbC50ZXh0Q29udGVudCwgb3IgaW5wdXQgcGxhY2Vob2xkZXI9XCJcIlxuICBpZiAoICFsYWJlbFRleHQgKSB7XG4gICAgaWYgKGxhYmVsKSBsYWJlbFRleHQgPSBsYWJlbC50ZXh0Q29udGVudFxuXG4gICAgZWxzZSBsYWJlbFRleHQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICdwbGFjZWhvbGRlcicgKVxuICB9XG5cbiAgaWYgKCBsYWJlbFRleHQgKSByZXR1cm4gbGFiZWxUZXh0LnRyaW0oKVxufVxuXG5nZXRMYWJlbC50ZXh0ID0gZ2V0TGFiZWxUZXh0XG5nZXRMYWJlbC5sZWdlbmQgPSBnZXRMZWdlbmRUZXh0XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TGFiZWxcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnICksXG4gICAgaW5wdXRTZWxlY3RvcnMgPSByZXF1aXJlKCAnLi9zZWxlY3RvcicgKSxcbiAgICB3YXRjaGluZyA9IGZhbHNlXG5cbmZ1bmN0aW9uIGlucHV0SW5pdCggaW5wdXQgKSB7XG4gIGlucHV0LmNsYXNzTGlzdC50b2dnbGUoICdlbXB0eScsICFpbnB1dC52YWx1ZS50cmltKCkubGVuZ3RoIClcbiAgaWYgKCBpbnB1dC50eXBlID09ICdyYWRpbycgfHwgaW5wdXQudHlwZSA9PSAnY2hlY2tib3gnICkge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQuY2hlY2tlZFxuICB9IGVsc2Uge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQudmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnB1dENoYW5nZSggaW5wdXQgKSB7XG4gIC8vIEFsbG93IGNhbGxpbmcgZnJvbSBldmVudCBoYW5kbGVyXG4gIHZhciBpbnB1dCA9ICggaW5wdXQudGFyZ2V0IHx8IGlucHV0IClcblxuICAvLyBJZiBlbGVtZW50IGlzIGVtcHR5IChvciBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gIC8vIEFkZCBlbXB0eSBjbGFzc1xuICBpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCAnZW1wdHknLCAhaW5wdXQudmFsdWUudHJpbSgpLmxlbmd0aCApXG5cbiAgY2hhbmdlQ2xhc3NlcyggaW5wdXQgKVxuICB0cmFja1N0YXRlKCBpbnB1dCApXG5cbiAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICBpZiAoIGZvcm0gKSB7XG4gICAgRXZlbnQuZmlyZSggZm9ybSwgJ2NoYW5nZScgKVxuICB9XG59XG5cbi8vIEFkZCAnaW5jcmVhc2VkJywgJ2RlY3JlYXNlZCcsIGFuZCAnaW5pdGlhbCcgc3RhdGVzIHRvIGlucHV0IHBhcmVudFxuLy8gb3IgZWxlbWVudHMgc2V0IHVwIHRvIHRyYWNrIGlucHV0IHN0YXRlXG5mdW5jdGlvbiB0cmFja1N0YXRlKCBpbnB1dCApIHtcbiAgaWYgKCBpbnB1dC50eXBlLm1hdGNoKC9yYW5nZXxudW1iZXIvKSApIHtcbiAgICBjaGFuZ2UgPSBnZXRDaGFuZ2UoIE51bWJlcihpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSksIE51bWJlcihpbnB1dC52YWx1ZSkgKVxuXG4gICAgaW5wdXQuZGF0YXNldC5pbnB1dFN0YXRlID0gY2hhbmdlXG5cbiAgICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnIClcbiAgICBpZiAoIGxhYmVsICkgbGFiZWwuZGF0YXNldC5pbnB1dFN0YXRlID0gY2hhbmdlXG5cbiAgICB2YXIgc3RhdGVFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS10cmFjay1pbnB1dC1zdGF0ZT1cIiMnK2lucHV0LmlkKydcIl0nIClcbiAgICB0b29sYm94LmVhY2goIHN0YXRlRWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICBlbC5kYXRhc2V0LmlucHV0U3RhdGUgPSBjaGFuZ2VcbiAgICB9KVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlQ2xhc3NlcyggaW5wdXQsIHJlY3Vyc2l2ZSApIHtcbiAgdmFyIGNoYW5nZWRcbiAgdmFyIGRlZmF1bHRlZFxuXG4gIGlmICggaW5wdXQudHlwZSA9PSAncmFkaW8nICYmICFyZWN1cnNpdmUgKSB7XG4gICAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICAgIGlmICggZm9ybSApIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoIGBbbmFtZT0nJHtpbnB1dC5uYW1lfSddYCApLCBmdW5jdGlvbiAoIGUgKSB7XG4gICAgICAgIGNoYW5nZUNsYXNzZXMoIGUsIHRydWUgKVxuICAgICAgfSlcbiAgICB9IFxuICB9IGVsc2UgaWYgKCBpbnB1dC50eXBlID09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgIGNoYW5nZWQgPSBTdHJpbmcoIGlucHV0LmNoZWNrZWQgKSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9IGVsc2Uge1xuICAgIGNoYW5nZWQgPSBpbnB1dC52YWx1ZSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9XG5cbiAgaW5wdXQuY2xhc3NMaXN0LnRvZ2dsZSggJ2NoYW5nZWQtdmFsdWUnLCBjaGFuZ2VkIClcbiAgXG4gIC8vIFJlbW92ZSBhbGwgZGVmYXVsdGVkIHZhbHVlIGNsYXNzbmFtZXMgb24gYW4gaW5wdXQgY2hhbmdlXG4gIGlucHV0LmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnIClcblxuICB2YXIgbGFiZWwgPSBnZXRMYWJlbCggaW5wdXQgKVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGhhc0NoYW5nZWRJbnB1dHMgPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCAnLmNoYW5nZWQtdmFsdWUnICkgfHwgaW5wdXQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnY2hhbmdlZC12YWx1ZScgKVxuICAgIGxhYmVsLmNsYXNzTGlzdC50b2dnbGUoICdpbnB1dC1jaGFuZ2VkLXZhbHVlJywgaGFzQ2hhbmdlZElucHV0cyApXG5cbiAgICAvLyBSZW1vdmUgYWxsIGRlZmF1bHRlZCB2YWx1ZSBjbGFzc25hbWVzIG9uIGFuIGlucHV0IGNoYW5nZVxuICAgIHRvb2xib3guZWFjaCggbGFiZWwucXVlcnlTZWxlY3RvckFsbCggJy5kZWZhdWx0ZWQtdmFsdWUnICksIGZ1bmN0aW9uICggZWwgKSB7IGVsLmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnICkgfSApXG4gICAgbGFiZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2lucHV0LWRlZmF1bHRlZC12YWx1ZScgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoICgpIHtcbiAgaWYgKCB3YXRjaGluZyApIHsgcmV0dXJuIH1cbiAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZVxuICBFdmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggaW5wdXRTZWxlY3RvcnMgKSwgaW5wdXRJbml0IClcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9cmFuZ2VdLGlucHV0W3R5cGU9bnVtYmVyXScpLCB0cmFja1N0YXRlIClcbiAgfSlcblxuICAvLyBTZXQgaW5wdXQgc3RhdGUgb24gaW5wdXRcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCBpbnB1dFNlbGVjdG9ycywgaW5wdXRDaGFuZ2UgKVxuXG4gIC8vIEZvcm0ucmVzZXQoKSBkb2Vzbid0IGZpcmUgaW5wdXQgZXZlbnRzLiBUaGlzIGVuc3VyZXMgdGhvc2UgZXZlbnRzIGFyZSBmaXJlZC5cbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW3R5cGU9cmVzZXRdJywgcmVzZXRGb3JtIClcblxuICB3YXRjaGluZyA9IHRydWVcbn1cblxuLy8gUmV0dXJuIHN0cmluZyAnaW5jcmVhc2VkJywgJ2RlY3JlYXNlZCcsIG9yICdpbml0aWFsJ1xuLy8gZGVwZW5kaW5nIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXG4vLyBjdXJyZW50IHZhbHVlIGFuZCBpbml0aWFsXG5mdW5jdGlvbiBnZXRDaGFuZ2UoIGluaXRpYWwsIHZhbHVlICkge1xuICB2YXIgaW5pdGlhbCA9IE51bWJlcihpbml0aWFsKVxuXG4gIGlmICggaW5pdGlhbCA8IHZhbHVlICkge1xuICAgIHJldHVybiBcImluY3JlYXNlZFwiXG4gIH0gZWxzZSBpZiAoIHZhbHVlIDwgaW5pdGlhbCApIHtcbiAgICByZXR1cm4gXCJkZWNyZWFzZWRcIlxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcImluaXRpYWxcIlxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Rm9ybShldmVudCkge1xuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdChldmVudC50YXJnZXQsICdmb3JtJylcblxuICBFdmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQuaW5wdXQtY2hhbmdlZCwgc2VsZWN0LmlucHV0LWNoYW5nZWQsIHRleHRhcmVhLmlucHV0LWNoYW5nZWQgJyksIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgIEV2ZW50LmZpcmUoIGVsLCAnaW5wdXQnIClcbiAgICB9KVxuICB9LCAxMDAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2F0Y2g6IHdhdGNoXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9iamVjdFNpemUgKG9iamVjdCkge1xuICB2YXIgbGVuZ3RoID0gMDsgZm9yKHZhciBpIGluIG9iamVjdCkgeyBsZW5ndGgrKyB9XG4gIHJldHVybiBsZW5ndGhcbn1cbiIsInZhciB0b29sYm94ICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIENhbGxiYWNrID0gdG9vbGJveC5ldmVudC5jYWxsYmFjayxcbiAgICBmb3JtU2VsZWN0b3IgPSAnZm9ybS5wcm9ncmVzc2l2ZScsXG4gICAgd2F0Y2hpbmcgPSBmYWxzZSxcbiAgICBmb3JtQ2FsbGJhY2tzLFxuICAgIHJlZ2lzdGVyZWRGb3Jtc1xuXG4vLyBSZW1vdmUgYW55IGV4aXN0aW5nIGNhbGxiYWNrcyBhbmQgcmVnaXN0ZXJlZCBmb3Jtc1xuZnVuY3Rpb24gcmVzZXQgKCkge1xuXG4gIGZvcm1DYWxsYmFja3MgPSB7IG5leHQ6IFtdIH1cbiAgcmVnaXN0ZXJlZEZvcm1zID0gW11cblxufVxuXG5mdW5jdGlvbiBuZXdGb3JtKCBmb3JtICkge1xuXG4gIGlmICggIWZvcm0gKSByZXR1cm5cblxuICB2YXIgc3RlcHMgICAgID0gdG9vbGJveC5zbGljZSggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZvcm0tc3RlcCcgKSApLFxuICAgICAgc3RlcEluZGV4ID0gMCxcbiAgICAgIG5hdkl0ZW1zICA9ICcnXG5cbiAgaWYgKCBzdGVwcy5sZW5ndGggPT0gMCApIHJldHVyblxuXG5cbiAgc3RlcHMuZm9yRWFjaCggZnVuY3Rpb24oIHN0ZXAsIGluZGV4ICkgeyBcblxuICAgIC8vIGRpc2FibGUgYWxsIHN0ZXBzIGJ1dCB0aGUgY3VycmVudCBzdGVwXG4gICAgc3RlcC5kaXNhYmxlZCAgICAgPSBzdGVwICE9IGN1cnJlbnRTdGVwKClcbiAgICBzdGVwLmRhdGFzZXQuc3RlcCA9IGluZGV4XG5cbiAgfSlcblxuICBpZiAoIGZvcm0uZGF0YXNldC5uYXYgKSB7XG4gICAgdmFyIG5hdiA9ICc8bmF2IGNsYXNzPVwicHJvZ3Jlc3NpdmUtZm9ybS1uYXZcIj4nXG5cbiAgICBzdGVwcy5mb3JFYWNoKCBmdW5jdGlvbiggc3RlcCwgaW5kZXggKSB7XG4gICAgICBuYXYgKz0gJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwcm9ncmVzc2l2ZS1mb3JtLW5hdi1pdGVtXCIgZGF0YS1zdGVwPVwiJysoIGluZGV4ICsgMSApKydcIj4nXG4gICAgICBuYXYgKz0gc3RlcC5kYXRhc2V0Lm5hdiB8fCBcIlN0ZXAgXCIgKyAoIGluZGV4ICsgMSApXG4gICAgICBuYXYgKz0gJzwvYT4gJ1xuICAgIH0pXG5cbiAgICBuYXYgKz0gJzwvbmF2PidcblxuICAgIGZvcm0uaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJiZWdpbicsIG5hdiApXG4gIH1cblxuICBzaG93KClcblxuICBmdW5jdGlvbiBwcmV2aW91c1N0ZXAgKCkgIHsgcmV0dXJuIHN0ZXBzWyBzdGVwSW5kZXggLSAxXSB9XG4gIGZ1bmN0aW9uIGN1cnJlbnRTdGVwICgpICAgeyByZXR1cm4gc3RlcHNbIHN0ZXBJbmRleCBdIH1cbiAgZnVuY3Rpb24gbmV4dFN0ZXAgKCkgICAgICB7IHJldHVybiBzdGVwc1sgc3RlcEluZGV4ICsgMV0gfVxuICBmdW5jdGlvbiBhY3RpdmUgKCkgICAgICAgIHsgcmV0dXJuIGN1cnJlbnRTdGVwKCkgJiYgIWN1cnJlbnRTdGVwKCkuZGlzYWJsZWQgfVxuIFxuICAvLyBNb3ZlIHRvIG5leHQgZmllbGRzZXRcbiAgZnVuY3Rpb24gZm9yd2FyZCAoKSB7XG4gICAgc2hvd1N0ZXAoIHN0ZXBJbmRleCArIDEgKVxuICB9XG5cbiAgLy8gTW92ZSB0byBuZXh0IGZpZWxkc2V0XG4gIGZ1bmN0aW9uIGJhY2sgKCkge1xuICAgIHNob3dTdGVwKCBzdGVwSW5kZXggLSAxIClcbiAgfVxuXG4gIC8vIEFjY2VwdHMgYSBzdGVwIGluZGV4XG4gIGZ1bmN0aW9uIHNob3dTdGVwICggaW5kZXggKSB7XG5cbiAgICBpbmRleCA9IE51bWJlciggaW5kZXggKVxuXG4gICAgLy8gR2V0IHRoZSBzdGVwIGZyb20gdGhlIGluZGV4XG4gICAgdmFyIHN0ZXAgPSBzdGVwc1sgaW5kZXggXVxuXG4gICAgLy8gRG9uJ3QgZ28gdG8gYSBub24tZXhpc3RhbnQgc3RlcCwgb3IgdGhlIGN1cnJlbnQgc3RlcFxuICAgIGlmICggc3RlcCAmJiBzdGVwICE9IGN1cnJlbnRTdGVwKCkgKSB7XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSAoIHN0ZXBJbmRleCA8IGluZGV4ICkgPyAnZm9yd2FyZCcgOiAncmV2ZXJzZSdcblxuICAgICAgLy8gSWYgYSBzdGVwIGlzIGN1cnJlbnRseSBhY3RpdmVcbiAgICAgIC8vIGRpc21pc3MgaXQgYmVmb3JlIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RlcFxuICAgICAgaWYgKCBhY3RpdmUoKSApIHtcbiAgICAgICAgcmV0dXJuIGRpc21pc3MoIGZ1bmN0aW9uKCkgeyBzaG93U3RlcCggaW5kZXggKSB9LCBkaXJlY3Rpb24gKVxuICAgICAgfVxuXG4gICAgICBzdGVwSW5kZXggPSBpbmRleFxuXG4gICAgICBzaG93KCBkaXJlY3Rpb24gKVxuXG4gICAgfVxuICB9XG4gIFxuICAvLyBIaWRlIGEgY29tcGxldGVkIHN0ZXAgYW5kIG1vdmUgdG8gdGhlIG5leHRcbiAgZnVuY3Rpb24gZGlzbWlzcyAoIGNhbGxiYWNrLCBkaXJlY3Rpb24gKSB7XG4gICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8ICdmb3J3YXJkJ1xuXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlJywgJ2VudGVyJyApXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnZXhpdCcgKVxuICAgIGN1cnJlbnRTdGVwKCkuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBjdXJyZW50U3RlcCgpLCBmdW5jdGlvbigpIHtcbiAgICAgIGRpc2FibGUoKVxuXG4gICAgICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIGNhbGxiYWNrKClcblxuICAgIH0sIDIwKVxuXG4gIH1cblxuICBmdW5jdGlvbiByZXZpc2l0ICggY2FsbGJhY2ssIGRpcmVjdGlvbiApIHtcblxuICAgIGlmICggIWFjdGl2ZSgpICkge1xuICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8ICdyZXZlcnNlJ1xuXG4gICAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5yZW1vdmUoICdleGl0JywgJ2NvbXBsZXRlZCcgKVxuICAgICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlJywgJ2VudGVyJyApXG4gICAgICBjdXJyZW50U3RlcCgpLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgIGRpc2FibGVPdGhlckZpZWxkc2V0cygpXG5cbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBjdXJyZW50U3RlcCgpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgKSBjYWxsYmFjaygpXG4gICAgICB9LCAyMClcbiAgICB9XG4gIH1cblxuICAvLyBTaG93IHRoZSBmb3JtLXN0ZXBcbiAgZnVuY3Rpb24gc2hvdyAoIGRpcmVjdGlvbiApIHtcblxuICAgIGRpc2FibGVPdGhlckZpZWxkc2V0cygpXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnY29tcGxldGVkJyApXG4gICAgY3VycmVudFN0ZXAoKS5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LmFkZCggJ2FjdGl2ZScsICdlbnRlcicgKVxuXG4gICAgLy8gZm9jdXMgb24gdGhlIGZpcnN0IGlucHV0XG4gICAgdmFyIGZpcnN0SW5wdXQgPSBjdXJyZW50U3RlcCgpLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dDpub3QoW2hpZGRlbl0pLCB0ZXh0YXJlYSwgc2VsZWN0JyApXG4gICAgaWYgKCBmaXJzdElucHV0ICkgZmlyc3RJbnB1dC5mb2N1cygpXG5cbiAgICBzZXROYXYoKVxuXG4gIH1cblxuICAvLyBEaXNhYmxlIGEgZm9ybSBzdGVwIGFmdGVyIGl0IGhhcyBiZWVuIGhpZGRlblxuICBmdW5jdGlvbiBkaXNhYmxlICgpIHtcblxuICAgIGN1cnJlbnRTdGVwKCkuZGlzYWJsZWQgPSB0cnVlXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnY29tcGxldGVkJyApXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInLCAnZXhpdCcgKVxuXG4gIH1cblxuICBmdW5jdGlvbiBzZXROYXYgKCkge1xuICAgIHRvb2xib3guZWFjaCggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnbmF2IFtkYXRhLXN0ZXBdJyApLCBmdW5jdGlvbiAoIG5hdiApIHtcblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwIDwgc3RlcEluZGV4ICsgMSApIHtcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5yZW1vdmUoICdoZXJlJywgJ25leHQnIClcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoICdwcmV2aW91cycsICdjb21wbGV0ZWQnIClcbiAgICAgIH1cblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwID09IHN0ZXBJbmRleCArIDEgKSB7XG4gICAgICAgIG5hdi5jbGFzc0xpc3QucmVtb3ZlKCAncHJldmlvdXMnLCAnbmV4dCcgKVxuICAgICAgICBuYXYuY2xhc3NMaXN0LmFkZCggJ2hlcmUnIClcbiAgICAgIH1cblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwID4gc3RlcEluZGV4ICsgMSApIHtcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5yZW1vdmUoICdwcmV2aW91cycsICdoZXJlJyApXG4gICAgICAgIG5hdi5jbGFzc0xpc3QuYWRkKCAnbmV4dCcgKVxuICAgICAgfVxuXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuYWJsZUZpZWxkc2V0cyAoIGZvcm0gKSB7XG4gICAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICdmaWVsZHNldC5mb3JtLXN0ZXBbZGlzYWJsZWRdJyApLCBmdW5jdGlvbiggZmllbGRzZXQgKSB7XG4gICAgICBmaWVsZHNldC5kaXNhYmxlZCA9IGZhbHNlIFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBkaXNhYmxlT3RoZXJGaWVsZHNldHMgKCApIHtcbiAgICBzdGVwcy5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGRzZXQgKSB7XG4gICAgICBmaWVsZHNldC5kaXNhYmxlZCA9IGZpZWxkc2V0ICE9IGN1cnJlbnRTdGVwKCkgXG4gICAgfSlcbiAgfVxuXG4gIHJlZ2lzdGVyZWRGb3Jtcy5wdXNoKCBmdW5jdGlvbiggZXZlbnQsIHRyaWdnZXIgKSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICAgIGlmICggdHJpZ2dlciA9PT0gJ3Nob3ctc3RlcCcgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCB0YXJnZXQsICcucHJldmlvdXMsIC5jb21wbGV0ZWQsIC5jb21wbGV0ZWQgKyBhJyApIClcbiAgICAgICAgc2hvd1N0ZXAoIHRhcmdldC5kYXRhc2V0LnN0ZXAgLSAxIClcblxuICAgIH0gZWxzZSBpZiAoIHRyaWdnZXIgPT09ICduZXh0JyApIHtcblxuICAgICAgLy8gQ29udGludWUgaWYgc3VibWl0IHdhcyB0cmlnZ2VyZWQgb24gdGhpcyBmb3JtXG4gICAgICAvLyBhbmQgbm8gaW52YWxpZCBmaWVsZHMgYXJlIGZvdW5kXG5cbiAgICAgIHZhciBmb3JtRWwgPSAoIHRhcmdldC50YWdOYW1lID09IFwiRk9STVwiICkgPyB0YXJnZXQgOiB0b29sYm94LmdldENsb3Nlc3QoIHRhcmdldCwgJ2Zvcm0nKVxuXG4gICAgICBpZiAoIGZvcm0gPT0gZm9ybUVsICYmICFjdXJyZW50U3RlcCgpLnF1ZXJ5U2VsZWN0b3IoICc6aW52YWxpZCcgKSApIHtcblxuICAgICAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHdoaWNoIHRyaWdnZXJzIGNhbGxiYWNrc1xuICAgICAgICB2YXIgZmlyZUNhbGxiYWNrcyA9IGdldENhbGxiYWNrcyggZm9ybSApXG5cbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBzdG9wLCBiZSBzdXJlIGFsbCBmaWVsZHNldHMgYXJlIGVuYWJsZWQhXG4gICAgICAgIGlmICggIW5leHRTdGVwKCkgKSBlbmFibGVGaWVsZHNldHMoIGZvcm0gKVxuICAgICAgICBlbHNlIGRpc2FibGVPdGhlckZpZWxkc2V0cyggZm9ybSApXG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGNhbGxiYWNrcywgbGV0IHRoZW0gaGFuZGxlIHRoaXMhXG4gICAgICAgIGlmICggZmlyZUNhbGxiYWNrcyApIHtcblxuICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBjYWxsYmFja3MsIHN0b3AgdGhlIHN1Ym1pc3Npb24gZXZlbnRcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgICBmaXJlQ2FsbGJhY2tzKCBldmVudCwge1xuICAgICAgICAgICAgZmllbGRzZXQ6IGN1cnJlbnRTdGVwKCksICAvLyBWYWxpZCBmaWVsZHNldCBlbGVtZW50XG4gICAgICAgICAgICBmb3JtOiAgICAgZm9ybSwgICAgICAgICAgIC8vIFBhcmVudCBmb3JtIGVsZW1lbnRcbiAgICAgICAgICAgIGZvcndhcmQ6ICBmb3J3YXJkLCAgICAgICAgLy8gQ2FsbCBmb3J3YXJkKCkgdG8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZHNldFxuICAgICAgICAgICAgZGlzbWlzczogIGRpc21pc3MsICAgICAgICAvLyBIaWRlIGFuZCBkaXNhYmxlIGN1cnJlbnQgc3RlcFxuICAgICAgICAgICAgcmV2aXNpdDogIHJldmlzaXQsICAgICAgICAvLyBSZXZpc2l0IGN1cnJlbnQgZGlzYWJsZWQgc3RlcFxuICAgICAgICAgICAgc2hvd1N0ZXA6IHNob3dTdGVwLCAgICAgICAvLyBTaG93IGEgc3BlY2lmaWMgc3RlcCBieSBpbmRleCAoMCBiYXNlZClcbiAgICAgICAgICAgIGNvbXBsZXRlOiAhbmV4dFN0ZXAoKSwgICAgLy8gaXMgdGhpcyBpcyB0aGUgZmluYWwgZm9ybSBzdGVwP1xuICAgICAgICAgICAgZm9ybURhdGE6IHRvb2xib3guZm9ybURhdGEoIGN1cnJlbnRTdGVwKCkgKSAvLyBwYXNzIEZvcm1EYXRhIGZvciBjdXJyZW50IGZpZWxkc2V0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNhbGxiYWNrcz8gSWYgdGhlcmUncyBhIG5leHQgc3RlcCwgc3RvcCBzdWJtaXNzaW9uIGFuZCBwcm9jZWVkXG4gICAgICAgIGVsc2UgaWYgKCBuZXh0U3RlcCgpICkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgXG4gICAgICAgICAgZm9yd2FyZCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpcmUgKCBldmVudCwgdHlwZSApIHtcbiAgcmVnaXN0ZXJlZEZvcm1zLmZvckVhY2goIGZ1bmN0aW9uKCBmbiApIHsgZm4oIGV2ZW50LCB0eXBlICkgfSlcbn1cblxuXG4vLyBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggdHJpZ2dlcnMgY2FsbGJhY2tzXG5mdW5jdGlvbiBnZXRDYWxsYmFja3MgKCBmb3JtLCB0eXBlICkge1xuXG4gIHR5cGUgPSB0eXBlIHx8ICduZXh0J1xuICB2YXIgY2FsbGJhY2tzID0gW10sIGNiO1xuXG4gIGZvcm1DYWxsYmFja3NbIHR5cGUgXS5mb3JFYWNoKCBmdW5jdGlvbiggdGVzdCApIHtcbiAgICAgaWYgKCBjYiA9IHRlc3QoIGZvcm0gKSApIHtcbiAgICAgICBjYWxsYmFja3MucHVzaCggY2IgKVxuICAgICB9XG4gIH0pXG5cbiAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggY2FuIHRyaWdnZXIgYWxsIGNhbGxiYWNrc1xuICAvLyBvciByZXR1cm5zIGZhbGxzZSBpZiBub25lIGFyZSBjYWxsZWRcblxuICBpZiAoIGNhbGxiYWNrcy5sZW5ndGggKVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBhcmdzID0gdG9vbGJveC5zbGljZSggYXJndW1lbnRzIClcblxuICAgICAgY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoIGNhbGxiYWNrLCBhcmdzICkgfSkgfVxuXG4gIGVsc2UgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIG5leHQgKCBlbCwgY2FsbGJhY2sgKSB7XG4gIG9uKCBlbCwgJ25leHQnLCBjYWxsYmFjayApXG59XG5cbmZ1bmN0aW9uIG9uICggZWwsIGV2ZW50LCBjYWxsYmFjayApIHtcblxuICAvLyBBY2NlcHQgZXZlbnRzIGxpc3QgYXMgYW4gb2JqZWN0IGUuZy4geyBuZXh0OiBjYWxsYmFjayB9XG4gIGlmICggdHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyApIHtcbiAgICBmb3IgKCB0eXBlIGluIGV2ZW50ICkge1xuICAgICAgb24oIGVsLCB0eXBlLCBldmVudFsgdHlwZSBdIClcbiAgICB9XG4gIH1cblxuICBlbHNlIGlmICggZm9ybUNhbGxiYWNrc1sgZXZlbnQgXSApIHtcblxuICAgIC8vIE9ubHkgYWxsb3cgYWNjZXNzIHRvIGEgY2FsbGJhY2sgaWYgdGhlIGZvcm0gbWF0Y2hlc1xuICAgIHZhciBmaWx0ZXIgPSBmdW5jdGlvbiggZm9ybSApIHtcbiAgICAgIGlmICggZm9ybSA9PSBlbCApIHJldHVybiBjYWxsYmFja1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdGVzdCB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRoZSBjYWxsYmFjayBsaXN0XG4gICAgZm9ybUNhbGxiYWNrc1sgZXZlbnQgXS5wdXNoKCBmaWx0ZXIgKVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpe1xuICByZXNldCgpXG5cbiAgLy8gQWRkIGJ1YmJsaW5nIHNvIHdlIGNhbiBsaXN0ZW4gZm9yIHN1Ym1pc3Npb25cbiAgRXZlbnQuYnViYmxlRm9ybUV2ZW50cygpXG5cbiAgdmFyIG5leHRTZWxlY3RvciA9IGZvcm1TZWxlY3RvciArICcgW3R5cGU9c3VibWl0XSwgJyArIGZvcm1TZWxlY3RvciArICcgLm5leHQtc3RlcCdcbiAgdmFyIGJhY2tTZWxlY3RvciA9IGZvcm1TZWxlY3RvciArICcgLmJhY2stc3RlcCdcbiAgdmFyIG5hdlNlbGVjdG9yICA9ICcucHJvZ3Jlc3NpdmUtZm9ybS1uYXYtaXRlbVtkYXRhLXN0ZXBdJ1xuXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgbmV4dFNlbGVjdG9yICwgZmlyZSwgJ25leHQnIClcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCBiYWNrU2VsZWN0b3IgLCBmaXJlLCAnYmFjaycgKVxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsIG5hdlNlbGVjdG9yICAsIGZpcmUsICdzaG93LXN0ZXAnIClcbi8vIGluc2VydCBjb3JlIHN0eWxpbmcgZm9yIGhpZGluZyBkaXNhYmxlZCBhbmQgY29tcGxldGVkIGZvcm0tc3RlcHNcbiAgZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmVlbmQnLCBcIjxzdHlsZT5cXFxuLmZvcm0tc3RlcFtkaXNhYmxlZF0sIC5mb3JtLXN0ZXAuY29tcGxldGVkIHtcXFxuICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcXFxuICB0b3A6ICAgICAgLTk5OTlweCAgIWltcG9ydGFudDtcXFxuICBsZWZ0OiAgICAgLTk5OTlweCAgIWltcG9ydGFudDtcXFxuICBsZWZ0OiAgICAgMCAgICAgICAgIWltcG9ydGFudDtcXFxuICByaWdodDogICAgMCAgICAgICAgIWltcG9ydGFudDsgfVxcXG48L3N0eWxlPlwiIClcblxuICBFdmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIHJlc2V0KClcblxuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggZm9ybVNlbGVjdG9yICksIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgIG5ld0Zvcm0oIGVsIClcbiAgICB9KVxuICB9KVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG5leHQ6IG5leHQsXG4gIG5ldzogbmV3Rm9ybVxufVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSggJ2NvbXBvc2UtZXZlbnQnICksXG4gICAgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnIClcblxuZnVuY3Rpb24gcmVzZXRWYWx1ZSggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICB2YXIgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LnJlc2V0SW5wdXQgKVxuXG4gIHRvb2xib3guZWFjaCggaW5wdXRzLCBmdW5jdGlvbiAoIGkgKSB7XG4gICAgc2V0VmFsdWUoIGksIGkuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgLy8gVHJpZ2dlciBldmVudCB3YXRjaGVycyB0aGF0IHRoZSBpbnB1dCB3YXMgY2hhbmdlZC5cbiAgaWYgKCBpbnB1dC52YWx1ZSAhPSB2YWx1ZSApIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlXG4gICAgRXZlbnQuZmlyZSggaW5wdXQsICdpbnB1dCcgKVxuXG4gICAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICAgIEV2ZW50LmZpcmUoIGZvcm0sICdjaGFuZ2UnIClcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlRGVmYXVsdCggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICB2YXIgdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5yZXN0b3JlRGVmYXVsdCApXG5cbiAgdG9vbGJveC5lYWNoKCB0YXJnZXRzLCBmdW5jdGlvbiAoIGVsICkge1xuXG4gICAgLy8gUmVzdG9yZSB0byBkZWZhdWx0IGEgc2luZ2xlIGVsZW1lbnRcbiAgICBpZiAoIGVsLmRhdGFzZXQuZGVmYXVsdCApIHtcbiAgICAgIHNldERlZmF1bHQoIGVsIClcbiAgICB9IGVsc2UgaWYgKCBlbC5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG4gICAgICAvLyBSZXN0b3JlIGFsbCBpbnB1dHMgdG8gZGVmYXVsdCB3aGVuXG4gICAgICAvLyBkYXRhLXJlc3RvcmUtZGVmYXVsdCBwb2ludHMgdG8gYSBwYXJlbnQgZWxlbWVudFxuICAgICAgdG9vbGJveC5lYWNoKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtZGVmYXVsdF0nICksIHNldERlZmF1bHQgKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdCggZWwgKSB7XG4gIGlmICggZWwudHlwZSA9PSAncmFkaW8nIHx8IGVsLnR5cGUgPT0gJ2NoZWNrYm94JyApIHtcbiAgICBlbC5jaGVja2VkID0gdHJ1ZVxuICAgIEV2ZW50LmZpcmUoIGVsLCAnaW5wdXQnIClcbiAgfSBlbHNlIHtcbiAgICBzZXRWYWx1ZSggZWwsIGVsLmRhdGFzZXQuZGVmYXVsdCApXG4gIH1cblxuICBlbC5jbGFzc0xpc3QuYWRkKCAnZGVmYXVsdGVkLXZhbHVlJyApXG5cbiAgdmFyIGxhYmVsID0gZ2V0TGFiZWwoIGVsIClcbiAgaWYgKGxhYmVsKSBsYWJlbC5jbGFzc0xpc3QuYWRkKCAnaW5wdXQtZGVmYXVsdGVkLXZhbHVlJyApXG59XG5cbmZ1bmN0aW9uIHJlc2V0Rm9ybShldmVudCkge1xuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnZm9ybScgKVxuICBFdmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICcuY2hhbmdlZC12YWx1ZScgKSwgZnVuY3Rpb24oIGVsICkge1xuICAgICAgRXZlbnQuZmlyZSggZWwsICdpbnB1dCcgKVxuICAgIH0pXG4gIH0sIDEwMClcbn1cblxuRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtcmVzZXQtaW5wdXRdJywgcmVzZXRWYWx1ZSApXG5FdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1yZXN0b3JlLWRlZmF1bHRdJywgcmVzdG9yZURlZmF1bHQgKVxuRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW3R5cGU9cmVzZXRdJywgcmVzZXRGb3JtIClcbiIsIm1vZHVsZS5leHBvcnRzID0gJ2lucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwgc2VsZWN0LCB0ZXh0YXJlYSdcbiIsInZhciB0b29sYm94ICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGV4dHJhY3REYXRhID0gcmVxdWlyZSggJy4uL2V4dHJhY3QtZGF0YScgKSxcbiAgICBvYmplY3RTaXplICA9IHJlcXVpcmUoICcuLi9vYmplY3Qtc2l6ZScgKSxcbiAgICBoZWxwZXJzICAgICA9IHJlcXVpcmUoICcuL2hlbHBlcnMnICksXG4gICAgc3RlcEluZGV4ICAgPSByZXF1aXJlKCAnLi4vc3RlcC1pbmRleCcgKSxcbiAgICBFdmVudCAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIHNsaWRlcnMgICA9IFtdLFxuICAgIGxpc3RlbmluZyA9IGZhbHNlXG5cbmZ1bmN0aW9uIHdhdGNoICgpIHtcbiAgaWYgKCAhbGlzdGVuaW5nICkge1xuICAgIGxpc3RlbmluZyA9IHRydWVcblxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImlucHV0IHRvZ2dsZXI6c2hvd1wiLCBcIlt0eXBlPXJhbmdlXVwiLCBjaGFuZ2UsIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KVxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNsaWNrIGNoYW5nZSBpbnB1dFwiLCBcIlt0eXBlPXJhbmdlXVwiLCBmb2N1cywgeyB1c2VDYXB0dXJlOiB0cnVlIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9jdXMgKCBldmVudCApIHtcbiAgLy8gRG8gbm90IGZvY3VzIG9uIFwiYXJ0aWZpY2lhbGx5IHRyaWdnZXJlZFwiIGV2ZW50c1xuICBpZiAoIGV2ZW50LmlzVHJ1c3RlZCApIHsgZXZlbnQuY3VycmVudFRhcmdldC5mb2N1cygpIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlICggZXZlbnQgKSB7XG4gIC8vIEFsbG93cyB5b3UgdG8gcGFzcyBzbGlkZXIgZGlyZWN0bHkgdG8gY2hhbmdlKClcbiAgdmFyIHNsaWRlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnRcblxuICAvLyBEb24ndCB1cGRhdGUgaGlkZGVuIHNsaWRlcnNcbiAgaWYgKCBzbGlkZXIub2Zmc2V0UGFyZW50ICE9PSBudWxsICkge1xuICAgIHNldElucHV0KCBzbGlkZXIgKVxuICAgIHNldExhYmVscyggc2xpZGVyIClcbiAgICBzZXRGaWxsKCBzbGlkZXIgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGEgKCBzbGlkZXIgKSB7XG4gIGlmICh0eXBlb2Ygc2xpZGVyICE9ICdzdHJpbmcnICYmIHNsaWRlci5kYXRhc2V0KVxuICAgIHNsaWRlciA9IHNsaWRlci5kYXRhc2V0LnNsaWRlcklkXG5cbiAgcmV0dXJuIHNsaWRlcnNbc2xpZGVyXVxufVxuXG5mdW5jdGlvbiBzZXRJbnB1dCAoIHNsaWRlciApIHtcbiAgdmFyIGRhdGEgPSBnZXREYXRhKCBzbGlkZXIgKVxuICBcbiAgdmFyIHZhbHVlID0gZGF0YS52YWx1ZXNbIHNsaWRlci52YWx1ZSBdXG4gIHZhciBpbnB1dCA9IGhlbHBlcnMuZ2V0SW5wdXQoIHNsaWRlciApXG5cbiAgaWYoaW5wdXQpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlXG4gICAgaWYgKGlucHV0LnR5cGUgIT0gJ2hpZGRlbicpIEV2ZW50LmZpcmUoIGlucHV0LCAnaW5wdXQnIClcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRGaWxsICggc2xpZGVyICkge1xuICB2YXIgZGF0YSA9IGdldERhdGEoIHNsaWRlciApXG4gIHZhciB3cmFwcGVyID0gJyNzbGlkZXItaW5wdXQtJytzbGlkZXIuZGF0YXNldC5zbGlkZXJJZCsnLXdyYXBwZXInXG4gIHZhciBzZWdtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIHdyYXBwZXIgKyAnIC5zbGlkZXItc2VnbWVudCcpXG4gIHZhciBmaWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIHdyYXBwZXIgKyAnIC5zbGlkZXItZmlsbCcpXG4gIHZhciBpbmRleCA9IHN0ZXBJbmRleCggc2xpZGVyIClcbiAgXG4gIHRvb2xib3guZWFjaCggZmlsbHMsIGZ1bmN0aW9uKCBmaWxsLCBlbEluZGV4ICl7XG4gICAgXG4gICAgLy8gY29tcGFyZSBjdXJyZW50IGluZGV4IHRvIGZpbGwgZWxlbWVudCBpbmRleDogPHNwYW4gY2xhc3M9J3NsaWRlci1maWxsJyBkYXRhLWluZGV4PScxJz5cbiAgICBpZiAoIGZpbGwuZGF0YXNldC5pbmRleCA8PSBpbmRleCApIHtcbiAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCggJ2ZpbGxlZCcgKVxuXG4gICAgICAvLyBSYXRoZXIgdGhhbiBqdW1wIHRocm91Z2ggdGhlIERPTSB0d2ljZSwgdXNlIHRoZSBpbmRleCB0byBzZXRcbiAgICAgIC8vIGZpbGxzIGZvciB0cmFjayBzZWdtZW50cyB0b28gKGZvciBmaWxsaW5nIGluIGNvbG9yIG9uIHNsaWRlciBtYXJrcylcbiAgICAgIGlmICggc2VnbWVudHNbZWxJbmRleF0gKSBzZWdtZW50c1tlbEluZGV4XS5jbGFzc0xpc3QuYWRkKCAnZmlsbGVkJyApXG4gICAgfSBlbHNlIHtcblxuICAgICAgLy8gUmVtb3ZlIGZpbGxzXG4gICAgICBmaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcpXG4gICAgICBpZihzZWdtZW50c1tlbEluZGV4XSkgc2VnbWVudHNbZWxJbmRleF0uY2xhc3NMaXN0LnJlbW92ZSgnZmlsbGVkJylcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNldExhYmVscyAoIHNsaWRlciApIHtcbiAgdmFyIGRhdGEgPSBnZXREYXRhKHNsaWRlcilcblxuICAvLyBJZiBoaWRkZW4gc2xpZGVyIG9yIG5vIGxhYmVscyBzZXQsIGRvbid0IHVwZGF0ZVxuICBpZiAoIGRhdGEubGFiZWxzICkge1xuXG4gICAgZm9yICggdmFyIGtleSBpbiBkYXRhLmxhYmVscyApIHtcbiAgICAgIHZhciBsYWJlbEVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzbGlkZXItaW5wdXQtJytzbGlkZXIuZGF0YXNldC5zbGlkZXJJZCsnLXdyYXBwZXIgW2RhdGEtc2xpZGVyLWxhYmVsPScra2V5KyddIC5sYWJlbC1jb250ZW50JylcbiAgICAgIHZhciBsYWJlbHMgPSBsYWJlbEF0SW5kZXgoIGRhdGEubGFiZWxzLCBzbGlkZXIudmFsdWUgKVxuXG4gICAgICB0b29sYm94LmVhY2goIGxhYmVsRWxzLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGxhYmVsc1trZXldXG4gICAgICAgIGVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZW1wdHktbGFiZWwnLCBsYWJlbHNba2V5XSA9PT0gJycpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vLyBGaW5kIGxhYmVscyB3aGljaCBoYXZlIGFuIGVudHJ5IGZvciBzbGlkZXIgdmFsdWVcbmZ1bmN0aW9uIGxhYmVsQXRJbmRleCggbGFiZWxzLCB2YWx1ZSApIHtcbiAgdmFyIHNldCA9IHt9XG4gIGZvciAodmFyIGtleSBpbiBsYWJlbHMpIHtcbiAgICBzZXRba2V5XSA9IGxhYmVsc1trZXldW3ZhbHVlXVxuICB9XG4gIHJldHVybiBzZXRcbn1cblxuZnVuY3Rpb24gY2FjaGUgKCBzbGlkZXIgKSB7XG4gIHZhciBkYXRhID0ge1xuICAgIC8vIEFzc2lnbiBhbiBpbmNyZW1lbnRhbCBJRCB0byB0cmFjayB0aGlzIHNsaWRlciB3aXRoIGl0cyBkYXRhXG4gICAgaWQ6ICAgc2xpZGVycy5sZW5ndGgsXG4gICAgbWluOiAgTnVtYmVyKCBzbGlkZXIubWluICkgIHx8IDAsXG4gICAgbWF4OiAgTnVtYmVyKCBzbGlkZXIubWF4ICkgIHx8IDEwMCxcbiAgICBzdGVwOiBOdW1iZXIoIHNsaWRlci5zdGVwICkgfHwgMVxuICB9XG5cbiAgLy8gU2V0IGRhdGFzZXQuc2xpZGVySWQgZm9yIGVhc3kgY2FjaGUgbG9va3VwcyBsYXRlclxuICAvLyBVc2luZyBzZXRhdHRyaWJ1dGUgYmVjYXVzZSBpdCBmb3JjZXMgYSBjaGFuZ2UgdG8gdGhlIGVsZW1lbnQncyB0YWdcbiAgc2xpZGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZXItaWQnLCBkYXRhLmlkKVxuXG4gIC8vIEdldCBhbGwgYXR0cmlidXRlcyB3aGljaCBzdGFydCB3aXRoIGBkYXRhLWBcbiAgZGF0YSA9IHRvb2xib3gubWVyZ2UoIGRhdGEsIGV4dHJhY3REYXRhKHNsaWRlciwgJ2RhdGEtJykgKVxuXG4gIGRhdGEudmFsdWVzICAgPSBoZWxwZXJzLmdldFZhbHVlcyggZGF0YS5taW4sIGRhdGEubWF4LCBkYXRhLnZhbHVlcywgZGF0YS5zdGVwIClcbiAgZGF0YS5zZWdtZW50cyA9IG9iamVjdFNpemUoZGF0YS52YWx1ZXMpXG4gIGRhdGEubWF4ICAgICAgPSBkYXRhLm1pbiArICgoZGF0YS5zZWdtZW50cyAtIDEpICogZGF0YS5zdGVwKVxuXG4gIGlmICggZGF0YS5tYXJrICkgZGF0YS5tYXJrID0gaGVscGVycy5zcGxpdChkYXRhLm1hcmspLm1hcChOdW1iZXIpXG5cbiAgZGF0YS5saW5lTGFiZWxzID0gaGVscGVycy5nZXRMaW5lTGFiZWxzKCBkYXRhWydsaW5lLWxhYmVscyddIClcblxuICAvLyBHZXQgbGFiZWxzIChvciBjcmVhdGUgdGhlbSBpZiBub25lIGV4aXN0KVxuICBkYXRhLmxhYmVscyA9IGdldExhYmVscyggc2xpZGVyLCBkYXRhIClcbiAgaWYgKCBvYmplY3RTaXplKCBkYXRhLmxhYmVscyApID09IDApIGRhdGEubGFiZWxzLmRlZmF1bHQgPSBkYXRhLnZhbHVlc1xuXG4gIC8vIElmIHVzZXIgaGFwcGVucyB0byB1c2UgZGF0YS1sYWJlbD0nYSxiLGMnIGFuZCBkYXRhLWxhYmVsLXR3bz0nZCxlLGYnXG4gIC8vIHJlbW92ZSBkZWZhdWx0IGxhYmVsICh0aGV5J3JlIHVzaW5nIGl0IHdyb25nbHkpXG4gIGVsc2UgaWYgKCBvYmplY3RTaXplKCBkYXRhLmxhYmVscyApID4gMSApIGRlbGV0ZSBkYXRhLmxhYmVscy5kZWZhdWx0XG5cbiAgLy8gU2V0IGRhdGEtaW5wdXQgbmFtZSBiYXNlZCBvbiBzbGlkZXIgbmFtZSAoaWYgdW5zZXQpXG4gIC8vIGRhdGEtaW5wdXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGhpZGRlbiBpbnB1dCB3aGljaCB3aWxsIGNvbnRhaW5cbiAgLy8gc2xpZGVyJ3MgY3VzdG9tIHZhbHVlc1xuICBkYXRhLmlucHV0ICAgICAgPSBkYXRhLmlucHV0IHx8IHNsaWRlci5uYW1lXG4gIHNsaWRlci5kYXRhc2V0LmlucHV0ID0gZGF0YS5pbnB1dFxuICAvLyBSZW1vdmUgbmFtZSBzbyB0aGF0IGZvcm0gc3VibWlzc2lvbiBkb2Vzbid0IGluY2x1ZGUgdmFsdWVzIGZvciBzbGlkZXJcbiAgc2xpZGVyLnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpXG5cbiAgLy8gSXMgdGhlcmUgYWxyZWFkeSBhbiBpbnB1dCBpbiB0aGUgRE9NP1xuICB2YXIgaW5wdXQgPSBoZWxwZXJzLmdldElucHV0KCBzbGlkZXIgKVxuICAvLyBJZiBzbyBzZXQgZmxhZyBzbyB0ZW1wbGF0ZSB3aWxsIG5vdCBjcmVhdGUgYSBoaWRkZW4gaW5wdXRcbiAgaWYgKCBpbnB1dCApIGRhdGEuaW5wdXRFeGlzdHMgPSB0cnVlXG5cbiAgc2xpZGVycy5wdXNoKGRhdGEpXG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIGdldExhYmVscyggc2xpZGVyLCBkYXRhICkge1xuICAvLyBSZXR1cm5zIGFuIG9iamVjdCBhbGwgYGRhdGEtbGFiZWwqYCBhdHRyaWJ1dGVzXG4gIHZhciBsYWJlbHMgPSBleHRyYWN0RGF0YSggc2xpZGVyLCAnZGF0YS1sYWJlbCcgKVxuXG4gIC8vIFNpbmNlIGV4dHJhY3Rpb24gc3RhcnRzIGFmdGVyIGBkYXRhLWxhYmVsYCwgXG4gIC8vIGBkYXRhLWxhYmVsPSdmb28nYCB3aWxsIGJlIGtleWVkIGJ5ICcnIGUuZy4gb2JqZWN0WycnXT0nZm9vJ1xuICAvLyBUaGlzIGNvcnJlY3RzIHRoYXQgb2RkaXR5IHN1Y2ggdGhhdCBgb2JqZWN0WydkZWZhdWx0J109J2ZvbydgXG4gIGlmIChsYWJlbHNbJyddKSB7XG4gICAgbGFiZWxzWydkZWZhdWx0J10gPSBsYWJlbHNbJyddXG4gICAgZGVsZXRlIGxhYmVsc1snJ11cbiAgfVxuICByZXR1cm4gaGVscGVycy5nZXRMYWJlbHMoIGxhYmVscywgZGF0YSApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjYWNoZTogY2FjaGUsXG4gIHdhdGNoOiB3YXRjaCxcbiAgY2hhbmdlOiBjaGFuZ2UsXG4gIGdldERhdGE6IGdldERhdGFcbn1cbiIsImZ1bmN0aW9uIGdldFZhbHVlcyggbWluLCBtYXgsIHZhbHVlcywgc3RlcCApIHtcbiAgdmFyIHJlc3VsdCA9IHt9XG4gIHN0ZXAgPSBzdGVwIHx8IDFcblxuICAvLyBJZiBzbGlkZXIgaGFzIGRhdGEtdmFsdWUgYXR0cmlidXRlIHNwbGl0IGludG8gYW4gYXJyYXlcbiAgdmFsdWVzID0gdmFsdWVzID8gc3BsaXQoIHZhbHVlcyApIDogW11cbiAgIFxuICAvLyBBZGQgdmFsdWVzIGJldHdlZW4gbWluIGFuZCBtYXgsIGVnOiAxLDIsMyw0LDXigKZcbiAgZm9yICggdmFyIHZhbHVlID0gbWluOyB2YWx1ZSA8PSBtYXg7IHZhbHVlKz1zdGVwICkgeyBcbiAgICByZXN1bHRbdmFsdWVdID0gdmFsdWVzLnNoaWZ0KCkgfHwgdmFsdWVcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gVGFrZXMgbGFiZWwgZGF0YSBhbmQgY3Vuc3RydWN0cyBoYXNoZXMga2V5ZWQgYnkgc2xpZGVyIHZhbHVlLlxuLy9cbi8vIElucHV0OlxuLy8gZGF0YS1sYWJlbD0naG9uZXksIGJyZWFkLCBidXR0ZXInXG4vL1xuLy8gUmV0dXJucyBhczogXG4vLyBkYXRhLmxhYmVsc1snZGVmYXVsdF0gPSBbJ2hvbmV5JywgJ2JyZWFkJywgJ2J1dHRlciddXG4vLyBcbi8vIElucHV0OlxuLy8gZGF0YS1sYWJlbC1icmVhZD0ncnllLHdoZWF0LHdoaXRlJ1xuLy8gZGF0YS1sYWJlbC1zcHJlYWQ9J2plbGx5LGphbSxidXR0ZXIsaG9uZXknXG4vL1xuLy8gUmV0dXJucyBhczpcbi8vIGRhdGEubGFiZWxzWydicmVhZCddICA9IHsgMDogJ3J5ZScsIDE6ICd3aGVhdCcsIDI6ICd3aGl0ZScgfVxuLy8gZGF0YS5sYWJlbHNbJ3NwcmVhZCddID0geyAwOiAnamVsbHknbCwgMTogJ2phbScsIDI6ICdidXR0ZXInLCAzOiAnaG9uZXknIH1cbi8vXG5mdW5jdGlvbiBnZXRMYWJlbHMoIGxhYmVsRGF0YSwgZGF0YSApIHtcbiAgdmFyIGxhYmVscyA9IHt9XG5cbiAgLy8gSWYgbGFiZWxzIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIChkYXRhLWxhYmVsPWZhbHNlfG5vbmUpLCByZXR1cm4gZmFsc2VcbiAgaWYgKCBsYWJlbERhdGEuZGVmYXVsdCAmJiBsYWJlbERhdGEuZGVmYXVsdC50cmltKCkubWF0Y2goL15mYWxzZSR8Xm5vbmUkLykgKSByZXR1cm4gZmFsc2VcblxuICAvLyBVbmxlc3MgbGFiZWxzIGhhdmUgYmVlbiBkaXNhYmVkIHdpdGggZGF0YS1sYWJlbD0nZmFsc2UnXG4gIGZvciAoIHZhciBrZXkgaW4gbGFiZWxEYXRhICkge1xuXG4gICAgLy8gSWdub3JlIG5vbi1uYXRpdmUgbWV0aG9kcyBpbmplY3RlZCBieSBzb21lIHdheXdhcmQgbGliXG4gICAgaWYgKCAhbGFiZWxEYXRhLmhhc093blByb3BlcnR5KGtleSkgKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIFNwbGl0IGxhYmVscyBpbnRvIGFuIGFycmF5LlxuICAgIHZhciBzcGxpdExhYmVscyA9IHNwbGl0KCBsYWJlbERhdGFba2V5XSApXG5cbiAgICAvLyBDb25zdHJ1Y3QgYSBsYWJlbHMgb2JqZWN0IGtleWVkIGJ5IHNsaWRlciB2YWx1ZXNcbiAgICB2YXIgdmFsdWVMYWJlbHMgPSB7fVxuXG4gICAgLy8gV2FsayB1cCB0aGUgc2xpZGVyIHZhbHVlcyBieSBzdGVwIHNpemUgZnJvbSBtaW4gdG8gbWF4XG4gICAgZm9yICggdmFyIHZhbHVlID0gZGF0YS5taW47IHZhbHVlIDw9IGRhdGEubWF4OyB2YWx1ZSs9ZGF0YS5zdGVwICkgeyBcbiAgICAgIHZhbHVlTGFiZWxzW3ZhbHVlXSA9IHNwbGl0TGFiZWxzLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGhlIG5ldyBvYmplY3QgdG8gYSBsYWJlbCBrZXkgZS5nLiBsYWJlbHNbJ2JyZWFkJ11cbiAgICBsYWJlbHNba2V5XSA9IHZhbHVlTGFiZWxzXG4gIH1cblxuICByZXR1cm4gbGFiZWxzXG59XG5cbi8vIElmIGxpbmVMYWJlbHMgYXJlIHByZXNlbnQsIHRoaXMgcmVhdHVybnMgYW4gYXJyYXkgXG4vLyB3aXRoIGxhYmVscyBzZXQgZm9yIGFwcHJvcHJpYXRlIGluZGV4ZXNcbmZ1bmN0aW9uIGdldExpbmVMYWJlbHMgKCBsaW5lTGFiZWxzICl7XG4gIC8vIExpbmUgbGFiZWxzIG1heSBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6XG4gIC8vIC0gMTpzdGFydCwxMDplbmQgICAgICAgICAgICAgIC0gaW5kZXggc3BlY2lmaWVkLCBjb21tYSBzZXBhcmF0ZWRcbiAgLy8gLSBmaXJzdCxzZWNvbmQsdGhpcmQsMTA6bGFzdCAgLSBkZWZhdWx0IHRvIGluZGV4IGZvciBzb21lIGxhYmVsc1xuICAvLyAtIDEwLDAwMDsyMCwwMDA7MzAsMDAwICAgICAgICAtIHNlbWljb2xvbiBzZXBhcmF0ZWRcbiAgLy9cbiAgbGFiZWxzID0ge31cbiAgaWYgKCBsaW5lTGFiZWxzICkge1xuICAgIHNwbGl0KGxpbmVMYWJlbHMpLm1hcCggZnVuY3Rpb24oIGxpbmVzLCBpbmRleCApe1xuICAgICAgLy8gU3BsaXQgb24gYDpgIHRvIHNlZSBpZiBpbmRleCBpcyBzcGVjaWZpZWQgKGV4YW1wbGUgMSBhYm92ZSlcbiAgICAgIHZhciBsID0gbGluZXMuc3BsaXQoJzonKVxuXG4gICAgICAvLyBJZiBzcGxpdCBpcyBzdWNjZXNzZnVsLCBpbmRleCBoYXMgYmVlbiBzcGVjaWZpZWQgZWcsIDE6c3RhcnRcbiAgICAgIC8vIHNldCBsaW5lTGFiZWwgaW5kZXggdG8gaW5kZXggZm91bmQgaW4gc3BsaXRcbiAgICAgIGlmIChsWzFdKSBsYWJlbHNbbFswXV0gPSBsWzFdXG5cbiAgICAgIC8vIEVsc2UsIHVzZSBjdXJyZW50IGluZGV4ICgrMSBiZWNhdXNlIHRoaXMgaXMgMSBiYXNlZClcbiAgICAgIC8vIHRvIHNldCBMaW5lTGFiZWwgaW5kZXhcbiAgICAgIC8vIFNpbmNlIG5vIHNwbGl0IHNldCB2YWx1ZSB3aXRoIGxbMF1cbiAgICAgIGVsc2UgbGFiZWxzW2luZGV4ICsgMV0gPSBsWzBdXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsYWJlbHNcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXQoc2xpZGVyKSB7XG4gIHJldHVybiBzY29wZVRvRm9ybShzbGlkZXIpLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCInK3NsaWRlci5kYXRhc2V0LmlucHV0KydcIl0sICcrc2xpZGVyLmRhdGFzZXQuaW5wdXQpXG59XG5cbmZ1bmN0aW9uIHNwbGl0IChzdHJpbmcpeyBcbiAgdmFyIGRlbGltaXRlciA9IHN0cmluZy5tYXRjaCgvOy8pID8gJzsnIDogJywnXG4gIHJldHVybiBzdHJpbmcuc3BsaXQoZGVsaW1pdGVyKS5tYXAodHJpbSlcbn1cblxuZnVuY3Rpb24gdHJpbSAodmFsdWUpeyBcbiAgcmV0dXJuIHZhbHVlLnRyaW0oKVxufVxuXG4vLyBzY29wZVRvRm9ybSBzZWxlY3RvciB0byBjdXJyZW50IGZvcm1cbi8vIEF2b2lkcyBtb2RpZnlpbmcgY29udGVudCBpbiBvdGhlciBmb3Jtc1xuZnVuY3Rpb24gc2NvcGVUb0Zvcm0oc2xpZGVyKSB7XG4gIHZhciBlbCA9IHNsaWRlclxuXG4gIC8vIHdhbGsgdXAgdW50aWwgeW91IGZpbmQgYSBmb3JtXG4gIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7IGVsID0gZWwucGFyZW50Tm9kZSB9XG5cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldFZhbHVlczogZ2V0VmFsdWVzLFxuICBnZXRMYWJlbHM6IGdldExhYmVscyxcbiAgZ2V0TGluZUxhYmVsczogZ2V0TGluZUxhYmVscyxcbiAgZ2V0SW5wdXQ6IGdldElucHV0LFxuICBzY29wZVRvRm9ybTogc2NvcGVUb0Zvcm0sXG4gIHNwbGl0OiBzcGxpdFxufVxuIiwidmFyIHRvb2xib3ggICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICB0ZW1wbGF0ZSAgICA9IHJlcXVpcmUoICcuL3RlbXBsYXRlJyApLFxuICAgIGV2ZW50cyAgICAgID0gcmVxdWlyZSggJy4vZXZlbnRzJyApXG5cbmZ1bmN0aW9uIHNldHVwKCkge1xuICBldmVudHMud2F0Y2goKVxuXG4gIHRvb2xib3guZXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICAvLyBEb24ndCBzZWxlY3QgcHJldmlvdXNseSBzZXR1cCBzbGlkZXJzXG4gICAgdmFyIHJhbmdlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXTpub3QoLnNsaWRlci1pbnB1dCknKVxuXG4gICAgdG9vbGJveC5lYWNoKCByYW5nZXMsIGZ1bmN0aW9uKHNsaWRlcil7XG4gICAgICB2YXIgZGF0YSA9IGV2ZW50cy5jYWNoZSggc2xpZGVyIClcbiAgICAgIHNsaWRlciA9IGluaXQoIHNsaWRlciwgZGF0YSApXG4gICAgICBldmVudHMuY2hhbmdlKCBzbGlkZXIgKVxuICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGluaXQoIHNsaWRlciwgZGF0YSApIHtcbiAgLy8gU2V0IHNsaWRlciBjbGFzcyBzbyB0aGF0IGl0IHdvbid0IGJlIHNldHVwIHR3aWNlXG4gIHNsaWRlci5jbGFzc0xpc3QuYWRkKCAnc2xpZGVyLWlucHV0JyApXG5cbiAgLy8gTWF0Y2ggZGVmYXVsdHNcbiAgc2xpZGVyLnNldEF0dHJpYnV0ZSggJ21pbicsIGRhdGEubWluIClcbiAgc2xpZGVyLnNldEF0dHJpYnV0ZSggJ21heCcsIGRhdGEubWF4IClcbiAgc2xpZGVyLnNldEF0dHJpYnV0ZSggJ3N0ZXAnLCBkYXRhLnN0ZXAgKVxuXG4gIC8vIERvbid0IGxldCB0aGUgYnJvd3NlciBzZWxlY3QgYSBkZWZhdWx0IHZhbHVlXG4gIGlmKCFzbGlkZXIuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKSBzbGlkZXIuc2V0QXR0cmlidXRlKCAndmFsdWUnLCBkYXRhLm1pbiApXG4gIGRhdGEuaW5pdGlhbFZhbHVlID0gc2xpZGVyLmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gc2xpZGVyLnZhbHVlXG5cbiAgaWYoIXNsaWRlci5nZXRBdHRyaWJ1dGUoJ2lkJykpIHNsaWRlci5zZXRBdHRyaWJ1dGUoICdpZCcsICdzbGlkZXItaW5wdXQtJytkYXRhLmlkIClcbiAgLy8gSW5zZXJ0IHRoZSB0ZW1wbGF0ZSByaWdodCBiZWZvcmUgdGhlIHNsaWRlclxuICBzbGlkZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYmVmb3JlYmVnaW4nLCB0ZW1wbGF0ZS5odG1sKCBkYXRhLCBzbGlkZXIub3V0ZXJIVE1MICkgKVxuICAvLyBHcmFiIGEgcmVmZXJlbmNlIHRvIG5ldyBzbGlkZXIgY29udGFpbmVyXG4gIHZhciBjb250YWluZXIgPSBzbGlkZXIucHJldmlvdXNTaWJsaW5nXG4gIC8vIHJlbW92ZSBvbGQgc2xpZGVyXG4gIHNsaWRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNsaWRlcilcblxuICAvLyByZXR1cm4gbmV3IHNsaWRlclxuICByZXR1cm4gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXItaW5wdXQnKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXR1cDogc2V0dXAsXG4gIGdldERhdGE6IGV2ZW50cy5nZXREYXRhXG59XG4iLCJ2YXIgb2JqZWN0U2l6ZSA9IHJlcXVpcmUoJy4uL29iamVjdC1zaXplJylcblxuZnVuY3Rpb24gaHRtbCggZGF0YSwgc2xpZGVySFRNTCApIHtcbiAgdmFyIGh0bWwgPSAnPGRpdiBjbGFzcz1cIicgKyBnZXRDbGFzc2VzKCBkYXRhICkgKyAnXCIgaWQ9XCJzbGlkZXItaW5wdXQtJyArIGRhdGEuaWQgKyAnLXdyYXBwZXJcIj4nXG4gICAgICBodG1sICs9IFwiPGRpdiBjbGFzcz0nc2xpZGVyLWlucHV0LWNvbnRhaW5lcic+XCIgKyBzbGlkZXJIVE1MICsgZ2V0VHJhY2soIGRhdGEgKSArIFwiPC9kaXY+XCJcbiAgICAgIGh0bWwgKz0gYWRkTGFiZWxzKCBkYXRhIClcbiAgICAgIGh0bWwgKz0gYWRkSW5wdXQoIGRhdGEgKVxuICAgICAgaHRtbCArPSAnPC9kaXY+J1xuICByZXR1cm4gaHRtbFxufVxuXG5mdW5jdGlvbiBnZXRDbGFzc2VzKCBkYXRhICkge1xuICB2YXIgY2xhc3NlcyA9IFsnc2xpZGVyLWNvbnRhaW5lciddXG4gIGlmIChvYmplY3RTaXplKGRhdGEubGluZUxhYmVscykgPiAwKSBjbGFzc2VzLnB1c2goJ2xpbmUtbGFiZWxzJylcbiAgY2xhc3Nlcy5wdXNoKChkYXRhLmxhYmVscykgPyAnd2l0aC1sYWJlbCcgOiAnd2l0aG91dC1sYWJlbCcpXG4gIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKVxufVxuXG5mdW5jdGlvbiBnZXRUcmFjayAoIGRhdGEgKSB7XG4gIHZhciB0cmFjayA9ICcnXG5cbiAgLy8gSWYgZGF0YSBoYXMgYmVlbiBtYXJrZWQsIG9yIGlmIHRoZXJlIGFyZSBsaW5lIGxhYmVsc1xuICAvLyB0aGlzIHdpbGwgYWRkIHRob3NlIGxhYmVscyB0byB0aGUgdHJhY2tcbiAgaWYgKGRhdGEubWFyayB8fCBkYXRhLmxpbmVMYWJlbHMpIHtcbiAgICBmb3IodmFyIGluZGV4ID0gMTsgaW5kZXggPD0gZGF0YS5zZWdtZW50czsgaW5kZXgrKykge1xuICAgICAgdHJhY2sgKz0gXCI8ZGl2IGNsYXNzPSdzbGlkZXItc2VnbWVudCc+PHNwYW4gY2xhc3M9J3NsaWRlci1zZWdtZW50LWNvbnRlbnQnPlwiXG4gICAgICB0cmFjayArPSBhZGRNYXJrKCBkYXRhLm1hcmssIGluZGV4IClcbiAgICAgIHRyYWNrICs9IGFkZExpbmVMYWJlbCggZGF0YS5saW5lTGFiZWxzW2luZGV4XSApXG4gICAgICB0cmFjayArPSBcIjwvc3Bhbj48L2Rpdj5cIlxuICAgIH1cbiAgfVxuXG4gIHRyYWNrID0gXCI8ZGl2IGNsYXNzPSdzbGlkZXItdHJhY2snPlwiICsgdHJhY2sgKyBcIjwvZGl2PlwiXG4gIHJldHVybiB0cmFjayArIGFkZEZpbGxzKCBkYXRhLnNlZ21lbnRzIClcbn1cblxuZnVuY3Rpb24gYWRkTWFyayhtYXJrcywgaW5kZXgpIHtcbiAgLy8gSWYgbWFyayAoYW4gYXJyYXkpIGhhcyBhbiBpdGVtIGluIGl0cyBpbmRleFxuICBpZiAobWFya3MgJiYgbWFya3MuaW5kZXhPZihpbmRleCkgIT0gLTEpXG4gICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J3NsaWRlci1zZWdtZW50LW1hcmsnIGRhdGEtaW5kZXg9J1wiK2luZGV4K1wiJz48L3NwYW4+XCJcbiAgZWxzZVxuICAgIHJldHVybiBcIlwiXG59XG5cbmZ1bmN0aW9uIGFkZExpbmVMYWJlbCggbGFiZWwgKSB7XG4gIGlmIChsYWJlbClcbiAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0nc2xpZGVyLWxpbmUtbGFiZWwnPlwiK2xhYmVsK1wiPC9zcGFuPlwiXG4gIGVsc2VcbiAgICByZXR1cm4gXCJcIlxufVxuXG4vLyBHZXQgZmlsbHMgZm9yIGVhY2ggc2VnbWVudCBleGNlcHQgdGhlIGxhc3QuXG4vLyBUaGVyZSBpcyBubyBmaWxsIGZvciB0aGUgbGFzdCBpdGVtIFxuLy8gYmVjYXVzZSBpdCdzIGF0IHRoZSBlbmQgb2YgdGhlIHNsaWRlclxuZnVuY3Rpb24gYWRkRmlsbHMoY291bnQpIHtcbiAgdmFyIGZpbGxzID0gJydcbiAgZm9yKHZhciBpID0gMTsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBmaWxscyArPSBcIjxzcGFuIGNsYXNzPSdzbGlkZXItZmlsbCcgZGF0YS1pbmRleD0nXCIraStcIic+PC9zcGFuPlwiXG4gIH1cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz0nc2xpZGVyLWZpbGxzJz5cIiArIGZpbGxzICsgXCI8L2Rpdj5cIlxuXG59XG5cbi8vIHsgbGFiZWxzOiB7IGRlZmF1bHQ6IFsxLDIsM10gfX1cbmZ1bmN0aW9uIGFkZExhYmVscyAoIGRhdGEgKXtcbiAgdmFyIGh0bWwgPSAnJ1xuICBpZiAoZGF0YS5sYWJlbHMgPT0gZmFsc2UpIHsgcmV0dXJuIGh0bWwgfVxuXG4gIGZvcih2YXIga2V5IGluIGRhdGEubGFiZWxzKXtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cInNsaWRlci1sYWJlbC0nK2tleSsnIGludGVybmFsLWxhYmVsXCIgZGF0YS1zbGlkZXItbGFiZWw9XCInK2tleSsnXCI+J1xuICAgIGh0bWwgKz0gbGFiZWxIVE1MKGRhdGEsIGtleSlcbiAgICBodG1sICs9ICc8L3NwYW4+J1xuICB9XG5cbiAgaWYgKGh0bWwubGVuZ3RoID4gMCkge1xuICAgIGh0bWwgPSBcIjxkaXYgY2xhc3M9J3NsaWRlci1sYWJlbCBhbGlnbi1cIisoZGF0YVsncG9zaXRpb24tbGFiZWwnXSB8fCAncmlnaHQnKStcIic+XCIgKyBodG1sICsgXCI8L2Rpdj5cIlxuICB9XG5cbiAgcmV0dXJuIGh0bWxcbn1cblxuZnVuY3Rpb24gbGFiZWxIVE1MKGRhdGEsIGtleSwgbGFiZWwpIHtcbiAgcmV0dXJuIGxhYmVsTWV0YShkYXRhLCBrZXksICdiZWZvcmUnKVxuICArIFwiPHNwYW4gY2xhc3M9J2xhYmVsLWNvbnRlbnQnPlwiICsgKGxhYmVsIHx8ICcnKSArIFwiPC9zcGFuPlwiXG4gICsgbGFiZWxNZXRhKGRhdGEsIGtleSwgJ2FmdGVyJylcbn1cblxuZnVuY3Rpb24gbGFiZWxNZXRhIChkYXRhLCBrZXksIHBvc2l0aW9uKSB7XG4gIHZhciBhbHRLZXkgPSAnbGFiZWwtJytrZXlcbiAgdmFyIG1ldGEgPSBkYXRhW3Bvc2l0aW9uKyctJythbHRLZXldIHx8IGRhdGFbcG9zaXRpb24rJy1sYWJlbCddXG4gIGlmIChtZXRhKVxuICAgIHJldHVybiBcIjxzcGFuIGNsYXNzPSdcIitwb3NpdGlvbitcIi1sYWJlbCc+XCIrbWV0YStcIjwvc3Bhbj5cIlxuICBlbHNlXG4gICAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIGFkZElucHV0KCBkYXRhICkge1xuICByZXR1cm4gKCBkYXRhLmlucHV0RXhpc3RzICkgPyAnJyA6IFwiPGlucHV0IHR5cGU9J2hpZGRlbicgZGF0YS1pbml0aWFsLXZhbHVlPSdcIitkYXRhLnZhbHVlc1sgZGF0YS5pbml0aWFsVmFsdWUgXStcIicgbmFtZT0nXCIrZGF0YS5pbnB1dCtcIicgdmFsdWU9Jyc+XCJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGh0bWw6IGh0bWwsXG4gIGdldFRyYWNrOiBnZXRUcmFjayxcbiAgYWRkRmlsbHM6IGFkZEZpbGxzLFxuICBhZGRMYWJlbHM6IGFkZExhYmVscyxcbiAgbGFiZWxIVE1MOiBsYWJlbEhUTUwsXG4gIGFkZE1hcms6IGFkZE1hcmssXG4gIGFkZExpbmVMYWJlbDogYWRkTGluZUxhYmVsXG59XG5cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RlcEluZGV4IChlbCkge1xuICB2YXIgbWluID0gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnbWluJykgfHwgMCksXG4gICAgICBtYXggPSBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdtYXgnKSB8fCAxMDApLFxuICAgICAgc3RlcCA9IE51bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ3N0ZXAnKSkgfHwgMSxcbiAgICAgIHZhbHVlID0gTnVtYmVyKGVsLnZhbHVlKVxuXG4gIC8vIEVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBvZiBpbnB1dFxuICBpZiAodmFsdWUgJSBzdGVwICE9IDApIHJldHVyblxuICAvLyBUaGUgbnVibWVyIG9mIHVuaXRzIGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgYmV0d2VlbiBtaW4gYW5kIG1heFxuICB2YXIgdW5pdHMgPSAoIG1heCAtIG1pbiApIC8gc3RlcFxuICBcbiAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHN0ZXAgbnVtYmVyXG4gIHJldHVybiAoIHZhbHVlIC8gc3RlcCApIC0gKCBtaW4gLyBzdGVwIClcbn1cbiIsInZhciB0b29sYm94ICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgZXh0cmFjdERhdGEgPSByZXF1aXJlKCAnLi9leHRyYWN0LWRhdGEnICksXG4gICAgc3RlcEluZGV4ICAgPSByZXF1aXJlKCAnLi9zdGVwLWluZGV4JyApLFxuICAgIG9iamVjdFNpemUgID0gcmVxdWlyZSggJy4vb2JqZWN0LXNpemUnICksXG4gICAgRXZlbnQgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIHdhdGNoaW5nICAgID0gZmFsc2VcblxuXG5mdW5jdGlvbiBjaGFuZ2UgKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5jdXJyZW50VGFyZ2V0Lm91dGVySFRNTC5tYXRjaCgvZGF0YS1zdGVwLWxhYmVsLykgKVxuICAgIGluamVjdExhYmVscyggZXZlbnQuY3VycmVudFRhcmdldCApXG59XG5cbmZ1bmN0aW9uIGluamVjdExhYmVscyAoIGlucHV0ICkge1xuICAvLyBHcmFiIG9ubHkgdGhlIGxhYmVscyBhbmQgdmFsdWVzIGZvciB0aGlzIGluZGV4XG5cbiAgdmFyIGxhYmVscyA9IGdldExhYmVscyggaW5wdXQgKSAvLyBleGFtcGxlOiAgeyBkaXNrOiAnMTVHQicgfSBcblxuICBmb3IgKCBrZXkgaW4gbGFiZWxzICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbZGF0YS1zdGVwLWxhYmVsPVwiZGlza1wiXVxuICAgIHZhciBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1zdGVwLWxhYmVsPVwiJytrZXkrJ1wiXScgKVxuXG4gICAgaWYgKGVsKSB7XG4gICAgICAvLyBJZiB1c2VyIGhhcyBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQgb2YgJGVsIHRoZXkgd2FudCB0byBpbmplY3QgbGFiZWwgdGV4dCBpbnRvXG4gICAgICB2YXIgY29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignLmxhYmVsLWNvbnRlbnQnKVxuICAgICAgaWYgKCBjb250YWluZXIgKSB7IGNvbnRhaW5lci5pbm5lckhUTUwgPSBsYWJlbHNba2V5XSB9XG5cbiAgICAgIC8vIEVsc2UgaW5qZWN0IGZ1bGwgbGFiZWwgdGVtcGxhdGUgaW50byAkZWxcbiAgICAgIGVsc2UgeyBlbC5pbm5lckhUTUwgPSBsYWJlbEhUTUwobGFiZWxzW2tleV0pIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGFiZWxzIChlbCkge1xuICB2YXIgaW5kZXggPSBzdGVwSW5kZXgoIGVsIClcblxuICBpZiAodHlwZW9mIGluZGV4ID09IHVuZGVmaW5lZCkgcmV0dXJuIHt9IC8vIEVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBvZiBpbnB1dFxuXG4gIHZhciBsYWJlbHMgPSBleHRyYWN0RGF0YSggZWwsICdkYXRhLXN0ZXAtbGFiZWwnICksXG4gICAgICBzZWxlY3RlZCA9IHt9LFxuICAgICAgbGFiZWxOb3RGb3VuZFxuXG5cbiAgZm9yICggbGFiZWwgaW4gbGFiZWxzICkge1xuICAgIHZhciBzZWxlY3RlZExhYmVsID0gbGFiZWxzW2xhYmVsXS5zcGxpdCgnOycpW2luZGV4XVxuXG4gICAgLy8gSWYgbGFiZWwgbm90IGZvdW5kIGF0IGluZGV4LCBiYWlsIG91dC5cbiAgICBpZiAoIXNlbGVjdGVkTGFiZWwpIGxhYmVsTm90Rm91bmQgPSB0cnVlXG5cbiAgICBzZWxlY3RlZFtsYWJlbF0gPSBzZWxlY3RlZExhYmVsXG4gIH1cblxuICBpZiAobGFiZWxOb3RGb3VuZCkgeyByZXR1cm4ge30gfVxuICBlbHNlIHJldHVybiBzZWxlY3RlZFxufVxuXG5mdW5jdGlvbiBsYWJlbEhUTUwgKGxhYmVsKSB7XG4gIHJldHVybiBcIjxzcGFuIGNsYXNzPSdsYWJlbC1jb250ZW50Jz5cIiArIGxhYmVsICsgXCI8L3NwYW4+XCJcbn1cblxuZnVuY3Rpb24gd2F0Y2goZGVsYXkpIHtcbiAgaWYgKCAhd2F0Y2hpbmcgKSB7XG4gICAgd2F0Y2hpbmcgPSB0cnVlXG5cbiAgICBFdmVudC5yZWFkeShmdW5jdGlvbigpe1xuICAgICAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCBcImlucHV0W3R5cGU9J3JhbmdlJ11bZGF0YS1oYXMtc3RlcC1sYWJlbHNdLCBpbnB1dFtzdGVwXVtkYXRhLWhhcy1zdGVwLWxhYmVsc11cIiwgY2hhbmdlIClcblxuICAgICAgdmFyIGlucHV0cyA9IHRvb2xib3guc2xpY2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbc3RlcF0saW5wdXRbdHlwZT1cInJhbmdlXCJdJykpXG4gICAgICBpbnB1dHMuZm9yRWFjaChmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAoIG9iamVjdFNpemUoZXh0cmFjdERhdGEoaW5wdXQsICdkYXRhLXN0ZXAtbGFiZWwnKSkgPiAwICkge1xuICAgICAgICAgIGlucHV0LmRhdGFzZXQuaGFzU3RlcExhYmVscyA9IHRydWVcbiAgICAgICAgICBpbmplY3RMYWJlbHMoaW5wdXQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2F0Y2g6IHdhdGNoXG59XG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgPSB0b29sYm94LmV2ZW50LFxuICAgIHdhdGNoaW5nID0gZmFsc2VcblxuZnVuY3Rpb24gY2hhbmdlIChldmVudCkge1xuICAvLyBQcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgdHJpZ2dlcmVkIGV2ZW50c1xuICBpZiAoIGV2ZW50LmRldGFpbCAmJiBldmVudC5kZXRhaWwudHJpZ2dlcmVkICkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGJvdW5kSW5wdXQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKVxufVxuXG5mdW5jdGlvbiBib3VuZElucHV0ICggaW5wdXQgKSB7XG4gIHZhciB2YWx1ZSA9IE51bWJlcihpbnB1dC52YWx1ZSksXG4gICAgICBtaW4gPSBOdW1iZXIoaW5wdXQuZ2V0QXR0cmlidXRlKCdtaW4nKSksXG4gICAgICBtYXggPSBOdW1iZXIoaW5wdXQuZ2V0QXR0cmlidXRlKCdtYXgnKSkgXG5cbiAgaWYgKCB2YWx1ZSAhPSBOYU4gJiYgaW5wdXQudmFsdWUgIT0gXCJcIiApIHtcbiAgICBpZiAgICAgICggbWluICYmIHZhbHVlIDwgbWluICkgaW5wdXQudmFsdWUgPSBtaW5cbiAgICBlbHNlIGlmICggbWF4ICYmIG1heCA8IHZhbHVlICkgaW5wdXQudmFsdWUgPSBtYXhcbiAgICBlbHNlIGlmICggaW5wdXQuZ2V0QXR0cmlidXRlKCdzdGVwJykgIT0gJ2FueScgKVxuICAgICAgaW5wdXQudmFsdWUgPSByb3VuZFRvTmVhcmVzdCggTnVtYmVyKGlucHV0LnZhbHVlKSwgTnVtYmVyKGlucHV0LmdldEF0dHJpYnV0ZSgnc3RlcCcpKSApXG5cbiAgICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoICdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IHRyaWdnZXJlZDogdHJ1ZSB9IH0gKVxuICAgIGlucHV0LmRpc3BhdGNoRXZlbnQoIGV2IClcbiAgfVxufVxuXG5mdW5jdGlvbiByb3VuZFRvTmVhcmVzdCggdmFsdWUsIHN0ZXAgKSB7XG5cbiAgLy8gTnViZXJzIHdpdGggZGVjaW1hbHMgc2NyZXcgdXAgaW4gSmF2YXNjcmlwdC5cbiAgLy8gU2NhbGUgdG8gd2hvbGUgbnVtYmVycyBiZWZvcmUgb3BlcmF0aW5nIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycy5cbiAgLy8gMC4yNSA9PiAyNVxuICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHZhbHVlXG4gIHZhciBzdGVwUHJlY2lzaW9uID0gTWF0aC5yb3VuZCggMSsnZScrcHJlY2lzaW9uKCBzdGVwICkgKSxcbiAgICAgIHZhbHVlUHJlY2lzaW9uID0gTWF0aC5yb3VuZCggMSsnZScrcHJlY2lzaW9uKCB2YWx1ZSApICksXG4gICAgICBzY2FsZSAgPSAoIHN0ZXBQcmVjaXNpb24gPCB2YWx1ZVByZWNpc2lvbiApID8gdmFsdWVQcmVjaXNpb24gOiBzdGVwUHJlY2lzaW9uXG4gICAgICBcbiAgLy8gU2NhbGUgdXAgdmFsdWVzIHRvIGF2b2lkIEphdmFzY3JpcHQgcm91bmRpbmcgZXJyb3JzIG9uIGRlY2ltYWwgbnVtYmVycy5cbiAgdmFyIHN0ZXAgID0gc3RlcCAqIHNjYWxlLFxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIHNjYWxlXG5cbiAgLy8gSWYgYSByZW1haW5kZXIgaXMgcHJlc2VudCwgcm91bmRpbmcgaXMgbmVjZXNzYXJ5XG4gIHZhciByZW1haW5kZXIgPSB2YWx1ZSAlIHN0ZXBcbiAgaWYgKCByZW1haW5kZXIgPT0gMCApIHJldHVybiBvcmlnaW5hbFZhbHVlXG5cbiAgLy8gSWYgcmVtYWluZGVyIGlzIGxhcmdlciB0aGFuIGhhbGYgb2YgdGhlIHN0ZXBcbiAgLy8gaXQncyBjbG9zZXIgdG8gdGhlIG5leHQgc3RlcCBhbmQgc2hvdWxkIGJlIHJvdW5kZWQgdXBcbiAgaWYgKCByZW1haW5kZXIgPCBzdGVwIC8gMiApIHZhbHVlID0gdmFsdWUgLSByZW1haW5kZXJcblxuICAvLyBPdGhlcndpc2Ugcm91bmQgZG93biAoYnV0IHN1YnRyYWN0aW5nIHRoZSBkaWZmZXJlbmNlKVxuICBlbHNlIHZhbHVlID0gdmFsdWUgKyAoc3RlcCAtIHJlbWFpbmRlcilcblxuICByZXR1cm4gdmFsdWUgLyBzY2FsZVxufVxuXG4vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLCB0aGUgcHJlY2lzaW9uLCBpZiB5b3Ugd2lsbFxuZnVuY3Rpb24gcHJlY2lzaW9uKGEpIHtcbiAgaWYgKCFpc0Zpbml0ZShhKSkgcmV0dXJuIDA7XG4gIHZhciBlID0gMSwgcCA9IDA7XG4gIHdoaWxlIChNYXRoLnJvdW5kKGEgKiBlKSAvIGUgIT09IGEpIHsgZSAqPSAxMDsgcCsrOyB9XG4gIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiB3YXRjaChkZWxheSkge1xuICBpZiAoICF3YXRjaGluZyApIHtcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdpbnB1dCcsIFwiaW5wdXRbdHlwZT1udW1iZXJdW3N0ZXBdLGlucHV0W3R5cGU9bnVtYmVyXVttYXhdLGlucHV0W3R5cGU9bnVtYmVyXVttaW5dXCIsIEV2ZW50LmRlYm91bmNlKGNoYW5nZSwgZGVsYXkgfHwgNTAwKSApXG4gICAgd2F0Y2hpbmcgPSB0cnVlXG4gICAgRXZlbnQucmVhZHkoZnVuY3Rpb24oKXtcbiAgICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1udW1iZXJdW3N0ZXBdLGlucHV0W3R5cGU9bnVtYmVyXVttYXhdLGlucHV0W3R5cGU9bnVtYmVyXVttaW5dJyksIGJvdW5kSW5wdXQgKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdhdGNoOiB3YXRjaCxcbiAgcm91bmQ6IHJvdW5kVG9OZWFyZXN0XG59XG4iLCIvLyB2YXIgdG9vbGJveCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuLy8gICAgIEV2ZW50ICAgICAgID0gdG9vbGJveC5ldmVudFxuXG5cbi8vIGZ1bmN0aW9uIHNldHVwICgpIHtcbi8vICAgdG9vbGJveC5ldmVudC5vbiggZnVuY3Rpb24oKSB7XG4vLyAgICAgdmFyIHRpZXJDaGlsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnB1dCcpO1xuXG4vLyAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aWVyQ2hpbGQsIGZ1bmN0aW9uKGVsKSB7XG4vLyAgICAgICByZXR1cm4gdGllckNoaWxkO1xuLy8gICAgIH0pXG4vLyAgIH0pXG4vLyB9XG5cbi8vIG1vZHVsZS5leHBvcnRzID0ge1xuLy8gICBzZXR1cDogc2V0dXBcbi8vIH0iLCIvLyBEZXBlbmRlbmNpZXNcbnZhciB0b29sYm94ICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgID0gdG9vbGJveC5ldmVudCxcbiAgICB0VGltZSAgICAgID0gdG9vbGJveC50aW1lLFxuICAgIGdldENsb3Nlc3QgPSB0b29sYm94LmdldENsb3Nlc3QsXG4gICAgd29yZENvdW50ICA9IHRvb2xib3gud29yZENvdW50LFxuICAgIHRleHRTZWxlY3RvcnMgPSAnW3JlcXVpcmVkXSc7XG5cbi8vIERvZXMgdGhpcyBicm93c2VyIHN1cHBvcnQgSFRNTDUgdmFsaWRhdGlvbj9cbmZ1bmN0aW9uIHN1cHBvcnRlZCAoKSB7XG5cbiAgcmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnaW5wdXQnICkuY2hlY2tWYWxpZGl0eSA9PT0gJ2Z1bmN0aW9uJ1xuXG59XG5cbnZhciBpbnZhbGlkSGFuZGxlciA9IEV2ZW50LmNhbGxiYWNrLm5ldyggZnVuY3Rpb24oIGV2ZW50ICkgeyBcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKSBcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgXG59KVxuXG4vLyBXYXRjaCBmb3IgZXZlbnRzICggaWYgdmFsaWRhdGlvbiBpcyBzdXBvcnRlZCApXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKXtcblxuICBpZiAoIHN1cHBvcnRlZCgpICkgeyBcblxuICAgIEV2ZW50LmJ1YmJsZUZvcm1FdmVudHMoKVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2ludmFsaWQnLCBpbnZhbGlkSGFuZGxlciwgdHJ1ZSApXG5cbiAgICBFdmVudC5vbiggZG9jdW1lbnQuYm9keSwgJ2NsaWNrJywgJ1t0eXBlPXN1Ym1pdF0nLCBzdWJtaXQgKVxuXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAndmFsaWRhdGUnLCAnZm9ybScsIGZ1bmN0aW9uKCBldmVudCApIHsgXG4gICAgICB2YWxpZGF0ZUZvcm0oIGV2ZW50LnRhcmdldCApXG4gICAgfSlcblxuICAgIC8vIEVuc3VyZSBhbGwgcmVxdWlyZWQgaW5wdXRzIGhhdmUgYXJpYS1yZXF1cmlyZWQgYXR0cmlidXRlc1xuICAgIHRvb2xib3guc2xpY2UoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbcmVxdWlyZWRdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7IFxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdhcmlhLXJlcXVpcmVkJywgdHJ1ZSApXG4gICAgfSlcblxuICAgIC8vIFdhdGNoIGlucHV0IGV2ZW50c1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2JsdXInLCAnW3JlcXVpcmVkXScsIGNoZWNrVmFsaWRhdGlvbiApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAna2V5ZG93bicsICdbcmVxdWlyZWRdJywgRXZlbnQuZGVib3VuY2UoIGNoZWNrVmFsaWRhdGlvbiwgMjAwICkgKVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ3NlbGVjdFtyZXF1aXJlZF0nLCBFdmVudC5kZWJvdW5jZSggY2hlY2tWYWxpZGF0aW9uLCAyMDAgKSApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2hhbmdlJywgJ1t0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF0nLCBjaGVja1ZhbGlkYXRpb24gKVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NoYW5nZScsICdbZGF0YS1ncm91cGVkLXZhbGlkYXRpb25dJywgY2hlY2tWYWxpZGF0aW9uIClcblxuICB9XG59KVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZvcm0gKCBmb3JtICkge1xuXG4gIC8vIFNjb3BlZCB2YXJpYWJsZXNcbiAgdmFyIGlucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJ1tyZXF1aXJlZF0nICksXG4gICAgICBpbnZhbGlkSW5wdXQ7XG5cbiAgdG9vbGJveC5zbGljZSggaW5wdXRzICkuc29tZSggZnVuY3Rpb24oIGlucHV0ICkge1xuXG4gICAgLy8gaWYgaW52YWxpZFxuICAgIGlmICggIWdldENsb3Nlc3QoIGlucHV0LCAnW2Rpc2FibGVkXScgKSAmJiAhY2hlY2tJbnB1dCggaW5wdXQgKSApIHtcbiAgICAgIGludmFsaWRJbnB1dCA9IGlucHV0XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSlcblxuICBpZiAoIGludmFsaWRJbnB1dCApIHsgXG5cbiAgICAvLyBTaG93IHZhbGlkYXRpb24gbWVzc2FnZVxuICAgIGZvY3VzKCBpbnZhbGlkSW5wdXQgKVxuICAgIHNob3dNZXNzYWdlKCBpbnZhbGlkSW5wdXQgKVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUaGUgZm9ybSBpcyB2YWxpZCwgc2tpcCBpdFxuICBlbHNlIHsgXG4gICAgcmV0dXJuIHRydWUgXG4gIH1cblxufVxuXG4vLyBIYW5kbGVyIGZvciB2YWxpZGF0aW9uIGV2ZW50c1xudmFyIGNoZWNrVmFsaWRhdGlvbiA9IEV2ZW50LmNhbGxiYWNrLm5ldyggZnVuY3Rpb24oIGV2ZW50ICkge1xuXG4gIGlmICggY2hlY2tJbnB1dCggZXZlbnQudGFyZ2V0LCBldmVudC50eXBlICkgKSB7XG5cbiAgICAvLyBSZW1vdmUgYW55IHByZS1leGlzdGluZyB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICBoaWRlTWVzc2FnZSggZXZlbnQudGFyZ2V0IClcbiAgfVxuXG59KVxuXG5cbmZ1bmN0aW9uIGNoZWNrSW5wdXQgKCBpbnB1dCwgZXZlbnQgKSB7XG5cbiAgdmFyIGVsICAgICAgID0gc3RhdHVzRWwoIGlucHV0ICksXG4gICAgICB2YWxpZCAgICA9IGlzVmFsaWQoIGlucHV0ICksXG4gICAgICBuZXV0cmFsICA9IGV2ZW50ID09ICdrZXlkb3duJyAmJiAhdmFsaWQ7XG5cbiAgLy8gRG9uJ3QgdHJpZ2dlciBpbnZhbGlkIHN0eWxlIHdoaWxlIHR5cGluZ1xuICBpZiAoIG5ldXRyYWwgJiYgaW5wdXQgPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCApIHtcblxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdpbnZhbGlkJywgJ3ZhbGlkJyApXG4gICAgaW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1pbnZhbGlkJywgZmFsc2UgKVxuXG4gIH0gZWxzZSB7XG5cbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCAnaW52YWxpZCcsICF2YWxpZCApXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ3ZhbGlkJywgdmFsaWQgKVxuICAgIGlucHV0LnNldEF0dHJpYnV0ZSggJ2FyaWEtaW52YWxpZCcsIHZhbGlkIClcblxuICB9XG5cbiAgcmV0dXJuIHZhbGlkXG5cbn1cblxuLy8gSXMgYW4gaW5wdXQgdmFsaWQ/XG5mdW5jdGlvbiBpc1ZhbGlkICggaW5wdXQgKSB7XG5cbiAgLy8gSWYgZWxlbWVudCBvbmx5IGNvbnRhaW5zIHdoaXRlc3BhY2UsIHN0cmlwIHZhbHVlXG4gIGlmICggIWlucHV0LnZhbHVlLnJlcGxhY2UoIC9cXHMvZywgJycgKS5sZW5ndGggKVxuICAgIGlucHV0LnZhbHVlID0gJydcblxuICAvLyBTZXQgYSBjdXN0b20gdmFsaWRhdGlvbiBtZXNzYWdlIGZvciB3b3JkIGNvdW50XG4gIHZhciBtZXNzYWdlID0gY2hlY2tWYWx1ZSggaW5wdXQgKSB8fCBjaGVja0xlbmd0aCggaW5wdXQgKSB8fCBjaGVja1RpbWUoIGlucHV0ICkgfHwgY2hlY2tTd2l0Y2hHcm91cCggaW5wdXQgKSB8fCAnJ1xuICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSggbWVzc2FnZSApXG5cbiAgdmFyIHZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpXG5cbiAgcmV0dXJuIHZhbGlkXG5cbn1cblxuXG5mdW5jdGlvbiBjaGVja1ZhbHVlKCBpbnB1dCApIHtcbiAgaWYgKCBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZSApIHtcblxuICAgIC8vIERvZXMgaW5wdXQgdmFsdWUgPT0gaW52YWxpZCB2YWx1ZT8gKGNhc2UgaW5zZW5zaXRpdmUpXG4gICAgdmFyIHJlZ2V4cCA9IGVzY2FwZWRSZWdleCggaW5wdXQuZGF0YXNldC5pbnZhbGlkVmFsdWUsICdpJyApXG5cbiAgICBpZiAoIGlucHV0LnZhbHVlLm1hdGNoKCByZWdleHAgKSApIHtcblxuICAgICAgLy8gUmVtb3ZlIGFueSBzdGFuZGFyZCBjdXN0b20gbWVzc2FnZVxuICAgICAgaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlID0gaW5wdXQuZGF0YXNldC5tZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2UgPSAnJ1xuXG4gICAgICByZXR1cm4gaW5wdXQuZGF0YXNldC5pbnZhbGlkVmFsdWVNZXNzYWdlIHx8IFwiVmFsdWUgJ1wiK2lucHV0LnZhbHVlK1wiJyBpcyBub3QgcGVybWl0dGVkXCJcblxuICAgIC8vIElmIG5vdCBpbnZhbGlkIHZhbHVlIHJlc2V0IHN0YW5kYXJkIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgIH0gZWxzZSBpZiAoIGlucHV0LmRhdGFzZXQuY2FjaGVkTWVzc2FnZSApIHtcblxuICAgICAgaW5wdXQuZGF0YXNldC5tZXNzYWdlID0gaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2UgPSAnJ1xuXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRSZWdleCggaW5wdXQsIG9wdGlvbnMgKSB7XG4gIHZhciBzdHIgPSBpbnB1dC5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKVxuICByZXR1cm4gbmV3IFJlZ0V4cCggXCJeXCIgKyBzdHIgKyAnJCcsIG9wdGlvbnMgKVxufVxuXG5mdW5jdGlvbiBjaGVja0xlbmd0aCAoIGlucHV0ICkge1xuICByZXR1cm4gY2hlY2tDb3VudCggaW5wdXQsICdtaW4nIClcbiAgICAgIHx8IGNoZWNrQ291bnQoIGlucHV0LCAnbWF4JyApXG59XG5cbi8vIFRlc3QgY3VzdG9tIHZhbGlkYXRpb24gZm9yIG1heGltdW0gb3IgbWluaW11bSB3b3JkcyBwcmVzZW50XG5mdW5jdGlvbiBjaGVja0NvdW50ICggaW5wdXQsIGxpbWl0ICkge1xuXG4gIHZhciBnb2FsID0gaW5wdXQuZGF0YXNldFsgbGltaXQgKyAnV29yZHMnIF1cblxuICBpZiAoIGdvYWwgKSB7XG4gICAgdmFyIHBocmFzaW5nICAgPSAoIGxpbWl0ID09ICdtaW4nICkgPyAnYXQgbGVhc3QgJyA6ICdubyBtb3JlIHRoYW4gJyxcbiAgICAgICAgdmFsaWQgICAgICA9ICggbGltaXQgPT0gJ21pbicgKSA/ICggZ29hbCA8PSB3b3JkQ291bnQoaW5wdXQudmFsdWUpICkgOiAoIHdvcmRDb3VudChpbnB1dC52YWx1ZSkgPD0gZ29hbCApXG5cbiAgICAvLyBSZXR1cm4gYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgIGlmICggaW5wdXQudmFsdWUgJiYgIXZhbGlkIClcbiAgICAgIHJldHVybiAnUGxlYXNlIHdyaXRlICcgKyBwaHJhc2luZyArIGdvYWwgKyAnIHdvcmRzLidcbiAgfVxuXG5cbn1cblxuLy8gVGVzdCBjdXN0b20gdmFsaWRhdGlvbiBmb3IgbWF4aW11bSBhbmQgbWluaW11bSB0aW1lXG5mdW5jdGlvbiBjaGVja1RpbWUgKCBpbnB1dCApIHtcbiAgdmFyIGJlZm9yZSA9IGlucHV0LmRhdGFzZXQuYmVmb3JlVGltZSxcbiAgICAgIGFmdGVyID0gaW5wdXQuZGF0YXNldC5hZnRlclRpbWVcblxuICBpZiAoIGJlZm9yZSB8fCBhZnRlciB8fCBpbnB1dC5kYXRhc2V0LnZhbGlkYXRlVGltZSApIHtcbiAgICB2YXIgem9uZSA9IGlucHV0LmRhdGFzZXQuem9uZSB8fCAndXRjJyxcbiAgICAgICAgb3B0aW9ucyA9IHsgem9uZTogem9uZSB9LFxuICAgICAgICB0aW1lVmFsdWUgPSB0VGltZS5wYXJzZSggaW5wdXQudmFsdWUsIG9wdGlvbnMgKSxcbiAgICAgICAgZXJyID0gJycsXG4gICAgICAgIGlzQWZ0ZXIsIGFmdGVyVGltZSwgaXNCZWZvcmUsIGJlZm9yZVRpbWVcblxuICAgIC8vIEVudXJlIHRoYXQgdGhlIHRpbWUgdmFsdWUgaXMgYWN0dWFsbHkgXG4gICAgaWYgKCAhdGltZVZhbHVlICkgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSBzdHJpbmc6IFlZWVktTU0tREQgSEg6TU06U1NcIlxuXG4gICAgaWYgKCBiZWZvcmUgKSB7XG4gICAgICBiZWZvcmVUaW1lID0gdFRpbWUucGFyc2UoIGJlZm9yZSApXG5cbiAgICAgIGlmICggIWJlZm9yZVRpbWUgKSB7XG4gICAgICAgIGVyciA9IGBkYXRhLWJlZm9yZS10aW1lPScke2JlZm9yZX0nIGlzIG5vdCBhIHZhbGlkIGRhdGUgc3RyaW5nYFxuICAgICAgICBjb25zb2xlLmVycm9yKCBlcnIgKVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBhZnRlciApIHtcbiAgICAgIGFmdGVyVGltZSA9IHRUaW1lLnBhcnNlKCBhZnRlciApXG5cbiAgICAgIGlmICggIWFmdGVyVGltZSApIHtcbiAgICAgICAgZXJyID0gYGRhdGEtYWZ0ZXItdGltZT0nJHthZnRlcn0nIGlzIG5vdCBhIHZhbGlkIGRhdGUgc3RyaW5nYFxuICAgICAgICBjb25zb2xlLmVycm9yKCBlcnIgKVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBiZWZvcmVUaW1lICYmIGFmdGVyVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQmV0d2VlbiggdGltZVZhbHVlLCBhZnRlclRpbWUsIGJlZm9yZVRpbWUgKSApIHtcbiAgICAgICAgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdGltZSBiZXR3ZWVuIFwiK2Zvcm1hdERhdGUoIGFmdGVyVGltZSwgb3B0aW9ucyApK1wiIGFuZCBcIitmb3JtYXREYXRlKCBiZWZvcmVUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9IFxuXG4gICAgZWxzZSBpZiAoIGFmdGVyVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQWZ0ZXIoIHRpbWVWYWx1ZSwgYWZ0ZXJUaW1lICkgKSB7IFxuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGFmdGVyIFwiK2Zvcm1hdERhdGUoIGFmdGVyVGltZSwgb3B0aW9ucyApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxzZSBpZiAoIGJlZm9yZVRpbWUgKSB7XG4gICAgICBpZiAoICF0VGltZS5pc0JlZm9yZSggdGltZVZhbHVlLCBiZWZvcmVUaW1lICkgKSB7IFxuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGJlZm9yZSBcIitmb3JtYXREYXRlKCBiZWZvcmVUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZSggZGF0ZSwgb3B0aW9ucyApIHtcbiAgcmV0dXJuIHRUaW1lLnByZXR0eVByaW50KCBkYXRlLCBvcHRpb25zICkucmVwbGFjZSggJyBaJywgJycpXG59XG5cbmZ1bmN0aW9uIGNoZWNrU3dpdGNoR3JvdXAgKCBpbnB1dCApIHtcbiAgLy8gQ2hlY2sgaW5wdXRzIHdpdGggJ2RhdGEtZ3JvdXBlZC12YWxpZGF0aW9uJ1xuICBpZiAoaW5wdXQuZGF0YXNldC5ncm91cGVkVmFsaWRhdGlvbikge1xuICAgIC8vIElmIHRoZSBpbnB1dCBoYXMgJ2RhdGEtZ3JvdXBlZC12YWxpZGF0aW9uJywgZmluZCBhbGxcbiAgICAvLyBjaGVja2JveCBpbnB1dHMgd2l0aCB0aGUgc2FtZSBuYW1lXG4gICAgdmFyIGlucHV0TmFtZSAgICAgPSBpbnB1dC5uYW1lLFxuICAgICAgICBpbnB1dEdyb3VwICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9J2NoZWNrYm94J11bbmFtZT0nXCIgKyBpbnB1dE5hbWUgKyBcIiddXCIpLFxuICAgICAgICBlcnIgICAgICAgICAgID0gJycsXG4gICAgICAgIG1pbk9uZUNoZWNrZWQgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGVhY2ggaW5wdXQgdG8gZW5zdXJlIGF0IGxlYXN0IG9uZSBpcyBjaGVja2VkXG4gICAgZm9yIChpPTA7IGk8aW5wdXRHcm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlucHV0R3JvdXBbaV0uY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICBtaW5PbmVDaGVja2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBvbmUgaXMgbm90IGNoZWNrZWQsIHJldHVybiBlcnJvciBtZXNzYWdlLlxuICAgIGlmIChtaW5PbmVDaGVja2VkICE9PSB0cnVlKSB7XG4gICAgICBmb3IgKGk9MDsgaTxpbnB1dEdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlucHV0R3JvdXBbaV0ucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gXCJZb3UgbXVzdCBzZWxlY3QgYXQgbGVhc3Qgb25lIG9wdGlvbi5cIlxuICAgICAgfSBcbiAgICAvLyBJZiBhdCBsZWFzdCBvbmUgaXMgY2hlY2tlZCwgcmVtb3ZlIHJlcXVpcmVkIGZyb20gb3RoZXIgaW5wdXRzLlxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGk9MDsgaTxpbnB1dEdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlucHV0R3JvdXBbaV0ucmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG4vLyBJZiBpbnB1dCBpcyBuZXN0ZWQgaW4gYSBsYWJlbCwgdHJlYXQgdGhlIGxhYmVsIGFzIHRoZVxuLy8gdGFyZ2V0IGZvciBhc3NpZ25pbmcgc3RhdHVzIChjbGFzcyBuYW1lcyBhbmQgbWVzc2FnZXMpLlxuZnVuY3Rpb24gc3RhdHVzRWwgKCBpbnB1dCApIHtcblxuICByZXR1cm4gZ2V0Q2xvc2VzdCggaW5wdXQsICdsYWJlbCcgKSB8fCBpbnB1dFxuXG59XG5cbi8vIEZvY3VzKCkgaWYgaW52YWxpZCBlbGVtZW50IGlzIG5vdCBoaWRkZW5cbi8vIG9yIEZvY3VzIGl0cyBpbW1lZGlhdGUgc2libGluZyAobW9zdGx5IHVzZWQgZm9yIHVwbG9hZCBidXR0b25zKVxuZnVuY3Rpb24gZm9jdXMgKCBlbCApIHtcblxuICBlbCA9ICggZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICkgPyBlbCA6IGVsLm5leHRTaWJsaW5nXG4gIGVsLmZvY3VzKClcblxufVxuXG4vLyBTdWJtaXNzaW9uIHZhbGlkYXRpb24gaGFuZGxlciBmdW5jdGlvblxuZnVuY3Rpb24gc3VibWl0ICggZXZlbnQgKSB7XG5cbiAgdmFyIGZvcm0gPSAoIGV2ZW50LnRhcmdldC50YWdOYW1lID09IFwiRk9STVwiICkgPyBldmVudC50YXJnZXQgOiBnZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdmb3JtJylcblxuICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgbm8gaW52YWxpZCBpbnB1dHMgZm91bmRcbiAgaWYgKCAhdmFsaWRhdGVGb3JtKCBmb3JtICkgKSB7XG5cbiAgICAvLyBQYXVzZSBrZXlkb3duL2JsdXIgdHJpZ2dlcnMgZm9yIHRoZSBuZXh0IHNlY29uZCB0byBhdm9pZCBuZXV0cmFsIGVtcHR5IHN0eWxlXG4gICAgY2hlY2tWYWxpZGF0aW9uLnN0b3AoKVxuICAgIEV2ZW50LmRlbGF5KCBjaGVja1ZhbGlkYXRpb24uc3RhcnQsIDUwMCApXG5cbiAgICAvLyBTdG9wIHRoZSBzdWJtaXNzaW9uIGV2ZW50XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGludmFsaWRhdGVGaWVsZCAoIGVsLCBtZXNzYWdlICkge1xuICBpZiAoIGVsICYmIGVsLnZhbHVlICkge1xuICAgIGVsLmRhdGFzZXQuaW52YWxpZFZhbHVlID0gZWwudmFsdWVcbiAgICBpZiAoIG1lc3NhZ2UgKVxuICAgICAgZWwuZGF0YXNldC5pbnZhbGlkVmFsdWVNZXNzYWdlID0gbWVzc2FnZVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVNZXNzYWdlICggZWwgKSB7XG5cbiAgdmFyIGZvcm0gPSBnZXRDbG9zZXN0KCBlbCwgJ2Zvcm0nICksXG4gICAgICBtc2cgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlJyApXG5cbiAgaWYgKCBtc2cgKSBtc2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbXNnIClcblxufVxuXG5cbi8vIFZhbGlkYXRpb24gbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9uXG5mdW5jdGlvbiBzaG93TWVzc2FnZSAoIGVsICkge1xuXG4gIC8vaGlkZU1lc3NhZ2UoIGVsIClcblxuICB2YXIgbGFiZWwgPSBnZXRDbG9zZXN0KCBlbCwgJ2xhYmVsJyApLFxuICAgICAgbWVzc2FnZSA9IGVsLmRhdGFzZXQubWVzc2FnZSB8fCBlbC52YWxpZGF0aW9uTWVzc2FnZVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGV4aXN0aW5nTWVzc2FnZSA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlLXRleHQnIClcblxuICAgIGlmICggIWV4aXN0aW5nTWVzc2FnZSApIHtcbiAgICAgIGxhYmVsLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsICAnPHNwYW4gY2xhc3M9XCJ2YWxpZGF0aW9uLW1lc3NhZ2VcIj48c3BhbiBjbGFzcz1cInZhbGlkYXRpb24tbWVzc2FnZS10ZXh0XCIgcm9sZT1cImFsZXJ0XCI+JyArIG1lc3NhZ2UgKyAnPC9zcGFuPjwvc3Bhbj4nIClcblxuICAgIH0gZWxzZSBpZiAoIGV4aXN0aW5nTWVzc2FnZS50ZXh0Q29udGVudCAhPSBtZXNzYWdlICkge1xuICAgICAgZXhpc3RpbmdNZXNzYWdlLmlubmVySFRNTCA9IG1lc3NhZ2VcbiAgICB9XG4gIH1cblxufVxuXG4vLyBQdWJsaWMgQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGU6IHZhbGlkYXRlRm9ybSxcbiAgaW52YWxpZGF0ZUZpZWxkOiBpbnZhbGlkYXRlRmllbGRcbn1cbiIsInZhciBUaW1lVG9nZ2xlID0gcmVxdWlyZSgnLi9saWIvdG9nZ2xlLmpzJylcbnZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG5UaW1lVG9nZ2xlLnRpbWVhZ28gPSByZXF1aXJlKCcuL2xpYi90aW1lYWdvLmpzJylcblRpbWVUb2dnbGUuZGF0ZVRvSFRNTCA9IHJlcXVpcmUoJy4vbGliL2RhdGUtdG8taHRtbC5qcycpXG5cbkV2ZW50LnJlYWR5KFRpbWVUb2dnbGUubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRpbWVUb2dnbGUuc2V0dXApXG5cbm1vZHVsZS5leHBvcnRzID0gVGltZVRvZ2dsZVxuIiwiLy8gQ29udmVydHMgYSBzaW1wbGUgZGF0ZSBzdHJpbmcgaW50byBEYXRlICsgVGltZSArIFRpbWV6b25lIHdyYXBwZWQgaW4gSFRNTFxuLy9cbi8vIElucHV0OlxuLy8gLSBTdHJpbmcsIGNvbXBhdGlibGUgd2l0aCBKUyBkYXRlIHBhcnNpbmcgZS5nLiBcIjIwMTQtMTAtMjBcIiBvciBcIjIwMTQtMDUtMjEgMTA6NjNcIlxuLy8gLSBTdHJpbmcsIHRpbWV6b25lOiBcIlVUQ1wiLCBcIkNTVFwiLCBldGMuXG4vL1xuLy8gUmV0dXJuczogSFRNTCB3aGljaCBpcyBcIjIwMTQtMDEtMjggMTg6MDA6MDAgQ1NUXCIsIHNlcGFyYXRlZCBhbmQgd3JhcHBlZCB3aXRoIHNwYW5zXG4vLyB3aXRoIGNsYXNzbmFtZXM6IGRhdGUsIHRpbWUgYW5kIHRpbWV6b25lXG4vL1xudmFyIERhdGVUb0hUTUwgPSB7XG4gIHN1cHBvcnRlZDogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKFwiMjAxNC0wMS0yOVQxODoxNDoyOSswMDowMFwiKS5nZXREYXRlKCkpXG4gIH0sXG5cbiAgbG9jYWw6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCBmYWxzZSlcbiAgfSxcblxuICB1dGM6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCB0cnVlKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiBkYXRlVG9IdG1sKGRhdGVTdHJpbmcsIHV0Yykge1xuICAgIGlmKCFEYXRlVG9IVE1MLnN1cHBvcnRlZCgpKXsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHZhciBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZylcblxuICAgIC8vIElmIGRhdGUgaXMgaW52YWxpZCwgYmFpbFxuICAgIGlmKGlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZih1dGMpIHtcbiAgICAgIHZhciB5ICA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICAgICAgdmFyIG1vID0gcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpXG4gICAgICB2YXIgZCAgPSBwYWQoZGF0ZS5nZXRVVENEYXRlKCkpXG4gICAgICB2YXIgaCAgPSBwYWQoZGF0ZS5nZXRVVENIb3VycygpKVxuICAgICAgdmFyIG0gID0gcGFkKGRhdGUuZ2V0VVRDTWludXRlcygpKVxuICAgICAgdmFyIHMgID0gcGFkKGRhdGUuZ2V0VVRDU2Vjb25kcygpKVxuICAgICAgdmFyIHpvbmUgPSAnVVRDJ1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeSAgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgIHZhciBtbyA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICAgICAgdmFyIGQgID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgICAgdmFyIGggID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICAgIHZhciBtICA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgICAgIHZhciBzICA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICAgIHZhciB6b25lID0gRGF0ZVRvSFRNTC50aW1lem9uZShkYXRlKVxuICAgIH1cblxuICAgIHZhciBzdHIgPSAnPHNwYW4gY2xhc3M9XCJkYXRlXCI+Jyt5KyctJyttbysnLScrZCsnPC9zcGFuPidcbiAgICBzdHIgKz0gJyA8c3BhbiBjbGFzcz1cInRpbWVcIj4nK2grJzonK20rJzonK3MrJzwvc3Bhbj4nXG4gICAgc3RyICs9ICcgPHNwYW4gY2xhc3M9XCJ0aW1lem9uZVwiPicrem9uZSsnPC9zcGFuPidcbiAgICByZXR1cm4gc3RyXG4gIH0sXG5cbiAgLy8gRXh0cmFjdCB0aW1lem9uZSBsYWJlbFxuICB0aW1lem9uZTogZnVuY3Rpb24oZGF0ZSl7XG4gICAgdmFyIHpvbmUgPSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpLy02MClcbiAgICB2YXIgdHogPSBTdHJpbmcoZGF0ZSkubWF0Y2goL1xcKCguKylcXCkkLylcblxuICAgIGlmKHR6KSB7XG4gICAgICAvLyBCcm93c2VyIGhhcyBmcmllbmRseSB0aW1lem9uZSBsYWJlbCBsaWtlICdFU1QnXG4gICAgICB2YXIgem9uZSA9IHR6WzFdXG4gICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnJvd3NlciB1c2VzIGEgR01UIG9mZnNldCArLy1cbiAgICAgIHZhciB6b25lID0gXCJHTVQgXCIgXG4gICAgICAgICAgem9uZSArPSAoKHpvbmUgPiAwKSA/ICcrJyA6ICcnKVxuICAgICAgICAgIHpvbmUgKz0gXCIgXCIrIHBhZCh6b25lKjEwMCwgNClcbiAgICB9XG5cbiAgICByZXR1cm4gem9uZVxuICB9XG59XG5cbnZhciBwYWQgPSBmdW5jdGlvbiBkYXRlUGFkKG51bSwgcGFkKXtcbiAgcGFkID0gcGFkIHx8IDJcbiAgd2hpbGUoU3RyaW5nKG51bSkubGVuZ3RoIDwgcGFkKSB7XG4gICAgbnVtID0gJzAnICsgbnVtXG4gIH1cbiAgcmV0dXJuIG51bVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGVUb0hUTUxcbiIsIi8vIFRpbWVhZ28gYnkgQnJhbmRvbiBNYXRoaXMsIGJhc2VkIG9uIEphdmFTY3JpcHQgUHJldHR5IERhdGUgQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gUmVzaWdcbi8vIFJldHVybnMgcmVsYXRpdmUgdGltZVxuXG52YXIgVGltZWFnbyA9IHtcbiAgLy8gc2V0dXAgSFRNTCB0ZW1wbGF0ZXNcbiAgc2V0dXA6IGZ1bmN0aW9uIHRpbWVhZ29TZXR1cCgpIHtcblxuICAgIHZhciB0aW1lRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpbWVhZ29bZGF0ZXRpbWVdJylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGltZUVscywgZnVuY3Rpb24oZWwpIHtcbiAgICAgIHZhciBkYXRldGltZSA9IGVsLmF0dHJpYnV0ZXMuZGF0ZXRpbWUudmFsdWVcbiAgICAgIHZhciBzdHlsZSA9IGVsLmRhdGFzZXQudGltZWFnb1N0eWxlXG4gICAgICBlbC5pbm5lckhUTUwgPSBUaW1lYWdvLnBhcnNlKGRhdGV0aW1lLCBzdHlsZSlcbiAgICB9KVxuICB9LFxuXG4gIC8vIElmIGEgYnJvd3NlciBjYW4ndCBoYW5kbGUgZGF0ZXMsIGJhaWwuXG4gIGJyb3dzZXJTdXBwb3J0OiBmdW5jdGlvbiB0aW1lYWdvQnJvd3NlclN1cHBvcnQoKSB7XG4gICAgcmV0dXJuICFpc05hTihuZXcgRGF0ZShcIjIwMTQtMDEtMjlUMTg6MTQ6MjkrMDA6MDBcIikuZ2V0RGF0ZSgpKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiB0aW1lYWdvUGFyc2UodGltZSwgc3R5bGUpIHtcblxuICAgIGlmICh0eXBlb2YodGltZSkgPT0gJ3N0cmluZycpIHtcbiAgICAgIHRpbWUgPSBuZXcgRGF0ZSh0aW1lKVxuICAgIH1cblxuICAgIGlmIChzdHlsZSA9PT0gJ3Nob3J0JylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwibm93XCIsXG4gICAgICBtaW51dGVfYWdvOiAgXCIxbVwiLFxuICAgICAgbWludXRlc19hZ286IFwibVwiLFxuICAgICAgaG91cl9hZ286ICAgIFwiMWhcIixcbiAgICAgIGhvdXJzX2FnbzogICBcImhcIixcbiAgICAgIHllc3RlcmRheTogICBcIjFkXCIsXG4gICAgICBkYXlzX2FnbzogICAgXCJkXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxd1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwid1wiXG4gICAgfVxuXG4gICAgZWxzZSBpZiAoc3R5bGUgPT09ICdsb25nJylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwianVzdCBub3dcIixcbiAgICAgIG1pbnV0ZV9hZ286ICBcIjEgbWludXRlIGFnb1wiLFxuICAgICAgbWludXRlc19hZ286IFwiIG1pbnV0ZXMgYWdvXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXIgYWdvXCIsXG4gICAgICBob3Vyc19hZ286ICAgXCIgaG91cnMgYWdvXCIsXG4gICAgICB5ZXN0ZXJkYXk6ICAgXCIxIGRheSBhZ29cIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzIGFnb1wiLFxuICAgICAgbGFzdF93ZWVrOiAgIFwiMSB3ZWVrIGFnb1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwiIHdlZWtzIGFnb1wiXG4gICAgfVxuXG4gICAgZWxzZVxuICAgIHZhciBzYXkgPSB7XG4gICAgICBqdXN0X25vdzogICAgXCJqdXN0IG5vd1wiLFxuICAgICAgbWludXRlX2FnbzogIFwiMSBtaW51dGVcIixcbiAgICAgIG1pbnV0ZXNfYWdvOiBcIiBtaW51dGVzXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXJcIixcbiAgICAgIGhvdXJzX2FnbzogICBcIiBob3Vyc1wiLFxuICAgICAgeWVzdGVyZGF5OiAgIFwiMSBkYXlcIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxIHdlZWtcIixcbiAgICAgIHdlZWtzX2FnbzogICBcIiB3ZWVrc1wiXG4gICAgfVxuXG4gICAgdmFyIHNlY3MgICA9ICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0aW1lKS5nZXRUaW1lKCkpIC8gMTAwMClcbiAgICB2YXIgbWlucyAgID0gTWF0aC5mbG9vcihzZWNzIC8gNjApXG4gICAgdmFyIGhvdXJzICA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApXG4gICAgdmFyIGRheXMgICA9IE1hdGguZmxvb3Ioc2VjcyAvIDg2NDAwKVxuICAgIHZhciB3ZWVrcyAgPSBNYXRoLmZsb29yKGRheXMgLyA3KVxuICAgIHZhciBtb250aHMgPSBNYXRoLmZsb29yKGRheXMgLyAzMClcblxuICAgIGlmKGlzTmFOKHNlY3MpIHx8IGRheXMgPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZihkYXlzID09PSAwKSB7XG4gICAgICBpZiAgICAgKHNlY3MgPCA2MCkgICByZXR1cm4gc2F5Lmp1c3Rfbm93XG4gICAgICBlbHNlIGlmKHNlY3MgPCAxMjApICByZXR1cm4gc2F5Lm1pbnV0ZV9hZ28gXG4gICAgICBlbHNlIGlmKHNlY3MgPCAzNjAwKSByZXR1cm4gbWlucyArIHNheS5taW51dGVzX2FnbyBcbiAgICAgIGVsc2UgaWYoc2VjcyA8IDcyMDApIHJldHVybiBzYXkuaG91cl9hZ29cbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHJldHVybiBob3VycyArIHNheS5ob3Vyc19hZ29cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZGF5cyA9PT0gMSkgICAgICAgcmV0dXJuIHNheS55ZXN0ZXJkYXlcbiAgICAgIGVsc2UgaWYoZGF5cyA8IDcpICAgIHJldHVybiBkYXlzICsgc2F5LmRheXNfYWdvXG4gICAgICBlbHNlIGlmKHdlZWtzID09PSAxKSByZXR1cm4gc2F5Lmxhc3Rfd2Vla1xuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgcmV0dXJuIHdlZWtzICsgc2F5LndlZWtzX2Fnb1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbWVhZ29cbiIsInZhciBUaW1lYWdvID0gcmVxdWlyZSgnLi90aW1lYWdvJylcbnZhciBEYXRlVG9IVE1MID0gcmVxdWlyZSgnLi9kYXRlLXRvLWh0bWwnKVxudmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGUgPSB7XG4gIHRpbWVFbHM6IGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aW1lLXRvZ2dsZVtkYXRldGltZV0nKVxuICB9LFxuXG4gIC8vIFRoZSBrZXkgaXMgdGhlIGN1cnJlbnQgdGltZSwgdGhlIHZhbHVlIGlzIHRoZSBuZXh0IHRpbWUgdHlwZSB0byBiZSBkaXNwbGF5ZWRcbiAgbmV4dFRpbWU6IHtcbiAgICAndGltZWFnbyc6ICdsb2NhbCcsXG4gICAgJ2xvY2FsJzogJ3V0YycsXG4gICAgJ3V0Yyc6ICd0aW1lYWdvJ1xuICB9LFxuXG4gIC8vIEF0dGFjaCBsaXN0ZW5lcnMsIHNldHVwIEhUTUwgdGVtcGxhdGVzXG4gIHNldHVwOiBmdW5jdGlvbigpIHtcbiAgICBpZighVGltZWFnby5icm93c2VyU3VwcG9ydCgpKSByZXR1cm4gZmFsc2VcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgVG9nZ2xlLmluaXQpXG4gIH0sXG5cbiAgLy8gQXR0YWNoIGxpc3RlbmVycyB0byB0b2dnbGUgdGltZSB6b25lcyB3aGluZSBjbGlja2VkXG4gIGxpc3RlbjogZnVuY3Rpb24oKSB7XG4gICAgaWYoIVRpbWVhZ28uYnJvd3NlclN1cHBvcnQoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGlja1wiLCBcIi50aW1lLXRvZ2dsZVwiLCBUb2dnbGUudG9nZ2xlKVxuICB9LFxuXG4gIC8vIFRvZ2dsZSBhbGwgdGltZXMgb24gcGFnZVxuICB0b2dnbGU6IGZ1bmN0aW9uKCBldmVudCApe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgZnVuY3Rpb24oZWwpIHtcbiAgICAgIFRvZ2dsZS50b2dnbGVFbChlbClcbiAgICB9KVxuXG4gICAgaWYgKCBldmVudCAmJiBldmVudC50YXJnZXQgKSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIH1cbiAgfSxcblxuICAvLyBTd2l0Y2ggYmV0d2VlbiB0aW1lIGFnbywgVVRDLCBhbmQgbG9jYWwgdGltZVxuICB0b2dnbGVFbDogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgZGF0ZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBuZXh0ID0gVG9nZ2xlLm5leHRUaW1lW2VsLmRhdGFzZXQubW9kZSB8fCAndGltZWFnbycgXVxuXG4gICAgVG9nZ2xlLnNldENvbnRlbnQoZWwsIFRvZ2dsZS5kYXRlSFRNTChkYXRlLCBuZXh0LCBlbCksIG5leHQpXG5cbiAgICByZXR1cm4gZWxcbiAgfSxcblxuICAvLyBTdXBwbHkgSFRNTCBmb3IgVVRDIGFuZCBsb2NhbCBkYXRldGltZVxuICAvL1xuICBpbml0OiBmdW5jdGlvbihlbCkge1xuICAgIHZhciBkYXRldGltZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBtb2RlID0gZWwuZGF0YXNldC5tb2RlIHx8ICd0aW1lYWdvJ1xuICAgIHZhciBodG1sID0gVG9nZ2xlLmRhdGVIVE1MKGRhdGV0aW1lLCBtb2RlLCBlbClcblxuICAgIGlmIChodG1sKXsgXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ3RvZ2dsZSB0aW1lJylcbiAgICAgIFRvZ2dsZS5zZXRDb250ZW50KGVsLCBodG1sLCBtb2RlKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0aW1lLXRvZ2dsZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsXG4gIH0sXG5cbiAgc2V0Q29udGVudDogZnVuY3Rpb24oIGVsLCBodG1sLCBtb2RlICkge1xuICAgIHZhciBkYXRlVGV4dE5vZGUgPSBlbC5xdWVyeVNlbGVjdG9yKCAnLmRhdGUtdGV4dCcgKVxuXG4gICAgaWYgKCBkYXRlVGV4dE5vZGUgKSB7XG4gICAgICBkYXRlVGV4dE5vZGUuaW5uZXJIVE1MID0gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj4nK2h0bWwrJzwvc3BhbidcbiAgICB9XG5cbiAgICBlbC5kYXRhc2V0Lm1vZGUgPSBtb2RlXG4gIH0sXG5cbiAgZGF0ZUhUTUw6IGZ1bmN0aW9uKGRhdGUsIHR5cGUsIGVsKSB7XG4gICAgaWYgKHR5cGUgPT0gJ3RpbWVhZ28nKVxuICAgICAgdmFyIHQgPSBUaW1lYWdvLnBhcnNlKGRhdGUsIGVsLmRhdGFzZXQudGltZWFnbylcbiAgICBlbHNlIGlmIChEYXRlVG9IVE1MW3R5cGVdKVxuICAgICAgdmFyIHQgPSBEYXRlVG9IVE1MW3R5cGVdKGRhdGUpXG5cbiAgICBpZiAodCkge1xuICAgICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J3RpbWUtdG9nZ2xlLWRhdGUgXCIrdHlwZStcIic+XCIgKyB0ICsgXCI8L3NwYW4+XCJcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG52YXIgVG9nZ2xlciA9IHtcbiAgY2hlY2tib3hTZWxlY3RvcjogXCJbdHlwZT1jaGVja2JveF1bZGF0YS10b2dnbGVdLCBbdHlwZT1jaGVja2JveF1bZGF0YS1zaG93XSwgW3R5cGU9Y2hlY2tib3hdW2RhdGEtaGlkZV1cIixcbiAgcmFkaW9TZWxlY3RvcjogXCJpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXNob3ddLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWhpZGVdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWFkZC1jbGFzc10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtcmVtb3ZlLWNsYXNzXVwiLFxuICBzZWxlY3RTZWxlY3RvcjogXCJvcHRpb25bZGF0YS1oaWRlXSwgb3B0aW9uW2RhdGEtc2hvd11cIixcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCl7XG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlXCIsIFwiW2RhdGEtdG9nZ2xlXSwgW2RhdGEtc2hvd10sIFtkYXRhLWhpZGVdLCBbZGF0YS10b2dnbGUtY2xhc3NdLCBbZGF0YS1hZGQtY2xhc3NdLCBbZGF0YS1yZW1vdmUtY2xhc3NdXCIsIFRvZ2dsZXIudHJpZ2dlcilcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjaGFuZ2VcIiwgXCIuc2VsZWN0LXRvZ2dsZXJcIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKHdpbmRvdywgJ2hhc2hjaGFuZ2UnLCBUb2dnbGVyLmhhc2hDaGFuZ2UpXG4gIH0sXG5cbiAgaGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCApIHtcblxuICAgICAgdmFyIGFuY2hvciA9ICdbZGF0YS1hbmNob3I9XCInK3dpbmRvdy5sb2NhdGlvbi5oYXNoKydcIl0nXG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2lucHV0JythbmNob3IrICcsIG9wdGlvbicrYW5jaG9yIClcblxuICAgICAgaWYgKCB0YXJnZXQgKSB7XG4gICAgICAgIGlmICggdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJyApIHtcbiAgICAgICAgICB0YXJnZXQuY2hlY2tlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHRhcmdldClcbiAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IHRhcmdldC5pbmRleFxuICAgICAgICAgIHRhcmdldCA9IHNlbGVjdFxuICAgICAgICB9XG4gICAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKCB0YXJnZXQgKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZWZyZXNoOiBmdW5jdGlvbigpe1xuICAgIFRvZ2dsZXIudG9nZ2xlQ2hlY2tib3hlcygpXG4gICAgVG9nZ2xlci5zZXR1cFNlbGVjdHMoKVxuICAgIFRvZ2dsZXIuc2V0dXBSYWRpb3MoKVxuICB9LFxuXG4gIHRyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gU3RvcCBldmVudCBhbmQgYnViYmxpbmcgaWYgbGluayBpcyBvbmx5IGJlaW5nIHVzZWQgYXMgYSB0b2dnbGVyXG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT0gXCIjXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3AoKVxuICAgIH0gXG5cbiAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudClcbiAgfSxcblxuICB0cmlnZ2VyVG9nZ2xpbmc6IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICB2YXIgYWN0aW9ucyA9IFsnaGlkZScsICd0b2dnbGUnLCAnc2hvdycsICdyZW1vdmVDbGFzcycsICd0b2dnbGVDbGFzcycsICdhZGRDbGFzcyddXG4gICAgdmFyIHNlbGVjdFxuXG4gICAgLy8gU3RvcmUgdGhlIHNlbGVjdCwgYW5kIHNldCB0aGUgdGFyZ2V0IHRvIHRoZSBjdXJyZW50IG9wdGlvblxuICAgIC8vIEV2ZW50cyBmaXJlIG9uIHRoZSBzZWxlY3QsIGJ1dCB0aGUgb3B0aW9ucyBoYXZlIHRvZ2dsaW5nIGF0dHJpYnV0ZXNcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUubWF0Y2goL3NlbGVjdC9pKSkge1xuICAgICAgc2VsZWN0ID0gdGFyZ2V0XG4gICAgICB0YXJnZXQgPSBzZWxlY3Quc2VsZWN0ZWRPcHRpb25zWzBdXG4gICAgfVxuXG4gICAgLy8gUmFkaW8gaW5wdXRzIGFuZCBzZWxlY3RzIGRvIG5vdCBzdXBwb3J0IHRvZ2dsaW5nLCBzbyByZW1vdmUgdGhlbVxuICAgIGFjdGlvbnMgPSBhY3Rpb25zLmZpbHRlcihmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3QgfHwgdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gIWFjdGlvbi5tYXRjaCgvdG9nZ2xlLylcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQuZGF0YXNldFthY3Rpb25dICE9IG51bGxcbiAgICB9KVxuICAgIFxuICAgIC8vIERpc3BhdGNoIGFsbCBhY3Rpb25zXG4gICAgYWN0aW9ucy5mb3JFYWNoKCBmdW5jdGlvbiggYWN0aW9uICkge1xuICAgICAgVG9nZ2xlci5kaXNwYXRjaCggdGFyZ2V0LCBhY3Rpb24gKVxuICAgIH0pXG4gIH0sXG5cbiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGVsLCB0eXBlKSB7XG4gICAgdmFyIGFjdGlvbiA9IHR5cGVcbiAgICB2YXIgZGF0YSA9IGVsLmRhdGFzZXRbdHlwZV1cblxuICAgIC8vIEFib3J0IGlmIGVsZW1lbnQgZG9lc24ndCBoYXZlIGRhdGEgZm9yIHRoZSBhY3Rpb25cbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcgfHwgZGF0YSA9PSAnJykgcmV0dXJuXG5cbiAgICAvLyBUb2dnbGUgYW5kIHNob3cgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIGNoZWNrYm94ZXNcbiAgICBpZiAoZWwudHlwZSA9PSAnY2hlY2tib3gnKVxuICAgICAgYWN0aW9uID0gKHR5cGUubWF0Y2goL2hpZGV8cmVtb3ZlL2kpID8gIWVsLmNoZWNrZWQgOiBlbC5jaGVja2VkKVxuXG4gICAgaWYgKGRhdGEpe1xuICAgICAgaWYgKHR5cGUubWF0Y2goL2NsYXNzL2kpKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhkYXRhLCBhY3Rpb24sIGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZShkYXRhLCBhY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEFkZCwgcmVtb3ZlLCBvciB0b2dnbGUgY2xhc3NuYW1lcywgdHJpZ2dlcmVkIGJ5IGVsZW1lbnRzIHdpdGg6XG4gIC8vICBkYXRhLWhpZGUtY2xhc3MsIGRhdGEtc2hvdy1jbGFzcywgYW5kIGRhdGEtdG9nZ2xlLWNsYXNzIHZhbHVlc1xuICAvL1xuICAvLyAgRGF0YSB2YWx1ZSBleGFtcGxlczpcbiAgLy8gICAtIFwiY2xhc3NuYW1lXCIgLSBhZGQvcmVtb3ZlL3RvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50XG4gIC8vICAgLSBcImZvbyBiYXJcIiAgIC0gbXVsdGlwbGUgY2xhc3NuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcyAobGlrZSBodG1sIGNsYXNzIHByb3BlcnR5KVxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3RvclwiIC0gY2hhbmdlIGNsYXNzbmFtZXMgb24gZWxlbWVudHMgbWF0Y2hlZCBieSBzZWxlY3RvclxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3Rvciwgc2VsZWN0b3JcIiAtIG1hdGNoIG11bHRpcGxlIHNlbGVjdG9yc1xuICAvL1xuICAvLyAgWW91IGNhbiBwZXJmb3JtIG11bHRpcGxlIGFkZC9yZW1vdmUgY2xhc3NlcyBieSBqb2luaW5nIHZhbHVlcyB3aXRoIGFuIGAmYFxuICAvLyAgRm9yIGV4YW1wbGU6IFwiY2xhc3NuYW1lICYgZm9vIGJhcjsgc2VsZWN0b3JcIlxuICAvLyAgVGhpcyB3b3VsZCB0b2dnbGUgY2xhc3NuYW1lIG9uIGN1cnJlbnQgZWxlbWVudCBhbmQgdG9nZ2xlIGBmb28gYmFyYCBjbGFzc25hbWVzXG4gIC8vICBvbiBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAvL1xuXG4gIHNldENsYXNzOiBmdW5jdGlvbiAoc2VsZWN0b3JzLCBhY3Rpb24sIGVsKXtcbiAgICBpZih0eXBlb2Ygc2VsZWN0b3JzID09ICd1bmRlZmluZWQnIHx8IHNlbGVjdG9ycyA9PSAnJykgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mKGFjdGlvbikgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhY3Rpb24gPSAoYWN0aW9uID8gJ2FkZCcgOiAncmVtb3ZlJylcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0b3JzLm1hdGNoKC8mLykpIHtcbiAgICAgIHNlbGVjdG9ycy5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24oc2VsKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhzZWwudHJpbSgpLCBhY3Rpb24sIGVsKSBcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0b3IgYW5kIGNsYXNzbmFtZXMsIGZvcm1hdDogXCJjbGFzc25hbWUgY2xhc3NuYW1lOyBzZWxlY3RvcixzZWxlY3RvclwiXG4gICAgdmFyIHNldHRpbmdzID0gc2VsZWN0b3JzLnNwbGl0KCc7JylcbiAgICB2YXIgY2xhc3NuYW1lcyA9IHNldHRpbmdzWzBdLnRyaW0oKVxuICAgIHZhciBtYXRjaGVzID0gW11cbiAgICBzZWxlY3RvcnMgPSBzZXR0aW5nc1sxXVxuXG4gICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIGFuZCBlbCBpcyBhbiBPUFRJT04sIHVzZSBpdHMgU0VMRUNUIGFzIHRoZSBtYXRjaGVkIGVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKGVsICYmIGVsLnRhZ05hbWUubWF0Y2goL29wdGlvbi9pKSkge1xuICAgICAgbWF0Y2hlcyA9IFtUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24oZWwpXVxuICAgICAgXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIHVzZSB0aGUgY3VycmVudCBlbCBmb3IgY2xhc3NuYW1lc1xuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIG1hdGNoZXMgPSBbZWxdXG4gICAgfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGNsYXNzbmFtZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NuYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBhY3Rpb24ucmVwbGFjZSgvQ2xhc3MvLCcnKVxuICAgICAgICBtYXRjaC5jbGFzc0xpc3RbbWV0aG9kXShjbGFzc25hbWUpXG4gICAgICB9KVxuXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgJ2NsYXNzJylcbiAgICB9KVxuICB9LFxuXG4gIHNldFN0YXRlOiBmdW5jdGlvbihzZWxlY3RvcnMsIHN0YXRlKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobWF0Y2hlcywgZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgdmFyIGFjdGlvbiA9IFRvZ2dsZXIudG9nZ2xlQWN0aW9uKG1hdGNoLCBzdGF0ZSlcblxuICAgICAgVG9nZ2xlclthY3Rpb25dKG1hdGNoKVxuICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xlckV2ZW50c09uQ2hpbGRyZW4obWF0Y2gsIGFjdGlvbilcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUFjdGlvbjogZnVuY3Rpb24oIGVsLCBhY3Rpb24gKSB7XG5cbiAgICBpZiAoIHR5cGVvZiBhY3Rpb24gPT0gJ2Jvb2xlYW4nICkge1xuICAgICAgYWN0aW9uID0gKCBhY3Rpb24gPyAnc2hvdycgOiAnaGlkZScgKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT0gJ3RvZ2dsZScpIHtcbiAgICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGluZycpICkge1xuICAgICAgICBhY3Rpb24gPSAnc2hvdydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbiA9ICdoaWRlJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSB8fCBcbiAgICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3Nob3dpbmcnICkgfHxcbiAgICAgICAgIGVsLm9mZnNldFBhcmVudCAhPSBudWxsICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nLCAnaGlkaW5nJyApXG5cbiAgICB2YXIgZnVsbHlTaG93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBSZW1vdmUgaGlkZGVuIGJlY2F1c2UgaXQgbWlnaHQgYmUgYWRkZWQgYmVmb3JlIHRoaXMgZmlyZXNcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdzaG93aW5nJywgJ2hpZGRlbicgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnIClcblxuICAgICAgLy8gRW5hYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gc2hvd25cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRm9jdXMgb24ga2V5IGVsZW1lbnQgaWYgYW4gZWxlbWVudCBleHBlY3RzIGZvY3VzXG4gICAgICB2YXIgZm9jdXNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzXScpXG4gICAgICBpZiAoZm9jdXNFbCkgeyBmb2N1c0VsLmZvY3VzKCkgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGlucHV0IGV2ZW50IG9uIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW5cbiAgICAgIHZhciByYW5nZXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYW5nZV0nKVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseVNob3csIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnc2hvd2luZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseVNob3coKVxuICAgIH1cbiAgfSxcblxuICBoaWRlOiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkZGVuJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkaW5nJyApICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHNob3dpbmcgYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICd2aXNpYmxlJywgJ3Nob3dpbmcnIClcblxuICAgIHZhciBmdWxseUhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRpbmcnLCAndmlzaWJsZScgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuXG4gICAgICAvLyBEaXNhYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gaGlkZGVuXG4gICAgICBpZiAoIHR5cGVvZiBlbC5kaXNhYmxlZCAhPSAndW5kZWZpbmVkJyApe1xuICAgICAgICBlbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGVsLmRhdGFzZXQuYW5pbWF0ZSApIHtcbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgZnVsbHlIaWRlLCB0cnVlKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGluZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseUhpZGUoKVxuICAgIH1cbiAgfSxcblxuICBnZXRMZWFmTm9kZXM6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAvLyBpcyB0aGUgcGFyZW50IGl0c2VsZiBhIGxlYWYgbm9kZT9cbiAgICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHJldHVybiBbcGFyZW50XVxuXG4gICAgdmFyIG5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSwgMClcblxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuIGVsZW0uY2hpbGRyZW4gJiYgZWxlbS5jaGlsZHJlbi5sZW5ndGggPT09IDBcbiAgICB9KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbjogZnVuY3Rpb24oZWwsIGV2ZW50TmFtZSl7XG4gICAgLy8gd2UgY2FyZSBhYm91dCBsZWFmIG5vZGVzIHNpbmNlIHRoZSBldmVudCB3aWxsIGJ1YmJsZSB0b1xuICAgIC8vIG5vbi1sZWFmIG5vZGVzIGZyb20gdGhlIGxlYWYgbm9kZXNcbiAgICB2YXIgbGVhZkNoaWxkTm9kZXMgPSBUb2dnbGVyLmdldExlYWZOb2RlcyhlbClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGVhZkNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIC8vICd0b2dnbGVyOnNob3cnLCAndG9nZ2xlcjpoaWRlJywgZXRjXG4gICAgICBFdmVudC5maXJlKG5vZGUsIFwidG9nZ2xlcjpcIiArIGV2ZW50TmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUNoZWNrYm94ZXM6IGZ1bmN0aW9uKGNoZWNrYm94ZXMpIHtcbiAgICBjaGVja2JveGVzID0gY2hlY2tib3hlcyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIuY2hlY2tib3hTZWxlY3RvcilcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2hlY2tib3hlcywgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcpXG4gIH0sXG5cbiAgc2V0dXBSYWRpb3M6IGZ1bmN0aW9uKCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnJhZGlvU2VsZWN0b3IpLCBmdW5jdGlvbihyYWRpbywgaW5kZXgpe1xuICAgICAgaWYgKCFyYWRpby5kYXRhc2V0LnRvZ2dsZXJBY3RpdmUpIHtcblxuICAgICAgICB2YXIgcmFkaW9OYW1lICAgICAgICAgPSByYWRpby5nZXRBdHRyaWJ1dGUoJ25hbWUnKSxcbiAgICAgICAgICAgIHNpYmxpbmdzICAgICAgICAgID0gVG9nZ2xlci5wYXJlbnRGb3JtKHJhZGlvKS5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYWRpb11bbmFtZT1cIicrcmFkaW9OYW1lKydcIl0nKSxcbiAgICAgICAgICAgIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ3Nob3cnKSxcbiAgICAgICAgICAgIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ2FkZENsYXNzJyksXG4gICAgICAgICAgICBjaGVja2VkXG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzaWJsaW5ncywgZnVuY3Rpb24ocil7XG5cbiAgICAgICAgICBpZiAoci5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK3IuZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgci5jaGVja2VkID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgaGF2ZSBhIGRlZmF1bHQgZGF0YS1zaG93IHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtc2hvdyB2YWx1ZXMgd2lsbCB0b2dnbGUgb2ZmIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5zaG93ID0gci5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICByLmRhdGFzZXQuYWRkQ2xhc3MgPSByLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIHIuZGF0YXNldC5oaWRlICYmIHIuZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCByLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgci5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gci5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLWFkZC1jbGFzcyB2YWx1ZSBvZiAnJ1xuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB1bnNldCBkYXRhLWFkZC1jbGFzcyB2YWx1ZXMgYXJlIHRvZ2dsZSBvZmYgYWxsIGNsYXNzZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyByZW1vdmUgY2xhc3NlcyBhY2NvcmRpbmdcbiAgICAgICAgICAvLyB0byB0aGUgZGVzZWxlY3RlZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgci5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyYnKVxuXG5cbiAgICAgICAgICByLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcblxuXG4gICAgICAgICAgaWYoIHIuY2hlY2tlZCApIGNoZWNrZWQgPSByXG5cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIGNoZWNrZWQgKSB7XG4gICAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIGNoZWNrZWQgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFRvZ2dsZXIuc2V0U3RhdGUoIHNob3dTZWxlY3RvcnMuam9pbignLCcpLCAnaGlkZScgKVxuICAgICAgICAgIFRvZ2dsZXIuc2V0Q2xhc3MoIGFkZENsYXNzU2VsZWN0b3JzLmpvaW4oJyAmICcpLCAncmVtb3ZlQ2xhc3MnIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgfSxcblxuICAvLyBBZGQgZGF0YS1oaWRlIHRvIGVhY2ggPG9wdGlvbj4gY29udGFpbmluZyB0aGUgc2VsZWN0b3JzIGZyb20gb3RoZXJcbiAgLy8gb3B0aW9uJ3MgZGF0YS1zaG93LiBUaGlzIG1ha2VzIHRoZSB0b2dnbGluZyBvZiBlbGVtZW50cyBleGNsdXNpdmUuXG4gIC8vXG4gIHNldHVwU2VsZWN0czogZnVuY3Rpb24oKXtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5zZWxlY3RTZWxlY3RvciksIGZ1bmN0aW9uKG9wdGlvbil7XG4gICAgICAvLyBQcmV2ZW50IGFuIG9wdGlvbiBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgdHdpY2VcbiAgICAgIGlmICghb3B0aW9uLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnNob3cgPSBvcHRpb24uZGF0YXNldC5zaG93IHx8ICcnXG5cbiAgICAgICAgdmFyIHNlbGVjdCA9IFRvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihvcHRpb24pXG4gICAgICAgIHNlbGVjdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3QtdG9nZ2xlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpXG5cbiAgICAgICAgdmFyIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnc2hvdycpXG4gICAgICAgIHZhciBhZGRDbGFzc1NlbGVjdG9ycyA9IFRvZ2dsZXIuZGF0YUF0dHJpYnV0ZXMob3B0aW9ucywgJ2FkZENsYXNzJylcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIGZ1bmN0aW9uKG8sIGluZGV4KSB7XG5cbiAgICAgICAgICBpZiAoby5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK28uZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBpbmRleFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG8uZGF0YXNldC5zaG93ID0gby5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICBvLmRhdGFzZXQuYWRkQ2xhc3MgPSBvLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIG8uZGF0YXNldC5oaWRlICYmIG8uZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCBvLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgLy8gSWYgc2hvdyBzZWxlY3RvcnMgYXJlIG5vdCBwcmVzZW50IGluIGVsZW1lbnQncyBkYXRhLXNob3dcbiAgICAgICAgICAvLyBBZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMgdG8gYmUgaGlkZGVuXG4gICAgICAgICAgby5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gby5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgby5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyAmICcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlzIHRvZ2dsZWQgcHJvcGVybHlcbiAgICAgICAgLy9cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoc2VsZWN0KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gRmluZCBwYXJlbnQgPHNlbGVjdD4gZm9yIGFuIG9wdGlvbiAoYWNjb3VudHMgZm9yIG9wdGlvbiBncm91cHMpXG4gIC8vXG4gIGdldFNlbGVjdEZyb21PcHRpb246IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHAgPSBlbC5wYXJlbnRFbGVtZW50XG5cbiAgICBpZiAocC50YWdOYW1lID09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm4gcFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHApXG4gICAgfVxuICB9LFxuXG5cbiAgLy8gRmluZCBwYXJlbnQgPGZvcm0+IG9yIGRvY3VtZW50IGlmIHRoZXJlIGlzIG5vIGZvcm1cbiAgLy9cbiAgcGFyZW50Rm9ybTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBlbCA9IGVsZW1lbnRcblxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudE5vZGVcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbiAgfSxcblxuICAvLyBSZXR1cm4gYSB1bmlxdWUgYXJyYXkgb2YgYWxsIGRhdGEgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGVsZW1lbnRzXG4gIC8vXG4gIGRhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbihlbGVtZW50cywgYXR0cikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7IFxuICAgICAgcmV0dXJuIGVsLmRhdGFzZXRbYXR0cl1cbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3JzLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGVjdG9ycyAhPSBcIlwiICYmIHR5cGVvZiBzZWxlY3RvcnMgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5pbmRleE9mKHNlbGVjdG9ycykgPT09IGluZGV4XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudC5yZWFkeShUb2dnbGVyLmxpc3RlbilcbkV2ZW50LmNoYW5nZShUb2dnbGVyLnJlZnJlc2gpXG5cbm1vZHVsZS5leHBvcnRzID0gVG9nZ2xlclxuIiwiLy8gU2hpbXNcbnJlcXVpcmUoICcuL2xpYi9zaGltcy9fY2xhc3NsaXN0JyApXG52YXIgbWVyZ2UgICAgPSByZXF1aXJlKCAnLi9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24nICksXG4gICAgZXZlbnQgICAgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICBsdXhvbiAgICA9IHJlcXVpcmUoICdsdXhvbicgKSxcbiAgICB0aW1lICAgICA9IG1lcmdlKHJlcXVpcmUoICcuL2xpYi90aW1lJyApLCBsdXhvbiksXG4gICAgc2Nyb2xsVG8gPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsdG8nICksXG4gICAgZnJvbVRvcCAgPSByZXF1aXJlKCAnLi9saWIvZnJvbXRvcCcgKSxcbiAgICBlYXNlICAgICA9IHJlcXVpcmUoICcuL2xpYi9lYXNlJyApXG5cbnZhciB0b29sYm94ID0ge1xuXG4gIGV2ZW50OiBldmVudCxcbiAgc2Nyb2xsVG86IHNjcm9sbFRvLFxuICBmcm9tVG9wOiBmcm9tVG9wLFxuICBtZXJnZTogbWVyZ2UsXG4gIGVhc2U6IGVhc2UsXG4gIHRpbWU6IHRpbWUsXG5cbiAgLy8gR2V0IGNsb3Nlc3QgRE9NIGVsZW1lbnQgdXAgdGhlIHRyZWUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0Q2xvc2VzdDogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBlbCwgc2VsZWN0b3IgKSApIHJldHVybiBlbFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSxcblxuICBjaGlsZE9mOiBmdW5jdGlvbiAoIGVsLCBwYXJlbnQgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwgPT0gcGFyZW50ICkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIC8vIEdldCBuZXh0IERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yXG4gIGdldE5leHQ6IGZ1bmN0aW9uKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKSApIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gTWF0Y2hlcyBzZWxlY3RvciBmdW5jdGlvblxuICAvLyBAcmVmZXJlbmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAgbWF0Y2hlczogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgcmV0dXJuICggZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbC5vTWF0Y2hlc1NlbGVjdG9yICkuY2FsbCggZWwsIHNlbGVjdG9yICk7XG4gIH0sXG5cbiAgd29yZENvdW50OiBmdW5jdGlvbiggc3RyICkge1xuICAgIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKCAvXFxTKy9nICk7XG4gICAgcmV0dXJuIG1hdGNoZXMgPyBtYXRjaGVzLmxlbmd0aCA6IDA7XG4gIH0sXG5cbiAgLy8gRWFzeSBhY2Nlc3MgdG8gc2xpY2UgZm9yIGNvbnZlcnRpbmcgb2JqZWN0cyBpbnRvIGFycmF5cyBvZiB2YWx1ZXMuXG4gIHNsaWNlOiBmdW5jdGlvbiggb2JqLCBjb3VudCApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIG9iaiwgY291bnQgKVxuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sbGVjdGlvbiwgY2FsbGJhY2sgKVxuICB9LFxuXG4gIGZvcm1EYXRhOiBmdW5jdGlvbiggcm9vdEVsICkge1xuICAgIHZhciBmb3JtRGF0YSAgPSBuZXcgRm9ybURhdGEoKSxcbiAgICAgICAgZmllbGRzID0gdG9vbGJveC5zbGljZShyb290RWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgc2VsZWN0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWFbbmFtZV06bm90KFtkaXNhYmxlZF0pJyApKVxuICAgIHZhciBmaWVsZERhdGEgPSB7fVxuXG4gICAgLy8gUmVtb3ZlIGFueSBmaWVsZCB3aGljaCBoYXMgYSBwYXJlbnQgd2hpY2ggaXMgZGlzYWJsZWRcbiAgICBmaWVsZHMgPSBmaWVsZHMuZmlsdGVyKCBmdW5jdGlvbiggZiApIHsgcmV0dXJuICF0b29sYm94LmdldENsb3Nlc3QoZiwgJ1tkaXNhYmxlZF0nKSB9KVxuXG4gICAgLy8gTG9vcCBvdmVyIGZpZWxkc1xuICAgIC8vIHJldmVyc2UgdGhlbSBiZWNhdXNlIGlmIHRoZXJlIGFyZSB0d28gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZVxuICAgIC8vIHRoZSBsYXN0IGlucHV0IG92ZXJyaWRlcyB0aGUgZmlyc3QuXG4gICAgZmllbGRzLnJldmVyc2UoKS5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKSB7XG4gICAgICBpZiAoIHRvb2xib3gubWF0Y2hlcyggZmllbGQsICdbdHlwZT1yYWRpb10sIFt0eXBlPWNoZWNrYm94XScpICkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2hlY2tib3ggb3IgcmFkaW8gaW5wdXQsIG92ZXJ3cml0ZSB3aXRoIGNoZWNrZWQgdmFsdWVzXG4gICAgICAgIGlmICggZmllbGQuY2hlY2tlZCApIGZpZWxkRGF0YVtmaWVsZC5uYW1lXSA9IGZpZWxkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbmx5IGFkZCBvbmUgdmFsdWUgcGVyIGZpZWxkIG5hbWVcbiAgICAgICAgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGREYXRhW2ZpZWxkLm5hbWVdIHx8IGZpZWxkXG4gICAgICB9XG4gICAgfSlcblxuICAgIGZvciAoIHZhciBuYW1lIGluIGZpZWxkRGF0YSApIHtcbiAgICAgIC8vIEFwcGVuZCBjdXJyZW50IGZpZWxk4oCZcyBuYW1lL3ZhbHVlIHRvIG5ldyBmb3JtRGF0YSBvYmplY3RcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCggbmFtZSwgZmllbGREYXRhW25hbWVdLnZhbHVlICk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiByZXR1cm4gc2FpZCBmb3JtRGF0YSBvYmplY3RcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbGJveFxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyAgICAga2V5bWFzdGVyLmpzXG4vLyAgICAgKGMpIDIwMTEtMjAxMyBUaG9tYXMgRnVjaHNcbi8vICAgICBrZXltYXN0ZXIuanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbjsoZnVuY3Rpb24oZ2xvYmFsKXtcbiAgdmFyIGssXG4gICAgX2hhbmRsZXJzID0ge30sXG4gICAgX21vZHMgPSB7IDE2OiBmYWxzZSwgMTg6IGZhbHNlLCAxNzogZmFsc2UsIDkxOiBmYWxzZSB9LFxuICAgIF9zY29wZSA9ICdhbGwnLFxuICAgIC8vIG1vZGlmaWVyIGtleXNcbiAgICBfTU9ESUZJRVJTID0ge1xuICAgICAgJ+KHpyc6IDE2LCBzaGlmdDogMTYsXG4gICAgICAn4oylJzogMTgsIGFsdDogMTgsIG9wdGlvbjogMTgsXG4gICAgICAn4oyDJzogMTcsIGN0cmw6IDE3LCBjb250cm9sOiAxNyxcbiAgICAgICfijJgnOiA5MSwgY29tbWFuZDogOTFcbiAgICB9LFxuICAgIC8vIHNwZWNpYWwga2V5c1xuICAgIF9NQVAgPSB7XG4gICAgICBiYWNrc3BhY2U6IDgsIHRhYjogOSwgY2xlYXI6IDEyLFxuICAgICAgZW50ZXI6IDEzLCAncmV0dXJuJzogMTMsXG4gICAgICBlc2M6IDI3LCBlc2NhcGU6IDI3LCBzcGFjZTogMzIsXG4gICAgICBsZWZ0OiAzNywgdXA6IDM4LFxuICAgICAgcmlnaHQ6IDM5LCBkb3duOiA0MCxcbiAgICAgIGRlbDogNDYsICdkZWxldGUnOiA0NixcbiAgICAgIGhvbWU6IDM2LCBlbmQ6IDM1LFxuICAgICAgcGFnZXVwOiAzMywgcGFnZWRvd246IDM0LFxuICAgICAgJywnOiAxODgsICcuJzogMTkwLCAnLyc6IDE5MSxcbiAgICAgICdgJzogMTkyLCAnLSc6IDE4OSwgJz0nOiAxODcsXG4gICAgICAnOyc6IDE4NiwgJ1xcJyc6IDIyMixcbiAgICAgICdbJzogMjE5LCAnXSc6IDIyMSwgJ1xcXFwnOiAyMjBcbiAgICB9LFxuICAgIGNvZGUgPSBmdW5jdGlvbih4KXtcbiAgICAgIHJldHVybiBfTUFQW3hdIHx8IHgudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApO1xuICAgIH0sXG4gICAgX2Rvd25LZXlzID0gW107XG5cbiAgZm9yKGs9MTtrPDIwO2srKykgX01BUFsnZicra10gPSAxMTEraztcblxuICAvLyBJRSBkb2Vzbid0IHN1cHBvcnQgQXJyYXkjaW5kZXhPZiwgc28gaGF2ZSBhIHNpbXBsZSByZXBsYWNlbWVudFxuICBmdW5jdGlvbiBpbmRleChhcnJheSwgaXRlbSl7XG4gICAgdmFyIGkgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUoaS0tKSBpZihhcnJheVtpXT09PWl0ZW0pIHJldHVybiBpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIGZvciBjb21wYXJpbmcgbW9kcyBiZWZvcmUgdW5hc3NpZ25tZW50XG4gIGZ1bmN0aW9uIGNvbXBhcmVBcnJheShhMSwgYTIpIHtcbiAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllck1hcCA9IHtcbiAgICAgIDE2OidzaGlmdEtleScsXG4gICAgICAxODonYWx0S2V5JyxcbiAgICAgIDE3OidjdHJsS2V5JyxcbiAgICAgIDkxOidtZXRhS2V5J1xuICB9O1xuICBmdW5jdGlvbiB1cGRhdGVNb2RpZmllcktleShldmVudCkge1xuICAgICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZXZlbnRbbW9kaWZpZXJNYXBba11dO1xuICB9O1xuXG4gIC8vIGhhbmRsZSBrZXlkb3duIGV2ZW50XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGV2ZW50KSB7XG4gICAgdmFyIGtleSwgaGFuZGxlciwgaywgaSwgbW9kaWZpZXJzTWF0Y2gsIHNjb3BlO1xuICAgIGtleSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICBpZiAoaW5kZXgoX2Rvd25LZXlzLCBrZXkpID09IC0xKSB7XG4gICAgICAgIF9kb3duS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBtb2RpZmllciBrZXksIHNldCB0aGUga2V5Ljxtb2RpZmllcmtleW5hbWU+IHByb3BlcnR5IHRvIHRydWUgYW5kIHJldHVyblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTsgLy8gcmlnaHQgY29tbWFuZCBvbiB3ZWJraXQsIGNvbW1hbmQgb24gR2Vja29cbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSB0cnVlO1xuICAgICAgLy8gJ2Fzc2lnbktleScgZnJvbSBpbnNpZGUgdGhpcyBjbG9zdXJlIGlzIGV4cG9ydGVkIHRvIHdpbmRvdy5rZXlcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGVNb2RpZmllcktleShldmVudCk7XG5cbiAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byBpZ25vcmUgdGhlIGtleXByZXNzIChmaWx0ZXIoKSBjYW4gY2FuIGJlIG92ZXJyaWRkZW4pXG4gICAgLy8gYnkgZGVmYXVsdCBpZ25vcmUga2V5IHByZXNzZXMgaWYgYSBzZWxlY3QsIHRleHRhcmVhLCBvciBpbnB1dCBpcyBmb2N1c2VkXG4gICAgaWYoIWFzc2lnbktleS5maWx0ZXIuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIC8vIGFib3J0IGlmIG5vIHBvdGVudGlhbGx5IG1hdGNoaW5nIHNob3J0Y3V0cyBmb3VuZFxuICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSByZXR1cm47XG5cbiAgICBzY29wZSA9IGdldFNjb3BlKCk7XG5cbiAgICAvLyBmb3IgZWFjaCBwb3RlbnRpYWwgc2hvcnRjdXRcbiAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXIgPSBfaGFuZGxlcnNba2V5XVtpXTtcblxuICAgICAgLy8gc2VlIGlmIGl0J3MgaW4gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIGlmKGhhbmRsZXIuc2NvcGUgPT0gc2NvcGUgfHwgaGFuZGxlci5zY29wZSA9PSAnYWxsJyl7XG4gICAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVycyBtYXRjaCBpZiBhbnlcbiAgICAgICAgbW9kaWZpZXJzTWF0Y2ggPSBoYW5kbGVyLm1vZHMubGVuZ3RoID4gMDtcbiAgICAgICAgZm9yKGsgaW4gX21vZHMpXG4gICAgICAgICAgaWYoKCFfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA+IC0xKSB8fFxuICAgICAgICAgICAgKF9tb2RzW2tdICYmIGluZGV4KGhhbmRsZXIubW9kcywgK2spID09IC0xKSkgbW9kaWZpZXJzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlciBhbmQgc3RvcCB0aGUgZXZlbnQgaWYgbmVjY2Vzc2FyeVxuICAgICAgICBpZigoaGFuZGxlci5tb2RzLmxlbmd0aCA9PSAwICYmICFfbW9kc1sxNl0gJiYgIV9tb2RzWzE4XSAmJiAhX21vZHNbMTddICYmICFfbW9kc1s5MV0pIHx8IG1vZGlmaWVyc01hdGNoKXtcbiAgICAgICAgICBpZihoYW5kbGVyLm1ldGhvZChldmVudCwgaGFuZGxlcik9PT1mYWxzZSl7XG4gICAgICAgICAgICBpZihldmVudC5wcmV2ZW50RGVmYXVsdCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZWxzZSBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmKGV2ZW50LmNhbmNlbEJ1YmJsZSkgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gdW5zZXQgbW9kaWZpZXIga2V5cyBvbiBrZXl1cFxuICBmdW5jdGlvbiBjbGVhck1vZGlmaWVyKGV2ZW50KXtcbiAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSwgayxcbiAgICAgICAgaSA9IGluZGV4KF9kb3duS2V5cywga2V5KTtcblxuICAgIC8vIHJlbW92ZSBrZXkgZnJvbSBfZG93bktleXNcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgIF9kb3duS2V5cy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuXG4gICAgaWYoa2V5ID09IDkzIHx8IGtleSA9PSAyMjQpIGtleSA9IDkxO1xuICAgIGlmKGtleSBpbiBfbW9kcykge1xuICAgICAgX21vZHNba2V5XSA9IGZhbHNlO1xuICAgICAgZm9yKGsgaW4gX01PRElGSUVSUykgaWYoX01PRElGSUVSU1trXSA9PSBrZXkpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiByZXNldE1vZGlmaWVycygpIHtcbiAgICBmb3IoayBpbiBfbW9kcykgX21vZHNba10gPSBmYWxzZTtcbiAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgfTtcblxuICAvLyBwYXJzZSBhbmQgYXNzaWduIHNob3J0Y3V0XG4gIGZ1bmN0aW9uIGFzc2lnbktleShrZXksIHNjb3BlLCBtZXRob2Qpe1xuICAgIHZhciBrZXlzLCBtb2RzO1xuICAgIGtleXMgPSBnZXRLZXlzKGtleSk7XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRob2QgPSBzY29wZTtcbiAgICAgIHNjb3BlID0gJ2FsbCc7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggc2hvcnRjdXRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIHNldCBtb2RpZmllciBrZXlzIGlmIGFueVxuICAgICAgbW9kcyA9IFtdO1xuICAgICAga2V5ID0ga2V5c1tpXS5zcGxpdCgnKycpO1xuICAgICAgaWYgKGtleS5sZW5ndGggPiAxKXtcbiAgICAgICAgbW9kcyA9IGdldE1vZHMoa2V5KTtcbiAgICAgICAga2V5ID0gW2tleVtrZXkubGVuZ3RoLTFdXTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnZlcnQgdG8ga2V5Y29kZSBhbmQuLi5cbiAgICAgIGtleSA9IGtleVswXVxuICAgICAga2V5ID0gY29kZShrZXkpO1xuICAgICAgLy8gLi4uc3RvcmUgaGFuZGxlclxuICAgICAgaWYgKCEoa2V5IGluIF9oYW5kbGVycykpIF9oYW5kbGVyc1trZXldID0gW107XG4gICAgICBfaGFuZGxlcnNba2V5XS5wdXNoKHsgc2hvcnRjdXQ6IGtleXNbaV0sIHNjb3BlOiBzY29wZSwgbWV0aG9kOiBtZXRob2QsIGtleToga2V5c1tpXSwgbW9kczogbW9kcyB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gdW5iaW5kIGFsbCBoYW5kbGVycyBmb3IgZ2l2ZW4ga2V5IGluIGN1cnJlbnQgc2NvcGVcbiAgZnVuY3Rpb24gdW5iaW5kS2V5KGtleSwgc2NvcGUpIHtcbiAgICB2YXIgbXVsdGlwbGVLZXlzLCBrZXlzLFxuICAgICAgbW9kcyA9IFtdLFxuICAgICAgaSwgaiwgb2JqO1xuXG4gICAgbXVsdGlwbGVLZXlzID0gZ2V0S2V5cyhrZXkpO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IG11bHRpcGxlS2V5cy5sZW5ndGg7IGorKykge1xuICAgICAga2V5cyA9IG11bHRpcGxlS2V5c1tqXS5zcGxpdCgnKycpO1xuXG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleXMpO1xuICAgICAgICBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcblxuICAgICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCFfaGFuZGxlcnNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb2JqID0gX2hhbmRsZXJzW2tleV1baV07XG4gICAgICAgIC8vIG9ubHkgY2xlYXIgaGFuZGxlcnMgaWYgY29ycmVjdCBzY29wZSBhbmQgbW9kcyBtYXRjaFxuICAgICAgICBpZiAob2JqLnNjb3BlID09PSBzY29wZSAmJiBjb21wYXJlQXJyYXkob2JqLm1vZHMsIG1vZHMpKSB7XG4gICAgICAgICAgX2hhbmRsZXJzW2tleV1baV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3aXRoIGNvZGUgJ2tleUNvZGUnIGlzIGN1cnJlbnRseSBkb3duXG4gIC8vIENvbnZlcnRzIHN0cmluZ3MgaW50byBrZXkgY29kZXMuXG4gIGZ1bmN0aW9uIGlzUHJlc3NlZChrZXlDb2RlKSB7XG4gICAgICBpZiAodHlwZW9mKGtleUNvZGUpPT0nc3RyaW5nJykge1xuICAgICAgICBrZXlDb2RlID0gY29kZShrZXlDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleChfZG93bktleXMsIGtleUNvZGUpICE9IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJlc3NlZEtleUNvZGVzKCkge1xuICAgICAgcmV0dXJuIF9kb3duS2V5cy5zbGljZSgwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbHRlcihldmVudCl7XG4gICAgdmFyIHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWU7XG4gICAgLy8gaWdub3JlIGtleXByZXNzZWQgaW4gYW55IGVsZW1lbnRzIHRoYXQgc3VwcG9ydCBrZXlib2FyZCBkYXRhIGlucHV0XG4gICAgcmV0dXJuICEodGFnTmFtZSA9PSAnSU5QVVQnIHx8IHRhZ05hbWUgPT0gJ1NFTEVDVCcgfHwgdGFnTmFtZSA9PSAnVEVYVEFSRUEnKTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUga2V5Ljxtb2RpZmllcj4gdG8gZmFsc2VcbiAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG5cbiAgLy8gc2V0IGN1cnJlbnQgc2NvcGUgKGRlZmF1bHQgJ2FsbCcpXG4gIGZ1bmN0aW9uIHNldFNjb3BlKHNjb3BlKXsgX3Njb3BlID0gc2NvcGUgfHwgJ2FsbCcgfTtcbiAgZnVuY3Rpb24gZ2V0U2NvcGUoKXsgcmV0dXJuIF9zY29wZSB8fCAnYWxsJyB9O1xuXG4gIC8vIGRlbGV0ZSBhbGwgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gc2NvcGVcbiAgZnVuY3Rpb24gZGVsZXRlU2NvcGUoc2NvcGUpe1xuICAgIHZhciBrZXksIGhhbmRsZXJzLCBpO1xuXG4gICAgZm9yIChrZXkgaW4gX2hhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9oYW5kbGVyc1trZXldO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKSB7XG4gICAgICAgIGlmIChoYW5kbGVyc1tpXS5zY29wZSA9PT0gc2NvcGUpIGhhbmRsZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgZWxzZSBpKys7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGFic3RyYWN0IGtleSBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRLZXlzKGtleSkge1xuICAgIHZhciBrZXlzO1xuICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGtleXMgPSBrZXkuc3BsaXQoJywnKTtcbiAgICBpZiAoKGtleXNba2V5cy5sZW5ndGggLSAxXSkgPT0gJycpIHtcbiAgICAgIGtleXNba2V5cy5sZW5ndGggLSAyXSArPSAnLCc7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgLy8gYWJzdHJhY3QgbW9kcyBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRNb2RzKGtleSkge1xuICAgIHZhciBtb2RzID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSAxKTtcbiAgICBmb3IgKHZhciBtaSA9IDA7IG1pIDwgbW9kcy5sZW5ndGg7IG1pKyspXG4gICAgbW9kc1ttaV0gPSBfTU9ESUZJRVJTW21vZHNbbWldXTtcbiAgICByZXR1cm4gbW9kcztcbiAgfVxuXG4gIC8vIGNyb3NzLWJyb3dzZXIgZXZlbnRzXG4gIGZ1bmN0aW9uIGFkZEV2ZW50KG9iamVjdCwgZXZlbnQsIG1ldGhvZCkge1xuICAgIGlmIChvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgIG9iamVjdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBtZXRob2QsIGZhbHNlKTtcbiAgICBlbHNlIGlmKG9iamVjdC5hdHRhY2hFdmVudClcbiAgICAgIG9iamVjdC5hdHRhY2hFdmVudCgnb24nK2V2ZW50LCBmdW5jdGlvbigpeyBtZXRob2Qod2luZG93LmV2ZW50KSB9KTtcbiAgfTtcblxuICAvLyBzZXQgdGhlIGhhbmRsZXJzIGdsb2JhbGx5IG9uIGRvY3VtZW50XG4gIGFkZEV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7IGRpc3BhdGNoKGV2ZW50KSB9KTsgLy8gUGFzc2luZyBfc2NvcGUgdG8gYSBjYWxsYmFjayB0byBlbnN1cmUgaXQgcmVtYWlucyB0aGUgc2FtZSBieSBleGVjdXRpb24uIEZpeGVzICM0OFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleXVwJywgY2xlYXJNb2RpZmllcik7XG5cbiAgLy8gcmVzZXQgbW9kaWZpZXJzIHRvIGZhbHNlIHdoZW5ldmVyIHRoZSB3aW5kb3cgaXMgKHJlKWZvY3VzZWQuXG4gIGFkZEV2ZW50KHdpbmRvdywgJ2ZvY3VzJywgcmVzZXRNb2RpZmllcnMpO1xuXG4gIC8vIHN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXlcbiAgdmFyIHByZXZpb3VzS2V5ID0gZ2xvYmFsLmtleTtcblxuICAvLyByZXN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXkgYW5kIHJldHVybiByZWZlcmVuY2UgdG8gb3VyIGtleSBvYmplY3RcbiAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICB2YXIgayA9IGdsb2JhbC5rZXk7XG4gICAgZ2xvYmFsLmtleSA9IHByZXZpb3VzS2V5O1xuICAgIHJldHVybiBrO1xuICB9XG5cbiAgLy8gc2V0IHdpbmRvdy5rZXkgYW5kIHdpbmRvdy5rZXkuc2V0L2dldC9kZWxldGVTY29wZSwgYW5kIHRoZSBkZWZhdWx0IGZpbHRlclxuICBnbG9iYWwua2V5ID0gYXNzaWduS2V5O1xuICBnbG9iYWwua2V5LnNldFNjb3BlID0gc2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZ2V0U2NvcGUgPSBnZXRTY29wZTtcbiAgZ2xvYmFsLmtleS5kZWxldGVTY29wZSA9IGRlbGV0ZVNjb3BlO1xuICBnbG9iYWwua2V5LmZpbHRlciA9IGZpbHRlcjtcbiAgZ2xvYmFsLmtleS5pc1ByZXNzZWQgPSBpc1ByZXNzZWQ7XG4gIGdsb2JhbC5rZXkuZ2V0UHJlc3NlZEtleUNvZGVzID0gZ2V0UHJlc3NlZEtleUNvZGVzO1xuICBnbG9iYWwua2V5Lm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICBnbG9iYWwua2V5LnVuYmluZCA9IHVuYmluZEtleTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgbW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25LZXk7XG5cbn0pKHRoaXMpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuLy8gVFlQRVNcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vLyBDQVBBQklMSVRJRVNcblxuZnVuY3Rpb24gaGFzSW50bCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJyAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuXG5mdW5jdGlvbiBoYXNGb3JtYXRUb1BhcnRzKCkge1xuICByZXR1cm4gIWlzVW5kZWZpbmVkKEludGwuRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFRvUGFydHMpO1xufVxuXG4vLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZnVuY3Rpb24gbWF5YmVBcnJheSh0aGluZykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGluZykgPyB0aGluZyA6IFt0aGluZ107XG59XG5cbmZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZShmdW5jdGlvbiAoYmVzdCwgbmV4dCkge1xuICAgIHZhciBwYWlyID0gW2J5KG5leHQpLCBuZXh0XTtcbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZS5hcHBseShudWxsLCBbYmVzdFswXSwgcGFpclswXV0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChhLCBrKSB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuXG4vLyBOVU1CRVJTIEFORCBTVFJJTkdTXG5cbmZ1bmN0aW9uIG51bWJlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc051bWJlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn1cblxuLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5mdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCkge1xuICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcblxuICBpZiAoaW5wdXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmV0dXJuICgnMCcucmVwZWF0KG4pICsgaW5wdXQpLnNsaWNlKC1uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1pbGxpcyhmcmFjdGlvbikge1xuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoJzAuJyArIGZyYWN0aW9uKSAqIDEwMDA7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91bmRUbyhudW1iZXIsIGRpZ2l0cykge1xuICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRpZ2l0cyk7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cblxuZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgdmFyIG1vZE1vbnRoID0gZmxvb3JNb2QobW9udGggLSAxLCAxMikgKyAxLFxuICAgICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIHZhciBwMSA9ICh3ZWVrWWVhciArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICUgNyxcbiAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufVxuXG4vLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlKSB7XG4gIHZhciB0aW1lWm9uZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgIGludGxPcHRzID0ge1xuICAgIGhvdXIxMjogZmFsc2UsXG4gICAgeWVhcjogJ251bWVyaWMnLFxuICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgaG91cjogJzItZGlnaXQnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oeyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCB9LCBpbnRsT3B0cyksXG4gICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIHZhciBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXRUb1BhcnRzKGRhdGUpLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpbWV6b25lbmFtZSc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG4gIH0gZWxzZSBpZiAoaW50bCkge1xuICAgIC8vIHRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrIGZvciBhbGwgbG9jYWxlc1xuICAgIHZhciB3aXRob3V0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBpbnRsT3B0cykuZm9ybWF0KGRhdGUpLFxuICAgICAgICBpbmNsdWRlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgZGlmZmVkID0gaW5jbHVkZWQuc3Vic3RyaW5nKHdpdGhvdXQubGVuZ3RoKSxcbiAgICAgICAgdHJpbW1lZCA9IGRpZmZlZC5yZXBsYWNlKC9eWywgXSsvLCAnJyk7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gc2lnbmVkT2Zmc2V0KCctNScsICczMCcpIC0+IC0zMzBcbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59XG5cbi8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgdmFyIGlnbm9yZVVua25vd24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBub3JtYWxpemVkID0ge307XG4gIGZvciAodmFyIHUgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSh1KSkge1xuICAgICAgdmFyIHYgPSBvYmpbdV07XG4gICAgICBpZiAodiAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodikgJiYgIU51bWJlci5pc05hTih2KSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gbm9ybWFsaXplcih1LCBpZ25vcmVVbmtub3duKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSk7XG59XG5cbnZhciBjdXN0b21JbnNwZWN0U3ltYm9sID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCd1dGlsJykuaW5zcGVjdC5jdXN0b207IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgfSBjYXRjaCAoX2Vycikge1xuICAgIHJldHVybiBTeW1ib2woJ3V0aWwuaW5zcGVjdC5jdXN0b20nKTtcbiAgfVxufSgpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG4gPSAnbnVtZXJpYycsXG4gICAgcyA9ICdzaG9ydCcsXG4gICAgbCA9ICdsb25nJyxcbiAgICBkMiA9ICcyLWRpZ2l0JztcblxudmFyIERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG5cbn07XG5cbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbFxufTtcblxudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG5cbnZhciBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxudmFyIFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2Vcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAqL1xudmFyIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cbnZhciBEQVRFVElNRV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMlxufTtcblxuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICovXG52YXIgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcblxudmFyIERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcblxudmFyIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBtb250aHNMb25nID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cbnZhciBtb250aHNTaG9ydCA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxudmFyIG1vbnRoc05hcnJvdyA9IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXTtcblxuZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgIHJldHVybiBtb250aHNTaG9ydDtcbiAgICBjYXNlICdsb25nJzpcbiAgICAgIHJldHVybiBtb250aHNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXTtcbiAgICBjYXNlICcyLWRpZ2l0JzpcbiAgICAgIHJldHVybiBbJzAxJywgJzAyJywgJzAzJywgJzA0JywgJzA1JywgJzA2JywgJzA3JywgJzA4JywgJzA5JywgJzEwJywgJzExJywgJzEyJ107XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciB3ZWVrZGF5c0xvbmcgPSBbJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknLCAnU3VuZGF5J107XG5cbnZhciB3ZWVrZGF5c1Nob3J0ID0gWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXTtcblxudmFyIHdlZWtkYXlzTmFycm93ID0gWydNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUycsICdTJ107XG5cbmZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG4gICAgY2FzZSAnc2hvcnQnOlxuICAgICAgcmV0dXJuIHdlZWtkYXlzU2hvcnQ7XG4gICAgY2FzZSAnbG9uZyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNyddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgbWVyaWRpZW1zID0gWydBTScsICdQTSddO1xuXG52YXIgZXJhc0xvbmcgPSBbJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknXTtcblxudmFyIGVyYXNTaG9ydCA9IFsnQkMnLCAnQUQnXTtcblxudmFyIGVyYXNOYXJyb3cgPSBbJ0InLCAnQSddO1xuXG5mdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcbiAgICBjYXNlICdzaG9ydCc6XG4gICAgICByZXR1cm4gZXJhc1Nob3J0O1xuICAgIGNhc2UgJ2xvbmcnOlxuICAgICAgcmV0dXJuIGVyYXNMb25nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSB7XG4gIHJldHVybiBtZXJpZGllbXNbZHQuaG91ciA8IDEyID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5cbmZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gZXJhRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gZXJhcyhsZW5ndGgpW2R0LnllYXIgPCAwID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbJ3dlZWtkYXknLCAnZXJhJywgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICd0aW1lWm9uZU5hbWUnLCAnaG91cjEyJ10pLFxuICAgICAga2V5ID0gc3RyaW5naWZ5KGZpbHRlcmVkKSxcbiAgICAgIGRhdGVUaW1lSHVnZSA9ICdFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gJ00vZC95eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX01FRCk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0ZVTEwpOlxuICAgICAgcmV0dXJuICdMTExMIGQsIHl5eXknO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gJ0VFRUUsIExMTEwgZCwgeXl5eSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnaDptbTpzcyBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfU0lNUExFKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnSEg6bW06c3MnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuICdISDptbSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiAnTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTCk6XG4gICAgICByZXR1cm4gJ0xMTEwgZCwgeXl5eSwgaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW06c3MgYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuLy8gdGhlc2UgYXJlbid0IHJlYWxseSBwcml2YXRlLCBidXQgbm9yIGFyZSB0aGV5IHJlYWxseSB1c2VmdWwgdG8gZG9jdW1lbnRcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgTHV4b25FcnJvciA9IGZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgaW5oZXJpdHMoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEx1eG9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBMdXhvbkVycm9yO1xufShFcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbnZhciBJbnZhbGlkRGF0ZVRpbWVFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcikge1xuICBpbmhlcml0cyhJbnZhbGlkRGF0ZVRpbWVFcnJvciwgX0x1eG9uRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREYXRlVGltZUVycm9yKHJlYXNvbikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEludmFsaWREYXRlVGltZUVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvci5jYWxsKHRoaXMsICdJbnZhbGlkIERhdGVUaW1lOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZERhdGVUaW1lRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjIpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEludGVydmFsRXJyb3IsIF9MdXhvbkVycm9yMik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEludGVydmFsRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEludGVydmFsRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMi5jYWxsKHRoaXMsICdJbnZhbGlkIEludGVydmFsOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEludGVydmFsRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkRHVyYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgaW5oZXJpdHMoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZER1cmF0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsICdJbnZhbGlkIER1cmF0aW9uOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjQpIHtcbiAgaW5oZXJpdHMoQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IsIF9MdXhvbkVycm9yNCk7XG5cbiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWRVbml0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I1KSB7XG4gIGluaGVyaXRzKEludmFsaWRVbml0RXJyb3IsIF9MdXhvbkVycm9yNSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFVuaXRFcnJvcih1bml0KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFVuaXRFcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgJ0ludmFsaWQgdW5pdCAnICsgdW5pdCkpO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkQXJndW1lbnRFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjYpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEFyZ3VtZW50RXJyb3IsIF9MdXhvbkVycm9yNik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEFyZ3VtZW50RXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEFyZ3VtZW50RXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIFpvbmVJc0Fic3RyYWN0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I3KSB7XG4gIGluaGVyaXRzKFpvbmVJc0Fic3RyYWN0RXJyb3IsIF9MdXhvbkVycm9yNyk7XG5cbiAgZnVuY3Rpb24gWm9uZUlzQWJzdHJhY3RFcnJvcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBab25lSXNBYnN0cmFjdEVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCAnWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzcycpKTtcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbi8qKlxuICogQGludGVyZmFjZVxuKi9cblxudmFyIFpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgWm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIG9wdHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBab25lO1xufSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcblxudmFyIExvY2FsWm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYWxab25lKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIExvY2FsWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIF9yZWYpIHtcbiAgICB2YXIgZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuXG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH07XG5cbiAgTG9jYWxab25lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSAnbG9jYWwnO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKExvY2FsWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnbG9jYWwnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAgIH0gZWxzZSByZXR1cm4gJ2xvY2FsJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdpbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaW5nbGV0b247XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbFpvbmU7XG59KFpvbmUpO1xuXG52YXIgZHRmQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7XG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgdGltZVpvbmU6IHpvbmUsXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGR0ZkNhY2hlW3pvbmVdO1xufVxuXG52YXIgdHlwZVRvUG9zID0ge1xuICB5ZWFyOiAwLFxuICBtb250aDogMSxcbiAgZGF5OiAyLFxuICBob3VyOiAzLFxuICBtaW51dGU6IDQsXG4gIHNlY29uZDogNVxufTtcblxuZnVuY3Rpb24gaGFja3lPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0KGRhdGUpLnJlcGxhY2UoL1xcdTIwMEUvZywgJycpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuXG4gIHJldHVybiBbZlllYXIsIGZNb250aCwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmRdO1xufVxuXG5mdW5jdGlvbiBwYXJ0c09mZnNldChkdGYsIGRhdGUpIHtcbiAgdmFyIGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXRUb1BhcnRzKGRhdGUpLFxuICAgICAgZmlsbGVkID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKElBTkFab25lLCBfWm9uZSk7XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllciA9IGZ1bmN0aW9uIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiBzICYmIHMubWF0Y2goL15bYS16XystXXsxLDI1Nn1cXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8kL2kpO1xuICB9O1xuXG4gIElBTkFab25lLmlzVmFsaWRab25lID0gZnVuY3Rpb24gaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvLyBFdGMvR01UKzggLT4gNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIElBTkFab25lKG5hbWUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJQU5BWm9uZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMuem9uZU5hbWUgPSBuYW1lO1xuICAgIF90aGlzLnZhbGlkID0gSUFOQVpvbmUuaXNWYWxpZFpvbmUobmFtZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcblxuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSwgdGhpcy56b25lTmFtZSk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgICBkdGYgPSBtYWtlRFRGKHRoaXMuem9uZU5hbWUpLFxuICAgICAgICBfcmVmMiA9IGR0Zi5mb3JtYXRUb1BhcnRzID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSksXG4gICAgICAgIGZZZWFyID0gX3JlZjJbMF0sXG4gICAgICAgIGZNb250aCA9IF9yZWYyWzFdLFxuICAgICAgICBmRGF5ID0gX3JlZjJbMl0sXG4gICAgICAgIGZIb3VyID0gX3JlZjJbM10sXG4gICAgICAgIGZNaW51dGUgPSBfcmVmMls0XSxcbiAgICAgICAgZlNlY29uZCA9IF9yZWYyWzVdLFxuICAgICAgICBhc1VUQyA9IERhdGUuVVRDKGZZZWFyLCBmTW9udGggLSAxLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZCk7XG5cbiAgICB2YXIgYXNUUyA9IGRhdGUudmFsdWVPZigpO1xuICAgIGFzVFMgLT0gYXNUUyAlIDEwMDA7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdpYW5hJyAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoSUFOQVpvbmUsIFt7XG4gICAga2V5OiAndHlwZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gJ2lhbmEnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5pdmVyc2FsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gSUFOQVpvbmU7XG59KFpvbmUpO1xuXG52YXIgc2luZ2xldG9uJDEgPSBudWxsO1xuXG5mdW5jdGlvbiBob3Vyc01pbnV0ZXNPZmZzZXQoeikge1xuICB2YXIgaG91cnMgPSBNYXRoLnRydW5jKHouZml4ZWQgLyA2MCksXG4gICAgICBtaW51dGVzID0gTWF0aC5hYnMoei5maXhlZCAlIDYwKSxcbiAgICAgIHNpZ24gPSBob3VycyA+IDAgPyAnKycgOiAnLScsXG4gICAgICBiYXNlID0gc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcbiAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArICc6JyArIHBhZFN0YXJ0KG1pbnV0ZXMsIDIpIDogYmFzZTtcbn1cblxudmFyIEZpeGVkT2Zmc2V0Wm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhGaXhlZE9mZnNldFpvbmUsIF9ab25lKTtcblxuICBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UgPSBmdW5jdGlvbiBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllciA9IGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKHMpIHtcbiAgICBpZiAocykge1xuICAgICAgdmFyIHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWRPZmZzZXRab25lKHNpZ25lZE9mZnNldChyWzFdLCByWzJdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgbnVsbCwgW3tcbiAgICBrZXk6ICd1dGNJbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpbmdsZXRvbiQxO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGaXhlZE9mZnNldFpvbmUpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdmaXhlZCcgJiYgb3RoZXJab25lLmZpeGVkID09PSB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyAnVVRDJyA6ICdVVEMnICsgaG91cnNNaW51dGVzT2Zmc2V0KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRml4ZWRPZmZzZXRab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQyID0gbnVsbDtcblxudmFyIEludmFsaWRab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKEludmFsaWRab25lLCBfWm9uZSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFpvbmUpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSW52YWxpZFpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIEludmFsaWRab25lLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfTtcblxuICBJbnZhbGlkWm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnaW52YWxpZCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAnaW5zdGFuY2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiQyID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiQyID0gbmV3IEludmFsaWRab25lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uJDI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnZhbGlkWm9uZTtcbn0oWm9uZSk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0ID0gdm9pZCAwO1xuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICB2YXIgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09ICdsb2NhbCcpIHJldHVybiBMb2NhbFpvbmUuaW5zdGFuY2U7ZWxzZSBpZiAobG93ZXJlZCA9PT0gJ3V0YycgfHwgbG93ZXJlZCA9PT0gJ2dtdCcpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gbmV3IElBTkFab25lKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShpbnB1dCk7XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoaW5wdXQpKSA9PT0gJ29iamVjdCcgJiYgaW5wdXQub2Zmc2V0KSB7XG4gICAgLy8gVGhpcyBpcyBkdW1iLCBidXQgdGhlIGluc3RhbmNlb2YgY2hlY2sgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHJlYWxseSB3b3JrXG4gICAgLy8gc28gd2UncmUgZHVjayBjaGVja2luZyBpdFxuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuXG4vKipcclxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cclxuICovXG5cbnZhciBTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2V0dGluZ3MoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXHJcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXHJcbiAgICogQHJldHVybiB7dm9pZH1cclxuICAgKi9cbiAgU2V0dGluZ3MucmVzZXRDYWNoZXMgPSBmdW5jdGlvbiByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogJ25vdycsXG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBub3c7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRab25lTmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoeikge1xuICAgICAgaWYgKCF6KSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbm9ybWFsaXplWm9uZSh6KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgb2JqZWN0IHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7Wm9uZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0Wm9uZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFpvbmUgfHwgTG9jYWxab25lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRMb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobG9jYWxlKSB7XG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0TnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVmYXVsdE91dHB1dENhbGVuZGFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgTHV4b24gd2lsbCB0aHJvdyB3aGVuIGl0IGVuY291bnRlcnMgaW52YWxpZCBEYXRlVGltZXMsIER1cmF0aW9ucywgb3IgSW50ZXJ2YWxzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0aHJvd09uSW52YWxpZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhyb3dPbkludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKHQpIHtcbiAgICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNldHRpbmdzO1xufSgpO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIHZhciBzID0gJyc7XG4gIGZvciAodmFyIF9pdGVyYXRvciA9IHNwbGl0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbiA9IF9yZWY7XG5cbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxudmFyIHRva2VuVG9PYmplY3QgPSB7XG4gIEQ6IERBVEVfU0hPUlQsXG4gIEREOiBEQVRFX01FRCxcbiAgREREOiBEQVRFX0ZVTEwsXG4gIEREREQ6IERBVEVfSFVHRSxcbiAgdDogVElNRV9TSU1QTEUsXG4gIHR0OiBUSU1FX1dJVEhfU0VDT05EUyxcbiAgdHR0OiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VULFxuICB0dHR0OiBUSU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IFRJTUVfMjRfU0lNUExFLFxuICBUVDogVElNRV8yNF9XSVRIX1NFQ09ORFMsXG4gIFRUVDogVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VULFxuICBmOiBEQVRFVElNRV9TSE9SVCxcbiAgZmY6IERBVEVUSU1FX01FRCxcbiAgZmZmOiBEQVRFVElNRV9GVUxMLFxuICBmZmZmOiBEQVRFVElNRV9IVUdFLFxuICBGOiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTLFxuICBGRkY6IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTLFxuICBGRkZGOiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EU1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIEZvcm1hdHRlci5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUobG9jYWxlKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGZvcm1hdE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB7IHJvdW5kOiB0cnVlIH0sIG9wdHMpO1xuICAgIHJldHVybiBuZXcgRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnBhcnNlRm9ybWF0ID0gZnVuY3Rpb24gcGFyc2VGb3JtYXQoZm10KSB7XG4gICAgdmFyIGN1cnJlbnQgPSBudWxsLFxuICAgICAgICBjdXJyZW50RnVsbCA9ICcnLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gZm10LmNoYXJBdChpKTtcbiAgICAgIGlmIChjID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjdXJyZW50RnVsbCA9ICcnO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH07XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlcik7XG5cbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQgPSBmdW5jdGlvbiBmb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgb3B0cykge1xuICAgIGlmICh0aGlzLnN5c3RlbUxvYyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zeXN0ZW1Mb2MgPSB0aGlzLmxvYy5yZWRlZmF1bHRUb1N5c3RlbSgpO1xuICAgIH1cbiAgICB2YXIgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0VG9QYXJ0cygpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLm51bSA9IGZ1bmN0aW9uIG51bShuKSB7XG4gICAgdmFyIHAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgICAvLyB3ZSBnZXQgc29tZSBwZXJmIG91dCBvZiBkb2luZyB0aGlzIGhlcmUsIGFubm95aW5nbHlcbiAgICBpZiAodGhpcy5vcHRzLmZvcmNlU2ltcGxlKSB7XG4gICAgICByZXR1cm4gcGFkU3RhcnQobiwgcCk7XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgaWYgKHAgPiAwKSB7XG4gICAgICBvcHRzLnBhZFRvID0gcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2MubnVtYmVyRm9ybWF0dGVyKG9wdHMpLmZvcm1hdChuKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSAnZW4nO1xuICAgIHZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob3B0cywgZXh0cmFjdCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvYy5leHRyYWN0KGR0LCBvcHRzLCBleHRyYWN0KTtcbiAgICB9LFxuICAgICAgICBmb3JtYXRPZmZzZXQgPSBmdW5jdGlvbiBmb3JtYXRPZmZzZXQob3B0cykge1xuICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgIHJldHVybiAnWic7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyAnKycgOiAnLScsXG4gICAgICAgICAgYmFzZSA9ICcnICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlICdzaG9ydCc6XG4gICAgICAgICAgcmV0dXJuICcnICsgc2lnbiArIF90aGlzLm51bShNYXRoLmFicyhob3VycyksIDIpICsgJzonICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuICAgICAgICBjYXNlICduYXJyb3cnOlxuICAgICAgICAgIHJldHVybiBtaW51dGVzID4gMCA/IGJhc2UgKyAnOicgKyBtaW51dGVzIDogYmFzZTtcbiAgICAgICAgY2FzZSAndGVjaGllJzpcbiAgICAgICAgICByZXR1cm4gJycgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1ZhbHVlIGZvcm1hdCAnICsgb3B0cy5mb3JtYXQgKyAnIGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7IGhvdXI6ICdudW1lcmljJywgaG91cjEyOiB0cnVlIH0sICdkYXlwZXJpb2QnKTtcbiAgICB9LFxuICAgICAgICBtb250aCA9IGZ1bmN0aW9uIG1vbnRoKGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgbW9udGg6IGxlbmd0aCB9IDogeyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKTtcbiAgICB9LFxuICAgICAgICB3ZWVrZGF5ID0gZnVuY3Rpb24gd2Vla2RheShsZW5ndGgsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgd2Vla2RheTogbGVuZ3RoIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCwgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSwgJ3dlZWtkYXknKTtcbiAgICB9LFxuICAgICAgICBtYXliZU1hY3JvID0gZnVuY3Rpb24gbWF5YmVNYWNybyh0b2tlbikge1xuICAgICAgdmFyIG1hY3JvID0gdG9rZW5Ub09iamVjdFt0b2tlbl07XG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHsgZXJhOiBsZW5ndGggfSwgJ2VyYScpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyO1xuXG4gICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAvLyBtc1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kKTtcbiAgICAgICAgY2FzZSAndSc6XG4gICAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCk7XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCwgMik7XG4gICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAvLyBob3Vyc1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyKTtcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIpO1xuICAgICAgICBjYXNlICdISCc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyLCAyKTtcbiAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiAnbmFycm93JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlonOlxuICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3Nob3J0JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlpaJzpcbiAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3RlY2hpZScsIGFsbG93WjogZmFsc2UgfSk7XG4gICAgICAgIGNhc2UgJ1paWlonOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcbiAgICAgICAgY2FzZSAnWlpaWlonOlxuICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVMb25nO1xuICAgICAgICAvLyB6b25lXG4gICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgIHJldHVybiBkdC56b25lTmFtZTtcbiAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnbnVtZXJpYycgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSk7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnMi1kaWdpdCcgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ2xvbmcnLCB0cnVlKTtcbiAgICAgICAgY2FzZSAnY2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ25hcnJvdycsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuICAgICAgICBjYXNlICdFJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdFRUUnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KCdsb25nJywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnbmFycm93JywgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG4gICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCk7XG4gICAgICAgIGNhc2UgJ0xMJzpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJzItZGlnaXQnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgIHJldHVybiBtb250aCgnbG9uZycsIHRydWUpO1xuICAgICAgICBjYXNlICdMTExMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKCduYXJyb3cnLCB0cnVlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gZm9ybWF0XG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgbW9udGg6ICcyLWRpZ2l0JyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdNTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ2xvbmcnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ25hcnJvdycsIGZhbHNlKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyB5ZWFyOiAnMi1kaWdpdCcgfSwgJ3llYXInKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgICAgLy8gbGlrZSAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDQpO1xuICAgICAgICBjYXNlICd5eXl5eXknOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAvLyBlcmFzXG4gICAgICAgIGNhc2UgJ0cnOlxuICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICByZXR1cm4gZXJhKCdzaG9ydCcpO1xuICAgICAgICBjYXNlICdHRyc6XG4gICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgIHJldHVybiBlcmEoJ2xvbmcnKTtcbiAgICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICAgIHJldHVybiBlcmEoJ25hcnJvdycpO1xuICAgICAgICBjYXNlICdrayc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgIGNhc2UgJ2tra2snOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcbiAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcbiAgICAgICAgY2FzZSAnb29vJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICBjYXNlICdxJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnF1YXJ0ZXIpO1xuICAgICAgICBjYXNlICdxcSc6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG1heWJlTWFjcm8odG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICByZXR1cm4gJ21pbnV0ZSc7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIHJldHVybiAnaG91cic7XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5udW0obGlsZHVyLmdldChtYXBwZWQpLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgICAgcmVhbFRva2VucyA9IHRva2Vucy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBfcmVmMikge1xuICAgICAgdmFyIGxpdGVyYWwgPSBfcmVmMi5saXRlcmFsLFxuICAgICAgICAgIHZhbCA9IF9yZWYyLnZhbDtcbiAgICAgIHJldHVybiBsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKTtcbiAgICB9LCBbXSksXG4gICAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvLmFwcGx5KGR1ciwgcmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuZnVuY3Rpb24gc3lzdGVtTG9jYWxlKCkge1xuICBpZiAoc3lzTG9jYWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSBpZiAoaGFzSW50bCgpKSB7XG4gICAgdmFyIGNvbXB1dGVkU3lzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuICAgIHN5c0xvY2FsZUNhY2hlID0gY29tcHV0ZWRTeXMgPT09ICd1bmQnID8gJ2VuLVVTJyA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9ICdlbi1VUyc7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGxDb25maWdTdHJpbmcobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKSB7XG4gIGlmIChoYXNJbnRsKCkpIHtcbiAgICBsb2NhbGUgPSBBcnJheS5pc0FycmF5KGxvY2FsZSkgPyBsb2NhbGUgOiBbbG9jYWxlXTtcblxuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZSA9IGxvY2FsZS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgbCArPSAnLXUnO1xuXG4gICAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICAgIGwgKz0gJy1jYS0nICsgb3V0cHV0Q2FsZW5kYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgICAgbCArPSAnLW51LScgKyBudW1iZXJpbmdTeXN0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgdmFyIG1zID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzICsgaSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gJ2Vycm9yJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09ICdlbicpIHtcbiAgICByZXR1cm4gZW5nbGlzaEZuKGxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGludGxGbihsZW5ndGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRmFzdE51bWJlcnMobG9jKSB7XG4gIGlmIChsb2MubnVtYmVyaW5nU3lzdGVtICYmIGxvYy5udW1iZXJpbmdTeXN0ZW0gIT09ICdsYXRuJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gJ2xhdG4nIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aCgnZW4nKSB8fCBoYXNJbnRsKCkgJiYgSW50bC5EYXRlVGltZUZvcm1hdChsb2MuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubnVtYmVyaW5nU3lzdGVtID09PSAnbGF0bic7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIob3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNpbXBsZU51bWJlckZvcm1hdHRlcik7XG5cbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMucm91bmQgPSBvcHRzLnJvdW5kIHx8IGZhbHNlO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgU2ltcGxlTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoaSkge1xuICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiByb3VuZFRvKGksIHRoaXMucm91bmQgPyAwIDogMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW50bE51bWJlckZvcm1hdHRlcihpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50bE51bWJlckZvcm1hdHRlcik7XG5cbiAgICB2YXIgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSB9O1xuXG4gICAgaWYgKG9wdHMucGFkVG8gPiAwKSB7XG4gICAgICBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucm91bmQpIHtcbiAgICAgIGludGxPcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5mbG9vciA9IG9wdHMuZmxvb3I7XG4gICAgdGhpcy5pbnRsID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGludGwsIGludGxPcHRzKTtcbiAgfVxuXG4gIEludGxOdW1iZXJGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmludGwuZm9ybWF0KGZpeGVkKTtcbiAgfTtcblxuICByZXR1cm4gSW50bE51bWJlckZvcm1hdHRlcjtcbn0oKTtcblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgUG9seURhdGVGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seURhdGVGb3JtYXR0ZXIpO1xuXG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG5cbiAgICB2YXIgeiA9IHZvaWQgMDtcbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSAnVVRDJztcbiAgICAgIGlmIChvcHRzLnRpbWVab25lTmFtZSkge1xuICAgICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmR0ID0gZHQub2Zmc2V0ID09PSAwID8gZHQgOiBEYXRlVGltZS5mcm9tTWlsbGlzKGR0LnRzICsgZHQub2Zmc2V0ICogNjAgKiAxMDAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGR0LnpvbmUudHlwZSA9PT0gJ2xvY2FsJykge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciByZWFsSW50bE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuICAgICAgaWYgKHopIHtcbiAgICAgICAgcmVhbEludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoaW50bCwgcmVhbEludGxPcHRzKTtcbiAgICB9XG4gIH1cblxuICBQb2x5RGF0ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZSgnZW4tVVMnKTtcbiAgICAgIHJldHVybiBGb3JtYXR0ZXIuY3JlYXRlKGxvYykuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMuZHQsIHRva2VuRm9ybWF0KTtcbiAgICB9XG4gIH07XG5cbiAgUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIFBvbHlEYXRlRm9ybWF0dGVyLnByb3RvdHlwZS5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlZE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6ICdlbi1VUycsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogJ2xhdG4nLFxuICAgICAgICBvdXRwdXRDYWxlbmRhcjogJ2dyZWdvcnknXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9seURhdGVGb3JtYXR0ZXI7XG59KCk7XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgTG9jYWxlLmZyb21PcHRzID0gZnVuY3Rpb24gZnJvbU9wdHMob3B0cykge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKG9wdHMubG9jYWxlLCBvcHRzLm51bWJlcmluZ1N5c3RlbSwgb3B0cy5vdXRwdXRDYWxlbmRhciwgb3B0cy5kZWZhdWx0VG9FTik7XG4gIH07XG5cbiAgTG9jYWxlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgICB2YXIgZGVmYXVsdFRvRU4gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgdmFyIHNwZWNpZmllZExvY2FsZSA9IGxvY2FsZSB8fCBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlLFxuXG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/ICdlbi1VUycgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICB9O1xuXG4gIExvY2FsZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdCgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBMb2NhbGUobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmc7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIHRoaXMuaW50bCA9IGludGxDb25maWdTdHJpbmcodGhpcy5sb2NhbGUsIHRoaXMubnVtYmVyaW5nU3lzdGVtLCB0aGlzLm91dHB1dENhbGVuZGFyKTtcblxuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHsgZm9ybWF0OiB7fSwgc3RhbmRhbG9uZToge30gfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IG51bGw7XG4gICAgdGhpcy5lcmFDYWNoZSA9IHt9O1xuXG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICAvLyB0b2RvOiBjYWNoZSBtZVxuICBMb2NhbGUucHJvdG90eXBlLmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoKSB7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09ICdlbicgfHwgdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKSA9PT0gJ2VuLXVzJyB8fCBpbnRsICYmIEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgnZW4tdXMnKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09ICdsYXRuJykgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gJ2dyZWdvcnknKTtcblxuICAgIGlmICghaGFzRlRQICYmICEoaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSAmJiAhZGVmYXVsdE9LKSB7XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gJ2VuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdpbnRsJztcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKGFsdHMpIHtcbiAgICBpZiAoIWFsdHMgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIExvY2FsZS5jcmVhdGUoYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLCBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLnJlZGVmYXVsdFRvRU4gPSBmdW5jdGlvbiByZWRlZmF1bHRUb0VOKCkge1xuICAgIHZhciBhbHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHsgZGVmYXVsdFRvRU46IHRydWUgfSkpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbSgpIHtcbiAgICB2YXIgYWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7IGRlZmF1bHRUb0VOOiBmYWxzZSB9KSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tb250aHMgPSBmdW5jdGlvbiBtb250aHMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBkZWZhdWx0T0sgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBtb250aHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8geyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9IDogeyBtb250aDogbGVuZ3RoIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSc7XG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsICdtb250aCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzJCQxKGxlbmd0aCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIHdlZWtkYXlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IGZvcm1hdCA/IHsgd2Vla2RheTogbGVuZ3RoLCB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnO1xuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCAnd2Vla2RheScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMkJDEoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCB1bmRlZmluZWQsIGRlZmF1bHRPSywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lcmlkaWVtcztcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgY291bGQgYmUgYXJpYml0cmFyeSBkYXkgcGVyaW9kcy4gV2UncmUgZ29ubmEgYXNzdW1lIHRoZXJlIGFyZSBleGFjdGx5IHR3b1xuICAgICAgLy8gZm9yIEFNIGFuZCBQTS4gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYnV0IGl0J3MgbWFrZXMgcGFyc2luZyB3YXkgZWFzaWVyLlxuICAgICAgaWYgKCFfdGhpczMubWVyaWRpZW1DYWNoZSkge1xuICAgICAgICB2YXIgaW50bCA9IHsgaG91cjogJ251bWVyaWMnLCBob3VyMTI6IHRydWUgfTtcbiAgICAgICAgX3RoaXMzLm1lcmlkaWVtQ2FjaGUgPSBbRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgOSksIERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDE5KV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuZXh0cmFjdChkdCwgaW50bCwgJ2RheXBlcmlvZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgZXJhcywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSB7IGVyYTogbGVuZ3RoIH07XG5cbiAgICAgIC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cbiAgICAgIGlmICghX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0gPSBbRGF0ZVRpbWUudXRjKC00MCwgMSwgMSksIERhdGVUaW1lLnV0YygyMDE3LCAxLCAxKV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczQuZXh0cmFjdChkdCwgaW50bCwgJ2VyYScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzNC5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoZHQsIGludGxPcHRzLCBmaWVsZCkge1xuICAgIHZhciBkZiA9IHRoaXMuZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSxcbiAgICAgICAgcmVzdWx0cyA9IGRmLmZvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZmllbGQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmcgPyBtYXRjaGluZy52YWx1ZSA6IG51bGw7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5udW1iZXJGb3JtYXR0ZXIgPSBmdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXIoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgLy8gdGhpcyBmb3JjZXNpbXBsZSBvcHRpb24gaXMgbmV2ZXIgdXNlZCAodGhlIG9ubHkgY2FsbGVyIHNob3J0LWNpcmN1aXRzIG9uIGl0LCBidXQgaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUpXG4gICAgLy8gKGluIGNvbnRyYXN0LCB0aGUgcmVzdCBvZiB0aGUgY29uZGl0aW9uIGlzIHVzZWQgaGVhdmlseSlcbiAgICBpZiAob3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzIHx8ICFoYXNJbnRsKCkpIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGxOdW1iZXJGb3JtYXR0ZXIodGhpcy5pbnRsLCBvcHRzKTtcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5kdEZvcm1hdHRlciA9IGZ1bmN0aW9uIGR0Rm9ybWF0dGVyKGR0KSB7XG4gICAgdmFyIGludGxPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgUG9seURhdGVGb3JtYXR0ZXIoZHQsIHRoaXMuaW50bCwgaW50bE9wdHMpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlID09PSBvdGhlci5sb2NhbGUgJiYgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJiB0aGlzLm91dHB1dENhbGVuZGFyID09PSBvdGhlci5vdXRwdXRDYWxlbmRhcjtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhMb2NhbGUsIFt7XG4gICAga2V5OiAnZmFzdE51bWJlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXG4gKiBUaGlzIGZpbGUgaGFuZGxlcyBwYXJzaW5nIGZvciB3ZWxsLXNwZWNpZmllZCBmb3JtYXRzLiBIZXJlJ3MgaG93IGl0IHdvcmtzOlxuICogVHdvIHRoaW5ncyBnbyBpbnRvIHBhcnNpbmc6IGEgcmVnZXggdG8gbWF0Y2ggd2l0aCBhbmQgYW4gZXh0cmFjdG9yIHRvIHRha2UgYXBhcnQgdGhlIGdyb3VwcyBpbiB0aGUgbWF0Y2guXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XG4gKiBwYXJzZSgpIGRvZXMgdGhlIHdvcmsgb2YgZXhlY3V0aW5nIHRoZSByZWdleCBhbmQgYXBwbHlpbmcgdGhlIGV4dHJhY3Rvci4gSXQgdGFrZXMgbXVsdGlwbGUgcmVnZXgvZXh0cmFjdG9yIHBhaXJzIHRvIHRyeSBpbiBzZXF1ZW5jZS5cbiAqIEV4dHJhY3RvcnMgY2FuIHRha2UgYSBcImN1cnNvclwiIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IGluIHRoZSBtYXRjaCB0byBsb29rIGF0LiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY29tYmluZSBleHRyYWN0b3JzLlxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cbiAqIFNvbWUgZXh0cmFjdGlvbnMgYXJlIHN1cGVyIGR1bWIgYW5kIHNpbXBsZVBhcnNlIGFuZCBmcm9tU3RyaW5ncyBoZWxwIERSWSB0aGVtLlxuICovXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWdleGVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVnZXhlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZ2V4ZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgZnVsbCA9IHJlZ2V4ZXMucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyByLnNvdXJjZTtcbiAgfSwgJycpO1xuICByZXR1cm4gUmVnRXhwKCdeJyArIGZ1bGwgKyAnJCcpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycygpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBleHRyYWN0b3JzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIHBhdHRlcm5zW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gcGF0dGVybnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWYzO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfcmVmMztcbiAgICB2YXIgcmVnZXggPSBfcmVmMlswXTtcbiAgICB2YXIgZXh0cmFjdG9yID0gX3JlZjJbMV07XG5cbiAgICB2YXIgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIGN1cnNvcikge1xuICAgIHZhciByZXQgPSB7fTtcbiAgICB2YXIgaSA9IHZvaWQgMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRba2V5c1tpXV0gPSBwYXJzZUludChtYXRjaFtjdXJzb3IgKyBpXSk7XG4gICAgfVxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn1cblxuLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xudmFyIG9mZnNldFJlZ2V4ID0gLyg/OihaKXwoWystXVxcZFxcZCkoPzo6PyhcXGRcXGQpKT8pLyxcbiAgICBpc29UaW1lQmFzZVJlZ2V4ID0gLyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpbLixdKFxcZHsxLDl9KSk/KT8pPy8sXG4gICAgaXNvVGltZVJlZ2V4ID0gUmVnRXhwKCcnICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyAnPycpLFxuICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cCgnKD86VCcgKyBpc29UaW1lUmVnZXguc291cmNlICsgJyk/JyksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCktPyhcXGQpLyxcbiAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICBleHRyYWN0SVNPV2Vla0RhdGEgPSBzaW1wbGVQYXJzZSgnd2Vla1llYXInLCAnd2Vla051bWJlcicsICd3ZWVrRGF5JyksXG4gICAgZXh0cmFjdElTT09yZGluYWxEYXRhID0gc2ltcGxlUGFyc2UoJ3llYXInLCAnb3JkaW5hbCcpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyAnID8oPzonICsgb2Zmc2V0UmVnZXguc291cmNlICsgJ3woW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/JyksXG4gICAgc3FsVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKCcoPzogJyArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyAnKT8nKTtcblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIHllYXI6IHBhcnNlSW50KG1hdGNoW2N1cnNvcl0pLFxuICAgIG1vbnRoOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAxXSkgfHwgMSxcbiAgICBkYXk6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDJdKSB8fCAxXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBsb2NhbCA9ICFtYXRjaFtjdXJzb3JdICYmICFtYXRjaFtjdXJzb3IgKyAxXSxcbiAgICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICAgIHpvbmUgPSBsb2NhbCA/IG51bGwgOiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoZnVsbE9mZnNldCk7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SUFOQVpvbmUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBuZXcgSUFOQVpvbmUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIGR1cmF0aW9uIHBhcnNpbmdcblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KFxcZHsxLDl9KVkpPyg/OihcXGR7MSw5fSlNKT8oPzooXFxkezEsOX0pRCk/KD86VCg/OihcXGR7MSw5fSlIKT8oPzooXFxkezEsOX0pTSk/KD86KFxcZHsxLDl9KSg/OlsuLF0oXFxkezEsOX0pKT9TKT8pP3woXFxkezEsOX0pVykkLztcblxuZnVuY3Rpb24gZXh0cmFjdElTT0R1cmF0aW9uKG1hdGNoKSB7XG4gIHZhciB5ZWFyU3RyID0gbWF0Y2hbMV0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzJdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbM10sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs1XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzZdLFxuICAgICAgbWlsbGlzZWNvbmRzU3RyID0gbWF0Y2hbN10sXG4gICAgICB3ZWVrU3RyID0gbWF0Y2hbOF07XG5cblxuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59XG5cbi8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcbnZhciBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwXG59O1xuXG5mdW5jdGlvbiBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHllYXI6IHllYXJTdHIubGVuZ3RoID09PSAyID8gdW50cnVuY2F0ZVllYXIocGFyc2VJbnQoeWVhclN0cikpIDogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGg6IG1vbnRoU3RyLmxlbmd0aCA9PT0gMiA/IHBhcnNlSW50KG1vbnRoU3RyLCAxMCkgOiBtb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludChkYXlTdHIpLFxuICAgIGhvdXI6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWludXRlU3RyKVxuICB9O1xuXG4gIGlmIChzZWNvbmRTdHIpIHJlc3VsdC5zZWNvbmQgPSBwYXJzZUludChzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID0gd2Vla2RheVN0ci5sZW5ndGggPiAzID8gd2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxIDogd2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpICsgMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJGQyAyODIyLzUzMjJcbnZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIG9ic09mZnNldCA9IG1hdGNoWzhdLFxuICAgICAgbWlsT2Zmc2V0ID0gbWF0Y2hbOV0sXG4gICAgICBvZmZIb3VyU3RyID0gbWF0Y2hbMTBdLFxuICAgICAgb2ZmTWludXRlU3RyID0gbWF0Y2hbMTFdLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuXG5cbiAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS50cmltKCk7XG59XG5cbi8vIGh0dHAgZGF0ZVxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW3JmYzg1MCwgZXh0cmFjdFJGQzExMjNPcjg1MF0sIFthc2NpaSwgZXh0cmFjdEFTQ0lJXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UocywgW2NvbWJpbmVSZWdleGVzKHNxbFltZFJlZ2V4LCBzcWxUaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPWW1kLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0sIFtjb21iaW5lUmVnZXhlcyhzcWxUaW1lUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0pO1xufVxuXG52YXIgSU5WQUxJRCA9ICdJbnZhbGlkIER1cmF0aW9uJyxcbiAgICBVTlBBUlNBQkxFID0gJ3VucGFyc2FibGUnO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICBtaW51dGVzOiB7IHNlY29uZHM6IDYwLCBtaWxsaXNlY29uZHM6IDYwICogMTAwMCB9LFxuICBzZWNvbmRzOiB7IG1pbGxpc2Vjb25kczogMTAwMCB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7XG5cbi8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxudmFyIG9yZGVyZWRVbml0cyA9IFsneWVhcnMnLCAncXVhcnRlcnMnLCAnbW9udGhzJywgJ3dlZWtzJywgJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddO1xuXG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cykge1xuICB2YXIgY2xlYXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIC8vIGRlZXAgbWVyZ2UgZm9yIHZhbHNcbiAgdmFyIGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogT2JqZWN0LmFzc2lnbih7fSwgZHVyLnZhbHVlcywgYWx0cy52YWx1ZXMgfHwge30pLFxuICAgIGxvYzogZHVyLmxvYy5jbG9uZShhbHRzLmxvYyksXG4gICAgY29udmVyc2lvbkFjY3VyYWN5OiBhbHRzLmNvbnZlcnNpb25BY2N1cmFjeSB8fCBkdXIuY29udmVyc2lvbkFjY3VyYWN5XG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbi8vIHNvbWUgZnVuY3Rpb25zIHJlYWxseSBjYXJlIGFib3V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIGR1cmF0aW9uLCBzbyBjb21iaW5lZCB3aXRoXG4vLyBub3JtYWxpemUoKSB0aGlzIHRlbGxzIHVzIHdoZXRoZXIgdGhpcyBkdXJhdGlvbiBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZVxuZnVuY3Rpb24gaXNIaWdoT3JkZXJOZWdhdGl2ZShvYmopIHtcbiAgLy8gb25seSBydWxlIGlzIHRoYXQgdGhlIGhpZ2hlc3Qtb3JkZXIgcGFydCBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgayA9IF9yZWY7XG5cbiAgICBpZiAob2JqW2tdKSByZXR1cm4gb2JqW2tdIDwgMDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICB2YXIgY29udiA9IG1hdHJpeFt0b1VuaXRdW2Zyb21Vbml0XSxcbiAgICAgIGFkZGVkID0gTWF0aC5mbG9vcihmcm9tTWFwW2Zyb21Vbml0XSAvIGNvbnYpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbikge1xuICBpZiAoaXNOdW1iZXIoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb24pO1xuICB9IGVsc2UgaWYgKGR1cmF0aW9uIGluc3RhbmNlb2YgRHVyYXRpb24pIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0gZWxzZSBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGR1cmF0aW9uIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGEgRHVyYXRpb24sIHVzZSB7QGxpbmsgRHVyYXRpb24uZnJvbU1pbGxpc30sIHtAbGluayBEdXJhdGlvbi5mcm9tT2JqZWN0fSwgb3Ige0BsaW5rIER1cmF0aW9uLmZyb21JU099LlxyXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayB5ZWFyc30sIHtAbGluayBtb250aHN9LCB7QGxpbmsgd2Vla3N9LCB7QGxpbmsgZGF5c30sIHtAbGluayBob3Vyc30sIHtAbGluayBtaW51dGVzfSwge0BsaW5rIHNlY29uZHN9LCB7QGxpbmsgbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKiBUbyBjcmVhdGUgbmV3IER1cmF0aW9ucyBvdXQgb2Ygb2xkIG9uZXMgdXNlIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIG5vcm1hbGl6ZX0sIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2hpZnRUb30sIGFuZCB7QGxpbmsgbmVnYXRlfS5cclxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIGFzfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0pTT059XHJcbiAqXHJcbiAqIFRoZXJlJ3MgYXJlIG1vcmUgbWV0aG9kcyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdmFsaWRpdHksIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb24oY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRHVyYXRpb24pO1xuXG4gICAgdmFyIGFjY3VyYXRlID0gY29uZmlnLmNvbnZlcnNpb25BY2N1cmFjeSA9PT0gJ2xvbmd0ZXJtJyB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gJ2xvbmd0ZXJtJyA6ICdjYXN1YWwnO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gIH1cblxuICAvKipcclxuICAgKiBDcmVhdGUgRHVyYXRpb24gZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbU1pbGxpcyA9IGZ1bmN0aW9uIGZyb21NaWxsaXMoY291bnQsIG9wdHMpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFycycgYW5kICdob3Vycy4gXHJcbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiB6ZXJvICBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmouY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0R1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICB2YWx1ZXM6IG5vcm1hbGl6ZU9iamVjdChvYmosIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvYmopLFxuICAgICAgY29udmVyc2lvbkFjY3VyYWN5OiBvYmouY29udmVyc2lvbkFjY3VyYWN5XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChVTlBBUlNBQkxFKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHJlYXNvbiB0aGlzIGlzIGludmFsaWRcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRHVyYXRpb25FcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIHZhciBpZ25vcmVVbmtub3duID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIHZhciBub3JtYWxpemVkID0ge1xuICAgICAgeWVhcjogJ3llYXJzJyxcbiAgICAgIHllYXJzOiAneWVhcnMnLFxuICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXJzJyxcbiAgICAgIHF1YXJ0ZXJzOiAncXVhcnRlcnMnLFxuICAgICAgbW9udGg6ICdtb250aHMnLFxuICAgICAgbW9udGhzOiAnbW9udGhzJyxcbiAgICAgIHdlZWs6ICd3ZWVrcycsXG4gICAgICB3ZWVrczogJ3dlZWtzJyxcbiAgICAgIGRheTogJ2RheXMnLFxuICAgICAgZGF5czogJ2RheXMnLFxuICAgICAgaG91cjogJ2hvdXJzJyxcbiAgICAgIGhvdXJzOiAnaG91cnMnLFxuICAgICAgbWludXRlOiAnbWludXRlcycsXG4gICAgICBtaW51dGVzOiAnbWludXRlcycsXG4gICAgICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgICAgIHNlY29uZHM6ICdzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcydcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsb29yPXRydWVdIC0gZmxvb3IgbnVtZXJpY2FsIHZhbHVlc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgLy8gcmV2ZXJzZS1jb21wYXQgc2luY2UgMS4yOyB3ZSBhbHdheXMgcm91bmQgZG93biBub3csIG5ldmVyIHVwLCBhbmQgd2UgZG8gaXQgYnkgZGVmYXVsdC4gU286XG4gICAgLy8gMS4gYWx3YXlzIHR1cm4gb2ZmIHJvdW5kaW5nIGluIHRoZSB1bmRlcmx5aW5nIGZvcm1hdHRlclxuICAgIC8vIDIuIHR1cm4gb2ZmIGZsb29yaW5nIGlmIGVpdGhlciByb3VuZGluZyBpcyB0dXJuZWQgb2ZmIG9yIGZsb29yaW5nIGlzIHR1cm5lZCBvZmYsIG90aGVyd2lzZSBsZWF2ZSBpdCBvblxuICAgIHZhciBmbXRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBmbG9vcjogdHJ1ZSwgcm91bmQ6IGZhbHNlIH0pO1xuICAgIGlmIChvcHRzLnJvdW5kID09PSBmYWxzZSB8fCBvcHRzLmZsb29yID09PSBmYWxzZSkge1xuICAgICAgZm10T3B0cy5mbG9vciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnZhbHVlcyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLmNvbnZlcnNpb25BY2N1cmFjeSA9IHRoaXMuY29udmVyc2lvbkFjY3VyYWN5O1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA0LCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1A0TVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNSB9KS50b0lTTygpIC8vPT4gJ1A1TSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbGxpc2Vjb25kczogNiB9KS50b0lTTygpIC8vPT4gJ1BUMC4wMDZTJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIC8vIHdlIGNvdWxkIHVzZSB0aGUgZm9ybWF0dGVyLCBidXQgdGhpcyBpcyBhbiBlYXNpZXIgd2F5IHRvIGdldCB0aGUgbWluaW11bSBzdHJpbmdcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcyA9ICdQJyxcbiAgICAgICAgbm9ybSA9IHRoaXMubm9ybWFsaXplKCk7XG5cbiAgICAvLyBJU08gZHVyYXRpb25zIGFyZSBhbHdheXMgcG9zaXRpdmUsIHNvIHRha2UgdGhlIGFic29sdXRlIHZhbHVlXG4gICAgbm9ybSA9IGlzSGlnaE9yZGVyTmVnYXRpdmUobm9ybS52YWx1ZXMpID8gbm9ybS5uZWdhdGUoKSA6IG5vcm07XG5cbiAgICBpZiAobm9ybS55ZWFycyA+IDApIHMgKz0gbm9ybS55ZWFycyArICdZJztcbiAgICBpZiAobm9ybS5tb250aHMgPiAwIHx8IG5vcm0ucXVhcnRlcnMgPiAwKSBzICs9IG5vcm0ubW9udGhzICsgbm9ybS5xdWFydGVycyAqIDMgKyAnTSc7XG4gICAgaWYgKG5vcm0uZGF5cyA+IDAgfHwgbm9ybS53ZWVrcyA+IDApIHMgKz0gbm9ybS5kYXlzICsgbm9ybS53ZWVrcyAqIDcgKyAnRCc7XG4gICAgaWYgKG5vcm0uaG91cnMgPiAwIHx8IG5vcm0ubWludXRlcyA+IDAgfHwgbm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gJ1QnO1xuICAgIGlmIChub3JtLmhvdXJzID4gMCkgcyArPSBub3JtLmhvdXJzICsgJ0gnO1xuICAgIGlmIChub3JtLm1pbnV0ZXMgPiAwKSBzICs9IG5vcm0ubWludXRlcyArICdNJztcbiAgICBpZiAobm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gbm9ybS5zZWNvbmRzICsgbm9ybS5taWxsaXNlY29uZHMgLyAxMDAwICsgJ1MnO1xuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLmFzKCdtaWxsaXNlY29uZHMnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHRoZSBSRVBMLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICB2YXIgdmFsc0luc3BlY3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0KCkpO1xuICAgICAgcmV0dXJuICdEdXJhdGlvbiB7XFxuICB2YWx1ZXM6ICcgKyB2YWxzSW5zcGVjdCArICcsXFxuICBsb2NhbGU6ICcgKyB0aGlzLmxvY2FsZSArICcsXFxuICBjb252ZXJzaW9uQWNjdXJhY3k6ICcgKyB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSArICcgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICcgKyB0aGlzLmludmFsaWRSZWFzb24gKyAnIH0nO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IG9yZGVyZWRVbml0cywgX2lzQXJyYXkyID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IyKSwgX2kyID0gMCwgX2l0ZXJhdG9yMiA9IF9pc0FycmF5MiA/IF9pdGVyYXRvcjIgOiBfaXRlcmF0b3IyW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjI7XG5cbiAgICAgIGlmIChfaXNBcnJheTIpIHtcbiAgICAgICAgaWYgKF9pMiA+PSBfaXRlcmF0b3IyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yMltfaTIrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTIgPSBfaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgaWYgKF9pMi5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjIgPSBfaTIudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrID0gX3JlZjI7XG5cbiAgICAgIHZhciB2YWwgPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICBpZiAodmFsICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5wbHVzKGR1ci5uZWdhdGUoKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLnllYXJzIC8vPT4gMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkubW9udGhzIC8vPT4gMFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZGF5cyAvLz0+IDNcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0JCQxKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG1peGVkIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIGR1ci5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNvbnZlcnNpb25BY2N1cmFjeSA9IF9yZWYzLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSB9KSxcbiAgICAgICAgb3B0cyA9IHsgbG9jOiBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ2RheXMnKSAvLz0+IDM2NVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLmFzID0gZnVuY3Rpb24gYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBuZWcgPSBpc0hpZ2hPcmRlck5lZ2F0aXZlKHRoaXMudmFsdWVzKSxcbiAgICAgICAgdmFscyA9IChuZWcgPyB0aGlzLm5lZ2F0ZSgpIDogdGhpcykudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICAgIHJldHVybiBuZWcgPyBkdXIubmVnYXRlKCkgOiBkdXI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIER1cmF0aW9uIGludG8gaXRzIHJlcHJlc2VudGF0aW9uIGluIGEgZGlmZmVyZW50IHNldCBvZiB1bml0cy5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnNoaWZ0VG8gPSBmdW5jdGlvbiBzaGlmdFRvKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB1bml0cyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuXG4gICAgdmFyIGJ1aWx0ID0ge30sXG4gICAgICAgIGFjY3VtdWxhdGVkID0ge30sXG4gICAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgdmFyIGxhc3RVbml0ID0gdm9pZCAwO1xuXG4gICAgbm9ybWFsaXplVmFsdWVzKHRoaXMubWF0cml4LCB2YWxzKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5MyA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMyksIF9pMyA9IDAsIF9pdGVyYXRvcjMgPSBfaXNBcnJheTMgPyBfaXRlcmF0b3IzIDogX2l0ZXJhdG9yM1tTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY0O1xuXG4gICAgICBpZiAoX2lzQXJyYXkzKSB7XG4gICAgICAgIGlmIChfaTMgPj0gX2l0ZXJhdG9yMy5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNCA9IF9pdGVyYXRvcjNbX2kzKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kzID0gX2l0ZXJhdG9yMy5uZXh0KCk7XG4gICAgICAgIGlmIChfaTMuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY0ID0gX2kzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY0O1xuXG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcblxuICAgICAgICB2YXIgb3duID0gMDtcblxuICAgICAgICAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gTWF0aC50cnVuYyhvd24pO1xuICAgICAgICBidWlsdFtrXSA9IGk7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gb3duIC0gaTtcblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gdGhhdCBzaG91bGQgYmUgcm9sbGVkIHVwIGluIHRvIHRoaXNcbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgaWYgKGxhc3RVbml0KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgaWYgKGFjY3VtdWxhdGVkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSA+IDApIHtcbiAgICAgICAgICAgIGJ1aWx0W2xhc3RVbml0XSArPSBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBidWlsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmVnYXRlZCA9IHt9O1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyksIF9pc0FycmF5NCA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yNCksIF9pNCA9IDAsIF9pdGVyYXRvcjQgPSBfaXNBcnJheTQgPyBfaXRlcmF0b3I0IDogX2l0ZXJhdG9yNFtTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY1O1xuXG4gICAgICBpZiAoX2lzQXJyYXk0KSB7XG4gICAgICAgIGlmIChfaTQgPj0gX2l0ZXJhdG9yNC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNSA9IF9pdGVyYXRvcjRbX2k0KytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2k0ID0gX2l0ZXJhdG9yNC5uZXh0KCk7XG4gICAgICAgIGlmIChfaTQuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY1ID0gX2k0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY1O1xuXG4gICAgICBuZWdhdGVkW2tdID0gLXRoaXMudmFsdWVzW2tdO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG5lZ2F0ZWQgfSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB5ZWFycy5cclxuICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogRXF1YWxpdHkgY2hlY2tcclxuICAgKiBUd28gRHVyYXRpb25zIGFyZSBlcXVhbCBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHVuaXRzIGFuZCB0aGUgc2FtZSB2YWx1ZXMgZm9yIGVhY2ggdW5pdC5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIER1cmF0aW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gb3JkZXJlZFVuaXRzLCBfaXNBcnJheTUgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvcjUpLCBfaTUgPSAwLCBfaXRlcmF0b3I1ID0gX2lzQXJyYXk1ID8gX2l0ZXJhdG9yNSA6IF9pdGVyYXRvcjVbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmNjtcblxuICAgICAgaWYgKF9pc0FycmF5NSkge1xuICAgICAgICBpZiAoX2k1ID49IF9pdGVyYXRvcjUubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjYgPSBfaXRlcmF0b3I1W19pNSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pNSA9IF9pdGVyYXRvcjUubmV4dCgpO1xuICAgICAgICBpZiAoX2k1LmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmNiA9IF9pNS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSBfcmVmNjtcblxuICAgICAgaWYgKHRoaXMudmFsdWVzW3VdICE9PSBvdGhlci52YWx1ZXNbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhEdXJhdGlvbiwgW3tcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3llYXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVycy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncXVhcnRlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRocy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2Vla3NcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3MnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheXMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91cnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGVzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGVzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2Vjb25kcycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbWlsbGlzZWNvbmRzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xyXG4gICAgICogb24gaW52YWxpZCBEYXRlVGltZXMgb3IgSW50ZXJ2YWxzLlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ludmFsaWRSZWFzb24nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIER1cmF0aW9uO1xufSgpO1xuXG52YXIgSU5WQUxJRCQxID0gJ0ludmFsaWQgSW50ZXJ2YWwnO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuICEhc3RhcnQgJiYgISFlbmQgJiYgc3RhcnQuaXNWYWxpZCAmJiBlbmQuaXNWYWxpZCAmJiBzdGFydCA8PSBlbmQ7XG59XG5cbi8qKlxyXG4gKiBBbiBJbnRlcnZhbCBvYmplY3QgcmVwcmVzZW50cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBvZiB0aW1lLCB3aGVyZSBlYWNoIGVuZHBvaW50IGlzIGEge0BsaW5rIERhdGVUaW1lfS4gQ29uY2VwdHVhbGx5LCBpdCdzIGEgY29udGFpbmVyIGZvciB0aG9zZSB0d28gZW5kcG9pbnRzLCBhY2NvbXBhbmllZCBieSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgY29tcGFyaW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gSW50ZXJ2YWw6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIGFmdGVyfSwge0BsaW5rIGJlZm9yZX0sIG9yIHtAbGluayBmcm9tSVNPfS5cclxuICogKiAqKkFjY2Vzc29ycyoqIFVzZSB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgZW5kfSB0byBnZXQgdGhlIHN0YXJ0IGFuZCBlbmQuXHJcbiAqICogKipJbnRlcnJvZ2F0aW9uKiogVG8gYW5hbHl6ZSB0aGUgSW50ZXJ2YWwsIHVzZSB7QGxpbmsgY291bnR9LCB7QGxpbmsgbGVuZ3RofSwge0BsaW5rIGhhc1NhbWV9LCB7QGxpbmsgY29udGFpbnN9LCB7QGxpbmsgaXNBZnRlcn0sIG9yIHtAbGluayBpc0JlZm9yZX0uXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayBzcGxpdEF0fSwge0BsaW5rIHNwbGl0Qnl9LCB7QGxpbmsgZGl2aWRlRXF1YWxseX0sIHtAbGluayBtZXJnZX0sIHtAbGluayB4b3J9LCB7QGxpbmsgdW5pb259LCB7QGxpbmsgaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIGRpZmZlcmVuY2V9LlxyXG4gKiAqICoqQ29tcGFyaXNvbioqIFRvIGNvbXBhcmUgdGhpcyBJbnRlcnZhbCB0byBhbm90aGVyIG9uZSwgdXNlIHtAbGluayBlcXVhbHN9LCB7QGxpbmsgb3ZlcmxhcHN9LCB7QGxpbmsgYWJ1dHNTdGFydH0sIHtAbGluayBhYnV0c0VuZH0sIHtAbGluayBlbmd1bGZzfVxyXG4gKiAqICoqT3V0cHV0KioqIFRvIGNvbnZlcnQgdGhlIEludGVydmFsIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS5cclxuICovXG5cbnZhciBJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gSW50ZXJ2YWwoY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJ2YWwpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5lID0gY29uZmlnLmVuZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWRSZWFzb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoeyBpbnZhbGlkUmVhc29uOiByZWFzb24gfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGFuIGVuZCBEYXRlVGltZS4gSW5jbHVzaXZlIG9mIHRoZSBzdGFydCBidXQgbm90IHRoZSBlbmQuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmZyb21EYXRlVGltZXMgPSBmdW5jdGlvbiBmcm9tRGF0ZVRpbWVzKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYnVpbHRTdGFydCA9IGZyaWVuZGx5RGF0ZVRpbWUoc3RhcnQpLFxuICAgICAgICBidWlsdEVuZCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZFJlYXNvbjogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZCkgPyBudWxsIDogJ2ludmFsaWQgZW5kcG9pbnRzJ1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIHRvLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYWZ0ZXIgPSBmdW5jdGlvbiBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gcGFzcyB7QHNlZSBEYXRlVGltZS5mcm9tSVNPfVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08oc3RyaW5nLCBvcHRzKSB7XG4gICAgaWYgKHN0cmluZykge1xuICAgICAgdmFyIF9zdHJpbmckc3BsaXQgPSBzdHJpbmcuc3BsaXQoL1xcLy8pLFxuICAgICAgICAgIHMgPSBfc3RyaW5nJHNwbGl0WzBdLFxuICAgICAgICAgIGUgPSBfc3RyaW5nJHNwbGl0WzFdO1xuXG4gICAgICBpZiAocyAmJiBlKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksIERhdGVUaW1lLmZyb21JU08oZSwgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZCgnaW52YWxpZCBJU08gZm9ybWF0Jyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuICBJbnRlcnZhbC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gbGVuZ3RoKCkge1xuICAgIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbWlsbGlzZWNvbmRzJztcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY291bnQgb2YgbWludXRlcywgaG91cnMsIGRheXMsIG1vbnRocywgb3IgeWVhcnMgaW5jbHVkZWQgaW4gdGhlIEludGVydmFsLCBldmVuIGluIHBhcnQuXHJcbiAgICogVW5saWtlIHtAbGluayBsZW5ndGh9IHRoaXMgY291bnRzIHNlY3Rpb25zIG9mIHRoZSBjYWxlbmRhciwgbm90IHBlcmlvZHMgb2YgdGltZSwgZS5nLiBzcGVjaWZ5aW5nICdkYXknXHJcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3VuaXQ9J21pbGxpc2Vjb25kcyddIC0gdGhlIHVuaXQgb2YgdGltZSB0byBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbiBjb3VudCgpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ21pbGxpc2Vjb25kcyc7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIE5hTjtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICAgIGVuZCA9IHRoaXMuZW5kLnN0YXJ0T2YodW5pdCk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZW5kLmRpZmYoc3RhcnQsIHVuaXQpLmdldCh1bml0KSkgKyAxO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgRGF0ZVRpbWVzLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmlzQWZ0ZXIgPSBmdW5jdGlvbiBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gZGF0ZVRpbWUgJiYgdGhpcy5lID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyB0byBzZXRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCQkMSgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIHN0YXJ0ID0gX3JlZi5zdGFydCxcbiAgICAgICAgZW5kID0gX3JlZi5lbmQ7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQgfHwgdGhpcy5zLCBlbmQgfHwgdGhpcy5lKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBzb3J0ZWQgPSBkYXRlVGltZXMubWFwKGZyaWVuZGx5RGF0ZVRpbWUpLnNvcnQoKSxcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgICBpID0gMDtcblxuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIHZhciBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoJ21pbGxpc2Vjb25kcycpID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGFkZGVkID0gdm9pZCAwLFxuICAgICAgICBuZXh0ID0gdm9pZCAwO1xuXG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzbWFsbGVyIGludGVydmFscy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZQYXJ0cyAtIFRoZSBudW1iZXIgb2YgSW50ZXJ2YWxzIHRvIGRpdmlkZSB0aGUgSW50ZXJ2YWwgaW50by5cclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmRpdmlkZUVxdWFsbHkgPSBmdW5jdGlvbiBkaXZpZGVFcXVhbGx5KG51bWJlck9mUGFydHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLnNwbGl0QnkodGhpcy5sZW5ndGgoKSAvIG51bWJlck9mUGFydHMpLnNsaWNlKDAsIG51bWJlck9mUGFydHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgb3ZlcmxhcHMgd2l0aCB0aGUgc3BlY2lmaWVkIEludGVydmFsXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLm92ZXJsYXBzID0gZnVuY3Rpb24gb3ZlcmxhcHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lID4gb3RoZXIucyAmJiB0aGlzLnMgPCBvdGhlci5lO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBpcyBhZGphY2VudCB0byB0aGUgc3BlY2lmaWVkIEludGVydmFsJ3MgZW5kLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c0VuZCA9IGZ1bmN0aW9uIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmVuZ3VsZnMgPSBmdW5jdGlvbiBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWF4aW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWluaW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgaS5lLiwgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA8IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuXG4gICAgaWYgKHMgPiBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIHVuaW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnVuaW9uID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPCBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgZW5kcyA9IGludGVydmFscy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBbeyB0aW1lOiBpLnMsIHR5cGU6ICdzJyB9LCB7IHRpbWU6IGkuZSwgdHlwZTogJ2UnIH1dO1xuICAgIH0pLFxuICAgICAgICBmbGF0dGVuZWQgPSAoX0FycmF5JHByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSkuY29uY2F0LmFwcGx5KF9BcnJheSRwcm90b3R5cGUsIGVuZHMpLFxuICAgICAgICBhcnIgPSBmbGF0dGVuZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGFyciwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMztcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBfcmVmMztcblxuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gJ3MnID8gMSA6IC0xO1xuXG4gICAgICBpZiAoY3VycmVudENvdW50ID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gaS50aW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0ICYmICtzdGFydCAhPT0gK2kudGltZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHN0YXJ0LCBpLnRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwubWVyZ2UocmVzdWx0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgaW50ZXJ2YWxzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcmV0dXJuIEludGVydmFsLnhvcihbdGhpc10uY29uY2F0KGludGVydmFscykpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIF90aGlzLmludGVyc2VjdGlvbihpKTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpICYmICFpLmlzRW1wdHkoKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gJ1snICsgdGhpcy5zLnRvSVNPKCkgKyAnIFxcdTIwMTMgJyArIHRoaXMuZS50b0lTTygpICsgJyknO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnSW50ZXJ2YWwge1xcbiAgc3RhcnQ6ICcgKyB0aGlzLnN0YXJ0LnRvSVNPKCkgKyAnLFxcbiAgZW5kOiAnICsgdGhpcy5lbmQudG9JU08oKSArICcsXFxuICB6b25lOiAgICcgKyB0aGlzLnN0YXJ0LnpvbmUubmFtZSArICcsXFxuICBsb2NhbGU6ICAgJyArIHRoaXMuc3RhcnQubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgJy8nICsgdGhpcy5lLnRvSVNPKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQpIHtcbiAgICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmNCRzZXBhcmF0b3IgPSBfcmVmNC5zZXBhcmF0b3IsXG4gICAgICAgIHNlcGFyYXRvciA9IF9yZWY0JHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJyDigJMgJyA6IF9yZWY0JHNlcGFyYXRvcjtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiAnJyArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYSBEdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIHRpbWUgc3Bhbm5lZCBieSB0aGlzIGludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdkYXlzJykudG9PYmplY3QoKSAvLz0+IHsgZGF5czogMS4wMjQxODEyMTUyNzc3Nzc4IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LjgyMDk1IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignc2Vjb25kcycpLnRvT2JqZWN0KCkgLy89PiB7IHNlY29uZHM6IDg4NDg5LjI1NyB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9EdXJhdGlvbiA9IGZ1bmN0aW9uIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnRlcnZhbCwgW3tcbiAgICBrZXk6ICdzdGFydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGVuZCBvZiB0aGUgSW50ZXJ2YWxcclxuICAgICAqIEB0eXBlIHtEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdlbmQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBhdCBsZWFzdCBpdHMgc3RhcnQsIGkuZS4gdGhhdCB0aGUgSW50ZXJ2YWwgaXNuJ3QgJ2JhY2t3YXJkcycuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnRlcnZhbDtcbn0oKTtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5cbnZhciBJbmZvID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgSW5mby5oYXNEU1QgPSBmdW5jdGlvbiBoYXNEU1QoKSB7XG4gICAgdmFyIHpvbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFNldHRpbmdzLmRlZmF1bHRab25lO1xuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7IG1vbnRoOiAxMiB9KTtcblxuICAgIHJldHVybiAhem9uZS51bml2ZXJzYWwgJiYgcHJvdG8ub2Zmc2V0ICE9PSBwcm90by5zZXQoeyBtb250aDogNiB9KS5vZmZzZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBJbmZvLmlzVmFsaWRJQU5BWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRJQU5BWm9uZSh6b25lKSB7XG4gICAgcmV0dXJuICEhSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcih6b25lKSAmJiBJQU5BWm9uZS5pc1ZhbGlkWm9uZSh6b25lKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgbW9udGggbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcj0nZ3JlZ29yeSddIC0gdGhlIGNhbGVuZGFyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JylbMF0gLy89PiAnSmFuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycpWzBdIC8vPT4gJzEnXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfZoSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiacq7IEknXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzID0gZnVuY3Rpb24gbW9udGhzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdW5kZWZpbmVkID8gJ2dyZWdvcnknIDogX3JlZiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgbW9udGhzfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tb250aHNGb3JtYXQgPSBmdW5jdGlvbiBtb250aHNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjIkbG9jYWxlID0gX3JlZjIubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmMiRsb2NhbGUsXG4gICAgICAgIF9yZWYyJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYyLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjIkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmMiRvdXRwdXRDYWxlbmRhciA9IF9yZWYyLm91dHB1dENhbGVuZGFyLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYyJG91dHB1dENhbGVuZGFyID09PSB1bmRlZmluZWQgPyAnZ3JlZ29yeScgOiBfcmVmMiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIHdlZWsgbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygpWzBdIC8vPT4gJ01vbmRheSdcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSlbMF0gLy89PiAnbHVuLidcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfYp9mE2KfYq9mG2YrZhidcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmMyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXG4gICAqIEZvcm1hdCB3ZWVrZGF5cyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIHdlZWtkYXlzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byBtb3JlIGRhdGUgaW5mb3JtYXRpb24uIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XG4gICAqIGNoYW5nZXMgdGhlIHN0cmluZy5cbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQkbG9jYWxlID0gX3JlZjQubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNCRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNCRsb2NhbGUsXG4gICAgICAgIF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjQkbnVtYmVyaW5nU3lzdGVtO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBtZXJpZGllbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcygpIC8vPT4gWyAnQU0nLCAnUE0nIF1cbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdkZScgfSkgLy89PiBbICd2b3JtLicsICduYWNobS4nIF1cbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgX3JlZjUkbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNSRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNSRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZXJhcywgc3VjaCBhcyBbJ0JDJywgJ0FEJ10uIFRoZSBsb2NhbGUgY2FuIGJlIHNwZWNpZmllZCwgYnV0IHRoZSBjYWxlbmRhciBzeXN0ZW0gaXMgYWx3YXlzIEdyZWdvcmlhbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J3Nob3J0J10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBlcmEgcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJzaG9ydFwiIG9yIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCkgLy89PiBbICdCQycsICdBRCcgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJywgeyBsb2NhbGU6ICdmcicgfSkgLy89PiBbICdhdmFudCBKw6lzdXMtQ2hyaXN0JywgJ2FwcsOocyBKw6lzdXMtQ2hyaXN0JyBdXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3Nob3J0JztcblxuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWY2JGxvY2FsZSA9IF9yZWY2LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjYkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjYkbG9jYWxlO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudWxsLCAnZ3JlZ29yeScpLmVyYXMobGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xuICAgKiAqIGBpbnRsVG9rZW5zYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemVkIHRva2VuLWJhc2VkIGZvcm1hdHRpbmcvcGFyc2luZ1xuICAgKiAqIGBpbnRsYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGdlbmVyYWwgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgSW5mby5mZWF0dXJlcyA9IGZ1bmN0aW9uIGZlYXR1cmVzKCkge1xuICAgIHZhciBpbnRsID0gZmFsc2UsXG4gICAgICAgIGludGxUb2tlbnMgPSBmYWxzZSxcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcblxuICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgIGludGwgPSB0cnVlO1xuICAgICAgaW50bFRva2VucyA9IGhhc0Zvcm1hdFRvUGFydHMoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgem9uZXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4nLCB7IHRpbWVab25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgPT09ICdBbWVyaWNhL05ld19Zb3JrJztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnRsOiBpbnRsLCBpbnRsVG9rZW5zOiBpbnRsVG9rZW5zLCB6b25lczogem9uZXMgfTtcbiAgfTtcblxuICByZXR1cm4gSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICB2YXIgdXRjRGF5U3RhcnQgPSBmdW5jdGlvbiB1dGNEYXlTdGFydChkdCkge1xuICAgIHJldHVybiBkdC50b1VUQygwLCB7IGtlZXBMb2NhbFRpbWU6IHRydWUgfSkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICB9LFxuICAgICAgbXMgPSB1dGNEYXlTdGFydChsYXRlcikgLSB1dGNEYXlTdGFydChlYXJsaWVyKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoJ2RheXMnKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIHZhciBkaWZmZXJzID0gW1sneWVhcnMnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnllYXIgLSBhLnllYXI7XG4gIH1dLCBbJ21vbnRocycsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFsnd2Vla3MnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICByZXR1cm4gKGRheXMgLSBkYXlzICUgNykgLyA3O1xuICB9XSwgWydkYXlzJywgZGF5RGlmZl1dO1xuXG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBsb3dlc3RPcmRlciA9IHZvaWQgMCxcbiAgICAgIGhpZ2hXYXRlciA9IHZvaWQgMDtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBkaWZmZXJzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmMjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZjIgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfcmVmMjtcbiAgICB2YXIgdW5pdCA9IF9yZWZbMF07XG4gICAgdmFyIGRpZmZlciA9IF9yZWZbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIHZhciBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcblxuICAgICAgaGlnaFdhdGVyID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1cyA9IHt9LCBfY3Vyc29yJHBsdXNbdW5pdF0gPSBkZWx0YSwgX2N1cnNvciRwbHVzKSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICB2YXIgX2hpZ2hXYXRlciRtaW51cztcblxuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXIubWludXMoKF9oaWdoV2F0ZXIkbWludXMgPSB7fSwgX2hpZ2hXYXRlciRtaW51c1t1bml0XSA9IDEsIF9oaWdoV2F0ZXIkbWludXMpKTtcbiAgICAgICAgZGVsdGEgLT0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICB2YXIgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSAnbWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgpIHtcbiAgdmFyIHBvc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgcmV0dXJuIHsgcmVnZXg6IHJlZ2V4LCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZikge1xuICAgICAgdmFyIHMgPSBfcmVmWzBdO1xuICAgICAgcmV0dXJuIHBvc3QocGFyc2VJbnQocykpO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sICdcXFxcLj8nKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXC4vLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbignfCcpKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMikge1xuICAgICAgICB2YXIgcyA9IF9yZWYyWzBdO1xuICAgICAgICByZXR1cm4gc3RyaW5ncy5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpO1xuICAgICAgICB9KSArIHN0YXJ0SW5kZXg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sIGdyb3VwczogZ3JvdXBzIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7IHJlZ2V4OiBSZWdFeHAodC52YWwpLCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjUpIHtcbiAgICAgICAgdmFyIHMgPSBfcmVmNVswXTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9LCBsaXRlcmFsOiB0cnVlIH07XG4gIH0sXG4gICAgICB1bml0YXRlID0gZnVuY3Rpb24gdW5pdGF0ZSh0KSB7XG4gICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAvLyBlcmFcbiAgICAgIGNhc2UgJ0cnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoJ3Nob3J0JywgZmFsc2UpLCAwKTtcbiAgICAgIGNhc2UgJ0dHJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKCdsb25nJywgZmFsc2UpLCAwKTtcbiAgICAgIC8vIHllYXJzXG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG4gICAgICBjYXNlICd5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgY2FzZSAneXl5eXknOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcbiAgICAgIGNhc2UgJ3l5eXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KC9cXGR7Nn0vKTtcbiAgICAgIC8vIG1vbnRoc1xuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdzaG9ydCcsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnTU1NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdsb25nJywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdMJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnTExMJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoJ3Nob3J0JywgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocygnbG9uZycsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBkYXRlc1xuICAgICAgY2FzZSAnZCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIG9yZGluYWxzXG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICBjYXNlICdvb28nOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG4gICAgICBjYXNlICdISCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnaGgnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnc3MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnUyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1xcZHsxLDl9Lyk7XG4gICAgICAvLyBtZXJpZGllbVxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG4gICAgICBjYXNlICdra2trJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICBjYXNlICdrayc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgIGNhc2UgJ1cnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdXVyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyB3ZWVrZGF5c1xuICAgICAgY2FzZSAnRSc6XG4gICAgICBjYXNlICdjJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ3Nob3J0JywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnbG9uZycsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnc2hvcnQnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ2xvbmcnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgLy8gb2Zmc2V0L3pvbmVcbiAgICAgIGNhc2UgJ1onOlxuICAgICAgY2FzZSAnWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/LywgMik7XG4gICAgICBjYXNlICdaWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KShcXGR7Mn0pPy8sIDIpO1xuICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBaWlpaIChQU1QpIG9yIFpaWlpaIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpIGluIHBhcnNpbmdcbiAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuICAgICAgY2FzZSAneic6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1tBLVphLXpfXXsxLDI1Nn1cXC9bQS1aYS16X117MSwyNTZ9Lyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFBcbiAgfTtcblxuICB1bml0LnRva2VuID0gdG9rZW47XG5cbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgJygnICsgci5zb3VyY2UgKyAnKSc7XG4gIH0sICcnKTtcbiAgcmV0dXJuIFsnXicgKyByZSArICckJywgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIHZhciBtYXRjaGVzID0gaW5wdXQubWF0Y2gocmVnZXgpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgdmFyIGFsbCA9IHt9O1xuICAgIHZhciBtYXRjaEluZGV4ID0gMTtcbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoSW5kZXggKz0gZ3JvdXBzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ1MnOlxuICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICBjYXNlICdtJzpcbiAgICAgICAgcmV0dXJuICdtaW51dGUnO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuICdob3VyJztcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gJ2RheSc7XG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuICdvcmRpbmFsJztcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiAnbW9udGgnO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ2MnOlxuICAgICAgICByZXR1cm4gJ3dlZWtkYXknO1xuICAgICAgY2FzZSAnVyc6XG4gICAgICAgIHJldHVybiAnd2Vla051bWJlcic7XG4gICAgICBjYXNlICdrJzpcbiAgICAgICAgcmV0dXJuICd3ZWVrWWVhcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmUgPSB2b2lkIDA7XG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gbmV3IElBTkFab25lKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyhtYXRjaGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGspIHtcbiAgICB2YXIgZiA9IHRvRmllbGQoayk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQ6IGlucHV0LCB0b2tlbnM6IHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBfYnVpbGRSZWdleCA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgICByZWdleFN0cmluZyA9IF9idWlsZFJlZ2V4WzBdLFxuICAgICAgICBoYW5kbGVycyA9IF9idWlsZFJlZ2V4WzFdLFxuICAgICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgJ2knKSxcbiAgICAgICAgX21hdGNoID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICAgIHJhd01hdGNoZXMgPSBfbWF0Y2hbMF0sXG4gICAgICAgIG1hdGNoZXMgPSBfbWF0Y2hbMV0sXG4gICAgICAgIF9yZWY2ID0gbWF0Y2hlcyA/IGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykgOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgIHJlc3VsdCA9IF9yZWY2WzBdLFxuICAgICAgICB6b25lID0gX3JlZjZbMV07XG5cbiAgICByZXR1cm4geyBpbnB1dDogaW5wdXQsIHRva2VuczogdG9rZW5zLCByZWdleDogcmVnZXgsIHJhd01hdGNoZXM6IHJhd01hdGNoZXMsIG1hdGNoZXM6IG1hdGNoZXMsIHJlc3VsdDogcmVzdWx0LCB6b25lOiB6b25lIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgX2V4cGxhaW5Gcm9tVG9rZW5zID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSxcbiAgICAgIHJlc3VsdCA9IF9leHBsYWluRnJvbVRva2Vucy5yZXN1bHQsXG4gICAgICB6b25lID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnpvbmUsXG4gICAgICBpbnZhbGlkUmVhc29uID0gX2V4cGxhaW5Gcm9tVG9rZW5zLmludmFsaWRSZWFzb247XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuXG52YXIgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHZhciBqcyA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBqcyA9PT0gMCA/IDcgOiBqcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSkge1xuICByZXR1cm4gZGF5ICsgKGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcilbbW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSB7XG4gIHZhciB0YWJsZSA9IGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcixcbiAgICAgIG1vbnRoMCA9IHRhYmxlLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpIDwgb3JkaW5hbDtcbiAgfSksXG4gICAgICBkYXkgPSBvcmRpbmFsIC0gdGFibGVbbW9udGgwXTtcbiAgcmV0dXJuIHsgbW9udGg6IG1vbnRoMCArIDEsIGRheTogZGF5IH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICB2YXIgeWVhciA9IGdyZWdPYmoueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ09iai5tb250aCxcbiAgICAgIGRheSA9IGdyZWdPYmouZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgd2Vla2RheSA9IGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KTtcblxuXG4gIHZhciB3ZWVrTnVtYmVyID0gTWF0aC5mbG9vcigob3JkaW5hbCAtIHdlZWtkYXkgKyAxMCkgLyA3KSxcbiAgICAgIHdlZWtZZWFyID0gdm9pZCAwO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB3ZWVrWWVhcjogd2Vla1llYXIsIHdlZWtOdW1iZXI6IHdlZWtOdW1iZXIsIHdlZWtkYXk6IHdlZWtkYXkgfSwgdGltZU9iamVjdChncmVnT2JqKSk7XG59XG5cbmZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICB2YXIgd2Vla1llYXIgPSB3ZWVrRGF0YS53ZWVrWWVhcixcbiAgICAgIHdlZWtOdW1iZXIgPSB3ZWVrRGF0YS53ZWVrTnVtYmVyLFxuICAgICAgd2Vla2RheSA9IHdlZWtEYXRhLndlZWtkYXksXG4gICAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICAgIHllYXJJbkRheXMgPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcblxuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhciA9IHZvaWQgMDtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIHZhciBfdW5jb21wdXRlT3JkaW5hbCA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCksXG4gICAgICBtb250aCA9IF91bmNvbXB1dGVPcmRpbmFsLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwuZGF5O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoLCBkYXk6IGRheSB9LCB0aW1lT2JqZWN0KHdlZWtEYXRhKSk7XG59XG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICB2YXIgeWVhciA9IGdyZWdEYXRhLnllYXIsXG4gICAgICBtb250aCA9IGdyZWdEYXRhLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ0RhdGEuZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB5ZWFyOiB5ZWFyLCBvcmRpbmFsOiBvcmRpbmFsIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cblxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCwgZGF5OiBkYXkgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkV2Vla0RhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoud2Vla1llYXIpLFxuICAgICAgdmFsaWRXZWVrID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgICAgdmFsaWRXZWVrZGF5ID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla2RheSwgMSwgNyk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gJ3dlZWtZZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiAnd2VlayBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gJ3dlZWtkYXkgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuICd5ZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiAnb3JkaW5hbCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai55ZWFyKSxcbiAgICAgIHZhbGlkTW9udGggPSBudW1iZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgICAgdmFsaWREYXkgPSBudW1iZXJCZXR3ZWVuKG9iai5kYXksIDEsIGRheXNJbk1vbnRoKG9iai55ZWFyLCBvYmoubW9udGgpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiAneWVhciBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1vbnRoKSB7XG4gICAgcmV0dXJuICdtb250aCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiAnZGF5IG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkSG91ciA9IG51bWJlckJldHdlZW4ob2JqLmhvdXIsIDAsIDIzKSxcbiAgICAgIHZhbGlkTWludXRlID0gbnVtYmVyQmV0d2VlbihvYmoubWludXRlLCAwLCA1OSksXG4gICAgICB2YWxpZFNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLnNlY29uZCwgMCwgNTkpLFxuICAgICAgdmFsaWRNaWxsaXNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLm1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuICdob3VyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWludXRlKSB7XG4gICAgcmV0dXJuICdtaW51dGUgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gJ3NlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuICdtaWxsaXNlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gJ0ludmFsaWQgRGF0ZVRpbWUnLFxuICAgIElOVkFMSURfSU5QVVQgPSAnaW52YWxpZCBpbnB1dCcsXG4gICAgVU5TVVBQT1JURURfWk9ORSA9ICd1bnN1cHBvcnRlZCB6b25lJyxcbiAgICBVTlBBUlNBQkxFJDEgPSAndW5wYXJzYWJsZSc7XG5cbi8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn1cblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZFJlYXNvbjogaW5zdC5pbnZhbGlkUmVhc29uXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywgeyBvbGQ6IGN1cnJlbnQgfSkpO1xufVxuXG4vLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwO1xuXG4gIC8vIFRlc3Qgd2hldGhlciB0aGUgem9uZSBtYXRjaGVzIHRoZSBvZmZzZXQgZm9yIHRoaXMgdHNcbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcblxuICAvLyBJZiBzbywgb2Zmc2V0IGRpZG4ndCBjaGFuZ2UgYW5kIHdlJ3JlIGRvbmVcbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH1cblxuICAvLyBJZiBub3QsIGNoYW5nZSB0aGUgdHMgYnkgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIG9mZnNldFxuICB1dGNHdWVzcyAtPSAobzIgLSBvKSAqIDYwICogMTAwMDtcblxuICAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcbiAgdmFyIG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIHZhciBkID0gbmV3IERhdGUodHMpO1xuXG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufVxuXG4vLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuZnVuY3Rpb24gb2JqVG9Mb2NhbFRTKG9iaikge1xuICB2YXIgZCA9IERhdGUuVVRDKG9iai55ZWFyLCBvYmoubW9udGggLSAxLCBvYmouZGF5LCBvYmouaG91ciwgb2JqLm1pbnV0ZSwgb2JqLnNlY29uZCwgb2JqLm1pbGxpc2Vjb25kKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIob2JqLnllYXIpO1xuICB9XG4gIHJldHVybiArZDtcbn1cblxuLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuZnVuY3Rpb24gb2JqVG9UUyhvYmosIG9mZnNldCwgem9uZSkge1xuICByZXR1cm4gZml4T2Zmc2V0KG9ialRvTG9jYWxUUyhvYmopLCBvZmZzZXQsIHpvbmUpO1xufVxuXG4vLyBjcmVhdGUgYSBuZXcgRFQgaW5zdGFuY2UgYnkgYWRkaW5nIGEgZHVyYXRpb24sIGFkanVzdGluZyBmb3IgRFNUc1xuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgdmFyIG9QcmUgPSBpbnN0Lm8sXG4gICAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBkdXIueWVhcnMsXG4gICAgICBtb250aCA9IGluc3QuYy5tb250aCArIGR1ci5tb250aHMgKyBkdXIucXVhcnRlcnMgKiAzLFxuICAgICAgYyA9IE9iamVjdC5hc3NpZ24oe30sIGluc3QuYywge1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogTWF0aC5taW4oaW5zdC5jLmRheSwgZGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArIGR1ci5kYXlzICsgZHVyLndlZWtzICogN1xuICB9KSxcbiAgICAgIG1pbGxpc1RvQWRkID0gRHVyYXRpb24uZnJvbU9iamVjdCh7XG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgbG9jYWxUUyA9IG9ialRvTG9jYWxUUyhjKTtcblxuICB2YXIgX2ZpeE9mZnNldCA9IGZpeE9mZnNldChsb2NhbFRTLCBvUHJlLCBpbnN0LnpvbmUpLFxuICAgICAgdHMgPSBfZml4T2Zmc2V0WzBdLFxuICAgICAgbyA9IF9maXhPZmZzZXRbMV07XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzOiB0cywgbzogbyB9O1xufVxuXG4vLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzKSB7XG4gIHZhciBzZXRab25lID0gb3B0cy5zZXRab25lLFxuICAgICAgem9uZSA9IG9wdHMuem9uZTtcblxuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMsIHtcbiAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoVU5QQVJTQUJMRSQxKTtcbiAgfVxufVxuXG4vLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuZnVuY3Rpb24gdG9UZWNoRm9ybWF0KGR0LCBmb3JtYXQpIHtcbiAgcmV0dXJuIGR0LmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoJ2VuLVVTJyksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn1cblxuLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcbmZ1bmN0aW9uIHRvVGVjaFRpbWVGb3JtYXQoZHQsIF9yZWYpIHtcbiAgdmFyIF9yZWYkc3VwcHJlc3NTZWNvbmRzID0gX3JlZi5zdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc1NlY29uZHMgPSBfcmVmJHN1cHByZXNzU2Vjb25kcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9IF9yZWYuc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzTWlsbGlzZWMsXG4gICAgICBfcmVmJGluY2x1ZGVPZmZzZXQgPSBfcmVmLmluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRpbmNsdWRlT2Zmc2V0LFxuICAgICAgX3JlZiRpbmNsdWRlWm9uZSA9IF9yZWYuaW5jbHVkZVpvbmUsXG4gICAgICBpbmNsdWRlWm9uZSA9IF9yZWYkaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiRpbmNsdWRlWm9uZSxcbiAgICAgIF9yZWYkc3BhY2Vab25lID0gX3JlZi5zcGFjZVpvbmUsXG4gICAgICBzcGFjZVpvbmUgPSBfcmVmJHNwYWNlWm9uZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHNwYWNlWm9uZTtcblxuICB2YXIgZm10ID0gJ0hIOm1tJztcblxuICBpZiAoIXN1cHByZXNzU2Vjb25kcyB8fCBkdC5zZWNvbmQgIT09IDAgfHwgZHQubWlsbGlzZWNvbmQgIT09IDApIHtcbiAgICBmbXQgKz0gJzpzcyc7XG4gICAgaWYgKCFzdXBwcmVzc01pbGxpc2Vjb25kcyB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgICAgZm10ICs9ICcuU1NTJztcbiAgICB9XG4gIH1cblxuICBpZiAoKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpICYmIHNwYWNlWm9uZSkge1xuICAgIGZtdCArPSAnICc7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gJ3onO1xuICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICBmbXQgKz0gJ1paJztcbiAgfVxuXG4gIHJldHVybiB0b1RlY2hGb3JtYXQoZHQsIGZtdCk7XG59XG5cbi8vIGRlZmF1bHRzIGZvciB1bnNwZWNpZmllZCB1bml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFyc1xudmFyIGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdFdlZWtVbml0VmFsdWVzID0ge1xuICB3ZWVrTnVtYmVyOiAxLFxuICB3ZWVrZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICBvcmRpbmFsOiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn07XG5cbi8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xudmFyIG9yZGVyZWRVbml0cyQxID0gWyd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gWyd3ZWVrWWVhcicsICd3ZWVrTnVtYmVyJywgJ3dlZWtkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ10sXG4gICAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFsneWVhcicsICdvcmRpbmFsJywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICB2YXIgaWdub3JlVW5rbm93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgeWVhcjogJ3llYXInLFxuICAgIHllYXJzOiAneWVhcicsXG4gICAgbW9udGg6ICdtb250aCcsXG4gICAgbW9udGhzOiAnbW9udGgnLFxuICAgIGRheTogJ2RheScsXG4gICAgZGF5czogJ2RheScsXG4gICAgaG91cjogJ2hvdXInLFxuICAgIGhvdXJzOiAnaG91cicsXG4gICAgbWludXRlOiAnbWludXRlJyxcbiAgICBtaW51dGVzOiAnbWludXRlJyxcbiAgICBzZWNvbmQ6ICdzZWNvbmQnLFxuICAgIHNlY29uZHM6ICdzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kJyxcbiAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgd2Vla2RheXM6ICd3ZWVrZGF5JyxcbiAgICB3ZWVrbnVtYmVyOiAnd2Vla051bWJlcicsXG4gICAgd2Vla3NudW1iZXI6ICd3ZWVrTnVtYmVyJyxcbiAgICB3ZWVrbnVtYmVyczogJ3dlZWtOdW1iZXInLFxuICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgIHdlZWt5ZWFyczogJ3dlZWtZZWFyJyxcbiAgICBvcmRpbmFsOiAnb3JkaW5hbCdcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG5cbiAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMkMSwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjI7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmMiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB1ID0gX3JlZjI7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWRSZWFzb24gPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWRSZWFzb24pO1xuICB9XG5cbiAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICBvZmZzZXRQcm92aXMgPSB6b25lLm9mZnNldCh0c05vdyksXG4gICAgICBfb2JqVG9UUyA9IG9ialRvVFMob2JqLCBvZmZzZXRQcm92aXMsIHpvbmUpLFxuICAgICAgdHMgPSBfb2JqVG9UU1swXSxcbiAgICAgIG8gPSBfb2JqVG9UU1sxXTtcblxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG5cbi8qKlxyXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEEgRGF0ZVRpbWUgY29tcHJpc2VzIG9mOlxyXG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxyXG4gKiAqIEEgdGltZSB6b25lLiBFYWNoIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB6b25lIChieSBkZWZhdWx0IHRoZSBsb2NhbCBzeXN0ZW0ncyB6b25lKS5cclxuICogKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBlZmZlY3QgaG93IG91dHB1dCBzdHJpbmdzIGFyZSBmb3JtYXR0ZWQsIHN1Y2ggYXMgYGxvY2FsZWAsIGBudW1iZXJpbmdTeXN0ZW1gLCBhbmQgYG91dHB1dENhbGVuZGFyYC5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlczpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIGxvY2FsfSwge0BsaW5rIHV0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIGZyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21JU099LCB7QGxpbmsgZnJvbUhUVFB9LCBhbmQge0BsaW5rIGZyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIGZyb21KU0RhdGV9LlxyXG4gKiAqICoqR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCB0aW1lKio6IFRvIGV4YW1pbmUgdGhlIEdyZWdvcmlhbiBwcm9wZXJ0aWVzIG9mIGEgRGF0ZVRpbWUgaW5kaXZpZHVhbGx5IChpLmUgYXMgb3Bwb3NlZCB0byBjb2xsZWN0aXZlbHkgdGhyb3VnaCB7QGxpbmsgdG9PYmplY3R9KSwgdXNlIHRoZSB7QGxpbmsgeWVhcn0sIHtAbGluayBtb250aH0sXHJcbiAqIHtAbGluayBkYXl9LCB7QGxpbmsgaG91cn0sIHtAbGluayBtaW51dGV9LCB7QGxpbmsgc2Vjb25kfSwge0BsaW5rIG1pbGxpc2Vjb25kfSBhY2Nlc3NvcnMuXHJcbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayB3ZWVrWWVhcn0sIHtAbGluayB3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayB3ZWVrZGF5fSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlIHRoZSB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKjogVG8gdHJhbnNmb3JtIHRoZSBEYXRlVGltZSBpbnRvIG90aGVyIERhdGVUaW1lcywgdXNlIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2V0Wm9uZX0sIHtAbGluayBzZXRMb2NhbGV9LCB7QGxpbmsgcGx1c30sIHtAbGluayBtaW51c30sIHtAbGluayBlbmRPZn0sIHtAbGluayBzdGFydE9mfSwge0BsaW5rIHRvVVRDfSwgYW5kIHtAbGluayB0b0xvY2FsfS5cclxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIHRvSlNPTn0sIHtAbGluayB0b0lTT30sIHtAbGluayB0b0hUVFB9LCB7QGxpbmsgdG9PYmplY3R9LCB7QGxpbmsgdG9SRkMyODIyfSwge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSwge0BsaW5rIHRvRm9ybWF0fSwge0BsaW5rIHRvTWlsbGlzfSBhbmQge0BsaW5rIHRvSlNEYXRlfS5cclxuICpcclxuICogVGhlcmUncyBwbGVudHkgb3RoZXJzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uLCB0aW1lIHpvbmVzLCBhbHRlcm5hdGl2ZSBjYWxlbmRhcnMsIHZhbGlkaXR5LCBhbmQgc28gb24sIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEYXRlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIERhdGVUaW1lKGNvbmZpZykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERhdGVUaW1lKTtcblxuICAgIHZhciB6b25lID0gY29uZmlnLnpvbmUgfHwgU2V0dGluZ3MuZGVmYXVsdFpvbmUsXG4gICAgICAgIGludmFsaWRSZWFzb24gPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBJTlZBTElEX0lOUFVUIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyBVTlNVUFBPUlRFRF9aT05FIDogbnVsbCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMudHMgPSBpc1VuZGVmaW5lZChjb25maWcudHMpID8gU2V0dGluZ3Mubm93KCkgOiBjb25maWcudHM7XG5cbiAgICB2YXIgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuICAgIGlmICghaW52YWxpZFJlYXNvbikge1xuICAgICAgdmFyIHVuY2hhbmdlZCA9IGNvbmZpZy5vbGQgJiYgY29uZmlnLm9sZC50cyA9PT0gdGhpcy50cyAmJiBjb25maWcub2xkLnpvbmUuZXF1YWxzKHpvbmUpO1xuICAgICAgYyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQuYyA6IHRzVG9PYmoodGhpcy50cywgem9uZS5vZmZzZXQodGhpcy50cykpO1xuICAgICAgbyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQubyA6IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBpbnZhbGlkUmVhc29uO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5vID0gbztcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0czogU2V0dGluZ3Mubm93KCkgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVpcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnV0YyA9IGZ1bmN0aW9uIHV0Yyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KCksXG4gICAgICAgIHpvbmU6IEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IGlzRGF0ZShkYXRlKSA/IGRhdGUudmFsdWVPZigpIDogTmFOLFxuICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucylcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgLSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCBVVENcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhtaWxsaXNlY29uZHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5IC0gYSBkYXkgb2YgdGhlIG1vbnRoLCAxLTMxLCBkZXBlbmRpbmcgb24gdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla051bWJlciAtIGFuIElTTyB3ZWVrIG51bWJlciwgYmV0d2VlbiAxIGFuZCA1MiBvciA1MywgZGVwZW5kaW5nIG9uIHRoZSB5ZWFyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGUgLSBtaW51dGUgb2YgdGhlIGhvdXIsIDAtNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29iai56b25lPSdsb2NhbCddIC0gaW50ZXJwcmV0IHRoZSBudW1iZXJzIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciB6b25lLiBDYW4gdGFrZSBhbnkgdmFsdWUgdGFrZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldFpvbmUoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiB9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTAxLTAxVDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0pIC8vfj4gdG9kYXkgYXQgMTA6MjY6MDZcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ3V0YycgfSksXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdsb2NhbCcgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ0FtZXJpY2EvTmV3X1lvcmsnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICB2YXIgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvYmouem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH1cblxuICAgIHZhciB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgICBvZmZzZXRQcm92aXMgPSB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yTUQgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5tb250aCkgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSxcbiAgICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9iaik7XG5cbiAgICAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgdmFyIHVuaXRzID0gdm9pZCAwLFxuICAgICAgICBkZWZhdWx0VmFsdWVzID0gdm9pZCAwLFxuICAgICAgICBvYmpOb3cgPSB0c1RvT2JqKHRzTm93LCBvZmZzZXRQcm92aXMpO1xuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gdW5pdHMsIF9pc0FycmF5MiA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMiksIF9pMiA9IDAsIF9pdGVyYXRvcjIgPSBfaXNBcnJheTIgPyBfaXRlcmF0b3IyIDogX2l0ZXJhdG9yMltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkyKSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yMi5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcjJbX2kyKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kyID0gX2l0ZXJhdG9yMi5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYzID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYzO1xuXG4gICAgICB2YXIgdiA9IG5vcm1hbGl6ZWRbdV07XG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyB3ZSBoYXZlIGFyZSBpbiByYW5nZVxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkUmVhc29uID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkUmVhc29uKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pO1xuXG4gICAgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnbWlzbWF0Y2hlZCB3ZWVrZGF5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi1XMDUtNCcpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUlTT0RhdGUgPSBwYXJzZUlTT0RhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VJU09EYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSVNPRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJ1R1ZSwgMjUgTm92IDIwMTYgMTM6MjM6MTIgKzA2MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21SRkMyODIyID0gZnVuY3Rpb24gZnJvbVJGQzI4MjIodGV4dCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUhUVFBEYXRlID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUhUVFBEYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSFRUUERhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSB8fCBpc1VuZGVmaW5lZChmbXQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Zyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbnVtYmVyaW5nU3lzLFxuICAgICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSwgZGVmYXVsdFRvRU46IHRydWUgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZFJlYXNvbiA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZFJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyh0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBTUUwgZGF0ZSwgdGltZSwgb3IgZGF0ZXRpbWVcclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIrMDY6MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicsIHsgem9uZTogJ0FtZXJpY2EvTG9zX0FuZ2VsZXMnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TUUwgPSBmdW5jdGlvbiBmcm9tU1FMKHRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgX3BhcnNlU1FMID0gcGFyc2VTUUwodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VTUUxbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VTUUxbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBJTkZPXG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ21vbnRoJyk7IC8vPT4gN1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQkJDEodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgYnkgYW4gb3BlcmF0aW9uIG9uIGFub3RoZXIgaW52YWxpZCBkYXRlXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSB0aGUgc2FtZSBvcHRpb25zIGFzIHRvTG9jYWxlU3RyaW5nXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuICBEYXRlVGltZS5wcm90b3R5cGUucmVzb2x2ZWRMb2NhbGVPcHRzID0gZnVuY3Rpb24gcmVzb2x2ZWRMb2NhbGVPcHRzKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHZhciBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMgPSBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5yZXNvbHZlZE9wdGlvbnModGhpcyksXG4gICAgICAgIGxvY2FsZSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLmNhbGVuZGFyO1xuXG4gICAgcmV0dXJuIHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcjogY2FsZW5kYXIgfTtcbiAgfTtcblxuICAvLyBUUkFOU0ZPUk1cblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gVVRDLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBzZXRab25lfSgndXRjJylcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIG9wdGlvbmFsbHksIGFuIG9mZnNldCBmcm9tIFVUQyBpbiBtaW51dGVzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvVVRDID0gZnVuY3Rpb24gdG9VVEMoKSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5zZXRab25lKEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShvZmZzZXQpLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gdGhlIGhvc3QncyBsb2NhbCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUobmV3IExvY2FsWm9uZSgpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lKSB7XG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQka2VlcExvY2FsVGltZSA9IF9yZWY0LmtlZXBMb2NhbFRpbWUsXG4gICAgICAgIGtlZXBMb2NhbFRpbWUgPSBfcmVmNCRrZWVwTG9jYWxUaW1lID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY0JGtlZXBMb2NhbFRpbWUsXG4gICAgICAgIF9yZWY0JGtlZXBDYWxlbmRhclRpbSA9IF9yZWY0LmtlZXBDYWxlbmRhclRpbWUsXG4gICAgICAgIGtlZXBDYWxlbmRhclRpbWUgPSBfcmVmNCRrZWVwQ2FsZW5kYXJUaW0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjQka2VlcENhbGVuZGFyVGltO1xuXG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lOiB6b25lIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNS5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjUub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGU6IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBvdXRwdXRDYWxlbmRhciB9KTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IGxvYzogbG9jIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5zZXRMb2NhbGUoJ2VuLUdCJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRMb2NhbGUgPSBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KHZhbHVlcywgbm9ybWFsaXplVW5pdCksXG4gICAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSk7XG5cbiAgICB2YXIgbWl4ZWQgPSB2b2lkIDA7XG4gICAgaWYgKHNldHRpbmdXZWVrU3R1ZmYpIHtcbiAgICAgIG1peGVkID0gd2Vla1RvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9XZWVrKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0gT2JqZWN0LmFzc2lnbih0aGlzLnRvT2JqZWN0KCksIG5vcm1hbGl6ZWQpO1xuXG4gICAgICAvLyBpZiB3ZSBkaWRuJ3Qgc2V0IHRoZSBkYXkgYnV0IHdlIGVuZGVkIHVwIG9uIGFuIG92ZXJmbG93IGRhdGUsXG4gICAgICAvLyB1c2UgdGhlIGxhc3QgZGF5IG9mIHRoZSByaWdodCBtb250aFxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IHRzOiB0cywgbzogbyB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBBZGQgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqXHJcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAxIH0pIC8vfj4gdGhpcyB0aW1lIHRvbW9ycm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMywgbWludXRlczogMTMgfSkpIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdW5pdCBvZiB0aW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ21vbnRoJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDEnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdkYXknKS50b0lTT1RpbWUoKTsgLy89PiAnMDA6MDAuMDAwLTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdob3VyJykudG9JU09UaW1lKCk7IC8vPT4gJzA1OjAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zdGFydE9mID0gZnVuY3Rpb24gc3RhcnRPZih1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBvID0ge30sXG4gICAgICAgIG5vcm1hbGl6ZWRVbml0ID0gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAncXVhcnRlcnMnOlxuICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgby5kYXkgPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09ICd3ZWVrcycpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSAncXVhcnRlcnMnKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAoaS5lLiB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBlbmQgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZigneWVhcicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMTItMzFUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLmVuZE9mKCdob3VyJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QwNTo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZW5kT2YgPSBmdW5jdGlvbiBlbmRPZih1bml0KSB7XG4gICAgdmFyIF9zdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF9zdGFydE9mJHBsdXMgPSB7fSwgX3N0YXJ0T2YkcGx1c1t1bml0XSA9IDEsIF9zdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07XG5cbiAgLy8gT1VUUFVUXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxyXG4gICAqICoqWW91IG1heSBub3Qgd2FudCB0aGlzLioqIFNlZSB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvciBhIG1vcmUgZmxleGlibGUgZm9ybWF0dGluZyB0b29sLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQgdG9rZW5zIHN1cHBvcnRlZC5cclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMucm91bmQgLSByb3VuZCBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnNldExvY2FsZSgnZnInKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IGF2ci4gMjInXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdChcIkhIICdob3VycyBhbmQnIG1tICdtaW51dGVzJ1wiKSAvLz0+ICcyMCBob3VycyBhbmQgNTUgbWludXRlcydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKCksIG9wdHMpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGRhdGUuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyB0aGUgSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBhbmQgYW55IHByZXNldHMgZGVmaW5lZCBieSBMdXhvbiwgc3VjaCBhcyBgRGF0ZVRpbWUuREFURV9GVUxMYCBvciBgRGF0ZVRpbWUuVElNRV9TSU1QTEVgLlxyXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbi5cclxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cclxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV9TSU1QTEUpOyAvLz0+ICcxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe3dlZWtkYXk6ICdsb25nJywgbW9udGg6ICdsb25nJywgZGF5OiAnMi1kaWdpdCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe2hvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnMTE6MzInXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IERBVEVfU0hPUlQ7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBmb3JtYXQgXCJwYXJ0c1wiLCBpLmUuIGluZGl2aWR1YWwgdG9rZW5zIGFsb25nIHdpdGggbWV0YWRhdGEuIFRoaXMgaXMgYWxsb3dzIGNhbGxlcnMgdG8gcG9zdC1wcm9jZXNzIGluZGl2aWR1YWwgc2VjdGlvbnMgb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdC9mb3JtYXRUb1BhcnRzXHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMsIHNhbWUgYXMgYHRvTG9jYWxlU3RyaW5nYC5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gW1xyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0xvY2FsZVBhcnRzID0gZnVuY3Rpb24gdG9Mb2NhbGVQYXJ0cygpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODIsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1J1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArICdUJyArIHRoaXMudG9JU09UaW1lKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICd5eXl5LU1NLWRkJyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgdGltZSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKCkgLy89PiAnMDc6MzQ6MTkuMzYxWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9JU09UaW1lID0gZnVuY3Rpb24gdG9JU09UaW1lKCkge1xuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9IF9yZWY2LnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmNiRzdXBwcmVzc01pbGxpc2UsXG4gICAgICAgIF9yZWY2JHN1cHByZXNzU2Vjb25kcyA9IF9yZWY2LnN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZjYkc3VwcHJlc3NTZWNvbmRzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY2JHN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldDtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHsgc3VwcHJlc3NTZWNvbmRzOiBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcywgaW5jbHVkZU9mZnNldDogaW5jbHVkZU9mZnNldCB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIFJGQyAyODIyLWNvbXBhdGlibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUsIGFsd2F5cyBpbiBVVENcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvUkZDMjgyMiA9IGZ1bmN0aW9uIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICdFRUUsIGRkIExMTCB5eXl5IGhoOm1tOnNzIFpaWicpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSBzdHJpbmcgY29uZm9ybXMgdG8gUkZDIDExMjMuXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMywgMTkpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMTk6MDA6MDAgR01UJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0hUVFAgPSBmdW5jdGlvbiB0b0hUVFAoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLnRvVVRDKCksIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJ1wiKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxEYXRlID0gZnVuY3Rpb24gdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgJ3l5eXktTU0tZGQnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnRvU1FMKCkgLy89PiAnMDU6MTU6MTYuMzQ1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVab25lOiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxUaW1lID0gZnVuY3Rpb24gdG9TUUxUaW1lKCkge1xuICAgIHZhciBfcmVmNyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY3JGluY2x1ZGVPZmZzZXQgPSBfcmVmNy5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjckaW5jbHVkZU9mZnNldCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWY3JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY3JGluY2x1ZGVab25lID0gX3JlZjcuaW5jbHVkZVpvbmUsXG4gICAgICAgIGluY2x1ZGVab25lID0gX3JlZjckaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjckaW5jbHVkZVpvbmU7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7IGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsIGluY2x1ZGVab25lOiBpbmNsdWRlWm9uZSwgc3BhY2Vab25lOiB0cnVlIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIEFtZXJpY2EvTmV3X1lvcmsnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvU1FMID0gZnVuY3Rpb24gdG9TUUwoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgJyAnICsgdGhpcy50b1NRTFRpbWUob3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnRGF0ZVRpbWUge1xcbiAgdHM6ICcgKyB0aGlzLnRvSVNPKCkgKyAnLFxcbiAgem9uZTogJyArIHRoaXMuem9uZS5uYW1lICsgJyxcXG4gIGxvY2FsZTogJyArIHRoaXMubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5vdXRwdXRDYWxlbmRhciA9IHRoaXMub3V0cHV0Q2FsZW5kYXI7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBEYXRlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSlNEYXRlID0gZnVuY3Rpb24gdG9KU0RhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU4pO1xuICB9O1xuXG4gIC8vIENPTVBBUkVcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gRGF0ZVRpbWVzIGFzIGEgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiB2YXIgaTEgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgyLTA1LTI1VDA5OjQ1JyksXHJcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xyXG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxyXG4gICAqIGkyLmRpZmYoaTEsICdob3VycycpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMjE2OC43NSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiBkaWZmKG90aGVyRGF0ZVRpbWUpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ21pbGxpc2Vjb25kcyc7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyRGF0ZVRpbWUuaXNWYWxpZCkgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uIHx8IG90aGVyRGF0ZVRpbWUuaW52YWxpZFJlYXNvbik7XG5cbiAgICB2YXIgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgICAgb3RoZXJJc0xhdGVyID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCkgPiB0aGlzLnZhbHVlT2YoKSxcbiAgICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgICBkaWZmZWQgPSBfZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3coKSB7XG4gICAgdmFyIHVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdtaWxsaXNlY29uZHMnO1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmRpZmYoRGF0ZVRpbWUubG9jYWwoKSwgdW5pdCwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnVudGlsID0gZnVuY3Rpb24gdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVuaXQgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dE1zID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmVuZE9mKHVuaXQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEYXRlVGltZXMgYXJlIGVxdWFsIGlmZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBtaWxsaXNlY29uZFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkICYmIG90aGVyLmlzVmFsaWQgJiYgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJiB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmIHRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWluKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcclxuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgRGF0ZVRpbWVzIGZyb20gd2hpY2ggdG8gY2hvb3NlIHRoZSBtYXhpbXVtXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubWF4ID0gZnVuY3Rpb24gbWF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTtcblxuICAvLyBNSVNDXG5cbiAgLyoqXHJcbiAgICogRXhwbGFpbiBob3cgYSBzdHJpbmcgd291bGQgYmUgcGFyc2VkIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGFrZW4gYnkgZnJvbUZvcm1hdCgpXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4gPSBmdW5jdGlvbiBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIF9vcHRpb25zJGxvY2FsZTIgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJGxvY2FsZTIsXG4gICAgICAgIF9vcHRpb25zJG51bWJlcmluZ1N5czIgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5czIsXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBkZWZhdWx0VG9FTjogdHJ1ZSB9KTtcblxuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxyXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xyXG4gICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvdXRwdXQgY2FsZW5kYXIgb2YgYSBEYXRlVGltZSwgc3VjaCAnaXNsYW1pYycuIFRoZSBvdXRwdXQgY2FsZW5kYXIgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvdXRwdXRDYWxlbmRhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3pvbmVOYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHllYXJcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd5ZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMueWVhciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnF1YXJ0ZXIgLy89PiAyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3F1YXJ0ZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IE1hdGguY2VpbCh0aGlzLmMubW9udGggLyAzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGgnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuZGF5IC8vPT4gMjVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGF5JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBob3VyIG9mIHRoZSBkYXkgKDAtMjMpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIpLnNlY29uZCAvLz0+IDUyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCAoMC05OTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaWxsaXNlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIHllYXJcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrWWVhciAvLz0+IDIwMTVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla1llYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWsgbnVtYmVyIG9mIHRoZSB3ZWVrIHllYXIgKDEtNTJpc2gpLlxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtOdW1iZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxyXG4gICAgICogMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvcmRpbmFsIChpLmUuIHRoZSBkYXkgb2YgdGhlIHllYXIpXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkub3JkaW5hbCAvLz0+IDE0NVxyXG4gICAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvcmRpbmFsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCBtb250aCBuYW1lLCBzdWNoIGFzICdPY3QnLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0b2JlcicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aExvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKCdsb25nJywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IHdlZWtkYXksIHN1Y2ggYXMgJ01vbicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtkYXlTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIHdlZWtkYXksIHN1Y2ggYXMgJ01vbmRheScuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoJ2xvbmcnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IG9mIHRoaXMgRGF0ZVRpbWUgaW4gbWludXRlc1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5vZmZzZXQgLy89PiAtMjQwXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5vZmZzZXQgLy89PiAwXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldE5hbWVTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiAnc2hvcnQnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2Zmc2V0TmFtZUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogJ2xvbmcnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaXNPZmZzZXRGaXhlZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLnVuaXZlcnNhbCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luRFNUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmICh0aGlzLmlzT2Zmc2V0Rml4ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogMSB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiA1IH0pLm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luTGVhcFllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkYXlzSW5Nb250aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXNJblllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGRheXNJblllYXIodGhpcy55ZWFyKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3NJbldlZWtZZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdEQVRFX1NIT1JUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX01FRCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9NRUQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX0ZVTEwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVfSFVHRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9IVUdFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9TSU1QTEUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfU0lNUExFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfV0lUSF9TSE9SVF9PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX0xPTkdfT0ZGU0VUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1NJTVBMRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9TSU1QTEU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfU0hPUlQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRUQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfRlVMTCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERhdGVUaW1lO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBEYXRlVGltZSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiZnVuY3Rpb24gQWdlbnQoKSB7XG4gIHRoaXMuX2RlZmF1bHRzID0gW107XG59XG5cbltcInVzZVwiLCBcIm9uXCIsIFwib25jZVwiLCBcInNldFwiLCBcInF1ZXJ5XCIsIFwidHlwZVwiLCBcImFjY2VwdFwiLCBcImF1dGhcIiwgXCJ3aXRoQ3JlZGVudGlhbHNcIiwgXCJzb3J0UXVlcnlcIiwgXCJyZXRyeVwiLCBcIm9rXCIsIFwicmVkaXJlY3RzXCIsXG4gXCJ0aW1lb3V0XCIsIFwiYnVmZmVyXCIsIFwic2VyaWFsaXplXCIsIFwicGFyc2VcIiwgXCJjYVwiLCBcImtleVwiLCBcInBmeFwiLCBcImNlcnRcIl0uZm9yRWFjaChmdW5jdGlvbihmbikge1xuICAvKiogRGVmYXVsdCBzZXR0aW5nIGZvciBhbGwgcmVxdWVzdHMgZnJvbSB0aGlzIGFnZW50ICovXG4gIEFnZW50LnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbigvKnZhcmFyZ3MqLykge1xuICAgIHRoaXMuX2RlZmF1bHRzLnB1c2goe2ZuOmZuLCBhcmd1bWVudHM6YXJndW1lbnRzfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn0pO1xuXG5BZ2VudC5wcm90b3R5cGUuX3NldERlZmF1bHRzID0gZnVuY3Rpb24ocmVxKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcbiAgICAgIHJlcVtkZWYuZm5dLmFwcGx5KHJlcSwgZGVmLmFyZ3VtZW50cyk7XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZW50O1xuIiwiLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG52YXIgcm9vdDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgeyAvLyBCcm93c2VyIHdpbmRvd1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gV2ViIFdvcmtlclxuICByb290ID0gc2VsZjtcbn0gZWxzZSB7IC8vIE90aGVyIGVudmlyb25tZW50c1xuICBjb25zb2xlLndhcm4oXCJVc2luZyBicm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGluIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuICByb290ID0gdGhpcztcbn1cblxudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi9yZXF1ZXN0LWJhc2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG52YXIgUmVzcG9uc2VCYXNlID0gcmVxdWlyZSgnLi9yZXNwb25zZS1iYXNlJyk7XG52YXIgQWdlbnQgPSByZXF1aXJlKCcuL2FnZW50LWJhc2UnKTtcblxuLyoqXG4gKiBOb29wLlxuICovXG5cbmZ1bmN0aW9uIG5vb3AoKXt9O1xuXG4vKipcbiAqIEV4cG9zZSBgcmVxdWVzdGAuXG4gKi9cblxudmFyIHJlcXVlc3QgPSBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIERldGVybWluZSBYSFIuXG4gKi9cblxucmVxdWVzdC5nZXRYSFIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChyb290LlhNTEh0dHBSZXF1ZXN0XG4gICAgICAmJiAoIXJvb3QubG9jYXRpb24gfHwgJ2ZpbGU6JyAhPSByb290LmxvY2F0aW9uLnByb3RvY29sXG4gICAgICAgICAgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICB9IGVsc2Uge1xuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gIH1cbiAgdGhyb3cgRXJyb3IoXCJCcm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGNvdWxkIG5vdCBmaW5kIFhIUlwiKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhZGRlZCB0byBzdXBwb3J0IElFLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgdHJpbSA9ICcnLnRyaW1cbiAgPyBmdW5jdGlvbihzKSB7IHJldHVybiBzLnRyaW0oKTsgfVxuICA6IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLCAnJyk7IH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBnaXZlbiBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUob2JqKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgdmFyIHBhaXJzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCBvYmpba2V5XSk7XG4gIH1cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBIZWxwcyAnc2VyaWFsaXplJyB3aXRoIHNlcmlhbGl6aW5nIGFycmF5cy5cbiAqIE11dGF0ZXMgdGhlIHBhaXJzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqL1xuXG5mdW5jdGlvbiBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2YWwpIHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgZm9yKHZhciBzdWJrZXkgaW4gdmFsKSB7XG4gICAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXkgKyAnWycgKyBzdWJrZXkgKyAnXScsIHZhbFtzdWJrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgICAgICArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemVPYmplY3QgPSBzZXJpYWxpemU7XG5cbi8qKlxuICAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuXG4gICpcbiAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICogQHJldHVybiB7T2JqZWN0fVxuICAqIEBhcGkgcHJpdmF0ZVxuICAqL1xuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICB2YXIgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTtcbiAgdmFyIHBhaXI7XG4gIHZhciBwb3M7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhaXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT0gLTEpIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpcildID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZSgwLCBwb3MpKV0gPVxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZShwb3MgKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ3RleHQveG1sJyxcbiAgdXJsZW5jb2RlZDogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtLWRhdGEnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuLyoqXG4gKiBEZWZhdWx0IHNlcmlhbGl6YXRpb24gbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihvYmope1xuICogICAgICAgcmV0dXJuICdnZW5lcmF0ZWQgeG1sIGhlcmUnO1xuICogICAgIH07XG4gKlxuICovXG5cbnJlcXVlc3Quc2VyaWFsaXplID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAnYXBwbGljYXRpb24vanNvbic6IEpTT04uc3RyaW5naWZ5XG59O1xuXG4vKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbGluZSA9IGxpbmVzW2ldO1xuICAgIGluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgeyAvLyBjb3VsZCBiZSBlbXB0eSBsaW5lLCBqdXN0IHNraXAgaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICAvLyBzaG91bGQgbWF0Y2ggL2pzb24gb3IgK2pzb25cbiAgLy8gYnV0IG5vdCAvanNvbi1zZXFcbiAgcmV0dXJuIC9bXFwvK11qc29uKCR8W14tXFx3XSkvLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSkge1xuICB0aGlzLnJlcSA9IHJlcTtcbiAgdGhpcy54aHIgPSB0aGlzLnJlcS54aHI7XG4gIC8vIHJlc3BvbnNlVGV4dCBpcyBhY2Nlc3NpYmxlIG9ubHkgaWYgcmVzcG9uc2VUeXBlIGlzICcnIG9yICd0ZXh0JyBhbmQgb24gb2xkZXIgYnJvd3NlcnNcbiAgdGhpcy50ZXh0ID0gKCh0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgJiYgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fCB0eXBlb2YgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgPyB0aGlzLnhoci5yZXNwb25zZVRleHRcbiAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgdmFyIHN0YXR1cyA9IHRoaXMueGhyLnN0YXR1cztcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG4gIHRoaXMuX3NldFN0YXR1c1Byb3BlcnRpZXMoc3RhdHVzKTtcbiAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIC8vIGdldEFsbFJlc3BvbnNlSGVhZGVycyBzb21ldGltZXMgZmFsc2VseSByZXR1cm5zIFwiXCIgZm9yIENPUlMgcmVxdWVzdHMsIGJ1dFxuICAvLyBnZXRSZXNwb25zZUhlYWRlciBzdGlsbCB3b3Jrcy4gc28gd2UgZ2V0IGNvbnRlbnQtdHlwZSBldmVuIGlmIGdldHRpbmdcbiAgLy8gb3RoZXIgaGVhZGVycyBmYWlscy5cbiAgdGhpcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpO1xuICB0aGlzLl9zZXRIZWFkZXJQcm9wZXJ0aWVzKHRoaXMuaGVhZGVyKTtcblxuICBpZiAobnVsbCA9PT0gdGhpcy50ZXh0ICYmIHJlcS5fcmVzcG9uc2VUeXBlKSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy54aHIucmVzcG9uc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy5yZXEubWV0aG9kICE9ICdIRUFEJ1xuICAgICAgPyB0aGlzLl9wYXJzZUJvZHkodGhpcy50ZXh0ID8gdGhpcy50ZXh0IDogdGhpcy54aHIucmVzcG9uc2UpXG4gICAgICA6IG51bGw7XG4gIH1cbn1cblxuUmVzcG9uc2VCYXNlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuX3BhcnNlQm9keSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgcGFyc2UgPSByZXF1ZXN0LnBhcnNlW3RoaXMudHlwZV07XG4gIGlmICh0aGlzLnJlcS5fcGFyc2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLl9wYXJzZXIodGhpcywgc3RyKTtcbiAgfVxuICBpZiAoIXBhcnNlICYmIGlzSlNPTih0aGlzLnR5cGUpKSB7XG4gICAgcGFyc2UgPSByZXF1ZXN0LnBhcnNlWydhcHBsaWNhdGlvbi9qc29uJ107XG4gIH1cbiAgcmV0dXJuIHBhcnNlICYmIHN0ciAmJiAoc3RyLmxlbmd0aCB8fCBzdHIgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgPyBwYXJzZShzdHIpXG4gICAgOiBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYEVycm9yYCByZXByZXNlbnRhdGl2ZSBvZiB0aGlzIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm4ge0Vycm9yfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUudG9FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gIHZhciB1cmwgPSByZXEudXJsO1xuXG4gIHZhciBtc2cgPSAnY2Fubm90ICcgKyBtZXRob2QgKyAnICcgKyB1cmwgKyAnICgnICsgdGhpcy5zdGF0dXMgKyAnKSc7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gbWV0aG9kO1xuICBlcnIudXJsID0gdXJsO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VgLlxuICovXG5cbnJlcXVlc3QuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG1ldGhvZCwgdXJsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeSB8fCBbXTtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICB0aGlzLmhlYWRlciA9IHt9OyAvLyBwcmVzZXJ2ZXMgaGVhZGVyIG5hbWUgY2FzZVxuICB0aGlzLl9oZWFkZXIgPSB7fTsgLy8gY29lcmNlcyBoZWFkZXIgbmFtZXMgdG8gbG93ZXJjYXNlXG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgZXJyID0gbmV3IEVycm9yKCdQYXJzZXIgaXMgdW5hYmxlIHRvIHBhcnNlIHRoZSByZXNwb25zZScpO1xuICAgICAgZXJyLnBhcnNlID0gdHJ1ZTtcbiAgICAgIGVyci5vcmlnaW5hbCA9IGU7XG4gICAgICAvLyBpc3N1ZSAjNjc1OiByZXR1cm4gdGhlIHJhdyByZXNwb25zZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgaWYgKHNlbGYueGhyKSB7XG4gICAgICAgIC8vIGllOSBkb2Vzbid0IGhhdmUgJ3Jlc3BvbnNlJyBwcm9wZXJ0eVxuICAgICAgICBlcnIucmF3UmVzcG9uc2UgPSB0eXBlb2Ygc2VsZi54aHIucmVzcG9uc2VUeXBlID09ICd1bmRlZmluZWQnID8gc2VsZi54aHIucmVzcG9uc2VUZXh0IDogc2VsZi54aHIucmVzcG9uc2U7XG4gICAgICAgIC8vIGlzc3VlICM4NzY6IHJldHVybiB0aGUgaHR0cCBzdGF0dXMgY29kZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgICBlcnIuc3RhdHVzID0gc2VsZi54aHIuc3RhdHVzID8gc2VsZi54aHIuc3RhdHVzIDogbnVsbDtcbiAgICAgICAgZXJyLnN0YXR1c0NvZGUgPSBlcnIuc3RhdHVzOyAvLyBiYWNrd2FyZHMtY29tcGF0IG9ubHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyci5yYXdSZXNwb25zZSA9IG51bGw7XG4gICAgICAgIGVyci5zdGF0dXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgncmVzcG9uc2UnLCByZXMpO1xuXG4gICAgdmFyIG5ld19lcnI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghc2VsZi5faXNSZXNwb25zZU9LKHJlcykpIHtcbiAgICAgICAgbmV3X2VyciA9IG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCB8fCAnVW5zdWNjZXNzZnVsIEhUVFAgcmVzcG9uc2UnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGN1c3RvbV9lcnIpIHtcbiAgICAgIG5ld19lcnIgPSBjdXN0b21fZXJyOyAvLyBvaygpIGNhbGxiYWNrIGNhbiB0aHJvd1xuICAgIH1cblxuICAgIC8vICMxMDAwIGRvbid0IGNhdGNoIGVycm9ycyBmcm9tIHRoZSBjYWxsYmFjayB0byBhdm9pZCBkb3VibGUgY2FsbGluZyBpdFxuICAgIGlmIChuZXdfZXJyKSB7XG4gICAgICBuZXdfZXJyLm9yaWdpbmFsID0gZXJyO1xuICAgICAgbmV3X2Vyci5yZXNwb25zZSA9IHJlcztcbiAgICAgIG5ld19lcnIuc3RhdHVzID0gcmVzLnN0YXR1cztcbiAgICAgIHNlbGYuY2FsbGJhY2sobmV3X2VyciwgcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5jYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWl4aW4gYEVtaXR0ZXJgIGFuZCBgUmVxdWVzdEJhc2VgLlxuICovXG5cbkVtaXR0ZXIoUmVxdWVzdC5wcm90b3R5cGUpO1xuUmVxdWVzdEJhc2UoUmVxdWVzdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbcGFzc10gb3B0aW9uYWwgaW4gY2FzZSBvZiB1c2luZyAnYmVhcmVyJyBhcyB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB3aXRoICd0eXBlJyBwcm9wZXJ0eSAnYXV0bycsICdiYXNpYycgb3IgJ2JlYXJlcicgKGRlZmF1bHQgJ2Jhc2ljJylcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdXRoID0gZnVuY3Rpb24odXNlciwgcGFzcywgb3B0aW9ucyl7XG4gIGlmICgxID09PSBhcmd1bWVudHMubGVuZ3RoKSBwYXNzID0gJyc7XG4gIGlmICh0eXBlb2YgcGFzcyA9PT0gJ29iamVjdCcgJiYgcGFzcyAhPT0gbnVsbCkgeyAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYnRvYSA/ICdiYXNpYycgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIHZhciBlbmNvZGVyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBidG9hKSB7XG4gICAgICByZXR1cm4gYnRvYShzdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYmFzaWMgYXV0aCwgYnRvYSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9O1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4gKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiAqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uKHZhbCl7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdmFsKSB2YWwgPSBzZXJpYWxpemUodmFsKTtcbiAgaWYgKHZhbCkgdGhpcy5fcXVlcnkucHVzaCh2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYG9wdGlvbnNgIChvciBmaWxlbmFtZSkuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuYXR0YWNoKCdjb250ZW50JywgbmV3IEJsb2IoWyc8YSBpZD1cImFcIj48YiBpZD1cImJcIj5oZXkhPC9iPjwvYT4nXSwgeyB0eXBlOiBcInRleHQvaHRtbFwifSkpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge0Jsb2J8RmlsZX0gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oZmllbGQsIGZpbGUsIG9wdGlvbnMpe1xuICBpZiAoZmlsZSkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICB0aHJvdyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgb3B0aW9ucyB8fCBmaWxlLm5hbWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhID0gZnVuY3Rpb24oKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZm9ybURhdGE7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24oZXJyLCByZXMpe1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICB2YXIgZm4gPSB0aGlzLl9jYWxsYmFjaztcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcblxuICBpZiAoZXJyKSB7XG4gICAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVyci5yZXRyaWVzID0gdGhpcy5fcmV0cmllcyAtIDE7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBmbihlcnIsIHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcXG5Qb3NzaWJsZSBjYXVzZXM6IHRoZSBuZXR3b3JrIGlzIG9mZmxpbmUsIE9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4sIHRoZSBwYWdlIGlzIGJlaW5nIHVubG9hZGVkLCBldGMuJyk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG5cbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIGVyci51cmwgPSB0aGlzLnVybDtcblxuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vLyBUaGlzIG9ubHkgd2FybnMsIGJlY2F1c2UgdGhlIHJlcXVlc3QgaXMgc3RpbGwgbGlrZWx5IHRvIHdvcmtcblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IFJlcXVlc3QucHJvdG90eXBlLmNhID0gUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbigpe1xuICBjb25zb2xlLndhcm4oXCJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gVGhpcyB0aHJvd3MsIGJlY2F1c2UgaXQgY2FuJ3Qgc2VuZC9yZWNlaXZlIGRhdGEgYXMgZXhwZWN0ZWRcblJlcXVlc3QucHJvdG90eXBlLnBpcGUgPSBSZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKCl7XG4gIHRocm93IEVycm9yKFwiU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgaG9zdCBvYmplY3QsXG4gKiB3ZSBkb24ndCB3YW50IHRvIHNlcmlhbGl6ZSB0aGVzZSA6KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2lzSG9zdCA9IGZ1bmN0aW9uIF9pc0hvc3Qob2JqKSB7XG4gIC8vIE5hdGl2ZSBvYmplY3RzIHN0cmluZ2lmeSB0byBbb2JqZWN0IEZpbGVdLCBbb2JqZWN0IEJsb2JdLCBbb2JqZWN0IEZvcm1EYXRhXSwgZXRjLlxuICByZXR1cm4gb2JqICYmICdvYmplY3QnID09PSB0eXBlb2Ygb2JqICYmICFBcnJheS5pc0FycmF5KG9iaikgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbil7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiAuZW5kKCkgd2FzIGNhbGxlZCB0d2ljZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIHN1cGVyYWdlbnRcIik7XG4gIH1cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuXG4gIHJldHVybiB0aGlzLl9lbmQoKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgeGhyID0gKHRoaXMueGhyID0gcmVxdWVzdC5nZXRYSFIoKSk7XG4gIHZhciBkYXRhID0gdGhpcy5fZm9ybURhdGEgfHwgdGhpcy5fZGF0YTtcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHhoci5yZWFkeVN0YXRlO1xuICAgIGlmIChyZWFkeVN0YXRlID49IDIgJiYgc2VsZi5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gICAgfVxuICAgIGlmICg0ICE9IHJlYWR5U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBJRTksIHJlYWRzIHRvIGFueSBwcm9wZXJ0eSAoZS5nLiBzdGF0dXMpIG9mZiBvZiBhbiBhYm9ydGVkIFhIUiB3aWxsXG4gICAgLy8gcmVzdWx0IGluIHRoZSBlcnJvciBcIkNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIGR1ZSB0byBlcnJvciBjMDBjMDIzZlwiXG4gICAgdmFyIHN0YXR1cztcbiAgICB0cnkgeyBzdGF0dXMgPSB4aHIuc3RhdHVzIH0gY2F0Y2goZSkgeyBzdGF0dXMgPSAwOyB9XG5cbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgaWYgKHNlbGYudGltZWRvdXQgfHwgc2VsZi5fYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgcmV0dXJuIHNlbGYuY3Jvc3NEb21haW5FcnJvcigpO1xuICAgIH1cbiAgICBzZWxmLmVtaXQoJ2VuZCcpO1xuICB9O1xuXG4gIC8vIHByb2dyZXNzXG4gIHZhciBoYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZSkge1xuICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgIH1cbiAgICBlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzZWxmLmVtaXQoJ3Byb2dyZXNzJywgZSk7XG4gIH07XG4gIGlmICh0aGlzLmhhc0xpc3RlbmVycygncHJvZ3Jlc3MnKSkge1xuICAgIHRyeSB7XG4gICAgICB4aHIub25wcm9ncmVzcyA9IGhhbmRsZVByb2dyZXNzLmJpbmQobnVsbCwgJ2Rvd25sb2FkJyk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICd1cGxvYWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIC8vIEFjY2Vzc2luZyB4aHIudXBsb2FkIGZhaWxzIGluIElFIGZyb20gYSB3ZWIgd29ya2VyLCBzbyBqdXN0IHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgIC8vIFJlcG9ydGVkIGhlcmU6XG4gICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgzNzI0NS94bWxodHRwcmVxdWVzdC11cGxvYWQtdGhyb3dzLWludmFsaWQtYXJndW1lbnQtd2hlbi11c2VkLWZyb20td2ViLXdvcmtlci1jb250ZXh0XG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICB0cnkge1xuICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSwgdGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBzZWUgIzExNDlcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gQ09SU1xuICBpZiAodGhpcy5fd2l0aENyZWRlbnRpYWxzKSB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAvLyBib2R5XG4gIGlmICghdGhpcy5fZm9ybURhdGEgJiYgJ0dFVCcgIT0gdGhpcy5tZXRob2QgJiYgJ0hFQUQnICE9IHRoaXMubWV0aG9kICYmICdzdHJpbmcnICE9IHR5cGVvZiBkYXRhICYmICF0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICAvLyBzZXJpYWxpemUgc3R1ZmZcbiAgICB2YXIgY29udGVudFR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIHZhciBzZXJpYWxpemUgPSB0aGlzLl9zZXJpYWxpemVyIHx8IHJlcXVlc3Quc2VyaWFsaXplW2NvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXSA6ICcnXTtcbiAgICBpZiAoIXNlcmlhbGl6ZSAmJiBpc0pTT04oY29udGVudFR5cGUpKSB7XG4gICAgICBzZXJpYWxpemUgPSByZXF1ZXN0LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGhlYWRlciBmaWVsZHNcbiAgZm9yICh2YXIgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAobnVsbCA9PSB0aGlzLmhlYWRlcltmaWVsZF0pIGNvbnRpbnVlO1xuXG4gICAgaWYgKHRoaXMuaGVhZGVyLmhhc093blByb3BlcnR5KGZpZWxkKSlcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgOiBudWxsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5yZXF1ZXN0LmFnZW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgQWdlbnQoKTtcbn07XG5cbltcIkdFVFwiLCBcIlBPU1RcIiwgXCJPUFRJT05TXCIsIFwiUEFUQ0hcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgQWdlbnQucHJvdG90eXBlW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IGZ1bmN0aW9uKHVybCwgZm4pIHtcbiAgICB2YXIgcmVxID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdHMocmVxKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcS5lbmQoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9O1xufSk7XG5cbkFnZW50LnByb3RvdHlwZS5kZWwgPSBBZ2VudC5wcm90b3R5cGVbJ2RlbGV0ZSddO1xuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuZ2V0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5oZWFkID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5xdWVyeShkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogT1BUSU9OUyBxdWVyeSB0byBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3Qub3B0aW9ucyA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ09QVElPTlMnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogREVMRVRFIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWwodXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnREVMRVRFJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59XG5cbnJlcXVlc3RbJ2RlbCddID0gZGVsO1xucmVxdWVzdFsnZGVsZXRlJ10gPSBkZWw7XG5cbi8qKlxuICogUEFUQ0ggYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucGF0Y2ggPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQT1NUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBVVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQVVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIG51bGwgIT09IG9iaiAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgb2YgbWl4ZWQtaW4gZnVuY3Rpb25zIHNoYXJlZCBiZXR3ZWVuIG5vZGUgYW5kIGNsaWVudCBjb2RlXG4gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0QmFzZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0QmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0QmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0QmFzZShvYmopIHtcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XG59XG5cbi8qKlxuICogTWl4aW4gdGhlIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gUmVxdWVzdEJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBfY2xlYXJUaW1lb3V0KCl7XG4gIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gIGRlbGV0ZSB0aGlzLl90aW1lcjtcbiAgZGVsZXRlIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXNwb25zZSBib2R5IHBhcnNlclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBpbmNvbWluZyBkYXRhIGludG8gcmVxdWVzdC5ib2R5XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UoZm4pe1xuICB0aGlzLl9wYXJzZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBmb3JtYXQgb2YgYmluYXJ5IHJlc3BvbnNlIGJvZHkuXG4gKiBJbiBicm93c2VyIHZhbGlkIGZvcm1hdHMgYXJlICdibG9iJyBhbmQgJ2FycmF5YnVmZmVyJyxcbiAqIHdoaWNoIHJldHVybiBCbG9iIGFuZCBBcnJheUJ1ZmZlciwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIE5vZGUgYWxsIHZhbHVlcyByZXN1bHQgaW4gQnVmZmVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnJlc3BvbnNlVHlwZSgnYmxvYicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbih2YWwpe1xuICB0aGlzLl9yZXNwb25zZVR5cGUgPSB2YWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlcXVlc3QgYm9keSBzZXJpYWxpemVyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGRhdGEgc2V0IHZpYSAuc2VuZCBvciAuYXR0YWNoIGludG8gcGF5bG9hZCB0byBzZW5kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZShmbil7XG4gIHRoaXMuX3NlcmlhbGl6ZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aW1lb3V0cy5cbiAqXG4gKiAtIHJlc3BvbnNlIHRpbWVvdXQgaXMgdGltZSBiZXR3ZWVuIHNlbmRpbmcgcmVxdWVzdCBhbmQgcmVjZWl2aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS4gSW5jbHVkZXMgRE5TIGFuZCBjb25uZWN0aW9uIHRpbWUuXG4gKiAtIGRlYWRsaW5lIGlzIHRoZSB0aW1lIGZyb20gc3RhcnQgb2YgdGhlIHJlcXVlc3QgdG8gcmVjZWl2aW5nIHJlc3BvbnNlIGJvZHkgaW4gZnVsbC4gSWYgdGhlIGRlYWRsaW5lIGlzIHRvbyBzaG9ydCBsYXJnZSBmaWxlcyBtYXkgbm90IGxvYWQgYXQgYWxsIG9uIHNsb3cgY29ubmVjdGlvbnMuXG4gKlxuICogVmFsdWUgb2YgMCBvciBmYWxzZSBtZWFucyBubyB0aW1lb3V0LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gbXMgb3Ige3Jlc3BvbnNlLCBkZWFkbGluZX1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIHRpbWVvdXQob3B0aW9ucyl7XG4gIGlmICghb3B0aW9ucyB8fCAnb2JqZWN0JyAhPT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucztcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIHN3aXRjaChvcHRpb24pIHtcbiAgICAgIGNhc2UgJ2RlYWRsaW5lJzpcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG9wdGlvbnMuZGVhZGxpbmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUud2FybihcIlVua25vd24gdGltZW91dCBvcHRpb25cIiwgb3B0aW9uKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgb24gZXJyb3IuXG4gKlxuICogRmFpbGVkIHJlcXVlc3RzIHdpbGwgYmUgcmV0cmllZCAnY291bnQnIHRpbWVzIGlmIHRpbWVvdXQgb3IgZXJyLmNvZGUgPj0gNTAwLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uIHJldHJ5KGNvdW50LCBmbil7XG4gIC8vIERlZmF1bHQgdG8gMSBpZiBubyBjb3VudCBwYXNzZWQgb3IgdHJ1ZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBjb3VudCA9PT0gdHJ1ZSkgY291bnQgPSAxO1xuICBpZiAoY291bnQgPD0gMCkgY291bnQgPSAwO1xuICB0aGlzLl9tYXhSZXRyaWVzID0gY291bnQ7XG4gIHRoaXMuX3JldHJpZXMgPSAwO1xuICB0aGlzLl9yZXRyeUNhbGxiYWNrID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIEVSUk9SX0NPREVTID0gW1xuICAnRUNPTk5SRVNFVCcsXG4gICdFVElNRURPVVQnLFxuICAnRUFERFJJTkZPJyxcbiAgJ0VTT0NLRVRUSU1FRE9VVCdcbl07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZC5cbiAqIChCb3Jyb3dlZCBmcm9tIHNlZ21lbnRpby9zdXBlcmFnZW50LXJldHJ5KVxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3Nob3VsZFJldHJ5ID0gZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgaWYgKCF0aGlzLl9tYXhSZXRyaWVzIHx8IHRoaXMuX3JldHJpZXMrKyA+PSB0aGlzLl9tYXhSZXRyaWVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLl9yZXRyeUNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBvdmVycmlkZSA9IHRoaXMuX3JldHJ5Q2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgaWYgKG92ZXJyaWRlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChvdmVycmlkZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIHVuZGVmaW5lZCBmYWxscyBiYWNrIHRvIGRlZmF1bHRzXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBpZiAocmVzICYmIHJlcy5zdGF0dXMgJiYgcmVzLnN0YXR1cyA+PSA1MDAgJiYgcmVzLnN0YXR1cyAhPSA1MDEpIHJldHVybiB0cnVlO1xuICBpZiAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICYmIH5FUlJPUl9DT0RFUy5pbmRleE9mKGVyci5jb2RlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gU3VwZXJhZ2VudCB0aW1lb3V0XG4gICAgaWYgKGVyci50aW1lb3V0ICYmIGVyci5jb2RlID09ICdFQ09OTkFCT1JURUQnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXJyLmNyb3NzRG9tYWluKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHJ5IHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fcmV0cnkgPSBmdW5jdGlvbigpIHtcblxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIC8vIG5vZGVcbiAgaWYgKHRoaXMucmVxKSB7XG4gICAgdGhpcy5yZXEgPSBudWxsO1xuICAgIHRoaXMucmVxID0gdGhpcy5yZXF1ZXN0KCk7XG4gIH1cblxuICB0aGlzLl9hYm9ydGVkID0gZmFsc2U7XG4gIHRoaXMudGltZWRvdXQgPSBmYWxzZTtcblxuICByZXR1cm4gdGhpcy5fZW5kKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2Ugc3VwcG9ydFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZWplY3RdXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgaWYgKCF0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBzdXBlcmFnZW50IHJlcXVlc3Qgd2FzIHNlbnQgdHdpY2UsIGJlY2F1c2UgYm90aCAuZW5kKCkgYW5kIC50aGVuKCkgd2VyZSBjYWxsZWQuIE5ldmVyIGNhbGwgLmVuZCgpIGlmIHlvdSB1c2UgcHJvbWlzZXNcIik7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oaW5uZXJSZXNvbHZlLCBpbm5lclJlamVjdCkge1xuICAgICAgc2VsZi5lbmQoZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikgaW5uZXJSZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSBpbm5lclJlc29sdmUocmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGVbJ2NhdGNoJ10gPSBmdW5jdGlvbihjYikge1xuICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgY2IpO1xufTtcblxuLyoqXG4gKiBBbGxvdyBmb3IgZXh0ZW5zaW9uXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICBmbih0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUub2sgPSBmdW5jdGlvbihjYikge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGNiKSB0aHJvdyBFcnJvcihcIkNhbGxiYWNrIHJlcXVpcmVkXCIpO1xuICB0aGlzLl9va0NhbGxiYWNrID0gY2I7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9pc1Jlc3BvbnNlT0sgPSBmdW5jdGlvbihyZXMpIHtcbiAgaWYgKCFyZXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fb2tDYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLl9va0NhbGxiYWNrKHJlcyk7XG4gIH1cblxuICByZXR1cm4gcmVzLnN0YXR1cyA+PSAyMDAgJiYgcmVzLnN0YXR1cyA8IDMwMDtcbn07XG5cbi8qKlxuICogR2V0IHJlcXVlc3QgaGVhZGVyIGBmaWVsZGAuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICByZXR1cm4gdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBoZWFkZXIgYGZpZWxkYCB2YWx1ZS5cbiAqIFRoaXMgaXMgYSBkZXByZWNhdGVkIGludGVybmFsIEFQSS4gVXNlIGAuZ2V0KGZpZWxkKWAgaW5zdGVhZC5cbiAqXG4gKiAoZ2V0SGVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN1cGVyYWdlbnQgY29kZSBiYXNlKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXRIZWFkZXIgPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNldCgnWC1BUEktS2V5JywgJ2Zvb2JhcicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdYLUFQSS1LZXknOiAnZm9vYmFyJyB9KVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnVuc2V0KCdVc2VyLUFnZW50JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xuICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGUgdGhlIGZpZWxkIGBuYW1lYCBhbmQgYHZhbGAsIG9yIG11bHRpcGxlIGZpZWxkcyB3aXRoIG9uZSBvYmplY3RcbiAqIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiByZXF1ZXN0IGJvZGllcy5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCgnZm9vJywgJ2JhcicpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCh7IGZvbzogJ2JhcicsIGJhejogJ3F1eCcgfSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfEJsb2J8RmlsZXxCdWZmZXJ8ZnMuUmVhZFN0cmVhbX0gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuICAvLyBuYW1lIHNob3VsZCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LlxuICBpZiAobnVsbCA9PT0gbmFtZSB8fCB1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIG5hbWUgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLmZpZWxkKCkgY2FuJ3QgYmUgdXNlZCBpZiAuc2VuZCgpIGlzIHVzZWQuIFBsZWFzZSB1c2Ugb25seSAuc2VuZCgpIG9yIG9ubHkgLmZpZWxkKCkgJiAuYXR0YWNoKClcIik7XG4gIH1cblxuICBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgdGhpcy5maWVsZChrZXksIG5hbWVba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIGZvciAodmFyIGkgaW4gdmFsKSB7XG4gICAgICB0aGlzLmZpZWxkKG5hbWUsIHZhbFtpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdmFsIHNob3VsZCBiZSBkZWZpbmVkIG5vd1xuICBpZiAobnVsbCA9PT0gdmFsIHx8IHVuZGVmaW5lZCA9PT0gdmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCcuZmllbGQobmFtZSwgdmFsKSB2YWwgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGlmICgnYm9vbGVhbicgPT09IHR5cGVvZiB2YWwpIHtcbiAgICB2YWwgPSAnJyArIHZhbDtcbiAgfVxuICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChuYW1lLCB2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0aGlzLl9hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIgJiYgdGhpcy54aHIuYWJvcnQoKTsgLy8gYnJvd3NlclxuICB0aGlzLnJlcSAmJiB0aGlzLnJlcS5hYm9ydCgpOyAvLyBub2RlXG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIHRoaXMuZW1pdCgnYWJvcnQnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2F1dGggPSBmdW5jdGlvbih1c2VyLCBwYXNzLCBvcHRpb25zLCBiYXNlNjRFbmNvZGVyKSB7XG4gIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgY2FzZSAnYmFzaWMnOlxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGJhc2U2NEVuY29kZXIodXNlciArICc6JyArIHBhc3MpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYXV0byc6XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcjtcbiAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWFyZXInOiAvLyB1c2FnZSB3b3VsZCBiZSAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB1c2VyKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbmFibGUgdHJhbnNtaXNzaW9uIG9mIGNvb2tpZXMgd2l0aCB4LWRvbWFpbiByZXF1ZXN0cy5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHRoaXMgdG8gd29yayB0aGUgb3JpZ2luIG11c3Qgbm90IGJlXG4gKiB1c2luZyBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiIHdpdGggYSB3aWxkY2FyZCxcbiAqIGFuZCBhbHNvIG11c3Qgc2V0IFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIlxuICogdG8gXCJ0cnVlXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24ob24pIHtcbiAgLy8gVGhpcyBpcyBicm93c2VyLW9ubHkgZnVuY3Rpb25hbGl0eS4gTm9kZSBzaWRlIGlzIG5vLW9wLlxuICBpZiAob24gPT0gdW5kZWZpbmVkKSBvbiA9IHRydWU7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IG9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYXggcmVkaXJlY3RzIHRvIGBuYC4gRG9lcyBub3RpbmcgaW4gYnJvd3NlciBYSFIgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmVkaXJlY3RzID0gZnVuY3Rpb24obil7XG4gIHRoaXMuX21heFJlZGlyZWN0cyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpemUgb2YgYnVmZmVyZWQgcmVzcG9uc2UgYm9keSwgaW4gYnl0ZXMuIENvdW50cyB1bmNvbXByZXNzZWQgc2l6ZS5cbiAqIERlZmF1bHQgMjAwTUIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUubWF4UmVzcG9uc2VTaXplID0gZnVuY3Rpb24obil7XG4gIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIG4pIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50XCIpO1xuICB9XG4gIHRoaXMuX21heFJlc3BvbnNlU2l6ZSA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRvIGEgcGxhaW4gamF2YXNjcmlwdCBvYmplY3QgKG5vdCBKU09OIHN0cmluZykgb2Ygc2NhbGFyIHByb3BlcnRpZXMuXG4gKiBOb3RlIGFzIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJldHVybiBhIHVzZWZ1bCBub24tdGhpcyB2YWx1ZSxcbiAqIGl0IGNhbm5vdCBiZSBjaGFpbmVkLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gZGVzY3JpYmluZyBtZXRob2QsIHVybCwgYW5kIGRhdGEgb2YgdGhpcyByZXF1ZXN0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgIHVybDogdGhpcy51cmwsXG4gICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICBoZWFkZXJzOiB0aGlzLl9oZWFkZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgIGFzIHRoZSByZXF1ZXN0IGJvZHksIGRlZmF1bHRpbmcgdGhlIGAudHlwZSgpYCB0byBcImpzb25cIiB3aGVuXG4gKiBhbiBvYmplY3QgaXMgZ2l2ZW4uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gbWFudWFsIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgIC5zZW5kKCd7XCJuYW1lXCI6XCJ0alwifScpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZGF0YVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oZGF0YSl7XG4gIHZhciBpc09iaiA9IGlzT2JqZWN0KGRhdGEpO1xuICB2YXIgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG5cbiAgaWYgKHRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi5zZW5kKCkgY2FuJ3QgYmUgdXNlZCBpZiAuYXR0YWNoKCkgb3IgLmZpZWxkKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiKTtcbiAgfVxuXG4gIGlmIChpc09iaiAmJiAhdGhpcy5fZGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEgJiYgdGhpcy5fZGF0YSAmJiB0aGlzLl9pc0hvc3QodGhpcy5fZGF0YSkpIHtcbiAgICB0aHJvdyBFcnJvcihcIkNhbid0IG1lcmdlIHRoZXNlIHNlbmQgY2FsbHNcIik7XG4gIH1cblxuICAvLyBtZXJnZVxuICBpZiAoaXNPYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIC8vIGRlZmF1bHQgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2Zvcm0nKTtcbiAgICB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgICBpZiAoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgPT0gdHlwZSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGFcbiAgICAgICAgPyB0aGlzLl9kYXRhICsgJyYnICsgZGF0YVxuICAgICAgICA6IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAodGhpcy5fZGF0YSB8fCAnJykgKyBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICghaXNPYmogfHwgdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBkZWZhdWx0IHRvIGpzb25cbiAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2pzb24nKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNvcnQgYHF1ZXJ5c3RyaW5nYCBieSB0aGUgc29ydCBmdW5jdGlvblxuICpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0IG9yZGVyXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeSgpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gY3VzdG9taXplZCBzb3J0IGZ1bmN0aW9uXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeShmdW5jdGlvbihhLCBiKXtcbiAqICAgICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAqICAgICAgICAgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc29ydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zb3J0UXVlcnkgPSBmdW5jdGlvbihzb3J0KSB7XG4gIC8vIF9zb3J0IGRlZmF1bHQgdG8gdHJ1ZSBidXQgb3RoZXJ3aXNlIGNhbiBiZSBhIGZ1bmN0aW9uIG9yIGJvb2xlYW5cbiAgdGhpcy5fc29ydCA9IHR5cGVvZiBzb3J0ID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBzb3J0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29tcG9zZSBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gcmVxLnVybFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2ZpbmFsaXplUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpe1xuICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeS5qb2luKCcmJyk7XG4gIGlmIChxdWVyeSkge1xuICAgIHRoaXMudXJsICs9ICh0aGlzLnVybC5pbmRleE9mKCc/JykgPj0gMCA/ICcmJyA6ICc/JykgKyBxdWVyeTtcbiAgfVxuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwOyAvLyBNYWtlcyB0aGUgY2FsbCBpZGVtcG90ZW50XG5cbiAgaWYgKHRoaXMuX3NvcnQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnVybC5pbmRleE9mKCc/Jyk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBxdWVyeUFyciA9IHRoaXMudXJsLnN1YnN0cmluZyhpbmRleCArIDEpLnNwbGl0KCcmJyk7XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRoaXMuX3NvcnQpIHtcbiAgICAgICAgcXVlcnlBcnIuc29ydCh0aGlzLl9zb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5QXJyLnNvcnQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gdGhpcy51cmwuc3Vic3RyaW5nKDAsIGluZGV4KSArICc/JyArIHF1ZXJ5QXJyLmpvaW4oJyYnKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEZvciBiYWNrd2FyZHMgY29tcGF0IG9ubHlcblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXBwZW5kUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpIHtjb25zb2xlLnRyYWNlKFwiVW5zdXBwb3J0ZWRcIik7fVxuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHRpbWVvdXQgZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl90aW1lb3V0RXJyb3IgPSBmdW5jdGlvbihyZWFzb24sIHRpbWVvdXQsIGVycm5vKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihyZWFzb24gKyB0aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyk7XG4gIGVyci50aW1lb3V0ID0gdGltZW91dDtcbiAgZXJyLmNvZGUgPSAnRUNPTk5BQk9SVEVEJztcbiAgZXJyLmVycm5vID0gZXJybm87XG4gIHRoaXMudGltZWRvdXQgPSB0cnVlO1xuICB0aGlzLmFib3J0KCk7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGRlYWRsaW5lXG4gIGlmICh0aGlzLl90aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5fdGltZW91dEVycm9yKCdUaW1lb3V0IG9mICcsIHNlbGYuX3RpbWVvdXQsICdFVElNRScpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXQpO1xuICB9XG4gIC8vIHJlc3BvbnNlIHRpbWVvdXRcbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVGltZW91dCAmJiAhdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcignUmVzcG9uc2UgdGltZW91dCBvZiAnLCBzZWxmLl9yZXNwb25zZVRpbWVvdXQsICdFVElNRURPVVQnKTtcbiAgICB9LCB0aGlzLl9yZXNwb25zZVRpbWVvdXQpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VCYXNlYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3BvbnNlQmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZUJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2VCYXNlKG9iaikge1xuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcbn1cblxuLyoqXG4gKiBNaXhpbiB0aGUgcHJvdG90eXBlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBSZXNwb25zZUJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXNwb25zZUJhc2UucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gIHJldHVybiB0aGlzLmhlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciByZWxhdGVkIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGAudHlwZWAgdGhlIGNvbnRlbnQgdHlwZSB3aXRob3V0IHBhcmFtc1xuICpcbiAqIEEgcmVzcG9uc2Ugb2YgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiBcInRleHQvcGxhaW5cIi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgICAvLyBUT0RPOiBtb2FyIVxuICAgIC8vIFRPRE86IG1ha2UgdGhpcyBhIHV0aWxcblxuICAgIC8vIGNvbnRlbnQtdHlwZVxuICAgIHZhciBjdCA9IGhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJyc7XG4gICAgdGhpcy50eXBlID0gdXRpbHMudHlwZShjdCk7XG5cbiAgICAvLyBwYXJhbXNcbiAgICB2YXIgcGFyYW1zID0gdXRpbHMucGFyYW1zKGN0KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1zKSB0aGlzW2tleV0gPSBwYXJhbXNba2V5XTtcblxuICAgIHRoaXMubGlua3MgPSB7fTtcblxuICAgIC8vIGxpbmtzXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGhlYWRlci5saW5rKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtzID0gdXRpbHMucGFyc2VMaW5rcyhoZWFkZXIubGluayk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgZmxhZ3Mgc3VjaCBhcyBgLm9rYCBiYXNlZCBvbiBgc3RhdHVzYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSBhIDJ4eCByZXNwb25zZSB3aWxsIGdpdmUgeW91IGEgYC5va2Agb2YgX190cnVlX19cbiAqIHdoZXJlYXMgNXh4IHdpbGwgYmUgX19mYWxzZV9fIGFuZCBgLmVycm9yYCB3aWxsIGJlIF9fdHJ1ZV9fLiBUaGVcbiAqIGAuY2xpZW50RXJyb3JgIGFuZCBgLnNlcnZlckVycm9yYCBhcmUgYWxzbyBhdmFpbGFibGUgdG8gYmUgbW9yZVxuICogc3BlY2lmaWMsIGFuZCBgLnN0YXR1c1R5cGVgIGlzIHRoZSBjbGFzcyBvZiBlcnJvciByYW5naW5nIGZyb20gMS4uNVxuICogc29tZXRpbWVzIHVzZWZ1bCBmb3IgbWFwcGluZyByZXNwb25kIGNvbG9ycyBldGMuXG4gKlxuICogXCJzdWdhclwiIHByb3BlcnRpZXMgYXJlIGFsc28gZGVmaW5lZCBmb3IgY29tbW9uIGNhc2VzLiBDdXJyZW50bHkgcHJvdmlkaW5nOlxuICpcbiAqICAgLSAubm9Db250ZW50XG4gKiAgIC0gLmJhZFJlcXVlc3RcbiAqICAgLSAudW5hdXRob3JpemVkXG4gKiAgIC0gLm5vdEFjY2VwdGFibGVcbiAqICAgLSAubm90Rm91bmRcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgICB2YXIgdHlwZSA9IHN0YXR1cyAvIDEwMCB8IDA7XG5cbiAgICAvLyBzdGF0dXMgLyBjbGFzc1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzVHlwZSA9IHR5cGU7XG5cbiAgICAvLyBiYXNpY3NcbiAgICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gICAgdGhpcy5vayA9IDIgPT0gdHlwZTtcbiAgICB0aGlzLnJlZGlyZWN0ID0gMyA9PSB0eXBlO1xuICAgIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IDUgPT0gdHlwZTtcbiAgICB0aGlzLmVycm9yID0gKDQgPT0gdHlwZSB8fCA1ID09IHR5cGUpXG4gICAgICAgID8gdGhpcy50b0Vycm9yKClcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIC8vIHN1Z2FyXG4gICAgdGhpcy5jcmVhdGVkID0gMjAxID09IHN0YXR1cztcbiAgICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgICB0aGlzLm5vQ29udGVudCA9IDIwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy5iYWRSZXF1ZXN0ID0gNDAwID09IHN0YXR1cztcbiAgICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RBY2NlcHRhYmxlID0gNDA2ID09IHN0YXR1cztcbiAgICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RGb3VuZCA9IDQwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy51bnByb2Nlc3NhYmxlRW50aXR5ID0gNDIyID09IHN0YXR1cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCk7XG59O1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcmFtcyA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqPSAqLyk7XG4gICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgdmFyIHZhbCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBQYXJzZSBMaW5rIGhlYWRlciBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5wYXJzZUxpbmtzID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvICosICovKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBzdHIpe1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo7ICovKTtcbiAgICB2YXIgdXJsID0gcGFydHNbMF0uc2xpY2UoMSwgLTEpO1xuICAgIHZhciByZWwgPSBwYXJ0c1sxXS5zcGxpdCgvICo9ICovKVsxXS5zbGljZSgxLCAtMSk7XG4gICAgb2JqW3JlbF0gPSB1cmw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBTdHJpcCBjb250ZW50IHJlbGF0ZWQgZmllbGRzIGZyb20gYGhlYWRlcmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQHJldHVybiB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuY2xlYW5IZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIsIGNoYW5nZXNPcmlnaW4pe1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgZGVsZXRlIGhlYWRlclsnY29udGVudC1sZW5ndGgnXTtcbiAgZGVsZXRlIGhlYWRlclsndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgZGVsZXRlIGhlYWRlclsnaG9zdCddO1xuICAvLyBzZWN1aXJ0eVxuICBpZiAoY2hhbmdlc09yaWdpbikge1xuICAgIGRlbGV0ZSBoZWFkZXJbJ2F1dGhvcml6YXRpb24nXTtcbiAgICBkZWxldGUgaGVhZGVyWydjb29raWUnXTtcbiAgfVxuICByZXR1cm4gaGVhZGVyO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iXX0=
|
|
15984
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9mbGFzaC1tZXNzYWdlcy5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2Zvcm0tc3VibWl0LWhlbHBlcnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9pbnB1dC1udW1iZXItb25seS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2lucHV0LXVuaXQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9saW5rLWhlcmUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90ZXh0YXJlYS1leHBhbmQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90aWVyZWQtc2VsZWN0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9tb2R1bGVzL2NsaXBib2FyZC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vbW9kdWxlcy9ub3RpZnkuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL21vZHVsZXMvdW5pdC1jb252ZXJ0ZXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL3R1bmdzdGVuLmpzIiwibm9kZV9tb2R1bGVzL2JlYW4vYmVhbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Vhc2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZnJvbXRvcC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fY2xhc3NsaXN0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hbmltYXRpb24tZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2J1YmJsZS1mb3JtLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9jYWxsYmFjay1tYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2RlYm91bmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2RlbGF5LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL21lZGlhLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL29wdGltaXplZC1ldmVudC1tYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3BhZ2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcmVwZWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Jlc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zY3JvbGwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2hpbXMvY3VzdG9tLWV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3N1Ym1pdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90YXAtZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Rocm90dGxlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2RpZmYuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9leHRyYWN0LWRhdGEuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9nZXQtbGFiZWwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9pbnB1dC1jaGFuZ2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9vYmplY3Qtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3Byb2dyZXNzaXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvcmVzZXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zbGlkZXIvaGVscGVycy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci9pbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3NsaWRlci90ZW1wbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3N0ZXAtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zdGVwLWxhYmVscy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3N0ZXBwZWQtbnVtYmVyLWlucHV0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvdmFsaWRhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdGltZS10b2dnbGUvbGliL2RhdGUtdG8taHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi90aW1lYWdvLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdGltZS10b2dnbGUvbGliL3RvZ2dsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvZ2dsZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMva2V5bWFzdGVyL2tleW1hc3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9sdXhvbi9idWlsZC9janMtYnJvd3Nlci9sdXhvbi5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvYWdlbnQtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9jbGllbnQuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvaXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3JlcXVlc3QtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXNwb25zZS1iYXNlLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Z3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3p5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIoZnVuY3Rpb24oKXtcbiAgdmFyIG5hbWVzXG5cbiAgZnVuY3Rpb24gYXR0ciggc291cmNlLCBuYW1lICl7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT0gJ29iamVjdCcpXG4gICAgICByZXR1cm4gbmFtZSsnPVwiJytzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKydcIiAnXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlKydcIiAnIH1cblxuICBmdW5jdGlvbiBkYXNoZXJpemUoIGlucHV0ICkge1xuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9bXFxXLF9dL2csICctJykucmVwbGFjZSgvLXsyLH0vZywgJy0nKVxuICB9XG5cbiAgZnVuY3Rpb24gc3ZnTmFtZSggbmFtZSApIHtcbiAgICByZXR1cm4gXCJzdmctXCIrZGFzaGVyaXplKCBuYW1lIClcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZSggbmFtZSwgb3B0aW9ucyApIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHZhciBpZCA9IGRhc2hlcml6ZSggbmFtZSApXG4gICAgdmFyIHN5bWJvbCA9IHN2Z3MoKVtpZF1cblxuICAgIGlmICggc3ltYm9sICkge1xuICAgICAgdmFyIHBhcmVudCA9IHN5bWJvbC5wYXJlbnRFbGVtZW50XG4gICAgICB2YXIgcHJlZml4ID0gcGFyZW50LmRhdGFzZXQucHJlZml4XG4gICAgICB2YXIgYmFzZSAgID0gcGFyZW50LmRhdGFzZXQuc3ltYm9sQ2xhc3NcblxuICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KCAnPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCIjJyArIHByZWZpeCArICctJyArIGlkICsgJ1wiLz48L3N2Zz4nICkuZmlyc3RDaGlsZDtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIGJhc2UgKyAnICcgKyBwcmVmaXggKyAnLScgKyBpZCArICcgJyArICggb3B0aW9ucy5jbGFzcyB8fCAnJyApLnRyaW0oKSApXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsIHN5bWJvbC5nZXRBdHRyaWJ1dGUoICd2aWV3Qm94JyApIClcblxuICAgICAgaWYgKCAhKCBvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMuaGVpZ2h0IHx8IG9wdGlvbnMuc2NhbGUgKSApIHtcblxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICBzeW1ib2wuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKVxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSlcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoIG9wdGlvbnMud2lkdGggKSAgc3ZnLnNldEF0dHJpYnV0ZSggJ3dpZHRoJywgIG9wdGlvbnMud2lkdGggKVxuICAgICAgICBpZiAoIG9wdGlvbnMuaGVpZ2h0ICkgc3ZnLnNldEF0dHJpYnV0ZSggJ2hlaWdodCcsIG9wdGlvbnMuaGVpZ2h0IClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN2Z1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBcIicrbmFtZSsnXCIgc3ZnIHN5bWJvbC4gRW5zdXJlIHRoYXQgc3ZnIHNjcmlwdHMgYXJlIGxvYWRlZCcpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3Zncygpe1xuICAgIGlmICggIW5hbWVzICkge1xuICAgICAgbmFtZXMgPSB7fVxuICAgICAgdmFyIHN5bWJvbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ3N2Z1tpZF49ZXN2Z10gc3ltYm9sJyApIClcbiAgICAgIHN5bWJvbHMuZm9yRWFjaCggZnVuY3Rpb24oIHN5bWJvbCApIHtcbiAgICAgICAgbmFtZXNbc3ltYm9sLmRhdGFzZXQubmFtZV0gPSBzeW1ib2xcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBuYW1lc1xuICB9XG5cbiAgdmFyIGVzdmcgPSB7XG4gICAgc3Znczogc3ZncyxcbiAgICB1c2U6IHVzZVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oIGV2ZW50ICkgeyBuYW1lcyA9IG51bGw7IGVzdmcuc3ZncygpIH0pXG4gIH1cblxuICBpZiggdHlwZW9mKCBtb2R1bGUgKSAhPSAndW5kZWZpbmVkJyApIHsgbW9kdWxlLmV4cG9ydHMgPSBlc3ZnIH1cbiAgZWxzZSB3aW5kb3cuZXN2ZyA9IGVzdmdcblxufSkoKSIsIihmdW5jdGlvbigpe1xuXG4gIGZ1bmN0aW9uIGVtYmVkKCkge1xuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vzdmctc3ZnLWljb25zJykpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCAnPHN2ZyBpZD1cImVzdmctc3ZnLWljb25zXCIgZGF0YS1zeW1ib2wtY2xhc3M9XCJzdmctc3ltYm9sXCIgZGF0YS1wcmVmaXg9XCJzdmdcIiB2ZXJzaW9uPVwiMS4xXCIgc3R5bGU9XCJoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZVwiIGRhdGEtdHVyYm9saW5rcy1wZXJtYW5lbnQ+PHN5bWJvbCBpZD1cInN2Zy1hbmdsZS1kb3duXCIgZGF0YS1uYW1lPVwiYW5nbGUtZG93blwiIHZpZXdCb3g9XCIwIDAgMjcgMTVcIiB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMTVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjUuMzA0LjAwNWMuMDkyLjAxMi4xMTYuMDEyLjIwNi4wMzYuMTM1LjAzNi4yNjMuMDk2LjM3Ny4xNzYuMzQ4LjI0NC41NDUuNjY1LjUwOCAxLjA4OGExLjE5NiAxLjE5NiAwIDAgMS0uMjc3LjY2NmMtLjAyMi4wMjctLjA0Ny4wNTItLjA3LjA3OGwtMTIgMTJjLS4wMjYuMDIzLS4wNTEuMDQ4LS4wNzguMDdhMS4xOTggMS4xOTggMCAwIDEtMS41NDIgMGMtLjAyNy0uMDIyLS4wNTItLjA0Ny0uMDc3LS4wN2wtMTItMTJDLjI4OCAxLjk4LjI3IDEuOTY1LjIxNiAxLjg4OGExLjE5MyAxLjE5MyAwIDAgMS0uMTc2LS4zNzdBMS4yMSAxLjIxIDAgMCAxIC43ODkuMDcyYTEuMiAxLjIgMCAwIDEgMS4wOTguMTQ1Yy4wNzcuMDUzLjA5Mi4wNzIuMTYxLjEzNGwxMS4xNTEgMTEuMTUyTDI0LjM1MS4zNTFsLjA3Ny0uMDdjLjA3My0uMDU3LjA5LS4wNzQuMTcxLS4xMi4xMjEtLjA3LjI1NC0uMTE5LjM5Mi0uMTQzLjA5Mi0uMDE2LjExNS0uMDE0LjIwOC0uMDE4bC4xMDUuMDA1elwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hcnJvdy1kb3duLWNpcmNsZVwiIGRhdGEtbmFtZT1cImFycm93LWRvd24tY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMi4yMTggMTguOTQzbC01LjI0MyA1LjI0M2ExLjIxNyAxLjIxNyAwIDAgMS0uOTUxLjQ3OWMtLjAwNSAwLS4wMS0uMDA1LS4wMTctLjAwNS0uMDA4IDAtLjAxMy4wMDUtLjAyLjAwNS0uMzE1IDAtLjYyOS0uMTIxLS44Ny0uMzU5bC01LjM2MS01LjM2M2ExLjIyNSAxLjIyNSAwIDAgMSAwLTEuNzM4IDEuMjMgMS4yMyAwIDAgMSAxLjczOCAwbDMuMzAxIDMuMzAxVjkuMzIyYTEuMjMgMS4yMyAwIDAgMSAyLjQ1OCAwVjIwLjQzbDMuMjI3LTMuMjI1YTEuMjMgMS4yMyAwIDAgMSAxLjczOCAwIDEuMjMgMS4yMyAwIDAgMSAwIDEuNzM4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LXVwLWNpcmNsZVwiIGRhdGEtbmFtZT1cImFycm93LXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMjk0IDE0Ljc5OGExLjIyNSAxLjIyNSAwIDAgMS0uODcuMzU5Yy0uMzE1IDAtLjYyNy0uMTE4LS44NjgtLjM1OWwtMy4zMDMtMy4zMDV2MTEuMTg4YTEuMjMgMS4yMyAwIDAgMS0yLjQ1OCAwVjExLjU2OWwtMy4yMjcgMy4yMjlhMS4yMjkgMS4yMjkgMCAwIDEtMS43MzgtMS43MzdsNS4yNDMtNS4yNDhhMS4yMiAxLjIyIDAgMCAxIC45NTEtLjQ3OWMuMDA3IDAgLjAxMi4wMDUuMDE5LjAwNS4wMDggMCAuMDEzLS4wMDUuMDItLjAwNS4zMjcgMCAuNjM5LjEzLjg2OC4zNTlsNS4zNjMgNS4zNjhhMS4yMyAxLjIzIDAgMCAxIDAgMS43MzdcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctYmFja3VwXCIgZGF0YS1uYW1lPVwiYmFja3VwXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0xNi4wMzkgMjMuODg5YTMzLjI0IDMzLjI0IDAgMCAxLTIuNzA1LjExMUM4LjA0NyAyNCAyLjQ4MyAyMi42NTYgMCAyMC40ODN2Mi44NWMwIDMuMzY0IDUuODU2IDYgMTMuMzM0IDYgMS4zNTggMCAyLjY2MS0uMDg4IDMuODg4LS4yNUE4LjYwOSA4LjYwOSAwIDAgMSAxNiAyNC42NjdjMC0uMjYzLjAxNS0uNTIyLjAzOS0uNzc4em0tMi43MDYtMS4yMjJjMS4wMDQgMCAxLjk4OC0uMDQ3IDIuOTQzLS4xMzFhOC42ODYgOC42ODYgMCAwIDEgMy44MDctNS4yMTIgMzQuNTg1IDM0LjU4NSAwIDAgMS02Ljc1LjY3NkM4LjA0NyAxOCAyLjQ4MyAxNi42NTYgMCAxNC40ODNWMThjMCAyLjExMyA1Ljk0NyA0LjY2NyAxMy4zMzMgNC42Njd6bTAtNmM2LjEwNiAwIDExLjUtMS42ODMgMTMuMzM0LTMuNDM5VjguODkyQzIzLjgxOSAxMC44MDcgMTguMzc3IDEyIDEzLjMzMyAxMiA4LjA0NyAxMiAyLjQ4MyAxMC42NTYgMCA4LjQ4M1YxMmMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40MzhWNmMwLTMuMzY0LTUuODU4LTYtMTMuMzM0LTZTMCAyLjYzNiAwIDZjMCAyLjExMyA1Ljk0OCA0LjY2NyAxMy4zMzMgNC42Njd6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI4IDI1LjMzM2gtMi42NjdWMjhBLjY2Ny42NjcgMCAwIDEgMjQgMjh2LTIuNjY3aC0yLjY2N2EuNjY2LjY2NiAwIDEgMSAwLTEuMzMzSDI0di0yLjY2N2EuNjY3LjY2NyAwIDAgMSAxLjMzMyAwVjI0SDI4YS42NjcuNjY3IDAgMCAxIDAgMS4zMzNtLTMuMzMzLThjLTQuMDQ0IDAtNy4zMzQgMy4yOS03LjMzNCA3LjMzNFMyMC42MjMgMzIgMjQuNjY3IDMyQzI4LjcwOSAzMiAzMiAyOC43MTEgMzIgMjQuNjY3YzAtNC4wNDQtMy4yOTEtNy4zMzQtNy4zMzMtNy4zMzRcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hlY2stY2lyY2xlXCIgZGF0YS1uYW1lPVwiY2hlY2stY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNC45MjUgMTIuNzQ1TDE0LjcwNCAyMy45NDRsLTcuNTg5LTcuNTg3YTEuMjIgMS4yMiAwIDAgMSAwLTEuNzMyIDEuMjE2IDEuMjE2IDAgMCAxIDEuNzMyIDBsNS43NzYgNS43NzUgOC40OTEtOS4zMDdhMS4yMjYgMS4yMjYgMCAxIDEgMS44MTEgMS42NTJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2x1c3RlclwiIGRhdGEtbmFtZT1cImNsdXN0ZXJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2IDMyYTIuOTA2IDIuOTA2IDAgMCAxLS41MDUtLjA0NSAyLjgzNiAyLjgzNiAwIDAgMS0xLjQ3NS0uNzY4QTI5MzYuNjAzIDI5MzYuNjAzIDAgMCAxIC44MTMgMTcuOThhMi44MTMgMi44MTMgMCAwIDEgMC0zLjk2QzUuMjAxIDkuNjA0IDkuNjA0IDUuMjAxIDE0LjAyLjgxM2EyLjgxMyAyLjgxMyAwIDAgMSAzLjk2IDBjNC40MTYgNC4zODggOC44MTkgOC43OTEgMTMuMjA3IDEzLjIwN2EyLjgxMyAyLjgxMyAwIDAgMSAwIDMuOTZBMjkzNi42MDMgMjkzNi42MDMgMCAwIDEgMTcuOTggMzEuMTg3YTIuODc4IDIuODc4IDAgMCAxLS41MzMuNDE0IDIuODEgMi44MSAwIDAgMS0xLjM3OS4zOThMMTYgMzJ6bTAtMS44ODNhLjkyNy45MjcgMCAwIDAgLjY1Ny0uMjdjNC40MTItNC4zODQgOC44MzktOC43NTUgMTMuMTk1LTEzLjE5NWEuOTAxLjkwMSAwIDAgMCAuMTgxLS4yNjMuOTQ3Ljk0NyAwIDAgMC0uMTA2LS45NTQuOTAxLjkwMSAwIDAgMC0uMDc1LS4wODcgOTc3Ljg1IDk3Ny44NSAwIDAgMC0xMy4yLTEzLjIuOTAxLjkwMSAwIDAgMC0uMjYzLS4xODEuOTQ3Ljk0NyAwIDAgMC0uOTUuMTAyIDEuMTQ1IDEuMTQ1IDAgMCAwLS4wOTEuMDc5IDk3Ny44NSA5NzcuODUgMCAwIDAtMTMuMiAxMy4yLjk2Mi45NjIgMCAwIDAtLjE4MS4yNjMuOTQ3Ljk0NyAwIDAgMCAuMTA2Ljk1NGMuMDIzLjAzMS4wNDkuMDYuMDc1LjA4N2E5NzcuODUgOTc3Ljg1IDAgMCAwIDEzLjIgMTMuMi45Mi45MiAwIDAgMCAuNjM1LjI2NUgxNnpcIiBmaWxsLW9wYWNpdHk9XCIuNTAyXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48cGF0aCBkPVwiTTE3LjQ4MiAyNi45MjlsLS44NDcuODQ3YS44OTcuODk3IDAgMCAxLTEuMjcgMEw0LjIyNCAxNi42MzVhLjg5Ny44OTcgMCAwIDEgMC0xLjI3TDE1LjM2NSA0LjIyNGEuODk3Ljg5NyAwIDAgMSAxLjI3IDBsNC4wNDkgNC4wNDl2NS40NTdhMi4zNTMgMi4zNTMgMCAwIDAtMS43MDggMS45NzEgMi4zNTIgMi4zNTIgMCAwIDAgMi4zMzUgMi42NTRsLjA2MS0uMDAxYTIuMzgyIDIuMzgyIDAgMCAwIC45NDgtLjIyNiAyLjM1NyAyLjM1NyAwIDAgMC0uMTMyLTQuMzE0IDIuNiAyLjYgMCAwIDAtLjI0OS0uMDg0VjkuNTI4bDUuODM3IDUuODM3YS44OTcuODk3IDAgMCAxIDAgMS4yN2wtNi42MzkgNi42MzktNC41MDktNC41MXYtNi41MDhhMi4zNzcgMi4zNzcgMCAwIDAgMS40OTQtMS4yNDkgMi4zNjYgMi4zNjYgMCAwIDAgLjIwNS0xLjM3OSAyLjM2NSAyLjM2NSAwIDAgMC0xLjg5Ny0xLjk1NyAyLjM2MyAyLjM2MyAwIDAgMC0xLjM2LjE1MSAyLjM3NyAyLjM3NyAwIDAgMC0xLjIwNCAxLjE2OSAyLjM0IDIuMzQgMCAwIDAtLjE3OCAxLjQ0IDIuMzY2IDIuMzY2IDAgMCAwIDEuNjg0IDEuODI1djYuNzY4Yy4wMDIuMDQ5LjAwMS4wNjEuMDEuMTA5LjAxNi4wOS4wNTEuMTc3LjEwNC4yNTEuMDI4LjA0LjAzNy4wNDguMDcuMDg0bDQuNjkzIDQuNjk0LTEuODc5IDEuODc5LTYuOTYyLTYuOTYxdi0uODFhMi4zNTkgMi4zNTkgMCAwIDAgMS40ODItMy4zMTcgMi4zOCAyLjM4IDAgMCAwLTEuNjc5LTEuMjY4IDIuMzcyIDIuMzcyIDAgMCAwLTEuMzYuMTUxIDIuMzUzIDIuMzUzIDAgMCAwLTEuNDA2IDEuODY1IDIuMzUyIDIuMzUyIDAgMCAwIDEuNzA4IDIuNTY5djEuMDdjLjAwMS4wMzkuMDAxLjA0OS4wMDYuMDg5YS42NDIuNjQyIDAgMCAwIC4xNDcuMzIybC4wMzEuMDMyIDcuMTQ1IDcuMTQ2em0tNi43MDEtOS44M2ExLjA3IDEuMDcgMCAwIDAgLjcyOC0uMjc3IDEuMTA3IDEuMTA3IDAgMCAwIC4zNDMtLjU3MyAxLjEwNiAxLjEwNiAwIDAgMC0uNjM4LTEuMjU5IDEuMDk3IDEuMDk3IDAgMCAwLTEuNDE5LjUyMiAxLjA5IDEuMDkgMCAwIDAtLjA5My43MDMgMS4xIDEuMSAwIDAgMCAxLjA1Ljg4NGguMDI5em0xMC41MyAwYTEuMDcgMS4wNyAwIDAgMCAuNzM5LS4yODVjLjA4Ny0uMDc5LjE2MS0uMTcyLjIxOS0uMjczYTEuMDk5IDEuMDk5IDAgMSAwLS45ODYuNTU4aC4wMjh6TTE2IDExLjA4NWExLjA4MSAxLjA4MSAwIDAgMCAuNzI5LS4yNzcgMS4wOTEgMS4wOTEgMCAwIDAgLjM2MS0uOTYzIDEuMDk1IDEuMDk1IDAgMCAwLTEuMDc2LS45NTggMS4wOTUgMS4wOTUgMCAwIDAtMS4wOTkuOTI0IDEuMDg4IDEuMDg4IDAgMCAwIC4zMzcuOTc5IDEuMDggMS4wOCAwIDAgMCAuNzE5LjI5NUgxNnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jb3B5XCIgZGF0YS1uYW1lPVwiY29weVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTIyLjY2NyA0LjY2N0EuNjY3LjY2NyAwIDAgMCAyMiA0aC0zLjMzM3YxMC40OTVhOS45MTYgOS45MTYgMCAwIDEgNC0xLjEyN1Y0LjY2N3pNNCAyNS4zMzNWNEguNjY3QS42NjcuNjY3IDAgMCAwIDAgNC42NjdWMjZhMy4zMzggMy4zMzggMCAwIDAgMy4zMzMgMy4zMzNoMTIuMDE5YTkuOTUgOS45NSAwIDAgMS0xLjgxNy00SDR6XCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTE0IDEySDcuMzMzYS42NjcuNjY3IDAgMCAwIDAgMS4zMzNIMTRBLjY2Ny42NjcgMCAxIDAgMTQgMTJNMTQgMTQuNjY3SDcuMzMzYS42NjYuNjY2IDAgMSAwIDAgMS4zMzNIMTRhLjY2Ny42NjcgMCAwIDAgMC0xLjMzM00xNC42NjcgMThhLjY2Ny42NjcgMCAwIDAtLjY2Ny0uNjY3SDcuMzMzYS42NjcuNjY3IDAgMCAwIDAgMS4zMzRIMTRhLjY2Ny42NjcgMCAwIDAgLjY2Ny0uNjY3TTcuMzMzIDIwYS42NjcuNjY3IDAgMCAwIDAgMS4zMzNoNGEuNjY3LjY2NyAwIDEgMCAwLTEuMzMzaC00elwiIGZpbGwtb3BhY2l0eT1cIi41MDJcIi8+PHBhdGggZD1cIk02IDkuMzMzaDEwLjY2N2EuNjY2LjY2NiAwIDAgMCAuNjY2LS42NjZWMy4zMzNhLjY2Ni42NjYgMCAwIDAtLjY2Ni0uNjY2aC0yLjA2QzE0LjMzMSAxLjExNSAxMy4wODcgMCAxMS4zMzMgMCA5LjY4NyAwIDguMzYzIDEuMDAxIDguMDYgMi42NjdINmEuNjY3LjY2NyAwIDAgMC0uNjY3LjY2NnY1LjMzNGMwIC4zNjguMjk5LjY2Ni42NjcuNjY2XCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTI2Ljk2OSAyNEgyNHYyLjk2OWEuNjY3LjY2NyAwIDAgMS0xLjMzMyAwVjI0aC0yLjk3YS42NjcuNjY3IDAgMCAxIDAtMS4zMzNoMi45N3YtMi45N2EuNjY2LjY2NiAwIDEgMSAxLjMzMyAwdjIuOTdoMi45NjlhLjY2Ny42NjcgMCAxIDEgMCAxLjMzM20tMy42MzYtOS4zMzNjLTQuNzggMC04LjY2NiAzLjg4OC04LjY2NiA4LjY2NiAwIDQuNzc5IDMuODg2IDguNjY3IDguNjY2IDguNjY3QzI4LjExMiAzMiAzMiAyOC4xMTIgMzIgMjMuMzMzYzAtNC43NzgtMy44ODgtOC42NjYtOC42NjctOC42NjZcIi8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZGVwbG95bWVudFwiIGRhdGEtbmFtZT1cImRlcGxveW1lbnRcIiB2aWV3Qm94PVwiMCAwIDE3NiAyMDFcIiB3aWR0aD1cIjE3NlwiIGhlaWdodD1cIjIwMVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk04OCA1Ljk4NWw4Mi4yNzIgNDcuNXY5NUw4OCAxOTUuOTg1bC04Mi4yNzItNDcuNXYtOTVMODggNS45ODV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZGljZVwiIGRhdGEtbmFtZT1cImRpY2VcIiB2aWV3Qm94PVwiMCAwIDQ1IDMyXCIgd2lkdGg9XCI0NVwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTMwLjc2MiAxMC4yMzJhMi40NzggMi40NzggMCAwIDEgLjkwNiAzLjM4MmwtOS45IDE3LjE0OGEyLjQ3NyAyLjQ3NyAwIDAgMS0zLjM4Mi45MDZsLTE3LjE0OC05LjlhMi40NzggMi40NzggMCAwIDEtLjkwNi0zLjM4Mmw5LjktMTcuMTQ4YTIuNDc4IDIuNDc4IDAgMCAxIDMuMzgyLS45MDZsMTcuMTQ4IDkuOXpcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMTMgNS4yNDlsLjA2MS0uMDAxaDE5LjgwMmEyLjQ3NiAyLjQ3NiAwIDAgMSAyLjQ3NSAyLjQ3NXYxOS44MDJBMi40NzYgMi40NzYgMCAwIDEgNDEuOTkzIDMwSDIyLjIwOGwyLjQ0MS00LjIyOWEyLjM0IDIuMzQgMCAwIDAgMy4yMTgtMi4xNjljMC0uNzQ5LS4zNTMtMS40MTYtLjkwMS0xLjg0NGw0LjcwMi04LjE0NGEyLjQ3OCAyLjQ3OCAwIDAgMC0uOTA2LTMuMzgyTDIyLjEzIDUuMjQ5em0xNi4zNSAxNi4wMTRhMi4zNCAyLjM0IDAgMCAxIDAgNC42NzggMi4zNCAyLjM0IDAgMCAxLTIuMzQtMi4zMzkgMi4zNCAyLjM0IDAgMCAxIDIuMzQtMi4zMzl6bTAtMTEuOTU2YTIuMzQgMi4zNCAwIDAgMSAwIDQuNjc4IDIuMzQgMi4zNCAwIDAgMS0yLjM0LTIuMzM5IDIuMzQgMi4zNCAwIDAgMSAyLjM0LTIuMzM5ek0xOS43MTIgMjIuMzQ1YTIuMzQxIDIuMzQxIDAgMCAxIC44NTcgMy4xOTYgMi4zNCAyLjM0IDAgMCAxLTQuMDUyLTIuMzQgMi4zNCAyLjM0IDAgMCAxIDMuMTk1LS44NTZ6TTE3LjA5MyAxMy45M2EyLjM0IDIuMzQgMCAxIDEtMi4zNCA0LjA1MSAyLjM0IDIuMzQgMCAwIDEgMi4zNC00LjA1MXpNMTQuNDczIDUuNTE0YTIuMzQgMi4zNCAwIDEgMS0yLjM0IDQuMDUyIDIuMzQgMi4zNCAwIDAgMSAyLjM0LTQuMDUyelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRvd25sb2FkXCIgZGF0YS1uYW1lPVwiZG93bmxvYWRcIiB2aWV3Qm94PVwiMCAwIDMzIDMyXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cmVjdCBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTE1LjUwMSAyOC42MjdWMTYuOTJhLjk5My45OTMgMCAwIDEgLjU1OS0uODljLjExMy0uMDU0LjIzMS0uMDgxLjM1NS0uMDk1LjA3NC0uMDAzLjA3NC0uMDAzLjE0OCAwYTEuMSAxLjEgMCAwIDEgLjM1NS4wOTUuOTk2Ljk5NiAwIDAgMSAuNTE1LjU5OWMuMDI5LjA5Ni4wNC4xOTIuMDQ0LjI5MXYxMS43MDdsMi41NDEtMi41NDEuMDQyLS4wMzlhLjk5NC45OTQgMCAwIDEgLjgtLjI0Ljk5Ny45OTcgMCAwIDEgLjgzNC44MzUuOTc5Ljk3OSAwIDAgMS0uMTM3LjY2MmMtLjAzLjA0OS0uMDY1LjA5My0uMTAyLjEzOC0xLjM4IDEuNDYyLTIuODQyIDIuODQ0LTQuMjY0IDQuMjY2bC0uMDMuMDI5YTEuMDA1IDEuMDA1IDAgMCAxLS41OTkuMjYuOTY3Ljk2NyAwIDAgMS0uNTY3LS4xMjkuOTkuOTkgMCAwIDEtLjIwNi0uMTU4Yy0xLjQ0OC0xLjM2OS0yLjgxOC0yLjgxOC00LjIyNi00LjIyN2ExLjAzOCAxLjAzOCAwIDAgMS0uMjQtLjM4Ny45OTguOTk4IDAgMCAxIC40Mi0xLjE1MmMuMTQ5LS4wOTIuMzE1LS4xMzYuNDktLjE0N2ExLjA4NiAxLjA4NiAwIDAgMSAuMjg0LjAzNGMuMTcuMDQ1LjMxNi4xMzUuNDQzLjI1NWwyLjU0MSAyLjU0MXptMTAuNDIzLTQuOTg0aC00LjUyYy0uMDM2LS4wMDItLjA3Mi0uMDAyLS4xMDctLjAwNmEuOTg1Ljk4NSAwIDAgMS0uNjQ2LS4zNDMuOTk1Ljk5NSAwIDAgMSAuMDczLTEuMzU2Ljk5Mi45OTIgMCAwIDEgLjQ2Ny0uMjQ4Yy4wOTMtLjAyLjExOC0uMDE4LjIxMy0uMDIzaDQuNDQ0YTcuMjgxIDcuMjgxIDAgMCAwIDEuMjY0LS4zNDhjMS4xMzItLjQxOSAyLjE5NC0xLjEwMiAyLjkwOC0yLjA5LjE2NS0uMjI4LjMxLS40Ny40MzMtLjcyMy4yODctLjU5LjQ1MS0xLjIzNC41MTYtMS44ODYuMDM4LS4zODMuMDQ2LS43NzEuMDE2LTEuMTU1YTUuNjg0IDUuNjg0IDAgMCAwLS4yNDktMS4yODUgNS43OTggNS43OTggMCAwIDAtMi4xMjMtMi45MzIgNS42OSA1LjY5IDAgMCAwLTMuNTc2LTEuMDc0bC0uMTAzLS4wMDJjLS4wOTEtLjAxMi0uMTE1LS4wMTEtLjIwNC0uMDM3YS45OTEuOTkxIDAgMCAxLS41MDUtLjM0NWMtLjA1Ni0uMDczLS4wNjQtLjA5NS0uMTA4LS4xNzZhOC42MDQgOC42MDQgMCAwIDAtMS40MzgtMi4xMyA4LjUxNyA4LjUxNyAwIDAgMC0yLjA2My0xLjYzNCA4LjM1IDguMzUgMCAwIDAtMi42NTktLjk1MiA4LjUzNSA4LjUzNSAwIDAgMC0yLjQwNC0uMDc2IDguMzk2IDguMzk2IDAgMCAwLTQuNzE4IDIuMTI1IDguNDg0IDguNDg0IDAgMCAwLTEuODg3IDIuNDc5IDguNDEgOC40MSAwIDAgMC0uODgxIDMuMjkxbC0uMDEyLjEwNGMtLjAwOC4wMzQtLjAxNC4wNjktLjAyNC4xMDNhLjk5NS45OTUgMCAwIDEtLjkzNi43MTZjLS4wMzUuMDAxLS4wNy0uMDAzLS4xMDYtLjAwNC0uMTM2LS4wMi0uMjcxLS4wNDgtLjQwNy0uMDY4YTQuMTM0IDQuMTM0IDAgMCAwLTEuNDgzLjA3MyA0LjExMyA0LjExMyAwIDAgMC0yLjQ2NyAxLjczOSA0IDQgMCAwIDAtLjYzNSAxLjc5OWMtLjA0LjM5My0uMDI1Ljc5NS4wMyAxLjE4NS4wNzUuNTM2LjI0MyAxLjA2MS41MzkgMS41MTcuMDkuMTM4LjE5LjI2OS4zLjM5Mi42MzMuNzA0IDEuNTQ3IDEuMDkxIDIuNDU5IDEuMjc1LjM0MS4wNjkuNjkyLjExNiAxLjA0LjExOWg1LjE3bC4xMDcuMDA2Yy4wOTQuMDE1LjExOC4wMTUuMjA5LjA0NmEuOTg4Ljk4OCAwIDAgMS0uMjA5IDEuOTE4Yy0uMDM1LjAwNC0uMDcxLjAwNC0uMTA3LjAwNi0xLjc0NCAwLTMuNDg5LjAxNC01LjIzMy0uMDAxYTcuODk4IDcuODk4IDAgMCAxLTEuMjQ3LS4xMzNjLTEuMTg2LS4yMjItMi4zNDYtLjctMy4yNTMtMS41MTFhNS4xNSA1LjE1IDAgMCAxLS45NDktMS4xMjkgNS42OTQgNS42OTQgMCAwIDEtLjc2NS0yLjEwNyA3LjIzIDcuMjMgMCAwIDEtLjA1Ny0xLjc4MWMuMDQ2LS40NTYuMTQ0LS45MDYuMjkxLTEuMzM5YTYuMDY2IDYuMDY2IDAgMCAxIDMuOTk3LTMuODM2IDYuMDY3IDYuMDY3IDAgMCAxIDEuODg5LS4yNDhjLjAxOS0uMTE1LjA0LS4yMy4wNjEtLjM0NWExMC40MTggMTAuNDE4IDAgMCAxIDMuNjk3LTYuMTIxIDEwLjQgMTAuNCAwIDAgMSAyLjk0Ny0xLjY2NyAxMC40MDUgMTAuNDA1IDAgMCAxIDMuNjc0LS42M2MuOTE4LjAxMiAxLjgzMS4xMzcgMi43MTUuMzg1YTEwLjQ1OCAxMC40NTggMCAwIDEgNi4zMDggNS4wMTZsLjAwNC4wMDZhNy40NzcgNy40NzcgMCAwIDEgMS4yNjUuMTYyIDcuNjI4IDcuNjI4IDAgMCAxIDEuNjU4LjU1NiA3Ljc0IDcuNzQgMCAwIDEgNC4xNjUgNC45NDIgOC4xNDYgOC4xNDYgMCAwIDEgLjIxOCAzLjA5NyA3LjQ5MiA3LjQ5MiAwIDAgMS0uNjkgMi40MTIgNi45MDEgNi45MDEgMCAwIDEtMS4xMDMgMS42MjRjLS45MDMuOTkzLTIuMDc2IDEuNzEzLTMuMzMgMi4xNzdhOC44ODQgOC44ODQgMCAwIDEtMS43MTIuNDU4Yy0uMDQ3LjAwNi0uMDQ2LjAwNi0uMDkzLjAxbC0uMDY4LjAwM3pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1nZWFyLWNpcmNsZVwiIGRhdGEtbmFtZT1cImdlYXItY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PGcgZmlsbC1ydWxlPVwibm9uemVyb1wiPjxwYXRoIGQ9XCJNMjQuMjUzIDYuOTcxYS45NzUuOTc1IDAgMCAxIC40NDUuMjM4Yy4wNTQuMDUzLjA2NC4wNjkuMTExLjEyOSAxLjA5NSAxLjcwOSAyLjAzNCAzLjUxNCAzLjA0OSA1LjI3MmEuOTI3LjkyNyAwIDAgMS0uMDggMS4wMzdjLS4wNzMuMDktLjE2LjE1OC0uMjU3LjIybC0xLjY0Ljk0OGMuMDIxLjE1NS4wMzMuMzA5LjA0Ny40NjUuMDEzLjE5My4wMjMuMzg1LjAyNi41NzkuMDAzLjQyNC0uMDIzLjg0My0uMDY5IDEuMjY0bC0uMDAyLjAxMyAxLjY0Mi45NDkuMDcxLjA0NWMuMDY5LjA1My4xMzEuMTA3LjE4Ni4xNzRhLjkyOS45MjkgMCAwIDEgLjExOS45NjJjLS45MzMgMS44MDMtMi4wMjYgMy41MTktMy4wNDEgNS4yNzdhMS4wNSAxLjA1IDAgMCAxLS4xNTYuMjAxYy0uMjA2LjItLjUuMjkzLS43ODMuMjQ5YTEuMDMgMS4wMyAwIDAgMS0uMzE5LS4xMTNsLTEuNjM1LS45NDljLS4xMjkuMDk3LS4yNjIuMTg3LS4zOTYuMjc4LS4xOTEuMTI0LS4xOS4xMjMtLjM4NS4yNDMtLjM4OS4yMjktLjc4Ny40MzUtMS4xOTkuNjIzbC0uMDE0LjAwNnYxLjkwOGwtLjAwNC4wODVhMS4xMDUgMS4xMDUgMCAwIDEtLjA1OC4yNDguOTI3LjkyNyAwIDAgMS0uNzczLjU4M2MtMi4wMjkuMDk0LTQuMDYyLjAwNC02LjA5NC4wMDRhLjkyNS45MjUgMCAwIDEtLjg1Ny0uNTg3IDEuMDU2IDEuMDU2IDAgMCAxLS4wNjMtLjMzM3YtMS45MDdjLS4xNDItLjA2MS0uMjgyLS4xMjgtLjQyMi0uMTk1LS4yMDMtLjEwMi0uMjAzLS4xMDEtLjQwNC0uMjA3YTEyLjA3MSAxMi4wNzEgMCAwIDEtMS4xNjgtLjczMWwtLjAyNy0uMDItMS42NTkuOTUzLS4wNzUuMDM4YS45MjQuOTI0IDAgMCAxLTEuMTM0LS4zMDVjLTEuMDk1LTEuNzEtMi4wMzQtMy41MTUtMy4wNDktNS4yNzRhMS4wMDMgMS4wMDMgMCAwIDEtLjExMi0uMzE5LjkyNi45MjYgMCAwIDEgLjI0OC0uNzgxYy4wNjEtLjA2My4xMjgtLjExLjIwMS0uMTU2bDEuNjQxLS45NDhjLS4wMjEtLjE1Ni0uMDMzLS4zMTEtLjA0Ni0uNDY3LS4wMTQtLjIzMS0uMDE0LS4yMy0uMDIzLS40NjEtLjAwNi0uNDYzLjAxOC0uOTIxLjA2OS0xLjM4MWwuMDAxLS4wMTQtMS42MzktLjk0Ny0uMDcxLS4wNDZhMS4wOTYgMS4wOTYgMCAwIDEtLjE4Ni0uMTc0LjkzLjkzIDAgMCAxLS4xOTItLjcxOGMuMDE0LS4wODYuMDQxLS4xNjQuMDc0LS4yNDQuOTM0LTEuODAzIDIuMDI5LTMuNTE4IDMuMDQ2LTUuMjc2LjA2Mi0uMDk3LjEyOS0uMTgzLjIyLS4yNTZhLjkyOC45MjggMCAwIDEgLjgtLjE3NmMuMDg0LjAyMS4xNTkuMDU2LjIzNS4wOTZsMS42NTIuOTUxYy4wNy0uMDUzLjE0My0uMTAzLjIxNC0uMTUzLjE5MS0uMTI5LjE5LS4xMjkuMzg1LS4yNTMuNDU0LS4yNzguOTIxLS41MjMgMS40MDctLjc0M2wuMDE0LS4wMDZWNC45NjJsLjAwNC0uMDg1YS45MjUuOTI1IDAgMCAxIC41ODQtLjc3M2MuMDgxLS4wMzEuMTYyLS4wNDYuMjQ4LS4wNTggMi4wMjgtLjA5NCA0LjA2Mi0uMDA0IDYuMDkzLS4wMDQuMTE1LjAwNi4yMjQuMDIuMzMyLjA2MmEuOTMuOTMgMCAwIDEgLjU1My42MDdjLjAyMy4wODMuMDMxLjE2NS4wMzUuMjUxVjYuODdjLjE0Mi4wNjEuMjgxLjEyOS40Mi4xOTYuMjAyLjEwMi4yMDEuMTAyLjQwMS4yMDguMzk5LjIyNC43ODEuNDY2IDEuMTUzLjczM2wuMDIuMDE0IDEuNjI4LS45NDcuMDc2LS4wMzljLjEzNy0uMDU2LjI2NS0uMDgyLjQxMy0uMDg1LjA4NS4wMDcuMDg1LjAwNi4xNjkuMDIxem0tMi4yMjkgMTQuOTRjLjExNy4wMjQuMjE4LjA1OS4zMjQuMTE0bDEuMzc5LjggMi4wODEtMy42MDctMS4zODktLjgwMmMtLjA2NS0uMDQxLS4wODMtLjA1LS4xNDEtLjFhLjkxOS45MTkgMCAwIDEtLjMxNy0uNzY4Yy4wMjctLjIxNi4wNjgtLjQzLjA5Ny0uNjQ1LjA0LS4zNjkuMDY3LS43MzkuMDU1LTEuMTFhOS41MjUgOS41MjUgMCAwIDAtLjE0My0xLjMwNGwtLjAxLS4wODVhLjkyMS45MjEgMCAwIDEgLjMxNi0uNzY4Yy4wNTgtLjA1MS4wNzYtLjA1OS4xNDEtLjFsMS4zODctLjgwMi0yLjA4MS0zLjYwNS0xLjM3NC43OTljLS4wNjguMDM1LS4wODQuMDQ2LS4xNTcuMDcyYS45My45MyAwIDAgMS0uNTk0LjAwNiAxLjExNCAxLjExNCAwIDAgMS0uMjMyLS4xMTVjLS4xMjMtLjA5My0uMjQtLjE5NS0uMzYyLS4yOTFhOC45MzUgOC45MzUgMCAwIDAtMS4wOTMtLjcxMSA5LjcwNSA5LjcwNSAwIDAgMC0xLjE4OC0uNTQxbC0uMDc4LS4wMzRjLS4wNjYtLjAzNy0uMDg0LS4wNDQtLjE0NS0uMDg5YS45MzIuOTMyIDAgMCAxLS4zMzItLjQ4NCAxLjA3IDEuMDcgMCAwIDEtLjAzNS0uMjUyVjUuODgyaC00LjE2OHYxLjYwN2EuOTI5LjkyOSAwIDAgMS0uMzY4LjczNmMtLjA2MS4wNDUtLjA3OS4wNTItLjE0NS4wODktLjE5OS4wODctLjQwMi4xNjEtLjYwMi4yNDYtLjc0NS4zMzctMS40NDYuNzQ4LTIuMDcyIDEuMjc2bC0uMDY5LjA1MmEuOTE5LjkxOSAwIDAgMS0uODI2LjExM2MtLjA3My0uMDI1LS4wODktLjAzNi0uMTU3LS4wNzJMOC4zMyA5LjEyNmwtMi4wODYgMy42MDggMS4zODcuODAyYy4wNjUuMDQxLjA4Mi4wNS4xNDEuMWEuOTIyLjkyMiAwIDAgMSAuMzE2Ljc3Yy0uMDIuMTU0LS4wNDkuMzA3LS4wNzMuNDZhOC4xNTcgOC4xNTcgMCAwIDAtLjA4IDEuMjk3Yy4wMTEuNDM3LjA2NS44NjguMTQgMS4yOTdsLjAxMS4wODZjLjAwMy4wNzcuMDA2LjA5Ni0uMDAyLjE3MmEuOTI4LjkyOCAwIDAgMS0uNDU1LjY5OGwtMS4zODkuODAyIDIuMDg0IDMuNjExIDEuNDAzLS44MDZhLjkyMy45MjMgMCAwIDEgLjgzMS0uMDQzYy4wNzEuMDMyLjA4Ni4wNDQuMTUxLjA4NS4xMjEuMDkyLjIzNy4xOTIuMzU3LjI4Ni4zLjIyNS42MTEuNDMyLjkzOC42MTcuNDQuMjQ5Ljg5OS40NTUgMS4zNzEuNjM2bC4wNzguMDM0Yy4wNjYuMDM3LjA4NC4wNDQuMTQ0LjA4OWEuOTE4LjkxOCAwIDAgMSAuMzY4LjczNnYxLjYwNmg0LjE2OHYtMS42MDZhMS4wOCAxLjA4IDAgMCAxIC4wMzUtLjI1My45MjcuOTI3IDAgMCAxIC4zMzItLjQ4M2MuMDYtLjA0NS4wNzgtLjA1Mi4xNDQtLjA4OS4xOTctLjA4Ni40LS4xNjEuNTk4LS4yNDZhOS40IDkuNCAwIDAgMCAxLjMxMS0uNzE2IDguNjcgOC42NyAwIDAgMCAuNzQ0LS41NjFsLjA2OS0uMDUzYy4wNjUtLjA0LjA4MS0uMDUyLjE1MS0uMDgzLjEwOC0uMDQ4LjIxOC0uMDY3LjMzNS0uMDc3LjA4Ni4wMDEuMDg2IDAgLjE3Mi4wMDl6XCIvPjxwYXRoIGQ9XCJNMTYuMTQ4IDExLjA1MmE1LjA0OCA1LjA0OCAwIDAgMSAyLjAwOS40ODQgNC45NDggNC45NDggMCAwIDEgMi40MDIgMi41MjMgNC45NCA0Ljk0IDAgMCAxIC4yODcgMi45MDkgNC45NjQgNC45NjQgMCAwIDEtMi43OTcgMy40OTcgNC45MjkgNC45MjkgMCAwIDEtNS4zMzktLjg0MyA0Ljg5MyA0Ljg5MyAwIDAgMS0xLjUzNy0yLjc3NSA0Ljk0MiA0Ljk0MiAwIDAgMSAuNDA5LTMuMDA2IDQuOTY4IDQuOTY4IDAgMCAxIDEuOTg3LTIuMTM4IDUuMDQxIDUuMDQxIDAgMCAxIDIuMDc0LS42MzggNi4wOCA2LjA4IDAgMCAxIC41MDUtLjAxM3ptLS4yMDYgMS44MzlhMy4xNiAzLjE2IDAgMCAwLTEuMjU3LjMwMyAzLjExNiAzLjExNiAwIDAgMC0xLjY1MiAyLjAxIDMuMTE2IDMuMTE2IDAgMCAwIC4xNzUgMi4wNDIgMy4wOTEgMy4wOTEgMCAwIDAgMS41NDQgMS41NDIgMy4wOTUgMy4wOTUgMCAwIDAgMi40MDEuMDU5IDMuMTAyIDMuMTAyIDAgMCAwIDEuNjE2LTEuNDY3IDMuMDg1IDMuMDg1IDAgMCAwLTIuODI3LTQuNDg5elwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1nZWFyXCIgZGF0YS1uYW1lPVwiZ2VhclwiIHZpZXdCb3g9XCIwIDAgMzIgMzNcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjMuMDE4IDEuODQyYTIuMzQyIDIuMzQyIDAgMCAxIDEuNjU0Ljg4NGMuMzM2LjQzMS40ODYuOTY5LjQ5NSAxLjUwOS4wMDcuMzg0LS4wNTQuNzYyLS4xMzkgMS4xMzVsLS41ODUgMi4xNDguMDIxLjAyMS4wMTkuMDIgMi4xNDEtLjU4NGMuMDk4LS4wMjQuMDk4LS4wMjMuMTk3LS4wNDYuMi0uMDQuNDAxLS4wNzMuNjA1LS4wODcuNDItLjAzLjg0OS4wMSAxLjI0Ni4xNTcuMjcuMS41MjIuMjUuNzM2LjQ0My4zOTcuMzYuNjY4Ljg2Ny43NDEgMS4zOTkuMDM2LjI2LjAyNC41MjUtLjAzMS43ODEtLjA5NS40NDQtLjMxMy44NTEtLjU4MyAxLjIxMmE2LjA3NCA2LjA3NCAwIDAgMS0uNDAzLjQ3NGwtMS41NzIgMS41NTkuMDA4LjAzLjAxLjAzNmMuNzE2LjE4OSAxLjQyNi4zOTkgMi4xNDguNTY3LjA5MS4wMjYuMDkuMDI2LjE4MS4wNTUuMTk0LjA2NS4zODQuMTM3LjU2OC4yMjcuMzYyLjE3Ni42OTkuNDEuOTYzLjcxNi4xNzQuMi4zMTUuNDI4LjQxLjY3Ni4yMDguNTQuMjAzIDEuMTY1LS4wMTYgMS43MDItLjA5MS4yMjQtLjIyLjQzMi0uMzc3LjYxNS0uMjg2LjMzMy0uNjU5LjU3OS0xLjA1NS43Ni0uMjIuMTAxLS40NDkuMTgtLjY4LjI1MWwtMi4xNDIuNTY2LS4wMS4wMzYtLjAwOC4wMyAxLjU2NyAxLjU1NGE0LjUwMSA0LjUwMSAwIDAgMSAuNTE3LjYyOGMuMjM2LjM0OS40MTYuNzQuNDg4IDEuMTU2LjA0OS4yODUuMDQ1LjU3Ny0uMDE2Ljg1OWEyLjM0OSAyLjM0OSAwIDAgMS0uODQxIDEuMzQzIDIuMjU0IDIuMjU0IDAgMCAxLS42MzguMzQ1Yy0uNDEzLjE0NS0uODU5LjE3MS0xLjI5Mi4xMjlhNS4zOTYgNS4zOTYgMCAwIDEtLjcxNS0uMTIzbC0yLjE0Ny0uNTgzLS4wMi4wMi0uMDIuMDIuNTgzIDIuMTQyYy4wMjUuMDk5LjAyNC4wOTkuMDQ3LjE5OC4wNC4yLjA3Mi40MDEuMDg3LjYwNWEzLjAyIDMuMDIgMCAwIDEtLjEzOSAxLjE5MSAyLjI5IDIuMjkgMCAwIDEtLjQyLjc0MSAyLjM0IDIuMzQgMCAwIDEtMS40NDIuNzljLS4yNi4wMzYtLjUyNC4wMjQtLjc4LS4wMzEtLjY1NC0uMTM5LTEuMjA3LS41NC0xLjY4OC0uOTg4bC0xLjU1Ni0xLjU2OS0uMDMxLjAwOC0uMDM3LjAxLS41NjMgMi4xMzNjLS4wMjkuMDk4LS4wMjguMDk3LS4wNTkuMTk0LS4wNTQuMTYxLS4xMTIuMzItLjE4Mi40NzQtLjE4OS40MTUtLjQ1MS44MDItLjgwMyAxLjA5NGEyLjMgMi4zIDAgMCAxLS42OS4zOTUgMi4zNDggMi4zNDggMCAwIDEtMS41ODYtLjAxNCAyLjI2OSAyLjI2OSAwIDAgMS0uNjc0LS40MDFjLS4zNTktLjMwOC0uNjE2LS43MTctLjgwMS0xLjE0OGE2LjEgNi4xIDAgMCAxLS4yMS0uNTg2bC0uNTY1LTIuMTQxLS4wMzYtLjAxLS4wMy0uMDA4LTEuNTU1IDEuNTY3Yy0uMDczLjA3LS4wNzMuMDctLjE0Ny4xMzhhNC44NDIgNC44NDIgMCAwIDEtLjM5NS4zMiAzLjA4MiAzLjA4MiAwIDAgMS0xLjE4Ni41MzZjLS4yOC4wNTQtLjU3LjA1OC0uODUyLjAwNmEyLjM0NyAyLjM0NyAwIDAgMS0xLjM2Ni0uODA0IDIuMjQ4IDIuMjQ4IDAgMCAxLS4zODUtLjY4N2MtLjE1Ni0uNDQ2LS4xNzUtLjkyNy0uMTItMS4zOTRhNi4wNCA2LjA0IDAgMCAxIC4xMTItLjYxMmwuNTg1LTIuMTQ5LS4wMi0uMDItLjAxOS0uMDItMi4xNDEuNTgyYy0uMDk5LjAyNC0uMDk4LjAyNC0uMTk3LjA0NmE0Ljk5NCA0Ljk5NCAwIDAgMS0uNTAyLjA4IDMuMDU5IDMuMDU5IDAgMCAxLTEuMjk2LS4xMjggMi4yOTQgMi4yOTQgMCAwIDEtLjc0Mi0uNDIgMi4zNTcgMi4zNTcgMCAwIDEtLjc5LTEuNDQyIDIuMjcyIDIuMjcyIDAgMCAxIC4wMTktLjcyMmMuMTI3LS42NzcuNTM4LTEuMjUxLjk5OC0xLjc0NWwxLjU3MS0xLjU2LS4wMDktLjAzLS4wMDktLjAzNi0yLjEzNC0uNTYzLS4xOTQtLjA1OGE0Ljg3MiA0Ljg3MiAwIDAgMS0uNTY4LS4yMjcgMi45NzIgMi45NzIgMCAwIDEtMS4wMDEtLjc1OSAyLjI5MyAyLjI5MyAwIDAgMS0uMzk0LS42ODkgMi4zNDIgMi4zNDIgMCAwIDEgLjAzNy0xLjY0NWMuMDk5LS4yNDIuMjQyLS40NjYuNDE3LS42Ni40NDYtLjQ5NiAxLjA2OS0uNzc0IDEuNjk2LS45NjhsMi4xNDEtLjU2NS4wMDktLjAzNS4wMDktLjAzMS0xLjU2Ni0xLjU1NGMtLjA3LS4wNzMtLjA3LS4wNzMtLjEzOS0uMTQ4LS40MTQtLjQ2Ny0uNzYtMS4wMTUtLjg2Ni0xLjYzOWEyLjMwNyAyLjMwNyAwIDAgMSAuMDA0LS43OTUgMi4zNDkgMi4zNDkgMCAwIDEgLjgwNy0xLjM2NmMuMjAzLS4xNjcuNDM1LS4yOTYuNjgzLS4zODMuNDE0LS4xNDUuODU5LS4xNzIgMS4yOTMtLjEzMS4yNDIuMDIzLjQ3OS4wNjkuNzE2LjEyM2wyLjE0Ny41ODUuMDIxLS4wMjEuMDItLjAyLS41ODQtMi4xNDFjLS4wMjUtLjA5OS0uMDI1LS4wOTktLjA0Ny0uMTk5YTQuNzUgNC43NSAwIDAgMS0uMDg3LS42MDRjLS4wMy0uNDIuMDEtLjg1LjE1Ny0xLjI0Ni4wOTMtLjI1LjIyOS0uNDg0LjQwMi0uNjg3LjM0OS0uNDA3Ljg1MS0uNjkgMS4zNzktLjc3OC4yNi0uMDQ0LjUyNy0uMDQuNzg2LjAwOS40MzEuMDgxLjgyOS4yODEgMS4xODQuNTMzLjE5OC4xNDEuMzgxLjI5OS41NTkuNDY0bDEuNTU5IDEuNTcxLjAzMS0uMDA4LjAzNS0uMDEuNTYzLTIuMTM2LjA1OS0uMTkzYy4wNTQtLjE2MS4xMTItLjMyLjE4My0uNDc0YTMuMDYgMy4wNiAwIDAgMSAuNzU4LTEuMDU2Yy4yMzItLjIwMS41MDItLjM1OC43OTQtLjQ1MmEyLjM0NCAyLjM0NCAwIDAgMSAxLjUyNy4wMzVjLjI0Ni4wOTIuNDc0LjIzLjY3NC40MDEuMzU4LjMwOC42MTUuNzE2LjggMS4xNDcuMDgyLjE5MS4xNDguMzg3LjIxLjU4NWwuNTY1IDIuMTQzLjAzNS4wMDkuMDMyLjAwOSAxLjU1My0xLjU2NmMuMDczLS4wNy4wNzMtLjA3LjE0OC0uMTM5LjQ1My0uNDAxLjk3OS0uNzM5IDEuNTgxLS44NTUuMTU4LS4wMzEuMzE4LS4wNDMuNDc5LS4wNDMuMDYyLjAwMS4wNjEuMDAxLjEyMy4wMDV6bS02LjkzMiA3LjQ3OWE2LjY3OCA2LjY3OCAwIDAgMSAyLjczOC42MjQgNi43MzYgNi43MzYgMCAwIDEgMi45NzEgMi43MyA2LjY3IDYuNjcgMCAwIDEgLjgyIDQuMjU4IDYuNjYgNi42NiAwIDAgMS0xLjk0OCAzLjg0NyA2LjY5IDYuNjkgMCAwIDEtMi4wNjYgMS4zNzUgNi43MDcgNi43MDcgMCAwIDEtNS4wNS4wNjIgNi42OTUgNi42OTUgMCAwIDEtNC4xNTMtNS4yMDEgNi42OCA2LjY4IDAgMCAxIDYuNjg4LTcuNjk1elwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy4wMTggMS44NDJhMi4zNDIgMi4zNDIgMCAwIDEgMS42NTQuODg0Yy4zMzYuNDMxLjQ4Ni45NjkuNDk1IDEuNTA5LjAwNy4zODQtLjA1NC43NjItLjEzOSAxLjEzNWwtLjU4NSAyLjE0OC4wMjEuMDIxLjAxOS4wMiAyLjE0MS0uNTg0Yy4wOTgtLjAyNC4wOTgtLjAyMy4xOTctLjA0Ni4yLS4wNC40MDEtLjA3My42MDUtLjA4Ny40Mi0uMDMuODQ5LjAxIDEuMjQ2LjE1Ny4yNy4xLjUyMi4yNS43MzYuNDQzLjM5Ny4zNi42NjguODY3Ljc0MSAxLjM5OS4wMzYuMjYuMDI0LjUyNS0uMDMxLjc4MS0uMDk1LjQ0NC0uMzEzLjg1MS0uNTgzIDEuMjEyYTYuMDc0IDYuMDc0IDAgMCAxLS40MDMuNDc0bC0xLjU3MiAxLjU1OS4wMDguMDMuMDEuMDM2Yy43MTYuMTg5IDEuNDI2LjM5OSAyLjE0OC41NjcuMDkxLjAyNi4wOS4wMjYuMTgxLjA1NS4xOTQuMDY1LjM4NC4xMzcuNTY4LjIyNy4zNjIuMTc2LjY5OS40MS45NjMuNzE2LjE3NC4yLjMxNS40MjguNDEuNjc2LjIwOC41NC4yMDMgMS4xNjUtLjAxNiAxLjcwMi0uMDkxLjIyNC0uMjIuNDMyLS4zNzcuNjE1LS4yODYuMzMzLS42NTkuNTc5LTEuMDU1Ljc2LS4yMi4xMDEtLjQ0OS4xOC0uNjguMjUxbC0yLjE0Mi41NjYtLjAxLjAzNi0uMDA4LjAzIDEuNTY3IDEuNTU0YTQuNTAxIDQuNTAxIDAgMCAxIC41MTcuNjI4Yy4yMzYuMzQ5LjQxNi43NC40ODggMS4xNTYuMDQ5LjI4NS4wNDUuNTc3LS4wMTYuODU5YTIuMzQ5IDIuMzQ5IDAgMCAxLS44NDEgMS4zNDMgMi4yNTQgMi4yNTQgMCAwIDEtLjYzOC4zNDVjLS40MTMuMTQ1LS44NTkuMTcxLTEuMjkyLjEyOWE1LjM5NiA1LjM5NiAwIDAgMS0uNzE1LS4xMjNsLTIuMTQ3LS41ODMtLjAyLjAyLS4wMi4wMi41ODMgMi4xNDJjLjAyNS4wOTkuMDI0LjA5OS4wNDcuMTk4LjA0LjIuMDcyLjQwMS4wODcuNjA1YTMuMDIgMy4wMiAwIDAgMS0uMTM5IDEuMTkxIDIuMjkgMi4yOSAwIDAgMS0uNDIuNzQxIDIuMzQgMi4zNCAwIDAgMS0xLjQ0Mi43OWMtLjI2LjAzNi0uNTI0LjAyNC0uNzgtLjAzMS0uNjU0LS4xMzktMS4yMDctLjU0LTEuNjg4LS45ODhsLTEuNTU2LTEuNTY5LS4wMzEuMDA4LS4wMzcuMDEtLjU2MyAyLjEzM2MtLjAyOS4wOTgtLjAyOC4wOTctLjA1OS4xOTQtLjA1NC4xNjEtLjExMi4zMi0uMTgyLjQ3NC0uMTg5LjQxNS0uNDUxLjgwMi0uODAzIDEuMDk0YTIuMyAyLjMgMCAwIDEtLjY5LjM5NSAyLjM0OCAyLjM0OCAwIDAgMS0xLjU4Ni0uMDE0IDIuMjY5IDIuMjY5IDAgMCAxLS42NzQtLjQwMWMtLjM1OS0uMzA4LS42MTYtLjcxNy0uODAxLTEuMTQ4YTYuMSA2LjEgMCAwIDEtLjIxLS41ODZsLS41NjUtMi4xNDEtLjAzNi0uMDEtLjAzLS4wMDgtMS41NTUgMS41NjdjLS4wNzMuMDctLjA3My4wNy0uMTQ3LjEzOGE0Ljg0MiA0Ljg0MiAwIDAgMS0uMzk1LjMyIDMuMDgyIDMuMDgyIDAgMCAxLTEuMTg2LjUzNmMtLjI4LjA1NC0uNTcuMDU4LS44NTIuMDA2YTIuMzQ3IDIuMzQ3IDAgMCAxLTEuMzY2LS44MDQgMi4yNDggMi4yNDggMCAwIDEtLjM4NS0uNjg3Yy0uMTU2LS40NDYtLjE3NS0uOTI3LS4xMi0xLjM5NGE2LjA0IDYuMDQgMCAwIDEgLjExMi0uNjEybC41ODUtMi4xNDktLjAyLS4wMi0uMDE5LS4wMi0yLjE0MS41ODJjLS4wOTkuMDI0LS4wOTguMDI0LS4xOTcuMDQ2YTQuOTk0IDQuOTk0IDAgMCAxLS41MDIuMDggMy4wNTkgMy4wNTkgMCAwIDEtMS4yOTYtLjEyOCAyLjI5NCAyLjI5NCAwIDAgMS0uNzQyLS40MiAyLjM1NyAyLjM1NyAwIDAgMS0uNzktMS40NDIgMi4yNzIgMi4yNzIgMCAwIDEgLjAxOS0uNzIyYy4xMjctLjY3Ny41MzgtMS4yNTEuOTk4LTEuNzQ1bDEuNTcxLTEuNTYtLjAwOS0uMDMtLjAwOS0uMDM2LTIuMTM0LS41NjMtLjE5NC0uMDU4YTQuODcyIDQuODcyIDAgMCAxLS41NjgtLjIyNyAyLjk3MiAyLjk3MiAwIDAgMS0xLjAwMS0uNzU5IDIuMjkzIDIuMjkzIDAgMCAxLS4zOTQtLjY4OSAyLjM0MiAyLjM0MiAwIDAgMSAuMDM3LTEuNjQ1Yy4wOTktLjI0Mi4yNDItLjQ2Ni40MTctLjY2LjQ0Ni0uNDk2IDEuMDY5LS43NzQgMS42OTYtLjk2OGwyLjE0MS0uNTY1LjAwOS0uMDM1LjAwOS0uMDMxLTEuNTY2LTEuNTU0Yy0uMDctLjA3My0uMDctLjA3My0uMTM5LS4xNDgtLjQxNC0uNDY3LS43Ni0xLjAxNS0uODY2LTEuNjM5YTIuMzA3IDIuMzA3IDAgMCAxIC4wMDQtLjc5NSAyLjM0OSAyLjM0OSAwIDAgMSAuODA3LTEuMzY2Yy4yMDMtLjE2Ny40MzUtLjI5Ni42ODMtLjM4My40MTQtLjE0NS44NTktLjE3MiAxLjI5My0uMTMxLjI0Mi4wMjMuNDc5LjA2OS43MTYuMTIzbDIuMTQ3LjU4NS4wMjEtLjAyMS4wMi0uMDItLjU4NC0yLjE0MWMtLjAyNS0uMDk5LS4wMjUtLjA5OS0uMDQ3LS4xOTlhNC43NSA0Ljc1IDAgMCAxLS4wODctLjYwNGMtLjAzLS40Mi4wMS0uODUuMTU3LTEuMjQ2LjA5My0uMjUuMjI5LS40ODQuNDAyLS42ODcuMzQ5LS40MDcuODUxLS42OSAxLjM3OS0uNzc4LjI2LS4wNDQuNTI3LS4wNC43ODYuMDA5LjQzMS4wODEuODI5LjI4MSAxLjE4NC41MzMuMTk4LjE0MS4zODEuMjk5LjU1OS40NjRsMS41NTkgMS41NzEuMDMxLS4wMDguMDM1LS4wMS41NjMtMi4xMzYuMDU5LS4xOTNjLjA1NC0uMTYxLjExMi0uMzIuMTgzLS40NzRhMy4wNiAzLjA2IDAgMCAxIC43NTgtMS4wNTZjLjIzMi0uMjAxLjUwMi0uMzU4Ljc5NC0uNDUyYTIuMzQ0IDIuMzQ0IDAgMCAxIDEuNTI3LjAzNWMuMjQ2LjA5Mi40NzQuMjMuNjc0LjQwMS4zNTguMzA4LjYxNS43MTYuOCAxLjE0Ny4wODIuMTkxLjE0OC4zODcuMjEuNTg1bC41NjUgMi4xNDMuMDM1LjAwOS4wMzIuMDA5IDEuNTUzLTEuNTY2Yy4wNzMtLjA3LjA3My0uMDcuMTQ4LS4xMzkuNDUzLS40MDEuOTc5LS43MzkgMS41ODEtLjg1NS4xNTgtLjAzMS4zMTgtLjA0My40NzktLjA0My4wNjIuMDAxLjA2MS4wMDEuMTIzLjAwNXpNMTIuNzgzIDI1LjU3NWwuMS4wMjZjLjEyNi4wNC4yNTIuMDc5LjM4LjExNi4yMTEuMDU5LjQyMy4xMTEuNjM4LjE1OGwuMS4wMjdjLjA4NS4wMzQuMTA4LjA0LjE4Ny4wODcuMTQ3LjA5LjI2OS4yMi4zNDguMzczLjA0My4wODIuMDQ2LjEwNS4wNzUuMTkybC42OTggMi42NDdhMy41OCAzLjU4IDAgMCAwIC4xNTQuNDE2IDEuNDczIDEuNDczIDAgMCAwIC4wOTYuMTg2Yy4wNjYuMTEuMTU0LjIzNS4yNzguMjg2YS40NTQuNDU0IDAgMCAwIC4yMTkuMDI1LjM2Ni4zNjYgMCAwIDAgLjE0NS0uMDQ4LjU5Mi41OTIgMCAwIDAgLjE0NS0uMTI5Yy4wNjEtLjA3My4xMTItLjE1NS4xNTYtLjIzOS4wODEtLjE1Ni4xMzktLjMyMi4xODgtLjQ5bC43LTIuNjU0Yy4wMjktLjA4Ny4wMzItLjExLjA3NS0uMTkyYS45NDMuOTQzIDAgMCAxIC40MzktLjQyMWMuMTQ0LS4wNjcuMzA0LS4wODkuNDU3LS4xMjUuMTI3LS4wMzEuMTI2LS4wMzEuMjUzLS4wNjQuMTY5LS4wNDcuMzM2LS4wOTcuNTAyLS4xNTFsLjEwMS0uMDI2Yy4wOTEtLjAxNC4xMTMtLjAyMS4yMDYtLjAxOWEuOTQ3Ljk0NyAwIDAgMSAuNDkuMTQ4Yy4wNzcuMDUuMDkyLjA2OC4xNi4xM2wxLjkyOSAxLjk0NWEzLjk5MyAzLjk5MyAwIDAgMCAuMzQxLjI4NCAxLjgwNCAxLjgwNCAwIDAgMCAuMTc3LjExM2MuMTExLjA2Mi4yNS4xMjcuMzgyLjEwOGEuNDUxLjQ1MSAwIDAgMCAuMzA2LS4yMDMuNTc2LjU3NiAwIDAgMCAuMDYxLS4xODVjLjAxNy0uMDk0LjAyLS4xOS4wMTYtLjI4NWEyLjcyOSAyLjcyOSAwIDAgMC0uMDgxLS41MTdsLS43MjUtMi42NjJjLS4wMTktLjA5LS4wMjgtLjExMi0uMDMyLS4yMDRhLjk0Mi45NDIgMCAwIDEgLjE3MS0uNTg2Yy4wOTEtLjEyOC4yMTctLjIyNi4zMzEtLjMzMi4wOTMtLjA4OS4xODQtLjE4LjI3NS0uMjcxLjA5MS0uMDk1LjE4MS0uMTkxLjI3LS4yODhsLjA3NC0uMDcyYy4wNzItLjA1Ni4wODgtLjA3NC4xNjgtLjExOGEuOTUuOTUgMCAwIDEgLjQ5NS0uMTE0Yy4wOTIuMDA0LjExNC4wMTMuMjAzLjAzMmwyLjY1My43MmEzLjc0MyAzLjc0MyAwIDAgMCAuNDM4LjA3NiAxLjk5MyAxLjk5MyAwIDAgMCAuMjA5LjAwOWMuMTI3LS4wMDIuMjgtLjAxNS4zODUtLjA5NmEuNDY5LjQ2OSAwIDAgMCAuMTMzLS4xODEuMzQ1LjM0NSAwIDAgMCAuMDMxLS4xNDguNTkyLjU5MiAwIDAgMC0uMDQtLjE5IDEuMjY0IDEuMjY0IDAgMCAwLS4xMjktLjI1NCAyLjY5IDIuNjkgMCAwIDAtLjMzLS40MDhsLTEuOTUtMS45MzVjLS4wNjItLjA2OC0uMDgtLjA4My0uMTMtLjE2YS45NTIuOTUyIDAgMCAxLS4xNDUtLjU5MmMuMDA5LS4wOTIuMDE4LS4xMTQuMDQxLS4yMDNhMTIuOCAxMi44IDAgMCAwIC4xMTctLjM4Yy4wNTgtLjIxMS4xMTEtLjQyMy4xNTgtLjYzN2wuMDI4LS4wOTljLjAzNC0uMDg1LjAzOS0uMTA5LjA4Ny0uMTg3YS45NDYuOTQ2IDAgMCAxIC4zNzItLjM0OWMuMDgyLS4wNDIuMTA1LS4wNDUuMTkyLS4wNzRsMi42NDgtLjY5OWEzLjU4IDMuNTggMCAwIDAgLjQxNi0uMTUzbC4wOTktLjA0OC4wODctLjA0OWMuMTA5LS4wNjUuMjM1LS4xNTMuMjg1LS4yNzZhLjQ1NC40NTQgMCAwIDAtLjAyMy0uMzY3LjU5LjU5IDAgMCAwLS4xMjgtLjE0NSAxLjI2NyAxLjI2NyAwIDAgMC0uMjQtLjE1NiAyLjY1NiAyLjY1NiAwIDAgMC0uNDg5LS4xODhsLTIuNjU0LS43Yy0uMDg4LS4wMjgtLjExMS0uMDMyLS4xOTMtLjA3NGEuOTUuOTUgMCAwIDEtLjQyMS0uNDRjLS4wNjYtLjE0My0uMDg5LS4zMDMtLjEyNS0uNDU1YTEzLjE1NCAxMy4xNTQgMCAwIDAtLjA5OS0uMzc4Yy0uMDM4LS4xMjctLjA3Ni0uMjU0LS4xMTctLjM4bC0uMDI2LS4xYy0uMDEzLS4wOTEtLjAyLS4xMTQtLjAxOC0uMjA2YS45NDQuOTQ0IDAgMCAxIC4xNDgtLjQ4OWMuMDUtLjA3Ny4wNjgtLjA5Mi4xMy0uMTZsMS45NDUtMS45MjlhMy4xMzggMy4xMzggMCAwIDAgLjI4NC0uMzQxYy4wMjEtLjAzLjA0Mi0uMDYuMDYxLS4wOTFhMS41MSAxLjUxIDAgMCAwIC4wNTItLjA4NmMuMDYyLS4xMTEuMTI3LS4yNS4xMDktLjM4MmEuNDY0LjQ2NCAwIDAgMC0uMDgzLS4xOTUuMzY0LjM2NCAwIDAgMC0uMTItLjExMS42MzIuNjMyIDAgMCAwLS4xODQtLjA2MSAxLjMwNCAxLjMwNCAwIDAgMC0uMjg2LS4wMTUgMi42NiAyLjY2IDAgMCAwLS41MTguMDgxbC0yLjY1OS43MjVjLS4wODkuMDE5LS4xMTIuMDI4LS4yMDMuMDMyYS45NDcuOTQ3IDAgMCAxLS41ODUtLjE3Yy0uMDc1LS4wNTItLjA4OS0uMDcxLS4xNTQtLjEzNmExOC4zNzYgMTguMzc2IDAgMCAwLS4yNy0uMjg4IDEyLjUwNiAxMi41MDYgMCAwIDAtLjQ3LS40NTFsLS4wNzItLjA3NGMtLjA1Ny0uMDcyLS4wNzQtLjA4OC0uMTE5LS4xNjhhLjk0OS45NDkgMCAwIDEtLjExNS0uNDk3Yy4wMDQtLjA5Mi4wMTMtLjExNC4wMzItLjIwNGwuNzIzLTIuNjU0YTIuNzY3IDIuNzY3IDAgMCAwIC4wODItLjU0NGwuMDAxLS4xMDFjLS4wMDItLjEyNy0uMDE1LS4yOC0uMDk3LS4zODVhLjQ3Mi40NzIgMCAwIDAtLjMzMS0uMTY0LjYwNS42MDUgMCAwIDAtLjE4OC4wMzhjLS4wOS4wMzMtLjE3NC4wNzgtLjI1NS4xM2EyLjY5IDIuNjkgMCAwIDAtLjQwOC4zM2wtMS45MzMgMS45NDhjLS4wNjguMDYyLS4wODIuMDgtLjE2LjEzYS45NS45NSAwIDAgMS0uNTkuMTQ1Yy0uMDkyLS4wMDgtLjExNC0uMDE4LS4yMDItLjA0YTE4LjM0IDE4LjM0IDAgMCAwLS4zOC0uMTE2Yy0uMjEyLS4wNTgtLjQyNC0uMTEtLjYzOS0uMTU3bC0uMS0uMDI3Yy0uMDg1LS4wMzQtLjEwOS0uMDM5LS4xODgtLjA4N2EuOTM1LjkzNSAwIDAgMS0uMzQ5LS4zNzNjLS4wNDMtLjA4Mi0uMDQ2LS4xMDUtLjA3NS0uMTkzbC0uNjk4LTIuNjQ4YTMuNzcgMy43NyAwIDAgMC0uMTUzLS40MTUgMi40MjcgMi40MjcgMCAwIDAtLjEyMS0uMjI1Yy0uMDY1LS4xLS4xNDgtLjIwOC0uMjYzLS4yNTFhLjQ1OS40NTkgMCAwIDAtLjM1Ni4wMjYuNTgyLjU4MiAwIDAgMC0uMTQzLjEyOCAxLjI5NyAxLjI5NyAwIDAgMC0uMTU3LjIzOSAyLjc4MiAyLjc4MiAwIDAgMC0uMTg5LjQ5MWwtLjY5OSAyLjY1NWMtLjAyOS4wODgtLjAzMi4xMTEtLjA3NS4xOTNhLjk0Ljk0IDAgMCAxLS40NDEuNDIyYy0uMTQzLjA2Ni0uMzAzLjA4OC0uNDU2LjEyM2ExNi4wNSAxNi4wNSAwIDAgMC0uMzc3LjA5OWMtLjEyOC4wMzctLjI1NS4wNzYtLjM4MS4xMTZsLS4xLjAyNWMtLjA5MS4wMTMtLjExMy4wMi0uMjA1LjAxOGEuOTM3LjkzNyAwIDAgMS0uNDg3LS4xNDhjLS4wNzctLjA1LS4wOTItLjA2OC0uMTYtLjEzTDEwIDQuMjIyYTQuMDE3IDQuMDE3IDAgMCAwLS4zNDEtLjI4MyAyLjk1NiAyLjk1NiAwIDAgMC0uMTc3LS4xMTNjLS4xMTItLjA2Mi0uMjUtLjEyNy0uMzgyLS4xMDhhLjQ2LjQ2IDAgMCAwLS4zMDguMjA0LjU2NS41NjUgMCAwIDAtLjA2LjE4MmMtLjAxNy4wOTQtLjAxOS4xOS0uMDE1LjI4NS4wMDcuMTc1LjAzOS4zNDcuMDgxLjUxNmwuNzI2IDIuNjYxYy4wMTkuMDg5LjAyNy4xMTEuMDMyLjIwM2EuOTQ1Ljk0NSAwIDAgMS0uMTY5LjU4M2MtLjA1My4wNzYtLjA3Mi4wOS0uMTM2LjE1NS0uMDk3LjA4OS0uMTkzLjE4LS4yODguMjcxLS4xNTUuMTUzLS4zMDUuMzA5LS40NTEuNDdsLS4wNzQuMDcyYy0uMDcyLjA1Ny0uMDg4LjA3NS0uMTY5LjExOWEuOTQ3Ljk0NyAwIDAgMS0uNDk3LjExNmMtLjA5Mi0uMDA0LS4xMTUtLjAxMy0uMjA0LS4wMzJMNC45MTQgOC44YTQuMjU4IDQuMjU4IDAgMCAwLS40MzYtLjA3NSAzLjc5IDMuNzkgMCAwIDAtLjExLS4wMDhsLS4wOTktLjAwMWMtLjEzMi4wMDItLjI4OC4wMTYtLjM5NS4xMDRhLjQ1LjQ1IDAgMCAwLS4xNTUuMzIyLjU5LjU5IDAgMCAwIC4wMzkuMTljLjAzMi4wODkuMDc4LjE3NC4xMjkuMjU1LjA5NS4xNDguMjA5LjI4MS4zMy40MDdsMS45NDggMS45MzRjLjA2Mi4wNjguMDguMDgzLjEzLjE2YS45NDcuOTQ3IDAgMCAxIC4xNDUuNTkxYy0uMDA4LjA5MS0uMDE4LjExMy0uMDQxLjIwMi0uMDQuMTI2LS4wNzguMjUzLS4xMTYuMzgxLS4wNTguMjExLS4xMS40MjMtLjE1Ny42MzhsLS4wMjcuMDk5Yy0uMDM0LjA4Ni0uMDQuMTA5LS4wODcuMTg4YS45NjMuOTYzIDAgMCAxLS4zNzMuMzQ5Yy0uMDgyLjA0Mi0uMTA1LjA0Ni0uMTkzLjA3NGwtMi42NDcuNjk4YTMuNTU0IDMuNTU0IDAgMCAwLS40MTUuMTUzIDEuNTE4IDEuNTE4IDAgMCAwLS4xODYuMDk3Yy0uMTA5LjA2Ni0uMjM2LjE1NC0uMjg2LjI3N2EuNDU4LjQ1OCAwIDAgMCAuMDIyLjM2N2MuMDMzLjA1Ni4wOC4xMDMuMTI5LjE0NS4wNzMuMDYxLjE1NS4xMTIuMjQuMTU2LjE1NS4wODEuMzIxLjEzOC40ODkuMTg3bDIuNjU1LjcwMWMuMDg3LjAyOS4xMS4wMzIuMTkyLjA3NWEuOTQuOTQgMCAwIDEgLjQyMS40NGMuMDY3LjE0My4wODkuMzAzLjEyNC40NTUuMDMyLjEyNi4wNjUuMjUyLjA5OS4zNzcuMDM4LjEyOC4wNzYuMjU1LjExNi4zODFsLjAyNi4xYy4wMTMuMDkxLjAyLjExNC4wMTguMjA1YS45MzcuOTM3IDAgMCAxLS4xNDguNDg4Yy0uMDUuMDc3LS4wNjguMDkyLS4xMjkuMTZsLTEuOTQ0IDEuOTNhNC41MjIgNC41MjIgMCAwIDAtLjE3Mi4xOTUgMi41NTIgMi41NTIgMCAwIDAtLjIyNC4zMjNjLS4wNjIuMTEyLS4xMjcuMjUtLjEwOS4zODIuMDEuMDcxLjA0NC4xMzguMDgzLjE5NmEuMzY4LjM2OCAwIDAgMCAuMTIxLjExMS41ODIuNTgyIDAgMCAwIC4xODIuMDZjLjA5NC4wMTcuMTkuMDE5LjI4NS4wMTUuMTc2LS4wMDguMzQ5LS4wNDEuNTE5LS4wODNsMi42NjItLjcyMmMuMDg5LS4wMTkuMTExLS4wMjguMjAzLS4wMzJhLjk0OS45NDkgMCAwIDEgLjU4My4xNjljLjA3NS4wNTMuMDg5LjA3Mi4xNTQuMTM2LjA4OS4wOTcuMTc5LjE5Mi4yNzEuMjg3LjE1My4xNTYuMzEuMzA2LjQ3LjQ1NGwuMDcyLjA3M2MuMDU3LjA3Mi4wNzQuMDg4LjExOC4xNjlhLjk0My45NDMgMCAwIDEgLjExNS40OTZjLS4wMDQuMDkyLS4wMTMuMTE0LS4wMzIuMjAzTDguOCAyNy4wODdhMi43NCAyLjc0IDAgMCAwLS4wODIuNTQ3Yy0uMDAyLjAzNC0uMDAyLjA2NS0uMDAyLjA5OS4wMDMuMTI4LjAxNi4yODEuMDk4LjM4NmEuNDY2LjQ2NiAwIDAgMCAuMTguMTMzLjM1LjM1IDAgMCAwIC4xNDkuMDMxLjU4LjU4IDAgMCAwIC4xODktLjAzOWMuMDktLjAzMy4xNzUtLjA3OC4yNTUtLjEzLjE0OC0uMDk0LjI4MS0uMjA4LjQwNy0uMzI5bDEuOTM1LTEuOTVjLjA2OC0uMDYyLjA4My0uMDguMTYtLjEzYS45NTQuOTU0IDAgMCAxIC4zODUtLjE0MWMuMDkyLS4wMTEuMTE1LS4wMDcuMjA3LS4wMDRsLjEwMi4wMTV6bTMuMzAzLTE2LjI1NGE2LjY3OCA2LjY3OCAwIDAgMSAyLjczOC42MjQgNi43MzYgNi43MzYgMCAwIDEgMi45NzEgMi43MyA2LjY3IDYuNjcgMCAwIDEgLjgyIDQuMjU4IDYuNjYgNi42NiAwIDAgMS0xLjk0OCAzLjg0NyA2LjY5IDYuNjkgMCAwIDEtMi4wNjYgMS4zNzUgNi43MDcgNi43MDcgMCAwIDEtNS4wNS4wNjIgNi42OTUgNi42OTUgMCAwIDEtNC4xNTMtNS4yMDEgNi42OCA2LjY4IDAgMCAxIDYuNjg4LTcuNjk1em0tLjE0OCAxLjg4M2E0LjgzIDQuODMgMCAwIDAtMS45NjQuNDQ3IDQuODE0IDQuODE0IDAgMCAwLTIuMzcxIDIuNDI4IDQuNzk2IDQuNzk2IDAgMCAwLS4yNjMgMy4wNjRjLjA5Mi4zNzkuMjMxLjc0Ny40MTQgMS4wOTJhNC44NDEgNC44NDEgMCAwIDAgMi4zOCAyLjE4NmMuNTcuMjQyIDEuMTg2LjM2OSAxLjgwNC4zNzZhNC43ODMgNC43ODMgMCAwIDAgMy4zMy0xLjI4NCA0LjgzOSA0LjgzOSAwIDAgMCAxLjAzMi0xLjM4MWMuMjEtLjQyMi4zNTYtLjg3NS40MzMtMS4zNGE0LjgzMyA0LjgzMyAwIDAgMCAwLTEuNTgzIDQuNzc1IDQuNzc1IDAgMCAwLS40MDgtMS4yODggNC44MzQgNC44MzQgMCAwIDAtMi4yNDUtMi4yNDUgNC44NCA0Ljg0IDAgMCAwLTIuMTQyLS40NzJ6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWhlYXJ0LWNpcmNsZVwiIGRhdGEtbmFtZT1cImhlYXJ0LWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTEuMjI4IDYuODI5Yy40NTEuMDI4Ljg5NC4xMDEgMS4zMjYuMjM1IDEuNDg4LjQ2MSAyLjcxMiAxLjU2NCAzLjQ2OSAyLjkxMi4wODItLjE0Ni4xNzMtLjI4Ny4yNjQtLjQyNy40ODktLjcxOCAxLjA4Ni0xLjM1NCAxLjgxNi0xLjgzYTUuNTI0IDUuNTI0IDAgMCAxIDEuNzg1LS43NjEgNS40NzggNS40NzggMCAwIDEgMS43MjctLjExMiA1Ljc1NyA1Ljc1NyAwIDAgMSAyLjU5OS45MTQgNi4yMTIgNi4yMTIgMCAwIDEgMi4xNzQgMi40NzMgNi45OCA2Ljk4IDAgMCAxIC42NjEgMi4zMzZjLjAzOS4zNzUuMDU1Ljc1NC4wMzMgMS4xMy0uMDQ0Ljc5My0uMjU0IDEuNTctLjU0OSAyLjMwNS0uNDQyIDEuMDk4LTEuMDcyIDIuMTE2LTEuNzcgMy4wNjgtMS4yMjQgMS42NzEtMi42NzQgMy4xNzQtNC4xOTMgNC41NzdhNDcuMDU2IDQ3LjA1NiAwIDAgMS0zLjk0NCAzLjI4M2wtLjA3MS4wNDhhMS4wNDIgMS4wNDIgMCAwIDEtLjgzLjEwNiAxLjE1MiAxLjE1MiAwIDAgMS0uMjM1LS4xMDZjLS4xNzctLjEyLS4zNDYtLjI1My0uNTE3LS4zODNhNTEuOTk0IDUxLjk5NCAwIDAgMS0zLjQ5Ny0yLjk0OGMtMS4xNzYtMS4wODctMi4zMDMtMi4yMzMtMy4zMjUtMy40NjctLjcwMi0uODQ4LTEuMzU2LTEuNzM5LTEuOTA2LTIuNjkzLS40MDktLjcxLS43NjItMS40NTgtLjk5OC0yLjI0M2E2Ljc3IDYuNzcgMCAwIDEtLjI4Mi0xLjU0NiA2Ljk3OSA2Ljk3OSAwIDAgMSAuMDE4LS45N2MuMDgxLS45Ni4zNDYtMS45MDYuODA5LTIuNzUzQTYuMjE0IDYuMjE0IDAgMCAxIDcuNjEgNy45MTNhNS45MyA1LjkzIDAgMCAxIDEuMjg1LS43IDUuODYgNS44NiAwIDAgMSAxLjgwMi0uMzg1Yy4xNzgtLjAwNi4zNTQtLjAwNi41MzEuMDAxem05Ljc3OCAyLjAyNWMtLjMxLjAxMi0uNjE1LjA1OC0uOTEyLjE1LS4yMjQuMDctLjQ0MS4xNjItLjY0Ni4yNzUtMS4xNjkuNjQxLTEuODc3IDEuODcxLTIuMjY3IDMuMTA3YTkuNjAyIDkuNjAyIDAgMCAwLS4xNzMuNjI0bC0uMDI2LjA4NmMtLjA2Ny4xNy0uMTU5LjMyLS4yOTkuNDRhMS4wMjcgMS4wMjcgMCAwIDEtMS4zODYtLjA2MSAxLjExIDEuMTEgMCAwIDEtLjIzNC0uMzc5Yy0uMDU1LS4xODYtLjA5OS0uMzc1LS4xNTMtLjU2Mi0uMzc3LTEuMjM0LTEuMDIzLTIuNDY3LTIuMTU0LTMuMTYzYTMuNDA1IDMuNDA1IDAgMCAwLTEuNjMxLS41MTMgMy41MTIgMy41MTIgMCAwIDAtMS4wMDEuMDkzIDMuNzggMy43OCAwIDAgMC0uODA0LjI5NGMtLjgzMy40MTgtMS40OSAxLjEzMS0xLjg4IDEuOTczYTQuOTYgNC45NiAwIDAgMC0uNDIyIDEuNTYzYy0uMDQyLjQwNi0uMDQ0LjgxNS4wMiAxLjIxOS4xMDQuNjQ2LjM0NCAxLjI2Ny42MzMgMS44NTIuNDQ1LjkwMiAxLjAxOSAxLjczOCAxLjYzNyAyLjUyOS44MDYgMS4wMzIgMS43MDEgMS45OTMgMi42MzYgMi45MDlhNDguMzY1IDQ4LjM2NSAwIDAgMCA0LjA0MyAzLjUyNGwuMDM2LjAyN2E0Ny4wMTEgNDcuMDExIDAgMCAwIDIuOTQ1LTIuNDc5IDM5LjA5OSAzOS4wOTkgMCAwIDAgMi4yNzYtMi4yNGMuOTc4LTEuMDUgMS45MDMtMi4xNjcgMi42NDktMy4zOTUuNDcyLS43NzcuODg4LTEuNjE3IDEuMDc2LTIuNTEyLjA5OS0uNDc0LjExLS45NTMuMDYtMS40MzNhNC45NTUgNC45NTUgMCAwIDAtLjM4LTEuNDcxIDQuMTgxIDQuMTgxIDAgMCAwLTEuNjkyLTEuOTQgMy42ODcgMy42ODcgMCAwIDAtMS43ODItLjUxN2gtLjE2OXpcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbG9jay1jaXJjbGVcIiBkYXRhLW5hbWU9XCJsb2NrLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNOS41NTggMTEuMTM0Yy4wMDEtLjMzOC4wMDctLjY3Ni4wMTEtMS4wMTRhNi42NDYgNi42NDYgMCAwIDEgLjQ0NS0yLjE5NCA2LjQ4MiA2LjQ4MiAwIDAgMSAzLjc3NS0zLjY4MyA2LjY0NSA2LjY0NSAwIDAgMSAyLjA0NS0uMzg4Yy4xNjYtLjAwMi4xNjUtLjAwMi4zMzIgMGE2LjY0NSA2LjY0NSAwIDAgMSAyLjA0NS4zODggNi40ODUgNi40ODUgMCAwIDEgMy43NzUgMy42ODNjLjI3Ny43MDIuNDE2IDEuNDQxLjQ0NSAyLjE5NC4wMDQuMzM4LjAxLjY3Ni4wMTIgMS4wMTQuNjM0LjAyIDEuMjY5LjA0NCAxLjkwMy4wN2EuOTI2LjkyNiAwIDAgMSAuNzY2LjU0NiAxIDEgMCAwIDEgLjA3NC4yOTRjLjE3OSA0LjMxLjAwNCA4LjYyNy4wMDQgMTIuOTQxYTEuMDc1IDEuMDc1IDAgMCAxLS4wNS4yOTguOTI2LjkyNiAwIDAgMS0uNzk0LjYxOGMtNS41MzQuMjI5LTExLjA3OC4wMDMtMTYuNjE3LjAwM2EuOTIzLjkyMyAwIDAgMS0uOTE1LS44NDNjLS4xNzktNC4zMS0uMDA0LTguNjI4LS4wMDQtMTIuOTQxLjAwNS0uMTAzLjAxNy0uMjAxLjA1LS4yOTlhLjkyNi45MjYgMCAwIDEgLjUtLjU0M2MuMDk1LS4wNDEuMTkyLS4wNjIuMjk0LS4wNzQuNjM0LS4wMjYgMS4yNjktLjA1IDEuOTA0LS4wN3ptMTMuNzk0IDEuOTA1SDguNjQ4djExLjAyN2gxNC43MDRWMTMuMDM5em0tOC4zMDMgNS4yNDhhMS44NiAxLjg2IDAgMCAxLS44ODUtMS42NjcgMS44NCAxLjg0IDAgMCAxIC40MTktMS4wNzdjLjE1LS4xODEuMzM1LS4zMzMuNTQyLS40NDUuMjQzLS4xMzIuNTA2LS4xOTkuNzgxLS4yMTkuMDk1LS4wMDMuMDk0LS4wMDMuMTg4IDAgLjI3NS4wMi41MzguMDg3Ljc4MS4yMTkuMjA3LjExMi4zOTMuMjY0LjU0My40NDUuMTMyLjE2MS4yMzcuMzQ0LjMwOS41MzkuMDYzLjE3My4wOTkuMzU1LjEwOS41MzhhMS44NiAxLjg2IDAgMCAxLS45MDIgMS42NzdjLjAyMyAxLjAyOS4wNDMgMi4wNTktLjAxOCAzLjA4NWEuOTQ4Ljk0OCAwIDAgMS0uMTM2LjQxMy45MjYuOTI2IDAgMCAxLTEuMzQxLjI0Mi45Mi45MiAwIDAgMS0uMzU1LS42NTUgMzIuMjcgMzIuMjcgMCAwIDEtLjAzNS0zLjA5NXptNS41NDItNy4yMDRjLjAwMi0uMzA1LjAwNi0uNjExLjAwMi0uOTE3YTQuNzE2IDQuNzE2IDAgMCAwLS4zNTktMS42NjkgNC42MzUgNC42MzUgMCAwIDAtMi44NjgtMi42IDQuNjAyIDQuNjAyIDAgMCAwLTEuNjAzLS4yIDQuNTgzIDQuNTgzIDAgMCAwLTMuOTA1IDIuNTk2IDQuNzEyIDQuNzEyIDAgMCAwLS40NTEgMS44NzNjLS4wMDQuMzA2IDAgLjYxMi4wMDMuOTE3IDMuMDU5LS4wNjkgNi4xMjEtLjA2OSA5LjE4MSAwelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA1NCAzMlwiIHdpZHRoPVwiNTRcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0zMi4yMDcgMjUuOTQ2TDIxLjcyMSAzMmwtMTEuMjM1LTYuNDg2TDAgMTkuNDU5VjYuNDg2TDExLjIzNSAwbDEwLjQ4NiA2LjA1NEwzMi4yMDYgMGwxMS4yMzUgNi40ODYgMTAuNDg2IDYuMDU1djEyLjk3M0w0Mi42OTMgMzJsLTEwLjQ4Ni02LjA1NHptLjY2MS0xLjM0M1YxNC4yN2w5LjA1MyA1LjE5LjAwMiAxMC4zNzgtOS4wNTUtNS4yMzV6bS0yMC44ODUuMDQ2VjE0LjI3bDkuMDg1IDUuMjE4LjAwMiAxMC40NDEtOS4wODYtNS4yOGgtLjAwMXpNMS40OTggMTguNTk1VjguMjE2bDguOTg4IDUuMTg5djEwLjM3OWwtOC45ODgtNS4xODl6TTIxLjcyMSA3Ljc4NGw4Ljk4OCA1LjE4OS04Ljk4OCA1LjE5LTguOTg5LTUuMTkgOC45ODktNS4xODl6bTIwLjk3MiAwbDguOTg4IDUuMTg5LTguOTg4IDUuMTktOC45ODktNS4xOSA4Ljk4OS01LjE4OXpNMTEuMjM1IDEuNzI5bDguOTg4IDUuMTktOC45ODggNS4xODktOC45ODktNS4xODkgOC45ODktNS4xODl2LS4wMDF6bTIwLjk3MSAwbDguOTg5IDUuMTktOC45ODkgNS4xODktOC45ODgtNS4xODkgOC45ODgtNS4xODl2LS4wMDF6XCIvPjxwYXRoIGQ9XCJNMS40MzcgMTguNjQzTDEuNDQyIDguMTFsMTkuNjUyIDExLjM1LjAwOSAxMC41NDVMMS40MzcgMTguNjQzem0zMS4zNjkgNS45OTlsLjAzLTEwLjQ2MyA5LjE0OCA1LjI0NC0uMDA5IDEwLjU4Mi05LjE2OS01LjM2M3pcIiBmaWxsLW9wYWNpdHk9XCIuMzQ1XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbWVzc2FnZS1jaXJjbGVcIiBkYXRhLW5hbWU9XCJtZXNzYWdlLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTcuMzQyIDIzLjU4MmwtMy41MzEgMy41MzEtLjA2NS4wNThhLjk4Ljk4IDAgMCAxLS4zOTIuMTg2LjkuOSAwIDAgMS0uOTYxLS40NTUuOTc4Ljk3OCAwIDAgMS0uMTA2LS40MnYtMi45bC0uMjYxLS4wMDNjLS4yMDQtLjAwOC0uMjA0LS4wMDgtLjQwOC0uMDIxYTcuOTY4IDcuOTY4IDAgMCAxLTIuODUxLS43NjkgOC4xMTggOC4xMTggMCAwIDEtMy4yNzMtMi45MDIgOC4wMSA4LjAxIDAgMCAxLTEuMDEyLTIuMzEzIDcuOTg3IDcuOTg3IDAgMCAxIC4zMDQtNC45MjUgOC4wNyA4LjA3IDAgMCAxIDMuOTgyLTQuMjgxIDcuOTUgNy45NSAwIDAgMSAzLjI1OC0uNzljMi42NjUtLjAzNCA1LjMzMS0uMDM0IDcuOTk2IDBhNy45MjYgNy45MjYgMCAwIDEgMy4yNTguNzkxIDguMDU0IDguMDU0IDAgMCAxIDMuOTgxIDQuMjggNy45NTYgNy45NTYgMCAwIDEtLjcwOCA3LjIzOCA4LjEwNyA4LjEwNyAwIDAgMS0zLjYyNyAzLjA2MyA3Ljk2MiA3Ljk2MiAwIDAgMS0zLjEwNC42MzJoLTIuNDh6bS4xMjMtNS44MjZjLjEyOC4wMS4yNS4wNC4zNjQuMDk5YS45MDQuOTA0IDAgMCAxIC4yNi4yMDQuOTAyLjkwMiAwIDAgMSAuMDU5IDEuMTAxLjkwOC45MDggMCAwIDEtLjE5OC4yMDMuOTI1LjkyNSAwIDAgMS0uNDg1LjE3NWMtMi4yMDUuMDU5LTQuNDEyLjA1OS02LjYxNyAwYS45MjUuOTI1IDAgMCAxLS40ODUtLjE3NS45LjkgMCAwIDEtLjI5LTEuMDYzLjg4OS44ODkgMCAwIDEgLjc3NS0uNTQ0YzIuMjA1LS4wNTkgNC40MTItLjA1OSA2LjYxNyAwem0zLjc0Ny0yLjg0N2EuOTI0LjkyNCAwIDAgMSAuNDkzLjE5LjkuOSAwIDAgMSAuMTY2IDEuMjI5LjkuOSAwIDAgMS0uMjY0LjIzOS45NS45NSAwIDAgMS0uMzk1LjEyMiAxNTQuNzMgMTU0LjczIDAgMCAxLTEwLjM3NiAwIC45MjcuOTI3IDAgMCAxLS40OTQtLjE5LjkuOSAwIDAgMS0uMTY1LTEuMjI5LjkuOSAwIDAgMSAuMjY0LS4yMzkuOTQ1Ljk0NSAwIDAgMSAuMzk1LS4xMjIgMTU0LjczIDE1NC43MyAwIDAgMSAxMC4zNzYgMHptMC0yLjg0OGEuOTUuOTUgMCAwIDEgLjM5NS4xMjIuOS45IDAgMCAxIC4yNjQuMjM5LjkuOSAwIDAgMS0uMTY2IDEuMjI5LjkzMy45MzMgMCAwIDEtLjQ5My4xOTFjLTMuNDU3LjExNS02LjkxOS4xMTUtMTAuMzc2IDBhLjkzNi45MzYgMCAwIDEtLjQ5NC0uMTkxLjkuOSAwIDAgMS0uMTY1LTEuMjI5LjkuOSAwIDAgMSAuMjY0LS4yMzkuOTQ1Ljk0NSAwIDAgMSAuMzk1LS4xMjIgMTU0LjczIDE1NC43MyAwIDAgMSAxMC4zNzYgMHpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1uby1jaXJjbGVcIiBkYXRhLW5hbWU9XCJuby1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTZcIiBjeT1cIjE2XCIgcj1cIjE2XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE2LjI4OCAzLjkzMWMuNDguMDE3Ljk1OC4wNTEgMS40MzQuMTIgMS4xOTkuMTczIDIuMzcuNTI5IDMuNDYzIDEuMDUyYTEyLjA3NCAxMi4wNzQgMCAwIDEgNS4xNTMgNC43MjcgMTEuOTMyIDExLjkzMiAwIDAgMSAxLjMxOSAzLjI0MiAxMi4wNjIgMTIuMDYyIDAgMCAxLS40MjkgNy4wOTkgMTIuMDkzIDEyLjA5MyAwIDAgMS02LjcxMyA2Ljg3OCAxMi4wNDYgMTIuMDQ2IDAgMCAxLTkuMDMgMCAxMi4wOSAxMi4wOSAwIDAgMS01LjU4OS00LjY0MyAxMS45NTMgMTEuOTUzIDAgMCAxLTEuODkzLTYuMTkgMTIuMDMxIDEyLjAzMSAwIDAgMSAuNDEyLTMuNDI1Yy4zMTgtMS4xODEuODItMi4zMTIgMS40ODEtMy4zNDJhMTIuMDg5IDEyLjA4OSAwIDAgMSA0LjkxOS00LjM0NiAxMS45NjggMTEuOTY4IDAgMCAxIDQuODk3LTEuMTcyYy4yODktLjAwNC4yODgtLjAwNC41NzYgMHptNy4zODMgNS44NjhMOS44NzMgMjMuNTk4YTkuNzc4IDkuNzc4IDAgMCAwIDIuNDMyIDEuNDI5IDkuODUzIDkuODUzIDAgMCAwIDcuMzkgMCA5Ljg5MyA5Ljg5MyAwIDAgMCA1LjQ5MS01LjYyNiA5Ljg2NSA5Ljg2NSAwIDAgMCAuMjkyLTYuMDQxIDkuNzU3IDkuNzU3IDAgMCAwLTEuODA3LTMuNTYxem0tMS41NDMtMS41NDJhOS43MzcgOS43MzcgMCAwIDAtNC43MTgtMi4wNDZjLS4zOS0uMDU3LS43ODEtLjA4NC0xLjE3NS0uMDk5LS4yMzUtLjAwMy0uMjM0LS4wMDMtLjQ3MSAwYTkuNzk5IDkuNzk5IDAgMCAwLTQuMDA3Ljk1OSA5Ljg5OSA5Ljg5OSAwIDAgMC00LjAyNSAzLjU1OCA5LjcyOCA5LjcyOCAwIDAgMC0xLjIxIDIuNzMxIDkuODk1IDkuODk1IDAgMCAwLS4zMzggMi44MDMgOS43NTMgOS43NTMgMCAwIDAgMi4xNDUgNS44OTNMMjIuMTI4IDguMjU3elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBlbmNpbC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJwZW5jaWwtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjkyNSAxOC4xNjVjMy44NTctNC4xOTMgOC4wNTctOC4wNTggMTIuMDg2LTEyLjA4N2EuOTg3Ljk4NyAwIDAgMSAuNDE2LS4yNDFjLjA3LS4wMTguMDg4LS4wMTguMTYtLjAyOC4wODEtLjAwMy4wODEtLjAwMy4xNjIgMCAuMDcxLjAxLjA4OS4wMS4xNTkuMDI4LjEzNC4wMzYuMjQ4LjEwMi4zNTcuMTg2IDEuNjM0IDEuNDk3IDMuMTM3IDMuMTMyIDQuNzA0IDQuNjk5YS45MzcuOTM3IDAgMCAxIC4yMTYuOTc1IDEuMDEgMS4wMSAwIDAgMS0uMTYxLjI3OWMtMy44NjQgNC4yMTctOC4wODYgOC4wOTItMTIuMTMxIDEyLjEzNmEuOTMzLjkzMyAwIDAgMS0uMzI3LjIxMmMtMi4xNjQuNzE4LTQuMzg0IDEuMjU2LTYuNTc3IDEuODgyYTEuMDAzIDEuMDAzIDAgMCAxLS40MDguMDI0Ljk0Ljk0IDAgMCAxLS43NDctLjY4NCAxLjAyIDEuMDIgMCAwIDEtLjAxMy0uNDA4Yy41MjktMi4yMTkgMS4yNTEtNC4zODkgMS44NzctNi41ODJsLjAyLS4wNTVhLjkzOS45MzkgMCAwIDEgLjE0OC0uMjY4bC4wMTYtLjAyMS4wMTctLjAyLjAyNi0uMDI3em0uMTYxIDUuNzk2bDMuMzM0LS45NTNhNzUuNzE5IDc1LjcxOSAwIDAgMS0yLjM5LTIuMzUxbC0uOTQ0IDMuMzA0em01LjE4NC0xLjg1M2w3LjAxMy03LjAxMy0zLjMzMS0zLjMzMS03LjAzMSA3LjAzMWMxLjEzOSAxLjA4MiAyLjI4IDIuMTY0IDMuMzQ5IDMuMzEzem00Ljk5Ni0xMS42NThsMy4zMzEgMy4zMzEgMi40MDItMi40MDItMy4zMzEtMy4zMzEtMi40MDIgMi40MDJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGx1cy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJwbHVzLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjMuMjQgMTcuMzc2aC01Ljc5MnY1Ljc5MmExLjQ0OCAxLjQ0OCAwIDAgMS0yLjg5NiAwdi01Ljc5Mkg4Ljc2YTEuNDQ5IDEuNDQ5IDAgMCAxIDAtMi44OTZoNS43OTJWOC42ODhhMS40NDkgMS40NDkgMCAwIDEgMi44OTYgMHY1Ljc5Mmg1Ljc5MmExLjQ0OSAxLjQ0OSAwIDAgMSAwIDIuODk2XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXByb2dyZXNzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInByb2dyZXNzLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIxLjI4OGMtLjU3OSAwLTEuMDQ4LjQ2OS0xLjA0OCAxLjA0OHYzLjUyMWExLjA0OCAxLjA0OCAwIDEgMCAyLjA5NiAwdi0zLjUyMWMwLS41NzktLjQ3LTEuMDQ4LTEuMDQ4LTEuMDQ4XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI1Ljk1NSAxNC44OTlsLTMuNDU4LS4wMDdjLS41OTcuMDEzLTEuMDUuNDY3LTEuMDUgMS4wNDZhMS4wNDcgMS4wNDcgMCAwIDAgMS4wNDYgMS4wNWwzLjQ1OC4wMDdoLjAwMmExLjA1IDEuMDUgMCAwIDAgLjAwMi0yLjA5NlwiIGZpbGwtb3BhY2l0eT1cIi4yNTFcIi8+PHBhdGggZD1cIk0xNi4wMjUgMi44MzJoLS4wMDNjLS41NzcgMC0xLjA0NS40NjgtMS4wNDcgMS4wNDZsLS4wMTEgNS40NmExLjA0OCAxLjA0OCAwIDAgMCAxLjA0NSAxLjA1aC4wMDNjLjU3OCAwIDEuMDQ2LS40NjcgMS4wNDctMS4wNDVsLjAxMS01LjQ2MWExLjA0NiAxLjA0NiAwIDAgMC0xLjA0NS0xLjA1XCIvPjxwYXRoIGQ9XCJNMTMuNzUxIDIwLjgxMWExLjA0NyAxLjA0NyAwIDAgMC0xLjM3Mi41NjRsLTEuMzc0IDMuMjk4YTEuMDUzIDEuMDUzIDAgMCAwIC45NjYgMS40NTJjLjQxMSAwIC44LS4yNDMuOTY4LS42NDdsMS4zNzQtMy4yOTdhMS4wNDUgMS4wNDUgMCAwIDAtLjU2Mi0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjZcIi8+PHBhdGggZD1cIk0xOS42MDQgMjEuMzkzYTEuMDQ3IDEuMDQ3IDAgMSAwLTEuOTM4Ljc5NmwxLjM1NSAzLjI5OWExLjA1IDEuMDUgMCAwIDAgMS45MzktLjc5NWwtMS4zNTYtMy4zelwiIGZpbGwtb3BhY2l0eT1cIi40XCIvPjxwYXRoIGQ9XCJNOS41IDE2Ljk2NGguMDAyYTEuMDQ5IDEuMDQ5IDAgMCAwIC4wMDItMi4wOTZsLTMuNDU1LS4wMDdoLS4wMDJhMS4wNDcgMS4wNDcgMCAwIDAtLjAwMiAyLjA5NmwzLjQ1NS4wMDd6XCIgZmlsbC1vcGFjaXR5PVwiLjkwMlwiLz48cGF0aCBkPVwiTTIxLjA3NSAxMy44MjlhMS4wNDYgMS4wNDYgMCAwIDAgMS4zNjguNTdsMy4xNTgtMS4yOTVjLjUzNC0uMjIuNzktLjgzMy41NjktMS4zNjZhMS4wNDQgMS4wNDQgMCAwIDAtMS4zNjctLjU3bC0zLjE1OCAxLjI5NGMtLjUzNi4yMi0uNzkuODMzLS41NyAxLjM2N1wiIGZpbGwtb3BhY2l0eT1cIi4yXCIvPjxwYXRoIGQ9XCJNMTAuOTkyIDE3Ljk5YTEuMDQzIDEuMDQzIDAgMCAwLTEuMzY3LS41N2wtMy4yMjggMS4zMzJhMS4wNDcgMS4wNDcgMCAwIDAgLjM5OSAyLjAxNmMuMTMyIDAgMS41NTgtLjU1OCAxLjY4OS0uNjEzbDEuOTM4LS43OThjLjUzNS0uMjIuNzktLjgzMy41NjktMS4zNjdcIiBmaWxsLW9wYWNpdHk9XCIuOFwiLz48cGF0aCBkPVwiTTIxLjI4MSAxOS43NWExLjA0NyAxLjA0NyAwIDEgMC0xLjQ4MyAxLjQ4bDIuNDgyIDIuNDlhMS4wNDUgMS4wNDUgMCAwIDAgMS40ODIuMDAyIDEuMDQ3IDEuMDQ3IDAgMCAwIC4wMDQtMS40ODJsLTIuNDg1LTIuNDl6XCIgZmlsbC1vcGFjaXR5PVwiLjM0OVwiLz48cGF0aCBkPVwiTTE5LjkwMiAxMi4wNGExLjA0OCAxLjA0OCAwIDAgMCAxLjQ4My4wMDNsMi40MDUtMi4zOTdhMS4wNDggMS4wNDggMCAwIDAtMS40NzktMS40ODVsLTIuNDA0IDIuMzk3YTEuMDQ3IDEuMDQ3IDAgMCAwLS4wMDUgMS40ODJcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguMTMgMTAuODEzYTEuMDUgMS4wNSAwIDAgMCAxLjM3MS0uNTY1bDEuMjkxLTMuMTA3YTEuMDQ3IDEuMDQ3IDAgMSAwLTEuOTM1LS44MDRsLTEuMjkxIDMuMTA2Yy0uMjIyLjUzNC4wMyAxLjE0Ny41NjQgMS4zN1wiIGZpbGwtb3BhY2l0eT1cIi4xMDJcIi8+PHBhdGggZD1cIk0xMy4xNzYgNi4zMjZhMS4wNDkgMS4wNDkgMCAwIDAtMS45MzcuOGwxLjI4NiAzLjExNWExLjA0NSAxLjA0NSAwIDAgMCAxLjM2Ny41NjljLjUzNi0uMjIuNzktLjgzMy41Ny0xLjM2N2wtMS4yODYtMy4xMTd6TTEwLjYyNiAxMi4wMTVhMS4wNSAxLjA1IDAgMCAwIDEuNDgyLjAwMyAxLjA0OCAxLjA0OCAwIDAgMCAuMDAyLTEuNDgyTDkuNzE3IDguMTM3YTEuMDQ3IDEuMDQ3IDAgMSAwLTEuNDg1IDEuNDc5bDIuMzk0IDIuMzk5elwiLz48cGF0aCBkPVwiTTEyLjE4NiAxOS43MjlhMS4wNDcgMS4wNDcgMCAwIDAtMS40ODItLjAwM0w4LjIwOCAyMi4yMWExLjA0NyAxLjA0NyAwIDAgMCAxLjQ3OSAxLjQ4NWwyLjQ5NS0yLjQ4NWMuNDEtLjQwOC40MTEtMS4wNzEuMDA0LTEuNDgxXCIgZmlsbC1vcGFjaXR5PVwiLjcwMlwiLz48cGF0aCBkPVwiTTI1LjU5IDE4Ljc4N2wtMy4yMTQtMS4zMzhhMS4wNDcgMS4wNDcgMCAxIDAtLjgwNSAxLjkzNWwzLjIxMyAxLjMzOGExLjA1IDEuMDUgMCAwIDAgLjgwNi0xLjkzNVwiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk02LjQwNyAxMy4wNjlsMy4xNTkgMS4zMTVhMS4wNDcgMS4wNDcgMCAwIDAgMS4zNjktLjU2NiAxLjA0OCAxLjA0OCAwIDAgMC0uNTY0LTEuMzdsLTMuMTU3LTEuMzE0YTEuMDQ5IDEuMDQ5IDAgMCAwLS44MDcgMS45MzVcIi8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcHJvZ3Jlc3NcIiBkYXRhLW5hbWU9XCJwcm9ncmVzc1wiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsPVwibm9uZVwiLz48ZyBmaWxsLXJ1bGU9XCJub256ZXJvXCI+PHBhdGggZD1cIk0xNiAyMi45MTVjLS43NTggMC0xLjM3LjYxMy0xLjM3IDEuMzd2NC42MDVhMS4zNyAxLjM3IDAgMSAwIDIuNzQgMHYtNC42MDVhMS4zNyAxLjM3IDAgMCAwLTEuMzctMS4zN1wiIGZpbGwtb3BhY2l0eT1cIi41MDJcIi8+PHBhdGggZD1cIk0yOS4wMTggMTQuNTYxbC00LjUyMi0uMDA5Yy0uNzgxLjAxNi0xLjM3My42MDktMS4zNzMgMS4zNjdhMS4zNyAxLjM3IDAgMCAwIDEuMzY4IDEuMzczbDQuNTIxLjAwOWguMDAzYTEuMzcxIDEuMzcxIDAgMCAwIC4wMDMtMi43NFwiIGZpbGwtb3BhY2l0eT1cIi4yNTFcIi8+PHBhdGggZD1cIk0xNi4wMzMuMjQyaC0uMDAyYTEuMzcgMS4zNyAwIDAgMC0xLjM3IDEuMzY3bC0uMDE2IDUuNjhhMS4zNzEgMS4zNzEgMCAwIDAgMS4zNjcgMS4zNzNoLjAwM2ExLjM3IDEuMzcgMCAwIDAgMS4zNy0xLjM2OGwuMDE2LTUuNjc5QTEuMzY4IDEuMzY4IDAgMCAwIDE2LjAzMy4yNDJcIi8+PHBhdGggZD1cIk0xMy4wNTkgMjIuMjkxYTEuMzcgMS4zNyAwIDAgMC0xLjc5NC43MzdsLTEuNzk3IDQuMzEzYy0uMjkxLjY5OC4wMzkgMS41LjczNiAxLjc5YTEuMzYgMS4zNiAwIDAgMCAxLjc5NC0uNzM3bDEuNzk2LTQuMzExYTEuMzY4IDEuMzY4IDAgMCAwLS43MzUtMS43OTJcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTIwLjcxMyAyMy4wNTJhMS4zNyAxLjM3IDAgMSAwLTIuNTM1IDEuMDQxbDEuNzczIDQuMzE0YTEuMzcgMS4zNyAwIDEgMCAyLjUzNi0xLjAzOWwtMS43NzQtNC4zMTZ6XCIgZmlsbC1vcGFjaXR5PVwiLjRcIi8+PHBhdGggZD1cIk03LjUwMSAxNy4yNmguMDAyYTEuMzcgMS4zNyAwIDAgMCAuMDAzLTIuNzRsLTQuNTE4LS4wMDloLS4wMDNjLS43NTYgMC0xLjM3LjYxMS0xLjM3IDEuMzY3YTEuMzY4IDEuMzY4IDAgMCAwIDEuMzY3IDEuMzczbDQuNTE5LjAwOXpcIiBmaWxsLW9wYWNpdHk9XCIuOTAyXCIvPjxwYXRoIGQ9XCJNMjIuNjM2IDEzLjE2MmExLjM3IDEuMzcgMCAwIDAgMS43ODkuNzQ1bDQuMTMtMS42OTRhMS4zNjggMS4zNjggMCAwIDAgLjc0NC0xLjc4NiAxLjM2NSAxLjM2NSAwIDAgMC0xLjc4OC0uNzQ1bC00LjEzIDEuNjkyYTEuMzY5IDEuMzY5IDAgMCAwLS43NDUgMS43ODhcIiBmaWxsLW9wYWNpdHk9XCIuMlwiLz48cGF0aCBkPVwiTTkuNDUxIDE4LjYwMmExLjM2MyAxLjM2MyAwIDAgMC0xLjc4OC0uNzQ1bC00LjIyIDEuNzQxYTEuMzY5IDEuMzY5IDAgMCAwLS43NDUgMS43ODdjLjIxNy41My43MjguODUxIDEuMjY3Ljg1MS4xNzIgMCAyLjAzNi0uNzMxIDIuMjA4LS44MDJsMi41MzQtMS4wNDRhMS4zNjggMS4zNjggMCAwIDAgLjc0NC0xLjc4OFwiIGZpbGwtb3BhY2l0eT1cIi44XCIvPjxwYXRoIGQ9XCJNMjIuOTA2IDIwLjkwNGExLjM3IDEuMzcgMCAwIDAtMS45NCAxLjkzNWwzLjI0NiAzLjI1NmExLjM3IDEuMzcgMCAxIDAgMS45NDMtMS45MzVsLTMuMjQ5LTMuMjU2elwiIGZpbGwtb3BhY2l0eT1cIi4zNDlcIi8+PHBhdGggZD1cIk0yMS4xMDMgMTAuODIyYTEuMzcxIDEuMzcxIDAgMCAwIDEuOTM5LjAwNGwzLjE0NS0zLjEzNWExLjM3IDEuMzcgMCAxIDAtMS45MzUtMS45NDJsLTMuMTQzIDMuMTM1YTEuMzY5IDEuMzY5IDAgMCAwLS4wMDYgMS45MzhcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguNzg2IDkuMjE3YTEuMzczIDEuMzczIDAgMCAwIDEuNzkyLS43MzhsMS42ODktNC4wNjNhMS4zNyAxLjM3IDAgMCAwLTIuNTMxLTEuMDUybC0xLjY4OSA0LjA2MWMtLjI5LjY5OS4wNCAxLjUuNzM5IDEuNzkyXCIgZmlsbC1vcGFjaXR5PVwiLjEwMlwiLz48cGF0aCBkPVwiTTEyLjMwNyAzLjM1YTEuMzcgMS4zNyAwIDAgMC0yLjUzMyAxLjA0NmwxLjY4MiA0LjA3NGExLjM2OCAxLjM2OCAwIDAgMCAxLjc4OC43NDMgMS4zNjggMS4zNjggMCAwIDAgLjc0NS0xLjc4N0wxMi4zMDcgMy4zNXpNOC45NzMgMTAuNzg5YTEuMzcgMS4zNyAwIDAgMCAxLjkzNy4wMDQgMS4zNjkgMS4zNjkgMCAwIDAgLjAwMy0xLjkzOEw3Ljc4NCA1LjcxOGExLjM2OSAxLjM2OSAwIDAgMC0xLjkzNy0uMDA0IDEuMzY5IDEuMzY5IDAgMCAwLS4wMDQgMS45MzhsMy4xMyAzLjEzN3pcIi8+PHBhdGggZD1cIk0xMS4wMTIgMjAuODc2YTEuMzY5IDEuMzY5IDAgMCAwLTEuOTM3LS4wMDRMNS44MSAyNC4xMjFhMS4zNyAxLjM3IDAgMCAwIC45NjkgMi4zNGMuMzQ4IDAgLjY5OS0uMTMxLjk2Ni0uMzk5bDMuMjYzLTMuMjQ5YTEuMzcgMS4zNyAwIDAgMCAuMDA0LTEuOTM3XCIgZmlsbC1vcGFjaXR5PVwiLjcwMlwiLz48cGF0aCBkPVwiTTI4LjU0IDE5LjY0NWwtNC4yMDMtMS43NTFjLS42OTctLjI5LTEuNS4wNDEtMS43ODkuNzM5YTEuMzcgMS4zNyAwIDAgMCAuNzM3IDEuNzkybDQuMjAyIDEuNzVhMS4zNyAxLjM3IDAgMCAwIDEuNzktLjczNyAxLjM3IDEuMzcgMCAwIDAtLjczNy0xLjc5M1wiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk0zLjQ1NiAxMi4xNjdsNC4xMzEgMS43MTlhMS4zNjYgMS4zNjYgMCAwIDAgMS43ODktLjc0IDEuMzY3IDEuMzY3IDAgMCAwLS43MzctMS43OUw0LjUxMSA5LjYzN2ExLjM3IDEuMzcgMCAxIDAtMS4wNTUgMi41M1wiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1xdWVzdGlvbi1jaXJjbGVcIiBkYXRhLW5hbWU9XCJxdWVzdGlvbi1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTZcIiBjeT1cIjE2XCIgcj1cIjE2XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE3LjQ2MSAxNy4yOTJ2My4wNTNhMS40NiAxLjQ2IDAgMSAxLTIuOTIyIDB2LTQuMzNjMC0uODA0LjY1NC0xLjQ2MSAxLjQ2MS0xLjQ2MWEyLjg2OSAyLjg2OSAwIDEgMC0yLjg3LTIuODY3IDEuNDYxIDEuNDYxIDAgMCAxLTIuOTIyIDBBNS43OTggNS43OTggMCAwIDEgMTYgNS44OTVhNS43OTggNS43OTggMCAwIDEgNS43OTIgNS43OTIgNS43OTkgNS43OTkgMCAwIDEtNC4zMzEgNS42MDVNMTYgMjUuMzk4YTEuNDQxIDEuNDQxIDAgMSAxIDAtMi44ODIgMS40NCAxLjQ0IDAgMSAxIDAgMi44ODJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcmVmcmVzaC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJyZWZyZXNoLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjUuNjI4IDEwLjEwN2wtMS4wNDggNC4xMmMtLjAxMi4wNDYtLjA0NC4wODYtLjA2NC4xMzVhMS4yMzggMS4yMzggMCAwIDEtMS4xMjkuNzk0Yy0uMDM0IDAtLjA2Ni0uMDEtLjEwMS0uMDEyLS4wMzItLjAwMy0uMDYxLS4wMDgtLjA5MS0uMDEzLS4wMzctLjAwNy0uMDc2LS4wMDUtLjExMy0uMDE0bC00LjExNy0xLjA1MWExLjIzIDEuMjMgMCAwIDEtLjg5My0xLjQ5NiAxLjIyOCAxLjIyOCAwIDAgMSAxLjUwMi0uODlsMS40NjIuMzdhNi4zMDcgNi4zMDcgMCAwIDAtMS44NDItMS41MzEgNi4yNDggNi4yNDggMCAwIDAtNC43NzUtLjUyNSA2LjIzOCA2LjIzOCAwIDAgMC0zLjc1IDMuMDEgNi4yMTYgNi4yMTYgMCAwIDAtLjUyNSA0Ljc3N2MuOTY3IDMuMzI2IDQuNDYgNS4yNDYgNy43ODUgNC4yNzVhMS4yMzMgMS4yMzMgMCAxIDEgLjY4OCAyLjM2OSA4LjgxIDguODEgMCAwIDEtMi40NC4zNDhjLTMuNzg5IDAtNy4yOS0yLjQ4NS04LjQwMi02LjMwMWE4LjY5NCA4LjY5NCAwIDAgMSAuNzMyLTYuNjU2IDguNzEzIDguNzEzIDAgMCAxIDUuMjI0LTQuMTg5IDguNjkxIDguNjkxIDAgMCAxIDYuNjQ5LjczIDguNzYgOC43NiAwIDAgMSAyLjU5OCAyLjE3MmwuMjYxLTEuMDI4YTEuMjI2IDEuMjI2IDAgMCAxIDEuNDk5LS44OSAxLjIzIDEuMjMgMCAwIDEgLjg5IDEuNDk2XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlc3RvcmVcIiBkYXRhLW5hbWU9XCJyZXN0b3JlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGw9XCJub25lXCIvPjxwYXRoIGQ9XCJNMjQuMzQxIDcuMjE2YTEyLjEyMyAxMi4xMjMgMCAwIDAtOC43NTItMy4yNzNjLTMuMzk1LjExOS02LjYzOCAxLjcwMy04Ljg5OSA0LjM0OGExMi4zIDEyLjMgMCAwIDAtMi43NzcgNS44ODdsLTEuNDU2LTIuMTkzQTEuMTYyIDEuMTYyIDAgMSAwIC41MiAxMy4yNzFsMy40NzggNS4yMzljLjQxNS42NTggMS40Mi42OTUgMS45MDEuMDU3bDQuMDE4LTQuNTc1YTEuMTY0IDEuMTY0IDAgMCAwLS4xMDYtMS42NDIgMS4xNjYgMS4xNjYgMCAwIDAtMS42NDEuMTA3bC0xLjk4MiAyLjI1NmE5Ljk3NyA5Ljk3NyAwIDAgMSAyLjI3MS00LjkxMWMxLjgzNy0yLjE1MSA0LjQ2Ni0zLjQzOCA3LjIxMS0zLjUzNWE5LjgwMSA5LjgwMSAwIDAgMSA3LjA4NSAyLjY1IDkuODIgOS44MiAwIDAgMSAzLjEzNiA2Ljg4MyA5LjgxMyA5LjgxMyAwIDAgMS0yLjY0OCA3LjA4NSA5LjgyMyA5LjgyMyAwIDAgMS02Ljg4NCAzLjEzNiAxLjE2MiAxLjE2MiAwIDAgMCAuMDQxIDIuMzI0aC4wNGExMi4xMjcgMTIuMTI3IDAgMCAwIDguNTAzLTMuODc0IDEyLjEyMyAxMi4xMjMgMCAwIDAgMy4yNzItOC43NTIgMTIuMTMzIDEyLjEzMyAwIDAgMC0zLjg3NC04LjUwM1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZWFyY2gtY2lyY2xlXCIgZGF0YS1uYW1lPVwic2VhcmNoLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNNy43MTYgMTMuNzcxYTYuMTEyIDYuMTEyIDAgMCAxIDYuMTA1LTYuMTAzYzMuMzYyIDAgNi4wOTggMi43NCA2LjA5OCA2LjEwMyAwIDMuMzY0LTIuNzM2IDYuMTA0LTYuMDk4IDYuMTA0YTYuMTEyIDYuMTEyIDAgMCAxLTYuMTA1LTYuMTA0bTE4LjE5IDEwLjc4NGwtNS44OC01Ljg4MmMxLjA3My0xLjM1MyAxLjczOS0zLjA0MiAxLjczOS00LjkwMiAwLTQuMzgyLTMuNTYzLTcuOTQ5LTcuOTQ0LTcuOTQ5LTQuMzg0IDAtNy45NTEgMy41NjctNy45NTEgNy45NDkgMCA0LjM4MyAzLjU2NyA3Ljk1IDcuOTUxIDcuOTUgMS44NTYgMCAzLjU0Ny0uNjcgNC45LTEuNzQzbDUuODgyIDUuODgyYy4xNzkuMTgxLjQxNS4yNy42NTIuMjdhLjkxMS45MTEgMCAwIDAgLjY1MS0uMjcuOTIuOTIgMCAwIDAgMC0xLjMwNVwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGFyLWNpcmNsZVwiIGRhdGEtbmFtZT1cInN0YXItY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNi4wOCA1LjE1NWEuOTg3Ljk4NyAwIDAgMSAuNzExLjM2N2MuMDUyLjA2Ny4wODkuMTM3LjEyNS4yMTNsMi42MDcgNi4xMDZoNi4wNTlsLjA4My4wMDRjLjE2OS4wMjIuMzI1LjA3MS40NjYuMTY5YS45NjYuOTY2IDAgMCAxIC4zMTYgMS4xODljLS4wNjEuMTMtLjE0OS4yMzMtLjI1NC4zMjhsLTUuMjEzIDQuMzQxIDIuNjI5IDcuMDE0LjAyNi4wOGMuMDM5LjE2Ny4wNDguMzMxLjAwNC40OTlhLjk2Ni45NjYgMCAwIDEtMS4wMTMuNzA5IDEuMDI2IDEuMDI2IDAgMCAxLS40NjctLjE3NGwtNi4xMzUtNC4zNzlMOS44ODkgMjZsLS4wNzEuMDQ2Yy0uMTUxLjA4LS4zMDcuMTMxLS40OC4xMzJhLjk2Ni45NjYgMCAwIDEtLjk0Ny0uNzk2IDEuMDIxIDEuMDIxIDAgMCAxIC4wNDgtLjQ5NmwyLjYyOS03LjAxNC01LjIxMy00LjM0MS0uMDYyLS4wNTZhMS4wMzkgMS4wMzkgMCAwIDEtLjIyNC0uMzQ5Ljk2Ni45NjYgMCAwIDEgLjQxOS0xLjE1N2MuMTQ5LS4wODYuMzA4LS4xMjEuNDc4LS4xMjhoNi4wNjJsMi42MzItNi4xMDkuMDM2LS4wNzRjLjA0Mi0uMDcyLjA4Ni0uMTM5LjE0NC0uMjAxYS45OTMuOTkzIDAgMCAxIC41NzYtLjI5NWMuMDgyLS4wMDcuMDgyLS4wMDcuMTY0LS4wMDd6bS0yLjA0NSA4LjAyYS45NjcuOTY3IDAgMCAxLS44NzguNTc4SDkuMTA4bDMuNzA1IDMuMDg0LjA2Mi4wNTdjLjA1OC4wNjMuMTExLjEyNS4xNTQuMmEuOTY5Ljk2OSAwIDAgMSAuMTI0LjU2NyAxLjIwNSAxLjIwNSAwIDAgMS0uMDU3LjI0NmwtMS43NjggNC43MTcgNC4xNDEtMi45NTUuMDcxLS4wNDZhLjk2OC45NjggMCAwIDEgLjgxNi0uMDczYy4wODEuMDMuMTUxLjA3Mi4yMjMuMTE5bDQuMTQxIDIuOTU1LTEuNzY4LTQuNzE3LS4wMjYtLjA4YS45NTUuOTU1IDAgMCAxIC4zMS0uOTlsMy43MDQtMy4wODRoLTQuMDQ5bC0uMDc5LS4wMDRhMS4xNzQgMS4xNzQgMCAwIDEtLjIzNC0uMDQ5Ljk4Ny45ODcgMCAwIDEtLjU2Ni0uNTI4bC0xLjk3OS00LjYzNy0xLjk5OCA0LjY0elwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtZmFpbGVkXCIgZGF0YS1uYW1lPVwic3RhdHVzLWZhaWxlZFwiIHZpZXdCb3g9XCIwIDAgMzMgMzJcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMTYuMjE3IDI2LjY2OWExLjM2IDEuMzYgMCAxIDEtLjAwNC0yLjcyIDEuMzYgMS4zNiAwIDAgMSAuMDA0IDIuNzJtLTEuMjQ4LTEzLjYwN2ExLjI0OCAxLjI0OCAwIDAgMSAyLjQ5NSAwdjguMTYzYTEuMjQ3IDEuMjQ3IDAgMSAxLTIuNDk1IDB2LTguMTYzem0xNy40MjQgMTcuMzE5TDE3LjY0OS44OTFjLS4wMjUtLjA0OC0uMDU4LS4wOC0uMDg1LS4xMjVhMS41NjYgMS41NjYgMCAwIDAtLjgxNi0uNjYxcy4wMDMtLjAwMy4wMDUtLjAwM0ExLjU3IDEuNTcgMCAwIDAgMTYuMjE3IDBjLS41NjcgMC0xLjA2My4yOTQtMS4zNDguNzYxLS4wMjQuMDQyLS4wNTcuMDc1LS4wNzkuMTE3TC4xMzMgMzAuMTk0YTEuMjQgMS4yNCAwIDAgMCAuMDUyIDEuMjEyYy4yMy4zNjkuNjI5LjU5NCAxLjA2My41OTRIMzEuMjFjLjY4OSAwIDEuMjQ3LS41NTkgMS4yNDctMS4yNDcgMC0uMTMtLjAyNy0uMjUyLS4wNjQtLjM3MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtcGFydGlhbFwiIGRhdGEtbmFtZT1cInN0YXR1cy1wYXJ0aWFsXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDB6bS4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFhMTMuNDk0IDEzLjQ5NCAwIDAgMCA5LjMzNy0zLjg1NSAxMy42MzQgMTMuNjM0IDAgMCAwIDIuODIxLTMuOTcgMTMuNDI4IDEzLjQyOCAwIDAgMCAxLjEzNC0zLjgxOWMuMjA3LTEuNDc4LjE3LTIuOTg5LS4xMTEtNC40NTRhMTMuNDExIDEzLjQxMSAwIDAgMC0xLjIzOS0zLjU5MyAxMy42OTYgMTMuNjk2IDAgMCAwLTYuMDQ5LTUuOTc3IDEzLjQ3NSAxMy40NzUgMCAwIDAtNS40ODQtMS4zOThjLS4xNzEtLjAwNS0uMzQxLS4wMTYtLjUxMS4wMDF6XCIvPjxwYXRoIGQ9XCJNMTYuMDEzIDIuNDcydjI3LjA1NWwuMTAyLjAxYTEzLjQ5NCAxMy40OTQgMCAwIDAgOS4zMzctMy44NTUgMTMuNjM0IDEzLjYzNCAwIDAgMCAyLjgyMS0zLjk3IDEzLjQyOCAxMy40MjggMCAwIDAgMS4xMzQtMy44MTljLjIwNy0xLjQ3OC4xNy0yLjk4OS0uMTExLTQuNDU0YTEzLjQxMSAxMy40MTEgMCAwIDAtMS4yMzktMy41OTMgMTMuNjk2IDEzLjY5NiAwIDAgMC02LjA0OS01Ljk3NyAxMy40NzUgMTMuNDc1IDAgMCAwLTUuNDg0LTEuMzk4Yy0uMTcxLS4wMDUtLjM0MS0uMDE2LS41MTEuMDAxelwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtcGVuZGluZ1wiIGRhdGEtbmFtZT1cInN0YXR1cy1wZW5kaW5nXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0yMCAxOC42NjZoLTYuNjY2VjhBMS4zMzIgMS4zMzIgMCAxIDEgMTYgOHY4aDRhMS4zMzIgMS4zMzIgMCAxIDEgMCAyLjY2Nk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3luYy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzeW5jLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjUuNzU0IDE5LjI2N2E5LjgyOCA5LjgyOCAwIDAgMS05LjI1NCA2LjUzOGMtMi43NzYgMC01LjQ1MS0xLjE2OC03LjM2LTMuMDE0di44MzJjMCAuNjgtLjU0NyAxLjIyNy0xLjIyNyAxLjIyN2ExLjIyNiAxLjIyNiAwIDAgMS0xLjIyNy0xLjIyN3YtNC43NzFjMC0uNjc3LjU1LTEuMjI3IDEuMjI3LTEuMjI3aDQuNzcxYTEuMjI3IDEuMjI3IDAgMSAxIDAgMi40NTRoLTIuNjY4YzEuNDA5IDEuOTU5IDMuODggMy4yNzIgNi40ODQgMy4yNzJhNy4zNzYgNy4zNzYgMCAwIDAgNi45NDMtNC45MDQgMS4yMjQgMS4yMjQgMCAwIDEgMS41NjUtLjc0OGMuNjM4LjIyNi45NzIuOTMuNzQ2IDEuNTY4TTYuMjkzIDEyLjc4MWE5LjgzMSA5LjgzMSAwIDAgMSA5LjI1NS02LjUzOGMyLjc3NSAwIDUuNDUzIDEuMTcgNy4zNiAzLjAxOHYtLjgzNmExLjIyNyAxLjIyNyAwIDAgMSAyLjQ1NCAwdjQuNzdjMCAuNjgtLjU1IDEuMjI3LTEuMjI3IDEuMjI3aC00Ljc3MWExLjIyNiAxLjIyNiAwIDEgMSAwLTIuNDU0aDIuNjY3Yy0xLjQwOC0xLjk1Ni0zLjg4Mi0zLjI3MS02LjQ4My0zLjI3MUE3LjM3MSA3LjM3MSAwIDAgMCA4LjYwNyAxMy42YTEuMjMgMS4yMyAwIDAgMS0xLjU2NS43NDkgMS4yMjkgMS4yMjkgMCAwIDEtLjc0OS0xLjU2OFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aHVtYnMtdXAtY2lyY2xlXCIgZGF0YS1uYW1lPVwidGh1bWJzLXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjMuMDcgMTguNjAxYTEuNDEzIDEuNDEzIDAgMCAxIDAgMi44MjhoLS45NDNhMS40MTQgMS40MTQgMCAxIDEgMCAyLjgyOEgxNmMtMy43NyAwLTIuODI4LTEuODg2LTEwLjM2OS0xLjg4NnYtOC40ODNoMi44MjhjMy4yOTkgMCA3LjA3LTMuMDM3IDcuMDctNy41NDEgMC0xLjQ5IDIuODI4LTEuNjc5IDIuODI4IDEuMTQ5IDAgMS44ODUtLjk0MyA1LjQ0OS0uOTQzIDUuNDQ5aDcuNTQxYTEuNDE1IDEuNDE1IDAgMCAxIDAgMi44MjhoLS45NDNhMS40MTQgMS40MTQgMCAxIDEgMCAyLjgyOGgtLjk0MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy13YXJuaW5nLWNpcmNsZVwiIGRhdGEtbmFtZT1cIndhcm5pbmctY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNi44OTggMTcuOTg1YS44OTIuODkyIDAgMCAxLTEuNzgzIDB2LTQuODY0YS44OTEuODkxIDAgMCAxIDEuNzgzIDB2NC44NjR6bS0uODkyIDMuMjQyYS44MTEuODExIDAgMSAxIC4wMDQtMS42MjIuODExLjgxMSAwIDAgMS0uMDA0IDEuNjIybTkuNjE0IDEuODM3TDE2LjgwMyA1LjQyOWMtLjMwMy0uNjA0LTEuMjkxLS42MDQtMS41OTQgMEw2LjI5NCAyMy4yNmEuODgzLjg4MyAwIDAgMCAuMDM5Ljg2Ni44OS44OSAwIDAgMCAuNzU4LjQyNWgxNy44MzFjLjAxMi0uMDAyLjAyMyAwIC4wMzUgMGEuODkzLjg5MyAwIDAgMCAuNjYzLTEuNDg3XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXgtY2lyY2xlXCIgZGF0YS1uYW1lPVwieC1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTZcIiBjeT1cIjE2XCIgcj1cIjE2XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIzLjQ4NCAyMS42NzlhMS4yMjYgMS4yMjYgMCAwIDEtMS43MzMgMS43MzNMMTYgMTcuNjYxbC01Ljc0OSA1Ljc1MWExLjIyNCAxLjIyNCAwIDAgMS0xLjczNSAwIDEuMjI2IDEuMjI2IDAgMCAxIDAtMS43MzNsNS43NTItNS43NTEtNS43NTItNS43NDlhMS4yMjUgMS4yMjUgMCAxIDEgMS43MzUtMS43MzJMMTYgMTQuMTk2bDUuNzUxLTUuNzQ5YTEuMjI1IDEuMjI1IDAgMCAxIDEuNzMzIDEuNzMybC01Ljc1MiA1Ljc0OSA1Ljc1MiA1Ljc1MXpcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctYnV0dG9uc1wiIGRhdGEtbmFtZT1cImJ1dHRvbnNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNjM2NkZGJcIiBkPVwiTTMyNi45IDQxYzEuNiAwIDMgMS40IDMgM3YyOS44YzAgMS42LTEuNCAzLTMgM0gxNDAuOGMtMS42IDAtMy0xLjQtMy0zVjQ0YzAtMS42IDEuNC0zIDMtM2gxODYuMW0wLTVIMTQwLjhjLTQuNCAwLTggMy42LTggOHYyOS44YzAgNC40IDMuNiA4IDggOGgxODYuMWM0LjQgMCA4LTMuNiA4LThWNDRjMC00LjQtMy42LTgtOC04elwiLz48cmVjdCBmaWxsPVwiIzhjOWJhNVwiIHg9XCIxOTguN1wiIHk9XCI1NC4xXCIvPjxwYXRoIGZpbGw9XCIjZGQyZjQxXCIgZD1cIk0zMjcuNCA5NC4xSDE0MC42Yy00LjIgMC03LjcgMy41LTcuNyA3Ljd2MzAuNGMwIDQuMiAzLjUgNy43IDcuNyA3LjdoMTg2LjdjNC4yIDAgNy43LTMuNSA3LjctNy43di0zMC40Yy4xLTQuMi0zLjQtNy43LTcuNi03Ljd6bS01OC42IDI3LjdoLTcwLjJ2LTkuNmg3MC4ydjkuNnpcIi8+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTMyNy4xIDE1Mi4ySDE0MC45Yy00LjQgMC03LjkgMy42LTcuOSA3LjlWMTkwYzAgNC40IDMuNiA3LjkgNy45IDcuOWgxODYuMmM0LjQgMCA3LjktMy42IDcuOS03Ljl2LTI5LjljLjEtNC4zLTMuNS03LjktNy45LTcuOXptLTU4LjMgMjcuNmgtNzAuMnYtOS42aDcwLjJ2OS42elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNhcmRzXCIgZGF0YS1uYW1lPVwiY2FyZHNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTQwNS45IDM2SDI1OC41Yy00LjUgMC04LjEgMy42LTguMSA4LjF2MTQ1LjhjMCA0LjUgMy42IDguMSA4LjEgOC4xaDE0Ny40YzQuNSAwIDguMS0zLjYgOC4xLTguMVY0NC4xYzAtNC41LTMuNi04LjEtOC4xLTguMXptLTE1MC40IDguMWMwLTEuNiAxLjQtMyAzLTNoMTQ3LjRjMS42IDAgMyAxLjQgMyAzVjE1NkgyNTUuNVY0NC4xek0yMDkuNiA0MC43YzEuNiAwIDMgMS40IDMgM3YxNDYuMWMwIDEuNi0xLjQgMy0zIDNINjEuOWMtMS42IDAtMy0xLjQtMy0zdi0xNDZjMC0xLjYgMS40LTMgMy0zaDE0Ny43bTAtNS4xSDYxLjljLTQuNSAwLTguMSAzLjctOC4xIDguMXYxNDYuMWMwIDQuNSAzLjcgOC4xIDguMSA4LjFoMTQ3LjdjNC41IDAgOC4xLTMuNyA4LjEtOC4xVjQzLjhjLjEtNC41LTMuNi04LjEtOC4xLTguMXpcIi8+PHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTQwMS41IDE4Ny4xaC01My42Yy0xLjkgMC0zLjUtMS42LTMuNS0zLjV2LTEyLjdjMC0xLjkgMS42LTMuNSAzLjUtMy41aDUzLjZjMS45IDAgMy41IDEuNiAzLjUgMy41djEyLjdjMCAxLjktMS42IDMuNS0zLjUgMy41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNvbG9yLXdoZWVsXCIgZGF0YS1uYW1lPVwiY29sb3Itd2hlZWxcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiMyYWM4NGZcIiBkPVwiTTMwNi44IDgxLjhjLTcuOS0xNi4xLTIwLjktMjkuMS0zNy0zNy0uOC44LTEuNCAxLjgtMS45IDIuOGwtMTEuMyAyNi4yLTExLjIgMjYuMmMtMi4xIDQuOCAxLjQgOC4yIDYuMiA2LjJsMjYuMi0xMS4zTDMwNCA4My42YzEtLjQgMi0xLjEgMi44LTEuOHpcIi8+PHBhdGggZmlsbD1cIiM1OWE3MDJcIiBkPVwiTTMxMC42IDkxLjFjLTEuMSAwLTIuMi4zLTMuMy43bC0yNi41IDEwLjYtMjYuNSAxMC42Yy00LjkgMS45LTQuOSA2LjggMCA4LjdsMjYuNSAxMC42IDI2LjUgMTAuNmMxLjEuNCAyLjIuNiAzLjMuNyAyLjgtOC4yIDQuMy0xNyA0LjMtMjYuMnMtMS41LTE4LjEtNC4zLTI2LjN6XCIvPjxwYXRoIGZpbGw9XCIjZWZjMTAyXCIgZD1cIk0zMDYuOCAxNTIuN2MtLjgtLjgtMS44LTEuNC0yLjgtMS45bC0yNi4yLTExLjMtMjYuMi0xMS4zYy00LjgtMi4xLTguMiAxLjQtNi4yIDYuMmwxMS4zIDI2LjIgMTEuMyAyNi4yYy41IDEuMSAxLjEgMiAxLjkgMi44IDE1LjktNy44IDI5LTIwLjggMzYuOS0zNi45elwiLz48cGF0aCBmaWxsPVwiI2Y2OTUyNFwiIGQ9XCJNMjM0LjMgMTk3LjljOS4yIDAgMTgtMS41IDI2LjItNC4zIDAtMS4xLS4zLTIuMi0uNy0zLjNsLTEwLjYtMjYuNS0xMC42LTI2LjVjLTEuOS00LjktNi44LTQuOS04LjcgMGwtMTAuNiAyNi41LTEwLjYgMjYuNWMtLjQgMS4xLS42IDIuMi0uNyAzLjMgOC4zIDIuOCAxNy4xIDQuMyAyNi4zIDQuM3pcIi8+PHBhdGggZmlsbD1cIiNmOTY2MjNcIiBkPVwiTTIxNy4xIDEyOC4zbC0yNi4yIDExLjMtMjYuMiAxMS4zYy0xLjEuNS0yIDEuMS0yLjggMS45IDcuOSAxNi4xIDIwLjkgMjkuMSAzNyAzNyAuOC0uOCAxLjQtMS44IDEuOS0yLjhsMTEuMy0yNi4yIDExLjMtMjYuMmMxLjktNC45LTEuNS04LjMtNi4zLTYuM3pcIi8+PHBhdGggZmlsbD1cIiNhODFkMjdcIiBkPVwiTTIxNC4zIDExMi45bC0yNi41LTEwLjYtMjYuNS0xMC42Yy0xLjEtLjQtMi4yLS42LTMuMy0uNy0yLjggOC4yLTQuMyAxNy00LjMgMjYuMnMxLjUgMTggNC4zIDI2LjJjMS4xIDAgMi4yLS4zIDMuMy0uN2wyNi41LTEwLjYgMjYuNS0xMC42YzQuOC0xLjggNC44LTYuNyAwLTguNnpcIi8+PHBhdGggZmlsbD1cIiNhMzQ2Y2VcIiBkPVwiTTE2MS44IDgxLjhjLjguOCAxLjggMS40IDIuOCAxLjlMMTkwLjggOTVsMjYuMiAxMS4zYzQuOCAyLjEgOC4yLTEuNCA2LjItNi4yTDIxMiA3My44bC0xMS4zLTI2LjJjLS41LTEuMS0xLjEtMi0xLjktMi44LTE2IDcuOC0yOS4xIDIwLjktMzcgMzd6XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0yMzQuMyAzNi42Yy05LjIgMC0xOCAxLjUtMjYuMiA0LjMgMCAxLjEuMyAyLjIuNyAzLjNsMTAuNiAyNi41TDIzMCA5Ny4yYzEuOSA0LjkgNi44IDQuOSA4LjcgMGwxMC42LTI2LjUgMTAuNi0yNi41Yy40LTEuMS42LTIuMi43LTMuMy04LjMtMi44LTE3LjEtNC4zLTI2LjMtNC4zelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRpYWxvZ1wiIGRhdGEtbmFtZT1cImRpYWxvZ1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMzQ5LjEgMTk3LjNIMTE4LjljLTEuOCAwLTMuMy0xLjUtMy4zLTMuM1YzOS40YzAtMS44IDEuNS0zLjMgMy4zLTMuM2gyMzAuMmMxLjggMCAzLjMgMS41IDMuMyAzLjNWMTk0YzAgMS44LTEuNSAzLjMtMy4zIDMuM3pcIi8+PHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE3Ny44IDE3MC44Yy0zIDAtNS41LTIuNS01LjUtNS41VjYzLjdjMC0zIDIuNS01LjUgNS41LTUuNWgxMTIuNGMzIDAgNS41IDIuNSA1LjUgNS41djEwMS42YzAgMy0yLjUgNS41LTUuNSA1LjVIMTc3Ljh6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0yOTAuMiA2MC43YzEuNiAwIDMgMS40IDMgM3YxMDEuNmMwIDEuNi0xLjQgMy0zIDNIMTc3LjhjLTEuNiAwLTMtMS40LTMtM1Y2My43YzAtMS42IDEuNC0zIDMtM2gxMTIuNG0wLTVIMTc3LjhjLTQuNCAwLTggMy42LTggOHYxMDEuNmMwIDQuNCAzLjYgOCA4IDhoMTEyLjRjNC40IDAgOC0zLjYgOC04VjYzLjdjMC00LjQtMy42LTgtOC04elwiLz48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMjYwLjQgMTU4LjJoLTUyLjljLTEuOSAwLTMuNS0xLjYtMy41LTMuNXYtMTIuNWMwLTEuOSAxLjYtMy41IDMuNS0zLjVoNTIuOWMxLjkgMCAzLjUgMS42IDMuNSAzLjV2MTIuNWMwIDEuOS0xLjUgMy41LTMuNSAzLjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZmVlZGJhY2tcIiBkYXRhLW5hbWU9XCJmZWVkYmFja1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48ZyBmaWxsPVwiI2Y5NjYyM1wiPjxyZWN0IGZpbGwtb3BhY2l0eT1cIi40OFwiIHg9XCIyNzcuNlwiIHk9XCIxMDQuMlwiIHRyYW5zZm9ybT1cInJvdGF0ZSgxMTIuMDg2IDI4Mi45OTUgMTM2Ljg2OClcIi8+PHJlY3QgeD1cIjE3OS42XCIgeT1cIjY0LjVcIiB0cmFuc2Zvcm09XCJyb3RhdGUoMTEyLjA4NiAxODUuMDA4IDk3LjExNilcIi8+PHJlY3QgZmlsbC1vcGFjaXR5PVwiLjI0XCIgeD1cIjIwOC43XCIgeT1cIjEzMy40XCIgdHJhbnNmb3JtPVwicm90YXRlKC0xNTcuOTExIDIxNC4xMyAxNjUuOTkpXCIvPjxyZWN0IGZpbGwtb3BhY2l0eT1cIi43MlwiIHg9XCIyNDguNFwiIHk9XCIzNS40XCIgdHJhbnNmb3JtPVwicm90YXRlKC0xNTcuOTExIDI1My44ODMgNjguMDAyKVwiLz48cmVjdCBmaWxsLW9wYWNpdHk9XCIuMzZcIiB4PVwiMjQ5LjFcIiB5PVwiMTMzLjFcIiB0cmFuc2Zvcm09XCJzY2FsZSgtMSkgcm90YXRlKC0yMi45MTYgLTgxNy40NjUgMTI1NS45ODgpXCIvPjxyZWN0IGZpbGwtb3BhY2l0eT1cIi44NFwiIHg9XCIyMDhcIiB5PVwiMzUuN1wiIHRyYW5zZm9ybT1cInNjYWxlKC0xKSByb3RhdGUoLTIyLjkxNiAtMzM2Ljk1NyAxMDUyLjg1MylcIi8+PHJlY3QgZmlsbC1vcGFjaXR5PVwiLjEyXCIgeD1cIjE3OS45XCIgeT1cIjEwNVwiIHRyYW5zZm9ybT1cInNjYWxlKC0xKSByb3RhdGUoNjcuMDg0IDIwNy41MzggLTI3OS41MDgpXCIvPjxyZWN0IGZpbGwtb3BhY2l0eT1cIi42XCIgeD1cIjI3Ny4zXCIgeT1cIjYzLjhcIiB0cmFuc2Zvcm09XCJzY2FsZSgtMSkgcm90YXRlKDY3LjA4NCAxNDUuNDI5IC00MjYuNDI0KVwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pY29uc1wiIGRhdGEtbmFtZT1cImljb25zXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZjBmM2Y2XCIgZD1cIk0zMzQuOCAxMTlzLTUwLjUgNjIuNC0xMTIuOCA2Mi40UzEwOS4zIDExOSAxMDkuMyAxMTlzNTAuNS02Mi40IDExMi44LTYyLjRTMzM0LjggMTE5IDMzNC44IDExOXpcIi8+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTIyMi4xIDE4My45Yy0xOC4xIDAtNDctNS41LTgxLjMtMzEuNy0yMC40LTE1LjYtMzIuOS0zMS0zMy41LTMxLjZMMTA2IDExOWwxLjMtMS42Yy41LS42IDEzLTE2IDMzLjUtMzEuNiAzNC4zLTI2LjIgNjMuMS0zMS43IDgxLjMtMzEuNyAxOC4xIDAgNDcgNS41IDgxLjMgMzEuNyAyMC40IDE1LjYgMzIuOSAzMSAzMy41IDMxLjZsMS4zIDEuNi0xLjMgMS42Yy0uNS42LTEzIDE2LTMzLjUgMzEuNi0zNC40IDI2LjItNjMuMiAzMS43LTgxLjMgMzEuN3pNMTEyLjYgMTE5YzguMyA5LjYgNTQuNiA1OS45IDEwOS41IDU5LjlzMTAxLjItNTAuMyAxMDkuNS01OS45Yy04LjMtOS42LTU0LjYtNTkuOS0xMDkuNS01OS45UzEyMC45IDEwOS40IDExMi42IDExOXpcIi8+PHBhdGggZmlsbD1cIiM1OWE3MDJcIiBkPVwiTTIyMi4xIDY5LjRjLTI3IDAtNDkgMjEuOS00OSA0OXMyMS45IDQ5IDQ5IDQ5YzI3IDAgNDktMjEuOSA0OS00OXMtMjItNDktNDktNDl6bTExLjUgNDAuOWMtNi40IDAtMTEuNS01LjItMTEuNS0xMS41czUuMi0xMS41IDExLjUtMTEuNWM2LjQgMCAxMS41IDUuMiAxMS41IDExLjVzLTUuMiAxMS41LTExLjUgMTEuNXpcIi8+PHBhdGggZmlsbD1cIiM1NDkxMDNcIiBkPVwiTTIzMy42IDExMC4zYy02LjQgMC0xMS41LTUuMi0xMS41LTExLjUgMC0uNi4xLTEuMy4yLTEuOWgtLjJjLTExLjkgMC0yMS41IDkuNi0yMS41IDIxLjVzOS42IDIxLjUgMjEuNSAyMS41IDIxLjUtOS42IDIxLjUtMjEuNWMwLTMuOC0xLTcuNC0yLjgtMTAuNi0yIDEuNi00LjUgMi41LTcuMiAyLjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctaW5wdXRzXCIgZGF0YS1uYW1lPVwiaW5wdXRzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0yNzguOSA2NC4yaC04OS44Yy0yOS4xIDAtNTIuOCAyMy44LTUyLjggNTIuOCAwIDI5LjEgMjMuOCA1Mi44IDUyLjggNTIuOGg4OS44YzI5LjEgMCA1Mi44LTIzLjggNTIuOC01Mi44IDAtMjkuMS0yMy43LTUyLjgtNTIuOC01Mi44em0tLjggOTUuOGMtMjMuMyAwLTQyLjItMTguOS00Mi4yLTQyLjIgMC0yMy4zIDE4LjktNDIuMiA0Mi4yLTQyLjIgMjMuMyAwIDQyLjIgMTguOSA0Mi4yIDQyLjIgMCAyMy4zLTE4LjkgNDIuMi00Mi4yIDQyLjJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbWVzc2FnZXNcIiBkYXRhLW5hbWU9XCJtZXNzYWdlc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGNsYXNzPVwic3QwXCIgZD1cIk0zNDkuMSAxOTcuM0gxMTguOWMtMS44IDAtMy4zLTEuNS0zLjMtMy4zVjM5LjRjMC0xLjggMS41LTMuMyAzLjMtMy4zaDIzMC4yYzEuOCAwIDMuMyAxLjUgMy4zIDMuM1YxOTRjMCAxLjgtMS41IDMuMy0zLjMgMy4zelwiLz48cGF0aCBmaWxsPVwiIzU5YTcwMlwiIGQ9XCJNMzI3LjEgODAuM0gxNDAuNmMtMi4xIDAtMy44LTEuNy0zLjgtMy44VjM2aDE5NC4xdjQwLjVjMCAyLjEtMS43IDMuOC0zLjggMy44elwiLz48cGF0aCBmaWxsPVwiIzU0OTEwM1wiIGQ9XCJNMTQwLjYgODAuM2g0MC41VjM2aC00NC4zdjQwLjVjMCAyLjEgMS43IDMuOCAzLjggMy44elwiLz48Y2lyY2xlIGZpbGw9XCIjN2JjMTE3XCIgY3g9XCIzMDcuN1wiIGN5PVwiNTguMVwiIHI9XCIxMS44XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGFuZWxcIiBkYXRhLW5hbWU9XCJwYW5lbFwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMzcxLjQgNDFjMS42IDAgMyAxLjQgMyAzdjU2YzAgMS42LTEuNCAzLTMgM0g5Ni42Yy0xLjYgMC0zLTEuNC0zLTNWNDRjMC0xLjYgMS40LTMgMy0zaDI3NC44bTAtNUg5Ni42Yy00LjQgMC04IDMuNi04IDh2NTZjMCA0LjQgMy42IDggOCA4aDI3NC44YzQuNCAwIDgtMy42IDgtOFY0NGMwLTQuNC0zLjYtOC04LTh6TTM3MS40IDE5OEg5Ni42Yy00LjQgMC04LTMuNi04LTh2LTU2YzAtNC40IDMuNi04IDgtOGgyNzQuOGM0LjQgMCA4IDMuNiA4IDh2NTZjMCA0LjQtMy42IDgtOCA4elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXByb2dyZXNzLWJhcnNcIiBkYXRhLW5hbWU9XCJwcm9ncmVzcy1iYXJzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZGZlM2U2XCIgZD1cIk00MDEuNiAxMjkuNUg2Ni40Yy02LjkgMC0xMi41LTUuNi0xMi41LTEyLjVzNS42LTEyLjUgMTIuNS0xMi41aDMzNS4zYzYuOSAwIDEyLjUgNS42IDEyLjUgMTIuNS0uMSA2LjktNS43IDEyLjUtMTIuNiAxMi41elwiLz48cGF0aCBmaWxsPVwiI2VmYzEwMlwiIGQ9XCJNMzMzLjQgMTI5LjVoLTI2N2MtNi45IDAtMTIuNS01LjYtMTIuNS0xMi41czUuNi0xMi41IDEyLjUtMTIuNWgyNjdjNi45IDAgMTIuNSA1LjYgMTIuNSAxMi41LS4xIDYuOS01LjcgMTIuNS0xMi41IDEyLjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2VjdGlvblwiIGRhdGEtbmFtZT1cInNlY3Rpb25cIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNmNjk1MjRcIiBkPVwiTTIyOC45IDExMi4zaC03Ni4xVjU1LjljMC0xMC45IDguOC0xOS43IDE5LjctMTkuN2g1Ni40djc2LjF6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0yMjguOSAxOTcuOGgtNTYuNmMtMTAuOCAwLTE5LjUtOC43LTE5LjUtMTkuNXYtNTYuNmg3Ni4xdjc2LjF6TTMxNS4yIDExMi4zaC03Ni4xVjM2LjJIMjk2YzEwLjYgMCAxOS4yIDguNiAxOS4yIDE5LjJ2NTYuOXpNMjk1LjcgMTk3LjhoLTU2LjZ2LTc2LjFoNzYuMXY1Ni42YzAgMTAuNy04LjcgMTkuNS0xOS41IDE5LjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2xpZGVyc1wiIGRhdGEtbmFtZT1cInNsaWRlcnNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBmaWxsPVwiIzI5N2FkZlwiIGN4PVwiMTY0LjZcIiBjeT1cIjExN1wiIHI9XCI2LjZcIi8+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTE0NS43IDExN2MwLTEuNy4zLTMuNC43LTVIODAuMmMtMi01LTYuOC04LjUtMTIuNS04LjUtNy41IDAtMTMuNSA2LTEzLjUgMTMuNXM2IDEzLjUgMTMuNSAxMy41YzUuNyAwIDEwLjUtMy41IDEyLjUtOC41aDY2LjJjLS41LTEuNi0uNy0zLjMtLjctNXpcIi8+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTQwMC4zIDEwMy41Yy01LjcgMC0xMC41IDMuNS0xMi41IDguNUgyNDYuNWMtMi01LTYuOC04LjUtMTIuNS04LjVzLTEwLjUgMy41LTEyLjUgOC41aC0zOC42Yy0yLjItOC05LjUtMTMuOS0xOC4yLTEzLjktMTAuNCAwLTE4LjkgOC41LTE4LjkgMTguOSAwIDEwLjQgOC41IDE4LjkgMTguOSAxOC45IDguNyAwIDE2LTUuOSAxOC4yLTEzLjloMzguNmMyIDUgNi44IDguNSAxMi41IDguNXMxMC41LTMuNSAxMi41LTguNWgxNDEuM2MyIDUgNi44IDguNSAxMi41IDguNSA3LjUgMCAxMy41LTYgMTMuNS0xMy41cy02LTEzLjUtMTMuNS0xMy41em0tMjM1LjcgMjcuNGMtNy43IDAtMTMuOS02LjItMTMuOS0xMy45czYuMi0xMy45IDEzLjktMTMuOSAxMy45IDYuMiAxMy45IDEzLjktNi4yIDEzLjktMTMuOSAxMy45em0xOC45LTEyLjNjMC0uNS4xLTEuMS4xLTEuNnMwLTEuMS0uMS0xLjZjMCAuNS4xIDEuMS4xIDEuNnMtLjEgMS4xLS4xIDEuNnptLS4yIDEuNGMwLS4yLjEtLjUuMS0uNyAwIC4zLS4xLjUtLjEuN3ptMC02YzAgLjIuMS41LjEuNyAwLS4zLS4xLS41LS4xLS43elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRhYmxlc1wiIGRhdGEtbmFtZT1cInRhYmxlc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2MzY2RkYlwiIGQ9XCJNMzY2LjYgMTk3LjljNC40IDAgOC4xLTMuNiA4LjEtOC4xVjQ0LjJjMC00LjQtMy42LTguMS04LjEtOC4xSDEwMS40Yy00LjQgMC04LjEgMy42LTguMSA4LjFWMTg5LjhjMCA0LjQgMy42IDguMSA4LjEgOC4xaDI2NS4yem0zLTE1My43djQzLjZoLTg2LjJWNDEuMmg4My4yYzEuNiAwIDMgMS40IDMgM3ptLTE4MCA0My42VjQxLjJoODguN3Y0Ni42aC04OC43em04OC44IDUuMVYxNDJoLTg4LjdWOTIuOWg4OC43em0tMTgwLTQ4LjdjMC0xLjYgMS40LTMgMy0zaDgzLjJ2NDYuNkg5OC40VjQ0LjJ6bTAgNDguN2g4Ni4yVjE0Mkg5OC40VjkyLjl6bTMgOTkuOWMtMS42IDAtMy0xLjQtMy0zVjE0N2g4Ni4ydjQ1LjhoLTgzLjJ6bTg4LjIgMFYxNDdoODguN3Y0NS44aC04OC43em0xODAtM2MwIDEuNi0xLjQgMy0zIDNoLTgzLjJWMTQ3aDg2LjJ2NDIuOHptMC00Ny44aC04Ni4yVjkyLjloODYuMlYxNDJ6XCIvPjxwYXRoIGZpbGw9XCIjYTM0NmNlXCIgZD1cIk0zNjkuNiA0NC4ydjQzLjZoLTg2LjJWNDEuMmg4My4yYzEuNiAwIDMgMS40IDMgM3pcIi8+PHJlY3QgZmlsbD1cIiNhMzQ2Y2VcIiB4PVwiMTg5LjZcIiB5PVwiNDEuMlwiLz48cGF0aCBmaWxsPVwiI2EzNDZjZVwiIGQ9XCJNOTguNCA0NC4yYzAtMS42IDEuNC0zIDMtM2g4My4ydjQ2LjZIOTguNFY0NC4yelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRleHRcIiBkYXRhLW5hbWU9XCJ0ZXh0XCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0yMjggMTcyLjdsLTguMy0yMS44aC01Mi4xbC04LjMgMjEuOGgtMjIuNmw0NC42LTExMy41aDI0LjlsNDQuNiAxMTMuNUgyMjh6bS0zNC4zLTkzLjRsLTIwLjQgNTQuMWg0MC45bC0yMC41LTU0LjF6TTMxMy41IDE3Mi43di04LjljLTYuMSA3LTE1LjcgMTAuOS0yNi42IDEwLjktMTMuNCAwLTI4LjYtOS0yOC42LTI3LjIgMC0xOC45IDE1LjEtMjYuNyAyOC42LTI2LjcgMTEuMSAwIDIwLjYgMy42IDI2LjYgMTAuNnYtMTIuM2MwLTkuNS03LjgtMTUuMy0xOS4yLTE1LjMtOS4yIDAtMTcuMiAzLjQtMjQuMyAxMC40bC03LjMtMTIuNGM5LjUtOSAyMS40LTEzLjMgMzQuNi0xMy4zIDE4LjIgMCAzNC4yIDcuNyAzNC4yIDI5Ljh2NTQuNWgtMTh6bTAtMTguN3YtMTIuNGMtNC4xLTUuNi0xMS43LTguNS0xOS42LTguNS0xMCAwLTE3LjUgNS44LTE3LjUgMTQuOCAwIDguOSA3LjUgMTQuNiAxNy41IDE0LjYgNy44IDAgMTUuNS0yLjkgMTkuNi04LjV6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdGltZVwiIGRhdGEtbmFtZT1cInRpbWVcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBmaWxsPVwiI2MzY2RkYlwiIGN4PVwiMjM0XCIgY3k9XCIxMTdcIiByPVwiODAuOFwiLz48cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMjYxLjEgMTQ4LjFjLTEgMC0yLS40LTIuOC0xLjJsLTI3LjEtMjcuMWMtLjgtLjgtMS4yLTEuOC0xLjItMi44VjU2LjJjMC0yLjIgMS44LTQgNC00czQgMS44IDQgNHY1OS4ybDI1LjkgMjUuOWMxLjYgMS42IDEuNiA0LjEgMCA1LjctLjguNy0xLjggMS4xLTIuOCAxLjF6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmFsaWRhdGlvblwiIGRhdGEtbmFtZT1cInZhbGlkYXRpb25cIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkZDJmNDFcIiBkPVwiTTMzMiA2OS43SDEzNmMtNC40IDAtOCAzLjYtOCA4djgzLjJjMCAxLjkgMS41IDMuNCAzLjQgMy40aDIwNS4yYzEuOSAwIDMuNC0xLjUgMy40LTMuNFY3Ny43YzAtNC40LTMuNi04LTgtOHptLTE0MS43IDc1LjVoLTUyLjF2LTkuM2g1Mi4xdjkuM3pNMzM1IDExMS44SDEzM1Y3Ny43YzAtMS42IDEuNC0zIDMtM2gxOTZjMS42IDAgMyAxLjQgMyAzdjM0LjF6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3RhdHVzLWNvbXBsZXRlZFwiIGRhdGEtbmFtZT1cInN0YXR1cy1jb21wbGV0ZWRcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTI0Ljk2NSAxMi44MDJsLTEwLjI2NyAxMS4yNS03LjYyNi03LjYyMWExLjIzMiAxLjIzMiAwIDAgMSAwLTEuNzQxIDEuMjI0IDEuMjI0IDAgMCAxIDEuNzQgMGw1LjgwNSA1LjgwMiA4LjUzMS05LjM0OWExLjIzIDEuMjMgMCAwIDEgMS44MTcgMS42NTlNMTYgMEM3LjE3OCAwIDAgNy4xNzggMCAxNnM3LjE3OCAxNiAxNiAxNiAxNi03LjE3OCAxNi0xNlMyNC44MjIgMCAxNiAwXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48L3N2Zz4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIERPTSBpcyBhbHJlYWR5IHJlYWR5LCBlbWJlZCBTVkdzXG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScpIHsgZW1iZWQoKSB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvbGlua3M6bG9hZFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWJlZCgpIH0pXG4gIH1cblxuICAvLyBIYW5kbGUgc3RhbmRhcmQgRE9NIHJlYWR5IGV2ZW50c1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWJlZCgpIH0pXG59KSgpIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS10b29sYm94JykuZXZlbnRcbnZhciBub3RpZnkgPSByZXF1aXJlKCcuLi9tb2R1bGVzL25vdGlmeScpXG5cbi8vIElmIGEgcGFnZSBoYXMgYW4gZWxlbWVudCAuZm9ybS1mbGFzaCwgdHJpZ2dlciBhIG5vdGlmaWNhdGlvblxuLy9cbkV2ZW50LmNoYW5nZShmdW5jdGlvbigpe1xuICB2YXIgZmxhc2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmxhc2gtbWVzc2FnZTpub3QoLmZpcmVkKScpXG4gIGlmIChmbGFzaCkge1xuICAgIGZsYXNoLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicsJ2ZpcmVkJylcbiAgICBub3RpZnkoZmxhc2guZGF0YXNldC50eXBlLCBmbGFzaC5pbm5lckhUTUwudHJpbSgpKVxuICB9XG59KVxuXG4iLCJ2YXIgdG9vbGJveCAgICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnIClcbnZhciBFdmVudCAgICAgICAgID0gdG9vbGJveC5ldmVudFxudmFyIG5vdGlmeSAgICAgICAgPSByZXF1aXJlKCAnLi4vbW9kdWxlcy9ub3RpZnknIClcblxuXG4vLyBIYW5kbGUgc3VibWl0IGJlaGF2aW9yczpcbi8vICAtIGRpc2FibGUgYnV0dG9uIG9uIHN1Ym1pdFxuLy8gIC0gc3VibWl0IG1lc3NhZ2VzXG4vL1xuRXZlbnQub24oIGRvY3VtZW50LCAnc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcblxuICAvLyBTZW5kIGZvcm0gbWVzc2FnZXNcbiAgLy8gTG9vayBmb3IgYW4gZWxlbWVudCB3aXRoIHRoZSBkYXRhLXN1Ym1pdC1tZXNzYWdlIG9yIHVzZSB0aGUgZm9ybSBpdHNlbGZcbiAgdmFyIG1lc3NhZ2UgPSAoIGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdWJtaXQtbWVzc2FnZV0nKSB8fCBldmVudC50YXJnZXQgKS5kYXRhc2V0LnN1Ym1pdE1lc3NhZ2VcbiAgaWYgKCBtZXNzYWdlICkgbm90aWZ5KCAnZm9ybS1hY3Rpb24nLCBtZXNzYWdlIClcblxuICB2YXIgYnV0dG9uID0gZXZlbnQudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPXN1Ym1pdF0nKVxuICBpZiAoIGJ1dHRvbi5kYXRhc2V0LmRpc2FibGVPblN1Ym1pdCA9PSAnZmFsc2UnICkgcmV0dXJuXG5cbiAgaWYgKCFidXR0b24uZGF0YXNldC5kaXNhYmxlV2l0aCkgYnV0dG9uLmRhdGFzZXQuZGlzYWJsZU9uU3VibWl0ID0gdHJ1ZVxuICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXG5cbiAgLy8gTG9vayBmb3IgZWxlbWVudHMgd2l0aCBkaXNhYmxlLXdpdGggdGV4dCBhbmQgcmVwbGFjZSB0aGUgdGV4dFxuICB2YXIgZWxlbWVudHMgPSBldmVudC50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGlzYWJsZS13aXRoXScpXG5cbiAgdG9vbGJveC5lYWNoKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsICkge1xuICAgIHZhciBidXR0b25UZXh0ID0gZWwucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykgfHwgZWxcblxuICAgIGVsLmRhdGFzZXQuZW5hYmxlZFRleHQgPSBidXR0b25UZXh0LmlubmVySFRNTFxuICAgIGJ1dHRvblRleHQuaW5uZXJIVE1MID0gZWwuZGF0YXNldC5kaXNhYmxlV2l0aFxuICB9KVxuXG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gIC8vIFRoaXMgYWxsb3dzIHRoZSBzdWJtaXQgZnVuY3Rpb25zIHRvIG9jY3VyXG4gIHRvb2xib3guZXZlbnQuZGVsYXkoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwnKVxuICB9KVxuXG4gIGlmICggZG9jdW1lbnQuYm9keS5kYXRhc2V0LmZha2VTdWJtaXQgKSB7XG4gICAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCdmYWtlLXN1Ym1pdCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KVxuICAgIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KCBldiApIFxuICB9IGVsc2Uge1xuICAgIGV2ZW50LnRhcmdldC5zdWJtaXQoKVxuICB9XG5cbn0pXG5cbi8vIFdoZW4gYSBiYWNrIGJ1dHRvbiBpcyB1c2VkOlxuLy8gIC0gRGlzYWJsZWQgYnV0dG9ucyByZW1haW4gZGlzYWJsZWRcbi8vICAtIFByb2dyZXNzIG5vdGlmaWNhdGlvbnMgcmVtYWluIGFjdGl2ZVxuLy9cbi8vIFRoaXMgcmVuYWJsZXMgYnV0dG9ucyBhbmQgaGlkZXMgbm90aWZpY2F0aW9ucy5cbndpbmRvdy5vbnBhZ2VzaG93ID0gZnVuY3Rpb24oZXZlbnQpIHtcblxuICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsJylcbiAgXG4gIHZhciBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kaXNhYmxlLXdpdGhdW2Rpc2FibGVkXSxbZGF0YS1kaXNhYmxlLW9uLXN1Ym1pdF1bZGlzYWJsZWRdJylcbiAgaWYgKCBidXR0b24gKSBidXR0b24uZGlzYWJsZWQgPSBmYWxzZVxuXG4gIGlmICggYnV0dG9uICYmIGJ1dHRvbi5kYXRhc2V0LmVuYWJsZWRUZXh0ICkge1xuICAgIHZhciBidXR0b25UZXh0ID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5idXR0b24tdGV4dCcpIHx8IGJ1dHRvblxuICAgIGJ1dHRvblRleHQuaW5uZXJIVE1MID0gYnV0dG9uLmRhdGFzZXQuZW5hYmxlZFRleHRcbiAgfVxuXG4gIC8vIERpc21pc3MgbGVmdG92ZXIgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uc1xuICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLmZvcm0tYWN0aW9uJyApICkge1xuICAgIG5vdGlmeS5yZW1vdmUoKVxuICB9XG59XG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKS5ldmVudFxuXG5mdW5jdGlvbiBudW1iZXJJbnB1dE9ubHkoZXZlbnQpIHtcbiAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsXG4gICAgICBudW1iZXJLZXlzID0gKCA0NyA8IGtleSAmJiBrZXkgPCA1OCApLFxuICAgICAgbnVtUGFkS2V5cyA9ICggOTUgPCBrZXkgJiYga2V5IDwgMTA2ICksXG4gICAgICBkZWNpbWFscyAgID0gKCBrZXkgPT0gMTEwIHx8IGtleSA9PSAxOTAgKSxcbiAgICAgIG1vZGlmaWVycyAgPSAoIEV2ZW50LmtleS5hbHQgfHwgRXZlbnQua2V5LnNoaWZ0ICksXG4gICAgICBpbnB1dEtleSAgID0gISgoIGtleSA8IDQ2ICYmIGtleSAhPSAzMiApIHx8IEV2ZW50LmtleS5jb21tYW5kICksXG4gICAgICBudW1JbnB1dCAgID0gKCggbnVtYmVyS2V5cyB8fCBudW1QYWRLZXlzIHx8IGRlY2ltYWxzICkgJiYgISggbW9kaWZpZXJzICYmIDQ3IDwga2V5ICkgKVxuXG4gIGlmICggIW51bUlucHV0ICYmIGlucHV0S2V5ICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICB9XG59XG5cbi8vIFByZXZlbnQgbm9uIG51bWVyaWMgaW5wdXQgb24gaW5wdXQgdHlwZSBvZiBudW1iZXJcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ2tleWRvd24nLCAnaW5wdXRbdHlwZT1udW1iZXJdJywgbnVtYmVySW5wdXRPbmx5IClcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSgnY29tcG9zZS10b29sYm94JyksXG4gICAgRXZlbnQgPSB0b29sYm94LmV2ZW50LFxuICAgIGNvbnZlcnQgPSByZXF1aXJlKCcuLi9tb2R1bGVzL3VuaXQtY29udmVydGVyJyksXG4gICAgZm9ybVVwID0gcmVxdWlyZSggJ2NvbXBvc2UtZm9ybS11cCcgKVxuXG5mdW5jdGlvbiBzZXR1cChlbCkge1xuICBlbC5kYXRhc2V0LnVuaXRLZXkgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3BsaXQoJy4nKVsxXVxuXG4gIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJlbmQnLCBzZXR1cElucHV0KGVsKSApXG4gIGVsLmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyZW5kJywgc2V0dXBTZWxlY3QoZWwpIClcblxuICB2YXIgc2VsZWN0ID0gZWwubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgc2V0VmFsdWUoZWwpXG4gIC8vIEFkZCBzb21lIHBhZGRpbmcgYmV0d2VlbiBpbnB1dCBlbnRyeSBhbmQgc2VsZWN0LCBiYXNlZCBvbiB3aWR0aCBvZiBzZWxlY3RcbiAgZWwuc3R5bGUucGFkZGluZ1JpZ2h0ID0gKGVsLm9mZnNldFdpZHRoIC0gc2VsZWN0Lm9mZnNldExlZnQgKyAxMCkgKyAncHgnXG59XG5cbmZ1bmN0aW9uIHJhbmRJRCAoKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMylcbn1cblxuZnVuY3Rpb24gc2V0dXBTZWxlY3QoZWwpIHtcbiAgdmFyIHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ10sXG4gICAgICBzZWxlY3RJZCA9IGBpbnB1dC11bml0LSR7cmFuZElEKCl9YCxcbiAgICAgIHNlbGVjdCA9IGA8c3BhbiBjbGFzcz0naW5wdXQtdW5pdCB1bml0LXNlbGVjdCc+PHNlbGVjdCBjbGFzcz0naW5wdXQtdW5pdC1uYW1lJyBpZD0nJHtzZWxlY3RJZH0nIHRhYmluZGV4PSctMScgYXJpYS1sYWJlbD0ndW5pdHMnIGRhdGEtZGVmYXVsdD0nJHtlbC5kYXRhc2V0LnVuaXR9JyBkYXRhLWluaXRpYWwtdmFsdWU9JyR7ZWwuZGF0YXNldC51bml0fScgZGF0YS11bml0LXNlbGVjdD0nJHtlbC5kYXRhc2V0LnVuaXRLZXl9Jz5gLFxuICAgICAgc2VsZWN0ZWQgPSBlbC5kYXRhc2V0LnVuaXQsXG4gICAgICB3cmFwcGVyID0gdG9vbGJveC5nZXRDbG9zZXN0KCBlbCwgJ2xhYmVsJyApLFxuICAgICAgY2hlY2tlZFxuXG4gIHVuaXRzLmZvckVhY2goZnVuY3Rpb24odW5pdCkge1xuICAgIGNoZWNrZWQgPSAoIChzZWxlY3RlZCA9PSB1bml0KSA/ICcgc2VsZWN0ZWQnIDogJycgKVxuICAgIHNlbGVjdCArPSBgPG9wdGlvbiR7Y2hlY2tlZH0+JHt1bml0fTwvb3B0aW9uPmBcbiAgfSlcblxuICBpZiAoIHdyYXBwZXIgKSB7XG4gICAgdmFyIGRlZmF1bHRJbnB1dCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignW2RhdGEtcmVzdG9yZS1kZWZhdWx0XScpXG4gICAgaWYgKCBkZWZhdWx0SW5wdXQgKSBkZWZhdWx0SW5wdXQuZGF0YXNldC5yZXN0b3JlRGVmYXVsdCArPSBgLCAjJHtzZWxlY3RJZH1gXG4gIH1cblxuICBzZWxlY3QgPSBzZWxlY3QgKyBcIjwvc2VsZWN0Pjwvc3Bhbj5cIlxuXG4gIHJldHVybiBzZWxlY3Rcbn1cblxuZnVuY3Rpb24gc2V0dXBJbnB1dChlbCkge1xuICBuYW1lID0gZWwubmFtZVxuICBlbC5uYW1lID0gbmFtZSArICdfdmFsdWUnXG4gIHJldHVybiAnPGlucHV0IGRhdGEtdW5pdC1pbnB1dD1cIicrZWwuZGF0YXNldC51bml0S2V5KydcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIicrbmFtZSsnXCI+J1xufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZShlbCkge1xuICBlbCA9IGVsLnRhcmdldCB8fCBlbFxuICB2YXIgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LWlucHV0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiXScpXG4gIHZhciBzZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LXNlbGVjdD1cIicrZWwuZGF0YXNldC51bml0S2V5KydcIl0nKVxuICBpbnB1dC52YWx1ZSA9IGNvbnZlcnQoZWwudmFsdWUsIHNlbGVjdC52YWx1ZSwgZWwuZGF0YXNldC51bml0KS52YWx1ZVxufVxuXG5mdW5jdGlvbiB1bml0Q2hhbmdlKGV2ZW50KSB7XG4gIHZhciB1bml0S2V5ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudW5pdFNlbGVjdFxuICB2YXIgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LWtleT1cIicrdW5pdEtleSsnXCJdJylcbiAgc2V0VmFsdWUoZWwpXG59XG5cbkV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXVuaXRdJyApLCBzZXR1cCApXG59KVxuXG5FdmVudC5vbihkb2N1bWVudCwgJ2lucHV0JywgJ1tkYXRhLXVuaXRdJywgc2V0VmFsdWUpXG5FdmVudC5vbihkb2N1bWVudCwgJ2lucHV0JywgJ1tkYXRhLXVuaXQtc2VsZWN0XScsIHVuaXRDaGFuZ2UpXG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKS5ldmVudFxuXG5FdmVudC5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tYXRjaC11cmxdJyksIGZ1bmN0aW9uKG5vZGUpe1xuICAgIHZhciBtYXRjaGVyID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWF0Y2gtdXJsJylcbiAgICBpZiAobWF0Y2hlciAmJiBuZXcgUmVnRXhwKG5vZGUuZGF0YXNldC5tYXRjaFVybCwgXCJpXCIpLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ2hlcmUnKVxuICAgIH1cbiAgfSlcbn0pXG5cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICkuZXZlbnRcblxuZnVuY3Rpb24gYXV0b1NpemVUZXh0YXJlYSggdGV4dGFyZWEgKSB7XG4gIHZhciBwYXJlbnQgPSB0ZXh0YXJlYS5wYXJlbnRFbGVtZW50XG5cbiAgaWYgKCB0ZXh0YXJlYS52YWx1ZSA9PSAnJyApIHJldHVyblxuICBpZiAoIHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2lucHV0LXdyYXBwZXInKSApIHtcblxuICAgIHBhcmVudC5zdHlsZS5oZWlnaHQgPSB0ZXh0YXJlYS5zdHlsZS5oZWlnaHRcbiAgICB2YXIgb2Zmc2V0ID0gdGV4dGFyZWEub2Zmc2V0SGVpZ2h0IC0gdGV4dGFyZWEuY2xpZW50SGVpZ2h0XG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gICAgdmFyIG5ld0hlaWdodCA9ICggdGV4dGFyZWEuc2Nyb2xsSGVpZ2h0ICsgb2Zmc2V0IClcbiAgICB2YXIgbWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICogLjk1XG5cbiAgICBpZiAoIG5ld0hlaWdodCA8IG1heEhlaWdodCApXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnXG4gICAgZWxzZVxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbWF4SGVpZ2h0ICsgJ3B4J1xuXG4gICAgcGFyZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xuICB9XG59XG5cbkV2ZW50LmNoYW5nZShmdW5jdGlvbigpe1xuICB2YXIgdGV4dGFyZWFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGV4dGFyZWEnKVxuICBFdmVudC5kZWxheSggZnVuY3Rpb24oKXsgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0ZXh0YXJlYXMsIGF1dG9TaXplVGV4dGFyZWEpIH0gKVxufSlcblxuRXZlbnQub24oZG9jdW1lbnQsICdrZXl1cCB0b2dnbGVyOnNob3cnLCAndGV4dGFyZWEnLCBmdW5jdGlvbihldmVudCl7XG4gIGF1dG9TaXplVGV4dGFyZWEoZXZlbnQuY3VycmVudFRhcmdldClcbn0pXG5cblxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS10b29sYm94JykuZXZlbnRcblxuLy8gQ2hlY2sgaWYgY2hpbGQgc2VsZWN0IG1hdGNoZXMgcGFyZW50IHNlbGVjdGVkIG9wdGlvblxuZnVuY3Rpb24gbWF0Y2hQYXJlbnRTZWxlY3RlZChjaGlsZCxwYXJlbnRPcHRpb24pIHtcbiAgZm9yICh2YXIgaT0wOyBpPGNoaWxkLmxlbmd0aDsgaSsrKXtcbiAgICAvLyBJZiBjaGlsZCBzZWxlY3Qgb3B0Z3JvdXAgZG9lcyBub3QgbWF0Y2gsIGhpZGUgb3B0aW9uc1xuICAgIGlmIChjaGlsZFtpXS5kYXRhc2V0LnRpZXJQYXJlbnQgIT09IHBhcmVudE9wdGlvbikge1xuICAgICAgY2hpbGRbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRbaV0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG59XG5cbi8vIFJlbW92aW5nIG9wdGdyb3VwIHRvIGhpZGUgc2VsZWN0IHNlY3Rpb24gbGFiZWxzXG5mdW5jdGlvbiBzZXR1cCAoZWwpIHtcbiAgZWwuY2xhc3NOYW1lICs9IFwiIHNlbGVjdC1jaGlsZFwiO1xuICB2YXIgdGllclNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKCd0aWVyX3BhcmVudCcpO1xuICB2YXIgdGllclBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRpZXJTZWxlY3Rvcik7XG4gIHRpZXJQYXJlbnQuY2xhc3NOYW1lICs9IFwiIHNlbGVjdC1wYXJlbnRcIjtcbn1cbiAgXG5mdW5jdGlvbiByZW1vdmVPcHRncm91cFdyYXBwZXIgKGVsKSB7XG4gIC8vIEdldCBsYWJlbCBvZiBlYWNoIG9wdGdyb3VwXG4gIHZhciBjaGlsZExhYmVscyA9IGVsLmxhYmVsO1xuICB2YXIgb3B0aW9ucyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvcHRpb24nKTtcbiAgLy8gRm9yIGVhY2ggb3B0aW9uIGluIGFuIG9wdGdyb3VwLCBhZGQgdGhlIGRhdGEtdGllci1wYXJlbnRcbiAgLy8gYXR0cmlidXRlIGFuZCByZW1vdmUgdGhlIG9wdGdyb3VwIHdyYXBwZXJcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvcHRpb25zLCBvcHRpb24gPT4ge1xuICAgIG9wdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGllci1wYXJlbnQnLCBjaGlsZExhYmVscyk7XG4gIH0pXG4gIGVsLm91dGVySFRNTCA9IGVsLmlubmVySFRNTDtcbn1cblxuZnVuY3Rpb24gY2hlY2tNYXRjaCAoZWwpIHtcbiAgLy8gQ2hlY2sgaWYgYW55IG9wdGlvbnMgbWF0Y2ggdGhlIHNlbGVjdCBwYXJlbnQgbGFiZWxcbiAgdmFyIGNoaWxkT3B0aW9ucyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRpZXItcGFyZW50XScpO1xuICB2YXIgdGllclNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKCd0aWVyX3BhcmVudCcpO1xuICB2YXIgdGllclBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRpZXJTZWxlY3Rvcik7XG4gIHZhciBwYXJlbnRTZWxlY3RlZCA9IHRpZXJQYXJlbnQuc2VsZWN0ZWRPcHRpb25zWzBdLmxhYmVsO1xuICBtYXRjaFBhcmVudFNlbGVjdGVkKGNoaWxkT3B0aW9ucywgcGFyZW50U2VsZWN0ZWQpXG59XG5cbmZ1bmN0aW9uIHRlc3QgKGVsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W3RpZXJfcGFyZW50PVwiJyArIGVsLmlkICsgJ1wiXScpO1xuICAgIFxuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJMb2dnaW5nIGNoYW5nZVwiKTtcbiAgICAgIGNoZWNrTWF0Y2goY2hpbGQpXG4gICAgICB3aGlsZSAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3QtcGFyZW50JykpIHtcbiAgICAgICAgdmFyIG5lc3RlZENoaWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3RpZXJfcGFyZW50PVwiJyArIGNoaWxkLmlkICsgJ1wiXScpO1xuICAgICAgICBuZXN0ZWRDaGlsZC5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgY2hpbGQgPSBuZXN0ZWRDaGlsZDtcbiAgICAgIH1cbiAgICB9KVxuICAgIC8vIHZhciBwYXJlbnRTZWxlY3RlZCA9IHBhcmVudC5zZWxlY3RlZE9wdGlvbnNbMF0ubGFiZWw7XG4gIH1cbkV2ZW50LnJlYWR5KGZ1bmN0aW9uKCl7XG4gIHZhciB0aWVyQ2hpbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbdGllcl9wYXJlbnRdJyk7XG4gIHRpZXJDaGlsZC5mb3JFYWNoKHNldHVwKVxuICB0aWVyQ2hpbGQuZm9yRWFjaChjaGVja01hdGNoKVxufSlcblxuRXZlbnQucmVhZHkoZnVuY3Rpb24oKXtcbiAgdmFyIHRpZXJPcHRncm91cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdFt0aWVyX3BhcmVudF0gb3B0Z3JvdXAnKTtcbiAgdGllck9wdGdyb3VwLmZvckVhY2gocmVtb3ZlT3B0Z3JvdXBXcmFwcGVyKVxufSlcblxuRXZlbnQub24oZG9jdW1lbnQsICdjaGFuZ2UnLCAnLnNlbGVjdC1wYXJlbnQnLCBmdW5jdGlvbihldmVudCl7XG4gIHRlc3QoZXZlbnQuY3VycmVudFRhcmdldClcbn0pIiwidmFyIGV2ZW50ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKS5ldmVudFxuXG4vLyBQdWJsaWMgQVBJIGZ1bmN0aW9uXG52YXIgY2xpcGJvYXJkID0gZnVuY3Rpb24oKSB7XG5cbiAgLy8gTGlzdGVuIGZvciBjbGljayBldmVudHNcbiAgZXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtY29weS10YXJnZXRdJywgY29weSApXG5cbiAgLy8gQ29weSB0byBjbGlwYm9hcmQgaGFuZGxlclxuICBmdW5jdGlvbiBjb3B5KCBldmVudCApIHtcblxuICAgIC8vIEFzc2lnbm1lbnRcbiAgICB2YXIgY29weVRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBjb3B5RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGNvcHlUcmlnZ2VyLmRhdGFzZXQuY29weVRhcmdldCApXG5cbiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyBJcyB0aGUgZWxlbWVudCBzZWxlY3RhYmxlP1xuICAgIGlmICggY29weUVsZW1lbnQgJiYgY29weUVsZW1lbnQuc2VsZWN0ICkge1xuXG4gICAgICAvLyBTZWxlY3QgdGV4dFxuICAgICAgY29weUVsZW1lbnQuc2VsZWN0KCk7XG5cbiAgICAgIC8vIEdpdmUgaXQgYSB0cnlcbiAgICAgIHRyeSB7XG5cbiAgICAgICAgLy8gQ29weSB0ZXh0XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCAnY29weScgKVxuXG4gICAgICAgIC8vIEJsdXIgdGhlIGVsZW1lbnRcbiAgICAgICAgY29weUVsZW1lbnQuYmx1cigpXG5cbiAgICAgICAgLy8gVHJpZ2dlciBjb3BpZWQgc3RhdGVcbiAgICAgICAgY29weVRyaWdnZXIuY2xhc3NMaXN0LmFkZCggJ2NvcGllZCcgKVxuXG4gICAgICAgIC8vIFJlbW92ZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBjb3VwbGUgc2Vjb25kc1xuICAgICAgICBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjb3B5VHJpZ2dlci5jbGFzc0xpc3QucmVtb3ZlKCAnY29waWVkJyApXG4gICAgICAgIH0sIDIwMDAgKVxuXG4gICAgICAvLyBJZiBpdCBib3Jrc1xuICAgICAgfSBjYXRjaCAoIGVyciApIHtcblxuICAgICAgICAvLyBHbyBudWNsZWFyXG4gICAgICAgIGFsZXJ0KCAncGxlYXNlIHByZXNzIEN0cmwvQ21kK0MgdG8gY29weScgKVxuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsaXBib2FyZFxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ID0gdG9vbGJveC5ldmVudCxcbiAgICBlc3ZnICA9IHJlcXVpcmUoICcuLi9fZXN2ZycgKSxcblxuICAgIGRlZmF1bHRzQnlUeXBlID0ge1xuICAgICAgc3VjY2VzczogeyBkaXNtaXNzQWZ0ZXI6IDM1MDAgfSxcbiAgICB9LFxuXG4gICAgaWNvbnNCeVR5cGUgPSB7XG4gICAgICBtZXNzYWdlOiAgICAgICAgXCJtZXNzYWdlLWNpcmNsZVwiLFxuICAgICAgZXJyb3I6ICAgICAgICAgIFwibm8tY2lyY2xlXCIsXG4gICAgICBwcm9ncmVzczogICAgICAgXCJwcm9ncmVzcy1jaXJjbGVcIixcbiAgICAgICdmb3JtLWFjdGlvbic6ICBcInByb2dyZXNzLWNpcmNsZVwiLFxuICAgICAgc3VjY2VzczogICAgICAgIFwidGh1bWJzLXVwLWNpcmNsZVwiLFxuICAgIH0sXG5cbiAgICBhdXRvRGlzbWlzc1RpbWVvdXQsXG4gICAgbWVzc2FnZUVsLFxuXG4gICAgdGVtcGxhdGUgPSAnXFxcbjxkaXYgY2xhc3M9XCJub3RpZmljYXRpb25cIj5cXFxuICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLWNvbnRlbnRcIj5cXFxuICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tbWVzc2FnZVwiIHJvbGU9XCJhbGVydFwiPjwvZGl2PlxcXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1jbG9zZVwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJjbG9zZSBtZXNzYWdlXCI+XFxcbiAgICA8L2J1dHRvbj5cXFxuICA8L2Rpdj5cXFxuPC9kaXY+XFxcbidcblxuZnVuY3Rpb24gbm90aWZ5ICh0eXBlLCBtZXNzYWdlLCBvcHRpb25zKSB7XG5cbiAgaWYgKCAhb3B0aW9ucyAmJiB0eXBlb2YgbWVzc2FnZSA9PSAnb2JqZWN0JyApIHtcbiAgICBvcHRpb25zID0gbWVzc2FnZVxuICAgIG1lc3NhZ2UgPSB0eXBlXG4gICAgdHlwZSA9ICdtZXNzYWdlJ1xuICB9XG5cbiAgaWYgKCAhbWVzc2FnZSApIHtcbiAgICBtZXNzYWdlID0gdHlwZVxuICAgIHR5cGUgPSAnbWVzc2FnZSdcbiAgfVxuXG4gIHJldHVybiBzaG93KCB0eXBlLCBtZXNzYWdlLCB0b29sYm94Lm1lcmdlKCBkZWZhdWx0c0J5VHlwZVt0eXBlXSwgb3B0aW9ucyB8fCB7fSApIClcbn1cblxuZnVuY3Rpb24gc2hvdyAoIHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMgKSB7XG5cbiAgY2xlYXJUaW1lb3V0KCBhdXRvRGlzbWlzc1RpbWVvdXQgKVxuICBpZiAoIG1lc3NhZ2VFbCApIHJldHVybiBkaXNtaXNzKCBmdW5jdGlvbigpeyBzaG93KCB0eXBlLCBtZXNzYWdlLCBvcHRpb25zICkgfSlcblxuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsIHRlbXBsYXRlIClcbiAgbWVzc2FnZUVsICAgICA9IGRvY3VtZW50LmJvZHkubGFzdENoaWxkXG4gIHZhciB0eXBlSWNvbiAgPSBlc3ZnLnVzZSggaWNvbnNCeVR5cGVbdHlwZV0gfHwgdHlwZSApXG4gIHZhciBjbG9zZUljb24gPSBlc3ZnLnVzZSggJ3gtY2lyY2xlJywgeyAnc2NhbGUnOiB0cnVlLCAnY2xhc3MnOiAnY2xvc2UtaWNvbicgfSApXG5cbiAgdmFyIG1zZyA9IG1lc3NhZ2VFbC5xdWVyeVNlbGVjdG9yKCAnLm5vdGlmaWNhdGlvbi1tZXNzYWdlJyApXG4gIG1zZy5pbm5lckhUTUwgPSBtZXNzYWdlXG5cbiAgaWYgKCB0eXBlSWNvbiApIG1zZy5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmViZWdpbicsIFwiPHNwYW4gY2xhc3M9J25vdGlmaWNhdGlvbi10eXBlLWljb24nPlwiICsgdHlwZUljb24ub3V0ZXJIVE1MICsgXCI8L3NwYW4+XCIgKVxuICBpZiAoIGNsb3NlSWNvbiApIG1lc3NhZ2VFbC5xdWVyeVNlbGVjdG9yKCAnLm5vdGlmaWNhdGlvbi1jbG9zZScgKS5pbm5lckhUTUwgPSBjbG9zZUljb24ub3V0ZXJIVE1MXG5cbiAgaWYgKCB0eXBlICkge1xuXG4gICAgbWVzc2FnZUVsLmNsYXNzTGlzdC5hZGQoIHR5cGUgKVxuXG4gICAgaWYgKCBvcHRpb25zICYmIG9wdGlvbnMuZGlzbWlzc0FmdGVyICl7XG4gICAgICBhdXRvRGlzbWlzc1RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggZGlzbWlzcywgb3B0aW9ucy5kaXNtaXNzQWZ0ZXIgKVxuICAgIH1cbiAgfVxuXG4gIG1lc3NhZ2VFbCA9IGRvY3VtZW50LmJvZHkubGFzdENoaWxkXG5cbiAgRXZlbnQua2V5T25lKCAnZXNjJywgZGlzbWlzcyApXG4gIEV2ZW50Lm9uZSggbWVzc2FnZUVsLCAnY2xpY2snLCAnLm5vdGlmaWNhdGlvbi1jbG9zZScsIGRpc21pc3MgKVxuXG4gIHJldHVybiB7XG4gICAgZGlzbWlzczogZGlzbWlzc1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc21pc3MgKCBjYWxsYmFjayApIHtcblxuICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ub3RpZmljYXRpb24nKSA9PSBudWxsICkgeyByZXR1cm4gfVxuXG4gIGNsZWFyVGltZW91dCggYXV0b0Rpc21pc3NUaW1lb3V0IClcblxuICB2YXIgY2JcblxuICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICkge1xuICAgIGNiID0gZnVuY3Rpb24oKSB7IHJlbW92ZSgpOyBjYWxsYmFjaygpIH1cbiAgfSBlbHNlIHtcbiAgICBjYiA9IHJlbW92ZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIGNiLCA1MDAgKVxuXG4gIEV2ZW50Lm9uZSggbWVzc2FnZUVsLCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXQgKVxuXG4gICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIG1lc3NhZ2VFbCwgY2IgKVxuICB9KVxuXG4gIG1lc3NhZ2VFbC5jbGFzc0xpc3QuYWRkKCAnZGlzbWlzcycgKVxufVxuXG5mdW5jdGlvbiByZW1vdmUgKCkge1xuICBtZXNzYWdlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5ID4gLm5vdGlmaWNhdGlvbicpXG5cbiAgaWYgKG1lc3NhZ2VFbCkge1xuICAgIG1lc3NhZ2VFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBtZXNzYWdlRWwgKVxuICB9XG4gIG1lc3NhZ2VFbCA9IG51bGxcbn1cblxubm90aWZ5LmRpc21pc3MgPSBkaXNtaXNzXG5ub3RpZnkucmVtb3ZlID0gcmVtb3ZlXG5cbm1vZHVsZS5leHBvcnRzID0gbm90aWZ5XG4iLCJjb25zdCB1bml0c1RhYmxlID0ge1xuICBiaXQ6IDEsXG4gIGJ5dGU6IDgsXG4gIGtpbG9ieXRlOiAxMDAwICogOCxcbiAgbWVnYWJ5dGU6IDEwMDAgKiAxMDAwICogOCxcbiAgZ2lnYWJ5dGU6IDEwMDAgKiAxMDAwICogMTAwMCAqIDgsXG4gIHRlcmFieXRlOiAxMDAwICogMTAwMCAqIDEwMDAgKiAxMDAwICogOCAgXG59XG5jb25zdCBhbGlhc2VzID0ge1xuICBiOiAnYml0JyxcbiAgQjogJ2J5dGUnLFxuICBLQjogJ2tpbG9ieXRlJyxcbiAgTUI6ICdtZWdhYnl0ZScsXG4gIEdCOiAnZ2lnYWJ5dGUnLFxuICBUQjogJ3RlcmFieXRlJ1xufVxuXG5mdW5jdGlvbiBzaG9ydFVuaXQodW5pdCkge1xuICBmb3IgKGxldCBrZXkgaW4gYWxpYXNlcykge1xuICAgIGlmIChhbGlhc2VzW2tleV0gPT0gdW5pdCkgdW5pdCA9IGtleVxuICB9XG5cbiAgcmV0dXJuIHVuaXRcbn1cbmZ1bmN0aW9uIGxvbmdVbml0KHNpemUsIHVuaXQpIHtcbiAgcmV0dXJuIHBsdXJhbGl6ZShzaXplLCB1bml0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdW5pdC5zbGljZSgxKSlcbn1cblxuZnVuY3Rpb24gYWxpYXModW5pdCkge1xuICByZXR1cm4gYWxpYXNlc1t1bml0XSB8fCB1bml0LnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGx1cmFsaXplKHZhbCwgdW5pdCkge1xuICBpZiAoIHZhbCAhPSAxICkgdW5pdCArPSAncydcbiAgcmV0dXJuIHVuaXRcbn1cblxuZnVuY3Rpb24gY29udmVydChudW0sIGFzLCB0bykge1xuICB2YXIgdG8gICAgID0gYWxpYXModG8pLFxuICAgICAgYmFzZSAgID0gdW5pdHNUYWJsZVthbGlhcyhhcyldLFxuICAgICAgdGFyZ2V0ID0gdW5pdHNUYWJsZVt0b11cbiAgdmFyIG51bSAgICA9IChudW0gKiBiYXNlIC8gdGFyZ2V0KVxuICBcbiAgXG4gIHZhciBjb252ZXJzaW9uID0geyBcbiAgICB2YWx1ZTogbnVtLFxuICAgIHVuaXQ6ICBzaG9ydFVuaXQodG8pLFxuICAgIGxvbmc6ICBsb25nVW5pdChudW0sIHRvKVxuICB9XG4gIHJldHVybiBjb252ZXJzaW9uXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydFxuIiwiLy8gSWNvbnMgbXVzdCBjb21lIGJlZm9yZSBldmVudCByZWdpc3RyYXRpb25zXG5yZXF1aXJlKCAnLi9faWNvbnMnICkgLy8gSW1wb3J0IHN2ZyBpY29ucyAoZnJvbSBFc3ZnKVxudmFyIGVzdmcgPSByZXF1aXJlKCAnLi9fZXN2ZycgKVxuXG52YXIgdG9vbGJveCAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnIClcbnZhciB0aW1lVG9nZ2xlID0gcmVxdWlyZSggJ2NvbXBvc2UtdGltZS10b2dnbGUnICkgLy8gU3dpdGNoIHRpbWUgZWxlbWVudHMgYmV0d2VlbiBsb2NhbCBhbmQgVVRDXG52YXIgdG9nZ2xlciAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvZ2dsZXInIClcbnZhciBmb3JtVXAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtZm9ybS11cCcgKVxudmFyIGRpYWxvZyAgICAgPSByZXF1aXJlKCAnY29tcG9zZS1kaWFsb2cnIClcbnZhciBhamF4ICAgICAgID0gcmVxdWlyZSggJ3N1cGVyYWdlbnQnIClcbnZhciBjbGlwYm9hcmQgID0gcmVxdWlyZSggJy4vbW9kdWxlcy9jbGlwYm9hcmQnIClcbnZhciBub3RpZnkgICAgID0gcmVxdWlyZSggJy4vbW9kdWxlcy9ub3RpZnknIClcbnZhciBldmVudCAgICAgID0gdG9vbGJveC5ldmVudFxuXG5ldmVudC5zY3JvbGwuZGlzYWJsZVBvaW50ZXIoKSAgICAgICAgLy8gZGlzYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBzY3JvbGwgZm9yIHBlcmZvcm1hbmNlICh0byBhdm9pZCBleHRyYSByZXBhaW50cylcbmV2ZW50LnJlc2l6ZS5kaXNhYmxlQW5pbWF0aW9uKCkgICAgICAgIC8vIGRpc2FibGUgcG9pbnRlciBldmVudHMgb24gc2Nyb2xsIGZvciBwZXJmb3JtYW5jZSAodG8gYXZvaWQgZXh0cmEgcmVwYWludHMpXG5jbGlwYm9hcmQoKTtcblxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2ZsYXNoLW1lc3NhZ2VzJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvZm9ybS1zdWJtaXQtaGVscGVycycgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2lucHV0LW51bWJlci1vbmx5JyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvaW5wdXQtdW5pdCcgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2xpbmstaGVyZScgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL3RleHRhcmVhLWV4cGFuZCcgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL3RpZXJlZC1zZWxlY3QnIClcblxuZXZlbnQuY2hhbmdlKCB0aW1lVG9nZ2xlLnRpbWVhZ28uc2V0dXAgKVxuZm9ybVVwLmRpZmYud2F0Y2goKVxuZm9ybVVwLnN0ZXBwZWROdW1iZXJJbnB1dC53YXRjaCgpXG5mb3JtVXAuc3RlcExhYmVscy53YXRjaCgpXG5mb3JtVXAuc2xpZGVyLnNldHVwKClcblxuLy8gUHVibGljIEFQSSBvYmplY3RcbndpbmRvdy5UdW5nc3RlbiA9IG1vZHVsZS5leHBvcnRzID0gdG9vbGJveC5tZXJnZSgge1xuICBhamF4ICAgICAgICA6IGFqYXgsXG4gIGZvcm0gICAgICAgIDogZm9ybVVwLFxuICB0b2dnbGVyICAgICA6IHRvZ2dsZXIsXG4gIGNsaXBib2FyZCAgIDogY2xpcGJvYXJkLFxuICBub3RpZnkgICAgICA6IG5vdGlmeSxcbiAgZXN2ZyAgICAgICAgOiBlc3ZnLFxuICB0aW1lVG9nZ2xlICA6IHRpbWVUb2dnbGUsXG4gIGRpYWxvZyAgICAgIDogZGlhbG9nXG59LCB0b29sYm94IClcbiIsIi8qIVxuICAqIEJlYW4gLSBjb3B5cmlnaHQgKGMpIEphY29iIFRob3JudG9uIDIwMTEtMjAxMlxuICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXQvYmVhblxuICAqIE1JVCBsaWNlbnNlXG4gICovXG4oZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQsIGRlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpXG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoZGVmaW5pdGlvbilcbiAgZWxzZSBjb250ZXh0W25hbWVdID0gZGVmaW5pdGlvbigpXG59KSgnYmVhbicsIHRoaXMsIGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0KSB7XG4gIG5hbWUgICAgPSBuYW1lICAgIHx8ICdiZWFuJ1xuICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzXG5cbiAgdmFyIHdpbiAgICAgICAgICAgID0gd2luZG93XG4gICAgLCBvbGQgICAgICAgICAgICA9IGNvbnRleHRbbmFtZV1cbiAgICAsIG5hbWVzcGFjZVJlZ2V4ID0gL1teXFwuXSooPz1cXC4uKilcXC58LiovXG4gICAgLCBuYW1lUmVnZXggICAgICA9IC9cXC4uKi9cbiAgICAsIGFkZEV2ZW50ICAgICAgID0gJ2FkZEV2ZW50TGlzdGVuZXInXG4gICAgLCByZW1vdmVFdmVudCAgICA9ICdyZW1vdmVFdmVudExpc3RlbmVyJ1xuICAgICwgZG9jICAgICAgICAgICAgPSBkb2N1bWVudCB8fCB7fVxuICAgICwgcm9vdCAgICAgICAgICAgPSBkb2MuZG9jdW1lbnRFbGVtZW50IHx8IHt9XG4gICAgLCBXM0NfTU9ERUwgICAgICA9IHJvb3RbYWRkRXZlbnRdXG4gICAgLCBldmVudFN1cHBvcnQgICA9IFczQ19NT0RFTCA/IGFkZEV2ZW50IDogJ2F0dGFjaEV2ZW50J1xuICAgICwgT05FICAgICAgICAgICAgPSB7fSAvLyBzaW5nbGV0b24gZm9yIHF1aWNrIG1hdGNoaW5nIG1ha2luZyBhZGQoKSBkbyBvbmUoKVxuXG4gICAgLCBzbGljZSAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICwgc3RyMmFyciAgICAgICAgPSBmdW5jdGlvbiAocywgZCkgeyByZXR1cm4gcy5zcGxpdChkIHx8ICcgJykgfVxuICAgICwgaXNTdHJpbmcgICAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ3N0cmluZycgfVxuICAgICwgaXNGdW5jdGlvbiAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ2Z1bmN0aW9uJyB9XG4gICAgLCBpc09iamVjdCAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnb2JqZWN0JyB9XG5cbiAgICAvLyBUcnkgdG8gYnVpbGQgYW4gb3B0aW9ucyBvYmplY3QuIElmIGFueSBrZXkgaW4gYG1heWJlT3B0aW9uc2BcbiAgICAvLyBtYXRjaGVzIGEga2V5IGluIGBkZWZhdWx0c2AsIGl0IHdpbGwgYmUgY29waWVkIGludG8gYSBjbG9uZVxuICAgIC8vIG9mIGBkZWZhdWx0c2AsIHRodXMgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdC5cbiAgICAsIGJ1aWxkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcmlnaW5hbERlZmF1bHRzLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge31cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3JpZ2luYWxEZWZhdWx0cykge1xuICAgICAgICAgIGlmIChvcmlnaW5hbERlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBvcmlnaW5hbERlZmF1bHRzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc09iamVjdChtYXliZU9wdGlvbnMpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBtYXliZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG1heWJlT3B0aW9uc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzXG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZW50cyB0aGF0IHdlIGNvbnNpZGVyIHRvIGJlICduYXRpdmUnLCBhbnl0aGluZyBub3QgaW4gdGhpcyBsaXN0IHdpbGxcbiAgICAgIC8vIGJlIHRyZWF0ZWQgYXMgYSBjdXN0b20gZXZlbnRcbiAgICAsIHN0YW5kYXJkTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ2NsaWNrIGRibGNsaWNrIG1vdXNldXAgbW91c2Vkb3duIGNvbnRleHRtZW51ICcgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ21vdXNld2hlZWwgbW91c2VtdWx0aXdoZWVsIERPTU1vdXNlU2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIHdoZWVsXG4gICAgICAgICdtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIHNlbGVjdHN0YXJ0IHNlbGVjdGVuZCAnICAgICAgICAgICAgKyAvLyBtb3VzZSBtb3ZlbWVudFxuICAgICAgICAna2V5ZG93biBrZXlwcmVzcyBrZXl1cCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8ga2V5Ym9hcmRcbiAgICAgICAgJ29yaWVudGF0aW9uY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vYmlsZVxuICAgICAgICAnZm9jdXMgYmx1ciBjaGFuZ2UgcmVzZXQgc2VsZWN0IHN1Ym1pdCAnICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAnbG9hZCB1bmxvYWQgYmVmb3JldW5sb2FkIHJlc2l6ZSBtb3ZlIERPTUNvbnRlbnRMb2FkZWQgJyAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdyZWFkeXN0YXRlY2hhbmdlIG1lc3NhZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2Vycm9yIGFib3J0IHNjcm9sbCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc2NcbiAgICAgIC8vIGVsZW1lbnQuZmlyZUV2ZW50KCdvblhZWicuLi4gaXMgbm90IGZvcmdpdmluZyBpZiB3ZSB0cnkgdG8gZmlyZSBhbiBldmVudFxuICAgICAgLy8gdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCBzbyBtYWtlIHN1cmUgd2Ugb25seSBkbyB0aGVzZSBvbiBuZXdlciBicm93c2Vyc1xuICAgICwgdzNjTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ3Nob3cgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ2lucHV0IGludmFsaWQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGZvcm0gZWxlbWVudHNcbiAgICAgICAgJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsICcgICAgICAgICAgICAgICAgICAgICArIC8vIHRvdWNoXG4gICAgICAgICdnZXN0dXJlc3RhcnQgZ2VzdHVyZWNoYW5nZSBnZXN0dXJlZW5kICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBnZXN0dXJlXG4gICAgICAgICd0ZXh0aW5wdXQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBUZXh0RXZlbnRcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgcGFnZXNob3cgcGFnZWhpZGUgcG9wc3RhdGUgJyAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnaGFzaGNoYW5nZSBvZmZsaW5lIG9ubGluZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdhZnRlcnByaW50IGJlZm9yZXByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBwcmludGluZ1xuICAgICAgICAnZHJhZ3N0YXJ0IGRyYWdlbnRlciBkcmFnb3ZlciBkcmFnbGVhdmUgZHJhZyBkcm9wIGRyYWdlbmQgJyAgICAgICsgLy8gZG5kXG4gICAgICAgICdsb2Fkc3RhcnQgcHJvZ3Jlc3Mgc3VzcGVuZCBlbXB0aWVkIHN0YWxsZWQgbG9hZG1ldGFkYXRhICcgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnbG9hZGVkZGF0YSBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIHBsYXlpbmcgd2FpdGluZyBzZWVraW5nICcgICAgICsgLy8gbWVkaWFcbiAgICAgICAgJ3NlZWtlZCBlbmRlZCBkdXJhdGlvbmNoYW5nZSB0aW1ldXBkYXRlIHBsYXkgcGF1c2UgcmF0ZWNoYW5nZSAnICArIC8vIG1lZGlhXG4gICAgICAgICd2b2x1bWVjaGFuZ2UgY3VlY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnY2hlY2tpbmcgbm91cGRhdGUgZG93bmxvYWRpbmcgY2FjaGVkIHVwZGF0ZXJlYWR5IG9ic29sZXRlICcgICAgICAgLy8gYXBwY2FjaGVcblxuICAgICAgLy8gY29udmVydCB0byBhIGhhc2ggZm9yIHF1aWNrIGxvb2t1cHNcbiAgICAsIG5hdGl2ZUV2ZW50cyA9IChmdW5jdGlvbiAoaGFzaCwgZXZlbnRzLCBpKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIGV2ZW50c1tpXSAmJiAoaGFzaFtldmVudHNbaV1dID0gMSlcbiAgICAgICAgcmV0dXJuIGhhc2hcbiAgICAgIH0oe30sIHN0cjJhcnIoc3RhbmRhcmROYXRpdmVFdmVudHMgKyAoVzNDX01PREVMID8gdzNjTmF0aXZlRXZlbnRzIDogJycpKSkpXG5cbiAgICAgIC8vIGN1c3RvbSBldmVudHMgYXJlIGV2ZW50cyB0aGF0IHdlICpmYWtlKiwgdGhleSBhcmUgbm90IHByb3ZpZGVkIG5hdGl2ZWx5IGJ1dFxuICAgICAgLy8gd2UgY2FuIHVzZSBuYXRpdmUgZXZlbnRzIHRvIGdlbmVyYXRlIHRoZW1cbiAgICAsIGN1c3RvbUV2ZW50cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc0FuY2VzdG9yID0gJ2NvbXBhcmVEb2N1bWVudFBvc2l0aW9uJyBpbiByb290XG4gICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQpICYgMTYpID09PSAxNlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiAnY29udGFpbnMnIGluIHJvb3RcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLm5vZGVUeXBlID09PSA5IHx8IGNvbnRhaW5lciA9PT0gd2luZG93ID8gcm9vdCA6IGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyICE9PSBlbGVtZW50ICYmIGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgaWYgKGVsZW1lbnQgPT09IGNvbnRhaW5lcikgcmV0dXJuIDFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGNoZWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICByZXR1cm4gIXJlbGF0ZWRcbiAgICAgICAgICAgICAgICA/IHJlbGF0ZWQgPT0gbnVsbFxuICAgICAgICAgICAgICAgIDogKHJlbGF0ZWQgIT09IHRoaXMgJiYgcmVsYXRlZC5wcmVmaXggIT09ICd4dWwnICYmICEvZG9jdW1lbnQvLnRlc3QodGhpcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAmJiAhaXNBbmNlc3RvcihyZWxhdGVkLCB0aGlzKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW91c2VlbnRlcjogeyBiYXNlOiAnbW91c2VvdmVyJywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZWxlYXZlOiB7IGJhc2U6ICdtb3VzZW91dCcsIGNvbmRpdGlvbjogY2hlY2sgfVxuICAgICAgICAgICwgbW91c2V3aGVlbDogeyBiYXNlOiAvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcgfVxuICAgICAgICB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIHByb3ZpZGUgYSBjb25zaXN0ZW50IEV2ZW50IG9iamVjdCBhY3Jvc3MgYnJvd3NlcnMgYnkgdGFraW5nIHRoZSBhY3R1YWwgRE9NXG4gICAgICAvLyBldmVudCBvYmplY3QgYW5kIGdlbmVyYXRpbmcgYSBuZXcgb25lIGZyb20gaXRzIHByb3BlcnRpZXMuXG4gICAgLCBFdmVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBhIHdoaXRlbGlzdCBvZiBwcm9wZXJ0aWVzIChmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzKSB0ZWxscyB1cyB3aGF0IHRvIGNoZWNrIGZvciBhbmQgY29weVxuICAgICAgICB2YXIgY29tbW9uUHJvcHMgID0gc3RyMmFycignYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCAnICtcbiAgICAgICAgICAgICAgJ2RldGFpbCBldmVudFBoYXNlIGdldE1vZGlmaWVyU3RhdGUgaXNUcnVzdGVkIG1ldGFLZXkgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzaGlmdEtleSAnICArXG4gICAgICAgICAgICAgICdzcmNFbGVtZW50IHRhcmdldCB0aW1lU3RhbXAgdHlwZSB2aWV3IHdoaWNoIHByb3BlcnR5TmFtZSBwYXRoJylcbiAgICAgICAgICAsIG1vdXNlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZGF0YVRyYW5zZmVyICcgICAgICArXG4gICAgICAgICAgICAgICdmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCBtb3ZlbWVudFggbW92ZW1lbnRZIHJlZ2lvbicpKVxuICAgICAgICAgICwgbW91c2VXaGVlbFByb3BzID0gbW91c2VQcm9wcy5jb25jYXQoc3RyMmFycignd2hlZWxEZWx0YSB3aGVlbERlbHRhWCB3aGVlbERlbHRhWSB3aGVlbERlbHRhWiAnICtcbiAgICAgICAgICAgICAgJ2F4aXMnKSkgLy8gJ2F4aXMnIGlzIEZGIHNwZWNpZmljXG4gICAgICAgICAgLCBrZXlQcm9wcyAgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSBrZXlJZGVudGlmaWVyICcgICAgICAgICAgK1xuICAgICAgICAgICAgICAna2V5TG9jYXRpb24gbG9jYXRpb24gaXNDb21wb3NpbmcgY29kZScpKVxuICAgICAgICAgICwgdGV4dFByb3BzICAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEnKSlcbiAgICAgICAgICAsIHRvdWNoUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCd0b3VjaGVzIHRhcmdldFRvdWNoZXMgY2hhbmdlZFRvdWNoZXMgc2NhbGUgcm90YXRpb24nKSlcbiAgICAgICAgICAsIG1lc3NhZ2VQcm9wcyA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdkYXRhIG9yaWdpbiBzb3VyY2UnKSlcbiAgICAgICAgICAsIHN0YXRlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdzdGF0ZScpKVxuICAgICAgICAgICwgb3Zlck91dFJlZ2V4ID0gL292ZXJ8b3V0L1xuICAgICAgICAgICAgLy8gc29tZSBldmVudCB0eXBlcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgYW5kIHNvbWUgbmVlZCBzcGVjaWFsIHByb3BlcnRpZXMsIGRvIHRoYXQgYWxsIGhlcmVcbiAgICAgICAgICAsIHR5cGVGaXhlcnMgICA9IFtcbiAgICAgICAgICAgICAgICB7IC8vIGtleSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAva2V5L2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQua2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIG1vdXNlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9jbGlja3xtb3VzZSg/ISguKndoZWVsfHNjcm9sbCkpfG1lbnV8ZHJhZ3xkcm9wL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50LCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucmlnaHRDbGljayA9IGV2ZW50LndoaWNoID09PSAzIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnBvcyA9IHsgeDogMCwgeTogMCB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnBhZ2VYIHx8IGV2ZW50LnBhZ2VZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQucGFnZVhcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5wYWdlWVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpZW50WCB8fCBldmVudC5jbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQuY2xpZW50WCArIGRvYy5ib2R5LnNjcm9sbExlZnQgKyByb290LnNjcm9sbExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5jbGllbnRZICsgZG9jLmJvZHkuc2Nyb2xsVG9wICsgcm9vdC5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJPdXRSZWdleC50ZXN0KHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFsodHlwZSA9PSAnbW91c2VvdmVyJyA/ICdmcm9tJyA6ICd0bycpICsgJ0VsZW1lbnQnXVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW91c2VQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2Ugd2hlZWwgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL21vdXNlLiood2hlZWx8c2Nyb2xsKS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW91c2VXaGVlbFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBUZXh0RXZlbnRcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRleHQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gdG91Y2ggYW5kIGdlc3R1cmUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL150b3VjaHxeZ2VzdHVyZS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdG91Y2hQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbWVzc2FnZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXm1lc3NhZ2UkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIHBvcHN0YXRlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ecG9wc3RhdGUkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdGF0ZVByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvLiovXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tbW9uUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICAsIHR5cGVGaXhlck1hcCA9IHt9IC8vIHVzZWQgdG8gbWFwIGV2ZW50IHR5cGVzIHRvIGZpeGVyIGZ1bmN0aW9ucyAoYWJvdmUpLCBhIGJhc2ljIGNhY2hlIG1lY2hhbmlzbVxuXG4gICAgICAgICAgLCBFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudCwgaXNOYXRpdmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm5cbiAgICAgICAgICAgICAgZXZlbnQgPSBldmVudCB8fCAoKGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQpLnBhcmVudFdpbmRvdyB8fCB3aW4pLmV2ZW50XG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICAgPSBpc05hdGl2ZVxuICAgICAgICAgICAgICB0aGlzLmlzQmVhbiAgICAgICAgID0gdHJ1ZVxuXG4gICAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVyblxuXG4gICAgICAgICAgICAgIHZhciB0eXBlICAgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgLCB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudFxuICAgICAgICAgICAgICAgICwgaSwgbCwgcCwgcHJvcHMsIGZpeGVyXG5cbiAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXRcblxuICAgICAgICAgICAgICBpZiAoaXNOYXRpdmUpIHsgLy8gd2Ugb25seSBuZWVkIGJhc2ljIGF1Z21lbnRhdGlvbiBvbiBjdXN0b20gZXZlbnRzLCB0aGUgcmVzdCBleHBlbnNpdmUgJiBwb2ludGxlc3NcbiAgICAgICAgICAgICAgICBmaXhlciA9IHR5cGVGaXhlck1hcFt0eXBlXVxuICAgICAgICAgICAgICAgIGlmICghZml4ZXIpIHsgLy8gaGF2ZW4ndCBlbmNvdW50ZXJlZCB0aGlzIGV2ZW50IHR5cGUgYmVmb3JlLCBtYXAgYSBmaXhlciBmdW5jdGlvbiBmb3IgaXRcbiAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0eXBlRml4ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUZpeGVyc1tpXS5yZWcudGVzdCh0eXBlKSkgeyAvLyBndWFyYW50ZWVkIHRvIG1hdGNoIGF0IGxlYXN0IG9uZSwgbGFzdCBpcyAuKlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVGaXhlck1hcFt0eXBlXSA9IGZpeGVyID0gdHlwZUZpeGVyc1tpXS5maXhcbiAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvcHMgPSBmaXhlcihldmVudCwgdGhpcywgdHlwZSlcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBwcm9wcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghKChwID0gcHJvcHNbaV0pIGluIHRoaXMpICYmIHAgaW4gZXZlbnQpIHRoaXNbcF0gPSBldmVudFtwXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnREZWZhdWx0KCkgYW5kIHN0b3BQcm9wYWdhdGlvbigpIGFyZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHRvIHRob3NlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBvbiB0aGUgRE9NLCBzdG9wKCkgaXMgYW4gYWxpYXMgZm9yIGJvdGggb2YgdGhlbSB0b2dldGhlclxuICAgICAgICBFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCkgdGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgZWxzZSB0aGlzLm9yaWdpbmFsRXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIHRvIGJlIGhhbmRsZWQgaW50ZXJuYWxseSBiZWNhdXNlIHdlIG1hbmFnZSB0aGUgZXZlbnQgbGlzdCBmb3JcbiAgICAgICAgLy8gZWFjaCBlbGVtZW50XG4gICAgICAgIC8vIG5vdGUgdGhhdCBvcmlnaW5hbEVsZW1lbnQgbWF5IGJlIGEgQmVhbiNFdmVudCBvYmplY3QgaW4gc29tZSBzaXR1YXRpb25zXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlIH1cbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCAmJiB0aGlzLm9yaWdpbmFsRXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgLy9UT0RPOiB0aGlzIGlzIHJpcGUgZm9yIG9wdGltaXNhdGlvbiwgbmV3IGV2ZW50cyBhcmUgKmV4cGVuc2l2ZSpcbiAgICAgICAgICAvLyBpbXByb3ZpbmcgdGhpcyB3aWxsIHNwZWVkIHVwIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICB2YXIgbmUgPSBuZXcgRXZlbnQodGhpcywgdGhpcy5lbGVtZW50LCB0aGlzLmlzTmF0aXZlKVxuICAgICAgICAgIG5lLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgcmV0dXJuIG5lXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRcbiAgICAgIH0oKSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gb2xkIElFIHdlIGNhbid0IGRvIG9ucHJvcGVydHljaGFuZ2Ugb24gZG9jIG9yIHdpbiBzbyB3ZSB1c2UgZG9jLmRvY3VtZW50RWxlbWVudCBmb3IgYm90aFxuICAgICwgdGFyZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICByZXR1cm4gIVczQ19NT0RFTCAmJiAhaXNOYXRpdmUgJiYgKGVsZW1lbnQgPT09IGRvYyB8fCBlbGVtZW50ID09PSB3aW4pID8gcm9vdCA6IGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogQmVhbiBtYWludGFpbnMgYW4gaW50ZXJuYWwgcmVnaXN0cnkgZm9yIGV2ZW50IGxpc3RlbmVycy4gV2UgZG9uJ3QgdG91Y2ggZWxlbWVudHMsIG9iamVjdHNcbiAgICAgICAgKiBvciBmdW5jdGlvbnMgdG8gaWRlbnRpZnkgdGhlbSwgaW5zdGVhZCB3ZSBzdG9yZSBldmVyeXRoaW5nIGluIHRoZSByZWdpc3RyeS5cbiAgICAgICAgKiBFYWNoIGV2ZW50IGxpc3RlbmVyIGhhcyBhIFJlZ0VudHJ5IG9iamVjdCwgd2UgaGF2ZSBvbmUgJ3JlZ2lzdHJ5JyBmb3IgdGhlIHdob2xlIGluc3RhbmNlLlxuICAgICAgICAqL1xuICAgICwgUmVnRW50cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlYWNoIGhhbmRsZXIgaXMgd3JhcHBlZCBzbyB3ZSBjYW4gaGFuZGxlIGRlbGVnYXRpb24gYW5kIGN1c3RvbSBldmVudHNcbiAgICAgICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZuLCBjb25kaXRpb24sIGFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBjYWxsID0gZnVuY3Rpb24gKGV2ZW50LCBlYXJncykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIGFyZ3MgPyBzbGljZS5jYWxsKGVhcmdzLCBldmVudCA/IDAgOiAxKS5jb25jYXQoYXJncykgOiBlYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgZmluZFRhcmdldCA9IGZ1bmN0aW9uIChldmVudCwgZXZlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uX19iZWFuRGVsID8gZm4uX19iZWFuRGVsLmZ0KGV2ZW50LnRhcmdldCwgZWxlbWVudCkgOiBldmVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgaGFuZGxlciA9IGNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZmluZFRhcmdldChldmVudCwgdGhpcykgLy8gZGVsZWF0ZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50KSBldmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZm4uX19iZWFuRGVsKSBldmVudCA9IGV2ZW50LmNsb25lKGZpbmRUYXJnZXQoZXZlbnQpKSAvLyBkZWxlZ2F0ZWQgZXZlbnQsIGZpeCB0aGUgZml4XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlci5fX2JlYW5EZWwgPSBmbi5fX2JlYW5EZWxcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICAgICAgfVxuXG4gICAgICAgICwgUmVnRW50cnkgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwsIG5hbWVzcGFjZXMsIGFyZ3MsIHJvb3QpIHtcbiAgICAgICAgICAgIHZhciBjdXN0b21UeXBlICAgICA9IGN1c3RvbUV2ZW50c1t0eXBlXVxuICAgICAgICAgICAgICAsIGlzTmF0aXZlXG5cbiAgICAgICAgICAgIGlmICh0eXBlID09ICd1bmxvYWQnKSB7XG4gICAgICAgICAgICAgIC8vIHNlbGYgY2xlYW4tdXBcbiAgICAgICAgICAgICAgaGFuZGxlciA9IG9uY2UocmVtb3ZlTGlzdGVuZXIsIGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9yaWdpbmFsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tVHlwZSkge1xuICAgICAgICAgICAgICBpZiAoY3VzdG9tVHlwZS5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY3VzdG9tVHlwZS5jb25kaXRpb24sIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHlwZSA9IGN1c3RvbVR5cGUuYmFzZSB8fCB0eXBlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICA9IGlzTmF0aXZlID0gbmF0aXZlRXZlbnRzW3R5cGVdICYmICEhZWxlbWVudFtldmVudFN1cHBvcnRdXG4gICAgICAgICAgICB0aGlzLmN1c3RvbVR5cGUgICAgPSAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiB0eXBlXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgPSBlbGVtZW50XG4gICAgICAgICAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsICAgICAgPSBvcmlnaW5hbFxuICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzICAgID0gbmFtZXNwYWNlc1xuICAgICAgICAgICAgdGhpcy5ldmVudFR5cGUgICAgID0gVzNDX01PREVMIHx8IGlzTmF0aXZlID8gdHlwZSA6ICdwcm9wZXJ0eWNoYW5nZSdcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgICAgICB0aGlzW2V2ZW50U3VwcG9ydF0gPSAhIXRoaXMudGFyZ2V0W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMucm9vdCAgICAgICAgICA9IHJvb3RcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlciAgICAgICA9IHdyYXBwZWRIYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmVuIGEgbGlzdCBvZiBuYW1lc3BhY2VzLCBpcyBvdXIgZW50cnkgaW4gYW55IG9mIHRoZW0/XG4gICAgICAgIFJlZ0VudHJ5LnByb3RvdHlwZS5pbk5hbWVzcGFjZXMgPSBmdW5jdGlvbiAoY2hlY2tOYW1lc3BhY2VzKSB7XG4gICAgICAgICAgdmFyIGksIGosIGMgPSAwXG4gICAgICAgICAgaWYgKCFjaGVja05hbWVzcGFjZXMpIHJldHVybiB0cnVlXG4gICAgICAgICAgaWYgKCF0aGlzLm5hbWVzcGFjZXMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGZvciAoaSA9IGNoZWNrTmFtZXNwYWNlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IHRoaXMubmFtZXNwYWNlcy5sZW5ndGg7IGotLTspIHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrTmFtZXNwYWNlc1tpXSA9PSB0aGlzLm5hbWVzcGFjZXNbal0pIGMrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aCA9PT0gY1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF0Y2ggYnkgZWxlbWVudCwgb3JpZ2luYWwgZm4gKG9wdCksIGhhbmRsZXIgZm4gKG9wdClcbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLm1hdGNoZXMgPSBmdW5jdGlvbiAoY2hlY2tFbGVtZW50LCBjaGVja09yaWdpbmFsLCBjaGVja0hhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ID09PSBjaGVja0VsZW1lbnQgJiZcbiAgICAgICAgICAgICghY2hlY2tPcmlnaW5hbCB8fCB0aGlzLm9yaWdpbmFsID09PSBjaGVja09yaWdpbmFsKSAmJlxuICAgICAgICAgICAgKCFjaGVja0hhbmRsZXIgfHwgdGhpcy5oYW5kbGVyID09PSBjaGVja0hhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVnRW50cnlcbiAgICAgIH0oKSlcblxuICAgICwgcmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBvdXIgbWFwIHN0b3JlcyBhcnJheXMgYnkgZXZlbnQgdHlwZSwganVzdCBiZWNhdXNlIGl0J3MgYmV0dGVyIHRoYW4gc3RvcmluZ1xuICAgICAgICAvLyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIGFycmF5LlxuICAgICAgICAvLyB1c2VzICckJyBhcyBhIHByZWZpeCBmb3IgdGhlIGtleXMgZm9yIHNhZmV0eSBhbmQgJ3InIGFzIGEgc3BlY2lhbCBwcmVmaXggZm9yXG4gICAgICAgIC8vIHJvb3RMaXN0ZW5lcnMgc28gd2UgY2FuIGxvb2sgdGhlbSB1cCBmYXN0XG4gICAgICAgIHZhciBtYXAgPSB7fVxuXG4gICAgICAgICAgLy8gZ2VuZXJpYyBmdW5jdGlvbmFsIHNlYXJjaCBvZiBvdXIgcmVnaXN0cnkgZm9yIG1hdGNoaW5nIGxpc3RlbmVycyxcbiAgICAgICAgICAvLyBgZm5gIHJldHVybnMgZmFsc2UgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wXG4gICAgICAgICAgLCBmb3JBbGwgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKSB7XG4gICAgICAgICAgICAgIHZhciBwZnggPSByb290ID8gJ3InIDogJyQnXG4gICAgICAgICAgICAgIGlmICghdHlwZSB8fCB0eXBlID09ICcqJykge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCB0aGUgd2hvbGUgcmVnaXN0cnlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHQuY2hhckF0KDApID09IHBmeCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdC5zdWJzdHIoMSksIG9yaWdpbmFsLCBoYW5kbGVyLCByb290LCBmbilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwLCBsLCBsaXN0ID0gbWFwW3BmeCArIHR5cGVdLCBhbGwgPSBlbGVtZW50ID09ICcqJ1xuICAgICAgICAgICAgICAgIGlmICghbGlzdCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgZm9yIChsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIGlmICgoYWxsIHx8IGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgaGFuZGxlcikpICYmICFmbihsaXN0W2ldLCBsaXN0LCBpLCB0eXBlKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIGhhcyA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgcm9vdCkge1xuICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgdXNpbmcgZm9yQWxsIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQncyBhIGJpdCBzbG93ZXIgYW5kIHRoaXNcbiAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgZmFzdFxuICAgICAgICAgICAgICB2YXIgaSwgbGlzdCA9IG1hcFsocm9vdCA/ICdyJyA6ICckJykgKyB0eXBlXVxuICAgICAgICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWxpc3RbaV0ucm9vdCAmJiBsaXN0W2ldLm1hdGNoZXMoZWxlbWVudCwgb3JpZ2luYWwsIG51bGwpKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yQWxsKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCBudWxsLCByb290LCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBwdXQgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgdmFyIGhhcyA9ICFlbnRyeS5yb290ICYmICF0aGlzLmhhcyhlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAsIGtleSA9IChlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVcbiAgICAgICAgICAgICAgOyhtYXBba2V5XSB8fCAobWFwW2tleV0gPSBbXSkpLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIHJldHVybiBoYXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZGVsID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIGZvckFsbChlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBlbnRyeS5oYW5kbGVyLCBlbnRyeS5yb290LCBmdW5jdGlvbiAoZW50cnksIGxpc3QsIGkpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSBkZWxldGUgbWFwWyhlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVdXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGR1bXAgYWxsIGVudHJpZXMsIHVzZWQgZm9yIG9udW5sb2FkXG4gICAgICAgICAgLCBlbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgdCwgZW50cmllcyA9IFtdXG4gICAgICAgICAgICAgIGZvciAodCBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gJyQnKSBlbnRyaWVzID0gZW50cmllcy5jb25jYXQobWFwW3RdKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgaGFzOiBoYXMsIGdldDogZ2V0LCBwdXQ6IHB1dCwgZGVsOiBkZWwsIGVudHJpZXM6IGVudHJpZXMgfVxuICAgICAgfSgpKVxuXG4gICAgICAvLyB3ZSBuZWVkIGEgc2VsZWN0b3IgZW5naW5lIGZvciBkZWxlZ2F0ZWQgZXZlbnRzLCB1c2UgcXVlcnlTZWxlY3RvckFsbCBpZiBpdCBleGlzdHNcbiAgICAgIC8vIGJ1dCBmb3Igb2xkZXIgYnJvd3NlcnMgd2UgbmVlZCBRd2VyeSwgU2l6emxlIG9yIHNpbWlsYXJcbiAgICAsIHNlbGVjdG9yRW5naW5lXG4gICAgLCBzZXRTZWxlY3RvckVuZ2luZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKHMsIHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5xdWVyeVNlbGVjdG9yQWxsKHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmVhbjogTm8gc2VsZWN0b3IgZW5naW5lIGluc3RhbGxlZCcpIC8vIGVlZWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGF0dGFjaCB0aGlzIGxpc3RlbmVyIHRvIGVhY2ggRE9NIGV2ZW50IHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8sIG9ubHkgb25jZVxuICAgICAgLy8gcGVyIGV2ZW50IHR5cGUgcGVyIERPTSBlbGVtZW50XG4gICAgLCByb290TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHR5cGUpIHtcbiAgICAgICAgaWYgKCFXM0NfTU9ERUwgJiYgdHlwZSAmJiBldmVudCAmJiBldmVudC5wcm9wZXJ0eU5hbWUgIT0gJ19vbicgKyB0eXBlKSByZXR1cm5cblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gcmVnaXN0cnkuZ2V0KHRoaXMsIHR5cGUgfHwgZXZlbnQudHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcblxuICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgdGhpcywgdHJ1ZSlcbiAgICAgICAgaWYgKHR5cGUpIGV2ZW50LnR5cGUgPSB0eXBlXG5cbiAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIGNhbGxpbmcgdGhlbSB1bmxlc3MgdGhleSBoYXZlXG4gICAgICAgIC8vIGJlZW4gcmVtb3ZlZCBieSBhIHByZXZpb3VzIGhhbmRsZXIgb3Igc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgIGZvciAoOyBpIDwgbCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbaV0ucmVtb3ZlZCkgbGlzdGVuZXJzW2ldLmhhbmRsZXIuY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYW5kIHJlbW92ZSBsaXN0ZW5lcnMgdG8gRE9NIGVsZW1lbnRzXG4gICAgLCBsaXN0ZW5lciA9IFczQ19NT0RFTFxuICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhZGQsIGN1c3RvbSwgdXNlQ2FwdHVyZSkge1xuICAgICAgICAgICAgLy8gbmV3IGJyb3dzZXJzXG4gICAgICAgICAgICBlbGVtZW50W2FkZCA/IGFkZEV2ZW50IDogcmVtb3ZlRXZlbnRdKHR5cGUsIHJvb3RMaXN0ZW5lciwgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tIC8qLCB1c2VDYXB0dXJlICovKSB7XG4gICAgICAgICAgICAvLyBJRTggYW5kIGJlbG93LCB1c2UgYXR0YWNoRXZlbnQvZGV0YWNoRXZlbnQgYW5kIHdlIGhhdmUgdG8gcGlnZ3ktYmFjayBwcm9wZXJ0eWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgIC8vIHRvIHNpbXVsYXRlIGV2ZW50IGJ1YmJsaW5nIGV0Yy5cbiAgICAgICAgICAgIHZhciBlbnRyeVxuICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICByZWdpc3RyeS5wdXQoZW50cnkgPSBuZXcgUmVnRW50cnkoXG4gICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgLCBjdXN0b20gfHwgdHlwZVxuICAgICAgICAgICAgICAgICwgZnVuY3Rpb24gKGV2ZW50KSB7IC8vIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgcm9vdExpc3RlbmVyLmNhbGwoZWxlbWVudCwgZXZlbnQsIGN1c3RvbSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAsIHJvb3RMaXN0ZW5lclxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgdHJ1ZSAvLyBpcyByb290XG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIGlmIChjdXN0b20gJiYgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPT0gbnVsbCkgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPSAwXG4gICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5hdHRhY2hFdmVudCgnb24nICsgZW50cnkuZXZlbnRUeXBlLCBlbnRyeS5oYW5kbGVyKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cnkgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgY3VzdG9tIHx8IHR5cGUsIHJvb3RMaXN0ZW5lciwgdHJ1ZSlbMF1cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGVudHJ5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgLCBvbmNlID0gZnVuY3Rpb24gKHJtLCBlbGVtZW50LCB0eXBlLCBmbiwgb3JpZ2luYWxGbikge1xuICAgICAgICAvLyB3cmFwIHRoZSBoYW5kbGVyIGluIGEgaGFuZGxlciB0aGF0IGRvZXMgYSByZW1vdmUgYXMgd2VsbFxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICBybShlbGVtZW50LCB0eXBlLCBvcmlnaW5hbEZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAsIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9yZ1R5cGUsIGhhbmRsZXIsIG5hbWVzcGFjZXMsIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgdmFyIHR5cGUgICAgID0gb3JnVHlwZSAmJiBvcmdUeXBlLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICAsIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGVsZW1lbnQsIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgcmVtb3ZlZCAgPSB7fVxuICAgICAgICAgICwgaSwgbFxuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoKCFoYW5kbGVyIHx8IGhhbmRsZXJzW2ldLm9yaWdpbmFsID09PSBoYW5kbGVyKSAmJiBoYW5kbGVyc1tpXS5pbk5hbWVzcGFjZXMobmFtZXNwYWNlcykpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmxlbWF0aWMsIHdlIGhhdmUgYSByZWdpc3RyeS5nZXQoKSBhbmQgcmVnaXN0cnkuZGVsKCkgdGhhdFxuICAgICAgICAgICAgLy8gYm90aCBkbyByZWdpc3RyeSBzZWFyY2hlcyBzbyB3ZSB3YXN0ZSBjeWNsZXMgZG9pbmcgdGhpcy4gTmVlZHMgdG8gYmUgcm9sbGVkIGludG9cbiAgICAgICAgICAgIC8vIGEgc2luZ2xlIHJlZ2lzdHJ5LmZvckFsbChmbikgdGhhdCByZW1vdmVzIHdoaWxlIGZpbmRpbmcsIGJ1dCB0aGUgY2F0Y2ggaXMgdGhhdFxuICAgICAgICAgICAgLy8gd2UnbGwgYmUgc3BsaWNpbmcgdGhlIGFycmF5cyB0aGF0IHdlJ3JlIGl0ZXJhdGluZyBvdmVyLiBOZWVkcyBleHRyYSB0ZXN0cyB0b1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IHNjcmV3IGl0IHVwLiBAcnZhZ2dcbiAgICAgICAgICAgIHJlZ2lzdHJ5LmRlbChoYW5kbGVyc1tpXSlcbiAgICAgICAgICAgIGlmICghcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdICYmIGhhbmRsZXJzW2ldW2V2ZW50U3VwcG9ydF0pXG4gICAgICAgICAgICAgIHJlbW92ZWRbaGFuZGxlcnNbaV0uZXZlbnRUeXBlXSA9IHsgdDogaGFuZGxlcnNbaV0uZXZlbnRUeXBlLCBjOiBoYW5kbGVyc1tpXS50eXBlIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgZWFjaCB0eXBlL2VsZW1lbnQgZm9yIHJlbW92ZWQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIHJvb3RMaXN0ZW5lciB3aGVyZSBpdCdzIG5vIGxvbmdlciBuZWVkZWRcbiAgICAgICAgZm9yIChpIGluIHJlbW92ZWQpIHtcbiAgICAgICAgICBpZiAoIXJlZ2lzdHJ5LmhhcyhlbGVtZW50LCByZW1vdmVkW2ldLnQsIG51bGwsIGZhbHNlKSkge1xuICAgICAgICAgICAgLy8gbGFzdCBsaXN0ZW5lciBvZiB0aGlzIHR5cGUsIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCByZW1vdmVkW2ldLnQsIGZhbHNlLCByZW1vdmVkW2ldLmMsIHVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB1cCBhIGRlbGVnYXRlIGhlbHBlciB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IsIHdyYXAgdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAgICAsIGRlbGVnYXRlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBmbikge1xuICAgICAgICAvL1RPRE86IGZpbmRUYXJnZXQgKHRoZXJlZm9yZSAkKSBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIG1hdGNoIGFuZCBvbmNlIGZvclxuICAgICAgICAvLyBzZXR0aW5nIGUuY3VycmVudFRhcmdldCwgZml4IHRoaXMgc28gaXQncyBvbmx5IG5lZWRlZCBvbmNlXG4gICAgICAgIHZhciBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgcm9vdCkge1xuICAgICAgICAgICAgICB2YXIgaSwgYXJyYXkgPSBpc1N0cmluZyhzZWxlY3RvcikgPyBzZWxlY3RvckVuZ2luZShzZWxlY3Rvciwgcm9vdCkgOiBzZWxlY3RvclxuICAgICAgICAgICAgICBmb3IgKDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gcm9vdDsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gdGFyZ2V0KSByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLCBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFRhcmdldChlLnRhcmdldCwgdGhpcylcbiAgICAgICAgICAgICAgaWYgKG1hdGNoKSBmbi5hcHBseShtYXRjaCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIF9fYmVhbkRlbCBpc24ndCBwbGVhc2FudCBidXQgaXQncyBhIHByaXZhdGUgZnVuY3Rpb24sIG5vdCBleHBvc2VkIG91dHNpZGUgb2YgQmVhblxuICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IHtcbiAgICAgICAgICAgIGZ0ICAgICAgIDogZmluZFRhcmdldCAvLyBhdHRhY2ggaXQgaGVyZSBmb3IgY3VzdG9tRXZlbnRzIHRvIHVzZSB0b29cbiAgICAgICAgICAsIHNlbGVjdG9yIDogc2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgICAgfVxuXG4gICAgLCBmaXJlTGlzdGVuZXIgPSBXM0NfTU9ERUwgPyBmdW5jdGlvbiAoaXNOYXRpdmUsIHR5cGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBkbyBhIHByb3BlciBkaXNwYXRjaEV2ZW50KClcbiAgICAgICAgdmFyIGV2dCA9IGRvYy5jcmVhdGVFdmVudChpc05hdGl2ZSA/ICdIVE1MRXZlbnRzJyA6ICdVSUV2ZW50cycpXG4gICAgICAgIGV2dFtpc05hdGl2ZSA/ICdpbml0RXZlbnQnIDogJ2luaXRVSUV2ZW50J10odHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luLCAxKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgICAgfSA6IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBvbGQgYnJvd3NlciB1c2Ugb25wcm9wZXJ0eWNoYW5nZSwganVzdCBpbmNyZW1lbnQgYSBjdXN0b20gcHJvcGVydHkgdG8gdHJpZ2dlciB0aGUgZXZlbnRcbiAgICAgICAgZWxlbWVudCA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgIGlzTmF0aXZlID8gZWxlbWVudC5maXJlRXZlbnQoJ29uJyArIHR5cGUsIGRvYy5jcmVhdGVFdmVudE9iamVjdCgpKSA6IGVsZW1lbnRbJ19vbicgKyB0eXBlXSsrXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIFB1YmxpYyBBUEk6IG9mZigpLCBvbigpLCBhZGQoKSwgKHJlbW92ZSgpKSwgb25lKCksIGZpcmUoKSwgY2xvbmUoKVxuICAgICAgICAqL1xuXG4gICAgICAvKipcbiAgICAgICAgKiBvZmYoZWxlbWVudFssIGV2ZW50VHlwZShzKVssIGhhbmRsZXIgXSwgb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvZmYgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZVNwZWMsIGZuKSB7XG4gICAgICAgIHZhciBpc1R5cGVTdHIgPSBpc1N0cmluZyh0eXBlU3BlYyksXG4gICAgICAgICAgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICAsIG9wdHMgPSBidWlsZE9wdGlvbnMoZGVmYXVsdE9wdHMsIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgLCBrLCB0eXBlLCBuYW1lc3BhY2VzLCBpXG5cbiAgICAgICAgaWYgKGlzVHlwZVN0ciAmJiB0eXBlU3BlYy5pbmRleE9mKCcgJykgPiAwKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCAndDEgdDIgdDMnLCBmbikgb3Igb2ZmKGVsLCAndDEgdDIgdDMnKVxuICAgICAgICAgIHR5cGVTcGVjID0gc3RyMmFycih0eXBlU3BlYylcbiAgICAgICAgICBmb3IgKGkgPSB0eXBlU3BlYy5sZW5ndGg7IGktLTspXG4gICAgICAgICAgICBvZmYoZWxlbWVudCwgdHlwZVNwZWNbaV0sIGZuKVxuICAgICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgaWYgKHR5cGUgJiYgY3VzdG9tRXZlbnRzW3R5cGVdKSB0eXBlID0gY3VzdG9tRXZlbnRzW3R5cGVdLmJhc2VcblxuICAgICAgICBpZiAoIXR5cGVTcGVjIHx8IGlzVHlwZVN0cikge1xuICAgICAgICAgIC8vIG9mZihlbCkgb3Igb2ZmKGVsLCB0MS5ucykgb3Igb2ZmKGVsLCAubnMpIG9yIG9mZihlbCwgLm5zMS5uczIubnMzKVxuICAgICAgICAgIGlmIChuYW1lc3BhY2VzID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSkgbmFtZXNwYWNlcyA9IHN0cjJhcnIobmFtZXNwYWNlcywgJy4nKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGZuLCBuYW1lc3BhY2VzLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0eXBlU3BlYykpIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIGZuKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIG51bGwsIHR5cGVTcGVjLCBudWxsLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCB7IHQxOiBmbjEsIHQyLCBmbjIgfSlcbiAgICAgICAgICBmb3IgKGsgaW4gdHlwZVNwZWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlU3BlYy5oYXNPd25Qcm9wZXJ0eShrKSkgb2ZmKGVsZW1lbnQsIGssIHR5cGVTcGVjW2tdKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uKGVsZW1lbnQsIGV2ZW50VHlwZShzKVssIHNlbGVjdG9yXSwgaGFuZGxlclssIGFyZ3MgXSwgW29wdGlvbnNdKVxuICAgICAgICAqL1xuICAgICwgb24gPSBmdW5jdGlvbihlbGVtZW50LCBldmVudHMsIHNlbGVjdG9yLCBmbikge1xuICAgICAgICB2YXIgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWxGbiwgdHlwZSwgdHlwZXMsIGksIGFyZ3MsIGVudHJ5LCBmaXJzdCwgb3B0c1xuXG4gICAgICAgIC8vVE9ETzogdGhlIHVuZGVmaW5lZCBjaGVjayBtZWFucyB5b3UgY2FuJ3QgcGFzcyBhbiAnYXJncycgYXJndW1lbnQsIGZpeCB0aGlzIHBlcmhhcHM/XG4gICAgICAgIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBldmVudHMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgY2FuJ3QgaGFuZGxlIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICBmb3IgKHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgICAgICAgIG9uLmNhbGwodGhpcywgZWxlbWVudCwgdHlwZSwgZXZlbnRzW3R5cGVdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgICAgICAvLyBkZWxlZ2F0ZWQgZXZlbnRcbiAgICAgICAgICBvcmlnaW5hbEZuID0gZm5cbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDQpXG4gICAgICAgICAgZm4gICAgICAgICA9IGRlbGVnYXRlKHNlbGVjdG9yLCBvcmlnaW5hbEZuLCBzZWxlY3RvckVuZ2luZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpXG4gICAgICAgICAgZm4gICAgICAgICA9IG9yaWdpbmFsRm4gPSBzZWxlY3RvclxuICAgICAgICB9XG5cbiAgICAgICAgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJnc1thcmdzLmxlbmd0aCAtIDFdKVxuICAgICAgICB0eXBlcyA9IHN0cjJhcnIoZXZlbnRzKVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igb25lKCksIHdyYXAgaW4gYSBzZWxmLXJlbW92aW5nIGhhbmRsZXJcbiAgICAgICAgaWYgKHRoaXMgPT09IE9ORSkge1xuICAgICAgICAgIGZuID0gb25jZShvZmYsIGVsZW1lbnQsIGV2ZW50cywgZm4sIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSB0eXBlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAvLyBhZGQgbmV3IGhhbmRsZXIgdG8gdGhlIHJlZ2lzdHJ5IGFuZCBjaGVjayBpZiBpdCdzIHRoZSBmaXJzdCBmb3IgdGhpcyBlbGVtZW50L3R5cGVcbiAgICAgICAgICBmaXJzdCA9IHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgLCB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpIC8vIGV2ZW50IHR5cGVcbiAgICAgICAgICAgICwgZm5cbiAgICAgICAgICAgICwgb3JpZ2luYWxGblxuICAgICAgICAgICAgLCBzdHIyYXJyKHR5cGVzW2ldLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSwgJy4nKSAvLyBuYW1lc3BhY2VzXG4gICAgICAgICAgICAsIGFyZ3NcbiAgICAgICAgICAgICwgZmFsc2UgLy8gbm90IHJvb3RcbiAgICAgICAgICApKVxuICAgICAgICAgIGlmIChlbnRyeVtldmVudFN1cHBvcnRdICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBldmVudCBvZiB0aGlzIHR5cGUgb24gdGhpcyBlbGVtZW50LCBhZGQgcm9vdCBsaXN0ZW5lclxuICAgICAgICAgICAgbGlzdGVuZXIoZWxlbWVudCwgZW50cnkuZXZlbnRUeXBlLCB0cnVlLCBlbnRyeS5jdXN0b21UeXBlLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogYWRkKGVsZW1lbnRbLCBzZWxlY3Rvcl0sIGV2ZW50VHlwZShzKSwgaGFuZGxlclssIGFyZ3MgXSlcbiAgICAgICAgKlxuICAgICAgICAqIERlcHJlY2F0ZWQ6IGtlcHQgKGZvciBub3cpIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5XG4gICAgICAgICovXG4gICAgLCBhZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnRzLCBmbiwgZGVsZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG9uLmFwcGx5KFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICwgIWlzU3RyaW5nKGZuKVxuICAgICAgICAgICAgICA/IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICAgICAgICA6IFsgZWxlbWVudCwgZm4sIGV2ZW50cywgZGVsZm4gXS5jb25jYXQoYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgNCkgOiBbXSlcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBvbmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqL1xuICAgICwgb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoT05FLCBhcmd1bWVudHMpXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIGZpcmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogVGhlIG9wdGlvbmFsICdhcmdzJyBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LCBpZiBubyAnYXJncycgYXJndW1lbnQgaXMgcHJvdmlkZWRcbiAgICAgICAgKiB0aGVuIHdlIGNhbiB1c2UgdGhlIGJyb3dzZXIncyBET00gZXZlbnQgc3lzdGVtLCBvdGhlcndpc2Ugd2UgdHJpZ2dlciBoYW5kbGVycyBtYW51YWxseVxuICAgICAgICAqL1xuICAgICwgZmlyZSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhcmdzKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IHN0cjJhcnIodHlwZSlcbiAgICAgICAgICAsIGksIGosIGwsIG5hbWVzLCBoYW5kbGVyc1xuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIHR5cGUgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpXG4gICAgICAgICAgaWYgKG5hbWVzID0gdHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lcyA9IHN0cjJhcnIobmFtZXMsICcuJylcbiAgICAgICAgICBpZiAoIW5hbWVzICYmICFhcmdzICYmIGVsZW1lbnRbZXZlbnRTdXBwb3J0XSkge1xuICAgICAgICAgICAgZmlyZUxpc3RlbmVyKG5hdGl2ZUV2ZW50c1t0eXBlXSwgdHlwZSwgZWxlbWVudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9uLW5hdGl2ZSBldmVudCwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBuYW1lc3BhY2UsIGFyZ3VtZW50cyBvciBhIG5vbiBET00gZWxlbWVudFxuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBsaXN0ZW5lcnMgYW5kIG1hbnVhbGx5ICdmaXJlJ1xuICAgICAgICAgICAgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICBhcmdzID0gW2ZhbHNlXS5jb25jYXQoYXJncylcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGogPCBsOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzW2pdLmluTmFtZXNwYWNlcyhuYW1lcykpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5oYW5kbGVyLmFwcGx5KGVsZW1lbnQsIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogY2xvbmUoZHN0RWxlbWVudCwgc3JjRWxlbWVudFssIGV2ZW50VHlwZSBdKVxuICAgICAgICAqXG4gICAgICAgICogVE9ETzogcGVyaGFwcyBmb3IgY29uc2lzdGVuY3kgd2Ugc2hvdWxkIGFsbG93IHRoZSBzYW1lIGZsZXhpYmlsaXR5IGluIHR5cGUgc3BlY2lmaWVycz9cbiAgICAgICAgKi9cbiAgICAsIGNsb25lID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZyb20sIHR5cGUpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGZyb20sIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgbCA9IGhhbmRsZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcbiAgICAgICAgICAsIGFyZ3MsIGJlYW5EZWxcblxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmIChoYW5kbGVyc1tpXS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgYXJncyA9IFsgZWxlbWVudCwgaGFuZGxlcnNbaV0udHlwZSBdXG4gICAgICAgICAgICBpZiAoYmVhbkRlbCA9IGhhbmRsZXJzW2ldLmhhbmRsZXIuX19iZWFuRGVsKSBhcmdzLnB1c2goYmVhbkRlbC5zZWxlY3RvcilcbiAgICAgICAgICAgIGFyZ3MucHVzaChoYW5kbGVyc1tpXS5vcmlnaW5hbClcbiAgICAgICAgICAgIG9uLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAsIGJlYW4gPSB7XG4gICAgICAgICAgJ29uJyAgICAgICAgICAgICAgICA6IG9uXG4gICAgICAgICwgJ2FkZCcgICAgICAgICAgICAgICA6IGFkZFxuICAgICAgICAsICdvbmUnICAgICAgICAgICAgICAgOiBvbmVcbiAgICAgICAgLCAnb2ZmJyAgICAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ3JlbW92ZScgICAgICAgICAgICA6IG9mZlxuICAgICAgICAsICdjbG9uZScgICAgICAgICAgICAgOiBjbG9uZVxuICAgICAgICAsICdmaXJlJyAgICAgICAgICAgICAgOiBmaXJlXG4gICAgICAgICwgJ0V2ZW50JyAgICAgICAgICAgICA6IEV2ZW50XG4gICAgICAgICwgJ3NldFNlbGVjdG9yRW5naW5lJyA6IHNldFNlbGVjdG9yRW5naW5lXG4gICAgICAgICwgJ25vQ29uZmxpY3QnICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRleHRbbmFtZV0gPSBvbGRcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gIC8vIGZvciBJRSwgY2xlYW4gdXAgb24gdW5sb2FkIHRvIGF2b2lkIGxlYWtzXG4gIGlmICh3aW4uYXR0YWNoRXZlbnQpIHtcbiAgICB2YXIgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpLCBlbnRyaWVzID0gcmVnaXN0cnkuZW50cmllcygpXG4gICAgICBmb3IgKGkgaW4gZW50cmllcykge1xuICAgICAgICBpZiAoZW50cmllc1tpXS50eXBlICYmIGVudHJpZXNbaV0udHlwZSAhPT0gJ3VubG9hZCcpIG9mZihlbnRyaWVzW2ldLmVsZW1lbnQsIGVudHJpZXNbaV0udHlwZSlcbiAgICAgIH1cbiAgICAgIHdpbi5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICAgICAgd2luLkNvbGxlY3RHYXJiYWdlICYmIHdpbi5Db2xsZWN0R2FyYmFnZSgpXG4gICAgfVxuICAgIHdpbi5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSBzZWxlY3RvciBlbmdpbmUgdG8gaW50ZXJuYWwgZGVmYXVsdCAocVNBIG9yIHRocm93IEVycm9yKVxuICBzZXRTZWxlY3RvckVuZ2luZSgpXG5cbiAgcmV0dXJuIGJlYW5cbn0pO1xuIiwiXHJcbi8qKlxyXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxyXG4gKi9cclxuXHJcbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xyXG4gIG1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxyXG4gKlxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XHJcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XHJcbn07XHJcblxyXG4vKipcclxuICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9ialxyXG4gKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAqIEBhcGkgcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1peGluKG9iaikge1xyXG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xyXG4gICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldO1xyXG4gIH1cclxuICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG4vKipcclxuICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub24gPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxyXG4gICAgLnB1c2goZm4pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxyXG4gKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICBmdW5jdGlvbiBvbigpIHtcclxuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XHJcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gIH1cclxuXHJcbiAgb24uZm4gPSBmbjtcclxuICB0aGlzLm9uKGV2ZW50LCBvbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcclxuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG5cclxuICAvLyBhbGxcclxuICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gc3BlY2lmaWMgZXZlbnRcclxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XHJcblxyXG4gIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnNcclxuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcclxuICB2YXIgY2I7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGNiID0gY2FsbGJhY2tzW2ldO1xyXG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcclxuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtNaXhlZH0gLi4uXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcclxuICAgICwgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuXHJcbiAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgY2FsbGJhY2tzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xyXG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmhhc0xpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcclxufTtcclxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKSxcbiAgICBFdmVudCAgID0gdG9vbGJveC5ldmVudCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIGRpYWxvZ0VsLFxuICAgIGZvY3VzZWRFbCxcbiAgICBkZWZhdWx0cyA9IHtcbiAgICAgIG9uU2hvdzogZnVuY3Rpb24oKXt9LFxuICAgICAgb25DbG9zZTogZnVuY3Rpb24oKXt9LFxuICAgICAgYnV0dG9uVGVtcGxhdGU6ICc8YnV0dG9uIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvblwiPjwvYnV0dG9uPicsXG4gICAgICBkaWFsb2dUZW1wbGF0ZTogJzxkaXYgcm9sZT1cImRpYWxvZ1wiIGNsYXNzPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nLXRpdGxlXCIgYXJpYS1kZXNjcmliZWRieT1cImRpYWxvZy1kZXNjcmlwdGlvblwiPlxcXG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctY2FyZFwiPlxcXG4gICAgPGhlYWRlciBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cXFxuICAgICAgPGgyIGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgaWQ9XCJkaWFsb2ctdGl0bGVcIj48L2gyPlxcXG4gICAgPC9oZWFkZXI+XFxcbiAgICA8cCBjbGFzcz1cImRpYWxvZy1kZXNjcmlwdGlvblwiIGlkPVwiZGlhbG9nLWRlc2NyaXB0aW9uXCI+PC9wPlxcXG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1yZXNwb25zZVwiPlxcXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWFjdGlvbnNcIj48L2Rpdj5cXFxuICAgIDwvZGl2PlxcXG4gIDwvZGl2PlxcXG48L2Rpdj4nfVxuXG5mdW5jdGlvbiBzaG93KCBvcHRzICkge1xuICBpZiAoIHR5cGVvZiBvcHRzICE9ICdvYmplY3QnICkgeyByZXR1cm4gY29uc29sZS5lcnJvcignSW52YWxpZCBvcHRpb25zIHBhc3NlZCBmb3IgRGlhbG9nJywgb3B0cykgfVxuXG4gIGlmICggIW9wdHMudGl0bGUgKSB7IHJldHVybiBjb25zb2xlLmVycm9yKCdEaWFsb2cgbXVzdCBoYXZlIGEgdGl0bGUnLCBvcHRzKSB9XG5cbiAgZm9jdXNlZEVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICBvcHRpb25zID0gb3B0c1xuICBkaWFsb2dFbCA9IHRlbXBsYXRlKCBkZWZhdWx0cy5kaWFsb2dUZW1wbGF0ZSApXG5cbiAgYWRkVGV4dCgpXG4gIGFkZEJ1dHRvbnMoKVxuXG4gIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCAnYWZ0ZXJiZWdpbicsIGRpYWxvZ0VsIClcblxuICBsaXN0ZW4oKVxuXG4gIGRlZmF1bHRzLm9uU2hvdygpXG59XG5cbmZ1bmN0aW9uIGxpc3RlbigpIHtcblxuICBFdmVudC5vbiggZGlhbG9nRWwsICdjbGljaycsICcuZGlhbG9nLWNvbnRpbnVlJywgY29udGludWVBY3Rpb24gKVxuICBFdmVudC5vbiggZGlhbG9nRWwsICdjbGljaycsICcuZGlhbG9nLWNhbmNlbCcsIGNhbmNlbEFjdGlvbiApXG4gIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBkaWFsb2dFbCwgdGFiLCB0cnVlIClcblxuICBFdmVudC5rZXlPbiggICd0YWInLCAgICdkaWFsb2cnLCB0YWIgKVxuICBFdmVudC5rZXlPbmUoICdlbnRlcicsICdkaWFsb2cnLCBjb250aW51ZUFjdGlvbiApXG4gIEV2ZW50LmtleU9uZSggJ2VzYycsICAgJ2RpYWxvZycsIGNhbmNlbEFjdGlvbiApXG5cbiAgRXZlbnQua2V5LnNldFNjb3BlKCAnZGlhbG9nJyApXG59XG5cbi8vIEFkZCB0aXRsZSBhbmQgZGVzY3JpcHRpb24gZnJvbSBvcHRpb25zXG5mdW5jdGlvbiBhZGRUZXh0KCkge1xuXG4gIC8vIEFkZCB0aXRsZVxuICBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCAnI2RpYWxvZy10aXRsZScgKS5pbm5lckhUTUwgPSBvcHRpb25zLnRpdGxlXG5cbiAgLy8gQWRkIG9wdGlvbmFsIGRlc2NyaXB0aW9uXG4gIHZhciBkZXNjcmlwdGlvbkVsID0gZGlhbG9nRWwucXVlcnlTZWxlY3RvciggJyNkaWFsb2ctZGVzY3JpcHRpb24nIClcblxuICBpZiAoIG9wdGlvbnMuZGVzY3JpcHRpb24gKSB7XG4gICAgZGVzY3JpcHRpb25FbC5pbm5lckhUTUwgPSBvcHRpb25zLmRlc2NyaXB0aW9uXG4gIH0gZWxzZSB7XG4gICAgZGVzY3JpcHRpb25FbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBkZXNjcmlwdGlvbkVsIClcbiAgICBkaWFsb2dFbC5yZW1vdmVBdHRyaWJ1dGUoICdhcmlhLWxhYmVsbGVkYnknIClcbiAgfVxuXG59XG5cbi8vIEFkZCBDYW5jZWwgYW5kIENvbnRpbnVlIGJ1dHRvbnMgKGlmIG5lY2Vzc2FyeSlcbmZ1bmN0aW9uIGFkZEJ1dHRvbnMoKSB7XG5cbiAgaWYgKCBvcHRpb25zLmNvbnRpbnVlIHx8IG9wdGlvbnMuZm9sbG93IHx8IG9wdGlvbnMuc3VibWl0ICkge1xuXG4gICAgdmFyIGNvbnRpbnVlQnV0dG9uID0gdGVtcGxhdGUoIGRlZmF1bHRzLmJ1dHRvblRlbXBsYXRlIClcbiAgICBjb250aW51ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGlhbG9nLWNvbnRpbnVlJyApXG4gICAgaWYgKCBvcHRpb25zLmRlc3RydWN0aXZlICkgeyBjb250aW51ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGVzdHJ1Y3RpdmUnICkgfVxuICAgIGNvbnRpbnVlQnV0dG9uLmlubmVySFRNTCA9IG9wdGlvbnMuY29udGludWUgfHwgJ0NvbnRpbnVlJ1xuXG4gICAgZGlhbG9nRWwucXVlcnlTZWxlY3RvcignLmRpYWxvZy1hY3Rpb25zJykuYXBwZW5kQ2hpbGQoIGNvbnRpbnVlQnV0dG9uIClcblxuICAgIG9wdGlvbnMuY2FuY2VsID0gb3B0aW9ucy5jYW5jZWwgfHwgJ0NhbmNlbCdcbiAgfVxuXG4gIHZhciBjYW5jZWxCdXR0b24gPSB0ZW1wbGF0ZSggZGVmYXVsdHMuYnV0dG9uVGVtcGxhdGUgKVxuXG4gIGNhbmNlbEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGlhbG9nLWNhbmNlbCcgKVxuICBjYW5jZWxCdXR0b24uaW5uZXJIVE1MID0gb3B0aW9ucy5jYW5jZWwgfHwgKCBvcHRpb25zLmNvbnRpbnVlID8gJ0NhbmNlbCcgOiAnT0snIClcblxuICBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCcuZGlhbG9nLWFjdGlvbnMnKS5hcHBlbmRDaGlsZCggY2FuY2VsQnV0dG9uIClcblxufVxuXG4vLyBJbiBhIG1vZGFsIHdpbmRvdywgYHRhYmAgbXVzdCBjeWNsZSBiZXR3ZWVuIGVsZW1lbnRzIGluIHRoZSBtb2RhbC5cbmZ1bmN0aW9uIHRhYiggZXZlbnQgKSB7XG5cbiAgLy8gRmluZCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIGluIHRoZSBkaWFsb2cgY2FyZFxuICB2YXIgZm9jdXNhYmxlICAgPSBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksIHRleHRhcmVhLCBzZWxlY3QsIGJ1dHRvbicpLFxuICAgICAgbGFzdCAgICAgICAgPSBmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdLFxuICAgICAgZm9jdXNlZCAgICAgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgLy8gSWYgZm9jdXNlZCBvbiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCwgdGFiIHRvIHRoZSBmaXJzdCBlbGVtZW50LlxuICBpZiAoIGZvY3VzZWQgPT0gbGFzdCApIHtcbiAgICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuICAgIGZvY3VzYWJsZVswXS5mb2N1cygpXG4gIH1cblxuICAvLyBGb2N1cyBvbiB0aGUgbGFzdCBlbGVtZW50IGlmIHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIGRpYWxvZ1xuICBpZiAoICFmb2N1c2VkIHx8ICF0b29sYm94LmNoaWxkT2YoIGZvY3VzZWQsIGRpYWxvZ0VsICkgKSB7XG4gICAgbGFzdC5mb2N1cygpXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckJ1dHRvbiggc2VsZWN0b3IgKSB7XG4gIHZhciBidXR0b24gPSBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApXG5cbiAgYnV0dG9uLmZvY3VzKClcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnIClcbn1cblxuZnVuY3Rpb24gY2FuY2VsQWN0aW9uIChldmVudCkge1xuICBpZiAoZXZlbnQpeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cblxuICB0cmlnZ2VyQnV0dG9uKCAnLmRpYWxvZy1jYW5jZWwnIClcblxuICBjbG9zZSggb3B0aW9ucy5vbkRpc21pc3MgKVxufVxuXG5mdW5jdGlvbiBjb250aW51ZUFjdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuXG4gIHRyaWdnZXJCdXR0b24oICcuZGlhbG9nLWNvbnRpbnVlJyApXG5cbiAgY2xvc2UoIGZ1bmN0aW9uKCkge1xuICAgIGlmICggb3B0aW9ucy5zdWJtaXQgKSB7XG5cbiAgICAgIC8vIElzIGl0IGFuIGVsZW1lbnQgb3IgYSBzdHJpbmdcbiAgICAgIHZhciBmb3JtID0gKCBvcHRpb25zLnN1Ym1pdC5ub2RlVHlwZSA/IG9wdGlvbnMuc3VibWl0IDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25zLnN1Ym1pdCkgKVxuXG4gICAgICBFdmVudC5zdWJtaXQoIGZvcm0gKVxuXG4gICAgfSBlbHNlIGlmICggb3B0aW9ucy5mb2xsb3cgKSB7XG4gICAgICBpZiggb3B0aW9ucy5mb2xsb3cubWF0Y2goL15odHRwcz86XFwvXFwvLykgKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBvcHRpb25zLmZvbGxvd1xuICAgICAgZWxzZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG9wdGlvbnMuZm9sbG93XG4gICAgfVxuXG4gICAgaWYgKCBvcHRpb25zLm9uQ29uZmlybSApIG9wdGlvbnMub25Db25maXJtKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gY2xvc2UoIGNhbGxiYWNrICl7XG4gIGRpYWxvZ0VsLmNsYXNzTGlzdC5hZGQoICdkaXNtaXNzJyApXG5cbiAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGRpYWxvZ0VsLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgaWYgKCBjYWxsYmFjayApIHsgY2FsbGJhY2soKSB9XG4gICAgcmVtb3ZlKClcbiAgfSwgdHJ1ZSlcbn1cblxuXG5mdW5jdGlvbiByZW1vdmUoKXtcblxuICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICBFdmVudC5rZXkuZGVsZXRlU2NvcGUoICdkaWFsb2cnIClcbiAgRXZlbnQub2ZmKCBkaWFsb2dFbCwgJ2NsaWNrJyApXG5cbiAgLy8gUmVtb3ZlIHRoZSBlbGVtZW50XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpYWxvZ0VsIClcblxuICAvLyBGaXJlIG9uIGNsb3NlIGNhbGxiYWNrXG4gIGRlZmF1bHRzLm9uQ2xvc2UoKVxuXG4gIC8vIFJldHVybiBmb2N1cyB0byB0aGUgZm9jdXNlZCBlbGVtZW50IGJlZm9yZSB0aGUgZGlhbG9nIHdhcyBzaG93blxuICBmb2N1c2VkRWwuZm9jdXMoKVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZSggaHRtbCApIHtcbiAgd3JhcC5pbm5lckhUTUwgPSBodG1sXG4gIHZhciBlbCA9IHdyYXAuZmlyc3RDaGlsZFxuICB3cmFwLnJlbW92ZUNoaWxkKCBlbCApXG4gIHJldHVybiBlbFxufVxuXG4vLyBHZXQgYWxsIG9wdGlvbnMgZnJvbSBkYXRhLWRpYWxvZy0qXG5mdW5jdGlvbiBleHRyYWN0T3B0aW9ucyggZWwgKSB7XG4gIHZhciBvcHRzID0ge1xuICAgIGlmOiAgICAgICAgICAgZWwuZGF0YXNldC5kaWFsb2dJZixcbiAgICBmb2xsb3c6ICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nRm9sbG93LFxuICAgIHRpdGxlOiAgICAgICAgZWwuZGF0YXNldC5kaWFsb2dUaXRsZSxcbiAgICBkZXNjcmlwdGlvbjogIGVsLmRhdGFzZXQuZGlhbG9nRGVzY3JpcHRpb24sXG4gICAgc3VibWl0OiAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ1N1Ym1pdCxcbiAgICBjb250aW51ZTogICAgIGVsLmRhdGFzZXQuZGlhbG9nQ29udGludWUsXG4gICAgY2FuY2VsOiAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ0NhbmNlbCxcbiAgICBjb25maXJtOiAgICAgIGVsLmRhdGFzZXQuZGlhbG9nQ29uZmlybSxcbiAgICBkZXN0cnVjdGl2ZTogIGVsLmRhdGFzZXQuZGlhbG9nRGVzdHJ1Y3RpdmVcbiAgfVxuXG4gIGlmICggb3B0cy5jb25maXJtICkge1xuICAgIG9wdHMuY29udGludWUgPSBvcHRzLmNvbnRpbnVlIHx8IGVsLmlubmVySFRNTFxuICAgIG9wdHMuc3VibWl0ICAgPSBvcHRzLnN1Ym1pdCAgIHx8IHRvb2xib3guZ2V0Q2xvc2VzdCggZWwsICdmb3JtJyApXG4gIH1cblxuICByZXR1cm4gb3B0c1xufVxuXG5FdmVudC5yZWFkeShmdW5jdGlvbigpIHtcblxuICAvLyBUcmlnZ2VyIGlzIGNhbGxlZCB3aGVuIGEgRE9NIGVsZW1lbnQgd2l0aCBkYXRhLXRyaWdnZXI9ZGlhbG9nIGlzIGNsaWNrZWRcbiAgLy8gVGhlIGRhdGEgYXR0cmlidXRlcyBhcmUgdXNlZCBhcyBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIGRpYWxvZ1xuICAvL1xuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1kaWFsb2ctdGl0bGVdJywgZnVuY3Rpb24oZXZlbnQpe1xuICAgIHZhciBvcHRzID0gZXh0cmFjdE9wdGlvbnMoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKVxuICAgIGlmICggIW9wdHMuaWYgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRzLmlmKSApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBzaG93KCBvcHRzIClcbiAgICB9XG4gIH0pXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2hvdzogc2hvdyxcbiAgY2FuY2VsOiBjYW5jZWxBY3Rpb24sXG4gIGNvbnRpbnVlOiBjb250aW51ZUFjdGlvbixcbiAgZGVmYXVsdHM6IGRlZmF1bHRzXG59XG4iLCIvLyBTaGltc1xucmVxdWlyZSggJy4vbGliL3NoaW1zL19jbGFzc2xpc3QnIClcbnZhciBtZXJnZSAgICA9IHJlcXVpcmUoICcuL2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbicgKSxcbiAgICBldmVudCAgICA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIGx1eG9uICAgID0gcmVxdWlyZSggJ2x1eG9uJyApLFxuICAgIHRpbWUgICAgID0gbWVyZ2UocmVxdWlyZSggJy4vbGliL3RpbWUnICksIGx1eG9uKSxcbiAgICBzY3JvbGxUbyA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGx0bycgKSxcbiAgICBmcm9tVG9wICA9IHJlcXVpcmUoICcuL2xpYi9mcm9tdG9wJyApLFxuICAgIGVhc2UgICAgID0gcmVxdWlyZSggJy4vbGliL2Vhc2UnIClcblxudmFyIHRvb2xib3ggPSB7XG5cbiAgZXZlbnQ6IGV2ZW50LFxuICBzY3JvbGxUbzogc2Nyb2xsVG8sXG4gIGZyb21Ub3A6IGZyb21Ub3AsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZWFzZTogZWFzZSxcbiAgdGltZTogdGltZSxcblxuICAvLyBHZXQgY2xvc2VzdCBET00gZWxlbWVudCB1cCB0aGUgdHJlZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXRDbG9zZXN0OiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIGVsLCBzZWxlY3RvciApICkgcmV0dXJuIGVsXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIGNoaWxkT2Y6IGZ1bmN0aW9uICggZWwsIHBhcmVudCApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbCA9PSBwYXJlbnQgKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgLy8gR2V0IG5leHQgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0TmV4dDogZnVuY3Rpb24oIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApICkgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvLyBNYXRjaGVzIHNlbGVjdG9yIGZ1bmN0aW9uXG4gIC8vIEByZWZlcmVuY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICBtYXRjaGVzOiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gKCBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm9NYXRjaGVzU2VsZWN0b3IgKS5jYWxsKCBlbCwgc2VsZWN0b3IgKTtcbiAgfSxcblxuICB3b3JkQ291bnQ6IGZ1bmN0aW9uKCBzdHIgKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goIC9cXFMrL2cgKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbiAgfSxcblxuICAvLyBFYXN5IGFjY2VzcyB0byBzbGljZSBmb3IgY29udmVydGluZyBvYmplY3RzIGludG8gYXJyYXlzIG9mIHZhbHVlcy5cbiAgc2xpY2U6IGZ1bmN0aW9uKCBvYmosIGNvdW50ICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggb2JqLCBjb3VudCApXG4gIH0sXG5cbiAgZWFjaDogZnVuY3Rpb24oIGNvbGxlY3Rpb24sIGNhbGxiYWNrICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApXG4gIH0sXG5cbiAgZm9ybURhdGE6IGZ1bmN0aW9uKCByb290RWwgKSB7XG4gICAgdmFyIGZvcm1EYXRhICA9IG5ldyBGb3JtRGF0YSgpLFxuICAgICAgICBmaWVsZHMgPSByb290RWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W25hbWVdJyApXG5cbiAgICAvLyBMb29wIG92ZXIgZmllbGRzXG4gICAgdG9vbGJveC5lYWNoKCBmaWVsZHMsIGZ1bmN0aW9uKCBmaWVsZCApIHtcbiAgICAgIC8vIEFwcGVuZCBjdXJyZW50IGZpZWxk4oCZcyBuYW1lL3ZhbHVlIHRvIG5ldyBmb3JtRGF0YSBvYmplY3RcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCggZmllbGQubmFtZSwgZmllbGQudmFsdWUgKTtcbiAgICB9KVxuXG4gICAgLy8gVGhlbiByZXR1cm4gc2FpZCBmb3JtRGF0YSBvYmplY3RcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbGJveFxuIiwiLy8gZWFzaW5nIGZ1bmN0aW9ucyBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbnZhciBlYXNlID0ge1xuXG4gIGluT3V0UXVhZDogZnVuY3Rpb24gKHQsIGIsIGMsIGQpIHtcbiAgICB0IC89IGQvMlxuICAgIGlmICh0IDwgMSkgeyByZXR1cm4gYy8yKnQqdCArIGIgfVxuICAgIHQtLVxuICAgIHJldHVybiAtYy8yICogKHQqKHQtMikgLSAxKSArIGJcbiAgfSxcblxuICBpbk91dEN1YmljOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuXHR0IC89IGQvMjtcblx0aWYgKHQgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjtcblx0dCAtPSAyO1xuXHRyZXR1cm4gYy8yKih0KnQqdCArIDIpICsgYjtcbiAgfSxcblxuICBpbk91dFF1aW50OiBmdW5jdGlvbih0LCBiLCBjLCBkKSB7XG4gICAgdmFyIHRzID0gKHQvPWQpKnQsXG4gICAgdGMgPSB0cyp0O1xuICAgIHJldHVybiBiK2MqKDYqdGMqdHMgKyAtMTUqdHMqdHMgKyAxMCp0Yyk7XG4gIH0sXG5cbiAgaW5PdXRDaXJjOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yO1xuICAgIGlmICh0IDwgMSkgcmV0dXJuIC1jLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpIC0gMSkgKyBiO1xuICAgIHQgLT0gMjtcbiAgICByZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSArIDEpICsgYjtcbiAgfVxuXG59XG5cbmVhc2UuZGVmYXVsdCA9IGVhc2UuaW5PdXRRdWFkXG5cbm1vZHVsZS5leHBvcnRzID0gZWFzZVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggZWwgKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKCBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQgKTtcbn1cbiIsInZhciBlYXNlICAgID0gcmVxdWlyZSggJy4vZWFzZScgKVxudmFyIGZyb21Ub3AgPSByZXF1aXJlKCAnLi9mcm9tdG9wJyApXG5cbmZ1bmN0aW9uIG1vdmUoYW1vdW50KSB7XG5cbiAgLy8gU2Nyb2xsIGFsbCBiZWNhdXNlIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgaXMgc3RpbGwgZXhwaXJlbWVudGFsXG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gYW1vdW50O1xuXG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxUbyh0bywgY2FsbGJhY2ssIGR1cmF0aW9uKSB7XG5cbiAgLy8gTWFraW5nIGFyZ3MgZmxleGlibGVcbiAgLy9cbiAgLy8gQWxsb3cgZm9yIGVsZW1lbnQgb3IgeS1jb29yZGluYXRlc1xuICBpZiggdHlwZW9mKCB0byApID09PSAnb2JqZWN0JyApIHsgdG8gPSBmcm9tVG9wKCB0byApIH1cblxuICAvLyBBY2NlcHQgZHVyYXRpb24gYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICBpZiggdHlwZW9mKCBjYWxsYmFjayApID09PSAnbnVtYmVyJyApIHsgZHVyYXRpb24gPSBjYWxsYmFjazsgY2FsbGJhY2sgPSBudWxsIH1cblxuICAvLyBEZWZhdWx0IGR1cmF0aW9uID0gNTAwXG4gIGR1cmF0aW9uID0gKCB0eXBlb2YoIGR1cmF0aW9uICkgPT09ICd1bmRlZmluZWQnICkgPyA1MDAgOiBkdXJhdGlvblxuXG4gIHZhciBzdGFydCA9IHBvc2l0aW9uKCksXG4gICAgY2hhbmdlID0gdG8gLSBzdGFydCxcbiAgICBjdXJyZW50VGltZSA9IDAsXG4gICAgaW5jcmVtZW50ID0gMjA7XG5cblxuICB2YXIgYW5pbWF0ZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gaW5jcmVtZW50IHRoZSB0aW1lXG4gICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50XG5cbiAgICAvLyBmaW5kIHRoZSB2YWx1ZSB3aXRoIHRoZSBxdWFkcmF0aWMgaW4tb3V0IGVhc2luZyBmdW5jdGlvblxuICAgIHZhciB2YWwgPSBlYXNlLmRlZmF1bHQoY3VycmVudFRpbWUsIHN0YXJ0LCBjaGFuZ2UsIGR1cmF0aW9uKVxuXG4gICAgLy8gbW92ZSB0aGUgZG9jdW1lbnQuYm9keVxuICAgIG1vdmUodmFsKTtcblxuICAgIC8vIGRvIHRoZSBhbmltYXRpb24gdW5sZXNzIGl0cyBvdmVyXG4gICAgaWYgKCBjdXJyZW50VGltZSA8IGR1cmF0aW9uICkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRlU2Nyb2xsIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBjYWxsYmFjayAmJiB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVTY3JvbGwoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjcm9sbFRvXG4iLCIvKipcbiAqIENsYXNzTGlzdCBwb2x5ZmlsbFxuICogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzXG4gKiBAYXV0aG9yIEVsaSBHcmV5IC0gaHR0cDovL2VsaWdyZXkuY29tXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCAnZG9jdW1lbnQnIGluIHNlbGYgKSB7XG5cbiAgLy8gRnVsbCBwb2x5ZmlsbCBmb3IgYnJvd3NlcnMgd2l0aCBubyBjbGFzc0xpc3Qgc3VwcG9ydFxuICBpZiAoICEoICdjbGFzc0xpc3QnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApICkgKSB7XG5cbiAgICAoIGZ1bmN0aW9uKCB2aWV3ICkge1xuXG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgaWYgKCAhKCAnRWxlbWVudCcgaW4gdmlldyApICkgcmV0dXJuO1xuXG4gICAgdmFyXG4gICAgICBjbGFzc0xpc3RQcm9wID0gJ2NsYXNzTGlzdCcsXG4gICAgICBwcm90b1Byb3AgICAgID0gJ3Byb3RvdHlwZScsXG4gICAgICBlbGVtQ3RyUHJvdG8gID0gdmlldy5FbGVtZW50WyBwcm90b1Byb3AgXSxcbiAgICAgIG9iakN0ciAgICAgICAgPSBPYmplY3QsXG5cbiAgICAgIHN0clRyaW0gPSBTdHJpbmdbIHByb3RvUHJvcCBdLnRyaW0gfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoIC9eXFxzK3xcXHMrJC9nLCAnJyApO1xuICAgICAgfSxcblxuICAgICAgYXJySW5kZXhPZiA9IEFycmF5WyBwcm90b1Byb3AgXS5pbmRleE9mIHx8IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgIGlmICggaSBpbiB0aGlzICYmIHRoaXNbIGkgXSA9PT0gaXRlbSApIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9LFxuXG4gICAgICBET01FeCA9IGZ1bmN0aW9uKCB0eXBlLCBtZXNzYWdlICkge1xuICAgICAgICB0aGlzLm5hbWUgICAgPSB0eXBlO1xuICAgICAgICB0aGlzLmNvZGUgICAgPSBET01FeGNlcHRpb25bIHR5cGUgXTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0sXG5cbiAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uKCBjbGFzc0xpc3QsIHRva2VuICkge1xuICAgICAgICBpZiAoIHRva2VuID09PSAnJyApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXG4gICAgICAgICAgICAnU1lOVEFYX0VSUicsXG4gICAgICAgICAgICAnQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAvXFxzLy50ZXN0KCB0b2tlbiApICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdJTlZBTElEX0NIQVJBQ1RFUl9FUlInLFxuICAgICAgICAgICAgJ1N0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoIGNsYXNzTGlzdCwgdG9rZW4gKTtcbiAgICAgIH0sXG5cbiAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgICB2YXIgdHJpbW1lZENsYXNzZXMgPSBzdHJUcmltLmNhbGwoIGVsZW0uZ2V0QXR0cmlidXRlKCAnY2xhc3MnICkgfHwgJycgKSxcbiAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KCAvXFxzKy8gKSA6IFtdO1xuXG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCAnY2xhc3MnLCB0aGlzLnRvU3RyaW5nKCkgKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGNsYXNzTGlzdFByb3RvID0gQ2xhc3NMaXN0WyBwcm90b1Byb3AgXSA9IFtdLFxuXG4gICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QoIHRoaXMgKTtcbiAgICAgIH07XG5cbiAgICBET01FeFsgcHJvdG9Qcm9wIF0gPSBFcnJvclsgcHJvdG9Qcm9wIF07XG5cbiAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24oIGkgKSB7XG4gICAgICByZXR1cm4gdGhpc1sgaSBdIHx8IG51bGw7XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLmNvbnRhaW5zID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG4gICAgICByZXR1cm4gY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApICE9PSAtMTtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXJcbiAgICAgICAgdG9rZW5zICA9IGFyZ3VtZW50cyxcbiAgICAgICAgaXRlciAgICA9IDAsXG4gICAgICAgIGxlbiAgICAgPSB0b2tlbnMubGVuZ3RoLFxuICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG4gICAgICAgIHRva2VuO1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaWYgKCBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgPT09IC0xICkge1xuICAgICAgICAgIHRoaXMucHVzaCggdG9rZW4gKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGluZGV4O1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG5cbiAgICAgICAgd2hpbGUgKCBpbmRleCAhPT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5zcGxpY2UoIGluZGV4LCAxICk7XG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCArK2l0ZXIgPCBsZW4gKTtcblxuICAgICAgaWYgKCB1cGRhdGVkICkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8udG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgIHRva2VuICs9ICcnO1xuXG4gICAgICB2YXJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jb250YWlucyggdG9rZW4gKSxcbiAgICAgICAgbWV0aG9kID0gcmVzdWx0ID8gZm9yY2UgIT09IHRydWUgJiYgJ3JlbW92ZScgOiBmb3JjZSAhPT0gZmFsc2UgJiYgJ2FkZCc7XG5cbiAgICAgIGlmICggbWV0aG9kICkge1xuICAgICAgICB0aGlzWyBtZXRob2QgXSggdG9rZW4gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuam9pbiggJyAnICk7XG4gICAgfTtcblxuICAgIGlmICggb2JqQ3RyLmRlZmluZVByb3BlcnR5ICkge1xuICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuICAgICAgICAgIGdldCAgICAgICAgICA6IGNsYXNzTGlzdEdldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlICAgOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZSA6IHRydWVcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgfVxuXG4gICAgICBjYXRjaCAoIGV4ICkge1xuICAgICAgICBpZiAoIGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQgKSB7XG4gICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCBvYmpDdHJbIHByb3RvUHJvcCBdLl9fZGVmaW5lR2V0dGVyX18gKSB7XG4gICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyggY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyICk7XG4gICAgfVxuXG4gICAgfSggc2VsZiApKTtcblxuICB9IGVsc2Uge1xuXG4gICAgKCBmdW5jdGlvbigpIHtcblxuICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnXycgKTtcblxuICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ2MxJywgJ2MyJyApO1xuXG4gICAgICBpZiAoICF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoICdjMicgKSApIHtcbiAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uKCBtZXRob2QgKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZVsgbWV0aG9kIF07XG5cbiAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB0b2tlbiApIHtcbiAgICAgICAgICAgIHZhciBpLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3VtZW50c1sgaSBdO1xuICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKCB0aGlzLCB0b2tlbiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNyZWF0ZU1ldGhvZCggJ2FkZCcgKTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAncmVtb3ZlJyApO1xuICAgICAgfVxuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCAnYzMnLCBmYWxzZSApO1xuXG4gICAgICBpZiAoIHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MzJyApICkge1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO1xuXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgICAgICBpZiAoIDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKCB0b2tlbiApID09PSAhZm9yY2UgKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblxuICAgIH0oKSk7XG5cbiAgfVxufVxuIiwiLyoqXG4gKiBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgT2JqZWN0LmFzc2lnbiBpbXBsZW1lbnRhdGlvblxuICogQHNvdXJjZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduI1BvbHlmaWxsXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCB0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPSAnZnVuY3Rpb24nICkge1xuICAoIGZ1bmN0aW9uKCkge1xuICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiggdGFyZ2V0ICkge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuICAgICAgZm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrICkge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuICAgICAgICBpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7XG4gICAgICAgICAgICBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG4gICAgICAgICAgICAgIG91dHB1dFsgbmV4dEtleSBdID0gc291cmNlWyBuZXh0S2V5IF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG4gIH0pKCk7XG59XG5cbi8vIE1ha2UgaXQgZWFzeSB0byBtZXJnZSBvYmplY3RzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlIG9yaWdpbmFsIG9iamVjdHNcbnZhciBtZXJnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IFt7fV0uY29uY2F0KCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseSggdGhpcywgYXJncyApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2VcbiIsInZhciBEYXRlVGltZSA9IHJlcXVpcmUoICdsdXhvbicgKS5EYXRlVGltZVxuXG5mdW5jdGlvbiBpc0JlZm9yZSggZGF0ZSwgZW5kICkge1xuICBlbmQgPSBwYXJzZSggZW5kIClcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgcmV0dXJuIGRhdGUgPT0gRGF0ZVRpbWUubWluKCBlbmQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0FmdGVyKCBkYXRlLCBzdGFydCApIHtcbiAgc3RhcnQgPSBwYXJzZSggc3RhcnQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlIClcbn1cblxuZnVuY3Rpb24gaXNCZXR3ZWVuKCBkYXRlLCBkYXRlMSwgZGF0ZTIgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIGRhdGUxID0gcGFyc2UoIGRhdGUxIClcbiAgZGF0ZTIgPSBwYXJzZSggZGF0ZTIgKVxuXG4gIGlmICggZGF0ZS5pc1ZhbGlkICYmIGRhdGUxLmlzVmFsaWQgJiYgZGF0ZTIuaXNWYWxpZCApIHtcbiAgICAvLyBEZXRlcm1pbmUgc3RhcnQgYW5kIGVuZCBkYXRlcyAodG8gYWxsb3cgYW55IG9yZGVyIGluIGFyZ3MpXG4gICAgdmFyIHN0YXJ0ID0gRGF0ZVRpbWUubWluKCBkYXRlMSwgZGF0ZTIgKVxuICAgIHZhciBlbmQgPSBEYXRlVGltZS5tYXgoIGRhdGUxLCBkYXRlMiApXG5cbiAgICByZXR1cm4gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApID09IERhdGVUaW1lLm1pbiggZGF0ZSwgZW5kIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZSggZGF0ZSwgb3B0aW9ucyApIHtcbiAgdmFyIGZvcm1hdHMgPSBbIFwiSVNPXCIsIFwiU1FMXCIsIFwiSFRUUFwiLCBcIlJGQzI4MjJcIiBdLFxuICAgICAgcGFyc2VkRGF0ZVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKCBvcHRpb25zLm1pbGxpcyAmJiAhaXNOYU4oIGRhdGUgKSApIHtcbiAgICBkYXRlID0gTnVtYmVyKCBkYXRlIClcbiAgICBmb3JtYXRzLnVuc2hpZnQoJ01pbGxpcycpXG4gIH1cblxuICBpZiAoIHR5cGVvZiBkYXRlID09ICdvYmplY3QnICkge1xuICAgIFxuICAgIC8vIElzIGFscmVhZHkgYSBEYXRlVGltZSBvYmplY3RcbiAgICBpZiAoIGRhdGUudG9JU08gKSByZXR1cm4gZGF0ZVxuICAgIGVsc2UgZm9ybWF0cy51bnNoaWZ0KCAnT2JqZWN0JyApXG5cbiAgLy8gUGFyc2Ugc3RyaW5nIGZvcm1hdHNcbiAgfVxuXG4gIGZvcm1hdHMuZm9yRWFjaCggZnVuY3Rpb24oIGZvcm1hdCApIHtcbiAgICBpZiAoKCAhcGFyc2VkRGF0ZSB8fCAhcGFyc2VkRGF0ZS5pc1ZhbGlkICkgJiYgRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0gKSB7XG4gICAgICBwYXJzZWREYXRlID0gRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0oIGRhdGUsIG9wdGlvbnMgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcGFyc2VkRGF0ZS5pc1ZhbGlkID8gcGFyc2VkRGF0ZSA6IGZhbHNlXG59XG5cbi8vIFJlbW92ZSBpbnNpZ25pZmljYW50IGRpZ2l0c1xuZnVuY3Rpb24gcHJldHR5UHJpbnQoIGRhdGUsIG9wdGlvbnMgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSwgb3B0aW9ucyApXG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy56b25lKSBkYXRlID0gZGF0ZS5zZXRab25lKG9wdGlvbnMuem9uZSlcblxuICBpZiAoIGRhdGUgKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU08oKS5yZXBsYWNlKCdUJywgJyAnKS5yZXBsYWNlKCcuMDAwJywnICcpLnJlcGxhY2UoJzowMCAnLCcgJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJVbnBhcnNlYWJsZSBkYXRlIHN0cmluZ1wiIFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0JlZm9yZTogaXNCZWZvcmUsXG4gIGlzQWZ0ZXI6IGlzQWZ0ZXIsXG4gIGlzQmV0d2VlbjogaXNCZXR3ZWVuLFxuICBwYXJzZTogcGFyc2UsXG4gIHByZXR0eVByaW50OiBwcmV0dHlQcmludFxufVxuIiwicmVxdWlyZSggJy4vbGliL3NoaW1zL2N1c3RvbS1ldmVudCcgKVxuXG52YXIgYmVhbiA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIga2V5ICA9IHJlcXVpcmUoICdrZXltYXN0ZXInICkgXG52YXIgYW5pbWF0aW9uRXZlbnQgICAgPSByZXF1aXJlKCAnLi9saWIvYW5pbWF0aW9uLWV2ZW50cycgKVxudmFyIHBhZ2UgICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3BhZ2UnIClcbnZhciB0YXAgICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90YXAtZXZlbnRzJyApXG52YXIgZGVib3VuY2UgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvZGVib3VuY2UnIClcbnZhciB0aHJvdHRsZSAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90aHJvdHRsZScgKVxudmFyIGRlbGF5ICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlbGF5JyApXG52YXIgcmVwZWF0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcmVwZWF0JyApXG52YXIgYnViYmxlRm9ybUV2ZW50cyAgPSByZXF1aXJlKCAnLi9saWIvYnViYmxlLWZvcm0tZXZlbnRzJyApXG52YXIgc3VibWl0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc3VibWl0JyApXG52YXIgc2Nyb2xsICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsJyApXG52YXIgcmVzaXplICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcmVzaXplJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyICAgPSByZXF1aXJlKCAnLi9saWIvY2FsbGJhY2stbWFuYWdlcicgKVxudmFyIG1lZGlhICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL21lZGlhJyApXG5cbnZhciBzbGljZSAgICAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxudmFyIGZvcm1CdWJibGluZyAgICAgID0gZmFsc2VcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLy8gRE9NIGV2ZW50c1xuICBvbjogb24sXG4gIG9mZjogb2ZmLFxuICBvbmU6IG9uZSxcbiAgZmlyZTogZmlyZSxcbiAgY2xvbmU6IGJlYW4uY2xvbmUsXG4gIHJlYWR5OiBwYWdlLnJlYWR5LFxuICBjaGFuZ2U6IHBhZ2UuY2hhbmdlLFxuICBhZnRlckFuaW1hdGlvbjogYWZ0ZXJBbmltYXRpb24sXG5cbiAgLy8gTWVkaWEgcXVlcnkgZXZlbnRzXG4gIG1lZGlhOiBtZWRpYSxcblxuICAvLyBLZXlib2FyZCBldmVudHNcbiAga2V5OiBrZXksXG4gIGtleU9uOiBrZXksXG4gIGtleU9mZjoga2V5LnVuYmluZCxcbiAga2V5T25lOiBrZXlPbmUsXG5cbiAgLy8gVGltaW5nIHV0aWxpdGllc1xuICBkZWJvdW5jZTogZGVib3VuY2UsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgZGVsYXk6ICAgIGRlbGF5LFxuICByZXBlYXQ6ICAgcmVwZWF0LFxuXG4gIC8vIE9wdGltaXplZCBFdmVudCBNYW5hZ2Vyc1xuICBzY3JvbGw6ICAgICAgc2Nyb2xsLFxuICByZXNpemU6ICAgICAgcmVzaXplLFxuXG4gIGNhbGxiYWNrTWFuYWdlcjogY2FsbGJhY2tNYW5hZ2VyLFxuICBjYWxsYmFjazogY2FsbGJhY2tNYW5hZ2VyLmNhbGxiYWNrLFxuXG4gIC8vIEJ1YmJsaW5nIGZpeFxuICBidWJibGVGb3JtRXZlbnRzOiBidWJibGVGb3JtRXZlbnRzLFxuXG4gIHN1Ym1pdDogc3VibWl0XG59XG5cbi8vIEJlYW4gZG9lc24ndCBhY2NvdW50IGZvciBjcm9zcy1icm93c2VyIHN1cHBvcnQgb24gYW5pbWF0aW9uIGV2ZW50c1xuLy8gU28gcmF0aGVyIHRoYW4gcGFzcyB0aHJvdWdoIGV2ZW50cyB0byBiZWFuLCB3ZSBwcm9jZXNzIHRoZW0gdG8gYWRkXG4vLyB2ZW5kb3IgcHJlZml4ZXMgb3IgcmVtb3ZlIGV2ZW50cyBpZiBicm93c2VycyBkbyBub3Qgc3VwcG9yIHRoZW1cbi8vXG5mdW5jdGlvbiBvbiAoKSB7XG4gIHNldEV2ZW50KCAnb24nLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9mZiAoKSB7XG4gIHNldEV2ZW50KCAnb2ZmJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBvbmUgKCkge1xuICBzZXRFdmVudCggJ29uZScsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gZmlyZSAoKSB7XG5cbiAgYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApXG4gIHZhciBlbCA9IGFyZ3NbMF1cbiAgdmFyIGV2ZW50cyA9IFtdXG5cbiAgYXJnc1sxXS5zcGxpdCgnICcpLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudCApIHtcblxuICAgIHZhciBldmVudCA9IGFuaW1hdGlvbkV2ZW50LnRyYW5zZm9ybSggZXZlbnQgKVxuICAgIGlmICggIWlzRW1wdHkoIGV2ZW50ICkgKSBldmVudHMucHVzaCggZXZlbnQgKVxuXG4gIH0pXG5cbiAgaWYgKCAhaXNFbXB0eSggZXZlbnRzICkgKSB7XG5cbiAgICBhcmdzWzFdID0gZXZlbnRzLmpvaW4oICcgJyApXG4gICAgYmVhbi5maXJlLmFwcGx5KCB0aGlzLCBhcmdzIClcblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEV2ZW50KCByZWdpc3RlclR5cGUsIGFyZ3MgKSB7XG5cbiAgdHJhbnNmb3JtQXJncyggYXJncyApLmZvckVhY2goIGZ1bmN0aW9uKCBhcmcgKSB7XG4gICAgYmVhblsgcmVnaXN0ZXJUeXBlIF0uYXBwbHkoIG51bGwsIGFyZyApXG4gIH0pXG5cbn1cblxuLy8gQWRkIHN1cHBvcnQgZm9yIHVuYmluZGluZyBhIGtleSBldmVudCBhZnRlciBpdCBpcyBjYWxsZWRcbi8vXG5mdW5jdGlvbiBrZXlPbmUgKCBrZXlzLCBzY29wZSwgZm4gKSB7XG5cbiAgaWYgKCB0eXBlb2Ygc2NvcGUgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBmbiA9IHNjb3BlXG4gICAgc2NvcGUgPSAnYWxsJ1xuICB9XG5cbiAga2V5KCBrZXlzLCBzY29wZSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGtleS51bmJpbmQoIGtleXMsIHNjb3BlIClcbiAgICBmbiggZXZlbnQgKVxuICB9KVxufVxuXG5mdW5jdGlvbiBhZnRlckFuaW1hdGlvbiggZWwsIGNhbGxiYWNrLCBjaGVja1N0YXJ0ICkge1xuICB2YXIgaGFzQW5pbWF0aW9uID0gISF3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWwgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnYW5pbWF0aW9uLWR1cmF0aW9uJyApXG5cbiAgaWYgKCBoYXNBbmltYXRpb24gKSB7XG4gICAgXG4gICAgLy8gSWYgZWxlbWVudCBpcyBub3QgYW5pbWF0aW5nIGFmdGVyIGRlbGF5LCBmaXJlIGNhbGxiYWNrXG4gICAgaWYgKCBjaGVja1N0YXJ0ICkge1xuXG4gICAgICB2YXIgdGltZSA9ICgodHlwZW9mIGNoZWNrU3RhcnQgPT0gXCJudW1iZXJcIikgPyBjaGVja1N0YXJ0IDogMjApLFxuICAgICAgICAgIGRlbGF5ZWRFdmVudCA9IGRlbGF5KCBjYWxsYmFjaywgdGltZSApXG5cbiAgICAgIC8vIERlbGF5IHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGZpcmUgY2FsbGJhY2sgb25seSBhZnRlciBcbiAgICAgIC8vIGF0IGxlYXN0IG9uZSBhbmltYXRpb24gZnJhbWUgaGFzIHBhc3NlZFxuXG4gICAgICBvbmUoIGVsLCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAvLyBjYW5jZWwgZGVsYXllZCBmaXJlXG4gICAgICAgIGRlbGF5ZWRFdmVudC5zdG9wKClcblxuICAgICAgICAvLyB3YXRjaCBmb3IgYW5pbWF0aW9uIHRvIGZpbmlzaFxuICAgICAgICBvbmUoIGVsLCAnYW5pbWF0aW9uZW5kJywgY2FsbGJhY2sgKVxuICAgICAgfSlcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG4vLyBUcmFuc2Zvcm0gZXZlbnQgYXJndW1lbnRzIHRvIGhhbmRsZSB0YXAgZXZlbnQgYW5kIGNyb3NzLWJyb3dzZXIgYW5pbWF0aW9uIGV2ZW50c1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBldmVudHMgdG8gYmUgcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHlcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BcmdzKCBhcmdzICkge1xuXG4gIHZhciB0cmFuc2Zvcm1lZEFyZ3MgPSBbXVxuICB2YXIgbmV3RXZlbnRzID0ge31cbiAgdmFyIGVsZW1lbnQgPSBhcmdzLnNoaWZ0KCkgLy8gcmV0cmlldmUgZWxlbWVudFxuICB2YXIgZXZlbnRzID0gYXJncy5zaGlmdCgpXG5cbiAgLy8gZGV0ZWN0IGV2ZW50IGRlbGVnYXRlIHNlbGVjdG9yXG4gIGlmICggdHlwZW9mIGFyZ3NbMF0gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgICB2YXIgZGVsZWdhdGUgPSBhcmdzLnNoaWZ0KClcbiAgfVxuXG4gIC8vIGNvbnZlcnQgZXZlbnQgc3RyaW5ncyB0byBvYmplY3QgYmFzZWQgZXZlbnRzIGZvciBjb2RlIHNpbXBsaWZpY2F0aW9uXG4gIC8vIGV4YW1wbGU6IGFyZ3VtZW50cyAoJ2hvdmVyIGZvY3VzJywgZnVuY3Rpb24pIHdvdWxkIGJlY29tZSAoeyAnaG92ZXIgZm9jdXMnOiBmdW5jdGlvbiB9KVxuICBpZiAoIHR5cGVvZiBldmVudHMgPT0gJ3N0cmluZycgKSB7XG4gICAgdmFyIG9iakV2ZW50cyA9IHt9XG4gICAgb2JqRXZlbnRzW2V2ZW50c10gPSBhcmdzLnNoaWZ0KClcbiAgICBldmVudHMgPSBvYmpFdmVudHNcbiAgfVxuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGtleSBpbiB0aGUgZXZlbnRzIG9iamVjdCBhbmQgYWRkIHZlbmRvciBwcmVmaXhlcyB0byAnYW5pbWF0aW9uJyBldmVudHNcbiAgLy8gYW5kIHdyYXAgY2FsbGJhY2sgaW4gdGhlIHRhcCBmdW5jdGlvbiBmb3IgYWxsICd0YXAnIGV2ZW50cy5cbiAgLy9cbiAgZm9yICggZXZlbnQgaW4gZXZlbnRzICkge1xuXG4gICAgaWYgKCBldmVudHMuaGFzT3duUHJvcGVydHkoIGV2ZW50ICkgKSB7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBldmVudHNbZXZlbnRdXG5cbiAgICAgIC8vIEV2ZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBzcGFjZSBzZXBhcmF0ZWQgZ3JvdXBzIGxpa2UgXCJob3ZlciBmb2N1c1wiXG4gICAgICAvLyBUaGlzIGhhbmRsZXMgZWFjaCBldmVudCBpbmRlcGVuZGFudGx5XG4gICAgICAvL1xuICAgICAgZXZlbnQuc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZSApe1xuXG4gICAgICAgIC8vIElmIGl0IGlzIGFuIGFuaW1hdGlvbiBldmVudCwgdmVuZG9yIHByZWZpeCBpdCwgb3IgZmlyZSB0aGUgY2FsbGJhY2sgYWNjb3JkaW5nIHRvIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICBlID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBlIClcblxuICAgICAgICBpZiAoIGlzRW1wdHkoIGUgKSApIHtcbiAgICAgICAgICAvLyBJZiBpdCdzIGVtcHR5LCBpdCBoYXMgYmVlbiByZW1vdmVkIHNpbmNlIGFuaW1hdGlvbiBldmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0cmlnZ2VyIHRoZSBldmVudCBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKClcblxuICAgICAgICB9IGVsc2UgaWYgKCBlLm1hdGNoKCAvdGFwLyApICkge1xuXG4gICAgICAgICAgLy8gSWYgaXQncyBhIHRhcCBldmVudCwgd3JhcCB0aGUgY2FsbGJhY2sgYW5kIHNldCB0aGUgZXZlbnQgdG8gJ3RvdWNoc3RhcnQnXG4gICAgICAgICAgLy8gVGFwIGlzbid0IGEgcmVhbCBuYXRpdmUgZXZlbnQsIGJ1dCB0aGlzIHdyYXBwZXIgbGV0cyB1cyBzaW11bGF0ZSB3aGF0IGFcbiAgICAgICAgICAvLyBuYXRpdmUgdGFwIGV2ZW50IHdvdWxkIGJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3RXZlbnRzLnRvdWNoc3RhcnQgPSB0YXAoIGNhbGxiYWNrIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdFdmVudHNbIGUgXSA9IGNhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yICggZXZlbnQgaW4gbmV3RXZlbnRzICkge1xuICAgIHZhciBhID0gW11cbiAgICBhLnB1c2goIGVsZW1lbnQsIGV2ZW50IClcblxuICAgIGlmICggZGVsZWdhdGUgKSBhLnB1c2goIGRlbGVnYXRlIClcblxuICAgIGEucHVzaCggbmV3RXZlbnRzWyBldmVudCBdIClcbiAgICB0cmFuc2Zvcm1lZEFyZ3MucHVzaCggYS5jb25jYXQoIGFyZ3MgKSApXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtZWRBcmdzXG59XG5cblxuZnVuY3Rpb24gaXNFbXB0eSggb2JqICkge1xuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuICBpZiAoIG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT09IDAgKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICggMCA8IG9iai5sZW5ndGggKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCBoYXNPd25Qcm9wZXJ0eS5jYWxsKCBvYmosIGtleSApICkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBjc3NBbmltRXZlbnRUeXBlcyA9IGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKVxudmFyIHN1cHBvcnRlZCA9IGNzc0FuaW1FdmVudFR5cGVzLmFuaW1hdGlvbnN0YXJ0ICE9PSB1bmRlZmluZWRcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtQW5pbWF0aW9uRXZlbnRzXG59XG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnQW5pbWF0aW9uU3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ0FuaW1hdGlvbkVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnQW5pbWF0aW9uSXRlcmF0aW9uJ1xuICB9O1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFdmVudFR5cGVzKHByZWZpeCkge1xuICBwcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBhbmltYXRpb25zdGFydDogcHJlZml4ICsgJ2FuaW1hdGlvbnN0YXJ0JyxcbiAgICBhbmltYXRpb25lbmQ6IHByZWZpeCArICdhbmltYXRpb25lbmQnLFxuICAgIGFuaW1hdGlvbml0ZXJhdGlvbjogcHJlZml4ICsgJ2FuaW1hdGlvbml0ZXJhdGlvbidcbiAgfTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuaW1hdGlvbiBldmVudCB0eXBlcyB7YW5pbWF0aW9uc3RhcnQsIGFuaW1hdGlvbmVuZCwgYW5pbWF0aW9uaXRlcmF0aW9ufVxuICovXG5cbmZ1bmN0aW9uIGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKSB7XG4gIHZhciBwcmVmaXhlcyA9IFsnd2Via2l0JywgJ01veicsICdPJywgJyddO1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbiAgLy8gYnJvd3NlciBjb21wbGlhbnRcbiAgaWYgKHVuZGVmaW5lZCAhPT0gc3R5bGUuYW5pbWF0aW9uTmFtZSkge1xuICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKCk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcHJlZml4ZXMubGVuZ3RoLCBwcmVmaXg7IGkgPCBsZW47IGkrKykge1xuICAgIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuXG4gICAgaWYgKHVuZGVmaW5lZCAhPT0gc3R5bGVbcHJlZml4ICsgJ0FuaW1hdGlvbk5hbWUnXSkge1xuICAgICAgLy8gV2Via2l0XG4gICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICByZXR1cm4gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBlbHNlIGlmICgxID09PSBpKSB7XG4gICAgICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKCk7XG4gICAgICB9XG4gICAgICAvLyBPcGVyYVxuICAgICAgZWxzZSBpZiAoMiA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcyhwcmVmaXgudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5cbi8vIEFkZHMgbmVjZXNzYXJ5IGFkZCB2ZW5kb3IgcHJlZml4ZXMgb3IgY2FtZWxDYXNlZCBldmVudCBuYW1lc1xuLy9cbmZ1bmN0aW9uIHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50cyAoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5tYXRjaCgvYW5pbWF0aW9uL2kpKSB7XG4gICAgcmV0dXJuIGV2ZW50XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNzc0FuaW1FdmVudFR5cGVzW2V2ZW50XSkge1xuICAgICAgcmV0dXJuIGNzc0FuaW1FdmVudFR5cGVzW2V2ZW50XVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih3aW5kb3cuZW52ICE9ICd0ZXN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdcIicgKyBldmVudCArICdcIiBpcyBub3QgYSBzdXBwb3J0ZWQgYW5pbWF0aW9uIGV2ZW50JylcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxufVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAgcGFnZSAgPSByZXF1aXJlKCAnLi9wYWdlJyApLFxuICAgIGZvcm1FbHM7XG5cbnZhciBmb3JtQnViYmxpbmcgPSBmYWxzZVxuXG52YXIgZmlyZUJ1YmJsZSA9IGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQuZGV0YWlsICYmIGV2ZW50LmRldGFpbC50cmlnZ2VyZWQgKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCBldmVudC50eXBlLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcblxuICAvLyBTdG9wIG9ubHkgJ3N1Ym1pdCcgZXZlbnRzLiBTdG9wcGluZyBibHVyIG9yIGZvdWNzIGV2ZW50cyBzZWVtcyB0byBicmVhayBGaXJlRm94IGlucHV0IGludGVyYWN0aW9ucy5cbiAgaWYgKCBldmVudC50eXBlID09ICdzdWJtaXQnICkgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudCggZXYgKVxuXG4gIC8vIFByZXZlbnQgZGVmYXVsdCBvbiBvcmlnaW5hbCBldmVudCBpZiBjdXN0b20gZXZlbnQgaXMgcHJldmVudGVkXG4gIGlmICggZXYuZGVmYXVsdFByZXZlbnRlZCApIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgXG59XG5cbi8vIFNpbXBsaWZ5IHNldHRpbmcgdGhlIGV2ZW50IHR5cGUgYmFzZWQgb24gdGhlIGVsZW1lbnRcbnZhciBldmVudFR5cGUgPSBmdW5jdGlvbiAoIGVsICkge1xuICByZXR1cm4gKCBlbC50YWdOYW1lID09ICdGT1JNJyApID8gJ3N1Ym1pdCcgOiAnZm9jdXMgYmx1cidcbn1cblxuLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9uID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgRXZlbnQub24oIGVsLCBldmVudFR5cGUoIGVsICksIGZpcmVCdWJibGUgKVxufVxuXG4vLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlT2ZmID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgRXZlbnQub2ZmKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gQWRkL1JlbW92ZSBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVGb3JtRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIGZvcm1CdWJibGluZyApIHsgcmV0dXJuIH0gXG4gIHBhZ2UuY2hhbmdlKCBmdW5jdGlvbigpIHtcblxuICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBwcmV2aW91cyBwYWdlXG4gICAgaWYgKCBmb3JtRWxzICkgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggZm9ybUVscywgYnViYmxlT2ZmIClcblxuICAgIC8vIEFkZCBuZXcgbGlzdGVuZXJzIHRvIHRoaXMgcGFnZVxuICAgIGZvcm1FbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnZm9ybSwgaW5wdXQnIClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9uIClcbiAgfSlcblxuICB2YXIgZm9ybUJ1YmJsaW5nID0gdHJ1ZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1YmJsZUZvcm1FdmVudHNcbiIsInZhciBNYW5hZ2VyID0ge1xuICBuZXc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtYW5hZ2VyID0ge1xuXG4gICAgICBjYWxsYmFja3M6IFtdLFxuXG4gICAgICBhZGQ6IGZ1bmN0aW9uKCBmbiApIHtcblxuICAgICAgICB2YXIgY2IgPSBNYW5hZ2VyLmNhbGxiYWNrLm5ldyggZm4gKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5wdXNoKCBjYiApXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gY2JcblxuICAgICAgfSxcblxuICAgICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2Iuc3RvcCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0YXJ0KCkgfSApXG4gICAgICB9LFxuXG4gICAgICB0b2dnbGU6IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnRvZ2dsZSggYm9vbCApIH0gKVxuICAgICAgfSxcblxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MgPSBbXVxuICAgICAgfSxcblxuICAgICAgZmlyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApXG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBmbiApIHsgZm4uYXBwbHkoIHRoaXMsIGFyZ3MgKSB9IClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFuYWdlclxuICB9LFxuXG4gIGNhbGxiYWNrOiB7XG4gICAgbmV3OiBmdW5jdGlvbiggZm4gKSB7XG4gICAgICB2YXIgY2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCBjYi5lbmFibGVkICkgeyBmbi5hcHBseSggZm4sIGFyZ3VtZW50cyApIH1cbiAgICAgIH1cblxuICAgICAgY2Iuc3RvcCAgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSBmYWxzZSB9XG4gICAgICBjYi5zdGFydCAgPSBmdW5jdGlvbigpIHsgY2IuZW5hYmxlZCA9IHRydWUgfVxuICAgICAgY2IudG9nZ2xlID0gZnVuY3Rpb24oIGJvb2wgKSB7XG4gICAgICAgIGNiLmVuYWJsZWQgPSAoIDAgaW4gYXJndW1lbnRzICkgPyBib29sIDogIWNiLmVuYWJsZWRcbiAgICAgIH1cbiAgICAgIGNiLmVuYWJsZWQgPSB0cnVlXG5cbiAgICAgIHJldHVybiBjYlxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hbmFnZXJcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIHBpY2tGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZm91bmRcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggYXJndW1lbnRzLCBmdW5jdGlvbiggY2FuZGlkYXRlICkge1xuICAgIGlmICggdHlwZW9mKCBjYW5kaWRhdGUgKSA9PSAnZnVuY3Rpb24nICYmICFmb3VuZCApIHsgZm91bmQgPSBjYW5kaWRhdGUgfVxuICB9KVxuXG4gIHJldHVybiBmb3VuZFxufVxuXG52YXIgZGVib3VuY2UgPSBmdW5jdGlvbiggZm4sIHdhaXQsIG9wdGlvbnMgKSB7XG5cbiAgLy8gQWxsb3cgb3B0aW9ucyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gIGlmICggdHlwZW9mKCBmbiApID09ICdvYmplY3QnICkgeyBvcHRpb25zID0gZm4gfSBcblxuICAvLyBPcHRpb25zIHdvbid0IGJlIG51bGxcbiAgZWxzZSB7IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9IH1cblxuICB3YWl0ID0gb3B0aW9ucy53YWl0IHx8IHdhaXQgfHwgMFxuXG4gIHZhciBtYXggICAgICAgICAgICA9IG9wdGlvbnMubWF4IHx8IGZhbHNlLFxuICAgICAgbGVhZGluZyAgICAgICAgPSAoICggJ2xlYWRpbmcnICBpbiBvcHRpb25zICkgPyBvcHRpb25zLmxlYWRpbmcgIDogZmFsc2UgKSxcbiAgICAgIHRyYWlsaW5nICAgICAgID0gKCAoICd0cmFpbGluZycgaW4gb3B0aW9ucyApID8gb3B0aW9ucy50cmFpbGluZyA6IHRydWUgKSxcbiAgICAgIFxuICAgICAgLy8gR3JhYiBmdW5jdGlvbnMgZnJvbSBvcHRpb25zIG9yIGRlZmF1bHQgdG8gZmlyc3QgYXJndW1lbnRcbiAgICAgIGxlYWRpbmdGbiAgICAgID0gcGlja0Z1bmN0aW9uKCBvcHRpb25zLmxlYWRpbmcsIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMuY2FsbGJhY2ssIGZuICksXG4gICAgICB0cmFpbGluZ0ZuICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy50cmFpbGluZywgb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuXG4gICAgICAvLyBTdGF0ZSB0cmFja2luZyB2YXJzXG4gICAgICBhcmdzLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYXJndW1lbnRzIHBhc3NlZCB0byBkZWJvdW5jZWQgY2FsbGJhY2tcbiAgICAgIHF1ZXVlZCAgICAgICAgID0gZmFsc2UsICAvLyBIYXMgYSBjYWxsYmFjayBiZWVuIGFkZGVkIHRvIHRoZSBhbmltYXRpb24gbG9vcD9cbiAgICAgIGhhbmRsZSAgICAgICAgID0ge30sICAgICAvLyBPYmplY3QgZm9yIHRyYWNraW5nIGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDAsICAgICAgLy8gS2VlcCBhIHRpbWVyIGZvciBkZWJvdW5jaW5nXG4gICAgICBsYXN0SW52b2tlZCAgICA9IDAsICAgICAgLy8gS2VlcCBhIHRpbWVyIGZvciBtYXhcbiAgICAgIGxlYWRpbmdCbG9ja2VkID0gZmFsc2U7ICAvLyBUcmFjayBsZWFkaW5nLCB0aHJvdHRsaW5nIHN1YnNlcXVlbnQgbGVhZGluZyBjYWxsc1xuXG4gIC8vIFF1ZXVlIHRoZSBmdW5jdGlvbiB3aXRoIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICB2YXIgaW52b2tlID0gZnVuY3Rpb24oIGNhbGxUeXBlICkge1xuXG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgbGFzdEludm9rZWQgPSBub3coKVxuICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgbGVhZGluZ0Jsb2NrZWQgPSB0cnVlXG5cbiAgICBpZiAoIGNhbGxUeXBlID09PSAnbGVhZGluZycgKSB7XG4gICAgICBsZWFkaW5nRm4uYXBwbHkoIGxlYWRpbmdGbiwgYXJncyApIH1cbiAgICBlbHNlIHtcbiAgICAgIHRyYWlsaW5nRm4uYXBwbHkoIHRyYWlsaW5nRm4sIGFyZ3MgKSB9XG5cbiAgfVxuXG4gIC8vIExvYWQgdGhlIGxvb3AgaW50byB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gIHZhciBhZGRUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKCAhcXVldWVkICkge1xuICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgaGFuZGxlLnZhbHVlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBsb29wICkgIC8vIEFkZCB0byBicm93c2VyJ3MgYW5pbWF0aW9uIHF1ZXVlXG4gICAgfVxuXG4gIH1cblxuICAvLyBSZW1vdmUgZnJvbSBhbmltYXRpb24gcXVldWUgYW5kIHJlc2V0IGRlYm91bmNlIFxuICB2YXIgcmVtb3ZlRnJvbVF1ZXVlID0gZnVuY3Rpb24oKSB7XG5cbiAgICBpZiAoIFwidmFsdWVcIiBpbiBoYW5kbGUgKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggaGFuZGxlLnZhbHVlIClcbiAgICAgIHF1ZXVlZCAgICAgICAgID0gZmFsc2VcbiAgICAgIGxhc3RDYWxsZWQgICAgID0gMFxuICAgICAgbGFzdEludm9rZWQgICAgPSAwXG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlXG4gICAgfVxuICAgIFxuICB9XG5cbiAgLy8gcHJldmVudCBpbmZpbml0ZSBkZWJvdW5jaW5nICggaWYgb3B0aW9ucy5tYXggaXMgc2V0IClcbiAgdmFyIG1heFBhc3NlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoIG1heCAmJiBub3coKSAtIGxhc3RJbnZva2VkID49IG1heCApXG4gIH1cblxuICB2YXIgd2FpdFJlYWNoZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBub3coKSAtIGxhc3RDYWxsZWQgKSA+PSB3YWl0XG4gIH1cblxuICAvLyBUaGlzIGdldHMgbG9hZGVkIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZSBhbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGl2b2tlIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gIFxuICAgIC8vIExvb3Agd2FzIGV4ZWN1dGVkIHNvIGl0J3Mgbm8gbG9uZ2VyIGluIHRoZSBhbmltYXRpb24gcXVldWVcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIFxuICAgIGlmICggbGVhZGluZyAmJiAhbGVhZGluZ0Jsb2NrZWQgKSB7XG4gICAgICBpbnZva2UoICdsZWFkaW5nJyApXG4gICAgfVxuXG4gICAgLy8gSWYgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkIHRvIGZyZXF1ZW50bHkgdG8gZXhlY3V0ZVxuICAgIGVsc2UgaWYgKCBtYXhQYXNzZWQoKSApIHtcblxuICAgICAgaWYgKCBsZWFkaW5nICkgeyBpbnZva2UoICdsZWFkaW5nJyApICB9XG4gICAgICBlbHNlICAgICAgICAgICB7IGludm9rZSggJ3RyYWlsaW5nJyApIH1cblxuICAgIH0gXG4gICAgXG4gICAgLy8gSWYgZnVuY3Rpb24gaGFzbid0IGJlZW4gY2FsbGVkIHNpbmNlIGxhc3Qgd2FpdFxuICAgIGVsc2UgaWYgKCB3YWl0UmVhY2hlZCgpICkge1xuXG4gICAgICAvLyBJZiB0cmFpbGluZyBpdCdzIHNhZmUgdG8gaW52b2tlXG4gICAgICBpZiAoIHRyYWlsaW5nICkgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICAgIC8vIElmIGxlYWRpbmcsIGl0J3Mgc2FmZSB0byByZW1vdmUgYmxvY2tcbiAgICAgIGlmICggbGVhZGluZyApICB7IGxlYWRpbmdCbG9ja2VkID0gZmFsc2UgfVxuICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkVG9RdWV1ZSgpXG4gICAgfVxuXG4gIH1cblxuICAvLyBBIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHF1ZXVlaW5nIHVwIGZ1bmN0aW9uIGNhbGxzXG4gIC8vXG4gIHZhciBkZWJvdW5jZWQgPSBmdW5jdGlvbigpIHtcbiAgICBsYXN0Q2FsbGVkID0gbm93KClcbiAgICBhcmdzID0gYXJndW1lbnRzXG4gICAgYWRkVG9RdWV1ZSgpXG4gIH1cblxuICBkZWJvdW5jZWQuc3RvcCA9IHJlbW92ZUZyb21RdWV1ZVxuXG4gIHJldHVybiBkZWJvdW5jZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZVxuIiwidmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKVxufVxuXG52YXIgZGVsYXkgPSBmdW5jdGlvbiAoIGZuLCB3YWl0ICkge1xuXG4gIHZhciBhcmdzU3RhcnQgPSAoIHdhaXQgIT0gbnVsbCApID8gMiA6IDE7XG4gIHZhciBoYW5kbGUgPSB7fVxuXG4gIGhhbmRsZS5hcmdzICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS53YWl0ICA9IHdhaXQgfHwgMFxuICBoYW5kbGUuc3RhcnQgPSBub3coKVxuXG4gIGhhbmRsZS5zdG9wICA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIFwidmFsdWVcIiBpbiBoYW5kbGUgKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggaGFuZGxlLnZhbHVlICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlLmxvb3AgID0gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gSWYgd2FpdCBsaW1pdCBoYXMgYmVlbiByZWFjaGVkXG4gICAgaWYgKCBub3coKSAtIGhhbmRsZS5zdGFydCA+PSBoYW5kbGUud2FpdCApIHtcbiAgICAgIGZuLmFwcGx5KCBmbiwgaGFuZGxlLmFyZ3MgKVxuXG4gICAgICAvLyBJZiByZXBlYXQgaXMgc2V0IGFuZCBpcyBub3QgMFxuICAgICAgaWYgKCAhIWhhbmRsZS5yZXBlYXQgKSB7XG4gICAgICAgIGhhbmRsZS5yZXBlYXQgPSBoYW5kbGUucmVwZWF0IC0gMVxuICAgICAgICBoYW5kbGUuc3RhcnQgPSBub3coKVxuICAgICAgICBxdWV1ZURlbGF5KCBoYW5kbGUgKVxuICAgICAgfSBlbHNlIGlmICggaGFuZGxlLnJlcGVhdCA9PT0gMCAmJiBoYW5kbGUuY29tcGxldGUgKSB7XG4gICAgICAgIGhhbmRsZS5jb21wbGV0ZSgpXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICB9XG5cbiAgfVxuXG5cbiAgcmV0dXJuIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG59XG5cbnZhciBxdWV1ZURlbGF5ID0gZnVuY3Rpb24gKCBoYW5kbGUgKSB7XG4gIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggaGFuZGxlLmxvb3AgKVxuICByZXR1cm4gaGFuZGxlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVsYXlcbiIsIi8vIFRoaXMgc2ltcGxpZmllcyBjb21tb24gdXNlcyBmb3Igd2luZG93Lm1hdGNoTWVkaWEgXG4vLyBuYW1lbHksIGFkZGluZyBsaXN0ZW5lcnMgZm9yIHdpZHRoIGFuZCBoZWlnaHQgcXVlcmllc1xuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KCBxdWVyeSwgZGltZW5zaW9uICkge1xuICB2YXIgcmVzdWx0ID0ge31cblxuICBpZiAoIHR5cGVvZiggcXVlcnkgKSA9PT0gJ3N0cmluZycgKSB7IHJldHVybiBxdWVyeSB9XG5cbiAgcmVzdWx0Lm1pbiA9IHNpemUoIHF1ZXJ5Lm1pbiwgJ21pbi0nICsgZGltZW5zaW9uIClcbiAgcmVzdWx0Lm1heCA9IHNpemUoIHF1ZXJ5Lm1heCwgJ21heC0nICsgZGltZW5zaW9uIClcblxuICBpZiAoIHJlc3VsdC5taW4gJiYgcmVzdWx0Lm1heCApXG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVzdWx0Lm1pbiArICcgYW5kICcgKyByZXN1bHQubWF4XG5cbiAgcmV0dXJuIHJlc3VsdC5xdWVyeSB8fCByZXN1bHQubWluIHx8IHJlc3VsdC5tYXhcbn1cblxuZnVuY3Rpb24gc2l6ZSggbnVtLCBsaW1pdCApIHtcbiAgcmV0dXJuICggbnVtICkgPyAnKCcrbGltaXQrJzogJyArIHRvUHgoIG51bSApICsgJyknIDogbnVsbFxufVxuXG5mdW5jdGlvbiB0b1B4KCB3aWR0aCApIHtcbiAgaWYgKCB0eXBlb2YoIHdpZHRoICkgPT09ICdudW1iZXInICkgeyByZXR1cm4gd2lkdGggKyAncHgnfVxuICByZXR1cm4gd2lkdGhcbn1cblxudmFyIG1lZGlhID0ge1xuXG4gIHdpZHRoOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHJldHVybiBtZWRpYS5saXN0ZW4oIHBhcnNlUXVlcnkoIHF1ZXJ5LCAnd2lkdGgnICksIGZuIClcbiAgfSxcblxuICBtaW5XaWR0aDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEud2lkdGgoIHsgbWluOiBzaXplIH0sIGZuICkgfSxcbiAgbWF4V2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHJldHVybiBtZWRpYS5saXN0ZW4oIHBhcnNlUXVlcnkoIHF1ZXJ5LCAnaGVpZ2h0JyApLCBmbiApXG4gIH0sXG5cbiAgbWluSGVpZ2h0OiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS5oZWlnaHQoIHsgbWluOiBzaXplIH0sIGZuICkgfSxcbiAgbWF4SGVpZ2h0OiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS5oZWlnaHQoIHsgbWF4OiBzaXplIH0sIGZuICkgfSxcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgdmFyIG1hdGNoID0gd2luZG93Lm1hdGNoTWVkaWEoIHF1ZXJ5IClcblxuICAgIGlmICggZm4gKSB7XG4gICAgICBmbiggbWF0Y2ggKVxuICAgICAgbWF0Y2guYWRkTGlzdGVuZXIoIGZuIClcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtZWRpYVxuIiwidmFyIEV2ZW50ICAgICAgICAgICA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyID0gcmVxdWlyZSggJy4vY2FsbGJhY2stbWFuYWdlcicgKVxudmFyIHRocm90dGxlICAgICAgICA9IHJlcXVpcmUoICcuL3Rocm90dGxlJyApXG52YXIgZGVib3VuY2UgICAgICAgID0gcmVxdWlyZSggJy4vZGVib3VuY2UnIClcblxudmFyIG9wdGltaXplZEV2ZW50TWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbiggbmFtZSApIHtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjYWxsYmFjayBtYW5hZ2VyXG4gICAgdmFyIG1hbmFnZXIgPSB7XG4gICAgICBydW46IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgICAgIHN0YXJ0OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdG9wOiBjYWxsYmFja01hbmFnZXIubmV3KClcbiAgICB9XG5cbiAgICAvLyBydW4gY2FsbGJhY2tzIHdoZW4gZXZlbnQgaGFwcGVucyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBydW5uaW5nID0gdGhyb3R0bGUoIG1hbmFnZXIucnVuLmZpcmUgKVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RhcnRlZCA9IGRlYm91bmNlKHtcbiAgICAgIGxlYWRpbmc6IG1hbmFnZXIuc3RhcnQuZmlyZSxcbiAgICAgIHRyYWlsaW5nOiBmYWxzZSxcbiAgICAgIHdhaXQ6IDE1MFxuICAgIH0pXG5cbiAgICAvLyBmaXJlIGNhbGxiYWNrcyB3aGVuIGV2ZW50IHN0YXJ0cyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBzdG9wcGVkID0gZGVib3VuY2UoIG1hbmFnZXIuc3RvcC5maXJlLCAxNTAgKVxuXG4gICAgRXZlbnQub24oIHdpbmRvdywgbmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICBydW5uaW5nKClcbiAgICAgIHN0YXJ0ZWQoKVxuICAgICAgc3RvcHBlZCgpXG4gICAgfSlcblxuICAgIC8vIFB1YmxpYyBBUElcbiAgICB2YXIgcnVuICAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5ydW4uYWRkKCBmbiApIH1cbiAgICBydW4uc3RhcnQgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdGFydC5hZGQoIGZuICkgfVxuICAgIHJ1bi5zdG9wICA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnN0b3AuYWRkKCBmbiApIH1cblxuICAgIC8vIEFkZCBjdXN0b20gZXZlbnRzIGZvciB0byBydW4gb3B0aW1pemVkIGxpc3RlbmVycy4gKCBuYW1lIC0+IE5hbWUgKVxuICAgIHJ1biggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgJ29wdGltaXplZCcgKyAgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSkgKSB9IClcbiAgICBydW4uc3RhcnQoIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csIG5hbWUgKyAnU3RhcnQnICkgfSApXG4gICAgcnVuLnN0b3AoIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csIG5hbWUgKyAnU3RvcCcgKSB9IClcblxuICAgIHJldHVybiBydW5cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGltaXplZEV2ZW50TWFuYWdlclxuIiwidmFyIEV2ZW50ICAgICAgICAgICA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyID0gcmVxdWlyZSggJy4vY2FsbGJhY2stbWFuYWdlcicgKVxuXG4vLyBDcmVhdGUgYSBuZXcgcGFnZSBldmVudCBtYW5hZ2VyXG52YXIgbWFuYWdlciA9IHtcbiAgcmVhZHk6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgY2hhbmdlOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIHJlYWR5QWxyZWFkeTogZmFsc2UsXG4gIGNoYW5nZWQ6IGZhbHNlLFxufVxuXG5tYW5hZ2VyLnJlYWR5LmFkZCggZnVuY3Rpb24oKXtcbiAgbWFuYWdlci5yZWFkeUFscmVhZHkgPSB0cnVlIFxufSlcblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7IFxuICBpZiAoICF3aW5kb3cuVHVyYm9saW5rcyAmJiAhbWFuYWdlci5jaGFuZ2VkICkgeyBcbiAgICBtYW5hZ2VyLmNoYW5nZWQgPSB0cnVlIFxuICAgIG1hbmFnZXIuY2hhbmdlLmZpcmUoKVxuICB9XG59KVxuXG52YXIgcmVhZHkgPSBmdW5jdGlvbiAoIGZuICkge1xuICBpZiAoIG1hbmFnZXIucmVhZHlBbHJlYWR5ICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIucmVhZHkuYWRkKCBmbiApIH1cblxudmFyIGNoYW5nZSA9IGZ1bmN0aW9uKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLmNoYW5nZWQgKSB7IGZuKCkgfVxuICByZXR1cm4gbWFuYWdlci5jaGFuZ2UuYWRkKCBmbiApIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgcmVhZHkgY2FsbGJhY2tzXG5yZWFkeS5maXJlID0gZnVuY3Rpb24gKCkge1xuICBtYW5hZ2VyLnJlYWR5LmZpcmUoKVxuICAvLyBCZSBzdXJlIHJlYWR5IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2VcbiAgbWFuYWdlci5yZWFkeS5zdG9wKCkgfVxuXG4vLyBNYWtlIGl0IGVhc3kgdG8gdHJpZ2dlciBjaGFuZ2UgY2FsbGJhY2tzXG5jaGFuZ2UuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5jaGFuZ2UuZmlyZSgpIH1cblxuRXZlbnQub24oIGRvY3VtZW50LCAnRE9NQ29udGVudExvYWRlZCcsIHJlYWR5LmZpcmUgKVxuRXZlbnQub24oIGRvY3VtZW50LCAncGFnZTpjaGFuZ2UgdHVyYm9saW5rczpsb2FkJywgY2hhbmdlLmZpcmUgKSAvLyBTdXBwb3J0IGN1c3RvbSBhbmQgcmFpbHMgdHVyYm9saW5rcyBwYWdlIGxvYWQgZXZlbnRzXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZWFkeTogcmVhZHksXG4gIGNoYW5nZTogY2hhbmdlXG59XG4iLCJ2YXIgZGVsYXkgPSByZXF1aXJlKCAnLi9kZWxheScgKVxuXG52YXIgcmVwZWF0ID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBsaW1pdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gMSxcbiAgICAgIGhhbmRsZSA9IGRlbGF5ICggZm4sIHdhaXQgKTtcblxuICBpZiAgICAgICggbGltaXQgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMyB9XG4gIGVsc2UgaWYgKCB3YWl0ICAhPSBudWxsICkgeyBhcmdzU3RhcnQgPSAyIH1cblxuICAvLyBFbmFibGUgcmVwZWF0ICggLTEgd2lsbCByZXBlYXQgZm9yZXZlciApXG4gIGhhbmRsZS5yZXBlYXQgPSBsaW1pdCB8fCAtMVxuICBoYW5kbGUuYXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgYXJnc1N0YXJ0IClcbiAgaGFuZGxlLnN0b3AgICA9IGhhbmRsZS5jYW5jZWxcblxuICByZXR1cm4gaGFuZGxlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0XG4iLCJ2YXIgbWFuYWdlciA9IHJlcXVpcmUoICcuL29wdGltaXplZC1ldmVudC1tYW5hZ2VyJyApXG52YXIgcmVzaXplICA9IG1hbmFnZXIubmV3KCAncmVzaXplJyApXG5cbi8vIFBhdXNlIGFuaW1hdGlvbnMgZHVyaW5nIHJlc2l6aW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbnJlc2l6ZS5kaXNhYmxlQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZSA9ICc8c3R5bGUgaWQ9XCJmdWxsc3RvcFwiPi5uby1hbmltYXRpb24gKiwgLm5vLWFuaW1hdGlvbiAqOmFmdGVyLCAubm8tYW5pbWF0aW9uICo6YmVmb3JlIHtcXFxuICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnRcXFxuICB9PC9zdHlsZT4nXG5cbiAgLy8gSW5qZWN0IHN0eWxlIGZvciBlYXN5IGNsYXNzbmFtZSBtYW5pcHVsYXRpb25cbiAgaWYgKCAhZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3R5bGUjZnVsbHN0b3AnKSApIHsgXG4gICAgZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHN0eWxlKVxuICB9XG5cbiAgcmVzaXplLnN0YXJ0KCBmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxuICByZXNpemUuc3RvcCggZnVuY3Rpb24oKSB7ICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoICduby1hbmltYXRpb24nICkgfSApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzaXplXG4iLCJ2YXIgbWFuYWdlciA9IHJlcXVpcmUoICcuL29wdGltaXplZC1ldmVudC1tYW5hZ2VyJyApXG52YXIgc2Nyb2xsICA9IG1hbmFnZXIubmV3KCAnc2Nyb2xsJyApXG5cbnNjcm9sbC5kaXNhYmxlUG9pbnRlciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIERpc2FibGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICBzY3JvbGwuc3RhcnQoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gIH0pXG5cbiAgLy8gRW5hYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0b3AoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJydcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzY3JvbGxcbiIsIi8vIEN1c3RvbSBFdmVudCBQb2x5ZmlsbFxuKGZ1bmN0aW9uICgpIHtcblxuICBpZiAoIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIiApIHJldHVybiBmYWxzZTtcblxuICBmdW5jdGlvbiBDdXN0b21FdmVudCAoIGV2ZW50LCBwYXJhbXMgKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlLCBkZXRhaWw6IHVuZGVmaW5lZCB9O1xuICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCggJ0N1c3RvbUV2ZW50JyApO1xuICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoIGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwgKTtcbiAgICByZXR1cm4gZXZ0O1xuICAgfVxuXG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG5cbiAgd2luZG93LkN1c3RvbUV2ZW50ID0gQ3VzdG9tRXZlbnQ7XG59KSgpXG4iLCIvLyBNYW51YWxseSB0cmlnZ2VyIGEgY2FuY2VsYWJsZSBmb3JtIHN1Ym1pdCBldmVudC5cbmZ1bmN0aW9uIHN1Ym1pdCggZm9ybSApIHtcbiAgaWYgKCAhZm9ybS50YWdOYW1lIHx8IGZvcm0udGFnTmFtZSAhPSAnRk9STScgKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoICdUcmlnZ2VyIHRoaXMgZXZlbnQgb24gYSBmb3JtIGVsZW1lbnQnIClcbiAgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggJ3N1Ym1pdCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IHRyaWdnZXJlZDogdHJ1ZSB9IH0gKVxuICBmb3JtLmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBTdWJtaXQgZm9ybSB1bmxlc3MgZXZlbnQgZGVmYXVsdCBpcyBwcmV2ZW50ZWRcbiAgaWYgKCAhZXYuZGVmYXVsdFByZXZlbnRlZCApIGZvcm0uc3VibWl0KClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJtaXRcbiIsInZhciBlbmRFdmVudHMgPSBbXG4gICd0b3VjaGVuZCdcbl1cblxubW9kdWxlLmV4cG9ydHMgPSBUYXBcblxuLy8gZGVmYXVsdCB0YXAgdGltZW91dCBpbiBtc1xuVGFwLnRpbWVvdXQgPSAyMDBcblxuZnVuY3Rpb24gVGFwKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIC8vIGlmIHRoZSB1c2VyIGhvbGRzIGhpcy9oZXIgZmluZ2VyIGRvd24gZm9yIG1vcmUgdGhhbiAyMDBtcyxcbiAgLy8gdGhlbiBpdCdzIG5vdCByZWFsbHkgY29uc2lkZXJlZCBhIHRhcC5cbiAgLy8gaG93ZXZlciwgeW91IGNhbiBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICB2YXIgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCB8fCBUYXAudGltZW91dFxuXG4gIC8vIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIGxpc3RlbmVyXG4gIGxpc3RlbmVyLmhhbmRsZXIgPSBjYWxsYmFja1xuXG4gIHJldHVybiBsaXN0ZW5lclxuXG4gIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcilcbiAgZnVuY3Rpb24gbGlzdGVuZXIoZTEpIHtcbiAgICAvLyB0YXAgc2hvdWxkIG9ubHkgaGFwcGVuIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgaWYgKCFlMS50b3VjaGVzIHx8IGUxLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuXG5cbiAgICB2YXIgZWwgPSBlMS50YXJnZXRcbiAgICB2YXIgY29udGV4dCA9IHRoaXNcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHZhciB0aW1lb3V0X2lkID0gc2V0VGltZW91dChjbGVhbnVwLCB0aW1lb3V0KVxuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgY2xlYW51cClcblxuICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZG9uZSlcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gZG9uZShlMikge1xuICAgICAgLy8gc2luY2UgdG91Y2hzdGFydCBpcyBhZGRlZCBvbiB0aGUgc2FtZSB0aWNrXG4gICAgICAvLyBhbmQgYmVjYXVzZSBvZiBidWJibGluZyxcbiAgICAgIC8vIGl0J2xsIGV4ZWN1dGUgdGhpcyBvbiB0aGUgc2FtZSB0b3VjaHN0YXJ0LlxuICAgICAgLy8gdGhpcyBmaWx0ZXJzIG91dCB0aGUgc2FtZSB0b3VjaHN0YXJ0IGV2ZW50LlxuICAgICAgaWYgKGUxID09PSBlMikgcmV0dXJuXG5cbiAgICAgIGNsZWFudXAoKVxuXG4gICAgICAvLyBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIGlmIChlMi5kZWZhdWx0UHJldmVudGVkKSByZXR1cm5cblxuICAgICAgLy8gb3ZlcndyaXRlIHRoZXNlIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgYWxsIHRvIGJvdGggc3RhcnQgYW5kIGV2ZW50cy5cbiAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGUxLnByZXZlbnREZWZhdWx0XG4gICAgICB2YXIgc3RvcFByb3BhZ2F0aW9uID0gZTEuc3RvcFByb3BhZ2F0aW9uXG5cbiAgICAgIGUxLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uLmNhbGwoZTEpXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUyKVxuICAgICAgfVxuXG4gICAgICBlMS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJldmVudERlZmF1bHQuY2FsbChlMSlcbiAgICAgICAgcHJldmVudERlZmF1bHQuY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgLy8gY2FsbHMgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYGVuZGAgZXZlbnQsXG4gICAgICAvLyBidXQgaSBkb24ndCB0aGluayBpdCBtYXR0ZXJzLlxuICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncylcbiAgICB9XG5cbiAgICAvLyBjbGVhbnVwIGVuZCBldmVudHNcbiAgICAvLyB0byBjYW5jZWwgdGhlIHRhcCwganVzdCBydW4gdGhpcyBlYXJseVxuICAgIGZ1bmN0aW9uIGNsZWFudXAoZTIpIHtcbiAgICAgIC8vIGlmIGl0J3MgdGhlIHNhbWUgZXZlbnQgYXMgdGhlIG9yaWdpbixcbiAgICAgIC8vIHRoZW4gZG9uJ3QgYWN0dWFsbHkgY2xlYW51cC5cbiAgICAgIC8vIGhpdCBpc3N1ZXMgd2l0aCB0aGlzIC0gZG9uJ3QgcmVtZW1iZXJcbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dF9pZClcblxuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgY2xlYW51cClcblxuICAgICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwidmFyIGRlYm91bmNlID0gcmVxdWlyZSggJy4vZGVib3VuY2UnIClcblxudmFyIHRocm90dGxlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIGlmICggdHlwZW9mKCBmbiApID09ICdvYmplY3QnICkgeyBvcHRpb25zID0gZm47IGZuID0gdW5kZWZpbmVkIH0gXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgb3B0aW9ucy53YWl0ID0gb3B0aW9ucy53YWl0IHx8IHdhaXQgfHwgMFxuICBvcHRpb25zLm1heCAgPSBvcHRpb25zLm1heCB8fCBvcHRpb25zLndhaXRcbiAgb3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZm5cbiAgb3B0aW9ucy5sZWFkaW5nICA9IHRydWVcbiAgb3B0aW9ucy50cmFpbGluZyA9IHRydWVcblxuICByZXR1cm4gZGVib3VuY2Uob3B0aW9ucylcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlXG4iLCJ2YXIgdmFsaWRhdGlvbiAgID0gcmVxdWlyZSggJy4vbGliL3ZhbGlkYXRpb24nICksXG4gICAgcHJvZ3Jlc3NpdmUgID0gcmVxdWlyZSggJy4vbGliL3Byb2dyZXNzaXZlJyApLFxuICAgIGdldExhYmVsICAgICA9IHJlcXVpcmUoICcuL2xpYi9nZXQtbGFiZWwnICksXG4gICAgZGlmZiAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RpZmYnICksXG4gICAgaW5wdXRDaGFuZ2UgID0gcmVxdWlyZSggJy4vbGliL2lucHV0LWNoYW5nZScgKSxcbiAgICBzdGVwcGVkSW5wdXQgPSByZXF1aXJlKCAnLi9saWIvc3RlcHBlZC1udW1iZXItaW5wdXQnICksXG4gICAgc3RlcExhYmVscyAgID0gcmVxdWlyZSggJy4vbGliL3N0ZXAtbGFiZWxzJyApLFxuICAgIHNsaWRlciAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9zbGlkZXIvaW5wdXQnIClcblxucmVxdWlyZSggJy4vbGliL3Jlc2V0JyApXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZTogdmFsaWRhdGlvbi52YWxpZGF0ZSxcbiAgaW52YWxpZGF0ZUZpZWxkOiB2YWxpZGF0aW9uLmludmFsaWRhdGVGaWVsZCxcbiAgbmV4dDogcHJvZ3Jlc3NpdmUubmV4dCxcbiAgZ2V0TGFiZWw6IGdldExhYmVsLFxuICBkaWZmOiBkaWZmLFxuICBpbnB1dENoYW5nZTogaW5wdXRDaGFuZ2UsXG4gIHN0ZXBwZWROdW1iZXJJbnB1dDogc3RlcHBlZElucHV0LFxuICBzdGVwTGFiZWxzOiBzdGVwTGFiZWxzLFxuICBzbGlkZXI6IHNsaWRlclxufVxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ID0gdG9vbGJveC5ldmVudCxcbiAgICBnZXRMYWJlbCA9IHJlcXVpcmUoICcuL2dldC1sYWJlbCcpLFxuICAgIGlucHV0Q2hhbmdlID0gcmVxdWlyZSggJy4vaW5wdXQtY2hhbmdlJyApLFxuICAgIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcbiAgICBzbGlkZXJIZWxwZXJzID0gcmVxdWlyZSggJy4vc2xpZGVyL2hlbHBlcnMnIClcblxuZnVuY3Rpb24gZGlmZkZvcm0oIGV2ZW50ICkge1xuICB2YXIgZm9ybSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICB2YXIgZGlmZnMgPSBbXSxcbiAgICAgIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcblxuICBpZiAoIGRpZmZFbCA9PSBudWxsICkgeyByZXR1cm4gfVxuXG4gIGluaXREaWZmSWRzKCBmb3JtIClcblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJy5jaGFuZ2VkLXZhbHVlJyApLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgdmFyIGRpZmYgPSBkaWZmSW5wdXQoIGVsIClcblxuICAgIC8vIE9ubHkgc2hvdyBvbmUgaW5wdXQgZGlmZiBwZXIgbGFiZWxcbiAgICAvLyBJZiBkaWZmcyBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgbGFiZWwsIGRvIG5vdCBhZGQgaXQuXG4gICAgaWYgKCAhZGlmZnMuZmluZCggZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbCA9PSBkaWZmLmxhYmVsIH0gKSApIGRpZmZzLnB1c2goIGRpZmYgKVxuICB9KVxuXG4gIGlmICggZGlmZnMubGVuZ3RoID09IDAgKSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gJydcbiAgZWxzZSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gYDx0YWJsZSBjbGFzcz0naW5wdXQtZGlmZnMnPiR7IGRpZmZzLm1hcCggZGlmZlJvdyApLmpvaW4oJycpIH08L3RhYmxlPmBcblxuICB0b2dnbGVEaWZmRWxzKCBmb3JtIClcbn1cblxuZnVuY3Rpb24gdG9nZ2xlRGlmZkVscyggZm9ybSApIHtcbiAgdmFyIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcbiAgaWYgKCBkaWZmRWwgKSB7XG5cbiAgICB2YXIgZWxlbWVudHNUb1RvZ2dsZSA9IHRvb2xib3guc2xpY2UoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGRpZmZFbC5kYXRhc2V0LmhpZGVXaGVuRW1wdHkgKSlcbiAgICBlbGVtZW50c1RvVG9nZ2xlLnB1c2goIGRpZmZFbCApXG5cbiAgICB0b29sYm94LmVhY2goIGVsZW1lbnRzVG9Ub2dnbGUsIGZ1bmN0aW9uKCBlbCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2Zvcm0tZGlmZi1oaWRkZW4nLCBkaWZmRWwuY2hpbGRyZW4ubGVuZ3RoID09IDAgKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gQ3JlYXRlIGEgZGlmZiB0YWJsZSByb3dcbmZ1bmN0aW9uIGRpZmZSb3cgKCBkaWZmICkge1xuXG4gIHZhciByb3cgPSBgPHRyIGNsYXNzPSdpbnB1dC1kaWZmICR7ZGlmZlsnY2xhc3MnXS5qb2luKCcgJyl9JyBkYXRhLWRpZmYtbmFtZT0nJHtkaWZmLm5hbWV9Jz5gXG5cbiAgICAvLyBBZGQgbGFiZWwgYW5kIGRpZmYgbm90ZVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLWxhYmVsJz48c3Bhbj4ke2RpZmYubGFiZWx9PC9zcGFuPmBcbiAgICBpZiAoZGlmZi5ub3RlLmxlbmd0aCA+IDApIHJvdyArPSBgIDxzcGFuIGNsYXNzPSdkaWZmLW5vdGUnPiR7ZGlmZi5ub3RlLmpvaW4oJyAnKX08L3NwYW4+YFxuICAgIHJvdyArPSBcIjwvdGQ+XCJcblxuICAgIC8vIEFkZCBpbml0aWFsIHZhbHVlIGNvZGUgY2VsbFxuICAgIHJvdyArPSBkaWZmQ2VsbCggZGlmZi5pbml0aWFsLCAnaW5pdGlhbCcgKVxuXG4gICAgLy8gQWRkIGFycm93IG1hcmtlclxuICAgIHJvdyArPSBcIjx0ZCBjbGFzcz0naW5wdXQtZGlmZi1tYXJrZXInPjxzcGFuPuKGkjwvc3Bhbj48L3RkPlwiXG5cbiAgICAvLyBBZGQgY3VycmVudCB2YWx1ZSBjb2RlIGNlbGxcbiAgICByb3cgKz0gZGlmZkNlbGwoIGRpZmYudmFsdWUsICd2YWx1ZScgKVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLXVuZG8nPjxzcGFuPjxidXR0b24gY2xhc3M9J2Zvcm0tZGlmZi1idXR0b24nIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nUmVzZXQgdmFsdWUnIGRhdGEtcmVzZXQtaW5wdXQ9JyR7ZGlmZi5zZWxlY3Rvcn0nPuKclTwvYnV0dG9uPjwvc3Bhbj48L3RkPmBcblxuICByZXR1cm4gcm93ICsgXCI8L3RyPlwiXG59XG5cbmZ1bmN0aW9uIGRpZmZDZWxsICh2YWx1ZSwgbmFtZSkge1xuICB2YXIgdGRDbGFzcyA9IGBpbnB1dC1kaWZmLSR7bmFtZX1gXG4gIGlmICggIXZhbHVlIHx8IHZhbHVlID09ICdubyBzZWxlY3Rpb24nICkgdGRDbGFzcyArPSAnIG51bGwtdmFsdWUnXG5cbiAgcmV0dXJuIGA8dGQgY2xhc3M9JyR7dGRDbGFzc30nPjxjb2RlPiR7KCB2YWx1ZSB8fCAnbnVsbCcgKX08L2NvZGU+PC90ZD5gXG59XG5cbi8vIEFkZCB1bmlxdWUgaWRzIGZvciBlYWNoIGlucHV0IGluIGEgZm9ybVxuZnVuY3Rpb24gaW5pdERpZmZJZHMoIGZvcm0gKSB7XG4gIGlmICggZm9ybS5kYXRhc2V0LmRpZmZJZHMgKSByZXR1cm5cblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggU2VsZWN0b3IgKSwgZnVuY3Rpb24gKCBlbCwgaW5kZXggKSB7XG4gICAgZWwuZGF0YXNldC5mb3JtRGlmZklkID0gYGZvcm0tZGlmZi0ke3JhbmRJRCgpfS0ke2luZGV4fWBcbiAgfSlcblxuICBmb3JtLmRhdGFzZXQuZGlmZklkcyA9IHRydWVcbn1cblxuZnVuY3Rpb24gcmFuZElEICgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygzKVxufVxuXG4vLyBSZXR1cm5zOiB7IGlucHV0OiBpbnB1dCBlbGVtZW50LCBpbml0aWFsOiAnb2xkIHZhbHVlJywgdmFsdWU6ICduZXcgdmFsdWUnIH1cbmZ1bmN0aW9uIGRpZmZJbnB1dCggaW5wdXQgKSB7XG4gIHZhciBkaWZmID0ge1xuICAgIGluaXRpYWw6ICBbXSxcbiAgICB2YWx1ZTogICAgW10sXG4gICAgbmFtZTogICAgIFtdLFxuICAgIGNsYXNzOiAgICBbXSxcbiAgICBub3RlOiAgICAgW10sXG4gICAgc2VsZWN0b3I6IFtdXG4gIH0sXG4gICAgaW5wdXRzXG5cbiAgdmFyIGxhYmVsID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2xhYmVsJyApXG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2Zvcm0nIClcblxuICBpZiAoIGxhYmVsICkge1xuICAgIC8vIEdldCB0ZXh0IGxhYmVsIGZyb20gdGhlIGZpcnN0IGlucHV0IGluIGEgbGFiZWxcbiAgICBkaWZmLmxhYmVsID0gZ2V0TGFiZWwudGV4dCggbGFiZWwucXVlcnlTZWxlY3RvciggU2VsZWN0b3IgKSApXG5cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnB1dHMgdW5kZXIgYSBzaW5nbGUgbGFiZWxcbiAgICAvLyBHcm91cCB0aG9zZSBpbnB1dCB2YWx1ZXMgaW4gdGhlIGZvcm0gZGlmZiBhbmQgdHJlYXRcbiAgICAvLyB0aGVtIGFzIGEgc2luZ2xlIHZhbHVlXG4gICAgdmFyIGxhYmVsSW5wdXRzID0gdG9vbGJveC5zbGljZSggbGFiZWwucXVlcnlTZWxlY3RvckFsbCggU2VsZWN0b3IgKSApXG5cbiAgICAvLyBJZiBtdWx0aXBsZSBpbnB1dHMgYXJlIHVuZGVyIGEgc2luZ2xlIGxhYmVsLCB1c2UgdGhvc2VcbiAgICAvLyBvdGhlcndpc2UgdXNlIGlucHV0IGFzIGFuIGFycmF5ICh0byBzaW1wbGlmeSB0aGlzKVxuICAgIGlucHV0cyA9ICggbGFiZWxJbnB1dHMubGVuZ3RoID4gMCApID8gbGFiZWxJbnB1dHMgOiBbIGlucHV0IF1cbiAgfSBlbHNlIHtcbiAgICBpbnB1dHMgPSBbIGlucHV0IF1cbiAgfVxuXG4gIGRpZmYubGFiZWwgPSBkaWZmLmxhYmVsIHx8IGdldExhYmVsLnRleHQoIGlucHV0ICkgfHwgaW5wdXQuZ2V0QXR0cmlidXRlKCAnbmFtZScgKVxuXG4gIHRvb2xib3guZWFjaCggaW5wdXRzLCBmdW5jdGlvbiAoIGlucHV0ICkge1xuXG4gICAgaWYgKCBpbnB1dC50eXBlID09ICdyYW5nZScgJiYgaW5wdXQuZGF0YXNldC5pbnB1dCApIHtcbiAgICAgIHNsaWRlcklucHV0ID0gc2xpZGVySGVscGVycy5nZXRJbnB1dCggaW5wdXQgKVxuXG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggc2xpZGVySW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBzbGlkZXJJbnB1dC52YWx1ZSApXG5cbiAgICAvLyBHZXQgc2VsZWN0IGxhYmVsIG5hbWVzIChyYXRoZXIgdGhhbiB2YWx1ZXMpIGlmIHByZXNlbnRcbiAgICB9IGVsc2UgaWYgKCBpbnB1dC50YWdOYW1lID09ICdTRUxFQ1QnICkge1xuXG4gICAgICAvLyBTaG93IG9wdGlvbiBsYWJlbHMgaW5zdGVhZCBvZiB2YWx1ZXMgaWYgcHJlc2VudFxuICAgICAgdmFyIG9wdGlvbnMgPSB7fVxuICAgICAgdG9vbGJveC5lYWNoKGlucHV0LmNoaWxkcmVuLCBmdW5jdGlvbiAoIG8gKSB7XG4gICAgICAgIG9wdGlvbnNbby52YWx1ZV0gPSBvLnZhbHVlID8gby50ZXh0IDogJ25vIHNlbGVjdGlvbidcbiAgICAgIH0pXG5cbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBvcHRpb25zWyBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSBdIHx8IGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlIClcbiAgICAgIGRpZmYudmFsdWUucHVzaCggb3B0aW9uc1sgaW5wdXQudmFsdWUgXSB8fCBpbnB1dC52YWx1ZSApXG5cbiAgICAvLyBHZXQgcmFkaW8gbGFiZWwgbmFtZXMgKHJhdGhlciB0aGFuIHZhbHVlcykgaWYgcHJlc2VudFxuICAgIH0gZWxzZSBpZiAoIGlucHV0LnR5cGUgPT0gJ3JhZGlvJyApIHtcblxuICAgICAgZGlmZi5sYWJlbCA9IGdldExhYmVsLmxlZ2VuZCggaW5wdXQgKSB8fCBkaWZmLmxhYmVsXG5cbiAgICAgIHZhciByYWRpb0lucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCggYGlucHV0W25hbWU9XCIke2lucHV0Lm5hbWV9XCJdYCApXG4gICAgICB2YXIgcmFkaW9Jbml0aWFsLCByYWRpb1ZhbHVlXG5cbiAgICAgIHJhZGlvSW5wdXRzLmZvckVhY2goIGZ1bmN0aW9uKCByYWRpbyApIHtcbiAgICAgICAgaWYgKCByYWRpby5kYXRhc2V0LmluaXRpYWxWYWx1ZSA9PSAndHJ1ZScgKSByYWRpb0luaXRpYWwgPSBnZXRMYWJlbC50ZXh0KCByYWRpbyApXG4gICAgICAgIGlmICggcmFkaW8uY2hlY2tlZCApIGRpZmYudmFsdWUucHVzaCggZ2V0TGFiZWwudGV4dCggcmFkaW8gKSApXG4gICAgICB9KVxuXG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggcmFkaW9Jbml0aWFsIHx8ICdubyBzZWxlY3Rpb24nIClcblxuICAgIC8vIFRyYWNrIGNoZWNrZWQgc3RhdGUgZm9yIGNoZWNrYm94ZXMgKHJhdGhlciB0aGFuIHZhbHVlKVxuICAgIH0gZWxzZSBpZiAoIGlucHV0LnR5cGUgPT0gJ2NoZWNrYm94JyApIHtcbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSApXG4gICAgICBkaWZmLnZhbHVlLnB1c2goIGlucHV0LmNoZWNrZWQgKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBpbnB1dC52YWx1ZSApXG4gICAgfVxuXG4gICAgaWYoaW5wdXQuZGF0YXNldC5kaWZmTm90ZSkgZGlmZi5ub3RlLnB1c2goaW5wdXQuZGF0YXNldC5kaWZmTm90ZSlcbiAgICBpZihpbnB1dC5kYXRhc2V0LmRpZmZDbGFzcykgZGlmZlsnY2xhc3MnXS5wdXNoKGlucHV0LmRhdGFzZXQuZGlmZkNsYXNzKVxuXG4gICAgaWYgKCBpbnB1dC50eXBlID09ICdyYW5nZScgJiYgaW5wdXQubmFtZSA9PSAnJyAmJiBpbnB1dC5kYXRhc2V0LmlucHV0ICkge1xuICAgICAgZGlmZi5uYW1lLnB1c2goIGlucHV0LmRhdGFzZXQuaW5wdXQgKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmLm5hbWUucHVzaCggaW5wdXQubmFtZSApXG4gICAgfVxuICAgIGRpZmYuc2VsZWN0b3IucHVzaCggaW5wdXQuZGF0YXNldC5mb3JtRGlmZklkIClcbiAgfSlcblxuICBkaWZmLmluaXRpYWwgPSBkaWZmLmluaXRpYWwuam9pbignICcpXG4gIGRpZmYudmFsdWUgPSBkaWZmLnZhbHVlLmpvaW4oJyAnKVxuICBkaWZmLm5hbWUgPSBkaWZmLm5hbWUuam9pbignICcpXG4gIGRpZmYuc2VsZWN0b3IgPSBkaWZmLnNlbGVjdG9yLm1hcCggZnVuY3Rpb24gKCBzICkgeyByZXR1cm4gYFtkYXRhLWZvcm0tZGlmZi1pZD1cIiR7c31cIl1gIH0gKS5qb2luKCcsICcpXG5cbiAgcmV0dXJuIGRpZmZcbn1cblxuXG5mdW5jdGlvbiB3YXRjaCAoZGVsYXkpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICBpbnB1dENoYW5nZS53YXRjaCgpXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2hhbmdlJywgJ2Zvcm1bZGF0YS1kaWZmLXRhcmdldF0nLCBFdmVudC5kZWJvdW5jZSggZGlmZkZvcm0sIGRlbGF5IHx8IDEwMCApIClcblxuICAgIC8vIEhpZGUgZW1wdHkgZm9ybS1kaWZmc1xuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm1bZGF0YS1kaWZmLXRhcmdldF0nICksIHRvZ2dsZURpZmZFbHMgKVxuXG4gICAgaWYgKCAhZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyNmb3JtLWRpZmYtaGlkZGVuJyApIClcbiAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCAnPHN0eWxlIGlkPVwiZm9ybS1kaWZmLWhpZGRlblwiPi5mb3JtLWRpZmYtaGlkZGVueyBkaXNwbGF5OiBub25lIH08L3N0eWxlPicpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0cmFjdERhdGEgKGVsLCBwYXR0ZXJuKSB7XG4gIHZhciBkYXRhID0ge31cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgIHZhciBuYW1lID0gZWwuYXR0cmlidXRlc1tpXS5ub2RlTmFtZVxuXG4gICAgaWYobmV3IFJlZ0V4cChcIl5cIitwYXR0ZXJuKS50ZXN0KG5hbWUpKSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKHBhdHRlcm4sICcnKS5yZXBsYWNlKC9eLS8sJycpXG4gICAgICBkYXRhW25hbWVdID0gZWwuYXR0cmlidXRlc1tpXS5ub2RlVmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcblxuZnVuY3Rpb24gZ2V0SW5wdXQgKCBpbnB1dCApIHtcbiAgaWYgKCB0eXBlb2YgaW5wdXQgPT0gJ3N0cmluZycgKSBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGlucHV0IClcbiAgcmV0dXJuIGlucHV0XG59XG5cbmZ1bmN0aW9uIGdldExhYmVsICggaW5wdXQgKSB7XG5cbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKVxuICBpZiAoIWlucHV0KSByZXR1cm5cblxuICAvLyBMYWJlbCB3cmFwcyBpbnB1dFxuICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnICkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggYGxhYmVsW2Zvcj1cIiR7aW5wdXQuaWR9XCJdYCApXG5cbiAgcmV0dXJuIGxhYmVsXG59XG5cbmZ1bmN0aW9uIGdldEFyaWFMYWJlbCggaW5wdXQgKSB7XG4gIGlucHV0ID0gZ2V0SW5wdXQoIGlucHV0ICk7IGlmICghaW5wdXQpIHJldHVyblxuICB2YXIgbGFiZWwgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKVxuICB2YXIgbGFiZWxsZWRCeSA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWxsZWRieScgKVxuXG4gIGlmICggIWxhYmVsICYmIGxhYmVsbGVkQnkgKSB7XG5cbiAgICAvLyBhcmlhLWxhYmVsbGVkYnk9J3NvbWVJRCBhbm90aGVySUQnIG11c3QgcmVhZCBtdWx0aXBsZSBlbGVtZW50cyB0ZXh0IGNvbnRlbnQuXG4gICAgLy8gVGhpcyBjcmVhdGVzIGEgc2VsZWN0b3IgKHByZXBlbmRpbmcgdGhlICcjJyBiZWZvcmUgZWFjaCkgdG8gZmluZCB0aGUgbGFiZWxzLlxuICAgIC8vXG4gICAgdmFyIHNlbGVjdG9yID0gbGFiZWxsZWRCeS5zcGxpdCgnICcpLm1hcCggZnVuY3Rpb24gKCBuYW1lICkgeyByZXR1cm4gJyMnK25hbWUgfSApXG5cbiAgICB2YXIgbGFiZWxUZXh0ID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKCBzZWxlY3RvciwgZnVuY3Rpb24oIHMgKSB7IFxuICAgICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggcyApXG4gICAgICBpZiAoIGVsICkgcmV0dXJuIGVsLnRleHRDb250ZW50XG4gICAgICBlbHNlIHJldHVybiBmYWxzZVxuICAgIH0pLmZpbHRlciggZnVuY3Rpb24gKCBlICkgeyByZXR1cm4gZSAhPSBmYWxzZSB9IClcblxuICAgIGlmICggbGFiZWxUZXh0ICkgbGFiZWwgPSBsYWJlbFRleHQuam9pbignICcpXG4gIH1cblxuICByZXR1cm4gbGFiZWxcbn1cblxuLy8gQXJlIGlucHV0cyBpbiBhIGZpZWxkc2V0IHdpdGggYSBsZWdlbmQ/XG4vLyBVc2UgdGhhdCBhcyB0aGUgbGFiZWwgdGV4dFxuZnVuY3Rpb24gZ2V0TGVnZW5kVGV4dCAoIGlucHV0ICkge1xuICBpbnB1dCA9IGdldElucHV0KCBpbnB1dCApOyBpZiAoIWlucHV0KSByZXR1cm5cbiAgdmFyIGxlZ2VuZFRleHRcblxuICB2YXIgZmllbGRzZXQgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZmllbGRzZXQnIClcblxuICBpZiAoIGZpZWxkc2V0ICkge1xuICAgIHZhciBsZWdlbmQgPSBmaWVsZHNldC5xdWVyeVNlbGVjdG9yKCAnbGVnZW5kJyApXG4gICAgaWYgKCBsZWdlbmQgKSBsZWdlbmRUZXh0ID0gbGVnZW5kLnRleHRDb250ZW50LnRyaW0oKVxuICB9XG5cbiAgcmV0dXJuIGxlZ2VuZFRleHRcbn1cblxuXG5mdW5jdGlvbiBnZXRMYWJlbFRleHQgKCBpbnB1dCApIHtcbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKTsgaWYgKCFpbnB1dCkgcmV0dXJuXG5cbiAgdmFyIGxhYmVsID0gZ2V0TGFiZWwoIGlucHV0IClcblxuICAvLyBHcmFiIHRleHQgZnJvbSBpbnB1dCBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnlcbiAgdmFyIGxhYmVsVGV4dCA9IGdldEFyaWFMYWJlbCggaW5wdXQgKVxuXG4gIC8vIFVzZSBvciBsYWJlbC50ZXh0Q29udGVudCwgb3IgaW5wdXQgcGxhY2Vob2xkZXI9XCJcIlxuICBpZiAoICFsYWJlbFRleHQgKSB7XG4gICAgaWYgKGxhYmVsKSBsYWJlbFRleHQgPSBsYWJlbC50ZXh0Q29udGVudFxuXG4gICAgZWxzZSBsYWJlbFRleHQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICdwbGFjZWhvbGRlcicgKVxuICB9XG5cbiAgaWYgKCBsYWJlbFRleHQgKSByZXR1cm4gbGFiZWxUZXh0LnRyaW0oKVxufVxuXG5nZXRMYWJlbC50ZXh0ID0gZ2V0TGFiZWxUZXh0XG5nZXRMYWJlbC5sZWdlbmQgPSBnZXRMZWdlbmRUZXh0XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TGFiZWxcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnICksXG4gICAgaW5wdXRTZWxlY3RvcnMgPSByZXF1aXJlKCAnLi9zZWxlY3RvcicgKSxcbiAgICB3YXRjaGluZyA9IGZhbHNlXG5cbmZ1bmN0aW9uIGlucHV0SW5pdCggaW5wdXQgKSB7XG4gIGlucHV0LmNsYXNzTGlzdC50b2dnbGUoICdlbXB0eScsICFpbnB1dC52YWx1ZS50cmltKCkubGVuZ3RoIClcbiAgaWYgKCBpbnB1dC50eXBlID09ICdyYWRpbycgfHwgaW5wdXQudHlwZSA9PSAnY2hlY2tib3gnICkge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQuY2hlY2tlZFxuICB9IGVsc2Uge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQudmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnB1dENoYW5nZSggaW5wdXQgKSB7XG4gIC8vIEFsbG93IGNhbGxpbmcgZnJvbSBldmVudCBoYW5kbGVyXG4gIHZhciBpbnB1dCA9ICggaW5wdXQudGFyZ2V0IHx8IGlucHV0IClcblxuICAvLyBJZiBlbGVtZW50IGlzIGVtcHR5IChvciBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gIC8vIEFkZCBlbXB0eSBjbGFzc1xuICBpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCAnZW1wdHknLCAhaW5wdXQudmFsdWUudHJpbSgpLmxlbmd0aCApXG5cbiAgY2hhbmdlQ2xhc3NlcyggaW5wdXQgKVxuICB0cmFja1N0YXRlKCBpbnB1dCApXG5cbiAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICBpZiAoIGZvcm0gKSB7XG4gICAgRXZlbnQuZmlyZSggZm9ybSwgJ2NoYW5nZScgKVxuICB9XG59XG5cbi8vIEFkZCAnaW5jcmVhc2VkJywgJ2RlY3JlYXNlZCcsIGFuZCAnaW5pdGlhbCcgc3RhdGVzIHRvIGlucHV0IHBhcmVudFxuLy8gb3IgZWxlbWVudHMgc2V0IHVwIHRvIHRyYWNrIGlucHV0IHN0YXRlXG5mdW5jdGlvbiB0cmFja1N0YXRlKCBpbnB1dCApIHtcbiAgaWYgKCBpbnB1dC50eXBlLm1hdGNoKC9yYW5nZXxudW1iZXIvKSApIHtcbiAgICBjaGFuZ2UgPSBnZXRDaGFuZ2UoIE51bWJlcihpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSksIE51bWJlcihpbnB1dC52YWx1ZSkgKVxuXG4gICAgaW5wdXQuZGF0YXNldC5pbnB1dFN0YXRlID0gY2hhbmdlXG5cbiAgICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnIClcbiAgICBpZiAoIGxhYmVsICkgbGFiZWwuZGF0YXNldC5pbnB1dFN0YXRlID0gY2hhbmdlXG5cbiAgICB2YXIgc3RhdGVFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS10cmFjay1pbnB1dC1zdGF0ZT1cIiMnK2lucHV0LmlkKydcIl0nIClcbiAgICB0b29sYm94LmVhY2goIHN0YXRlRWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICBlbC5kYXRhc2V0LmlucHV0U3RhdGUgPSBjaGFuZ2VcbiAgICB9KVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlQ2xhc3NlcyggaW5wdXQsIHJlY3Vyc2l2ZSApIHtcbiAgdmFyIGNoYW5nZWRcbiAgdmFyIGRlZmF1bHRlZFxuXG4gIGlmICggaW5wdXQudHlwZSA9PSAncmFkaW8nICYmICFyZWN1cnNpdmUgKSB7XG4gICAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICAgIGlmICggZm9ybSApIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoIGBbbmFtZT0nJHtpbnB1dC5uYW1lfSddYCApLCBmdW5jdGlvbiAoIGUgKSB7XG4gICAgICAgIGNoYW5nZUNsYXNzZXMoIGUsIHRydWUgKVxuICAgICAgfSlcbiAgICB9IFxuICB9IGVsc2UgaWYgKCBpbnB1dC50eXBlID09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgIGNoYW5nZWQgPSBTdHJpbmcoIGlucHV0LmNoZWNrZWQgKSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9IGVsc2Uge1xuICAgIGNoYW5nZWQgPSBpbnB1dC52YWx1ZSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9XG5cbiAgaW5wdXQuY2xhc3NMaXN0LnRvZ2dsZSggJ2NoYW5nZWQtdmFsdWUnLCBjaGFuZ2VkIClcbiAgXG4gIC8vIFJlbW92ZSBhbGwgZGVmYXVsdGVkIHZhbHVlIGNsYXNzbmFtZXMgb24gYW4gaW5wdXQgY2hhbmdlXG4gIGlucHV0LmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnIClcblxuICB2YXIgbGFiZWwgPSBnZXRMYWJlbCggaW5wdXQgKVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGhhc0NoYW5nZWRJbnB1dHMgPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCAnLmNoYW5nZWQtdmFsdWUnICkgfHwgaW5wdXQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnY2hhbmdlZC12YWx1ZScgKVxuICAgIGxhYmVsLmNsYXNzTGlzdC50b2dnbGUoICdpbnB1dC1jaGFuZ2VkLXZhbHVlJywgaGFzQ2hhbmdlZElucHV0cyApXG5cbiAgICAvLyBSZW1vdmUgYWxsIGRlZmF1bHRlZCB2YWx1ZSBjbGFzc25hbWVzIG9uIGFuIGlucHV0IGNoYW5nZVxuICAgIHRvb2xib3guZWFjaCggbGFiZWwucXVlcnlTZWxlY3RvckFsbCggJy5kZWZhdWx0ZWQtdmFsdWUnICksIGZ1bmN0aW9uICggZWwgKSB7IGVsLmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnICkgfSApXG4gICAgbGFiZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2lucHV0LWRlZmF1bHRlZC12YWx1ZScgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUmFkaW9MYWJlbCAoIGlucHV0ICkge1xuICB2YXIgaW5wdXQgPSAoIGlucHV0LnRhcmdldCB8fCBpbnB1dCApXG4gIHZhciBpbnB1dE5hbWUgPSBpbnB1dC5uYW1lXG4gIHZhciByYWRpb0dyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgaW5wdXROYW1lICsgJ10nKSBcbiAgXG4gIHJhZGlvR3JvdXAuZm9yRWFjaChmdW5jdGlvbihyYWRpb0lucHV0KSB7XG4gIFxuICAgIHZhciBsYWJlbCA9IHRvb2xib3guZ2V0Q2xvc2VzdCggcmFkaW9JbnB1dCwgJ2xhYmVsJyApXG4gICAgcmV0dXJuIChyYWRpb0lucHV0LmNoZWNrZWQgPT09IHRydWUgPyBsYWJlbC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkLXJhZGlvJykgOiBsYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkLXJhZGlvJykpO1xuICBcbiAgfSlcbn1cblxuZnVuY3Rpb24gd2F0Y2ggKCkge1xuICBpZiAoIHdhdGNoaW5nICkgeyByZXR1cm4gfVxuICAvLyBJbml0aWFsaXplIGlucHV0IHN0YXRlXG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBpbnB1dFNlbGVjdG9ycyApLCBpbnB1dEluaXQgKVxuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1yYW5nZV0saW5wdXRbdHlwZT1udW1iZXJdJyksIHRyYWNrU3RhdGUgKVxuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1yYWRpb10nKSwgY2hlY2tSYWRpb0xhYmVsIClcbiAgfSlcblxuICAvLyBTZXQgaW5wdXQgc3RhdGUgb24gaW5wdXRcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCBpbnB1dFNlbGVjdG9ycywgaW5wdXRDaGFuZ2UgKVxuICBFdmVudC5vbiggZG9jdW1lbnQsICdpbnB1dCcsICdpbnB1dFt0eXBlPXJhZGlvXScsIGNoZWNrUmFkaW9MYWJlbCApXG5cbiAgLy8gRm9ybS5yZXNldCgpIGRvZXNuJ3QgZmlyZSBpbnB1dCBldmVudHMuIFRoaXMgZW5zdXJlcyB0aG9zZSBldmVudHMgYXJlIGZpcmVkLlxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbdHlwZT1yZXNldF0nLCByZXNldEZvcm0gKVxuXG4gIHdhdGNoaW5nID0gdHJ1ZVxufVxuXG4vLyBSZXR1cm4gc3RyaW5nICdpbmNyZWFzZWQnLCAnZGVjcmVhc2VkJywgb3IgJ2luaXRpYWwnXG4vLyBkZXBlbmRpbmcgb24gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcbi8vIGN1cnJlbnQgdmFsdWUgYW5kIGluaXRpYWxcbmZ1bmN0aW9uIGdldENoYW5nZSggaW5pdGlhbCwgdmFsdWUgKSB7XG4gIHZhciBpbml0aWFsID0gTnVtYmVyKGluaXRpYWwpXG5cbiAgaWYgKCBpbml0aWFsIDwgdmFsdWUgKSB7XG4gICAgcmV0dXJuIFwiaW5jcmVhc2VkXCJcbiAgfSBlbHNlIGlmICggdmFsdWUgPCBpbml0aWFsICkge1xuICAgIHJldHVybiBcImRlY3JlYXNlZFwiXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiaW5pdGlhbFwiXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRGb3JtKGV2ZW50KSB7XG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KGV2ZW50LnRhcmdldCwgJ2Zvcm0nKVxuXG4gIEV2ZW50LmRlbGF5KCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dC5pbnB1dC1jaGFuZ2VkLCBzZWxlY3QuaW5wdXQtY2hhbmdlZCwgdGV4dGFyZWEuaW5wdXQtY2hhbmdlZCAnKSwgZnVuY3Rpb24oIGVsICkge1xuICAgICAgRXZlbnQuZmlyZSggZWwsICdpbnB1dCcgKVxuICAgIH0pXG4gIH0sIDEwMCApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb2JqZWN0U2l6ZSAob2JqZWN0KSB7XG4gIHZhciBsZW5ndGggPSAwOyBmb3IodmFyIGkgaW4gb2JqZWN0KSB7IGxlbmd0aCsrIH1cbiAgcmV0dXJuIGxlbmd0aFxufVxuIiwidmFyIHRvb2xib3ggID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgQ2FsbGJhY2sgPSB0b29sYm94LmV2ZW50LmNhbGxiYWNrLFxuICAgIGZvcm1TZWxlY3RvciA9ICdmb3JtLnByb2dyZXNzaXZlJyxcbiAgICB3YXRjaGluZyA9IGZhbHNlLFxuICAgIGZvcm1DYWxsYmFja3MsXG4gICAgcmVnaXN0ZXJlZEZvcm1zXG5cbi8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgY2FsbGJhY2tzIGFuZCByZWdpc3RlcmVkIGZvcm1zXG5mdW5jdGlvbiByZXNldCAoKSB7XG5cbiAgZm9ybUNhbGxiYWNrcyA9IHsgbmV4dDogW10gfVxuICByZWdpc3RlcmVkRm9ybXMgPSBbXVxuXG59XG5cbmZ1bmN0aW9uIG5ld0Zvcm0oIGZvcm0gKSB7XG5cbiAgaWYgKCAhZm9ybSApIHJldHVyblxuXG4gIHZhciBzdGVwcyAgICAgPSB0b29sYm94LnNsaWNlKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZm9ybS1zdGVwJyApICksXG4gICAgICBzdGVwSW5kZXggPSAwLFxuICAgICAgbmF2SXRlbXMgID0gJydcblxuICBpZiAoIHN0ZXBzLmxlbmd0aCA9PSAwICkgcmV0dXJuXG5cblxuICBzdGVwcy5mb3JFYWNoKCBmdW5jdGlvbiggc3RlcCwgaW5kZXggKSB7IFxuXG4gICAgLy8gZGlzYWJsZSBhbGwgc3RlcHMgYnV0IHRoZSBjdXJyZW50IHN0ZXBcbiAgICBzdGVwLmRpc2FibGVkICAgICA9IHN0ZXAgIT0gY3VycmVudFN0ZXAoKVxuICAgIHN0ZXAuZGF0YXNldC5zdGVwID0gaW5kZXhcblxuICB9KVxuXG4gIGlmICggZm9ybS5kYXRhc2V0Lm5hdiApIHtcbiAgICB2YXIgbmF2ID0gJzxuYXYgY2xhc3M9XCJwcm9ncmVzc2l2ZS1mb3JtLW5hdlwiPidcblxuICAgIHN0ZXBzLmZvckVhY2goIGZ1bmN0aW9uKCBzdGVwLCBpbmRleCApIHtcbiAgICAgIG5hdiArPSAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInByb2dyZXNzaXZlLWZvcm0tbmF2LWl0ZW1cIiBkYXRhLXN0ZXA9XCInKyggaW5kZXggKyAxICkrJ1wiPidcbiAgICAgIG5hdiArPSBzdGVwLmRhdGFzZXQubmF2IHx8IFwiU3RlcCBcIiArICggaW5kZXggKyAxIClcbiAgICAgIG5hdiArPSAnPC9hPiAnXG4gICAgfSlcblxuICAgIG5hdiArPSAnPC9uYXY+J1xuXG4gICAgZm9ybS5pbnNlcnRBZGphY2VudEhUTUwoICdhZnRlcmJlZ2luJywgbmF2IClcbiAgfVxuXG4gIHNob3coKVxuXG4gIGZ1bmN0aW9uIHByZXZpb3VzU3RlcCAoKSAgeyByZXR1cm4gc3RlcHNbIHN0ZXBJbmRleCAtIDFdIH1cbiAgZnVuY3Rpb24gY3VycmVudFN0ZXAgKCkgICB7IHJldHVybiBzdGVwc1sgc3RlcEluZGV4IF0gfVxuICBmdW5jdGlvbiBuZXh0U3RlcCAoKSAgICAgIHsgcmV0dXJuIHN0ZXBzWyBzdGVwSW5kZXggKyAxXSB9XG4gIGZ1bmN0aW9uIGFjdGl2ZSAoKSAgICAgICAgeyByZXR1cm4gY3VycmVudFN0ZXAoKSAmJiAhY3VycmVudFN0ZXAoKS5kaXNhYmxlZCB9XG4gXG4gIC8vIE1vdmUgdG8gbmV4dCBmaWVsZHNldFxuICBmdW5jdGlvbiBmb3J3YXJkICgpIHtcbiAgICBzaG93U3RlcCggc3RlcEluZGV4ICsgMSApXG4gIH1cblxuICAvLyBNb3ZlIHRvIG5leHQgZmllbGRzZXRcbiAgZnVuY3Rpb24gYmFjayAoKSB7XG4gICAgc2hvd1N0ZXAoIHN0ZXBJbmRleCAtIDEgKVxuICB9XG5cbiAgLy8gQWNjZXB0cyBhIHN0ZXAgaW5kZXhcbiAgZnVuY3Rpb24gc2hvd1N0ZXAgKCBpbmRleCApIHtcblxuICAgIGluZGV4ID0gTnVtYmVyKCBpbmRleCApXG5cbiAgICAvLyBHZXQgdGhlIHN0ZXAgZnJvbSB0aGUgaW5kZXhcbiAgICB2YXIgc3RlcCA9IHN0ZXBzWyBpbmRleCBdXG5cbiAgICAvLyBEb24ndCBnbyB0byBhIG5vbi1leGlzdGFudCBzdGVwLCBvciB0aGUgY3VycmVudCBzdGVwXG4gICAgaWYgKCBzdGVwICYmIHN0ZXAgIT0gY3VycmVudFN0ZXAoKSApIHtcblxuICAgICAgdmFyIGRpcmVjdGlvbiA9ICggc3RlcEluZGV4IDwgaW5kZXggKSA/ICdmb3J3YXJkJyA6ICdyZXZlcnNlJ1xuXG4gICAgICAvLyBJZiBhIHN0ZXAgaXMgY3VycmVudGx5IGFjdGl2ZVxuICAgICAgLy8gZGlzbWlzcyBpdCBiZWZvcmUgZ29pbmcgdG8gdGhlIHNwZWNpZmllZCBzdGVwXG4gICAgICBpZiAoIGFjdGl2ZSgpICkge1xuICAgICAgICByZXR1cm4gZGlzbWlzcyggZnVuY3Rpb24oKSB7IHNob3dTdGVwKCBpbmRleCApIH0sIGRpcmVjdGlvbiApXG4gICAgICB9XG5cbiAgICAgIHN0ZXBJbmRleCA9IGluZGV4XG5cbiAgICAgIHNob3coIGRpcmVjdGlvbiApXG5cbiAgICB9XG4gIH1cbiAgXG4gIC8vIEhpZGUgYSBjb21wbGV0ZWQgc3RlcCBhbmQgbW92ZSB0byB0aGUgbmV4dFxuICBmdW5jdGlvbiBkaXNtaXNzICggY2FsbGJhY2ssIGRpcmVjdGlvbiApIHtcbiAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gfHwgJ2ZvcndhcmQnXG5cbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5yZW1vdmUoICdhY3RpdmUnLCAnZW50ZXInIClcbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5hZGQoICdleGl0JyApXG4gICAgY3VycmVudFN0ZXAoKS5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuXG4gICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGN1cnJlbnRTdGVwKCksIGZ1bmN0aW9uKCkge1xuICAgICAgZGlzYWJsZSgpXG5cbiAgICAgIGlmICggdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nICkgY2FsbGJhY2soKVxuXG4gICAgfSwgMjApXG5cbiAgfVxuXG4gIGZ1bmN0aW9uIHJldmlzaXQgKCBjYWxsYmFjaywgZGlyZWN0aW9uICkge1xuXG4gICAgaWYgKCAhYWN0aXZlKCkgKSB7XG4gICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gfHwgJ3JldmVyc2UnXG5cbiAgICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LnJlbW92ZSggJ2V4aXQnLCAnY29tcGxldGVkJyApXG4gICAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnLCAnZW50ZXInIClcbiAgICAgIGN1cnJlbnRTdGVwKCkuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgICAgZGlzYWJsZU90aGVyRmllbGRzZXRzKClcblxuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGN1cnJlbnRTdGVwKCksIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIGNhbGxiYWNrKClcbiAgICAgIH0sIDIwKVxuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgdGhlIGZvcm0tc3RlcFxuICBmdW5jdGlvbiBzaG93ICggZGlyZWN0aW9uICkge1xuXG4gICAgZGlzYWJsZU90aGVyRmllbGRzZXRzKClcbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5yZW1vdmUoICdjb21wbGV0ZWQnIClcbiAgICBjdXJyZW50U3RlcCgpLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlJywgJ2VudGVyJyApXG5cbiAgICAvLyBmb2N1cyBvbiB0aGUgZmlyc3QgaW5wdXRcbiAgICB2YXIgZmlyc3RJbnB1dCA9IGN1cnJlbnRTdGVwKCkucXVlcnlTZWxlY3RvciggJ2lucHV0Om5vdChbaGlkZGVuXSksIHRleHRhcmVhLCBzZWxlY3QnIClcbiAgICBpZiAoIGZpcnN0SW5wdXQgKSBmaXJzdElucHV0LmZvY3VzKClcblxuICAgIHNldE5hdigpXG5cbiAgfVxuXG4gIC8vIERpc2FibGUgYSBmb3JtIHN0ZXAgYWZ0ZXIgaXQgaGFzIGJlZW4gaGlkZGVuXG4gIGZ1bmN0aW9uIGRpc2FibGUgKCkge1xuXG4gICAgY3VycmVudFN0ZXAoKS5kaXNhYmxlZCA9IHRydWVcbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5hZGQoICdjb21wbGV0ZWQnIClcbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5yZW1vdmUoICdlbnRlcicsICdleGl0JyApXG5cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldE5hdiAoKSB7XG4gICAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICduYXYgW2RhdGEtc3RlcF0nICksIGZ1bmN0aW9uICggbmF2ICkge1xuXG4gICAgICBpZiAoIG5hdi5kYXRhc2V0LnN0ZXAgPCBzdGVwSW5kZXggKyAxICkge1xuICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSggJ2hlcmUnLCAnbmV4dCcgKVxuICAgICAgICBuYXYuY2xhc3NMaXN0LmFkZCggJ3ByZXZpb3VzJywgJ2NvbXBsZXRlZCcgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIG5hdi5kYXRhc2V0LnN0ZXAgPT0gc3RlcEluZGV4ICsgMSApIHtcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5yZW1vdmUoICdwcmV2aW91cycsICduZXh0JyApXG4gICAgICAgIG5hdi5jbGFzc0xpc3QuYWRkKCAnaGVyZScgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIG5hdi5kYXRhc2V0LnN0ZXAgPiBzdGVwSW5kZXggKyAxICkge1xuICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSggJ3ByZXZpb3VzJywgJ2hlcmUnIClcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoICduZXh0JyApXG4gICAgICB9XG5cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlRmllbGRzZXRzICggZm9ybSApIHtcbiAgICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJ2ZpZWxkc2V0LmZvcm0tc3RlcFtkaXNhYmxlZF0nICksIGZ1bmN0aW9uKCBmaWVsZHNldCApIHtcbiAgICAgIGZpZWxkc2V0LmRpc2FibGVkID0gZmFsc2UgXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGVPdGhlckZpZWxkc2V0cyAoICkge1xuICAgIHN0ZXBzLmZvckVhY2goIGZ1bmN0aW9uKCBmaWVsZHNldCApIHtcbiAgICAgIGZpZWxkc2V0LmRpc2FibGVkID0gZmllbGRzZXQgIT0gY3VycmVudFN0ZXAoKSBcbiAgICB9KVxuICB9XG5cbiAgcmVnaXN0ZXJlZEZvcm1zLnB1c2goIGZ1bmN0aW9uKCBldmVudCwgdHJpZ2dlciApIHtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldFxuXG4gICAgaWYgKCB0cmlnZ2VyID09PSAnc2hvdy1zdGVwJyApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIHRhcmdldCwgJy5wcmV2aW91cywgLmNvbXBsZXRlZCwgLmNvbXBsZXRlZCArIGEnICkgKVxuICAgICAgICBzaG93U3RlcCggdGFyZ2V0LmRhdGFzZXQuc3RlcCAtIDEgKVxuXG4gICAgfSBlbHNlIGlmICggdHJpZ2dlciA9PT0gJ25leHQnICkge1xuXG4gICAgICAvLyBDb250aW51ZSBpZiBzdWJtaXQgd2FzIHRyaWdnZXJlZCBvbiB0aGlzIGZvcm1cbiAgICAgIC8vIGFuZCBubyBpbnZhbGlkIGZpZWxkcyBhcmUgZm91bmRcblxuICAgICAgdmFyIGZvcm1FbCA9ICggdGFyZ2V0LnRhZ05hbWUgPT0gXCJGT1JNXCIgKSA/IHRhcmdldCA6IHRvb2xib3guZ2V0Q2xvc2VzdCggdGFyZ2V0LCAnZm9ybScpXG5cbiAgICAgIGlmICggZm9ybSA9PSBmb3JtRWwgJiYgIWN1cnJlbnRTdGVwKCkucXVlcnlTZWxlY3RvciggJzppbnZhbGlkJyApICkge1xuXG4gICAgICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gd2hpY2ggdHJpZ2dlcnMgY2FsbGJhY2tzXG4gICAgICAgIHZhciBmaXJlQ2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCBmb3JtIClcblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IHN0b3AsIGJlIHN1cmUgYWxsIGZpZWxkc2V0cyBhcmUgZW5hYmxlZCFcbiAgICAgICAgaWYgKCAhbmV4dFN0ZXAoKSApIGVuYWJsZUZpZWxkc2V0cyggZm9ybSApXG4gICAgICAgIGVsc2UgZGlzYWJsZU90aGVyRmllbGRzZXRzKCBmb3JtIClcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgY2FsbGJhY2tzLCBsZXQgdGhlbSBoYW5kbGUgdGhpcyFcbiAgICAgICAgaWYgKCBmaXJlQ2FsbGJhY2tzICkge1xuXG4gICAgICAgICAgLy8gU2luY2UgdGhlcmUgYXJlIGNhbGxiYWNrcywgc3RvcCB0aGUgc3VibWlzc2lvbiBldmVudFxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICAgIGZpcmVDYWxsYmFja3MoIGV2ZW50LCB7XG4gICAgICAgICAgICBmaWVsZHNldDogY3VycmVudFN0ZXAoKSwgIC8vIFZhbGlkIGZpZWxkc2V0IGVsZW1lbnRcbiAgICAgICAgICAgIGZvcm06ICAgICBmb3JtLCAgICAgICAgICAgLy8gUGFyZW50IGZvcm0gZWxlbWVudFxuICAgICAgICAgICAgZm9yd2FyZDogIGZvcndhcmQsICAgICAgICAvLyBDYWxsIGZvcndhcmQoKSB0byBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkc2V0XG4gICAgICAgICAgICBkaXNtaXNzOiAgZGlzbWlzcywgICAgICAgIC8vIEhpZGUgYW5kIGRpc2FibGUgY3VycmVudCBzdGVwXG4gICAgICAgICAgICByZXZpc2l0OiAgcmV2aXNpdCwgICAgICAgIC8vIFJldmlzaXQgY3VycmVudCBkaXNhYmxlZCBzdGVwXG4gICAgICAgICAgICBzaG93U3RlcDogc2hvd1N0ZXAsICAgICAgIC8vIFNob3cgYSBzcGVjaWZpYyBzdGVwIGJ5IGluZGV4ICgwIGJhc2VkKVxuICAgICAgICAgICAgY29tcGxldGU6ICFuZXh0U3RlcCgpLCAgICAvLyBpcyB0aGlzIGlzIHRoZSBmaW5hbCBmb3JtIHN0ZXA/XG4gICAgICAgICAgICBmb3JtRGF0YTogdG9vbGJveC5mb3JtRGF0YSggY3VycmVudFN0ZXAoKSApIC8vIHBhc3MgRm9ybURhdGEgZm9yIGN1cnJlbnQgZmllbGRzZXRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY2FsbGJhY2tzPyBJZiB0aGVyZSdzIGEgbmV4dCBzdGVwLCBzdG9wIHN1Ym1pc3Npb24gYW5kIHByb2NlZWRcbiAgICAgICAgZWxzZSBpZiAoIG5leHRTdGVwKCkgKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKSBcbiAgICAgICAgICBmb3J3YXJkKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gZmlyZSAoIGV2ZW50LCB0eXBlICkge1xuICByZWdpc3RlcmVkRm9ybXMuZm9yRWFjaCggZnVuY3Rpb24oIGZuICkgeyBmbiggZXZlbnQsIHR5cGUgKSB9KVxufVxuXG5cbi8vIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCB0cmlnZ2VycyBjYWxsYmFja3NcbmZ1bmN0aW9uIGdldENhbGxiYWNrcyAoIGZvcm0sIHR5cGUgKSB7XG5cbiAgdHlwZSA9IHR5cGUgfHwgJ25leHQnXG4gIHZhciBjYWxsYmFja3MgPSBbXSwgY2I7XG5cbiAgZm9ybUNhbGxiYWNrc1sgdHlwZSBdLmZvckVhY2goIGZ1bmN0aW9uKCB0ZXN0ICkge1xuICAgICBpZiAoIGNiID0gdGVzdCggZm9ybSApICkge1xuICAgICAgIGNhbGxiYWNrcy5wdXNoKCBjYiApXG4gICAgIH1cbiAgfSlcblxuICAvLyBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBjYW4gdHJpZ2dlciBhbGwgY2FsbGJhY2tzXG4gIC8vIG9yIHJldHVybnMgZmFsbHNlIGlmIG5vbmUgYXJlIGNhbGxlZFxuXG4gIGlmICggY2FsbGJhY2tzLmxlbmd0aCApXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZ3MgPSB0b29sYm94LnNsaWNlKCBhcmd1bWVudHMgKVxuXG4gICAgICBjYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICAgICAgICBjYWxsYmFjay5hcHBseSggY2FsbGJhY2ssIGFyZ3MgKSB9KSB9XG5cbiAgZWxzZSByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gbmV4dCAoIGVsLCBjYWxsYmFjayApIHtcbiAgb24oIGVsLCAnbmV4dCcsIGNhbGxiYWNrIClcbn1cblxuZnVuY3Rpb24gb24gKCBlbCwgZXZlbnQsIGNhbGxiYWNrICkge1xuXG4gIC8vIEFjY2VwdCBldmVudHMgbGlzdCBhcyBhbiBvYmplY3QgZS5nLiB7IG5leHQ6IGNhbGxiYWNrIH1cbiAgaWYgKCB0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnICkge1xuICAgIGZvciAoIHR5cGUgaW4gZXZlbnQgKSB7XG4gICAgICBvbiggZWwsIHR5cGUsIGV2ZW50WyB0eXBlIF0gKVxuICAgIH1cbiAgfVxuXG4gIGVsc2UgaWYgKCBmb3JtQ2FsbGJhY2tzWyBldmVudCBdICkge1xuXG4gICAgLy8gT25seSBhbGxvdyBhY2Nlc3MgdG8gYSBjYWxsYmFjayBpZiB0aGUgZm9ybSBtYXRjaGVzXG4gICAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uKCBmb3JtICkge1xuICAgICAgaWYgKCBmb3JtID09IGVsICkgcmV0dXJuIGNhbGxiYWNrXG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSB0ZXN0IHdyYXBwZXIgZnVuY3Rpb24gdG8gdGhlIGNhbGxiYWNrIGxpc3RcbiAgICBmb3JtQ2FsbGJhY2tzWyBldmVudCBdLnB1c2goIGZpbHRlciApXG4gIH1cbn1cblxuRXZlbnQucmVhZHkoIGZ1bmN0aW9uKCl7XG4gIHJlc2V0KClcblxuICAvLyBBZGQgYnViYmxpbmcgc28gd2UgY2FuIGxpc3RlbiBmb3Igc3VibWlzc2lvblxuICBFdmVudC5idWJibGVGb3JtRXZlbnRzKClcblxuICB2YXIgbmV4dFNlbGVjdG9yID0gZm9ybVNlbGVjdG9yICsgJyBbdHlwZT1zdWJtaXRdLCAnICsgZm9ybVNlbGVjdG9yICsgJyAubmV4dC1zdGVwJ1xuICB2YXIgYmFja1NlbGVjdG9yID0gZm9ybVNlbGVjdG9yICsgJyAuYmFjay1zdGVwJ1xuICB2YXIgbmF2U2VsZWN0b3IgID0gJy5wcm9ncmVzc2l2ZS1mb3JtLW5hdi1pdGVtW2RhdGEtc3RlcF0nXG5cbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCBuZXh0U2VsZWN0b3IgLCBmaXJlLCAnbmV4dCcgKVxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsIGJhY2tTZWxlY3RvciAsIGZpcmUsICdiYWNrJyApXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgbmF2U2VsZWN0b3IgICwgZmlyZSwgJ3Nob3ctc3RlcCcgKVxuLy8gaW5zZXJ0IGNvcmUgc3R5bGluZyBmb3IgaGlkaW5nIGRpc2FibGVkIGFuZCBjb21wbGV0ZWQgZm9ybS1zdGVwc1xuICBkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsIFwiPHN0eWxlPlxcXG4uZm9ybS1zdGVwW2Rpc2FibGVkXSwgLmZvcm0tc3RlcC5jb21wbGV0ZWQge1xcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xcXG4gIHRvcDogICAgICAtOTk5OXB4ICAhaW1wb3J0YW50O1xcXG4gIGxlZnQ6ICAgICAtOTk5OXB4ICAhaW1wb3J0YW50O1xcXG4gIGxlZnQ6ICAgICAwICAgICAgICAhaW1wb3J0YW50O1xcXG4gIHJpZ2h0OiAgICAwICAgICAgICAhaW1wb3J0YW50OyB9XFxcbjwvc3R5bGU+XCIgKVxuXG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgcmVzZXQoKVxuXG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBmb3JtU2VsZWN0b3IgKSwgZnVuY3Rpb24oIGVsICkge1xuICAgICAgbmV3Rm9ybSggZWwgKVxuICAgIH0pXG4gIH0pXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV4dDogbmV4dCxcbiAgbmV3OiBuZXdGb3JtXG59XG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBnZXRMYWJlbCA9IHJlcXVpcmUoICcuL2dldC1sYWJlbCcgKVxuXG5mdW5jdGlvbiByZXNldFZhbHVlKCBldmVudCApIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIHZhciBpbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQucmVzZXRJbnB1dCApXG5cbiAgdG9vbGJveC5lYWNoKCBpbnB1dHMsIGZ1bmN0aW9uICggaSApIHtcbiAgICBzZXRWYWx1ZSggaSwgaS5kYXRhc2V0LmluaXRpYWxWYWx1ZSApXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlKGlucHV0LCB2YWx1ZSkge1xuICAvLyBUcmlnZ2VyIGV2ZW50IHdhdGNoZXJzIHRoYXQgdGhlIGlucHV0IHdhcyBjaGFuZ2VkLlxuICBpZiAoIGlucHV0LnZhbHVlICE9IHZhbHVlICkge1xuICAgIGlucHV0LnZhbHVlID0gdmFsdWVcbiAgICBFdmVudC5maXJlKCBpbnB1dCwgJ2lucHV0JyApXG5cbiAgICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggaW5wdXQsICdmb3JtJyApXG4gICAgRXZlbnQuZmlyZSggZm9ybSwgJ2NoYW5nZScgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVEZWZhdWx0KCBldmVudCApIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIHZhciB0YXJnZXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LnJlc3RvcmVEZWZhdWx0IClcblxuICB0b29sYm94LmVhY2goIHRhcmdldHMsIGZ1bmN0aW9uICggZWwgKSB7XG5cbiAgICAvLyBSZXN0b3JlIHRvIGRlZmF1bHQgYSBzaW5nbGUgZWxlbWVudFxuICAgIGlmICggZWwuZGF0YXNldC5kZWZhdWx0ICkge1xuICAgICAgc2V0RGVmYXVsdCggZWwgKVxuICAgIH0gZWxzZSBpZiAoIGVsLmNoaWxkcmVuLmxlbmd0aCA+IDAgKSB7XG5cbiAgICAgIC8vIFJlc3RvcmUgYWxsIGlucHV0cyB0byBkZWZhdWx0IHdoZW5cbiAgICAgIC8vIGRhdGEtcmVzdG9yZS1kZWZhdWx0IHBvaW50cyB0byBhIHBhcmVudCBlbGVtZW50XG4gICAgICB0b29sYm94LmVhY2goIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1kZWZhdWx0XScgKSwgc2V0RGVmYXVsdCApXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBzZXREZWZhdWx0KCBlbCApIHtcbiAgaWYgKCBlbC50eXBlID09ICdyYWRpbycgfHwgZWwudHlwZSA9PSAnY2hlY2tib3gnICkge1xuICAgIGVsLmNoZWNrZWQgPSB0cnVlXG4gICAgRXZlbnQuZmlyZSggZWwsICdpbnB1dCcgKVxuICB9IGVsc2Uge1xuICAgIHNldFZhbHVlKCBlbCwgZWwuZGF0YXNldC5kZWZhdWx0IClcbiAgfVxuXG4gIGVsLmNsYXNzTGlzdC5hZGQoICdkZWZhdWx0ZWQtdmFsdWUnIClcblxuICB2YXIgbGFiZWwgPSBnZXRMYWJlbCggZWwgKVxuICBpZiAobGFiZWwpIGxhYmVsLmNsYXNzTGlzdC5hZGQoICdpbnB1dC1kZWZhdWx0ZWQtdmFsdWUnIClcbn1cblxuZnVuY3Rpb24gcmVzZXRGb3JtKGV2ZW50KSB7XG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdmb3JtJyApXG4gIEV2ZW50LmRlbGF5KCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJy5jaGFuZ2VkLXZhbHVlJyApLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgICBFdmVudC5maXJlKCBlbCwgJ2lucHV0JyApXG4gICAgfSlcbiAgfSwgMTAwKVxufVxuXG5FdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1yZXNldC1pbnB1dF0nLCByZXNldFZhbHVlIClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1tkYXRhLXJlc3RvcmUtZGVmYXVsdF0nLCByZXN0b3JlRGVmYXVsdCApXG5FdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbdHlwZT1yZXNldF0nLCByZXNldEZvcm0gKVxuIiwibW9kdWxlLmV4cG9ydHMgPSAnaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pLCBzZWxlY3QsIHRleHRhcmVhJ1xuIiwidmFyIHRvb2xib3ggICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgZXh0cmFjdERhdGEgPSByZXF1aXJlKCAnLi4vZXh0cmFjdC1kYXRhJyApLFxuICAgIG9iamVjdFNpemUgID0gcmVxdWlyZSggJy4uL29iamVjdC1zaXplJyApLFxuICAgIGhlbHBlcnMgICAgID0gcmVxdWlyZSggJy4vaGVscGVycycgKSxcbiAgICBzdGVwSW5kZXggICA9IHJlcXVpcmUoICcuLi9zdGVwLWluZGV4JyApLFxuICAgIEV2ZW50ICAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgc2xpZGVycyAgID0gW10sXG4gICAgbGlzdGVuaW5nID0gZmFsc2VcblxuZnVuY3Rpb24gd2F0Y2ggKCkge1xuICBpZiAoICFsaXN0ZW5pbmcgKSB7XG4gICAgbGlzdGVuaW5nID0gdHJ1ZVxuXG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiaW5wdXQgdG9nZ2xlcjpzaG93XCIsIFwiW3R5cGU9cmFuZ2VdXCIsIGNoYW5nZSwgeyB1c2VDYXB0dXJlOiB0cnVlIH0pXG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlIGlucHV0XCIsIFwiW3R5cGU9cmFuZ2VdXCIsIGZvY3VzLCB7IHVzZUNhcHR1cmU6IHRydWUgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBmb2N1cyAoIGV2ZW50ICkge1xuICAvLyBEbyBub3QgZm9jdXMgb24gXCJhcnRpZmljaWFsbHkgdHJpZ2dlcmVkXCIgZXZlbnRzXG4gIGlmICggZXZlbnQuaXNUcnVzdGVkICkgeyBldmVudC5jdXJyZW50VGFyZ2V0LmZvY3VzKCkgfVxufVxuXG5mdW5jdGlvbiBjaGFuZ2UgKCBldmVudCApIHtcbiAgLy8gQWxsb3dzIHlvdSB0byBwYXNzIHNsaWRlciBkaXJlY3RseSB0byBjaGFuZ2UoKVxuICB2YXIgc2xpZGVyID0gZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudFxuXG4gIC8vIERvbid0IHVwZGF0ZSBoaWRkZW4gc2xpZGVyc1xuICBpZiAoIHNsaWRlci5vZmZzZXRQYXJlbnQgIT09IG51bGwgKSB7XG4gICAgc2V0SW5wdXQoIHNsaWRlciApXG4gICAgc2V0TGFiZWxzKCBzbGlkZXIgKVxuICAgIHNldEZpbGwoIHNsaWRlciApXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoIHNsaWRlciApIHtcbiAgaWYgKHR5cGVvZiBzbGlkZXIgIT0gJ3N0cmluZycgJiYgc2xpZGVyLmRhdGFzZXQpXG4gICAgc2xpZGVyID0gc2xpZGVyLmRhdGFzZXQuc2xpZGVySWRcblxuICByZXR1cm4gc2xpZGVyc1tzbGlkZXJdXG59XG5cbmZ1bmN0aW9uIHNldElucHV0ICggc2xpZGVyICkge1xuICB2YXIgZGF0YSA9IGdldERhdGEoIHNsaWRlciApXG4gIFxuICB2YXIgdmFsdWUgPSBkYXRhLnZhbHVlc1sgc2xpZGVyLnZhbHVlIF1cbiAgdmFyIGlucHV0ID0gaGVscGVycy5nZXRJbnB1dCggc2xpZGVyIClcblxuICBpZihpbnB1dCkge1xuICAgIGlucHV0LnZhbHVlID0gdmFsdWVcbiAgICBpZiAoaW5wdXQudHlwZSAhPSAnaGlkZGVuJykgRXZlbnQuZmlyZSggaW5wdXQsICdpbnB1dCcgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEZpbGwgKCBzbGlkZXIgKSB7XG4gIHZhciBkYXRhID0gZ2V0RGF0YSggc2xpZGVyIClcbiAgdmFyIHdyYXBwZXIgPSAnI3NsaWRlci1pbnB1dC0nK3NsaWRlci5kYXRhc2V0LnNsaWRlcklkKyctd3JhcHBlcidcbiAgdmFyIHNlZ21lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggd3JhcHBlciArICcgLnNsaWRlci1zZWdtZW50JylcbiAgdmFyIGZpbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggd3JhcHBlciArICcgLnNsaWRlci1maWxsJylcbiAgdmFyIGluZGV4ID0gc3RlcEluZGV4KCBzbGlkZXIgKVxuICBcbiAgdG9vbGJveC5lYWNoKCBmaWxscywgZnVuY3Rpb24oIGZpbGwsIGVsSW5kZXggKXtcbiAgICBcbiAgICAvLyBjb21wYXJlIGN1cnJlbnQgaW5kZXggdG8gZmlsbCBlbGVtZW50IGluZGV4OiA8c3BhbiBjbGFzcz0nc2xpZGVyLWZpbGwnIGRhdGEtaW5kZXg9JzEnPlxuICAgIGlmICggZmlsbC5kYXRhc2V0LmluZGV4IDw9IGluZGV4ICkge1xuICAgICAgZmlsbC5jbGFzc0xpc3QuYWRkKCAnZmlsbGVkJyApXG5cbiAgICAgIC8vIFJhdGhlciB0aGFuIGp1bXAgdGhyb3VnaCB0aGUgRE9NIHR3aWNlLCB1c2UgdGhlIGluZGV4IHRvIHNldFxuICAgICAgLy8gZmlsbHMgZm9yIHRyYWNrIHNlZ21lbnRzIHRvbyAoZm9yIGZpbGxpbmcgaW4gY29sb3Igb24gc2xpZGVyIG1hcmtzKVxuICAgICAgaWYgKCBzZWdtZW50c1tlbEluZGV4XSApIHNlZ21lbnRzW2VsSW5kZXhdLmNsYXNzTGlzdC5hZGQoICdmaWxsZWQnIClcbiAgICB9IGVsc2Uge1xuXG4gICAgICAvLyBSZW1vdmUgZmlsbHNcbiAgICAgIGZpbGwuY2xhc3NMaXN0LnJlbW92ZSgnZmlsbGVkJylcbiAgICAgIGlmKHNlZ21lbnRzW2VsSW5kZXhdKSBzZWdtZW50c1tlbEluZGV4XS5jbGFzc0xpc3QucmVtb3ZlKCdmaWxsZWQnKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0TGFiZWxzICggc2xpZGVyICkge1xuICB2YXIgZGF0YSA9IGdldERhdGEoc2xpZGVyKVxuXG4gIC8vIElmIGhpZGRlbiBzbGlkZXIgb3Igbm8gbGFiZWxzIHNldCwgZG9uJ3QgdXBkYXRlXG4gIGlmICggZGF0YS5sYWJlbHMgKSB7XG5cbiAgICBmb3IgKCB2YXIga2V5IGluIGRhdGEubGFiZWxzICkge1xuICAgICAgdmFyIGxhYmVsRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NsaWRlci1pbnB1dC0nK3NsaWRlci5kYXRhc2V0LnNsaWRlcklkKyctd3JhcHBlciBbZGF0YS1zbGlkZXItbGFiZWw9JytrZXkrJ10gLmxhYmVsLWNvbnRlbnQnKVxuICAgICAgdmFyIGxhYmVscyA9IGxhYmVsQXRJbmRleCggZGF0YS5sYWJlbHMsIHNsaWRlci52YWx1ZSApXG5cbiAgICAgIHRvb2xib3guZWFjaCggbGFiZWxFbHMsIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gbGFiZWxzW2tleV1cbiAgICAgICAgZWwucGFyZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdlbXB0eS1sYWJlbCcsIGxhYmVsc1trZXldID09PSAnJylcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbi8vIEZpbmQgbGFiZWxzIHdoaWNoIGhhdmUgYW4gZW50cnkgZm9yIHNsaWRlciB2YWx1ZVxuZnVuY3Rpb24gbGFiZWxBdEluZGV4KCBsYWJlbHMsIHZhbHVlICkge1xuICB2YXIgc2V0ID0ge31cbiAgZm9yICh2YXIga2V5IGluIGxhYmVscykge1xuICAgIHNldFtrZXldID0gbGFiZWxzW2tleV1bdmFsdWVdXG4gIH1cbiAgcmV0dXJuIHNldFxufVxuXG5mdW5jdGlvbiBjYWNoZSAoIHNsaWRlciApIHtcbiAgdmFyIGRhdGEgPSB7XG4gICAgLy8gQXNzaWduIGFuIGluY3JlbWVudGFsIElEIHRvIHRyYWNrIHRoaXMgc2xpZGVyIHdpdGggaXRzIGRhdGFcbiAgICBpZDogICBzbGlkZXJzLmxlbmd0aCxcbiAgICBtaW46ICBOdW1iZXIoIHNsaWRlci5taW4gKSAgfHwgMCxcbiAgICBtYXg6ICBOdW1iZXIoIHNsaWRlci5tYXggKSAgfHwgMTAwLFxuICAgIHN0ZXA6IE51bWJlciggc2xpZGVyLnN0ZXAgKSB8fCAxXG4gIH1cblxuICAvLyBTZXQgZGF0YXNldC5zbGlkZXJJZCBmb3IgZWFzeSBjYWNoZSBsb29rdXBzIGxhdGVyXG4gIC8vIFVzaW5nIHNldGF0dHJpYnV0ZSBiZWNhdXNlIGl0IGZvcmNlcyBhIGNoYW5nZSB0byB0aGUgZWxlbWVudCdzIHRhZ1xuICBzbGlkZXIuc2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlci1pZCcsIGRhdGEuaWQpXG5cbiAgLy8gR2V0IGFsbCBhdHRyaWJ1dGVzIHdoaWNoIHN0YXJ0IHdpdGggYGRhdGEtYFxuICBkYXRhID0gdG9vbGJveC5tZXJnZSggZGF0YSwgZXh0cmFjdERhdGEoc2xpZGVyLCAnZGF0YS0nKSApXG5cbiAgZGF0YS52YWx1ZXMgICA9IGhlbHBlcnMuZ2V0VmFsdWVzKCBkYXRhLm1pbiwgZGF0YS5tYXgsIGRhdGEudmFsdWVzLCBkYXRhLnN0ZXAgKVxuICBkYXRhLnNlZ21lbnRzID0gb2JqZWN0U2l6ZShkYXRhLnZhbHVlcylcbiAgZGF0YS5tYXggICAgICA9IGRhdGEubWluICsgKChkYXRhLnNlZ21lbnRzIC0gMSkgKiBkYXRhLnN0ZXApXG5cbiAgaWYgKCBkYXRhLm1hcmsgKSBkYXRhLm1hcmsgPSBoZWxwZXJzLnNwbGl0KGRhdGEubWFyaykubWFwKE51bWJlcilcblxuICBkYXRhLmxpbmVMYWJlbHMgPSBoZWxwZXJzLmdldExpbmVMYWJlbHMoIGRhdGFbJ2xpbmUtbGFiZWxzJ10gKVxuXG4gIC8vIEdldCBsYWJlbHMgKG9yIGNyZWF0ZSB0aGVtIGlmIG5vbmUgZXhpc3QpXG4gIGRhdGEubGFiZWxzID0gZ2V0TGFiZWxzKCBzbGlkZXIsIGRhdGEgKVxuICBpZiAoIG9iamVjdFNpemUoIGRhdGEubGFiZWxzICkgPT0gMCkgZGF0YS5sYWJlbHMuZGVmYXVsdCA9IGRhdGEudmFsdWVzXG5cbiAgLy8gSWYgdXNlciBoYXBwZW5zIHRvIHVzZSBkYXRhLWxhYmVsPSdhLGIsYycgYW5kIGRhdGEtbGFiZWwtdHdvPSdkLGUsZidcbiAgLy8gcmVtb3ZlIGRlZmF1bHQgbGFiZWwgKHRoZXkncmUgdXNpbmcgaXQgd3JvbmdseSlcbiAgZWxzZSBpZiAoIG9iamVjdFNpemUoIGRhdGEubGFiZWxzICkgPiAxICkgZGVsZXRlIGRhdGEubGFiZWxzLmRlZmF1bHRcblxuICAvLyBTZXQgZGF0YS1pbnB1dCBuYW1lIGJhc2VkIG9uIHNsaWRlciBuYW1lIChpZiB1bnNldClcbiAgLy8gZGF0YS1pbnB1dCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgaGlkZGVuIGlucHV0IHdoaWNoIHdpbGwgY29udGFpblxuICAvLyBzbGlkZXIncyBjdXN0b20gdmFsdWVzXG4gIGRhdGEuaW5wdXQgICAgICA9IGRhdGEuaW5wdXQgfHwgc2xpZGVyLm5hbWVcbiAgc2xpZGVyLmRhdGFzZXQuaW5wdXQgPSBkYXRhLmlucHV0XG4gIC8vIFJlbW92ZSBuYW1lIHNvIHRoYXQgZm9ybSBzdWJtaXNzaW9uIGRvZXNuJ3QgaW5jbHVkZSB2YWx1ZXMgZm9yIHNsaWRlclxuICBzbGlkZXIucmVtb3ZlQXR0cmlidXRlKCduYW1lJylcblxuICAvLyBJcyB0aGVyZSBhbHJlYWR5IGFuIGlucHV0IGluIHRoZSBET00/XG4gIHZhciBpbnB1dCA9IGhlbHBlcnMuZ2V0SW5wdXQoIHNsaWRlciApXG4gIC8vIElmIHNvIHNldCBmbGFnIHNvIHRlbXBsYXRlIHdpbGwgbm90IGNyZWF0ZSBhIGhpZGRlbiBpbnB1dFxuICBpZiAoIGlucHV0ICkgZGF0YS5pbnB1dEV4aXN0cyA9IHRydWVcblxuICBzbGlkZXJzLnB1c2goZGF0YSlcbiAgcmV0dXJuIGRhdGFcbn1cblxuZnVuY3Rpb24gZ2V0TGFiZWxzKCBzbGlkZXIsIGRhdGEgKSB7XG4gIC8vIFJldHVybnMgYW4gb2JqZWN0IGFsbCBgZGF0YS1sYWJlbCpgIGF0dHJpYnV0ZXNcbiAgdmFyIGxhYmVscyA9IGV4dHJhY3REYXRhKCBzbGlkZXIsICdkYXRhLWxhYmVsJyApXG5cbiAgLy8gU2luY2UgZXh0cmFjdGlvbiBzdGFydHMgYWZ0ZXIgYGRhdGEtbGFiZWxgLCBcbiAgLy8gYGRhdGEtbGFiZWw9J2ZvbydgIHdpbGwgYmUga2V5ZWQgYnkgJycgZS5nLiBvYmplY3RbJyddPSdmb28nXG4gIC8vIFRoaXMgY29ycmVjdHMgdGhhdCBvZGRpdHkgc3VjaCB0aGF0IGBvYmplY3RbJ2RlZmF1bHQnXT0nZm9vJ2BcbiAgaWYgKGxhYmVsc1snJ10pIHtcbiAgICBsYWJlbHNbJ2RlZmF1bHQnXSA9IGxhYmVsc1snJ11cbiAgICBkZWxldGUgbGFiZWxzWycnXVxuICB9XG4gIHJldHVybiBoZWxwZXJzLmdldExhYmVscyggbGFiZWxzLCBkYXRhIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNhY2hlOiBjYWNoZSxcbiAgd2F0Y2g6IHdhdGNoLFxuICBjaGFuZ2U6IGNoYW5nZSxcbiAgZ2V0RGF0YTogZ2V0RGF0YVxufVxuIiwiZnVuY3Rpb24gZ2V0VmFsdWVzKCBtaW4sIG1heCwgdmFsdWVzLCBzdGVwICkge1xuICB2YXIgcmVzdWx0ID0ge31cbiAgc3RlcCA9IHN0ZXAgfHwgMVxuXG4gIC8vIElmIHNsaWRlciBoYXMgZGF0YS12YWx1ZSBhdHRyaWJ1dGUgc3BsaXQgaW50byBhbiBhcnJheVxuICB2YWx1ZXMgPSB2YWx1ZXMgPyBzcGxpdCggdmFsdWVzICkgOiBbXVxuICAgXG4gIC8vIEFkZCB2YWx1ZXMgYmV0d2VlbiBtaW4gYW5kIG1heCwgZWc6IDEsMiwzLDQsNeKAplxuICBmb3IgKCB2YXIgdmFsdWUgPSBtaW47IHZhbHVlIDw9IG1heDsgdmFsdWUrPXN0ZXAgKSB7IFxuICAgIHJlc3VsdFt2YWx1ZV0gPSB2YWx1ZXMuc2hpZnQoKSB8fCB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBUYWtlcyBsYWJlbCBkYXRhIGFuZCBjdW5zdHJ1Y3RzIGhhc2hlcyBrZXllZCBieSBzbGlkZXIgdmFsdWUuXG4vL1xuLy8gSW5wdXQ6XG4vLyBkYXRhLWxhYmVsPSdob25leSwgYnJlYWQsIGJ1dHRlcidcbi8vXG4vLyBSZXR1cm5zIGFzOiBcbi8vIGRhdGEubGFiZWxzWydkZWZhdWx0XSA9IFsnaG9uZXknLCAnYnJlYWQnLCAnYnV0dGVyJ11cbi8vIFxuLy8gSW5wdXQ6XG4vLyBkYXRhLWxhYmVsLWJyZWFkPSdyeWUsd2hlYXQsd2hpdGUnXG4vLyBkYXRhLWxhYmVsLXNwcmVhZD0namVsbHksamFtLGJ1dHRlcixob25leSdcbi8vXG4vLyBSZXR1cm5zIGFzOlxuLy8gZGF0YS5sYWJlbHNbJ2JyZWFkJ10gID0geyAwOiAncnllJywgMTogJ3doZWF0JywgMjogJ3doaXRlJyB9XG4vLyBkYXRhLmxhYmVsc1snc3ByZWFkJ10gPSB7IDA6ICdqZWxseSdsLCAxOiAnamFtJywgMjogJ2J1dHRlcicsIDM6ICdob25leScgfVxuLy9cbmZ1bmN0aW9uIGdldExhYmVscyggbGFiZWxEYXRhLCBkYXRhICkge1xuICB2YXIgbGFiZWxzID0ge31cblxuICAvLyBJZiBsYWJlbHMgaGF2ZSBiZWVuIHR1cm5lZCBvZmYgKGRhdGEtbGFiZWw9ZmFsc2V8bm9uZSksIHJldHVybiBmYWxzZVxuICBpZiAoIGxhYmVsRGF0YS5kZWZhdWx0ICYmIGxhYmVsRGF0YS5kZWZhdWx0LnRyaW0oKS5tYXRjaCgvXmZhbHNlJHxebm9uZSQvKSApIHJldHVybiBmYWxzZVxuXG4gIC8vIFVubGVzcyBsYWJlbHMgaGF2ZSBiZWVuIGRpc2FiZWQgd2l0aCBkYXRhLWxhYmVsPSdmYWxzZSdcbiAgZm9yICggdmFyIGtleSBpbiBsYWJlbERhdGEgKSB7XG5cbiAgICAvLyBJZ25vcmUgbm9uLW5hdGl2ZSBtZXRob2RzIGluamVjdGVkIGJ5IHNvbWUgd2F5d2FyZCBsaWJcbiAgICBpZiAoICFsYWJlbERhdGEuaGFzT3duUHJvcGVydHkoa2V5KSApIHsgY29udGludWUgfVxuXG4gICAgLy8gU3BsaXQgbGFiZWxzIGludG8gYW4gYXJyYXkuXG4gICAgdmFyIHNwbGl0TGFiZWxzID0gc3BsaXQoIGxhYmVsRGF0YVtrZXldIClcblxuICAgIC8vIENvbnN0cnVjdCBhIGxhYmVscyBvYmplY3Qga2V5ZWQgYnkgc2xpZGVyIHZhbHVlc1xuICAgIHZhciB2YWx1ZUxhYmVscyA9IHt9XG5cbiAgICAvLyBXYWxrIHVwIHRoZSBzbGlkZXIgdmFsdWVzIGJ5IHN0ZXAgc2l6ZSBmcm9tIG1pbiB0byBtYXhcbiAgICBmb3IgKCB2YXIgdmFsdWUgPSBkYXRhLm1pbjsgdmFsdWUgPD0gZGF0YS5tYXg7IHZhbHVlKz1kYXRhLnN0ZXAgKSB7IFxuICAgICAgdmFsdWVMYWJlbHNbdmFsdWVdID0gc3BsaXRMYWJlbHMuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIEFzc2lnbiB0aGUgbmV3IG9iamVjdCB0byBhIGxhYmVsIGtleSBlLmcuIGxhYmVsc1snYnJlYWQnXVxuICAgIGxhYmVsc1trZXldID0gdmFsdWVMYWJlbHNcbiAgfVxuXG4gIHJldHVybiBsYWJlbHNcbn1cblxuLy8gSWYgbGluZUxhYmVscyBhcmUgcHJlc2VudCwgdGhpcyByZWF0dXJucyBhbiBhcnJheSBcbi8vIHdpdGggbGFiZWxzIHNldCBmb3IgYXBwcm9wcmlhdGUgaW5kZXhlc1xuZnVuY3Rpb24gZ2V0TGluZUxhYmVscyAoIGxpbmVMYWJlbHMgKXtcbiAgLy8gTGluZSBsYWJlbHMgbWF5IGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0czpcbiAgLy8gLSAxOnN0YXJ0LDEwOmVuZCAgICAgICAgICAgICAgLSBpbmRleCBzcGVjaWZpZWQsIGNvbW1hIHNlcGFyYXRlZFxuICAvLyAtIGZpcnN0LHNlY29uZCx0aGlyZCwxMDpsYXN0ICAtIGRlZmF1bHQgdG8gaW5kZXggZm9yIHNvbWUgbGFiZWxzXG4gIC8vIC0gMTAsMDAwOzIwLDAwMDszMCwwMDAgICAgICAgIC0gc2VtaWNvbG9uIHNlcGFyYXRlZFxuICAvL1xuICBsYWJlbHMgPSB7fVxuICBpZiAoIGxpbmVMYWJlbHMgKSB7XG4gICAgc3BsaXQobGluZUxhYmVscykubWFwKCBmdW5jdGlvbiggbGluZXMsIGluZGV4ICl7XG4gICAgICAvLyBTcGxpdCBvbiBgOmAgdG8gc2VlIGlmIGluZGV4IGlzIHNwZWNpZmllZCAoZXhhbXBsZSAxIGFib3ZlKVxuICAgICAgdmFyIGwgPSBsaW5lcy5zcGxpdCgnOicpXG5cbiAgICAgIC8vIElmIHNwbGl0IGlzIHN1Y2Nlc3NmdWwsIGluZGV4IGhhcyBiZWVuIHNwZWNpZmllZCBlZywgMTpzdGFydFxuICAgICAgLy8gc2V0IGxpbmVMYWJlbCBpbmRleCB0byBpbmRleCBmb3VuZCBpbiBzcGxpdFxuICAgICAgaWYgKGxbMV0pIGxhYmVsc1tsWzBdXSA9IGxbMV1cblxuICAgICAgLy8gRWxzZSwgdXNlIGN1cnJlbnQgaW5kZXggKCsxIGJlY2F1c2UgdGhpcyBpcyAxIGJhc2VkKVxuICAgICAgLy8gdG8gc2V0IExpbmVMYWJlbCBpbmRleFxuICAgICAgLy8gU2luY2Ugbm8gc3BsaXQgc2V0IHZhbHVlIHdpdGggbFswXVxuICAgICAgZWxzZSBsYWJlbHNbaW5kZXggKyAxXSA9IGxbMF1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxhYmVsc1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dChzbGlkZXIpIHtcbiAgcmV0dXJuIHNjb3BlVG9Gb3JtKHNsaWRlcikucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIicrc2xpZGVyLmRhdGFzZXQuaW5wdXQrJ1wiXSwgJytzbGlkZXIuZGF0YXNldC5pbnB1dClcbn1cblxuZnVuY3Rpb24gc3BsaXQgKHN0cmluZyl7IFxuICB2YXIgZGVsaW1pdGVyID0gc3RyaW5nLm1hdGNoKC87LykgPyAnOycgOiAnLCdcbiAgcmV0dXJuIHN0cmluZy5zcGxpdChkZWxpbWl0ZXIpLm1hcCh0cmltKVxufVxuXG5mdW5jdGlvbiB0cmltICh2YWx1ZSl7IFxuICByZXR1cm4gdmFsdWUudHJpbSgpXG59XG5cbi8vIHNjb3BlVG9Gb3JtIHNlbGVjdG9yIHRvIGN1cnJlbnQgZm9ybVxuLy8gQXZvaWRzIG1vZGlmeWluZyBjb250ZW50IGluIG90aGVyIGZvcm1zXG5mdW5jdGlvbiBzY29wZVRvRm9ybShzbGlkZXIpIHtcbiAgdmFyIGVsID0gc2xpZGVyXG5cbiAgLy8gd2FsayB1cCB1bnRpbCB5b3UgZmluZCBhIGZvcm1cbiAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHsgZWwgPSBlbC5wYXJlbnROb2RlIH1cblxuICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0VmFsdWVzOiBnZXRWYWx1ZXMsXG4gIGdldExhYmVsczogZ2V0TGFiZWxzLFxuICBnZXRMaW5lTGFiZWxzOiBnZXRMaW5lTGFiZWxzLFxuICBnZXRJbnB1dDogZ2V0SW5wdXQsXG4gIHNjb3BlVG9Gb3JtOiBzY29wZVRvRm9ybSxcbiAgc3BsaXQ6IHNwbGl0XG59XG4iLCJ2YXIgdG9vbGJveCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIHRlbXBsYXRlICAgID0gcmVxdWlyZSggJy4vdGVtcGxhdGUnICksXG4gICAgZXZlbnRzICAgICAgPSByZXF1aXJlKCAnLi9ldmVudHMnIClcblxuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIGV2ZW50cy53YXRjaCgpXG5cbiAgdG9vbGJveC5ldmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIC8vIERvbid0IHNlbGVjdCBwcmV2aW91c2x5IHNldHVwIHNsaWRlcnNcbiAgICB2YXIgcmFuZ2VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3R5cGU9cmFuZ2VdOm5vdCguc2xpZGVyLWlucHV0KScpXG5cbiAgICB0b29sYm94LmVhY2goIHJhbmdlcywgZnVuY3Rpb24oc2xpZGVyKXtcbiAgICAgIHZhciBkYXRhID0gZXZlbnRzLmNhY2hlKCBzbGlkZXIgKVxuICAgICAgc2xpZGVyID0gaW5pdCggc2xpZGVyLCBkYXRhIClcbiAgICAgIGV2ZW50cy5jaGFuZ2UoIHNsaWRlciApXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gaW5pdCggc2xpZGVyLCBkYXRhICkge1xuICAvLyBTZXQgc2xpZGVyIGNsYXNzIHNvIHRoYXQgaXQgd29uJ3QgYmUgc2V0dXAgdHdpY2VcbiAgc2xpZGVyLmNsYXNzTGlzdC5hZGQoICdzbGlkZXItaW5wdXQnIClcblxuICAvLyBNYXRjaCBkZWZhdWx0c1xuICBzbGlkZXIuc2V0QXR0cmlidXRlKCAnbWluJywgZGF0YS5taW4gKVxuICBzbGlkZXIuc2V0QXR0cmlidXRlKCAnbWF4JywgZGF0YS5tYXggKVxuICBzbGlkZXIuc2V0QXR0cmlidXRlKCAnc3RlcCcsIGRhdGEuc3RlcCApXG5cbiAgLy8gRG9uJ3QgbGV0IHRoZSBicm93c2VyIHNlbGVjdCBhIGRlZmF1bHQgdmFsdWVcbiAgaWYoIXNsaWRlci5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpIHNsaWRlci5zZXRBdHRyaWJ1dGUoICd2YWx1ZScsIGRhdGEubWluIClcbiAgZGF0YS5pbml0aWFsVmFsdWUgPSBzbGlkZXIuZGF0YXNldC5pbml0aWFsVmFsdWUgPSBzbGlkZXIudmFsdWVcblxuICBpZighc2xpZGVyLmdldEF0dHJpYnV0ZSgnaWQnKSkgc2xpZGVyLnNldEF0dHJpYnV0ZSggJ2lkJywgJ3NsaWRlci1pbnB1dC0nK2RhdGEuaWQgKVxuICAvLyBJbnNlcnQgdGhlIHRlbXBsYXRlIHJpZ2h0IGJlZm9yZSB0aGUgc2xpZGVyXG4gIHNsaWRlci5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmViZWdpbicsIHRlbXBsYXRlLmh0bWwoIGRhdGEsIHNsaWRlci5vdXRlckhUTUwgKSApXG4gIC8vIEdyYWIgYSByZWZlcmVuY2UgdG8gbmV3IHNsaWRlciBjb250YWluZXJcbiAgdmFyIGNvbnRhaW5lciA9IHNsaWRlci5wcmV2aW91c1NpYmxpbmdcbiAgLy8gcmVtb3ZlIG9sZCBzbGlkZXJcbiAgc2xpZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2xpZGVyKVxuXG4gIC8vIHJldHVybiBuZXcgc2xpZGVyXG4gIHJldHVybiBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnNsaWRlci1pbnB1dCcpXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldHVwOiBzZXR1cCxcbiAgZ2V0RGF0YTogZXZlbnRzLmdldERhdGFcbn1cbiIsInZhciBvYmplY3RTaXplID0gcmVxdWlyZSgnLi4vb2JqZWN0LXNpemUnKVxuXG5mdW5jdGlvbiBodG1sKCBkYXRhLCBzbGlkZXJIVE1MICkge1xuICB2YXIgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiJyArIGdldENsYXNzZXMoIGRhdGEgKSArICdcIiBpZD1cInNsaWRlci1pbnB1dC0nICsgZGF0YS5pZCArICctd3JhcHBlclwiPidcbiAgICAgIGh0bWwgKz0gXCI8ZGl2IGNsYXNzPSdzbGlkZXItaW5wdXQtY29udGFpbmVyJz5cIiArIHNsaWRlckhUTUwgKyBnZXRUcmFjayggZGF0YSApICsgXCI8L2Rpdj5cIlxuICAgICAgaHRtbCArPSBhZGRMYWJlbHMoIGRhdGEgKVxuICAgICAgaHRtbCArPSBhZGRJbnB1dCggZGF0YSApXG4gICAgICBodG1sICs9ICc8L2Rpdj4nXG4gIHJldHVybiBodG1sXG59XG5cbmZ1bmN0aW9uIGdldENsYXNzZXMoIGRhdGEgKSB7XG4gIHZhciBjbGFzc2VzID0gWydzbGlkZXItY29udGFpbmVyJ11cbiAgaWYgKG9iamVjdFNpemUoZGF0YS5saW5lTGFiZWxzKSA+IDApIGNsYXNzZXMucHVzaCgnbGluZS1sYWJlbHMnKVxuICBjbGFzc2VzLnB1c2goKGRhdGEubGFiZWxzKSA/ICd3aXRoLWxhYmVsJyA6ICd3aXRob3V0LWxhYmVsJylcbiAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpXG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrICggZGF0YSApIHtcbiAgdmFyIHRyYWNrID0gJydcblxuICAvLyBJZiBkYXRhIGhhcyBiZWVuIG1hcmtlZCwgb3IgaWYgdGhlcmUgYXJlIGxpbmUgbGFiZWxzXG4gIC8vIHRoaXMgd2lsbCBhZGQgdGhvc2UgbGFiZWxzIHRvIHRoZSB0cmFja1xuICBpZiAoZGF0YS5tYXJrIHx8IGRhdGEubGluZUxhYmVscykge1xuICAgIGZvcih2YXIgaW5kZXggPSAxOyBpbmRleCA8PSBkYXRhLnNlZ21lbnRzOyBpbmRleCsrKSB7XG4gICAgICB0cmFjayArPSBcIjxkaXYgY2xhc3M9J3NsaWRlci1zZWdtZW50Jz48c3BhbiBjbGFzcz0nc2xpZGVyLXNlZ21lbnQtY29udGVudCc+XCJcbiAgICAgIHRyYWNrICs9IGFkZE1hcmsoIGRhdGEubWFyaywgaW5kZXggKVxuICAgICAgdHJhY2sgKz0gYWRkTGluZUxhYmVsKCBkYXRhLmxpbmVMYWJlbHNbaW5kZXhdIClcbiAgICAgIHRyYWNrICs9IFwiPC9zcGFuPjwvZGl2PlwiXG4gICAgfVxuICB9XG5cbiAgdHJhY2sgPSBcIjxkaXYgY2xhc3M9J3NsaWRlci10cmFjayc+XCIgKyB0cmFjayArIFwiPC9kaXY+XCJcbiAgcmV0dXJuIHRyYWNrICsgYWRkRmlsbHMoIGRhdGEuc2VnbWVudHMgKVxufVxuXG5mdW5jdGlvbiBhZGRNYXJrKG1hcmtzLCBpbmRleCkge1xuICAvLyBJZiBtYXJrIChhbiBhcnJheSkgaGFzIGFuIGl0ZW0gaW4gaXRzIGluZGV4XG4gIGlmIChtYXJrcyAmJiBtYXJrcy5pbmRleE9mKGluZGV4KSAhPSAtMSlcbiAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0nc2xpZGVyLXNlZ21lbnQtbWFyaycgZGF0YS1pbmRleD0nXCIraW5kZXgrXCInPjwvc3Bhbj5cIlxuICBlbHNlXG4gICAgcmV0dXJuIFwiXCJcbn1cblxuZnVuY3Rpb24gYWRkTGluZUxhYmVsKCBsYWJlbCApIHtcbiAgaWYgKGxhYmVsKVxuICAgIHJldHVybiBcIjxzcGFuIGNsYXNzPSdzbGlkZXItbGluZS1sYWJlbCc+XCIrbGFiZWwrXCI8L3NwYW4+XCJcbiAgZWxzZVxuICAgIHJldHVybiBcIlwiXG59XG5cbi8vIEdldCBmaWxscyBmb3IgZWFjaCBzZWdtZW50IGV4Y2VwdCB0aGUgbGFzdC5cbi8vIFRoZXJlIGlzIG5vIGZpbGwgZm9yIHRoZSBsYXN0IGl0ZW0gXG4vLyBiZWNhdXNlIGl0J3MgYXQgdGhlIGVuZCBvZiB0aGUgc2xpZGVyXG5mdW5jdGlvbiBhZGRGaWxscyhjb3VudCkge1xuICB2YXIgZmlsbHMgPSAnJ1xuICBmb3IodmFyIGkgPSAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGZpbGxzICs9IFwiPHNwYW4gY2xhc3M9J3NsaWRlci1maWxsJyBkYXRhLWluZGV4PSdcIitpK1wiJz48L3NwYW4+XCJcbiAgfVxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdzbGlkZXItZmlsbHMnPlwiICsgZmlsbHMgKyBcIjwvZGl2PlwiXG5cbn1cblxuLy8geyBsYWJlbHM6IHsgZGVmYXVsdDogWzEsMiwzXSB9fVxuZnVuY3Rpb24gYWRkTGFiZWxzICggZGF0YSApe1xuICB2YXIgaHRtbCA9ICcnXG4gIGlmIChkYXRhLmxhYmVscyA9PSBmYWxzZSkgeyByZXR1cm4gaHRtbCB9XG5cbiAgZm9yKHZhciBrZXkgaW4gZGF0YS5sYWJlbHMpe1xuICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwic2xpZGVyLWxhYmVsLScra2V5KycgaW50ZXJuYWwtbGFiZWxcIiBkYXRhLXNsaWRlci1sYWJlbD1cIicra2V5KydcIj4nXG4gICAgaHRtbCArPSBsYWJlbEhUTUwoZGF0YSwga2V5KVxuICAgIGh0bWwgKz0gJzwvc3Bhbj4nXG4gIH1cblxuICBpZiAoaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgaHRtbCA9IFwiPGRpdiBjbGFzcz0nc2xpZGVyLWxhYmVsIGFsaWduLVwiKyhkYXRhWydwb3NpdGlvbi1sYWJlbCddIHx8ICdyaWdodCcpK1wiJz5cIiArIGh0bWwgKyBcIjwvZGl2PlwiXG4gIH1cblxuICByZXR1cm4gaHRtbFxufVxuXG5mdW5jdGlvbiBsYWJlbEhUTUwoZGF0YSwga2V5LCBsYWJlbCkge1xuICByZXR1cm4gbGFiZWxNZXRhKGRhdGEsIGtleSwgJ2JlZm9yZScpXG4gICsgXCI8c3BhbiBjbGFzcz0nbGFiZWwtY29udGVudCc+XCIgKyAobGFiZWwgfHwgJycpICsgXCI8L3NwYW4+XCJcbiAgKyBsYWJlbE1ldGEoZGF0YSwga2V5LCAnYWZ0ZXInKVxufVxuXG5mdW5jdGlvbiBsYWJlbE1ldGEgKGRhdGEsIGtleSwgcG9zaXRpb24pIHtcbiAgdmFyIGFsdEtleSA9ICdsYWJlbC0nK2tleVxuICB2YXIgbWV0YSA9IGRhdGFbcG9zaXRpb24rJy0nK2FsdEtleV0gfHwgZGF0YVtwb3NpdGlvbisnLWxhYmVsJ11cbiAgaWYgKG1ldGEpXG4gICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J1wiK3Bvc2l0aW9uK1wiLWxhYmVsJz5cIittZXRhK1wiPC9zcGFuPlwiXG4gIGVsc2VcbiAgICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gYWRkSW5wdXQoIGRhdGEgKSB7XG4gIHJldHVybiAoIGRhdGEuaW5wdXRFeGlzdHMgKSA/ICcnIDogXCI8aW5wdXQgdHlwZT0naGlkZGVuJyBkYXRhLWluaXRpYWwtdmFsdWU9J1wiK2RhdGEudmFsdWVzWyBkYXRhLmluaXRpYWxWYWx1ZSBdK1wiJyBuYW1lPSdcIitkYXRhLmlucHV0K1wiJyB2YWx1ZT0nJz5cIlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaHRtbDogaHRtbCxcbiAgZ2V0VHJhY2s6IGdldFRyYWNrLFxuICBhZGRGaWxsczogYWRkRmlsbHMsXG4gIGFkZExhYmVsczogYWRkTGFiZWxzLFxuICBsYWJlbEhUTUw6IGxhYmVsSFRNTCxcbiAgYWRkTWFyazogYWRkTWFyayxcbiAgYWRkTGluZUxhYmVsOiBhZGRMaW5lTGFiZWxcbn1cblxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdGVwSW5kZXggKGVsKSB7XG4gIHZhciBtaW4gPSBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdtaW4nKSB8fCAwKSxcbiAgICAgIG1heCA9IE51bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ21heCcpIHx8IDEwMCksXG4gICAgICBzdGVwID0gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnc3RlcCcpKSB8fCAxLFxuICAgICAgdmFsdWUgPSBOdW1iZXIoZWwudmFsdWUpXG5cbiAgLy8gRWxlbWVudCBpcyBvdXQgb2YgYm91bmRzIG9mIGlucHV0XG4gIGlmICh2YWx1ZSAlIHN0ZXAgIT0gMCkgcmV0dXJuXG4gIC8vIFRoZSBudWJtZXIgb2YgdW5pdHMgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4gIHZhciB1bml0cyA9ICggbWF4IC0gbWluICkgLyBzdGVwXG4gIFxuICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc3RlcCBudW1iZXJcbiAgcmV0dXJuICggdmFsdWUgLyBzdGVwICkgLSAoIG1pbiAvIHN0ZXAgKVxufVxuIiwidmFyIHRvb2xib3ggICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBleHRyYWN0RGF0YSA9IHJlcXVpcmUoICcuL2V4dHJhY3QtZGF0YScgKSxcbiAgICBzdGVwSW5kZXggICA9IHJlcXVpcmUoICcuL3N0ZXAtaW5kZXgnICksXG4gICAgb2JqZWN0U2l6ZSAgPSByZXF1aXJlKCAnLi9vYmplY3Qtc2l6ZScgKSxcbiAgICBFdmVudCAgICAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgd2F0Y2hpbmcgICAgPSBmYWxzZVxuXG5cbmZ1bmN0aW9uIGNoYW5nZSAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LmN1cnJlbnRUYXJnZXQub3V0ZXJIVE1MLm1hdGNoKC9kYXRhLXN0ZXAtbGFiZWwvKSApXG4gICAgaW5qZWN0TGFiZWxzKCBldmVudC5jdXJyZW50VGFyZ2V0IClcbn1cblxuZnVuY3Rpb24gaW5qZWN0TGFiZWxzICggaW5wdXQgKSB7XG4gIC8vIEdyYWIgb25seSB0aGUgbGFiZWxzIGFuZCB2YWx1ZXMgZm9yIHRoaXMgaW5kZXhcblxuICB2YXIgbGFiZWxzID0gZ2V0TGFiZWxzKCBpbnB1dCApIC8vIGV4YW1wbGU6ICB7IGRpc2s6ICcxNUdCJyB9IFxuXG4gIGZvciAoIGtleSBpbiBsYWJlbHMgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtkYXRhLXN0ZXAtbGFiZWw9XCJkaXNrXCJdXG4gICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ1tkYXRhLXN0ZXAtbGFiZWw9XCInK2tleSsnXCJdJyApXG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIC8vIElmIHVzZXIgaGFzIGEgc3BlY2lmaWMgY2hpbGQgZWxlbWVudCBvZiAkZWwgdGhleSB3YW50IHRvIGluamVjdCBsYWJlbCB0ZXh0IGludG9cbiAgICAgIHZhciBjb250YWluZXIgPSBlbC5xdWVyeVNlbGVjdG9yKCcubGFiZWwtY29udGVudCcpXG4gICAgICBpZiAoIGNvbnRhaW5lciApIHsgY29udGFpbmVyLmlubmVySFRNTCA9IGxhYmVsc1trZXldIH1cblxuICAgICAgLy8gRWxzZSBpbmplY3QgZnVsbCBsYWJlbCB0ZW1wbGF0ZSBpbnRvICRlbFxuICAgICAgZWxzZSB7IGVsLmlubmVySFRNTCA9IGxhYmVsSFRNTChsYWJlbHNba2V5XSkgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYWJlbHMgKGVsKSB7XG4gIHZhciBpbmRleCA9IHN0ZXBJbmRleCggZWwgKVxuXG4gIGlmICh0eXBlb2YgaW5kZXggPT0gdW5kZWZpbmVkKSByZXR1cm4ge30gLy8gRWxlbWVudCBpcyBvdXQgb2YgYm91bmRzIG9mIGlucHV0XG5cbiAgdmFyIGxhYmVscyA9IGV4dHJhY3REYXRhKCBlbCwgJ2RhdGEtc3RlcC1sYWJlbCcgKSxcbiAgICAgIHNlbGVjdGVkID0ge30sXG4gICAgICBsYWJlbE5vdEZvdW5kXG5cblxuICBmb3IgKCBsYWJlbCBpbiBsYWJlbHMgKSB7XG4gICAgdmFyIHNlbGVjdGVkTGFiZWwgPSBsYWJlbHNbbGFiZWxdLnNwbGl0KCc7JylbaW5kZXhdXG5cbiAgICAvLyBJZiBsYWJlbCBub3QgZm91bmQgYXQgaW5kZXgsIGJhaWwgb3V0LlxuICAgIGlmICghc2VsZWN0ZWRMYWJlbCkgbGFiZWxOb3RGb3VuZCA9IHRydWVcblxuICAgIHNlbGVjdGVkW2xhYmVsXSA9IHNlbGVjdGVkTGFiZWxcbiAgfVxuXG4gIGlmIChsYWJlbE5vdEZvdW5kKSB7IHJldHVybiB7fSB9XG4gIGVsc2UgcmV0dXJuIHNlbGVjdGVkXG59XG5cbmZ1bmN0aW9uIGxhYmVsSFRNTCAobGFiZWwpIHtcbiAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J2xhYmVsLWNvbnRlbnQnPlwiICsgbGFiZWwgKyBcIjwvc3Bhbj5cIlxufVxuXG5mdW5jdGlvbiB3YXRjaChkZWxheSkge1xuICBpZiAoICF3YXRjaGluZyApIHtcbiAgICB3YXRjaGluZyA9IHRydWVcblxuICAgIEV2ZW50LnJlYWR5KGZ1bmN0aW9uKCl7XG4gICAgICBFdmVudC5vbiggZG9jdW1lbnQsICdpbnB1dCcsIFwiaW5wdXRbdHlwZT0ncmFuZ2UnXVtkYXRhLWhhcy1zdGVwLWxhYmVsc10sIGlucHV0W3N0ZXBdW2RhdGEtaGFzLXN0ZXAtbGFiZWxzXVwiLCBjaGFuZ2UgKVxuXG4gICAgICB2YXIgaW5wdXRzID0gdG9vbGJveC5zbGljZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtzdGVwXSxpbnB1dFt0eXBlPVwicmFuZ2VcIl0nKSlcbiAgICAgIGlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmICggb2JqZWN0U2l6ZShleHRyYWN0RGF0YShpbnB1dCwgJ2RhdGEtc3RlcC1sYWJlbCcpKSA+IDAgKSB7XG4gICAgICAgICAgaW5wdXQuZGF0YXNldC5oYXNTdGVwTGFiZWxzID0gdHJ1ZVxuICAgICAgICAgIGluamVjdExhYmVscyhpbnB1dClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgd2F0Y2hpbmcgPSBmYWxzZVxuXG5mdW5jdGlvbiBjaGFuZ2UgKGV2ZW50KSB7XG4gIC8vIFByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiB0cmlnZ2VyZWQgZXZlbnRzXG4gIGlmICggZXZlbnQuZGV0YWlsICYmIGV2ZW50LmRldGFpbC50cmlnZ2VyZWQgKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgYm91bmRJbnB1dCggZXZlbnQuY3VycmVudFRhcmdldCApXG59XG5cbmZ1bmN0aW9uIGJvdW5kSW5wdXQgKCBpbnB1dCApIHtcbiAgdmFyIHZhbHVlID0gTnVtYmVyKGlucHV0LnZhbHVlKSxcbiAgICAgIG1pbiA9IE51bWJlcihpbnB1dC5nZXRBdHRyaWJ1dGUoJ21pbicpKSxcbiAgICAgIG1heCA9IE51bWJlcihpbnB1dC5nZXRBdHRyaWJ1dGUoJ21heCcpKSBcblxuICBpZiAoIHZhbHVlICE9IE5hTiAmJiBpbnB1dC52YWx1ZSAhPSBcIlwiICkge1xuICAgIGlmICAgICAgKCBtaW4gJiYgdmFsdWUgPCBtaW4gKSBpbnB1dC52YWx1ZSA9IG1pblxuICAgIGVsc2UgaWYgKCBtYXggJiYgbWF4IDwgdmFsdWUgKSBpbnB1dC52YWx1ZSA9IG1heFxuICAgIGVsc2UgaWYgKCBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3N0ZXAnKSAhPSAnYW55JyApXG4gICAgICBpbnB1dC52YWx1ZSA9IHJvdW5kVG9OZWFyZXN0KCBOdW1iZXIoaW5wdXQudmFsdWUpLCBOdW1iZXIoaW5wdXQuZ2V0QXR0cmlidXRlKCdzdGVwJykpIClcblxuICAgIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG4gICAgaW5wdXQuZGlzcGF0Y2hFdmVudCggZXYgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9OZWFyZXN0KCB2YWx1ZSwgc3RlcCApIHtcblxuICAvLyBOdWJlcnMgd2l0aCBkZWNpbWFscyBzY3JldyB1cCBpbiBKYXZhc2NyaXB0LlxuICAvLyBTY2FsZSB0byB3aG9sZSBudW1iZXJzIGJlZm9yZSBvcGVyYXRpbmcgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzLlxuICAvLyAwLjI1ID0+IDI1XG4gIHZhciBvcmlnaW5hbFZhbHVlID0gdmFsdWVcbiAgdmFyIHN0ZXBQcmVjaXNpb24gPSBNYXRoLnJvdW5kKCAxKydlJytwcmVjaXNpb24oIHN0ZXAgKSApLFxuICAgICAgdmFsdWVQcmVjaXNpb24gPSBNYXRoLnJvdW5kKCAxKydlJytwcmVjaXNpb24oIHZhbHVlICkgKSxcbiAgICAgIHNjYWxlICA9ICggc3RlcFByZWNpc2lvbiA8IHZhbHVlUHJlY2lzaW9uICkgPyB2YWx1ZVByZWNpc2lvbiA6IHN0ZXBQcmVjaXNpb25cbiAgICAgIFxuICAvLyBTY2FsZSB1cCB2YWx1ZXMgdG8gYXZvaWQgSmF2YXNjcmlwdCByb3VuZGluZyBlcnJvcnMgb24gZGVjaW1hbCBudW1iZXJzLlxuICB2YXIgc3RlcCAgPSBzdGVwICogc2NhbGUsXG4gICAgICB2YWx1ZSA9IHZhbHVlICogc2NhbGVcblxuICAvLyBJZiBhIHJlbWFpbmRlciBpcyBwcmVzZW50LCByb3VuZGluZyBpcyBuZWNlc3NhcnlcbiAgdmFyIHJlbWFpbmRlciA9IHZhbHVlICUgc3RlcFxuICBpZiAoIHJlbWFpbmRlciA9PSAwICkgcmV0dXJuIG9yaWdpbmFsVmFsdWVcblxuICAvLyBJZiByZW1haW5kZXIgaXMgbGFyZ2VyIHRoYW4gaGFsZiBvZiB0aGUgc3RlcFxuICAvLyBpdCdzIGNsb3NlciB0byB0aGUgbmV4dCBzdGVwIGFuZCBzaG91bGQgYmUgcm91bmRlZCB1cFxuICBpZiAoIHJlbWFpbmRlciA8IHN0ZXAgLyAyICkgdmFsdWUgPSB2YWx1ZSAtIHJlbWFpbmRlclxuXG4gIC8vIE90aGVyd2lzZSByb3VuZCBkb3duIChidXQgc3VidHJhY3RpbmcgdGhlIGRpZmZlcmVuY2UpXG4gIGVsc2UgdmFsdWUgPSB2YWx1ZSArIChzdGVwIC0gcmVtYWluZGVyKVxuXG4gIHJldHVybiB2YWx1ZSAvIHNjYWxlXG59XG5cbi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwsIHRoZSBwcmVjaXNpb24sIGlmIHlvdSB3aWxsXG5mdW5jdGlvbiBwcmVjaXNpb24oYSkge1xuICBpZiAoIWlzRmluaXRlKGEpKSByZXR1cm4gMDtcbiAgdmFyIGUgPSAxLCBwID0gMDtcbiAgd2hpbGUgKE1hdGgucm91bmQoYSAqIGUpIC8gZSAhPT0gYSkgeyBlICo9IDEwOyBwKys7IH1cbiAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHdhdGNoKGRlbGF5KSB7XG4gIGlmICggIXdhdGNoaW5nICkge1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgXCJpbnB1dFt0eXBlPW51bWJlcl1bc3RlcF0saW5wdXRbdHlwZT1udW1iZXJdW21heF0saW5wdXRbdHlwZT1udW1iZXJdW21pbl1cIiwgRXZlbnQuZGVib3VuY2UoY2hhbmdlLCBkZWxheSB8fCA1MDApIClcbiAgICB3YXRjaGluZyA9IHRydWVcbiAgICBFdmVudC5yZWFkeShmdW5jdGlvbigpe1xuICAgICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPW51bWJlcl1bc3RlcF0saW5wdXRbdHlwZT1udW1iZXJdW21heF0saW5wdXRbdHlwZT1udW1iZXJdW21pbl0nKSwgYm91bmRJbnB1dCApXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2F0Y2g6IHdhdGNoLFxuICByb3VuZDogcm91bmRUb05lYXJlc3Rcbn1cbiIsIi8vIERlcGVuZGVuY2llc1xudmFyIHRvb2xib3ggICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIHRUaW1lICAgICAgPSB0b29sYm94LnRpbWUsXG4gICAgZ2V0Q2xvc2VzdCA9IHRvb2xib3guZ2V0Q2xvc2VzdCxcbiAgICB3b3JkQ291bnQgID0gdG9vbGJveC53b3JkQ291bnQsXG4gICAgdGV4dFNlbGVjdG9ycyA9ICdbcmVxdWlyZWRdJztcblxuLy8gRG9lcyB0aGlzIGJyb3dzZXIgc3VwcG9ydCBIVE1MNSB2YWxpZGF0aW9uP1xuZnVuY3Rpb24gc3VwcG9ydGVkICgpIHtcblxuICByZXR1cm4gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdpbnB1dCcgKS5jaGVja1ZhbGlkaXR5ID09PSAnZnVuY3Rpb24nXG5cbn1cblxudmFyIGludmFsaWRIYW5kbGVyID0gRXZlbnQuY2FsbGJhY2submV3KCBmdW5jdGlvbiggZXZlbnQgKSB7IFxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKSBcbn0pXG5cbi8vIFdhdGNoIGZvciBldmVudHMgKCBpZiB2YWxpZGF0aW9uIGlzIHN1cG9ydGVkIClcbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpe1xuXG4gIGlmICggc3VwcG9ydGVkKCkgKSB7IFxuXG4gICAgRXZlbnQuYnViYmxlRm9ybUV2ZW50cygpXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnaW52YWxpZCcsIGludmFsaWRIYW5kbGVyLCB0cnVlIClcblxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudC5ib2R5LCAnY2xpY2snLCAnW3R5cGU9c3VibWl0XScsIHN1Ym1pdCApXG5cbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICd2YWxpZGF0ZScsICdmb3JtJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBcbiAgICAgIHZhbGlkYXRlRm9ybSggZXZlbnQudGFyZ2V0IClcbiAgICB9KVxuXG4gICAgLy8gRW5zdXJlIGFsbCByZXF1aXJlZCBpbnB1dHMgaGF2ZSBhcmlhLXJlcXVyaXJlZCBhdHRyaWJ1dGVzXG4gICAgdG9vbGJveC5zbGljZSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tyZXF1aXJlZF0nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbWVudCApIHsgXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtcmVxdWlyZWQnLCB0cnVlIClcbiAgICB9KVxuXG4gICAgLy8gV2F0Y2ggaW5wdXQgZXZlbnRzXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnYmx1cicsICdbcmVxdWlyZWRdJywgY2hlY2tWYWxpZGF0aW9uIClcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywgJ1tyZXF1aXJlZF0nLCBFdmVudC5kZWJvdW5jZSggY2hlY2tWYWxpZGF0aW9uLCAyMDAgKSApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCAnc2VsZWN0W3JlcXVpcmVkXScsIEV2ZW50LmRlYm91bmNlKCBjaGVja1ZhbGlkYXRpb24sIDIwMCApIClcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjaGFuZ2UnLCAnW3R5cGU9Y2hlY2tib3hdW3JlcXVpcmVkXScsIGNoZWNrVmFsaWRhdGlvbiApXG5cbiAgfVxufSlcblxuZnVuY3Rpb24gdmFsaWRhdGVGb3JtICggZm9ybSApIHtcblxuICAvLyBTY29wZWQgdmFyaWFibGVzXG4gIHZhciBpbnB1dHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICdbcmVxdWlyZWRdJyApLFxuICAgICAgaW52YWxpZElucHV0O1xuXG4gIHRvb2xib3guc2xpY2UoIGlucHV0cyApLnNvbWUoIGZ1bmN0aW9uKCBpbnB1dCApIHtcblxuICAgIC8vIGlmIGludmFsaWRcbiAgICBpZiAoICFnZXRDbG9zZXN0KCBpbnB1dCwgJ1tkaXNhYmxlZF0nICkgJiYgIWNoZWNrSW5wdXQoIGlucHV0ICkgKSB7XG4gICAgICBpbnZhbGlkSW5wdXQgPSBpbnB1dFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0pXG5cbiAgaWYgKCBpbnZhbGlkSW5wdXQgKSB7IFxuXG4gICAgLy8gU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICBmb2N1cyggaW52YWxpZElucHV0IClcbiAgICBzaG93TWVzc2FnZSggaW52YWxpZElucHV0IClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gVGhlIGZvcm0gaXMgdmFsaWQsIHNraXAgaXRcbiAgZWxzZSB7IFxuICAgIHJldHVybiB0cnVlIFxuICB9XG5cbn1cblxuLy8gSGFuZGxlciBmb3IgdmFsaWRhdGlvbiBldmVudHNcbnZhciBjaGVja1ZhbGlkYXRpb24gPSBFdmVudC5jYWxsYmFjay5uZXcoIGZ1bmN0aW9uKCBldmVudCApIHtcblxuICBpZiAoIGNoZWNrSW5wdXQoIGV2ZW50LnRhcmdldCwgZXZlbnQudHlwZSApICkge1xuXG4gICAgLy8gUmVtb3ZlIGFueSBwcmUtZXhpc3RpbmcgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgaGlkZU1lc3NhZ2UoIGV2ZW50LnRhcmdldCApXG4gIH1cblxufSlcblxuXG5mdW5jdGlvbiBjaGVja0lucHV0ICggaW5wdXQsIGV2ZW50ICkge1xuXG4gIHZhciBlbCAgICAgICA9IHN0YXR1c0VsKCBpbnB1dCApLFxuICAgICAgdmFsaWQgICAgPSBpc1ZhbGlkKCBpbnB1dCApLFxuICAgICAgbmV1dHJhbCAgPSBldmVudCA9PSAna2V5ZG93bicgJiYgIXZhbGlkO1xuXG4gIC8vIERvbid0IHRyaWdnZXIgaW52YWxpZCBzdHlsZSB3aGlsZSB0eXBpbmdcbiAgaWYgKCBuZXV0cmFsICYmIGlucHV0ID09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKSB7XG5cbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnaW52YWxpZCcsICd2YWxpZCcgKVxuICAgIGlucHV0LnNldEF0dHJpYnV0ZSggJ2FyaWEtaW52YWxpZCcsIGZhbHNlIClcblxuICB9IGVsc2Uge1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2ludmFsaWQnLCAhdmFsaWQgKVxuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoICd2YWxpZCcsIHZhbGlkIClcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWludmFsaWQnLCB2YWxpZCApXG5cbiAgfVxuXG4gIHJldHVybiB2YWxpZFxuXG59XG5cbi8vIElzIGFuIGlucHV0IHZhbGlkP1xuZnVuY3Rpb24gaXNWYWxpZCAoIGlucHV0ICkge1xuXG4gIC8vIElmIGVsZW1lbnQgb25seSBjb250YWlucyB3aGl0ZXNwYWNlLCBzdHJpcCB2YWx1ZVxuICBpZiAoICFpbnB1dC52YWx1ZS5yZXBsYWNlKCAvXFxzL2csICcnICkubGVuZ3RoIClcbiAgICBpbnB1dC52YWx1ZSA9ICcnXG5cbiAgLy8gU2V0IGEgY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZSBmb3Igd29yZCBjb3VudFxuICB2YXIgbWVzc2FnZSA9IGNoZWNrVmFsdWUoIGlucHV0ICkgfHwgY2hlY2tMZW5ndGgoIGlucHV0ICkgfHwgY2hlY2tUaW1lKCBpbnB1dCApIHx8ICcnXG4gIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KCBtZXNzYWdlIClcblxuICB2YXIgdmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KClcblxuICByZXR1cm4gdmFsaWRcblxufVxuXG5cbmZ1bmN0aW9uIGNoZWNrVmFsdWUoIGlucHV0ICkge1xuICBpZiAoIGlucHV0LmRhdGFzZXQuaW52YWxpZFZhbHVlICkge1xuXG4gICAgLy8gRG9lcyBpbnB1dCB2YWx1ZSA9PSBpbnZhbGlkIHZhbHVlPyAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICB2YXIgcmVnZXhwID0gZXNjYXBlZFJlZ2V4KCBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZSwgJ2knIClcblxuICAgIGlmICggaW5wdXQudmFsdWUubWF0Y2goIHJlZ2V4cCApICkge1xuXG4gICAgICAvLyBSZW1vdmUgYW55IHN0YW5kYXJkIGN1c3RvbSBtZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2UgPSBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2VcbiAgICAgIGlucHV0LmRhdGFzZXQubWVzc2FnZSA9ICcnXG5cbiAgICAgIHJldHVybiBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZU1lc3NhZ2UgfHwgXCJWYWx1ZSAnXCIraW5wdXQudmFsdWUrXCInIGlzIG5vdCBwZXJtaXR0ZWRcIlxuXG4gICAgLy8gSWYgbm90IGludmFsaWQgdmFsdWUgcmVzZXQgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgfSBlbHNlIGlmICggaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlICkge1xuXG4gICAgICBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2UgPSBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2VcbiAgICAgIGlucHV0LmRhdGFzZXQuY2FjaGVkTWVzc2FnZSA9ICcnXG5cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlZFJlZ2V4KCBpbnB1dCwgb3B0aW9ucyApIHtcbiAgdmFyIHN0ciA9IGlucHV0LnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG4gIHJldHVybiBuZXcgUmVnRXhwKCBcIl5cIiArIHN0ciArICckJywgb3B0aW9ucyApXG59XG5cbmZ1bmN0aW9uIGNoZWNrTGVuZ3RoICggaW5wdXQgKSB7XG4gIHJldHVybiBjaGVja0NvdW50KCBpbnB1dCwgJ21pbicgKVxuICAgICAgfHwgY2hlY2tDb3VudCggaW5wdXQsICdtYXgnIClcbn1cblxuLy8gVGVzdCBjdXN0b20gdmFsaWRhdGlvbiBmb3IgbWF4aW11bSBvciBtaW5pbXVtIHdvcmRzIHByZXNlbnRcbmZ1bmN0aW9uIGNoZWNrQ291bnQgKCBpbnB1dCwgbGltaXQgKSB7XG5cbiAgdmFyIGdvYWwgPSBpbnB1dC5kYXRhc2V0WyBsaW1pdCArICdXb3JkcycgXVxuXG4gIGlmICggZ29hbCApIHtcbiAgICB2YXIgcGhyYXNpbmcgICA9ICggbGltaXQgPT0gJ21pbicgKSA/ICdhdCBsZWFzdCAnIDogJ25vIG1vcmUgdGhhbiAnLFxuICAgICAgICB2YWxpZCAgICAgID0gKCBsaW1pdCA9PSAnbWluJyApID8gKCBnb2FsIDw9IHdvcmRDb3VudChpbnB1dC52YWx1ZSkgKSA6ICggd29yZENvdW50KGlucHV0LnZhbHVlKSA8PSBnb2FsIClcblxuICAgIC8vIFJldHVybiBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAgaWYgKCBpbnB1dC52YWx1ZSAmJiAhdmFsaWQgKVxuICAgICAgcmV0dXJuICdQbGVhc2Ugd3JpdGUgJyArIHBocmFzaW5nICsgZ29hbCArICcgd29yZHMuJ1xuICB9XG5cblxufVxuXG4vLyBUZXN0IGN1c3RvbSB2YWxpZGF0aW9uIGZvciBtYXhpbXVtIGFuZCBtaW5pbXVtIHRpbWVcbmZ1bmN0aW9uIGNoZWNrVGltZSAoIGlucHV0ICkge1xuICB2YXIgYmVmb3JlID0gaW5wdXQuZGF0YXNldC5iZWZvcmVUaW1lLFxuICAgICAgYWZ0ZXIgPSBpbnB1dC5kYXRhc2V0LmFmdGVyVGltZVxuXG4gIGlmICggYmVmb3JlIHx8IGFmdGVyIHx8IGlucHV0LmRhdGFzZXQudmFsaWRhdGVUaW1lICkge1xuICAgIHZhciB6b25lID0gaW5wdXQuZGF0YXNldC56b25lIHx8ICd1dGMnLFxuICAgICAgICBvcHRpb25zID0geyB6b25lOiB6b25lIH0sXG4gICAgICAgIHRpbWVWYWx1ZSA9IHRUaW1lLnBhcnNlKCBpbnB1dC52YWx1ZSwgb3B0aW9ucyApLFxuICAgICAgICBlcnIgPSAnJyxcbiAgICAgICAgaXNBZnRlciwgYWZ0ZXJUaW1lLCBpc0JlZm9yZSwgYmVmb3JlVGltZVxuXG4gICAgLy8gRW51cmUgdGhhdCB0aGUgdGltZSB2YWx1ZSBpcyBhY3R1YWxseSBcbiAgICBpZiAoICF0aW1lVmFsdWUgKSByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlIHN0cmluZzogWVlZWS1NTS1ERCBISDpNTTpTU1wiXG5cbiAgICBpZiAoIGJlZm9yZSApIHtcbiAgICAgIGJlZm9yZVRpbWUgPSB0VGltZS5wYXJzZSggYmVmb3JlIClcblxuICAgICAgaWYgKCAhYmVmb3JlVGltZSApIHtcbiAgICAgICAgZXJyID0gYGRhdGEtYmVmb3JlLXRpbWU9JyR7YmVmb3JlfScgaXMgbm90IGEgdmFsaWQgZGF0ZSBzdHJpbmdgXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoIGVyciApXG4gICAgICAgIHJldHVybiBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGFmdGVyICkge1xuICAgICAgYWZ0ZXJUaW1lID0gdFRpbWUucGFyc2UoIGFmdGVyIClcblxuICAgICAgaWYgKCAhYWZ0ZXJUaW1lICkge1xuICAgICAgICBlcnIgPSBgZGF0YS1hZnRlci10aW1lPScke2FmdGVyfScgaXMgbm90IGEgdmFsaWQgZGF0ZSBzdHJpbmdgXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoIGVyciApXG4gICAgICAgIHJldHVybiBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGJlZm9yZVRpbWUgJiYgYWZ0ZXJUaW1lICkge1xuICAgICAgaWYgKCAhdFRpbWUuaXNCZXR3ZWVuKCB0aW1lVmFsdWUsIGFmdGVyVGltZSwgYmVmb3JlVGltZSApICkge1xuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGJldHdlZW4gXCIrZm9ybWF0RGF0ZSggYWZ0ZXJUaW1lLCBvcHRpb25zICkrXCIgYW5kIFwiK2Zvcm1hdERhdGUoIGJlZm9yZVRpbWUsIG9wdGlvbnMgKVxuICAgICAgfVxuICAgIH0gXG5cbiAgICBlbHNlIGlmICggYWZ0ZXJUaW1lICkge1xuICAgICAgaWYgKCAhdFRpbWUuaXNBZnRlciggdGltZVZhbHVlLCBhZnRlclRpbWUgKSApIHsgXG4gICAgICAgIHJldHVybiBcIlBsZWFzZSBlbnRlciBhIHRpbWUgYWZ0ZXIgXCIrZm9ybWF0RGF0ZSggYWZ0ZXJUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbHNlIGlmICggYmVmb3JlVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQmVmb3JlKCB0aW1lVmFsdWUsIGJlZm9yZVRpbWUgKSApIHsgXG4gICAgICAgIHJldHVybiBcIlBsZWFzZSBlbnRlciBhIHRpbWUgYmVmb3JlIFwiK2Zvcm1hdERhdGUoIGJlZm9yZVRpbWUsIG9wdGlvbnMgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKCBkYXRlLCBvcHRpb25zICkge1xuICByZXR1cm4gdFRpbWUucHJldHR5UHJpbnQoIGRhdGUsIG9wdGlvbnMgKS5yZXBsYWNlKCAnIFonLCAnJylcbn1cblxuXG4vLyBJZiBpbnB1dCBpcyBuZXN0ZWQgaW4gYSBsYWJlbCwgdHJlYXQgdGhlIGxhYmVsIGFzIHRoZVxuLy8gdGFyZ2V0IGZvciBhc3NpZ25pbmcgc3RhdHVzIChjbGFzcyBuYW1lcyBhbmQgbWVzc2FnZXMpLlxuZnVuY3Rpb24gc3RhdHVzRWwgKCBpbnB1dCApIHtcblxuICByZXR1cm4gZ2V0Q2xvc2VzdCggaW5wdXQsICdsYWJlbCcgKSB8fCBpbnB1dFxuXG59XG5cbi8vIEZvY3VzKCkgaWYgaW52YWxpZCBlbGVtZW50IGlzIG5vdCBoaWRkZW5cbi8vIG9yIEZvY3VzIGl0cyBpbW1lZGlhdGUgc2libGluZyAobW9zdGx5IHVzZWQgZm9yIHVwbG9hZCBidXR0b25zKVxuZnVuY3Rpb24gZm9jdXMgKCBlbCApIHtcblxuICBlbCA9ICggZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICkgPyBlbCA6IGVsLm5leHRTaWJsaW5nXG4gIGVsLmZvY3VzKClcblxufVxuXG4vLyBTdWJtaXNzaW9uIHZhbGlkYXRpb24gaGFuZGxlciBmdW5jdGlvblxuZnVuY3Rpb24gc3VibWl0ICggZXZlbnQgKSB7XG5cbiAgdmFyIGZvcm0gPSAoIGV2ZW50LnRhcmdldC50YWdOYW1lID09IFwiRk9STVwiICkgPyBldmVudC50YXJnZXQgOiBnZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdmb3JtJylcblxuICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgbm8gaW52YWxpZCBpbnB1dHMgZm91bmRcbiAgaWYgKCAhdmFsaWRhdGVGb3JtKCBmb3JtICkgKSB7XG5cbiAgICAvLyBQYXVzZSBrZXlkb3duL2JsdXIgdHJpZ2dlcnMgZm9yIHRoZSBuZXh0IHNlY29uZCB0byBhdm9pZCBuZXV0cmFsIGVtcHR5IHN0eWxlXG4gICAgY2hlY2tWYWxpZGF0aW9uLnN0b3AoKVxuICAgIEV2ZW50LmRlbGF5KCBjaGVja1ZhbGlkYXRpb24uc3RhcnQsIDUwMCApXG5cbiAgICAvLyBTdG9wIHRoZSBzdWJtaXNzaW9uIGV2ZW50XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGludmFsaWRhdGVGaWVsZCAoIGVsLCBtZXNzYWdlICkge1xuICBpZiAoIGVsICYmIGVsLnZhbHVlICkge1xuICAgIGVsLmRhdGFzZXQuaW52YWxpZFZhbHVlID0gZWwudmFsdWVcbiAgICBpZiAoIG1lc3NhZ2UgKVxuICAgICAgZWwuZGF0YXNldC5pbnZhbGlkVmFsdWVNZXNzYWdlID0gbWVzc2FnZVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVNZXNzYWdlICggZWwgKSB7XG5cbiAgdmFyIGZvcm0gPSBnZXRDbG9zZXN0KCBlbCwgJ2Zvcm0nICksXG4gICAgICBtc2cgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlJyApXG5cbiAgaWYgKCBtc2cgKSBtc2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbXNnIClcblxufVxuXG5cbi8vIFZhbGlkYXRpb24gbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9uXG5mdW5jdGlvbiBzaG93TWVzc2FnZSAoIGVsICkge1xuXG4gIC8vaGlkZU1lc3NhZ2UoIGVsIClcblxuICB2YXIgbGFiZWwgPSBnZXRDbG9zZXN0KCBlbCwgJ2xhYmVsJyApLFxuICAgICAgbWVzc2FnZSA9IGVsLmRhdGFzZXQubWVzc2FnZSB8fCBlbC52YWxpZGF0aW9uTWVzc2FnZVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGV4aXN0aW5nTWVzc2FnZSA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlLXRleHQnIClcblxuICAgIGlmICggIWV4aXN0aW5nTWVzc2FnZSApIHtcbiAgICAgIGxhYmVsLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsICAnPHNwYW4gY2xhc3M9XCJ2YWxpZGF0aW9uLW1lc3NhZ2VcIj48c3BhbiBjbGFzcz1cInZhbGlkYXRpb24tbWVzc2FnZS10ZXh0XCIgcm9sZT1cImFsZXJ0XCI+JyArIG1lc3NhZ2UgKyAnPC9zcGFuPjwvc3Bhbj4nIClcblxuICAgIH0gZWxzZSBpZiAoIGV4aXN0aW5nTWVzc2FnZS50ZXh0Q29udGVudCAhPSBtZXNzYWdlICkge1xuICAgICAgZXhpc3RpbmdNZXNzYWdlLmlubmVySFRNTCA9IG1lc3NhZ2VcbiAgICB9XG4gIH1cblxufVxuXG4vLyBQdWJsaWMgQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGU6IHZhbGlkYXRlRm9ybSxcbiAgaW52YWxpZGF0ZUZpZWxkOiBpbnZhbGlkYXRlRmllbGRcbn1cbiIsInZhciBUaW1lVG9nZ2xlID0gcmVxdWlyZSgnLi9saWIvdG9nZ2xlLmpzJylcbnZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG5UaW1lVG9nZ2xlLnRpbWVhZ28gPSByZXF1aXJlKCcuL2xpYi90aW1lYWdvLmpzJylcblRpbWVUb2dnbGUuZGF0ZVRvSFRNTCA9IHJlcXVpcmUoJy4vbGliL2RhdGUtdG8taHRtbC5qcycpXG5cbkV2ZW50LnJlYWR5KFRpbWVUb2dnbGUubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRpbWVUb2dnbGUuc2V0dXApXG5cbm1vZHVsZS5leHBvcnRzID0gVGltZVRvZ2dsZVxuIiwiLy8gQ29udmVydHMgYSBzaW1wbGUgZGF0ZSBzdHJpbmcgaW50byBEYXRlICsgVGltZSArIFRpbWV6b25lIHdyYXBwZWQgaW4gSFRNTFxuLy9cbi8vIElucHV0OlxuLy8gLSBTdHJpbmcsIGNvbXBhdGlibGUgd2l0aCBKUyBkYXRlIHBhcnNpbmcgZS5nLiBcIjIwMTQtMTAtMjBcIiBvciBcIjIwMTQtMDUtMjEgMTA6NjNcIlxuLy8gLSBTdHJpbmcsIHRpbWV6b25lOiBcIlVUQ1wiLCBcIkNTVFwiLCBldGMuXG4vL1xuLy8gUmV0dXJuczogSFRNTCB3aGljaCBpcyBcIjIwMTQtMDEtMjggMTg6MDA6MDAgQ1NUXCIsIHNlcGFyYXRlZCBhbmQgd3JhcHBlZCB3aXRoIHNwYW5zXG4vLyB3aXRoIGNsYXNzbmFtZXM6IGRhdGUsIHRpbWUgYW5kIHRpbWV6b25lXG4vL1xudmFyIERhdGVUb0hUTUwgPSB7XG4gIHN1cHBvcnRlZDogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKFwiMjAxNC0wMS0yOVQxODoxNDoyOSswMDowMFwiKS5nZXREYXRlKCkpXG4gIH0sXG5cbiAgbG9jYWw6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCBmYWxzZSlcbiAgfSxcblxuICB1dGM6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCB0cnVlKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiBkYXRlVG9IdG1sKGRhdGVTdHJpbmcsIHV0Yykge1xuICAgIGlmKCFEYXRlVG9IVE1MLnN1cHBvcnRlZCgpKXsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHZhciBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZylcblxuICAgIC8vIElmIGRhdGUgaXMgaW52YWxpZCwgYmFpbFxuICAgIGlmKGlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZih1dGMpIHtcbiAgICAgIHZhciB5ICA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICAgICAgdmFyIG1vID0gcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpXG4gICAgICB2YXIgZCAgPSBwYWQoZGF0ZS5nZXRVVENEYXRlKCkpXG4gICAgICB2YXIgaCAgPSBwYWQoZGF0ZS5nZXRVVENIb3VycygpKVxuICAgICAgdmFyIG0gID0gcGFkKGRhdGUuZ2V0VVRDTWludXRlcygpKVxuICAgICAgdmFyIHMgID0gcGFkKGRhdGUuZ2V0VVRDU2Vjb25kcygpKVxuICAgICAgdmFyIHpvbmUgPSAnVVRDJ1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeSAgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgIHZhciBtbyA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICAgICAgdmFyIGQgID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgICAgdmFyIGggID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICAgIHZhciBtICA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgICAgIHZhciBzICA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICAgIHZhciB6b25lID0gRGF0ZVRvSFRNTC50aW1lem9uZShkYXRlKVxuICAgIH1cblxuICAgIHZhciBzdHIgPSAnPHNwYW4gY2xhc3M9XCJkYXRlXCI+Jyt5KyctJyttbysnLScrZCsnPC9zcGFuPidcbiAgICBzdHIgKz0gJyA8c3BhbiBjbGFzcz1cInRpbWVcIj4nK2grJzonK20rJzonK3MrJzwvc3Bhbj4nXG4gICAgc3RyICs9ICcgPHNwYW4gY2xhc3M9XCJ0aW1lem9uZVwiPicrem9uZSsnPC9zcGFuPidcbiAgICByZXR1cm4gc3RyXG4gIH0sXG5cbiAgLy8gRXh0cmFjdCB0aW1lem9uZSBsYWJlbFxuICB0aW1lem9uZTogZnVuY3Rpb24oZGF0ZSl7XG4gICAgdmFyIHpvbmUgPSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpLy02MClcbiAgICB2YXIgdHogPSBTdHJpbmcoZGF0ZSkubWF0Y2goL1xcKCguKylcXCkkLylcblxuICAgIGlmKHR6KSB7XG4gICAgICAvLyBCcm93c2VyIGhhcyBmcmllbmRseSB0aW1lem9uZSBsYWJlbCBsaWtlICdFU1QnXG4gICAgICB2YXIgem9uZSA9IHR6WzFdXG4gICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnJvd3NlciB1c2VzIGEgR01UIG9mZnNldCArLy1cbiAgICAgIHZhciB6b25lID0gXCJHTVQgXCIgXG4gICAgICAgICAgem9uZSArPSAoKHpvbmUgPiAwKSA/ICcrJyA6ICcnKVxuICAgICAgICAgIHpvbmUgKz0gXCIgXCIrIHBhZCh6b25lKjEwMCwgNClcbiAgICB9XG5cbiAgICByZXR1cm4gem9uZVxuICB9XG59XG5cbnZhciBwYWQgPSBmdW5jdGlvbiBkYXRlUGFkKG51bSwgcGFkKXtcbiAgcGFkID0gcGFkIHx8IDJcbiAgd2hpbGUoU3RyaW5nKG51bSkubGVuZ3RoIDwgcGFkKSB7XG4gICAgbnVtID0gJzAnICsgbnVtXG4gIH1cbiAgcmV0dXJuIG51bVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGVUb0hUTUxcbiIsIi8vIFRpbWVhZ28gYnkgQnJhbmRvbiBNYXRoaXMsIGJhc2VkIG9uIEphdmFTY3JpcHQgUHJldHR5IERhdGUgQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gUmVzaWdcbi8vIFJldHVybnMgcmVsYXRpdmUgdGltZVxuXG52YXIgVGltZWFnbyA9IHtcbiAgLy8gc2V0dXAgSFRNTCB0ZW1wbGF0ZXNcbiAgc2V0dXA6IGZ1bmN0aW9uIHRpbWVhZ29TZXR1cCgpIHtcblxuICAgIHZhciB0aW1lRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpbWVhZ29bZGF0ZXRpbWVdJylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGltZUVscywgZnVuY3Rpb24oZWwpIHtcbiAgICAgIHZhciBkYXRldGltZSA9IGVsLmF0dHJpYnV0ZXMuZGF0ZXRpbWUudmFsdWVcbiAgICAgIHZhciBzdHlsZSA9IGVsLmRhdGFzZXQudGltZWFnb1N0eWxlXG4gICAgICBlbC5pbm5lckhUTUwgPSBUaW1lYWdvLnBhcnNlKGRhdGV0aW1lLCBzdHlsZSlcbiAgICB9KVxuICB9LFxuXG4gIC8vIElmIGEgYnJvd3NlciBjYW4ndCBoYW5kbGUgZGF0ZXMsIGJhaWwuXG4gIGJyb3dzZXJTdXBwb3J0OiBmdW5jdGlvbiB0aW1lYWdvQnJvd3NlclN1cHBvcnQoKSB7XG4gICAgcmV0dXJuICFpc05hTihuZXcgRGF0ZShcIjIwMTQtMDEtMjlUMTg6MTQ6MjkrMDA6MDBcIikuZ2V0RGF0ZSgpKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiB0aW1lYWdvUGFyc2UodGltZSwgc3R5bGUpIHtcblxuICAgIGlmICh0eXBlb2YodGltZSkgPT0gJ3N0cmluZycpIHtcbiAgICAgIHRpbWUgPSBuZXcgRGF0ZSh0aW1lKVxuICAgIH1cblxuICAgIGlmIChzdHlsZSA9PT0gJ3Nob3J0JylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwibm93XCIsXG4gICAgICBtaW51dGVfYWdvOiAgXCIxbVwiLFxuICAgICAgbWludXRlc19hZ286IFwibVwiLFxuICAgICAgaG91cl9hZ286ICAgIFwiMWhcIixcbiAgICAgIGhvdXJzX2FnbzogICBcImhcIixcbiAgICAgIHllc3RlcmRheTogICBcIjFkXCIsXG4gICAgICBkYXlzX2FnbzogICAgXCJkXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxd1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwid1wiXG4gICAgfVxuXG4gICAgZWxzZSBpZiAoc3R5bGUgPT09ICdsb25nJylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwianVzdCBub3dcIixcbiAgICAgIG1pbnV0ZV9hZ286ICBcIjEgbWludXRlIGFnb1wiLFxuICAgICAgbWludXRlc19hZ286IFwiIG1pbnV0ZXMgYWdvXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXIgYWdvXCIsXG4gICAgICBob3Vyc19hZ286ICAgXCIgaG91cnMgYWdvXCIsXG4gICAgICB5ZXN0ZXJkYXk6ICAgXCIxIGRheSBhZ29cIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzIGFnb1wiLFxuICAgICAgbGFzdF93ZWVrOiAgIFwiMSB3ZWVrIGFnb1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwiIHdlZWtzIGFnb1wiXG4gICAgfVxuXG4gICAgZWxzZVxuICAgIHZhciBzYXkgPSB7XG4gICAgICBqdXN0X25vdzogICAgXCJqdXN0IG5vd1wiLFxuICAgICAgbWludXRlX2FnbzogIFwiMSBtaW51dGVcIixcbiAgICAgIG1pbnV0ZXNfYWdvOiBcIiBtaW51dGVzXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXJcIixcbiAgICAgIGhvdXJzX2FnbzogICBcIiBob3Vyc1wiLFxuICAgICAgeWVzdGVyZGF5OiAgIFwiMSBkYXlcIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxIHdlZWtcIixcbiAgICAgIHdlZWtzX2FnbzogICBcIiB3ZWVrc1wiXG4gICAgfVxuXG4gICAgdmFyIHNlY3MgICA9ICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0aW1lKS5nZXRUaW1lKCkpIC8gMTAwMClcbiAgICB2YXIgbWlucyAgID0gTWF0aC5mbG9vcihzZWNzIC8gNjApXG4gICAgdmFyIGhvdXJzICA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApXG4gICAgdmFyIGRheXMgICA9IE1hdGguZmxvb3Ioc2VjcyAvIDg2NDAwKVxuICAgIHZhciB3ZWVrcyAgPSBNYXRoLmZsb29yKGRheXMgLyA3KVxuICAgIHZhciBtb250aHMgPSBNYXRoLmZsb29yKGRheXMgLyAzMClcblxuICAgIGlmKGlzTmFOKHNlY3MpIHx8IGRheXMgPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZihkYXlzID09PSAwKSB7XG4gICAgICBpZiAgICAgKHNlY3MgPCA2MCkgICByZXR1cm4gc2F5Lmp1c3Rfbm93XG4gICAgICBlbHNlIGlmKHNlY3MgPCAxMjApICByZXR1cm4gc2F5Lm1pbnV0ZV9hZ28gXG4gICAgICBlbHNlIGlmKHNlY3MgPCAzNjAwKSByZXR1cm4gbWlucyArIHNheS5taW51dGVzX2FnbyBcbiAgICAgIGVsc2UgaWYoc2VjcyA8IDcyMDApIHJldHVybiBzYXkuaG91cl9hZ29cbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHJldHVybiBob3VycyArIHNheS5ob3Vyc19hZ29cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZGF5cyA9PT0gMSkgICAgICAgcmV0dXJuIHNheS55ZXN0ZXJkYXlcbiAgICAgIGVsc2UgaWYoZGF5cyA8IDcpICAgIHJldHVybiBkYXlzICsgc2F5LmRheXNfYWdvXG4gICAgICBlbHNlIGlmKHdlZWtzID09PSAxKSByZXR1cm4gc2F5Lmxhc3Rfd2Vla1xuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgcmV0dXJuIHdlZWtzICsgc2F5LndlZWtzX2Fnb1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbWVhZ29cbiIsInZhciBUaW1lYWdvID0gcmVxdWlyZSgnLi90aW1lYWdvJylcbnZhciBEYXRlVG9IVE1MID0gcmVxdWlyZSgnLi9kYXRlLXRvLWh0bWwnKVxudmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGUgPSB7XG4gIHRpbWVFbHM6IGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aW1lLXRvZ2dsZVtkYXRldGltZV0nKVxuICB9LFxuXG4gIC8vIFRoZSBrZXkgaXMgdGhlIGN1cnJlbnQgdGltZSwgdGhlIHZhbHVlIGlzIHRoZSBuZXh0IHRpbWUgdHlwZSB0byBiZSBkaXNwbGF5ZWRcbiAgbmV4dFRpbWU6IHtcbiAgICAndGltZWFnbyc6ICdsb2NhbCcsXG4gICAgJ2xvY2FsJzogJ3V0YycsXG4gICAgJ3V0Yyc6ICd0aW1lYWdvJ1xuICB9LFxuXG4gIC8vIEF0dGFjaCBsaXN0ZW5lcnMsIHNldHVwIEhUTUwgdGVtcGxhdGVzXG4gIHNldHVwOiBmdW5jdGlvbigpIHtcbiAgICBpZighVGltZWFnby5icm93c2VyU3VwcG9ydCgpKSByZXR1cm4gZmFsc2VcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgVG9nZ2xlLmluaXQpXG4gIH0sXG5cbiAgLy8gQXR0YWNoIGxpc3RlbmVycyB0byB0b2dnbGUgdGltZSB6b25lcyB3aGluZSBjbGlja2VkXG4gIGxpc3RlbjogZnVuY3Rpb24oKSB7XG4gICAgaWYoIVRpbWVhZ28uYnJvd3NlclN1cHBvcnQoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGlja1wiLCBcIi50aW1lLXRvZ2dsZVwiLCBUb2dnbGUudG9nZ2xlKVxuICB9LFxuXG4gIC8vIFRvZ2dsZSBhbGwgdGltZXMgb24gcGFnZVxuICB0b2dnbGU6IGZ1bmN0aW9uKCBldmVudCApe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgZnVuY3Rpb24oZWwpIHtcbiAgICAgIFRvZ2dsZS50b2dnbGVFbChlbClcbiAgICB9KVxuXG4gICAgaWYgKCBldmVudCAmJiBldmVudC50YXJnZXQgKSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIH1cbiAgfSxcblxuICAvLyBTd2l0Y2ggYmV0d2VlbiB0aW1lIGFnbywgVVRDLCBhbmQgbG9jYWwgdGltZVxuICB0b2dnbGVFbDogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgZGF0ZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBuZXh0ID0gVG9nZ2xlLm5leHRUaW1lW2VsLmRhdGFzZXQubW9kZSB8fCAndGltZWFnbycgXVxuXG4gICAgVG9nZ2xlLnNldENvbnRlbnQoZWwsIFRvZ2dsZS5kYXRlSFRNTChkYXRlLCBuZXh0LCBlbCksIG5leHQpXG5cbiAgICByZXR1cm4gZWxcbiAgfSxcblxuICAvLyBTdXBwbHkgSFRNTCBmb3IgVVRDIGFuZCBsb2NhbCBkYXRldGltZVxuICAvL1xuICBpbml0OiBmdW5jdGlvbihlbCkge1xuICAgIHZhciBkYXRldGltZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBtb2RlID0gZWwuZGF0YXNldC5tb2RlIHx8ICd0aW1lYWdvJ1xuICAgIHZhciBodG1sID0gVG9nZ2xlLmRhdGVIVE1MKGRhdGV0aW1lLCBtb2RlLCBlbClcblxuICAgIGlmIChodG1sKXsgXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ3RvZ2dsZSB0aW1lJylcbiAgICAgIFRvZ2dsZS5zZXRDb250ZW50KGVsLCBodG1sLCBtb2RlKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0aW1lLXRvZ2dsZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsXG4gIH0sXG5cbiAgc2V0Q29udGVudDogZnVuY3Rpb24oIGVsLCBodG1sLCBtb2RlICkge1xuICAgIHZhciBkYXRlVGV4dE5vZGUgPSBlbC5xdWVyeVNlbGVjdG9yKCAnLmRhdGUtdGV4dCcgKVxuXG4gICAgaWYgKCBkYXRlVGV4dE5vZGUgKSB7XG4gICAgICBkYXRlVGV4dE5vZGUuaW5uZXJIVE1MID0gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj4nK2h0bWwrJzwvc3BhbidcbiAgICB9XG5cbiAgICBlbC5kYXRhc2V0Lm1vZGUgPSBtb2RlXG4gIH0sXG5cbiAgZGF0ZUhUTUw6IGZ1bmN0aW9uKGRhdGUsIHR5cGUsIGVsKSB7XG4gICAgaWYgKHR5cGUgPT0gJ3RpbWVhZ28nKVxuICAgICAgdmFyIHQgPSBUaW1lYWdvLnBhcnNlKGRhdGUsIGVsLmRhdGFzZXQudGltZWFnbylcbiAgICBlbHNlIGlmIChEYXRlVG9IVE1MW3R5cGVdKVxuICAgICAgdmFyIHQgPSBEYXRlVG9IVE1MW3R5cGVdKGRhdGUpXG5cbiAgICBpZiAodCkge1xuICAgICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J3RpbWUtdG9nZ2xlLWRhdGUgXCIrdHlwZStcIic+XCIgKyB0ICsgXCI8L3NwYW4+XCJcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG52YXIgVG9nZ2xlciA9IHtcbiAgY2hlY2tib3hTZWxlY3RvcjogXCJbdHlwZT1jaGVja2JveF1bZGF0YS10b2dnbGVdLCBbdHlwZT1jaGVja2JveF1bZGF0YS1zaG93XSwgW3R5cGU9Y2hlY2tib3hdW2RhdGEtaGlkZV1cIixcbiAgcmFkaW9TZWxlY3RvcjogXCJpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXNob3ddLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWhpZGVdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWFkZC1jbGFzc10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtcmVtb3ZlLWNsYXNzXVwiLFxuICBzZWxlY3RTZWxlY3RvcjogXCJvcHRpb25bZGF0YS1oaWRlXSwgb3B0aW9uW2RhdGEtc2hvd11cIixcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCl7XG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlXCIsIFwiW2RhdGEtdG9nZ2xlXSwgW2RhdGEtc2hvd10sIFtkYXRhLWhpZGVdLCBbZGF0YS10b2dnbGUtY2xhc3NdLCBbZGF0YS1hZGQtY2xhc3NdLCBbZGF0YS1yZW1vdmUtY2xhc3NdXCIsIFRvZ2dsZXIudHJpZ2dlcilcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjaGFuZ2VcIiwgXCIuc2VsZWN0LXRvZ2dsZXJcIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKHdpbmRvdywgJ2hhc2hjaGFuZ2UnLCBUb2dnbGVyLmhhc2hDaGFuZ2UpXG4gIH0sXG5cbiAgaGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCApIHtcblxuICAgICAgdmFyIGFuY2hvciA9ICdbZGF0YS1hbmNob3I9XCInK3dpbmRvdy5sb2NhdGlvbi5oYXNoKydcIl0nXG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2lucHV0JythbmNob3IrICcsIG9wdGlvbicrYW5jaG9yIClcblxuICAgICAgaWYgKCB0YXJnZXQgKSB7XG4gICAgICAgIGlmICggdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJyApIHtcbiAgICAgICAgICB0YXJnZXQuY2hlY2tlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHRhcmdldClcbiAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IHRhcmdldC5pbmRleFxuICAgICAgICAgIHRhcmdldCA9IHNlbGVjdFxuICAgICAgICB9XG4gICAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKCB0YXJnZXQgKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZWZyZXNoOiBmdW5jdGlvbigpe1xuICAgIFRvZ2dsZXIudG9nZ2xlQ2hlY2tib3hlcygpXG4gICAgVG9nZ2xlci5zZXR1cFNlbGVjdHMoKVxuICAgIFRvZ2dsZXIuc2V0dXBSYWRpb3MoKVxuICB9LFxuXG4gIHRyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gU3RvcCBldmVudCBhbmQgYnViYmxpbmcgaWYgbGluayBpcyBvbmx5IGJlaW5nIHVzZWQgYXMgYSB0b2dnbGVyXG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT0gXCIjXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3AoKVxuICAgIH0gXG5cbiAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudClcbiAgfSxcblxuICB0cmlnZ2VyVG9nZ2xpbmc6IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICB2YXIgYWN0aW9ucyA9IFsnaGlkZScsICd0b2dnbGUnLCAnc2hvdycsICdyZW1vdmVDbGFzcycsICd0b2dnbGVDbGFzcycsICdhZGRDbGFzcyddXG4gICAgdmFyIHNlbGVjdFxuXG4gICAgLy8gU3RvcmUgdGhlIHNlbGVjdCwgYW5kIHNldCB0aGUgdGFyZ2V0IHRvIHRoZSBjdXJyZW50IG9wdGlvblxuICAgIC8vIEV2ZW50cyBmaXJlIG9uIHRoZSBzZWxlY3QsIGJ1dCB0aGUgb3B0aW9ucyBoYXZlIHRvZ2dsaW5nIGF0dHJpYnV0ZXNcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUubWF0Y2goL3NlbGVjdC9pKSkge1xuICAgICAgc2VsZWN0ID0gdGFyZ2V0XG4gICAgICB0YXJnZXQgPSBzZWxlY3Quc2VsZWN0ZWRPcHRpb25zWzBdXG4gICAgfVxuXG4gICAgLy8gUmFkaW8gaW5wdXRzIGFuZCBzZWxlY3RzIGRvIG5vdCBzdXBwb3J0IHRvZ2dsaW5nLCBzbyByZW1vdmUgdGhlbVxuICAgIGFjdGlvbnMgPSBhY3Rpb25zLmZpbHRlcihmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3QgfHwgdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gIWFjdGlvbi5tYXRjaCgvdG9nZ2xlLylcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQuZGF0YXNldFthY3Rpb25dICE9IG51bGxcbiAgICB9KVxuICAgIFxuICAgIC8vIERpc3BhdGNoIGFsbCBhY3Rpb25zXG4gICAgYWN0aW9ucy5mb3JFYWNoKCBmdW5jdGlvbiggYWN0aW9uICkge1xuICAgICAgVG9nZ2xlci5kaXNwYXRjaCggdGFyZ2V0LCBhY3Rpb24gKVxuICAgIH0pXG4gIH0sXG5cbiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGVsLCB0eXBlKSB7XG4gICAgdmFyIGFjdGlvbiA9IHR5cGVcbiAgICB2YXIgZGF0YSA9IGVsLmRhdGFzZXRbdHlwZV1cblxuICAgIC8vIEFib3J0IGlmIGVsZW1lbnQgZG9lc24ndCBoYXZlIGRhdGEgZm9yIHRoZSBhY3Rpb25cbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcgfHwgZGF0YSA9PSAnJykgcmV0dXJuXG5cbiAgICAvLyBUb2dnbGUgYW5kIHNob3cgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIGNoZWNrYm94ZXNcbiAgICBpZiAoZWwudHlwZSA9PSAnY2hlY2tib3gnKVxuICAgICAgYWN0aW9uID0gKHR5cGUubWF0Y2goL2hpZGV8cmVtb3ZlL2kpID8gIWVsLmNoZWNrZWQgOiBlbC5jaGVja2VkKVxuXG4gICAgaWYgKGRhdGEpe1xuICAgICAgaWYgKHR5cGUubWF0Y2goL2NsYXNzL2kpKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhkYXRhLCBhY3Rpb24sIGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZShkYXRhLCBhY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEFkZCwgcmVtb3ZlLCBvciB0b2dnbGUgY2xhc3NuYW1lcywgdHJpZ2dlcmVkIGJ5IGVsZW1lbnRzIHdpdGg6XG4gIC8vICBkYXRhLWhpZGUtY2xhc3MsIGRhdGEtc2hvdy1jbGFzcywgYW5kIGRhdGEtdG9nZ2xlLWNsYXNzIHZhbHVlc1xuICAvL1xuICAvLyAgRGF0YSB2YWx1ZSBleGFtcGxlczpcbiAgLy8gICAtIFwiY2xhc3NuYW1lXCIgLSBhZGQvcmVtb3ZlL3RvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50XG4gIC8vICAgLSBcImZvbyBiYXJcIiAgIC0gbXVsdGlwbGUgY2xhc3NuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcyAobGlrZSBodG1sIGNsYXNzIHByb3BlcnR5KVxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3RvclwiIC0gY2hhbmdlIGNsYXNzbmFtZXMgb24gZWxlbWVudHMgbWF0Y2hlZCBieSBzZWxlY3RvclxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3Rvciwgc2VsZWN0b3JcIiAtIG1hdGNoIG11bHRpcGxlIHNlbGVjdG9yc1xuICAvL1xuICAvLyAgWW91IGNhbiBwZXJmb3JtIG11bHRpcGxlIGFkZC9yZW1vdmUgY2xhc3NlcyBieSBqb2luaW5nIHZhbHVlcyB3aXRoIGFuIGAmYFxuICAvLyAgRm9yIGV4YW1wbGU6IFwiY2xhc3NuYW1lICYgZm9vIGJhcjsgc2VsZWN0b3JcIlxuICAvLyAgVGhpcyB3b3VsZCB0b2dnbGUgY2xhc3NuYW1lIG9uIGN1cnJlbnQgZWxlbWVudCBhbmQgdG9nZ2xlIGBmb28gYmFyYCBjbGFzc25hbWVzXG4gIC8vICBvbiBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAvL1xuXG4gIHNldENsYXNzOiBmdW5jdGlvbiAoc2VsZWN0b3JzLCBhY3Rpb24sIGVsKXtcbiAgICBpZih0eXBlb2Ygc2VsZWN0b3JzID09ICd1bmRlZmluZWQnIHx8IHNlbGVjdG9ycyA9PSAnJykgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mKGFjdGlvbikgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhY3Rpb24gPSAoYWN0aW9uID8gJ2FkZCcgOiAncmVtb3ZlJylcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0b3JzLm1hdGNoKC8mLykpIHtcbiAgICAgIHNlbGVjdG9ycy5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24oc2VsKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhzZWwudHJpbSgpLCBhY3Rpb24sIGVsKSBcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0b3IgYW5kIGNsYXNzbmFtZXMsIGZvcm1hdDogXCJjbGFzc25hbWUgY2xhc3NuYW1lOyBzZWxlY3RvcixzZWxlY3RvclwiXG4gICAgdmFyIHNldHRpbmdzID0gc2VsZWN0b3JzLnNwbGl0KCc7JylcbiAgICB2YXIgY2xhc3NuYW1lcyA9IHNldHRpbmdzWzBdLnRyaW0oKVxuICAgIHZhciBtYXRjaGVzID0gW11cbiAgICBzZWxlY3RvcnMgPSBzZXR0aW5nc1sxXVxuXG4gICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIGFuZCBlbCBpcyBhbiBPUFRJT04sIHVzZSBpdHMgU0VMRUNUIGFzIHRoZSBtYXRjaGVkIGVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKGVsICYmIGVsLnRhZ05hbWUubWF0Y2goL29wdGlvbi9pKSkge1xuICAgICAgbWF0Y2hlcyA9IFtUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24oZWwpXVxuICAgICAgXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIHVzZSB0aGUgY3VycmVudCBlbCBmb3IgY2xhc3NuYW1lc1xuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIG1hdGNoZXMgPSBbZWxdXG4gICAgfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGNsYXNzbmFtZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NuYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBhY3Rpb24ucmVwbGFjZSgvQ2xhc3MvLCcnKVxuICAgICAgICBtYXRjaC5jbGFzc0xpc3RbbWV0aG9kXShjbGFzc25hbWUpXG4gICAgICB9KVxuXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgJ2NsYXNzJylcbiAgICB9KVxuICB9LFxuXG4gIHNldFN0YXRlOiBmdW5jdGlvbihzZWxlY3RvcnMsIHN0YXRlKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobWF0Y2hlcywgZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgdmFyIGFjdGlvbiA9IFRvZ2dsZXIudG9nZ2xlQWN0aW9uKG1hdGNoLCBzdGF0ZSlcblxuICAgICAgVG9nZ2xlclthY3Rpb25dKG1hdGNoKVxuICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xlckV2ZW50c09uQ2hpbGRyZW4obWF0Y2gsIGFjdGlvbilcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUFjdGlvbjogZnVuY3Rpb24oIGVsLCBhY3Rpb24gKSB7XG5cbiAgICBpZiAoIHR5cGVvZiBhY3Rpb24gPT0gJ2Jvb2xlYW4nICkge1xuICAgICAgYWN0aW9uID0gKCBhY3Rpb24gPyAnc2hvdycgOiAnaGlkZScgKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT0gJ3RvZ2dsZScpIHtcbiAgICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGluZycpICkge1xuICAgICAgICBhY3Rpb24gPSAnc2hvdydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbiA9ICdoaWRlJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSB8fCBcbiAgICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3Nob3dpbmcnICkgfHxcbiAgICAgICAgIGVsLm9mZnNldFBhcmVudCAhPSBudWxsICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nLCAnaGlkaW5nJyApXG5cbiAgICB2YXIgZnVsbHlTaG93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBSZW1vdmUgaGlkZGVuIGJlY2F1c2UgaXQgbWlnaHQgYmUgYWRkZWQgYmVmb3JlIHRoaXMgZmlyZXNcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdzaG93aW5nJywgJ2hpZGRlbicgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnIClcblxuICAgICAgLy8gRW5hYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gc2hvd25cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRm9jdXMgb24ga2V5IGVsZW1lbnQgaWYgYW4gZWxlbWVudCBleHBlY3RzIGZvY3VzXG4gICAgICB2YXIgZm9jdXNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzXScpXG4gICAgICBpZiAoZm9jdXNFbCkgeyBmb2N1c0VsLmZvY3VzKCkgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGlucHV0IGV2ZW50IG9uIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW5cbiAgICAgIHZhciByYW5nZXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYW5nZV0nKVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseVNob3csIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnc2hvd2luZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseVNob3coKVxuICAgIH1cbiAgfSxcblxuICBoaWRlOiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkZGVuJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkaW5nJyApICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHNob3dpbmcgYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICd2aXNpYmxlJywgJ3Nob3dpbmcnIClcblxuICAgIHZhciBmdWxseUhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRpbmcnLCAndmlzaWJsZScgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuXG4gICAgICAvLyBEaXNhYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gaGlkZGVuXG4gICAgICBpZiAoIHR5cGVvZiBlbC5kaXNhYmxlZCAhPSAndW5kZWZpbmVkJyApe1xuICAgICAgICBlbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGVsLmRhdGFzZXQuYW5pbWF0ZSApIHtcbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgZnVsbHlIaWRlLCB0cnVlKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGluZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseUhpZGUoKVxuICAgIH1cbiAgfSxcblxuICBnZXRMZWFmTm9kZXM6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAvLyBpcyB0aGUgcGFyZW50IGl0c2VsZiBhIGxlYWYgbm9kZT9cbiAgICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHJldHVybiBbcGFyZW50XVxuXG4gICAgdmFyIG5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSwgMClcblxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuIGVsZW0uY2hpbGRyZW4gJiYgZWxlbS5jaGlsZHJlbi5sZW5ndGggPT09IDBcbiAgICB9KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbjogZnVuY3Rpb24oZWwsIGV2ZW50TmFtZSl7XG4gICAgLy8gd2UgY2FyZSBhYm91dCBsZWFmIG5vZGVzIHNpbmNlIHRoZSBldmVudCB3aWxsIGJ1YmJsZSB0b1xuICAgIC8vIG5vbi1sZWFmIG5vZGVzIGZyb20gdGhlIGxlYWYgbm9kZXNcbiAgICB2YXIgbGVhZkNoaWxkTm9kZXMgPSBUb2dnbGVyLmdldExlYWZOb2RlcyhlbClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGVhZkNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIC8vICd0b2dnbGVyOnNob3cnLCAndG9nZ2xlcjpoaWRlJywgZXRjXG4gICAgICBFdmVudC5maXJlKG5vZGUsIFwidG9nZ2xlcjpcIiArIGV2ZW50TmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUNoZWNrYm94ZXM6IGZ1bmN0aW9uKGNoZWNrYm94ZXMpIHtcbiAgICBjaGVja2JveGVzID0gY2hlY2tib3hlcyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIuY2hlY2tib3hTZWxlY3RvcilcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2hlY2tib3hlcywgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcpXG4gIH0sXG5cbiAgc2V0dXBSYWRpb3M6IGZ1bmN0aW9uKCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnJhZGlvU2VsZWN0b3IpLCBmdW5jdGlvbihyYWRpbywgaW5kZXgpe1xuICAgICAgaWYgKCFyYWRpby5kYXRhc2V0LnRvZ2dsZXJBY3RpdmUpIHtcblxuICAgICAgICB2YXIgcmFkaW9OYW1lICAgICAgICAgPSByYWRpby5nZXRBdHRyaWJ1dGUoJ25hbWUnKSxcbiAgICAgICAgICAgIHNpYmxpbmdzICAgICAgICAgID0gVG9nZ2xlci5wYXJlbnRGb3JtKHJhZGlvKS5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYWRpb11bbmFtZT1cIicrcmFkaW9OYW1lKydcIl0nKSxcbiAgICAgICAgICAgIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ3Nob3cnKSxcbiAgICAgICAgICAgIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ2FkZENsYXNzJyksXG4gICAgICAgICAgICBjaGVja2VkXG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzaWJsaW5ncywgZnVuY3Rpb24ocil7XG5cbiAgICAgICAgICBpZiAoci5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK3IuZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgci5jaGVja2VkID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgaGF2ZSBhIGRlZmF1bHQgZGF0YS1zaG93IHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtc2hvdyB2YWx1ZXMgd2lsbCB0b2dnbGUgb2ZmIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5zaG93ID0gci5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICByLmRhdGFzZXQuYWRkQ2xhc3MgPSByLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIHIuZGF0YXNldC5oaWRlICYmIHIuZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCByLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgci5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gci5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLWFkZC1jbGFzcyB2YWx1ZSBvZiAnJ1xuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB1bnNldCBkYXRhLWFkZC1jbGFzcyB2YWx1ZXMgYXJlIHRvZ2dsZSBvZmYgYWxsIGNsYXNzZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyByZW1vdmUgY2xhc3NlcyBhY2NvcmRpbmdcbiAgICAgICAgICAvLyB0byB0aGUgZGVzZWxlY3RlZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgci5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyYnKVxuXG5cbiAgICAgICAgICByLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcblxuXG4gICAgICAgICAgaWYoIHIuY2hlY2tlZCApIGNoZWNrZWQgPSByXG5cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIGNoZWNrZWQgKSB7XG4gICAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIGNoZWNrZWQgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFRvZ2dsZXIuc2V0U3RhdGUoIHNob3dTZWxlY3RvcnMuam9pbignLCcpLCAnaGlkZScgKVxuICAgICAgICAgIFRvZ2dsZXIuc2V0Q2xhc3MoIGFkZENsYXNzU2VsZWN0b3JzLmpvaW4oJyAmICcpLCAncmVtb3ZlQ2xhc3MnIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgfSxcblxuICAvLyBBZGQgZGF0YS1oaWRlIHRvIGVhY2ggPG9wdGlvbj4gY29udGFpbmluZyB0aGUgc2VsZWN0b3JzIGZyb20gb3RoZXJcbiAgLy8gb3B0aW9uJ3MgZGF0YS1zaG93LiBUaGlzIG1ha2VzIHRoZSB0b2dnbGluZyBvZiBlbGVtZW50cyBleGNsdXNpdmUuXG4gIC8vXG4gIHNldHVwU2VsZWN0czogZnVuY3Rpb24oKXtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5zZWxlY3RTZWxlY3RvciksIGZ1bmN0aW9uKG9wdGlvbil7XG4gICAgICAvLyBQcmV2ZW50IGFuIG9wdGlvbiBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgdHdpY2VcbiAgICAgIGlmICghb3B0aW9uLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnNob3cgPSBvcHRpb24uZGF0YXNldC5zaG93IHx8ICcnXG5cbiAgICAgICAgdmFyIHNlbGVjdCA9IFRvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihvcHRpb24pXG4gICAgICAgIHNlbGVjdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3QtdG9nZ2xlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpXG5cbiAgICAgICAgdmFyIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnc2hvdycpXG4gICAgICAgIHZhciBhZGRDbGFzc1NlbGVjdG9ycyA9IFRvZ2dsZXIuZGF0YUF0dHJpYnV0ZXMob3B0aW9ucywgJ2FkZENsYXNzJylcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIGZ1bmN0aW9uKG8sIGluZGV4KSB7XG5cbiAgICAgICAgICBpZiAoby5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK28uZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBpbmRleFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG8uZGF0YXNldC5zaG93ID0gby5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICBvLmRhdGFzZXQuYWRkQ2xhc3MgPSBvLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIG8uZGF0YXNldC5oaWRlICYmIG8uZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCBvLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgLy8gSWYgc2hvdyBzZWxlY3RvcnMgYXJlIG5vdCBwcmVzZW50IGluIGVsZW1lbnQncyBkYXRhLXNob3dcbiAgICAgICAgICAvLyBBZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMgdG8gYmUgaGlkZGVuXG4gICAgICAgICAgby5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gby5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgby5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyAmICcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlzIHRvZ2dsZWQgcHJvcGVybHlcbiAgICAgICAgLy9cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoc2VsZWN0KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gRmluZCBwYXJlbnQgPHNlbGVjdD4gZm9yIGFuIG9wdGlvbiAoYWNjb3VudHMgZm9yIG9wdGlvbiBncm91cHMpXG4gIC8vXG4gIGdldFNlbGVjdEZyb21PcHRpb246IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHAgPSBlbC5wYXJlbnRFbGVtZW50XG5cbiAgICBpZiAocC50YWdOYW1lID09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm4gcFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHApXG4gICAgfVxuICB9LFxuXG5cbiAgLy8gRmluZCBwYXJlbnQgPGZvcm0+IG9yIGRvY3VtZW50IGlmIHRoZXJlIGlzIG5vIGZvcm1cbiAgLy9cbiAgcGFyZW50Rm9ybTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBlbCA9IGVsZW1lbnRcblxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudE5vZGVcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbiAgfSxcblxuICAvLyBSZXR1cm4gYSB1bmlxdWUgYXJyYXkgb2YgYWxsIGRhdGEgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGVsZW1lbnRzXG4gIC8vXG4gIGRhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbihlbGVtZW50cywgYXR0cikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7IFxuICAgICAgcmV0dXJuIGVsLmRhdGFzZXRbYXR0cl1cbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3JzLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGVjdG9ycyAhPSBcIlwiICYmIHR5cGVvZiBzZWxlY3RvcnMgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5pbmRleE9mKHNlbGVjdG9ycykgPT09IGluZGV4XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudC5yZWFkeShUb2dnbGVyLmxpc3RlbilcbkV2ZW50LmNoYW5nZShUb2dnbGVyLnJlZnJlc2gpXG5cbm1vZHVsZS5leHBvcnRzID0gVG9nZ2xlclxuIiwiLy8gU2hpbXNcbnJlcXVpcmUoICcuL2xpYi9zaGltcy9fY2xhc3NsaXN0JyApXG52YXIgbWVyZ2UgICAgPSByZXF1aXJlKCAnLi9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24nICksXG4gICAgZXZlbnQgICAgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICBsdXhvbiAgICA9IHJlcXVpcmUoICdsdXhvbicgKSxcbiAgICB0aW1lICAgICA9IG1lcmdlKHJlcXVpcmUoICcuL2xpYi90aW1lJyApLCBsdXhvbiksXG4gICAgc2Nyb2xsVG8gPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsdG8nICksXG4gICAgZnJvbVRvcCAgPSByZXF1aXJlKCAnLi9saWIvZnJvbXRvcCcgKSxcbiAgICBlYXNlICAgICA9IHJlcXVpcmUoICcuL2xpYi9lYXNlJyApXG5cbnZhciB0b29sYm94ID0ge1xuXG4gIGV2ZW50OiBldmVudCxcbiAgc2Nyb2xsVG86IHNjcm9sbFRvLFxuICBmcm9tVG9wOiBmcm9tVG9wLFxuICBtZXJnZTogbWVyZ2UsXG4gIGVhc2U6IGVhc2UsXG4gIHRpbWU6IHRpbWUsXG5cbiAgLy8gR2V0IGNsb3Nlc3QgRE9NIGVsZW1lbnQgdXAgdGhlIHRyZWUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0Q2xvc2VzdDogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBlbCwgc2VsZWN0b3IgKSApIHJldHVybiBlbFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSxcblxuICBjaGlsZE9mOiBmdW5jdGlvbiAoIGVsLCBwYXJlbnQgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwgPT0gcGFyZW50ICkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIC8vIEdldCBuZXh0IERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yXG4gIGdldE5leHQ6IGZ1bmN0aW9uKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKSApIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gTWF0Y2hlcyBzZWxlY3RvciBmdW5jdGlvblxuICAvLyBAcmVmZXJlbmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAgbWF0Y2hlczogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgcmV0dXJuICggZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbC5vTWF0Y2hlc1NlbGVjdG9yICkuY2FsbCggZWwsIHNlbGVjdG9yICk7XG4gIH0sXG5cbiAgd29yZENvdW50OiBmdW5jdGlvbiggc3RyICkge1xuICAgIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKCAvXFxTKy9nICk7XG4gICAgcmV0dXJuIG1hdGNoZXMgPyBtYXRjaGVzLmxlbmd0aCA6IDA7XG4gIH0sXG5cbiAgLy8gRWFzeSBhY2Nlc3MgdG8gc2xpY2UgZm9yIGNvbnZlcnRpbmcgb2JqZWN0cyBpbnRvIGFycmF5cyBvZiB2YWx1ZXMuXG4gIHNsaWNlOiBmdW5jdGlvbiggb2JqLCBjb3VudCApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIG9iaiwgY291bnQgKVxuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sbGVjdGlvbiwgY2FsbGJhY2sgKVxuICB9LFxuXG4gIGZvcm1EYXRhOiBmdW5jdGlvbiggcm9vdEVsICkge1xuICAgIHZhciBmb3JtRGF0YSAgPSBuZXcgRm9ybURhdGEoKSxcbiAgICAgICAgZmllbGRzID0gdG9vbGJveC5zbGljZShyb290RWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgc2VsZWN0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWFbbmFtZV06bm90KFtkaXNhYmxlZF0pJyApKVxuICAgIHZhciBmaWVsZERhdGEgPSB7fVxuXG4gICAgLy8gUmVtb3ZlIGFueSBmaWVsZCB3aGljaCBoYXMgYSBwYXJlbnQgd2hpY2ggaXMgZGlzYWJsZWRcbiAgICBmaWVsZHMgPSBmaWVsZHMuZmlsdGVyKCBmdW5jdGlvbiggZiApIHsgcmV0dXJuICF0b29sYm94LmdldENsb3Nlc3QoZiwgJ1tkaXNhYmxlZF0nKSB9KVxuXG4gICAgLy8gTG9vcCBvdmVyIGZpZWxkc1xuICAgIC8vIHJldmVyc2UgdGhlbSBiZWNhdXNlIGlmIHRoZXJlIGFyZSB0d28gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZVxuICAgIC8vIHRoZSBsYXN0IGlucHV0IG92ZXJyaWRlcyB0aGUgZmlyc3QuXG4gICAgZmllbGRzLnJldmVyc2UoKS5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKSB7XG4gICAgICBpZiAoIHRvb2xib3gubWF0Y2hlcyggZmllbGQsICdbdHlwZT1yYWRpb10sIFt0eXBlPWNoZWNrYm94XScpICkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2hlY2tib3ggb3IgcmFkaW8gaW5wdXQsIG92ZXJ3cml0ZSB3aXRoIGNoZWNrZWQgdmFsdWVzXG4gICAgICAgIGlmICggZmllbGQuY2hlY2tlZCApIGZpZWxkRGF0YVtmaWVsZC5uYW1lXSA9IGZpZWxkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbmx5IGFkZCBvbmUgdmFsdWUgcGVyIGZpZWxkIG5hbWVcbiAgICAgICAgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGREYXRhW2ZpZWxkLm5hbWVdIHx8IGZpZWxkXG4gICAgICB9XG4gICAgfSlcblxuICAgIGZvciAoIHZhciBuYW1lIGluIGZpZWxkRGF0YSApIHtcbiAgICAgIC8vIEFwcGVuZCBjdXJyZW50IGZpZWxk4oCZcyBuYW1lL3ZhbHVlIHRvIG5ldyBmb3JtRGF0YSBvYmplY3RcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCggbmFtZSwgZmllbGREYXRhW25hbWVdLnZhbHVlICk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiByZXR1cm4gc2FpZCBmb3JtRGF0YSBvYmplY3RcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbGJveFxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyAgICAga2V5bWFzdGVyLmpzXG4vLyAgICAgKGMpIDIwMTEtMjAxMyBUaG9tYXMgRnVjaHNcbi8vICAgICBrZXltYXN0ZXIuanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbjsoZnVuY3Rpb24oZ2xvYmFsKXtcbiAgdmFyIGssXG4gICAgX2hhbmRsZXJzID0ge30sXG4gICAgX21vZHMgPSB7IDE2OiBmYWxzZSwgMTg6IGZhbHNlLCAxNzogZmFsc2UsIDkxOiBmYWxzZSB9LFxuICAgIF9zY29wZSA9ICdhbGwnLFxuICAgIC8vIG1vZGlmaWVyIGtleXNcbiAgICBfTU9ESUZJRVJTID0ge1xuICAgICAgJ+KHpyc6IDE2LCBzaGlmdDogMTYsXG4gICAgICAn4oylJzogMTgsIGFsdDogMTgsIG9wdGlvbjogMTgsXG4gICAgICAn4oyDJzogMTcsIGN0cmw6IDE3LCBjb250cm9sOiAxNyxcbiAgICAgICfijJgnOiA5MSwgY29tbWFuZDogOTFcbiAgICB9LFxuICAgIC8vIHNwZWNpYWwga2V5c1xuICAgIF9NQVAgPSB7XG4gICAgICBiYWNrc3BhY2U6IDgsIHRhYjogOSwgY2xlYXI6IDEyLFxuICAgICAgZW50ZXI6IDEzLCAncmV0dXJuJzogMTMsXG4gICAgICBlc2M6IDI3LCBlc2NhcGU6IDI3LCBzcGFjZTogMzIsXG4gICAgICBsZWZ0OiAzNywgdXA6IDM4LFxuICAgICAgcmlnaHQ6IDM5LCBkb3duOiA0MCxcbiAgICAgIGRlbDogNDYsICdkZWxldGUnOiA0NixcbiAgICAgIGhvbWU6IDM2LCBlbmQ6IDM1LFxuICAgICAgcGFnZXVwOiAzMywgcGFnZWRvd246IDM0LFxuICAgICAgJywnOiAxODgsICcuJzogMTkwLCAnLyc6IDE5MSxcbiAgICAgICdgJzogMTkyLCAnLSc6IDE4OSwgJz0nOiAxODcsXG4gICAgICAnOyc6IDE4NiwgJ1xcJyc6IDIyMixcbiAgICAgICdbJzogMjE5LCAnXSc6IDIyMSwgJ1xcXFwnOiAyMjBcbiAgICB9LFxuICAgIGNvZGUgPSBmdW5jdGlvbih4KXtcbiAgICAgIHJldHVybiBfTUFQW3hdIHx8IHgudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApO1xuICAgIH0sXG4gICAgX2Rvd25LZXlzID0gW107XG5cbiAgZm9yKGs9MTtrPDIwO2srKykgX01BUFsnZicra10gPSAxMTEraztcblxuICAvLyBJRSBkb2Vzbid0IHN1cHBvcnQgQXJyYXkjaW5kZXhPZiwgc28gaGF2ZSBhIHNpbXBsZSByZXBsYWNlbWVudFxuICBmdW5jdGlvbiBpbmRleChhcnJheSwgaXRlbSl7XG4gICAgdmFyIGkgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUoaS0tKSBpZihhcnJheVtpXT09PWl0ZW0pIHJldHVybiBpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIGZvciBjb21wYXJpbmcgbW9kcyBiZWZvcmUgdW5hc3NpZ25tZW50XG4gIGZ1bmN0aW9uIGNvbXBhcmVBcnJheShhMSwgYTIpIHtcbiAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllck1hcCA9IHtcbiAgICAgIDE2OidzaGlmdEtleScsXG4gICAgICAxODonYWx0S2V5JyxcbiAgICAgIDE3OidjdHJsS2V5JyxcbiAgICAgIDkxOidtZXRhS2V5J1xuICB9O1xuICBmdW5jdGlvbiB1cGRhdGVNb2RpZmllcktleShldmVudCkge1xuICAgICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZXZlbnRbbW9kaWZpZXJNYXBba11dO1xuICB9O1xuXG4gIC8vIGhhbmRsZSBrZXlkb3duIGV2ZW50XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGV2ZW50KSB7XG4gICAgdmFyIGtleSwgaGFuZGxlciwgaywgaSwgbW9kaWZpZXJzTWF0Y2gsIHNjb3BlO1xuICAgIGtleSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICBpZiAoaW5kZXgoX2Rvd25LZXlzLCBrZXkpID09IC0xKSB7XG4gICAgICAgIF9kb3duS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBtb2RpZmllciBrZXksIHNldCB0aGUga2V5Ljxtb2RpZmllcmtleW5hbWU+IHByb3BlcnR5IHRvIHRydWUgYW5kIHJldHVyblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTsgLy8gcmlnaHQgY29tbWFuZCBvbiB3ZWJraXQsIGNvbW1hbmQgb24gR2Vja29cbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSB0cnVlO1xuICAgICAgLy8gJ2Fzc2lnbktleScgZnJvbSBpbnNpZGUgdGhpcyBjbG9zdXJlIGlzIGV4cG9ydGVkIHRvIHdpbmRvdy5rZXlcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGVNb2RpZmllcktleShldmVudCk7XG5cbiAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byBpZ25vcmUgdGhlIGtleXByZXNzIChmaWx0ZXIoKSBjYW4gY2FuIGJlIG92ZXJyaWRkZW4pXG4gICAgLy8gYnkgZGVmYXVsdCBpZ25vcmUga2V5IHByZXNzZXMgaWYgYSBzZWxlY3QsIHRleHRhcmVhLCBvciBpbnB1dCBpcyBmb2N1c2VkXG4gICAgaWYoIWFzc2lnbktleS5maWx0ZXIuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIC8vIGFib3J0IGlmIG5vIHBvdGVudGlhbGx5IG1hdGNoaW5nIHNob3J0Y3V0cyBmb3VuZFxuICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSByZXR1cm47XG5cbiAgICBzY29wZSA9IGdldFNjb3BlKCk7XG5cbiAgICAvLyBmb3IgZWFjaCBwb3RlbnRpYWwgc2hvcnRjdXRcbiAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXIgPSBfaGFuZGxlcnNba2V5XVtpXTtcblxuICAgICAgLy8gc2VlIGlmIGl0J3MgaW4gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIGlmKGhhbmRsZXIuc2NvcGUgPT0gc2NvcGUgfHwgaGFuZGxlci5zY29wZSA9PSAnYWxsJyl7XG4gICAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVycyBtYXRjaCBpZiBhbnlcbiAgICAgICAgbW9kaWZpZXJzTWF0Y2ggPSBoYW5kbGVyLm1vZHMubGVuZ3RoID4gMDtcbiAgICAgICAgZm9yKGsgaW4gX21vZHMpXG4gICAgICAgICAgaWYoKCFfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA+IC0xKSB8fFxuICAgICAgICAgICAgKF9tb2RzW2tdICYmIGluZGV4KGhhbmRsZXIubW9kcywgK2spID09IC0xKSkgbW9kaWZpZXJzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlciBhbmQgc3RvcCB0aGUgZXZlbnQgaWYgbmVjY2Vzc2FyeVxuICAgICAgICBpZigoaGFuZGxlci5tb2RzLmxlbmd0aCA9PSAwICYmICFfbW9kc1sxNl0gJiYgIV9tb2RzWzE4XSAmJiAhX21vZHNbMTddICYmICFfbW9kc1s5MV0pIHx8IG1vZGlmaWVyc01hdGNoKXtcbiAgICAgICAgICBpZihoYW5kbGVyLm1ldGhvZChldmVudCwgaGFuZGxlcik9PT1mYWxzZSl7XG4gICAgICAgICAgICBpZihldmVudC5wcmV2ZW50RGVmYXVsdCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZWxzZSBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmKGV2ZW50LmNhbmNlbEJ1YmJsZSkgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gdW5zZXQgbW9kaWZpZXIga2V5cyBvbiBrZXl1cFxuICBmdW5jdGlvbiBjbGVhck1vZGlmaWVyKGV2ZW50KXtcbiAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSwgayxcbiAgICAgICAgaSA9IGluZGV4KF9kb3duS2V5cywga2V5KTtcblxuICAgIC8vIHJlbW92ZSBrZXkgZnJvbSBfZG93bktleXNcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgIF9kb3duS2V5cy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuXG4gICAgaWYoa2V5ID09IDkzIHx8IGtleSA9PSAyMjQpIGtleSA9IDkxO1xuICAgIGlmKGtleSBpbiBfbW9kcykge1xuICAgICAgX21vZHNba2V5XSA9IGZhbHNlO1xuICAgICAgZm9yKGsgaW4gX01PRElGSUVSUykgaWYoX01PRElGSUVSU1trXSA9PSBrZXkpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiByZXNldE1vZGlmaWVycygpIHtcbiAgICBmb3IoayBpbiBfbW9kcykgX21vZHNba10gPSBmYWxzZTtcbiAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgfTtcblxuICAvLyBwYXJzZSBhbmQgYXNzaWduIHNob3J0Y3V0XG4gIGZ1bmN0aW9uIGFzc2lnbktleShrZXksIHNjb3BlLCBtZXRob2Qpe1xuICAgIHZhciBrZXlzLCBtb2RzO1xuICAgIGtleXMgPSBnZXRLZXlzKGtleSk7XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRob2QgPSBzY29wZTtcbiAgICAgIHNjb3BlID0gJ2FsbCc7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggc2hvcnRjdXRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIHNldCBtb2RpZmllciBrZXlzIGlmIGFueVxuICAgICAgbW9kcyA9IFtdO1xuICAgICAga2V5ID0ga2V5c1tpXS5zcGxpdCgnKycpO1xuICAgICAgaWYgKGtleS5sZW5ndGggPiAxKXtcbiAgICAgICAgbW9kcyA9IGdldE1vZHMoa2V5KTtcbiAgICAgICAga2V5ID0gW2tleVtrZXkubGVuZ3RoLTFdXTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnZlcnQgdG8ga2V5Y29kZSBhbmQuLi5cbiAgICAgIGtleSA9IGtleVswXVxuICAgICAga2V5ID0gY29kZShrZXkpO1xuICAgICAgLy8gLi4uc3RvcmUgaGFuZGxlclxuICAgICAgaWYgKCEoa2V5IGluIF9oYW5kbGVycykpIF9oYW5kbGVyc1trZXldID0gW107XG4gICAgICBfaGFuZGxlcnNba2V5XS5wdXNoKHsgc2hvcnRjdXQ6IGtleXNbaV0sIHNjb3BlOiBzY29wZSwgbWV0aG9kOiBtZXRob2QsIGtleToga2V5c1tpXSwgbW9kczogbW9kcyB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gdW5iaW5kIGFsbCBoYW5kbGVycyBmb3IgZ2l2ZW4ga2V5IGluIGN1cnJlbnQgc2NvcGVcbiAgZnVuY3Rpb24gdW5iaW5kS2V5KGtleSwgc2NvcGUpIHtcbiAgICB2YXIgbXVsdGlwbGVLZXlzLCBrZXlzLFxuICAgICAgbW9kcyA9IFtdLFxuICAgICAgaSwgaiwgb2JqO1xuXG4gICAgbXVsdGlwbGVLZXlzID0gZ2V0S2V5cyhrZXkpO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IG11bHRpcGxlS2V5cy5sZW5ndGg7IGorKykge1xuICAgICAga2V5cyA9IG11bHRpcGxlS2V5c1tqXS5zcGxpdCgnKycpO1xuXG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleXMpO1xuICAgICAgICBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcblxuICAgICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCFfaGFuZGxlcnNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb2JqID0gX2hhbmRsZXJzW2tleV1baV07XG4gICAgICAgIC8vIG9ubHkgY2xlYXIgaGFuZGxlcnMgaWYgY29ycmVjdCBzY29wZSBhbmQgbW9kcyBtYXRjaFxuICAgICAgICBpZiAob2JqLnNjb3BlID09PSBzY29wZSAmJiBjb21wYXJlQXJyYXkob2JqLm1vZHMsIG1vZHMpKSB7XG4gICAgICAgICAgX2hhbmRsZXJzW2tleV1baV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3aXRoIGNvZGUgJ2tleUNvZGUnIGlzIGN1cnJlbnRseSBkb3duXG4gIC8vIENvbnZlcnRzIHN0cmluZ3MgaW50byBrZXkgY29kZXMuXG4gIGZ1bmN0aW9uIGlzUHJlc3NlZChrZXlDb2RlKSB7XG4gICAgICBpZiAodHlwZW9mKGtleUNvZGUpPT0nc3RyaW5nJykge1xuICAgICAgICBrZXlDb2RlID0gY29kZShrZXlDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleChfZG93bktleXMsIGtleUNvZGUpICE9IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJlc3NlZEtleUNvZGVzKCkge1xuICAgICAgcmV0dXJuIF9kb3duS2V5cy5zbGljZSgwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbHRlcihldmVudCl7XG4gICAgdmFyIHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWU7XG4gICAgLy8gaWdub3JlIGtleXByZXNzZWQgaW4gYW55IGVsZW1lbnRzIHRoYXQgc3VwcG9ydCBrZXlib2FyZCBkYXRhIGlucHV0XG4gICAgcmV0dXJuICEodGFnTmFtZSA9PSAnSU5QVVQnIHx8IHRhZ05hbWUgPT0gJ1NFTEVDVCcgfHwgdGFnTmFtZSA9PSAnVEVYVEFSRUEnKTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUga2V5Ljxtb2RpZmllcj4gdG8gZmFsc2VcbiAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG5cbiAgLy8gc2V0IGN1cnJlbnQgc2NvcGUgKGRlZmF1bHQgJ2FsbCcpXG4gIGZ1bmN0aW9uIHNldFNjb3BlKHNjb3BlKXsgX3Njb3BlID0gc2NvcGUgfHwgJ2FsbCcgfTtcbiAgZnVuY3Rpb24gZ2V0U2NvcGUoKXsgcmV0dXJuIF9zY29wZSB8fCAnYWxsJyB9O1xuXG4gIC8vIGRlbGV0ZSBhbGwgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gc2NvcGVcbiAgZnVuY3Rpb24gZGVsZXRlU2NvcGUoc2NvcGUpe1xuICAgIHZhciBrZXksIGhhbmRsZXJzLCBpO1xuXG4gICAgZm9yIChrZXkgaW4gX2hhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9oYW5kbGVyc1trZXldO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKSB7XG4gICAgICAgIGlmIChoYW5kbGVyc1tpXS5zY29wZSA9PT0gc2NvcGUpIGhhbmRsZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgZWxzZSBpKys7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGFic3RyYWN0IGtleSBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRLZXlzKGtleSkge1xuICAgIHZhciBrZXlzO1xuICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGtleXMgPSBrZXkuc3BsaXQoJywnKTtcbiAgICBpZiAoKGtleXNba2V5cy5sZW5ndGggLSAxXSkgPT0gJycpIHtcbiAgICAgIGtleXNba2V5cy5sZW5ndGggLSAyXSArPSAnLCc7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgLy8gYWJzdHJhY3QgbW9kcyBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRNb2RzKGtleSkge1xuICAgIHZhciBtb2RzID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSAxKTtcbiAgICBmb3IgKHZhciBtaSA9IDA7IG1pIDwgbW9kcy5sZW5ndGg7IG1pKyspXG4gICAgbW9kc1ttaV0gPSBfTU9ESUZJRVJTW21vZHNbbWldXTtcbiAgICByZXR1cm4gbW9kcztcbiAgfVxuXG4gIC8vIGNyb3NzLWJyb3dzZXIgZXZlbnRzXG4gIGZ1bmN0aW9uIGFkZEV2ZW50KG9iamVjdCwgZXZlbnQsIG1ldGhvZCkge1xuICAgIGlmIChvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgIG9iamVjdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBtZXRob2QsIGZhbHNlKTtcbiAgICBlbHNlIGlmKG9iamVjdC5hdHRhY2hFdmVudClcbiAgICAgIG9iamVjdC5hdHRhY2hFdmVudCgnb24nK2V2ZW50LCBmdW5jdGlvbigpeyBtZXRob2Qod2luZG93LmV2ZW50KSB9KTtcbiAgfTtcblxuICAvLyBzZXQgdGhlIGhhbmRsZXJzIGdsb2JhbGx5IG9uIGRvY3VtZW50XG4gIGFkZEV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7IGRpc3BhdGNoKGV2ZW50KSB9KTsgLy8gUGFzc2luZyBfc2NvcGUgdG8gYSBjYWxsYmFjayB0byBlbnN1cmUgaXQgcmVtYWlucyB0aGUgc2FtZSBieSBleGVjdXRpb24uIEZpeGVzICM0OFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleXVwJywgY2xlYXJNb2RpZmllcik7XG5cbiAgLy8gcmVzZXQgbW9kaWZpZXJzIHRvIGZhbHNlIHdoZW5ldmVyIHRoZSB3aW5kb3cgaXMgKHJlKWZvY3VzZWQuXG4gIGFkZEV2ZW50KHdpbmRvdywgJ2ZvY3VzJywgcmVzZXRNb2RpZmllcnMpO1xuXG4gIC8vIHN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXlcbiAgdmFyIHByZXZpb3VzS2V5ID0gZ2xvYmFsLmtleTtcblxuICAvLyByZXN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXkgYW5kIHJldHVybiByZWZlcmVuY2UgdG8gb3VyIGtleSBvYmplY3RcbiAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICB2YXIgayA9IGdsb2JhbC5rZXk7XG4gICAgZ2xvYmFsLmtleSA9IHByZXZpb3VzS2V5O1xuICAgIHJldHVybiBrO1xuICB9XG5cbiAgLy8gc2V0IHdpbmRvdy5rZXkgYW5kIHdpbmRvdy5rZXkuc2V0L2dldC9kZWxldGVTY29wZSwgYW5kIHRoZSBkZWZhdWx0IGZpbHRlclxuICBnbG9iYWwua2V5ID0gYXNzaWduS2V5O1xuICBnbG9iYWwua2V5LnNldFNjb3BlID0gc2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZ2V0U2NvcGUgPSBnZXRTY29wZTtcbiAgZ2xvYmFsLmtleS5kZWxldGVTY29wZSA9IGRlbGV0ZVNjb3BlO1xuICBnbG9iYWwua2V5LmZpbHRlciA9IGZpbHRlcjtcbiAgZ2xvYmFsLmtleS5pc1ByZXNzZWQgPSBpc1ByZXNzZWQ7XG4gIGdsb2JhbC5rZXkuZ2V0UHJlc3NlZEtleUNvZGVzID0gZ2V0UHJlc3NlZEtleUNvZGVzO1xuICBnbG9iYWwua2V5Lm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICBnbG9iYWwua2V5LnVuYmluZCA9IHVuYmluZEtleTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgbW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25LZXk7XG5cbn0pKHRoaXMpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuLy8gVFlQRVNcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vLyBDQVBBQklMSVRJRVNcblxuZnVuY3Rpb24gaGFzSW50bCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJyAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuXG5mdW5jdGlvbiBoYXNGb3JtYXRUb1BhcnRzKCkge1xuICByZXR1cm4gIWlzVW5kZWZpbmVkKEludGwuRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFRvUGFydHMpO1xufVxuXG4vLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZnVuY3Rpb24gbWF5YmVBcnJheSh0aGluZykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGluZykgPyB0aGluZyA6IFt0aGluZ107XG59XG5cbmZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZShmdW5jdGlvbiAoYmVzdCwgbmV4dCkge1xuICAgIHZhciBwYWlyID0gW2J5KG5leHQpLCBuZXh0XTtcbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZS5hcHBseShudWxsLCBbYmVzdFswXSwgcGFpclswXV0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChhLCBrKSB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuXG4vLyBOVU1CRVJTIEFORCBTVFJJTkdTXG5cbmZ1bmN0aW9uIG51bWJlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc051bWJlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn1cblxuLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5mdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCkge1xuICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcblxuICBpZiAoaW5wdXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmV0dXJuICgnMCcucmVwZWF0KG4pICsgaW5wdXQpLnNsaWNlKC1uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1pbGxpcyhmcmFjdGlvbikge1xuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoJzAuJyArIGZyYWN0aW9uKSAqIDEwMDA7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91bmRUbyhudW1iZXIsIGRpZ2l0cykge1xuICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRpZ2l0cyk7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cblxuZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgdmFyIG1vZE1vbnRoID0gZmxvb3JNb2QobW9udGggLSAxLCAxMikgKyAxLFxuICAgICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIHZhciBwMSA9ICh3ZWVrWWVhciArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICUgNyxcbiAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufVxuXG4vLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlKSB7XG4gIHZhciB0aW1lWm9uZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgIGludGxPcHRzID0ge1xuICAgIGhvdXIxMjogZmFsc2UsXG4gICAgeWVhcjogJ251bWVyaWMnLFxuICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgaG91cjogJzItZGlnaXQnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oeyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCB9LCBpbnRsT3B0cyksXG4gICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIHZhciBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXRUb1BhcnRzKGRhdGUpLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpbWV6b25lbmFtZSc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG4gIH0gZWxzZSBpZiAoaW50bCkge1xuICAgIC8vIHRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrIGZvciBhbGwgbG9jYWxlc1xuICAgIHZhciB3aXRob3V0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBpbnRsT3B0cykuZm9ybWF0KGRhdGUpLFxuICAgICAgICBpbmNsdWRlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgZGlmZmVkID0gaW5jbHVkZWQuc3Vic3RyaW5nKHdpdGhvdXQubGVuZ3RoKSxcbiAgICAgICAgdHJpbW1lZCA9IGRpZmZlZC5yZXBsYWNlKC9eWywgXSsvLCAnJyk7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gc2lnbmVkT2Zmc2V0KCctNScsICczMCcpIC0+IC0zMzBcbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59XG5cbi8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgdmFyIGlnbm9yZVVua25vd24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBub3JtYWxpemVkID0ge307XG4gIGZvciAodmFyIHUgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSh1KSkge1xuICAgICAgdmFyIHYgPSBvYmpbdV07XG4gICAgICBpZiAodiAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodikgJiYgIU51bWJlci5pc05hTih2KSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gbm9ybWFsaXplcih1LCBpZ25vcmVVbmtub3duKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSk7XG59XG5cbnZhciBjdXN0b21JbnNwZWN0U3ltYm9sID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCd1dGlsJykuaW5zcGVjdC5jdXN0b207IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgfSBjYXRjaCAoX2Vycikge1xuICAgIHJldHVybiBTeW1ib2woJ3V0aWwuaW5zcGVjdC5jdXN0b20nKTtcbiAgfVxufSgpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG4gPSAnbnVtZXJpYycsXG4gICAgcyA9ICdzaG9ydCcsXG4gICAgbCA9ICdsb25nJyxcbiAgICBkMiA9ICcyLWRpZ2l0JztcblxudmFyIERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG5cbn07XG5cbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbFxufTtcblxudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG5cbnZhciBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxudmFyIFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2Vcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAqL1xudmFyIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cbnZhciBEQVRFVElNRV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMlxufTtcblxuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICovXG52YXIgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcblxudmFyIERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcblxudmFyIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBtb250aHNMb25nID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cbnZhciBtb250aHNTaG9ydCA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxudmFyIG1vbnRoc05hcnJvdyA9IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXTtcblxuZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgIHJldHVybiBtb250aHNTaG9ydDtcbiAgICBjYXNlICdsb25nJzpcbiAgICAgIHJldHVybiBtb250aHNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXTtcbiAgICBjYXNlICcyLWRpZ2l0JzpcbiAgICAgIHJldHVybiBbJzAxJywgJzAyJywgJzAzJywgJzA0JywgJzA1JywgJzA2JywgJzA3JywgJzA4JywgJzA5JywgJzEwJywgJzExJywgJzEyJ107XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciB3ZWVrZGF5c0xvbmcgPSBbJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknLCAnU3VuZGF5J107XG5cbnZhciB3ZWVrZGF5c1Nob3J0ID0gWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXTtcblxudmFyIHdlZWtkYXlzTmFycm93ID0gWydNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUycsICdTJ107XG5cbmZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG4gICAgY2FzZSAnc2hvcnQnOlxuICAgICAgcmV0dXJuIHdlZWtkYXlzU2hvcnQ7XG4gICAgY2FzZSAnbG9uZyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNyddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgbWVyaWRpZW1zID0gWydBTScsICdQTSddO1xuXG52YXIgZXJhc0xvbmcgPSBbJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknXTtcblxudmFyIGVyYXNTaG9ydCA9IFsnQkMnLCAnQUQnXTtcblxudmFyIGVyYXNOYXJyb3cgPSBbJ0InLCAnQSddO1xuXG5mdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcbiAgICBjYXNlICdzaG9ydCc6XG4gICAgICByZXR1cm4gZXJhc1Nob3J0O1xuICAgIGNhc2UgJ2xvbmcnOlxuICAgICAgcmV0dXJuIGVyYXNMb25nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSB7XG4gIHJldHVybiBtZXJpZGllbXNbZHQuaG91ciA8IDEyID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5cbmZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gZXJhRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gZXJhcyhsZW5ndGgpW2R0LnllYXIgPCAwID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbJ3dlZWtkYXknLCAnZXJhJywgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICd0aW1lWm9uZU5hbWUnLCAnaG91cjEyJ10pLFxuICAgICAga2V5ID0gc3RyaW5naWZ5KGZpbHRlcmVkKSxcbiAgICAgIGRhdGVUaW1lSHVnZSA9ICdFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gJ00vZC95eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX01FRCk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0ZVTEwpOlxuICAgICAgcmV0dXJuICdMTExMIGQsIHl5eXknO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gJ0VFRUUsIExMTEwgZCwgeXl5eSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnaDptbTpzcyBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfU0lNUExFKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnSEg6bW06c3MnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuICdISDptbSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiAnTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTCk6XG4gICAgICByZXR1cm4gJ0xMTEwgZCwgeXl5eSwgaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW06c3MgYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuLy8gdGhlc2UgYXJlbid0IHJlYWxseSBwcml2YXRlLCBidXQgbm9yIGFyZSB0aGV5IHJlYWxseSB1c2VmdWwgdG8gZG9jdW1lbnRcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgTHV4b25FcnJvciA9IGZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgaW5oZXJpdHMoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEx1eG9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBMdXhvbkVycm9yO1xufShFcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbnZhciBJbnZhbGlkRGF0ZVRpbWVFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcikge1xuICBpbmhlcml0cyhJbnZhbGlkRGF0ZVRpbWVFcnJvciwgX0x1eG9uRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREYXRlVGltZUVycm9yKHJlYXNvbikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEludmFsaWREYXRlVGltZUVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvci5jYWxsKHRoaXMsICdJbnZhbGlkIERhdGVUaW1lOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZERhdGVUaW1lRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjIpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEludGVydmFsRXJyb3IsIF9MdXhvbkVycm9yMik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEludGVydmFsRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEludGVydmFsRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMi5jYWxsKHRoaXMsICdJbnZhbGlkIEludGVydmFsOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEludGVydmFsRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkRHVyYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgaW5oZXJpdHMoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZER1cmF0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsICdJbnZhbGlkIER1cmF0aW9uOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjQpIHtcbiAgaW5oZXJpdHMoQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IsIF9MdXhvbkVycm9yNCk7XG5cbiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWRVbml0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I1KSB7XG4gIGluaGVyaXRzKEludmFsaWRVbml0RXJyb3IsIF9MdXhvbkVycm9yNSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFVuaXRFcnJvcih1bml0KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFVuaXRFcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgJ0ludmFsaWQgdW5pdCAnICsgdW5pdCkpO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkQXJndW1lbnRFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjYpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEFyZ3VtZW50RXJyb3IsIF9MdXhvbkVycm9yNik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEFyZ3VtZW50RXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEFyZ3VtZW50RXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIFpvbmVJc0Fic3RyYWN0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I3KSB7XG4gIGluaGVyaXRzKFpvbmVJc0Fic3RyYWN0RXJyb3IsIF9MdXhvbkVycm9yNyk7XG5cbiAgZnVuY3Rpb24gWm9uZUlzQWJzdHJhY3RFcnJvcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBab25lSXNBYnN0cmFjdEVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCAnWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzcycpKTtcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbi8qKlxuICogQGludGVyZmFjZVxuKi9cblxudmFyIFpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgWm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIG9wdHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBab25lO1xufSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcblxudmFyIExvY2FsWm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYWxab25lKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIExvY2FsWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIF9yZWYpIHtcbiAgICB2YXIgZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuXG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH07XG5cbiAgTG9jYWxab25lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSAnbG9jYWwnO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKExvY2FsWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnbG9jYWwnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAgIH0gZWxzZSByZXR1cm4gJ2xvY2FsJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdpbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaW5nbGV0b247XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbFpvbmU7XG59KFpvbmUpO1xuXG52YXIgZHRmQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7XG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgdGltZVpvbmU6IHpvbmUsXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGR0ZkNhY2hlW3pvbmVdO1xufVxuXG52YXIgdHlwZVRvUG9zID0ge1xuICB5ZWFyOiAwLFxuICBtb250aDogMSxcbiAgZGF5OiAyLFxuICBob3VyOiAzLFxuICBtaW51dGU6IDQsXG4gIHNlY29uZDogNVxufTtcblxuZnVuY3Rpb24gaGFja3lPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0KGRhdGUpLnJlcGxhY2UoL1xcdTIwMEUvZywgJycpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuXG4gIHJldHVybiBbZlllYXIsIGZNb250aCwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmRdO1xufVxuXG5mdW5jdGlvbiBwYXJ0c09mZnNldChkdGYsIGRhdGUpIHtcbiAgdmFyIGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXRUb1BhcnRzKGRhdGUpLFxuICAgICAgZmlsbGVkID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKElBTkFab25lLCBfWm9uZSk7XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllciA9IGZ1bmN0aW9uIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiBzICYmIHMubWF0Y2goL15bYS16XystXXsxLDI1Nn1cXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8kL2kpO1xuICB9O1xuXG4gIElBTkFab25lLmlzVmFsaWRab25lID0gZnVuY3Rpb24gaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvLyBFdGMvR01UKzggLT4gNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIElBTkFab25lKG5hbWUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJQU5BWm9uZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMuem9uZU5hbWUgPSBuYW1lO1xuICAgIF90aGlzLnZhbGlkID0gSUFOQVpvbmUuaXNWYWxpZFpvbmUobmFtZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcblxuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSwgdGhpcy56b25lTmFtZSk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgICBkdGYgPSBtYWtlRFRGKHRoaXMuem9uZU5hbWUpLFxuICAgICAgICBfcmVmMiA9IGR0Zi5mb3JtYXRUb1BhcnRzID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSksXG4gICAgICAgIGZZZWFyID0gX3JlZjJbMF0sXG4gICAgICAgIGZNb250aCA9IF9yZWYyWzFdLFxuICAgICAgICBmRGF5ID0gX3JlZjJbMl0sXG4gICAgICAgIGZIb3VyID0gX3JlZjJbM10sXG4gICAgICAgIGZNaW51dGUgPSBfcmVmMls0XSxcbiAgICAgICAgZlNlY29uZCA9IF9yZWYyWzVdLFxuICAgICAgICBhc1VUQyA9IERhdGUuVVRDKGZZZWFyLCBmTW9udGggLSAxLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZCk7XG5cbiAgICB2YXIgYXNUUyA9IGRhdGUudmFsdWVPZigpO1xuICAgIGFzVFMgLT0gYXNUUyAlIDEwMDA7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdpYW5hJyAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoSUFOQVpvbmUsIFt7XG4gICAga2V5OiAndHlwZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gJ2lhbmEnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5pdmVyc2FsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gSUFOQVpvbmU7XG59KFpvbmUpO1xuXG52YXIgc2luZ2xldG9uJDEgPSBudWxsO1xuXG5mdW5jdGlvbiBob3Vyc01pbnV0ZXNPZmZzZXQoeikge1xuICB2YXIgaG91cnMgPSBNYXRoLnRydW5jKHouZml4ZWQgLyA2MCksXG4gICAgICBtaW51dGVzID0gTWF0aC5hYnMoei5maXhlZCAlIDYwKSxcbiAgICAgIHNpZ24gPSBob3VycyA+IDAgPyAnKycgOiAnLScsXG4gICAgICBiYXNlID0gc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcbiAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArICc6JyArIHBhZFN0YXJ0KG1pbnV0ZXMsIDIpIDogYmFzZTtcbn1cblxudmFyIEZpeGVkT2Zmc2V0Wm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhGaXhlZE9mZnNldFpvbmUsIF9ab25lKTtcblxuICBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UgPSBmdW5jdGlvbiBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllciA9IGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKHMpIHtcbiAgICBpZiAocykge1xuICAgICAgdmFyIHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWRPZmZzZXRab25lKHNpZ25lZE9mZnNldChyWzFdLCByWzJdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgbnVsbCwgW3tcbiAgICBrZXk6ICd1dGNJbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpbmdsZXRvbiQxO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGaXhlZE9mZnNldFpvbmUpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdmaXhlZCcgJiYgb3RoZXJab25lLmZpeGVkID09PSB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyAnVVRDJyA6ICdVVEMnICsgaG91cnNNaW51dGVzT2Zmc2V0KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRml4ZWRPZmZzZXRab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQyID0gbnVsbDtcblxudmFyIEludmFsaWRab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKEludmFsaWRab25lLCBfWm9uZSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFpvbmUpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSW52YWxpZFpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIEludmFsaWRab25lLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfTtcblxuICBJbnZhbGlkWm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnaW52YWxpZCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAnaW5zdGFuY2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiQyID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiQyID0gbmV3IEludmFsaWRab25lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uJDI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnZhbGlkWm9uZTtcbn0oWm9uZSk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0ID0gdm9pZCAwO1xuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICB2YXIgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09ICdsb2NhbCcpIHJldHVybiBMb2NhbFpvbmUuaW5zdGFuY2U7ZWxzZSBpZiAobG93ZXJlZCA9PT0gJ3V0YycgfHwgbG93ZXJlZCA9PT0gJ2dtdCcpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gbmV3IElBTkFab25lKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShpbnB1dCk7XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoaW5wdXQpKSA9PT0gJ29iamVjdCcgJiYgaW5wdXQub2Zmc2V0KSB7XG4gICAgLy8gVGhpcyBpcyBkdW1iLCBidXQgdGhlIGluc3RhbmNlb2YgY2hlY2sgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHJlYWxseSB3b3JrXG4gICAgLy8gc28gd2UncmUgZHVjayBjaGVja2luZyBpdFxuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuXG4vKipcclxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cclxuICovXG5cbnZhciBTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2V0dGluZ3MoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXHJcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXHJcbiAgICogQHJldHVybiB7dm9pZH1cclxuICAgKi9cbiAgU2V0dGluZ3MucmVzZXRDYWNoZXMgPSBmdW5jdGlvbiByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogJ25vdycsXG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBub3c7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRab25lTmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoeikge1xuICAgICAgaWYgKCF6KSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbm9ybWFsaXplWm9uZSh6KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgb2JqZWN0IHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7Wm9uZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0Wm9uZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFpvbmUgfHwgTG9jYWxab25lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRMb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobG9jYWxlKSB7XG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0TnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVmYXVsdE91dHB1dENhbGVuZGFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgTHV4b24gd2lsbCB0aHJvdyB3aGVuIGl0IGVuY291bnRlcnMgaW52YWxpZCBEYXRlVGltZXMsIER1cmF0aW9ucywgb3IgSW50ZXJ2YWxzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0aHJvd09uSW52YWxpZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhyb3dPbkludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKHQpIHtcbiAgICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNldHRpbmdzO1xufSgpO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIHZhciBzID0gJyc7XG4gIGZvciAodmFyIF9pdGVyYXRvciA9IHNwbGl0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbiA9IF9yZWY7XG5cbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxudmFyIHRva2VuVG9PYmplY3QgPSB7XG4gIEQ6IERBVEVfU0hPUlQsXG4gIEREOiBEQVRFX01FRCxcbiAgREREOiBEQVRFX0ZVTEwsXG4gIEREREQ6IERBVEVfSFVHRSxcbiAgdDogVElNRV9TSU1QTEUsXG4gIHR0OiBUSU1FX1dJVEhfU0VDT05EUyxcbiAgdHR0OiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VULFxuICB0dHR0OiBUSU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IFRJTUVfMjRfU0lNUExFLFxuICBUVDogVElNRV8yNF9XSVRIX1NFQ09ORFMsXG4gIFRUVDogVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VULFxuICBmOiBEQVRFVElNRV9TSE9SVCxcbiAgZmY6IERBVEVUSU1FX01FRCxcbiAgZmZmOiBEQVRFVElNRV9GVUxMLFxuICBmZmZmOiBEQVRFVElNRV9IVUdFLFxuICBGOiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTLFxuICBGRkY6IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTLFxuICBGRkZGOiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EU1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIEZvcm1hdHRlci5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUobG9jYWxlKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGZvcm1hdE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB7IHJvdW5kOiB0cnVlIH0sIG9wdHMpO1xuICAgIHJldHVybiBuZXcgRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnBhcnNlRm9ybWF0ID0gZnVuY3Rpb24gcGFyc2VGb3JtYXQoZm10KSB7XG4gICAgdmFyIGN1cnJlbnQgPSBudWxsLFxuICAgICAgICBjdXJyZW50RnVsbCA9ICcnLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gZm10LmNoYXJBdChpKTtcbiAgICAgIGlmIChjID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjdXJyZW50RnVsbCA9ICcnO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH07XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlcik7XG5cbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQgPSBmdW5jdGlvbiBmb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgb3B0cykge1xuICAgIGlmICh0aGlzLnN5c3RlbUxvYyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zeXN0ZW1Mb2MgPSB0aGlzLmxvYy5yZWRlZmF1bHRUb1N5c3RlbSgpO1xuICAgIH1cbiAgICB2YXIgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0VG9QYXJ0cygpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLm51bSA9IGZ1bmN0aW9uIG51bShuKSB7XG4gICAgdmFyIHAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgICAvLyB3ZSBnZXQgc29tZSBwZXJmIG91dCBvZiBkb2luZyB0aGlzIGhlcmUsIGFubm95aW5nbHlcbiAgICBpZiAodGhpcy5vcHRzLmZvcmNlU2ltcGxlKSB7XG4gICAgICByZXR1cm4gcGFkU3RhcnQobiwgcCk7XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgaWYgKHAgPiAwKSB7XG4gICAgICBvcHRzLnBhZFRvID0gcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2MubnVtYmVyRm9ybWF0dGVyKG9wdHMpLmZvcm1hdChuKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSAnZW4nO1xuICAgIHZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob3B0cywgZXh0cmFjdCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvYy5leHRyYWN0KGR0LCBvcHRzLCBleHRyYWN0KTtcbiAgICB9LFxuICAgICAgICBmb3JtYXRPZmZzZXQgPSBmdW5jdGlvbiBmb3JtYXRPZmZzZXQob3B0cykge1xuICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgIHJldHVybiAnWic7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyAnKycgOiAnLScsXG4gICAgICAgICAgYmFzZSA9ICcnICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlICdzaG9ydCc6XG4gICAgICAgICAgcmV0dXJuICcnICsgc2lnbiArIF90aGlzLm51bShNYXRoLmFicyhob3VycyksIDIpICsgJzonICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuICAgICAgICBjYXNlICduYXJyb3cnOlxuICAgICAgICAgIHJldHVybiBtaW51dGVzID4gMCA/IGJhc2UgKyAnOicgKyBtaW51dGVzIDogYmFzZTtcbiAgICAgICAgY2FzZSAndGVjaGllJzpcbiAgICAgICAgICByZXR1cm4gJycgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1ZhbHVlIGZvcm1hdCAnICsgb3B0cy5mb3JtYXQgKyAnIGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7IGhvdXI6ICdudW1lcmljJywgaG91cjEyOiB0cnVlIH0sICdkYXlwZXJpb2QnKTtcbiAgICB9LFxuICAgICAgICBtb250aCA9IGZ1bmN0aW9uIG1vbnRoKGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgbW9udGg6IGxlbmd0aCB9IDogeyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKTtcbiAgICB9LFxuICAgICAgICB3ZWVrZGF5ID0gZnVuY3Rpb24gd2Vla2RheShsZW5ndGgsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgd2Vla2RheTogbGVuZ3RoIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCwgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSwgJ3dlZWtkYXknKTtcbiAgICB9LFxuICAgICAgICBtYXliZU1hY3JvID0gZnVuY3Rpb24gbWF5YmVNYWNybyh0b2tlbikge1xuICAgICAgdmFyIG1hY3JvID0gdG9rZW5Ub09iamVjdFt0b2tlbl07XG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHsgZXJhOiBsZW5ndGggfSwgJ2VyYScpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyO1xuXG4gICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAvLyBtc1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kKTtcbiAgICAgICAgY2FzZSAndSc6XG4gICAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCk7XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCwgMik7XG4gICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAvLyBob3Vyc1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyKTtcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIpO1xuICAgICAgICBjYXNlICdISCc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyLCAyKTtcbiAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiAnbmFycm93JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlonOlxuICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3Nob3J0JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlpaJzpcbiAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3RlY2hpZScsIGFsbG93WjogZmFsc2UgfSk7XG4gICAgICAgIGNhc2UgJ1paWlonOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcbiAgICAgICAgY2FzZSAnWlpaWlonOlxuICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVMb25nO1xuICAgICAgICAvLyB6b25lXG4gICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgIHJldHVybiBkdC56b25lTmFtZTtcbiAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnbnVtZXJpYycgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSk7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnMi1kaWdpdCcgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ2xvbmcnLCB0cnVlKTtcbiAgICAgICAgY2FzZSAnY2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ25hcnJvdycsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuICAgICAgICBjYXNlICdFJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdFRUUnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KCdsb25nJywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnbmFycm93JywgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG4gICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCk7XG4gICAgICAgIGNhc2UgJ0xMJzpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJzItZGlnaXQnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgIHJldHVybiBtb250aCgnbG9uZycsIHRydWUpO1xuICAgICAgICBjYXNlICdMTExMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKCduYXJyb3cnLCB0cnVlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gZm9ybWF0XG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgbW9udGg6ICcyLWRpZ2l0JyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdNTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ2xvbmcnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ25hcnJvdycsIGZhbHNlKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyB5ZWFyOiAnMi1kaWdpdCcgfSwgJ3llYXInKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgICAgLy8gbGlrZSAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDQpO1xuICAgICAgICBjYXNlICd5eXl5eXknOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAvLyBlcmFzXG4gICAgICAgIGNhc2UgJ0cnOlxuICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICByZXR1cm4gZXJhKCdzaG9ydCcpO1xuICAgICAgICBjYXNlICdHRyc6XG4gICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgIHJldHVybiBlcmEoJ2xvbmcnKTtcbiAgICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICAgIHJldHVybiBlcmEoJ25hcnJvdycpO1xuICAgICAgICBjYXNlICdrayc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgIGNhc2UgJ2tra2snOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcbiAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcbiAgICAgICAgY2FzZSAnb29vJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICBjYXNlICdxJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnF1YXJ0ZXIpO1xuICAgICAgICBjYXNlICdxcSc6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG1heWJlTWFjcm8odG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICByZXR1cm4gJ21pbnV0ZSc7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIHJldHVybiAnaG91cic7XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5udW0obGlsZHVyLmdldChtYXBwZWQpLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgICAgcmVhbFRva2VucyA9IHRva2Vucy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBfcmVmMikge1xuICAgICAgdmFyIGxpdGVyYWwgPSBfcmVmMi5saXRlcmFsLFxuICAgICAgICAgIHZhbCA9IF9yZWYyLnZhbDtcbiAgICAgIHJldHVybiBsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKTtcbiAgICB9LCBbXSksXG4gICAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvLmFwcGx5KGR1ciwgcmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuZnVuY3Rpb24gc3lzdGVtTG9jYWxlKCkge1xuICBpZiAoc3lzTG9jYWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSBpZiAoaGFzSW50bCgpKSB7XG4gICAgdmFyIGNvbXB1dGVkU3lzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuICAgIHN5c0xvY2FsZUNhY2hlID0gY29tcHV0ZWRTeXMgPT09ICd1bmQnID8gJ2VuLVVTJyA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9ICdlbi1VUyc7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGxDb25maWdTdHJpbmcobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKSB7XG4gIGlmIChoYXNJbnRsKCkpIHtcbiAgICBsb2NhbGUgPSBBcnJheS5pc0FycmF5KGxvY2FsZSkgPyBsb2NhbGUgOiBbbG9jYWxlXTtcblxuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZSA9IGxvY2FsZS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgbCArPSAnLXUnO1xuXG4gICAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICAgIGwgKz0gJy1jYS0nICsgb3V0cHV0Q2FsZW5kYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgICAgbCArPSAnLW51LScgKyBudW1iZXJpbmdTeXN0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgdmFyIG1zID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzICsgaSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gJ2Vycm9yJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09ICdlbicpIHtcbiAgICByZXR1cm4gZW5nbGlzaEZuKGxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGludGxGbihsZW5ndGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRmFzdE51bWJlcnMobG9jKSB7XG4gIGlmIChsb2MubnVtYmVyaW5nU3lzdGVtICYmIGxvYy5udW1iZXJpbmdTeXN0ZW0gIT09ICdsYXRuJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gJ2xhdG4nIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aCgnZW4nKSB8fCBoYXNJbnRsKCkgJiYgSW50bC5EYXRlVGltZUZvcm1hdChsb2MuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubnVtYmVyaW5nU3lzdGVtID09PSAnbGF0bic7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIob3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNpbXBsZU51bWJlckZvcm1hdHRlcik7XG5cbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMucm91bmQgPSBvcHRzLnJvdW5kIHx8IGZhbHNlO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgU2ltcGxlTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoaSkge1xuICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiByb3VuZFRvKGksIHRoaXMucm91bmQgPyAwIDogMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW50bE51bWJlckZvcm1hdHRlcihpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50bE51bWJlckZvcm1hdHRlcik7XG5cbiAgICB2YXIgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSB9O1xuXG4gICAgaWYgKG9wdHMucGFkVG8gPiAwKSB7XG4gICAgICBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucm91bmQpIHtcbiAgICAgIGludGxPcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5mbG9vciA9IG9wdHMuZmxvb3I7XG4gICAgdGhpcy5pbnRsID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGludGwsIGludGxPcHRzKTtcbiAgfVxuXG4gIEludGxOdW1iZXJGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmludGwuZm9ybWF0KGZpeGVkKTtcbiAgfTtcblxuICByZXR1cm4gSW50bE51bWJlckZvcm1hdHRlcjtcbn0oKTtcblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgUG9seURhdGVGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seURhdGVGb3JtYXR0ZXIpO1xuXG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG5cbiAgICB2YXIgeiA9IHZvaWQgMDtcbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSAnVVRDJztcbiAgICAgIGlmIChvcHRzLnRpbWVab25lTmFtZSkge1xuICAgICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmR0ID0gZHQub2Zmc2V0ID09PSAwID8gZHQgOiBEYXRlVGltZS5mcm9tTWlsbGlzKGR0LnRzICsgZHQub2Zmc2V0ICogNjAgKiAxMDAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGR0LnpvbmUudHlwZSA9PT0gJ2xvY2FsJykge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciByZWFsSW50bE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuICAgICAgaWYgKHopIHtcbiAgICAgICAgcmVhbEludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoaW50bCwgcmVhbEludGxPcHRzKTtcbiAgICB9XG4gIH1cblxuICBQb2x5RGF0ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZSgnZW4tVVMnKTtcbiAgICAgIHJldHVybiBGb3JtYXR0ZXIuY3JlYXRlKGxvYykuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMuZHQsIHRva2VuRm9ybWF0KTtcbiAgICB9XG4gIH07XG5cbiAgUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIFBvbHlEYXRlRm9ybWF0dGVyLnByb3RvdHlwZS5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlZE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6ICdlbi1VUycsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogJ2xhdG4nLFxuICAgICAgICBvdXRwdXRDYWxlbmRhcjogJ2dyZWdvcnknXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9seURhdGVGb3JtYXR0ZXI7XG59KCk7XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgTG9jYWxlLmZyb21PcHRzID0gZnVuY3Rpb24gZnJvbU9wdHMob3B0cykge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKG9wdHMubG9jYWxlLCBvcHRzLm51bWJlcmluZ1N5c3RlbSwgb3B0cy5vdXRwdXRDYWxlbmRhciwgb3B0cy5kZWZhdWx0VG9FTik7XG4gIH07XG5cbiAgTG9jYWxlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgICB2YXIgZGVmYXVsdFRvRU4gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgdmFyIHNwZWNpZmllZExvY2FsZSA9IGxvY2FsZSB8fCBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlLFxuXG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/ICdlbi1VUycgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICB9O1xuXG4gIExvY2FsZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdCgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBMb2NhbGUobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmc7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIHRoaXMuaW50bCA9IGludGxDb25maWdTdHJpbmcodGhpcy5sb2NhbGUsIHRoaXMubnVtYmVyaW5nU3lzdGVtLCB0aGlzLm91dHB1dENhbGVuZGFyKTtcblxuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHsgZm9ybWF0OiB7fSwgc3RhbmRhbG9uZToge30gfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IG51bGw7XG4gICAgdGhpcy5lcmFDYWNoZSA9IHt9O1xuXG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICAvLyB0b2RvOiBjYWNoZSBtZVxuICBMb2NhbGUucHJvdG90eXBlLmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoKSB7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09ICdlbicgfHwgdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKSA9PT0gJ2VuLXVzJyB8fCBpbnRsICYmIEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgnZW4tdXMnKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09ICdsYXRuJykgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gJ2dyZWdvcnknKTtcblxuICAgIGlmICghaGFzRlRQICYmICEoaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSAmJiAhZGVmYXVsdE9LKSB7XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gJ2VuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdpbnRsJztcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKGFsdHMpIHtcbiAgICBpZiAoIWFsdHMgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIExvY2FsZS5jcmVhdGUoYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLCBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLnJlZGVmYXVsdFRvRU4gPSBmdW5jdGlvbiByZWRlZmF1bHRUb0VOKCkge1xuICAgIHZhciBhbHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHsgZGVmYXVsdFRvRU46IHRydWUgfSkpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbSgpIHtcbiAgICB2YXIgYWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7IGRlZmF1bHRUb0VOOiBmYWxzZSB9KSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tb250aHMgPSBmdW5jdGlvbiBtb250aHMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBkZWZhdWx0T0sgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBtb250aHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8geyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9IDogeyBtb250aDogbGVuZ3RoIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSc7XG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsICdtb250aCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzJCQxKGxlbmd0aCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIHdlZWtkYXlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IGZvcm1hdCA/IHsgd2Vla2RheTogbGVuZ3RoLCB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnO1xuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCAnd2Vla2RheScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMkJDEoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCB1bmRlZmluZWQsIGRlZmF1bHRPSywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lcmlkaWVtcztcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgY291bGQgYmUgYXJpYml0cmFyeSBkYXkgcGVyaW9kcy4gV2UncmUgZ29ubmEgYXNzdW1lIHRoZXJlIGFyZSBleGFjdGx5IHR3b1xuICAgICAgLy8gZm9yIEFNIGFuZCBQTS4gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYnV0IGl0J3MgbWFrZXMgcGFyc2luZyB3YXkgZWFzaWVyLlxuICAgICAgaWYgKCFfdGhpczMubWVyaWRpZW1DYWNoZSkge1xuICAgICAgICB2YXIgaW50bCA9IHsgaG91cjogJ251bWVyaWMnLCBob3VyMTI6IHRydWUgfTtcbiAgICAgICAgX3RoaXMzLm1lcmlkaWVtQ2FjaGUgPSBbRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgOSksIERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDE5KV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuZXh0cmFjdChkdCwgaW50bCwgJ2RheXBlcmlvZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgZXJhcywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSB7IGVyYTogbGVuZ3RoIH07XG5cbiAgICAgIC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cbiAgICAgIGlmICghX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0gPSBbRGF0ZVRpbWUudXRjKC00MCwgMSwgMSksIERhdGVUaW1lLnV0YygyMDE3LCAxLCAxKV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczQuZXh0cmFjdChkdCwgaW50bCwgJ2VyYScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzNC5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoZHQsIGludGxPcHRzLCBmaWVsZCkge1xuICAgIHZhciBkZiA9IHRoaXMuZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSxcbiAgICAgICAgcmVzdWx0cyA9IGRmLmZvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZmllbGQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmcgPyBtYXRjaGluZy52YWx1ZSA6IG51bGw7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5udW1iZXJGb3JtYXR0ZXIgPSBmdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXIoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgLy8gdGhpcyBmb3JjZXNpbXBsZSBvcHRpb24gaXMgbmV2ZXIgdXNlZCAodGhlIG9ubHkgY2FsbGVyIHNob3J0LWNpcmN1aXRzIG9uIGl0LCBidXQgaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUpXG4gICAgLy8gKGluIGNvbnRyYXN0LCB0aGUgcmVzdCBvZiB0aGUgY29uZGl0aW9uIGlzIHVzZWQgaGVhdmlseSlcbiAgICBpZiAob3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzIHx8ICFoYXNJbnRsKCkpIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGxOdW1iZXJGb3JtYXR0ZXIodGhpcy5pbnRsLCBvcHRzKTtcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5kdEZvcm1hdHRlciA9IGZ1bmN0aW9uIGR0Rm9ybWF0dGVyKGR0KSB7XG4gICAgdmFyIGludGxPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgUG9seURhdGVGb3JtYXR0ZXIoZHQsIHRoaXMuaW50bCwgaW50bE9wdHMpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlID09PSBvdGhlci5sb2NhbGUgJiYgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJiB0aGlzLm91dHB1dENhbGVuZGFyID09PSBvdGhlci5vdXRwdXRDYWxlbmRhcjtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhMb2NhbGUsIFt7XG4gICAga2V5OiAnZmFzdE51bWJlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXG4gKiBUaGlzIGZpbGUgaGFuZGxlcyBwYXJzaW5nIGZvciB3ZWxsLXNwZWNpZmllZCBmb3JtYXRzLiBIZXJlJ3MgaG93IGl0IHdvcmtzOlxuICogVHdvIHRoaW5ncyBnbyBpbnRvIHBhcnNpbmc6IGEgcmVnZXggdG8gbWF0Y2ggd2l0aCBhbmQgYW4gZXh0cmFjdG9yIHRvIHRha2UgYXBhcnQgdGhlIGdyb3VwcyBpbiB0aGUgbWF0Y2guXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XG4gKiBwYXJzZSgpIGRvZXMgdGhlIHdvcmsgb2YgZXhlY3V0aW5nIHRoZSByZWdleCBhbmQgYXBwbHlpbmcgdGhlIGV4dHJhY3Rvci4gSXQgdGFrZXMgbXVsdGlwbGUgcmVnZXgvZXh0cmFjdG9yIHBhaXJzIHRvIHRyeSBpbiBzZXF1ZW5jZS5cbiAqIEV4dHJhY3RvcnMgY2FuIHRha2UgYSBcImN1cnNvclwiIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IGluIHRoZSBtYXRjaCB0byBsb29rIGF0LiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY29tYmluZSBleHRyYWN0b3JzLlxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cbiAqIFNvbWUgZXh0cmFjdGlvbnMgYXJlIHN1cGVyIGR1bWIgYW5kIHNpbXBsZVBhcnNlIGFuZCBmcm9tU3RyaW5ncyBoZWxwIERSWSB0aGVtLlxuICovXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWdleGVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVnZXhlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZ2V4ZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgZnVsbCA9IHJlZ2V4ZXMucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyByLnNvdXJjZTtcbiAgfSwgJycpO1xuICByZXR1cm4gUmVnRXhwKCdeJyArIGZ1bGwgKyAnJCcpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycygpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBleHRyYWN0b3JzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIHBhdHRlcm5zW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gcGF0dGVybnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWYzO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfcmVmMztcbiAgICB2YXIgcmVnZXggPSBfcmVmMlswXTtcbiAgICB2YXIgZXh0cmFjdG9yID0gX3JlZjJbMV07XG5cbiAgICB2YXIgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIGN1cnNvcikge1xuICAgIHZhciByZXQgPSB7fTtcbiAgICB2YXIgaSA9IHZvaWQgMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRba2V5c1tpXV0gPSBwYXJzZUludChtYXRjaFtjdXJzb3IgKyBpXSk7XG4gICAgfVxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn1cblxuLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xudmFyIG9mZnNldFJlZ2V4ID0gLyg/OihaKXwoWystXVxcZFxcZCkoPzo6PyhcXGRcXGQpKT8pLyxcbiAgICBpc29UaW1lQmFzZVJlZ2V4ID0gLyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpbLixdKFxcZHsxLDl9KSk/KT8pPy8sXG4gICAgaXNvVGltZVJlZ2V4ID0gUmVnRXhwKCcnICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyAnPycpLFxuICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cCgnKD86VCcgKyBpc29UaW1lUmVnZXguc291cmNlICsgJyk/JyksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCktPyhcXGQpLyxcbiAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICBleHRyYWN0SVNPV2Vla0RhdGEgPSBzaW1wbGVQYXJzZSgnd2Vla1llYXInLCAnd2Vla051bWJlcicsICd3ZWVrRGF5JyksXG4gICAgZXh0cmFjdElTT09yZGluYWxEYXRhID0gc2ltcGxlUGFyc2UoJ3llYXInLCAnb3JkaW5hbCcpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyAnID8oPzonICsgb2Zmc2V0UmVnZXguc291cmNlICsgJ3woW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/JyksXG4gICAgc3FsVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKCcoPzogJyArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyAnKT8nKTtcblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIHllYXI6IHBhcnNlSW50KG1hdGNoW2N1cnNvcl0pLFxuICAgIG1vbnRoOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAxXSkgfHwgMSxcbiAgICBkYXk6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDJdKSB8fCAxXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBsb2NhbCA9ICFtYXRjaFtjdXJzb3JdICYmICFtYXRjaFtjdXJzb3IgKyAxXSxcbiAgICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICAgIHpvbmUgPSBsb2NhbCA/IG51bGwgOiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoZnVsbE9mZnNldCk7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SUFOQVpvbmUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBuZXcgSUFOQVpvbmUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIGR1cmF0aW9uIHBhcnNpbmdcblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KFxcZHsxLDl9KVkpPyg/OihcXGR7MSw5fSlNKT8oPzooXFxkezEsOX0pRCk/KD86VCg/OihcXGR7MSw5fSlIKT8oPzooXFxkezEsOX0pTSk/KD86KFxcZHsxLDl9KSg/OlsuLF0oXFxkezEsOX0pKT9TKT8pP3woXFxkezEsOX0pVykkLztcblxuZnVuY3Rpb24gZXh0cmFjdElTT0R1cmF0aW9uKG1hdGNoKSB7XG4gIHZhciB5ZWFyU3RyID0gbWF0Y2hbMV0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzJdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbM10sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs1XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzZdLFxuICAgICAgbWlsbGlzZWNvbmRzU3RyID0gbWF0Y2hbN10sXG4gICAgICB3ZWVrU3RyID0gbWF0Y2hbOF07XG5cblxuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59XG5cbi8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcbnZhciBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwXG59O1xuXG5mdW5jdGlvbiBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHllYXI6IHllYXJTdHIubGVuZ3RoID09PSAyID8gdW50cnVuY2F0ZVllYXIocGFyc2VJbnQoeWVhclN0cikpIDogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGg6IG1vbnRoU3RyLmxlbmd0aCA9PT0gMiA/IHBhcnNlSW50KG1vbnRoU3RyLCAxMCkgOiBtb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludChkYXlTdHIpLFxuICAgIGhvdXI6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWludXRlU3RyKVxuICB9O1xuXG4gIGlmIChzZWNvbmRTdHIpIHJlc3VsdC5zZWNvbmQgPSBwYXJzZUludChzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID0gd2Vla2RheVN0ci5sZW5ndGggPiAzID8gd2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxIDogd2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpICsgMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJGQyAyODIyLzUzMjJcbnZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIG9ic09mZnNldCA9IG1hdGNoWzhdLFxuICAgICAgbWlsT2Zmc2V0ID0gbWF0Y2hbOV0sXG4gICAgICBvZmZIb3VyU3RyID0gbWF0Y2hbMTBdLFxuICAgICAgb2ZmTWludXRlU3RyID0gbWF0Y2hbMTFdLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuXG5cbiAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS50cmltKCk7XG59XG5cbi8vIGh0dHAgZGF0ZVxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW3JmYzg1MCwgZXh0cmFjdFJGQzExMjNPcjg1MF0sIFthc2NpaSwgZXh0cmFjdEFTQ0lJXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UocywgW2NvbWJpbmVSZWdleGVzKHNxbFltZFJlZ2V4LCBzcWxUaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPWW1kLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0sIFtjb21iaW5lUmVnZXhlcyhzcWxUaW1lUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0pO1xufVxuXG52YXIgSU5WQUxJRCA9ICdJbnZhbGlkIER1cmF0aW9uJyxcbiAgICBVTlBBUlNBQkxFID0gJ3VucGFyc2FibGUnO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICBtaW51dGVzOiB7IHNlY29uZHM6IDYwLCBtaWxsaXNlY29uZHM6IDYwICogMTAwMCB9LFxuICBzZWNvbmRzOiB7IG1pbGxpc2Vjb25kczogMTAwMCB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7XG5cbi8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxudmFyIG9yZGVyZWRVbml0cyA9IFsneWVhcnMnLCAncXVhcnRlcnMnLCAnbW9udGhzJywgJ3dlZWtzJywgJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddO1xuXG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cykge1xuICB2YXIgY2xlYXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIC8vIGRlZXAgbWVyZ2UgZm9yIHZhbHNcbiAgdmFyIGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogT2JqZWN0LmFzc2lnbih7fSwgZHVyLnZhbHVlcywgYWx0cy52YWx1ZXMgfHwge30pLFxuICAgIGxvYzogZHVyLmxvYy5jbG9uZShhbHRzLmxvYyksXG4gICAgY29udmVyc2lvbkFjY3VyYWN5OiBhbHRzLmNvbnZlcnNpb25BY2N1cmFjeSB8fCBkdXIuY29udmVyc2lvbkFjY3VyYWN5XG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbi8vIHNvbWUgZnVuY3Rpb25zIHJlYWxseSBjYXJlIGFib3V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIGR1cmF0aW9uLCBzbyBjb21iaW5lZCB3aXRoXG4vLyBub3JtYWxpemUoKSB0aGlzIHRlbGxzIHVzIHdoZXRoZXIgdGhpcyBkdXJhdGlvbiBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZVxuZnVuY3Rpb24gaXNIaWdoT3JkZXJOZWdhdGl2ZShvYmopIHtcbiAgLy8gb25seSBydWxlIGlzIHRoYXQgdGhlIGhpZ2hlc3Qtb3JkZXIgcGFydCBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgayA9IF9yZWY7XG5cbiAgICBpZiAob2JqW2tdKSByZXR1cm4gb2JqW2tdIDwgMDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICB2YXIgY29udiA9IG1hdHJpeFt0b1VuaXRdW2Zyb21Vbml0XSxcbiAgICAgIGFkZGVkID0gTWF0aC5mbG9vcihmcm9tTWFwW2Zyb21Vbml0XSAvIGNvbnYpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbikge1xuICBpZiAoaXNOdW1iZXIoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb24pO1xuICB9IGVsc2UgaWYgKGR1cmF0aW9uIGluc3RhbmNlb2YgRHVyYXRpb24pIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0gZWxzZSBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGR1cmF0aW9uIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGEgRHVyYXRpb24sIHVzZSB7QGxpbmsgRHVyYXRpb24uZnJvbU1pbGxpc30sIHtAbGluayBEdXJhdGlvbi5mcm9tT2JqZWN0fSwgb3Ige0BsaW5rIER1cmF0aW9uLmZyb21JU099LlxyXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayB5ZWFyc30sIHtAbGluayBtb250aHN9LCB7QGxpbmsgd2Vla3N9LCB7QGxpbmsgZGF5c30sIHtAbGluayBob3Vyc30sIHtAbGluayBtaW51dGVzfSwge0BsaW5rIHNlY29uZHN9LCB7QGxpbmsgbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKiBUbyBjcmVhdGUgbmV3IER1cmF0aW9ucyBvdXQgb2Ygb2xkIG9uZXMgdXNlIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIG5vcm1hbGl6ZX0sIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2hpZnRUb30sIGFuZCB7QGxpbmsgbmVnYXRlfS5cclxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIGFzfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0pTT059XHJcbiAqXHJcbiAqIFRoZXJlJ3MgYXJlIG1vcmUgbWV0aG9kcyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdmFsaWRpdHksIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb24oY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRHVyYXRpb24pO1xuXG4gICAgdmFyIGFjY3VyYXRlID0gY29uZmlnLmNvbnZlcnNpb25BY2N1cmFjeSA9PT0gJ2xvbmd0ZXJtJyB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gJ2xvbmd0ZXJtJyA6ICdjYXN1YWwnO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gIH1cblxuICAvKipcclxuICAgKiBDcmVhdGUgRHVyYXRpb24gZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbU1pbGxpcyA9IGZ1bmN0aW9uIGZyb21NaWxsaXMoY291bnQsIG9wdHMpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFycycgYW5kICdob3Vycy4gXHJcbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiB6ZXJvICBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmouY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0R1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICB2YWx1ZXM6IG5vcm1hbGl6ZU9iamVjdChvYmosIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvYmopLFxuICAgICAgY29udmVyc2lvbkFjY3VyYWN5OiBvYmouY29udmVyc2lvbkFjY3VyYWN5XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChVTlBBUlNBQkxFKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHJlYXNvbiB0aGlzIGlzIGludmFsaWRcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRHVyYXRpb25FcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIHZhciBpZ25vcmVVbmtub3duID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIHZhciBub3JtYWxpemVkID0ge1xuICAgICAgeWVhcjogJ3llYXJzJyxcbiAgICAgIHllYXJzOiAneWVhcnMnLFxuICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXJzJyxcbiAgICAgIHF1YXJ0ZXJzOiAncXVhcnRlcnMnLFxuICAgICAgbW9udGg6ICdtb250aHMnLFxuICAgICAgbW9udGhzOiAnbW9udGhzJyxcbiAgICAgIHdlZWs6ICd3ZWVrcycsXG4gICAgICB3ZWVrczogJ3dlZWtzJyxcbiAgICAgIGRheTogJ2RheXMnLFxuICAgICAgZGF5czogJ2RheXMnLFxuICAgICAgaG91cjogJ2hvdXJzJyxcbiAgICAgIGhvdXJzOiAnaG91cnMnLFxuICAgICAgbWludXRlOiAnbWludXRlcycsXG4gICAgICBtaW51dGVzOiAnbWludXRlcycsXG4gICAgICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgICAgIHNlY29uZHM6ICdzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcydcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsb29yPXRydWVdIC0gZmxvb3IgbnVtZXJpY2FsIHZhbHVlc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgLy8gcmV2ZXJzZS1jb21wYXQgc2luY2UgMS4yOyB3ZSBhbHdheXMgcm91bmQgZG93biBub3csIG5ldmVyIHVwLCBhbmQgd2UgZG8gaXQgYnkgZGVmYXVsdC4gU286XG4gICAgLy8gMS4gYWx3YXlzIHR1cm4gb2ZmIHJvdW5kaW5nIGluIHRoZSB1bmRlcmx5aW5nIGZvcm1hdHRlclxuICAgIC8vIDIuIHR1cm4gb2ZmIGZsb29yaW5nIGlmIGVpdGhlciByb3VuZGluZyBpcyB0dXJuZWQgb2ZmIG9yIGZsb29yaW5nIGlzIHR1cm5lZCBvZmYsIG90aGVyd2lzZSBsZWF2ZSBpdCBvblxuICAgIHZhciBmbXRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBmbG9vcjogdHJ1ZSwgcm91bmQ6IGZhbHNlIH0pO1xuICAgIGlmIChvcHRzLnJvdW5kID09PSBmYWxzZSB8fCBvcHRzLmZsb29yID09PSBmYWxzZSkge1xuICAgICAgZm10T3B0cy5mbG9vciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnZhbHVlcyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLmNvbnZlcnNpb25BY2N1cmFjeSA9IHRoaXMuY29udmVyc2lvbkFjY3VyYWN5O1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA0LCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1A0TVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNSB9KS50b0lTTygpIC8vPT4gJ1A1TSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbGxpc2Vjb25kczogNiB9KS50b0lTTygpIC8vPT4gJ1BUMC4wMDZTJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIC8vIHdlIGNvdWxkIHVzZSB0aGUgZm9ybWF0dGVyLCBidXQgdGhpcyBpcyBhbiBlYXNpZXIgd2F5IHRvIGdldCB0aGUgbWluaW11bSBzdHJpbmdcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcyA9ICdQJyxcbiAgICAgICAgbm9ybSA9IHRoaXMubm9ybWFsaXplKCk7XG5cbiAgICAvLyBJU08gZHVyYXRpb25zIGFyZSBhbHdheXMgcG9zaXRpdmUsIHNvIHRha2UgdGhlIGFic29sdXRlIHZhbHVlXG4gICAgbm9ybSA9IGlzSGlnaE9yZGVyTmVnYXRpdmUobm9ybS52YWx1ZXMpID8gbm9ybS5uZWdhdGUoKSA6IG5vcm07XG5cbiAgICBpZiAobm9ybS55ZWFycyA+IDApIHMgKz0gbm9ybS55ZWFycyArICdZJztcbiAgICBpZiAobm9ybS5tb250aHMgPiAwIHx8IG5vcm0ucXVhcnRlcnMgPiAwKSBzICs9IG5vcm0ubW9udGhzICsgbm9ybS5xdWFydGVycyAqIDMgKyAnTSc7XG4gICAgaWYgKG5vcm0uZGF5cyA+IDAgfHwgbm9ybS53ZWVrcyA+IDApIHMgKz0gbm9ybS5kYXlzICsgbm9ybS53ZWVrcyAqIDcgKyAnRCc7XG4gICAgaWYgKG5vcm0uaG91cnMgPiAwIHx8IG5vcm0ubWludXRlcyA+IDAgfHwgbm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gJ1QnO1xuICAgIGlmIChub3JtLmhvdXJzID4gMCkgcyArPSBub3JtLmhvdXJzICsgJ0gnO1xuICAgIGlmIChub3JtLm1pbnV0ZXMgPiAwKSBzICs9IG5vcm0ubWludXRlcyArICdNJztcbiAgICBpZiAobm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gbm9ybS5zZWNvbmRzICsgbm9ybS5taWxsaXNlY29uZHMgLyAxMDAwICsgJ1MnO1xuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLmFzKCdtaWxsaXNlY29uZHMnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHRoZSBSRVBMLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICB2YXIgdmFsc0luc3BlY3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0KCkpO1xuICAgICAgcmV0dXJuICdEdXJhdGlvbiB7XFxuICB2YWx1ZXM6ICcgKyB2YWxzSW5zcGVjdCArICcsXFxuICBsb2NhbGU6ICcgKyB0aGlzLmxvY2FsZSArICcsXFxuICBjb252ZXJzaW9uQWNjdXJhY3k6ICcgKyB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSArICcgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICcgKyB0aGlzLmludmFsaWRSZWFzb24gKyAnIH0nO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IG9yZGVyZWRVbml0cywgX2lzQXJyYXkyID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IyKSwgX2kyID0gMCwgX2l0ZXJhdG9yMiA9IF9pc0FycmF5MiA/IF9pdGVyYXRvcjIgOiBfaXRlcmF0b3IyW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjI7XG5cbiAgICAgIGlmIChfaXNBcnJheTIpIHtcbiAgICAgICAgaWYgKF9pMiA+PSBfaXRlcmF0b3IyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yMltfaTIrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTIgPSBfaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgaWYgKF9pMi5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjIgPSBfaTIudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrID0gX3JlZjI7XG5cbiAgICAgIHZhciB2YWwgPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICBpZiAodmFsICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5wbHVzKGR1ci5uZWdhdGUoKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLnllYXJzIC8vPT4gMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkubW9udGhzIC8vPT4gMFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZGF5cyAvLz0+IDNcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0JCQxKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG1peGVkIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIGR1ci5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNvbnZlcnNpb25BY2N1cmFjeSA9IF9yZWYzLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSB9KSxcbiAgICAgICAgb3B0cyA9IHsgbG9jOiBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ2RheXMnKSAvLz0+IDM2NVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLmFzID0gZnVuY3Rpb24gYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBuZWcgPSBpc0hpZ2hPcmRlck5lZ2F0aXZlKHRoaXMudmFsdWVzKSxcbiAgICAgICAgdmFscyA9IChuZWcgPyB0aGlzLm5lZ2F0ZSgpIDogdGhpcykudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICAgIHJldHVybiBuZWcgPyBkdXIubmVnYXRlKCkgOiBkdXI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIER1cmF0aW9uIGludG8gaXRzIHJlcHJlc2VudGF0aW9uIGluIGEgZGlmZmVyZW50IHNldCBvZiB1bml0cy5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnNoaWZ0VG8gPSBmdW5jdGlvbiBzaGlmdFRvKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB1bml0cyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuXG4gICAgdmFyIGJ1aWx0ID0ge30sXG4gICAgICAgIGFjY3VtdWxhdGVkID0ge30sXG4gICAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgdmFyIGxhc3RVbml0ID0gdm9pZCAwO1xuXG4gICAgbm9ybWFsaXplVmFsdWVzKHRoaXMubWF0cml4LCB2YWxzKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5MyA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMyksIF9pMyA9IDAsIF9pdGVyYXRvcjMgPSBfaXNBcnJheTMgPyBfaXRlcmF0b3IzIDogX2l0ZXJhdG9yM1tTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY0O1xuXG4gICAgICBpZiAoX2lzQXJyYXkzKSB7XG4gICAgICAgIGlmIChfaTMgPj0gX2l0ZXJhdG9yMy5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNCA9IF9pdGVyYXRvcjNbX2kzKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kzID0gX2l0ZXJhdG9yMy5uZXh0KCk7XG4gICAgICAgIGlmIChfaTMuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY0ID0gX2kzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY0O1xuXG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcblxuICAgICAgICB2YXIgb3duID0gMDtcblxuICAgICAgICAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gTWF0aC50cnVuYyhvd24pO1xuICAgICAgICBidWlsdFtrXSA9IGk7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gb3duIC0gaTtcblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gdGhhdCBzaG91bGQgYmUgcm9sbGVkIHVwIGluIHRvIHRoaXNcbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgaWYgKGxhc3RVbml0KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgaWYgKGFjY3VtdWxhdGVkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSA+IDApIHtcbiAgICAgICAgICAgIGJ1aWx0W2xhc3RVbml0XSArPSBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBidWlsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmVnYXRlZCA9IHt9O1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyksIF9pc0FycmF5NCA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yNCksIF9pNCA9IDAsIF9pdGVyYXRvcjQgPSBfaXNBcnJheTQgPyBfaXRlcmF0b3I0IDogX2l0ZXJhdG9yNFtTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY1O1xuXG4gICAgICBpZiAoX2lzQXJyYXk0KSB7XG4gICAgICAgIGlmIChfaTQgPj0gX2l0ZXJhdG9yNC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNSA9IF9pdGVyYXRvcjRbX2k0KytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2k0ID0gX2l0ZXJhdG9yNC5uZXh0KCk7XG4gICAgICAgIGlmIChfaTQuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY1ID0gX2k0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY1O1xuXG4gICAgICBuZWdhdGVkW2tdID0gLXRoaXMudmFsdWVzW2tdO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG5lZ2F0ZWQgfSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB5ZWFycy5cclxuICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogRXF1YWxpdHkgY2hlY2tcclxuICAgKiBUd28gRHVyYXRpb25zIGFyZSBlcXVhbCBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHVuaXRzIGFuZCB0aGUgc2FtZSB2YWx1ZXMgZm9yIGVhY2ggdW5pdC5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIER1cmF0aW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gb3JkZXJlZFVuaXRzLCBfaXNBcnJheTUgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvcjUpLCBfaTUgPSAwLCBfaXRlcmF0b3I1ID0gX2lzQXJyYXk1ID8gX2l0ZXJhdG9yNSA6IF9pdGVyYXRvcjVbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmNjtcblxuICAgICAgaWYgKF9pc0FycmF5NSkge1xuICAgICAgICBpZiAoX2k1ID49IF9pdGVyYXRvcjUubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjYgPSBfaXRlcmF0b3I1W19pNSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pNSA9IF9pdGVyYXRvcjUubmV4dCgpO1xuICAgICAgICBpZiAoX2k1LmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmNiA9IF9pNS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSBfcmVmNjtcblxuICAgICAgaWYgKHRoaXMudmFsdWVzW3VdICE9PSBvdGhlci52YWx1ZXNbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhEdXJhdGlvbiwgW3tcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3llYXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVycy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncXVhcnRlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRocy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2Vla3NcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3MnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheXMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91cnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGVzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGVzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2Vjb25kcycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbWlsbGlzZWNvbmRzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xyXG4gICAgICogb24gaW52YWxpZCBEYXRlVGltZXMgb3IgSW50ZXJ2YWxzLlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ludmFsaWRSZWFzb24nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIER1cmF0aW9uO1xufSgpO1xuXG52YXIgSU5WQUxJRCQxID0gJ0ludmFsaWQgSW50ZXJ2YWwnO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuICEhc3RhcnQgJiYgISFlbmQgJiYgc3RhcnQuaXNWYWxpZCAmJiBlbmQuaXNWYWxpZCAmJiBzdGFydCA8PSBlbmQ7XG59XG5cbi8qKlxyXG4gKiBBbiBJbnRlcnZhbCBvYmplY3QgcmVwcmVzZW50cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBvZiB0aW1lLCB3aGVyZSBlYWNoIGVuZHBvaW50IGlzIGEge0BsaW5rIERhdGVUaW1lfS4gQ29uY2VwdHVhbGx5LCBpdCdzIGEgY29udGFpbmVyIGZvciB0aG9zZSB0d28gZW5kcG9pbnRzLCBhY2NvbXBhbmllZCBieSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgY29tcGFyaW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gSW50ZXJ2YWw6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIGFmdGVyfSwge0BsaW5rIGJlZm9yZX0sIG9yIHtAbGluayBmcm9tSVNPfS5cclxuICogKiAqKkFjY2Vzc29ycyoqIFVzZSB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgZW5kfSB0byBnZXQgdGhlIHN0YXJ0IGFuZCBlbmQuXHJcbiAqICogKipJbnRlcnJvZ2F0aW9uKiogVG8gYW5hbHl6ZSB0aGUgSW50ZXJ2YWwsIHVzZSB7QGxpbmsgY291bnR9LCB7QGxpbmsgbGVuZ3RofSwge0BsaW5rIGhhc1NhbWV9LCB7QGxpbmsgY29udGFpbnN9LCB7QGxpbmsgaXNBZnRlcn0sIG9yIHtAbGluayBpc0JlZm9yZX0uXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayBzcGxpdEF0fSwge0BsaW5rIHNwbGl0Qnl9LCB7QGxpbmsgZGl2aWRlRXF1YWxseX0sIHtAbGluayBtZXJnZX0sIHtAbGluayB4b3J9LCB7QGxpbmsgdW5pb259LCB7QGxpbmsgaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIGRpZmZlcmVuY2V9LlxyXG4gKiAqICoqQ29tcGFyaXNvbioqIFRvIGNvbXBhcmUgdGhpcyBJbnRlcnZhbCB0byBhbm90aGVyIG9uZSwgdXNlIHtAbGluayBlcXVhbHN9LCB7QGxpbmsgb3ZlcmxhcHN9LCB7QGxpbmsgYWJ1dHNTdGFydH0sIHtAbGluayBhYnV0c0VuZH0sIHtAbGluayBlbmd1bGZzfVxyXG4gKiAqICoqT3V0cHV0KioqIFRvIGNvbnZlcnQgdGhlIEludGVydmFsIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS5cclxuICovXG5cbnZhciBJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gSW50ZXJ2YWwoY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJ2YWwpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5lID0gY29uZmlnLmVuZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWRSZWFzb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoeyBpbnZhbGlkUmVhc29uOiByZWFzb24gfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGFuIGVuZCBEYXRlVGltZS4gSW5jbHVzaXZlIG9mIHRoZSBzdGFydCBidXQgbm90IHRoZSBlbmQuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmZyb21EYXRlVGltZXMgPSBmdW5jdGlvbiBmcm9tRGF0ZVRpbWVzKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYnVpbHRTdGFydCA9IGZyaWVuZGx5RGF0ZVRpbWUoc3RhcnQpLFxuICAgICAgICBidWlsdEVuZCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZFJlYXNvbjogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZCkgPyBudWxsIDogJ2ludmFsaWQgZW5kcG9pbnRzJ1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIHRvLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYWZ0ZXIgPSBmdW5jdGlvbiBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gcGFzcyB7QHNlZSBEYXRlVGltZS5mcm9tSVNPfVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08oc3RyaW5nLCBvcHRzKSB7XG4gICAgaWYgKHN0cmluZykge1xuICAgICAgdmFyIF9zdHJpbmckc3BsaXQgPSBzdHJpbmcuc3BsaXQoL1xcLy8pLFxuICAgICAgICAgIHMgPSBfc3RyaW5nJHNwbGl0WzBdLFxuICAgICAgICAgIGUgPSBfc3RyaW5nJHNwbGl0WzFdO1xuXG4gICAgICBpZiAocyAmJiBlKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksIERhdGVUaW1lLmZyb21JU08oZSwgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZCgnaW52YWxpZCBJU08gZm9ybWF0Jyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuICBJbnRlcnZhbC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gbGVuZ3RoKCkge1xuICAgIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbWlsbGlzZWNvbmRzJztcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY291bnQgb2YgbWludXRlcywgaG91cnMsIGRheXMsIG1vbnRocywgb3IgeWVhcnMgaW5jbHVkZWQgaW4gdGhlIEludGVydmFsLCBldmVuIGluIHBhcnQuXHJcbiAgICogVW5saWtlIHtAbGluayBsZW5ndGh9IHRoaXMgY291bnRzIHNlY3Rpb25zIG9mIHRoZSBjYWxlbmRhciwgbm90IHBlcmlvZHMgb2YgdGltZSwgZS5nLiBzcGVjaWZ5aW5nICdkYXknXHJcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3VuaXQ9J21pbGxpc2Vjb25kcyddIC0gdGhlIHVuaXQgb2YgdGltZSB0byBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbiBjb3VudCgpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ21pbGxpc2Vjb25kcyc7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIE5hTjtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICAgIGVuZCA9IHRoaXMuZW5kLnN0YXJ0T2YodW5pdCk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZW5kLmRpZmYoc3RhcnQsIHVuaXQpLmdldCh1bml0KSkgKyAxO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgRGF0ZVRpbWVzLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmlzQWZ0ZXIgPSBmdW5jdGlvbiBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gZGF0ZVRpbWUgJiYgdGhpcy5lID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyB0byBzZXRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCQkMSgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIHN0YXJ0ID0gX3JlZi5zdGFydCxcbiAgICAgICAgZW5kID0gX3JlZi5lbmQ7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQgfHwgdGhpcy5zLCBlbmQgfHwgdGhpcy5lKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBzb3J0ZWQgPSBkYXRlVGltZXMubWFwKGZyaWVuZGx5RGF0ZVRpbWUpLnNvcnQoKSxcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgICBpID0gMDtcblxuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIHZhciBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoJ21pbGxpc2Vjb25kcycpID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGFkZGVkID0gdm9pZCAwLFxuICAgICAgICBuZXh0ID0gdm9pZCAwO1xuXG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzbWFsbGVyIGludGVydmFscy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZQYXJ0cyAtIFRoZSBudW1iZXIgb2YgSW50ZXJ2YWxzIHRvIGRpdmlkZSB0aGUgSW50ZXJ2YWwgaW50by5cclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmRpdmlkZUVxdWFsbHkgPSBmdW5jdGlvbiBkaXZpZGVFcXVhbGx5KG51bWJlck9mUGFydHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLnNwbGl0QnkodGhpcy5sZW5ndGgoKSAvIG51bWJlck9mUGFydHMpLnNsaWNlKDAsIG51bWJlck9mUGFydHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgb3ZlcmxhcHMgd2l0aCB0aGUgc3BlY2lmaWVkIEludGVydmFsXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLm92ZXJsYXBzID0gZnVuY3Rpb24gb3ZlcmxhcHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lID4gb3RoZXIucyAmJiB0aGlzLnMgPCBvdGhlci5lO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBpcyBhZGphY2VudCB0byB0aGUgc3BlY2lmaWVkIEludGVydmFsJ3MgZW5kLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c0VuZCA9IGZ1bmN0aW9uIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmVuZ3VsZnMgPSBmdW5jdGlvbiBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWF4aW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWluaW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgaS5lLiwgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA8IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuXG4gICAgaWYgKHMgPiBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIHVuaW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnVuaW9uID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPCBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgZW5kcyA9IGludGVydmFscy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBbeyB0aW1lOiBpLnMsIHR5cGU6ICdzJyB9LCB7IHRpbWU6IGkuZSwgdHlwZTogJ2UnIH1dO1xuICAgIH0pLFxuICAgICAgICBmbGF0dGVuZWQgPSAoX0FycmF5JHByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSkuY29uY2F0LmFwcGx5KF9BcnJheSRwcm90b3R5cGUsIGVuZHMpLFxuICAgICAgICBhcnIgPSBmbGF0dGVuZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGFyciwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMztcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBfcmVmMztcblxuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gJ3MnID8gMSA6IC0xO1xuXG4gICAgICBpZiAoY3VycmVudENvdW50ID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gaS50aW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0ICYmICtzdGFydCAhPT0gK2kudGltZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHN0YXJ0LCBpLnRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwubWVyZ2UocmVzdWx0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgaW50ZXJ2YWxzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcmV0dXJuIEludGVydmFsLnhvcihbdGhpc10uY29uY2F0KGludGVydmFscykpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIF90aGlzLmludGVyc2VjdGlvbihpKTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpICYmICFpLmlzRW1wdHkoKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gJ1snICsgdGhpcy5zLnRvSVNPKCkgKyAnIFxcdTIwMTMgJyArIHRoaXMuZS50b0lTTygpICsgJyknO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnSW50ZXJ2YWwge1xcbiAgc3RhcnQ6ICcgKyB0aGlzLnN0YXJ0LnRvSVNPKCkgKyAnLFxcbiAgZW5kOiAnICsgdGhpcy5lbmQudG9JU08oKSArICcsXFxuICB6b25lOiAgICcgKyB0aGlzLnN0YXJ0LnpvbmUubmFtZSArICcsXFxuICBsb2NhbGU6ICAgJyArIHRoaXMuc3RhcnQubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgJy8nICsgdGhpcy5lLnRvSVNPKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQpIHtcbiAgICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmNCRzZXBhcmF0b3IgPSBfcmVmNC5zZXBhcmF0b3IsXG4gICAgICAgIHNlcGFyYXRvciA9IF9yZWY0JHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJyDigJMgJyA6IF9yZWY0JHNlcGFyYXRvcjtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiAnJyArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYSBEdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIHRpbWUgc3Bhbm5lZCBieSB0aGlzIGludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdkYXlzJykudG9PYmplY3QoKSAvLz0+IHsgZGF5czogMS4wMjQxODEyMTUyNzc3Nzc4IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LjgyMDk1IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignc2Vjb25kcycpLnRvT2JqZWN0KCkgLy89PiB7IHNlY29uZHM6IDg4NDg5LjI1NyB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9EdXJhdGlvbiA9IGZ1bmN0aW9uIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnRlcnZhbCwgW3tcbiAgICBrZXk6ICdzdGFydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGVuZCBvZiB0aGUgSW50ZXJ2YWxcclxuICAgICAqIEB0eXBlIHtEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdlbmQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBhdCBsZWFzdCBpdHMgc3RhcnQsIGkuZS4gdGhhdCB0aGUgSW50ZXJ2YWwgaXNuJ3QgJ2JhY2t3YXJkcycuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnRlcnZhbDtcbn0oKTtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5cbnZhciBJbmZvID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgSW5mby5oYXNEU1QgPSBmdW5jdGlvbiBoYXNEU1QoKSB7XG4gICAgdmFyIHpvbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFNldHRpbmdzLmRlZmF1bHRab25lO1xuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7IG1vbnRoOiAxMiB9KTtcblxuICAgIHJldHVybiAhem9uZS51bml2ZXJzYWwgJiYgcHJvdG8ub2Zmc2V0ICE9PSBwcm90by5zZXQoeyBtb250aDogNiB9KS5vZmZzZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBJbmZvLmlzVmFsaWRJQU5BWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRJQU5BWm9uZSh6b25lKSB7XG4gICAgcmV0dXJuICEhSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcih6b25lKSAmJiBJQU5BWm9uZS5pc1ZhbGlkWm9uZSh6b25lKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgbW9udGggbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcj0nZ3JlZ29yeSddIC0gdGhlIGNhbGVuZGFyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JylbMF0gLy89PiAnSmFuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycpWzBdIC8vPT4gJzEnXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfZoSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiacq7IEknXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzID0gZnVuY3Rpb24gbW9udGhzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdW5kZWZpbmVkID8gJ2dyZWdvcnknIDogX3JlZiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgbW9udGhzfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tb250aHNGb3JtYXQgPSBmdW5jdGlvbiBtb250aHNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjIkbG9jYWxlID0gX3JlZjIubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmMiRsb2NhbGUsXG4gICAgICAgIF9yZWYyJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYyLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjIkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmMiRvdXRwdXRDYWxlbmRhciA9IF9yZWYyLm91dHB1dENhbGVuZGFyLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYyJG91dHB1dENhbGVuZGFyID09PSB1bmRlZmluZWQgPyAnZ3JlZ29yeScgOiBfcmVmMiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIHdlZWsgbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygpWzBdIC8vPT4gJ01vbmRheSdcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSlbMF0gLy89PiAnbHVuLidcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfYp9mE2KfYq9mG2YrZhidcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmMyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXG4gICAqIEZvcm1hdCB3ZWVrZGF5cyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIHdlZWtkYXlzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byBtb3JlIGRhdGUgaW5mb3JtYXRpb24uIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XG4gICAqIGNoYW5nZXMgdGhlIHN0cmluZy5cbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQkbG9jYWxlID0gX3JlZjQubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNCRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNCRsb2NhbGUsXG4gICAgICAgIF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjQkbnVtYmVyaW5nU3lzdGVtO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBtZXJpZGllbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcygpIC8vPT4gWyAnQU0nLCAnUE0nIF1cbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdkZScgfSkgLy89PiBbICd2b3JtLicsICduYWNobS4nIF1cbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgX3JlZjUkbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNSRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNSRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZXJhcywgc3VjaCBhcyBbJ0JDJywgJ0FEJ10uIFRoZSBsb2NhbGUgY2FuIGJlIHNwZWNpZmllZCwgYnV0IHRoZSBjYWxlbmRhciBzeXN0ZW0gaXMgYWx3YXlzIEdyZWdvcmlhbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J3Nob3J0J10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBlcmEgcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJzaG9ydFwiIG9yIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCkgLy89PiBbICdCQycsICdBRCcgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJywgeyBsb2NhbGU6ICdmcicgfSkgLy89PiBbICdhdmFudCBKw6lzdXMtQ2hyaXN0JywgJ2FwcsOocyBKw6lzdXMtQ2hyaXN0JyBdXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3Nob3J0JztcblxuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWY2JGxvY2FsZSA9IF9yZWY2LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjYkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjYkbG9jYWxlO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudWxsLCAnZ3JlZ29yeScpLmVyYXMobGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xuICAgKiAqIGBpbnRsVG9rZW5zYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemVkIHRva2VuLWJhc2VkIGZvcm1hdHRpbmcvcGFyc2luZ1xuICAgKiAqIGBpbnRsYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGdlbmVyYWwgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgSW5mby5mZWF0dXJlcyA9IGZ1bmN0aW9uIGZlYXR1cmVzKCkge1xuICAgIHZhciBpbnRsID0gZmFsc2UsXG4gICAgICAgIGludGxUb2tlbnMgPSBmYWxzZSxcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcblxuICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgIGludGwgPSB0cnVlO1xuICAgICAgaW50bFRva2VucyA9IGhhc0Zvcm1hdFRvUGFydHMoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgem9uZXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4nLCB7IHRpbWVab25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgPT09ICdBbWVyaWNhL05ld19Zb3JrJztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnRsOiBpbnRsLCBpbnRsVG9rZW5zOiBpbnRsVG9rZW5zLCB6b25lczogem9uZXMgfTtcbiAgfTtcblxuICByZXR1cm4gSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICB2YXIgdXRjRGF5U3RhcnQgPSBmdW5jdGlvbiB1dGNEYXlTdGFydChkdCkge1xuICAgIHJldHVybiBkdC50b1VUQygwLCB7IGtlZXBMb2NhbFRpbWU6IHRydWUgfSkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICB9LFxuICAgICAgbXMgPSB1dGNEYXlTdGFydChsYXRlcikgLSB1dGNEYXlTdGFydChlYXJsaWVyKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoJ2RheXMnKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIHZhciBkaWZmZXJzID0gW1sneWVhcnMnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnllYXIgLSBhLnllYXI7XG4gIH1dLCBbJ21vbnRocycsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFsnd2Vla3MnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICByZXR1cm4gKGRheXMgLSBkYXlzICUgNykgLyA3O1xuICB9XSwgWydkYXlzJywgZGF5RGlmZl1dO1xuXG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBsb3dlc3RPcmRlciA9IHZvaWQgMCxcbiAgICAgIGhpZ2hXYXRlciA9IHZvaWQgMDtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBkaWZmZXJzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmMjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZjIgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfcmVmMjtcbiAgICB2YXIgdW5pdCA9IF9yZWZbMF07XG4gICAgdmFyIGRpZmZlciA9IF9yZWZbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIHZhciBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcblxuICAgICAgaGlnaFdhdGVyID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1cyA9IHt9LCBfY3Vyc29yJHBsdXNbdW5pdF0gPSBkZWx0YSwgX2N1cnNvciRwbHVzKSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICB2YXIgX2hpZ2hXYXRlciRtaW51cztcblxuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXIubWludXMoKF9oaWdoV2F0ZXIkbWludXMgPSB7fSwgX2hpZ2hXYXRlciRtaW51c1t1bml0XSA9IDEsIF9oaWdoV2F0ZXIkbWludXMpKTtcbiAgICAgICAgZGVsdGEgLT0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICB2YXIgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSAnbWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgpIHtcbiAgdmFyIHBvc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgcmV0dXJuIHsgcmVnZXg6IHJlZ2V4LCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZikge1xuICAgICAgdmFyIHMgPSBfcmVmWzBdO1xuICAgICAgcmV0dXJuIHBvc3QocGFyc2VJbnQocykpO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sICdcXFxcLj8nKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXC4vLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbignfCcpKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMikge1xuICAgICAgICB2YXIgcyA9IF9yZWYyWzBdO1xuICAgICAgICByZXR1cm4gc3RyaW5ncy5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpO1xuICAgICAgICB9KSArIHN0YXJ0SW5kZXg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sIGdyb3VwczogZ3JvdXBzIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7IHJlZ2V4OiBSZWdFeHAodC52YWwpLCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjUpIHtcbiAgICAgICAgdmFyIHMgPSBfcmVmNVswXTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9LCBsaXRlcmFsOiB0cnVlIH07XG4gIH0sXG4gICAgICB1bml0YXRlID0gZnVuY3Rpb24gdW5pdGF0ZSh0KSB7XG4gICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAvLyBlcmFcbiAgICAgIGNhc2UgJ0cnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoJ3Nob3J0JywgZmFsc2UpLCAwKTtcbiAgICAgIGNhc2UgJ0dHJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKCdsb25nJywgZmFsc2UpLCAwKTtcbiAgICAgIC8vIHllYXJzXG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG4gICAgICBjYXNlICd5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgY2FzZSAneXl5eXknOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcbiAgICAgIGNhc2UgJ3l5eXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KC9cXGR7Nn0vKTtcbiAgICAgIC8vIG1vbnRoc1xuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdzaG9ydCcsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnTU1NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdsb25nJywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdMJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnTExMJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoJ3Nob3J0JywgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocygnbG9uZycsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBkYXRlc1xuICAgICAgY2FzZSAnZCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIG9yZGluYWxzXG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICBjYXNlICdvb28nOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG4gICAgICBjYXNlICdISCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnaGgnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnc3MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnUyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1xcZHsxLDl9Lyk7XG4gICAgICAvLyBtZXJpZGllbVxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG4gICAgICBjYXNlICdra2trJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICBjYXNlICdrayc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgIGNhc2UgJ1cnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdXVyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyB3ZWVrZGF5c1xuICAgICAgY2FzZSAnRSc6XG4gICAgICBjYXNlICdjJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ3Nob3J0JywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnbG9uZycsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnc2hvcnQnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ2xvbmcnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgLy8gb2Zmc2V0L3pvbmVcbiAgICAgIGNhc2UgJ1onOlxuICAgICAgY2FzZSAnWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/LywgMik7XG4gICAgICBjYXNlICdaWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KShcXGR7Mn0pPy8sIDIpO1xuICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBaWlpaIChQU1QpIG9yIFpaWlpaIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpIGluIHBhcnNpbmdcbiAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuICAgICAgY2FzZSAneic6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1tBLVphLXpfXXsxLDI1Nn1cXC9bQS1aYS16X117MSwyNTZ9Lyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFBcbiAgfTtcblxuICB1bml0LnRva2VuID0gdG9rZW47XG5cbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgJygnICsgci5zb3VyY2UgKyAnKSc7XG4gIH0sICcnKTtcbiAgcmV0dXJuIFsnXicgKyByZSArICckJywgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIHZhciBtYXRjaGVzID0gaW5wdXQubWF0Y2gocmVnZXgpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgdmFyIGFsbCA9IHt9O1xuICAgIHZhciBtYXRjaEluZGV4ID0gMTtcbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoSW5kZXggKz0gZ3JvdXBzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ1MnOlxuICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICBjYXNlICdtJzpcbiAgICAgICAgcmV0dXJuICdtaW51dGUnO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuICdob3VyJztcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gJ2RheSc7XG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuICdvcmRpbmFsJztcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiAnbW9udGgnO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ2MnOlxuICAgICAgICByZXR1cm4gJ3dlZWtkYXknO1xuICAgICAgY2FzZSAnVyc6XG4gICAgICAgIHJldHVybiAnd2Vla051bWJlcic7XG4gICAgICBjYXNlICdrJzpcbiAgICAgICAgcmV0dXJuICd3ZWVrWWVhcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmUgPSB2b2lkIDA7XG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gbmV3IElBTkFab25lKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyhtYXRjaGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGspIHtcbiAgICB2YXIgZiA9IHRvRmllbGQoayk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQ6IGlucHV0LCB0b2tlbnM6IHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBfYnVpbGRSZWdleCA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgICByZWdleFN0cmluZyA9IF9idWlsZFJlZ2V4WzBdLFxuICAgICAgICBoYW5kbGVycyA9IF9idWlsZFJlZ2V4WzFdLFxuICAgICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgJ2knKSxcbiAgICAgICAgX21hdGNoID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICAgIHJhd01hdGNoZXMgPSBfbWF0Y2hbMF0sXG4gICAgICAgIG1hdGNoZXMgPSBfbWF0Y2hbMV0sXG4gICAgICAgIF9yZWY2ID0gbWF0Y2hlcyA/IGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykgOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgIHJlc3VsdCA9IF9yZWY2WzBdLFxuICAgICAgICB6b25lID0gX3JlZjZbMV07XG5cbiAgICByZXR1cm4geyBpbnB1dDogaW5wdXQsIHRva2VuczogdG9rZW5zLCByZWdleDogcmVnZXgsIHJhd01hdGNoZXM6IHJhd01hdGNoZXMsIG1hdGNoZXM6IG1hdGNoZXMsIHJlc3VsdDogcmVzdWx0LCB6b25lOiB6b25lIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgX2V4cGxhaW5Gcm9tVG9rZW5zID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSxcbiAgICAgIHJlc3VsdCA9IF9leHBsYWluRnJvbVRva2Vucy5yZXN1bHQsXG4gICAgICB6b25lID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnpvbmUsXG4gICAgICBpbnZhbGlkUmVhc29uID0gX2V4cGxhaW5Gcm9tVG9rZW5zLmludmFsaWRSZWFzb247XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuXG52YXIgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHZhciBqcyA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBqcyA9PT0gMCA/IDcgOiBqcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSkge1xuICByZXR1cm4gZGF5ICsgKGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcilbbW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSB7XG4gIHZhciB0YWJsZSA9IGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcixcbiAgICAgIG1vbnRoMCA9IHRhYmxlLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpIDwgb3JkaW5hbDtcbiAgfSksXG4gICAgICBkYXkgPSBvcmRpbmFsIC0gdGFibGVbbW9udGgwXTtcbiAgcmV0dXJuIHsgbW9udGg6IG1vbnRoMCArIDEsIGRheTogZGF5IH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICB2YXIgeWVhciA9IGdyZWdPYmoueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ09iai5tb250aCxcbiAgICAgIGRheSA9IGdyZWdPYmouZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgd2Vla2RheSA9IGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KTtcblxuXG4gIHZhciB3ZWVrTnVtYmVyID0gTWF0aC5mbG9vcigob3JkaW5hbCAtIHdlZWtkYXkgKyAxMCkgLyA3KSxcbiAgICAgIHdlZWtZZWFyID0gdm9pZCAwO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB3ZWVrWWVhcjogd2Vla1llYXIsIHdlZWtOdW1iZXI6IHdlZWtOdW1iZXIsIHdlZWtkYXk6IHdlZWtkYXkgfSwgdGltZU9iamVjdChncmVnT2JqKSk7XG59XG5cbmZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICB2YXIgd2Vla1llYXIgPSB3ZWVrRGF0YS53ZWVrWWVhcixcbiAgICAgIHdlZWtOdW1iZXIgPSB3ZWVrRGF0YS53ZWVrTnVtYmVyLFxuICAgICAgd2Vla2RheSA9IHdlZWtEYXRhLndlZWtkYXksXG4gICAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICAgIHllYXJJbkRheXMgPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcblxuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhciA9IHZvaWQgMDtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIHZhciBfdW5jb21wdXRlT3JkaW5hbCA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCksXG4gICAgICBtb250aCA9IF91bmNvbXB1dGVPcmRpbmFsLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwuZGF5O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoLCBkYXk6IGRheSB9LCB0aW1lT2JqZWN0KHdlZWtEYXRhKSk7XG59XG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICB2YXIgeWVhciA9IGdyZWdEYXRhLnllYXIsXG4gICAgICBtb250aCA9IGdyZWdEYXRhLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ0RhdGEuZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB5ZWFyOiB5ZWFyLCBvcmRpbmFsOiBvcmRpbmFsIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cblxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCwgZGF5OiBkYXkgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkV2Vla0RhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoud2Vla1llYXIpLFxuICAgICAgdmFsaWRXZWVrID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgICAgdmFsaWRXZWVrZGF5ID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla2RheSwgMSwgNyk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gJ3dlZWtZZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiAnd2VlayBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gJ3dlZWtkYXkgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuICd5ZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiAnb3JkaW5hbCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai55ZWFyKSxcbiAgICAgIHZhbGlkTW9udGggPSBudW1iZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgICAgdmFsaWREYXkgPSBudW1iZXJCZXR3ZWVuKG9iai5kYXksIDEsIGRheXNJbk1vbnRoKG9iai55ZWFyLCBvYmoubW9udGgpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiAneWVhciBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1vbnRoKSB7XG4gICAgcmV0dXJuICdtb250aCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiAnZGF5IG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkSG91ciA9IG51bWJlckJldHdlZW4ob2JqLmhvdXIsIDAsIDIzKSxcbiAgICAgIHZhbGlkTWludXRlID0gbnVtYmVyQmV0d2VlbihvYmoubWludXRlLCAwLCA1OSksXG4gICAgICB2YWxpZFNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLnNlY29uZCwgMCwgNTkpLFxuICAgICAgdmFsaWRNaWxsaXNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLm1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuICdob3VyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWludXRlKSB7XG4gICAgcmV0dXJuICdtaW51dGUgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gJ3NlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuICdtaWxsaXNlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gJ0ludmFsaWQgRGF0ZVRpbWUnLFxuICAgIElOVkFMSURfSU5QVVQgPSAnaW52YWxpZCBpbnB1dCcsXG4gICAgVU5TVVBQT1JURURfWk9ORSA9ICd1bnN1cHBvcnRlZCB6b25lJyxcbiAgICBVTlBBUlNBQkxFJDEgPSAndW5wYXJzYWJsZSc7XG5cbi8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn1cblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZFJlYXNvbjogaW5zdC5pbnZhbGlkUmVhc29uXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywgeyBvbGQ6IGN1cnJlbnQgfSkpO1xufVxuXG4vLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwO1xuXG4gIC8vIFRlc3Qgd2hldGhlciB0aGUgem9uZSBtYXRjaGVzIHRoZSBvZmZzZXQgZm9yIHRoaXMgdHNcbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcblxuICAvLyBJZiBzbywgb2Zmc2V0IGRpZG4ndCBjaGFuZ2UgYW5kIHdlJ3JlIGRvbmVcbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH1cblxuICAvLyBJZiBub3QsIGNoYW5nZSB0aGUgdHMgYnkgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIG9mZnNldFxuICB1dGNHdWVzcyAtPSAobzIgLSBvKSAqIDYwICogMTAwMDtcblxuICAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcbiAgdmFyIG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIHZhciBkID0gbmV3IERhdGUodHMpO1xuXG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufVxuXG4vLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuZnVuY3Rpb24gb2JqVG9Mb2NhbFRTKG9iaikge1xuICB2YXIgZCA9IERhdGUuVVRDKG9iai55ZWFyLCBvYmoubW9udGggLSAxLCBvYmouZGF5LCBvYmouaG91ciwgb2JqLm1pbnV0ZSwgb2JqLnNlY29uZCwgb2JqLm1pbGxpc2Vjb25kKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIob2JqLnllYXIpO1xuICB9XG4gIHJldHVybiArZDtcbn1cblxuLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuZnVuY3Rpb24gb2JqVG9UUyhvYmosIG9mZnNldCwgem9uZSkge1xuICByZXR1cm4gZml4T2Zmc2V0KG9ialRvTG9jYWxUUyhvYmopLCBvZmZzZXQsIHpvbmUpO1xufVxuXG4vLyBjcmVhdGUgYSBuZXcgRFQgaW5zdGFuY2UgYnkgYWRkaW5nIGEgZHVyYXRpb24sIGFkanVzdGluZyBmb3IgRFNUc1xuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgdmFyIG9QcmUgPSBpbnN0Lm8sXG4gICAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBkdXIueWVhcnMsXG4gICAgICBtb250aCA9IGluc3QuYy5tb250aCArIGR1ci5tb250aHMgKyBkdXIucXVhcnRlcnMgKiAzLFxuICAgICAgYyA9IE9iamVjdC5hc3NpZ24oe30sIGluc3QuYywge1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogTWF0aC5taW4oaW5zdC5jLmRheSwgZGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArIGR1ci5kYXlzICsgZHVyLndlZWtzICogN1xuICB9KSxcbiAgICAgIG1pbGxpc1RvQWRkID0gRHVyYXRpb24uZnJvbU9iamVjdCh7XG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgbG9jYWxUUyA9IG9ialRvTG9jYWxUUyhjKTtcblxuICB2YXIgX2ZpeE9mZnNldCA9IGZpeE9mZnNldChsb2NhbFRTLCBvUHJlLCBpbnN0LnpvbmUpLFxuICAgICAgdHMgPSBfZml4T2Zmc2V0WzBdLFxuICAgICAgbyA9IF9maXhPZmZzZXRbMV07XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzOiB0cywgbzogbyB9O1xufVxuXG4vLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzKSB7XG4gIHZhciBzZXRab25lID0gb3B0cy5zZXRab25lLFxuICAgICAgem9uZSA9IG9wdHMuem9uZTtcblxuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMsIHtcbiAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoVU5QQVJTQUJMRSQxKTtcbiAgfVxufVxuXG4vLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuZnVuY3Rpb24gdG9UZWNoRm9ybWF0KGR0LCBmb3JtYXQpIHtcbiAgcmV0dXJuIGR0LmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoJ2VuLVVTJyksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn1cblxuLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcbmZ1bmN0aW9uIHRvVGVjaFRpbWVGb3JtYXQoZHQsIF9yZWYpIHtcbiAgdmFyIF9yZWYkc3VwcHJlc3NTZWNvbmRzID0gX3JlZi5zdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc1NlY29uZHMgPSBfcmVmJHN1cHByZXNzU2Vjb25kcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9IF9yZWYuc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzTWlsbGlzZWMsXG4gICAgICBfcmVmJGluY2x1ZGVPZmZzZXQgPSBfcmVmLmluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRpbmNsdWRlT2Zmc2V0LFxuICAgICAgX3JlZiRpbmNsdWRlWm9uZSA9IF9yZWYuaW5jbHVkZVpvbmUsXG4gICAgICBpbmNsdWRlWm9uZSA9IF9yZWYkaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiRpbmNsdWRlWm9uZSxcbiAgICAgIF9yZWYkc3BhY2Vab25lID0gX3JlZi5zcGFjZVpvbmUsXG4gICAgICBzcGFjZVpvbmUgPSBfcmVmJHNwYWNlWm9uZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHNwYWNlWm9uZTtcblxuICB2YXIgZm10ID0gJ0hIOm1tJztcblxuICBpZiAoIXN1cHByZXNzU2Vjb25kcyB8fCBkdC5zZWNvbmQgIT09IDAgfHwgZHQubWlsbGlzZWNvbmQgIT09IDApIHtcbiAgICBmbXQgKz0gJzpzcyc7XG4gICAgaWYgKCFzdXBwcmVzc01pbGxpc2Vjb25kcyB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgICAgZm10ICs9ICcuU1NTJztcbiAgICB9XG4gIH1cblxuICBpZiAoKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpICYmIHNwYWNlWm9uZSkge1xuICAgIGZtdCArPSAnICc7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gJ3onO1xuICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICBmbXQgKz0gJ1paJztcbiAgfVxuXG4gIHJldHVybiB0b1RlY2hGb3JtYXQoZHQsIGZtdCk7XG59XG5cbi8vIGRlZmF1bHRzIGZvciB1bnNwZWNpZmllZCB1bml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFyc1xudmFyIGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdFdlZWtVbml0VmFsdWVzID0ge1xuICB3ZWVrTnVtYmVyOiAxLFxuICB3ZWVrZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICBvcmRpbmFsOiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn07XG5cbi8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xudmFyIG9yZGVyZWRVbml0cyQxID0gWyd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gWyd3ZWVrWWVhcicsICd3ZWVrTnVtYmVyJywgJ3dlZWtkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ10sXG4gICAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFsneWVhcicsICdvcmRpbmFsJywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICB2YXIgaWdub3JlVW5rbm93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgeWVhcjogJ3llYXInLFxuICAgIHllYXJzOiAneWVhcicsXG4gICAgbW9udGg6ICdtb250aCcsXG4gICAgbW9udGhzOiAnbW9udGgnLFxuICAgIGRheTogJ2RheScsXG4gICAgZGF5czogJ2RheScsXG4gICAgaG91cjogJ2hvdXInLFxuICAgIGhvdXJzOiAnaG91cicsXG4gICAgbWludXRlOiAnbWludXRlJyxcbiAgICBtaW51dGVzOiAnbWludXRlJyxcbiAgICBzZWNvbmQ6ICdzZWNvbmQnLFxuICAgIHNlY29uZHM6ICdzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kJyxcbiAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgd2Vla2RheXM6ICd3ZWVrZGF5JyxcbiAgICB3ZWVrbnVtYmVyOiAnd2Vla051bWJlcicsXG4gICAgd2Vla3NudW1iZXI6ICd3ZWVrTnVtYmVyJyxcbiAgICB3ZWVrbnVtYmVyczogJ3dlZWtOdW1iZXInLFxuICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgIHdlZWt5ZWFyczogJ3dlZWtZZWFyJyxcbiAgICBvcmRpbmFsOiAnb3JkaW5hbCdcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG5cbiAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMkMSwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjI7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmMiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB1ID0gX3JlZjI7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWRSZWFzb24gPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWRSZWFzb24pO1xuICB9XG5cbiAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICBvZmZzZXRQcm92aXMgPSB6b25lLm9mZnNldCh0c05vdyksXG4gICAgICBfb2JqVG9UUyA9IG9ialRvVFMob2JqLCBvZmZzZXRQcm92aXMsIHpvbmUpLFxuICAgICAgdHMgPSBfb2JqVG9UU1swXSxcbiAgICAgIG8gPSBfb2JqVG9UU1sxXTtcblxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG5cbi8qKlxyXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEEgRGF0ZVRpbWUgY29tcHJpc2VzIG9mOlxyXG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxyXG4gKiAqIEEgdGltZSB6b25lLiBFYWNoIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB6b25lIChieSBkZWZhdWx0IHRoZSBsb2NhbCBzeXN0ZW0ncyB6b25lKS5cclxuICogKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBlZmZlY3QgaG93IG91dHB1dCBzdHJpbmdzIGFyZSBmb3JtYXR0ZWQsIHN1Y2ggYXMgYGxvY2FsZWAsIGBudW1iZXJpbmdTeXN0ZW1gLCBhbmQgYG91dHB1dENhbGVuZGFyYC5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlczpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIGxvY2FsfSwge0BsaW5rIHV0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIGZyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21JU099LCB7QGxpbmsgZnJvbUhUVFB9LCBhbmQge0BsaW5rIGZyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIGZyb21KU0RhdGV9LlxyXG4gKiAqICoqR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCB0aW1lKio6IFRvIGV4YW1pbmUgdGhlIEdyZWdvcmlhbiBwcm9wZXJ0aWVzIG9mIGEgRGF0ZVRpbWUgaW5kaXZpZHVhbGx5IChpLmUgYXMgb3Bwb3NlZCB0byBjb2xsZWN0aXZlbHkgdGhyb3VnaCB7QGxpbmsgdG9PYmplY3R9KSwgdXNlIHRoZSB7QGxpbmsgeWVhcn0sIHtAbGluayBtb250aH0sXHJcbiAqIHtAbGluayBkYXl9LCB7QGxpbmsgaG91cn0sIHtAbGluayBtaW51dGV9LCB7QGxpbmsgc2Vjb25kfSwge0BsaW5rIG1pbGxpc2Vjb25kfSBhY2Nlc3NvcnMuXHJcbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayB3ZWVrWWVhcn0sIHtAbGluayB3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayB3ZWVrZGF5fSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlIHRoZSB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKjogVG8gdHJhbnNmb3JtIHRoZSBEYXRlVGltZSBpbnRvIG90aGVyIERhdGVUaW1lcywgdXNlIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2V0Wm9uZX0sIHtAbGluayBzZXRMb2NhbGV9LCB7QGxpbmsgcGx1c30sIHtAbGluayBtaW51c30sIHtAbGluayBlbmRPZn0sIHtAbGluayBzdGFydE9mfSwge0BsaW5rIHRvVVRDfSwgYW5kIHtAbGluayB0b0xvY2FsfS5cclxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIHRvSlNPTn0sIHtAbGluayB0b0lTT30sIHtAbGluayB0b0hUVFB9LCB7QGxpbmsgdG9PYmplY3R9LCB7QGxpbmsgdG9SRkMyODIyfSwge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSwge0BsaW5rIHRvRm9ybWF0fSwge0BsaW5rIHRvTWlsbGlzfSBhbmQge0BsaW5rIHRvSlNEYXRlfS5cclxuICpcclxuICogVGhlcmUncyBwbGVudHkgb3RoZXJzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uLCB0aW1lIHpvbmVzLCBhbHRlcm5hdGl2ZSBjYWxlbmRhcnMsIHZhbGlkaXR5LCBhbmQgc28gb24sIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEYXRlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIERhdGVUaW1lKGNvbmZpZykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERhdGVUaW1lKTtcblxuICAgIHZhciB6b25lID0gY29uZmlnLnpvbmUgfHwgU2V0dGluZ3MuZGVmYXVsdFpvbmUsXG4gICAgICAgIGludmFsaWRSZWFzb24gPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBJTlZBTElEX0lOUFVUIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyBVTlNVUFBPUlRFRF9aT05FIDogbnVsbCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMudHMgPSBpc1VuZGVmaW5lZChjb25maWcudHMpID8gU2V0dGluZ3Mubm93KCkgOiBjb25maWcudHM7XG5cbiAgICB2YXIgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuICAgIGlmICghaW52YWxpZFJlYXNvbikge1xuICAgICAgdmFyIHVuY2hhbmdlZCA9IGNvbmZpZy5vbGQgJiYgY29uZmlnLm9sZC50cyA9PT0gdGhpcy50cyAmJiBjb25maWcub2xkLnpvbmUuZXF1YWxzKHpvbmUpO1xuICAgICAgYyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQuYyA6IHRzVG9PYmoodGhpcy50cywgem9uZS5vZmZzZXQodGhpcy50cykpO1xuICAgICAgbyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQubyA6IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBpbnZhbGlkUmVhc29uO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5vID0gbztcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0czogU2V0dGluZ3Mubm93KCkgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVpcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnV0YyA9IGZ1bmN0aW9uIHV0Yyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KCksXG4gICAgICAgIHpvbmU6IEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IGlzRGF0ZShkYXRlKSA/IGRhdGUudmFsdWVPZigpIDogTmFOLFxuICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucylcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgLSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCBVVENcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhtaWxsaXNlY29uZHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5IC0gYSBkYXkgb2YgdGhlIG1vbnRoLCAxLTMxLCBkZXBlbmRpbmcgb24gdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla051bWJlciAtIGFuIElTTyB3ZWVrIG51bWJlciwgYmV0d2VlbiAxIGFuZCA1MiBvciA1MywgZGVwZW5kaW5nIG9uIHRoZSB5ZWFyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGUgLSBtaW51dGUgb2YgdGhlIGhvdXIsIDAtNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29iai56b25lPSdsb2NhbCddIC0gaW50ZXJwcmV0IHRoZSBudW1iZXJzIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciB6b25lLiBDYW4gdGFrZSBhbnkgdmFsdWUgdGFrZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldFpvbmUoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiB9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTAxLTAxVDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0pIC8vfj4gdG9kYXkgYXQgMTA6MjY6MDZcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ3V0YycgfSksXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdsb2NhbCcgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ0FtZXJpY2EvTmV3X1lvcmsnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICB2YXIgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvYmouem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH1cblxuICAgIHZhciB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgICBvZmZzZXRQcm92aXMgPSB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yTUQgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5tb250aCkgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSxcbiAgICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9iaik7XG5cbiAgICAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgdmFyIHVuaXRzID0gdm9pZCAwLFxuICAgICAgICBkZWZhdWx0VmFsdWVzID0gdm9pZCAwLFxuICAgICAgICBvYmpOb3cgPSB0c1RvT2JqKHRzTm93LCBvZmZzZXRQcm92aXMpO1xuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gdW5pdHMsIF9pc0FycmF5MiA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMiksIF9pMiA9IDAsIF9pdGVyYXRvcjIgPSBfaXNBcnJheTIgPyBfaXRlcmF0b3IyIDogX2l0ZXJhdG9yMltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkyKSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yMi5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcjJbX2kyKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kyID0gX2l0ZXJhdG9yMi5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYzID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYzO1xuXG4gICAgICB2YXIgdiA9IG5vcm1hbGl6ZWRbdV07XG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyB3ZSBoYXZlIGFyZSBpbiByYW5nZVxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkUmVhc29uID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkUmVhc29uKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pO1xuXG4gICAgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnbWlzbWF0Y2hlZCB3ZWVrZGF5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi1XMDUtNCcpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUlTT0RhdGUgPSBwYXJzZUlTT0RhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VJU09EYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSVNPRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJ1R1ZSwgMjUgTm92IDIwMTYgMTM6MjM6MTIgKzA2MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21SRkMyODIyID0gZnVuY3Rpb24gZnJvbVJGQzI4MjIodGV4dCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUhUVFBEYXRlID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUhUVFBEYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSFRUUERhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSB8fCBpc1VuZGVmaW5lZChmbXQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Zyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbnVtYmVyaW5nU3lzLFxuICAgICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSwgZGVmYXVsdFRvRU46IHRydWUgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZFJlYXNvbiA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZFJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyh0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBTUUwgZGF0ZSwgdGltZSwgb3IgZGF0ZXRpbWVcclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIrMDY6MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicsIHsgem9uZTogJ0FtZXJpY2EvTG9zX0FuZ2VsZXMnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TUUwgPSBmdW5jdGlvbiBmcm9tU1FMKHRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgX3BhcnNlU1FMID0gcGFyc2VTUUwodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VTUUxbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VTUUxbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBJTkZPXG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ21vbnRoJyk7IC8vPT4gN1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQkJDEodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgYnkgYW4gb3BlcmF0aW9uIG9uIGFub3RoZXIgaW52YWxpZCBkYXRlXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSB0aGUgc2FtZSBvcHRpb25zIGFzIHRvTG9jYWxlU3RyaW5nXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuICBEYXRlVGltZS5wcm90b3R5cGUucmVzb2x2ZWRMb2NhbGVPcHRzID0gZnVuY3Rpb24gcmVzb2x2ZWRMb2NhbGVPcHRzKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHZhciBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMgPSBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5yZXNvbHZlZE9wdGlvbnModGhpcyksXG4gICAgICAgIGxvY2FsZSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLmNhbGVuZGFyO1xuXG4gICAgcmV0dXJuIHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcjogY2FsZW5kYXIgfTtcbiAgfTtcblxuICAvLyBUUkFOU0ZPUk1cblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gVVRDLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBzZXRab25lfSgndXRjJylcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIG9wdGlvbmFsbHksIGFuIG9mZnNldCBmcm9tIFVUQyBpbiBtaW51dGVzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvVVRDID0gZnVuY3Rpb24gdG9VVEMoKSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5zZXRab25lKEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShvZmZzZXQpLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gdGhlIGhvc3QncyBsb2NhbCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUobmV3IExvY2FsWm9uZSgpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lKSB7XG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQka2VlcExvY2FsVGltZSA9IF9yZWY0LmtlZXBMb2NhbFRpbWUsXG4gICAgICAgIGtlZXBMb2NhbFRpbWUgPSBfcmVmNCRrZWVwTG9jYWxUaW1lID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY0JGtlZXBMb2NhbFRpbWUsXG4gICAgICAgIF9yZWY0JGtlZXBDYWxlbmRhclRpbSA9IF9yZWY0LmtlZXBDYWxlbmRhclRpbWUsXG4gICAgICAgIGtlZXBDYWxlbmRhclRpbWUgPSBfcmVmNCRrZWVwQ2FsZW5kYXJUaW0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjQka2VlcENhbGVuZGFyVGltO1xuXG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lOiB6b25lIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNS5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjUub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGU6IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBvdXRwdXRDYWxlbmRhciB9KTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IGxvYzogbG9jIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5zZXRMb2NhbGUoJ2VuLUdCJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRMb2NhbGUgPSBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KHZhbHVlcywgbm9ybWFsaXplVW5pdCksXG4gICAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSk7XG5cbiAgICB2YXIgbWl4ZWQgPSB2b2lkIDA7XG4gICAgaWYgKHNldHRpbmdXZWVrU3R1ZmYpIHtcbiAgICAgIG1peGVkID0gd2Vla1RvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9XZWVrKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0gT2JqZWN0LmFzc2lnbih0aGlzLnRvT2JqZWN0KCksIG5vcm1hbGl6ZWQpO1xuXG4gICAgICAvLyBpZiB3ZSBkaWRuJ3Qgc2V0IHRoZSBkYXkgYnV0IHdlIGVuZGVkIHVwIG9uIGFuIG92ZXJmbG93IGRhdGUsXG4gICAgICAvLyB1c2UgdGhlIGxhc3QgZGF5IG9mIHRoZSByaWdodCBtb250aFxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IHRzOiB0cywgbzogbyB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBBZGQgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqXHJcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAxIH0pIC8vfj4gdGhpcyB0aW1lIHRvbW9ycm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMywgbWludXRlczogMTMgfSkpIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdW5pdCBvZiB0aW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ21vbnRoJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDEnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdkYXknKS50b0lTT1RpbWUoKTsgLy89PiAnMDA6MDAuMDAwLTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdob3VyJykudG9JU09UaW1lKCk7IC8vPT4gJzA1OjAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zdGFydE9mID0gZnVuY3Rpb24gc3RhcnRPZih1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBvID0ge30sXG4gICAgICAgIG5vcm1hbGl6ZWRVbml0ID0gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAncXVhcnRlcnMnOlxuICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgby5kYXkgPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09ICd3ZWVrcycpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSAncXVhcnRlcnMnKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAoaS5lLiB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBlbmQgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZigneWVhcicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMTItMzFUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLmVuZE9mKCdob3VyJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QwNTo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZW5kT2YgPSBmdW5jdGlvbiBlbmRPZih1bml0KSB7XG4gICAgdmFyIF9zdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF9zdGFydE9mJHBsdXMgPSB7fSwgX3N0YXJ0T2YkcGx1c1t1bml0XSA9IDEsIF9zdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07XG5cbiAgLy8gT1VUUFVUXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxyXG4gICAqICoqWW91IG1heSBub3Qgd2FudCB0aGlzLioqIFNlZSB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvciBhIG1vcmUgZmxleGlibGUgZm9ybWF0dGluZyB0b29sLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQgdG9rZW5zIHN1cHBvcnRlZC5cclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMucm91bmQgLSByb3VuZCBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnNldExvY2FsZSgnZnInKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IGF2ci4gMjInXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdChcIkhIICdob3VycyBhbmQnIG1tICdtaW51dGVzJ1wiKSAvLz0+ICcyMCBob3VycyBhbmQgNTUgbWludXRlcydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKCksIG9wdHMpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGRhdGUuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyB0aGUgSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBhbmQgYW55IHByZXNldHMgZGVmaW5lZCBieSBMdXhvbiwgc3VjaCBhcyBgRGF0ZVRpbWUuREFURV9GVUxMYCBvciBgRGF0ZVRpbWUuVElNRV9TSU1QTEVgLlxyXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbi5cclxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cclxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV9TSU1QTEUpOyAvLz0+ICcxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe3dlZWtkYXk6ICdsb25nJywgbW9udGg6ICdsb25nJywgZGF5OiAnMi1kaWdpdCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe2hvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnMTE6MzInXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IERBVEVfU0hPUlQ7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBmb3JtYXQgXCJwYXJ0c1wiLCBpLmUuIGluZGl2aWR1YWwgdG9rZW5zIGFsb25nIHdpdGggbWV0YWRhdGEuIFRoaXMgaXMgYWxsb3dzIGNhbGxlcnMgdG8gcG9zdC1wcm9jZXNzIGluZGl2aWR1YWwgc2VjdGlvbnMgb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdC9mb3JtYXRUb1BhcnRzXHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMsIHNhbWUgYXMgYHRvTG9jYWxlU3RyaW5nYC5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gW1xyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0xvY2FsZVBhcnRzID0gZnVuY3Rpb24gdG9Mb2NhbGVQYXJ0cygpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODIsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1J1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArICdUJyArIHRoaXMudG9JU09UaW1lKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICd5eXl5LU1NLWRkJyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgdGltZSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKCkgLy89PiAnMDc6MzQ6MTkuMzYxWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9JU09UaW1lID0gZnVuY3Rpb24gdG9JU09UaW1lKCkge1xuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9IF9yZWY2LnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmNiRzdXBwcmVzc01pbGxpc2UsXG4gICAgICAgIF9yZWY2JHN1cHByZXNzU2Vjb25kcyA9IF9yZWY2LnN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZjYkc3VwcHJlc3NTZWNvbmRzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY2JHN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldDtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHsgc3VwcHJlc3NTZWNvbmRzOiBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcywgaW5jbHVkZU9mZnNldDogaW5jbHVkZU9mZnNldCB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIFJGQyAyODIyLWNvbXBhdGlibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUsIGFsd2F5cyBpbiBVVENcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvUkZDMjgyMiA9IGZ1bmN0aW9uIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICdFRUUsIGRkIExMTCB5eXl5IGhoOm1tOnNzIFpaWicpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSBzdHJpbmcgY29uZm9ybXMgdG8gUkZDIDExMjMuXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMywgMTkpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMTk6MDA6MDAgR01UJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0hUVFAgPSBmdW5jdGlvbiB0b0hUVFAoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLnRvVVRDKCksIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJ1wiKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxEYXRlID0gZnVuY3Rpb24gdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgJ3l5eXktTU0tZGQnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnRvU1FMKCkgLy89PiAnMDU6MTU6MTYuMzQ1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVab25lOiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxUaW1lID0gZnVuY3Rpb24gdG9TUUxUaW1lKCkge1xuICAgIHZhciBfcmVmNyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY3JGluY2x1ZGVPZmZzZXQgPSBfcmVmNy5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjckaW5jbHVkZU9mZnNldCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWY3JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY3JGluY2x1ZGVab25lID0gX3JlZjcuaW5jbHVkZVpvbmUsXG4gICAgICAgIGluY2x1ZGVab25lID0gX3JlZjckaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjckaW5jbHVkZVpvbmU7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7IGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsIGluY2x1ZGVab25lOiBpbmNsdWRlWm9uZSwgc3BhY2Vab25lOiB0cnVlIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIEFtZXJpY2EvTmV3X1lvcmsnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvU1FMID0gZnVuY3Rpb24gdG9TUUwoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgJyAnICsgdGhpcy50b1NRTFRpbWUob3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnRGF0ZVRpbWUge1xcbiAgdHM6ICcgKyB0aGlzLnRvSVNPKCkgKyAnLFxcbiAgem9uZTogJyArIHRoaXMuem9uZS5uYW1lICsgJyxcXG4gIGxvY2FsZTogJyArIHRoaXMubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5vdXRwdXRDYWxlbmRhciA9IHRoaXMub3V0cHV0Q2FsZW5kYXI7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBEYXRlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSlNEYXRlID0gZnVuY3Rpb24gdG9KU0RhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU4pO1xuICB9O1xuXG4gIC8vIENPTVBBUkVcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gRGF0ZVRpbWVzIGFzIGEgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiB2YXIgaTEgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgyLTA1LTI1VDA5OjQ1JyksXHJcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xyXG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxyXG4gICAqIGkyLmRpZmYoaTEsICdob3VycycpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMjE2OC43NSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiBkaWZmKG90aGVyRGF0ZVRpbWUpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ21pbGxpc2Vjb25kcyc7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyRGF0ZVRpbWUuaXNWYWxpZCkgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uIHx8IG90aGVyRGF0ZVRpbWUuaW52YWxpZFJlYXNvbik7XG5cbiAgICB2YXIgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgICAgb3RoZXJJc0xhdGVyID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCkgPiB0aGlzLnZhbHVlT2YoKSxcbiAgICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgICBkaWZmZWQgPSBfZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3coKSB7XG4gICAgdmFyIHVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdtaWxsaXNlY29uZHMnO1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmRpZmYoRGF0ZVRpbWUubG9jYWwoKSwgdW5pdCwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnVudGlsID0gZnVuY3Rpb24gdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVuaXQgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dE1zID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmVuZE9mKHVuaXQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEYXRlVGltZXMgYXJlIGVxdWFsIGlmZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBtaWxsaXNlY29uZFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkICYmIG90aGVyLmlzVmFsaWQgJiYgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJiB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmIHRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWluKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcclxuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgRGF0ZVRpbWVzIGZyb20gd2hpY2ggdG8gY2hvb3NlIHRoZSBtYXhpbXVtXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubWF4ID0gZnVuY3Rpb24gbWF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTtcblxuICAvLyBNSVNDXG5cbiAgLyoqXHJcbiAgICogRXhwbGFpbiBob3cgYSBzdHJpbmcgd291bGQgYmUgcGFyc2VkIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGFrZW4gYnkgZnJvbUZvcm1hdCgpXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4gPSBmdW5jdGlvbiBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIF9vcHRpb25zJGxvY2FsZTIgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJGxvY2FsZTIsXG4gICAgICAgIF9vcHRpb25zJG51bWJlcmluZ1N5czIgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5czIsXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBkZWZhdWx0VG9FTjogdHJ1ZSB9KTtcblxuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxyXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xyXG4gICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvdXRwdXQgY2FsZW5kYXIgb2YgYSBEYXRlVGltZSwgc3VjaCAnaXNsYW1pYycuIFRoZSBvdXRwdXQgY2FsZW5kYXIgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvdXRwdXRDYWxlbmRhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3pvbmVOYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHllYXJcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd5ZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMueWVhciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnF1YXJ0ZXIgLy89PiAyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3F1YXJ0ZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IE1hdGguY2VpbCh0aGlzLmMubW9udGggLyAzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGgnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuZGF5IC8vPT4gMjVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGF5JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBob3VyIG9mIHRoZSBkYXkgKDAtMjMpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIpLnNlY29uZCAvLz0+IDUyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCAoMC05OTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaWxsaXNlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIHllYXJcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrWWVhciAvLz0+IDIwMTVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla1llYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWsgbnVtYmVyIG9mIHRoZSB3ZWVrIHllYXIgKDEtNTJpc2gpLlxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtOdW1iZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxyXG4gICAgICogMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvcmRpbmFsIChpLmUuIHRoZSBkYXkgb2YgdGhlIHllYXIpXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkub3JkaW5hbCAvLz0+IDE0NVxyXG4gICAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvcmRpbmFsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCBtb250aCBuYW1lLCBzdWNoIGFzICdPY3QnLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0b2JlcicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aExvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKCdsb25nJywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IHdlZWtkYXksIHN1Y2ggYXMgJ01vbicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtkYXlTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIHdlZWtkYXksIHN1Y2ggYXMgJ01vbmRheScuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoJ2xvbmcnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IG9mIHRoaXMgRGF0ZVRpbWUgaW4gbWludXRlc1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5vZmZzZXQgLy89PiAtMjQwXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5vZmZzZXQgLy89PiAwXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldE5hbWVTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiAnc2hvcnQnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2Zmc2V0TmFtZUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogJ2xvbmcnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaXNPZmZzZXRGaXhlZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLnVuaXZlcnNhbCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luRFNUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmICh0aGlzLmlzT2Zmc2V0Rml4ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogMSB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiA1IH0pLm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luTGVhcFllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkYXlzSW5Nb250aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXNJblllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGRheXNJblllYXIodGhpcy55ZWFyKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3NJbldlZWtZZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdEQVRFX1NIT1JUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX01FRCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9NRUQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX0ZVTEwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVfSFVHRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9IVUdFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9TSU1QTEUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfU0lNUExFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfV0lUSF9TSE9SVF9PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX0xPTkdfT0ZGU0VUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1NJTVBMRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9TSU1QTEU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfU0hPUlQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRUQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfRlVMTCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERhdGVUaW1lO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBEYXRlVGltZSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiZnVuY3Rpb24gQWdlbnQoKSB7XG4gIHRoaXMuX2RlZmF1bHRzID0gW107XG59XG5cbltcInVzZVwiLCBcIm9uXCIsIFwib25jZVwiLCBcInNldFwiLCBcInF1ZXJ5XCIsIFwidHlwZVwiLCBcImFjY2VwdFwiLCBcImF1dGhcIiwgXCJ3aXRoQ3JlZGVudGlhbHNcIiwgXCJzb3J0UXVlcnlcIiwgXCJyZXRyeVwiLCBcIm9rXCIsIFwicmVkaXJlY3RzXCIsXG4gXCJ0aW1lb3V0XCIsIFwiYnVmZmVyXCIsIFwic2VyaWFsaXplXCIsIFwicGFyc2VcIiwgXCJjYVwiLCBcImtleVwiLCBcInBmeFwiLCBcImNlcnRcIl0uZm9yRWFjaChmdW5jdGlvbihmbikge1xuICAvKiogRGVmYXVsdCBzZXR0aW5nIGZvciBhbGwgcmVxdWVzdHMgZnJvbSB0aGlzIGFnZW50ICovXG4gIEFnZW50LnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbigvKnZhcmFyZ3MqLykge1xuICAgIHRoaXMuX2RlZmF1bHRzLnB1c2goe2ZuOmZuLCBhcmd1bWVudHM6YXJndW1lbnRzfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn0pO1xuXG5BZ2VudC5wcm90b3R5cGUuX3NldERlZmF1bHRzID0gZnVuY3Rpb24ocmVxKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcbiAgICAgIHJlcVtkZWYuZm5dLmFwcGx5KHJlcSwgZGVmLmFyZ3VtZW50cyk7XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZW50O1xuIiwiLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG52YXIgcm9vdDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgeyAvLyBCcm93c2VyIHdpbmRvd1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gV2ViIFdvcmtlclxuICByb290ID0gc2VsZjtcbn0gZWxzZSB7IC8vIE90aGVyIGVudmlyb25tZW50c1xuICBjb25zb2xlLndhcm4oXCJVc2luZyBicm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGluIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuICByb290ID0gdGhpcztcbn1cblxudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi9yZXF1ZXN0LWJhc2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG52YXIgUmVzcG9uc2VCYXNlID0gcmVxdWlyZSgnLi9yZXNwb25zZS1iYXNlJyk7XG52YXIgQWdlbnQgPSByZXF1aXJlKCcuL2FnZW50LWJhc2UnKTtcblxuLyoqXG4gKiBOb29wLlxuICovXG5cbmZ1bmN0aW9uIG5vb3AoKXt9O1xuXG4vKipcbiAqIEV4cG9zZSBgcmVxdWVzdGAuXG4gKi9cblxudmFyIHJlcXVlc3QgPSBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIERldGVybWluZSBYSFIuXG4gKi9cblxucmVxdWVzdC5nZXRYSFIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChyb290LlhNTEh0dHBSZXF1ZXN0XG4gICAgICAmJiAoIXJvb3QubG9jYXRpb24gfHwgJ2ZpbGU6JyAhPSByb290LmxvY2F0aW9uLnByb3RvY29sXG4gICAgICAgICAgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICB9IGVsc2Uge1xuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gIH1cbiAgdGhyb3cgRXJyb3IoXCJCcm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGNvdWxkIG5vdCBmaW5kIFhIUlwiKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhZGRlZCB0byBzdXBwb3J0IElFLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgdHJpbSA9ICcnLnRyaW1cbiAgPyBmdW5jdGlvbihzKSB7IHJldHVybiBzLnRyaW0oKTsgfVxuICA6IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLCAnJyk7IH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBnaXZlbiBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUob2JqKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgdmFyIHBhaXJzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCBvYmpba2V5XSk7XG4gIH1cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBIZWxwcyAnc2VyaWFsaXplJyB3aXRoIHNlcmlhbGl6aW5nIGFycmF5cy5cbiAqIE11dGF0ZXMgdGhlIHBhaXJzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqL1xuXG5mdW5jdGlvbiBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2YWwpIHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgZm9yKHZhciBzdWJrZXkgaW4gdmFsKSB7XG4gICAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXkgKyAnWycgKyBzdWJrZXkgKyAnXScsIHZhbFtzdWJrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgICAgICArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemVPYmplY3QgPSBzZXJpYWxpemU7XG5cbi8qKlxuICAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuXG4gICpcbiAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICogQHJldHVybiB7T2JqZWN0fVxuICAqIEBhcGkgcHJpdmF0ZVxuICAqL1xuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICB2YXIgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTtcbiAgdmFyIHBhaXI7XG4gIHZhciBwb3M7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhaXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT0gLTEpIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpcildID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZSgwLCBwb3MpKV0gPVxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZShwb3MgKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ3RleHQveG1sJyxcbiAgdXJsZW5jb2RlZDogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtLWRhdGEnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuLyoqXG4gKiBEZWZhdWx0IHNlcmlhbGl6YXRpb24gbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihvYmope1xuICogICAgICAgcmV0dXJuICdnZW5lcmF0ZWQgeG1sIGhlcmUnO1xuICogICAgIH07XG4gKlxuICovXG5cbnJlcXVlc3Quc2VyaWFsaXplID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAnYXBwbGljYXRpb24vanNvbic6IEpTT04uc3RyaW5naWZ5XG59O1xuXG4vKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbGluZSA9IGxpbmVzW2ldO1xuICAgIGluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgeyAvLyBjb3VsZCBiZSBlbXB0eSBsaW5lLCBqdXN0IHNraXAgaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICAvLyBzaG91bGQgbWF0Y2ggL2pzb24gb3IgK2pzb25cbiAgLy8gYnV0IG5vdCAvanNvbi1zZXFcbiAgcmV0dXJuIC9bXFwvK11qc29uKCR8W14tXFx3XSkvLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSkge1xuICB0aGlzLnJlcSA9IHJlcTtcbiAgdGhpcy54aHIgPSB0aGlzLnJlcS54aHI7XG4gIC8vIHJlc3BvbnNlVGV4dCBpcyBhY2Nlc3NpYmxlIG9ubHkgaWYgcmVzcG9uc2VUeXBlIGlzICcnIG9yICd0ZXh0JyBhbmQgb24gb2xkZXIgYnJvd3NlcnNcbiAgdGhpcy50ZXh0ID0gKCh0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgJiYgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fCB0eXBlb2YgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgPyB0aGlzLnhoci5yZXNwb25zZVRleHRcbiAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgdmFyIHN0YXR1cyA9IHRoaXMueGhyLnN0YXR1cztcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG4gIHRoaXMuX3NldFN0YXR1c1Byb3BlcnRpZXMoc3RhdHVzKTtcbiAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIC8vIGdldEFsbFJlc3BvbnNlSGVhZGVycyBzb21ldGltZXMgZmFsc2VseSByZXR1cm5zIFwiXCIgZm9yIENPUlMgcmVxdWVzdHMsIGJ1dFxuICAvLyBnZXRSZXNwb25zZUhlYWRlciBzdGlsbCB3b3Jrcy4gc28gd2UgZ2V0IGNvbnRlbnQtdHlwZSBldmVuIGlmIGdldHRpbmdcbiAgLy8gb3RoZXIgaGVhZGVycyBmYWlscy5cbiAgdGhpcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpO1xuICB0aGlzLl9zZXRIZWFkZXJQcm9wZXJ0aWVzKHRoaXMuaGVhZGVyKTtcblxuICBpZiAobnVsbCA9PT0gdGhpcy50ZXh0ICYmIHJlcS5fcmVzcG9uc2VUeXBlKSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy54aHIucmVzcG9uc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy5yZXEubWV0aG9kICE9ICdIRUFEJ1xuICAgICAgPyB0aGlzLl9wYXJzZUJvZHkodGhpcy50ZXh0ID8gdGhpcy50ZXh0IDogdGhpcy54aHIucmVzcG9uc2UpXG4gICAgICA6IG51bGw7XG4gIH1cbn1cblxuUmVzcG9uc2VCYXNlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuX3BhcnNlQm9keSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgcGFyc2UgPSByZXF1ZXN0LnBhcnNlW3RoaXMudHlwZV07XG4gIGlmICh0aGlzLnJlcS5fcGFyc2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLl9wYXJzZXIodGhpcywgc3RyKTtcbiAgfVxuICBpZiAoIXBhcnNlICYmIGlzSlNPTih0aGlzLnR5cGUpKSB7XG4gICAgcGFyc2UgPSByZXF1ZXN0LnBhcnNlWydhcHBsaWNhdGlvbi9qc29uJ107XG4gIH1cbiAgcmV0dXJuIHBhcnNlICYmIHN0ciAmJiAoc3RyLmxlbmd0aCB8fCBzdHIgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgPyBwYXJzZShzdHIpXG4gICAgOiBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYEVycm9yYCByZXByZXNlbnRhdGl2ZSBvZiB0aGlzIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm4ge0Vycm9yfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUudG9FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gIHZhciB1cmwgPSByZXEudXJsO1xuXG4gIHZhciBtc2cgPSAnY2Fubm90ICcgKyBtZXRob2QgKyAnICcgKyB1cmwgKyAnICgnICsgdGhpcy5zdGF0dXMgKyAnKSc7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gbWV0aG9kO1xuICBlcnIudXJsID0gdXJsO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VgLlxuICovXG5cbnJlcXVlc3QuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG1ldGhvZCwgdXJsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeSB8fCBbXTtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICB0aGlzLmhlYWRlciA9IHt9OyAvLyBwcmVzZXJ2ZXMgaGVhZGVyIG5hbWUgY2FzZVxuICB0aGlzLl9oZWFkZXIgPSB7fTsgLy8gY29lcmNlcyBoZWFkZXIgbmFtZXMgdG8gbG93ZXJjYXNlXG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgZXJyID0gbmV3IEVycm9yKCdQYXJzZXIgaXMgdW5hYmxlIHRvIHBhcnNlIHRoZSByZXNwb25zZScpO1xuICAgICAgZXJyLnBhcnNlID0gdHJ1ZTtcbiAgICAgIGVyci5vcmlnaW5hbCA9IGU7XG4gICAgICAvLyBpc3N1ZSAjNjc1OiByZXR1cm4gdGhlIHJhdyByZXNwb25zZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgaWYgKHNlbGYueGhyKSB7XG4gICAgICAgIC8vIGllOSBkb2Vzbid0IGhhdmUgJ3Jlc3BvbnNlJyBwcm9wZXJ0eVxuICAgICAgICBlcnIucmF3UmVzcG9uc2UgPSB0eXBlb2Ygc2VsZi54aHIucmVzcG9uc2VUeXBlID09ICd1bmRlZmluZWQnID8gc2VsZi54aHIucmVzcG9uc2VUZXh0IDogc2VsZi54aHIucmVzcG9uc2U7XG4gICAgICAgIC8vIGlzc3VlICM4NzY6IHJldHVybiB0aGUgaHR0cCBzdGF0dXMgY29kZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgICBlcnIuc3RhdHVzID0gc2VsZi54aHIuc3RhdHVzID8gc2VsZi54aHIuc3RhdHVzIDogbnVsbDtcbiAgICAgICAgZXJyLnN0YXR1c0NvZGUgPSBlcnIuc3RhdHVzOyAvLyBiYWNrd2FyZHMtY29tcGF0IG9ubHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyci5yYXdSZXNwb25zZSA9IG51bGw7XG4gICAgICAgIGVyci5zdGF0dXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgncmVzcG9uc2UnLCByZXMpO1xuXG4gICAgdmFyIG5ld19lcnI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghc2VsZi5faXNSZXNwb25zZU9LKHJlcykpIHtcbiAgICAgICAgbmV3X2VyciA9IG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCB8fCAnVW5zdWNjZXNzZnVsIEhUVFAgcmVzcG9uc2UnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGN1c3RvbV9lcnIpIHtcbiAgICAgIG5ld19lcnIgPSBjdXN0b21fZXJyOyAvLyBvaygpIGNhbGxiYWNrIGNhbiB0aHJvd1xuICAgIH1cblxuICAgIC8vICMxMDAwIGRvbid0IGNhdGNoIGVycm9ycyBmcm9tIHRoZSBjYWxsYmFjayB0byBhdm9pZCBkb3VibGUgY2FsbGluZyBpdFxuICAgIGlmIChuZXdfZXJyKSB7XG4gICAgICBuZXdfZXJyLm9yaWdpbmFsID0gZXJyO1xuICAgICAgbmV3X2Vyci5yZXNwb25zZSA9IHJlcztcbiAgICAgIG5ld19lcnIuc3RhdHVzID0gcmVzLnN0YXR1cztcbiAgICAgIHNlbGYuY2FsbGJhY2sobmV3X2VyciwgcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5jYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWl4aW4gYEVtaXR0ZXJgIGFuZCBgUmVxdWVzdEJhc2VgLlxuICovXG5cbkVtaXR0ZXIoUmVxdWVzdC5wcm90b3R5cGUpO1xuUmVxdWVzdEJhc2UoUmVxdWVzdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbcGFzc10gb3B0aW9uYWwgaW4gY2FzZSBvZiB1c2luZyAnYmVhcmVyJyBhcyB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB3aXRoICd0eXBlJyBwcm9wZXJ0eSAnYXV0bycsICdiYXNpYycgb3IgJ2JlYXJlcicgKGRlZmF1bHQgJ2Jhc2ljJylcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdXRoID0gZnVuY3Rpb24odXNlciwgcGFzcywgb3B0aW9ucyl7XG4gIGlmICgxID09PSBhcmd1bWVudHMubGVuZ3RoKSBwYXNzID0gJyc7XG4gIGlmICh0eXBlb2YgcGFzcyA9PT0gJ29iamVjdCcgJiYgcGFzcyAhPT0gbnVsbCkgeyAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYnRvYSA/ICdiYXNpYycgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIHZhciBlbmNvZGVyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBidG9hKSB7XG4gICAgICByZXR1cm4gYnRvYShzdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYmFzaWMgYXV0aCwgYnRvYSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9O1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4gKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiAqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uKHZhbCl7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdmFsKSB2YWwgPSBzZXJpYWxpemUodmFsKTtcbiAgaWYgKHZhbCkgdGhpcy5fcXVlcnkucHVzaCh2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYG9wdGlvbnNgIChvciBmaWxlbmFtZSkuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuYXR0YWNoKCdjb250ZW50JywgbmV3IEJsb2IoWyc8YSBpZD1cImFcIj48YiBpZD1cImJcIj5oZXkhPC9iPjwvYT4nXSwgeyB0eXBlOiBcInRleHQvaHRtbFwifSkpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge0Jsb2J8RmlsZX0gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oZmllbGQsIGZpbGUsIG9wdGlvbnMpe1xuICBpZiAoZmlsZSkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICB0aHJvdyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgb3B0aW9ucyB8fCBmaWxlLm5hbWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhID0gZnVuY3Rpb24oKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZm9ybURhdGE7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24oZXJyLCByZXMpe1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICB2YXIgZm4gPSB0aGlzLl9jYWxsYmFjaztcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcblxuICBpZiAoZXJyKSB7XG4gICAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVyci5yZXRyaWVzID0gdGhpcy5fcmV0cmllcyAtIDE7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBmbihlcnIsIHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcXG5Qb3NzaWJsZSBjYXVzZXM6IHRoZSBuZXR3b3JrIGlzIG9mZmxpbmUsIE9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4sIHRoZSBwYWdlIGlzIGJlaW5nIHVubG9hZGVkLCBldGMuJyk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG5cbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIGVyci51cmwgPSB0aGlzLnVybDtcblxuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vLyBUaGlzIG9ubHkgd2FybnMsIGJlY2F1c2UgdGhlIHJlcXVlc3QgaXMgc3RpbGwgbGlrZWx5IHRvIHdvcmtcblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IFJlcXVlc3QucHJvdG90eXBlLmNhID0gUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbigpe1xuICBjb25zb2xlLndhcm4oXCJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gVGhpcyB0aHJvd3MsIGJlY2F1c2UgaXQgY2FuJ3Qgc2VuZC9yZWNlaXZlIGRhdGEgYXMgZXhwZWN0ZWRcblJlcXVlc3QucHJvdG90eXBlLnBpcGUgPSBSZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKCl7XG4gIHRocm93IEVycm9yKFwiU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgaG9zdCBvYmplY3QsXG4gKiB3ZSBkb24ndCB3YW50IHRvIHNlcmlhbGl6ZSB0aGVzZSA6KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2lzSG9zdCA9IGZ1bmN0aW9uIF9pc0hvc3Qob2JqKSB7XG4gIC8vIE5hdGl2ZSBvYmplY3RzIHN0cmluZ2lmeSB0byBbb2JqZWN0IEZpbGVdLCBbb2JqZWN0IEJsb2JdLCBbb2JqZWN0IEZvcm1EYXRhXSwgZXRjLlxuICByZXR1cm4gb2JqICYmICdvYmplY3QnID09PSB0eXBlb2Ygb2JqICYmICFBcnJheS5pc0FycmF5KG9iaikgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbil7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiAuZW5kKCkgd2FzIGNhbGxlZCB0d2ljZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIHN1cGVyYWdlbnRcIik7XG4gIH1cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuXG4gIHJldHVybiB0aGlzLl9lbmQoKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgeGhyID0gKHRoaXMueGhyID0gcmVxdWVzdC5nZXRYSFIoKSk7XG4gIHZhciBkYXRhID0gdGhpcy5fZm9ybURhdGEgfHwgdGhpcy5fZGF0YTtcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHhoci5yZWFkeVN0YXRlO1xuICAgIGlmIChyZWFkeVN0YXRlID49IDIgJiYgc2VsZi5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gICAgfVxuICAgIGlmICg0ICE9IHJlYWR5U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBJRTksIHJlYWRzIHRvIGFueSBwcm9wZXJ0eSAoZS5nLiBzdGF0dXMpIG9mZiBvZiBhbiBhYm9ydGVkIFhIUiB3aWxsXG4gICAgLy8gcmVzdWx0IGluIHRoZSBlcnJvciBcIkNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIGR1ZSB0byBlcnJvciBjMDBjMDIzZlwiXG4gICAgdmFyIHN0YXR1cztcbiAgICB0cnkgeyBzdGF0dXMgPSB4aHIuc3RhdHVzIH0gY2F0Y2goZSkgeyBzdGF0dXMgPSAwOyB9XG5cbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgaWYgKHNlbGYudGltZWRvdXQgfHwgc2VsZi5fYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgcmV0dXJuIHNlbGYuY3Jvc3NEb21haW5FcnJvcigpO1xuICAgIH1cbiAgICBzZWxmLmVtaXQoJ2VuZCcpO1xuICB9O1xuXG4gIC8vIHByb2dyZXNzXG4gIHZhciBoYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZSkge1xuICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgIH1cbiAgICBlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzZWxmLmVtaXQoJ3Byb2dyZXNzJywgZSk7XG4gIH07XG4gIGlmICh0aGlzLmhhc0xpc3RlbmVycygncHJvZ3Jlc3MnKSkge1xuICAgIHRyeSB7XG4gICAgICB4aHIub25wcm9ncmVzcyA9IGhhbmRsZVByb2dyZXNzLmJpbmQobnVsbCwgJ2Rvd25sb2FkJyk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICd1cGxvYWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIC8vIEFjY2Vzc2luZyB4aHIudXBsb2FkIGZhaWxzIGluIElFIGZyb20gYSB3ZWIgd29ya2VyLCBzbyBqdXN0IHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgIC8vIFJlcG9ydGVkIGhlcmU6XG4gICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgzNzI0NS94bWxodHRwcmVxdWVzdC11cGxvYWQtdGhyb3dzLWludmFsaWQtYXJndW1lbnQtd2hlbi11c2VkLWZyb20td2ViLXdvcmtlci1jb250ZXh0XG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICB0cnkge1xuICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSwgdGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBzZWUgIzExNDlcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gQ09SU1xuICBpZiAodGhpcy5fd2l0aENyZWRlbnRpYWxzKSB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAvLyBib2R5XG4gIGlmICghdGhpcy5fZm9ybURhdGEgJiYgJ0dFVCcgIT0gdGhpcy5tZXRob2QgJiYgJ0hFQUQnICE9IHRoaXMubWV0aG9kICYmICdzdHJpbmcnICE9IHR5cGVvZiBkYXRhICYmICF0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICAvLyBzZXJpYWxpemUgc3R1ZmZcbiAgICB2YXIgY29udGVudFR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIHZhciBzZXJpYWxpemUgPSB0aGlzLl9zZXJpYWxpemVyIHx8IHJlcXVlc3Quc2VyaWFsaXplW2NvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXSA6ICcnXTtcbiAgICBpZiAoIXNlcmlhbGl6ZSAmJiBpc0pTT04oY29udGVudFR5cGUpKSB7XG4gICAgICBzZXJpYWxpemUgPSByZXF1ZXN0LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGhlYWRlciBmaWVsZHNcbiAgZm9yICh2YXIgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAobnVsbCA9PSB0aGlzLmhlYWRlcltmaWVsZF0pIGNvbnRpbnVlO1xuXG4gICAgaWYgKHRoaXMuaGVhZGVyLmhhc093blByb3BlcnR5KGZpZWxkKSlcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgOiBudWxsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5yZXF1ZXN0LmFnZW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgQWdlbnQoKTtcbn07XG5cbltcIkdFVFwiLCBcIlBPU1RcIiwgXCJPUFRJT05TXCIsIFwiUEFUQ0hcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgQWdlbnQucHJvdG90eXBlW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IGZ1bmN0aW9uKHVybCwgZm4pIHtcbiAgICB2YXIgcmVxID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdHMocmVxKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcS5lbmQoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9O1xufSk7XG5cbkFnZW50LnByb3RvdHlwZS5kZWwgPSBBZ2VudC5wcm90b3R5cGVbJ2RlbGV0ZSddO1xuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuZ2V0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5oZWFkID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5xdWVyeShkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogT1BUSU9OUyBxdWVyeSB0byBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3Qub3B0aW9ucyA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ09QVElPTlMnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogREVMRVRFIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWwodXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnREVMRVRFJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59XG5cbnJlcXVlc3RbJ2RlbCddID0gZGVsO1xucmVxdWVzdFsnZGVsZXRlJ10gPSBkZWw7XG5cbi8qKlxuICogUEFUQ0ggYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucGF0Y2ggPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQT1NUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBVVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQVVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIG51bGwgIT09IG9iaiAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgb2YgbWl4ZWQtaW4gZnVuY3Rpb25zIHNoYXJlZCBiZXR3ZWVuIG5vZGUgYW5kIGNsaWVudCBjb2RlXG4gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0QmFzZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0QmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0QmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0QmFzZShvYmopIHtcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XG59XG5cbi8qKlxuICogTWl4aW4gdGhlIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gUmVxdWVzdEJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBfY2xlYXJUaW1lb3V0KCl7XG4gIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gIGRlbGV0ZSB0aGlzLl90aW1lcjtcbiAgZGVsZXRlIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXNwb25zZSBib2R5IHBhcnNlclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBpbmNvbWluZyBkYXRhIGludG8gcmVxdWVzdC5ib2R5XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UoZm4pe1xuICB0aGlzLl9wYXJzZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBmb3JtYXQgb2YgYmluYXJ5IHJlc3BvbnNlIGJvZHkuXG4gKiBJbiBicm93c2VyIHZhbGlkIGZvcm1hdHMgYXJlICdibG9iJyBhbmQgJ2FycmF5YnVmZmVyJyxcbiAqIHdoaWNoIHJldHVybiBCbG9iIGFuZCBBcnJheUJ1ZmZlciwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIE5vZGUgYWxsIHZhbHVlcyByZXN1bHQgaW4gQnVmZmVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnJlc3BvbnNlVHlwZSgnYmxvYicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbih2YWwpe1xuICB0aGlzLl9yZXNwb25zZVR5cGUgPSB2YWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlcXVlc3QgYm9keSBzZXJpYWxpemVyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGRhdGEgc2V0IHZpYSAuc2VuZCBvciAuYXR0YWNoIGludG8gcGF5bG9hZCB0byBzZW5kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZShmbil7XG4gIHRoaXMuX3NlcmlhbGl6ZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aW1lb3V0cy5cbiAqXG4gKiAtIHJlc3BvbnNlIHRpbWVvdXQgaXMgdGltZSBiZXR3ZWVuIHNlbmRpbmcgcmVxdWVzdCBhbmQgcmVjZWl2aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS4gSW5jbHVkZXMgRE5TIGFuZCBjb25uZWN0aW9uIHRpbWUuXG4gKiAtIGRlYWRsaW5lIGlzIHRoZSB0aW1lIGZyb20gc3RhcnQgb2YgdGhlIHJlcXVlc3QgdG8gcmVjZWl2aW5nIHJlc3BvbnNlIGJvZHkgaW4gZnVsbC4gSWYgdGhlIGRlYWRsaW5lIGlzIHRvbyBzaG9ydCBsYXJnZSBmaWxlcyBtYXkgbm90IGxvYWQgYXQgYWxsIG9uIHNsb3cgY29ubmVjdGlvbnMuXG4gKlxuICogVmFsdWUgb2YgMCBvciBmYWxzZSBtZWFucyBubyB0aW1lb3V0LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gbXMgb3Ige3Jlc3BvbnNlLCBkZWFkbGluZX1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIHRpbWVvdXQob3B0aW9ucyl7XG4gIGlmICghb3B0aW9ucyB8fCAnb2JqZWN0JyAhPT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucztcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIHN3aXRjaChvcHRpb24pIHtcbiAgICAgIGNhc2UgJ2RlYWRsaW5lJzpcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG9wdGlvbnMuZGVhZGxpbmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUud2FybihcIlVua25vd24gdGltZW91dCBvcHRpb25cIiwgb3B0aW9uKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgb24gZXJyb3IuXG4gKlxuICogRmFpbGVkIHJlcXVlc3RzIHdpbGwgYmUgcmV0cmllZCAnY291bnQnIHRpbWVzIGlmIHRpbWVvdXQgb3IgZXJyLmNvZGUgPj0gNTAwLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uIHJldHJ5KGNvdW50LCBmbil7XG4gIC8vIERlZmF1bHQgdG8gMSBpZiBubyBjb3VudCBwYXNzZWQgb3IgdHJ1ZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBjb3VudCA9PT0gdHJ1ZSkgY291bnQgPSAxO1xuICBpZiAoY291bnQgPD0gMCkgY291bnQgPSAwO1xuICB0aGlzLl9tYXhSZXRyaWVzID0gY291bnQ7XG4gIHRoaXMuX3JldHJpZXMgPSAwO1xuICB0aGlzLl9yZXRyeUNhbGxiYWNrID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIEVSUk9SX0NPREVTID0gW1xuICAnRUNPTk5SRVNFVCcsXG4gICdFVElNRURPVVQnLFxuICAnRUFERFJJTkZPJyxcbiAgJ0VTT0NLRVRUSU1FRE9VVCdcbl07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZC5cbiAqIChCb3Jyb3dlZCBmcm9tIHNlZ21lbnRpby9zdXBlcmFnZW50LXJldHJ5KVxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3Nob3VsZFJldHJ5ID0gZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgaWYgKCF0aGlzLl9tYXhSZXRyaWVzIHx8IHRoaXMuX3JldHJpZXMrKyA+PSB0aGlzLl9tYXhSZXRyaWVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLl9yZXRyeUNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBvdmVycmlkZSA9IHRoaXMuX3JldHJ5Q2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgaWYgKG92ZXJyaWRlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChvdmVycmlkZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIHVuZGVmaW5lZCBmYWxscyBiYWNrIHRvIGRlZmF1bHRzXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBpZiAocmVzICYmIHJlcy5zdGF0dXMgJiYgcmVzLnN0YXR1cyA+PSA1MDAgJiYgcmVzLnN0YXR1cyAhPSA1MDEpIHJldHVybiB0cnVlO1xuICBpZiAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICYmIH5FUlJPUl9DT0RFUy5pbmRleE9mKGVyci5jb2RlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gU3VwZXJhZ2VudCB0aW1lb3V0XG4gICAgaWYgKGVyci50aW1lb3V0ICYmIGVyci5jb2RlID09ICdFQ09OTkFCT1JURUQnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXJyLmNyb3NzRG9tYWluKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHJ5IHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fcmV0cnkgPSBmdW5jdGlvbigpIHtcblxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIC8vIG5vZGVcbiAgaWYgKHRoaXMucmVxKSB7XG4gICAgdGhpcy5yZXEgPSBudWxsO1xuICAgIHRoaXMucmVxID0gdGhpcy5yZXF1ZXN0KCk7XG4gIH1cblxuICB0aGlzLl9hYm9ydGVkID0gZmFsc2U7XG4gIHRoaXMudGltZWRvdXQgPSBmYWxzZTtcblxuICByZXR1cm4gdGhpcy5fZW5kKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2Ugc3VwcG9ydFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZWplY3RdXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgaWYgKCF0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBzdXBlcmFnZW50IHJlcXVlc3Qgd2FzIHNlbnQgdHdpY2UsIGJlY2F1c2UgYm90aCAuZW5kKCkgYW5kIC50aGVuKCkgd2VyZSBjYWxsZWQuIE5ldmVyIGNhbGwgLmVuZCgpIGlmIHlvdSB1c2UgcHJvbWlzZXNcIik7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oaW5uZXJSZXNvbHZlLCBpbm5lclJlamVjdCkge1xuICAgICAgc2VsZi5lbmQoZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikgaW5uZXJSZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSBpbm5lclJlc29sdmUocmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGVbJ2NhdGNoJ10gPSBmdW5jdGlvbihjYikge1xuICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgY2IpO1xufTtcblxuLyoqXG4gKiBBbGxvdyBmb3IgZXh0ZW5zaW9uXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICBmbih0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUub2sgPSBmdW5jdGlvbihjYikge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGNiKSB0aHJvdyBFcnJvcihcIkNhbGxiYWNrIHJlcXVpcmVkXCIpO1xuICB0aGlzLl9va0NhbGxiYWNrID0gY2I7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9pc1Jlc3BvbnNlT0sgPSBmdW5jdGlvbihyZXMpIHtcbiAgaWYgKCFyZXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fb2tDYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLl9va0NhbGxiYWNrKHJlcyk7XG4gIH1cblxuICByZXR1cm4gcmVzLnN0YXR1cyA+PSAyMDAgJiYgcmVzLnN0YXR1cyA8IDMwMDtcbn07XG5cbi8qKlxuICogR2V0IHJlcXVlc3QgaGVhZGVyIGBmaWVsZGAuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICByZXR1cm4gdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBoZWFkZXIgYGZpZWxkYCB2YWx1ZS5cbiAqIFRoaXMgaXMgYSBkZXByZWNhdGVkIGludGVybmFsIEFQSS4gVXNlIGAuZ2V0KGZpZWxkKWAgaW5zdGVhZC5cbiAqXG4gKiAoZ2V0SGVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN1cGVyYWdlbnQgY29kZSBiYXNlKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXRIZWFkZXIgPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNldCgnWC1BUEktS2V5JywgJ2Zvb2JhcicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdYLUFQSS1LZXknOiAnZm9vYmFyJyB9KVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnVuc2V0KCdVc2VyLUFnZW50JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xuICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGUgdGhlIGZpZWxkIGBuYW1lYCBhbmQgYHZhbGAsIG9yIG11bHRpcGxlIGZpZWxkcyB3aXRoIG9uZSBvYmplY3RcbiAqIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiByZXF1ZXN0IGJvZGllcy5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCgnZm9vJywgJ2JhcicpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCh7IGZvbzogJ2JhcicsIGJhejogJ3F1eCcgfSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfEJsb2J8RmlsZXxCdWZmZXJ8ZnMuUmVhZFN0cmVhbX0gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuICAvLyBuYW1lIHNob3VsZCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LlxuICBpZiAobnVsbCA9PT0gbmFtZSB8fCB1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIG5hbWUgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLmZpZWxkKCkgY2FuJ3QgYmUgdXNlZCBpZiAuc2VuZCgpIGlzIHVzZWQuIFBsZWFzZSB1c2Ugb25seSAuc2VuZCgpIG9yIG9ubHkgLmZpZWxkKCkgJiAuYXR0YWNoKClcIik7XG4gIH1cblxuICBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgdGhpcy5maWVsZChrZXksIG5hbWVba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIGZvciAodmFyIGkgaW4gdmFsKSB7XG4gICAgICB0aGlzLmZpZWxkKG5hbWUsIHZhbFtpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdmFsIHNob3VsZCBiZSBkZWZpbmVkIG5vd1xuICBpZiAobnVsbCA9PT0gdmFsIHx8IHVuZGVmaW5lZCA9PT0gdmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCcuZmllbGQobmFtZSwgdmFsKSB2YWwgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGlmICgnYm9vbGVhbicgPT09IHR5cGVvZiB2YWwpIHtcbiAgICB2YWwgPSAnJyArIHZhbDtcbiAgfVxuICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChuYW1lLCB2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0aGlzLl9hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIgJiYgdGhpcy54aHIuYWJvcnQoKTsgLy8gYnJvd3NlclxuICB0aGlzLnJlcSAmJiB0aGlzLnJlcS5hYm9ydCgpOyAvLyBub2RlXG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIHRoaXMuZW1pdCgnYWJvcnQnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2F1dGggPSBmdW5jdGlvbih1c2VyLCBwYXNzLCBvcHRpb25zLCBiYXNlNjRFbmNvZGVyKSB7XG4gIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgY2FzZSAnYmFzaWMnOlxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGJhc2U2NEVuY29kZXIodXNlciArICc6JyArIHBhc3MpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYXV0byc6XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcjtcbiAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWFyZXInOiAvLyB1c2FnZSB3b3VsZCBiZSAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB1c2VyKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbmFibGUgdHJhbnNtaXNzaW9uIG9mIGNvb2tpZXMgd2l0aCB4LWRvbWFpbiByZXF1ZXN0cy5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHRoaXMgdG8gd29yayB0aGUgb3JpZ2luIG11c3Qgbm90IGJlXG4gKiB1c2luZyBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiIHdpdGggYSB3aWxkY2FyZCxcbiAqIGFuZCBhbHNvIG11c3Qgc2V0IFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIlxuICogdG8gXCJ0cnVlXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24ob24pIHtcbiAgLy8gVGhpcyBpcyBicm93c2VyLW9ubHkgZnVuY3Rpb25hbGl0eS4gTm9kZSBzaWRlIGlzIG5vLW9wLlxuICBpZiAob24gPT0gdW5kZWZpbmVkKSBvbiA9IHRydWU7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IG9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYXggcmVkaXJlY3RzIHRvIGBuYC4gRG9lcyBub3RpbmcgaW4gYnJvd3NlciBYSFIgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmVkaXJlY3RzID0gZnVuY3Rpb24obil7XG4gIHRoaXMuX21heFJlZGlyZWN0cyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpemUgb2YgYnVmZmVyZWQgcmVzcG9uc2UgYm9keSwgaW4gYnl0ZXMuIENvdW50cyB1bmNvbXByZXNzZWQgc2l6ZS5cbiAqIERlZmF1bHQgMjAwTUIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUubWF4UmVzcG9uc2VTaXplID0gZnVuY3Rpb24obil7XG4gIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIG4pIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50XCIpO1xuICB9XG4gIHRoaXMuX21heFJlc3BvbnNlU2l6ZSA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRvIGEgcGxhaW4gamF2YXNjcmlwdCBvYmplY3QgKG5vdCBKU09OIHN0cmluZykgb2Ygc2NhbGFyIHByb3BlcnRpZXMuXG4gKiBOb3RlIGFzIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJldHVybiBhIHVzZWZ1bCBub24tdGhpcyB2YWx1ZSxcbiAqIGl0IGNhbm5vdCBiZSBjaGFpbmVkLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gZGVzY3JpYmluZyBtZXRob2QsIHVybCwgYW5kIGRhdGEgb2YgdGhpcyByZXF1ZXN0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgIHVybDogdGhpcy51cmwsXG4gICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICBoZWFkZXJzOiB0aGlzLl9oZWFkZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgIGFzIHRoZSByZXF1ZXN0IGJvZHksIGRlZmF1bHRpbmcgdGhlIGAudHlwZSgpYCB0byBcImpzb25cIiB3aGVuXG4gKiBhbiBvYmplY3QgaXMgZ2l2ZW4uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gbWFudWFsIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgIC5zZW5kKCd7XCJuYW1lXCI6XCJ0alwifScpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZGF0YVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oZGF0YSl7XG4gIHZhciBpc09iaiA9IGlzT2JqZWN0KGRhdGEpO1xuICB2YXIgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG5cbiAgaWYgKHRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi5zZW5kKCkgY2FuJ3QgYmUgdXNlZCBpZiAuYXR0YWNoKCkgb3IgLmZpZWxkKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiKTtcbiAgfVxuXG4gIGlmIChpc09iaiAmJiAhdGhpcy5fZGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEgJiYgdGhpcy5fZGF0YSAmJiB0aGlzLl9pc0hvc3QodGhpcy5fZGF0YSkpIHtcbiAgICB0aHJvdyBFcnJvcihcIkNhbid0IG1lcmdlIHRoZXNlIHNlbmQgY2FsbHNcIik7XG4gIH1cblxuICAvLyBtZXJnZVxuICBpZiAoaXNPYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIC8vIGRlZmF1bHQgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2Zvcm0nKTtcbiAgICB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgICBpZiAoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgPT0gdHlwZSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGFcbiAgICAgICAgPyB0aGlzLl9kYXRhICsgJyYnICsgZGF0YVxuICAgICAgICA6IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAodGhpcy5fZGF0YSB8fCAnJykgKyBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICghaXNPYmogfHwgdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBkZWZhdWx0IHRvIGpzb25cbiAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2pzb24nKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNvcnQgYHF1ZXJ5c3RyaW5nYCBieSB0aGUgc29ydCBmdW5jdGlvblxuICpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0IG9yZGVyXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeSgpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gY3VzdG9taXplZCBzb3J0IGZ1bmN0aW9uXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeShmdW5jdGlvbihhLCBiKXtcbiAqICAgICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAqICAgICAgICAgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc29ydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zb3J0UXVlcnkgPSBmdW5jdGlvbihzb3J0KSB7XG4gIC8vIF9zb3J0IGRlZmF1bHQgdG8gdHJ1ZSBidXQgb3RoZXJ3aXNlIGNhbiBiZSBhIGZ1bmN0aW9uIG9yIGJvb2xlYW5cbiAgdGhpcy5fc29ydCA9IHR5cGVvZiBzb3J0ID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBzb3J0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29tcG9zZSBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gcmVxLnVybFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2ZpbmFsaXplUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpe1xuICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeS5qb2luKCcmJyk7XG4gIGlmIChxdWVyeSkge1xuICAgIHRoaXMudXJsICs9ICh0aGlzLnVybC5pbmRleE9mKCc/JykgPj0gMCA/ICcmJyA6ICc/JykgKyBxdWVyeTtcbiAgfVxuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwOyAvLyBNYWtlcyB0aGUgY2FsbCBpZGVtcG90ZW50XG5cbiAgaWYgKHRoaXMuX3NvcnQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnVybC5pbmRleE9mKCc/Jyk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBxdWVyeUFyciA9IHRoaXMudXJsLnN1YnN0cmluZyhpbmRleCArIDEpLnNwbGl0KCcmJyk7XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRoaXMuX3NvcnQpIHtcbiAgICAgICAgcXVlcnlBcnIuc29ydCh0aGlzLl9zb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5QXJyLnNvcnQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gdGhpcy51cmwuc3Vic3RyaW5nKDAsIGluZGV4KSArICc/JyArIHF1ZXJ5QXJyLmpvaW4oJyYnKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEZvciBiYWNrd2FyZHMgY29tcGF0IG9ubHlcblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXBwZW5kUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpIHtjb25zb2xlLnRyYWNlKFwiVW5zdXBwb3J0ZWRcIik7fVxuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHRpbWVvdXQgZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl90aW1lb3V0RXJyb3IgPSBmdW5jdGlvbihyZWFzb24sIHRpbWVvdXQsIGVycm5vKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihyZWFzb24gKyB0aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyk7XG4gIGVyci50aW1lb3V0ID0gdGltZW91dDtcbiAgZXJyLmNvZGUgPSAnRUNPTk5BQk9SVEVEJztcbiAgZXJyLmVycm5vID0gZXJybm87XG4gIHRoaXMudGltZWRvdXQgPSB0cnVlO1xuICB0aGlzLmFib3J0KCk7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGRlYWRsaW5lXG4gIGlmICh0aGlzLl90aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5fdGltZW91dEVycm9yKCdUaW1lb3V0IG9mICcsIHNlbGYuX3RpbWVvdXQsICdFVElNRScpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXQpO1xuICB9XG4gIC8vIHJlc3BvbnNlIHRpbWVvdXRcbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVGltZW91dCAmJiAhdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcignUmVzcG9uc2UgdGltZW91dCBvZiAnLCBzZWxmLl9yZXNwb25zZVRpbWVvdXQsICdFVElNRURPVVQnKTtcbiAgICB9LCB0aGlzLl9yZXNwb25zZVRpbWVvdXQpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VCYXNlYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3BvbnNlQmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZUJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2VCYXNlKG9iaikge1xuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcbn1cblxuLyoqXG4gKiBNaXhpbiB0aGUgcHJvdG90eXBlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBSZXNwb25zZUJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXNwb25zZUJhc2UucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gIHJldHVybiB0aGlzLmhlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciByZWxhdGVkIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGAudHlwZWAgdGhlIGNvbnRlbnQgdHlwZSB3aXRob3V0IHBhcmFtc1xuICpcbiAqIEEgcmVzcG9uc2Ugb2YgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiBcInRleHQvcGxhaW5cIi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgICAvLyBUT0RPOiBtb2FyIVxuICAgIC8vIFRPRE86IG1ha2UgdGhpcyBhIHV0aWxcblxuICAgIC8vIGNvbnRlbnQtdHlwZVxuICAgIHZhciBjdCA9IGhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJyc7XG4gICAgdGhpcy50eXBlID0gdXRpbHMudHlwZShjdCk7XG5cbiAgICAvLyBwYXJhbXNcbiAgICB2YXIgcGFyYW1zID0gdXRpbHMucGFyYW1zKGN0KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1zKSB0aGlzW2tleV0gPSBwYXJhbXNba2V5XTtcblxuICAgIHRoaXMubGlua3MgPSB7fTtcblxuICAgIC8vIGxpbmtzXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGhlYWRlci5saW5rKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtzID0gdXRpbHMucGFyc2VMaW5rcyhoZWFkZXIubGluayk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgZmxhZ3Mgc3VjaCBhcyBgLm9rYCBiYXNlZCBvbiBgc3RhdHVzYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSBhIDJ4eCByZXNwb25zZSB3aWxsIGdpdmUgeW91IGEgYC5va2Agb2YgX190cnVlX19cbiAqIHdoZXJlYXMgNXh4IHdpbGwgYmUgX19mYWxzZV9fIGFuZCBgLmVycm9yYCB3aWxsIGJlIF9fdHJ1ZV9fLiBUaGVcbiAqIGAuY2xpZW50RXJyb3JgIGFuZCBgLnNlcnZlckVycm9yYCBhcmUgYWxzbyBhdmFpbGFibGUgdG8gYmUgbW9yZVxuICogc3BlY2lmaWMsIGFuZCBgLnN0YXR1c1R5cGVgIGlzIHRoZSBjbGFzcyBvZiBlcnJvciByYW5naW5nIGZyb20gMS4uNVxuICogc29tZXRpbWVzIHVzZWZ1bCBmb3IgbWFwcGluZyByZXNwb25kIGNvbG9ycyBldGMuXG4gKlxuICogXCJzdWdhclwiIHByb3BlcnRpZXMgYXJlIGFsc28gZGVmaW5lZCBmb3IgY29tbW9uIGNhc2VzLiBDdXJyZW50bHkgcHJvdmlkaW5nOlxuICpcbiAqICAgLSAubm9Db250ZW50XG4gKiAgIC0gLmJhZFJlcXVlc3RcbiAqICAgLSAudW5hdXRob3JpemVkXG4gKiAgIC0gLm5vdEFjY2VwdGFibGVcbiAqICAgLSAubm90Rm91bmRcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgICB2YXIgdHlwZSA9IHN0YXR1cyAvIDEwMCB8IDA7XG5cbiAgICAvLyBzdGF0dXMgLyBjbGFzc1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzVHlwZSA9IHR5cGU7XG5cbiAgICAvLyBiYXNpY3NcbiAgICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gICAgdGhpcy5vayA9IDIgPT0gdHlwZTtcbiAgICB0aGlzLnJlZGlyZWN0ID0gMyA9PSB0eXBlO1xuICAgIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IDUgPT0gdHlwZTtcbiAgICB0aGlzLmVycm9yID0gKDQgPT0gdHlwZSB8fCA1ID09IHR5cGUpXG4gICAgICAgID8gdGhpcy50b0Vycm9yKClcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIC8vIHN1Z2FyXG4gICAgdGhpcy5jcmVhdGVkID0gMjAxID09IHN0YXR1cztcbiAgICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgICB0aGlzLm5vQ29udGVudCA9IDIwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy5iYWRSZXF1ZXN0ID0gNDAwID09IHN0YXR1cztcbiAgICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RBY2NlcHRhYmxlID0gNDA2ID09IHN0YXR1cztcbiAgICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RGb3VuZCA9IDQwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy51bnByb2Nlc3NhYmxlRW50aXR5ID0gNDIyID09IHN0YXR1cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCk7XG59O1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcmFtcyA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqPSAqLyk7XG4gICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgdmFyIHZhbCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBQYXJzZSBMaW5rIGhlYWRlciBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5wYXJzZUxpbmtzID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvICosICovKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBzdHIpe1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo7ICovKTtcbiAgICB2YXIgdXJsID0gcGFydHNbMF0uc2xpY2UoMSwgLTEpO1xuICAgIHZhciByZWwgPSBwYXJ0c1sxXS5zcGxpdCgvICo9ICovKVsxXS5zbGljZSgxLCAtMSk7XG4gICAgb2JqW3JlbF0gPSB1cmw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBTdHJpcCBjb250ZW50IHJlbGF0ZWQgZmllbGRzIGZyb20gYGhlYWRlcmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQHJldHVybiB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuY2xlYW5IZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIsIGNoYW5nZXNPcmlnaW4pe1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgZGVsZXRlIGhlYWRlclsnY29udGVudC1sZW5ndGgnXTtcbiAgZGVsZXRlIGhlYWRlclsndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgZGVsZXRlIGhlYWRlclsnaG9zdCddO1xuICAvLyBzZWN1aXJ0eVxuICBpZiAoY2hhbmdlc09yaWdpbikge1xuICAgIGRlbGV0ZSBoZWFkZXJbJ2F1dGhvcml6YXRpb24nXTtcbiAgICBkZWxldGUgaGVhZGVyWydjb29raWUnXTtcbiAgfVxuICByZXR1cm4gaGVhZGVyO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iXX0=
|