Files
v2realbot/research/test1sbars_roc.ipynb
2024-05-17 14:04:48 +02:00

1640 lines
946 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Activating profile profile1\n",
"</pre>\n"
],
"text/plain": [
"Activating profile profile1\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Profile profile1 loaded successfully.\n",
"</pre>\n"
],
"text/plain": [
"Profile profile1 loaded successfully.\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Current values:\n",
"<span style=\"font-weight: bold\">{</span>\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'AGG_EXCLUDED_TRADES'</span>: <span style=\"font-weight: bold\">[</span><span style=\"color: #008000; text-decoration-color: #008000\">'C'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'O'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'4'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'B'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'7'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'V'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'P'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'W'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'U'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'Z'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'F'</span><span style=\"font-weight: bold\">]</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BT_DELAYS'</span>: <span style=\"font-weight: bold\">{</span>\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'trigger_to_strat'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.02</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'strat_to_sub'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.023</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'sub_to_fill'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.008</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'fill_to_not'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.023</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'limit_order_offset'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
" <span style=\"font-weight: bold\">}</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BT_FILL_CONDITION_BUY_LIMIT'</span>: <span style=\"font-weight: bold\">&lt;</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff; font-weight: bold\">FillCondition.SLOW:</span><span style=\"color: #000000; text-decoration-color: #000000\"> </span><span style=\"color: #008000; text-decoration-color: #008000\">'slow'</span><span style=\"color: #000000; text-decoration-color: #000000\">&gt;,</span>\n",
"<span style=\"color: #000000; text-decoration-color: #000000\"> </span><span style=\"color: #008000; text-decoration-color: #008000\">'BT_FILL_CONDITION_SELL_LIMIT'</span><span style=\"color: #000000; text-decoration-color: #000000\">: &lt;FillCondition.SLOW: </span><span style=\"color: #008000; text-decoration-color: #008000\">'slow'</span><span style=\"font-weight: bold\">&gt;</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BT_FILL_CONS_TRADES_REQUIRED'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BT_FILL_LOG_SURROUNDING_TRADES'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BT_FILL_PRICE_MARKET_ORDER_PREMIUM'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.005</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'COUNT_API_REQUESTS'</span>: <span style=\"color: #ff0000; text-decoration-color: #ff0000; font-style: italic\">False</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'GROUP_TRADES_WITH_TIMESTAMP_LESS_THAN'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.003</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'ILOG_SAVE_LEVEL_FROM'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'LIVE_DATA_FEED'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'sip'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'NORMALIZED_TICK_BASE_PRICE'</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">30.0</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'OFFLINE_MODE'</span>: <span style=\"color: #ff0000; text-decoration-color: #ff0000; font-style: italic\">False</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'PROD_SERVER_HOSTNAMES'</span>: <span style=\"font-weight: bold\">[</span><span style=\"color: #008000; text-decoration-color: #008000\">'tradingeastcoast'</span>, <span style=\"color: #008000; text-decoration-color: #008000\">'David-MacBook-Pro.local'</span><span style=\"font-weight: bold\">]</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'QUIET_MODE'</span>: <span style=\"color: #00ff00; text-decoration-color: #00ff00; font-style: italic\">True</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TEST_SERVER_HOSTNAMES'</span>: <span style=\"font-weight: bold\">[</span><span style=\"color: #008000; text-decoration-color: #008000\">'tradingtest'</span><span style=\"font-weight: bold\">]</span>\n",
"<span style=\"font-weight: bold\">}</span>\n",
"</pre>\n"
],
"text/plain": [
"Current values:\n",
"\u001b[1m{\u001b[0m\n",
" \u001b[32m'AGG_EXCLUDED_TRADES'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'C'\u001b[0m, \u001b[32m'O'\u001b[0m, \u001b[32m'4'\u001b[0m, \u001b[32m'B'\u001b[0m, \u001b[32m'7'\u001b[0m, \u001b[32m'V'\u001b[0m, \u001b[32m'P'\u001b[0m, \u001b[32m'W'\u001b[0m, \u001b[32m'U'\u001b[0m, \u001b[32m'Z'\u001b[0m, \u001b[32m'F'\u001b[0m\u001b[1m]\u001b[0m,\n",
" \u001b[32m'BT_DELAYS'\u001b[0m: \u001b[1m{\u001b[0m\n",
" \u001b[32m'trigger_to_strat'\u001b[0m: \u001b[1;36m0.02\u001b[0m,\n",
" \u001b[32m'strat_to_sub'\u001b[0m: \u001b[1;36m0.023\u001b[0m,\n",
" \u001b[32m'sub_to_fill'\u001b[0m: \u001b[1;36m0.008\u001b[0m,\n",
" \u001b[32m'fill_to_not'\u001b[0m: \u001b[1;36m0.023\u001b[0m,\n",
" \u001b[32m'limit_order_offset'\u001b[0m: \u001b[1;36m0\u001b[0m\n",
" \u001b[1m}\u001b[0m,\n",
" \u001b[32m'BT_FILL_CONDITION_BUY_LIMIT'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mFillCondition.SLOW:\u001b[0m\u001b[39m \u001b[0m\u001b[32m'slow'\u001b[0m\u001b[39m>,\u001b[0m\n",
"\u001b[39m \u001b[0m\u001b[32m'BT_FILL_CONDITION_SELL_LIMIT'\u001b[0m\u001b[39m: <FillCondition.SLOW: \u001b[0m\u001b[32m'slow'\u001b[0m\u001b[1m>\u001b[0m,\n",
" \u001b[32m'BT_FILL_CONS_TRADES_REQUIRED'\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
" \u001b[32m'BT_FILL_LOG_SURROUNDING_TRADES'\u001b[0m: \u001b[1;36m10\u001b[0m,\n",
" \u001b[32m'BT_FILL_PRICE_MARKET_ORDER_PREMIUM'\u001b[0m: \u001b[1;36m0.005\u001b[0m,\n",
" \u001b[32m'COUNT_API_REQUESTS'\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
" \u001b[32m'GROUP_TRADES_WITH_TIMESTAMP_LESS_THAN'\u001b[0m: \u001b[1;36m0.003\u001b[0m,\n",
" \u001b[32m'ILOG_SAVE_LEVEL_FROM'\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
" \u001b[32m'LIVE_DATA_FEED'\u001b[0m: \u001b[32m'sip'\u001b[0m,\n",
" \u001b[32m'NORMALIZED_TICK_BASE_PRICE'\u001b[0m: \u001b[1;36m30.0\u001b[0m,\n",
" \u001b[32m'OFFLINE_MODE'\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
" \u001b[32m'PROD_SERVER_HOSTNAMES'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'tradingeastcoast'\u001b[0m, \u001b[32m'David-MacBook-Pro.local'\u001b[0m\u001b[1m]\u001b[0m,\n",
" \u001b[32m'QUIET_MODE'\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
" \u001b[32m'TEST_SERVER_HOSTNAMES'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'tradingtest'\u001b[0m\u001b[1m]\u001b[0m\n",
"\u001b[1m}\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">config_handler.<span style=\"color: #808000; text-decoration-color: #808000\">active_profile</span>=<span style=\"color: #008000; text-decoration-color: #008000\">'profile1'</span>\n",
"</pre>\n"
],
"text/plain": [
"config_handler.\u001b[33mactive_profile\u001b[0m=\u001b[32m'profile1'\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">config handler initialized\n",
"</pre>\n"
],
"text/plain": [
"config handler initialized\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Realtime Websocket connection will use FEED: sip and credential of ACCOUNT1\n"
]
},
{
"data": {
"text/html": [
"<script>\n",
" if (document.body.dataset.jpThemeLight == \"false\" || // Jupyter Lab\n",
" document.body.dataset.vscodeThemeKind == \"vscode-dark\" || // VS Code\n",
" document.documentElement.dataset.theme == \"dark\" || // Jupyter Book\n",
" window.matchMedia('(prefers-color-scheme: dark)').matches) {\n",
" document.documentElement.classList.add('dark');\n",
" }\n",
" else {\n",
" document.documentElement.classList.remove('dark');\n",
" }\n",
"</script>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<style>:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;box-sizing:border-box;content:\"\";border-top:5px solid transparent;border-left:10px solid rgba(0,0,0,.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0,0,0,.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before{border-left-color:#ffffff80}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:#ffffff80;border-left-color:transparent}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0!important;padding-top:0!important;padding-bottom:0!important;border-top-width:0px!important;border-bottom-width:0px!important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0!important;overflow:hidden!important}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before{position:absolute;display:block;bottom:50%;content:\"\\25b2\";content:\"\\25b2\"/\"\"}table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{position:absolute;display:block;top:50%;content:\"\\25bc\";content:\"\\25bc\"/\"\"}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>th.dt-ordering-asc,table.dataTable thead>tr>th.dt-ordering-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc,table.dataTable thead>tr>td.dt-ordering-asc,table.dataTable thead>tr>td.dt-ordering-desc{position:relative;padding-right:30px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order{position:absolute;right:12px;top:0;bottom:0;width:12px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0,0,0,.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled span.dt-column-order:before,table.dataTable thead>tr>td.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled span.dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255,255,255,.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0d6efd;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0)}to{transform:translate(24px)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td,table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:700}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0,0,0,.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{border-top:1px solid rgba(0,0,0,.3);padding:10px 10px 6px}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr:first-child>*{border-top:none}table.dataTable>tbody>tr:last-child>*{border-bottom:none}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.9);color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable>tbody>tr>th,table.dataTable>tbody>tr>td{padding:8px 10px}table.dataTable.row-border>tbody>tr>*,table.dataTable.display>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15)}table.dataTable.row-border>tbody>tr:first-child>*,table.dataTable.display>tbody>tr:first-child>*{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}table.dataTable.cell-border>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15);border-right:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr>*:first-child{border-left:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr:first-child>*{border-top:1px solid rgba(0,0,0,.3)}table.dataTable.stripe>tbody>tr:nth-child(odd)>*,table.dataTable.display>tbody>tr:nth-child(odd)>*{box-shadow:inset 0 0 0 9999px #00000006;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.023)}table.dataTable.stripe>tbody>tr:nth-child(odd).selected>*,table.dataTable.display>tbody>tr:nth-child(odd).selected>*{box-shadow:inset 0 0 0 9999px #0d6efdeb;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px #00000009;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd!important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),1)!important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_1{box-shadow:inset 0 0 0 9999px #0000000e;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.054)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_2{box-shadow:inset 0 0 0 9999px #0000000c;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.047)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_3{box-shadow:inset 0 0 0 9999px #0000000a;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.039)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdf3;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.954)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf1;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.947)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdef;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px #00000003;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px #00000001;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efde8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px #00000015;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px #00000013;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px #00000010;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdfa;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdf5;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.962)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}div.dt-container{position:relative;clear:both}div.dt-container div.dt-layout-row{display:table;clear:both;width:100%}div.dt-container div.dt-layout-row.dt-layout-table,div.dt-container div.dt-layout-row.dt-layout-table div.dt-layout-cell{display:block}div.dt-container div.dt-layout-cell{display:table-cell;vertical-align:middle;padding:5px 0}div.dt-container div.dt-layout-cell.dt-full{text-align:center}div.dt-container div.dt-layout-cell.dt-start{text-align:left}div.dt-container div.dt-layout-cell.dt-end{text-align:right}div.dt-container div.dt-layout-cell:empty{display:none}div.dt-container .dt-search input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}div.dt-container .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit}div.dt-container select.dt-input{padding:4px}div.dt-container .dt-paging .dt-paging-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:inherit!important;border:1px solid transparent;border-radius:2px;background:transparent}div.dt-container .dt-paging .dt-paging-button.current,div.dt-container .dt-paging .dt-paging-button.current:hover{color:inherit!important;border:1px solid rgba(0,0,0,.3);background-color:#0000000d;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(230,230,230,.05)),color-stop(100%,rgba(0,0,0,.05)));background:-webkit-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-moz-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-ms-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-o-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:linear-gradient(to bottom,#e6e6e60d,#0000000d)}div.dt-container .dt-paging .dt-paging-button.disabled,div.dt-container .dt-paging .dt-paging-button.disabled:hover,div.dt-container .dt-paging .dt-paging-button.disabled:active{cursor:default;color:#00000080!important;border:1px solid transparent;background:transparent;box-shadow:none}div.dt-container .dt-paging .dt-paging-button:hover{color:#fff!important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0%,#111 100%);background:-moz-linear-gradient(top,#585858 0%,#111 100%);background:-ms-linear-gradient(top,#585858 0%,#111 100%);background:-o-linear-gradient(top,#585858 0%,#111 100%);background:linear-gradient(to bottom,#585858,#111)}div.dt-container .dt-paging .dt-paging-button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b,#0c0c0c);box-shadow:inset 0 0 3px #111}div.dt-container .dt-paging .ellipsis{padding:0 1em}div.dt-container .dt-length,div.dt-container .dt-search,div.dt-container .dt-info,div.dt-container .dt-processing,div.dt-container .dt-paging{color:inherit}div.dt-container .dataTables_scroll{clear:both}div.dt-container .dataTables_scroll div.dt-scroll-body{-webkit-overflow-scrolling:touch}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td{vertical-align:middle}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div.dt-container.dt-empty-footer tbody>tr:last-child>*{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body tbody>tr:last-child>*{border-bottom:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row,div.dt-container div.dt-layout-cell{display:block}div.dt-container div.dt-layout-cell.dt-full,div.dt-container div.dt-layout-cell.dt-start,div.dt-container div.dt-layout-cell.dt-end{text-align:center}}@media screen and (max-width: 640px){.dt-container .dt-length,.dt-container .dt-search{float:none;text-align:center}.dt-container .dt-search{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89,91,94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89,91,94)}html.dark table.dataTable.row-border>tbody>tr>*,html.dark table.dataTable.display>tbody>tr>*{border-top:1px solid rgb(64,67,70)}html.dark table.dataTable.row-border>tbody>tr:first-child>*,html.dark table.dataTable.display>tbody>tr:first-child>*{border-top:none}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64,67,70);border-right:1px solid rgb(64,67,70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64,67,70)}html.dark .dt-container.dt-empty-footer table.dataTable{border-bottom:1px solid rgb(89,91,94)}html.dark .dt-container .dt-search input,html.dark .dt-container .dt-length select{border:1px solid rgba(255,255,255,.2);background-color:var(--dt-html-background)}html.dark .dt-container .dt-paging .dt-paging-button.current,html.dark .dt-container .dt-paging .dt-paging-button.current:hover{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark .dt-container .dt-paging .dt-paging-button.disabled,html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover,html.dark .dt-container .dt-paging .dt-paging-button.disabled:active{color:#666!important}html.dark .dt-container .dt-paging .dt-paging-button:hover{border:1px solid rgb(53,53,53);background:#353535}html.dark .dt-container .dt-paging .dt-paging-button:active{background:#3a3a3a}*[dir=rtl] table.dataTable thead th,*[dir=rtl] table.dataTable thead td,*[dir=rtl] table.dataTable tfoot th,*[dir=rtl] table.dataTable tfoot td{text-align:right}*[dir=rtl] table.dataTable th.dt-type-numeric,*[dir=rtl] table.dataTable th.dt-type-date,*[dir=rtl] table.dataTable td.dt-type-numeric,*[dir=rtl] table.dataTable td.dt-type-date{text-align:left}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-start{text-align:right}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-end{text-align:left}*[dir=rtl] div.dt-container div.dt-search input{margin:0 3px 0 0}@keyframes dtb-spinner{to{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{to{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dataTables_wrapper{position:relative}div.dt-buttons{position:initial}div.dt-buttons .dt-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#fff;border-radius:.75em;box-shadow:3px 4px 10px 1px #000c;text-align:center;z-index:2003;overflow:hidden}div.dt-button-info h2{padding:2rem 2rem 1rem;margin:0;font-weight:400}div.dt-button-info>div{padding:1em 2em 2em}div.dtb-popover-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none!important}div.dt-button-collection-title{text-align:center;padding:.3em .5em .5em;margin-left:.5em;margin-right:.5em;font-size:.9em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0,0,0,.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection .dt-button-active{padding-right:3em}div.dt-button-collection .dt-button-active:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection .dt-button-active.dt-button-split{padding-right:0}div.dt-button-collection .dt-button-active.dt-button-split:after{display:none}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child{padding-right:3em}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection .dt-button-active-a a{padding-right:3em}div.dt-button-collection .dt-button-active-a a:after{position:absolute;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0,0,0,.1);padding-left:0}@media print{table.dataTable tr>*{box-shadow:none!important}}html.dark div.dt-button-info{background-color:var(--dt-html-background);border:1px solid rgba(255,255,255,.15)}div.dt-buttons>.dt-button,div.dt-buttons>div.dt-button-split .dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(230, 230, 230, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dt-buttons>.dt-button:first-child,div.dt-buttons>div.dt-button-split .dt-button:first-child{margin-left:0}div.dt-buttons>.dt-button.disabled,div.dt-buttons>div.dt-button-split .dt-button.disabled{cursor:default;opacity:.4}div.dt-buttons>.dt-button.dt-button-active:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background-color:#0000001a;background:linear-gradient(to bottom,#b3b3b31a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(179, 179, 179, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\");box-shadow:inset 1px 1px 3px #999}div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:#0000001a;background:linear-gradient(to bottom,#8080801a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(128, 128, 128, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\")}div.dt-buttons>.dt-button:hover,div.dt-buttons>div.dt-button-split .dt-button:hover{text-decoration:none}div.dt-buttons>.dt-button:hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){border:1px solid #666;background-color:#0000001a;background:linear-gradient(to bottom,#9999991a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(153, 153, 153, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\")}div.dt-buttons>.dt-button:focus:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(53,132,228)}div.dt-buttons>.dt-button embed,div.dt-buttons>div.dt-button-split .dt-button embed{outline:none}div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(0,0,0,.15);border-top-right-radius:0;border-bottom-right-radius:0}div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid #666}div.dt-buttons>div.dt-button-split .dt-button:last-child{border-left:1px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0}div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid #666}div.dt-buttons span.dt-button-down-arrow{position:relative;top:-2px;font-size:10px;padding-left:10px;line-height:1em;opacity:.6}div.dt-buttons div.dt-button-split{display:inline-block}div.dt-buttons div.dt-button-split .dt-button:first-child{margin-right:0}div.dt-buttons div.dt-button-split .dt-button:last-child{margin-left:-1px;padding-left:.75em;padding-right:.75em;z-index:2}div.dt-buttons div.dt-button-split .dt-button:last-child span{padding-left:0}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:.75em 0;border:1px solid rgba(0,0,0,.4);background-color:#fff;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px #0000004d;box-sizing:border-box}div.dt-button-collection .dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;background:none;margin:0;padding:.5em 1em;border:none;text-align:left;cursor:pointer;color:inherit}div.dt-button-collection .dt-button.dt-button-active{background:none;box-shadow:none}div.dt-button-collection .dt-button.disabled{cursor:default;opacity:.4}div.dt-button-collection .dt-button:hover:not(.disabled){border:none;background:#9999991a;box-shadow:none}div.dt-button-collection div.dt-button-split{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}div.dt-button-collection div.dt-button-split button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-button-split button.dt-button-split-drop{min-width:33px;flex:0}div.dt-button-collection.fixed .dt-button{border-radius:.25em;background:#ffffff1a}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:#fff;padding:.5em}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block!important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;background:radial-gradient(ellipse farthest-corner at center,#0000004d,#000000b3);z-index:2001}.dt-button.processing{color:#0003}.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:\" \";border:2px solid rgb(40,40,40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1.5s infinite linear;-o-animation:dtb-spinner 1.5s infinite linear;-ms-animation:dtb-spinner 1.5s infinite linear;-webkit-animation:dtb-spinner 1.5s infinite linear;-moz-animation:dtb-spinner 1.5s infinite linear}@media screen and (max-width: 640px){div.dt-buttons{float:none!important;text-align:center}}html.dark div.dt-buttons>.dt-button,html.dark div.dt-buttons>div.dt-button-split .dt-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background:#b3b3b326;box-shadow:inset 1px 1px 2px #000}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){background:#80808026;box-shadow:inset 1px 1px 3px #000}html.dark div.dt-buttons>.dt-button:hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){background:#b3b3b326}html.dark div.dt-buttons>.dt-button:focus:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(110,168,254)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(255,255,255,.1)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid rgb(89,91,94)}html.dark div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid rgb(89,91,94)}html.dark div.dt-button-collection{border:1px solid rgba(255,255,255,.15);background-color:#212529;box-shadow:3px 4px 10px 1px #000c}table.dataTable thead tr>.dtfc-fixed-start,table.dataTable thead tr>.dtfc-fixed-end,table.dataTable tfoot tr>.dtfc-fixed-start,table.dataTable tfoot tr>.dtfc-fixed-end{top:0;bottom:0;z-index:3;background-color:#fff}table.dataTable tbody tr>.dtfc-fixed-start,table.dataTable tbody tr>.dtfc-fixed-end{z-index:1;background-color:#fff}table.dataTable tr>.dtfc-fixed-left:after,table.dataTable tr>.dtfc-fixed-right:after{position:absolute;top:0;bottom:0;width:10px;transition:box-shadow .3s;content:\"\";pointer-events:none}table.dataTable tr>.dtfc-fixed-left:after{right:0;transform:translate(100%)}table.dataTable tr>.dtfc-fixed-right:after{left:0;transform:translate(-80%)}table.dataTable.dtfc-scrolling-left tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}div.dt-scroll,div.dtfh-floatingparent{position:relative}div.dt-scroll div.dtfc-top-blocker,div.dt-scroll div.dtfc-bottom-blocker,div.dtfh-floatingparent div.dtfc-top-blocker,div.dtfh-floatingparent div.dtfc-bottom-blocker{position:absolute;background-color:#fff}html.dark table.dataTable thead tr>.dtfc-fixed-start,html.dark table.dataTable thead tr>.dtfc-fixed-end,html.dark table.dataTable tfoot tr>.dtfc-fixed-start,html.dark table.dataTable tfoot tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-start,html.dark table.dataTable tbody tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable.dtfc-scrolling-left tbody>tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}html.dark div.dtfc-top-blocker,html.dark div.dtfc-bottom-blocker{background-color:var(--dt-html-background)}table.dataTable tbody th.focus,table.dataTable tbody td.focus{outline:2px solid #36f;outline-offset:-2px}table.dataTable tbody tr.selected th.focus,table.dataTable tbody tr.selected td.focus{outline-color:#03c}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{outline:2px solid #ff8b33;outline-offset:-2px}html.dark table.dataTable tbody th.focus,html.dark table.dataTable tbody td.focus{outline-color:#0d6efd}html.dark table.dataTable tbody tr.selected th.focus,html.dark table.dataTable tbody tr.selected td.focus{outline-color:#0143a3}html.dark div.dtk-focus-alt table.dataTable tbody th.focus,html.dark div.dtk-focus-alt table.dataTable tbody td.focus{outline-color:#ff8b33}table.dataTable tr.dtrg-group th{background-color:#0000001a;text-align:left}table.dataTable tr.dtrg-group.dtrg-level-0 th{font-weight:700}table.dataTable tr.dtrg-group.dtrg-level-1 th,table.dataTable tr.dtrg-group.dtrg-level-2 th,table.dataTable tr.dtrg-group.dtrg-level-3 th,table.dataTable tr.dtrg-group.dtrg-level-4 th,table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#0000000d;padding-top:.25em;padding-bottom:.25em;padding-left:2em;font-size:.9em}table.dataTable tr.dtrg-group.dtrg-level-2 th{background-color:#00000003;padding-left:2.5em}table.dataTable tr.dtrg-group.dtrg-level-3 th{background-color:#00000003;padding-left:3em}table.dataTable tr.dtrg-group.dtrg-level-4 th{background-color:#00000003;padding-left:3.5em}table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#00000003;padding-left:4em}html.dark table.dataTable tr.dtrg-group th{background-color:#ffffff1a}html.dark table.dataTable tr.dtrg-group.dtrg-level-1 th{background-color:#ffffff0d}html.dark table.dataTable tr.dtrg-group.dtrg-level-2 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-3 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-4 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#ffffff03}div.dt-button-collection{overflow:visible!important;z-index:2002!important}div.dt-button-collection div.dtsb-searchBuilder{padding-left:1em!important;padding-right:1em!important}div.dt-button-collection.dtb-collection-closeable div.dtsb-titleRow{padding-right:40px}.dtsb-greyscale{border:1px solid #cecece!important}div.dtsb-logicContainer .dtsb-greyscale{border:none!important}div.dtsb-searchBuilder{justify-content:space-evenly;cursor:default;margin-bottom:1em;text-align:left}div.dtsb-searchBuilder button.dtsb-button,div.dtsb-searchBuilder select{font-size:1em}div.dtsb-searchBuilder div.dtsb-titleRow{justify-content:space-evenly;margin-bottom:.5em}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title{display:inline-block;padding-top:14px}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title:empty{display:inline}div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll{float:right;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition{display:block}div.dtsb-searchBuilder div.dtsb-group{position:relative;clear:both;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-group button.dtsb-search{float:right}div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup{margin:2px;text-align:center;padding:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);position:absolute;margin-top:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{margin-bottom:.8em;display:flex;justify-content:start;flex-flow:row wrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{padding:.4em;margin-right:.8em;min-width:5em;max-width:20em;color:inherit;font-size:1em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic{font-style:normal}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic{font-style:italic}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{flex:1;white-space:nowrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont span.dtsb-joiner{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input.dtsb-value{width:33%}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont select,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input{height:100%;box-sizing:border-box}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{margin-left:auto;display:inline-block}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child{margin-right:0}@media screen and (max-width: 550px){div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{display:flex;flex-flow:none;flex-direction:column;justify-content:start;padding-right:calc(35px + .8em);margin-bottom:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:first-child),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:nth-child(2)),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:last-child){padding-top:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:first-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:nth-child(2),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:last-child{padding-top:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{max-width:none;width:100%;margin-bottom:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{position:absolute;width:35px;display:flex;flex-wrap:wrap-reverse;right:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button{margin-right:0!important}}div.dtsb-searchBuilder button,div.dtsb-searchBuilder select.dtsb-dropDown,div.dtsb-searchBuilder input{background-color:#f9f9f9}div.dtsb-searchBuilder button.dtsb-button{position:relative;display:inline-block;box-sizing:border-box;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dtsb-searchBuilder button.dtsb-button:hover{background-color:#cecece;cursor:pointer}div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgba(0,0,0,.3);background-color:#0000001a;background:linear-gradient(to right,#e6e6e61a,#0000001a)}div.dtsb-searchBuilder div.dtsb-logicContainer button{border:1px solid transparent;background:transparent}div.dtsb-searchBuilder button.dtsb-clearGroup{min-width:2em;padding:0}div.dtsb-searchBuilder button.dtsb-iptbtn{min-width:100px;text-align:left}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{border:1px solid;border-color:#cecece;border-radius:3px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic{border:none;border-radius:0;flex-grow:1;flex-shrink:0;flex-basis:3em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup{border:none;border-radius:0;width:2em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{border:1px solid;border-radius:3px}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition{border-color:#48b13c}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data{border-color:#e70f00}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value{border-color:#0069ba}html.dark div.dtsb-searchBuilder button.dtsb-button,html.dark div.dtsb-searchBuilder select.dtsb-dropDown,html.dark div.dtsb-searchBuilder input.dtsb-input{background-color:#424549!important;color-scheme:dark}html.dark div.dtsb-searchBuilder button.dtsb-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dtsb-searchBuilder button.dtsb-button:hover{background:#b3b3b326}html.dark div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgb(89,91,94)}html.dark div.dtsb-searchBuilder .dtsb-greyscale{border-color:#fff3!important}div.dtsp-topRow{display:flex;flex-direction:row;flex-wrap:nowrap;border:2px solid rgba(0,0,0,0);border-radius:3px;justify-content:space-around;align-content:flex-start;align-items:flex-start}div.dtsp-topRow input.dtsp-search{text-overflow:ellipsis;min-width:50px;flex-basis:90px;max-width:none}div.dtsp-topRow input.dtsp-search::placeholder{color:inherit}div.dtsp-topRow div.dtsp-subRow1{display:flex;flex-direction:row;flex-wrap:nowrap;flex:1 1 auto}div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont{position:relative;width:100%}div.dtsp-topRow div.dtsp-subRow1 input{padding-right:2em;width:100%!important;box-sizing:border-box;font-size:1em}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{background-color:transparent;border:none;cursor:initial;box-shadow:none;padding-bottom:0;padding-top:0;min-height:1em;height:fit-content;box-sizing:content-box}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]::placeholder{color:initial;opacity:1}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon{position:absolute;top:0;right:0;bottom:0}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABbmlDQ1BpY2MAACiRdZE7SwNBFIU/EyWikRRaiFhsoWKhEBREO42FTZAQFYza7G5eQhKX3QQJtoKNhWAh2vgq/AfaCrYKgqAIIhb+Al+NhPVOEkiQZJbZ+3FmzmXmDHjCGTPrtAYhm8vb0bmQthxb0Xzv+PHRxRSabjrWTCQSpun4eaRF1YdR1av5voajM55wTGhpF54wLTsvPC0c3sxbineFe8y0Hhc+ER6x5YDCt0o3KvymOFXhL8X2YnQWPKqnlqpjo47NtJ0VHhYeyGYKZvU86ib+RG5pQWqfzH4coswRQsOgwDoZ8oxKzUlmjX3Bsm+eDfGY8rcoYosjRVq8I6IWpGtCalL0hHwZiir3/3k6yfGxSnd/CNpeXfdzEHz7UNpz3d9T1y2dgfcFrnM1/4bkNPkt+l5NGziGwDZc3tQ04wCudqD32dJtvSx5ZXqSSfi4gK4YdN9Dx2olq+o650+wuCVPdAeHRzAk+wNrfw8JaBFXEnV+AAAACXBIWXMAAA9hAAAPYQGoP6dpAAABMUlEQVQoU6XRr0vDQRjH8akoM4iIjqGoOIZ5oIjB5XWxajaYDGLSIhhNYjcPRDSJwbQNw+L+BNGgYYo/5pT5/shz8vDlBgMPXux7z3N3z+25VOofYyCyd4ZYCavI4gXPsRp9LqiDdrEMH+8wv8Vh8gBfWclFPOEUN3hAHjlMoRa7wTzBS5xgKLFglPkZLjDic6HyDsEMNvGR2Nxifoci3tEI+X770JU0XmPXIlax+LTPh83fFox1X6kxyzdjm9UcdXi9S+Vti6svfyNULhNR9TVsYNhW6Ff9KKCNR7/Zv6eeaQ+6+qcdpu9BqGlp1HFgud+FYdzzUcUExu0Q/cdzHGEFetIlXKPjK/sbqYoOftMiS+j9jzEJPd1Wt+5+kdR/9EM9ucIC5jCbyPc01Q32kfsBppYz3hYFcCwAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:12px}div.dtsp-topRow div.dtsp-subRow2{white-space:nowrap;flex:0 0 auto}div.dtsp-topRow button>span{display:inline-block;height:100%;width:100%}div.dtsp-topRow button.dtsp-nameButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAK2SURBVFgJ7ZY9j41BFICvryCExrJBQ6HyEYVEIREaUZDQIRoR2ViJKCioxV+gkVXYTVZEQiEUhG2EQnxUCh0FKolY4ut5XnM2cyfva3Pt5m7EPcmzZ2bemTNnzjkzd1utnvQi0IvAfxiBy5z5FoxO89kPY+8mbMjtzs47RXs5/WVpbAG6bWExt5PuIibvhVkwmC+ck3eK9ln6/fAddFojYzBVuYSBpcnIEvRaqOw2RcaN18FPuJH0JvRUxbT3wWf4ltiKPgfVidWlbGZgPozDFfgAC+EA/K2EI4cwcAJ+gPaeQ+VQU2SOMMGcPgPl/m/V2p50rrbRsRgt9Iv5h6xtpP22Bz7Ce1C+gFFxfKzOmShcU+Qmyh2w3w8rIJfddHTck66EukL/xPhj+JM8rHNmFys0Pg4v0up3aFNlwR9NYyodd3OL/C64zpsymcTFcf6ElM4YzjAWKYrJkaq8kE/yUYNP4BoYvS1QRo+hNtF5xfkTUjoTheukSFFMjlTFm6PjceOca/SMpKfeCR1L6Uzk/y2WIkVhNFJlJAZhP+hYns7b9D3IPuhY5mYrIv8OrQJvR5NYyNaW4jsU8pSGNySiVx4o5tXq3JkoXE/mg5R/M8dGJCJpKhaDcjBRdbI/Rm8g69c122om33BHmj2CHoV5qa9jUXBraJ+G1fAVjIBO1klc87ro1K4JZ/K35SWW3TwcyDd6TecqnAEd8cGq2+w84xvBm1n3vS0izKkkwh5XNC/GmFPqqAtPF89AOScKuemaNzoTV1SD5dtSbmLf1/RV+tC0WTgcj6R7HEtrVGWaqu/lYDZ/2pvxQ/kIyw/gFByHC9AHw910hv1aUUumyd8yy0QfhmEkfiNod0Xusct68J1qc8Tdux0Z97Q+hsDb+AYGYEbF/4Guw2Q/qDPqZG/zXgT+3Qj8AtKnfWhFwmuAAAAAAElFTkSuQmCC)!important;background-repeat:no-repeat;background-position:center;background-size:23px;vertical-align:bottom}div.dtsp-topRow button.dtsp-countButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAG5SURBVEgN3VU9LwVBFF0fiYhofUSlEQkKhU7z/oBCQkIiGr9BgUbhVzy9BAnhFyjV/AYFiU5ICM7ZN+c5Zud5dm3lJmfmzrkz9+7cu3c3y/6jjOBSF8CxXS7FmTkbwqIJjDpJvTcmsJ4K3KPZUpyZsx0sxoB9J6mnAkyC7wGuuCFIipNtEcpcWExgXpOBc78vgj6N+QO4NVsjwdFM59tUIDxDrHMBOeIQ34C5ZDregXuAQm4YcI68nN9B3wr2PcwPAIPkN2EqtJH6b+QZm1ajjTx7BqwAr26Lb+C2Kvpbt0Mb2HAJ7NrGFGfmXO3DeA4UshDfQAVmH0gaUFg852TTTDvlxwBlCtxy9zXyBhQFaq0wMmIdRebrfgosA3zb2hKnqG0oqchp4QbuR8X0TjzABhbdOT8jnQ/atcgqpnfwOA7yqZyTU587ZkIGdesLTt2EkynOnbreMUUKMI/dA4B/QVOcO13CQh+5wWCgDwo/75u59odB/wjmfhbgvACcAOyZPHihMWAoIwxyCLgf1oxfgjzVbgBXSTzIN+f0pg6s5DkcesLMRpsBrgE2XO3CN64JFP7JtUeKHX4CKtRRXFZ+7dEAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:18px;vertical-align:bottom}div.dtsp-topRow button.dtsp-collapseButton span.dtsp-caret{position:relative;top:9px;display:inline-block}div.dtsp-topRow button.dtsp-collapseButton.dtsp-rotated{transform:rotate(180deg)}div.dtsp-searchPane table thead th,div.dtsp-searchPane table thead td{width:100%!important}div.dt-button-collection{z-index:2002}div.dt-button-collection.dtb-collection-closeable div.dtsp-titleRow{padding-right:25px}div.dtsp-columns-1{max-width:100%;min-width:100%;margin:0!important}div.dtsp-columns-2{max-width:49%;min-width:49%;margin:0!important}div.dtsp-columns-3{max-width:32%;min-width:32%;margin:0!important}div.dtsp-columns-4{max-width:24%;min-width:24%;margin:0!important}div.dtsp-columns-5{max-width:19%;min-width:19%;margin:0!important}div.dtsp-columns-6{max-width:16%;min-width:16%;margin:0!important}div.dtsp-columns-7{max-width:14%;min-width:14%;margin:0!important}div.dtsp-columns-8{max-width:12%;min-width:12%;margin:0!important}div.dtsp-columns-9{max-width:10.5%;min-width:10.5%;margin:0!important}div.dtsp-narrow{flex-direction:column!important}div.dtsp-narrow div.dtsp-subRow1,div.dtsp-narrow div.dtsp-subRow2{width:100%}div.dtsp-narrow div.dtsp-subRow2 button{margin:0!important;width:25%!important}div.dt-button-collection div.dtsp-panesContainer{padding-left:1em;padding-right:1em;margin-bottom:0}div.dtsp-panesContainer{margin-bottom:1em}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{width:100%}div.dtsp-searchPane div.dt-container div.dataTables_layout_cell,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_layout_cell{padding:0}div.dtsp-searchPane div.dt-container div.dt-scroll-head,div.dtsp-searchPane div.dt-container div.dataTables_scrollHead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-head,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollHead{display:none!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#fff!important;border:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body thead,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody thead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body thead,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody thead{display:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>td{padding:5px 10px}div.dtsp-searchPane div.dt-container div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody td.dtsp-nameColumn{width:100%!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{cursor:default}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name{text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:middle;white-space:nowrap;flex-grow:1;text-align:left}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{display:inline-block;background-color:#cfcfcf;text-align:center;border-radius:10px;width:auto;min-width:30px;color:#000;font-size:.9em;padding:0 4px}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty{display:none}div.dtsp-panesContainer{clear:both;padding-left:0;padding-right:0;text-align:center}div.dtsp-panesContainer div.dtsp-searchPanes{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-content:flex-start;align-items:stretch;clear:both;text-align:left}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane{flex-grow:1;flex-shrink:0;font-size:.9em;margin-top:15px!important}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper{flex:1;box-sizing:border-box}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dataTables_filter,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dataTables_filter{display:none}div.dtsp-panesContainer div.dtsp-title{float:left;padding:10px 0}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{float:right}div.dtsp-hidden{display:none!important}html.dark div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder,html[data-bs-theme=dark] div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder{color:#fff}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{border:1px solid #f0f0f0;border-radius:4px;overflow:hidden}div.dtsp-searchPane div.dt-container:hover,div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid #cfcfcf}div.dtsp-searchPane div.dt-container div.dt-scroll,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll{margin:-5px 0}div.dtsp-searchPane div.dt-container table.dataTable,div.dtsp-searchPane div.dataTables_wrapper table.dataTable{border-bottom:none!important}div.dtsp-searchPane div.dtsp-topRow{border:1px solid transparent}div.dtsp-searchPane div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{padding-bottom:5px}div.dtsp-searchPane div.dtsp-topRow div.dtsp-searchCont input.dtsp-search{border:none;padding-left:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered{border:1px solid #f0f0f0;border-radius:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered:hover{background-color:#f0f0f0}div.dtsp-searchPane input.dtsp-paneInputButton,div.dtsp-searchPane button.dtsp-paneButton{height:35px;width:35px;min-width:0;display:inline-block;margin:2px 2px 0;border:0px solid transparent;background-color:transparent}div.dtsp-searchPane input.dtsp-paneInputButton:hover,div.dtsp-searchPane button.dtsp-paneButton:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-searchPane button.dtsp-paneButton{vertical-align:middle;opacity:.6}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{border:1px solid transparent;background-color:transparent}div.dtsp-panesContainer button.dtsp-clearAll:hover,div.dtsp-panesContainer button.dtsp-collapseAll:hover,div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-panesContainer button.dtsp-disabledButton{cursor:default!important;color:#7c7c7c}div.dtsp-panesContainer button.dtsp-disabledButton:hover{background-color:transparent}div.dtsp-panesContainer button.dtsp-disabledButton:focus{outline:none}@media screen and (max-width: 767px){div.dtsp-columns-4,div.dtsp-columns-5,div.dtsp-columns-6{max-width:31%!important;min-width:31%!important}}@media screen and (max-width: 640px){div.dtsp-searchPanes{flex-direction:column!important}div.dtsp-searchPane{max-width:98%!important;min-width:98%!important}}html.dark div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span,html.dark div.dtsp-topRow button.dtsp-nameButton span,html.dark div.dtsp-topRow button.dtsp-countButton span{filter:invert(1)}html.dark div.dtsp-topRow input.dtsp-paneInputButton,html.dark div.dtsp-topRow button.dtsp-paneButton{color:inherit}html.dark div.dtsp-topRow input.dtsp-paneInputButton:hover,html.dark div.dtsp-topRow button.dtsp-paneButton:hover{background-color:#404549}html.dark div.dtsp-topRow.dtsp-bordered{border:1px solid rgba(255,255,255,.2);background:#2f3438!important}html.dark div.dtsp-topRow.dtsp-bordered:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-panesContainer button.dtsp-clearAll,html.dark div.dtsp-panesContainer button.dtsp-collapseAll,html.dark div.dtsp-panesContainer button.dtsp-showAll{color:inherit}html.dark div.dtsp-panesContainer button.dtsp-clearAll:hover,html.dark div.dtsp-panesContainer button.dtsp-collapseAll:hover,html.dark div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#404549}html.dark div.dtsp-panesContainer button.dtsp-disabledButton{color:#7c7c7c}html.dark div.dtsp-searchPane div.dt-container,html.dark div.dtsp-searchPane div.dataTables_wrapper{border:1px solid rgba(255,255,255,.2)}html.dark div.dtsp-searchPane div.dt-container:hover,html.dark div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#2f3438!important}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{background-color:#212529;color:inherit}table.dataTable>tbody>tr>.selected{background-color:#0d6efde6;color:#fff}table.dataTable>tbody>tr>.dt-select{text-align:center;vertical-align:middle}table.dataTable>thead>tr>.dt-select{text-align:center}table.dataTable input.dt-select-checkbox{appearance:none;position:relative;display:inline-block;width:12px;height:12px;border:1px solid;border-radius:3px;vertical-align:middle;margin-top:1px;color:inherit;font-size:20px;line-height:1em}table.dataTable input.dt-select-checkbox:checked:after{display:block;content:\"\\2713\";margin-top:-8px}table.dataTable input.dt-select-checkbox:indeterminate:after{display:block;position:absolute;content:\" \";top:3px;left:3px;height:4px;width:4px;background-color:#000;border-radius:2px}table.dataTable>tbody>tr.selected input.dt-select-checkbox:checked{border:1px solid}table.dataTable>tbody>tr>td.select-checkbox,table.dataTable>tbody>tr>th.select-checkbox{position:relative}table.dataTable>tbody>tr>td.select-checkbox:before,table.dataTable>tbody>tr>th.select-checkbox:before{display:block;position:absolute;top:50%;left:50%;width:12px;height:12px;box-sizing:border-box;content:\" \";margin-top:-6px;margin-left:-6px;border:1px solid;border-radius:3px}table.dataTable>tbody>tr.selected>td.select-checkbox:before,table.dataTable>tbody>tr.selected>th.select-checkbox:before{border:1px solid;content:\"\\2713\";font-size:20px;line-height:6px;text-align:center}table.dataTable.compact>tbody>tr>td.select-checkbox:before,table.dataTable.compact>tbody>tr>th.select-checkbox:before{margin-top:-12px}table.dataTable.compact>tbody>tr.selected>td.select-checkbox:after,table.dataTable.compact>tbody>tr.selected>th.select-checkbox:after{margin-top:-16px}div.dt-container span.select-info,div.dt-container span.select-item{margin-left:.5em}html.dark table.dataTable input.dt-select-checkbox:indeterminate:after,html[data-bs-theme=dark] table.dataTable input.dt-select-checkbox:indeterminate:after{background-color:#fff}@media screen and (max-width: 640px){div.dt-container span.select-info,div.dt-container span.select-item{margin-left:0;display:block}}\n",
"</style>\n",
"<div id=\"itables_init_notebook_mode_36789e7b_9187_4d2a_9029_befcc802bd6c\" style=\"vertical-align:middle; text-align:left\">\n",
"<div style=\"float:left; margin-right: 10px;\">\n",
"<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
"width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
" <g style=\"fill:#d9d7fc\">\n",
" <path d=\"M100,400H500V357H100Z\" />\n",
" <path d=\"M100,300H400V257H100Z\" />\n",
" <path d=\"M0,200H400V157H0Z\" />\n",
" <path d=\"M100,100H500V57H100Z\" />\n",
" <path d=\"M100,350H500V307H100Z\" />\n",
" <path d=\"M100,250H400V207H100Z\" />\n",
" <path d=\"M0,150H400V107H0Z\" />\n",
" <path d=\"M100,50H500V7H100Z\" />\n",
" </g>\n",
" <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
" <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"0;0;400\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;300;0\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;400\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
" <g transform=\"translate(45 50) rotate(-45)\">\n",
" <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
" <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(450 152)\">\n",
" <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
" <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(50 352)\">\n",
" <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
" <polygon points=\"-35,10 0,45 35,10\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(75 250)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(425 250) rotate(180)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
" </g>\n",
" </g>\n",
"</svg>\n",
"</a>\n",
"</div>\n",
"<div>\n",
"This is the <code>init_notebook_mode</code> cell from ITables v2.0.1<br>\n",
"(you should not see this message - is your notebook <it>trusted</it>?)\n",
"</div>\n",
"</div>\n",
"<script>\n",
"window._datatables_src_for_itables_2_0_1 = \"data:text/javascript;base64,dmFyIE5vPU9iamVjdC5jcmVhdGU7dmFyIF9hPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgRW89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgT289T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFJvPU9iamVjdC5nZXRQcm90b3R5cGVPZixMbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBXcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLHIpPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbcl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTt2YXIgQ2E9KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKTt2YXIgem89KHQsZSxyLG4pPT57aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QifHx0eXBlb2YgZT09ImZ1bmN0aW9uIilmb3IobGV0IHMgb2YgT28oZSkpIUxvLmNhbGwodCxzKSYmcyE9PXImJl9hKHQscyx7Z2V0OigpPT5lW3NdLGVudW1lcmFibGU6IShuPUVvKGUscykpfHxuLmVudW1lcmFibGV9KTtyZXR1cm4gdH07dmFyIG5lPSh0LGUscik9PihyPXQhPW51bGw/Tm8oUm8odCkpOnt9LHpvKGV8fCF0fHwhdC5fX2VzTW9kdWxlP19hKHIsImRlZmF1bHQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KTpyLHQpKTt2YXIga2E9Q2EoKFRhLGlpKT0+eyhmdW5jdGlvbih0KXt0eXBlb2YgVGE9PSJvYmplY3QiJiZ0eXBlb2YgaWk8InUiP2lpLmV4cG9ydHM9dCgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOih0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXMpLkpTWmlwPXQoKX0pKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIHMoYyxwKXtpZighcltjXSl7aWYoIWVbY10pe3ZhciBiPXR5cGVvZiBXcj09ImZ1bmN0aW9uIiYmV3I7aWYoIXAmJmIpcmV0dXJuIGIoYywhMCk7aWYoYSlyZXR1cm4gYShjLCEwKTt2YXIgbT1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitjKyInIik7dGhyb3cgbS5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixtfXZhciB5PXJbY109e2V4cG9ydHM6e319O2VbY11bMF0uY2FsbCh5LmV4cG9ydHMsZnVuY3Rpb24oVCl7dmFyIHc9ZVtjXVsxXVtUXTtyZXR1cm4gcyh3fHxUKX0seSx5LmV4cG9ydHMsdCxlLHIsbil9cmV0dXJuIHJbY10uZXhwb3J0c31mb3IodmFyIGE9dHlwZW9mIFdyPT0iZnVuY3Rpb24iJiZXcixsPTA7bDxuLmxlbmd0aDtsKyspcyhuW2xdKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO3IuZW5jb2RlPWZ1bmN0aW9uKGwpe2Zvcih2YXIgYyxwLGIsbSx5LFQsdyxrPVtdLFA9MCxGPWwubGVuZ3RoLGg9RixvPW4uZ2V0VHlwZU9mKGwpIT09InN0cmluZyI7UDxsLmxlbmd0aDspaD1GLVAsYj1vPyhjPWxbUCsrXSxwPVA8Rj9sW1ArK106MCxQPEY/bFtQKytdOjApOihjPWwuY2hhckNvZGVBdChQKyspLHA9UDxGP2wuY2hhckNvZGVBdChQKyspOjAsUDxGP2wuY2hhckNvZGVBdChQKyspOjApLG09Yz4+Mix5PSgzJmMpPDw0fHA+PjQsVD0xPGg/KDE1JnApPDwyfGI+PjY6NjQsdz0yPGg/NjMmYjo2NCxrLnB1c2goYS5jaGFyQXQobSkrYS5jaGFyQXQoeSkrYS5jaGFyQXQoVCkrYS5jaGFyQXQodykpO3JldHVybiBrLmpvaW4oIiIpfSxyLmRlY29kZT1mdW5jdGlvbihsKXt2YXIgYyxwLGIsbSx5LFQsdz0wLGs9MCxQPSJkYXRhOiI7aWYobC5zdWJzdHIoMCxQLmxlbmd0aCk9PT1QKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTt2YXIgRixoPTMqKGw9bC5yZXBsYWNlKC9bXkEtWmEtejAtOSsvPV0vZywiIikpLmxlbmd0aC80O2lmKGwuY2hhckF0KGwubGVuZ3RoLTEpPT09YS5jaGFyQXQoNjQpJiZoLS0sbC5jaGFyQXQobC5sZW5ndGgtMik9PT1hLmNoYXJBdCg2NCkmJmgtLSxoJTEhPTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJhc2U2NCBpbnB1dCwgYmFkIGNvbnRlbnQgbGVuZ3RoLiIpO2ZvcihGPXMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGgpOm5ldyBBcnJheSgwfGgpO3c8bC5sZW5ndGg7KWM9YS5pbmRleE9mKGwuY2hhckF0KHcrKykpPDwyfChtPWEuaW5kZXhPZihsLmNoYXJBdCh3KyspKSk+PjQscD0oMTUmbSk8PDR8KHk9YS5pbmRleE9mKGwuY2hhckF0KHcrKykpKT4+MixiPSgzJnkpPDw2fChUPWEuaW5kZXhPZihsLmNoYXJBdCh3KyspKSksRltrKytdPWMseSE9PTY0JiYoRltrKytdPXApLFQhPT02NCYmKEZbaysrXT1iKTtyZXR1cm4gRn19LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vZXh0ZXJuYWwiKSxzPXQoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxhPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxsPXQoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIGMocCxiLG0seSxUKXt0aGlzLmNvbXByZXNzZWRTaXplPXAsdGhpcy51bmNvbXByZXNzZWRTaXplPWIsdGhpcy5jcmMzMj1tLHRoaXMuY29tcHJlc3Npb249eSx0aGlzLmNvbXByZXNzZWRDb250ZW50PVR9Yy5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgcD1uZXcgcyhuLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbCgiZGF0YV9sZW5ndGgiKSksYj10aGlzO3JldHVybiBwLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09Yi51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcigiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaCIpfSkscH0sZ2V0Q29tcHJlc3NlZFdvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcyhuLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkud2l0aFN0cmVhbUluZm8oImNvbXByZXNzZWRTaXplIix0aGlzLmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygidW5jb21wcmVzc2VkU2l6ZSIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygiY3JjMzIiLHRoaXMuY3JjMzIpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdGhpcy5jb21wcmVzc2lvbil9fSxjLmNyZWF0ZVdvcmtlckZyb209ZnVuY3Rpb24ocCxiLG0pe3JldHVybiBwLnBpcGUobmV3IGEpLnBpcGUobmV3IGwoInVuY29tcHJlc3NlZFNpemUiKSkucGlwZShiLmNvbXByZXNzV29ya2VyKG0pKS5waXBlKG5ldyBsKCJjb21wcmVzc2VkU2l6ZSIpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLGIpfSxlLmV4cG9ydHM9Y30seyIuL2V4dGVybmFsIjo2LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIjoyNiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6Mjd9XSwzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtyLlNUT1JFPXttYWdpYzoiXDBcMCIsY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LHIuREVGTEFURT10KCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vdXRpbHMiKSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhLGw9W10sYz0wO2M8MjU2O2MrKyl7YT1jO2Zvcih2YXIgcD0wO3A8ODtwKyspYT0xJmE/Mzk4ODI5MjM4NF5hPj4+MTphPj4+MTtsW2NdPWF9cmV0dXJuIGx9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGEsbCl7cmV0dXJuIGEhPT12b2lkIDAmJmEubGVuZ3RoP24uZ2V0VHlwZU9mKGEpIT09InN0cmluZyI/ZnVuY3Rpb24oYyxwLGIsbSl7dmFyIHk9cyxUPW0rYjtjXj0tMTtmb3IodmFyIHc9bTt3PFQ7dysrKWM9Yz4+PjheeVsyNTUmKGNecFt3XSldO3JldHVybi0xXmN9KDB8bCxhLGEubGVuZ3RoLDApOmZ1bmN0aW9uKGMscCxiLG0pe3ZhciB5PXMsVD1tK2I7Y149LTE7Zm9yKHZhciB3PW07dzxUO3crKyljPWM+Pj44XnlbMjU1JihjXnAuY2hhckNvZGVBdCh3KSldO3JldHVybi0xXmN9KDB8bCxhLGEubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtyLmJhc2U2ND0hMSxyLmJpbmFyeT0hMSxyLmRpcj0hMSxyLmNyZWF0ZUZvbGRlcnM9ITAsci5kYXRlPW51bGwsci5jb21wcmVzc2lvbj1udWxsLHIuY29tcHJlc3Npb25PcHRpb25zPW51bGwsci5jb21tZW50PW51bGwsci51bml4UGVybWlzc2lvbnM9bnVsbCxyLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPW51bGw7bj10eXBlb2YgUHJvbWlzZTwidSI/UHJvbWlzZTp0KCJsaWUiKSxlLmV4cG9ydHM9e1Byb21pc2U6bn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIFVpbnQzMkFycmF5PCJ1IixzPXQoInBha28iKSxhPXQoIi4vdXRpbHMiKSxsPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSxjPW4/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcChiLG0pe2wuY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2IpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWIsdGhpcy5fcGFrb09wdGlvbnM9bSx0aGlzLm1ldGE9e319ci5tYWdpYz0iXGJcMCIsYS5pbmhlcml0cyhwLGwpLHAucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihiKXt0aGlzLm1ldGE9Yi5tZXRhLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGEudHJhbnNmb3JtVG8oYyxiLmRhdGEpLCExKX0scC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe2wucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHAucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgc1t0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciBiPXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24obSl7Yi5wdXNoKHtkYXRhOm0sbWV0YTpiLm1ldGF9KX19LHIuY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBwKCJEZWZsYXRlIixiKX0sci51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHksVCl7dmFyIHcsaz0iIjtmb3Iodz0wO3c8VDt3Kyspays9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmeSkseT4+Pj04O3JldHVybiBrfWZ1bmN0aW9uIHMoeSxULHcsayxQLEYpe3ZhciBoLG8sZj15LmZpbGUsQz15LmNvbXByZXNzaW9uLEI9RiE9PWMudXRmOGVuY29kZSx1PWEudHJhbnNmb3JtVG8oInN0cmluZyIsRihmLm5hbWUpKSx6PWEudHJhbnNmb3JtVG8oInN0cmluZyIsYy51dGY4ZW5jb2RlKGYubmFtZSkpLHE9Zi5jb21tZW50LGV0PWEudHJhbnNmb3JtVG8oInN0cmluZyIsRihxKSksTz1hLnRyYW5zZm9ybVRvKCJzdHJpbmciLGMudXRmOGVuY29kZShxKSksWj16Lmxlbmd0aCE9PWYubmFtZS5sZW5ndGgsZz1PLmxlbmd0aCE9PXEubGVuZ3RoLF89IiIsUz0iIixOPSIiLFI9Zi5kaXIsTD1mLmRhdGUsWD17Y3JjMzI6MCxjb21wcmVzc2VkU2l6ZTowLHVuY29tcHJlc3NlZFNpemU6MH07VCYmIXd8fChYLmNyYzMyPXkuY3JjMzIsWC5jb21wcmVzc2VkU2l6ZT15LmNvbXByZXNzZWRTaXplLFgudW5jb21wcmVzc2VkU2l6ZT15LnVuY29tcHJlc3NlZFNpemUpO3ZhciBqPTA7VCYmKGp8PTgpLEJ8fCFaJiYhZ3x8KGp8PTIwNDgpO3ZhciBHPTAsYXQ9MDtSJiYoR3w9MTYpLFA9PT0iVU5JWCI/KGF0PTc5OCxHfD1mdW5jdGlvbih0dCx5dCl7dmFyIFR0PXR0O3JldHVybiB0dHx8KFR0PXl0PzE2ODkzOjMzMjA0KSwoNjU1MzUmVHQpPDwxNn0oZi51bml4UGVybWlzc2lvbnMsUikpOihhdD0yMCxHfD1mdW5jdGlvbih0dCl7cmV0dXJuIDYzJih0dHx8MCl9KGYuZG9zUGVybWlzc2lvbnMpKSxoPUwuZ2V0VVRDSG91cnMoKSxoPDw9NixofD1MLmdldFVUQ01pbnV0ZXMoKSxoPDw9NSxofD1MLmdldFVUQ1NlY29uZHMoKS8yLG89TC5nZXRVVENGdWxsWWVhcigpLTE5ODAsbzw8PTQsb3w9TC5nZXRVVENNb250aCgpKzEsbzw8PTUsb3w9TC5nZXRVVENEYXRlKCksWiYmKFM9bigxLDEpK24ocCh1KSw0KSt6LF8rPSJ1cCIrbihTLmxlbmd0aCwyKStTKSxnJiYoTj1uKDEsMSkrbihwKGV0KSw0KStPLF8rPSJ1YyIrbihOLmxlbmd0aCwyKStOKTt2YXIgSj0iIjtyZXR1cm4gSis9YApcMGAsSis9bihqLDIpLEorPUMubWFnaWMsSis9bihoLDIpLEorPW4obywyKSxKKz1uKFguY3JjMzIsNCksSis9bihYLmNvbXByZXNzZWRTaXplLDQpLEorPW4oWC51bmNvbXByZXNzZWRTaXplLDQpLEorPW4odS5sZW5ndGgsMiksSis9bihfLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpiLkxPQ0FMX0ZJTEVfSEVBREVSK0ordStfLGRpclJlY29yZDpiLkNFTlRSQUxfRklMRV9IRUFERVIrbihhdCwyKStKK24oZXQubGVuZ3RoLDIpKyJcMFwwXDBcMCIrbihHLDQpK24oayw0KSt1K18rZXR9fXZhciBhPXQoIi4uL3V0aWxzIiksbD10KCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGM9dCgiLi4vdXRmOCIpLHA9dCgiLi4vY3JjMzIiKSxiPXQoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIG0oeSxULHcsayl7bC5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1ULHRoaXMuemlwUGxhdGZvcm09dyx0aGlzLmVuY29kZUZpbGVOYW1lPWssdGhpcy5zdHJlYW1GaWxlcz15LHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119YS5pbmhlcml0cyhtLGwpLG0ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oeSl7dmFyIFQ9eS5tZXRhLnBlcmNlbnR8fDAsdz10aGlzLmVudHJpZXNDb3VudCxrPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaCh5KToodGhpcy5ieXRlc1dyaXR0ZW4rPXkuZGF0YS5sZW5ndGgsbC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6eS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDp3PyhUKzEwMCoody1rLTEpKS93OjEwMH19KSl9LG0ucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbih5KXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT15LmZpbGUubmFtZTt2YXIgVD10aGlzLnN0cmVhbUZpbGVzJiYheS5maWxlLmRpcjtpZihUKXt2YXIgdz1zKHksVCwhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6dy5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sbS5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKHkpe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgVD10aGlzLnN0cmVhbUZpbGVzJiYheS5maWxlLmRpcix3PXMoeSxULCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHcuZGlyUmVjb3JkKSxUKXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihrKXtyZXR1cm4gYi5EQVRBX0RFU0NSSVBUT1IrbihrLmNyYzMyLDQpK24oay5jb21wcmVzc2VkU2l6ZSw0KStuKGsudW5jb21wcmVzc2VkU2l6ZSw0KX0oeSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOncuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LG0ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciB5PXRoaXMuYnl0ZXNXcml0dGVuLFQ9MDtUPHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7VCsrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbVF0sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHc9dGhpcy5ieXRlc1dyaXR0ZW4teSxrPWZ1bmN0aW9uKFAsRixoLG8sZil7dmFyIEM9YS50cmFuc2Zvcm1Ubygic3RyaW5nIixmKG8pKTtyZXR1cm4gYi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIituKFAsMikrbihQLDIpK24oRiw0KStuKGgsNCkrbihDLmxlbmd0aCwyKStDfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLHcseSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOmssbWV0YTp7cGVyY2VudDoxMDB9fSl9LG0ucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxtLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKHkpe3RoaXMuX3NvdXJjZXMucHVzaCh5KTt2YXIgVD10aGlzO3JldHVybiB5Lm9uKCJkYXRhIixmdW5jdGlvbih3KXtULnByb2Nlc3NDaHVuayh3KX0pLHkub24oImVuZCIsZnVuY3Rpb24oKXtULmNsb3NlZFNvdXJjZShULnByZXZpb3VzLnN0cmVhbUluZm8pLFQuX3NvdXJjZXMubGVuZ3RoP1QucHJlcGFyZU5leHRTb3VyY2UoKTpULmVuZCgpfSkseS5vbigiZXJyb3IiLGZ1bmN0aW9uKHcpe1QuZXJyb3Iodyl9KSx0aGlzfSxtLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIWwucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxtLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih5KXt2YXIgVD10aGlzLl9zb3VyY2VzO2lmKCFsLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMseSkpcmV0dXJuITE7Zm9yKHZhciB3PTA7dzxULmxlbmd0aDt3KyspdHJ5e1Rbd10uZXJyb3IoeSl9Y2F0Y2h7fXJldHVybiEwfSxtLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgeT10aGlzLl9zb3VyY2VzLFQ9MDtUPHkubGVuZ3RoO1QrKyl5W1RdLmxvY2soKX0sZS5leHBvcnRzPW19LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vY29tcHJlc3Npb25zIikscz10KCIuL1ppcEZpbGVXb3JrZXIiKTtyLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGEsbCxjKXt2YXIgcD1uZXcgcyhsLnN0cmVhbUZpbGVzLGMsbC5wbGF0Zm9ybSxsLmVuY29kZUZpbGVOYW1lKSxiPTA7dHJ5e2EuZm9yRWFjaChmdW5jdGlvbihtLHkpe2IrKzt2YXIgVD1mdW5jdGlvbihGLGgpe3ZhciBvPUZ8fGgsZj1uW29dO2lmKCFmKXRocm93IG5ldyBFcnJvcihvKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gZn0oeS5vcHRpb25zLmNvbXByZXNzaW9uLGwuY29tcHJlc3Npb24pLHc9eS5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8bC5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LGs9eS5kaXIsUD15LmRhdGU7eS5fY29tcHJlc3NXb3JrZXIoVCx3KS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6bSxkaXI6ayxkYXRlOlAsY29tbWVudDp5LmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczp5LnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczp5LmRvc1Blcm1pc3Npb25zfSkucGlwZShwKX0pLHAuZW50cmllc0NvdW50PWJ9Y2F0Y2gobSl7cC5lcnJvcihtKX1yZXR1cm4gcH19LHsiLi4vY29tcHJlc3Npb25zIjozLCIuL1ppcEZpbGVXb3JrZXIiOjh9XSwxMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHM9bmV3IG47Zm9yKHZhciBhIGluIHRoaXMpdHlwZW9mIHRoaXNbYV0hPSJmdW5jdGlvbiImJihzW2FdPXRoaXNbYV0pO3JldHVybiBzfX0obi5wcm90b3R5cGU9dCgiLi9vYmplY3QiKSkubG9hZEFzeW5jPXQoIi4vbG9hZCIpLG4uc3VwcG9ydD10KCIuL3N1cHBvcnQiKSxuLmRlZmF1bHRzPXQoIi4vZGVmYXVsdHMiKSxuLnZlcnNpb249IjMuMTAuMSIsbi5sb2FkQXN5bmM9ZnVuY3Rpb24ocyxhKXtyZXR1cm4gbmV3IG4oKS5sb2FkQXN5bmMocyxhKX0sbi5leHRlcm5hbD10KCIuL2V4dGVybmFsIiksZS5leHBvcnRzPW59LHsiLi9kZWZhdWx0cyI6NSwiLi9leHRlcm5hbCI6NiwiLi9sb2FkIjoxMSwiLi9vYmplY3QiOjE1LCIuL3N1cHBvcnQiOjMwfV0sMTE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9leHRlcm5hbCIpLGE9dCgiLi91dGY4IiksbD10KCIuL3ppcEVudHJpZXMiKSxjPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxwPXQoIi4vbm9kZWpzVXRpbHMiKTtmdW5jdGlvbiBiKG0pe3JldHVybiBuZXcgcy5Qcm9taXNlKGZ1bmN0aW9uKHksVCl7dmFyIHc9bS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IGMpO3cub24oImVycm9yIixmdW5jdGlvbihrKXtUKGspfSkub24oImVuZCIsZnVuY3Rpb24oKXt3LnN0cmVhbUluZm8uY3JjMzIhPT1tLmRlY29tcHJlc3NlZC5jcmMzMj9UKG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoIikpOnkoKX0pLnJlc3VtZSgpfSl9ZS5leHBvcnRzPWZ1bmN0aW9uKG0seSl7dmFyIFQ9dGhpcztyZXR1cm4geT1uLmV4dGVuZCh5fHx7fSx7YmFzZTY0OiExLGNoZWNrQ1JDMzI6ITEsb3B0aW1pemVkQmluYXJ5U3RyaW5nOiExLGNyZWF0ZUZvbGRlcnM6ITEsZGVjb2RlRmlsZU5hbWU6YS51dGY4ZGVjb2RlfSkscC5pc05vZGUmJnAuaXNTdHJlYW0obSk/cy5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk6bi5wcmVwYXJlQ29udGVudCgidGhlIGxvYWRlZCB6aXAgZmlsZSIsbSwhMCx5Lm9wdGltaXplZEJpbmFyeVN0cmluZyx5LmJhc2U2NCkudGhlbihmdW5jdGlvbih3KXt2YXIgaz1uZXcgbCh5KTtyZXR1cm4gay5sb2FkKHcpLGt9KS50aGVuKGZ1bmN0aW9uKHcpe3ZhciBrPVtzLlByb21pc2UucmVzb2x2ZSh3KV0sUD13LmZpbGVzO2lmKHkuY2hlY2tDUkMzMilmb3IodmFyIEY9MDtGPFAubGVuZ3RoO0YrKylrLnB1c2goYihQW0ZdKSk7cmV0dXJuIHMuUHJvbWlzZS5hbGwoayl9KS50aGVuKGZ1bmN0aW9uKHcpe2Zvcih2YXIgaz13LnNoaWZ0KCksUD1rLmZpbGVzLEY9MDtGPFAubGVuZ3RoO0YrKyl7dmFyIGg9UFtGXSxvPWguZmlsZU5hbWVTdHIsZj1uLnJlc29sdmUoaC5maWxlTmFtZVN0cik7VC5maWxlKGYsaC5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpoLmRhdGUsZGlyOmguZGlyLGNvbW1lbnQ6aC5maWxlQ29tbWVudFN0ci5sZW5ndGg/aC5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpoLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpoLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6eS5jcmVhdGVGb2xkZXJzfSksaC5kaXJ8fChULmZpbGUoZikudW5zYWZlT3JpZ2luYWxOYW1lPW8pfXJldHVybiBrLnppcENvbW1lbnQubGVuZ3RoJiYoVC5jb21tZW50PWsuemlwQ29tbWVudCksVH0pfX0seyIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vQ3JjMzJQcm9iZSI6MjUsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcEVudHJpZXMiOjMzfV0sMTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gYShsLGMpe3MuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrbCksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKGMpfW4uaW5oZXJpdHMoYSxzKSxhLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihsKXt2YXIgYz10aGlzOyh0aGlzLl9zdHJlYW09bCkucGF1c2UoKSxsLm9uKCJkYXRhIixmdW5jdGlvbihwKXtjLnB1c2goe2RhdGE6cCxtZXRhOntwZXJjZW50OjB9fSl9KS5vbigiZXJyb3IiLGZ1bmN0aW9uKHApe2MuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1wOmMuZXJyb3IocCl9KS5vbigiZW5kIixmdW5jdGlvbigpe2MuaXNQYXVzZWQ/Yy5fdXBzdHJlYW1FbmRlZD0hMDpjLmVuZCgpfSl9LGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxhLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LGUuZXhwb3J0cz1hfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGU7ZnVuY3Rpb24gcyhhLGwsYyl7bi5jYWxsKHRoaXMsbCksdGhpcy5faGVscGVyPWE7dmFyIHA9dGhpczthLm9uKCJkYXRhIixmdW5jdGlvbihiLG0pe3AucHVzaChiKXx8cC5faGVscGVyLnBhdXNlKCksYyYmYyhtKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYil7cC5lbWl0KCJlcnJvciIsYil9KS5vbigiZW5kIixmdW5jdGlvbigpe3AucHVzaChudWxsKX0pfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxuKSxzLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtpc05vZGU6dHlwZW9mIEJ1ZmZlcjwidSIsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihuLHMpe2lmKEJ1ZmZlci5mcm9tJiZCdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSlyZXR1cm4gQnVmZmVyLmZyb20obixzKTtpZih0eXBlb2Ygbj09Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBCdWZmZXIobixzKX0sYWxsb2NCdWZmZXI6ZnVuY3Rpb24obil7aWYoQnVmZmVyLmFsbG9jKXJldHVybiBCdWZmZXIuYWxsb2Mobik7dmFyIHM9bmV3IEJ1ZmZlcihuKTtyZXR1cm4gcy5maWxsKDApLHN9LGlzQnVmZmVyOmZ1bmN0aW9uKG4pe3JldHVybiBCdWZmZXIuaXNCdWZmZXIobil9LGlzU3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiBuJiZ0eXBlb2Ygbi5vbj09ImZ1bmN0aW9uIiYmdHlwZW9mIG4ucGF1c2U9PSJmdW5jdGlvbiImJnR5cGVvZiBuLnJlc3VtZT09ImZ1bmN0aW9uIn19fSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihmLEMsQil7dmFyIHUsej1hLmdldFR5cGVPZihDKSxxPWEuZXh0ZW5kKEJ8fHt9LHApO3EuZGF0ZT1xLmRhdGV8fG5ldyBEYXRlLHEuY29tcHJlc3Npb24hPT1udWxsJiYocS5jb21wcmVzc2lvbj1xLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCkpLHR5cGVvZiBxLnVuaXhQZXJtaXNzaW9ucz09InN0cmluZyImJihxLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChxLnVuaXhQZXJtaXNzaW9ucyw4KSkscS51bml4UGVybWlzc2lvbnMmJjE2Mzg0JnEudW5peFBlcm1pc3Npb25zJiYocS5kaXI9ITApLHEuZG9zUGVybWlzc2lvbnMmJjE2JnEuZG9zUGVybWlzc2lvbnMmJihxLmRpcj0hMCkscS5kaXImJihmPVAoZikpLHEuY3JlYXRlRm9sZGVycyYmKHU9ayhmKSkmJkYuY2FsbCh0aGlzLHUsITApO3ZhciBldD16PT09InN0cmluZyImJnEuYmluYXJ5PT09ITEmJnEuYmFzZTY0PT09ITE7QiYmQi5iaW5hcnkhPT12b2lkIDB8fChxLmJpbmFyeT0hZXQpLChDIGluc3RhbmNlb2YgYiYmQy51bmNvbXByZXNzZWRTaXplPT09MHx8cS5kaXJ8fCFDfHxDLmxlbmd0aD09PTApJiYocS5iYXNlNjQ9ITEscS5iaW5hcnk9ITAsQz0iIixxLmNvbXByZXNzaW9uPSJTVE9SRSIsej0ic3RyaW5nIik7dmFyIE89bnVsbDtPPUMgaW5zdGFuY2VvZiBifHxDIGluc3RhbmNlb2YgbD9DOlQuaXNOb2RlJiZULmlzU3RyZWFtKEMpP25ldyB3KGYsQyk6YS5wcmVwYXJlQ29udGVudChmLEMscS5iaW5hcnkscS5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcscS5iYXNlNjQpO3ZhciBaPW5ldyBtKGYsTyxxKTt0aGlzLmZpbGVzW2ZdPVp9dmFyIHM9dCgiLi91dGY4IiksYT10KCIuL3V0aWxzIiksbD10KCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIiksYz10KCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiKSxwPXQoIi4vZGVmYXVsdHMiKSxiPXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLG09dCgiLi96aXBPYmplY3QiKSx5PXQoIi4vZ2VuZXJhdGUiKSxUPXQoIi4vbm9kZWpzVXRpbHMiKSx3PXQoIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlciIpLGs9ZnVuY3Rpb24oZil7Zi5zbGljZSgtMSk9PT0iLyImJihmPWYuc3Vic3RyaW5nKDAsZi5sZW5ndGgtMSkpO3ZhciBDPWYubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gMDxDP2Yuc3Vic3RyaW5nKDAsQyk6IiJ9LFA9ZnVuY3Rpb24oZil7cmV0dXJuIGYuc2xpY2UoLTEpIT09Ii8iJiYoZis9Ii8iKSxmfSxGPWZ1bmN0aW9uKGYsQyl7cmV0dXJuIEM9QyE9PXZvaWQgMD9DOnAuY3JlYXRlRm9sZGVycyxmPVAoZiksdGhpcy5maWxlc1tmXXx8bi5jYWxsKHRoaXMsZixudWxsLHtkaXI6ITAsY3JlYXRlRm9sZGVyczpDfSksdGhpcy5maWxlc1tmXX07ZnVuY3Rpb24gaChmKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGYpPT09IltvYmplY3QgUmVnRXhwXSJ9dmFyIG89e2xvYWQ6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGZvckVhY2g6ZnVuY3Rpb24oZil7dmFyIEMsQix1O2ZvcihDIGluIHRoaXMuZmlsZXMpdT10aGlzLmZpbGVzW0NdLChCPUMuc2xpY2UodGhpcy5yb290Lmxlbmd0aCxDLmxlbmd0aCkpJiZDLnNsaWNlKDAsdGhpcy5yb290Lmxlbmd0aCk9PT10aGlzLnJvb3QmJmYoQix1KX0sZmlsdGVyOmZ1bmN0aW9uKGYpe3ZhciBDPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oQix1KXtmKEIsdSkmJkMucHVzaCh1KX0pLEN9LGZpbGU6ZnVuY3Rpb24oZixDLEIpe2lmKGFyZ3VtZW50cy5sZW5ndGghPT0xKXJldHVybiBmPXRoaXMucm9vdCtmLG4uY2FsbCh0aGlzLGYsQyxCKSx0aGlzO2lmKGgoZikpe3ZhciB1PWY7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHEsZXQpe3JldHVybiFldC5kaXImJnUudGVzdChxKX0pfXZhciB6PXRoaXMuZmlsZXNbdGhpcy5yb290K2ZdO3JldHVybiB6JiYhei5kaXI/ejpudWxsfSxmb2xkZXI6ZnVuY3Rpb24oZil7aWYoIWYpcmV0dXJuIHRoaXM7aWYoaChmKSlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oeixxKXtyZXR1cm4gcS5kaXImJmYudGVzdCh6KX0pO3ZhciBDPXRoaXMucm9vdCtmLEI9Ri5jYWxsKHRoaXMsQyksdT10aGlzLmNsb25lKCk7cmV0dXJuIHUucm9vdD1CLm5hbWUsdX0scmVtb3ZlOmZ1bmN0aW9uKGYpe2Y9dGhpcy5yb290K2Y7dmFyIEM9dGhpcy5maWxlc1tmXTtpZihDfHwoZi5zbGljZSgtMSkhPT0iLyImJihmKz0iLyIpLEM9dGhpcy5maWxlc1tmXSksQyYmIUMuZGlyKWRlbGV0ZSB0aGlzLmZpbGVzW2ZdO2Vsc2UgZm9yKHZhciBCPXRoaXMuZmlsdGVyKGZ1bmN0aW9uKHoscSl7cmV0dXJuIHEubmFtZS5zbGljZSgwLGYubGVuZ3RoKT09PWZ9KSx1PTA7dTxCLmxlbmd0aDt1KyspZGVsZXRlIHRoaXMuZmlsZXNbQlt1XS5uYW1lXTtyZXR1cm4gdGhpc30sZ2VuZXJhdGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oZil7dmFyIEMsQj17fTt0cnl7aWYoKEI9YS5leHRlbmQoZnx8e30se3N0cmVhbUZpbGVzOiExLGNvbXByZXNzaW9uOiJTVE9SRSIsY29tcHJlc3Npb25PcHRpb25zOm51bGwsdHlwZToiIixwbGF0Zm9ybToiRE9TIixjb21tZW50Om51bGwsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ppcCIsZW5jb2RlRmlsZU5hbWU6cy51dGY4ZW5jb2RlfSkpLnR5cGU9Qi50eXBlLnRvTG93ZXJDYXNlKCksQi5jb21wcmVzc2lvbj1CLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCksQi50eXBlPT09ImJpbmFyeXN0cmluZyImJihCLnR5cGU9InN0cmluZyIpLCFCLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuIik7YS5jaGVja1N1cHBvcnQoQi50eXBlKSxCLnBsYXRmb3JtIT09ImRhcndpbiImJkIucGxhdGZvcm0hPT0iZnJlZWJzZCImJkIucGxhdGZvcm0hPT0ibGludXgiJiZCLnBsYXRmb3JtIT09InN1bm9zInx8KEIucGxhdGZvcm09IlVOSVgiKSxCLnBsYXRmb3JtPT09IndpbjMyIiYmKEIucGxhdGZvcm09IkRPUyIpO3ZhciB1PUIuY29tbWVudHx8dGhpcy5jb21tZW50fHwiIjtDPXkuZ2VuZXJhdGVXb3JrZXIodGhpcyxCLHUpfWNhdGNoKHopeyhDPW5ldyBsKCJlcnJvciIpKS5lcnJvcih6KX1yZXR1cm4gbmV3IGMoQyxCLnR5cGV8fCJzdHJpbmciLEIubWltZVR5cGUpfSxnZW5lcmF0ZUFzeW5jOmZ1bmN0aW9uKGYsQyl7cmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShmKS5hY2N1bXVsYXRlKEMpfSxnZW5lcmF0ZU5vZGVTdHJlYW06ZnVuY3Rpb24oZixDKXtyZXR1cm4oZj1mfHx7fSkudHlwZXx8KGYudHlwZT0ibm9kZWJ1ZmZlciIpLHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShmKS50b05vZGVqc1N0cmVhbShDKX19O2UuZXhwb3J0cz1vfSx7Ii4vY29tcHJlc3NlZE9iamVjdCI6MiwiLi9kZWZhdWx0cyI6NSwiLi9nZW5lcmF0ZSI6OSwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyIjoxMiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiOjI5LCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBPYmplY3QiOjM1fV0sMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoInN0cmVhbSIpfSx7c3RyZWFtOnZvaWQgMH1dLDE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vRGF0YVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSk7Zm9yKHZhciBsPTA7bDx0aGlzLmRhdGEubGVuZ3RoO2wrKylhW2xdPTI1NSZhW2xdfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxuKSxzLnByb3RvdHlwZS5ieXRlQXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnplcm8rYV19LHMucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgbD1hLmNoYXJDb2RlQXQoMCksYz1hLmNoYXJDb2RlQXQoMSkscD1hLmNoYXJDb2RlQXQoMiksYj1hLmNoYXJDb2RlQXQoMyksbT10aGlzLmxlbmd0aC00OzA8PW07LS1tKWlmKHRoaXMuZGF0YVttXT09PWwmJnRoaXMuZGF0YVttKzFdPT09YyYmdGhpcy5kYXRhW20rMl09PT1wJiZ0aGlzLmRhdGFbbSszXT09PWIpcmV0dXJuIG0tdGhpcy56ZXJvO3JldHVybi0xfSxzLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmU9ZnVuY3Rpb24oYSl7dmFyIGw9YS5jaGFyQ29kZUF0KDApLGM9YS5jaGFyQ29kZUF0KDEpLHA9YS5jaGFyQ29kZUF0KDIpLGI9YS5jaGFyQ29kZUF0KDMpLG09dGhpcy5yZWFkRGF0YSg0KTtyZXR1cm4gbD09PW1bMF0mJmM9PT1tWzFdJiZwPT09bVsyXSYmYj09PW1bM119LHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2hlY2tPZmZzZXQoYSksYT09PTApcmV0dXJuW107dmFyIGw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2EpO3JldHVybiB0aGlzLmluZGV4Kz1hLGx9LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9EYXRhUmVhZGVyIjoxOH1dLDE4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIik7ZnVuY3Rpb24gcyhhKXt0aGlzLmRhdGE9YSx0aGlzLmxlbmd0aD1hLmxlbmd0aCx0aGlzLmluZGV4PTAsdGhpcy56ZXJvPTB9cy5wcm90b3R5cGU9e2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGEpe3RoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4K2EpfSxjaGVja0luZGV4OmZ1bmN0aW9uKGEpe2lmKHRoaXMubGVuZ3RoPHRoaXMuemVybythfHxhPDApdGhyb3cgbmV3IEVycm9yKCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICIrdGhpcy5sZW5ndGgrIiwgYXNrZWQgaW5kZXggPSAiK2ErIikuIENvcnJ1cHRlZCB6aXAgPyIpfSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmNoZWNrSW5kZXgoYSksdGhpcy5pbmRleD1hfSxza2lwOmZ1bmN0aW9uKGEpe3RoaXMuc2V0SW5kZXgodGhpcy5pbmRleCthKX0sYnl0ZUF0OmZ1bmN0aW9uKCl7fSxyZWFkSW50OmZ1bmN0aW9uKGEpe3ZhciBsLGM9MDtmb3IodGhpcy5jaGVja09mZnNldChhKSxsPXRoaXMuaW5kZXgrYS0xO2w+PXRoaXMuaW5kZXg7bC0tKWM9KGM8PDgpK3RoaXMuYnl0ZUF0KGwpO3JldHVybiB0aGlzLmluZGV4Kz1hLGN9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIG4udHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5yZWFkRGF0YShhKSl9LHJlYWREYXRhOmZ1bmN0aW9uKCl7fSxsYXN0SW5kZXhPZlNpZ25hdHVyZTpmdW5jdGlvbigpe30scmVhZEFuZENoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkRGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZEludCg0KTtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoMTk4MCsoYT4+MjUmMTI3KSwoYT4+MjEmMTUpLTEsYT4+MTYmMzEsYT4+MTEmMzEsYT4+NSY2MywoMzEmYSk8PDEpKX19LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMn1dLDE5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vVWludDhBcnJheVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe3RoaXMuY2hlY2tPZmZzZXQoYSk7dmFyIGw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2EpO3JldHVybiB0aGlzLmluZGV4Kz1hLGx9LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vRGF0YVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvK2EpfSxzLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKGEpLXRoaXMuemVyb30scy5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09dGhpcy5yZWFkRGF0YSg0KX0scy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oYSl7dGhpcy5jaGVja09mZnNldChhKTt2YXIgbD10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrYSk7cmV0dXJuIHRoaXMuaW5kZXgrPWEsbH0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9BcnJheVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2hlY2tPZmZzZXQoYSksYT09PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO3ZhciBsPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCthKTtyZXR1cm4gdGhpcy5pbmRleCs9YSxsfSxlLmV4cG9ydHM9c30seyIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3fV0sMjI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N1cHBvcnQiKSxhPXQoIi4vQXJyYXlSZWFkZXIiKSxsPXQoIi4vU3RyaW5nUmVhZGVyIiksYz10KCIuL05vZGVCdWZmZXJSZWFkZXIiKSxwPXQoIi4vVWludDhBcnJheVJlYWRlciIpO2UuZXhwb3J0cz1mdW5jdGlvbihiKXt2YXIgbT1uLmdldFR5cGVPZihiKTtyZXR1cm4gbi5jaGVja1N1cHBvcnQobSksbSE9PSJzdHJpbmcifHxzLnVpbnQ4YXJyYXk/bT09PSJub2RlYnVmZmVyIj9uZXcgYyhiKTpzLnVpbnQ4YXJyYXk/bmV3IHAobi50cmFuc2Zvcm1UbygidWludDhhcnJheSIsYikpOm5ldyBhKG4udHJhbnNmb3JtVG8oImFycmF5IixiKSk6bmV3IGwoYil9fSx7Ii4uL3N1cHBvcnQiOjMwLCIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3LCIuL05vZGVCdWZmZXJSZWFkZXIiOjE5LCIuL1N0cmluZ1JlYWRlciI6MjAsIi4vVWludDhBcnJheVJlYWRlciI6MjF9XSwyMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtyLkxPQ0FMX0ZJTEVfSEVBREVSPSJQSwMEIixyLkNFTlRSQUxfRklMRV9IRUFERVI9IlBLAQIiLHIuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPSJQSwUGIixyLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1I9IlBLBlx4MDciLHIuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPSJQSwYGIixyLkRBVEFfREVTQ1JJUFRPUj0iUEtceDA3XGIifSx7fV0sMjQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9HZW5lcmljV29ya2VyIikscz10KCIuLi91dGlscyIpO2Z1bmN0aW9uIGEobCl7bi5jYWxsKHRoaXMsIkNvbnZlcnRXb3JrZXIgdG8gIitsKSx0aGlzLmRlc3RUeXBlPWx9cy5pbmhlcml0cyhhLG4pLGEucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihsKXt0aGlzLnB1c2goe2RhdGE6cy50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLGwuZGF0YSksbWV0YTpsLm1ldGF9KX0sZS5leHBvcnRzPWF9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9HZW5lcmljV29ya2VyIikscz10KCIuLi9jcmMzMiIpO2Z1bmN0aW9uIGEoKXtuLmNhbGwodGhpcywiQ3JjMzJQcm9iZSIpLHRoaXMud2l0aFN0cmVhbUluZm8oImNyYzMyIiwwKX10KCIuLi91dGlscyIpLmluaGVyaXRzKGEsbiksYS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGwpe3RoaXMuc3RyZWFtSW5mby5jcmMzMj1zKGwuZGF0YSx0aGlzLnN0cmVhbUluZm8uY3JjMzJ8fDApLHRoaXMucHVzaChsKX0sZS5leHBvcnRzPWF9LHsiLi4vY3JjMzIiOjQsIi4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0dlbmVyaWNXb3JrZXIiKTtmdW5jdGlvbiBhKGwpe3MuY2FsbCh0aGlzLCJEYXRhTGVuZ3RoUHJvYmUgZm9yICIrbCksdGhpcy5wcm9wTmFtZT1sLHRoaXMud2l0aFN0cmVhbUluZm8obCwwKX1uLmluaGVyaXRzKGEscyksYS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGwpe2lmKGwpe3ZhciBjPXRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXXx8MDt0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV09YytsLmRhdGEubGVuZ3RofXMucHJvdG90eXBlLnByb2Nlc3NDaHVuay5jYWxsKHRoaXMsbCl9LGUuZXhwb3J0cz1hfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0dlbmVyaWNXb3JrZXIiKTtmdW5jdGlvbiBhKGwpe3MuY2FsbCh0aGlzLCJEYXRhV29ya2VyIik7dmFyIGM9dGhpczt0aGlzLmRhdGFJc1JlYWR5PSExLHRoaXMuaW5kZXg9MCx0aGlzLm1heD0wLHRoaXMuZGF0YT1udWxsLHRoaXMudHlwZT0iIix0aGlzLl90aWNrU2NoZWR1bGVkPSExLGwudGhlbihmdW5jdGlvbihwKXtjLmRhdGFJc1JlYWR5PSEwLGMuZGF0YT1wLGMubWF4PXAmJnAubGVuZ3RofHwwLGMudHlwZT1uLmdldFR5cGVPZihwKSxjLmlzUGF1c2VkfHxjLl90aWNrQW5kUmVwZWF0KCl9LGZ1bmN0aW9uKHApe2MuZXJyb3IocCl9KX1uLmluaGVyaXRzKGEscyksYS5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe3MucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLmRhdGE9bnVsbH0sYS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSYmKCF0aGlzLl90aWNrU2NoZWR1bGVkJiZ0aGlzLmRhdGFJc1JlYWR5JiYodGhpcy5fdGlja1NjaGVkdWxlZD0hMCxuLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsW10sdGhpcykpLCEwKX0sYS5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQ9ZnVuY3Rpb24oKXt0aGlzLl90aWNrU2NoZWR1bGVkPSExLHRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZHx8KHRoaXMuX3RpY2soKSx0aGlzLmlzRmluaXNoZWR8fChuLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsW10sdGhpcyksdGhpcy5fdGlja1NjaGVkdWxlZD0hMCkpfSxhLnByb3RvdHlwZS5fdGljaz1mdW5jdGlvbigpe2lmKHRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt2YXIgbD1udWxsLGM9TWF0aC5taW4odGhpcy5tYXgsdGhpcy5pbmRleCsxNjM4NCk7aWYodGhpcy5pbmRleD49dGhpcy5tYXgpcmV0dXJuIHRoaXMuZW5kKCk7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJzdHJpbmciOmw9dGhpcy5kYXRhLnN1YnN0cmluZyh0aGlzLmluZGV4LGMpO2JyZWFrO2Nhc2UidWludDhhcnJheSI6bD10aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCxjKTticmVhaztjYXNlImFycmF5IjpjYXNlIm5vZGVidWZmZXIiOmw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsYyl9cmV0dXJuIHRoaXMuaW5kZXg9Yyx0aGlzLnB1c2goe2RhdGE6bCxtZXRhOntwZXJjZW50OnRoaXMubWF4P3RoaXMuaW5kZXgvdGhpcy5tYXgqMTAwOjB9fSl9LGUuZXhwb3J0cz1hfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4ocyl7dGhpcy5uYW1lPXN8fCJkZWZhdWx0Iix0aGlzLnN0cmVhbUluZm89e30sdGhpcy5nZW5lcmF0ZWRFcnJvcj1udWxsLHRoaXMuZXh0cmFTdHJlYW1JbmZvPXt9LHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5pc0ZpbmlzaGVkPSExLHRoaXMuaXNMb2NrZWQ9ITEsdGhpcy5fbGlzdGVuZXJzPXtkYXRhOltdLGVuZDpbXSxlcnJvcjpbXX0sdGhpcy5wcmV2aW91cz1udWxsfW4ucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKHMpe3RoaXMuZW1pdCgiZGF0YSIscyl9LGVuZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt0aGlzLmZsdXNoKCk7dHJ5e3RoaXMuZW1pdCgiZW5kIiksdGhpcy5jbGVhblVwKCksdGhpcy5pc0ZpbmlzaGVkPSEwfWNhdGNoKHMpe3RoaXMuZW1pdCgiZXJyb3IiLHMpfXJldHVybiEwfSxlcnJvcjpmdW5jdGlvbihzKXtyZXR1cm4hdGhpcy5pc0ZpbmlzaGVkJiYodGhpcy5pc1BhdXNlZD90aGlzLmdlbmVyYXRlZEVycm9yPXM6KHRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLmVtaXQoImVycm9yIixzKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmVycm9yKHMpLHRoaXMuY2xlYW5VcCgpKSwhMCl9LG9uOmZ1bmN0aW9uKHMsYSl7cmV0dXJuIHRoaXMuX2xpc3RlbmVyc1tzXS5wdXNoKGEpLHRoaXN9LGNsZWFuVXA6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbUluZm89dGhpcy5nZW5lcmF0ZWRFcnJvcj10aGlzLmV4dHJhU3RyZWFtSW5mbz1udWxsLHRoaXMuX2xpc3RlbmVycz1bXX0sZW1pdDpmdW5jdGlvbihzLGEpe2lmKHRoaXMuX2xpc3RlbmVyc1tzXSlmb3IodmFyIGw9MDtsPHRoaXMuX2xpc3RlbmVyc1tzXS5sZW5ndGg7bCsrKXRoaXMuX2xpc3RlbmVyc1tzXVtsXS5jYWxsKHRoaXMsYSl9LHBpcGU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMucmVnaXN0ZXJQcmV2aW91cyh0aGlzKX0scmVnaXN0ZXJQcmV2aW91czpmdW5jdGlvbihzKXtpZih0aGlzLmlzTG9ja2VkKXRocm93IG5ldyBFcnJvcigiVGhlIHN0cmVhbSAnIit0aGlzKyInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4iKTt0aGlzLnN0cmVhbUluZm89cy5zdHJlYW1JbmZvLHRoaXMubWVyZ2VTdHJlYW1JbmZvKCksdGhpcy5wcmV2aW91cz1zO3ZhciBhPXRoaXM7cmV0dXJuIHMub24oImRhdGEiLGZ1bmN0aW9uKGwpe2EucHJvY2Vzc0NodW5rKGwpfSkscy5vbigiZW5kIixmdW5jdGlvbigpe2EuZW5kKCl9KSxzLm9uKCJlcnJvciIsZnVuY3Rpb24obCl7YS5lcnJvcihsKX0pLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNQYXVzZWQmJiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkPSEwLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMucGF1c2UoKSwhMCl9LHJlc3VtZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIHM9dGhpcy5pc1BhdXNlZD0hMTtyZXR1cm4gdGhpcy5nZW5lcmF0ZWRFcnJvciYmKHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcikscz0hMCksdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5yZXN1bWUoKSwhc30sZmx1c2g6ZnVuY3Rpb24oKXt9LHByb2Nlc3NDaHVuazpmdW5jdGlvbihzKXt0aGlzLnB1c2gocyl9LHdpdGhTdHJlYW1JbmZvOmZ1bmN0aW9uKHMsYSl7cmV0dXJuIHRoaXMuZXh0cmFTdHJlYW1JbmZvW3NdPWEsdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzfSxtZXJnZVN0cmVhbUluZm86ZnVuY3Rpb24oKXtmb3IodmFyIHMgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZXh0cmFTdHJlYW1JbmZvLHMpJiYodGhpcy5zdHJlYW1JbmZvW3NdPXRoaXMuZXh0cmFTdHJlYW1JbmZvW3NdKX0sbG9jazpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuaXNMb2NrZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5sb2NrKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHM9IldvcmtlciAiK3RoaXMubmFtZTtyZXR1cm4gdGhpcy5wcmV2aW91cz90aGlzLnByZXZpb3VzKyIgLT4gIitzOnN9fSxlLmV4cG9ydHM9bn0se31dLDI5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0NvbnZlcnRXb3JrZXIiKSxhPXQoIi4vR2VuZXJpY1dvcmtlciIpLGw9dCgiLi4vYmFzZTY0IiksYz10KCIuLi9zdXBwb3J0IikscD10KCIuLi9leHRlcm5hbCIpLGI9bnVsbDtpZihjLm5vZGVzdHJlYW0pdHJ5e2I9dCgiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiKX1jYXRjaHt9ZnVuY3Rpb24gbShULHcpe3JldHVybiBuZXcgcC5Qcm9taXNlKGZ1bmN0aW9uKGssUCl7dmFyIEY9W10saD1ULl9pbnRlcm5hbFR5cGUsbz1ULl9vdXRwdXRUeXBlLGY9VC5fbWltZVR5cGU7VC5vbigiZGF0YSIsZnVuY3Rpb24oQyxCKXtGLnB1c2goQyksdyYmdyhCKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oQyl7Rj1bXSxQKEMpfSkub24oImVuZCIsZnVuY3Rpb24oKXt0cnl7dmFyIEM9ZnVuY3Rpb24oQix1LHope3N3aXRjaChCKXtjYXNlImJsb2IiOnJldHVybiBuLm5ld0Jsb2Iobi50cmFuc2Zvcm1UbygiYXJyYXlidWZmZXIiLHUpLHopO2Nhc2UiYmFzZTY0IjpyZXR1cm4gbC5lbmNvZGUodSk7ZGVmYXVsdDpyZXR1cm4gbi50cmFuc2Zvcm1UbyhCLHUpfX0obyxmdW5jdGlvbihCLHUpe3ZhciB6LHE9MCxldD1udWxsLE89MDtmb3Ioej0wO3o8dS5sZW5ndGg7eisrKU8rPXVbel0ubGVuZ3RoO3N3aXRjaChCKXtjYXNlInN0cmluZyI6cmV0dXJuIHUuam9pbigiIik7Y2FzZSJhcnJheSI6cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdSk7Y2FzZSJ1aW50OGFycmF5Ijpmb3IoZXQ9bmV3IFVpbnQ4QXJyYXkoTyksej0wO3o8dS5sZW5ndGg7eisrKWV0LnNldCh1W3pdLHEpLHErPXVbel0ubGVuZ3RoO3JldHVybiBldDtjYXNlIm5vZGVidWZmZXIiOnJldHVybiBCdWZmZXIuY29uY2F0KHUpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICciK0IrIiciKX19KGgsRiksZik7ayhDKX1jYXRjaChCKXtQKEIpfUY9W119KS5yZXN1bWUoKX0pfWZ1bmN0aW9uIHkoVCx3LGspe3ZhciBQPXc7c3dpdGNoKHcpe2Nhc2UiYmxvYiI6Y2FzZSJhcnJheWJ1ZmZlciI6UD0idWludDhhcnJheSI7YnJlYWs7Y2FzZSJiYXNlNjQiOlA9InN0cmluZyJ9dHJ5e3RoaXMuX2ludGVybmFsVHlwZT1QLHRoaXMuX291dHB1dFR5cGU9dyx0aGlzLl9taW1lVHlwZT1rLG4uY2hlY2tTdXBwb3J0KFApLHRoaXMuX3dvcmtlcj1ULnBpcGUobmV3IHMoUCkpLFQubG9jaygpfWNhdGNoKEYpe3RoaXMuX3dvcmtlcj1uZXcgYSgiZXJyb3IiKSx0aGlzLl93b3JrZXIuZXJyb3IoRil9fXkucHJvdG90eXBlPXthY2N1bXVsYXRlOmZ1bmN0aW9uKFQpe3JldHVybiBtKHRoaXMsVCl9LG9uOmZ1bmN0aW9uKFQsdyl7dmFyIGs9dGhpcztyZXR1cm4gVD09PSJkYXRhIj90aGlzLl93b3JrZXIub24oVCxmdW5jdGlvbihQKXt3LmNhbGwoayxQLmRhdGEsUC5tZXRhKX0pOnRoaXMuX3dvcmtlci5vbihULGZ1bmN0aW9uKCl7bi5kZWxheSh3LGFyZ3VtZW50cyxrKX0pLHRoaXN9LHJlc3VtZTpmdW5jdGlvbigpe3JldHVybiBuLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsW10sdGhpcy5fd29ya2VyKSx0aGlzfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93b3JrZXIucGF1c2UoKSx0aGlzfSx0b05vZGVqc1N0cmVhbTpmdW5jdGlvbihUKXtpZihuLmNoZWNrU3VwcG9ydCgibm9kZXN0cmVhbSIpLHRoaXMuX291dHB1dFR5cGUhPT0ibm9kZWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUrIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kIik7cmV0dXJuIG5ldyBiKHRoaXMse29iamVjdE1vZGU6dGhpcy5fb3V0cHV0VHlwZSE9PSJub2RlYnVmZmVyIn0sVCl9fSxlLmV4cG9ydHM9eX0seyIuLi9iYXNlNjQiOjEsIi4uL2V4dGVybmFsIjo2LCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciI6MTMsIi4uL3N1cHBvcnQiOjMwLCIuLi91dGlscyI6MzIsIi4vQ29udmVydFdvcmtlciI6MjQsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwzMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtpZihyLmJhc2U2ND0hMCxyLmFycmF5PSEwLHIuc3RyaW5nPSEwLHIuYXJyYXlidWZmZXI9dHlwZW9mIEFycmF5QnVmZmVyPCJ1IiYmdHlwZW9mIFVpbnQ4QXJyYXk8InUiLHIubm9kZWJ1ZmZlcj10eXBlb2YgQnVmZmVyPCJ1IixyLnVpbnQ4YXJyYXk9dHlwZW9mIFVpbnQ4QXJyYXk8InUiLHR5cGVvZiBBcnJheUJ1ZmZlcj4idSIpci5ibG9iPSExO2Vsc2V7dmFyIG49bmV3IEFycmF5QnVmZmVyKDApO3RyeXtyLmJsb2I9bmV3IEJsb2IoW25dLHt0eXBlOiJhcHBsaWNhdGlvbi96aXAifSkuc2l6ZT09PTB9Y2F0Y2h7dHJ5e3ZhciBzPW5ldyhzZWxmLkJsb2JCdWlsZGVyfHxzZWxmLldlYktpdEJsb2JCdWlsZGVyfHxzZWxmLk1vekJsb2JCdWlsZGVyfHxzZWxmLk1TQmxvYkJ1aWxkZXIpO3MuYXBwZW5kKG4pLHIuYmxvYj1zLmdldEJsb2IoImFwcGxpY2F0aW9uL3ppcCIpLnNpemU9PT0wfWNhdGNoe3IuYmxvYj0hMX19fXRyeXtyLm5vZGVzdHJlYW09ISF0KCJyZWFkYWJsZS1zdHJlYW0iKS5SZWFkYWJsZX1jYXRjaHtyLm5vZGVzdHJlYW09ITF9fSx7InJlYWRhYmxlLXN0cmVhbSI6MTZ9XSwzMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijtmb3IodmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksYT10KCIuL25vZGVqc1V0aWxzIiksbD10KCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIiksYz1uZXcgQXJyYXkoMjU2KSxwPTA7cDwyNTY7cCsrKWNbcF09MjUyPD1wPzY6MjQ4PD1wPzU6MjQwPD1wPzQ6MjI0PD1wPzM6MTkyPD1wPzI6MTtjWzI1NF09Y1syNTRdPTE7ZnVuY3Rpb24gYigpe2wuY2FsbCh0aGlzLCJ1dGYtOCBkZWNvZGUiKSx0aGlzLmxlZnRPdmVyPW51bGx9ZnVuY3Rpb24gbSgpe2wuY2FsbCh0aGlzLCJ1dGYtOCBlbmNvZGUiKX1yLnV0ZjhlbmNvZGU9ZnVuY3Rpb24oeSl7cmV0dXJuIHMubm9kZWJ1ZmZlcj9hLm5ld0J1ZmZlckZyb20oeSwidXRmLTgiKTpmdW5jdGlvbihUKXt2YXIgdyxrLFAsRixoLG89VC5sZW5ndGgsZj0wO2ZvcihGPTA7RjxvO0YrKykoNjQ1MTImKGs9VC5jaGFyQ29kZUF0KEYpKSk9PTU1Mjk2JiZGKzE8byYmKDY0NTEyJihQPVQuY2hhckNvZGVBdChGKzEpKSk9PTU2MzIwJiYoaz02NTUzNisoay01NTI5Njw8MTApKyhQLTU2MzIwKSxGKyspLGYrPWs8MTI4PzE6azwyMDQ4PzI6azw2NTUzNj8zOjQ7Zm9yKHc9cy51aW50OGFycmF5P25ldyBVaW50OEFycmF5KGYpOm5ldyBBcnJheShmKSxGPWg9MDtoPGY7RisrKSg2NDUxMiYoaz1ULmNoYXJDb2RlQXQoRikpKT09NTUyOTYmJkYrMTxvJiYoNjQ1MTImKFA9VC5jaGFyQ29kZUF0KEYrMSkpKT09NTYzMjAmJihrPTY1NTM2KyhrLTU1Mjk2PDwxMCkrKFAtNTYzMjApLEYrKyksazwxMjg/d1toKytdPWs6KGs8MjA0OD93W2grK109MTkyfGs+Pj42OihrPDY1NTM2P3dbaCsrXT0yMjR8az4+PjEyOih3W2grK109MjQwfGs+Pj4xOCx3W2grK109MTI4fGs+Pj4xMiY2Myksd1toKytdPTEyOHxrPj4+NiY2Myksd1toKytdPTEyOHw2MyZrKTtyZXR1cm4gd30oeSl9LHIudXRmOGRlY29kZT1mdW5jdGlvbih5KXtyZXR1cm4gcy5ub2RlYnVmZmVyP24udHJhbnNmb3JtVG8oIm5vZGVidWZmZXIiLHkpLnRvU3RyaW5nKCJ1dGYtOCIpOmZ1bmN0aW9uKFQpe3ZhciB3LGssUCxGLGg9VC5sZW5ndGgsbz1uZXcgQXJyYXkoMipoKTtmb3Iodz1rPTA7dzxoOylpZigoUD1UW3crK10pPDEyOClvW2srK109UDtlbHNlIGlmKDQ8KEY9Y1tQXSkpb1trKytdPTY1NTMzLHcrPUYtMTtlbHNle2ZvcihQJj1GPT09Mj8zMTpGPT09Mz8xNTo3OzE8RiYmdzxoOylQPVA8PDZ8NjMmVFt3KytdLEYtLTsxPEY/b1trKytdPTY1NTMzOlA8NjU1MzY/b1trKytdPVA6KFAtPTY1NTM2LG9baysrXT01NTI5NnxQPj4xMCYxMDIzLG9baysrXT01NjMyMHwxMDIzJlApfXJldHVybiBvLmxlbmd0aCE9PWsmJihvLnN1YmFycmF5P289by5zdWJhcnJheSgwLGspOm8ubGVuZ3RoPWspLG4uYXBwbHlGcm9tQ2hhckNvZGUobyl9KHk9bi50cmFuc2Zvcm1UbyhzLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSIseSkpfSxuLmluaGVyaXRzKGIsbCksYi5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKHkpe3ZhciBUPW4udHJhbnNmb3JtVG8ocy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLHkuZGF0YSk7aWYodGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgpe2lmKHMudWludDhhcnJheSl7dmFyIHc9VDsoVD1uZXcgVWludDhBcnJheSh3Lmxlbmd0aCt0aGlzLmxlZnRPdmVyLmxlbmd0aCkpLnNldCh0aGlzLmxlZnRPdmVyLDApLFQuc2V0KHcsdGhpcy5sZWZ0T3Zlci5sZW5ndGgpfWVsc2UgVD10aGlzLmxlZnRPdmVyLmNvbmNhdChUKTt0aGlzLmxlZnRPdmVyPW51bGx9dmFyIGs9ZnVuY3Rpb24oRixoKXt2YXIgbztmb3IoKGg9aHx8Ri5sZW5ndGgpPkYubGVuZ3RoJiYoaD1GLmxlbmd0aCksbz1oLTE7MDw9byYmKDE5MiZGW29dKT09MTI4OylvLS07cmV0dXJuIG88MHx8bz09PTA/aDpvK2NbRltvXV0+aD9vOmh9KFQpLFA9VDtrIT09VC5sZW5ndGgmJihzLnVpbnQ4YXJyYXk/KFA9VC5zdWJhcnJheSgwLGspLHRoaXMubGVmdE92ZXI9VC5zdWJhcnJheShrLFQubGVuZ3RoKSk6KFA9VC5zbGljZSgwLGspLHRoaXMubGVmdE92ZXI9VC5zbGljZShrLFQubGVuZ3RoKSkpLHRoaXMucHVzaCh7ZGF0YTpyLnV0ZjhkZWNvZGUoUCksbWV0YTp5Lm1ldGF9KX0sYi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmxlZnRPdmVyJiZ0aGlzLmxlZnRPdmVyLmxlbmd0aCYmKHRoaXMucHVzaCh7ZGF0YTpyLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksbWV0YTp7fX0pLHRoaXMubGVmdE92ZXI9bnVsbCl9LHIuVXRmOERlY29kZVdvcmtlcj1iLG4uaW5oZXJpdHMobSxsKSxtLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oeSl7dGhpcy5wdXNoKHtkYXRhOnIudXRmOGVuY29kZSh5LmRhdGEpLG1ldGE6eS5tZXRhfSl9LHIuVXRmOEVuY29kZVdvcmtlcj1tfSx7Ii4vbm9kZWpzVXRpbHMiOjE0LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwzMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL3N1cHBvcnQiKSxzPXQoIi4vYmFzZTY0IiksYT10KCIuL25vZGVqc1V0aWxzIiksbD10KCIuL2V4dGVybmFsIik7ZnVuY3Rpb24gYyh3KXtyZXR1cm4gd31mdW5jdGlvbiBwKHcsayl7Zm9yKHZhciBQPTA7UDx3Lmxlbmd0aDsrK1Apa1tQXT0yNTUmdy5jaGFyQ29kZUF0KFApO3JldHVybiBrfXQoInNldGltbWVkaWF0ZSIpLHIubmV3QmxvYj1mdW5jdGlvbih3LGspe3IuY2hlY2tTdXBwb3J0KCJibG9iIik7dHJ5e3JldHVybiBuZXcgQmxvYihbd10se3R5cGU6a30pfWNhdGNoe3RyeXt2YXIgUD1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtyZXR1cm4gUC5hcHBlbmQodyksUC5nZXRCbG9iKGspfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLiIpfX19O3ZhciBiPXtzdHJpbmdpZnlCeUNodW5rOmZ1bmN0aW9uKHcsayxQKXt2YXIgRj1bXSxoPTAsbz13Lmxlbmd0aDtpZihvPD1QKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdyk7Zm9yKDtoPG87KWs9PT0iYXJyYXkifHxrPT09Im5vZGVidWZmZXIiP0YucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdy5zbGljZShoLE1hdGgubWluKGgrUCxvKSkpKTpGLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHcuc3ViYXJyYXkoaCxNYXRoLm1pbihoK1AsbykpKSksaCs9UDtyZXR1cm4gRi5qb2luKCIiKX0sc3RyaW5naWZ5QnlDaGFyOmZ1bmN0aW9uKHcpe2Zvcih2YXIgaz0iIixQPTA7UDx3Lmxlbmd0aDtQKyspays9U3RyaW5nLmZyb21DaGFyQ29kZSh3W1BdKTtyZXR1cm4ga30sYXBwbHlDYW5CZVVzZWQ6e3VpbnQ4YXJyYXk6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG4udWludDhhcnJheSYmU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGg9PT0xfWNhdGNoe3JldHVybiExfX0oKSxub2RlYnVmZmVyOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuLm5vZGVidWZmZXImJlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhLmFsbG9jQnVmZmVyKDEpKS5sZW5ndGg9PT0xfWNhdGNoe3JldHVybiExfX0oKX19O2Z1bmN0aW9uIG0odyl7dmFyIGs9NjU1MzYsUD1yLmdldFR5cGVPZih3KSxGPSEwO2lmKFA9PT0idWludDhhcnJheSI/Rj1iLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk6UD09PSJub2RlYnVmZmVyIiYmKEY9Yi5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyKSxGKWZvcig7MTxrOyl0cnl7cmV0dXJuIGIuc3RyaW5naWZ5QnlDaHVuayh3LFAsayl9Y2F0Y2h7az1NYXRoLmZsb29yKGsvMil9cmV0dXJuIGIuc3RyaW5naWZ5QnlDaGFyKHcpfWZ1bmN0aW9uIHkodyxrKXtmb3IodmFyIFA9MDtQPHcubGVuZ3RoO1ArKylrW1BdPXdbUF07cmV0dXJuIGt9ci5hcHBseUZyb21DaGFyQ29kZT1tO3ZhciBUPXt9O1Quc3RyaW5nPXtzdHJpbmc6YyxhcnJheTpmdW5jdGlvbih3KXtyZXR1cm4gcCh3LG5ldyBBcnJheSh3Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gVC5zdHJpbmcudWludDhhcnJheSh3KS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIHAodyxuZXcgVWludDhBcnJheSh3Lmxlbmd0aCkpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBwKHcsYS5hbGxvY0J1ZmZlcih3Lmxlbmd0aCkpfX0sVC5hcnJheT17c3RyaW5nOm0sYXJyYXk6YyxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodykuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHcpe3JldHVybiBuZXcgVWludDhBcnJheSh3KX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gYS5uZXdCdWZmZXJGcm9tKHcpfX0sVC5hcnJheWJ1ZmZlcj17c3RyaW5nOmZ1bmN0aW9uKHcpe3JldHVybiBtKG5ldyBVaW50OEFycmF5KHcpKX0sYXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIHkobmV3IFVpbnQ4QXJyYXkodyksbmV3IEFycmF5KHcuYnl0ZUxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpjLHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHcpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBhLm5ld0J1ZmZlckZyb20obmV3IFVpbnQ4QXJyYXkodykpfX0sVC51aW50OGFycmF5PXtzdHJpbmc6bSxhcnJheTpmdW5jdGlvbih3KXtyZXR1cm4geSh3LG5ldyBBcnJheSh3Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gdy5idWZmZXJ9LHVpbnQ4YXJyYXk6Yyxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBhLm5ld0J1ZmZlckZyb20odyl9fSxULm5vZGVidWZmZXI9e3N0cmluZzptLGFycmF5OmZ1bmN0aW9uKHcpe3JldHVybiB5KHcsbmV3IEFycmF5KHcubGVuZ3RoKSl9LGFycmF5YnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBULm5vZGVidWZmZXIudWludDhhcnJheSh3KS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIHkodyxuZXcgVWludDhBcnJheSh3Lmxlbmd0aCkpfSxub2RlYnVmZmVyOmN9LHIudHJhbnNmb3JtVG89ZnVuY3Rpb24odyxrKXtpZihrPWt8fCIiLCF3KXJldHVybiBrO3IuY2hlY2tTdXBwb3J0KHcpO3ZhciBQPXIuZ2V0VHlwZU9mKGspO3JldHVybiBUW1BdW3ddKGspfSxyLnJlc29sdmU9ZnVuY3Rpb24odyl7Zm9yKHZhciBrPXcuc3BsaXQoIi8iKSxQPVtdLEY9MDtGPGsubGVuZ3RoO0YrKyl7dmFyIGg9a1tGXTtoPT09Ii4ifHxoPT09IiImJkYhPT0wJiZGIT09ay5sZW5ndGgtMXx8KGg9PT0iLi4iP1AucG9wKCk6UC5wdXNoKGgpKX1yZXR1cm4gUC5qb2luKCIvIil9LHIuZ2V0VHlwZU9mPWZ1bmN0aW9uKHcpe3JldHVybiB0eXBlb2Ygdz09InN0cmluZyI/InN0cmluZyI6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHcpPT09IltvYmplY3QgQXJyYXldIj8iYXJyYXkiOm4ubm9kZWJ1ZmZlciYmYS5pc0J1ZmZlcih3KT8ibm9kZWJ1ZmZlciI6bi51aW50OGFycmF5JiZ3IGluc3RhbmNlb2YgVWludDhBcnJheT8idWludDhhcnJheSI6bi5hcnJheWJ1ZmZlciYmdyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyPyJhcnJheWJ1ZmZlciI6dm9pZCAwfSxyLmNoZWNrU3VwcG9ydD1mdW5jdGlvbih3KXtpZighblt3LnRvTG93ZXJDYXNlKCldKXRocm93IG5ldyBFcnJvcih3KyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtIil9LHIuTUFYX1ZBTFVFXzE2QklUUz02NTUzNSxyLk1BWF9WQUxVRV8zMkJJVFM9LTEsci5wcmV0dHk9ZnVuY3Rpb24odyl7dmFyIGssUCxGPSIiO2ZvcihQPTA7UDwod3x8IiIpLmxlbmd0aDtQKyspRis9IlxceCIrKChrPXcuY2hhckNvZGVBdChQKSk8MTY/IjAiOiIiKStrLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiBGfSxyLmRlbGF5PWZ1bmN0aW9uKHcsayxQKXtzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKXt3LmFwcGx5KFB8fG51bGwsa3x8W10pfSl9LHIuaW5oZXJpdHM9ZnVuY3Rpb24odyxrKXtmdW5jdGlvbiBQKCl7fVAucHJvdG90eXBlPWsucHJvdG90eXBlLHcucHJvdG90eXBlPW5ldyBQfSxyLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB3LGssUD17fTtmb3Iodz0wO3c8YXJndW1lbnRzLmxlbmd0aDt3KyspZm9yKGsgaW4gYXJndW1lbnRzW3ddKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbd10saykmJlBba109PT12b2lkIDAmJihQW2tdPWFyZ3VtZW50c1t3XVtrXSk7cmV0dXJuIFB9LHIucHJlcGFyZUNvbnRlbnQ9ZnVuY3Rpb24odyxrLFAsRixoKXtyZXR1cm4gbC5Qcm9taXNlLnJlc29sdmUoaykudGhlbihmdW5jdGlvbihvKXtyZXR1cm4gbi5ibG9iJiYobyBpbnN0YW5jZW9mIEJsb2J8fFsiW29iamVjdCBGaWxlXSIsIltvYmplY3QgQmxvYl0iXS5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSkhPT0tMSkmJnR5cGVvZiBGaWxlUmVhZGVyPCJ1Ij9uZXcgbC5Qcm9taXNlKGZ1bmN0aW9uKGYsQyl7dmFyIEI9bmV3IEZpbGVSZWFkZXI7Qi5vbmxvYWQ9ZnVuY3Rpb24odSl7Zih1LnRhcmdldC5yZXN1bHQpfSxCLm9uZXJyb3I9ZnVuY3Rpb24odSl7Qyh1LnRhcmdldC5lcnJvcil9LEIucmVhZEFzQXJyYXlCdWZmZXIobyl9KTpvfSkudGhlbihmdW5jdGlvbihvKXt2YXIgZj1yLmdldFR5cGVPZihvKTtyZXR1cm4gZj8oZj09PSJhcnJheWJ1ZmZlciI/bz1yLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixvKTpmPT09InN0cmluZyImJihoP289cy5kZWNvZGUobyk6UCYmRiE9PSEwJiYobz1mdW5jdGlvbihDKXtyZXR1cm4gcChDLG4udWludDhhcnJheT9uZXcgVWludDhBcnJheShDLmxlbmd0aCk6bmV3IEFycmF5KEMubGVuZ3RoKSl9KG8pKSksbyk6bC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkNhbid0IHJlYWQgdGhlIGRhdGEgb2YgJyIrdysiJy4gSXMgaXQgaW4gYSBzdXBwb3J0ZWQgSmF2YVNjcmlwdCB0eXBlIChTdHJpbmcsIEJsb2IsIEFycmF5QnVmZmVyLCBldGMpID8iKSl9KX19LHsiLi9iYXNlNjQiOjEsIi4vZXh0ZXJuYWwiOjYsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N1cHBvcnQiOjMwLHNldGltbWVkaWF0ZTo1NH1dLDMzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vcmVhZGVyL3JlYWRlckZvciIpLHM9dCgiLi91dGlscyIpLGE9dCgiLi9zaWduYXR1cmUiKSxsPXQoIi4vemlwRW50cnkiKSxjPXQoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIHAoYil7dGhpcy5maWxlcz1bXSx0aGlzLmxvYWRPcHRpb25zPWJ9cC5wcm90b3R5cGU9e2NoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoYikpe3RoaXMucmVhZGVyLmluZGV4LT00O3ZhciBtPXRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7dGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogdW5leHBlY3RlZCBzaWduYXR1cmUgKCIrcy5wcmV0dHkobSkrIiwgZXhwZWN0ZWQgIitzLnByZXR0eShiKSsiKSIpfX0saXNTaWduYXR1cmU6ZnVuY3Rpb24oYixtKXt2YXIgeT10aGlzLnJlYWRlci5pbmRleDt0aGlzLnJlYWRlci5zZXRJbmRleChiKTt2YXIgVD10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpPT09bTtyZXR1cm4gdGhpcy5yZWFkZXIuc2V0SW5kZXgoeSksVH0scmVhZEJsb2NrRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnppcENvbW1lbnRMZW5ndGg9dGhpcy5yZWFkZXIucmVhZEludCgyKTt2YXIgYj10aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpLG09Yy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLHk9cy50cmFuc2Zvcm1UbyhtLGIpO3RoaXMuemlwQ29tbWVudD10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKHkpfSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5yZWFkZXIuc2tpcCg0KSx0aGlzLmRpc2tOdW1iZXI9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpck9mZnNldD10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YT17fTtmb3IodmFyIGIsbSx5LFQ9dGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUtNDQ7MDxUOyliPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksbT10aGlzLnJlYWRlci5yZWFkSW50KDQpLHk9dGhpcy5yZWFkZXIucmVhZERhdGEobSksdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2JdPXtpZDpiLGxlbmd0aDptLHZhbHVlOnl9fSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6ZnVuY3Rpb24oKXtpZih0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmRpc2tzQ291bnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSwxPHRoaXMuZGlza3NDb3VudCl0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkIil9LHJlYWRMb2NhbEZpbGVzOmZ1bmN0aW9uKCl7dmFyIGIsbTtmb3IoYj0wO2I8dGhpcy5maWxlcy5sZW5ndGg7YisrKW09dGhpcy5maWxlc1tiXSx0aGlzLnJlYWRlci5zZXRJbmRleChtLmxvY2FsSGVhZGVyT2Zmc2V0KSx0aGlzLmNoZWNrU2lnbmF0dXJlKGEuTE9DQUxfRklMRV9IRUFERVIpLG0ucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlciksbS5oYW5kbGVVVEY4KCksbS5wcm9jZXNzQXR0cmlidXRlcygpfSxyZWFkQ2VudHJhbERpcjpmdW5jdGlvbigpe3ZhciBiO2Zvcih0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO3RoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShhLkNFTlRSQUxfRklMRV9IRUFERVIpOykoYj1uZXcgbCh7emlwNjQ6dGhpcy56aXA2NH0sdGhpcy5sb2FkT3B0aW9ucykpLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlciksdGhpcy5maWxlcy5wdXNoKGIpO2lmKHRoaXMuY2VudHJhbERpclJlY29yZHMhPT10aGlzLmZpbGVzLmxlbmd0aCYmdGhpcy5jZW50cmFsRGlyUmVjb3JkcyE9PTAmJnRoaXMuZmlsZXMubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAiK3RoaXMuY2VudHJhbERpclJlY29yZHMrIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgIit0aGlzLmZpbGVzLmxlbmd0aCl9LHJlYWRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShhLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7aWYoYjwwKXRocm93IHRoaXMuaXNTaWduYXR1cmUoMCxhLkxPQ0FMX0ZJTEVfSEVBREVSKT9uZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Iik6bmV3IEVycm9yKCJDYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSA6IGlzIHRoaXMgYSB6aXAgZmlsZSA/IElmIGl0IGlzLCBzZWUgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWwiKTt0aGlzLnJlYWRlci5zZXRJbmRleChiKTt2YXIgbT1iO2lmKHRoaXMuY2hlY2tTaWduYXR1cmUoYS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCksdGhpcy5kaXNrTnVtYmVyPT09cy5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09cy5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkcz09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUU3x8dGhpcy5jZW50cmFsRGlyT2Zmc2V0PT09cy5NQVhfVkFMVUVfMzJCSVRTKXtpZih0aGlzLnppcDY0PSEwLChiPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGEuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUikpPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciIpO2lmKHRoaXMucmVhZGVyLnNldEluZGV4KGIpLHRoaXMuY2hlY2tTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSx0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpLCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcixhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkmJih0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcjwwKSl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpO3RoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciksdGhpcy5jaGVja1NpZ25hdHVyZShhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpfXZhciB5PXRoaXMuY2VudHJhbERpck9mZnNldCt0aGlzLmNlbnRyYWxEaXJTaXplO3RoaXMuemlwNjQmJih5Kz0yMCx5Kz0xMit0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSk7dmFyIFQ9bS15O2lmKDA8VCl0aGlzLmlzU2lnbmF0dXJlKG0sYS5DRU5UUkFMX0ZJTEVfSEVBREVSKXx8KHRoaXMucmVhZGVyLnplcm89VCk7ZWxzZSBpZihUPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nICIrTWF0aC5hYnMoVCkrIiBieXRlcy4iKX0scHJlcGFyZVJlYWRlcjpmdW5jdGlvbihiKXt0aGlzLnJlYWRlcj1uKGIpfSxsb2FkOmZ1bmN0aW9uKGIpe3RoaXMucHJlcGFyZVJlYWRlcihiKSx0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKSx0aGlzLnJlYWRDZW50cmFsRGlyKCksdGhpcy5yZWFkTG9jYWxGaWxlcygpfX0sZS5leHBvcnRzPXB9LHsiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zaWduYXR1cmUiOjIzLCIuL3N1cHBvcnQiOjMwLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyeSI6MzR9XSwzNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL3JlYWRlci9yZWFkZXJGb3IiKSxzPXQoIi4vdXRpbHMiKSxhPXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLGw9dCgiLi9jcmMzMiIpLGM9dCgiLi91dGY4IikscD10KCIuL2NvbXByZXNzaW9ucyIpLGI9dCgiLi9zdXBwb3J0Iik7ZnVuY3Rpb24gbSh5LFQpe3RoaXMub3B0aW9ucz15LHRoaXMubG9hZE9wdGlvbnM9VH1tLnByb3RvdHlwZT17aXNFbmNyeXB0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4oMSZ0aGlzLmJpdEZsYWcpPT0xfSx1c2VVVEY4OmZ1bmN0aW9uKCl7cmV0dXJuKDIwNDgmdGhpcy5iaXRGbGFnKT09MjA0OH0scmVhZExvY2FsUGFydDpmdW5jdGlvbih5KXt2YXIgVCx3O2lmKHkuc2tpcCgyMiksdGhpcy5maWxlTmFtZUxlbmd0aD15LnJlYWRJbnQoMiksdz15LnJlYWRJbnQoMiksdGhpcy5maWxlTmFtZT15LnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpLHkuc2tpcCh3KSx0aGlzLmNvbXByZXNzZWRTaXplPT09LTF8fHRoaXMudW5jb21wcmVzc2VkU2l6ZT09PS0xKXRocm93IG5ldyBFcnJvcigiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKSIpO2lmKChUPWZ1bmN0aW9uKGspe2Zvcih2YXIgUCBpbiBwKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLFApJiZwW1BdLm1hZ2ljPT09aylyZXR1cm4gcFtQXTtyZXR1cm4gbnVsbH0odGhpcy5jb21wcmVzc2lvbk1ldGhvZCkpPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiAiK3MucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpKyIgdW5rbm93biAoaW5uZXIgZmlsZSA6ICIrcy50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLmZpbGVOYW1lKSsiKSIpO3RoaXMuZGVjb21wcmVzc2VkPW5ldyBhKHRoaXMuY29tcHJlc3NlZFNpemUsdGhpcy51bmNvbXByZXNzZWRTaXplLHRoaXMuY3JjMzIsVCx5LnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKX0scmVhZENlbnRyYWxQYXJ0OmZ1bmN0aW9uKHkpe3RoaXMudmVyc2lvbk1hZGVCeT15LnJlYWRJbnQoMikseS5za2lwKDIpLHRoaXMuYml0RmxhZz15LnJlYWRJbnQoMiksdGhpcy5jb21wcmVzc2lvbk1ldGhvZD15LnJlYWRTdHJpbmcoMiksdGhpcy5kYXRlPXkucmVhZERhdGUoKSx0aGlzLmNyYzMyPXkucmVhZEludCg0KSx0aGlzLmNvbXByZXNzZWRTaXplPXkucmVhZEludCg0KSx0aGlzLnVuY29tcHJlc3NlZFNpemU9eS5yZWFkSW50KDQpO3ZhciBUPXkucmVhZEludCgyKTtpZih0aGlzLmV4dHJhRmllbGRzTGVuZ3RoPXkucmVhZEludCgyKSx0aGlzLmZpbGVDb21tZW50TGVuZ3RoPXkucmVhZEludCgyKSx0aGlzLmRpc2tOdW1iZXJTdGFydD15LnJlYWRJbnQoMiksdGhpcy5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXkucmVhZEludCgyKSx0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXM9eS5yZWFkSW50KDQpLHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9eS5yZWFkSW50KDQpLHRoaXMuaXNFbmNyeXB0ZWQoKSl0aHJvdyBuZXcgRXJyb3IoIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQiKTt5LnNraXAoVCksdGhpcy5yZWFkRXh0cmFGaWVsZHMoeSksdGhpcy5wYXJzZVpJUDY0RXh0cmFGaWVsZCh5KSx0aGlzLmZpbGVDb21tZW50PXkucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCl9LHByb2Nlc3NBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7dGhpcy51bml4UGVybWlzc2lvbnM9bnVsbCx0aGlzLmRvc1Blcm1pc3Npb25zPW51bGw7dmFyIHk9dGhpcy52ZXJzaW9uTWFkZUJ5Pj44O3RoaXMuZGlyPSEhKDE2JnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcykseT09MCYmKHRoaXMuZG9zUGVybWlzc2lvbnM9NjMmdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKSx5PT0zJiYodGhpcy51bml4UGVybWlzc2lvbnM9dGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiY2NTUzNSksdGhpcy5kaXJ8fHRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpIT09Ii8ifHwodGhpcy5kaXI9ITApfSxwYXJzZVpJUDY0RXh0cmFGaWVsZDpmdW5jdGlvbigpe2lmKHRoaXMuZXh0cmFGaWVsZHNbMV0pe3ZhciB5PW4odGhpcy5leHRyYUZpZWxkc1sxXS52YWx1ZSk7dGhpcy51bmNvbXByZXNzZWRTaXplPT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy51bmNvbXByZXNzZWRTaXplPXkucmVhZEludCg4KSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuY29tcHJlc3NlZFNpemU9eS5yZWFkSW50KDgpKSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5sb2NhbEhlYWRlck9mZnNldD15LnJlYWRJbnQoOCkpLHRoaXMuZGlza051bWJlclN0YXJ0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5kaXNrTnVtYmVyU3RhcnQ9eS5yZWFkSW50KDQpKX19LHJlYWRFeHRyYUZpZWxkczpmdW5jdGlvbih5KXt2YXIgVCx3LGssUD15LmluZGV4K3RoaXMuZXh0cmFGaWVsZHNMZW5ndGg7Zm9yKHRoaXMuZXh0cmFGaWVsZHN8fCh0aGlzLmV4dHJhRmllbGRzPXt9KTt5LmluZGV4KzQ8UDspVD15LnJlYWRJbnQoMiksdz15LnJlYWRJbnQoMiksaz15LnJlYWREYXRhKHcpLHRoaXMuZXh0cmFGaWVsZHNbVF09e2lkOlQsbGVuZ3RoOncsdmFsdWU6a307eS5zZXRJbmRleChQKX0saGFuZGxlVVRGODpmdW5jdGlvbigpe3ZhciB5PWIudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IjtpZih0aGlzLnVzZVVURjgoKSl0aGlzLmZpbGVOYW1lU3RyPWMudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKSx0aGlzLmZpbGVDb21tZW50U3RyPWMudXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtlbHNle3ZhciBUPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO2lmKFQhPT1udWxsKXRoaXMuZmlsZU5hbWVTdHI9VDtlbHNle3ZhciB3PXMudHJhbnNmb3JtVG8oeSx0aGlzLmZpbGVOYW1lKTt0aGlzLmZpbGVOYW1lU3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUodyl9dmFyIGs9dGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7aWYoayE9PW51bGwpdGhpcy5maWxlQ29tbWVudFN0cj1rO2Vsc2V7dmFyIFA9cy50cmFuc2Zvcm1Ubyh5LHRoaXMuZmlsZUNvbW1lbnQpO3RoaXMuZmlsZUNvbW1lbnRTdHI9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShQKX19fSxmaW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoOmZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5leHRyYUZpZWxkc1syODc4OV07aWYoeSl7dmFyIFQ9bih5LnZhbHVlKTtyZXR1cm4gVC5yZWFkSW50KDEpIT09MXx8bCh0aGlzLmZpbGVOYW1lKSE9PVQucmVhZEludCg0KT9udWxsOmMudXRmOGRlY29kZShULnJlYWREYXRhKHkubGVuZ3RoLTUpKX1yZXR1cm4gbnVsbH0sZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDpmdW5jdGlvbigpe3ZhciB5PXRoaXMuZXh0cmFGaWVsZHNbMjU0NjFdO2lmKHkpe3ZhciBUPW4oeS52YWx1ZSk7cmV0dXJuIFQucmVhZEludCgxKSE9PTF8fGwodGhpcy5maWxlQ29tbWVudCkhPT1ULnJlYWRJbnQoNCk/bnVsbDpjLnV0ZjhkZWNvZGUoVC5yZWFkRGF0YSh5Lmxlbmd0aC01KSl9cmV0dXJuIG51bGx9fSxlLmV4cG9ydHM9bX0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vY29tcHJlc3Npb25zIjozLCIuL2NyYzMyIjo0LCIuL3JlYWRlci9yZWFkZXJGb3IiOjIyLCIuL3N1cHBvcnQiOjMwLCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMn1dLDM1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oVCx3LGspe3RoaXMubmFtZT1ULHRoaXMuZGlyPWsuZGlyLHRoaXMuZGF0ZT1rLmRhdGUsdGhpcy5jb21tZW50PWsuY29tbWVudCx0aGlzLnVuaXhQZXJtaXNzaW9ucz1rLnVuaXhQZXJtaXNzaW9ucyx0aGlzLmRvc1Blcm1pc3Npb25zPWsuZG9zUGVybWlzc2lvbnMsdGhpcy5fZGF0YT13LHRoaXMuX2RhdGFCaW5hcnk9ay5iaW5hcnksdGhpcy5vcHRpb25zPXtjb21wcmVzc2lvbjprLmNvbXByZXNzaW9uLGNvbXByZXNzaW9uT3B0aW9uczprLmNvbXByZXNzaW9uT3B0aW9uc319dmFyIHM9dCgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIiksYT10KCIuL3N0cmVhbS9EYXRhV29ya2VyIiksbD10KCIuL3V0ZjgiKSxjPXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLHA9dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpO24ucHJvdG90eXBlPXtpbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihUKXt2YXIgdz1udWxsLGs9InN0cmluZyI7dHJ5e2lmKCFUKXRocm93IG5ldyBFcnJvcigiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLiIpO3ZhciBQPShrPVQudG9Mb3dlckNhc2UoKSk9PT0ic3RyaW5nInx8az09PSJ0ZXh0IjtrIT09ImJpbmFyeXN0cmluZyImJmshPT0idGV4dCJ8fChrPSJzdHJpbmciKSx3PXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTt2YXIgRj0hdGhpcy5fZGF0YUJpbmFyeTtGJiYhUCYmKHc9dy5waXBlKG5ldyBsLlV0ZjhFbmNvZGVXb3JrZXIpKSwhRiYmUCYmKHc9dy5waXBlKG5ldyBsLlV0ZjhEZWNvZGVXb3JrZXIpKX1jYXRjaChoKXsodz1uZXcgcCgiZXJyb3IiKSkuZXJyb3IoaCl9cmV0dXJuIG5ldyBzKHcsaywiIil9LGFzeW5jOmZ1bmN0aW9uKFQsdyl7cmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0oVCkuYWNjdW11bGF0ZSh3KX0sbm9kZVN0cmVhbTpmdW5jdGlvbihULHcpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKFR8fCJub2RlYnVmZmVyIikudG9Ob2RlanNTdHJlYW0odyl9LF9jb21wcmVzc1dvcmtlcjpmdW5jdGlvbihULHcpe2lmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBjJiZ0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljPT09VC5tYWdpYylyZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7dmFyIGs9dGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO3JldHVybiB0aGlzLl9kYXRhQmluYXJ5fHwoaz1rLnBpcGUobmV3IGwuVXRmOEVuY29kZVdvcmtlcikpLGMuY3JlYXRlV29ya2VyRnJvbShrLFQsdyl9LF9kZWNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBjP3RoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpOnRoaXMuX2RhdGEgaW5zdGFuY2VvZiBwP3RoaXMuX2RhdGE6bmV3IGEodGhpcy5fZGF0YSl9fTtmb3IodmFyIGI9WyJhc1RleHQiLCJhc0JpbmFyeSIsImFzTm9kZUJ1ZmZlciIsImFzVWludDhBcnJheSIsImFzQXJyYXlCdWZmZXIiXSxtPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSx5PTA7eTxiLmxlbmd0aDt5Kyspbi5wcm90b3R5cGVbYlt5XV09bTtlLmV4cG9ydHM9bn0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vc3RyZWFtL0RhdGFXb3JrZXIiOjI3LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3RyZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMX1dLDM2OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcyxhLGw9bi5NdXRhdGlvbk9ic2VydmVyfHxuLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7aWYobCl7dmFyIGM9MCxwPW5ldyBsKFQpLGI9bi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7cC5vYnNlcnZlKGIse2NoYXJhY3RlckRhdGE6ITB9KSxzPWZ1bmN0aW9uKCl7Yi5kYXRhPWM9KytjJTJ9fWVsc2UgaWYobi5zZXRJbW1lZGlhdGV8fG4uTWVzc2FnZUNoYW5uZWw9PT12b2lkIDApcz0iZG9jdW1lbnQiaW4gbiYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBuLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpP2Z1bmN0aW9uKCl7dmFyIHc9bi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt3Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe1QoKSx3Lm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3KSx3PW51bGx9LG4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHcpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQoVCwwKX07ZWxzZXt2YXIgbT1uZXcgbi5NZXNzYWdlQ2hhbm5lbDttLnBvcnQxLm9ubWVzc2FnZT1ULHM9ZnVuY3Rpb24oKXttLnBvcnQyLnBvc3RNZXNzYWdlKDApfX12YXIgeT1bXTtmdW5jdGlvbiBUKCl7dmFyIHcsazthPSEwO2Zvcih2YXIgUD15Lmxlbmd0aDtQOyl7Zm9yKGs9eSx5PVtdLHc9LTE7Kyt3PFA7KWtbd10oKTtQPXkubGVuZ3RofWE9ITF9ZS5leHBvcnRzPWZ1bmN0aW9uKHcpe3kucHVzaCh3KSE9PTF8fGF8fHMoKX19KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp7fSl9LHt9XSwzNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCJpbW1lZGlhdGUiKTtmdW5jdGlvbiBzKCl7fXZhciBhPXt9LGw9WyJSRUpFQ1RFRCJdLGM9WyJGVUxGSUxMRUQiXSxwPVsiUEVORElORyJdO2Z1bmN0aW9uIGIoUCl7aWYodHlwZW9mIFAhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVzb2x2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dGhpcy5zdGF0ZT1wLHRoaXMucXVldWU9W10sdGhpcy5vdXRjb21lPXZvaWQgMCxQIT09cyYmdyh0aGlzLFApfWZ1bmN0aW9uIG0oUCxGLGgpe3RoaXMucHJvbWlzZT1QLHR5cGVvZiBGPT0iZnVuY3Rpb24iJiYodGhpcy5vbkZ1bGZpbGxlZD1GLHRoaXMuY2FsbEZ1bGZpbGxlZD10aGlzLm90aGVyQ2FsbEZ1bGZpbGxlZCksdHlwZW9mIGg9PSJmdW5jdGlvbiImJih0aGlzLm9uUmVqZWN0ZWQ9aCx0aGlzLmNhbGxSZWplY3RlZD10aGlzLm90aGVyQ2FsbFJlamVjdGVkKX1mdW5jdGlvbiB5KFAsRixoKXtuKGZ1bmN0aW9uKCl7dmFyIG87dHJ5e289RihoKX1jYXRjaChmKXtyZXR1cm4gYS5yZWplY3QoUCxmKX1vPT09UD9hLnJlamVjdChQLG5ldyBUeXBlRXJyb3IoIkNhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYiKSk6YS5yZXNvbHZlKFAsbyl9KX1mdW5jdGlvbiBUKFApe3ZhciBGPVAmJlAudGhlbjtpZihQJiYodHlwZW9mIFA9PSJvYmplY3QifHx0eXBlb2YgUD09ImZ1bmN0aW9uIikmJnR5cGVvZiBGPT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbigpe0YuYXBwbHkoUCxhcmd1bWVudHMpfX1mdW5jdGlvbiB3KFAsRil7dmFyIGg9ITE7ZnVuY3Rpb24gbyhCKXtofHwoaD0hMCxhLnJlamVjdChQLEIpKX1mdW5jdGlvbiBmKEIpe2h8fChoPSEwLGEucmVzb2x2ZShQLEIpKX12YXIgQz1rKGZ1bmN0aW9uKCl7RihmLG8pfSk7Qy5zdGF0dXM9PT0iZXJyb3IiJiZvKEMudmFsdWUpfWZ1bmN0aW9uIGsoUCxGKXt2YXIgaD17fTt0cnl7aC52YWx1ZT1QKEYpLGguc3RhdHVzPSJzdWNjZXNzIn1jYXRjaChvKXtoLnN0YXR1cz0iZXJyb3IiLGgudmFsdWU9b31yZXR1cm4gaH0oZS5leHBvcnRzPWIpLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKFApe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iKXJldHVybiB0aGlzO3ZhciBGPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gRi5yZXNvbHZlKFAoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBofSl9LGZ1bmN0aW9uKGgpe3JldHVybiBGLnJlc29sdmUoUCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgaH0pfSl9LGIucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKFApe3JldHVybiB0aGlzLnRoZW4obnVsbCxQKX0sYi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihQLEYpe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iJiZ0aGlzLnN0YXRlPT09Y3x8dHlwZW9mIEYhPSJmdW5jdGlvbiImJnRoaXMuc3RhdGU9PT1sKXJldHVybiB0aGlzO3ZhciBoPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHMpO3JldHVybiB0aGlzLnN0YXRlIT09cD95KGgsdGhpcy5zdGF0ZT09PWM/UDpGLHRoaXMub3V0Y29tZSk6dGhpcy5xdWV1ZS5wdXNoKG5ldyBtKGgsUCxGKSksaH0sbS5wcm90b3R5cGUuY2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihQKXthLnJlc29sdmUodGhpcy5wcm9taXNlLFApfSxtLnByb3RvdHlwZS5vdGhlckNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oUCl7eSh0aGlzLnByb21pc2UsdGhpcy5vbkZ1bGZpbGxlZCxQKX0sbS5wcm90b3R5cGUuY2FsbFJlamVjdGVkPWZ1bmN0aW9uKFApe2EucmVqZWN0KHRoaXMucHJvbWlzZSxQKX0sbS5wcm90b3R5cGUub3RoZXJDYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oUCl7eSh0aGlzLnByb21pc2UsdGhpcy5vblJlamVjdGVkLFApfSxhLnJlc29sdmU9ZnVuY3Rpb24oUCxGKXt2YXIgaD1rKFQsRik7aWYoaC5zdGF0dXM9PT0iZXJyb3IiKXJldHVybiBhLnJlamVjdChQLGgudmFsdWUpO3ZhciBvPWgudmFsdWU7aWYobyl3KFAsbyk7ZWxzZXtQLnN0YXRlPWMsUC5vdXRjb21lPUY7Zm9yKHZhciBmPS0xLEM9UC5xdWV1ZS5sZW5ndGg7KytmPEM7KVAucXVldWVbZl0uY2FsbEZ1bGZpbGxlZChGKX1yZXR1cm4gUH0sYS5yZWplY3Q9ZnVuY3Rpb24oUCxGKXtQLnN0YXRlPWwsUC5vdXRjb21lPUY7Zm9yKHZhciBoPS0xLG89UC5xdWV1ZS5sZW5ndGg7KytoPG87KVAucXVldWVbaF0uY2FsbFJlamVjdGVkKEYpO3JldHVybiBQfSxiLnJlc29sdmU9ZnVuY3Rpb24oUCl7cmV0dXJuIFAgaW5zdGFuY2VvZiB0aGlzP1A6YS5yZXNvbHZlKG5ldyB0aGlzKHMpLFApfSxiLnJlamVjdD1mdW5jdGlvbihQKXt2YXIgRj1uZXcgdGhpcyhzKTtyZXR1cm4gYS5yZWplY3QoRixQKX0sYi5hbGw9ZnVuY3Rpb24oUCl7dmFyIEY9dGhpcztpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUCkhPT0iW29iamVjdCBBcnJheV0iKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCJtdXN0IGJlIGFuIGFycmF5IikpO3ZhciBoPVAubGVuZ3RoLG89ITE7aWYoIWgpcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7Zm9yKHZhciBmPW5ldyBBcnJheShoKSxDPTAsQj0tMSx1PW5ldyB0aGlzKHMpOysrQjxoOyl6KFBbQl0sQik7cmV0dXJuIHU7ZnVuY3Rpb24geihxLGV0KXtGLnJlc29sdmUocSkudGhlbihmdW5jdGlvbihPKXtmW2V0XT1PLCsrQyE9PWh8fG98fChvPSEwLGEucmVzb2x2ZSh1LGYpKX0sZnVuY3Rpb24oTyl7b3x8KG89ITAsYS5yZWplY3QodSxPKSl9KX19LGIucmFjZT1mdW5jdGlvbihQKXt2YXIgRj10aGlzO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQKSE9PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoIm11c3QgYmUgYW4gYXJyYXkiKSk7dmFyIGg9UC5sZW5ndGgsbz0hMTtpZighaClyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGY9LTEsQz1uZXcgdGhpcyhzKTsrK2Y8aDspQj1QW2ZdLEYucmVzb2x2ZShCKS50aGVuKGZ1bmN0aW9uKHUpe298fChvPSEwLGEucmVzb2x2ZShDLHUpKX0sZnVuY3Rpb24odSl7b3x8KG89ITAsYS5yZWplY3QoQyx1KSl9KTt2YXIgQjtyZXR1cm4gQ319LHtpbW1lZGlhdGU6MzZ9XSwzODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17fTsoMCx0KCIuL2xpYi91dGlscy9jb21tb24iKS5hc3NpZ24pKG4sdCgiLi9saWIvZGVmbGF0ZSIpLHQoIi4vbGliL2luZmxhdGUiKSx0KCIuL2xpYi96bGliL2NvbnN0YW50cyIpKSxlLmV4cG9ydHM9bn0seyIuL2xpYi9kZWZsYXRlIjozOSwiLi9saWIvaW5mbGF0ZSI6NDAsIi4vbGliL3V0aWxzL2NvbW1vbiI6NDEsIi4vbGliL3psaWIvY29uc3RhbnRzIjo0NH1dLDM5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vemxpYi9kZWZsYXRlIikscz10KCIuL3V0aWxzL2NvbW1vbiIpLGE9dCgiLi91dGlscy9zdHJpbmdzIiksbD10KCIuL3psaWIvbWVzc2FnZXMiKSxjPXQoIi4vemxpYi96c3RyZWFtIikscD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGI9MCxtPS0xLHk9MCxUPTg7ZnVuY3Rpb24gdyhQKXtpZighKHRoaXMgaW5zdGFuY2VvZiB3KSlyZXR1cm4gbmV3IHcoUCk7dGhpcy5vcHRpb25zPXMuYXNzaWduKHtsZXZlbDptLG1ldGhvZDpULGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6eSx0bzoiIn0sUHx8e30pO3ZhciBGPXRoaXMub3B0aW9ucztGLnJhdyYmMDxGLndpbmRvd0JpdHM/Ri53aW5kb3dCaXRzPS1GLndpbmRvd0JpdHM6Ri5nemlwJiYwPEYud2luZG93Qml0cyYmRi53aW5kb3dCaXRzPDE2JiYoRi53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgYyx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIGg9bi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLEYubGV2ZWwsRi5tZXRob2QsRi53aW5kb3dCaXRzLEYubWVtTGV2ZWwsRi5zdHJhdGVneSk7aWYoaCE9PWIpdGhyb3cgbmV3IEVycm9yKGxbaF0pO2lmKEYuaGVhZGVyJiZuLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLEYuaGVhZGVyKSxGLmRpY3Rpb25hcnkpe3ZhciBvO2lmKG89dHlwZW9mIEYuZGljdGlvbmFyeT09InN0cmluZyI/YS5zdHJpbmcyYnVmKEYuZGljdGlvbmFyeSk6cC5jYWxsKEYuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP25ldyBVaW50OEFycmF5KEYuZGljdGlvbmFyeSk6Ri5kaWN0aW9uYXJ5LChoPW4uZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLG8pKSE9PWIpdGhyb3cgbmV3IEVycm9yKGxbaF0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1mdW5jdGlvbiBrKFAsRil7dmFyIGg9bmV3IHcoRik7aWYoaC5wdXNoKFAsITApLGguZXJyKXRocm93IGgubXNnfHxsW2guZXJyXTtyZXR1cm4gaC5yZXN1bHR9dy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihQLEYpe3ZhciBoLG8sZj10aGlzLnN0cm0sQz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7bz1GPT09fn5GP0Y6Rj09PSEwPzQ6MCx0eXBlb2YgUD09InN0cmluZyI/Zi5pbnB1dD1hLnN0cmluZzJidWYoUCk6cC5jYWxsKFApPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9mLmlucHV0PW5ldyBVaW50OEFycmF5KFApOmYuaW5wdXQ9UCxmLm5leHRfaW49MCxmLmF2YWlsX2luPWYuaW5wdXQubGVuZ3RoO2Rve2lmKGYuYXZhaWxfb3V0PT09MCYmKGYub3V0cHV0PW5ldyBzLkJ1ZjgoQyksZi5uZXh0X291dD0wLGYuYXZhaWxfb3V0PUMpLChoPW4uZGVmbGF0ZShmLG8pKSE9PTEmJmghPT1iKXJldHVybiB0aGlzLm9uRW5kKGgpLCEodGhpcy5lbmRlZD0hMCk7Zi5hdmFpbF9vdXQhPT0wJiYoZi5hdmFpbF9pbiE9PTB8fG8hPT00JiZvIT09Mil8fCh0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLm9uRGF0YShhLmJ1ZjJiaW5zdHJpbmcocy5zaHJpbmtCdWYoZi5vdXRwdXQsZi5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShzLnNocmlua0J1ZihmLm91dHB1dCxmLm5leHRfb3V0KSkpfXdoaWxlKCgwPGYuYXZhaWxfaW58fGYuYXZhaWxfb3V0PT09MCkmJmghPT0xKTtyZXR1cm4gbz09PTQ/KGg9bi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChoKSx0aGlzLmVuZGVkPSEwLGg9PT1iKTpvIT09Mnx8KHRoaXMub25FbmQoYiksIShmLmF2YWlsX291dD0wKSl9LHcucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihQKXt0aGlzLmNodW5rcy5wdXNoKFApfSx3LnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihQKXtQPT09YiYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PXMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPVAsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ30sci5EZWZsYXRlPXcsci5kZWZsYXRlPWssci5kZWZsYXRlUmF3PWZ1bmN0aW9uKFAsRil7cmV0dXJuKEY9Rnx8e30pLnJhdz0hMCxrKFAsRil9LHIuZ3ppcD1mdW5jdGlvbihQLEYpe3JldHVybihGPUZ8fHt9KS5nemlwPSEwLGsoUCxGKX19LHsiLi91dGlscy9jb21tb24iOjQxLCIuL3V0aWxzL3N0cmluZ3MiOjQyLCIuL3psaWIvZGVmbGF0ZSI6NDYsIi4vemxpYi9tZXNzYWdlcyI6NTEsIi4vemxpYi96c3RyZWFtIjo1M31dLDQwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vemxpYi9pbmZsYXRlIikscz10KCIuL3V0aWxzL2NvbW1vbiIpLGE9dCgiLi91dGlscy9zdHJpbmdzIiksbD10KCIuL3psaWIvY29uc3RhbnRzIiksYz10KCIuL3psaWIvbWVzc2FnZXMiKSxwPXQoIi4vemxpYi96c3RyZWFtIiksYj10KCIuL3psaWIvZ3poZWFkZXIiKSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24geSh3KXtpZighKHRoaXMgaW5zdGFuY2VvZiB5KSlyZXR1cm4gbmV3IHkodyk7dGhpcy5vcHRpb25zPXMuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSx3fHx7fSk7dmFyIGs9dGhpcy5vcHRpb25zO2sucmF3JiYwPD1rLndpbmRvd0JpdHMmJmsud2luZG93Qml0czwxNiYmKGsud2luZG93Qml0cz0tay53aW5kb3dCaXRzLGsud2luZG93Qml0cz09PTAmJihrLndpbmRvd0JpdHM9LTE1KSksISgwPD1rLndpbmRvd0JpdHMmJmsud2luZG93Qml0czwxNil8fHcmJncud2luZG93Qml0c3x8KGsud2luZG93Qml0cys9MzIpLDE1PGsud2luZG93Qml0cyYmay53aW5kb3dCaXRzPDQ4JiYhKDE1Jmsud2luZG93Qml0cykmJihrLndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBwLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgUD1uLmluZmxhdGVJbml0Mih0aGlzLnN0cm0say53aW5kb3dCaXRzKTtpZihQIT09bC5aX09LKXRocm93IG5ldyBFcnJvcihjW1BdKTt0aGlzLmhlYWRlcj1uZXcgYixuLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKX1mdW5jdGlvbiBUKHcsayl7dmFyIFA9bmV3IHkoayk7aWYoUC5wdXNoKHcsITApLFAuZXJyKXRocm93IFAubXNnfHxjW1AuZXJyXTtyZXR1cm4gUC5yZXN1bHR9eS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih3LGspe3ZhciBQLEYsaCxvLGYsQyxCPXRoaXMuc3RybSx1PXRoaXMub3B0aW9ucy5jaHVua1NpemUsej10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxxPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Rj1rPT09fn5rP2s6az09PSEwP2wuWl9GSU5JU0g6bC5aX05PX0ZMVVNILHR5cGVvZiB3PT0ic3RyaW5nIj9CLmlucHV0PWEuYmluc3RyaW5nMmJ1Zih3KTptLmNhbGwodyk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP0IuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkodyk6Qi5pbnB1dD13LEIubmV4dF9pbj0wLEIuYXZhaWxfaW49Qi5pbnB1dC5sZW5ndGg7ZG97aWYoQi5hdmFpbF9vdXQ9PT0wJiYoQi5vdXRwdXQ9bmV3IHMuQnVmOCh1KSxCLm5leHRfb3V0PTAsQi5hdmFpbF9vdXQ9dSksKFA9bi5pbmZsYXRlKEIsbC5aX05PX0ZMVVNIKSk9PT1sLlpfTkVFRF9ESUNUJiZ6JiYoQz10eXBlb2Ygej09InN0cmluZyI/YS5zdHJpbmcyYnVmKHopOm0uY2FsbCh6KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bmV3IFVpbnQ4QXJyYXkoeik6eixQPW4uaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLEMpKSxQPT09bC5aX0JVRl9FUlJPUiYmcT09PSEwJiYoUD1sLlpfT0sscT0hMSksUCE9PWwuWl9TVFJFQU1fRU5EJiZQIT09bC5aX09LKXJldHVybiB0aGlzLm9uRW5kKFApLCEodGhpcy5lbmRlZD0hMCk7Qi5uZXh0X291dCYmKEIuYXZhaWxfb3V0IT09MCYmUCE9PWwuWl9TVFJFQU1fRU5EJiYoQi5hdmFpbF9pbiE9PTB8fEYhPT1sLlpfRklOSVNIJiZGIT09bC5aX1NZTkNfRkxVU0gpfHwodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/KGg9YS51dGY4Ym9yZGVyKEIub3V0cHV0LEIubmV4dF9vdXQpLG89Qi5uZXh0X291dC1oLGY9YS5idWYyc3RyaW5nKEIub3V0cHV0LGgpLEIubmV4dF9vdXQ9byxCLmF2YWlsX291dD11LW8sbyYmcy5hcnJheVNldChCLm91dHB1dCxCLm91dHB1dCxoLG8sMCksdGhpcy5vbkRhdGEoZikpOnRoaXMub25EYXRhKHMuc2hyaW5rQnVmKEIub3V0cHV0LEIubmV4dF9vdXQpKSkpLEIuYXZhaWxfaW49PT0wJiZCLmF2YWlsX291dD09PTAmJihxPSEwKX13aGlsZSgoMDxCLmF2YWlsX2lufHxCLmF2YWlsX291dD09PTApJiZQIT09bC5aX1NUUkVBTV9FTkQpO3JldHVybiBQPT09bC5aX1NUUkVBTV9FTkQmJihGPWwuWl9GSU5JU0gpLEY9PT1sLlpfRklOSVNIPyhQPW4uaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQoUCksdGhpcy5lbmRlZD0hMCxQPT09bC5aX09LKTpGIT09bC5aX1NZTkNfRkxVU0h8fCh0aGlzLm9uRW5kKGwuWl9PSyksIShCLmF2YWlsX291dD0wKSl9LHkucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbih3KXt0aGlzLmNodW5rcy5wdXNoKHcpfSx5LnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih3KXt3PT09bC5aX09LJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9dyx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxyLkluZmxhdGU9eSxyLmluZmxhdGU9VCxyLmluZmxhdGVSYXc9ZnVuY3Rpb24odyxrKXtyZXR1cm4oaz1rfHx7fSkucmF3PSEwLFQodyxrKX0sci51bmd6aXA9VH0seyIuL3V0aWxzL2NvbW1vbiI6NDEsIi4vdXRpbHMvc3RyaW5ncyI6NDIsIi4vemxpYi9jb25zdGFudHMiOjQ0LCIuL3psaWIvZ3poZWFkZXIiOjQ3LCIuL3psaWIvaW5mbGF0ZSI6NDksIi4vemxpYi9tZXNzYWdlcyI6NTEsIi4vemxpYi96c3RyZWFtIjo1M31dLDQxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIEludDMyQXJyYXk8InUiO3IuYXNzaWduPWZ1bmN0aW9uKGwpe2Zvcih2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Yy5sZW5ndGg7KXt2YXIgcD1jLnNoaWZ0KCk7aWYocCl7aWYodHlwZW9mIHAhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IocCsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBiIGluIHApcC5oYXNPd25Qcm9wZXJ0eShiKSYmKGxbYl09cFtiXSl9fXJldHVybiBsfSxyLnNocmlua0J1Zj1mdW5jdGlvbihsLGMpe3JldHVybiBsLmxlbmd0aD09PWM/bDpsLnN1YmFycmF5P2wuc3ViYXJyYXkoMCxjKToobC5sZW5ndGg9YyxsKX07dmFyIHM9e2FycmF5U2V0OmZ1bmN0aW9uKGwsYyxwLGIsbSl7aWYoYy5zdWJhcnJheSYmbC5zdWJhcnJheSlsLnNldChjLnN1YmFycmF5KHAscCtiKSxtKTtlbHNlIGZvcih2YXIgeT0wO3k8Yjt5KyspbFttK3ldPWNbcCt5XX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihsKXt2YXIgYyxwLGIsbSx5LFQ7Zm9yKGM9Yj0wLHA9bC5sZW5ndGg7YzxwO2MrKyliKz1sW2NdLmxlbmd0aDtmb3IoVD1uZXcgVWludDhBcnJheShiKSxjPW09MCxwPWwubGVuZ3RoO2M8cDtjKyspeT1sW2NdLFQuc2V0KHksbSksbSs9eS5sZW5ndGg7cmV0dXJuIFR9fSxhPXthcnJheVNldDpmdW5jdGlvbihsLGMscCxiLG0pe2Zvcih2YXIgeT0wO3k8Yjt5KyspbFttK3ldPWNbcCt5XX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihsKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sbCl9fTtyLnNldFR5cGVkPWZ1bmN0aW9uKGwpe2w/KHIuQnVmOD1VaW50OEFycmF5LHIuQnVmMTY9VWludDE2QXJyYXksci5CdWYzMj1JbnQzMkFycmF5LHIuYXNzaWduKHIscykpOihyLkJ1Zjg9QXJyYXksci5CdWYxNj1BcnJheSxyLkJ1ZjMyPUFycmF5LHIuYXNzaWduKHIsYSkpfSxyLnNldFR5cGVkKG4pfSx7fV0sNDI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9jb21tb24iKSxzPSEwLGE9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxbMF0pfWNhdGNoe3M9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2h7YT0hMX1mb3IodmFyIGw9bmV3IG4uQnVmOCgyNTYpLGM9MDtjPDI1NjtjKyspbFtjXT0yNTI8PWM/NjoyNDg8PWM/NToyNDA8PWM/NDoyMjQ8PWM/MzoxOTI8PWM/MjoxO2Z1bmN0aW9uIHAoYixtKXtpZihtPDY1NTM3JiYoYi5zdWJhcnJheSYmYXx8IWIuc3ViYXJyYXkmJnMpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbi5zaHJpbmtCdWYoYixtKSk7Zm9yKHZhciB5PSIiLFQ9MDtUPG07VCsrKXkrPVN0cmluZy5mcm9tQ2hhckNvZGUoYltUXSk7cmV0dXJuIHl9bFsyNTRdPWxbMjU0XT0xLHIuc3RyaW5nMmJ1Zj1mdW5jdGlvbihiKXt2YXIgbSx5LFQsdyxrLFA9Yi5sZW5ndGgsRj0wO2Zvcih3PTA7dzxQO3crKykoNjQ1MTImKHk9Yi5jaGFyQ29kZUF0KHcpKSk9PTU1Mjk2JiZ3KzE8UCYmKDY0NTEyJihUPWIuY2hhckNvZGVBdCh3KzEpKSk9PTU2MzIwJiYoeT02NTUzNisoeS01NTI5Njw8MTApKyhULTU2MzIwKSx3KyspLEYrPXk8MTI4PzE6eTwyMDQ4PzI6eTw2NTUzNj8zOjQ7Zm9yKG09bmV3IG4uQnVmOChGKSx3PWs9MDtrPEY7dysrKSg2NDUxMiYoeT1iLmNoYXJDb2RlQXQodykpKT09NTUyOTYmJncrMTxQJiYoNjQ1MTImKFQ9Yi5jaGFyQ29kZUF0KHcrMSkpKT09NTYzMjAmJih5PTY1NTM2Kyh5LTU1Mjk2PDwxMCkrKFQtNTYzMjApLHcrKykseTwxMjg/bVtrKytdPXk6KHk8MjA0OD9tW2srK109MTkyfHk+Pj42Oih5PDY1NTM2P21baysrXT0yMjR8eT4+PjEyOihtW2srK109MjQwfHk+Pj4xOCxtW2srK109MTI4fHk+Pj4xMiY2MyksbVtrKytdPTEyOHx5Pj4+NiY2MyksbVtrKytdPTEyOHw2MyZ5KTtyZXR1cm4gbX0sci5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKGIpe3JldHVybiBwKGIsYi5sZW5ndGgpfSxyLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oYil7Zm9yKHZhciBtPW5ldyBuLkJ1ZjgoYi5sZW5ndGgpLHk9MCxUPW0ubGVuZ3RoO3k8VDt5KyspbVt5XT1iLmNoYXJDb2RlQXQoeSk7cmV0dXJuIG19LHIuYnVmMnN0cmluZz1mdW5jdGlvbihiLG0pe3ZhciB5LFQsdyxrLFA9bXx8Yi5sZW5ndGgsRj1uZXcgQXJyYXkoMipQKTtmb3IoeT1UPTA7eTxQOylpZigodz1iW3krK10pPDEyOClGW1QrK109dztlbHNlIGlmKDQ8KGs9bFt3XSkpRltUKytdPTY1NTMzLHkrPWstMTtlbHNle2Zvcih3Jj1rPT09Mj8zMTprPT09Mz8xNTo3OzE8ayYmeTxQOyl3PXc8PDZ8NjMmYlt5KytdLGstLTsxPGs/RltUKytdPTY1NTMzOnc8NjU1MzY/RltUKytdPXc6KHctPTY1NTM2LEZbVCsrXT01NTI5Nnx3Pj4xMCYxMDIzLEZbVCsrXT01NjMyMHwxMDIzJncpfXJldHVybiBwKEYsVCl9LHIudXRmOGJvcmRlcj1mdW5jdGlvbihiLG0pe3ZhciB5O2ZvcigobT1tfHxiLmxlbmd0aCk+Yi5sZW5ndGgmJihtPWIubGVuZ3RoKSx5PW0tMTswPD15JiYoMTkyJmJbeV0pPT0xMjg7KXktLTtyZXR1cm4geTwwfHx5PT09MD9tOnkrbFtiW3ldXT5tP3k6bX19LHsiLi9jb21tb24iOjQxfV0sNDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKG4scyxhLGwpe2Zvcih2YXIgYz02NTUzNSZufDAscD1uPj4+MTYmNjU1MzV8MCxiPTA7YSE9PTA7KXtmb3IoYS09Yj0yZTM8YT8yZTM6YTtwPXArKGM9YytzW2wrK118MCl8MCwtLWI7KTtjJT02NTUyMSxwJT02NTUyMX1yZXR1cm4gY3xwPDwxNnwwfX0se31dLDQ0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fX0se31dLDQ1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBzLGE9W10sbD0wO2w8MjU2O2wrKyl7cz1sO2Zvcih2YXIgYz0wO2M8ODtjKyspcz0xJnM/Mzk4ODI5MjM4NF5zPj4+MTpzPj4+MTthW2xdPXN9cmV0dXJuIGF9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKHMsYSxsLGMpe3ZhciBwPW4sYj1jK2w7c149LTE7Zm9yKHZhciBtPWM7bTxiO20rKylzPXM+Pj44XnBbMjU1JihzXmFbbV0pXTtyZXR1cm4tMV5zfX0se31dLDQ2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuLHM9dCgiLi4vdXRpbHMvY29tbW9uIiksYT10KCIuL3RyZWVzIiksbD10KCIuL2FkbGVyMzIiKSxjPXQoIi4vY3JjMzIiKSxwPXQoIi4vbWVzc2FnZXMiKSxiPTAsbT00LHk9MCxUPS0yLHc9LTEsaz00LFA9MixGPTgsaD05LG89Mjg2LGY9MzAsQz0xOSxCPTIqbysxLHU9MTUsej0zLHE9MjU4LGV0PXEreisxLE89NDIsWj0xMTMsZz0xLF89MixTPTMsTj00O2Z1bmN0aW9uIFIoRCx1dCl7cmV0dXJuIEQubXNnPXBbdXRdLHV0fWZ1bmN0aW9uIEwoRCl7cmV0dXJuKEQ8PDEpLSg0PEQ/OTowKX1mdW5jdGlvbiBYKEQpe2Zvcih2YXIgdXQ9RC5sZW5ndGg7MDw9LS11dDspRFt1dF09MH1mdW5jdGlvbiBqKEQpe3ZhciB1dD1ELnN0YXRlLG90PXV0LnBlbmRpbmc7b3Q+RC5hdmFpbF9vdXQmJihvdD1ELmF2YWlsX291dCksb3QhPT0wJiYocy5hcnJheVNldChELm91dHB1dCx1dC5wZW5kaW5nX2J1Zix1dC5wZW5kaW5nX291dCxvdCxELm5leHRfb3V0KSxELm5leHRfb3V0Kz1vdCx1dC5wZW5kaW5nX291dCs9b3QsRC50b3RhbF9vdXQrPW90LEQuYXZhaWxfb3V0LT1vdCx1dC5wZW5kaW5nLT1vdCx1dC5wZW5kaW5nPT09MCYmKHV0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBHKEQsdXQpe2EuX3RyX2ZsdXNoX2Jsb2NrKEQsMDw9RC5ibG9ja19zdGFydD9ELmJsb2NrX3N0YXJ0Oi0xLEQuc3Ryc3RhcnQtRC5ibG9ja19zdGFydCx1dCksRC5ibG9ja19zdGFydD1ELnN0cnN0YXJ0LGooRC5zdHJtKX1mdW5jdGlvbiBhdChELHV0KXtELnBlbmRpbmdfYnVmW0QucGVuZGluZysrXT11dH1mdW5jdGlvbiBKKEQsdXQpe0QucGVuZGluZ19idWZbRC5wZW5kaW5nKytdPXV0Pj4+OCYyNTUsRC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109MjU1JnV0fWZ1bmN0aW9uIHR0KEQsdXQpe3ZhciBvdCxILE09RC5tYXhfY2hhaW5fbGVuZ3RoLFk9RC5zdHJzdGFydCxwdD1ELnByZXZfbGVuZ3RoLG10PUQubmljZV9tYXRjaCxydD1ELnN0cnN0YXJ0PkQud19zaXplLWV0P0Quc3Ryc3RhcnQtKEQud19zaXplLWV0KTowLGd0PUQud2luZG93LEN0PUQud19tYXNrLHh0PUQucHJldixidD1ELnN0cnN0YXJ0K3EsenQ9Z3RbWStwdC0xXSxVdD1ndFtZK3B0XTtELnByZXZfbGVuZ3RoPj1ELmdvb2RfbWF0Y2gmJihNPj49MiksbXQ+RC5sb29rYWhlYWQmJihtdD1ELmxvb2thaGVhZCk7ZG8gaWYoZ3RbKG90PXV0KStwdF09PT1VdCYmZ3Rbb3QrcHQtMV09PT16dCYmZ3Rbb3RdPT09Z3RbWV0mJmd0Wysrb3RdPT09Z3RbWSsxXSl7WSs9MixvdCsrO2RvO3doaWxlKGd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZndFsrK1ldPT09Z3RbKytvdF0mJmd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZndFsrK1ldPT09Z3RbKytvdF0mJmd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZZPGJ0KTtpZihIPXEtKGJ0LVkpLFk9YnQtcSxwdDxIKXtpZihELm1hdGNoX3N0YXJ0PXV0LG10PD0ocHQ9SCkpYnJlYWs7enQ9Z3RbWStwdC0xXSxVdD1ndFtZK3B0XX19d2hpbGUoKHV0PXh0W3V0JkN0XSk+cnQmJi0tTSE9MCk7cmV0dXJuIHB0PD1ELmxvb2thaGVhZD9wdDpELmxvb2thaGVhZH1mdW5jdGlvbiB5dChEKXt2YXIgdXQsb3QsSCxNLFkscHQsbXQscnQsZ3QsQ3QseHQ9RC53X3NpemU7ZG97aWYoTT1ELndpbmRvd19zaXplLUQubG9va2FoZWFkLUQuc3Ryc3RhcnQsRC5zdHJzdGFydD49eHQrKHh0LWV0KSl7Zm9yKHMuYXJyYXlTZXQoRC53aW5kb3csRC53aW5kb3cseHQseHQsMCksRC5tYXRjaF9zdGFydC09eHQsRC5zdHJzdGFydC09eHQsRC5ibG9ja19zdGFydC09eHQsdXQ9b3Q9RC5oYXNoX3NpemU7SD1ELmhlYWRbLS11dF0sRC5oZWFkW3V0XT14dDw9SD9ILXh0OjAsLS1vdDspO2Zvcih1dD1vdD14dDtIPUQucHJldlstLXV0XSxELnByZXZbdXRdPXh0PD1IP0gteHQ6MCwtLW90Oyk7TSs9eHR9aWYoRC5zdHJtLmF2YWlsX2luPT09MClicmVhaztpZihwdD1ELnN0cm0sbXQ9RC53aW5kb3cscnQ9RC5zdHJzdGFydCtELmxvb2thaGVhZCxndD1NLEN0PXZvaWQgMCxDdD1wdC5hdmFpbF9pbixndDxDdCYmKEN0PWd0KSxvdD1DdD09PTA/MDoocHQuYXZhaWxfaW4tPUN0LHMuYXJyYXlTZXQobXQscHQuaW5wdXQscHQubmV4dF9pbixDdCxydCkscHQuc3RhdGUud3JhcD09PTE/cHQuYWRsZXI9bChwdC5hZGxlcixtdCxDdCxydCk6cHQuc3RhdGUud3JhcD09PTImJihwdC5hZGxlcj1jKHB0LmFkbGVyLG10LEN0LHJ0KSkscHQubmV4dF9pbis9Q3QscHQudG90YWxfaW4rPUN0LEN0KSxELmxvb2thaGVhZCs9b3QsRC5sb29rYWhlYWQrRC5pbnNlcnQ+PXopZm9yKFk9RC5zdHJzdGFydC1ELmluc2VydCxELmluc19oPUQud2luZG93W1ldLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tZKzFdKSZELmhhc2hfbWFzaztELmluc2VydCYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tZK3otMV0pJkQuaGFzaF9tYXNrLEQucHJldltZJkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPVksWSsrLEQuaW5zZXJ0LS0sIShELmxvb2thaGVhZCtELmluc2VydDx6KSk7KTt9d2hpbGUoRC5sb29rYWhlYWQ8ZXQmJkQuc3RybS5hdmFpbF9pbiE9PTApfWZ1bmN0aW9uIFR0KEQsdXQpe2Zvcih2YXIgb3QsSDs7KXtpZihELmxvb2thaGVhZDxldCl7aWYoeXQoRCksRC5sb29rYWhlYWQ8ZXQmJnV0PT09YilyZXR1cm4gZztpZihELmxvb2thaGVhZD09PTApYnJlYWt9aWYob3Q9MCxELmxvb2thaGVhZD49eiYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K3otMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLG90IT09MCYmRC5zdHJzdGFydC1vdDw9RC53X3NpemUtZXQmJihELm1hdGNoX2xlbmd0aD10dChELG90KSksRC5tYXRjaF9sZW5ndGg+PXopaWYoSD1hLl90cl90YWxseShELEQuc3Ryc3RhcnQtRC5tYXRjaF9zdGFydCxELm1hdGNoX2xlbmd0aC16KSxELmxvb2thaGVhZC09RC5tYXRjaF9sZW5ndGgsRC5tYXRjaF9sZW5ndGg8PUQubWF4X2xhenlfbWF0Y2gmJkQubG9va2FoZWFkPj16KXtmb3IoRC5tYXRjaF9sZW5ndGgtLTtELnN0cnN0YXJ0KyssRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrei0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCwtLUQubWF0Y2hfbGVuZ3RoIT0wOyk7RC5zdHJzdGFydCsrfWVsc2UgRC5zdHJzdGFydCs9RC5tYXRjaF9sZW5ndGgsRC5tYXRjaF9sZW5ndGg9MCxELmluc19oPUQud2luZG93W0Quc3Ryc3RhcnRdLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0KzFdKSZELmhhc2hfbWFzaztlbHNlIEg9YS5fdHJfdGFsbHkoRCwwLEQud2luZG93W0Quc3Ryc3RhcnRdKSxELmxvb2thaGVhZC0tLEQuc3Ryc3RhcnQrKztpZihIJiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIGd9cmV0dXJuIEQuaW5zZXJ0PUQuc3Ryc3RhcnQ8ei0xP0Quc3Ryc3RhcnQ6ei0xLHV0PT09bT8oRyhELCEwKSxELnN0cm0uYXZhaWxfb3V0PT09MD9TOk4pOkQubGFzdF9saXQmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKT9nOl99ZnVuY3Rpb24gQXQoRCx1dCl7Zm9yKHZhciBvdCxILE07Oyl7aWYoRC5sb29rYWhlYWQ8ZXQpe2lmKHl0KEQpLEQubG9va2FoZWFkPGV0JiZ1dD09PWIpcmV0dXJuIGc7aWYoRC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKG90PTAsRC5sb29rYWhlYWQ+PXomJihELmluc19oPShELmluc19oPDxELmhhc2hfc2hpZnReRC53aW5kb3dbRC5zdHJzdGFydCt6LTFdKSZELmhhc2hfbWFzayxvdD1ELnByZXZbRC5zdHJzdGFydCZELndfbWFza109RC5oZWFkW0QuaW5zX2hdLEQuaGVhZFtELmluc19oXT1ELnN0cnN0YXJ0KSxELnByZXZfbGVuZ3RoPUQubWF0Y2hfbGVuZ3RoLEQucHJldl9tYXRjaD1ELm1hdGNoX3N0YXJ0LEQubWF0Y2hfbGVuZ3RoPXotMSxvdCE9PTAmJkQucHJldl9sZW5ndGg8RC5tYXhfbGF6eV9tYXRjaCYmRC5zdHJzdGFydC1vdDw9RC53X3NpemUtZXQmJihELm1hdGNoX2xlbmd0aD10dChELG90KSxELm1hdGNoX2xlbmd0aDw9NSYmKEQuc3RyYXRlZ3k9PT0xfHxELm1hdGNoX2xlbmd0aD09PXomJjQwOTY8RC5zdHJzdGFydC1ELm1hdGNoX3N0YXJ0KSYmKEQubWF0Y2hfbGVuZ3RoPXotMSkpLEQucHJldl9sZW5ndGg+PXomJkQubWF0Y2hfbGVuZ3RoPD1ELnByZXZfbGVuZ3RoKXtmb3IoTT1ELnN0cnN0YXJ0K0QubG9va2FoZWFkLXosSD1hLl90cl90YWxseShELEQuc3Ryc3RhcnQtMS1ELnByZXZfbWF0Y2gsRC5wcmV2X2xlbmd0aC16KSxELmxvb2thaGVhZC09RC5wcmV2X2xlbmd0aC0xLEQucHJldl9sZW5ndGgtPTI7KytELnN0cnN0YXJ0PD1NJiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrei0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCksLS1ELnByZXZfbGVuZ3RoIT0wOyk7aWYoRC5tYXRjaF9hdmFpbGFibGU9MCxELm1hdGNoX2xlbmd0aD16LTEsRC5zdHJzdGFydCsrLEgmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gZ31lbHNlIGlmKEQubWF0Y2hfYXZhaWxhYmxlKXtpZigoSD1hLl90cl90YWxseShELDAsRC53aW5kb3dbRC5zdHJzdGFydC0xXSkpJiZHKEQsITEpLEQuc3Ryc3RhcnQrKyxELmxvb2thaGVhZC0tLEQuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiBnfWVsc2UgRC5tYXRjaF9hdmFpbGFibGU9MSxELnN0cnN0YXJ0KyssRC5sb29rYWhlYWQtLX1yZXR1cm4gRC5tYXRjaF9hdmFpbGFibGUmJihIPWEuX3RyX3RhbGx5KEQsMCxELndpbmRvd1tELnN0cnN0YXJ0LTFdKSxELm1hdGNoX2F2YWlsYWJsZT0wKSxELmluc2VydD1ELnN0cnN0YXJ0PHotMT9ELnN0cnN0YXJ0OnotMSx1dD09PW0/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTpELmxhc3RfbGl0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCk/ZzpffWZ1bmN0aW9uIGt0KEQsdXQsb3QsSCxNKXt0aGlzLmdvb2RfbGVuZ3RoPUQsdGhpcy5tYXhfbGF6eT11dCx0aGlzLm5pY2VfbGVuZ3RoPW90LHRoaXMubWF4X2NoYWluPUgsdGhpcy5mdW5jPU19ZnVuY3Rpb24gTHQoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD1GLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBzLkJ1ZjE2KDIqQiksdGhpcy5keW5fZHRyZWU9bmV3IHMuQnVmMTYoMiooMipmKzEpKSx0aGlzLmJsX3RyZWU9bmV3IHMuQnVmMTYoMiooMipDKzEpKSxYKHRoaXMuZHluX2x0cmVlKSxYKHRoaXMuZHluX2R0cmVlKSxYKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IHMuQnVmMTYodSsxKSx0aGlzLmhlYXA9bmV3IHMuQnVmMTYoMipvKzEpLFgodGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IHMuQnVmMTYoMipvKzEpLFgodGhpcy5kZXB0aCksdGhpcy5sX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLmxhc3RfbGl0PTAsdGhpcy5kX2J1Zj0wLHRoaXMub3B0X2xlbj0wLHRoaXMuc3RhdGljX2xlbj0wLHRoaXMubWF0Y2hlcz0wLHRoaXMuaW5zZXJ0PTAsdGhpcy5iaV9idWY9MCx0aGlzLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gQnQoRCl7dmFyIHV0O3JldHVybiBEJiZELnN0YXRlPyhELnRvdGFsX2luPUQudG90YWxfb3V0PTAsRC5kYXRhX3R5cGU9UCwodXQ9RC5zdGF0ZSkucGVuZGluZz0wLHV0LnBlbmRpbmdfb3V0PTAsdXQud3JhcDwwJiYodXQud3JhcD0tdXQud3JhcCksdXQuc3RhdHVzPXV0LndyYXA/TzpaLEQuYWRsZXI9dXQud3JhcD09PTI/MDoxLHV0Lmxhc3RfZmx1c2g9YixhLl90cl9pbml0KHV0KSx5KTpSKEQsVCl9ZnVuY3Rpb24gJHQoRCl7dmFyIHV0PUJ0KEQpO3JldHVybiB1dD09PXkmJmZ1bmN0aW9uKG90KXtvdC53aW5kb3dfc2l6ZT0yKm90Lndfc2l6ZSxYKG90LmhlYWQpLG90Lm1heF9sYXp5X21hdGNoPW5bb3QubGV2ZWxdLm1heF9sYXp5LG90Lmdvb2RfbWF0Y2g9bltvdC5sZXZlbF0uZ29vZF9sZW5ndGgsb3QubmljZV9tYXRjaD1uW290LmxldmVsXS5uaWNlX2xlbmd0aCxvdC5tYXhfY2hhaW5fbGVuZ3RoPW5bb3QubGV2ZWxdLm1heF9jaGFpbixvdC5zdHJzdGFydD0wLG90LmJsb2NrX3N0YXJ0PTAsb3QubG9va2FoZWFkPTAsb3QuaW5zZXJ0PTAsb3QubWF0Y2hfbGVuZ3RoPW90LnByZXZfbGVuZ3RoPXotMSxvdC5tYXRjaF9hdmFpbGFibGU9MCxvdC5pbnNfaD0wfShELnN0YXRlKSx1dH1mdW5jdGlvbiBLdChELHV0LG90LEgsTSxZKXtpZighRClyZXR1cm4gVDt2YXIgcHQ9MTtpZih1dD09PXcmJih1dD02KSxIPDA/KHB0PTAsSD0tSCk6MTU8SCYmKHB0PTIsSC09MTYpLE08MXx8aDxNfHxvdCE9PUZ8fEg8OHx8MTU8SHx8dXQ8MHx8OTx1dHx8WTwwfHxrPFkpcmV0dXJuIFIoRCxUKTtIPT09OCYmKEg9OSk7dmFyIG10PW5ldyBMdDtyZXR1cm4oRC5zdGF0ZT1tdCkuc3RybT1ELG10LndyYXA9cHQsbXQuZ3poZWFkPW51bGwsbXQud19iaXRzPUgsbXQud19zaXplPTE8PG10LndfYml0cyxtdC53X21hc2s9bXQud19zaXplLTEsbXQuaGFzaF9iaXRzPU0rNyxtdC5oYXNoX3NpemU9MTw8bXQuaGFzaF9iaXRzLG10Lmhhc2hfbWFzaz1tdC5oYXNoX3NpemUtMSxtdC5oYXNoX3NoaWZ0PX5+KChtdC5oYXNoX2JpdHMrei0xKS96KSxtdC53aW5kb3c9bmV3IHMuQnVmOCgyKm10Lndfc2l6ZSksbXQuaGVhZD1uZXcgcy5CdWYxNihtdC5oYXNoX3NpemUpLG10LnByZXY9bmV3IHMuQnVmMTYobXQud19zaXplKSxtdC5saXRfYnVmc2l6ZT0xPDxNKzYsbXQucGVuZGluZ19idWZfc2l6ZT00Km10LmxpdF9idWZzaXplLG10LnBlbmRpbmdfYnVmPW5ldyBzLkJ1ZjgobXQucGVuZGluZ19idWZfc2l6ZSksbXQuZF9idWY9MSptdC5saXRfYnVmc2l6ZSxtdC5sX2J1Zj0zKm10LmxpdF9idWZzaXplLG10LmxldmVsPXV0LG10LnN0cmF0ZWd5PVksbXQubWV0aG9kPW90LCR0KEQpfW49W25ldyBrdCgwLDAsMCwwLGZ1bmN0aW9uKEQsdXQpe3ZhciBvdD02NTUzNTtmb3Iob3Q+RC5wZW5kaW5nX2J1Zl9zaXplLTUmJihvdD1ELnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoRC5sb29rYWhlYWQ8PTEpe2lmKHl0KEQpLEQubG9va2FoZWFkPT09MCYmdXQ9PT1iKXJldHVybiBnO2lmKEQubG9va2FoZWFkPT09MClicmVha31ELnN0cnN0YXJ0Kz1ELmxvb2thaGVhZCxELmxvb2thaGVhZD0wO3ZhciBIPUQuYmxvY2tfc3RhcnQrb3Q7aWYoKEQuc3Ryc3RhcnQ9PT0wfHxELnN0cnN0YXJ0Pj1IKSYmKEQubG9va2FoZWFkPUQuc3Ryc3RhcnQtSCxELnN0cnN0YXJ0PUgsRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCl8fEQuc3Ryc3RhcnQtRC5ibG9ja19zdGFydD49RC53X3NpemUtZXQmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gZ31yZXR1cm4gRC5pbnNlcnQ9MCx1dD09PW0/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTooRC5zdHJzdGFydD5ELmJsb2NrX3N0YXJ0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0KSxnKX0pLG5ldyBrdCg0LDQsOCw0LFR0KSxuZXcga3QoNCw1LDE2LDgsVHQpLG5ldyBrdCg0LDYsMzIsMzIsVHQpLG5ldyBrdCg0LDQsMTYsMTYsQXQpLG5ldyBrdCg4LDE2LDMyLDMyLEF0KSxuZXcga3QoOCwxNiwxMjgsMTI4LEF0KSxuZXcga3QoOCwzMiwxMjgsMjU2LEF0KSxuZXcga3QoMzIsMTI4LDI1OCwxMDI0LEF0KSxuZXcga3QoMzIsMjU4LDI1OCw0MDk2LEF0KV0sci5kZWZsYXRlSW5pdD1mdW5jdGlvbihELHV0KXtyZXR1cm4gS3QoRCx1dCxGLDE1LDgsMCl9LHIuZGVmbGF0ZUluaXQyPUt0LHIuZGVmbGF0ZVJlc2V0PSR0LHIuZGVmbGF0ZVJlc2V0S2VlcD1CdCxyLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oRCx1dCl7cmV0dXJuIEQmJkQuc3RhdGU/RC5zdGF0ZS53cmFwIT09Mj9UOihELnN0YXRlLmd6aGVhZD11dCx5KTpUfSxyLmRlZmxhdGU9ZnVuY3Rpb24oRCx1dCl7dmFyIG90LEgsTSxZO2lmKCFEfHwhRC5zdGF0ZXx8NTx1dHx8dXQ8MClyZXR1cm4gRD9SKEQsVCk6VDtpZihIPUQuc3RhdGUsIUQub3V0cHV0fHwhRC5pbnB1dCYmRC5hdmFpbF9pbiE9PTB8fEguc3RhdHVzPT09NjY2JiZ1dCE9PW0pcmV0dXJuIFIoRCxELmF2YWlsX291dD09PTA/LTU6VCk7aWYoSC5zdHJtPUQsb3Q9SC5sYXN0X2ZsdXNoLEgubGFzdF9mbHVzaD11dCxILnN0YXR1cz09PU8paWYoSC53cmFwPT09MilELmFkbGVyPTAsYXQoSCwzMSksYXQoSCwxMzkpLGF0KEgsOCksSC5nemhlYWQ/KGF0KEgsKEguZ3poZWFkLnRleHQ/MTowKSsoSC5nemhlYWQuaGNyYz8yOjApKyhILmd6aGVhZC5leHRyYT80OjApKyhILmd6aGVhZC5uYW1lPzg6MCkrKEguZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLGF0KEgsMjU1JkguZ3poZWFkLnRpbWUpLGF0KEgsSC5nemhlYWQudGltZT4+OCYyNTUpLGF0KEgsSC5nemhlYWQudGltZT4+MTYmMjU1KSxhdChILEguZ3poZWFkLnRpbWU+PjI0JjI1NSksYXQoSCxILmxldmVsPT09OT8yOjI8PUguc3RyYXRlZ3l8fEgubGV2ZWw8Mj80OjApLGF0KEgsMjU1JkguZ3poZWFkLm9zKSxILmd6aGVhZC5leHRyYSYmSC5nemhlYWQuZXh0cmEubGVuZ3RoJiYoYXQoSCwyNTUmSC5nemhlYWQuZXh0cmEubGVuZ3RoKSxhdChILEguZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxILmd6aGVhZC5oY3JjJiYoRC5hZGxlcj1jKEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmcsMCkpLEguZ3ppbmRleD0wLEguc3RhdHVzPTY5KTooYXQoSCwwKSxhdChILDApLGF0KEgsMCksYXQoSCwwKSxhdChILDApLGF0KEgsSC5sZXZlbD09PTk/MjoyPD1ILnN0cmF0ZWd5fHxILmxldmVsPDI/NDowKSxhdChILDMpLEguc3RhdHVzPVopO2Vsc2V7dmFyIHB0PUYrKEgud19iaXRzLTg8PDQpPDw4O3B0fD0oMjw9SC5zdHJhdGVneXx8SC5sZXZlbDwyPzA6SC5sZXZlbDw2PzE6SC5sZXZlbD09PTY/MjozKTw8NixILnN0cnN0YXJ0IT09MCYmKHB0fD0zMikscHQrPTMxLXB0JTMxLEguc3RhdHVzPVosSihILHB0KSxILnN0cnN0YXJ0IT09MCYmKEooSCxELmFkbGVyPj4+MTYpLEooSCw2NTUzNSZELmFkbGVyKSksRC5hZGxlcj0xfWlmKEguc3RhdHVzPT09NjkpaWYoSC5nemhlYWQuZXh0cmEpe2ZvcihNPUgucGVuZGluZztILmd6aW5kZXg8KDY1NTM1JkguZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihILnBlbmRpbmchPT1ILnBlbmRpbmdfYnVmX3NpemV8fChILmd6aGVhZC5oY3JjJiZILnBlbmRpbmc+TSYmKEQuYWRsZXI9YyhELmFkbGVyLEgucGVuZGluZ19idWYsSC5wZW5kaW5nLU0sTSkpLGooRCksTT1ILnBlbmRpbmcsSC5wZW5kaW5nIT09SC5wZW5kaW5nX2J1Zl9zaXplKSk7KWF0KEgsMjU1JkguZ3poZWFkLmV4dHJhW0guZ3ppbmRleF0pLEguZ3ppbmRleCsrO0guZ3poZWFkLmhjcmMmJkgucGVuZGluZz5NJiYoRC5hZGxlcj1jKEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmctTSxNKSksSC5nemluZGV4PT09SC5nemhlYWQuZXh0cmEubGVuZ3RoJiYoSC5nemluZGV4PTAsSC5zdGF0dXM9NzMpfWVsc2UgSC5zdGF0dXM9NzM7aWYoSC5zdGF0dXM9PT03MylpZihILmd6aGVhZC5uYW1lKXtNPUgucGVuZGluZztkb3tpZihILnBlbmRpbmc9PT1ILnBlbmRpbmdfYnVmX3NpemUmJihILmd6aGVhZC5oY3JjJiZILnBlbmRpbmc+TSYmKEQuYWRsZXI9YyhELmFkbGVyLEgucGVuZGluZ19idWYsSC5wZW5kaW5nLU0sTSkpLGooRCksTT1ILnBlbmRpbmcsSC5wZW5kaW5nPT09SC5wZW5kaW5nX2J1Zl9zaXplKSl7WT0xO2JyZWFrfVk9SC5nemluZGV4PEguZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZILmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoSC5nemluZGV4KyspOjAsYXQoSCxZKX13aGlsZShZIT09MCk7SC5nemhlYWQuaGNyYyYmSC5wZW5kaW5nPk0mJihELmFkbGVyPWMoRC5hZGxlcixILnBlbmRpbmdfYnVmLEgucGVuZGluZy1NLE0pKSxZPT09MCYmKEguZ3ppbmRleD0wLEguc3RhdHVzPTkxKX1lbHNlIEguc3RhdHVzPTkxO2lmKEguc3RhdHVzPT09OTEpaWYoSC5nemhlYWQuY29tbWVudCl7TT1ILnBlbmRpbmc7ZG97aWYoSC5wZW5kaW5nPT09SC5wZW5kaW5nX2J1Zl9zaXplJiYoSC5nemhlYWQuaGNyYyYmSC5wZW5kaW5nPk0mJihELmFkbGVyPWMoRC5hZGxlcixILnBlbmRpbmdfYnVmLEgucGVuZGluZy1NLE0pKSxqKEQpLE09SC5wZW5kaW5nLEgucGVuZGluZz09PUgucGVuZGluZ19idWZfc2l6ZSkpe1k9MTticmVha31ZPUguZ3ppbmRleDxILmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmSC5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KEguZ3ppbmRleCsrKTowLGF0KEgsWSl9d2hpbGUoWSE9PTApO0guZ3poZWFkLmhjcmMmJkgucGVuZGluZz5NJiYoRC5hZGxlcj1jKEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmctTSxNKSksWT09PTAmJihILnN0YXR1cz0xMDMpfWVsc2UgSC5zdGF0dXM9MTAzO2lmKEguc3RhdHVzPT09MTAzJiYoSC5nemhlYWQuaGNyYz8oSC5wZW5kaW5nKzI+SC5wZW5kaW5nX2J1Zl9zaXplJiZqKEQpLEgucGVuZGluZysyPD1ILnBlbmRpbmdfYnVmX3NpemUmJihhdChILDI1NSZELmFkbGVyKSxhdChILEQuYWRsZXI+PjgmMjU1KSxELmFkbGVyPTAsSC5zdGF0dXM9WikpOkguc3RhdHVzPVopLEgucGVuZGluZyE9PTApe2lmKGooRCksRC5hdmFpbF9vdXQ9PT0wKXJldHVybiBILmxhc3RfZmx1c2g9LTEseX1lbHNlIGlmKEQuYXZhaWxfaW49PT0wJiZMKHV0KTw9TChvdCkmJnV0IT09bSlyZXR1cm4gUihELC01KTtpZihILnN0YXR1cz09PTY2NiYmRC5hdmFpbF9pbiE9PTApcmV0dXJuIFIoRCwtNSk7aWYoRC5hdmFpbF9pbiE9PTB8fEgubG9va2FoZWFkIT09MHx8dXQhPT1iJiZILnN0YXR1cyE9PTY2Nil7dmFyIG10PUguc3RyYXRlZ3k9PT0yP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0Ozspe2lmKHJ0Lmxvb2thaGVhZD09PTAmJih5dChydCkscnQubG9va2FoZWFkPT09MCkpe2lmKGd0PT09YilyZXR1cm4gZzticmVha31pZihydC5tYXRjaF9sZW5ndGg9MCxDdD1hLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyssQ3QmJihHKHJ0LCExKSxydC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBnfXJldHVybiBydC5pbnNlcnQ9MCxndD09PW0/KEcocnQsITApLHJ0LnN0cm0uYXZhaWxfb3V0PT09MD9TOk4pOnJ0Lmxhc3RfbGl0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKT9nOl99KEgsdXQpOkguc3RyYXRlZ3k9PT0zP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0LHh0LGJ0LHp0LFV0PXJ0LndpbmRvdzs7KXtpZihydC5sb29rYWhlYWQ8PXEpe2lmKHl0KHJ0KSxydC5sb29rYWhlYWQ8PXEmJmd0PT09YilyZXR1cm4gZztpZihydC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHJ0Lm1hdGNoX2xlbmd0aD0wLHJ0Lmxvb2thaGVhZD49eiYmMDxydC5zdHJzdGFydCYmKHh0PVV0W2J0PXJ0LnN0cnN0YXJ0LTFdKT09PVV0WysrYnRdJiZ4dD09PVV0WysrYnRdJiZ4dD09PVV0WysrYnRdKXt6dD1ydC5zdHJzdGFydCtxO2RvO3doaWxlKHh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJnh0PT09VXRbKytidF0mJmJ0PHp0KTtydC5tYXRjaF9sZW5ndGg9cS0oenQtYnQpLHJ0Lm1hdGNoX2xlbmd0aD5ydC5sb29rYWhlYWQmJihydC5tYXRjaF9sZW5ndGg9cnQubG9va2FoZWFkKX1pZihydC5tYXRjaF9sZW5ndGg+PXo/KEN0PWEuX3RyX3RhbGx5KHJ0LDEscnQubWF0Y2hfbGVuZ3RoLXopLHJ0Lmxvb2thaGVhZC09cnQubWF0Y2hfbGVuZ3RoLHJ0LnN0cnN0YXJ0Kz1ydC5tYXRjaF9sZW5ndGgscnQubWF0Y2hfbGVuZ3RoPTApOihDdD1hLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyspLEN0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gZ31yZXR1cm4gcnQuaW5zZXJ0PTAsZ3Q9PT1tPyhHKHJ0LCEwKSxydC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTpydC5sYXN0X2xpdCYmKEcocnQsITEpLHJ0LnN0cm0uYXZhaWxfb3V0PT09MCk/ZzpffShILHV0KTpuW0gubGV2ZWxdLmZ1bmMoSCx1dCk7aWYobXQhPT1TJiZtdCE9PU58fChILnN0YXR1cz02NjYpLG10PT09Z3x8bXQ9PT1TKXJldHVybiBELmF2YWlsX291dD09PTAmJihILmxhc3RfZmx1c2g9LTEpLHk7aWYobXQ9PT1fJiYodXQ9PT0xP2EuX3RyX2FsaWduKEgpOnV0IT09NSYmKGEuX3RyX3N0b3JlZF9ibG9jayhILDAsMCwhMSksdXQ9PT0zJiYoWChILmhlYWQpLEgubG9va2FoZWFkPT09MCYmKEguc3Ryc3RhcnQ9MCxILmJsb2NrX3N0YXJ0PTAsSC5pbnNlcnQ9MCkpKSxqKEQpLEQuYXZhaWxfb3V0PT09MCkpcmV0dXJuIEgubGFzdF9mbHVzaD0tMSx5fXJldHVybiB1dCE9PW0/eTpILndyYXA8PTA/MTooSC53cmFwPT09Mj8oYXQoSCwyNTUmRC5hZGxlciksYXQoSCxELmFkbGVyPj44JjI1NSksYXQoSCxELmFkbGVyPj4xNiYyNTUpLGF0KEgsRC5hZGxlcj4+MjQmMjU1KSxhdChILDI1NSZELnRvdGFsX2luKSxhdChILEQudG90YWxfaW4+PjgmMjU1KSxhdChILEQudG90YWxfaW4+PjE2JjI1NSksYXQoSCxELnRvdGFsX2luPj4yNCYyNTUpKTooSihILEQuYWRsZXI+Pj4xNiksSihILDY1NTM1JkQuYWRsZXIpKSxqKEQpLDA8SC53cmFwJiYoSC53cmFwPS1ILndyYXApLEgucGVuZGluZyE9PTA/eToxKX0sci5kZWZsYXRlRW5kPWZ1bmN0aW9uKEQpe3ZhciB1dDtyZXR1cm4gRCYmRC5zdGF0ZT8odXQ9RC5zdGF0ZS5zdGF0dXMpIT09TyYmdXQhPT02OSYmdXQhPT03MyYmdXQhPT05MSYmdXQhPT0xMDMmJnV0IT09WiYmdXQhPT02NjY/UihELFQpOihELnN0YXRlPW51bGwsdXQ9PT1aP1IoRCwtMyk6eSk6VH0sci5kZWZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbihELHV0KXt2YXIgb3QsSCxNLFkscHQsbXQscnQsZ3QsQ3Q9dXQubGVuZ3RoO2lmKCFEfHwhRC5zdGF0ZXx8KFk9KG90PUQuc3RhdGUpLndyYXApPT09Mnx8WT09PTEmJm90LnN0YXR1cyE9PU98fG90Lmxvb2thaGVhZClyZXR1cm4gVDtmb3IoWT09PTEmJihELmFkbGVyPWwoRC5hZGxlcix1dCxDdCwwKSksb3Qud3JhcD0wLEN0Pj1vdC53X3NpemUmJihZPT09MCYmKFgob3QuaGVhZCksb3Quc3Ryc3RhcnQ9MCxvdC5ibG9ja19zdGFydD0wLG90Lmluc2VydD0wKSxndD1uZXcgcy5CdWY4KG90Lndfc2l6ZSkscy5hcnJheVNldChndCx1dCxDdC1vdC53X3NpemUsb3Qud19zaXplLDApLHV0PWd0LEN0PW90Lndfc2l6ZSkscHQ9RC5hdmFpbF9pbixtdD1ELm5leHRfaW4scnQ9RC5pbnB1dCxELmF2YWlsX2luPUN0LEQubmV4dF9pbj0wLEQuaW5wdXQ9dXQseXQob3QpO290Lmxvb2thaGVhZD49ejspe2ZvcihIPW90LnN0cnN0YXJ0LE09b3QubG9va2FoZWFkLSh6LTEpO290Lmluc19oPShvdC5pbnNfaDw8b3QuaGFzaF9zaGlmdF5vdC53aW5kb3dbSCt6LTFdKSZvdC5oYXNoX21hc2ssb3QucHJldltIJm90LndfbWFza109b3QuaGVhZFtvdC5pbnNfaF0sb3QuaGVhZFtvdC5pbnNfaF09SCxIKyssLS1NOyk7b3Quc3Ryc3RhcnQ9SCxvdC5sb29rYWhlYWQ9ei0xLHl0KG90KX1yZXR1cm4gb3Quc3Ryc3RhcnQrPW90Lmxvb2thaGVhZCxvdC5ibG9ja19zdGFydD1vdC5zdHJzdGFydCxvdC5pbnNlcnQ9b3QubG9va2FoZWFkLG90Lmxvb2thaGVhZD0wLG90Lm1hdGNoX2xlbmd0aD1vdC5wcmV2X2xlbmd0aD16LTEsb3QubWF0Y2hfYXZhaWxhYmxlPTAsRC5uZXh0X2luPW10LEQuaW5wdXQ9cnQsRC5hdmFpbF9pbj1wdCxvdC53cmFwPVkseX0sci5kZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHsiLi4vdXRpbHMvY29tbW9uIjo0MSwiLi9hZGxlcjMyIjo0MywiLi9jcmMzMiI6NDUsIi4vbWVzc2FnZXMiOjUxLCIuL3RyZWVzIjo1Mn1dLDQ3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfX0se31dLDQ4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihuLHMpe3ZhciBhLGwsYyxwLGIsbSx5LFQsdyxrLFAsRixoLG8sZixDLEIsdSx6LHEsZXQsTyxaLGcsXzthPW4uc3RhdGUsbD1uLm5leHRfaW4sZz1uLmlucHV0LGM9bCsobi5hdmFpbF9pbi01KSxwPW4ubmV4dF9vdXQsXz1uLm91dHB1dCxiPXAtKHMtbi5hdmFpbF9vdXQpLG09cCsobi5hdmFpbF9vdXQtMjU3KSx5PWEuZG1heCxUPWEud3NpemUsdz1hLndoYXZlLGs9YS53bmV4dCxQPWEud2luZG93LEY9YS5ob2xkLGg9YS5iaXRzLG89YS5sZW5jb2RlLGY9YS5kaXN0Y29kZSxDPSgxPDxhLmxlbmJpdHMpLTEsQj0oMTw8YS5kaXN0Yml0cyktMTt0OmRve2g8MTUmJihGKz1nW2wrK108PGgsaCs9OCxGKz1nW2wrK108PGgsaCs9OCksdT1vW0YmQ107ZTpmb3IoOzspe2lmKEY+Pj49ej11Pj4+MjQsaC09eiwoej11Pj4+MTYmMjU1KT09PTApX1twKytdPTY1NTM1JnU7ZWxzZXtpZighKDE2JnopKXtpZighKDY0JnopKXt1PW9bKDY1NTM1JnUpKyhGJigxPDx6KS0xKV07Y29udGludWUgZX1pZigzMiZ6KXthLm1vZGU9MTI7YnJlYWsgdH1uLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixhLm1vZGU9MzA7YnJlYWsgdH1xPTY1NTM1JnUsKHomPTE1KSYmKGg8eiYmKEYrPWdbbCsrXTw8aCxoKz04KSxxKz1GJigxPDx6KS0xLEY+Pj49eixoLT16KSxoPDE1JiYoRis9Z1tsKytdPDxoLGgrPTgsRis9Z1tsKytdPDxoLGgrPTgpLHU9ZltGJkJdO3I6Zm9yKDs7KXtpZihGPj4+PXo9dT4+PjI0LGgtPXosISgxNiYoej11Pj4+MTYmMjU1KSkpe2lmKCEoNjQmeikpe3U9ZlsoNjU1MzUmdSkrKEYmKDE8PHopLTEpXTtjb250aW51ZSByfW4ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLGEubW9kZT0zMDticmVhayB0fWlmKGV0PTY1NTM1JnUsaDwoeiY9MTUpJiYoRis9Z1tsKytdPDxoLChoKz04KTx6JiYoRis9Z1tsKytdPDxoLGgrPTgpKSx5PChldCs9RiYoMTw8eiktMSkpe24ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsYS5tb2RlPTMwO2JyZWFrIHR9aWYoRj4+Pj16LGgtPXosKHo9cC1iKTxldCl7aWYodzwoej1ldC16KSYmYS5zYW5lKXtuLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGEubW9kZT0zMDticmVhayB0fWlmKFo9UCwoTz0wKT09PWspe2lmKE8rPVQteix6PHEpe2ZvcihxLT16O19bcCsrXT1QW08rK10sLS16Oyk7Tz1wLWV0LFo9X319ZWxzZSBpZihrPHope2lmKE8rPVQray16LCh6LT1rKTxxKXtmb3IocS09ejtfW3ArK109UFtPKytdLC0tejspO2lmKE89MCxrPHEpe2ZvcihxLT16PWs7X1twKytdPVBbTysrXSwtLXo7KTtPPXAtZXQsWj1ffX19ZWxzZSBpZihPKz1rLXosejxxKXtmb3IocS09ejtfW3ArK109UFtPKytdLC0tejspO089cC1ldCxaPV99Zm9yKDsyPHE7KV9bcCsrXT1aW08rK10sX1twKytdPVpbTysrXSxfW3ArK109WltPKytdLHEtPTM7cSYmKF9bcCsrXT1aW08rK10sMTxxJiYoX1twKytdPVpbTysrXSkpfWVsc2V7Zm9yKE89cC1ldDtfW3ArK109X1tPKytdLF9bcCsrXT1fW08rK10sX1twKytdPV9bTysrXSwyPChxLT0zKTspO3EmJihfW3ArK109X1tPKytdLDE8cSYmKF9bcCsrXT1fW08rK10pKX1icmVha319YnJlYWt9fXdoaWxlKGw8YyYmcDxtKTtsLT1xPWg+PjMsRiY9KDE8PChoLT1xPDwzKSktMSxuLm5leHRfaW49bCxuLm5leHRfb3V0PXAsbi5hdmFpbF9pbj1sPGM/Yy1sKzU6NS0obC1jKSxuLmF2YWlsX291dD1wPG0/bS1wKzI1NzoyNTctKHAtbSksYS5ob2xkPUYsYS5iaXRzPWh9fSx7fV0sNDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMvY29tbW9uIikscz10KCIuL2FkbGVyMzIiKSxhPXQoIi4vY3JjMzIiKSxsPXQoIi4vaW5mZmFzdCIpLGM9dCgiLi9pbmZ0cmVlcyIpLHA9MSxiPTIsbT0wLHk9LTIsVD0xLHc9ODUyLGs9NTkyO2Z1bmN0aW9uIFAoTyl7cmV0dXJuKE8+Pj4yNCYyNTUpKyhPPj4+OCY2NTI4MCkrKCg2NTI4MCZPKTw8OCkrKCgyNTUmTyk8PDI0KX1mdW5jdGlvbiBGKCl7dGhpcy5tb2RlPTAsdGhpcy5sYXN0PSExLHRoaXMud3JhcD0wLHRoaXMuaGF2ZWRpY3Q9ITEsdGhpcy5mbGFncz0wLHRoaXMuZG1heD0wLHRoaXMuY2hlY2s9MCx0aGlzLnRvdGFsPTAsdGhpcy5oZWFkPW51bGwsdGhpcy53Yml0cz0wLHRoaXMud3NpemU9MCx0aGlzLndoYXZlPTAsdGhpcy53bmV4dD0wLHRoaXMud2luZG93PW51bGwsdGhpcy5ob2xkPTAsdGhpcy5iaXRzPTAsdGhpcy5sZW5ndGg9MCx0aGlzLm9mZnNldD0wLHRoaXMuZXh0cmE9MCx0aGlzLmxlbmNvZGU9bnVsbCx0aGlzLmRpc3Rjb2RlPW51bGwsdGhpcy5sZW5iaXRzPTAsdGhpcy5kaXN0Yml0cz0wLHRoaXMubmNvZGU9MCx0aGlzLm5sZW49MCx0aGlzLm5kaXN0PTAsdGhpcy5oYXZlPTAsdGhpcy5uZXh0PW51bGwsdGhpcy5sZW5zPW5ldyBuLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBuLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIGgoTyl7dmFyIFo7cmV0dXJuIE8mJk8uc3RhdGU/KFo9Ty5zdGF0ZSxPLnRvdGFsX2luPU8udG90YWxfb3V0PVoudG90YWw9MCxPLm1zZz0iIixaLndyYXAmJihPLmFkbGVyPTEmWi53cmFwKSxaLm1vZGU9VCxaLmxhc3Q9MCxaLmhhdmVkaWN0PTAsWi5kbWF4PTMyNzY4LFouaGVhZD1udWxsLFouaG9sZD0wLFouYml0cz0wLFoubGVuY29kZT1aLmxlbmR5bj1uZXcgbi5CdWYzMih3KSxaLmRpc3Rjb2RlPVouZGlzdGR5bj1uZXcgbi5CdWYzMihrKSxaLnNhbmU9MSxaLmJhY2s9LTEsbSk6eX1mdW5jdGlvbiBvKE8pe3ZhciBaO3JldHVybiBPJiZPLnN0YXRlPygoWj1PLnN0YXRlKS53c2l6ZT0wLFoud2hhdmU9MCxaLnduZXh0PTAsaChPKSk6eX1mdW5jdGlvbiBmKE8sWil7dmFyIGcsXztyZXR1cm4gTyYmTy5zdGF0ZT8oXz1PLnN0YXRlLFo8MD8oZz0wLFo9LVopOihnPTErKFo+PjQpLFo8NDgmJihaJj0xNSkpLFomJihaPDh8fDE1PFopP3k6KF8ud2luZG93IT09bnVsbCYmXy53Yml0cyE9PVomJihfLndpbmRvdz1udWxsKSxfLndyYXA9ZyxfLndiaXRzPVosbyhPKSkpOnl9ZnVuY3Rpb24gQyhPLFope3ZhciBnLF87cmV0dXJuIE8/KF89bmV3IEYsKE8uc3RhdGU9Xykud2luZG93PW51bGwsKGc9ZihPLFopKSE9PW0mJihPLnN0YXRlPW51bGwpLGcpOnl9dmFyIEIsdSx6PSEwO2Z1bmN0aW9uIHEoTyl7aWYoeil7dmFyIFo7Zm9yKEI9bmV3IG4uQnVmMzIoNTEyKSx1PW5ldyBuLkJ1ZjMyKDMyKSxaPTA7WjwxNDQ7KU8ubGVuc1taKytdPTg7Zm9yKDtaPDI1NjspTy5sZW5zW1orK109OTtmb3IoO1o8MjgwOylPLmxlbnNbWisrXT03O2Zvcig7WjwyODg7KU8ubGVuc1taKytdPTg7Zm9yKGMocCxPLmxlbnMsMCwyODgsQiwwLE8ud29yayx7Yml0czo5fSksWj0wO1o8MzI7KU8ubGVuc1taKytdPTU7YyhiLE8ubGVucywwLDMyLHUsMCxPLndvcmsse2JpdHM6NX0pLHo9ITF9Ty5sZW5jb2RlPUIsTy5sZW5iaXRzPTksTy5kaXN0Y29kZT11LE8uZGlzdGJpdHM9NX1mdW5jdGlvbiBldChPLFosZyxfKXt2YXIgUyxOPU8uc3RhdGU7cmV0dXJuIE4ud2luZG93PT09bnVsbCYmKE4ud3NpemU9MTw8Ti53Yml0cyxOLnduZXh0PTAsTi53aGF2ZT0wLE4ud2luZG93PW5ldyBuLkJ1ZjgoTi53c2l6ZSkpLF8+PU4ud3NpemU/KG4uYXJyYXlTZXQoTi53aW5kb3csWixnLU4ud3NpemUsTi53c2l6ZSwwKSxOLnduZXh0PTAsTi53aGF2ZT1OLndzaXplKTooXzwoUz1OLndzaXplLU4ud25leHQpJiYoUz1fKSxuLmFycmF5U2V0KE4ud2luZG93LFosZy1fLFMsTi53bmV4dCksKF8tPVMpPyhuLmFycmF5U2V0KE4ud2luZG93LFosZy1fLF8sMCksTi53bmV4dD1fLE4ud2hhdmU9Ti53c2l6ZSk6KE4ud25leHQrPVMsTi53bmV4dD09PU4ud3NpemUmJihOLnduZXh0PTApLE4ud2hhdmU8Ti53c2l6ZSYmKE4ud2hhdmUrPVMpKSksMH1yLmluZmxhdGVSZXNldD1vLHIuaW5mbGF0ZVJlc2V0Mj1mLHIuaW5mbGF0ZVJlc2V0S2VlcD1oLHIuaW5mbGF0ZUluaXQ9ZnVuY3Rpb24oTyl7cmV0dXJuIEMoTywxNSl9LHIuaW5mbGF0ZUluaXQyPUMsci5pbmZsYXRlPWZ1bmN0aW9uKE8sWil7dmFyIGcsXyxTLE4sUixMLFgsaixHLGF0LEosdHQseXQsVHQsQXQsa3QsTHQsQnQsJHQsS3QsRCx1dCxvdCxILE09MCxZPW5ldyBuLkJ1ZjgoNCkscHQ9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO2lmKCFPfHwhTy5zdGF0ZXx8IU8ub3V0cHV0fHwhTy5pbnB1dCYmTy5hdmFpbF9pbiE9PTApcmV0dXJuIHk7KGc9Ty5zdGF0ZSkubW9kZT09PTEyJiYoZy5tb2RlPTEzKSxSPU8ubmV4dF9vdXQsUz1PLm91dHB1dCxYPU8uYXZhaWxfb3V0LE49Ty5uZXh0X2luLF89Ty5pbnB1dCxMPU8uYXZhaWxfaW4saj1nLmhvbGQsRz1nLmJpdHMsYXQ9TCxKPVgsdXQ9bTt0OmZvcig7Oylzd2l0Y2goZy5tb2RlKXtjYXNlIFQ6aWYoZy53cmFwPT09MCl7Zy5tb2RlPTEzO2JyZWFrfWZvcig7RzwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWlmKDImZy53cmFwJiZqPT09MzU2MTUpe1lbZy5jaGVjaz0wXT0yNTUmaixZWzFdPWo+Pj44JjI1NSxnLmNoZWNrPWEoZy5jaGVjayxZLDIsMCksRz1qPTAsZy5tb2RlPTI7YnJlYWt9aWYoZy5mbGFncz0wLGcuaGVhZCYmKGcuaGVhZC5kb25lPSExKSwhKDEmZy53cmFwKXx8KCgoMjU1JmopPDw4KSsoaj4+OCkpJTMxKXtPLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsZy5tb2RlPTMwO2JyZWFrfWlmKCgxNSZqKSE9OCl7Ty5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixnLm1vZGU9MzA7YnJlYWt9aWYoRy09NCxEPTgrKDE1JihqPj4+PTQpKSxnLndiaXRzPT09MClnLndiaXRzPUQ7ZWxzZSBpZihEPmcud2JpdHMpe08ubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixnLm1vZGU9MzA7YnJlYWt9Zy5kbWF4PTE8PEQsTy5hZGxlcj1nLmNoZWNrPTEsZy5tb2RlPTUxMiZqPzEwOjEyLEc9aj0wO2JyZWFrO2Nhc2UgMjpmb3IoO0c8MTY7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1pZihnLmZsYWdzPWosKDI1NSZnLmZsYWdzKSE9OCl7Ty5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixnLm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmZy5mbGFncyl7Ty5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsZy5tb2RlPTMwO2JyZWFrfWcuaGVhZCYmKGcuaGVhZC50ZXh0PWo+PjgmMSksNTEyJmcuZmxhZ3MmJihZWzBdPTI1NSZqLFlbMV09aj4+PjgmMjU1LGcuY2hlY2s9YShnLmNoZWNrLFksMiwwKSksRz1qPTAsZy5tb2RlPTM7Y2FzZSAzOmZvcig7RzwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWcuaGVhZCYmKGcuaGVhZC50aW1lPWopLDUxMiZnLmZsYWdzJiYoWVswXT0yNTUmaixZWzFdPWo+Pj44JjI1NSxZWzJdPWo+Pj4xNiYyNTUsWVszXT1qPj4+MjQmMjU1LGcuY2hlY2s9YShnLmNoZWNrLFksNCwwKSksRz1qPTAsZy5tb2RlPTQ7Y2FzZSA0OmZvcig7RzwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWcuaGVhZCYmKGcuaGVhZC54ZmxhZ3M9MjU1JmosZy5oZWFkLm9zPWo+PjgpLDUxMiZnLmZsYWdzJiYoWVswXT0yNTUmaixZWzFdPWo+Pj44JjI1NSxnLmNoZWNrPWEoZy5jaGVjayxZLDIsMCkpLEc9aj0wLGcubW9kZT01O2Nhc2UgNTppZigxMDI0JmcuZmxhZ3Mpe2Zvcig7RzwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWcubGVuZ3RoPWosZy5oZWFkJiYoZy5oZWFkLmV4dHJhX2xlbj1qKSw1MTImZy5mbGFncyYmKFlbMF09MjU1JmosWVsxXT1qPj4+OCYyNTUsZy5jaGVjaz1hKGcuY2hlY2ssWSwyLDApKSxHPWo9MH1lbHNlIGcuaGVhZCYmKGcuaGVhZC5leHRyYT1udWxsKTtnLm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZnLmZsYWdzJiYoTDwodHQ9Zy5sZW5ndGgpJiYodHQ9TCksdHQmJihnLmhlYWQmJihEPWcuaGVhZC5leHRyYV9sZW4tZy5sZW5ndGgsZy5oZWFkLmV4dHJhfHwoZy5oZWFkLmV4dHJhPW5ldyBBcnJheShnLmhlYWQuZXh0cmFfbGVuKSksbi5hcnJheVNldChnLmhlYWQuZXh0cmEsXyxOLHR0LEQpKSw1MTImZy5mbGFncyYmKGcuY2hlY2s9YShnLmNoZWNrLF8sdHQsTikpLEwtPXR0LE4rPXR0LGcubGVuZ3RoLT10dCksZy5sZW5ndGgpKWJyZWFrIHQ7Zy5sZW5ndGg9MCxnLm1vZGU9NztjYXNlIDc6aWYoMjA0OCZnLmZsYWdzKXtpZihMPT09MClicmVhayB0O2Zvcih0dD0wO0Q9X1tOK3R0KytdLGcuaGVhZCYmRCYmZy5sZW5ndGg8NjU1MzYmJihnLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmdHQ8TDspO2lmKDUxMiZnLmZsYWdzJiYoZy5jaGVjaz1hKGcuY2hlY2ssXyx0dCxOKSksTC09dHQsTis9dHQsRClicmVhayB0fWVsc2UgZy5oZWFkJiYoZy5oZWFkLm5hbWU9bnVsbCk7Zy5sZW5ndGg9MCxnLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZnLmZsYWdzKXtpZihMPT09MClicmVhayB0O2Zvcih0dD0wO0Q9X1tOK3R0KytdLGcuaGVhZCYmRCYmZy5sZW5ndGg8NjU1MzYmJihnLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmdHQ8TDspO2lmKDUxMiZnLmZsYWdzJiYoZy5jaGVjaz1hKGcuY2hlY2ssXyx0dCxOKSksTC09dHQsTis9dHQsRClicmVhayB0fWVsc2UgZy5oZWFkJiYoZy5oZWFkLmNvbW1lbnQ9bnVsbCk7Zy5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZnLmZsYWdzKXtmb3IoO0c8MTY7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1pZihqIT09KDY1NTM1JmcuY2hlY2spKXtPLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsZy5tb2RlPTMwO2JyZWFrfUc9aj0wfWcuaGVhZCYmKGcuaGVhZC5oY3JjPWcuZmxhZ3M+PjkmMSxnLmhlYWQuZG9uZT0hMCksTy5hZGxlcj1nLmNoZWNrPTAsZy5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtHPDMyOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9Ty5hZGxlcj1nLmNoZWNrPVAoaiksRz1qPTAsZy5tb2RlPTExO2Nhc2UgMTE6aWYoZy5oYXZlZGljdD09PTApcmV0dXJuIE8ubmV4dF9vdXQ9UixPLmF2YWlsX291dD1YLE8ubmV4dF9pbj1OLE8uYXZhaWxfaW49TCxnLmhvbGQ9aixnLmJpdHM9RywyO08uYWRsZXI9Zy5jaGVjaz0xLGcubW9kZT0xMjtjYXNlIDEyOmlmKFo9PT01fHxaPT09NilicmVhayB0O2Nhc2UgMTM6aWYoZy5sYXN0KXtqPj4+PTcmRyxHLT03JkcsZy5tb2RlPTI3O2JyZWFrfWZvcig7RzwzOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9c3dpdGNoKGcubGFzdD0xJmosRy09MSwzJihqPj4+PTEpKXtjYXNlIDA6Zy5tb2RlPTE0O2JyZWFrO2Nhc2UgMTppZihxKGcpLGcubW9kZT0yMCxaIT09NilicmVhaztqPj4+PTIsRy09MjticmVhayB0O2Nhc2UgMjpnLm1vZGU9MTc7YnJlYWs7Y2FzZSAzOk8ubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLGcubW9kZT0zMH1qPj4+PTIsRy09MjticmVhaztjYXNlIDE0OmZvcihqPj4+PTcmRyxHLT03Jkc7RzwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWlmKCg2NTUzNSZqKSE9KGo+Pj4xNl42NTUzNSkpe08ubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixnLm1vZGU9MzA7YnJlYWt9aWYoZy5sZW5ndGg9NjU1MzUmaixHPWo9MCxnLm1vZGU9MTUsWj09PTYpYnJlYWsgdDtjYXNlIDE1OmcubW9kZT0xNjtjYXNlIDE2OmlmKHR0PWcubGVuZ3RoKXtpZihMPHR0JiYodHQ9TCksWDx0dCYmKHR0PVgpLHR0PT09MClicmVhayB0O24uYXJyYXlTZXQoUyxfLE4sdHQsUiksTC09dHQsTis9dHQsWC09dHQsUis9dHQsZy5sZW5ndGgtPXR0O2JyZWFrfWcubW9kZT0xMjticmVhaztjYXNlIDE3OmZvcig7RzwxNDspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWlmKGcubmxlbj0yNTcrKDMxJmopLGo+Pj49NSxHLT01LGcubmRpc3Q9MSsoMzEmaiksaj4+Pj01LEctPTUsZy5uY29kZT00KygxNSZqKSxqPj4+PTQsRy09NCwyODY8Zy5ubGVufHwzMDxnLm5kaXN0KXtPLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLGcubW9kZT0zMDticmVha31nLmhhdmU9MCxnLm1vZGU9MTg7Y2FzZSAxODpmb3IoO2cuaGF2ZTxnLm5jb2RlOyl7Zm9yKDtHPDM7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1nLmxlbnNbcHRbZy5oYXZlKytdXT03Jmosaj4+Pj0zLEctPTN9Zm9yKDtnLmhhdmU8MTk7KWcubGVuc1twdFtnLmhhdmUrK11dPTA7aWYoZy5sZW5jb2RlPWcubGVuZHluLGcubGVuYml0cz03LG90PXtiaXRzOmcubGVuYml0c30sdXQ9YygwLGcubGVucywwLDE5LGcubGVuY29kZSwwLGcud29yayxvdCksZy5sZW5iaXRzPW90LmJpdHMsdXQpe08ubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLGcubW9kZT0zMDticmVha31nLmhhdmU9MCxnLm1vZGU9MTk7Y2FzZSAxOTpmb3IoO2cuaGF2ZTxnLm5sZW4rZy5uZGlzdDspe2Zvcig7a3Q9KE09Zy5sZW5jb2RlW2omKDE8PGcubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1Jk0sISgoQXQ9TT4+PjI0KTw9Ryk7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1pZihMdDwxNilqPj4+PUF0LEctPUF0LGcubGVuc1tnLmhhdmUrK109THQ7ZWxzZXtpZihMdD09PTE2KXtmb3IoSD1BdCsyO0c8SDspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWlmKGo+Pj49QXQsRy09QXQsZy5oYXZlPT09MCl7Ty5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLGcubW9kZT0zMDticmVha31EPWcubGVuc1tnLmhhdmUtMV0sdHQ9MysoMyZqKSxqPj4+PTIsRy09Mn1lbHNlIGlmKEx0PT09MTcpe2ZvcihIPUF0KzM7RzxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9Ry09QXQsRD0wLHR0PTMrKDcmKGo+Pj49QXQpKSxqPj4+PTMsRy09M31lbHNle2ZvcihIPUF0Kzc7RzxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9Ry09QXQsRD0wLHR0PTExKygxMjcmKGo+Pj49QXQpKSxqPj4+PTcsRy09N31pZihnLmhhdmUrdHQ+Zy5ubGVuK2cubmRpc3Qpe08ubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixnLm1vZGU9MzA7YnJlYWt9Zm9yKDt0dC0tOylnLmxlbnNbZy5oYXZlKytdPUR9fWlmKGcubW9kZT09PTMwKWJyZWFrO2lmKGcubGVuc1syNTZdPT09MCl7Ty5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsZy5tb2RlPTMwO2JyZWFrfWlmKGcubGVuYml0cz05LG90PXtiaXRzOmcubGVuYml0c30sdXQ9YyhwLGcubGVucywwLGcubmxlbixnLmxlbmNvZGUsMCxnLndvcmssb3QpLGcubGVuYml0cz1vdC5iaXRzLHV0KXtPLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixnLm1vZGU9MzA7YnJlYWt9aWYoZy5kaXN0Yml0cz02LGcuZGlzdGNvZGU9Zy5kaXN0ZHluLG90PXtiaXRzOmcuZGlzdGJpdHN9LHV0PWMoYixnLmxlbnMsZy5ubGVuLGcubmRpc3QsZy5kaXN0Y29kZSwwLGcud29yayxvdCksZy5kaXN0Yml0cz1vdC5iaXRzLHV0KXtPLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixnLm1vZGU9MzA7YnJlYWt9aWYoZy5tb2RlPTIwLFo9PT02KWJyZWFrIHQ7Y2FzZSAyMDpnLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1MJiYyNTg8PVgpe08ubmV4dF9vdXQ9UixPLmF2YWlsX291dD1YLE8ubmV4dF9pbj1OLE8uYXZhaWxfaW49TCxnLmhvbGQ9aixnLmJpdHM9RyxsKE8sSiksUj1PLm5leHRfb3V0LFM9Ty5vdXRwdXQsWD1PLmF2YWlsX291dCxOPU8ubmV4dF9pbixfPU8uaW5wdXQsTD1PLmF2YWlsX2luLGo9Zy5ob2xkLEc9Zy5iaXRzLGcubW9kZT09PTEyJiYoZy5iYWNrPS0xKTticmVha31mb3IoZy5iYWNrPTA7a3Q9KE09Zy5sZW5jb2RlW2omKDE8PGcubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1Jk0sISgoQXQ9TT4+PjI0KTw9Ryk7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1pZihrdCYmISgyNDAma3QpKXtmb3IoQnQ9QXQsJHQ9a3QsS3Q9THQ7a3Q9KE09Zy5sZW5jb2RlW0t0KygoaiYoMTw8QnQrJHQpLTEpPj5CdCldKT4+PjE2JjI1NSxMdD02NTUzNSZNLCEoQnQrKEF0PU0+Pj4yNCk8PUcpOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9aj4+Pj1CdCxHLT1CdCxnLmJhY2srPUJ0fWlmKGo+Pj49QXQsRy09QXQsZy5iYWNrKz1BdCxnLmxlbmd0aD1MdCxrdD09PTApe2cubW9kZT0yNjticmVha31pZigzMiZrdCl7Zy5iYWNrPS0xLGcubW9kZT0xMjticmVha31pZig2NCZrdCl7Ty5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsZy5tb2RlPTMwO2JyZWFrfWcuZXh0cmE9MTUma3QsZy5tb2RlPTIyO2Nhc2UgMjI6aWYoZy5leHRyYSl7Zm9yKEg9Zy5leHRyYTtHPEg7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PEcsRys9OH1nLmxlbmd0aCs9aiYoMTw8Zy5leHRyYSktMSxqPj4+PWcuZXh0cmEsRy09Zy5leHRyYSxnLmJhY2srPWcuZXh0cmF9Zy53YXM9Zy5sZW5ndGgsZy5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDtrdD0oTT1nLmRpc3Rjb2RlW2omKDE8PGcuZGlzdGJpdHMpLTFdKT4+PjE2JjI1NSxMdD02NTUzNSZNLCEoKEF0PU0+Pj4yNCk8PUcpOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9aWYoISgyNDAma3QpKXtmb3IoQnQ9QXQsJHQ9a3QsS3Q9THQ7a3Q9KE09Zy5kaXN0Y29kZVtLdCsoKGomKDE8PEJ0KyR0KS0xKT4+QnQpXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmTSwhKEJ0KyhBdD1NPj4+MjQpPD1HKTspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWo+Pj49QnQsRy09QnQsZy5iYWNrKz1CdH1pZihqPj4+PUF0LEctPUF0LGcuYmFjays9QXQsNjQma3Qpe08ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLGcubW9kZT0zMDticmVha31nLm9mZnNldD1MdCxnLmV4dHJhPTE1Jmt0LGcubW9kZT0yNDtjYXNlIDI0OmlmKGcuZXh0cmEpe2ZvcihIPWcuZXh0cmE7RzxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxHLEcrPTh9Zy5vZmZzZXQrPWomKDE8PGcuZXh0cmEpLTEsaj4+Pj1nLmV4dHJhLEctPWcuZXh0cmEsZy5iYWNrKz1nLmV4dHJhfWlmKGcub2Zmc2V0PmcuZG1heCl7Ty5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixnLm1vZGU9MzA7YnJlYWt9Zy5tb2RlPTI1O2Nhc2UgMjU6aWYoWD09PTApYnJlYWsgdDtpZih0dD1KLVgsZy5vZmZzZXQ+dHQpe2lmKCh0dD1nLm9mZnNldC10dCk+Zy53aGF2ZSYmZy5zYW5lKXtPLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGcubW9kZT0zMDticmVha315dD10dD5nLnduZXh0Pyh0dC09Zy53bmV4dCxnLndzaXplLXR0KTpnLnduZXh0LXR0LHR0PmcubGVuZ3RoJiYodHQ9Zy5sZW5ndGgpLFR0PWcud2luZG93fWVsc2UgVHQ9Uyx5dD1SLWcub2Zmc2V0LHR0PWcubGVuZ3RoO2ZvcihYPHR0JiYodHQ9WCksWC09dHQsZy5sZW5ndGgtPXR0O1NbUisrXT1UdFt5dCsrXSwtLXR0Oyk7Zy5sZW5ndGg9PT0wJiYoZy5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKFg9PT0wKWJyZWFrIHQ7U1tSKytdPWcubGVuZ3RoLFgtLSxnLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihnLndyYXApe2Zvcig7RzwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGp8PV9bTisrXTw8RyxHKz04fWlmKEotPVgsTy50b3RhbF9vdXQrPUosZy50b3RhbCs9SixKJiYoTy5hZGxlcj1nLmNoZWNrPWcuZmxhZ3M/YShnLmNoZWNrLFMsSixSLUopOnMoZy5jaGVjayxTLEosUi1KKSksSj1YLChnLmZsYWdzP2o6UChqKSkhPT1nLmNoZWNrKXtPLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLGcubW9kZT0zMDticmVha31HPWo9MH1nLm1vZGU9Mjg7Y2FzZSAyODppZihnLndyYXAmJmcuZmxhZ3Mpe2Zvcig7RzwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8RyxHKz04fWlmKGohPT0oNDI5NDk2NzI5NSZnLnRvdGFsKSl7Ty5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLGcubW9kZT0zMDticmVha31HPWo9MH1nLm1vZGU9Mjk7Y2FzZSAyOTp1dD0xO2JyZWFrIHQ7Y2FzZSAzMDp1dD0tMzticmVhayB0O2Nhc2UgMzE6cmV0dXJuLTQ7Y2FzZSAzMjpkZWZhdWx0OnJldHVybiB5fXJldHVybiBPLm5leHRfb3V0PVIsTy5hdmFpbF9vdXQ9WCxPLm5leHRfaW49TixPLmF2YWlsX2luPUwsZy5ob2xkPWosZy5iaXRzPUcsKGcud3NpemV8fEohPT1PLmF2YWlsX291dCYmZy5tb2RlPDMwJiYoZy5tb2RlPDI3fHxaIT09NCkpJiZldChPLE8ub3V0cHV0LE8ubmV4dF9vdXQsSi1PLmF2YWlsX291dCk/KGcubW9kZT0zMSwtNCk6KGF0LT1PLmF2YWlsX2luLEotPU8uYXZhaWxfb3V0LE8udG90YWxfaW4rPWF0LE8udG90YWxfb3V0Kz1KLGcudG90YWwrPUosZy53cmFwJiZKJiYoTy5hZGxlcj1nLmNoZWNrPWcuZmxhZ3M/YShnLmNoZWNrLFMsSixPLm5leHRfb3V0LUopOnMoZy5jaGVjayxTLEosTy5uZXh0X291dC1KKSksTy5kYXRhX3R5cGU9Zy5iaXRzKyhnLmxhc3Q/NjQ6MCkrKGcubW9kZT09PTEyPzEyODowKSsoZy5tb2RlPT09MjB8fGcubW9kZT09PTE1PzI1NjowKSwoYXQ9PTAmJko9PT0wfHxaPT09NCkmJnV0PT09bSYmKHV0PS01KSx1dCl9LHIuaW5mbGF0ZUVuZD1mdW5jdGlvbihPKXtpZighT3x8IU8uc3RhdGUpcmV0dXJuIHk7dmFyIFo9Ty5zdGF0ZTtyZXR1cm4gWi53aW5kb3cmJihaLndpbmRvdz1udWxsKSxPLnN0YXRlPW51bGwsbX0sci5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKE8sWil7dmFyIGc7cmV0dXJuIE8mJk8uc3RhdGUmJjImKGc9Ty5zdGF0ZSkud3JhcD8oKGcuaGVhZD1aKS5kb25lPSExLG0pOnl9LHIuaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oTyxaKXt2YXIgZyxfPVoubGVuZ3RoO3JldHVybiBPJiZPLnN0YXRlPyhnPU8uc3RhdGUpLndyYXAhPT0wJiZnLm1vZGUhPT0xMT95OmcubW9kZT09PTExJiZzKDEsWixfLDApIT09Zy5jaGVjaz8tMzpldChPLFosXyxfKT8oZy5tb2RlPTMxLC00KTooZy5oYXZlZGljdD0xLG0pOnl9LHIuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDEsIi4vYWRsZXIzMiI6NDMsIi4vY3JjMzIiOjQ1LCIuL2luZmZhc3QiOjQ4LCIuL2luZnRyZWVzIjo1MH1dLDUwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzL2NvbW1vbiIpLHM9WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSxhPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sbD1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sYz1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdO2UuZXhwb3J0cz1mdW5jdGlvbihwLGIsbSx5LFQsdyxrLFApe3ZhciBGLGgsbyxmLEMsQix1LHoscSxldD1QLmJpdHMsTz0wLFo9MCxnPTAsXz0wLFM9MCxOPTAsUj0wLEw9MCxYPTAsaj0wLEc9bnVsbCxhdD0wLEo9bmV3IG4uQnVmMTYoMTYpLHR0PW5ldyBuLkJ1ZjE2KDE2KSx5dD1udWxsLFR0PTA7Zm9yKE89MDtPPD0xNTtPKyspSltPXT0wO2ZvcihaPTA7Wjx5O1orKylKW2JbbStaXV0rKztmb3IoUz1ldCxfPTE1OzE8PV8mJkpbX109PT0wO18tLSk7aWYoXzxTJiYoUz1fKSxfPT09MClyZXR1cm4gVFt3KytdPTIwOTcxNTIwLFRbdysrXT0yMDk3MTUyMCxQLmJpdHM9MSwwO2ZvcihnPTE7ZzxfJiZKW2ddPT09MDtnKyspO2ZvcihTPGcmJihTPWcpLE89TD0xO088PTE1O08rKylpZihMPDw9MSwoTC09SltPXSk8MClyZXR1cm4tMTtpZigwPEwmJihwPT09MHx8XyE9PTEpKXJldHVybi0xO2Zvcih0dFsxXT0wLE89MTtPPDE1O08rKyl0dFtPKzFdPXR0W09dK0pbT107Zm9yKFo9MDtaPHk7WisrKWJbbStaXSE9PTAmJihrW3R0W2JbbStaXV0rK109Wik7aWYoQj1wPT09MD8oRz15dD1rLDE5KTpwPT09MT8oRz1zLGF0LT0yNTcseXQ9YSxUdC09MjU3LDI1Nik6KEc9bCx5dD1jLC0xKSxPPWcsQz13LFI9Wj1qPTAsbz0tMSxmPShYPTE8PChOPVMpKS0xLHA9PT0xJiY4NTI8WHx8cD09PTImJjU5MjxYKXJldHVybiAxO2Zvcig7Oyl7Zm9yKHU9Ty1SLHE9a1taXTxCPyh6PTAsa1taXSk6a1taXT5CPyh6PXl0W1R0K2tbWl1dLEdbYXQra1taXV0pOih6PTk2LDApLEY9MTw8Ty1SLGc9aD0xPDxOO1RbQysoaj4+UikrKGgtPUYpXT11PDwyNHx6PDwxNnxxfDAsaCE9PTA7KTtmb3IoRj0xPDxPLTE7aiZGOylGPj49MTtpZihGIT09MD8oaiY9Ri0xLGorPUYpOmo9MCxaKyssLS1KW09dPT0wKXtpZihPPT09XylicmVhaztPPWJbbStrW1pdXX1pZihTPE8mJihqJmYpIT09byl7Zm9yKFI9PT0wJiYoUj1TKSxDKz1nLEw9MTw8KE49Ty1SKTtOK1I8XyYmISgoTC09SltOK1JdKTw9MCk7KU4rKyxMPDw9MTtpZihYKz0xPDxOLHA9PT0xJiY4NTI8WHx8cD09PTImJjU5MjxYKXJldHVybiAxO1Rbbz1qJmZdPVM8PDI0fE48PDE2fEMtd3wwfX1yZXR1cm4gaiE9PTAmJihUW0Mral09Ty1SPDwyNHw2NDw8MTZ8MCksUC5iaXRzPVMsMH19LHsiLi4vdXRpbHMvY29tbW9uIjo0MX1dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSx7fV0sNTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMvY29tbW9uIikscz0wLGE9MTtmdW5jdGlvbiBsKE0pe2Zvcih2YXIgWT1NLmxlbmd0aDswPD0tLVk7KU1bWV09MH12YXIgYz0wLHA9MjksYj0yNTYsbT1iKzErcCx5PTMwLFQ9MTksdz0yKm0rMSxrPTE1LFA9MTYsRj03LGg9MjU2LG89MTYsZj0xNyxDPTE4LEI9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sdT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sej1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10scT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sZXQ9bmV3IEFycmF5KDIqKG0rMikpO2woZXQpO3ZhciBPPW5ldyBBcnJheSgyKnkpO2woTyk7dmFyIFo9bmV3IEFycmF5KDUxMik7bChaKTt2YXIgZz1uZXcgQXJyYXkoMjU2KTtsKGcpO3ZhciBfPW5ldyBBcnJheShwKTtsKF8pO3ZhciBTLE4sUixMPW5ldyBBcnJheSh5KTtmdW5jdGlvbiBYKE0sWSxwdCxtdCxydCl7dGhpcy5zdGF0aWNfdHJlZT1NLHRoaXMuZXh0cmFfYml0cz1ZLHRoaXMuZXh0cmFfYmFzZT1wdCx0aGlzLmVsZW1zPW10LHRoaXMubWF4X2xlbmd0aD1ydCx0aGlzLmhhc19zdHJlZT1NJiZNLmxlbmd0aH1mdW5jdGlvbiBqKE0sWSl7dGhpcy5keW5fdHJlZT1NLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz1ZfWZ1bmN0aW9uIEcoTSl7cmV0dXJuIE08MjU2P1pbTV06WlsyNTYrKE0+Pj43KV19ZnVuY3Rpb24gYXQoTSxZKXtNLnBlbmRpbmdfYnVmW00ucGVuZGluZysrXT0yNTUmWSxNLnBlbmRpbmdfYnVmW00ucGVuZGluZysrXT1ZPj4+OCYyNTV9ZnVuY3Rpb24gSihNLFkscHQpe00uYmlfdmFsaWQ+UC1wdD8oTS5iaV9idWZ8PVk8PE0uYmlfdmFsaWQmNjU1MzUsYXQoTSxNLmJpX2J1ZiksTS5iaV9idWY9WT4+UC1NLmJpX3ZhbGlkLE0uYmlfdmFsaWQrPXB0LVApOihNLmJpX2J1Znw9WTw8TS5iaV92YWxpZCY2NTUzNSxNLmJpX3ZhbGlkKz1wdCl9ZnVuY3Rpb24gdHQoTSxZLHB0KXtKKE0scHRbMipZXSxwdFsyKlkrMV0pfWZ1bmN0aW9uIHl0KE0sWSl7Zm9yKHZhciBwdD0wO3B0fD0xJk0sTT4+Pj0xLHB0PDw9MSwwPC0tWTspO3JldHVybiBwdD4+PjF9ZnVuY3Rpb24gVHQoTSxZLHB0KXt2YXIgbXQscnQsZ3Q9bmV3IEFycmF5KGsrMSksQ3Q9MDtmb3IobXQ9MTttdDw9azttdCsrKWd0W210XT1DdD1DdCtwdFttdC0xXTw8MTtmb3IocnQ9MDtydDw9WTtydCsrKXt2YXIgeHQ9TVsyKnJ0KzFdO3h0IT09MCYmKE1bMipydF09eXQoZ3RbeHRdKysseHQpKX19ZnVuY3Rpb24gQXQoTSl7dmFyIFk7Zm9yKFk9MDtZPG07WSsrKU0uZHluX2x0cmVlWzIqWV09MDtmb3IoWT0wO1k8eTtZKyspTS5keW5fZHRyZWVbMipZXT0wO2ZvcihZPTA7WTxUO1krKylNLmJsX3RyZWVbMipZXT0wO00uZHluX2x0cmVlWzIqaF09MSxNLm9wdF9sZW49TS5zdGF0aWNfbGVuPTAsTS5sYXN0X2xpdD1NLm1hdGNoZXM9MH1mdW5jdGlvbiBrdChNKXs4PE0uYmlfdmFsaWQ/YXQoTSxNLmJpX2J1Zik6MDxNLmJpX3ZhbGlkJiYoTS5wZW5kaW5nX2J1ZltNLnBlbmRpbmcrK109TS5iaV9idWYpLE0uYmlfYnVmPTAsTS5iaV92YWxpZD0wfWZ1bmN0aW9uIEx0KE0sWSxwdCxtdCl7dmFyIHJ0PTIqWSxndD0yKnB0O3JldHVybiBNW3J0XTxNW2d0XXx8TVtydF09PT1NW2d0XSYmbXRbWV08PW10W3B0XX1mdW5jdGlvbiBCdChNLFkscHQpe2Zvcih2YXIgbXQ9TS5oZWFwW3B0XSxydD1wdDw8MTtydDw9TS5oZWFwX2xlbiYmKHJ0PE0uaGVhcF9sZW4mJkx0KFksTS5oZWFwW3J0KzFdLE0uaGVhcFtydF0sTS5kZXB0aCkmJnJ0KyssIUx0KFksbXQsTS5oZWFwW3J0XSxNLmRlcHRoKSk7KU0uaGVhcFtwdF09TS5oZWFwW3J0XSxwdD1ydCxydDw8PTE7TS5oZWFwW3B0XT1tdH1mdW5jdGlvbiAkdChNLFkscHQpe3ZhciBtdCxydCxndCxDdCx4dD0wO2lmKE0ubGFzdF9saXQhPT0wKWZvcig7bXQ9TS5wZW5kaW5nX2J1ZltNLmRfYnVmKzIqeHRdPDw4fE0ucGVuZGluZ19idWZbTS5kX2J1ZisyKnh0KzFdLHJ0PU0ucGVuZGluZ19idWZbTS5sX2J1Zit4dF0seHQrKyxtdD09PTA/dHQoTSxydCxZKToodHQoTSwoZ3Q9Z1tydF0pK2IrMSxZKSwoQ3Q9QltndF0pIT09MCYmSihNLHJ0LT1fW2d0XSxDdCksdHQoTSxndD1HKC0tbXQpLHB0KSwoQ3Q9dVtndF0pIT09MCYmSihNLG10LT1MW2d0XSxDdCkpLHh0PE0ubGFzdF9saXQ7KTt0dChNLGgsWSl9ZnVuY3Rpb24gS3QoTSxZKXt2YXIgcHQsbXQscnQsZ3Q9WS5keW5fdHJlZSxDdD1ZLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSx4dD1ZLnN0YXRfZGVzYy5oYXNfc3RyZWUsYnQ9WS5zdGF0X2Rlc2MuZWxlbXMsenQ9LTE7Zm9yKE0uaGVhcF9sZW49MCxNLmhlYXBfbWF4PXcscHQ9MDtwdDxidDtwdCsrKWd0WzIqcHRdIT09MD8oTS5oZWFwWysrTS5oZWFwX2xlbl09enQ9cHQsTS5kZXB0aFtwdF09MCk6Z3RbMipwdCsxXT0wO2Zvcig7TS5oZWFwX2xlbjwyOylndFsyKihydD1NLmhlYXBbKytNLmhlYXBfbGVuXT16dDwyPysrenQ6MCldPTEsTS5kZXB0aFtydF09MCxNLm9wdF9sZW4tLSx4dCYmKE0uc3RhdGljX2xlbi09Q3RbMipydCsxXSk7Zm9yKFkubWF4X2NvZGU9enQscHQ9TS5oZWFwX2xlbj4+MTsxPD1wdDtwdC0tKUJ0KE0sZ3QscHQpO2ZvcihydD1idDtwdD1NLmhlYXBbMV0sTS5oZWFwWzFdPU0uaGVhcFtNLmhlYXBfbGVuLS1dLEJ0KE0sZ3QsMSksbXQ9TS5oZWFwWzFdLE0uaGVhcFstLU0uaGVhcF9tYXhdPXB0LE0uaGVhcFstLU0uaGVhcF9tYXhdPW10LGd0WzIqcnRdPWd0WzIqcHRdK2d0WzIqbXRdLE0uZGVwdGhbcnRdPShNLmRlcHRoW3B0XT49TS5kZXB0aFttdF0/TS5kZXB0aFtwdF06TS5kZXB0aFttdF0pKzEsZ3RbMipwdCsxXT1ndFsyKm10KzFdPXJ0LE0uaGVhcFsxXT1ydCsrLEJ0KE0sZ3QsMSksMjw9TS5oZWFwX2xlbjspO00uaGVhcFstLU0uaGVhcF9tYXhdPU0uaGVhcFsxXSxmdW5jdGlvbihVdCxwZSl7dmFyIHNyLHdlLFllLHRlLGJlLE9lLGRlPXBlLmR5bl90cmVlLHRuPXBlLm1heF9jb2RlLGdyPXBlLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxlbj1wZS5zdGF0X2Rlc2MuaGFzX3N0cmVlLHJuPXBlLnN0YXRfZGVzYy5leHRyYV9iaXRzLG5uPXBlLnN0YXRfZGVzYy5leHRyYV9iYXNlLFRlPXBlLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLGplPTA7Zm9yKHRlPTA7dGU8PWs7dGUrKylVdC5ibF9jb3VudFt0ZV09MDtmb3IoZGVbMipVdC5oZWFwW1V0LmhlYXBfbWF4XSsxXT0wLHNyPVV0LmhlYXBfbWF4KzE7c3I8dztzcisrKVRlPCh0ZT1kZVsyKmRlWzIqKHdlPVV0LmhlYXBbc3JdKSsxXSsxXSsxKSYmKHRlPVRlLGplKyspLGRlWzIqd2UrMV09dGUsdG48d2V8fChVdC5ibF9jb3VudFt0ZV0rKyxiZT0wLG5uPD13ZSYmKGJlPXJuW3dlLW5uXSksT2U9ZGVbMip3ZV0sVXQub3B0X2xlbis9T2UqKHRlK2JlKSxlbiYmKFV0LnN0YXRpY19sZW4rPU9lKihnclsyKndlKzFdK2JlKSkpO2lmKGplIT09MCl7ZG97Zm9yKHRlPVRlLTE7VXQuYmxfY291bnRbdGVdPT09MDspdGUtLTtVdC5ibF9jb3VudFt0ZV0tLSxVdC5ibF9jb3VudFt0ZSsxXSs9MixVdC5ibF9jb3VudFtUZV0tLSxqZS09Mn13aGlsZSgwPGplKTtmb3IodGU9VGU7dGUhPT0wO3RlLS0pZm9yKHdlPVV0LmJsX2NvdW50W3RlXTt3ZSE9PTA7KXRuPChZZT1VdC5oZWFwWy0tc3JdKXx8KGRlWzIqWWUrMV0hPT10ZSYmKFV0Lm9wdF9sZW4rPSh0ZS1kZVsyKlllKzFdKSpkZVsyKlllXSxkZVsyKlllKzFdPXRlKSx3ZS0tKX19KE0sWSksVHQoZ3QsenQsTS5ibF9jb3VudCl9ZnVuY3Rpb24gRChNLFkscHQpe3ZhciBtdCxydCxndD0tMSxDdD1ZWzFdLHh0PTAsYnQ9Nyx6dD00O2ZvcihDdD09PTAmJihidD0xMzgsenQ9MyksWVsyKihwdCsxKSsxXT02NTUzNSxtdD0wO210PD1wdDttdCsrKXJ0PUN0LEN0PVlbMioobXQrMSkrMV0sKyt4dDxidCYmcnQ9PT1DdHx8KHh0PHp0P00uYmxfdHJlZVsyKnJ0XSs9eHQ6cnQhPT0wPyhydCE9PWd0JiZNLmJsX3RyZWVbMipydF0rKyxNLmJsX3RyZWVbMipvXSsrKTp4dDw9MTA/TS5ibF90cmVlWzIqZl0rKzpNLmJsX3RyZWVbMipDXSsrLGd0PXJ0LHp0PSh4dD0wKT09PUN0PyhidD0xMzgsMyk6cnQ9PT1DdD8oYnQ9NiwzKTooYnQ9Nyw0KSl9ZnVuY3Rpb24gdXQoTSxZLHB0KXt2YXIgbXQscnQsZ3Q9LTEsQ3Q9WVsxXSx4dD0wLGJ0PTcsenQ9NDtmb3IoQ3Q9PT0wJiYoYnQ9MTM4LHp0PTMpLG10PTA7bXQ8PXB0O210KyspaWYocnQ9Q3QsQ3Q9WVsyKihtdCsxKSsxXSwhKCsreHQ8YnQmJnJ0PT09Q3QpKXtpZih4dDx6dClmb3IoO3R0KE0scnQsTS5ibF90cmVlKSwtLXh0IT0wOyk7ZWxzZSBydCE9PTA/KHJ0IT09Z3QmJih0dChNLHJ0LE0uYmxfdHJlZSkseHQtLSksdHQoTSxvLE0uYmxfdHJlZSksSihNLHh0LTMsMikpOnh0PD0xMD8odHQoTSxmLE0uYmxfdHJlZSksSihNLHh0LTMsMykpOih0dChNLEMsTS5ibF90cmVlKSxKKE0seHQtMTEsNykpO2d0PXJ0LHp0PSh4dD0wKT09PUN0PyhidD0xMzgsMyk6cnQ9PT1DdD8oYnQ9NiwzKTooYnQ9Nyw0KX19bChMKTt2YXIgb3Q9ITE7ZnVuY3Rpb24gSChNLFkscHQsbXQpe0ooTSwoYzw8MSkrKG10PzE6MCksMyksZnVuY3Rpb24ocnQsZ3QsQ3QseHQpe2t0KHJ0KSx4dCYmKGF0KHJ0LEN0KSxhdChydCx+Q3QpKSxuLmFycmF5U2V0KHJ0LnBlbmRpbmdfYnVmLHJ0LndpbmRvdyxndCxDdCxydC5wZW5kaW5nKSxydC5wZW5kaW5nKz1DdH0oTSxZLHB0LCEwKX1yLl90cl9pbml0PWZ1bmN0aW9uKE0pe290fHwoZnVuY3Rpb24oKXt2YXIgWSxwdCxtdCxydCxndCxDdD1uZXcgQXJyYXkoaysxKTtmb3IocnQ9bXQ9MDtydDxwLTE7cnQrKylmb3IoX1tydF09bXQsWT0wO1k8MTw8QltydF07WSsrKWdbbXQrK109cnQ7Zm9yKGdbbXQtMV09cnQscnQ9Z3Q9MDtydDwxNjtydCsrKWZvcihMW3J0XT1ndCxZPTA7WTwxPDx1W3J0XTtZKyspWltndCsrXT1ydDtmb3IoZ3Q+Pj03O3J0PHk7cnQrKylmb3IoTFtydF09Z3Q8PDcsWT0wO1k8MTw8dVtydF0tNztZKyspWlsyNTYrZ3QrK109cnQ7Zm9yKHB0PTA7cHQ8PWs7cHQrKylDdFtwdF09MDtmb3IoWT0wO1k8PTE0MzspZXRbMipZKzFdPTgsWSsrLEN0WzhdKys7Zm9yKDtZPD0yNTU7KWV0WzIqWSsxXT05LFkrKyxDdFs5XSsrO2Zvcig7WTw9Mjc5OylldFsyKlkrMV09NyxZKyssQ3RbN10rKztmb3IoO1k8PTI4NzspZXRbMipZKzFdPTgsWSsrLEN0WzhdKys7Zm9yKFR0KGV0LG0rMSxDdCksWT0wO1k8eTtZKyspT1syKlkrMV09NSxPWzIqWV09eXQoWSw1KTtTPW5ldyBYKGV0LEIsYisxLG0sayksTj1uZXcgWChPLHUsMCx5LGspLFI9bmV3IFgobmV3IEFycmF5KDApLHosMCxULEYpfSgpLG90PSEwKSxNLmxfZGVzYz1uZXcgaihNLmR5bl9sdHJlZSxTKSxNLmRfZGVzYz1uZXcgaihNLmR5bl9kdHJlZSxOKSxNLmJsX2Rlc2M9bmV3IGooTS5ibF90cmVlLFIpLE0uYmlfYnVmPTAsTS5iaV92YWxpZD0wLEF0KE0pfSxyLl90cl9zdG9yZWRfYmxvY2s9SCxyLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbihNLFkscHQsbXQpe3ZhciBydCxndCxDdD0wOzA8TS5sZXZlbD8oTS5zdHJtLmRhdGFfdHlwZT09PTImJihNLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKHh0KXt2YXIgYnQsenQ9NDA5MzYyNDQ0Nztmb3IoYnQ9MDtidDw9MzE7YnQrKyx6dD4+Pj0xKWlmKDEmenQmJnh0LmR5bl9sdHJlZVsyKmJ0XSE9PTApcmV0dXJuIHM7aWYoeHQuZHluX2x0cmVlWzE4XSE9PTB8fHh0LmR5bl9sdHJlZVsyMF0hPT0wfHx4dC5keW5fbHRyZWVbMjZdIT09MClyZXR1cm4gYTtmb3IoYnQ9MzI7YnQ8YjtidCsrKWlmKHh0LmR5bl9sdHJlZVsyKmJ0XSE9PTApcmV0dXJuIGE7cmV0dXJuIHN9KE0pKSxLdChNLE0ubF9kZXNjKSxLdChNLE0uZF9kZXNjKSxDdD1mdW5jdGlvbih4dCl7dmFyIGJ0O2ZvcihEKHh0LHh0LmR5bl9sdHJlZSx4dC5sX2Rlc2MubWF4X2NvZGUpLEQoeHQseHQuZHluX2R0cmVlLHh0LmRfZGVzYy5tYXhfY29kZSksS3QoeHQseHQuYmxfZGVzYyksYnQ9VC0xOzM8PWJ0JiZ4dC5ibF90cmVlWzIqcVtidF0rMV09PT0wO2J0LS0pO3JldHVybiB4dC5vcHRfbGVuKz0zKihidCsxKSs1KzUrNCxidH0oTSkscnQ9TS5vcHRfbGVuKzMrNz4+PjMsKGd0PU0uc3RhdGljX2xlbiszKzc+Pj4zKTw9cnQmJihydD1ndCkpOnJ0PWd0PXB0KzUscHQrNDw9cnQmJlkhPT0tMT9IKE0sWSxwdCxtdCk6TS5zdHJhdGVneT09PTR8fGd0PT09cnQ/KEooTSwyKyhtdD8xOjApLDMpLCR0KE0sZXQsTykpOihKKE0sNCsobXQ/MTowKSwzKSxmdW5jdGlvbih4dCxidCx6dCxVdCl7dmFyIHBlO2ZvcihKKHh0LGJ0LTI1Nyw1KSxKKHh0LHp0LTEsNSksSih4dCxVdC00LDQpLHBlPTA7cGU8VXQ7cGUrKylKKHh0LHh0LmJsX3RyZWVbMipxW3BlXSsxXSwzKTt1dCh4dCx4dC5keW5fbHRyZWUsYnQtMSksdXQoeHQseHQuZHluX2R0cmVlLHp0LTEpfShNLE0ubF9kZXNjLm1heF9jb2RlKzEsTS5kX2Rlc2MubWF4X2NvZGUrMSxDdCsxKSwkdChNLE0uZHluX2x0cmVlLE0uZHluX2R0cmVlKSksQXQoTSksbXQmJmt0KE0pfSxyLl90cl90YWxseT1mdW5jdGlvbihNLFkscHQpe3JldHVybiBNLnBlbmRpbmdfYnVmW00uZF9idWYrMipNLmxhc3RfbGl0XT1ZPj4+OCYyNTUsTS5wZW5kaW5nX2J1ZltNLmRfYnVmKzIqTS5sYXN0X2xpdCsxXT0yNTUmWSxNLnBlbmRpbmdfYnVmW00ubF9idWYrTS5sYXN0X2xpdF09MjU1JnB0LE0ubGFzdF9saXQrKyxZPT09MD9NLmR5bl9sdHJlZVsyKnB0XSsrOihNLm1hdGNoZXMrKyxZLS0sTS5keW5fbHRyZWVbMiooZ1twdF0rYisxKV0rKyxNLmR5bl9kdHJlZVsyKkcoWSldKyspLE0ubGFzdF9saXQ9PT1NLmxpdF9idWZzaXplLTF9LHIuX3RyX2FsaWduPWZ1bmN0aW9uKE0pe0ooTSwyLDMpLHR0KE0saCxldCksZnVuY3Rpb24oWSl7WS5iaV92YWxpZD09PTE2PyhhdChZLFkuYmlfYnVmKSxZLmJpX2J1Zj0wLFkuYmlfdmFsaWQ9MCk6ODw9WS5iaV92YWxpZCYmKFkucGVuZGluZ19idWZbWS5wZW5kaW5nKytdPTI1NSZZLmJpX2J1ZixZLmJpX2J1Zj4+PTgsWS5iaV92YWxpZC09OCl9KE0pfX0seyIuLi91dGlscy9jb21tb24iOjQxfV0sNTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH19LHt9XSw1NDpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihuKXsoZnVuY3Rpb24ocyxhKXsidXNlIHN0cmljdCI7aWYoIXMuc2V0SW1tZWRpYXRlKXt2YXIgbCxjLHAsYixtPTEseT17fSxUPSExLHc9cy5kb2N1bWVudCxrPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHMpO2s9ayYmay5zZXRUaW1lb3V0P2s6cyxsPXt9LnRvU3RyaW5nLmNhbGwocy5wcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIj9mdW5jdGlvbihvKXtwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7RihvKX0pfTpmdW5jdGlvbigpe2lmKHMucG9zdE1lc3NhZ2UmJiFzLmltcG9ydFNjcmlwdHMpe3ZhciBvPSEwLGY9cy5vbm1lc3NhZ2U7cmV0dXJuIHMub25tZXNzYWdlPWZ1bmN0aW9uKCl7bz0hMX0scy5wb3N0TWVzc2FnZSgiIiwiKiIpLHMub25tZXNzYWdlPWYsb319KCk/KGI9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHMuYWRkRXZlbnRMaXN0ZW5lcj9zLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGgsITEpOnMuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsaCksZnVuY3Rpb24obyl7cy5wb3N0TWVzc2FnZShiK28sIioiKX0pOnMuTWVzc2FnZUNoYW5uZWw/KChwPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKG8pe0Yoby5kYXRhKX0sZnVuY3Rpb24obyl7cC5wb3J0Mi5wb3N0TWVzc2FnZShvKX0pOncmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gdy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8oYz13LmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihvKXt2YXIgZj13LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Yub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7RihvKSxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGMucmVtb3ZlQ2hpbGQoZiksZj1udWxsfSxjLmFwcGVuZENoaWxkKGYpfSk6ZnVuY3Rpb24obyl7c2V0VGltZW91dChGLDAsbyl9LGsuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKG8pe3R5cGVvZiBvIT0iZnVuY3Rpb24iJiYobz1uZXcgRnVuY3Rpb24oIiIrbykpO2Zvcih2YXIgZj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxDPTA7QzxmLmxlbmd0aDtDKyspZltDXT1hcmd1bWVudHNbQysxXTt2YXIgQj17Y2FsbGJhY2s6byxhcmdzOmZ9O3JldHVybiB5W21dPUIsbChtKSxtKyt9LGsuY2xlYXJJbW1lZGlhdGU9UH1mdW5jdGlvbiBQKG8pe2RlbGV0ZSB5W29dfWZ1bmN0aW9uIEYobyl7aWYoVClzZXRUaW1lb3V0KEYsMCxvKTtlbHNle3ZhciBmPXlbb107aWYoZil7VD0hMDt0cnl7KGZ1bmN0aW9uKEMpe3ZhciBCPUMuY2FsbGJhY2ssdT1DLmFyZ3M7c3dpdGNoKHUubGVuZ3RoKXtjYXNlIDA6QigpO2JyZWFrO2Nhc2UgMTpCKHVbMF0pO2JyZWFrO2Nhc2UgMjpCKHVbMF0sdVsxXSk7YnJlYWs7Y2FzZSAzOkIodVswXSx1WzFdLHVbMl0pO2JyZWFrO2RlZmF1bHQ6Qi5hcHBseShhLHUpfX0pKGYpfWZpbmFsbHl7UChvKSxUPSExfX19fWZ1bmN0aW9uIGgobyl7by5zb3VyY2U9PT1zJiZ0eXBlb2Ygby5kYXRhPT0ic3RyaW5nIiYmby5kYXRhLmluZGV4T2YoYik9PT0wJiZGKCtvLmRhdGEuc2xpY2UoYi5sZW5ndGgpKX19KSh0eXBlb2Ygc2VsZj4idSI/bj09PXZvaWQgMD90aGlzOm46c2VsZil9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp7fSl9LHt9XX0se30sWzEwXSkoMTApfSl9KTt2YXIgaWU9Q2EoKFNhLGhuKT0+eyhmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt0eXBlb2YgaG49PSJvYmplY3QiJiZ0eXBlb2YgaG4uZXhwb3J0cz09Im9iamVjdCI/aG4uZXhwb3J0cz10LmRvY3VtZW50P2UodCwhMCk6ZnVuY3Rpb24ocil7aWYoIXIuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGUocil9OmUodCl9KSh0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6U2EsZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7dmFyIHI9W10sbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yscz1yLnNsaWNlLGE9ci5mbGF0P2Z1bmN0aW9uKGkpe3JldHVybiByLmZsYXQuY2FsbChpKX06ZnVuY3Rpb24oaSl7cmV0dXJuIHIuY29uY2F0LmFwcGx5KFtdLGkpfSxsPXIucHVzaCxjPXIuaW5kZXhPZixwPXt9LGI9cC50b1N0cmluZyxtPXAuaGFzT3duUHJvcGVydHkseT1tLnRvU3RyaW5nLFQ9eS5jYWxsKE9iamVjdCksdz17fSxrPWZ1bmN0aW9uKGQpe3JldHVybiB0eXBlb2YgZD09ImZ1bmN0aW9uIiYmdHlwZW9mIGQubm9kZVR5cGUhPSJudW1iZXIiJiZ0eXBlb2YgZC5pdGVtIT0iZnVuY3Rpb24ifSxQPWZ1bmN0aW9uKGQpe3JldHVybiBkIT1udWxsJiZkPT09ZC53aW5kb3d9LEY9dC5kb2N1bWVudCxoPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbyhpLGQsdil7dj12fHxGO3ZhciB4LEEsST12LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKEkudGV4dD1pLGQpZm9yKHggaW4gaClBPWRbeF18fGQuZ2V0QXR0cmlidXRlJiZkLmdldEF0dHJpYnV0ZSh4KSxBJiZJLnNldEF0dHJpYnV0ZSh4LEEpO3YuaGVhZC5hcHBlbmRDaGlsZChJKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEkpfWZ1bmN0aW9uIGYoaSl7cmV0dXJuIGk9PW51bGw/aSsiIjp0eXBlb2YgaT09Im9iamVjdCJ8fHR5cGVvZiBpPT0iZnVuY3Rpb24iP3BbYi5jYWxsKGkpXXx8Im9iamVjdCI6dHlwZW9mIGl9dmFyIEM9IjMuNy4xIixCPS9IVE1MJC9pLHU9ZnVuY3Rpb24oaSxkKXtyZXR1cm4gbmV3IHUuZm4uaW5pdChpLGQpfTt1LmZuPXUucHJvdG90eXBlPXtqcXVlcnk6Qyxjb25zdHJ1Y3Rvcjp1LGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PW51bGw/cy5jYWxsKHRoaXMpOmk8MD90aGlzW2krdGhpcy5sZW5ndGhdOnRoaXNbaV19LHB1c2hTdGFjazpmdW5jdGlvbihpKXt2YXIgZD11Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxpKTtyZXR1cm4gZC5wcmV2T2JqZWN0PXRoaXMsZH0sZWFjaDpmdW5jdGlvbihpKXtyZXR1cm4gdS5lYWNoKHRoaXMsaSl9LG1hcDpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5tYXAodGhpcyxmdW5jdGlvbihkLHYpe3JldHVybiBpLmNhbGwoZCx2LGQpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5ncmVwKHRoaXMsZnVuY3Rpb24oaSxkKXtyZXR1cm4oZCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS5ncmVwKHRoaXMsZnVuY3Rpb24oaSxkKXtyZXR1cm4gZCUyfSkpfSxlcTpmdW5jdGlvbihpKXt2YXIgZD10aGlzLmxlbmd0aCx2PStpKyhpPDA/ZDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodj49MCYmdjxkP1t0aGlzW3ZdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpsLHNvcnQ6ci5zb3J0LHNwbGljZTpyLnNwbGljZX0sdS5leHRlbmQ9dS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgaSxkLHYseCxBLEksRT1hcmd1bWVudHNbMF18fHt9LCQ9MSxVPWFyZ3VtZW50cy5sZW5ndGgsUT0hMTtmb3IodHlwZW9mIEU9PSJib29sZWFuIiYmKFE9RSxFPWFyZ3VtZW50c1skXXx8e30sJCsrKSx0eXBlb2YgRSE9Im9iamVjdCImJiFrKEUpJiYoRT17fSksJD09PVUmJihFPXRoaXMsJC0tKTskPFU7JCsrKWlmKChpPWFyZ3VtZW50c1skXSkhPW51bGwpZm9yKGQgaW4gaSl4PWlbZF0sIShkPT09Il9fcHJvdG9fXyJ8fEU9PT14KSYmKFEmJngmJih1LmlzUGxhaW5PYmplY3QoeCl8fChBPUFycmF5LmlzQXJyYXkoeCkpKT8odj1FW2RdLEEmJiFBcnJheS5pc0FycmF5KHYpP0k9W106IUEmJiF1LmlzUGxhaW5PYmplY3Qodik/ST17fTpJPXYsQT0hMSxFW2RdPXUuZXh0ZW5kKFEsSSx4KSk6eCE9PXZvaWQgMCYmKEVbZF09eCkpO3JldHVybiBFfSx1LmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoQytNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGkpe3Rocm93IG5ldyBFcnJvcihpKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihpKXt2YXIgZCx2O3JldHVybiFpfHxiLmNhbGwoaSkhPT0iW29iamVjdCBPYmplY3RdIj8hMTooZD1uKGkpLGQ/KHY9bS5jYWxsKGQsImNvbnN0cnVjdG9yIikmJmQuY29uc3RydWN0b3IsdHlwZW9mIHY9PSJmdW5jdGlvbiImJnkuY2FsbCh2KT09PVQpOiEwKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihpKXt2YXIgZDtmb3IoZCBpbiBpKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGksZCx2KXtvKGkse25vbmNlOmQmJmQubm9uY2V9LHYpfSxlYWNoOmZ1bmN0aW9uKGksZCl7dmFyIHYseD0wO2lmKHooaSkpZm9yKHY9aS5sZW5ndGg7eDx2JiZkLmNhbGwoaVt4XSx4LGlbeF0pIT09ITE7eCsrKTtlbHNlIGZvcih4IGluIGkpaWYoZC5jYWxsKGlbeF0seCxpW3hdKT09PSExKWJyZWFrO3JldHVybiBpfSx0ZXh0OmZ1bmN0aW9uKGkpe3ZhciBkLHY9IiIseD0wLEE9aS5ub2RlVHlwZTtpZighQSlmb3IoO2Q9aVt4KytdOyl2Kz11LnRleHQoZCk7cmV0dXJuIEE9PT0xfHxBPT09MTE/aS50ZXh0Q29udGVudDpBPT09OT9pLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudDpBPT09M3x8QT09PTQ/aS5ub2RlVmFsdWU6dn0sbWFrZUFycmF5OmZ1bmN0aW9uKGksZCl7dmFyIHY9ZHx8W107cmV0dXJuIGkhPW51bGwmJih6KE9iamVjdChpKSk/dS5tZXJnZSh2LHR5cGVvZiBpPT0ic3RyaW5nIj9baV06aSk6bC5jYWxsKHYsaSkpLHZ9LGluQXJyYXk6ZnVuY3Rpb24oaSxkLHYpe3JldHVybiBkPT1udWxsPy0xOmMuY2FsbChkLGksdil9LGlzWE1MRG9jOmZ1bmN0aW9uKGkpe3ZhciBkPWkmJmkubmFtZXNwYWNlVVJJLHY9aSYmKGkub3duZXJEb2N1bWVudHx8aSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFCLnRlc3QoZHx8diYmdi5ub2RlTmFtZXx8IkhUTUwiKX0sbWVyZ2U6ZnVuY3Rpb24oaSxkKXtmb3IodmFyIHY9K2QubGVuZ3RoLHg9MCxBPWkubGVuZ3RoO3g8djt4KyspaVtBKytdPWRbeF07cmV0dXJuIGkubGVuZ3RoPUEsaX0sZ3JlcDpmdW5jdGlvbihpLGQsdil7Zm9yKHZhciB4LEE9W10sST0wLEU9aS5sZW5ndGgsJD0hdjtJPEU7SSsrKXg9IWQoaVtJXSxJKSx4IT09JCYmQS5wdXNoKGlbSV0pO3JldHVybiBBfSxtYXA6ZnVuY3Rpb24oaSxkLHYpe3ZhciB4LEEsST0wLEU9W107aWYoeihpKSlmb3IoeD1pLmxlbmd0aDtJPHg7SSsrKUE9ZChpW0ldLEksdiksQSE9bnVsbCYmRS5wdXNoKEEpO2Vsc2UgZm9yKEkgaW4gaSlBPWQoaVtJXSxJLHYpLEEhPW51bGwmJkUucHVzaChBKTtyZXR1cm4gYShFKX0sZ3VpZDoxLHN1cHBvcnQ6d30pLHR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJih1LmZuW1N5bWJvbC5pdGVyYXRvcl09cltTeW1ib2wuaXRlcmF0b3JdKSx1LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGksZCl7cFsiW29iamVjdCAiK2QrIl0iXT1kLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB6KGkpe3ZhciBkPSEhaSYmImxlbmd0aCJpbiBpJiZpLmxlbmd0aCx2PWYoaSk7cmV0dXJuIGsoaSl8fFAoaSk/ITE6dj09PSJhcnJheSJ8fGQ9PT0wfHx0eXBlb2YgZD09Im51bWJlciImJmQ+MCYmZC0xIGluIGl9ZnVuY3Rpb24gcShpLGQpe3JldHVybiBpLm5vZGVOYW1lJiZpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1kLnRvTG93ZXJDYXNlKCl9dmFyIGV0PXIucG9wLE89ci5zb3J0LFo9ci5zcGxpY2UsZz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsXz1uZXcgUmVnRXhwKCJeIitnKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK2crIiskIiwiZyIpO3UuY29udGFpbnM9ZnVuY3Rpb24oaSxkKXt2YXIgdj1kJiZkLnBhcmVudE5vZGU7cmV0dXJuIGk9PT12fHwhISh2JiZ2Lm5vZGVUeXBlPT09MSYmKGkuY29udGFpbnM/aS5jb250YWlucyh2KTppLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZpLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHYpJjE2KSl9O3ZhciBTPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXHg4MC1cdUZGRkZcdy1dL2c7ZnVuY3Rpb24gTihpLGQpe3JldHVybiBkP2k9PT0iXDAiPyJcdUZGRkQiOmkuc2xpY2UoMCwtMSkrIlxcIitpLmNoYXJDb2RlQXQoaS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2l9dS5lc2NhcGVTZWxlY3Rvcj1mdW5jdGlvbihpKXtyZXR1cm4oaSsiIikucmVwbGFjZShTLE4pfTt2YXIgUj1GLEw9bDsoZnVuY3Rpb24oKXt2YXIgaSxkLHYseCxBLEk9TCxFLCQsVSxRLGR0LGZ0PXUuZXhwYW5kbyxpdD0wLHd0PTAsRXQ9ZG4oKSxHdD1kbigpLE10PWRuKCksbGU9ZG4oKSxzZT1mdW5jdGlvbihWLEspe3JldHVybiBWPT09SyYmKEE9ITApLDB9LE1lPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsVmU9Iig/OlxcXFxbXFxkYS1mQS1GXXsxLDZ9IitnKyI/fFxcXFxbXlxcclxcblxcZl18W1xcdy1dfFteXDAtXFx4N2ZdKSsiLHF0PSJcXFsiK2crIiooIitWZSsiKSg/OiIrZysiKihbKl4kfCF+XT89KSIrZytgKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfCIoKD86XFxcXC58W15cXFxcIl0pKikifChgK1ZlKyIpKXwpIitnKyIqXFxdIixkcj0iOigiK1ZlK2ApKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3wiKCg/OlxcXFwufFteXFxcXCJdKSopIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18YCtxdCsiKSopfC4qKVxcKXwpIixYdD1uZXcgUmVnRXhwKGcrIisiLCJnIikscmU9bmV3IFJlZ0V4cCgiXiIrZysiKiwiK2crIioiKSxNcj1uZXcgUmVnRXhwKCJeIitnKyIqKFs+K35dfCIrZysiKSIrZysiKiIpLFluPW5ldyBSZWdFeHAoZysifD4iKSxIZT1uZXcgUmVnRXhwKGRyKSxWcj1uZXcgUmVnRXhwKCJeIitWZSsiJCIpLFdlPXtJRDpuZXcgUmVnRXhwKCJeIygiK1ZlKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1ZlKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitWZSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK3F0KSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrZHIpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrZysiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrZysiKig/OihbKy1dfCkiK2crIiooXFxkKyl8KSkiK2crIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK01lKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrZysiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitnKyIqKCg/Oi1cXGQpP1xcZCopIitnKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxRZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEplPS9eaFxkJC9pLFNlPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sUW49L1srfl0vLFhlPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9IitnKyI/fFxcXFwoW15cXHJcXG5cXGZdKSIsImciKSwkZT1mdW5jdGlvbihWLEspe3ZhciBudD0iMHgiK1Yuc2xpY2UoMSktNjU1MzY7cmV0dXJuIEt8fChudDwwP1N0cmluZy5mcm9tQ2hhckNvZGUobnQrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobnQ+PjEwfDU1Mjk2LG50JjEwMjN8NTYzMjApKX0sU289ZnVuY3Rpb24oKXt0cigpfSxEbz1jbihmdW5jdGlvbihWKXtyZXR1cm4gVi5kaXNhYmxlZD09PSEwJiZxKFYsImZpZWxkc2V0Iil9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTtmdW5jdGlvbiBBbygpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoe319dHJ5e0kuYXBwbHkocj1zLmNhbGwoUi5jaGlsZE5vZGVzKSxSLmNoaWxkTm9kZXMpLHJbUi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2h7ST17YXBwbHk6ZnVuY3Rpb24oSyxudCl7TC5hcHBseShLLHMuY2FsbChudCkpfSxjYWxsOmZ1bmN0aW9uKEspe0wuYXBwbHkoSyxzLmNhbGwoYXJndW1lbnRzLDEpKX19fWZ1bmN0aW9uIFl0KFYsSyxudCxsdCl7dmFyIGN0LF90LFN0LFB0LER0LFZ0LE50LE90PUsmJksub3duZXJEb2N1bWVudCxIdD1LP0subm9kZVR5cGU6OTtpZihudD1udHx8W10sdHlwZW9mIFYhPSJzdHJpbmcifHwhVnx8SHQhPT0xJiZIdCE9PTkmJkh0IT09MTEpcmV0dXJuIG50O2lmKCFsdCYmKHRyKEspLEs9S3x8RSxVKSl7aWYoSHQhPT0xMSYmKER0PVNlLmV4ZWMoVikpKWlmKGN0PUR0WzFdKXtpZihIdD09PTkpaWYoU3Q9Sy5nZXRFbGVtZW50QnlJZChjdCkpe2lmKFN0LmlkPT09Y3QpcmV0dXJuIEkuY2FsbChudCxTdCksbnR9ZWxzZSByZXR1cm4gbnQ7ZWxzZSBpZihPdCYmKFN0PU90LmdldEVsZW1lbnRCeUlkKGN0KSkmJll0LmNvbnRhaW5zKEssU3QpJiZTdC5pZD09PWN0KXJldHVybiBJLmNhbGwobnQsU3QpLG50fWVsc2V7aWYoRHRbMl0pcmV0dXJuIEkuYXBwbHkobnQsSy5nZXRFbGVtZW50c0J5VGFnTmFtZShWKSksbnQ7aWYoKGN0PUR0WzNdKSYmSy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBJLmFwcGx5KG50LEsuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjdCkpLG50fWlmKCFsZVtWKyIgIl0mJighUXx8IVEudGVzdChWKSkpe2lmKE50PVYsT3Q9SyxIdD09PTEmJihZbi50ZXN0KFYpfHxNci50ZXN0KFYpKSl7Zm9yKE90PVFuLnRlc3QoVikmJkpuKEsucGFyZW50Tm9kZSl8fEssKE90IT1LfHwhdy5zY29wZSkmJigoUHQ9Sy5nZXRBdHRyaWJ1dGUoImlkIikpP1B0PXUuZXNjYXBlU2VsZWN0b3IoUHQpOksuc2V0QXR0cmlidXRlKCJpZCIsUHQ9ZnQpKSxWdD1IcihWKSxfdD1WdC5sZW5ndGg7X3QtLTspVnRbX3RdPShQdD8iIyIrUHQ6IjpzY29wZSIpKyIgIit1bihWdFtfdF0pO050PVZ0LmpvaW4oIiwiKX10cnl7cmV0dXJuIEkuYXBwbHkobnQsT3QucXVlcnlTZWxlY3RvckFsbChOdCkpLG50fWNhdGNoe2xlKFYsITApfWZpbmFsbHl7UHQ9PT1mdCYmSy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4geGEoVi5yZXBsYWNlKF8sIiQxIiksSyxudCxsdCl9ZnVuY3Rpb24gZG4oKXt2YXIgVj1bXTtmdW5jdGlvbiBLKG50LGx0KXtyZXR1cm4gVi5wdXNoKG50KyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIEtbVi5zaGlmdCgpXSxLW250KyIgIl09bHR9cmV0dXJuIEt9ZnVuY3Rpb24gTGUoVil7cmV0dXJuIFZbZnRdPSEwLFZ9ZnVuY3Rpb24gQ3IoVil7dmFyIEs9RS5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIVYoSyl9Y2F0Y2h7cmV0dXJuITF9ZmluYWxseXtLLnBhcmVudE5vZGUmJksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChLKSxLPW51bGx9fWZ1bmN0aW9uIElvKFYpe3JldHVybiBmdW5jdGlvbihLKXtyZXR1cm4gcShLLCJpbnB1dCIpJiZLLnR5cGU9PT1WfX1mdW5jdGlvbiBQbyhWKXtyZXR1cm4gZnVuY3Rpb24oSyl7cmV0dXJuKHEoSywiaW5wdXQiKXx8cShLLCJidXR0b24iKSkmJksudHlwZT09PVZ9fWZ1bmN0aW9uIHlhKFYpe3JldHVybiBmdW5jdGlvbihLKXtyZXR1cm4iZm9ybSJpbiBLP0sucGFyZW50Tm9kZSYmSy5kaXNhYmxlZD09PSExPyJsYWJlbCJpbiBLPyJsYWJlbCJpbiBLLnBhcmVudE5vZGU/Sy5wYXJlbnROb2RlLmRpc2FibGVkPT09VjpLLmRpc2FibGVkPT09VjpLLmlzRGlzYWJsZWQ9PT1WfHxLLmlzRGlzYWJsZWQhPT0hViYmRG8oSyk9PT1WOksuZGlzYWJsZWQ9PT1WOiJsYWJlbCJpbiBLP0suZGlzYWJsZWQ9PT1WOiExfX1mdW5jdGlvbiB1cihWKXtyZXR1cm4gTGUoZnVuY3Rpb24oSyl7cmV0dXJuIEs9K0ssTGUoZnVuY3Rpb24obnQsbHQpe2Zvcih2YXIgY3QsX3Q9VihbXSxudC5sZW5ndGgsSyksU3Q9X3QubGVuZ3RoO1N0LS07KW50W2N0PV90W1N0XV0mJihudFtjdF09IShsdFtjdF09bnRbY3RdKSl9KX0pfWZ1bmN0aW9uIEpuKFYpe3JldHVybiBWJiZ0eXBlb2YgVi5nZXRFbGVtZW50c0J5VGFnTmFtZTwidSImJlZ9ZnVuY3Rpb24gdHIoVil7dmFyIEssbnQ9Vj9WLm93bmVyRG9jdW1lbnR8fFY6UjtyZXR1cm4gbnQ9PUV8fG50Lm5vZGVUeXBlIT09OXx8IW50LmRvY3VtZW50RWxlbWVudHx8KEU9bnQsJD1FLmRvY3VtZW50RWxlbWVudCxVPSF1LmlzWE1MRG9jKEUpLGR0PSQubWF0Y2hlc3x8JC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fCQubXNNYXRjaGVzU2VsZWN0b3IsJC5tc01hdGNoZXNTZWxlY3RvciYmUiE9RSYmKEs9RS5kZWZhdWx0VmlldykmJksudG9wIT09SyYmSy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLFNvKSx3LmdldEJ5SWQ9Q3IoZnVuY3Rpb24obHQpe3JldHVybiAkLmFwcGVuZENoaWxkKGx0KS5pZD11LmV4cGFuZG8sIUUuZ2V0RWxlbWVudHNCeU5hbWV8fCFFLmdldEVsZW1lbnRzQnlOYW1lKHUuZXhwYW5kbykubGVuZ3RofSksdy5kaXNjb25uZWN0ZWRNYXRjaD1DcihmdW5jdGlvbihsdCl7cmV0dXJuIGR0LmNhbGwobHQsIioiKX0pLHcuc2NvcGU9Q3IoZnVuY3Rpb24oKXtyZXR1cm4gRS5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUiKX0pLHcuY3NzSGFzPUNyKGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBFLnF1ZXJ5U2VsZWN0b3IoIjpoYXMoKiw6anFmYWtlKSIpLCExfWNhdGNoe3JldHVybiEwfX0pLHcuZ2V0QnlJZD8oZC5maWx0ZXIuSUQ9ZnVuY3Rpb24obHQpe3ZhciBjdD1sdC5yZXBsYWNlKFhlLCRlKTtyZXR1cm4gZnVuY3Rpb24oX3Qpe3JldHVybiBfdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1jdH19LGQuZmluZC5JRD1mdW5jdGlvbihsdCxjdCl7aWYodHlwZW9mIGN0LmdldEVsZW1lbnRCeUlkPCJ1IiYmVSl7dmFyIF90PWN0LmdldEVsZW1lbnRCeUlkKGx0KTtyZXR1cm4gX3Q/W190XTpbXX19KTooZC5maWx0ZXIuSUQ9ZnVuY3Rpb24obHQpe3ZhciBjdD1sdC5yZXBsYWNlKFhlLCRlKTtyZXR1cm4gZnVuY3Rpb24oX3Qpe3ZhciBTdD10eXBlb2YgX3QuZ2V0QXR0cmlidXRlTm9kZTwidSImJl90LmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIFN0JiZTdC52YWx1ZT09PWN0fX0sZC5maW5kLklEPWZ1bmN0aW9uKGx0LGN0KXtpZih0eXBlb2YgY3QuZ2V0RWxlbWVudEJ5SWQ8InUiJiZVKXt2YXIgX3QsU3QsUHQsRHQ9Y3QuZ2V0RWxlbWVudEJ5SWQobHQpO2lmKER0KXtpZihfdD1EdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLF90JiZfdC52YWx1ZT09PWx0KXJldHVybltEdF07Zm9yKFB0PWN0LmdldEVsZW1lbnRzQnlOYW1lKGx0KSxTdD0wO0R0PVB0W1N0KytdOylpZihfdD1EdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLF90JiZfdC52YWx1ZT09PWx0KXJldHVybltEdF19cmV0dXJuW119fSksZC5maW5kLlRBRz1mdW5jdGlvbihsdCxjdCl7cmV0dXJuIHR5cGVvZiBjdC5nZXRFbGVtZW50c0J5VGFnTmFtZTwidSI/Y3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUobHQpOmN0LnF1ZXJ5U2VsZWN0b3JBbGwobHQpfSxkLmZpbmQuQ0xBU1M9ZnVuY3Rpb24obHQsY3Qpe2lmKHR5cGVvZiBjdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPCJ1IiYmVSlyZXR1cm4gY3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsdCl9LFE9W10sQ3IoZnVuY3Rpb24obHQpe3ZhciBjdDskLmFwcGVuZENoaWxkKGx0KS5pbm5lckhUTUw9IjxhIGlkPSciK2Z0KyInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBpZD0nIitmdCsiLVxyXFwnIGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fFEucHVzaCgiXFxbIitnKyIqKD86dmFsdWV8IitNZSsiKSIpLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitmdCsiLV0iKS5sZW5ndGh8fFEucHVzaCgifj0iKSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrZnQrIisqIikubGVuZ3RofHxRLnB1c2goIi4jLitbK35dIiksbHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fFEucHVzaCgiOmNoZWNrZWQiKSxjdD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksY3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksbHQuYXBwZW5kQ2hpbGQoY3QpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSwkLmFwcGVuZENoaWxkKGx0KS5kaXNhYmxlZD0hMCxsdC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGghPT0yJiZRLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksY3Q9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGN0LnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGx0LmFwcGVuZENoaWxkKGN0KSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fFEucHVzaCgiXFxbIitnKyIqbmFtZSIrZysiKj0iK2crYCooPzonJ3wiIilgKX0pLHcuY3NzSGFzfHxRLnB1c2goIjpoYXMiKSxRPVEubGVuZ3RoJiZuZXcgUmVnRXhwKFEuam9pbigifCIpKSxzZT1mdW5jdGlvbihsdCxjdCl7aWYobHQ9PT1jdClyZXR1cm4gQT0hMCwwO3ZhciBfdD0hbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWN0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBfdHx8KF90PShsdC5vd25lckRvY3VtZW50fHxsdCk9PShjdC5vd25lckRvY3VtZW50fHxjdCk/bHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY3QpOjEsX3QmMXx8IXcuc29ydERldGFjaGVkJiZjdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsdCk9PT1fdD9sdD09PUV8fGx0Lm93bmVyRG9jdW1lbnQ9PVImJll0LmNvbnRhaW5zKFIsbHQpPy0xOmN0PT09RXx8Y3Qub3duZXJEb2N1bWVudD09UiYmWXQuY29udGFpbnMoUixjdCk/MTp4P2MuY2FsbCh4LGx0KS1jLmNhbGwoeCxjdCk6MDpfdCY0Py0xOjEpfSksRX1ZdC5tYXRjaGVzPWZ1bmN0aW9uKFYsSyl7cmV0dXJuIFl0KFYsbnVsbCxudWxsLEspfSxZdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oVixLKXtpZih0cihWKSxVJiYhbGVbSysiICJdJiYoIVF8fCFRLnRlc3QoSykpKXRyeXt2YXIgbnQ9ZHQuY2FsbChWLEspO2lmKG50fHx3LmRpc2Nvbm5lY3RlZE1hdGNofHxWLmRvY3VtZW50JiZWLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIG50fWNhdGNoe2xlKEssITApfXJldHVybiBZdChLLEUsbnVsbCxbVl0pLmxlbmd0aD4wfSxZdC5jb250YWlucz1mdW5jdGlvbihWLEspe3JldHVybihWLm93bmVyRG9jdW1lbnR8fFYpIT1FJiZ0cihWKSx1LmNvbnRhaW5zKFYsSyl9LFl0LmF0dHI9ZnVuY3Rpb24oVixLKXsoVi5vd25lckRvY3VtZW50fHxWKSE9RSYmdHIoVik7dmFyIG50PWQuYXR0ckhhbmRsZVtLLnRvTG93ZXJDYXNlKCldLGx0PW50JiZtLmNhbGwoZC5hdHRySGFuZGxlLEsudG9Mb3dlckNhc2UoKSk/bnQoVixLLCFVKTp2b2lkIDA7cmV0dXJuIGx0IT09dm9pZCAwP2x0OlYuZ2V0QXR0cmlidXRlKEspfSxZdC5lcnJvcj1mdW5jdGlvbihWKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrVil9LHUudW5pcXVlU29ydD1mdW5jdGlvbihWKXt2YXIgSyxudD1bXSxsdD0wLGN0PTA7aWYoQT0hdy5zb3J0U3RhYmxlLHg9IXcuc29ydFN0YWJsZSYmcy5jYWxsKFYsMCksTy5jYWxsKFYsc2UpLEEpe2Zvcig7Sz1WW2N0KytdOylLPT09VltjdF0mJihsdD1udC5wdXNoKGN0KSk7Zm9yKDtsdC0tOylaLmNhbGwoVixudFtsdF0sMSl9cmV0dXJuIHg9bnVsbCxWfSx1LmZuLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodS51bmlxdWVTb3J0KHMuYXBwbHkodGhpcykpKX0sZD11LmV4cHI9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpMZSxtYXRjaDpXZSxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oVil7cmV0dXJuIFZbMV09VlsxXS5yZXBsYWNlKFhlLCRlKSxWWzNdPShWWzNdfHxWWzRdfHxWWzVdfHwiIikucmVwbGFjZShYZSwkZSksVlsyXT09PSJ+PSImJihWWzNdPSIgIitWWzNdKyIgIiksVi5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihWKXtyZXR1cm4gVlsxXT1WWzFdLnRvTG93ZXJDYXNlKCksVlsxXS5zbGljZSgwLDMpPT09Im50aCI/KFZbM118fFl0LmVycm9yKFZbMF0pLFZbNF09KyhWWzRdP1ZbNV0rKFZbNl18fDEpOjIqKFZbM109PT0iZXZlbiJ8fFZbM109PT0ib2RkIikpLFZbNV09KyhWWzddK1ZbOF18fFZbM109PT0ib2RkIikpOlZbM10mJll0LmVycm9yKFZbMF0pLFZ9LFBTRVVETzpmdW5jdGlvbihWKXt2YXIgSyxudD0hVls2XSYmVlsyXTtyZXR1cm4gV2UuQ0hJTEQudGVzdChWWzBdKT9udWxsOihWWzNdP1ZbMl09Vls0XXx8Vls1XXx8IiI6bnQmJkhlLnRlc3QobnQpJiYoSz1IcihudCwhMCkpJiYoSz1udC5pbmRleE9mKCIpIixudC5sZW5ndGgtSyktbnQubGVuZ3RoKSYmKFZbMF09VlswXS5zbGljZSgwLEspLFZbMl09bnQuc2xpY2UoMCxLKSksVi5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKFYpe3ZhciBLPVYucmVwbGFjZShYZSwkZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4gVj09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihudCl7cmV0dXJuIHEobnQsSyl9fSxDTEFTUzpmdW5jdGlvbihWKXt2YXIgSz1FdFtWKyIgIl07cmV0dXJuIEt8fChLPW5ldyBSZWdFeHAoIihefCIrZysiKSIrVisiKCIrZysifCQpIikpJiZFdChWLGZ1bmN0aW9uKG50KXtyZXR1cm4gSy50ZXN0KHR5cGVvZiBudC5jbGFzc05hbWU9PSJzdHJpbmciJiZudC5jbGFzc05hbWV8fHR5cGVvZiBudC5nZXRBdHRyaWJ1dGU8InUiJiZudC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKFYsSyxudCl7cmV0dXJuIGZ1bmN0aW9uKGx0KXt2YXIgY3Q9WXQuYXR0cihsdCxWKTtyZXR1cm4gY3Q9PW51bGw/Sz09PSIhPSI6Sz8oY3QrPSIiLEs9PT0iPSI/Y3Q9PT1udDpLPT09IiE9Ij9jdCE9PW50Oks9PT0iXj0iP250JiZjdC5pbmRleE9mKG50KT09PTA6Sz09PSIqPSI/bnQmJmN0LmluZGV4T2YobnQpPi0xOks9PT0iJD0iP250JiZjdC5zbGljZSgtbnQubGVuZ3RoKT09PW50Oks9PT0ifj0iPygiICIrY3QucmVwbGFjZShYdCwiICIpKyIgIikuaW5kZXhPZihudCk+LTE6Sz09PSJ8PSI/Y3Q9PT1udHx8Y3Quc2xpY2UoMCxudC5sZW5ndGgrMSk9PT1udCsiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oVixLLG50LGx0LGN0KXt2YXIgX3Q9Vi5zbGljZSgwLDMpIT09Im50aCIsU3Q9Vi5zbGljZSgtNCkhPT0ibGFzdCIsUHQ9Sz09PSJvZi10eXBlIjtyZXR1cm4gbHQ9PT0xJiZjdD09PTA/ZnVuY3Rpb24oRHQpe3JldHVybiEhRHQucGFyZW50Tm9kZX06ZnVuY3Rpb24oRHQsVnQsTnQpe3ZhciBPdCxIdCxGdCxlZSxnZSx1ZT1fdCE9PVN0PyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsRGU9RHQucGFyZW50Tm9kZSxVZT1QdCYmRHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxUcj0hTnQmJiFQdCxjZT0hMTtpZihEZSl7aWYoX3Qpe2Zvcig7dWU7KXtmb3IoRnQ9RHQ7RnQ9RnRbdWVdOylpZihQdD9xKEZ0LFVlKTpGdC5ub2RlVHlwZT09PTEpcmV0dXJuITE7Z2U9dWU9Vj09PSJvbmx5IiYmIWdlJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGdlPVtTdD9EZS5maXJzdENoaWxkOkRlLmxhc3RDaGlsZF0sU3QmJlRyKXtmb3IoSHQ9RGVbZnRdfHwoRGVbZnRdPXt9KSxPdD1IdFtWXXx8W10sZWU9T3RbMF09PT1pdCYmT3RbMV0sY2U9ZWUmJk90WzJdLEZ0PWVlJiZEZS5jaGlsZE5vZGVzW2VlXTtGdD0rK2VlJiZGdCYmRnRbdWVdfHwoY2U9ZWU9MCl8fGdlLnBvcCgpOylpZihGdC5ub2RlVHlwZT09PTEmJisrY2UmJkZ0PT09RHQpe0h0W1ZdPVtpdCxlZSxjZV07YnJlYWt9fWVsc2UgaWYoVHImJihIdD1EdFtmdF18fChEdFtmdF09e30pLE90PUh0W1ZdfHxbXSxlZT1PdFswXT09PWl0JiZPdFsxXSxjZT1lZSksY2U9PT0hMSlmb3IoOyhGdD0rK2VlJiZGdCYmRnRbdWVdfHwoY2U9ZWU9MCl8fGdlLnBvcCgpKSYmISgoUHQ/cShGdCxVZSk6RnQubm9kZVR5cGU9PT0xKSYmKytjZSYmKFRyJiYoSHQ9RnRbZnRdfHwoRnRbZnRdPXt9KSxIdFtWXT1baXQsY2VdKSxGdD09PUR0KSk7KTtyZXR1cm4gY2UtPWN0LGNlPT09bHR8fGNlJWx0PT09MCYmY2UvbHQ+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKFYsSyl7dmFyIG50LGx0PWQucHNldWRvc1tWXXx8ZC5zZXRGaWx0ZXJzW1YudG9Mb3dlckNhc2UoKV18fFl0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrVik7cmV0dXJuIGx0W2Z0XT9sdChLKTpsdC5sZW5ndGg+MT8obnQ9W1YsViwiIixLXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoVi50b0xvd2VyQ2FzZSgpKT9MZShmdW5jdGlvbihjdCxfdCl7Zm9yKHZhciBTdCxQdD1sdChjdCxLKSxEdD1QdC5sZW5ndGg7RHQtLTspU3Q9Yy5jYWxsKGN0LFB0W0R0XSksY3RbU3RdPSEoX3RbU3RdPVB0W0R0XSl9KTpmdW5jdGlvbihjdCl7cmV0dXJuIGx0KGN0LDAsbnQpfSk6bHR9fSxwc2V1ZG9zOntub3Q6TGUoZnVuY3Rpb24oVil7dmFyIEs9W10sbnQ9W10sbHQ9bmkoVi5yZXBsYWNlKF8sIiQxIikpO3JldHVybiBsdFtmdF0/TGUoZnVuY3Rpb24oY3QsX3QsU3QsUHQpe2Zvcih2YXIgRHQsVnQ9bHQoY3QsbnVsbCxQdCxbXSksTnQ9Y3QubGVuZ3RoO050LS07KShEdD1WdFtOdF0pJiYoY3RbTnRdPSEoX3RbTnRdPUR0KSl9KTpmdW5jdGlvbihjdCxfdCxTdCl7cmV0dXJuIEtbMF09Y3QsbHQoSyxudWxsLFN0LG50KSxLWzBdPW51bGwsIW50LnBvcCgpfX0pLGhhczpMZShmdW5jdGlvbihWKXtyZXR1cm4gZnVuY3Rpb24oSyl7cmV0dXJuIFl0KFYsSykubGVuZ3RoPjB9fSksY29udGFpbnM6TGUoZnVuY3Rpb24oVil7cmV0dXJuIFY9Vi5yZXBsYWNlKFhlLCRlKSxmdW5jdGlvbihLKXtyZXR1cm4oSy50ZXh0Q29udGVudHx8dS50ZXh0KEspKS5pbmRleE9mKFYpPi0xfX0pLGxhbmc6TGUoZnVuY3Rpb24oVil7cmV0dXJuIFZyLnRlc3QoVnx8IiIpfHxZdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitWKSxWPVYucmVwbGFjZShYZSwkZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihLKXt2YXIgbnQ7ZG8gaWYobnQ9VT9LLmxhbmc6Sy5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fEsuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG50PW50LnRvTG93ZXJDYXNlKCksbnQ9PT1WfHxudC5pbmRleE9mKFYrIi0iKT09PTA7d2hpbGUoKEs9Sy5wYXJlbnROb2RlKSYmSy5ub2RlVHlwZT09PTEpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihWKXt2YXIgSz10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIEsmJksuc2xpY2UoMSk9PT1WLmlkfSxyb290OmZ1bmN0aW9uKFYpe3JldHVybiBWPT09JH0sZm9jdXM6ZnVuY3Rpb24oVil7cmV0dXJuIFY9PT1BbygpJiZFLmhhc0ZvY3VzKCkmJiEhKFYudHlwZXx8Vi5ocmVmfHx+Vi50YWJJbmRleCl9LGVuYWJsZWQ6eWEoITEpLGRpc2FibGVkOnlhKCEwKSxjaGVja2VkOmZ1bmN0aW9uKFYpe3JldHVybiBxKFYsImlucHV0IikmJiEhVi5jaGVja2VkfHxxKFYsIm9wdGlvbiIpJiYhIVYuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKFYpe3JldHVybiBWLnBhcmVudE5vZGUmJlYucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LFYuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oVil7Zm9yKFY9Vi5maXJzdENoaWxkO1Y7Vj1WLm5leHRTaWJsaW5nKWlmKFYubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKFYpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoVil9LGhlYWRlcjpmdW5jdGlvbihWKXtyZXR1cm4gSmUudGVzdChWLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oVil7cmV0dXJuIFFlLnRlc3QoVi5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihWKXtyZXR1cm4gcShWLCJpbnB1dCIpJiZWLnR5cGU9PT0iYnV0dG9uInx8cShWLCJidXR0b24iKX0sdGV4dDpmdW5jdGlvbihWKXt2YXIgSztyZXR1cm4gcShWLCJpbnB1dCIpJiZWLnR5cGU9PT0idGV4dCImJigoSz1WLmdldEF0dHJpYnV0ZSgidHlwZSIpKT09bnVsbHx8Sy50b0xvd2VyQ2FzZSgpPT09InRleHQiKX0sZmlyc3Q6dXIoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnVyKGZ1bmN0aW9uKFYsSyl7cmV0dXJuW0stMV19KSxlcTp1cihmdW5jdGlvbihWLEssbnQpe3JldHVybltudDwwP250K0s6bnRdfSksZXZlbjp1cihmdW5jdGlvbihWLEspe2Zvcih2YXIgbnQ9MDtudDxLO250Kz0yKVYucHVzaChudCk7cmV0dXJuIFZ9KSxvZGQ6dXIoZnVuY3Rpb24oVixLKXtmb3IodmFyIG50PTE7bnQ8SztudCs9MilWLnB1c2gobnQpO3JldHVybiBWfSksbHQ6dXIoZnVuY3Rpb24oVixLLG50KXt2YXIgbHQ7Zm9yKG50PDA/bHQ9bnQrSzpudD5LP2x0PUs6bHQ9bnQ7LS1sdD49MDspVi5wdXNoKGx0KTtyZXR1cm4gVn0pLGd0OnVyKGZ1bmN0aW9uKFYsSyxudCl7Zm9yKHZhciBsdD1udDwwP250K0s6bnQ7KytsdDxLOylWLnB1c2gobHQpO3JldHVybiBWfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoaSBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbaV09SW8oaSk7Zm9yKGkgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbaV09UG8oaSk7ZnVuY3Rpb24gd2EoKXt9d2EucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyB3YTtmdW5jdGlvbiBIcihWLEspe3ZhciBudCxsdCxjdCxfdCxTdCxQdCxEdCxWdD1HdFtWKyIgIl07aWYoVnQpcmV0dXJuIEs/MDpWdC5zbGljZSgwKTtmb3IoU3Q9VixQdD1bXSxEdD1kLnByZUZpbHRlcjtTdDspeyghbnR8fChsdD1yZS5leGVjKFN0KSkpJiYobHQmJihTdD1TdC5zbGljZShsdFswXS5sZW5ndGgpfHxTdCksUHQucHVzaChjdD1bXSkpLG50PSExLChsdD1Nci5leGVjKFN0KSkmJihudD1sdC5zaGlmdCgpLGN0LnB1c2goe3ZhbHVlOm50LHR5cGU6bHRbMF0ucmVwbGFjZShfLCIgIil9KSxTdD1TdC5zbGljZShudC5sZW5ndGgpKTtmb3IoX3QgaW4gZC5maWx0ZXIpKGx0PVdlW190XS5leGVjKFN0KSkmJighRHRbX3RdfHwobHQ9RHRbX3RdKGx0KSkpJiYobnQ9bHQuc2hpZnQoKSxjdC5wdXNoKHt2YWx1ZTpudCx0eXBlOl90LG1hdGNoZXM6bHR9KSxTdD1TdC5zbGljZShudC5sZW5ndGgpKTtpZighbnQpYnJlYWt9cmV0dXJuIEs/U3QubGVuZ3RoOlN0P1l0LmVycm9yKFYpOkd0KFYsUHQpLnNsaWNlKDApfWZ1bmN0aW9uIHVuKFYpe2Zvcih2YXIgSz0wLG50PVYubGVuZ3RoLGx0PSIiO0s8bnQ7SysrKWx0Kz1WW0tdLnZhbHVlO3JldHVybiBsdH1mdW5jdGlvbiBjbihWLEssbnQpe3ZhciBsdD1LLmRpcixjdD1LLm5leHQsX3Q9Y3R8fGx0LFN0PW50JiZfdD09PSJwYXJlbnROb2RlIixQdD13dCsrO3JldHVybiBLLmZpcnN0P2Z1bmN0aW9uKER0LFZ0LE50KXtmb3IoO0R0PUR0W2x0XTspaWYoRHQubm9kZVR5cGU9PT0xfHxTdClyZXR1cm4gVihEdCxWdCxOdCk7cmV0dXJuITF9OmZ1bmN0aW9uKER0LFZ0LE50KXt2YXIgT3QsSHQsRnQ9W2l0LFB0XTtpZihOdCl7Zm9yKDtEdD1EdFtsdF07KWlmKChEdC5ub2RlVHlwZT09PTF8fFN0KSYmVihEdCxWdCxOdCkpcmV0dXJuITB9ZWxzZSBmb3IoO0R0PUR0W2x0XTspaWYoRHQubm9kZVR5cGU9PT0xfHxTdClpZihIdD1EdFtmdF18fChEdFtmdF09e30pLGN0JiZxKER0LGN0KSlEdD1EdFtsdF18fER0O2Vsc2V7aWYoKE90PUh0W190XSkmJk90WzBdPT09aXQmJk90WzFdPT09UHQpcmV0dXJuIEZ0WzJdPU90WzJdO2lmKEh0W190XT1GdCxGdFsyXT1WKER0LFZ0LE50KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gdGkoVil7cmV0dXJuIFYubGVuZ3RoPjE/ZnVuY3Rpb24oSyxudCxsdCl7Zm9yKHZhciBjdD1WLmxlbmd0aDtjdC0tOylpZighVltjdF0oSyxudCxsdCkpcmV0dXJuITE7cmV0dXJuITB9OlZbMF19ZnVuY3Rpb24gRm8oVixLLG50KXtmb3IodmFyIGx0PTAsY3Q9Sy5sZW5ndGg7bHQ8Y3Q7bHQrKylZdChWLEtbbHRdLG50KTtyZXR1cm4gbnR9ZnVuY3Rpb24gZm4oVixLLG50LGx0LGN0KXtmb3IodmFyIF90LFN0PVtdLFB0PTAsRHQ9Vi5sZW5ndGgsVnQ9SyE9bnVsbDtQdDxEdDtQdCsrKShfdD1WW1B0XSkmJighbnR8fG50KF90LGx0LGN0KSkmJihTdC5wdXNoKF90KSxWdCYmSy5wdXNoKFB0KSk7cmV0dXJuIFN0fWZ1bmN0aW9uIGVpKFYsSyxudCxsdCxjdCxfdCl7cmV0dXJuIGx0JiYhbHRbZnRdJiYobHQ9ZWkobHQpKSxjdCYmIWN0W2Z0XSYmKGN0PWVpKGN0LF90KSksTGUoZnVuY3Rpb24oU3QsUHQsRHQsVnQpe3ZhciBOdCxPdCxIdCxGdCxlZT1bXSxnZT1bXSx1ZT1QdC5sZW5ndGgsRGU9U3R8fEZvKEt8fCIqIixEdC5ub2RlVHlwZT9bRHRdOkR0LFtdKSxVZT1WJiYoU3R8fCFLKT9mbihEZSxlZSxWLER0LFZ0KTpEZTtpZihudD8oRnQ9Y3R8fChTdD9WOnVlfHxsdCk/W106UHQsbnQoVWUsRnQsRHQsVnQpKTpGdD1VZSxsdClmb3IoTnQ9Zm4oRnQsZ2UpLGx0KE50LFtdLER0LFZ0KSxPdD1OdC5sZW5ndGg7T3QtLTspKEh0PU50W090XSkmJihGdFtnZVtPdF1dPSEoVWVbZ2VbT3RdXT1IdCkpO2lmKFN0KXtpZihjdHx8Vil7aWYoY3Qpe2ZvcihOdD1bXSxPdD1GdC5sZW5ndGg7T3QtLTspKEh0PUZ0W090XSkmJk50LnB1c2goVWVbT3RdPUh0KTtjdChudWxsLEZ0PVtdLE50LFZ0KX1mb3IoT3Q9RnQubGVuZ3RoO090LS07KShIdD1GdFtPdF0pJiYoTnQ9Y3Q/Yy5jYWxsKFN0LEh0KTplZVtPdF0pPi0xJiYoU3RbTnRdPSEoUHRbTnRdPUh0KSl9fWVsc2UgRnQ9Zm4oRnQ9PT1QdD9GdC5zcGxpY2UodWUsRnQubGVuZ3RoKTpGdCksY3Q/Y3QobnVsbCxQdCxGdCxWdCk6SS5hcHBseShQdCxGdCl9KX1mdW5jdGlvbiByaShWKXtmb3IodmFyIEssbnQsbHQsY3Q9Vi5sZW5ndGgsX3Q9ZC5yZWxhdGl2ZVtWWzBdLnR5cGVdLFN0PV90fHxkLnJlbGF0aXZlWyIgIl0sUHQ9X3Q/MTowLER0PWNuKGZ1bmN0aW9uKE90KXtyZXR1cm4gT3Q9PT1LfSxTdCwhMCksVnQ9Y24oZnVuY3Rpb24oT3Qpe3JldHVybiBjLmNhbGwoSyxPdCk+LTF9LFN0LCEwKSxOdD1bZnVuY3Rpb24oT3QsSHQsRnQpe3ZhciBlZT0hX3QmJihGdHx8SHQhPXYpfHwoKEs9SHQpLm5vZGVUeXBlP0R0KE90LEh0LEZ0KTpWdChPdCxIdCxGdCkpO3JldHVybiBLPW51bGwsZWV9XTtQdDxjdDtQdCsrKWlmKG50PWQucmVsYXRpdmVbVltQdF0udHlwZV0pTnQ9W2NuKHRpKE50KSxudCldO2Vsc2V7aWYobnQ9ZC5maWx0ZXJbVltQdF0udHlwZV0uYXBwbHkobnVsbCxWW1B0XS5tYXRjaGVzKSxudFtmdF0pe2ZvcihsdD0rK1B0O2x0PGN0JiYhZC5yZWxhdGl2ZVtWW2x0XS50eXBlXTtsdCsrKTtyZXR1cm4gZWkoUHQ+MSYmdGkoTnQpLFB0PjEmJnVuKFYuc2xpY2UoMCxQdC0xKS5jb25jYXQoe3ZhbHVlOlZbUHQtMl0udHlwZT09PSIgIj8iKiI6IiJ9KSkucmVwbGFjZShfLCIkMSIpLG50LFB0PGx0JiZyaShWLnNsaWNlKFB0LGx0KSksbHQ8Y3QmJnJpKFY9Vi5zbGljZShsdCkpLGx0PGN0JiZ1bihWKSl9TnQucHVzaChudCl9cmV0dXJuIHRpKE50KX1mdW5jdGlvbiBCbyhWLEspe3ZhciBudD1LLmxlbmd0aD4wLGx0PVYubGVuZ3RoPjAsY3Q9ZnVuY3Rpb24oX3QsU3QsUHQsRHQsVnQpe3ZhciBOdCxPdCxIdCxGdD0wLGVlPSIwIixnZT1fdCYmW10sdWU9W10sRGU9dixVZT1fdHx8bHQmJmQuZmluZC5UQUcoIioiLFZ0KSxUcj1pdCs9RGU9PW51bGw/MTpNYXRoLnJhbmRvbSgpfHwuMSxjZT1VZS5sZW5ndGg7Zm9yKFZ0JiYodj1TdD09RXx8U3R8fFZ0KTtlZSE9PWNlJiYoTnQ9VWVbZWVdKSE9bnVsbDtlZSsrKXtpZihsdCYmTnQpe2ZvcihPdD0wLCFTdCYmTnQub3duZXJEb2N1bWVudCE9RSYmKHRyKE50KSxQdD0hVSk7SHQ9VltPdCsrXTspaWYoSHQoTnQsU3R8fEUsUHQpKXtJLmNhbGwoRHQsTnQpO2JyZWFrfVZ0JiYoaXQ9VHIpfW50JiYoKE50PSFIdCYmTnQpJiZGdC0tLF90JiZnZS5wdXNoKE50KSl9aWYoRnQrPWVlLG50JiZlZSE9PUZ0KXtmb3IoT3Q9MDtIdD1LW090KytdOylIdChnZSx1ZSxTdCxQdCk7aWYoX3Qpe2lmKEZ0PjApZm9yKDtlZS0tOylnZVtlZV18fHVlW2VlXXx8KHVlW2VlXT1ldC5jYWxsKER0KSk7dWU9Zm4odWUpfUkuYXBwbHkoRHQsdWUpLFZ0JiYhX3QmJnVlLmxlbmd0aD4wJiZGdCtLLmxlbmd0aD4xJiZ1LnVuaXF1ZVNvcnQoRHQpfXJldHVybiBWdCYmKGl0PVRyLHY9RGUpLGdlfTtyZXR1cm4gbnQ/TGUoY3QpOmN0fWZ1bmN0aW9uIG5pKFYsSyl7dmFyIG50LGx0PVtdLGN0PVtdLF90PU10W1YrIiAiXTtpZighX3Qpe2ZvcihLfHwoSz1IcihWKSksbnQ9Sy5sZW5ndGg7bnQtLTspX3Q9cmkoS1tudF0pLF90W2Z0XT9sdC5wdXNoKF90KTpjdC5wdXNoKF90KTtfdD1NdChWLEJvKGN0LGx0KSksX3Quc2VsZWN0b3I9Vn1yZXR1cm4gX3R9ZnVuY3Rpb24geGEoVixLLG50LGx0KXt2YXIgY3QsX3QsU3QsUHQsRHQsVnQ9dHlwZW9mIFY9PSJmdW5jdGlvbiImJlYsTnQ9IWx0JiZIcihWPVZ0LnNlbGVjdG9yfHxWKTtpZihudD1udHx8W10sTnQubGVuZ3RoPT09MSl7aWYoX3Q9TnRbMF09TnRbMF0uc2xpY2UoMCksX3QubGVuZ3RoPjImJihTdD1fdFswXSkudHlwZT09PSJJRCImJksubm9kZVR5cGU9PT05JiZVJiZkLnJlbGF0aXZlW190WzFdLnR5cGVdKXtpZihLPShkLmZpbmQuSUQoU3QubWF0Y2hlc1swXS5yZXBsYWNlKFhlLCRlKSxLKXx8W10pWzBdLEspVnQmJihLPUsucGFyZW50Tm9kZSk7ZWxzZSByZXR1cm4gbnQ7Vj1WLnNsaWNlKF90LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoY3Q9V2UubmVlZHNDb250ZXh0LnRlc3QoVik/MDpfdC5sZW5ndGg7Y3QtLSYmKFN0PV90W2N0XSwhZC5yZWxhdGl2ZVtQdD1TdC50eXBlXSk7KWlmKChEdD1kLmZpbmRbUHRdKSYmKGx0PUR0KFN0Lm1hdGNoZXNbMF0ucmVwbGFjZShYZSwkZSksUW4udGVzdChfdFswXS50eXBlKSYmSm4oSy5wYXJlbnROb2RlKXx8SykpKXtpZihfdC5zcGxpY2UoY3QsMSksVj1sdC5sZW5ndGgmJnVuKF90KSwhVilyZXR1cm4gSS5hcHBseShudCxsdCksbnQ7YnJlYWt9fXJldHVybihWdHx8bmkoVixOdCkpKGx0LEssIVUsbnQsIUt8fFFuLnRlc3QoVikmJkpuKEsucGFyZW50Tm9kZSl8fEspLG50fXcuc29ydFN0YWJsZT1mdC5zcGxpdCgiIikuc29ydChzZSkuam9pbigiIik9PT1mdCx0cigpLHcuc29ydERldGFjaGVkPUNyKGZ1bmN0aW9uKFYpe3JldHVybiBWLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEUuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSkmMX0pLHUuZmluZD1ZdCx1LmV4cHJbIjoiXT11LmV4cHIucHNldWRvcyx1LnVuaXF1ZT11LnVuaXF1ZVNvcnQsWXQuY29tcGlsZT1uaSxZdC5zZWxlY3Q9eGEsWXQuc2V0RG9jdW1lbnQ9dHIsWXQudG9rZW5pemU9SHIsWXQuZXNjYXBlPXUuZXNjYXBlU2VsZWN0b3IsWXQuZ2V0VGV4dD11LnRleHQsWXQuaXNYTUw9dS5pc1hNTERvYyxZdC5zZWxlY3RvcnM9dS5leHByLFl0LnN1cHBvcnQ9dS5zdXBwb3J0LFl0LnVuaXF1ZVNvcnQ9dS51bmlxdWVTb3J0fSkoKTt2YXIgWD1mdW5jdGlvbihpLGQsdil7Zm9yKHZhciB4PVtdLEE9diE9PXZvaWQgMDsoaT1pW2RdKSYmaS5ub2RlVHlwZSE9PTk7KWlmKGkubm9kZVR5cGU9PT0xKXtpZihBJiZ1KGkpLmlzKHYpKWJyZWFrO3gucHVzaChpKX1yZXR1cm4geH0saj1mdW5jdGlvbihpLGQpe2Zvcih2YXIgdj1bXTtpO2k9aS5uZXh0U2libGluZylpLm5vZGVUeXBlPT09MSYmaSE9PWQmJnYucHVzaChpKTtyZXR1cm4gdn0sRz11LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGF0PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIEooaSxkLHYpe3JldHVybiBrKGQpP3UuZ3JlcChpLGZ1bmN0aW9uKHgsQSl7cmV0dXJuISFkLmNhbGwoeCxBLHgpIT09dn0pOmQubm9kZVR5cGU/dS5ncmVwKGksZnVuY3Rpb24oeCl7cmV0dXJuIHg9PT1kIT09dn0pOnR5cGVvZiBkIT0ic3RyaW5nIj91LmdyZXAoaSxmdW5jdGlvbih4KXtyZXR1cm4gYy5jYWxsKGQseCk+LTEhPT12fSk6dS5maWx0ZXIoZCxpLHYpfXUuZmlsdGVyPWZ1bmN0aW9uKGksZCx2KXt2YXIgeD1kWzBdO3JldHVybiB2JiYoaT0iOm5vdCgiK2krIikiKSxkLmxlbmd0aD09PTEmJngubm9kZVR5cGU9PT0xP3UuZmluZC5tYXRjaGVzU2VsZWN0b3IoeCxpKT9beF06W106dS5maW5kLm1hdGNoZXMoaSx1LmdyZXAoZCxmdW5jdGlvbihBKXtyZXR1cm4gQS5ub2RlVHlwZT09PTF9KSl9LHUuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGkpe3ZhciBkLHYseD10aGlzLmxlbmd0aCxBPXRoaXM7aWYodHlwZW9mIGkhPSJzdHJpbmciKXJldHVybiB0aGlzLnB1c2hTdGFjayh1KGkpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihkPTA7ZDx4O2QrKylpZih1LmNvbnRhaW5zKEFbZF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKHY9dGhpcy5wdXNoU3RhY2soW10pLGQ9MDtkPHg7ZCsrKXUuZmluZChpLEFbZF0sdik7cmV0dXJuIHg+MT91LnVuaXF1ZVNvcnQodik6dn0sZmlsdGVyOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnB1c2hTdGFjayhKKHRoaXMsaXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnB1c2hTdGFjayhKKHRoaXMsaXx8W10sITApKX0saXM6ZnVuY3Rpb24oaSl7cmV0dXJuISFKKHRoaXMsdHlwZW9mIGk9PSJzdHJpbmciJiZHLnRlc3QoaSk/dShpKTppfHxbXSwhMSkubGVuZ3RofX0pO3ZhciB0dCx5dD0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvLFR0PXUuZm4uaW5pdD1mdW5jdGlvbihpLGQsdil7dmFyIHgsQTtpZighaSlyZXR1cm4gdGhpcztpZih2PXZ8fHR0LHR5cGVvZiBpPT0ic3RyaW5nIilpZihpWzBdPT09IjwiJiZpW2kubGVuZ3RoLTFdPT09Ij4iJiZpLmxlbmd0aD49Mz94PVtudWxsLGksbnVsbF06eD15dC5leGVjKGkpLHgmJih4WzFdfHwhZCkpaWYoeFsxXSl7aWYoZD1kIGluc3RhbmNlb2YgdT9kWzBdOmQsdS5tZXJnZSh0aGlzLHUucGFyc2VIVE1MKHhbMV0sZCYmZC5ub2RlVHlwZT9kLm93bmVyRG9jdW1lbnR8fGQ6RiwhMCkpLGF0LnRlc3QoeFsxXSkmJnUuaXNQbGFpbk9iamVjdChkKSlmb3IoeCBpbiBkKWsodGhpc1t4XSk/dGhpc1t4XShkW3hdKTp0aGlzLmF0dHIoeCxkW3hdKTtyZXR1cm4gdGhpc31lbHNlIHJldHVybiBBPUYuZ2V0RWxlbWVudEJ5SWQoeFsyXSksQSYmKHRoaXNbMF09QSx0aGlzLmxlbmd0aD0xKSx0aGlzO2Vsc2UgcmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHx2KS5maW5kKGkpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChpKTtlbHNle2lmKGkubm9kZVR5cGUpcmV0dXJuIHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYoayhpKSlyZXR1cm4gdi5yZWFkeSE9PXZvaWQgMD92LnJlYWR5KGkpOmkodSl9cmV0dXJuIHUubWFrZUFycmF5KGksdGhpcyl9O1R0LnByb3RvdHlwZT11LmZuLHR0PXUoRik7dmFyIEF0PS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLGt0PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3UuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oaSl7dmFyIGQ9dShpLHRoaXMpLHY9ZC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB4PTA7eDx2O3grKylpZih1LmNvbnRhaW5zKHRoaXMsZFt4XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihpLGQpe3ZhciB2LHg9MCxBPXRoaXMubGVuZ3RoLEk9W10sRT10eXBlb2YgaSE9InN0cmluZyImJnUoaSk7aWYoIUcudGVzdChpKSl7Zm9yKDt4PEE7eCsrKWZvcih2PXRoaXNbeF07diYmdiE9PWQ7dj12LnBhcmVudE5vZGUpaWYodi5ub2RlVHlwZTwxMSYmKEU/RS5pbmRleCh2KT4tMTp2Lm5vZGVUeXBlPT09MSYmdS5maW5kLm1hdGNoZXNTZWxlY3Rvcih2LGkpKSl7SS5wdXNoKHYpO2JyZWFrfX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soSS5sZW5ndGg+MT91LnVuaXF1ZVNvcnQoSSk6SSl9LGluZGV4OmZ1bmN0aW9uKGkpe3JldHVybiBpP3R5cGVvZiBpPT0ic3RyaW5nIj9jLmNhbGwodShpKSx0aGlzWzBdKTpjLmNhbGwodGhpcyxpLmpxdWVyeT9pWzBdOmkpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUudW5pcXVlU29ydCh1Lm1lcmdlKHRoaXMuZ2V0KCksdShpLGQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmFkZChpPT1udWxsP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGkpKX19KTtmdW5jdGlvbiBMdChpLGQpe2Zvcig7KGk9aVtkXSkmJmkubm9kZVR5cGUhPT0xOyk7cmV0dXJuIGl9dS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oaSl7dmFyIGQ9aS5wYXJlbnROb2RlO3JldHVybiBkJiZkLm5vZGVUeXBlIT09MTE/ZDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGkpe3JldHVybiBYKGksInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGksZCx2KXtyZXR1cm4gWChpLCJwYXJlbnROb2RlIix2KX0sbmV4dDpmdW5jdGlvbihpKXtyZXR1cm4gTHQoaSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihpKXtyZXR1cm4gTHQoaSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oaSl7cmV0dXJuIFgoaSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihpKXtyZXR1cm4gWChpLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGksZCx2KXtyZXR1cm4gWChpLCJuZXh0U2libGluZyIsdil9LHByZXZVbnRpbDpmdW5jdGlvbihpLGQsdil7cmV0dXJuIFgoaSwicHJldmlvdXNTaWJsaW5nIix2KX0sc2libGluZ3M6ZnVuY3Rpb24oaSl7cmV0dXJuIGooKGkucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsaSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGkpe3JldHVybiBqKGkuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGkpe3JldHVybiBpLmNvbnRlbnREb2N1bWVudCE9bnVsbCYmbihpLmNvbnRlbnREb2N1bWVudCk/aS5jb250ZW50RG9jdW1lbnQ6KHEoaSwidGVtcGxhdGUiKSYmKGk9aS5jb250ZW50fHxpKSx1Lm1lcmdlKFtdLGkuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24oaSxkKXt1LmZuW2ldPWZ1bmN0aW9uKHYseCl7dmFyIEE9dS5tYXAodGhpcyxkLHYpO3JldHVybiBpLnNsaWNlKC01KSE9PSJVbnRpbCImJih4PXYpLHgmJnR5cGVvZiB4PT0ic3RyaW5nIiYmKEE9dS5maWx0ZXIoeCxBKSksdGhpcy5sZW5ndGg+MSYmKGt0W2ldfHx1LnVuaXF1ZVNvcnQoQSksQXQudGVzdChpKSYmQS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKEEpfX0pO3ZhciBCdD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uICR0KGkpe3ZhciBkPXt9O3JldHVybiB1LmVhY2goaS5tYXRjaChCdCl8fFtdLGZ1bmN0aW9uKHYseCl7ZFt4XT0hMH0pLGR9dS5DYWxsYmFja3M9ZnVuY3Rpb24oaSl7aT10eXBlb2YgaT09InN0cmluZyI/JHQoaSk6dS5leHRlbmQoe30saSk7dmFyIGQsdix4LEEsST1bXSxFPVtdLCQ9LTEsVT1mdW5jdGlvbigpe2ZvcihBPUF8fGkub25jZSx4PWQ9ITA7RS5sZW5ndGg7JD0tMSlmb3Iodj1FLnNoaWZ0KCk7KyskPEkubGVuZ3RoOylJWyRdLmFwcGx5KHZbMF0sdlsxXSk9PT0hMSYmaS5zdG9wT25GYWxzZSYmKCQ9SS5sZW5ndGgsdj0hMSk7aS5tZW1vcnl8fCh2PSExKSxkPSExLEEmJih2P0k9W106ST0iIil9LFE9e2FkZDpmdW5jdGlvbigpe3JldHVybiBJJiYodiYmIWQmJigkPUkubGVuZ3RoLTEsRS5wdXNoKHYpKSxmdW5jdGlvbiBkdChmdCl7dS5lYWNoKGZ0LGZ1bmN0aW9uKGl0LHd0KXtrKHd0KT8oIWkudW5pcXVlfHwhUS5oYXMod3QpKSYmSS5wdXNoKHd0KTp3dCYmd3QubGVuZ3RoJiZmKHd0KSE9PSJzdHJpbmciJiZkdCh3dCl9KX0oYXJndW1lbnRzKSx2JiYhZCYmVSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihkdCxmdCl7Zm9yKHZhciBpdDsoaXQ9dS5pbkFycmF5KGZ0LEksaXQpKT4tMTspSS5zcGxpY2UoaXQsMSksaXQ8PSQmJiQtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihkdCl7cmV0dXJuIGR0P3UuaW5BcnJheShkdCxJKT4tMTpJLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBJJiYoST1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBBPUU9W10sST12PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIUl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gQT1FPVtdLCF2JiYhZCYmKEk9dj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFBfSxmaXJlV2l0aDpmdW5jdGlvbihkdCxmdCl7cmV0dXJuIEF8fChmdD1mdHx8W10sZnQ9W2R0LGZ0LnNsaWNlP2Z0LnNsaWNlKCk6ZnRdLEUucHVzaChmdCksZHx8VSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIFEuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISF4fX07cmV0dXJuIFF9O2Z1bmN0aW9uIEt0KGkpe3JldHVybiBpfWZ1bmN0aW9uIEQoaSl7dGhyb3cgaX1mdW5jdGlvbiB1dChpLGQsdix4KXt2YXIgQTt0cnl7aSYmayhBPWkucHJvbWlzZSk/QS5jYWxsKGkpLmRvbmUoZCkuZmFpbCh2KTppJiZrKEE9aS50aGVuKT9BLmNhbGwoaSxkLHYpOmQuYXBwbHkodm9pZCAwLFtpXS5zbGljZSh4KSl9Y2F0Y2goSSl7di5hcHBseSh2b2lkIDAsW0ldKX19dS5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGkpe3ZhciBkPVtbIm5vdGlmeSIsInByb2dyZXNzIix1LkNhbGxiYWNrcygibWVtb3J5IiksdS5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIix1LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSx2PSJwZW5kaW5nIix4PXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiB2fSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gQS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKEkpe3JldHVybiB4LnRoZW4obnVsbCxJKX0scGlwZTpmdW5jdGlvbigpe3ZhciBJPWFyZ3VtZW50cztyZXR1cm4gdS5EZWZlcnJlZChmdW5jdGlvbihFKXt1LmVhY2goZCxmdW5jdGlvbigkLFUpe3ZhciBRPWsoSVtVWzRdXSkmJklbVVs0XV07QVtVWzFdXShmdW5jdGlvbigpe3ZhciBkdD1RJiZRLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkdCYmayhkdC5wcm9taXNlKT9kdC5wcm9taXNlKCkucHJvZ3Jlc3MoRS5ub3RpZnkpLmRvbmUoRS5yZXNvbHZlKS5mYWlsKEUucmVqZWN0KTpFW1VbMF0rIldpdGgiXSh0aGlzLFE/W2R0XTphcmd1bWVudHMpfSl9KSxJPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24oSSxFLCQpe3ZhciBVPTA7ZnVuY3Rpb24gUShkdCxmdCxpdCx3dCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIEV0PXRoaXMsR3Q9YXJndW1lbnRzLE10PWZ1bmN0aW9uKCl7dmFyIHNlLE1lO2lmKCEoZHQ8VSkpe2lmKHNlPWl0LmFwcGx5KEV0LEd0KSxzZT09PWZ0LnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtNZT1zZSYmKHR5cGVvZiBzZT09Im9iamVjdCJ8fHR5cGVvZiBzZT09ImZ1bmN0aW9uIikmJnNlLnRoZW4sayhNZSk/d3Q/TWUuY2FsbChzZSxRKFUsZnQsS3Qsd3QpLFEoVSxmdCxELHd0KSk6KFUrKyxNZS5jYWxsKHNlLFEoVSxmdCxLdCx3dCksUShVLGZ0LEQsd3QpLFEoVSxmdCxLdCxmdC5ub3RpZnlXaXRoKSkpOihpdCE9PUt0JiYoRXQ9dm9pZCAwLEd0PVtzZV0pLCh3dHx8ZnQucmVzb2x2ZVdpdGgpKEV0LEd0KSl9fSxsZT13dD9NdDpmdW5jdGlvbigpe3RyeXtNdCgpfWNhdGNoKHNlKXt1LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnUuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhzZSxsZS5lcnJvciksZHQrMT49VSYmKGl0IT09RCYmKEV0PXZvaWQgMCxHdD1bc2VdKSxmdC5yZWplY3RXaXRoKEV0LEd0KSl9fTtkdD9sZSgpOih1LkRlZmVycmVkLmdldEVycm9ySG9vaz9sZS5lcnJvcj11LkRlZmVycmVkLmdldEVycm9ySG9vaygpOnUuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobGUuZXJyb3I9dS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksdC5zZXRUaW1lb3V0KGxlKSl9fXJldHVybiB1LkRlZmVycmVkKGZ1bmN0aW9uKGR0KXtkWzBdWzNdLmFkZChRKDAsZHQsaygkKT8kOkt0LGR0Lm5vdGlmeVdpdGgpKSxkWzFdWzNdLmFkZChRKDAsZHQsayhJKT9JOkt0KSksZFsyXVszXS5hZGQoUSgwLGR0LGsoRSk/RTpEKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oSSl7cmV0dXJuIEkhPW51bGw/dS5leHRlbmQoSSx4KTp4fX0sQT17fTtyZXR1cm4gdS5lYWNoKGQsZnVuY3Rpb24oSSxFKXt2YXIgJD1FWzJdLFU9RVs1XTt4W0VbMV1dPSQuYWRkLFUmJiQuYWRkKGZ1bmN0aW9uKCl7dj1VfSxkWzMtSV1bMl0uZGlzYWJsZSxkWzMtSV1bM10uZGlzYWJsZSxkWzBdWzJdLmxvY2ssZFswXVszXS5sb2NrKSwkLmFkZChFWzNdLmZpcmUpLEFbRVswXV09ZnVuY3Rpb24oKXtyZXR1cm4gQVtFWzBdKyJXaXRoIl0odGhpcz09PUE/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxBW0VbMF0rIldpdGgiXT0kLmZpcmVXaXRofSkseC5wcm9taXNlKEEpLGkmJmkuY2FsbChBLEEpLEF9LHdoZW46ZnVuY3Rpb24oaSl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aCx2PWQseD1BcnJheSh2KSxBPXMuY2FsbChhcmd1bWVudHMpLEk9dS5EZWZlcnJlZCgpLEU9ZnVuY3Rpb24oJCl7cmV0dXJuIGZ1bmN0aW9uKFUpe3hbJF09dGhpcyxBWyRdPWFyZ3VtZW50cy5sZW5ndGg+MT9zLmNhbGwoYXJndW1lbnRzKTpVLC0tZHx8SS5yZXNvbHZlV2l0aCh4LEEpfX07aWYoZDw9MSYmKHV0KGksSS5kb25lKEUodikpLnJlc29sdmUsSS5yZWplY3QsIWQpLEkuc3RhdGUoKT09PSJwZW5kaW5nInx8ayhBW3ZdJiZBW3ZdLnRoZW4pKSlyZXR1cm4gSS50aGVuKCk7Zm9yKDt2LS07KXV0KEFbdl0sRSh2KSxJLnJlamVjdCk7cmV0dXJuIEkucHJvbWlzZSgpfX0pO3ZhciBvdD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLzt1LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oaSxkKXt0LmNvbnNvbGUmJnQuY29uc29sZS53YXJuJiZpJiZvdC50ZXN0KGkubmFtZSkmJnQuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK2kubWVzc2FnZSxpLnN0YWNrLGQpfSx1LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKGkpe3Quc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGl9KX07dmFyIEg9dS5EZWZlcnJlZCgpO3UuZm4ucmVhZHk9ZnVuY3Rpb24oaSl7cmV0dXJuIEgudGhlbihpKS5jYXRjaChmdW5jdGlvbihkKXt1LnJlYWR5RXhjZXB0aW9uKGQpfSksdGhpc30sdS5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oaSl7KGk9PT0hMD8tLXUucmVhZHlXYWl0OnUuaXNSZWFkeSl8fCh1LmlzUmVhZHk9ITAsIShpIT09ITAmJi0tdS5yZWFkeVdhaXQ+MCkmJkgucmVzb2x2ZVdpdGgoRixbdV0pKX19KSx1LnJlYWR5LnRoZW49SC50aGVuO2Z1bmN0aW9uIE0oKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLE0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsTSksdS5yZWFkeSgpfUYucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSJ8fEYucmVhZHlTdGF0ZSE9PSJsb2FkaW5nIiYmIUYuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP3Quc2V0VGltZW91dCh1LnJlYWR5KTooRi5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixNKSx0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLE0pKTt2YXIgWT1mdW5jdGlvbihpLGQsdix4LEEsSSxFKXt2YXIgJD0wLFU9aS5sZW5ndGgsUT12PT1udWxsO2lmKGYodik9PT0ib2JqZWN0Iil7QT0hMDtmb3IoJCBpbiB2KVkoaSxkLCQsdlskXSwhMCxJLEUpfWVsc2UgaWYoeCE9PXZvaWQgMCYmKEE9ITAsayh4KXx8KEU9ITApLFEmJihFPyhkLmNhbGwoaSx4KSxkPW51bGwpOihRPWQsZD1mdW5jdGlvbihkdCxmdCxpdCl7cmV0dXJuIFEuY2FsbCh1KGR0KSxpdCl9KSksZCkpZm9yKDskPFU7JCsrKWQoaVskXSx2LEU/eDp4LmNhbGwoaVskXSwkLGQoaVskXSx2KSkpO3JldHVybiBBP2k6UT9kLmNhbGwoaSk6VT9kKGlbMF0sdik6SX0scHQ9L14tbXMtLyxtdD0vLShbYS16XSkvZztmdW5jdGlvbiBydChpLGQpe3JldHVybiBkLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gZ3QoaSl7cmV0dXJuIGkucmVwbGFjZShwdCwibXMtIikucmVwbGFjZShtdCxydCl9dmFyIEN0PWZ1bmN0aW9uKGkpe3JldHVybiBpLm5vZGVUeXBlPT09MXx8aS5ub2RlVHlwZT09PTl8fCEraS5ub2RlVHlwZX07ZnVuY3Rpb24geHQoKXt0aGlzLmV4cGFuZG89dS5leHBhbmRvK3h0LnVpZCsrfXh0LnVpZD0xLHh0LnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24oaSl7dmFyIGQ9aVt0aGlzLmV4cGFuZG9dO3JldHVybiBkfHwoZD17fSxDdChpKSYmKGkubm9kZVR5cGU/aVt0aGlzLmV4cGFuZG9dPWQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGksdGhpcy5leHBhbmRvLHt2YWx1ZTpkLGNvbmZpZ3VyYWJsZTohMH0pKSksZH0sc2V0OmZ1bmN0aW9uKGksZCx2KXt2YXIgeCxBPXRoaXMuY2FjaGUoaSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKUFbZ3QoZCldPXY7ZWxzZSBmb3IoeCBpbiBkKUFbZ3QoeCldPWRbeF07cmV0dXJuIEF9LGdldDpmdW5jdGlvbihpLGQpe3JldHVybiBkPT09dm9pZCAwP3RoaXMuY2FjaGUoaSk6aVt0aGlzLmV4cGFuZG9dJiZpW3RoaXMuZXhwYW5kb11bZ3QoZCldfSxhY2Nlc3M6ZnVuY3Rpb24oaSxkLHYpe3JldHVybiBkPT09dm9pZCAwfHxkJiZ0eXBlb2YgZD09InN0cmluZyImJnY9PT12b2lkIDA/dGhpcy5nZXQoaSxkKToodGhpcy5zZXQoaSxkLHYpLHYhPT12b2lkIDA/djpkKX0scmVtb3ZlOmZ1bmN0aW9uKGksZCl7dmFyIHYseD1pW3RoaXMuZXhwYW5kb107aWYoeCE9PXZvaWQgMCl7aWYoZCE9PXZvaWQgMClmb3IoQXJyYXkuaXNBcnJheShkKT9kPWQubWFwKGd0KTooZD1ndChkKSxkPWQgaW4geD9bZF06ZC5tYXRjaChCdCl8fFtdKSx2PWQubGVuZ3RoO3YtLTspZGVsZXRlIHhbZFt2XV07KGQ9PT12b2lkIDB8fHUuaXNFbXB0eU9iamVjdCh4KSkmJihpLm5vZGVUeXBlP2lbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGlbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGkpe3ZhciBkPWlbdGhpcy5leHBhbmRvXTtyZXR1cm4gZCE9PXZvaWQgMCYmIXUuaXNFbXB0eU9iamVjdChkKX19O3ZhciBidD1uZXcgeHQsenQ9bmV3IHh0LFV0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8scGU9L1tBLVpdL2c7ZnVuY3Rpb24gc3IoaSl7cmV0dXJuIGk9PT0idHJ1ZSI/ITA6aT09PSJmYWxzZSI/ITE6aT09PSJudWxsIj9udWxsOmk9PT0raSsiIj8raTpVdC50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aX1mdW5jdGlvbiB3ZShpLGQsdil7dmFyIHg7aWYodj09PXZvaWQgMCYmaS5ub2RlVHlwZT09PTEpaWYoeD0iZGF0YS0iK2QucmVwbGFjZShwZSwiLSQmIikudG9Mb3dlckNhc2UoKSx2PWkuZ2V0QXR0cmlidXRlKHgpLHR5cGVvZiB2PT0ic3RyaW5nIil7dHJ5e3Y9c3Iodil9Y2F0Y2h7fXp0LnNldChpLGQsdil9ZWxzZSB2PXZvaWQgMDtyZXR1cm4gdn11LmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihpKXtyZXR1cm4genQuaGFzRGF0YShpKXx8YnQuaGFzRGF0YShpKX0sZGF0YTpmdW5jdGlvbihpLGQsdil7cmV0dXJuIHp0LmFjY2VzcyhpLGQsdil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oaSxkKXt6dC5yZW1vdmUoaSxkKX0sX2RhdGE6ZnVuY3Rpb24oaSxkLHYpe3JldHVybiBidC5hY2Nlc3MoaSxkLHYpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihpLGQpe2J0LnJlbW92ZShpLGQpfX0pLHUuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGksZCl7dmFyIHYseCxBLEk9dGhpc1swXSxFPUkmJkkuYXR0cmlidXRlcztpZihpPT09dm9pZCAwKXtpZih0aGlzLmxlbmd0aCYmKEE9enQuZ2V0KEkpLEkubm9kZVR5cGU9PT0xJiYhYnQuZ2V0KEksImhhc0RhdGFBdHRycyIpKSl7Zm9yKHY9RS5sZW5ndGg7di0tOylFW3ZdJiYoeD1FW3ZdLm5hbWUseC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKHg9Z3QoeC5zbGljZSg1KSksd2UoSSx4LEFbeF0pKSk7YnQuc2V0KEksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBBfXJldHVybiB0eXBlb2YgaT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7enQuc2V0KHRoaXMsaSl9KTpZKHRoaXMsZnVuY3Rpb24oJCl7dmFyIFU7aWYoSSYmJD09PXZvaWQgMClyZXR1cm4gVT16dC5nZXQoSSxpKSxVIT09dm9pZCAwfHwoVT13ZShJLGkpLFUhPT12b2lkIDApP1U6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe3p0LnNldCh0aGlzLGksJCl9KX0sbnVsbCxkLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7enQucmVtb3ZlKHRoaXMsaSl9KX19KSx1LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oaSxkLHYpe3ZhciB4O2lmKGkpcmV0dXJuIGQ9KGR8fCJmeCIpKyJxdWV1ZSIseD1idC5nZXQoaSxkKSx2JiYoIXh8fEFycmF5LmlzQXJyYXkodik/eD1idC5hY2Nlc3MoaSxkLHUubWFrZUFycmF5KHYpKTp4LnB1c2godikpLHh8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGksZCl7ZD1kfHwiZngiO3ZhciB2PXUucXVldWUoaSxkKSx4PXYubGVuZ3RoLEE9di5zaGlmdCgpLEk9dS5fcXVldWVIb29rcyhpLGQpLEU9ZnVuY3Rpb24oKXt1LmRlcXVldWUoaSxkKX07QT09PSJpbnByb2dyZXNzIiYmKEE9di5zaGlmdCgpLHgtLSksQSYmKGQ9PT0iZngiJiZ2LnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgSS5zdG9wLEEuY2FsbChpLEUsSSkpLCF4JiZJJiZJLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oaSxkKXt2YXIgdj1kKyJxdWV1ZUhvb2tzIjtyZXR1cm4gYnQuZ2V0KGksdil8fGJ0LmFjY2VzcyhpLHYse2VtcHR5OnUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe2J0LnJlbW92ZShpLFtkKyJxdWV1ZSIsdl0pfSl9KX19KSx1LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oaSxkKXt2YXIgdj0yO3JldHVybiB0eXBlb2YgaSE9InN0cmluZyImJihkPWksaT0iZngiLHYtLSksYXJndW1lbnRzLmxlbmd0aDx2P3UucXVldWUodGhpc1swXSxpKTpkPT09dm9pZCAwP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHg9dS5xdWV1ZSh0aGlzLGksZCk7dS5fcXVldWVIb29rcyh0aGlzLGkpLGk9PT0iZngiJiZ4WzBdIT09ImlucHJvZ3Jlc3MiJiZ1LmRlcXVldWUodGhpcyxpKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt1LmRlcXVldWUodGhpcyxpKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnF1ZXVlKGl8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGksZCl7dmFyIHYseD0xLEE9dS5EZWZlcnJlZCgpLEk9dGhpcyxFPXRoaXMubGVuZ3RoLCQ9ZnVuY3Rpb24oKXstLXh8fEEucmVzb2x2ZVdpdGgoSSxbSV0pfTtmb3IodHlwZW9mIGkhPSJzdHJpbmciJiYoZD1pLGk9dm9pZCAwKSxpPWl8fCJmeCI7RS0tOyl2PWJ0LmdldChJW0VdLGkrInF1ZXVlSG9va3MiKSx2JiZ2LmVtcHR5JiYoeCsrLHYuZW1wdHkuYWRkKCQpKTtyZXR1cm4gJCgpLEEucHJvbWlzZShkKX19KTt2YXIgWWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1llKyIpKFthLXolXSopJCIsImkiKSxiZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLE9lPUYuZG9jdW1lbnRFbGVtZW50LGRlPWZ1bmN0aW9uKGkpe3JldHVybiB1LmNvbnRhaW5zKGkub3duZXJEb2N1bWVudCxpKX0sdG49e2NvbXBvc2VkOiEwfTtPZS5nZXRSb290Tm9kZSYmKGRlPWZ1bmN0aW9uKGkpe3JldHVybiB1LmNvbnRhaW5zKGkub3duZXJEb2N1bWVudCxpKXx8aS5nZXRSb290Tm9kZSh0bik9PT1pLm93bmVyRG9jdW1lbnR9KTt2YXIgZ3I9ZnVuY3Rpb24oaSxkKXtyZXR1cm4gaT1kfHxpLGkuc3R5bGUuZGlzcGxheT09PSJub25lInx8aS5zdHlsZS5kaXNwbGF5PT09IiImJmRlKGkpJiZ1LmNzcyhpLCJkaXNwbGF5Iik9PT0ibm9uZSJ9O2Z1bmN0aW9uIGVuKGksZCx2LHgpe3ZhciBBLEksRT0yMCwkPXg/ZnVuY3Rpb24oKXtyZXR1cm4geC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdS5jc3MoaSxkLCIiKX0sVT0kKCksUT12JiZ2WzNdfHwodS5jc3NOdW1iZXJbZF0/IiI6InB4IiksZHQ9aS5ub2RlVHlwZSYmKHUuY3NzTnVtYmVyW2RdfHxRIT09InB4IiYmK1UpJiZ0ZS5leGVjKHUuY3NzKGksZCkpO2lmKGR0JiZkdFszXSE9PVEpe2ZvcihVPVUvMixRPVF8fGR0WzNdLGR0PStVfHwxO0UtLTspdS5zdHlsZShpLGQsZHQrUSksKDEtSSkqKDEtKEk9JCgpL1V8fC41KSk8PTAmJihFPTApLGR0PWR0L0k7ZHQ9ZHQqMix1LnN0eWxlKGksZCxkdCtRKSx2PXZ8fFtdfXJldHVybiB2JiYoZHQ9K2R0fHwrVXx8MCxBPXZbMV0/ZHQrKHZbMV0rMSkqdlsyXTordlsyXSx4JiYoeC51bml0PVEseC5zdGFydD1kdCx4LmVuZD1BKSksQX12YXIgcm49e307ZnVuY3Rpb24gbm4oaSl7dmFyIGQsdj1pLm93bmVyRG9jdW1lbnQseD1pLm5vZGVOYW1lLEE9cm5beF07cmV0dXJuIEF8fChkPXYuYm9keS5hcHBlbmRDaGlsZCh2LmNyZWF0ZUVsZW1lbnQoeCkpLEE9dS5jc3MoZCwiZGlzcGxheSIpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxBPT09Im5vbmUiJiYoQT0iYmxvY2siKSxyblt4XT1BLEEpfWZ1bmN0aW9uIFRlKGksZCl7Zm9yKHZhciB2LHgsQT1bXSxJPTAsRT1pLmxlbmd0aDtJPEU7SSsrKXg9aVtJXSx4LnN0eWxlJiYodj14LnN0eWxlLmRpc3BsYXksZD8odj09PSJub25lIiYmKEFbSV09YnQuZ2V0KHgsImRpc3BsYXkiKXx8bnVsbCxBW0ldfHwoeC5zdHlsZS5kaXNwbGF5PSIiKSkseC5zdHlsZS5kaXNwbGF5PT09IiImJmdyKHgpJiYoQVtJXT1ubih4KSkpOnYhPT0ibm9uZSImJihBW0ldPSJub25lIixidC5zZXQoeCwiZGlzcGxheSIsdikpKTtmb3IoST0wO0k8RTtJKyspQVtJXSE9bnVsbCYmKGlbSV0uc3R5bGUuZGlzcGxheT1BW0ldKTtyZXR1cm4gaX11LmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBUZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBUZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGkpe3JldHVybiB0eXBlb2YgaT09ImJvb2xlYW4iP2k/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Z3IodGhpcyk/dSh0aGlzKS5zaG93KCk6dSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgamU9L14oPzpjaGVja2JveHxyYWRpbykkL2ksR2k9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksWGk9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pOyhmdW5jdGlvbigpe3ZhciBpPUYuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGQ9aS5hcHBlbmRDaGlsZChGLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx2PUYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt2LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZC5hcHBlbmRDaGlsZCh2KSx3LmNoZWNrQ2xvbmU9ZC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHcubm9DbG9uZUNoZWNrZWQ9ISFkLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxkLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHcub3B0aW9uPSEhZC5sYXN0Q2hpbGR9KSgpO3ZhciBrZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2tlLnRib2R5PWtlLnRmb290PWtlLmNvbGdyb3VwPWtlLmNhcHRpb249a2UudGhlYWQsa2UudGg9a2UudGQsdy5vcHRpb258fChrZS5vcHRncm91cD1rZS5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7ZnVuY3Rpb24gdmUoaSxkKXt2YXIgdjtyZXR1cm4gdHlwZW9mIGkuZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiP3Y9aS5nZXRFbGVtZW50c0J5VGFnTmFtZShkfHwiKiIpOnR5cGVvZiBpLnF1ZXJ5U2VsZWN0b3JBbGw8InUiP3Y9aS5xdWVyeVNlbGVjdG9yQWxsKGR8fCIqIik6dj1bXSxkPT09dm9pZCAwfHxkJiZxKGksZCk/dS5tZXJnZShbaV0sdik6dn1mdW5jdGlvbiBMbihpLGQpe2Zvcih2YXIgdj0wLHg9aS5sZW5ndGg7djx4O3YrKylidC5zZXQoaVt2XSwiZ2xvYmFsRXZhbCIsIWR8fGJ0LmdldChkW3ZdLCJnbG9iYWxFdmFsIikpfXZhciBxcz0vPHwmIz9cdys7LztmdW5jdGlvbiAkaShpLGQsdix4LEEpe2Zvcih2YXIgSSxFLCQsVSxRLGR0LGZ0PWQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGl0PVtdLHd0PTAsRXQ9aS5sZW5ndGg7d3Q8RXQ7d3QrKylpZihJPWlbd3RdLEl8fEk9PT0wKWlmKGYoSSk9PT0ib2JqZWN0Iil1Lm1lcmdlKGl0LEkubm9kZVR5cGU/W0ldOkkpO2Vsc2UgaWYoIXFzLnRlc3QoSSkpaXQucHVzaChkLmNyZWF0ZVRleHROb2RlKEkpKTtlbHNle2ZvcihFPUV8fGZ0LmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLCQ9KEdpLmV4ZWMoSSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksVT1rZVskXXx8a2UuX2RlZmF1bHQsRS5pbm5lckhUTUw9VVsxXSt1Lmh0bWxQcmVmaWx0ZXIoSSkrVVsyXSxkdD1VWzBdO2R0LS07KUU9RS5sYXN0Q2hpbGQ7dS5tZXJnZShpdCxFLmNoaWxkTm9kZXMpLEU9ZnQuZmlyc3RDaGlsZCxFLnRleHRDb250ZW50PSIifWZvcihmdC50ZXh0Q29udGVudD0iIix3dD0wO0k9aXRbd3QrK107KXtpZih4JiZ1LmluQXJyYXkoSSx4KT4tMSl7QSYmQS5wdXNoKEkpO2NvbnRpbnVlfWlmKFE9ZGUoSSksRT12ZShmdC5hcHBlbmRDaGlsZChJKSwic2NyaXB0IiksUSYmTG4oRSksdilmb3IoZHQ9MDtJPUVbZHQrK107KVhpLnRlc3QoSS50eXBlfHwiIikmJnYucHVzaChJKX1yZXR1cm4gZnR9dmFyIFppPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB5cigpe3JldHVybiEwfWZ1bmN0aW9uIHdyKCl7cmV0dXJuITF9ZnVuY3Rpb24gem4oaSxkLHYseCxBLEkpe3ZhciBFLCQ7aWYodHlwZW9mIGQ9PSJvYmplY3QiKXt0eXBlb2YgdiE9InN0cmluZyImJih4PXh8fHYsdj12b2lkIDApO2ZvcigkIGluIGQpem4oaSwkLHYseCxkWyRdLEkpO3JldHVybiBpfWlmKHg9PW51bGwmJkE9PW51bGw/KEE9dix4PXY9dm9pZCAwKTpBPT1udWxsJiYodHlwZW9mIHY9PSJzdHJpbmciPyhBPXgseD12b2lkIDApOihBPXgseD12LHY9dm9pZCAwKSksQT09PSExKUE9d3I7ZWxzZSBpZighQSlyZXR1cm4gaTtyZXR1cm4gST09PTEmJihFPUEsQT1mdW5jdGlvbihVKXtyZXR1cm4gdSgpLm9mZihVKSxFLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQS5ndWlkPUUuZ3VpZHx8KEUuZ3VpZD11Lmd1aWQrKykpLGkuZWFjaChmdW5jdGlvbigpe3UuZXZlbnQuYWRkKHRoaXMsZCxBLHgsdil9KX11LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGksZCx2LHgsQSl7dmFyIEksRSwkLFUsUSxkdCxmdCxpdCx3dCxFdCxHdCxNdD1idC5nZXQoaSk7aWYoQ3QoaSkpZm9yKHYuaGFuZGxlciYmKEk9dix2PUkuaGFuZGxlcixBPUkuc2VsZWN0b3IpLEEmJnUuZmluZC5tYXRjaGVzU2VsZWN0b3IoT2UsQSksdi5ndWlkfHwodi5ndWlkPXUuZ3VpZCsrKSwoVT1NdC5ldmVudHMpfHwoVT1NdC5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKEU9TXQuaGFuZGxlKXx8KEU9TXQuaGFuZGxlPWZ1bmN0aW9uKGxlKXtyZXR1cm4gdHlwZW9mIHU8InUiJiZ1LmV2ZW50LnRyaWdnZXJlZCE9PWxlLnR5cGU/dS5ldmVudC5kaXNwYXRjaC5hcHBseShpLGFyZ3VtZW50cyk6dm9pZCAwfSksZD0oZHx8IiIpLm1hdGNoKEJ0KXx8WyIiXSxRPWQubGVuZ3RoO1EtLTspJD1aaS5leGVjKGRbUV0pfHxbXSx3dD1HdD0kWzFdLEV0PSgkWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksd3QmJihmdD11LmV2ZW50LnNwZWNpYWxbd3RdfHx7fSx3dD0oQT9mdC5kZWxlZ2F0ZVR5cGU6ZnQuYmluZFR5cGUpfHx3dCxmdD11LmV2ZW50LnNwZWNpYWxbd3RdfHx7fSxkdD11LmV4dGVuZCh7dHlwZTp3dCxvcmlnVHlwZTpHdCxkYXRhOngsaGFuZGxlcjp2LGd1aWQ6di5ndWlkLHNlbGVjdG9yOkEsbmVlZHNDb250ZXh0OkEmJnUuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChBKSxuYW1lc3BhY2U6RXQuam9pbigiLiIpfSxJKSwoaXQ9VVt3dF0pfHwoaXQ9VVt3dF09W10saXQuZGVsZWdhdGVDb3VudD0wLCghZnQuc2V0dXB8fGZ0LnNldHVwLmNhbGwoaSx4LEV0LEUpPT09ITEpJiZpLmFkZEV2ZW50TGlzdGVuZXImJmkuYWRkRXZlbnRMaXN0ZW5lcih3dCxFKSksZnQuYWRkJiYoZnQuYWRkLmNhbGwoaSxkdCksZHQuaGFuZGxlci5ndWlkfHwoZHQuaGFuZGxlci5ndWlkPXYuZ3VpZCkpLEE/aXQuc3BsaWNlKGl0LmRlbGVnYXRlQ291bnQrKywwLGR0KTppdC5wdXNoKGR0KSx1LmV2ZW50Lmdsb2JhbFt3dF09ITApfSxyZW1vdmU6ZnVuY3Rpb24oaSxkLHYseCxBKXt2YXIgSSxFLCQsVSxRLGR0LGZ0LGl0LHd0LEV0LEd0LE10PWJ0Lmhhc0RhdGEoaSkmJmJ0LmdldChpKTtpZighKCFNdHx8IShVPU10LmV2ZW50cykpKXtmb3IoZD0oZHx8IiIpLm1hdGNoKEJ0KXx8WyIiXSxRPWQubGVuZ3RoO1EtLTspe2lmKCQ9WmkuZXhlYyhkW1FdKXx8W10sd3Q9R3Q9JFsxXSxFdD0oJFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLCF3dCl7Zm9yKHd0IGluIFUpdS5ldmVudC5yZW1vdmUoaSx3dCtkW1FdLHYseCwhMCk7Y29udGludWV9Zm9yKGZ0PXUuZXZlbnQuc3BlY2lhbFt3dF18fHt9LHd0PSh4P2Z0LmRlbGVnYXRlVHlwZTpmdC5iaW5kVHlwZSl8fHd0LGl0PVVbd3RdfHxbXSwkPSRbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK0V0LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLEU9ST1pdC5sZW5ndGg7SS0tOylkdD1pdFtJXSwoQXx8R3Q9PT1kdC5vcmlnVHlwZSkmJighdnx8di5ndWlkPT09ZHQuZ3VpZCkmJighJHx8JC50ZXN0KGR0Lm5hbWVzcGFjZSkpJiYoIXh8fHg9PT1kdC5zZWxlY3Rvcnx8eD09PSIqKiImJmR0LnNlbGVjdG9yKSYmKGl0LnNwbGljZShJLDEpLGR0LnNlbGVjdG9yJiZpdC5kZWxlZ2F0ZUNvdW50LS0sZnQucmVtb3ZlJiZmdC5yZW1vdmUuY2FsbChpLGR0KSk7RSYmIWl0Lmxlbmd0aCYmKCghZnQudGVhcmRvd258fGZ0LnRlYXJkb3duLmNhbGwoaSxFdCxNdC5oYW5kbGUpPT09ITEpJiZ1LnJlbW92ZUV2ZW50KGksd3QsTXQuaGFuZGxlKSxkZWxldGUgVVt3dF0pfXUuaXNFbXB0eU9iamVjdChVKSYmYnQucmVtb3ZlKGksImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGkpe3ZhciBkLHYseCxBLEksRSwkPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxVPXUuZXZlbnQuZml4KGkpLFE9KGJ0LmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbVS50eXBlXXx8W10sZHQ9dS5ldmVudC5zcGVjaWFsW1UudHlwZV18fHt9O2ZvcigkWzBdPVUsZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDtkKyspJFtkXT1hcmd1bWVudHNbZF07aWYoVS5kZWxlZ2F0ZVRhcmdldD10aGlzLCEoZHQucHJlRGlzcGF0Y2gmJmR0LnByZURpc3BhdGNoLmNhbGwodGhpcyxVKT09PSExKSl7Zm9yKEU9dS5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsVSxRKSxkPTA7KEE9RVtkKytdKSYmIVUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKFUuY3VycmVudFRhcmdldD1BLmVsZW0sdj0wOyhJPUEuaGFuZGxlcnNbdisrXSkmJiFVLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KSghVS5ybmFtZXNwYWNlfHxJLm5hbWVzcGFjZT09PSExfHxVLnJuYW1lc3BhY2UudGVzdChJLm5hbWVzcGFjZSkpJiYoVS5oYW5kbGVPYmo9SSxVLmRhdGE9SS5kYXRhLHg9KCh1LmV2ZW50LnNwZWNpYWxbSS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fEkuaGFuZGxlcikuYXBwbHkoQS5lbGVtLCQpLHghPT12b2lkIDAmJihVLnJlc3VsdD14KT09PSExJiYoVS5wcmV2ZW50RGVmYXVsdCgpLFUuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gZHQucG9zdERpc3BhdGNoJiZkdC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLFUpLFUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oaSxkKXt2YXIgdix4LEEsSSxFLCQ9W10sVT1kLmRlbGVnYXRlQ291bnQsUT1pLnRhcmdldDtpZihVJiZRLm5vZGVUeXBlJiYhKGkudHlwZT09PSJjbGljayImJmkuYnV0dG9uPj0xKSl7Zm9yKDtRIT09dGhpcztRPVEucGFyZW50Tm9kZXx8dGhpcylpZihRLm5vZGVUeXBlPT09MSYmIShpLnR5cGU9PT0iY2xpY2siJiZRLmRpc2FibGVkPT09ITApKXtmb3IoST1bXSxFPXt9LHY9MDt2PFU7disrKXg9ZFt2XSxBPXguc2VsZWN0b3IrIiAiLEVbQV09PT12b2lkIDAmJihFW0FdPXgubmVlZHNDb250ZXh0P3UoQSx0aGlzKS5pbmRleChRKT4tMTp1LmZpbmQoQSx0aGlzLG51bGwsW1FdKS5sZW5ndGgpLEVbQV0mJkkucHVzaCh4KTtJLmxlbmd0aCYmJC5wdXNoKHtlbGVtOlEsaGFuZGxlcnM6SX0pfX1yZXR1cm4gUT10aGlzLFU8ZC5sZW5ndGgmJiQucHVzaCh7ZWxlbTpRLGhhbmRsZXJzOmQuc2xpY2UoVSl9KSwkfSxhZGRQcm9wOmZ1bmN0aW9uKGksZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUuRXZlbnQucHJvdG90eXBlLGkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDprKGQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBkKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbaV19LHNldDpmdW5jdGlvbih2KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxpLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2fSl9fSl9LGZpeDpmdW5jdGlvbihpKXtyZXR1cm4gaVt1LmV4cGFuZG9dP2k6bmV3IHUuRXZlbnQoaSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oaSl7dmFyIGQ9dGhpc3x8aTtyZXR1cm4gamUudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZxKGQsImlucHV0IikmJmFuKGQsImNsaWNrIiwhMCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oaSl7dmFyIGQ9dGhpc3x8aTtyZXR1cm4gamUudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZxKGQsImlucHV0IikmJmFuKGQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGkpe3ZhciBkPWkudGFyZ2V0O3JldHVybiBqZS50ZXN0KGQudHlwZSkmJmQuY2xpY2smJnEoZCwiaW5wdXQiKSYmYnQuZ2V0KGQsImNsaWNrIil8fHEoZCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oaSl7aS5yZXN1bHQhPT12b2lkIDAmJmkub3JpZ2luYWxFdmVudCYmKGkub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1pLnJlc3VsdCl9fX19O2Z1bmN0aW9uIGFuKGksZCx2KXtpZighdil7YnQuZ2V0KGksZCk9PT12b2lkIDAmJnUuZXZlbnQuYWRkKGksZCx5cik7cmV0dXJufWJ0LnNldChpLGQsITEpLHUuZXZlbnQuYWRkKGksZCx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oeCl7dmFyIEEsST1idC5nZXQodGhpcyxkKTtpZih4LmlzVHJpZ2dlciYxJiZ0aGlzW2RdKXtpZihJKSh1LmV2ZW50LnNwZWNpYWxbZF18fHt9KS5kZWxlZ2F0ZVR5cGUmJnguc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihJPXMuY2FsbChhcmd1bWVudHMpLGJ0LnNldCh0aGlzLGQsSSksdGhpc1tkXSgpLEE9YnQuZ2V0KHRoaXMsZCksYnQuc2V0KHRoaXMsZCwhMSksSSE9PUEpcmV0dXJuIHguc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkseC5wcmV2ZW50RGVmYXVsdCgpLEF9ZWxzZSBJJiYoYnQuc2V0KHRoaXMsZCx1LmV2ZW50LnRyaWdnZXIoSVswXSxJLnNsaWNlKDEpLHRoaXMpKSx4LnN0b3BQcm9wYWdhdGlvbigpLHguaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9eXIpfX0pfXUucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oaSxkLHYpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lciYmaS5yZW1vdmVFdmVudExpc3RlbmVyKGQsdil9LHUuRXZlbnQ9ZnVuY3Rpb24oaSxkKXtpZighKHRoaXMgaW5zdGFuY2VvZiB1LkV2ZW50KSlyZXR1cm4gbmV3IHUuRXZlbnQoaSxkKTtpJiZpLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1pLHRoaXMudHlwZT1pLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9aS5kZWZhdWx0UHJldmVudGVkfHxpLmRlZmF1bHRQcmV2ZW50ZWQ9PT12b2lkIDAmJmkucmV0dXJuVmFsdWU9PT0hMT95cjp3cix0aGlzLnRhcmdldD1pLnRhcmdldCYmaS50YXJnZXQubm9kZVR5cGU9PT0zP2kudGFyZ2V0LnBhcmVudE5vZGU6aS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWkuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9aS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9aSxkJiZ1LmV4dGVuZCh0aGlzLGQpLHRoaXMudGltZVN0YW1wPWkmJmkudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbdS5leHBhbmRvXT0hMH0sdS5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnUuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndyLGlzUHJvcGFnYXRpb25TdG9wcGVkOndyLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndyLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXlyLGkmJiF0aGlzLmlzU2ltdWxhdGVkJiZpLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBpPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXlyLGkmJiF0aGlzLmlzU2ltdWxhdGVkJiZpLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD15cixpJiYhdGhpcy5pc1NpbXVsYXRlZCYmaS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sdS5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDohMH0sdS5ldmVudC5hZGRQcm9wKSx1LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGksZCl7ZnVuY3Rpb24gdih4KXtpZihGLmRvY3VtZW50TW9kZSl7dmFyIEE9YnQuZ2V0KHRoaXMsImhhbmRsZSIpLEk9dS5ldmVudC5maXgoeCk7SS50eXBlPXgudHlwZT09PSJmb2N1c2luIj8iZm9jdXMiOiJibHVyIixJLmlzU2ltdWxhdGVkPSEwLEEoeCksSS50YXJnZXQ9PT1JLmN1cnJlbnRUYXJnZXQmJkEoSSl9ZWxzZSB1LmV2ZW50LnNpbXVsYXRlKGQseC50YXJnZXQsdS5ldmVudC5maXgoeCkpfXUuZXZlbnQuc3BlY2lhbFtpXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgeDtpZihhbih0aGlzLGksITApLEYuZG9jdW1lbnRNb2RlKXg9YnQuZ2V0KHRoaXMsZCkseHx8dGhpcy5hZGRFdmVudExpc3RlbmVyKGQsdiksYnQuc2V0KHRoaXMsZCwoeHx8MCkrMSk7ZWxzZSByZXR1cm4hMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBhbih0aGlzLGkpLCEwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciB4O2lmKEYuZG9jdW1lbnRNb2RlKXg9YnQuZ2V0KHRoaXMsZCktMSx4P2J0LnNldCh0aGlzLGQseCk6KHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHYpLGJ0LnJlbW92ZSh0aGlzLGQpKTtlbHNlIHJldHVybiExfSxfZGVmYXVsdDpmdW5jdGlvbih4KXtyZXR1cm4gYnQuZ2V0KHgudGFyZ2V0LGkpfSxkZWxlZ2F0ZVR5cGU6ZH0sdS5ldmVudC5zcGVjaWFsW2RdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciB4PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxBPUYuZG9jdW1lbnRNb2RlP3RoaXM6eCxJPWJ0LmdldChBLGQpO0l8fChGLmRvY3VtZW50TW9kZT90aGlzLmFkZEV2ZW50TGlzdGVuZXIoZCx2KTp4LmFkZEV2ZW50TGlzdGVuZXIoaSx2LCEwKSksYnQuc2V0KEEsZCwoSXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLEE9Ri5kb2N1bWVudE1vZGU/dGhpczp4LEk9YnQuZ2V0KEEsZCktMTtJP2J0LnNldChBLGQsSSk6KEYuZG9jdW1lbnRNb2RlP3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHYpOngucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLHYsITApLGJ0LnJlbW92ZShBLGQpKX19fSksdS5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihpLGQpe3UuZXZlbnQuc3BlY2lhbFtpXT17ZGVsZWdhdGVUeXBlOmQsYmluZFR5cGU6ZCxoYW5kbGU6ZnVuY3Rpb24odil7dmFyIHgsQT10aGlzLEk9di5yZWxhdGVkVGFyZ2V0LEU9di5oYW5kbGVPYmo7cmV0dXJuKCFJfHxJIT09QSYmIXUuY29udGFpbnMoQSxJKSkmJih2LnR5cGU9RS5vcmlnVHlwZSx4PUUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdi50eXBlPWQpLHh9fX0pLHUuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihpLGQsdix4KXtyZXR1cm4gem4odGhpcyxpLGQsdix4KX0sb25lOmZ1bmN0aW9uKGksZCx2LHgpe3JldHVybiB6bih0aGlzLGksZCx2LHgsMSl9LG9mZjpmdW5jdGlvbihpLGQsdil7dmFyIHgsQTtpZihpJiZpLnByZXZlbnREZWZhdWx0JiZpLmhhbmRsZU9iailyZXR1cm4geD1pLmhhbmRsZU9iaix1KGkuZGVsZWdhdGVUYXJnZXQpLm9mZih4Lm5hbWVzcGFjZT94Lm9yaWdUeXBlKyIuIit4Lm5hbWVzcGFjZTp4Lm9yaWdUeXBlLHguc2VsZWN0b3IseC5oYW5kbGVyKSx0aGlzO2lmKHR5cGVvZiBpPT0ib2JqZWN0Iil7Zm9yKEEgaW4gaSl0aGlzLm9mZihBLGQsaVtBXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGQ9PT0hMXx8dHlwZW9mIGQ9PSJmdW5jdGlvbiIpJiYodj1kLGQ9dm9pZCAwKSx2PT09ITEmJih2PXdyKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt1LmV2ZW50LnJlbW92ZSh0aGlzLGksdixkKX0pfX0pO3ZhciBHcz0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxYcz0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwkcz0vXlxzKjwhXFtDREFUQVxbfFxdXF0+XHMqJC9nO2Z1bmN0aW9uIEtpKGksZCl7cmV0dXJuIHEoaSwidGFibGUiKSYmcShkLm5vZGVUeXBlIT09MTE/ZDpkLmZpcnN0Q2hpbGQsInRyIikmJnUoaSkuY2hpbGRyZW4oInRib2R5IilbMF18fGl9ZnVuY3Rpb24gWnMoaSl7cmV0dXJuIGkudHlwZT0oaS5nZXRBdHRyaWJ1dGUoInR5cGUiKSE9PW51bGwpKyIvIitpLnR5cGUsaX1mdW5jdGlvbiBLcyhpKXtyZXR1cm4oaS50eXBlfHwiIikuc2xpY2UoMCw1KT09PSJ0cnVlLyI/aS50eXBlPWkudHlwZS5zbGljZSg1KTppLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGl9ZnVuY3Rpb24gWWkoaSxkKXt2YXIgdix4LEEsSSxFLCQsVTtpZihkLm5vZGVUeXBlPT09MSl7aWYoYnQuaGFzRGF0YShpKSYmKEk9YnQuZ2V0KGkpLFU9SS5ldmVudHMsVSkpe2J0LnJlbW92ZShkLCJoYW5kbGUgZXZlbnRzIik7Zm9yKEEgaW4gVSlmb3Iodj0wLHg9VVtBXS5sZW5ndGg7djx4O3YrKyl1LmV2ZW50LmFkZChkLEEsVVtBXVt2XSl9enQuaGFzRGF0YShpKSYmKEU9enQuYWNjZXNzKGkpLCQ9dS5leHRlbmQoe30sRSksenQuc2V0KGQsJCkpfX1mdW5jdGlvbiBZcyhpLGQpe3ZhciB2PWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTt2PT09ImlucHV0IiYmamUudGVzdChpLnR5cGUpP2QuY2hlY2tlZD1pLmNoZWNrZWQ6KHY9PT0iaW5wdXQifHx2PT09InRleHRhcmVhIikmJihkLmRlZmF1bHRWYWx1ZT1pLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24geHIoaSxkLHYseCl7ZD1hKGQpO3ZhciBBLEksRSwkLFUsUSxkdD0wLGZ0PWkubGVuZ3RoLGl0PWZ0LTEsd3Q9ZFswXSxFdD1rKHd0KTtpZihFdHx8ZnQ+MSYmdHlwZW9mIHd0PT0ic3RyaW5nIiYmIXcuY2hlY2tDbG9uZSYmWHMudGVzdCh3dCkpcmV0dXJuIGkuZWFjaChmdW5jdGlvbihHdCl7dmFyIE10PWkuZXEoR3QpO0V0JiYoZFswXT13dC5jYWxsKHRoaXMsR3QsTXQuaHRtbCgpKSkseHIoTXQsZCx2LHgpfSk7aWYoZnQmJihBPSRpKGQsaVswXS5vd25lckRvY3VtZW50LCExLGkseCksST1BLmZpcnN0Q2hpbGQsQS5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJihBPUkpLEl8fHgpKXtmb3IoRT11Lm1hcCh2ZShBLCJzY3JpcHQiKSxacyksJD1FLmxlbmd0aDtkdDxmdDtkdCsrKVU9QSxkdCE9PWl0JiYoVT11LmNsb25lKFUsITAsITApLCQmJnUubWVyZ2UoRSx2ZShVLCJzY3JpcHQiKSkpLHYuY2FsbChpW2R0XSxVLGR0KTtpZigkKWZvcihRPUVbRS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx1Lm1hcChFLEtzKSxkdD0wO2R0PCQ7ZHQrKylVPUVbZHRdLFhpLnRlc3QoVS50eXBlfHwiIikmJiFidC5hY2Nlc3MoVSwiZ2xvYmFsRXZhbCIpJiZ1LmNvbnRhaW5zKFEsVSkmJihVLnNyYyYmKFUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkhPT0ibW9kdWxlIj91Ll9ldmFsVXJsJiYhVS5ub01vZHVsZSYmdS5fZXZhbFVybChVLnNyYyx7bm9uY2U6VS5ub25jZXx8VS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9LFEpOm8oVS50ZXh0Q29udGVudC5yZXBsYWNlKCRzLCIiKSxVLFEpKX1yZXR1cm4gaX1mdW5jdGlvbiBRaShpLGQsdil7Zm9yKHZhciB4LEE9ZD91LmZpbHRlcihkLGkpOmksST0wOyh4PUFbSV0pIT1udWxsO0krKykhdiYmeC5ub2RlVHlwZT09PTEmJnUuY2xlYW5EYXRhKHZlKHgpKSx4LnBhcmVudE5vZGUmJih2JiZkZSh4KSYmTG4odmUoeCwic2NyaXB0IikpLHgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh4KSk7cmV0dXJuIGl9dS5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oaSl7cmV0dXJuIGl9LGNsb25lOmZ1bmN0aW9uKGksZCx2KXt2YXIgeCxBLEksRSwkPWkuY2xvbmVOb2RlKCEwKSxVPWRlKGkpO2lmKCF3Lm5vQ2xvbmVDaGVja2VkJiYoaS5ub2RlVHlwZT09PTF8fGkubm9kZVR5cGU9PT0xMSkmJiF1LmlzWE1MRG9jKGkpKWZvcihFPXZlKCQpLEk9dmUoaSkseD0wLEE9SS5sZW5ndGg7eDxBO3grKylZcyhJW3hdLEVbeF0pO2lmKGQpaWYodilmb3IoST1JfHx2ZShpKSxFPUV8fHZlKCQpLHg9MCxBPUkubGVuZ3RoO3g8QTt4KyspWWkoSVt4XSxFW3hdKTtlbHNlIFlpKGksJCk7cmV0dXJuIEU9dmUoJCwic2NyaXB0IiksRS5sZW5ndGg+MCYmTG4oRSwhVSYmdmUoaSwic2NyaXB0IikpLCR9LGNsZWFuRGF0YTpmdW5jdGlvbihpKXtmb3IodmFyIGQsdix4LEE9dS5ldmVudC5zcGVjaWFsLEk9MDsodj1pW0ldKSE9PXZvaWQgMDtJKyspaWYoQ3Qodikpe2lmKGQ9dltidC5leHBhbmRvXSl7aWYoZC5ldmVudHMpZm9yKHggaW4gZC5ldmVudHMpQVt4XT91LmV2ZW50LnJlbW92ZSh2LHgpOnUucmVtb3ZlRXZlbnQodix4LGQuaGFuZGxlKTt2W2J0LmV4cGFuZG9dPXZvaWQgMH12W3p0LmV4cGFuZG9dJiYodlt6dC5leHBhbmRvXT12b2lkIDApfX19KSx1LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGkpe3JldHVybiBRaSh0aGlzLGksITApfSxyZW1vdmU6ZnVuY3Rpb24oaSl7cmV0dXJuIFFpKHRoaXMsaSl9LHRleHQ6ZnVuY3Rpb24oaSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihkKXtyZXR1cm4gZD09PXZvaWQgMD91LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsodGhpcy5ub2RlVHlwZT09PTF8fHRoaXMubm9kZVR5cGU9PT0xMXx8dGhpcy5ub2RlVHlwZT09PTkpJiYodGhpcy50ZXh0Q29udGVudD1kKX0pfSxudWxsLGksYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB4cih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihpKXtpZih0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExfHx0aGlzLm5vZGVUeXBlPT09OSl7dmFyIGQ9S2kodGhpcyxpKTtkLmFwcGVuZENoaWxkKGkpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHhyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe2lmKHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTF8fHRoaXMubm9kZVR5cGU9PT05KXt2YXIgZD1LaSh0aGlzLGkpO2QuaW5zZXJ0QmVmb3JlKGksZC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHhyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHhyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBpLGQ9MDsoaT10aGlzW2RdKSE9bnVsbDtkKyspaS5ub2RlVHlwZT09PTEmJih1LmNsZWFuRGF0YSh2ZShpLCExKSksaS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGksZCl7cmV0dXJuIGk9aT8/ITEsZD1kPz9pLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHUuY2xvbmUodGhpcyxpLGQpfSl9LGh0bWw6ZnVuY3Rpb24oaSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihkKXt2YXIgdj10aGlzWzBdfHx7fSx4PTAsQT10aGlzLmxlbmd0aDtpZihkPT09dm9pZCAwJiZ2Lm5vZGVUeXBlPT09MSlyZXR1cm4gdi5pbm5lckhUTUw7aWYodHlwZW9mIGQ9PSJzdHJpbmciJiYhR3MudGVzdChkKSYmIWtlWyhHaS5leGVjKGQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZD11Lmh0bWxQcmVmaWx0ZXIoZCk7dHJ5e2Zvcig7eDxBO3grKyl2PXRoaXNbeF18fHt9LHYubm9kZVR5cGU9PT0xJiYodS5jbGVhbkRhdGEodmUodiwhMSkpLHYuaW5uZXJIVE1MPWQpO3Y9MH1jYXRjaHt9fXYmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZCl9LG51bGwsaSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgaT1bXTtyZXR1cm4geHIodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZCl7dmFyIHY9dGhpcy5wYXJlbnROb2RlO3UuaW5BcnJheSh0aGlzLGkpPDAmJih1LmNsZWFuRGF0YSh2ZSh0aGlzKSksdiYmdi5yZXBsYWNlQ2hpbGQoZCx0aGlzKSl9LGkpfX0pLHUuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGksZCl7dS5mbltpXT1mdW5jdGlvbih2KXtmb3IodmFyIHgsQT1bXSxJPXUodiksRT1JLmxlbmd0aC0xLCQ9MDskPD1FOyQrKyl4PSQ9PT1FP3RoaXM6dGhpcy5jbG9uZSghMCksdShJWyRdKVtkXSh4KSxsLmFwcGx5KEEseC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEEpfX0pO3ZhciBqbj1uZXcgUmVnRXhwKCJeKCIrWWUrIikoPyFweClbYS16JV0rJCIsImkiKSxNbj0vXi0tLyxzbj1mdW5jdGlvbihpKXt2YXIgZD1pLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuKCFkfHwhZC5vcGVuZXIpJiYoZD10KSxkLmdldENvbXB1dGVkU3R5bGUoaSl9LEppPWZ1bmN0aW9uKGksZCx2KXt2YXIgeCxBLEk9e307Zm9yKEEgaW4gZClJW0FdPWkuc3R5bGVbQV0saS5zdHlsZVtBXT1kW0FdO3g9di5jYWxsKGkpO2ZvcihBIGluIGQpaS5zdHlsZVtBXT1JW0FdO3JldHVybiB4fSxRcz1uZXcgUmVnRXhwKGJlLmpvaW4oInwiKSwiaSIpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXtpZihRKXtVLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLFEuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsT2UuYXBwZW5kQ2hpbGQoVSkuYXBwZW5kQ2hpbGQoUSk7dmFyIGR0PXQuZ2V0Q29tcHV0ZWRTdHlsZShRKTt2PWR0LnRvcCE9PSIxJSIsJD1kKGR0Lm1hcmdpbkxlZnQpPT09MTIsUS5zdHlsZS5yaWdodD0iNjAlIixJPWQoZHQucmlnaHQpPT09MzYseD1kKGR0LndpZHRoKT09PTM2LFEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixBPWQoUS5vZmZzZXRXaWR0aC8zKT09PTEyLE9lLnJlbW92ZUNoaWxkKFUpLFE9bnVsbH19ZnVuY3Rpb24gZChkdCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkdCkpfXZhciB2LHgsQSxJLEUsJCxVPUYuY3JlYXRlRWxlbWVudCgiZGl2IiksUT1GLmNyZWF0ZUVsZW1lbnQoImRpdiIpO1Euc3R5bGUmJihRLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsUS5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHcuY2xlYXJDbG9uZVN0eWxlPVEuc3R5bGUuYmFja2dyb3VuZENsaXA9PT0iY29udGVudC1ib3giLHUuZXh0ZW5kKHcse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSx4fSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBpKCksSX0scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBpKCksdn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSwkfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSxBfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBkdCxmdCxpdCx3dDtyZXR1cm4gRT09bnVsbCYmKGR0PUYuY3JlYXRlRWxlbWVudCgidGFibGUiKSxmdD1GLmNyZWF0ZUVsZW1lbnQoInRyIiksaXQ9Ri5jcmVhdGVFbGVtZW50KCJkaXYiKSxkdC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZSIsZnQuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpjb250ZW50LWJveDtib3JkZXI6MXB4IHNvbGlkIixmdC5zdHlsZS5oZWlnaHQ9IjFweCIsaXQuc3R5bGUuaGVpZ2h0PSI5cHgiLGl0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIixPZS5hcHBlbmRDaGlsZChkdCkuYXBwZW5kQ2hpbGQoZnQpLmFwcGVuZENoaWxkKGl0KSx3dD10LmdldENvbXB1dGVkU3R5bGUoZnQpLEU9cGFyc2VJbnQod3QuaGVpZ2h0LDEwKStwYXJzZUludCh3dC5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQod3QuYm9yZGVyQm90dG9tV2lkdGgsMTApPT09ZnQub2Zmc2V0SGVpZ2h0LE9lLnJlbW92ZUNoaWxkKGR0KSksRX19KSl9KSgpO2Z1bmN0aW9uIFJyKGksZCx2KXt2YXIgeCxBLEksRSwkPU1uLnRlc3QoZCksVT1pLnN0eWxlO3JldHVybiB2PXZ8fHNuKGkpLHYmJihFPXYuZ2V0UHJvcGVydHlWYWx1ZShkKXx8dltkXSwkJiZFJiYoRT1FLnJlcGxhY2UoXywiJDEiKXx8dm9pZCAwKSxFPT09IiImJiFkZShpKSYmKEU9dS5zdHlsZShpLGQpKSwhdy5waXhlbEJveFN0eWxlcygpJiZqbi50ZXN0KEUpJiZRcy50ZXN0KGQpJiYoeD1VLndpZHRoLEE9VS5taW5XaWR0aCxJPVUubWF4V2lkdGgsVS5taW5XaWR0aD1VLm1heFdpZHRoPVUud2lkdGg9RSxFPXYud2lkdGgsVS53aWR0aD14LFUubWluV2lkdGg9QSxVLm1heFdpZHRoPUkpKSxFIT09dm9pZCAwP0UrIiI6RX1mdW5jdGlvbiB0YShpLGQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZihpKCkpe2RlbGV0ZSB0aGlzLmdldDtyZXR1cm59cmV0dXJuKHRoaXMuZ2V0PWQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXZhciBlYT1bIldlYmtpdCIsIk1veiIsIm1zIl0scmE9Ri5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxuYT17fTtmdW5jdGlvbiBKcyhpKXtmb3IodmFyIGQ9aVswXS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSksdj1lYS5sZW5ndGg7di0tOylpZihpPWVhW3ZdK2QsaSBpbiByYSlyZXR1cm4gaX1mdW5jdGlvbiBWbihpKXt2YXIgZD11LmNzc1Byb3BzW2ldfHxuYVtpXTtyZXR1cm4gZHx8KGkgaW4gcmE/aTpuYVtpXT1KcyhpKXx8aSl9dmFyIHRvPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxlbz17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0saWE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIGFhKGksZCx2KXt2YXIgeD10ZS5leGVjKGQpO3JldHVybiB4P01hdGgubWF4KDAseFsyXS0odnx8MCkpKyh4WzNdfHwicHgiKTpkfWZ1bmN0aW9uIEhuKGksZCx2LHgsQSxJKXt2YXIgRT1kPT09IndpZHRoIj8xOjAsJD0wLFU9MCxRPTA7aWYodj09PSh4PyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDtFPDQ7RSs9Mil2PT09Im1hcmdpbiImJihRKz11LmNzcyhpLHYrYmVbRV0sITAsQSkpLHg/KHY9PT0iY29udGVudCImJihVLT11LmNzcyhpLCJwYWRkaW5nIitiZVtFXSwhMCxBKSksdiE9PSJtYXJnaW4iJiYoVS09dS5jc3MoaSwiYm9yZGVyIitiZVtFXSsiV2lkdGgiLCEwLEEpKSk6KFUrPXUuY3NzKGksInBhZGRpbmciK2JlW0VdLCEwLEEpLHYhPT0icGFkZGluZyI/VSs9dS5jc3MoaSwiYm9yZGVyIitiZVtFXSsiV2lkdGgiLCEwLEEpOiQrPXUuY3NzKGksImJvcmRlciIrYmVbRV0rIldpZHRoIiwhMCxBKSk7cmV0dXJuIXgmJkk+PTAmJihVKz1NYXRoLm1heCgwLE1hdGguY2VpbChpWyJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpXS1JLVUtJC0uNSkpfHwwKSxVK1F9ZnVuY3Rpb24gc2EoaSxkLHYpe3ZhciB4PXNuKGkpLEE9IXcuYm94U2l6aW5nUmVsaWFibGUoKXx8dixJPUEmJnUuY3NzKGksImJveFNpemluZyIsITEseCk9PT0iYm9yZGVyLWJveCIsRT1JLCQ9UnIoaSxkLHgpLFU9Im9mZnNldCIrZFswXS50b1VwcGVyQ2FzZSgpK2Quc2xpY2UoMSk7aWYoam4udGVzdCgkKSl7aWYoIXYpcmV0dXJuICQ7JD0iYXV0byJ9cmV0dXJuKCF3LmJveFNpemluZ1JlbGlhYmxlKCkmJkl8fCF3LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJnEoaSwidHIiKXx8JD09PSJhdXRvInx8IXBhcnNlRmxvYXQoJCkmJnUuY3NzKGksImRpc3BsYXkiLCExLHgpPT09ImlubGluZSIpJiZpLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoST11LmNzcyhpLCJib3hTaXppbmciLCExLHgpPT09ImJvcmRlci1ib3giLEU9VSBpbiBpLEUmJigkPWlbVV0pKSwkPXBhcnNlRmxvYXQoJCl8fDAsJCtIbihpLGQsdnx8KEk/ImJvcmRlciI6ImNvbnRlbnQiKSxFLHgsJCkrInB4In11LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihpLGQpe2lmKGQpe3ZhciB2PVJyKGksIm9wYWNpdHkiKTtyZXR1cm4gdj09PSIiPyIxIjp2fX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlU2xpY2U6ITAsY29sdW1uQ291bnQ6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCxzY2FsZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oaSxkLHYseCl7aWYoISghaXx8aS5ub2RlVHlwZT09PTN8fGkubm9kZVR5cGU9PT04fHwhaS5zdHlsZSkpe3ZhciBBLEksRSwkPWd0KGQpLFU9TW4udGVzdChkKSxRPWkuc3R5bGU7aWYoVXx8KGQ9Vm4oJCkpLEU9dS5jc3NIb29rc1tkXXx8dS5jc3NIb29rc1skXSx2IT09dm9pZCAwKXtpZihJPXR5cGVvZiB2LEk9PT0ic3RyaW5nIiYmKEE9dGUuZXhlYyh2KSkmJkFbMV0mJih2PWVuKGksZCxBKSxJPSJudW1iZXIiKSx2PT1udWxsfHx2IT09dilyZXR1cm47ST09PSJudW1iZXIiJiYhVSYmKHYrPUEmJkFbM118fCh1LmNzc051bWJlclskXT8iIjoicHgiKSksIXcuY2xlYXJDbG9uZVN0eWxlJiZ2PT09IiImJmQuaW5kZXhPZigiYmFja2dyb3VuZCIpPT09MCYmKFFbZF09ImluaGVyaXQiKSwoIUV8fCEoInNldCJpbiBFKXx8KHY9RS5zZXQoaSx2LHgpKSE9PXZvaWQgMCkmJihVP1Euc2V0UHJvcGVydHkoZCx2KTpRW2RdPXYpfWVsc2UgcmV0dXJuIEUmJiJnZXQiaW4gRSYmKEE9RS5nZXQoaSwhMSx4KSkhPT12b2lkIDA/QTpRW2RdfX0sY3NzOmZ1bmN0aW9uKGksZCx2LHgpe3ZhciBBLEksRSwkPWd0KGQpLFU9TW4udGVzdChkKTtyZXR1cm4gVXx8KGQ9Vm4oJCkpLEU9dS5jc3NIb29rc1tkXXx8dS5jc3NIb29rc1skXSxFJiYiZ2V0ImluIEUmJihBPUUuZ2V0KGksITAsdikpLEE9PT12b2lkIDAmJihBPVJyKGksZCx4KSksQT09PSJub3JtYWwiJiZkIGluIGlhJiYoQT1pYVtkXSksdj09PSIifHx2PyhJPXBhcnNlRmxvYXQoQSksdj09PSEwfHxpc0Zpbml0ZShJKT9JfHwwOkEpOkF9fSksdS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihpLGQpe3UuY3NzSG9va3NbZF09e2dldDpmdW5jdGlvbih2LHgsQSl7aWYoeClyZXR1cm4gdG8udGVzdCh1LmNzcyh2LCJkaXNwbGF5IikpJiYoIXYuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGh8fCF2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKT9KaSh2LGVvLGZ1bmN0aW9uKCl7cmV0dXJuIHNhKHYsZCxBKX0pOnNhKHYsZCxBKX0sc2V0OmZ1bmN0aW9uKHYseCxBKXt2YXIgSSxFPXNuKHYpLCQ9IXcuc2Nyb2xsYm94U2l6ZSgpJiZFLnBvc2l0aW9uPT09ImFic29sdXRlIixVPSR8fEEsUT1VJiZ1LmNzcyh2LCJib3hTaXppbmciLCExLEUpPT09ImJvcmRlci1ib3giLGR0PUE/SG4odixkLEEsUSxFKTowO3JldHVybiBRJiYkJiYoZHQtPU1hdGguY2VpbCh2WyJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpXS1wYXJzZUZsb2F0KEVbZF0pLUhuKHYsZCwiYm9yZGVyIiwhMSxFKS0uNSkpLGR0JiYoST10ZS5leGVjKHgpKSYmKElbM118fCJweCIpIT09InB4IiYmKHYuc3R5bGVbZF09eCx4PXUuY3NzKHYsZCkpLGFhKHYseCxkdCl9fX0pLHUuY3NzSG9va3MubWFyZ2luTGVmdD10YSh3LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihpLGQpe2lmKGQpcmV0dXJuKHBhcnNlRmxvYXQoUnIoaSwibWFyZ2luTGVmdCIpKXx8aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LUppKGkse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSx1LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLGQpe3UuY3NzSG9va3NbaStkXT17ZXhwYW5kOmZ1bmN0aW9uKHYpe2Zvcih2YXIgeD0wLEE9e30sST10eXBlb2Ygdj09InN0cmluZyI/di5zcGxpdCgiICIpOlt2XTt4PDQ7eCsrKUFbaStiZVt4XStkXT1JW3hdfHxJW3gtMl18fElbMF07cmV0dXJuIEF9fSxpIT09Im1hcmdpbiImJih1LmNzc0hvb2tzW2krZF0uc2V0PWFhKX0pLHUuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHYseCxBKXt2YXIgSSxFLCQ9e30sVT0wO2lmKEFycmF5LmlzQXJyYXkoeCkpe2ZvcihJPXNuKHYpLEU9eC5sZW5ndGg7VTxFO1UrKykkW3hbVV1dPXUuY3NzKHYseFtVXSwhMSxJKTtyZXR1cm4gJH1yZXR1cm4gQSE9PXZvaWQgMD91LnN0eWxlKHYseCxBKTp1LmNzcyh2LHgpfSxpLGQsYXJndW1lbnRzLmxlbmd0aD4xKX19KTtmdW5jdGlvbiBtZShpLGQsdix4LEEpe3JldHVybiBuZXcgbWUucHJvdG90eXBlLmluaXQoaSxkLHYseCxBKX11LlR3ZWVuPW1lLG1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bWUsaW5pdDpmdW5jdGlvbihpLGQsdix4LEEsSSl7dGhpcy5lbGVtPWksdGhpcy5wcm9wPXYsdGhpcy5lYXNpbmc9QXx8dS5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXgsdGhpcy51bml0PUl8fCh1LmNzc051bWJlclt2XT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGk9bWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGkmJmkuZ2V0P2kuZ2V0KHRoaXMpOm1lLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihpKXt2YXIgZCx2PW1lLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZD11LmVhc2luZ1t0aGlzLmVhc2luZ10oaSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qaSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1kPWksdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksdiYmdi5zZXQ/di5zZXQodGhpcyk6bWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sbWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPW1lLnByb3RvdHlwZSxtZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oaSl7dmFyIGQ7cmV0dXJuIGkuZWxlbS5ub2RlVHlwZSE9PTF8fGkuZWxlbVtpLnByb3BdIT1udWxsJiZpLmVsZW0uc3R5bGVbaS5wcm9wXT09bnVsbD9pLmVsZW1baS5wcm9wXTooZD11LmNzcyhpLmVsZW0saS5wcm9wLCIiKSwhZHx8ZD09PSJhdXRvIj8wOmQpfSxzZXQ6ZnVuY3Rpb24oaSl7dS5meC5zdGVwW2kucHJvcF0/dS5meC5zdGVwW2kucHJvcF0oaSk6aS5lbGVtLm5vZGVUeXBlPT09MSYmKHUuY3NzSG9va3NbaS5wcm9wXXx8aS5lbGVtLnN0eWxlW1ZuKGkucHJvcCldIT1udWxsKT91LnN0eWxlKGkuZWxlbSxpLnByb3AsaS5ub3craS51bml0KTppLmVsZW1baS5wcm9wXT1pLm5vd319fSxtZS5wcm9wSG9va3Muc2Nyb2xsVG9wPW1lLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oaSl7aS5lbGVtLm5vZGVUeXBlJiZpLmVsZW0ucGFyZW50Tm9kZSYmKGkuZWxlbVtpLnByb3BdPWkubm93KX19LHUuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oaSl7cmV0dXJuIGl9LHN3aW5nOmZ1bmN0aW9uKGkpe3JldHVybiAuNS1NYXRoLmNvcyhpKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LHUuZng9bWUucHJvdG90eXBlLmluaXQsdS5meC5zdGVwPXt9O3ZhciBfcixvbixybz0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sbm89L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBXbigpe29uJiYoRi5oaWRkZW49PT0hMSYmdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoV24pOnQuc2V0VGltZW91dChXbix1LmZ4LmludGVydmFsKSx1LmZ4LnRpY2soKSl9ZnVuY3Rpb24gb2EoKXtyZXR1cm4gdC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3I9dm9pZCAwfSksX3I9RGF0ZS5ub3coKX1mdW5jdGlvbiBsbihpLGQpe3ZhciB2LHg9MCxBPXtoZWlnaHQ6aX07Zm9yKGQ9ZD8xOjA7eDw0O3grPTItZCl2PWJlW3hdLEFbIm1hcmdpbiIrdl09QVsicGFkZGluZyIrdl09aTtyZXR1cm4gZCYmKEEub3BhY2l0eT1BLndpZHRoPWkpLEF9ZnVuY3Rpb24gbGEoaSxkLHYpe2Zvcih2YXIgeCxBPShSZS50d2VlbmVyc1tkXXx8W10pLmNvbmNhdChSZS50d2VlbmVyc1siKiJdKSxJPTAsRT1BLmxlbmd0aDtJPEU7SSsrKWlmKHg9QVtJXS5jYWxsKHYsZCxpKSlyZXR1cm4geH1mdW5jdGlvbiBpbyhpLGQsdil7dmFyIHgsQSxJLEUsJCxVLFEsZHQsZnQ9IndpZHRoImluIGR8fCJoZWlnaHQiaW4gZCxpdD10aGlzLHd0PXt9LEV0PWkuc3R5bGUsR3Q9aS5ub2RlVHlwZSYmZ3IoaSksTXQ9YnQuZ2V0KGksImZ4c2hvdyIpO3YucXVldWV8fChFPXUuX3F1ZXVlSG9va3MoaSwiZngiKSxFLnVucXVldWVkPT1udWxsJiYoRS51bnF1ZXVlZD0wLCQ9RS5lbXB0eS5maXJlLEUuZW1wdHkuZmlyZT1mdW5jdGlvbigpe0UudW5xdWV1ZWR8fCQoKX0pLEUudW5xdWV1ZWQrKyxpdC5hbHdheXMoZnVuY3Rpb24oKXtpdC5hbHdheXMoZnVuY3Rpb24oKXtFLnVucXVldWVkLS0sdS5xdWV1ZShpLCJmeCIpLmxlbmd0aHx8RS5lbXB0eS5maXJlKCl9KX0pKTtmb3IoeCBpbiBkKWlmKEE9ZFt4XSxyby50ZXN0KEEpKXtpZihkZWxldGUgZFt4XSxJPUl8fEE9PT0idG9nZ2xlIixBPT09KEd0PyJoaWRlIjoic2hvdyIpKWlmKEE9PT0ic2hvdyImJk10JiZNdFt4XSE9PXZvaWQgMClHdD0hMDtlbHNlIGNvbnRpbnVlO3d0W3hdPU10JiZNdFt4XXx8dS5zdHlsZShpLHgpfWlmKFU9IXUuaXNFbXB0eU9iamVjdChkKSwhKCFVJiZ1LmlzRW1wdHlPYmplY3Qod3QpKSl7ZnQmJmkubm9kZVR5cGU9PT0xJiYodi5vdmVyZmxvdz1bRXQub3ZlcmZsb3csRXQub3ZlcmZsb3dYLEV0Lm92ZXJmbG93WV0sUT1NdCYmTXQuZGlzcGxheSxRPT1udWxsJiYoUT1idC5nZXQoaSwiZGlzcGxheSIpKSxkdD11LmNzcyhpLCJkaXNwbGF5IiksZHQ9PT0ibm9uZSImJihRP2R0PVE6KFRlKFtpXSwhMCksUT1pLnN0eWxlLmRpc3BsYXl8fFEsZHQ9dS5jc3MoaSwiZGlzcGxheSIpLFRlKFtpXSkpKSwoZHQ9PT0iaW5saW5lInx8ZHQ9PT0iaW5saW5lLWJsb2NrIiYmUSE9bnVsbCkmJnUuY3NzKGksImZsb2F0Iik9PT0ibm9uZSImJihVfHwoaXQuZG9uZShmdW5jdGlvbigpe0V0LmRpc3BsYXk9UX0pLFE9PW51bGwmJihkdD1FdC5kaXNwbGF5LFE9ZHQ9PT0ibm9uZSI/IiI6ZHQpKSxFdC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksdi5vdmVyZmxvdyYmKEV0Lm92ZXJmbG93PSJoaWRkZW4iLGl0LmFsd2F5cyhmdW5jdGlvbigpe0V0Lm92ZXJmbG93PXYub3ZlcmZsb3dbMF0sRXQub3ZlcmZsb3dYPXYub3ZlcmZsb3dbMV0sRXQub3ZlcmZsb3dZPXYub3ZlcmZsb3dbMl19KSksVT0hMTtmb3IoeCBpbiB3dClVfHwoTXQ/ImhpZGRlbiJpbiBNdCYmKEd0PU10LmhpZGRlbik6TXQ9YnQuYWNjZXNzKGksImZ4c2hvdyIse2Rpc3BsYXk6UX0pLEkmJihNdC5oaWRkZW49IUd0KSxHdCYmVGUoW2ldLCEwKSxpdC5kb25lKGZ1bmN0aW9uKCl7R3R8fFRlKFtpXSksYnQucmVtb3ZlKGksImZ4c2hvdyIpO2Zvcih4IGluIHd0KXUuc3R5bGUoaSx4LHd0W3hdKX0pKSxVPWxhKEd0P010W3hdOjAseCxpdCkseCBpbiBNdHx8KE10W3hdPVUuc3RhcnQsR3QmJihVLmVuZD1VLnN0YXJ0LFUuc3RhcnQ9MCkpfX1mdW5jdGlvbiBhbyhpLGQpe3ZhciB2LHgsQSxJLEU7Zm9yKHYgaW4gaSlpZih4PWd0KHYpLEE9ZFt4XSxJPWlbdl0sQXJyYXkuaXNBcnJheShJKSYmKEE9SVsxXSxJPWlbdl09SVswXSksdiE9PXgmJihpW3hdPUksZGVsZXRlIGlbdl0pLEU9dS5jc3NIb29rc1t4XSxFJiYiZXhwYW5kImluIEUpe0k9RS5leHBhbmQoSSksZGVsZXRlIGlbeF07Zm9yKHYgaW4gSSl2IGluIGl8fChpW3ZdPUlbdl0sZFt2XT1BKX1lbHNlIGRbeF09QX1mdW5jdGlvbiBSZShpLGQsdil7dmFyIHgsQSxJPTAsRT1SZS5wcmVmaWx0ZXJzLmxlbmd0aCwkPXUuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgVS5lbGVtfSksVT1mdW5jdGlvbigpe2lmKEEpcmV0dXJuITE7Zm9yKHZhciBmdD1fcnx8b2EoKSxpdD1NYXRoLm1heCgwLFEuc3RhcnRUaW1lK1EuZHVyYXRpb24tZnQpLHd0PWl0L1EuZHVyYXRpb258fDAsRXQ9MS13dCxHdD0wLE10PVEudHdlZW5zLmxlbmd0aDtHdDxNdDtHdCsrKVEudHdlZW5zW0d0XS5ydW4oRXQpO3JldHVybiAkLm5vdGlmeVdpdGgoaSxbUSxFdCxpdF0pLEV0PDEmJk10P2l0OihNdHx8JC5ub3RpZnlXaXRoKGksW1EsMSwwXSksJC5yZXNvbHZlV2l0aChpLFtRXSksITEpfSxRPSQucHJvbWlzZSh7ZWxlbTppLHByb3BzOnUuZXh0ZW5kKHt9LGQpLG9wdHM6dS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOnUuZWFzaW5nLl9kZWZhdWx0fSx2KSxvcmlnaW5hbFByb3BlcnRpZXM6ZCxvcmlnaW5hbE9wdGlvbnM6dixzdGFydFRpbWU6X3J8fG9hKCksZHVyYXRpb246di5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZnQsaXQpe3ZhciB3dD11LlR3ZWVuKGksUS5vcHRzLGZ0LGl0LFEub3B0cy5zcGVjaWFsRWFzaW5nW2Z0XXx8US5vcHRzLmVhc2luZyk7cmV0dXJuIFEudHdlZW5zLnB1c2god3QpLHd0fSxzdG9wOmZ1bmN0aW9uKGZ0KXt2YXIgaXQ9MCx3dD1mdD9RLnR3ZWVucy5sZW5ndGg6MDtpZihBKXJldHVybiB0aGlzO2ZvcihBPSEwO2l0PHd0O2l0KyspUS50d2VlbnNbaXRdLnJ1bigxKTtyZXR1cm4gZnQ/KCQubm90aWZ5V2l0aChpLFtRLDEsMF0pLCQucmVzb2x2ZVdpdGgoaSxbUSxmdF0pKTokLnJlamVjdFdpdGgoaSxbUSxmdF0pLHRoaXN9fSksZHQ9US5wcm9wcztmb3IoYW8oZHQsUS5vcHRzLnNwZWNpYWxFYXNpbmcpO0k8RTtJKyspaWYoeD1SZS5wcmVmaWx0ZXJzW0ldLmNhbGwoUSxpLGR0LFEub3B0cykseClyZXR1cm4gayh4LnN0b3ApJiYodS5fcXVldWVIb29rcyhRLmVsZW0sUS5vcHRzLnF1ZXVlKS5zdG9wPXguc3RvcC5iaW5kKHgpKSx4O3JldHVybiB1Lm1hcChkdCxsYSxRKSxrKFEub3B0cy5zdGFydCkmJlEub3B0cy5zdGFydC5jYWxsKGksUSksUS5wcm9ncmVzcyhRLm9wdHMucHJvZ3Jlc3MpLmRvbmUoUS5vcHRzLmRvbmUsUS5vcHRzLmNvbXBsZXRlKS5mYWlsKFEub3B0cy5mYWlsKS5hbHdheXMoUS5vcHRzLmFsd2F5cyksdS5meC50aW1lcih1LmV4dGVuZChVLHtlbGVtOmksYW5pbTpRLHF1ZXVlOlEub3B0cy5xdWV1ZX0pKSxRfXUuQW5pbWF0aW9uPXUuZXh0ZW5kKFJlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbihpLGQpe3ZhciB2PXRoaXMuY3JlYXRlVHdlZW4oaSxkKTtyZXR1cm4gZW4odi5lbGVtLGksdGUuZXhlYyhkKSx2KSx2fV19LHR3ZWVuZXI6ZnVuY3Rpb24oaSxkKXtrKGkpPyhkPWksaT1bIioiXSk6aT1pLm1hdGNoKEJ0KTtmb3IodmFyIHYseD0wLEE9aS5sZW5ndGg7eDxBO3grKyl2PWlbeF0sUmUudHdlZW5lcnNbdl09UmUudHdlZW5lcnNbdl18fFtdLFJlLnR3ZWVuZXJzW3ZdLnVuc2hpZnQoZCl9LHByZWZpbHRlcnM6W2lvXSxwcmVmaWx0ZXI6ZnVuY3Rpb24oaSxkKXtkP1JlLnByZWZpbHRlcnMudW5zaGlmdChpKTpSZS5wcmVmaWx0ZXJzLnB1c2goaSl9fSksdS5zcGVlZD1mdW5jdGlvbihpLGQsdil7dmFyIHg9aSYmdHlwZW9mIGk9PSJvYmplY3QiP3UuZXh0ZW5kKHt9LGkpOntjb21wbGV0ZTp2fHwhdiYmZHx8ayhpKSYmaSxkdXJhdGlvbjppLGVhc2luZzp2JiZkfHxkJiYhayhkKSYmZH07cmV0dXJuIHUuZngub2ZmP3guZHVyYXRpb249MDp0eXBlb2YgeC5kdXJhdGlvbiE9Im51bWJlciImJih4LmR1cmF0aW9uIGluIHUuZnguc3BlZWRzP3guZHVyYXRpb249dS5meC5zcGVlZHNbeC5kdXJhdGlvbl06eC5kdXJhdGlvbj11LmZ4LnNwZWVkcy5fZGVmYXVsdCksKHgucXVldWU9PW51bGx8fHgucXVldWU9PT0hMCkmJih4LnF1ZXVlPSJmeCIpLHgub2xkPXguY29tcGxldGUseC5jb21wbGV0ZT1mdW5jdGlvbigpe2soeC5vbGQpJiZ4Lm9sZC5jYWxsKHRoaXMpLHgucXVldWUmJnUuZGVxdWV1ZSh0aGlzLHgucXVldWUpfSx4fSx1LmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGksZCx2LHgpe3JldHVybiB0aGlzLmZpbHRlcihncikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpkfSxpLHYseCl9LGFuaW1hdGU6ZnVuY3Rpb24oaSxkLHYseCl7dmFyIEE9dS5pc0VtcHR5T2JqZWN0KGkpLEk9dS5zcGVlZChkLHYseCksRT1mdW5jdGlvbigpe3ZhciAkPVJlKHRoaXMsdS5leHRlbmQoe30saSksSSk7KEF8fGJ0LmdldCh0aGlzLCJmaW5pc2giKSkmJiQuc3RvcCghMCl9O3JldHVybiBFLmZpbmlzaD1FLEF8fEkucXVldWU9PT0hMT90aGlzLmVhY2goRSk6dGhpcy5xdWV1ZShJLnF1ZXVlLEUpfSxzdG9wOmZ1bmN0aW9uKGksZCx2KXt2YXIgeD1mdW5jdGlvbihBKXt2YXIgST1BLnN0b3A7ZGVsZXRlIEEuc3RvcCxJKHYpfTtyZXR1cm4gdHlwZW9mIGkhPSJzdHJpbmciJiYodj1kLGQ9aSxpPXZvaWQgMCksZCYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgQT0hMCxJPWkhPW51bGwmJmkrInF1ZXVlSG9va3MiLEU9dS50aW1lcnMsJD1idC5nZXQodGhpcyk7aWYoSSkkW0ldJiYkW0ldLnN0b3AmJngoJFtJXSk7ZWxzZSBmb3IoSSBpbiAkKSRbSV0mJiRbSV0uc3RvcCYmbm8udGVzdChJKSYmeCgkW0ldKTtmb3IoST1FLmxlbmd0aDtJLS07KUVbSV0uZWxlbT09PXRoaXMmJihpPT1udWxsfHxFW0ldLnF1ZXVlPT09aSkmJihFW0ldLmFuaW0uc3RvcCh2KSxBPSExLEUuc3BsaWNlKEksMSkpOyhBfHwhdikmJnUuZGVxdWV1ZSh0aGlzLGkpfSl9LGZpbmlzaDpmdW5jdGlvbihpKXtyZXR1cm4gaSE9PSExJiYoaT1pfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZCx2PWJ0LmdldCh0aGlzKSx4PXZbaSsicXVldWUiXSxBPXZbaSsicXVldWVIb29rcyJdLEk9dS50aW1lcnMsRT14P3gubGVuZ3RoOjA7Zm9yKHYuZmluaXNoPSEwLHUucXVldWUodGhpcyxpLFtdKSxBJiZBLnN0b3AmJkEuc3RvcC5jYWxsKHRoaXMsITApLGQ9SS5sZW5ndGg7ZC0tOylJW2RdLmVsZW09PT10aGlzJiZJW2RdLnF1ZXVlPT09aSYmKElbZF0uYW5pbS5zdG9wKCEwKSxJLnNwbGljZShkLDEpKTtmb3IoZD0wO2Q8RTtkKyspeFtkXSYmeFtkXS5maW5pc2gmJnhbZF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHYuZmluaXNofSl9fSksdS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihpLGQpe3ZhciB2PXUuZm5bZF07dS5mbltkXT1mdW5jdGlvbih4LEEsSSl7cmV0dXJuIHg9PW51bGx8fHR5cGVvZiB4PT0iYm9vbGVhbiI/di5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGxuKGQsITApLHgsQSxJKX19KSx1LmVhY2goe3NsaWRlRG93bjpsbigic2hvdyIpLHNsaWRlVXA6bG4oImhpZGUiKSxzbGlkZVRvZ2dsZTpsbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihpLGQpe3UuZm5baV09ZnVuY3Rpb24odix4LEEpe3JldHVybiB0aGlzLmFuaW1hdGUoZCx2LHgsQSl9fSksdS50aW1lcnM9W10sdS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGksZD0wLHY9dS50aW1lcnM7Zm9yKF9yPURhdGUubm93KCk7ZDx2Lmxlbmd0aDtkKyspaT12W2RdLCFpKCkmJnZbZF09PT1pJiZ2LnNwbGljZShkLS0sMSk7di5sZW5ndGh8fHUuZnguc3RvcCgpLF9yPXZvaWQgMH0sdS5meC50aW1lcj1mdW5jdGlvbihpKXt1LnRpbWVycy5wdXNoKGkpLHUuZnguc3RhcnQoKX0sdS5meC5pbnRlcnZhbD0xMyx1LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7b258fChvbj0hMCxXbigpKX0sdS5meC5zdG9wPWZ1bmN0aW9uKCl7b249bnVsbH0sdS5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sdS5mbi5kZWxheT1mdW5jdGlvbihpLGQpe3JldHVybiBpPXUuZngmJnUuZnguc3BlZWRzW2ldfHxpLGQ9ZHx8ImZ4Iix0aGlzLnF1ZXVlKGQsZnVuY3Rpb24odix4KXt2YXIgQT10LnNldFRpbWVvdXQodixpKTt4LnN0b3A9ZnVuY3Rpb24oKXt0LmNsZWFyVGltZW91dChBKX19KX0sZnVuY3Rpb24oKXt2YXIgaT1GLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZD1GLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLHY9ZC5hcHBlbmRDaGlsZChGLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtpLnR5cGU9ImNoZWNrYm94Iix3LmNoZWNrT249aS52YWx1ZSE9PSIiLHcub3B0U2VsZWN0ZWQ9di5zZWxlY3RlZCxpPUYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnR5cGU9InJhZGlvIix3LnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0In0oKTt2YXIgZGEsTHI9dS5leHByLmF0dHJIYW5kbGU7dS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gWSh0aGlzLHUuYXR0cixpLGQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dS5yZW1vdmVBdHRyKHRoaXMsaSl9KX19KSx1LmV4dGVuZCh7YXR0cjpmdW5jdGlvbihpLGQsdil7dmFyIHgsQSxJPWkubm9kZVR5cGU7aWYoIShJPT09M3x8ST09PTh8fEk9PT0yKSl7aWYodHlwZW9mIGkuZ2V0QXR0cmlidXRlPiJ1IilyZXR1cm4gdS5wcm9wKGksZCx2KTtpZigoSSE9PTF8fCF1LmlzWE1MRG9jKGkpKSYmKEE9dS5hdHRySG9va3NbZC50b0xvd2VyQ2FzZSgpXXx8KHUuZXhwci5tYXRjaC5ib29sLnRlc3QoZCk/ZGE6dm9pZCAwKSksdiE9PXZvaWQgMCl7aWYodj09PW51bGwpe3UucmVtb3ZlQXR0cihpLGQpO3JldHVybn1yZXR1cm4gQSYmInNldCJpbiBBJiYoeD1BLnNldChpLHYsZCkpIT09dm9pZCAwP3g6KGkuc2V0QXR0cmlidXRlKGQsdisiIiksdil9cmV0dXJuIEEmJiJnZXQiaW4gQSYmKHg9QS5nZXQoaSxkKSkhPT1udWxsP3g6KHg9dS5maW5kLmF0dHIoaSxkKSx4Pz92b2lkIDApfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oaSxkKXtpZighdy5yYWRpb1ZhbHVlJiZkPT09InJhZGlvIiYmcShpLCJpbnB1dCIpKXt2YXIgdj1pLnZhbHVlO3JldHVybiBpLnNldEF0dHJpYnV0ZSgidHlwZSIsZCksdiYmKGkudmFsdWU9diksZH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihpLGQpe3ZhciB2LHg9MCxBPWQmJmQubWF0Y2goQnQpO2lmKEEmJmkubm9kZVR5cGU9PT0xKWZvcig7dj1BW3grK107KWkucmVtb3ZlQXR0cmlidXRlKHYpfX0pLGRhPXtzZXQ6ZnVuY3Rpb24oaSxkLHYpe3JldHVybiBkPT09ITE/dS5yZW1vdmVBdHRyKGksdik6aS5zZXRBdHRyaWJ1dGUodix2KSx2fX0sdS5lYWNoKHUuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGksZCl7dmFyIHY9THJbZF18fHUuZmluZC5hdHRyO0xyW2RdPWZ1bmN0aW9uKHgsQSxJKXt2YXIgRSwkLFU9QS50b0xvd2VyQ2FzZSgpO3JldHVybiBJfHwoJD1McltVXSxMcltVXT1FLEU9dih4LEEsSSkhPW51bGw/VTpudWxsLExyW1VdPSQpLEV9fSk7dmFyIHNvPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb289L14oPzphfGFyZWEpJC9pO3UuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGksZCl7cmV0dXJuIFkodGhpcyx1LnByb3AsaSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3UucHJvcEZpeFtpXXx8aV19KX19KSx1LmV4dGVuZCh7cHJvcDpmdW5jdGlvbihpLGQsdil7dmFyIHgsQSxJPWkubm9kZVR5cGU7aWYoIShJPT09M3x8ST09PTh8fEk9PT0yKSlyZXR1cm4oSSE9PTF8fCF1LmlzWE1MRG9jKGkpKSYmKGQ9dS5wcm9wRml4W2RdfHxkLEE9dS5wcm9wSG9va3NbZF0pLHYhPT12b2lkIDA/QSYmInNldCJpbiBBJiYoeD1BLnNldChpLHYsZCkpIT09dm9pZCAwP3g6aVtkXT12OkEmJiJnZXQiaW4gQSYmKHg9QS5nZXQoaSxkKSkhPT1udWxsP3g6aVtkXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGkpe3ZhciBkPXUuZmluZC5hdHRyKGksInRhYmluZGV4Iik7cmV0dXJuIGQ/cGFyc2VJbnQoZCwxMCk6c28udGVzdChpLm5vZGVOYW1lKXx8b28udGVzdChpLm5vZGVOYW1lKSYmaS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx3Lm9wdFNlbGVjdGVkfHwodS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihpKXt2YXIgZD1pLnBhcmVudE5vZGU7cmV0dXJuIGQmJmQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGkpe3ZhciBkPWkucGFyZW50Tm9kZTtkJiYoZC5zZWxlY3RlZEluZGV4LGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHUuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dS5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIG9yKGkpe3ZhciBkPWkubWF0Y2goQnQpfHxbXTtyZXR1cm4gZC5qb2luKCIgIil9ZnVuY3Rpb24gbHIoaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlJiZpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gVW4oaSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoaSk/aTp0eXBlb2YgaT09InN0cmluZyI/aS5tYXRjaChCdCl8fFtdOltdfXUuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihpKXt2YXIgZCx2LHgsQSxJLEU7cmV0dXJuIGsoaSk/dGhpcy5lYWNoKGZ1bmN0aW9uKCQpe3UodGhpcykuYWRkQ2xhc3MoaS5jYWxsKHRoaXMsJCxscih0aGlzKSkpfSk6KGQ9VW4oaSksZC5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoeD1scih0aGlzKSx2PXRoaXMubm9kZVR5cGU9PT0xJiYiICIrb3IoeCkrIiAiLHYpe2ZvcihJPTA7STxkLmxlbmd0aDtJKyspQT1kW0ldLHYuaW5kZXhPZigiICIrQSsiICIpPDAmJih2Kz1BKyIgIik7RT1vcih2KSx4IT09RSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixFKX19KTp0aGlzKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oaSl7dmFyIGQsdix4LEEsSSxFO3JldHVybiBrKGkpP3RoaXMuZWFjaChmdW5jdGlvbigkKXt1KHRoaXMpLnJlbW92ZUNsYXNzKGkuY2FsbCh0aGlzLCQsbHIodGhpcykpKX0pOmFyZ3VtZW50cy5sZW5ndGg/KGQ9VW4oaSksZC5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoeD1scih0aGlzKSx2PXRoaXMubm9kZVR5cGU9PT0xJiYiICIrb3IoeCkrIiAiLHYpe2ZvcihJPTA7STxkLmxlbmd0aDtJKyspZm9yKEE9ZFtJXTt2LmluZGV4T2YoIiAiK0ErIiAiKT4tMTspdj12LnJlcGxhY2UoIiAiK0ErIiAiLCIgIik7RT1vcih2KSx4IT09RSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixFKX19KTp0aGlzKTp0aGlzLmF0dHIoImNsYXNzIiwiIil9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksZCl7dmFyIHYseCxBLEksRT10eXBlb2YgaSwkPUU9PT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheShpKTtyZXR1cm4gayhpKT90aGlzLmVhY2goZnVuY3Rpb24oVSl7dSh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxVLGxyKHRoaXMpLGQpLGQpfSk6dHlwZW9mIGQ9PSJib29sZWFuIiYmJD9kP3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKToodj1VbihpKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigkKWZvcihJPXUodGhpcyksQT0wO0E8di5sZW5ndGg7QSsrKXg9dltBXSxJLmhhc0NsYXNzKHgpP0kucmVtb3ZlQ2xhc3MoeCk6SS5hZGRDbGFzcyh4KTtlbHNlKGk9PT12b2lkIDB8fEU9PT0iYm9vbGVhbiIpJiYoeD1scih0aGlzKSx4JiZidC5zZXQodGhpcywiX19jbGFzc05hbWVfXyIseCksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIseHx8aT09PSExPyIiOmJ0LmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGkpe3ZhciBkLHYseD0wO2ZvcihkPSIgIitpKyIgIjt2PXRoaXNbeCsrXTspaWYodi5ub2RlVHlwZT09PTEmJigiICIrb3IobHIodikpKyIgIikuaW5kZXhPZihkKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgbG89L1xyL2c7dS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihpKXt2YXIgZCx2LHgsQT10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PWsoaSksdGhpcy5lYWNoKGZ1bmN0aW9uKEkpe3ZhciBFO3RoaXMubm9kZVR5cGU9PT0xJiYoeD9FPWkuY2FsbCh0aGlzLEksdSh0aGlzKS52YWwoKSk6RT1pLEU9PW51bGw/RT0iIjp0eXBlb2YgRT09Im51bWJlciI/RSs9IiI6QXJyYXkuaXNBcnJheShFKSYmKEU9dS5tYXAoRSxmdW5jdGlvbigkKXtyZXR1cm4gJD09bnVsbD8iIjokKyIifSkpLGQ9dS52YWxIb29rc1t0aGlzLnR5cGVdfHx1LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sKCFkfHwhKCJzZXQiaW4gZCl8fGQuc2V0KHRoaXMsRSwidmFsdWUiKT09PXZvaWQgMCkmJih0aGlzLnZhbHVlPUUpKX0pKTpBPyhkPXUudmFsSG9va3NbQS50eXBlXXx8dS52YWxIb29rc1tBLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGQmJiJnZXQiaW4gZCYmKHY9ZC5nZXQoQSwidmFsdWUiKSkhPT12b2lkIDA/djoodj1BLnZhbHVlLHR5cGVvZiB2PT0ic3RyaW5nIj92LnJlcGxhY2UobG8sIiIpOnY/PyIiKSk6dm9pZCAwfX0pLHUuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oaSl7dmFyIGQ9dS5maW5kLmF0dHIoaSwidmFsdWUiKTtyZXR1cm4gZD8/b3IodS50ZXh0KGkpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGkpe3ZhciBkLHYseCxBPWkub3B0aW9ucyxJPWkuc2VsZWN0ZWRJbmRleCxFPWkudHlwZT09PSJzZWxlY3Qtb25lIiwkPUU/bnVsbDpbXSxVPUU/SSsxOkEubGVuZ3RoO2ZvcihJPDA/eD1VOng9RT9JOjA7eDxVO3grKylpZih2PUFbeF0sKHYuc2VsZWN0ZWR8fHg9PT1JKSYmIXYuZGlzYWJsZWQmJighdi5wYXJlbnROb2RlLmRpc2FibGVkfHwhcSh2LnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihkPXUodikudmFsKCksRSlyZXR1cm4gZDskLnB1c2goZCl9cmV0dXJuICR9LHNldDpmdW5jdGlvbihpLGQpe2Zvcih2YXIgdix4LEE9aS5vcHRpb25zLEk9dS5tYWtlQXJyYXkoZCksRT1BLmxlbmd0aDtFLS07KXg9QVtFXSwoeC5zZWxlY3RlZD11LmluQXJyYXkodS52YWxIb29rcy5vcHRpb24uZ2V0KHgpLEkpPi0xKSYmKHY9ITApO3JldHVybiB2fHwoaS5zZWxlY3RlZEluZGV4PS0xKSxJfX19fSksdS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7dS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGksZCl7aWYoQXJyYXkuaXNBcnJheShkKSlyZXR1cm4gaS5jaGVja2VkPXUuaW5BcnJheSh1KGkpLnZhbCgpLGQpPi0xfX0sdy5jaGVja09ufHwodS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmkudmFsdWV9KX0pO3ZhciB6cj10LmxvY2F0aW9uLHVhPXtndWlkOkRhdGUubm93KCl9LHFuPS9cPy87dS5wYXJzZVhNTD1mdW5jdGlvbihpKXt2YXIgZCx2O2lmKCFpfHx0eXBlb2YgaSE9InN0cmluZyIpcmV0dXJuIG51bGw7dHJ5e2Q9bmV3IHQuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGksInRleHQveG1sIil9Y2F0Y2h7fXJldHVybiB2PWQmJmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF0sKCFkfHx2KSYmdS5lcnJvcigiSW52YWxpZCBYTUw6ICIrKHY/dS5tYXAodi5jaGlsZE5vZGVzLGZ1bmN0aW9uKHgpe3JldHVybiB4LnRleHRDb250ZW50fSkuam9pbihgCmApOmkpKSxkfTt2YXIgY2E9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLGZhPWZ1bmN0aW9uKGkpe2kuc3RvcFByb3BhZ2F0aW9uKCl9O3UuZXh0ZW5kKHUuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oaSxkLHYseCl7dmFyIEEsSSxFLCQsVSxRLGR0LGZ0LGl0PVt2fHxGXSx3dD1tLmNhbGwoaSwidHlwZSIpP2kudHlwZTppLEV0PW0uY2FsbChpLCJuYW1lc3BhY2UiKT9pLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKEk9ZnQ9RT12PXZ8fEYsISh2Lm5vZGVUeXBlPT09M3x8di5ub2RlVHlwZT09PTgpJiYhY2EudGVzdCh3dCt1LmV2ZW50LnRyaWdnZXJlZCkmJih3dC5pbmRleE9mKCIuIik+LTEmJihFdD13dC5zcGxpdCgiLiIpLHd0PUV0LnNoaWZ0KCksRXQuc29ydCgpKSxVPXd0LmluZGV4T2YoIjoiKTwwJiYib24iK3d0LGk9aVt1LmV4cGFuZG9dP2k6bmV3IHUuRXZlbnQod3QsdHlwZW9mIGk9PSJvYmplY3QiJiZpKSxpLmlzVHJpZ2dlcj14PzI6MyxpLm5hbWVzcGFjZT1FdC5qb2luKCIuIiksaS5ybmFtZXNwYWNlPWkubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK0V0LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsaS5yZXN1bHQ9dm9pZCAwLGkudGFyZ2V0fHwoaS50YXJnZXQ9diksZD1kPT1udWxsP1tpXTp1Lm1ha2VBcnJheShkLFtpXSksZHQ9dS5ldmVudC5zcGVjaWFsW3d0XXx8e30sISgheCYmZHQudHJpZ2dlciYmZHQudHJpZ2dlci5hcHBseSh2LGQpPT09ITEpKSl7aWYoIXgmJiFkdC5ub0J1YmJsZSYmIVAodikpe2ZvcigkPWR0LmRlbGVnYXRlVHlwZXx8d3QsY2EudGVzdCgkK3d0KXx8KEk9SS5wYXJlbnROb2RlKTtJO0k9SS5wYXJlbnROb2RlKWl0LnB1c2goSSksRT1JO0U9PT0odi5vd25lckRvY3VtZW50fHxGKSYmaXQucHVzaChFLmRlZmF1bHRWaWV3fHxFLnBhcmVudFdpbmRvd3x8dCl9Zm9yKEE9MDsoST1pdFtBKytdKSYmIWkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZnQ9SSxpLnR5cGU9QT4xPyQ6ZHQuYmluZFR5cGV8fHd0LFE9KGJ0LmdldChJLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbaS50eXBlXSYmYnQuZ2V0KEksImhhbmRsZSIpLFEmJlEuYXBwbHkoSSxkKSxRPVUmJklbVV0sUSYmUS5hcHBseSYmQ3QoSSkmJihpLnJlc3VsdD1RLmFwcGx5KEksZCksaS5yZXN1bHQ9PT0hMSYmaS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gaS50eXBlPXd0LCF4JiYhaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFkdC5fZGVmYXVsdHx8ZHQuX2RlZmF1bHQuYXBwbHkoaXQucG9wKCksZCk9PT0hMSkmJkN0KHYpJiZVJiZrKHZbd3RdKSYmIVAodikmJihFPXZbVV0sRSYmKHZbVV09bnVsbCksdS5ldmVudC50cmlnZ2VyZWQ9d3QsaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmdC5hZGRFdmVudExpc3RlbmVyKHd0LGZhKSx2W3d0XSgpLGkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih3dCxmYSksdS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLEUmJih2W1VdPUUpKSxpLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGksZCx2KXt2YXIgeD11LmV4dGVuZChuZXcgdS5FdmVudCx2LHt0eXBlOmksaXNTaW11bGF0ZWQ6ITB9KTt1LmV2ZW50LnRyaWdnZXIoeCxudWxsLGQpfX0pLHUuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3UuZXZlbnQudHJpZ2dlcihpLGQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oaSxkKXt2YXIgdj10aGlzWzBdO2lmKHYpcmV0dXJuIHUuZXZlbnQudHJpZ2dlcihpLGQsdiwhMCl9fSk7dmFyIHVvPS9cW1xdJC8saGE9L1xyP1xuL2csY289L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGZvPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBHbihpLGQsdix4KXt2YXIgQTtpZihBcnJheS5pc0FycmF5KGQpKXUuZWFjaChkLGZ1bmN0aW9uKEksRSl7dnx8dW8udGVzdChpKT94KGksRSk6R24oaSsiWyIrKHR5cGVvZiBFPT0ib2JqZWN0IiYmRSE9bnVsbD9JOiIiKSsiXSIsRSx2LHgpfSk7ZWxzZSBpZighdiYmZihkKT09PSJvYmplY3QiKWZvcihBIGluIGQpR24oaSsiWyIrQSsiXSIsZFtBXSx2LHgpO2Vsc2UgeChpLGQpfXUucGFyYW09ZnVuY3Rpb24oaSxkKXt2YXIgdix4PVtdLEE9ZnVuY3Rpb24oSSxFKXt2YXIgJD1rKEUpP0UoKTpFO3hbeC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChJKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KCQ/PyIiKX07aWYoaT09bnVsbClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGkpfHxpLmpxdWVyeSYmIXUuaXNQbGFpbk9iamVjdChpKSl1LmVhY2goaSxmdW5jdGlvbigpe0EodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodiBpbiBpKUduKHYsaVt2XSxkLEEpO3JldHVybiB4LmpvaW4oIiYiKX0sdS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB1LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGk9dS5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGk/dS5tYWtlQXJyYXkoaSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBpPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhdSh0aGlzKS5pcygiOmRpc2FibGVkIikmJmZvLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFjby50ZXN0KGkpJiYodGhpcy5jaGVja2VkfHwhamUudGVzdChpKSl9KS5tYXAoZnVuY3Rpb24oaSxkKXt2YXIgdj11KHRoaXMpLnZhbCgpO3JldHVybiB2PT1udWxsP251bGw6QXJyYXkuaXNBcnJheSh2KT91Lm1hcCh2LGZ1bmN0aW9uKHgpe3JldHVybntuYW1lOmQubmFtZSx2YWx1ZTp4LnJlcGxhY2UoaGEsYFxyCmApfX0pOntuYW1lOmQubmFtZSx2YWx1ZTp2LnJlcGxhY2UoaGEsYFxyCmApfX0pLmdldCgpfX0pO3ZhciBobz0vJTIwL2cscG89LyMuKiQvLGJvPS8oWz8mXSlfPVteJl0qLyx2bz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL21nLG1vPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLGdvPS9eKD86R0VUfEhFQUQpJC8seW89L15cL1wvLyxwYT17fSxYbj17fSxiYT0iKi8iLmNvbmNhdCgiKiIpLCRuPUYuY3JlYXRlRWxlbWVudCgiYSIpOyRuLmhyZWY9enIuaHJlZjtmdW5jdGlvbiB2YShpKXtyZXR1cm4gZnVuY3Rpb24oZCx2KXt0eXBlb2YgZCE9InN0cmluZyImJih2PWQsZD0iKiIpO3ZhciB4LEE9MCxJPWQudG9Mb3dlckNhc2UoKS5tYXRjaChCdCl8fFtdO2lmKGsodikpZm9yKDt4PUlbQSsrXTspeFswXT09PSIrIj8oeD14LnNsaWNlKDEpfHwiKiIsKGlbeF09aVt4XXx8W10pLnVuc2hpZnQodikpOihpW3hdPWlbeF18fFtdKS5wdXNoKHYpfX1mdW5jdGlvbiBtYShpLGQsdix4KXt2YXIgQT17fSxJPWk9PT1YbjtmdW5jdGlvbiBFKCQpe3ZhciBVO3JldHVybiBBWyRdPSEwLHUuZWFjaChpWyRdfHxbXSxmdW5jdGlvbihRLGR0KXt2YXIgZnQ9ZHQoZCx2LHgpO2lmKHR5cGVvZiBmdD09InN0cmluZyImJiFJJiYhQVtmdF0pcmV0dXJuIGQuZGF0YVR5cGVzLnVuc2hpZnQoZnQpLEUoZnQpLCExO2lmKEkpcmV0dXJuIShVPWZ0KX0pLFV9cmV0dXJuIEUoZC5kYXRhVHlwZXNbMF0pfHwhQVsiKiJdJiZFKCIqIil9ZnVuY3Rpb24gWm4oaSxkKXt2YXIgdix4LEE9dS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2Zvcih2IGluIGQpZFt2XSE9PXZvaWQgMCYmKChBW3ZdP2k6eHx8KHg9e30pKVt2XT1kW3ZdKTtyZXR1cm4geCYmdS5leHRlbmQoITAsaSx4KSxpfWZ1bmN0aW9uIHdvKGksZCx2KXtmb3IodmFyIHgsQSxJLEUsJD1pLmNvbnRlbnRzLFU9aS5kYXRhVHlwZXM7VVswXT09PSIqIjspVS5zaGlmdCgpLHg9PT12b2lkIDAmJih4PWkubWltZVR5cGV8fGQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZih4KXtmb3IoQSBpbiAkKWlmKCRbQV0mJiRbQV0udGVzdCh4KSl7VS51bnNoaWZ0KEEpO2JyZWFrfX1pZihVWzBdaW4gdilJPVVbMF07ZWxzZXtmb3IoQSBpbiB2KXtpZighVVswXXx8aS5jb252ZXJ0ZXJzW0ErIiAiK1VbMF1dKXtJPUE7YnJlYWt9RXx8KEU9QSl9ST1JfHxFfWlmKEkpcmV0dXJuIEkhPT1VWzBdJiZVLnVuc2hpZnQoSSksdltJXX1mdW5jdGlvbiB4byhpLGQsdix4KXt2YXIgQSxJLEUsJCxVLFE9e30sZHQ9aS5kYXRhVHlwZXMuc2xpY2UoKTtpZihkdFsxXSlmb3IoRSBpbiBpLmNvbnZlcnRlcnMpUVtFLnRvTG93ZXJDYXNlKCldPWkuY29udmVydGVyc1tFXTtmb3IoST1kdC5zaGlmdCgpO0k7KWlmKGkucmVzcG9uc2VGaWVsZHNbSV0mJih2W2kucmVzcG9uc2VGaWVsZHNbSV1dPWQpLCFVJiZ4JiZpLmRhdGFGaWx0ZXImJihkPWkuZGF0YUZpbHRlcihkLGkuZGF0YVR5cGUpKSxVPUksST1kdC5zaGlmdCgpLEkpe2lmKEk9PT0iKiIpST1VO2Vsc2UgaWYoVSE9PSIqIiYmVSE9PUkpe2lmKEU9UVtVKyIgIitJXXx8UVsiKiAiK0ldLCFFKXtmb3IoQSBpbiBRKWlmKCQ9QS5zcGxpdCgiICIpLCRbMV09PT1JJiYoRT1RW1UrIiAiKyRbMF1dfHxRWyIqICIrJFswXV0sRSkpe0U9PT0hMD9FPVFbQV06UVtBXSE9PSEwJiYoST0kWzBdLGR0LnVuc2hpZnQoJFsxXSkpO2JyZWFrfX1pZihFIT09ITApaWYoRSYmaS50aHJvd3MpZD1FKGQpO2Vsc2UgdHJ5e2Q9RShkKX1jYXRjaChmdCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6RT9mdDoiTm8gY29udmVyc2lvbiBmcm9tICIrVSsiIHRvICIrSX19fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZH19dS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpyLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOm1vLnRlc3QoenIucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6YmEsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOnUucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihpLGQpe3JldHVybiBkP1puKFpuKGksdS5hamF4U2V0dGluZ3MpLGQpOlpuKHUuYWpheFNldHRpbmdzLGkpfSxhamF4UHJlZmlsdGVyOnZhKHBhKSxhamF4VHJhbnNwb3J0OnZhKFhuKSxhamF4OmZ1bmN0aW9uKGksZCl7dHlwZW9mIGk9PSJvYmplY3QiJiYoZD1pLGk9dm9pZCAwKSxkPWR8fHt9O3ZhciB2LHgsQSxJLEUsJCxVLFEsZHQsZnQsaXQ9dS5hamF4U2V0dXAoe30sZCksd3Q9aXQuY29udGV4dHx8aXQsRXQ9aXQuY29udGV4dCYmKHd0Lm5vZGVUeXBlfHx3dC5qcXVlcnkpP3Uod3QpOnUuZXZlbnQsR3Q9dS5EZWZlcnJlZCgpLE10PXUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGxlPWl0LnN0YXR1c0NvZGV8fHt9LHNlPXt9LE1lPXt9LFZlPSJjYW5jZWxlZCIscXQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihYdCl7dmFyIHJlO2lmKFUpe2lmKCFJKWZvcihJPXt9O3JlPXZvLmV4ZWMoQSk7KUlbcmVbMV0udG9Mb3dlckNhc2UoKSsiICJdPShJW3JlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChyZVsyXSk7cmU9SVtYdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIHJlPT1udWxsP251bGw6cmUuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIFU/QTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKFh0LHJlKXtyZXR1cm4gVT09bnVsbCYmKFh0PU1lW1h0LnRvTG93ZXJDYXNlKCldPU1lW1h0LnRvTG93ZXJDYXNlKCldfHxYdCxzZVtYdF09cmUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oWHQpe3JldHVybiBVPT1udWxsJiYoaXQubWltZVR5cGU9WHQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oWHQpe3ZhciByZTtpZihYdClpZihVKXF0LmFsd2F5cyhYdFtxdC5zdGF0dXNdKTtlbHNlIGZvcihyZSBpbiBYdClsZVtyZV09W2xlW3JlXSxYdFtyZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihYdCl7dmFyIHJlPVh0fHxWZTtyZXR1cm4gdiYmdi5hYm9ydChyZSksZHIoMCxyZSksdGhpc319O2lmKEd0LnByb21pc2UocXQpLGl0LnVybD0oKGl8fGl0LnVybHx8enIuaHJlZikrIiIpLnJlcGxhY2UoeW8senIucHJvdG9jb2wrIi8vIiksaXQudHlwZT1kLm1ldGhvZHx8ZC50eXBlfHxpdC5tZXRob2R8fGl0LnR5cGUsaXQuZGF0YVR5cGVzPShpdC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEJ0KXx8WyIiXSxpdC5jcm9zc0RvbWFpbj09bnVsbCl7JD1GLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7JC5ocmVmPWl0LnVybCwkLmhyZWY9JC5ocmVmLGl0LmNyb3NzRG9tYWluPSRuLnByb3RvY29sKyIvLyIrJG4uaG9zdCE9JC5wcm90b2NvbCsiLy8iKyQuaG9zdH1jYXRjaHtpdC5jcm9zc0RvbWFpbj0hMH19aWYoaXQuZGF0YSYmaXQucHJvY2Vzc0RhdGEmJnR5cGVvZiBpdC5kYXRhIT0ic3RyaW5nIiYmKGl0LmRhdGE9dS5wYXJhbShpdC5kYXRhLGl0LnRyYWRpdGlvbmFsKSksbWEocGEsaXQsZCxxdCksVSlyZXR1cm4gcXQ7UT11LmV2ZW50JiZpdC5nbG9iYWwsUSYmdS5hY3RpdmUrKz09PTAmJnUuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksaXQudHlwZT1pdC50eXBlLnRvVXBwZXJDYXNlKCksaXQuaGFzQ29udGVudD0hZ28udGVzdChpdC50eXBlKSx4PWl0LnVybC5yZXBsYWNlKHBvLCIiKSxpdC5oYXNDb250ZW50P2l0LmRhdGEmJml0LnByb2Nlc3NEYXRhJiYoaXQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJihpdC5kYXRhPWl0LmRhdGEucmVwbGFjZShobywiKyIpKTooZnQ9aXQudXJsLnNsaWNlKHgubGVuZ3RoKSxpdC5kYXRhJiYoaXQucHJvY2Vzc0RhdGF8fHR5cGVvZiBpdC5kYXRhPT0ic3RyaW5nIikmJih4Kz0ocW4udGVzdCh4KT8iJiI6Ij8iKStpdC5kYXRhLGRlbGV0ZSBpdC5kYXRhKSxpdC5jYWNoZT09PSExJiYoeD14LnJlcGxhY2UoYm8sIiQxIiksZnQ9KHFuLnRlc3QoeCk/IiYiOiI/IikrIl89Iit1YS5ndWlkKysrZnQpLGl0LnVybD14K2Z0KSxpdC5pZk1vZGlmaWVkJiYodS5sYXN0TW9kaWZpZWRbeF0mJnF0LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIix1Lmxhc3RNb2RpZmllZFt4XSksdS5ldGFnW3hdJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix1LmV0YWdbeF0pKSwoaXQuZGF0YSYmaXQuaGFzQ29udGVudCYmaXQuY29udGVudFR5cGUhPT0hMXx8ZC5jb250ZW50VHlwZSkmJnF0LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsaXQuY29udGVudFR5cGUpLHF0LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaXQuZGF0YVR5cGVzWzBdJiZpdC5hY2NlcHRzW2l0LmRhdGFUeXBlc1swXV0/aXQuYWNjZXB0c1tpdC5kYXRhVHlwZXNbMF1dKyhpdC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiYSsiOyBxPTAuMDEiOiIiKTppdC5hY2NlcHRzWyIqIl0pO2ZvcihkdCBpbiBpdC5oZWFkZXJzKXF0LnNldFJlcXVlc3RIZWFkZXIoZHQsaXQuaGVhZGVyc1tkdF0pO2lmKGl0LmJlZm9yZVNlbmQmJihpdC5iZWZvcmVTZW5kLmNhbGwod3QscXQsaXQpPT09ITF8fFUpKXJldHVybiBxdC5hYm9ydCgpO2lmKFZlPSJhYm9ydCIsTXQuYWRkKGl0LmNvbXBsZXRlKSxxdC5kb25lKGl0LnN1Y2Nlc3MpLHF0LmZhaWwoaXQuZXJyb3IpLHY9bWEoWG4saXQsZCxxdCksIXYpZHIoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7aWYocXQucmVhZHlTdGF0ZT0xLFEmJkV0LnRyaWdnZXIoImFqYXhTZW5kIixbcXQsaXRdKSxVKXJldHVybiBxdDtpdC5hc3luYyYmaXQudGltZW91dD4wJiYoRT10LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxdC5hYm9ydCgidGltZW91dCIpfSxpdC50aW1lb3V0KSk7dHJ5e1U9ITEsdi5zZW5kKHNlLGRyKX1jYXRjaChYdCl7aWYoVSl0aHJvdyBYdDtkcigtMSxYdCl9fWZ1bmN0aW9uIGRyKFh0LHJlLE1yLFluKXt2YXIgSGUsVnIsV2UsUWUsSmUsU2U9cmU7VXx8KFU9ITAsRSYmdC5jbGVhclRpbWVvdXQoRSksdj12b2lkIDAsQT1Zbnx8IiIscXQucmVhZHlTdGF0ZT1YdD4wPzQ6MCxIZT1YdD49MjAwJiZYdDwzMDB8fFh0PT09MzA0LE1yJiYoUWU9d28oaXQscXQsTXIpKSwhSGUmJnUuaW5BcnJheSgic2NyaXB0IixpdC5kYXRhVHlwZXMpPi0xJiZ1LmluQXJyYXkoImpzb24iLGl0LmRhdGFUeXBlcyk8MCYmKGl0LmNvbnZlcnRlcnNbInRleHQgc2NyaXB0Il09ZnVuY3Rpb24oKXt9KSxRZT14byhpdCxRZSxxdCxIZSksSGU/KGl0LmlmTW9kaWZpZWQmJihKZT1xdC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLEplJiYodS5sYXN0TW9kaWZpZWRbeF09SmUpLEplPXF0LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksSmUmJih1LmV0YWdbeF09SmUpKSxYdD09PTIwNHx8aXQudHlwZT09PSJIRUFEIj9TZT0ibm9jb250ZW50IjpYdD09PTMwND9TZT0ibm90bW9kaWZpZWQiOihTZT1RZS5zdGF0ZSxWcj1RZS5kYXRhLFdlPVFlLmVycm9yLEhlPSFXZSkpOihXZT1TZSwoWHR8fCFTZSkmJihTZT0iZXJyb3IiLFh0PDAmJihYdD0wKSkpLHF0LnN0YXR1cz1YdCxxdC5zdGF0dXNUZXh0PShyZXx8U2UpKyIiLEhlP0d0LnJlc29sdmVXaXRoKHd0LFtWcixTZSxxdF0pOkd0LnJlamVjdFdpdGgod3QsW3F0LFNlLFdlXSkscXQuc3RhdHVzQ29kZShsZSksbGU9dm9pZCAwLFEmJkV0LnRyaWdnZXIoSGU/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbcXQsaXQsSGU/VnI6V2VdKSxNdC5maXJlV2l0aCh3dCxbcXQsU2VdKSxRJiYoRXQudHJpZ2dlcigiYWpheENvbXBsZXRlIixbcXQsaXRdKSwtLXUuYWN0aXZlfHx1LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gcXR9LGdldEpTT046ZnVuY3Rpb24oaSxkLHYpe3JldHVybiB1LmdldChpLGQsdiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gdS5nZXQoaSx2b2lkIDAsZCwic2NyaXB0Iil9fSksdS5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGksZCl7dVtkXT1mdW5jdGlvbih2LHgsQSxJKXtyZXR1cm4gayh4KSYmKEk9SXx8QSxBPXgseD12b2lkIDApLHUuYWpheCh1LmV4dGVuZCh7dXJsOnYsdHlwZTpkLGRhdGFUeXBlOkksZGF0YTp4LHN1Y2Nlc3M6QX0sdS5pc1BsYWluT2JqZWN0KHYpJiZ2KSl9fSksdS5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGkpe3ZhciBkO2ZvcihkIGluIGkuaGVhZGVycylkLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIiYmKGkuY29udGVudFR5cGU9aS5oZWFkZXJzW2RdfHwiIil9KSx1Ll9ldmFsVXJsPWZ1bmN0aW9uKGksZCx2KXtyZXR1cm4gdS5hamF4KHt1cmw6aSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih4KXt1Lmdsb2JhbEV2YWwoeCxkLHYpfX0pfSx1LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihpKXt2YXIgZDtyZXR1cm4gdGhpc1swXSYmKGsoaSkmJihpPWkuY2FsbCh0aGlzWzBdKSksZD11KGksdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZkLmluc2VydEJlZm9yZSh0aGlzWzBdKSxkLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgdj10aGlzO3YuZmlyc3RFbGVtZW50Q2hpbGQ7KXY9di5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gdn0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGkpe3JldHVybiBrKGkpP3RoaXMuZWFjaChmdW5jdGlvbihkKXt1KHRoaXMpLndyYXBJbm5lcihpLmNhbGwodGhpcyxkKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD11KHRoaXMpLHY9ZC5jb250ZW50cygpO3YubGVuZ3RoP3Yud3JhcEFsbChpKTpkLmFwcGVuZChpKX0pfSx3cmFwOmZ1bmN0aW9uKGkpe3ZhciBkPWsoaSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih2KXt1KHRoaXMpLndyYXBBbGwoZD9pLmNhbGwodGhpcyx2KTppKX0pfSx1bndyYXA6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMucGFyZW50KGkpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXt1KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLHUuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihpKXtyZXR1cm4hdS5leHByLnBzZXVkb3MudmlzaWJsZShpKX0sdS5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihpKXtyZXR1cm4hIShpLm9mZnNldFdpZHRofHxpLm9mZnNldEhlaWdodHx8aS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LHUuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IHQuWE1MSHR0cFJlcXVlc3R9Y2F0Y2h7fX07dmFyIF9vPXswOjIwMCwxMjIzOjIwNH0sanI9dS5hamF4U2V0dGluZ3MueGhyKCk7dy5jb3JzPSEhanImJiJ3aXRoQ3JlZGVudGlhbHMiaW4ganIsdy5hamF4PWpyPSEhanIsdS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBkLHY7aWYody5jb3JzfHxqciYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oeCxBKXt2YXIgSSxFPWkueGhyKCk7aWYoRS5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKEkgaW4gaS54aHJGaWVsZHMpRVtJXT1pLnhockZpZWxkc1tJXTtpLm1pbWVUeXBlJiZFLm92ZXJyaWRlTWltZVR5cGUmJkUub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSwhaS5jcm9zc0RvbWFpbiYmIXhbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKHhbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoSSBpbiB4KUUuc2V0UmVxdWVzdEhlYWRlcihJLHhbSV0pO2Q9ZnVuY3Rpb24oJCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZCYmKGQ9dj1FLm9ubG9hZD1FLm9uZXJyb3I9RS5vbmFib3J0PUUub250aW1lb3V0PUUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsJD09PSJhYm9ydCI/RS5hYm9ydCgpOiQ9PT0iZXJyb3IiP3R5cGVvZiBFLnN0YXR1cyE9Im51bWJlciI/QSgwLCJlcnJvciIpOkEoRS5zdGF0dXMsRS5zdGF0dXNUZXh0KTpBKF9vW0Uuc3RhdHVzXXx8RS5zdGF0dXMsRS5zdGF0dXNUZXh0LChFLnJlc3BvbnNlVHlwZXx8InRleHQiKSE9PSJ0ZXh0Inx8dHlwZW9mIEUucmVzcG9uc2VUZXh0IT0ic3RyaW5nIj97YmluYXJ5OkUucmVzcG9uc2V9Ont0ZXh0OkUucmVzcG9uc2VUZXh0fSxFLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxFLm9ubG9hZD1kKCksdj1FLm9uZXJyb3I9RS5vbnRpbWVvdXQ9ZCgiZXJyb3IiKSxFLm9uYWJvcnQhPT12b2lkIDA/RS5vbmFib3J0PXY6RS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtFLnJlYWR5U3RhdGU9PT00JiZ0LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkJiZ2KCl9KX0sZD1kKCJhYm9ydCIpO3RyeXtFLnNlbmQoaS5oYXNDb250ZW50JiZpLmRhdGF8fG51bGwpfWNhdGNoKCQpe2lmKGQpdGhyb3cgJH19LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZCgpfX19KSx1LmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oaSl7aS5jcm9zc0RvbWFpbiYmKGkuY29udGVudHMuc2NyaXB0PSExKX0pLHUuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGkpe3JldHVybiB1Lmdsb2JhbEV2YWwoaSksaX19fSksdS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGkpe2kuY2FjaGU9PT12b2lkIDAmJihpLmNhY2hlPSExKSxpLmNyb3NzRG9tYWluJiYoaS50eXBlPSJHRVQiKX0pLHUuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihpKXtpZihpLmNyb3NzRG9tYWlufHxpLnNjcmlwdEF0dHJzKXt2YXIgZCx2O3JldHVybntzZW5kOmZ1bmN0aW9uKHgsQSl7ZD11KCI8c2NyaXB0PiIpLmF0dHIoaS5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6aS5zY3JpcHRDaGFyc2V0LHNyYzppLnVybH0pLm9uKCJsb2FkIGVycm9yIix2PWZ1bmN0aW9uKEkpe2QucmVtb3ZlKCksdj1udWxsLEkmJkEoSS50eXBlPT09ImVycm9yIj80MDQ6MjAwLEkudHlwZSl9KSxGLmhlYWQuYXBwZW5kQ2hpbGQoZFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7diYmdigpfX19fSk7dmFyIGdhPVtdLEtuPS8oPSlcPyg/PSZ8JCl8XD9cPy87dS5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBpPWdhLnBvcCgpfHx1LmV4cGFuZG8rIl8iK3VhLmd1aWQrKztyZXR1cm4gdGhpc1tpXT0hMCxpfX0pLHUuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oaSxkLHYpe3ZhciB4LEEsSSxFPWkuanNvbnAhPT0hMSYmKEtuLnRlc3QoaS51cmwpPyJ1cmwiOnR5cGVvZiBpLmRhdGE9PSJzdHJpbmciJiYoaS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpPT09MCYmS24udGVzdChpLmRhdGEpJiYiZGF0YSIpO2lmKEV8fGkuZGF0YVR5cGVzWzBdPT09Impzb25wIilyZXR1cm4geD1pLmpzb25wQ2FsbGJhY2s9ayhpLmpzb25wQ2FsbGJhY2spP2kuanNvbnBDYWxsYmFjaygpOmkuanNvbnBDYWxsYmFjayxFP2lbRV09aVtFXS5yZXBsYWNlKEtuLCIkMSIreCk6aS5qc29ucCE9PSExJiYoaS51cmwrPShxbi50ZXN0KGkudXJsKT8iJiI6Ij8iKStpLmpzb25wKyI9Iit4KSxpLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gSXx8dS5lcnJvcih4KyIgd2FzIG5vdCBjYWxsZWQiKSxJWzBdfSxpLmRhdGFUeXBlc1swXT0ianNvbiIsQT10W3hdLHRbeF09ZnVuY3Rpb24oKXtJPWFyZ3VtZW50c30sdi5hbHdheXMoZnVuY3Rpb24oKXtBPT09dm9pZCAwP3UodCkucmVtb3ZlUHJvcCh4KTp0W3hdPUEsaVt4XSYmKGkuanNvbnBDYWxsYmFjaz1kLmpzb25wQ2FsbGJhY2ssZ2EucHVzaCh4KSksSSYmayhBKSYmQShJWzBdKSxJPUE9dm9pZCAwfSksInNjcmlwdCJ9KSx3LmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBpPUYuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLGkuY2hpbGROb2Rlcy5sZW5ndGg9PT0yfSgpLHUucGFyc2VIVE1MPWZ1bmN0aW9uKGksZCx2KXtpZih0eXBlb2YgaSE9InN0cmluZyIpcmV0dXJuW107dHlwZW9mIGQ9PSJib29sZWFuIiYmKHY9ZCxkPSExKTt2YXIgeCxBLEk7cmV0dXJuIGR8fCh3LmNyZWF0ZUhUTUxEb2N1bWVudD8oZD1GLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikseD1kLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSx4LmhyZWY9Ri5sb2NhdGlvbi5ocmVmLGQuaGVhZC5hcHBlbmRDaGlsZCh4KSk6ZD1GKSxBPWF0LmV4ZWMoaSksST0hdiYmW10sQT9bZC5jcmVhdGVFbGVtZW50KEFbMV0pXTooQT0kaShbaV0sZCxJKSxJJiZJLmxlbmd0aCYmdShJKS5yZW1vdmUoKSx1Lm1lcmdlKFtdLEEuY2hpbGROb2RlcykpfSx1LmZuLmxvYWQ9ZnVuY3Rpb24oaSxkLHYpe3ZhciB4LEEsSSxFPXRoaXMsJD1pLmluZGV4T2YoIiAiKTtyZXR1cm4gJD4tMSYmKHg9b3IoaS5zbGljZSgkKSksaT1pLnNsaWNlKDAsJCkpLGsoZCk/KHY9ZCxkPXZvaWQgMCk6ZCYmdHlwZW9mIGQ9PSJvYmplY3QiJiYoQT0iUE9TVCIpLEUubGVuZ3RoPjAmJnUuYWpheCh7dXJsOmksdHlwZTpBfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTpkfSkuZG9uZShmdW5jdGlvbihVKXtJPWFyZ3VtZW50cyxFLmh0bWwoeD91KCI8ZGl2PiIpLmFwcGVuZCh1LnBhcnNlSFRNTChVKSkuZmluZCh4KTpVKX0pLmFsd2F5cyh2JiZmdW5jdGlvbihVLFEpe0UuZWFjaChmdW5jdGlvbigpe3YuYXBwbHkodGhpcyxJfHxbVS5yZXNwb25zZVRleHQsUSxVXSl9KX0pLHRoaXN9LHUuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKGkpe3JldHVybiB1LmdyZXAodS50aW1lcnMsZnVuY3Rpb24oZCl7cmV0dXJuIGk9PT1kLmVsZW19KS5sZW5ndGh9LHUub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oaSxkLHYpe3ZhciB4LEEsSSxFLCQsVSxRLGR0PXUuY3NzKGksInBvc2l0aW9uIiksZnQ9dShpKSxpdD17fTtkdD09PSJzdGF0aWMiJiYoaS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSwkPWZ0Lm9mZnNldCgpLEk9dS5jc3MoaSwidG9wIiksVT11LmNzcyhpLCJsZWZ0IiksUT0oZHQ9PT0iYWJzb2x1dGUifHxkdD09PSJmaXhlZCIpJiYoSStVKS5pbmRleE9mKCJhdXRvIik+LTEsUT8oeD1mdC5wb3NpdGlvbigpLEU9eC50b3AsQT14LmxlZnQpOihFPXBhcnNlRmxvYXQoSSl8fDAsQT1wYXJzZUZsb2F0KFUpfHwwKSxrKGQpJiYoZD1kLmNhbGwoaSx2LHUuZXh0ZW5kKHt9LCQpKSksZC50b3AhPW51bGwmJihpdC50b3A9ZC50b3AtJC50b3ArRSksZC5sZWZ0IT1udWxsJiYoaXQubGVmdD1kLmxlZnQtJC5sZWZ0K0EpLCJ1c2luZyJpbiBkP2QudXNpbmcuY2FsbChpLGl0KTpmdC5jc3MoaXQpfX0sdS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihpKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBpPT09dm9pZCAwP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKEEpe3Uub2Zmc2V0LnNldE9mZnNldCh0aGlzLGksQSl9KTt2YXIgZCx2LHg9dGhpc1swXTtpZih4KXJldHVybiB4LmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhkPXguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj14Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDpkLnRvcCt2LnBhZ2VZT2Zmc2V0LGxlZnQ6ZC5sZWZ0K3YucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgaSxkLHYseD10aGlzWzBdLEE9e3RvcDowLGxlZnQ6MH07aWYodS5jc3MoeCwicG9zaXRpb24iKT09PSJmaXhlZCIpZD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKGQ9dGhpcy5vZmZzZXQoKSx2PXgub3duZXJEb2N1bWVudCxpPXgub2Zmc2V0UGFyZW50fHx2LmRvY3VtZW50RWxlbWVudDtpJiYoaT09PXYuYm9keXx8aT09PXYuZG9jdW1lbnRFbGVtZW50KSYmdS5jc3MoaSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylpPWkucGFyZW50Tm9kZTtpJiZpIT09eCYmaS5ub2RlVHlwZT09PTEmJihBPXUoaSkub2Zmc2V0KCksQS50b3ArPXUuY3NzKGksImJvcmRlclRvcFdpZHRoIiwhMCksQS5sZWZ0Kz11LmNzcyhpLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDpkLnRvcC1BLnRvcC11LmNzcyh4LCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmQubGVmdC1BLmxlZnQtdS5jc3MoeCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgaT10aGlzLm9mZnNldFBhcmVudDtpJiZ1LmNzcyhpLCJwb3NpdGlvbiIpPT09InN0YXRpYyI7KWk9aS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGl8fE9lfSl9fSksdS5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGksZCl7dmFyIHY9ZD09PSJwYWdlWU9mZnNldCI7dS5mbltpXT1mdW5jdGlvbih4KXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKEEsSSxFKXt2YXIgJDtpZihQKEEpPyQ9QTpBLm5vZGVUeXBlPT09OSYmKCQ9QS5kZWZhdWx0VmlldyksRT09PXZvaWQgMClyZXR1cm4gJD8kW2RdOkFbSV07JD8kLnNjcm9sbFRvKHY/JC5wYWdlWE9mZnNldDpFLHY/RTokLnBhZ2VZT2Zmc2V0KTpBW0ldPUV9LGkseCxhcmd1bWVudHMubGVuZ3RoKX19KSx1LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oaSxkKXt1LmNzc0hvb2tzW2RdPXRhKHcucGl4ZWxQb3NpdGlvbixmdW5jdGlvbih2LHgpe2lmKHgpcmV0dXJuIHg9UnIodixkKSxqbi50ZXN0KHgpP3UodikucG9zaXRpb24oKVtkXSsicHgiOnh9KX0pLHUuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGksZCl7dS5lYWNoKHtwYWRkaW5nOiJpbm5lciIraSxjb250ZW50OmQsIiI6Im91dGVyIitpfSxmdW5jdGlvbih2LHgpe3UuZm5beF09ZnVuY3Rpb24oQSxJKXt2YXIgRT1hcmd1bWVudHMubGVuZ3RoJiYodnx8dHlwZW9mIEEhPSJib29sZWFuIiksJD12fHwoQT09PSEwfHxJPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oVSxRLGR0KXt2YXIgZnQ7cmV0dXJuIFAoVSk/eC5pbmRleE9mKCJvdXRlciIpPT09MD9VWyJpbm5lciIraV06VS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIraV06VS5ub2RlVHlwZT09PTk/KGZ0PVUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KFUuYm9keVsic2Nyb2xsIitpXSxmdFsic2Nyb2xsIitpXSxVLmJvZHlbIm9mZnNldCIraV0sZnRbIm9mZnNldCIraV0sZnRbImNsaWVudCIraV0pKTpkdD09PXZvaWQgMD91LmNzcyhVLFEsJCk6dS5zdHlsZShVLFEsZHQsJCl9LGQsRT9BOnZvaWQgMCxFKX19KX0pLHUuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGksZCl7dS5mbltkXT1mdW5jdGlvbih2KXtyZXR1cm4gdGhpcy5vbihkLHYpfX0pLHUuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGksZCx2KXtyZXR1cm4gdGhpcy5vbihpLG51bGwsZCx2KX0sdW5iaW5kOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMub2ZmKGksbnVsbCxkKX0sZGVsZWdhdGU6ZnVuY3Rpb24oaSxkLHYseCl7cmV0dXJuIHRoaXMub24oZCxpLHYseCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oaSxkLHYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT90aGlzLm9mZihpLCIqKiIpOnRoaXMub2ZmKGQsaXx8IioqIix2KX0saG92ZXI6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gdGhpcy5vbigibW91c2VlbnRlciIsaSkub24oIm1vdXNlbGVhdmUiLGR8fGkpfX0pLHUuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihpLGQpe3UuZm5bZF09ZnVuY3Rpb24odix4KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZCxudWxsLHYseCk6dGhpcy50cmlnZ2VyKGQpfX0pO3ZhciBDbz0vXltcc1x1RkVGRlx4QTBdK3woW15cc1x1RkVGRlx4QTBdKVtcc1x1RkVGRlx4QTBdKyQvZzt1LnByb3h5PWZ1bmN0aW9uKGksZCl7dmFyIHYseCxBO2lmKHR5cGVvZiBkPT0ic3RyaW5nIiYmKHY9aVtkXSxkPWksaT12KSwhIWsoaSkpcmV0dXJuIHg9cy5jYWxsKGFyZ3VtZW50cywyKSxBPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkoZHx8dGhpcyx4LmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSxBLmd1aWQ9aS5ndWlkPWkuZ3VpZHx8dS5ndWlkKyssQX0sdS5ob2xkUmVhZHk9ZnVuY3Rpb24oaSl7aT91LnJlYWR5V2FpdCsrOnUucmVhZHkoITApfSx1LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx1LnBhcnNlSlNPTj1KU09OLnBhcnNlLHUubm9kZU5hbWU9cSx1LmlzRnVuY3Rpb249ayx1LmlzV2luZG93PVAsdS5jYW1lbENhc2U9Z3QsdS50eXBlPWYsdS5ub3c9RGF0ZS5ub3csdS5pc051bWVyaWM9ZnVuY3Rpb24oaSl7dmFyIGQ9dS50eXBlKGkpO3JldHVybihkPT09Im51bWJlciJ8fGQ9PT0ic3RyaW5nIikmJiFpc05hTihpLXBhcnNlRmxvYXQoaSkpfSx1LnRyaW09ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PW51bGw/IiI6KGkrIiIpLnJlcGxhY2UoQ28sIiQxIil9LHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIFRvPXQualF1ZXJ5LGtvPXQuJDtyZXR1cm4gdS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGkpe3JldHVybiB0LiQ9PT11JiYodC4kPWtvKSxpJiZ0LmpRdWVyeT09PXUmJih0LmpRdWVyeT1UbyksdX0sdHlwZW9mIGU+InUiJiYodC5qUXVlcnk9dC4kPXUpLHV9KX0pO3ZhciBVcz1uZShrYSgpKSxHbD1uZShpZSgpKTt2YXIgRGw9bmUoaWUoKSwxKTt2YXIgamE9bmUoaWUoKSwxKTt2YXIgVz1qYS5kZWZhdWx0LHZ0PWZ1bmN0aW9uKHQsZSl7aWYodnQuZmFjdG9yeSh0LGUpKXJldHVybiB2dDtpZih0aGlzIGluc3RhbmNlb2YgdnQpcmV0dXJuIFcodCkuRGF0YVRhYmxlKGUpO2U9dDt2YXIgcj10aGlzLG49ZT09PXZvaWQgMCxzPXRoaXMubGVuZ3RoO3JldHVybiBuJiYoZT17fSksdGhpcy5hcGk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFd0KHRoaXMpfSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYT17fSxsPXM+MT9PYShhLGUsITApOmUsYz0wLHAsYj10aGlzLmdldEF0dHJpYnV0ZSgiaWQiKSxtPSExLHk9dnQuZGVmYXVsdHMsVD1XKHRoaXMpO2lmKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9InRhYmxlIil7UGUobnVsbCwwLCJOb24tdGFibGUgbm9kZSBpbml0aWFsaXNhdGlvbiAoIit0aGlzLm5vZGVOYW1lKyIpIiwyKTtyZXR1cm59Vyh0aGlzKS50cmlnZ2VyKCJvcHRpb25zLmR0IixsKSxEYSh5KSxVYSh5LmNvbHVtbiksZXIoeSx5LCEwKSxlcih5LmNvbHVtbix5LmNvbHVtbiwhMCksZXIoeSxXLmV4dGVuZChsLFQuZGF0YSgpKSwhMCk7dmFyIHc9dnQuc2V0dGluZ3M7Zm9yKGM9MCxwPXcubGVuZ3RoO2M8cDtjKyspe3ZhciBrPXdbY107aWYoay5uVGFibGU9PXRoaXN8fGsublRIZWFkJiZrLm5USGVhZC5wYXJlbnROb2RlPT10aGlzfHxrLm5URm9vdCYmay5uVEZvb3QucGFyZW50Tm9kZT09dGhpcyl7dmFyIFA9bC5iUmV0cmlldmUhPT12b2lkIDA/bC5iUmV0cmlldmU6eS5iUmV0cmlldmUsRj1sLmJEZXN0cm95IT09dm9pZCAwP2wuYkRlc3Ryb3k6eS5iRGVzdHJveTtpZihufHxQKXJldHVybiBrLm9JbnN0YW5jZTtpZihGKXtuZXcgdnQuQXBpKGspLmRlc3Ryb3koKTticmVha31lbHNle1BlKGssMCwiQ2Fubm90IHJlaW5pdGlhbGlzZSBEYXRhVGFibGUiLDMpO3JldHVybn19aWYoay5zVGFibGVJZD09dGhpcy5pZCl7dy5zcGxpY2UoYywxKTticmVha319KGI9PT1udWxsfHxiPT09IiIpJiYoYj0iRGF0YVRhYmxlc19UYWJsZV8iK3Z0LmV4dC5fdW5pcXVlKyssdGhpcy5pZD1iKTt2YXIgaD1XLmV4dGVuZCghMCx7fSx2dC5tb2RlbHMub1NldHRpbmdzLHtzRGVzdHJveVdpZHRoOlRbMF0uc3R5bGUud2lkdGgsc0luc3RhbmNlOmIsc1RhYmxlSWQ6Yixjb2xncm91cDpXKCI8Y29sZ3JvdXA+IikucHJlcGVuZFRvKHRoaXMpLGZhc3REYXRhOmZ1bmN0aW9uKFosZyxfKXtyZXR1cm4gTmUoaCxaLGcsXyl9fSk7aC5uVGFibGU9dGhpcyxoLm9Jbml0PWwsdy5wdXNoKGgpLGguYXBpPW5ldyBXdChoKSxoLm9JbnN0YW5jZT1yLmxlbmd0aD09PTE/cjpULmRhdGFUYWJsZSgpLERhKGwpLGwuYUxlbmd0aE1lbnUmJiFsLmlEaXNwbGF5TGVuZ3RoJiYobC5pRGlzcGxheUxlbmd0aD1BcnJheS5pc0FycmF5KGwuYUxlbmd0aE1lbnVbMF0pP2wuYUxlbmd0aE1lbnVbMF1bMF06Vy5pc1BsYWluT2JqZWN0KGwuYUxlbmd0aE1lbnVbMF0pP2wuYUxlbmd0aE1lbnVbMF0udmFsdWU6bC5hTGVuZ3RoTWVudVswXSksbD1PYShXLmV4dGVuZCghMCx7fSx5KSxsKSxucihoLm9GZWF0dXJlcyxsLFsiYlBhZ2luYXRlIiwiYkxlbmd0aENoYW5nZSIsImJGaWx0ZXIiLCJiU29ydCIsImJTb3J0TXVsdGkiLCJiSW5mbyIsImJQcm9jZXNzaW5nIiwiYkF1dG9XaWR0aCIsImJTb3J0Q2xhc3NlcyIsImJTZXJ2ZXJTaWRlIiwiYkRlZmVyUmVuZGVyIl0pLG5yKGgsbCxbImFqYXgiLCJmbkZvcm1hdE51bWJlciIsInNTZXJ2ZXJNZXRob2QiLCJhYVNvcnRpbmciLCJhYVNvcnRpbmdGaXhlZCIsImFMZW5ndGhNZW51Iiwic1BhZ2luYXRpb25UeXBlIiwiaVN0YXRlRHVyYXRpb24iLCJiU29ydENlbGxzVG9wIiwiaVRhYkluZGV4Iiwic0RvbSIsImZuU3RhdGVMb2FkQ2FsbGJhY2siLCJmblN0YXRlU2F2ZUNhbGxiYWNrIiwicmVuZGVyZXIiLCJzZWFyY2hEZWxheSIsInJvd0lkIiwiY2FwdGlvbiIsImxheW91dCIsWyJpQ29va2llRHVyYXRpb24iLCJpU3RhdGVEdXJhdGlvbiJdLFsib1NlYXJjaCIsIm9QcmV2aW91c1NlYXJjaCJdLFsiYW9TZWFyY2hDb2xzIiwiYW9QcmVTZWFyY2hDb2xzIl0sWyJpRGlzcGxheUxlbmd0aCIsIl9pRGlzcGxheUxlbmd0aCJdXSksbnIoaC5vU2Nyb2xsLGwsW1sic1Njcm9sbFgiLCJzWCJdLFsic1Njcm9sbFhJbm5lciIsInNYSW5uZXIiXSxbInNTY3JvbGxZIiwic1kiXSxbImJTY3JvbGxDb2xsYXBzZSIsImJDb2xsYXBzZSJdXSksbnIoaC5vTGFuZ3VhZ2UsbCwiZm5JbmZvQ2FsbGJhY2siKSxBZShoLCJhb0RyYXdDYWxsYmFjayIsbC5mbkRyYXdDYWxsYmFjayksQWUoaCwiYW9TdGF0ZVNhdmVQYXJhbXMiLGwuZm5TdGF0ZVNhdmVQYXJhbXMpLEFlKGgsImFvU3RhdGVMb2FkUGFyYW1zIixsLmZuU3RhdGVMb2FkUGFyYW1zKSxBZShoLCJhb1N0YXRlTG9hZGVkIixsLmZuU3RhdGVMb2FkZWQpLEFlKGgsImFvUm93Q2FsbGJhY2siLGwuZm5Sb3dDYWxsYmFjayksQWUoaCwiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siLGwuZm5DcmVhdGVkUm93KSxBZShoLCJhb0hlYWRlckNhbGxiYWNrIixsLmZuSGVhZGVyQ2FsbGJhY2spLEFlKGgsImFvRm9vdGVyQ2FsbGJhY2siLGwuZm5Gb290ZXJDYWxsYmFjayksQWUoaCwiYW9Jbml0Q29tcGxldGUiLGwuZm5Jbml0Q29tcGxldGUpLEFlKGgsImFvUHJlRHJhd0NhbGxiYWNrIixsLmZuUHJlRHJhd0NhbGxiYWNrKSxoLnJvd0lkRm49SXIobC5yb3dJZCkscW8oaCk7dmFyIG89aC5vQ2xhc3NlcztXLmV4dGVuZChvLHZ0LmV4dC5jbGFzc2VzLGwub0NsYXNzZXMpLFQuYWRkQ2xhc3Moby50YWJsZSksaC5vRmVhdHVyZXMuYlBhZ2luYXRlfHwobC5pRGlzcGxheVN0YXJ0PTApLGguaUluaXREaXNwbGF5U3RhcnQ9PT12b2lkIDAmJihoLmlJbml0RGlzcGxheVN0YXJ0PWwuaURpc3BsYXlTdGFydCxoLl9pRGlzcGxheVN0YXJ0PWwuaURpc3BsYXlTdGFydCk7dmFyIGY9aC5vTGFuZ3VhZ2U7Vy5leHRlbmQoITAsZixsLm9MYW5ndWFnZSksZi5zVXJsPyhXLmFqYXgoe2RhdGFUeXBlOiJqc29uIix1cmw6Zi5zVXJsLHN1Y2Nlc3M6ZnVuY3Rpb24oWil7ZXIoeS5vTGFuZ3VhZ2UsWiksVy5leHRlbmQoITAsZixaLGgub0luaXQub0xhbmd1YWdlKSxadChoLG51bGwsImkxOG4iLFtoXSwhMCksdm4oaCl9LGVycm9yOmZ1bmN0aW9uKCl7UGUoaCwwLCJpMThuIGZpbGUgbG9hZGluZyBlcnJvciIsMjEpLHZuKGgpfX0pLG09ITApOlp0KGgsbnVsbCwiaTE4biIsW2hdKTt2YXIgQz1bXSxCPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIiksdT1ZYShoLEJbMF0pO2lmKGwuYW9Db2x1bW5zKUM9bC5hb0NvbHVtbnM7ZWxzZSBpZih1Lmxlbmd0aClmb3IoYz0wLHA9dVswXS5sZW5ndGg7YzxwO2MrKylDLnB1c2gobnVsbCk7Zm9yKGM9MCxwPUMubGVuZ3RoO2M8cDtjKyspcWEoaCk7JG8oaCxsLmFvQ29sdW1uRGVmcyxDLHUsZnVuY3Rpb24oWixnKXt1aShoLFosZyl9KTt2YXIgej1ULmNoaWxkcmVuKCJ0Ym9keSIpLmZpbmQoInRyIikuZXEoMCk7aWYoei5sZW5ndGgpe3ZhciBxPWZ1bmN0aW9uKFosZyl7cmV0dXJuIFouZ2V0QXR0cmlidXRlKCJkYXRhLSIrZykhPT1udWxsP2c6bnVsbH07Vyh6WzBdKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbihaLGcpe3ZhciBfPWguYW9Db2x1bW5zW1pdO2lmKF98fFBlKGgsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLF8ubURhdGE9PT1aKXt2YXIgUz1xKGcsInNvcnQiKXx8cShnLCJvcmRlciIpLE49cShnLCJmaWx0ZXIiKXx8cShnLCJzZWFyY2giKTsoUyE9PW51bGx8fE4hPT1udWxsKSYmKF8ubURhdGE9e186WisiLmRpc3BsYXkiLHNvcnQ6UyE9PW51bGw/WisiLkBkYXRhLSIrUzp2b2lkIDAsdHlwZTpTIT09bnVsbD9aKyIuQGRhdGEtIitTOnZvaWQgMCxmaWx0ZXI6TiE9PW51bGw/WisiLkBkYXRhLSIrTjp2b2lkIDB9LF8uX2lzQXJyYXlIb3N0PSEwLHVpKGgsWikpfX0pfXZhciBldD1oLm9GZWF0dXJlcyxPPWZ1bmN0aW9uKCl7aWYobC5hYVNvcnRpbmc9PT12b2lkIDApe3ZhciBaPWguYWFTb3J0aW5nO2ZvcihjPTAscD1aLmxlbmd0aDtjPHA7YysrKVpbY11bMV09aC5hb0NvbHVtbnNbY10uYXNTb3J0aW5nWzBdfWZpKGgpLEFlKGgsImFvRHJhd0NhbGxiYWNrIixmdW5jdGlvbigpeyhoLmJTb3J0ZWR8fEJlKGgpPT09InNzcCJ8fGV0LmJEZWZlclJlbmRlcikmJmZpKGgpfSk7dmFyIGc9VC5jaGlsZHJlbigiY2FwdGlvbiIpO2guY2FwdGlvbiYmKGcubGVuZ3RoPT09MCYmKGc9VygiPGNhcHRpb24vPiIpLmFwcGVuZFRvKFQpKSxnLmh0bWwoaC5jYXB0aW9uKSksZy5sZW5ndGgmJihnWzBdLl9jYXB0aW9uU2lkZT1nLmNzcygiY2FwdGlvbi1zaWRlIiksaC5jYXB0aW9uTm9kZT1nWzBdKSxCLmxlbmd0aD09PTAmJihCPVcoIjx0aGVhZC8+IikuYXBwZW5kVG8oVCkpLGgublRIZWFkPUJbMF0sVygidHIiLEIpLmFkZENsYXNzKG8udGhlYWQucm93KTt2YXIgXz1ULmNoaWxkcmVuKCJ0Ym9keSIpO18ubGVuZ3RoPT09MCYmKF89VygiPHRib2R5Lz4iKS5pbnNlcnRBZnRlcihCKSksaC5uVEJvZHk9X1swXTt2YXIgUz1ULmNoaWxkcmVuKCJ0Zm9vdCIpO2lmKFMubGVuZ3RoPT09MCYmKFM9VygiPHRmb290Lz4iKS5hcHBlbmRUbyhUKSksaC5uVEZvb3Q9U1swXSxXKCJ0ciIsUykuYWRkQ2xhc3Moby50Zm9vdC5yb3cpLGwuYWFEYXRhKWZvcihjPTA7YzxsLmFhRGF0YS5sZW5ndGg7YysrKWJyKGgsbC5hYURhdGFbY10pO2Vsc2UgQmUoaCk9PSJkb20iJiZfaShoLFcoaC5uVEJvZHkpLmNoaWxkcmVuKCJ0ciIpKTtoLmFpRGlzcGxheT1oLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLGguYkluaXRpYWxpc2VkPSEwLG09PT0hMSYmdm4oaCl9O0FlKGgsImFvRHJhd0NhbGxiYWNrIixJbiksbC5iU3RhdGVTYXZlPyhldC5iU3RhdGVTYXZlPSEwLGZsKGgsbCxPKSk6TygpfSkscj1udWxsLHRoaXN9O3Z0LmV4dD1vZT17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6dnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246dnQudmVyc2lvbn07Vy5leHRlbmQob2Use2FmbkZpbHRlcmluZzpvZS5zZWFyY2gsYVR5cGVzOm9lLnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpvZS50eXBlLnNlYXJjaCxvU29ydDpvZS50eXBlLm9yZGVyLGFmblNvcnREYXRhOm9lLm9yZGVyLGFvRmVhdHVyZXM6b2UuZmVhdHVyZSxvU3RkQ2xhc3NlczpvZS5jbGFzc2VzLG9QYWdpbmF0aW9uOm9lLnBhZ2VyfSk7Vy5leHRlbmQodnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxlbmd0aDp7Y29udGFpbmVyOiJkdC1sZW5ndGgiLHNlbGVjdDoiZHQtaW5wdXQifSxvcmRlcjp7Y2FuQXNjOiJkdC1vcmRlcmFibGUtYXNjIixjYW5EZXNjOiJkdC1vcmRlcmFibGUtZGVzYyIsaXNBc2M6ImR0LW9yZGVyaW5nLWFzYyIsaXNEZXNjOiJkdC1vcmRlcmluZy1kZXNjIixub25lOiJkdC1vcmRlcmFibGUtbm9uZSIscG9zaXRpb246InNvcnRpbmdfIn0scHJvY2Vzc2luZzp7Y29udGFpbmVyOiJkdC1wcm9jZXNzaW5nIn0sc2Nyb2xsaW5nOntib2R5OiJkdC1zY3JvbGwtYm9keSIsY29udGFpbmVyOiJkdC1zY3JvbGwiLGZvb3Rlcjp7c2VsZjoiZHQtc2Nyb2xsLWZvb3QiLGlubmVyOiJkdC1zY3JvbGwtZm9vdElubmVyIn0saGVhZGVyOntzZWxmOiJkdC1zY3JvbGwtaGVhZCIsaW5uZXI6ImR0LXNjcm9sbC1oZWFkSW5uZXIifX0sc2VhcmNoOntjb250YWluZXI6ImR0LXNlYXJjaCIsaW5wdXQ6ImR0LWlucHV0In0sdGFibGU6ImRhdGFUYWJsZSIsdGJvZHk6e2NlbGw6IiIscm93OiIifSx0aGVhZDp7Y2VsbDoiIixyb3c6IiJ9LHRmb290OntjZWxsOiIiLHJvdzoiIn0scGFnaW5nOnthY3RpdmU6ImN1cnJlbnQiLGJ1dHRvbjoiZHQtcGFnaW5nLWJ1dHRvbiIsY29udGFpbmVyOiJkdC1wYWdpbmciLGRpc2FibGVkOiJkaXNhYmxlZCJ9fSk7dmFyIG9lLFd0LEl0LFF0LGFpPXt9LGpvPS9bXHJcblx1MjAyOF0vZyxwaT0vPChbXj5dKj4pL2csTW89TWF0aC5wb3coMiwyOCksVm89L15cZHsyLDR9Wy4vLV1cZHsxLDJ9Wy4vLV1cZHsxLDJ9KFtUIF17MX1cZHsxLDJ9WzouXVxkezJ9KFsuOl1cZHsyfSk/KT8kLyxIbz1uZXcgUmVnRXhwKCIoXFwiK1siLyIsIi4iLCIqIiwiKyIsIj8iLCJ8IiwiKCIsIikiLCJbIiwiXSIsInsiLCJ9IiwiXFwiLCIkIiwiXiIsIi0iXS5qb2luKCJ8XFwiKSsiKSIsImciKSxiaT0vWydcdTAwQTAsJMKj4oKswqUlXHUyMDA5XHUyMDJGXHUyMEJEXHUyMGE5XHUyMEJBcmZryYPOnl0vZ2ksWmU9ZnVuY3Rpb24odCl7cmV0dXJuIXR8fHQ9PT0hMHx8dD09PSItIn0sTWE9ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VJbnQodCwxMCk7cmV0dXJuIWlzTmFOKGUpJiZpc0Zpbml0ZSh0KT9lOm51bGx9LFZhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpW2VdfHwoYWlbZV09bmV3IFJlZ0V4cChjaShlKSwiZyIpKSx0eXBlb2YgdD09InN0cmluZyImJmUhPT0iLiI/dC5yZXBsYWNlKC9cLi9nLCIiKS5yZXBsYWNlKGFpW2VdLCIuIik6dH0sdmk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXR5cGVvZiB0LHM9bj09PSJzdHJpbmciO3JldHVybiBuPT09Im51bWJlciJ8fG49PT0iYmlnaW50Inx8WmUodCk/ITA6KGUmJnMmJih0PVZhKHQsZSkpLHImJnMmJih0PXQucmVwbGFjZShiaSwiIikpLCFpc05hTihwYXJzZUZsb2F0KHQpKSYmaXNGaW5pdGUodCkpfSxXbz1mdW5jdGlvbih0KXtyZXR1cm4gWmUodCl8fHR5cGVvZiB0PT0ic3RyaW5nIn0sSGE9ZnVuY3Rpb24odCxlLHIpe2lmKFplKHQpKXJldHVybiEwO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdC5tYXRjaCgvPChpbnB1dHxzZWxlY3QpL2kpKXJldHVybiBudWxsO3ZhciBuPVdvKHQpO3JldHVybiBuJiZ2aShocih0KSxlLHIpPyEwOm51bGx9LHhlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1bXSxzPTAsYT10Lmxlbmd0aDtpZihyIT09dm9pZCAwKWZvcig7czxhO3MrKyl0W3NdJiZ0W3NdW2VdJiZuLnB1c2godFtzXVtlXVtyXSk7ZWxzZSBmb3IoO3M8YTtzKyspdFtzXSYmbi5wdXNoKHRbc11bZV0pO3JldHVybiBufSxYcj1mdW5jdGlvbih0LGUscixuKXt2YXIgcz1bXSxhPTAsbD1lLmxlbmd0aDtpZihuIT09dm9pZCAwKWZvcig7YTxsO2ErKyl0W2VbYV1dW3JdJiZzLnB1c2godFtlW2FdXVtyXVtuXSk7ZWxzZSBmb3IoO2E8bDthKyspdFtlW2FdXSYmcy5wdXNoKHRbZVthXV1bcl0pO3JldHVybiBzfSxjcj1mdW5jdGlvbih0LGUpe3ZhciByPVtdLG47ZT09PXZvaWQgMD8oZT0wLG49dCk6KG49ZSxlPXQpO2Zvcih2YXIgcz1lO3M8bjtzKyspci5wdXNoKHMpO3JldHVybiByfSxXYT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wLG49dC5sZW5ndGg7cjxuO3IrKyl0W3JdJiZlLnB1c2godFtyXSk7cmV0dXJuIGV9LGhyPWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPk1vKXRocm93IG5ldyBFcnJvcigiRXhjZWVkZWQgbWF4IHN0ciBsZW4iKTt2YXIgZTt0PXQucmVwbGFjZShwaSwiIik7ZG8gZT10LHQ9dC5yZXBsYWNlKC88c2NyaXB0L2ksIiIpO3doaWxlKHQhPT1lKTtyZXR1cm4gZX0sRHI9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuam9pbigiLCIpKSx0eXBlb2YgdD09InN0cmluZyI/dC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKTp0fSxtbj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDt2YXIgcj10Lm5vcm1hbGl6ZSgiTkZEIik7cmV0dXJuIHIubGVuZ3RoIT09dC5sZW5ndGg/KGU9PT0hMD90KyIgIjoiIikrci5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywiIik6cn0sVW89ZnVuY3Rpb24odCl7aWYodC5sZW5ndGg8MilyZXR1cm4hMDtmb3IodmFyIGU9dC5zbGljZSgpLnNvcnQoKSxyPWVbMF0sbj0xLHM9ZS5sZW5ndGg7bjxzO24rKyl7aWYoZVtuXT09PXIpcmV0dXJuITE7cj1lW25dfXJldHVybiEwfSxwcj1mdW5jdGlvbih0KXtpZihBcnJheS5mcm9tJiZTZXQpcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh0KSk7aWYoVW8odCkpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT1bXSxyLG4scz10Lmxlbmd0aCxhLGw9MDt0OmZvcihuPTA7bjxzO24rKyl7Zm9yKHI9dFtuXSxhPTA7YTxsO2ErKylpZihlW2FdPT09ciljb250aW51ZSB0O2UucHVzaChyKSxsKyt9cmV0dXJuIGV9LG1pPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyltaSh0LGVbcl0pO2Vsc2UgdC5wdXNoKGUpO3JldHVybiB0fTtmdW5jdGlvbiBBcih0LGUpe2UmJmUuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ImJnQuY2xhc3NMaXN0LmFkZChyKX0pfXZ0LnV0aWw9e2RpYWNyaXRpY3M6ZnVuY3Rpb24odCxlKXt2YXIgcj10eXBlb2YgdDtpZihyIT09ImZ1bmN0aW9uIilyZXR1cm4gbW4odCxlKTttbj10fSxkZWJvdW5jZTpmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscz1hcmd1bWVudHM7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dChmdW5jdGlvbigpe3QuYXBwbHkobixzKX0sZXx8MjUwKX19LHRocm90dGxlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSE9PXZvaWQgMD9lOjIwMCxuLHM7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxsPStuZXcgRGF0ZSxjPWFyZ3VtZW50cztuJiZsPG4rcj8oY2xlYXJUaW1lb3V0KHMpLHM9c2V0VGltZW91dChmdW5jdGlvbigpe249dm9pZCAwLHQuYXBwbHkoYSxjKX0scikpOihuPWwsdC5hcHBseShhLGMpKX19LGVzY2FwZVJlZ2V4OmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoSG8sIlxcJDEiKX0sc2V0OmZ1bmN0aW9uKHQpe2lmKFcuaXNQbGFpbk9iamVjdCh0KSlyZXR1cm4gdnQudXRpbC5zZXQodC5fKTtpZih0PT09bnVsbClyZXR1cm4gZnVuY3Rpb24oKXt9O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbihyLG4scyl7dChyLCJzZXQiLG4scyl9O2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQuaW5kZXhPZigiLiIpIT09LTF8fHQuaW5kZXhPZigiWyIpIT09LTF8fHQuaW5kZXhPZigiKCIpIT09LTEpKXt2YXIgZT1mdW5jdGlvbihyLG4scyl7Zm9yKHZhciBhPUlhKHMpLGwsYz1hW2EubGVuZ3RoLTFdLHAsYixtLHksVD0wLHc9YS5sZW5ndGgtMTtUPHc7VCsrKXtpZihhW1RdPT09Il9fcHJvdG9fXyJ8fGFbVF09PT0iY29uc3RydWN0b3IiKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBwcm90b3R5cGUgdmFsdWVzIik7aWYocD1hW1RdLm1hdGNoKFVyKSxiPWFbVF0ubWF0Y2goa3IpLHApe2lmKGFbVF09YVtUXS5yZXBsYWNlKFVyLCIiKSxyW2FbVF1dPVtdLGw9YS5zbGljZSgpLGwuc3BsaWNlKDAsVCsxKSx5PWwuam9pbigiLiIpLEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBrPTAsUD1uLmxlbmd0aDtrPFA7aysrKW09e30sZShtLG5ba10seSksclthW1RdXS5wdXNoKG0pO2Vsc2UgclthW1RdXT1uO3JldHVybn1lbHNlIGImJihhW1RdPWFbVF0ucmVwbGFjZShrciwiIikscj1yW2FbVF1dKG4pKTsoclthW1RdXT09PW51bGx8fHJbYVtUXV09PT12b2lkIDApJiYoclthW1RdXT17fSkscj1yW2FbVF1dfWMubWF0Y2goa3IpP3I9cltjLnJlcGxhY2Uoa3IsIiIpXShuKTpyW2MucmVwbGFjZShVciwiIildPW59O3JldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBlKHIsbix0KX19ZWxzZSByZXR1cm4gZnVuY3Rpb24ocixuKXtyW3RdPW59fSxnZXQ6ZnVuY3Rpb24odCl7aWYoVy5pc1BsYWluT2JqZWN0KHQpKXt2YXIgZT17fTtyZXR1cm4gVy5lYWNoKHQsZnVuY3Rpb24obixzKXtzJiYoZVtuXT12dC51dGlsLmdldChzKSl9KSxmdW5jdGlvbihuLHMsYSxsKXt2YXIgYz1lW3NdfHxlLl87cmV0dXJuIGMhPT12b2lkIDA/YyhuLHMsYSxsKTpufX1lbHNle2lmKHQ9PT1udWxsKXJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbn07aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIGZ1bmN0aW9uKG4scyxhLGwpe3JldHVybiB0KG4scyxhLGwpfTtpZih0eXBlb2YgdD09InN0cmluZyImJih0LmluZGV4T2YoIi4iKSE9PS0xfHx0LmluZGV4T2YoIlsiKSE9PS0xfHx0LmluZGV4T2YoIigiKSE9PS0xKSl7dmFyIHI9ZnVuY3Rpb24obixzLGEpe3ZhciBsLGMscCxiO2lmKGEhPT0iIilmb3IodmFyIG09SWEoYSkseT0wLFQ9bS5sZW5ndGg7eTxUO3krKyl7aWYobD1tW3ldLm1hdGNoKFVyKSxjPW1beV0ubWF0Y2goa3IpLGwpe2lmKG1beV09bVt5XS5yZXBsYWNlKFVyLCIiKSxtW3ldIT09IiImJihuPW5bbVt5XV0pLHA9W10sbS5zcGxpY2UoMCx5KzEpLGI9bS5qb2luKCIuIiksQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIHc9MCxrPW4ubGVuZ3RoO3c8azt3KyspcC5wdXNoKHIoblt3XSxzLGIpKTt2YXIgUD1sWzBdLnN1YnN0cmluZygxLGxbMF0ubGVuZ3RoLTEpO249UD09PSIiP3A6cC5qb2luKFApO2JyZWFrfWVsc2UgaWYoYyl7bVt5XT1tW3ldLnJlcGxhY2Uoa3IsIiIpLG49blttW3ldXSgpO2NvbnRpbnVlfWlmKG49PT1udWxsfHxuW21beV1dPT09bnVsbClyZXR1cm4gbnVsbDtpZihuPT09dm9pZCAwfHxuW21beV1dPT09dm9pZCAwKXJldHVybjtuPW5bbVt5XV19cmV0dXJuIG59O3JldHVybiBmdW5jdGlvbihuLHMpe3JldHVybiByKG4scyx0KX19ZWxzZSByZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG5bdF19fX0sc3RyaXBIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKGU9PT0iZnVuY3Rpb24iKXtocj10O3JldHVybn1lbHNlIGlmKGU9PT0ic3RyaW5nIilyZXR1cm4gaHIodCk7cmV0dXJuIHR9LGVzY2FwZUh0bWw6ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7aWYoZT09PSJmdW5jdGlvbiIpe0RyPXQ7cmV0dXJufWVsc2UgaWYoZT09PSJzdHJpbmcifHxBcnJheS5pc0FycmF5KHQpKXJldHVybiBEcih0KTtyZXR1cm4gdH0sdW5pcXVlOnByfTtmdW5jdGlvbiBDbih0KXt2YXIgZT0iYSBhYSBhaSBhbyBhcyBiIGZuIGkgbSBvIHMgIixyLG4scz17fTtXLmVhY2godCxmdW5jdGlvbihhKXtyPWEubWF0Y2goL14oW15BLVpdKz8pKFtBLVpdKS8pLHImJmUuaW5kZXhPZihyWzFdKyIgIikhPT0tMSYmKG49YS5yZXBsYWNlKHJbMF0sclsyXS50b0xvd2VyQ2FzZSgpKSxzW25dPWEsclsxXT09PSJvIiYmQ24odFthXSkpfSksdC5faHVuZ2FyaWFuTWFwPXN9ZnVuY3Rpb24gZXIodCxlLHIpe3QuX2h1bmdhcmlhbk1hcHx8Q24odCk7dmFyIG47Vy5lYWNoKGUsZnVuY3Rpb24ocyl7bj10Ll9odW5nYXJpYW5NYXBbc10sbiE9PXZvaWQgMCYmKHJ8fGVbbl09PT12b2lkIDApJiYobi5jaGFyQXQoMCk9PT0ibyI/KGVbbl18fChlW25dPXt9KSxXLmV4dGVuZCghMCxlW25dLGVbc10pLGVyKHRbbl0sZVtuXSxyKSk6ZVtuXT1lW3NdKX0pfXZhciB5ZT1mdW5jdGlvbih0LGUscil7dFtlXSE9PXZvaWQgMCYmKHRbcl09dFtlXSl9O2Z1bmN0aW9uIERhKHQpe3llKHQsIm9yZGVyaW5nIiwiYlNvcnQiKSx5ZSh0LCJvcmRlck11bHRpIiwiYlNvcnRNdWx0aSIpLHllKHQsIm9yZGVyQ2xhc3NlcyIsImJTb3J0Q2xhc3NlcyIpLHllKHQsIm9yZGVyQ2VsbHNUb3AiLCJiU29ydENlbGxzVG9wIikseWUodCwib3JkZXIiLCJhYVNvcnRpbmciKSx5ZSh0LCJvcmRlckZpeGVkIiwiYWFTb3J0aW5nRml4ZWQiKSx5ZSh0LCJwYWdpbmciLCJiUGFnaW5hdGUiKSx5ZSh0LCJwYWdpbmdUeXBlIiwic1BhZ2luYXRpb25UeXBlIikseWUodCwicGFnZUxlbmd0aCIsImlEaXNwbGF5TGVuZ3RoIikseWUodCwic2VhcmNoaW5nIiwiYkZpbHRlciIpLHR5cGVvZiB0LnNTY3JvbGxYPT0iYm9vbGVhbiImJih0LnNTY3JvbGxYPXQuc1Njcm9sbFg/IjEwMCUiOiIiKSx0eXBlb2YgdC5zY3JvbGxYPT0iYm9vbGVhbiImJih0LnNjcm9sbFg9dC5zY3JvbGxYPyIxMDAlIjoiIik7dmFyIGU9dC5hb1NlYXJjaENvbHM7aWYoZSlmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspZVtyXSYmZXIodnQubW9kZWxzLm9TZWFyY2gsZVtyXSk7dC5zZXJ2ZXJTaWRlJiYhdC5zZWFyY2hEZWxheSYmKHQuc2VhcmNoRGVsYXk9NDAwKX1mdW5jdGlvbiBVYSh0KXt5ZSh0LCJvcmRlcmFibGUiLCJiU29ydGFibGUiKSx5ZSh0LCJvcmRlckRhdGEiLCJhRGF0YVNvcnQiKSx5ZSh0LCJvcmRlclNlcXVlbmNlIiwiYXNTb3J0aW5nIikseWUodCwib3JkZXJEYXRhVHlwZSIsInNvcnREYXRhVHlwZSIpO3ZhciBlPXQuYURhdGFTb3J0O3R5cGVvZiBlPT0ibnVtYmVyIiYmIUFycmF5LmlzQXJyYXkoZSkmJih0LmFEYXRhU29ydD1bZV0pfWZ1bmN0aW9uIHFvKHQpe2lmKCF2dC5fX2Jyb3dzZXIpe3ZhciBlPXt9O3Z0Ll9fYnJvd3Nlcj1lO3ZhciByPVcoIjxkaXYvPiIpLmNzcyh7cG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0Oi0xKndpbmRvdy5wYWdlWE9mZnNldCxoZWlnaHQ6MSx3aWR0aDoxLG92ZXJmbG93OiJoaWRkZW4ifSkuYXBwZW5kKFcoIjxkaXYvPiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MSxsZWZ0OjEsd2lkdGg6MTAwLG92ZXJmbG93OiJzY3JvbGwifSkuYXBwZW5kKFcoIjxkaXYvPiIpLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDoxMH0pKSkuYXBwZW5kVG8oImJvZHkiKSxuPXIuY2hpbGRyZW4oKSxzPW4uY2hpbGRyZW4oKTtlLmJhcldpZHRoPW5bMF0ub2Zmc2V0V2lkdGgtblswXS5jbGllbnRXaWR0aCxlLmJTY3JvbGxiYXJMZWZ0PU1hdGgucm91bmQocy5vZmZzZXQoKS5sZWZ0KSE9PTEsci5yZW1vdmUoKX1XLmV4dGVuZCh0Lm9Ccm93c2VyLHZ0Ll9fYnJvd3NlciksdC5vU2Nyb2xsLmlCYXJXaWR0aD12dC5fX2Jyb3dzZXIuYmFyV2lkdGh9ZnVuY3Rpb24gcWEodCl7dmFyIGU9dnQuZGVmYXVsdHMuY29sdW1uLHI9dC5hb0NvbHVtbnMubGVuZ3RoLG49Vy5leHRlbmQoe30sdnQubW9kZWxzLm9Db2x1bW4sZSx7YURhdGFTb3J0OmUuYURhdGFTb3J0P2UuYURhdGFTb3J0OltyXSxtRGF0YTplLm1EYXRhP2UubURhdGE6cixpZHg6cixzZWFyY2hGaXhlZDp7fSxjb2xFbDpXKCI8Y29sPiIpLmF0dHIoImRhdGEtZHQtY29sdW1uIixyKX0pO3QuYW9Db2x1bW5zLnB1c2gobik7dmFyIHM9dC5hb1ByZVNlYXJjaENvbHM7c1tyXT1XLmV4dGVuZCh7fSx2dC5tb2RlbHMub1NlYXJjaCxzW3JdKX1mdW5jdGlvbiB1aSh0LGUscil7dmFyIG49dC5hb0NvbHVtbnNbZV07aWYociE9bnVsbCl7VWEociksZXIodnQuZGVmYXVsdHMuY29sdW1uLHIsITApLHIubURhdGFQcm9wIT09dm9pZCAwJiYhci5tRGF0YSYmKHIubURhdGE9ci5tRGF0YVByb3ApLHIuc1R5cGUmJihuLl9zTWFudWFsVHlwZT1yLnNUeXBlKSxyLmNsYXNzTmFtZSYmIXIuc0NsYXNzJiYoci5zQ2xhc3M9ci5jbGFzc05hbWUpO3ZhciBzPW4uc0NsYXNzO1cuZXh0ZW5kKG4sciksbnIobixyLCJzV2lkdGgiLCJzV2lkdGhPcmlnIikscyE9PW4uc0NsYXNzJiYobi5zQ2xhc3M9cysiICIrbi5zQ2xhc3MpLHIuaURhdGFTb3J0IT09dm9pZCAwJiYobi5hRGF0YVNvcnQ9W3IuaURhdGFTb3J0XSksbnIobixyLCJhRGF0YVNvcnQiKX12YXIgYT1uLm1EYXRhLGw9SXIoYSk7aWYobi5tUmVuZGVyJiZBcnJheS5pc0FycmF5KG4ubVJlbmRlcikpe3ZhciBjPW4ubVJlbmRlci5zbGljZSgpLHA9Yy5zaGlmdCgpO24ubVJlbmRlcj12dC5yZW5kZXJbcF0uYXBwbHkod2luZG93LGMpfW4uX3JlbmRlcj1uLm1SZW5kZXI/SXIobi5tUmVuZGVyKTpudWxsO3ZhciBiPWZ1bmN0aW9uKG0pe3JldHVybiB0eXBlb2YgbT09InN0cmluZyImJm0uaW5kZXhPZigiQCIpIT09LTF9O24uX2JBdHRyU3JjPVcuaXNQbGFpbk9iamVjdChhKSYmKGIoYS5zb3J0KXx8YihhLnR5cGUpfHxiKGEuZmlsdGVyKSksbi5fc2V0dGVyPW51bGwsbi5mbkdldERhdGE9ZnVuY3Rpb24obSx5LFQpe3ZhciB3PWwobSx5LHZvaWQgMCxUKTtyZXR1cm4gbi5fcmVuZGVyJiZ5P24uX3JlbmRlcih3LHksbSxUKTp3fSxuLmZuU2V0RGF0YT1mdW5jdGlvbihtLHksVCl7cmV0dXJuIGZyKGEpKG0seSxUKX0sdHlwZW9mIGEhPSJudW1iZXIiJiYhbi5faXNBcnJheUhvc3QmJih0Ll9yb3dSZWFkT2JqZWN0PSEwKSx0Lm9GZWF0dXJlcy5iU29ydHx8KG4uYlNvcnRhYmxlPSExKX1mdW5jdGlvbiBUbih0KXtvbCh0KSxHbyh0KTt2YXIgZT10Lm9TY3JvbGw7KGUuc1khPT0iInx8ZS5zWCE9PSIiKSYmdHModCksWnQodCxudWxsLCJjb2x1bW4tc2l6aW5nIixbdF0pfWZ1bmN0aW9uIEdvKHQpe2Zvcih2YXIgZT10LmFvQ29sdW1ucyxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPUdhKHQsW3JdLCExLCExKTtlW3JdLmNvbEVsLmNzcygid2lkdGgiLG4pfX1mdW5jdGlvbiBnaSh0LGUpe3ZhciByPXlpKHQsImJWaXNpYmxlIik7cmV0dXJuIHR5cGVvZiByW2VdPT0ibnVtYmVyIj9yW2VdOm51bGx9ZnVuY3Rpb24gJHIodCxlKXt2YXIgcj15aSh0LCJiVmlzaWJsZSIpLG49ci5pbmRleE9mKGUpO3JldHVybiBuIT09LTE/bjpudWxsfWZ1bmN0aW9uIGtuKHQpe3ZhciBlPXQuYW9IZWFkZXIscj10LmFvQ29sdW1ucyxuPTA7aWYoZS5sZW5ndGgpZm9yKHZhciBzPTAsYT1lWzBdLmxlbmd0aDtzPGE7cysrKXJbc10uYlZpc2libGUmJlcoZVswXVtzXS5jZWxsKS5jc3MoImRpc3BsYXkiKSE9PSJub25lIiYmbisrO3JldHVybiBufWZ1bmN0aW9uIHlpKHQsZSl7dmFyIHI9W107cmV0dXJuIHQuYW9Db2x1bW5zLm1hcChmdW5jdGlvbihuLHMpe25bZV0mJnIucHVzaChzKX0pLHJ9ZnVuY3Rpb24gd2kodCl7dmFyIGU9dC5hb0NvbHVtbnMscj10LmFvRGF0YSxuPXZ0LmV4dC50eXBlLmRldGVjdCxzLGEsbCxjLHAsYixtLHksVDtmb3Iocz0wLGE9ZS5sZW5ndGg7czxhO3MrKyl7aWYobT1lW3NdLFQ9W10sIW0uc1R5cGUmJm0uX3NNYW51YWxUeXBlKW0uc1R5cGU9bS5fc01hbnVhbFR5cGU7ZWxzZSBpZighbS5zVHlwZSl7Zm9yKGw9MCxjPW4ubGVuZ3RoO2w8YztsKyspe2ZvcihwPTAsYj1yLmxlbmd0aDtwPGImJiEocltwXSYmKFRbcF09PT12b2lkIDAmJihUW3BdPU5lKHQscCxzLCJ0eXBlIikpLHk9bltsXShUW3BdLHQpLCF5JiZsIT09bi5sZW5ndGgtMnx8eT09PSJodG1sIiYmIVplKFRbcF0pKSk7cCsrKTtpZih5KXttLnNUeXBlPXk7YnJlYWt9fW0uc1R5cGV8fChtLnNUeXBlPSJzdHJpbmciKX12YXIgdz1vZS50eXBlLmNsYXNzTmFtZVttLnNUeXBlXTt3JiYoQWEodC5hb0hlYWRlcixzLHcpLEFhKHQuYW9Gb290ZXIscyx3KSk7dmFyIGs9b2UudHlwZS5yZW5kZXJbbS5zVHlwZV07ayYmIW0uX3JlbmRlciYmKG0uX3JlbmRlcj12dC51dGlsLmdldChrKSxYbyh0LHMpKX19ZnVuY3Rpb24gWG8odCxlKXtmb3IodmFyIHI9dC5hb0RhdGEsbj0wO248ci5sZW5ndGg7bisrKWlmKHJbbl0ublRyKXt2YXIgcz1OZSh0LG4sZSwiZGlzcGxheSIpO3Jbbl0uZGlzcGxheURhdGFbZV09cyxnbihyW25dLmFuQ2VsbHNbZV0scyl9fWZ1bmN0aW9uIEFhKHQsZSxyKXt0LmZvckVhY2goZnVuY3Rpb24obil7bltlXSYmbltlXS51bmlxdWUmJkFyKG5bZV0uY2VsbCxyKX0pfWZ1bmN0aW9uICRvKHQsZSxyLG4scyl7dmFyIGEsbCxjLHAsYixtLHksVD10LmFvQ29sdW1ucztpZihyKWZvcihhPTAsbD1yLmxlbmd0aDthPGw7YSsrKXJbYV0mJnJbYV0ubmFtZSYmKFRbYV0uc05hbWU9clthXS5uYW1lKTtpZihlKWZvcihhPWUubGVuZ3RoLTE7YT49MDthLS0pe3k9ZVthXTt2YXIgdz15LnRhcmdldCE9PXZvaWQgMD95LnRhcmdldDp5LnRhcmdldHMhPT12b2lkIDA/eS50YXJnZXRzOnkuYVRhcmdldHM7Zm9yKEFycmF5LmlzQXJyYXkodyl8fCh3PVt3XSksYz0wLHA9dy5sZW5ndGg7YzxwO2MrKyl7dmFyIGs9d1tjXTtpZih0eXBlb2Ygaz09Im51bWJlciImJms+PTApe2Zvcig7VC5sZW5ndGg8PWs7KXFhKHQpO3Moayx5KX1lbHNlIGlmKHR5cGVvZiBrPT0ibnVtYmVyIiYmazwwKXMoVC5sZW5ndGgrayx5KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilmb3IoYj0wLG09VC5sZW5ndGg7YjxtO2IrKylrPT09Il9hbGwiP3MoYix5KTprLmluZGV4T2YoIjpuYW1lIikhPT0tMT9UW2JdLnNOYW1lPT09ay5yZXBsYWNlKCI6bmFtZSIsIiIpJiZzKGIseSk6bi5mb3JFYWNoKGZ1bmN0aW9uKFApe2lmKFBbYl0pe3ZhciBGPVcoUFtiXS5jZWxsKTtrLm1hdGNoKC9eW2Etel1bXHctXSokL2kpJiYoaz0iLiIrayksRi5pcyhrKSYmcyhiLHkpfX0pfX1pZihyKWZvcihhPTAsbD1yLmxlbmd0aDthPGw7YSsrKXMoYSxyW2FdKX1mdW5jdGlvbiBHYSh0LGUscixuKXtBcnJheS5pc0FycmF5KGUpfHwoZT14aShlKSk7Zm9yKHZhciBzPTAsYSxsPXQuYW9Db2x1bW5zLGM9MCxwPWUubGVuZ3RoO2M8cDtjKyspe3ZhciBiPWxbZVtjXV0sbT1yP2Iuc1dpZHRoT3JpZzpiLnNXaWR0aDtpZighKCFuJiZiLmJWaXNpYmxlPT09ITEpKXtpZihtPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBtPT0ibnVtYmVyIilhPSJweCIscys9bTtlbHNle3ZhciB5PW0ubWF0Y2goLyhbXGRcLl0rKShbXlxkXSopLyk7eSYmKHMrPXlbMV0qMSxhPXkubGVuZ3RoPT09Mz95WzJdOiJweCIpfX19cmV0dXJuIHMrYX1mdW5jdGlvbiB4aSh0KXt2YXIgZT1XKHQpLmNsb3Nlc3QoIltkYXRhLWR0LWNvbHVtbl0iKS5hdHRyKCJkYXRhLWR0LWNvbHVtbiIpO3JldHVybiBlP2Uuc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIqMX0pOltdfWZ1bmN0aW9uIGJyKHQsZSxyLG4pe3ZhciBzPXQuYW9EYXRhLmxlbmd0aCxhPVcuZXh0ZW5kKCEwLHt9LHZ0Lm1vZGVscy5vUm93LHtzcmM6cj8iZG9tIjoiZGF0YSIsaWR4OnN9KTthLl9hRGF0YT1lLHQuYW9EYXRhLnB1c2goYSk7Zm9yKHZhciBsPXQuYW9Db2x1bW5zLGM9MCxwPWwubGVuZ3RoO2M8cDtjKyspbFtjXS5zVHlwZT1udWxsO3QuYWlEaXNwbGF5TWFzdGVyLnB1c2gocyk7dmFyIGI9dC5yb3dJZEZuKGUpO3JldHVybiBiIT09dm9pZCAwJiYodC5hSWRzW2JdPWEpLChyfHwhdC5vRmVhdHVyZXMuYkRlZmVyUmVuZGVyKSYmJGEodCxzLHIsbiksc31mdW5jdGlvbiBfaSh0LGUpe3ZhciByO3JldHVybiBlIGluc3RhbmNlb2YgV3x8KGU9VyhlKSksZS5tYXAoZnVuY3Rpb24obixzKXtyZXR1cm4gcj1YYSh0LHMpLGJyKHQsci5kYXRhLHMsci5jZWxscyl9KX1mdW5jdGlvbiBOZSh0LGUscixuKXtuPT09InNlYXJjaCI/bj0iZmlsdGVyIjpuPT09Im9yZGVyIiYmKG49InNvcnQiKTt2YXIgcz10LmFvRGF0YVtlXTtpZihzKXt2YXIgYT10LmlEcmF3LGw9dC5hb0NvbHVtbnNbcl0sYz1zLl9hRGF0YSxwPWwuc0RlZmF1bHRDb250ZW50LGI9bC5mbkdldERhdGEoYyxuLHtzZXR0aW5nczp0LHJvdzplLGNvbDpyfSk7aWYobiE9PSJkaXNwbGF5IiYmYiYmdHlwZW9mIGI9PSJvYmplY3QiJiZiLm5vZGVOYW1lJiYoYj1iLmlubmVySFRNTCksYj09PXZvaWQgMClyZXR1cm4gdC5pRHJhd0Vycm9yIT1hJiZwPT09bnVsbCYmKFBlKHQsMCwiUmVxdWVzdGVkIHVua25vd24gcGFyYW1ldGVyICIrKHR5cGVvZiBsLm1EYXRhPT0iZnVuY3Rpb24iPyJ7ZnVuY3Rpb259IjoiJyIrbC5tRGF0YSsiJyIpKyIgZm9yIHJvdyAiK2UrIiwgY29sdW1uICIrciw0KSx0LmlEcmF3RXJyb3I9YSkscDtpZigoYj09PWN8fGI9PT1udWxsKSYmcCE9PW51bGwmJm4hPT12b2lkIDApYj1wO2Vsc2UgaWYodHlwZW9mIGI9PSJmdW5jdGlvbiIpcmV0dXJuIGIuY2FsbChjKTtpZihiPT09bnVsbCYmbj09PSJkaXNwbGF5IilyZXR1cm4iIjtpZihuPT09ImZpbHRlciIpe3ZhciBtPXZ0LmV4dC50eXBlLnNlYXJjaDttW2wuc1R5cGVdJiYoYj1tW2wuc1R5cGVdKGIpKX1yZXR1cm4gYn19ZnVuY3Rpb24gWm8odCxlLHIsbil7dmFyIHM9dC5hb0NvbHVtbnNbcl0sYT10LmFvRGF0YVtlXS5fYURhdGE7cy5mblNldERhdGEoYSxuLHtzZXR0aW5nczp0LHJvdzplLGNvbDpyfSl9ZnVuY3Rpb24gZ24odCxlKXtlJiZ0eXBlb2YgZT09Im9iamVjdCImJmUubm9kZU5hbWU/Vyh0KS5lbXB0eSgpLmFwcGVuZChlKTp0LmlubmVySFRNTD1lfXZhciBVcj0vXFsuKj9cXSQvLGtyPS9cKFwpJC87ZnVuY3Rpb24gSWEodCl7dmFyIGU9dC5tYXRjaCgvKFxcLnxbXi5dKSsvZyl8fFsiIl07cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHIpe3JldHVybiByLnJlcGxhY2UoL1xcXC4vZywiLiIpfSl9dmFyIElyPXZ0LnV0aWwuZ2V0LGZyPXZ0LnV0aWwuc2V0O2Z1bmN0aW9uIFBhKHQpe3JldHVybiB4ZSh0LmFvRGF0YSwiX2FEYXRhIil9ZnVuY3Rpb24gQ2kodCl7dC5hb0RhdGEubGVuZ3RoPTAsdC5haURpc3BsYXlNYXN0ZXIubGVuZ3RoPTAsdC5haURpc3BsYXkubGVuZ3RoPTAsdC5hSWRzPXt9fWZ1bmN0aW9uIFNuKHQsZSxyLG4pe3ZhciBzPXQuYW9EYXRhW2VdLGEsbDtpZihzLl9hU29ydERhdGE9bnVsbCxzLl9hRmlsdGVyRGF0YT1udWxsLHMuZGlzcGxheURhdGE9bnVsbCxyPT09ImRvbSJ8fCghcnx8cj09PSJhdXRvIikmJnMuc3JjPT09ImRvbSIpcy5fYURhdGE9WGEodCxzLG4sbj09PXZvaWQgMD92b2lkIDA6cy5fYURhdGEpLmRhdGE7ZWxzZXt2YXIgYz1zLmFuQ2VsbHMscD1UaSh0LGUpO2lmKGMpaWYobiE9PXZvaWQgMClnbihjW25dLHBbbl0pO2Vsc2UgZm9yKGE9MCxsPWMubGVuZ3RoO2E8bDthKyspZ24oY1thXSxwW2FdKX12YXIgYj10LmFvQ29sdW1ucztpZihuIT09dm9pZCAwKWJbbl0uc1R5cGU9bnVsbCxiW25dLm1heExlblN0cmluZz1udWxsO2Vsc2V7Zm9yKGE9MCxsPWIubGVuZ3RoO2E8bDthKyspYlthXS5zVHlwZT1udWxsLGJbYV0ubWF4TGVuU3RyaW5nPW51bGw7WmEodCxzKX19ZnVuY3Rpb24gWGEodCxlLHIsbil7dmFyIHM9W10sYT1lLmZpcnN0Q2hpbGQsbCxjLHA9MCxiLG09dC5hb0NvbHVtbnMseT10Ll9yb3dSZWFkT2JqZWN0O249biE9PXZvaWQgMD9uOnk/e306W107dmFyIFQ9ZnVuY3Rpb24obyxmKXtpZih0eXBlb2Ygbz09InN0cmluZyIpe3ZhciBDPW8uaW5kZXhPZigiQCIpO2lmKEMhPT0tMSl7dmFyIEI9by5zdWJzdHJpbmcoQysxKSx1PWZyKG8pO3UobixmLmdldEF0dHJpYnV0ZShCKSl9fX0sdz1mdW5jdGlvbihvKXtpZihyPT09dm9pZCAwfHxyPT09cClpZihjPW1bcF0sYj1vLmlubmVySFRNTC50cmltKCksYyYmYy5fYkF0dHJTcmMpe3ZhciBmPWZyKGMubURhdGEuXyk7ZihuLGIpLFQoYy5tRGF0YS5zb3J0LG8pLFQoYy5tRGF0YS50eXBlLG8pLFQoYy5tRGF0YS5maWx0ZXIsbyl9ZWxzZSB5PyhjLl9zZXR0ZXJ8fChjLl9zZXR0ZXI9ZnIoYy5tRGF0YSkpLGMuX3NldHRlcihuLGIpKTpuW3BdPWI7cCsrfTtpZihhKWZvcig7YTspbD1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCksKGw9PSJURCJ8fGw9PSJUSCIpJiYodyhhKSxzLnB1c2goYSkpLGE9YS5uZXh0U2libGluZztlbHNle3M9ZS5hbkNlbGxzO2Zvcih2YXIgaz0wLFA9cy5sZW5ndGg7azxQO2srKyl3KHNba10pfXZhciBGPWUuZmlyc3RDaGlsZD9lOmUublRyO2lmKEYpe3ZhciBoPUYuZ2V0QXR0cmlidXRlKCJpZCIpO2gmJmZyKHQucm93SWQpKG4saCl9cmV0dXJue2RhdGE6bixjZWxsczpzfX1mdW5jdGlvbiBUaSh0LGUpe2xldCByPXQuYW9EYXRhW2VdLG49dC5hb0NvbHVtbnM7aWYoIXIuZGlzcGxheURhdGEpe3IuZGlzcGxheURhdGE9W107Zm9yKHZhciBzPTAsYT1uLmxlbmd0aDtzPGE7cysrKXIuZGlzcGxheURhdGEucHVzaChOZSh0LGUscywiZGlzcGxheSIpKX1yZXR1cm4gci5kaXNwbGF5RGF0YX1mdW5jdGlvbiAkYSh0LGUscixuKXt2YXIgcz10LmFvRGF0YVtlXSxhPXMuX2FEYXRhLGw9W10sYyxwLGIsbSx5LFQsdz10Lm9DbGFzc2VzLnRib2R5LnJvdztpZihzLm5Ucj09PW51bGwpe2ZvcihjPXJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIikscy5uVHI9YyxzLmFuQ2VsbHM9bCxBcihjLHcpLGMuX0RUX1Jvd0luZGV4PWUsWmEodCxzKSxtPTAseT10LmFvQ29sdW1ucy5sZW5ndGg7bTx5O20rKyl7Yj10LmFvQ29sdW1uc1ttXSxUPSEociYmblttXSkscD1UP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYi5zQ2VsbFR5cGUpOm5bbV0scHx8UGUodCwwLCJJbmNvcnJlY3QgY29sdW1uIGNvdW50IiwxOCkscC5fRFRfQ2VsbEluZGV4PXtyb3c6ZSxjb2x1bW46bX0sbC5wdXNoKHApO3ZhciBrPVRpKHQsZSk7KFR8fChiLm1SZW5kZXJ8fGIubURhdGEhPT1tKSYmKCFXLmlzUGxhaW5PYmplY3QoYi5tRGF0YSl8fGIubURhdGEuXyE9PW0rIi5kaXNwbGF5IikpJiZnbihwLGtbbV0pLGIuYlZpc2libGUmJlQ/Yy5hcHBlbmRDaGlsZChwKTohYi5iVmlzaWJsZSYmIVQmJnAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSxiLmZuQ3JlYXRlZENlbGwmJmIuZm5DcmVhdGVkQ2VsbC5jYWxsKHQub0luc3RhbmNlLHAsTmUodCxlLG0pLGEsZSxtKX1adCh0LCJhb1Jvd0NyZWF0ZWRDYWxsYmFjayIsInJvdy1jcmVhdGVkIixbYyxhLGUsbF0pfWVsc2UgQXIocy5uVHIsdyl9ZnVuY3Rpb24gWmEodCxlKXt2YXIgcj1lLm5UcixuPWUuX2FEYXRhO2lmKHIpe3ZhciBzPXQucm93SWRGbihuKTtpZihzJiYoci5pZD1zKSxuLkRUX1Jvd0NsYXNzKXt2YXIgYT1uLkRUX1Jvd0NsYXNzLnNwbGl0KCIgIik7ZS5fX3Jvd2M9ZS5fX3Jvd2M/cHIoZS5fX3Jvd2MuY29uY2F0KGEpKTphLFcocikucmVtb3ZlQ2xhc3MoZS5fX3Jvd2Muam9pbigiICIpKS5hZGRDbGFzcyhuLkRUX1Jvd0NsYXNzKX1uLkRUX1Jvd0F0dHImJlcocikuYXR0cihuLkRUX1Jvd0F0dHIpLG4uRFRfUm93RGF0YSYmVyhyKS5kYXRhKG4uRFRfUm93RGF0YSl9fWZ1bmN0aW9uIEZhKHQsZSl7dmFyIHI9dC5vQ2xhc3NlcyxuPXQuYW9Db2x1bW5zLHMsYSxsLGM9ZT09PSJoZWFkZXIiP3QublRIZWFkOnQublRGb290LHA9ZT09PSJoZWFkZXIiPyJzVGl0bGUiOmU7aWYoYyl7aWYoKGU9PT0iaGVhZGVyInx8eGUodC5hb0NvbHVtbnMscCkuam9pbigiIikpJiYobD1XKCJ0ciIsYyksbC5sZW5ndGh8fChsPVcoIjx0ci8+IikuYXBwZW5kVG8oYykpLGwubGVuZ3RoPT09MSkpe3ZhciBiPVcoInRkLCB0aCIsbCk7Zm9yKHM9Yi5sZW5ndGgsYT1uLmxlbmd0aDtzPGE7cysrKVcoIjx0aC8+IikuaHRtbChuW3NdW3BdfHwiIikuYXBwZW5kVG8obCl9dmFyIG09WWEodCxjLCEwKTtlPT09ImhlYWRlciI/dC5hb0hlYWRlcj1tOnQuYW9Gb290ZXI9bSxXKGMpLmNoaWxkcmVuKCJ0ciIpLmF0dHIoInJvbGUiLCJyb3ciKSxXKGMpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0aCwgdGQiKS5lYWNoKGZ1bmN0aW9uKCl7eG4odCxlKSh0LFcodGhpcykscil9KX19ZnVuY3Rpb24gS2EodCxlLHIpe3ZhciBuLHMsYSxsPVtdLGM9W10scD10LmFvQ29sdW1ucyxiPXAubGVuZ3RoLG0seTtpZihlKXtmb3Iocnx8KHI9Y3IoYikuZmlsdGVyKGZ1bmN0aW9uKGspe3JldHVybiBwW2tdLmJWaXNpYmxlfSkpLG49MDtuPGUubGVuZ3RoO24rKylsW25dPWVbbl0uc2xpY2UoKS5maWx0ZXIoZnVuY3Rpb24oayxQKXtyZXR1cm4gci5pbmNsdWRlcyhQKX0pLGMucHVzaChbXSk7Zm9yKG49MDtuPGwubGVuZ3RoO24rKylmb3Iocz0wO3M8bFtuXS5sZW5ndGg7cysrKWlmKG09MSx5PTEsY1tuXVtzXT09PXZvaWQgMCl7Zm9yKGE9bFtuXVtzXS5jZWxsO2xbbittXSE9PXZvaWQgMCYmbFtuXVtzXS5jZWxsPT1sW24rbV1bc10uY2VsbDspY1tuK21dW3NdPW51bGwsbSsrO2Zvcig7bFtuXVtzK3ldIT09dm9pZCAwJiZsW25dW3NdLmNlbGw9PWxbbl1bcyt5XS5jZWxsOyl7Zm9yKHZhciBUPTA7VDxtO1QrKyljW24rVF1bcyt5XT1udWxsO3krK312YXIgdz1XKCJzcGFuLmR0LWNvbHVtbi10aXRsZSIsYSk7Y1tuXVtzXT17Y2VsbDphLGNvbHNwYW46eSxyb3dzcGFuOm0sdGl0bGU6dy5sZW5ndGg/dy5odG1sKCk6VyhhKS5odG1sKCl9fXJldHVybiBjfX1mdW5jdGlvbiB5bih0LGUpe2Zvcih2YXIgcj1LYSh0LGUpLG4scyxhPTA7YTxlLmxlbmd0aDthKyspe2lmKG49ZVthXS5yb3csbilmb3IoO3M9bi5maXJzdENoaWxkOyluLnJlbW92ZUNoaWxkKHMpO2Zvcih2YXIgbD0wO2w8clthXS5sZW5ndGg7bCsrKXt2YXIgYz1yW2FdW2xdO2MmJlcoYy5jZWxsKS5hcHBlbmRUbyhuKS5hdHRyKCJyb3dzcGFuIixjLnJvd3NwYW4pLmF0dHIoImNvbHNwYW4iLGMuY29sc3Bhbil9fX1mdW5jdGlvbiBGcih0LGUpe1FvKHQpO3ZhciByPVp0KHQsImFvUHJlRHJhd0NhbGxiYWNrIiwicHJlRHJhdyIsW3RdKTtpZihyLmluZGV4T2YoITEpIT09LTEpe0ZlKHQsITEpO3JldHVybn12YXIgbj1bXSxzPTAsYT1CZSh0KT09InNzcCIsbD10LmFpRGlzcGxheSxjPXQuX2lEaXNwbGF5U3RhcnQscD10LmZuRGlzcGxheUVuZCgpLGI9dC5hb0NvbHVtbnMsbT1XKHQublRCb2R5KTtpZih0LmJEcmF3aW5nPSEwLCFhKXQuaURyYXcrKztlbHNlIGlmKCF0LmJEZXN0cm95aW5nJiYhZSl7dC5pRHJhdz09PTAmJm0uZW1wdHkoKS5hcHBlbmQoQmEodCkpLEpvKHQpO3JldHVybn1pZihsLmxlbmd0aCE9PTApZm9yKHZhciB5PWE/MDpjLFQ9YT90LmFvRGF0YS5sZW5ndGg6cCx3PXk7dzxUO3crKyl7dmFyIGs9bFt3XSxQPXQuYW9EYXRhW2tdO1AublRyPT09bnVsbCYmJGEodCxrKTtmb3IodmFyIEY9UC5uVHIsaD0wO2g8Yi5sZW5ndGg7aCsrKXt2YXIgbz1iW2hdLGY9UC5hbkNlbGxzW2hdO0FyKGYsb2UudHlwZS5jbGFzc05hbWVbby5zVHlwZV0pLEFyKGYsby5zQ2xhc3MpLEFyKGYsdC5vQ2xhc3Nlcy50Ym9keS5jZWxsKX1adCh0LCJhb1Jvd0NhbGxiYWNrIixudWxsLFtGLFAuX2FEYXRhLHMsdyxrXSksbi5wdXNoKEYpLHMrK31lbHNlIG5bMF09QmEodCk7WnQodCwiYW9IZWFkZXJDYWxsYmFjayIsImhlYWRlciIsW1codC5uVEhlYWQpLmNoaWxkcmVuKCJ0ciIpWzBdLFBhKHQpLGMscCxsXSksWnQodCwiYW9Gb290ZXJDYWxsYmFjayIsImZvb3RlciIsW1codC5uVEZvb3QpLmNoaWxkcmVuKCJ0ciIpWzBdLFBhKHQpLGMscCxsXSksbVswXS5yZXBsYWNlQ2hpbGRyZW4/bVswXS5yZXBsYWNlQ2hpbGRyZW4uYXBwbHkobVswXSxuKToobS5jaGlsZHJlbigpLmRldGFjaCgpLG0uYXBwZW5kKFcobikpKSxXKHQublRhYmxlV3JhcHBlcikudG9nZ2xlQ2xhc3MoImR0LWVtcHR5LWZvb3RlciIsVygidHIiLHQublRGb290KS5sZW5ndGg9PT0wKSxadCh0LCJhb0RyYXdDYWxsYmFjayIsImRyYXciLFt0XSwhMCksdC5iU29ydGVkPSExLHQuYkZpbHRlcmVkPSExLHQuYkRyYXdpbmc9ITF9ZnVuY3Rpb24gUHIodCxlLHIpe3ZhciBuPXQub0ZlYXR1cmVzLHM9bi5iU29ydCxhPW4uYkZpbHRlcjsocj09PXZvaWQgMHx8cj09PSEwKSYmKHMmJkRpKHQpLGE/R3IodCx0Lm9QcmV2aW91c1NlYXJjaCk6dC5haURpc3BsYXk9dC5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKSksZSE9PSEwJiYodC5faURpc3BsYXlTdGFydD0wKSx0Ll9kcmF3SG9sZD1lLEZyKHQpLHQuX2RyYXdIb2xkPSExfWZ1bmN0aW9uIEJhKHQpe3ZhciBlPXQub0xhbmd1YWdlLHI9ZS5zWmVyb1JlY29yZHMsbj1CZSh0KTtyZXR1cm4gdC5pRHJhdzwxJiZuPT09InNzcCJ8fHQuaURyYXc8PTEmJm49PT0iYWpheCI/cj1lLnNMb2FkaW5nUmVjb3JkczplLnNFbXB0eVRhYmxlJiZ0LmZuUmVjb3Jkc1RvdGFsKCk9PT0wJiYocj1lLnNFbXB0eVRhYmxlKSxXKCI8dHIvPiIpLmFwcGVuZChXKCI8dGQgLz4iLHtjb2xTcGFuOmtuKHQpLGNsYXNzOnQub0NsYXNzZXMuZW1wdHkucm93fSkuaHRtbChyKSlbMF19ZnVuY3Rpb24gTmEodCxlLHIpe3ZhciBuPXt9O1cuZWFjaChlLGZ1bmN0aW9uKHAsYil7aWYoYiE9PW51bGwpe3ZhciBtPXAucmVwbGFjZSgvKFtBLVpdKS9nLCIgJDEiKS5zcGxpdCgiICIpO25bbVswXV18fChuW21bMF1dPXt9KTt2YXIgeT1tLmxlbmd0aD09PTE/ImZ1bGwiOm1bMV0udG9Mb3dlckNhc2UoKSxUPW5bbVswXV0sdz1mdW5jdGlvbihQLEYpe1cuaXNQbGFpbk9iamVjdChGKT9PYmplY3Qua2V5cyhGKS5tYXAoZnVuY3Rpb24oaCl7UC5wdXNoKHtmZWF0dXJlOmgsb3B0czpGW2hdfSl9KTpQLnB1c2goRil9O2lmKCghVFt5XXx8IVRbeV0uY29udGVudHMpJiYoVFt5XT17Y29udGVudHM6W119KSxBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgaz0wO2s8Yi5sZW5ndGg7aysrKXcoVFt5XS5jb250ZW50cyxiW2tdKTtlbHNlIHcoVFt5XS5jb250ZW50cyxiKTtBcnJheS5pc0FycmF5KFRbeV0uY29udGVudHMpfHwoVFt5XS5jb250ZW50cz1bVFt5XS5jb250ZW50c10pfX0pO3ZhciBzPU9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcC5pbmRleE9mKHIpIT09MD9udWxsOntuYW1lOnAsdmFsOm5bcF19fSkuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiBwIT09bnVsbH0pO3Muc29ydChmdW5jdGlvbihwLGIpe3ZhciBtPXAubmFtZS5yZXBsYWNlKC9bXjAtOV0vZywiIikqMSx5PWIubmFtZS5yZXBsYWNlKC9bXjAtOV0vZywiIikqMTtyZXR1cm4geS1tfSkscj09PSJib3R0b20iJiZzLnJldmVyc2UoKTtmb3IodmFyIGE9W10sbD0wLGM9cy5sZW5ndGg7bDxjO2wrKylzW2xdLnZhbC5mdWxsJiYoYS5wdXNoKHtmdWxsOnNbbF0udmFsLmZ1bGx9KSxFYSh0LGFbYS5sZW5ndGgtMV0pLGRlbGV0ZSBzW2xdLnZhbC5mdWxsKSxPYmplY3Qua2V5cyhzW2xdLnZhbCkubGVuZ3RoJiYoYS5wdXNoKHNbbF0udmFsKSxFYSh0LGFbYS5sZW5ndGgtMV0pKTtyZXR1cm4gYX1mdW5jdGlvbiBFYSh0LGUpe3ZhciByPWZ1bmN0aW9uKHMsYSl7cmV0dXJuIG9lLmZlYXR1cmVzW3NdfHxQZSh0LDAsIlVua25vd24gZmVhdHVyZTogIitzKSxvZS5mZWF0dXJlc1tzXS5hcHBseSh0aGlzLFt0LGFdKX0sbj1mdW5jdGlvbihzKXtmb3IodmFyIGE9ZVtzXS5jb250ZW50cyxsPTAsYz1hLmxlbmd0aDtsPGM7bCsrKWlmKGFbbF0pe2lmKHR5cGVvZiBhW2xdPT0ic3RyaW5nIilhW2xdPXIoYVtsXSxudWxsKTtlbHNlIGlmKFcuaXNQbGFpbk9iamVjdChhW2xdKSlhW2xdPXIoYVtsXS5mZWF0dXJlLGFbbF0ub3B0cyk7ZWxzZSBpZih0eXBlb2YgYVtsXS5ub2RlPT0iZnVuY3Rpb24iKWFbbF09YVtsXS5ub2RlKHQpO2Vsc2UgaWYodHlwZW9mIGFbbF09PSJmdW5jdGlvbiIpe3ZhciBwPWFbbF0odCk7YVtsXT10eXBlb2YgcC5ub2RlPT0iZnVuY3Rpb24iP3Aubm9kZSgpOnB9fWVsc2UgY29udGludWV9O1cuZWFjaChlLGZ1bmN0aW9uKHMpe24ocyl9KX1mdW5jdGlvbiBLbyh0KXt2YXIgZT10Lm9DbGFzc2VzLHI9Vyh0Lm5UYWJsZSksbj1XKCI8ZGl2Lz4iKS5hdHRyKHtpZDp0LnNUYWJsZUlkKyJfd3JhcHBlciIsY2xhc3M6ZS5jb250YWluZXJ9KS5pbnNlcnRCZWZvcmUocik7aWYodC5uVGFibGVXcmFwcGVyPW5bMF0sdC5zRG9tKVlvKHQsdC5zRG9tLG4pO2Vsc2V7dmFyIHM9TmEodCx0LmxheW91dCwidG9wIiksYT1OYSh0LHQubGF5b3V0LCJib3R0b20iKSxsPXhuKHQsImxheW91dCIpO3MuZm9yRWFjaChmdW5jdGlvbihjKXtsKHQsbixjKX0pLGwodCxuLHtmdWxsOnt0YWJsZTohMCxjb250ZW50czpbSmEodCldfX0pLGEuZm9yRWFjaChmdW5jdGlvbihjKXtsKHQsbixjKX0pfXNsKHQpfWZ1bmN0aW9uIFlvKHQsZSxyKXtmb3IodmFyIG49ZS5tYXRjaCgvKCIuKj8iKXwoJy4qPycpfC4vZykscyxhLGwsYyxwLGI9MDtiPG4ubGVuZ3RoO2IrKyl7aWYocz1udWxsLGE9bltiXSxhPT0iPCIpe2lmKGw9VygiPGRpdi8+IiksYz1uW2IrMV0sY1swXT09IicifHxjWzBdPT0nIicpe3A9Yy5yZXBsYWNlKC9bJyJdL2csIiIpO3ZhciBtPSIiLHk7aWYocC5pbmRleE9mKCIuIikhPS0xKXt2YXIgVD1wLnNwbGl0KCIuIik7bT1UWzBdLHk9VFsxXX1lbHNlIHBbMF09PSIjIj9tPXA6eT1wO2wuYXR0cigiaWQiLG0uc3Vic3RyaW5nKDEpKS5hZGRDbGFzcyh5KSxiKyt9ci5hcHBlbmQobCkscj1sfWVsc2UgYT09Ij4iP3I9ci5wYXJlbnQoKTphPT0idCI/cz1KYSh0KTp2dC5leHQuZmVhdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2E9PXcuY0ZlYXR1cmUmJihzPXcuZm5Jbml0KHQpKX0pO3MmJnIuYXBwZW5kKHMpfX1mdW5jdGlvbiBZYSh0LGUscil7dmFyIG49dC5hb0NvbHVtbnMscz1XKGUpLmNoaWxkcmVuKCJ0ciIpLGEsbCxjLHAsYixtLHksVCx3LGssUD1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGhlYWQiLEY9W10saCxvPWZ1bmN0aW9uKHoscSxldCl7Zm9yKHZhciBPPXpbcV07T1tldF07KWV0Kys7cmV0dXJuIGV0fTtmb3IoYz0wLG09cy5sZW5ndGg7YzxtO2MrKylGLnB1c2goW10pO2ZvcihjPTAsbT1zLmxlbmd0aDtjPG07YysrKWZvcihhPXNbY10sVD0wLGw9YS5maXJzdENoaWxkO2w7KXtpZihsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PSJURCJ8fGwubm9kZU5hbWUudG9VcHBlckNhc2UoKT09IlRIIil7dmFyIGY9W107aWYodz1sLmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpKjEsaz1sLmdldEF0dHJpYnV0ZSgicm93c3BhbiIpKjEsdz0hd3x8dz09PTB8fHc9PT0xPzE6dyxrPSFrfHxrPT09MHx8az09PTE/MTprLHk9byhGLGMsVCksaD13PT09MSxyKXtpZihoKXt1aSh0LHksVyhsKS5kYXRhKCkpO3ZhciBDPW5beV0sQj1sLmdldEF0dHJpYnV0ZSgid2lkdGgiKXx8bnVsbCx1PWwuc3R5bGUud2lkdGgubWF0Y2goL3dpZHRoOlxzKihcZCtbcHhlbSVdKykvKTt1JiYoQj11WzFdKSxDLnNXaWR0aE9yaWc9Qy5zV2lkdGh8fEIsUD8oQy5zVGl0bGUhPT1udWxsJiYhQy5hdXRvVGl0bGUmJihsLmlubmVySFRNTD1DLnNUaXRsZSksIUMuc1RpdGxlJiZoJiYoQy5zVGl0bGU9aHIobC5pbm5lckhUTUwpLEMuYXV0b1RpdGxlPSEwKSk6Qy5mb290ZXImJihsLmlubmVySFRNTD1DLmZvb3RlciksQy5hcmlhVGl0bGV8fChDLmFyaWFUaXRsZT1XKGwpLmF0dHIoImFyaWEtbGFiZWwiKXx8Qy5zVGl0bGUpLEMuY2xhc3NOYW1lJiZXKGwpLmFkZENsYXNzKEMuY2xhc3NOYW1lKX1XKCJzcGFuLmR0LWNvbHVtbi10aXRsZSIsbCkubGVuZ3RoPT09MCYmVygiPHNwYW4+IikuYWRkQ2xhc3MoImR0LWNvbHVtbi10aXRsZSIpLmFwcGVuZChsLmNoaWxkTm9kZXMpLmFwcGVuZFRvKGwpLFAmJlcoInNwYW4uZHQtY29sdW1uLW9yZGVyIixsKS5sZW5ndGg9PT0wJiZXKCI8c3Bhbj4iKS5hZGRDbGFzcygiZHQtY29sdW1uLW9yZGVyIikuYXBwZW5kVG8obCl9Zm9yKGI9MDtiPHc7YisrKXtmb3IocD0wO3A8aztwKyspRltjK3BdW3krYl09e2NlbGw6bCx1bmlxdWU6aH0sRltjK3BdLnJvdz1hO2YucHVzaCh5K2IpfWwuc2V0QXR0cmlidXRlKCJkYXRhLWR0LWNvbHVtbiIscHIoZikuam9pbigiLCIpKX1sPWwubmV4dFNpYmxpbmd9cmV0dXJuIEZ9ZnVuY3Rpb24gUW8odCl7dmFyIGU9QmUodCk9PSJzc3AiLHI9dC5pSW5pdERpc3BsYXlTdGFydDtyIT09dm9pZCAwJiZyIT09LTEmJih0Ll9pRGlzcGxheVN0YXJ0PWU/cjpyPj10LmZuUmVjb3Jkc0Rpc3BsYXkoKT8wOnIsdC5pSW5pdERpc3BsYXlTdGFydD0tMSl9ZnVuY3Rpb24ga2kodCxlLHIpe3ZhciBuLHM9dC5hamF4LGE9dC5vSW5zdGFuY2UsbD1mdW5jdGlvbihtKXt2YXIgeT10LmpxWEhSP3QuanFYSFIuc3RhdHVzOm51bGw7KG09PT1udWxsfHx0eXBlb2YgeT09Im51bWJlciImJnk9PTIwNCkmJihtPXt9LERuKHQsbSxbXSkpO3ZhciBUPW0uZXJyb3J8fG0uc0Vycm9yO1QmJlBlKHQsMCxUKSx0Lmpzb249bSxadCh0LG51bGwsInhociIsW3QsbSx0LmpxWEhSXSwhMCkscihtKX07aWYoVy5pc1BsYWluT2JqZWN0KHMpJiZzLmRhdGEpe249cy5kYXRhO3ZhciBjPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oZSx0KTpuO2U9dHlwZW9mIG49PSJmdW5jdGlvbiImJmM/YzpXLmV4dGVuZCghMCxlLGMpLGRlbGV0ZSBzLmRhdGF9dmFyIHA9e3VybDp0eXBlb2Ygcz09InN0cmluZyI/czoiIixkYXRhOmUsc3VjY2VzczpsLGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOnQuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihtLHkpe3ZhciBUPVp0KHQsbnVsbCwieGhyIixbdCxudWxsLHQuanFYSFJdLCEwKTtULmluZGV4T2YoITApPT09LTEmJih5PT0icGFyc2VyZXJyb3IiP1BlKHQsMCwiSW52YWxpZCBKU09OIHJlc3BvbnNlIiwxKTptLnJlYWR5U3RhdGU9PT00JiZQZSh0LDAsIkFqYXggZXJyb3IiLDcpKSxGZSh0LCExKX19O2lmKFcuaXNQbGFpbk9iamVjdChzKSYmVy5leHRlbmQocCxzKSx0Lm9BamF4RGF0YT1lLFp0KHQsbnVsbCwicHJlWGhyIixbdCxlLHBdLCEwKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIil0LmpxWEhSPXMuY2FsbChhLGUsbCx0KTtlbHNlIGlmKHMudXJsPT09IiIpe3ZhciBiPXt9O3Z0LnV0aWwuc2V0KHMuZGF0YVNyYykoYixbXSksbChiKX1lbHNlIHQuanFYSFI9Vy5hamF4KHApLG4mJihzLmRhdGE9bil9ZnVuY3Rpb24gSm8odCl7dC5pRHJhdysrLEZlKHQsITApLGtpKHQsdGwodCksZnVuY3Rpb24oZSl7ZWwodCxlKX0pfWZ1bmN0aW9uIHRsKHQpe3ZhciBlPXQuYW9Db2x1bW5zLHI9dC5vRmVhdHVyZXMsbj10Lm9QcmV2aW91c1NlYXJjaCxzPXQuYW9QcmVTZWFyY2hDb2xzLGE9ZnVuY3Rpb24obCxjKXtyZXR1cm4gdHlwZW9mIGVbbF1bY109PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjplW2xdW2NdfTtyZXR1cm57ZHJhdzp0LmlEcmF3LGNvbHVtbnM6ZS5tYXAoZnVuY3Rpb24obCxjKXtyZXR1cm57ZGF0YTphKGMsIm1EYXRhIiksbmFtZTpsLnNOYW1lLHNlYXJjaGFibGU6bC5iU2VhcmNoYWJsZSxvcmRlcmFibGU6bC5iU29ydGFibGUsc2VhcmNoOnt2YWx1ZTpzW2NdLnNlYXJjaCxyZWdleDpzW2NdLnJlZ2V4LGZpeGVkOk9iamVjdC5rZXlzKGwuc2VhcmNoRml4ZWQpLm1hcChmdW5jdGlvbihwKXtyZXR1cm57bmFtZTpwLHRlcm06bC5zZWFyY2hGaXhlZFtwXS50b1N0cmluZygpfX0pfX19KSxvcmRlcjpBbih0KS5tYXAoZnVuY3Rpb24obCl7cmV0dXJue2NvbHVtbjpsLmNvbCxkaXI6bC5kaXIsbmFtZTphKGwuY29sLCJzTmFtZSIpfX0pLHN0YXJ0OnQuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOnIuYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLHNlYXJjaDp7dmFsdWU6bi5zZWFyY2gscmVnZXg6bi5yZWdleCxmaXhlZDpPYmplY3Qua2V5cyh0LnNlYXJjaEZpeGVkKS5tYXAoZnVuY3Rpb24obCl7cmV0dXJue25hbWU6bCx0ZXJtOnQuc2VhcmNoRml4ZWRbbF0udG9TdHJpbmcoKX19KX19fWZ1bmN0aW9uIGVsKHQsZSl7dmFyIHI9RG4odCxlKSxuPXNpKHQsImRyYXciLGUpLHM9c2kodCwicmVjb3Jkc1RvdGFsIixlKSxhPXNpKHQsInJlY29yZHNGaWx0ZXJlZCIsZSk7aWYobiE9PXZvaWQgMCl7aWYobioxPHQuaURyYXcpcmV0dXJuO3QuaURyYXc9bioxfXJ8fChyPVtdKSxDaSh0KSx0Ll9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KHMsMTApLHQuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChhLDEwKTtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspYnIodCxyW2xdKTt0LmFpRGlzcGxheT10LmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLEZyKHQsITApLHduKHQpLEZlKHQsITEpfWZ1bmN0aW9uIERuKHQsZSxyKXt2YXIgbj0iZGF0YSI7aWYoVy5pc1BsYWluT2JqZWN0KHQuYWpheCkmJnQuYWpheC5kYXRhU3JjIT09dm9pZCAwKXt2YXIgcz10LmFqYXguZGF0YVNyYzt0eXBlb2Ygcz09InN0cmluZyJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iP249czpzLmRhdGEhPT12b2lkIDAmJihuPXMuZGF0YSl9aWYoIXIpcmV0dXJuIG49PT0iZGF0YSI/ZS5hYURhdGF8fGVbbl06biE9PSIiP0lyKG4pKGUpOmU7ZnIobikoZSxyKX1mdW5jdGlvbiBzaSh0LGUscil7dmFyIG49Vy5pc1BsYWluT2JqZWN0KHQuYWpheCk/dC5hamF4LmRhdGFTcmM6bnVsbDtpZihuJiZuW2VdKXJldHVybiBJcihuW2VdKShyKTt2YXIgcz0iIjtyZXR1cm4gZT09PSJkcmF3Ij9zPSJzRWNobyI6ZT09PSJyZWNvcmRzVG90YWwiP3M9ImlUb3RhbFJlY29yZHMiOmU9PT0icmVjb3Jkc0ZpbHRlcmVkIiYmKHM9ImlUb3RhbERpc3BsYXlSZWNvcmRzIikscltzXSE9PXZvaWQgMD9yW3NdOnJbZV19ZnVuY3Rpb24gR3IodCxlKXt2YXIgcj10LmFvUHJlU2VhcmNoQ29scztpZih3aSh0KSxCZSh0KSE9InNzcCIpe2FsKHQpLHQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkscG4odC5haURpc3BsYXksdCxlLnNlYXJjaCxlKSxXLmVhY2godC5zZWFyY2hGaXhlZCxmdW5jdGlvbihhLGwpe3BuKHQuYWlEaXNwbGF5LHQsbCx7fSl9KTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHM9cltuXTtwbih0LmFpRGlzcGxheSx0LHMuc2VhcmNoLHMsbiksVy5lYWNoKHQuYW9Db2x1bW5zW25dLnNlYXJjaEZpeGVkLGZ1bmN0aW9uKGEsbCl7cG4odC5haURpc3BsYXksdCxsLHt9LG4pfSl9cmwodCl9dC5iRmlsdGVyZWQ9ITAsWnQodCxudWxsLCJzZWFyY2giLFt0XSl9ZnVuY3Rpb24gcmwodCl7Zm9yKHZhciBlPXZ0LmV4dC5zZWFyY2gscj10LmFpRGlzcGxheSxuLHMsYT0wLGw9ZS5sZW5ndGg7YTxsO2ErKyl7Zm9yKHZhciBjPVtdLHA9MCxiPXIubGVuZ3RoO3A8YjtwKyspcz1yW3BdLG49dC5hb0RhdGFbc10sZVthXSh0LG4uX2FGaWx0ZXJEYXRhLHMsbi5fYURhdGEscCkmJmMucHVzaChzKTtyLmxlbmd0aD0wLHIucHVzaC5hcHBseShyLGMpfX1mdW5jdGlvbiBwbih0LGUscixuLHMpe2lmKHIhPT0iIilmb3IodmFyIGE9MCxsPXR5cGVvZiByPT0iZnVuY3Rpb24iP3I6bnVsbCxjPXIgaW5zdGFuY2VvZiBSZWdFeHA/cjpsP251bGw6bmwocixuKTthPHQubGVuZ3RoOyl7dmFyIHA9ZS5hb0RhdGFbdFthXV0sYj1zPT09dm9pZCAwP3AuX3NGaWx0ZXJSb3c6cC5fYUZpbHRlckRhdGFbc107KGwmJiFsKGIscC5fYURhdGEsdFthXSxzKXx8YyYmIWMudGVzdChiKSkmJih0LnNwbGljZShhLDEpLGEtLSksYSsrfX1mdW5jdGlvbiBubCh0LGUpe3ZhciByPVtdLG49Vy5leHRlbmQoe30se2JvdW5kYXJ5OiExLGNhc2VJbnNlbnNpdGl2ZTohMCxleGFjdDohMSxyZWdleDohMSxzbWFydDohMH0sZSk7aWYodHlwZW9mIHQhPSJzdHJpbmciJiYodD10LnRvU3RyaW5nKCkpLHQ9bW4odCksbi5leGFjdClyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrY2kodCkrIiQiLG4uY2FzZUluc2Vuc2l0aXZlPyJpIjoiIik7aWYodD1uLnJlZ2V4P3Q6Y2kodCksbi5zbWFydCl7dmFyIHM9dC5tYXRjaCgvIT9bIlx1MjAxQ11bXiJcdTIwMURdK1siXHUyMDFEXXxbXiBdKy9nKXx8WyIiXSxhPXMubWFwKGZ1bmN0aW9uKHApe3ZhciBiPSExLG07cmV0dXJuIHAuY2hhckF0KDApPT09IiEiJiYoYj0hMCxwPXAuc3Vic3RyaW5nKDEpKSxwLmNoYXJBdCgwKT09PSciJz8obT1wLm1hdGNoKC9eIiguKikiJC8pLHA9bT9tWzFdOnApOnAuY2hhckF0KDApPT09Ilx1MjAxQyImJihtPXAubWF0Y2goL15cdTIwMUMoLiopXHUyMDFEJC8pLHA9bT9tWzFdOnApLGImJihwLmxlbmd0aD4xJiZyLnB1c2goIig/ISIrcCsiKSIpLHA9IiIpLHAucmVwbGFjZSgvIi9nLCIiKX0pLGw9ci5sZW5ndGg/ci5qb2luKCIiKToiIixjPW4uYm91bmRhcnk/IlxcYiI6IiI7dD0iXig/PS4qPyIrYythLmpvaW4oIikoPz0uKj8iK2MpKyIpKCIrbCsiLikqJCJ9cmV0dXJuIG5ldyBSZWdFeHAodCxuLmNhc2VJbnNlbnNpdGl2ZT8iaSI6IiIpfXZhciBjaT12dC51dGlsLmVzY2FwZVJlZ2V4LGJuPVcoIjxkaXY+IilbMF0saWw9Ym4udGV4dENvbnRlbnQhPT12b2lkIDA7ZnVuY3Rpb24gYWwodCl7Zm9yKHZhciBlPXQuYW9Db2x1bW5zLHI9dC5hb0RhdGEsbixzLGEsbCxjLHAsYj0hMSxtPTA7bTxyLmxlbmd0aDttKyspaWYoclttXSYmKHA9clttXSwhcC5fYUZpbHRlckRhdGEpKXtmb3IobD1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7cysrKW49ZVtzXSxuLmJTZWFyY2hhYmxlPyhjPU5lKHQsbSxzLCJmaWx0ZXIiKSxjPT09bnVsbCYmKGM9IiIpLHR5cGVvZiBjIT0ic3RyaW5nIiYmYy50b1N0cmluZyYmKGM9Yy50b1N0cmluZygpKSk6Yz0iIixjLmluZGV4T2YmJmMuaW5kZXhPZigiJiIpIT09LTEmJihibi5pbm5lckhUTUw9YyxjPWlsP2JuLnRleHRDb250ZW50OmJuLmlubmVyVGV4dCksYy5yZXBsYWNlJiYoYz1jLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIiKSksbC5wdXNoKGMpO3AuX2FGaWx0ZXJEYXRhPWwscC5fc0ZpbHRlclJvdz1sLmpvaW4oIiAgIiksYj0hMH1yZXR1cm4gYn1mdW5jdGlvbiB2bih0KXt2YXIgZSxyPXQuaUluaXREaXNwbGF5U3RhcnQ7aWYoIXQuYkluaXRpYWxpc2VkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dm4odCl9LDIwMCk7cmV0dXJufUZhKHQsImhlYWRlciIpLEZhKHQsImZvb3RlciIpLHluKHQsdC5hb0hlYWRlcikseW4odCx0LmFvRm9vdGVyKSxLbyh0KSxkbCh0KSxlcyh0KSxGZSh0LCEwKSxadCh0LG51bGwsInByZUluaXQiLFt0XSwhMCksUHIodCk7dmFyIG49QmUodCk7biE9InNzcCImJihuPT0iYWpheCI/a2kodCx7fSxmdW5jdGlvbihzKXt2YXIgYT1Ebih0LHMpO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspYnIodCxhW2VdKTt0LmlJbml0RGlzcGxheVN0YXJ0PXIsUHIodCksRmUodCwhMSksd24odCl9LHQpOih3bih0KSxGZSh0LCExKSkpfWZ1bmN0aW9uIHduKHQpe2lmKCF0Ll9iSW5pdENvbXBsZXRlKXt2YXIgZT1bdCx0Lmpzb25dO3QuX2JJbml0Q29tcGxldGU9ITAsVG4odCksWnQodCxudWxsLCJwbHVnaW4taW5pdCIsZSwhMCksWnQodCwiYW9Jbml0Q29tcGxldGUiLCJpbml0IixlLCEwKX19ZnVuY3Rpb24gUWEodCxlKXt2YXIgcj1wYXJzZUludChlLDEwKTt0Ll9pRGlzcGxheUxlbmd0aD1yLGFzKHQpLFp0KHQsbnVsbCwibGVuZ3RoIixbdCxyXSl9ZnVuY3Rpb24gU2kodCxlLHIpe3ZhciBuPXQuX2lEaXNwbGF5U3RhcnQscz10Ll9pRGlzcGxheUxlbmd0aCxhPXQuZm5SZWNvcmRzRGlzcGxheSgpO2lmKGE9PT0wfHxzPT09LTEpbj0wO2Vsc2UgaWYodHlwZW9mIGU9PSJudW1iZXIiKW49ZSpzLG4+YSYmKG49MCk7ZWxzZSBpZihlPT0iZmlyc3QiKW49MDtlbHNlIGlmKGU9PSJwcmV2aW91cyIpbj1zPj0wP24tczowLG48MCYmKG49MCk7ZWxzZSBpZihlPT0ibmV4dCIpbitzPGEmJihuKz1zKTtlbHNlIGlmKGU9PSJsYXN0IiluPU1hdGguZmxvb3IoKGEtMSkvcykqcztlbHNle2lmKGU9PT0iZWxsaXBzaXMiKXJldHVybjtQZSh0LDAsIlVua25vd24gcGFnaW5nIGFjdGlvbjogIitlLDUpfXZhciBsPXQuX2lEaXNwbGF5U3RhcnQhPT1uO3JldHVybiB0Ll9pRGlzcGxheVN0YXJ0PW4sWnQodCxudWxsLGw/InBhZ2UiOiJwYWdlLW5jIixbdF0pLGwmJnImJkZyKHQpLGx9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dC5uVGFibGU7aWYodC5vRmVhdHVyZXMuYlByb2Nlc3Npbmcpe3ZhciByPVcoIjxkaXYvPiIse2lkOnQuc1RhYmxlSWQrIl9wcm9jZXNzaW5nIixjbGFzczp0Lm9DbGFzc2VzLnByb2Nlc3NpbmcuY29udGFpbmVyLHJvbGU6InN0YXR1cyJ9KS5odG1sKHQub0xhbmd1YWdlLnNQcm9jZXNzaW5nKS5hcHBlbmQoIjxkaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj4iKS5pbnNlcnRCZWZvcmUoZSk7VyhlKS5vbigicHJvY2Vzc2luZy5kdC5EVCIsZnVuY3Rpb24obixzLGEpe3IuY3NzKCJkaXNwbGF5IixhPyJibG9jayI6Im5vbmUiKX0pfX1mdW5jdGlvbiBGZSh0LGUpe1p0KHQsbnVsbCwicHJvY2Vzc2luZyIsW3QsZV0pfWZ1bmN0aW9uIEphKHQpe3ZhciBlPVcodC5uVGFibGUpLHI9dC5vU2Nyb2xsO2lmKHIuc1g9PT0iIiYmci5zWT09PSIiKXJldHVybiB0Lm5UYWJsZTt2YXIgbj1yLnNYLHM9ci5zWSxhPXQub0NsYXNzZXMuc2Nyb2xsaW5nLGw9dC5jYXB0aW9uTm9kZSxjPWw/bC5fY2FwdGlvblNpZGU6bnVsbCxwPVcoZVswXS5jbG9uZU5vZGUoITEpKSxiPVcoZVswXS5jbG9uZU5vZGUoITEpKSxtPWUuY2hpbGRyZW4oInRmb290IikseT0iPGRpdi8+IixUPWZ1bmN0aW9uKG8pe3JldHVybiBvP3JyKG8pOm51bGx9O20ubGVuZ3RofHwobT1udWxsKTt2YXIgdz1XKHkse2NsYXNzOmEuY29udGFpbmVyfSkuYXBwZW5kKFcoeSx7Y2xhc3M6YS5oZWFkZXIuc2VsZn0pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246InJlbGF0aXZlIixib3JkZXI6MCx3aWR0aDpuP1Qobik6IjEwMCUifSkuYXBwZW5kKFcoeSx7Y2xhc3M6YS5oZWFkZXIuaW5uZXJ9KS5jc3MoeyJib3gtc2l6aW5nIjoiY29udGVudC1ib3giLHdpZHRoOnIuc1hJbm5lcnx8IjEwMCUifSkuYXBwZW5kKHAucmVtb3ZlQXR0cigiaWQiKS5jc3MoIm1hcmdpbi1sZWZ0IiwwKS5hcHBlbmQoYz09PSJ0b3AiP2w6bnVsbCkuYXBwZW5kKGUuY2hpbGRyZW4oInRoZWFkIikpKSkpLmFwcGVuZChXKHkse2NsYXNzOmEuYm9keX0pLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixvdmVyZmxvdzoiYXV0byIsd2lkdGg6VChuKX0pLmFwcGVuZChlKSk7bSYmdy5hcHBlbmQoVyh5LHtjbGFzczphLmZvb3Rlci5zZWxmfSkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIixib3JkZXI6MCx3aWR0aDpuP1Qobik6IjEwMCUifSkuYXBwZW5kKFcoeSx7Y2xhc3M6YS5mb290ZXIuaW5uZXJ9KS5hcHBlbmQoYi5yZW1vdmVBdHRyKCJpZCIpLmNzcygibWFyZ2luLWxlZnQiLDApLmFwcGVuZChjPT09ImJvdHRvbSI/bDpudWxsKS5hcHBlbmQoZS5jaGlsZHJlbigidGZvb3QiKSkpKSk7dmFyIGs9dy5jaGlsZHJlbigpLFA9a1swXSxGPWtbMV0saD1tP2tbMl06bnVsbDtyZXR1cm4gVyhGKS5vbigic2Nyb2xsLkRUIixmdW5jdGlvbigpe3ZhciBvPXRoaXMuc2Nyb2xsTGVmdDtQLnNjcm9sbExlZnQ9byxtJiYoaC5zY3JvbGxMZWZ0PW8pfSksVygidGgsIHRkIixQKS5vbigiZm9jdXMiLGZ1bmN0aW9uKCl7dmFyIG89UC5zY3JvbGxMZWZ0O0Yuc2Nyb2xsTGVmdD1vLG0mJihGLnNjcm9sbExlZnQ9byl9KSxXKEYpLmNzcygibWF4LWhlaWdodCIscyksci5iQ29sbGFwc2V8fFcoRikuY3NzKCJoZWlnaHQiLHMpLHQublNjcm9sbEhlYWQ9UCx0Lm5TY3JvbGxCb2R5PUYsdC5uU2Nyb2xsRm9vdD1oLHQuYW9EcmF3Q2FsbGJhY2sucHVzaCh0cyksd1swXX1mdW5jdGlvbiB0cyh0KXt2YXIgZT10Lm9TY3JvbGwscj1lLmlCYXJXaWR0aCxuPVcodC5uU2Nyb2xsSGVhZCkscz1uLmNoaWxkcmVuKCJkaXYiKSxhPXMuY2hpbGRyZW4oInRhYmxlIiksbD10Lm5TY3JvbGxCb2R5LGM9VyhsKSxwPVcodC5uU2Nyb2xsRm9vdCksYj1wLmNoaWxkcmVuKCJkaXYiKSxtPWIuY2hpbGRyZW4oInRhYmxlIikseT1XKHQublRIZWFkKSxUPVcodC5uVGFibGUpLHc9dC5uVEZvb3QmJlcoInRoLCB0ZCIsdC5uVEZvb3QpLmxlbmd0aD9XKHQublRGb290KTpudWxsLGs9dC5vQnJvd3NlcixQLEYsaD1sLnNjcm9sbEhlaWdodD5sLmNsaWVudEhlaWdodDtpZih0LnNjcm9sbEJhclZpcyE9PWgmJnQuc2Nyb2xsQmFyVmlzIT09dm9pZCAwKXt0LnNjcm9sbEJhclZpcz1oLFRuKHQpO3JldHVybn1lbHNlIHQuc2Nyb2xsQmFyVmlzPWg7aWYoVC5jaGlsZHJlbigidGhlYWQsIHRmb290IikucmVtb3ZlKCksUD15LmNsb25lKCkucHJlcGVuZFRvKFQpLFAuZmluZCgidGgsIHRkIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKSxQLmZpbmQoIltpZF0iKS5yZW1vdmVBdHRyKCJpZCIpLHcmJihGPXcuY2xvbmUoKS5wcmVwZW5kVG8oVCksRi5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSksdC5haURpc3BsYXkubGVuZ3RoKWZvcih2YXIgbz1ULmZpbmQoInRib2R5IHRyIikuZXEoMCkuZmluZCgidGgsIHRkIikubWFwKGZ1bmN0aW9uKGV0KXtyZXR1cm57aWR4OmdpKHQsZXQpLHdpZHRoOlcodGhpcykub3V0ZXJXaWR0aCgpfX0pLGY9MDtmPG8ubGVuZ3RoO2YrKyl7dmFyIEM9dC5hb0NvbHVtbnNbb1tmXS5pZHhdLmNvbEVsWzBdLEI9Qy5zdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpO0IhPT1vW2ZdLndpZHRoJiYoQy5zdHlsZS53aWR0aD1vW2ZdLndpZHRoKyJweCIpfWEuZmluZCgiY29sZ3JvdXAiKS5yZW1vdmUoKSxhLmFwcGVuZCh0LmNvbGdyb3VwLmNsb25lKCkpLHcmJihtLmZpbmQoImNvbGdyb3VwIikucmVtb3ZlKCksbS5hcHBlbmQodC5jb2xncm91cC5jbG9uZSgpKSksVygidGgsIHRkIixQKS5lYWNoKGZ1bmN0aW9uKCl7Vyh0aGlzLmNoaWxkTm9kZXMpLndyYXBBbGwoJzxkaXYgY2xhc3M9ImR0LXNjcm9sbC1zaXppbmciPicpfSksdyYmVygidGgsIHRkIixGKS5lYWNoKGZ1bmN0aW9uKCl7Vyh0aGlzLmNoaWxkTm9kZXMpLndyYXBBbGwoJzxkaXYgY2xhc3M9ImR0LXNjcm9sbC1zaXppbmciPicpfSk7dmFyIHU9TWF0aC5mbG9vcihULmhlaWdodCgpKT5sLmNsaWVudEhlaWdodHx8Yy5jc3MoIm92ZXJmbG93LXkiKT09InNjcm9sbCIsej0icGFkZGluZyIrKGsuYlNjcm9sbGJhckxlZnQ/IkxlZnQiOiJSaWdodCIpLHE9VC5vdXRlcldpZHRoKCk7YS5jc3MoIndpZHRoIixycihxKSkscy5jc3MoIndpZHRoIixycihxKSkuY3NzKHosdT9yKyJweCI6IjBweCIpLHcmJihtLmNzcygid2lkdGgiLHJyKHEpKSxiLmNzcygid2lkdGgiLHJyKHEpKS5jc3Moeix1P3IrInB4IjoiMHB4IikpLFQuY2hpbGRyZW4oImNvbGdyb3VwIikucHJlcGVuZFRvKFQpLGMudHJpZ2dlcigic2Nyb2xsIiksKHQuYlNvcnRlZHx8dC5iRmlsdGVyZWQpJiYhdC5fZHJhd0hvbGQmJihsLnNjcm9sbFRvcD0wKX1mdW5jdGlvbiBvbCh0KXtpZih0Lm9GZWF0dXJlcy5iQXV0b1dpZHRoKXt2YXIgZT10Lm5UYWJsZSxyPXQuYW9Db2x1bW5zLG49dC5vU2Nyb2xsLHM9bi5zWSxhPW4uc1gsbD1uLnNYSW5uZXIsYz15aSh0LCJiVmlzaWJsZSIpLHA9ZS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksYj1lLnBhcmVudE5vZGUsbSx5LFQsdz1lLnN0eWxlLndpZHRoO3cmJncuaW5kZXhPZigiJSIpIT09LTEmJihwPXcpLFp0KHQsbnVsbCwiY29sdW1uLWNhbGMiLHt2aXNpYmxlOmN9LCExKTt2YXIgaz1XKGUuY2xvbmVOb2RlKCkpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLnJlbW92ZUF0dHIoImlkIik7ay5hcHBlbmQoIjx0Ym9keT4iKTt2YXIgUD1XKCI8dHIvPiIpLmFwcGVuZFRvKGsuZmluZCgidGJvZHkiKSk7Zm9yKGsuYXBwZW5kKFcodC5uVEhlYWQpLmNsb25lKCkpLmFwcGVuZChXKHQublRGb290KS5jbG9uZSgpKSxrLmZpbmQoInRmb290IHRoLCB0Zm9vdCB0ZCIpLmNzcygid2lkdGgiLCIiKSxrLmZpbmQoInRoZWFkIHRoLCB0aGVhZCB0ZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZXQ9R2EodCx0aGlzLCEwLCExKTtldD8odGhpcy5zdHlsZS53aWR0aD1ldCxhJiZXKHRoaXMpLmFwcGVuZChXKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOmV0LG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6MCxoZWlnaHQ6MX0pKSk6dGhpcy5zdHlsZS53aWR0aD0iIn0pLG09MDttPGMubGVuZ3RoO20rKyl7VD1jW21dLHk9cltUXTt2YXIgRj1sbCh0LFQpLGg9b2UudHlwZS5jbGFzc05hbWVbeS5zVHlwZV0sbz1GK3kuc0NvbnRlbnRQYWRkaW5nLGY9Ri5pbmRleE9mKCI8Iik9PT0tMT9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKTpvO1coIjx0ZC8+IikuYWRkQ2xhc3MoaCkuYWRkQ2xhc3MoeS5zQ2xhc3MpLmFwcGVuZChmKS5hcHBlbmRUbyhQKX1XKCJbbmFtZV0iLGspLnJlbW92ZUF0dHIoIm5hbWUiKTt2YXIgQz1XKCI8ZGl2Lz4iKS5jc3MoYXx8cz97cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsaGVpZ2h0OjEscmlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIn06e30pLmFwcGVuZChrKS5hcHBlbmRUbyhiKTthJiZsP2sud2lkdGgobCk6YT8oay5jc3MoIndpZHRoIiwiYXV0byIpLGsucmVtb3ZlQXR0cigid2lkdGgiKSxrLndpZHRoKCk8Yi5jbGllbnRXaWR0aCYmcCYmay53aWR0aChiLmNsaWVudFdpZHRoKSk6cz9rLndpZHRoKGIuY2xpZW50V2lkdGgpOnAmJmsud2lkdGgocCk7dmFyIEI9MCx1PWsuZmluZCgidGJvZHkgdHIiKS5lcSgwKS5jaGlsZHJlbigpO2ZvcihtPTA7bTxjLmxlbmd0aDttKyspe3ZhciB6PXVbbV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7Qis9eixyW2NbbV1dLnNXaWR0aD1ycih6KX1pZihlLnN0eWxlLndpZHRoPXJyKEIpLEMucmVtb3ZlKCkscCYmKGUuc3R5bGUud2lkdGg9cnIocCkpLChwfHxhKSYmIXQuX3Jlc3pFdnQpe3ZhciBxPWZ1bmN0aW9uKCl7Vyh3aW5kb3cpLm9uKCJyZXNpemUuRFQtIit0LnNJbnN0YW5jZSx2dC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7dC5iRGVzdHJveWluZ3x8VG4odCl9KSl9O3EoKSx0Ll9yZXN6RXZ0PSEwfX19ZnVuY3Rpb24gbGwodCxlKXt2YXIgcj10LmFvQ29sdW1uc1tlXTtpZighci5tYXhMZW5TdHJpbmcpe2Zvcih2YXIgbixzPSIiLGE9LTEsbD0wLGM9dC5haURpc3BsYXlNYXN0ZXIubGVuZ3RoO2w8YztsKyspe3ZhciBwPXQuYWlEaXNwbGF5TWFzdGVyW2xdLGI9VGkodCxwKVtlXSxtPWImJnR5cGVvZiBiPT0ib2JqZWN0IiYmYi5ub2RlVHlwZT9iLmlubmVySFRNTDpiKyIiO209bS5yZXBsYWNlKC9pZD0iLio/Ii9nLCIiKS5yZXBsYWNlKC9uYW1lPSIuKj8iL2csIiIpLG49aHIobSkucmVwbGFjZSgvJm5ic3A7L2csIiAiKSxuLmxlbmd0aD5hJiYocz1tLGE9bi5sZW5ndGgpfXIubWF4TGVuU3RyaW5nPXN9cmV0dXJuIHIubWF4TGVuU3RyaW5nfWZ1bmN0aW9uIHJyKHQpe3JldHVybiB0PT09bnVsbD8iMHB4Ijp0eXBlb2YgdD09Im51bWJlciI/dDwwPyIwcHgiOnQrInB4Ijp0Lm1hdGNoKC9cZCQvKT90KyJweCI6dH1mdW5jdGlvbiBlcyh0KXt2YXIgZT10LmFvQ29sdW1ucztmb3IodC5jb2xncm91cC5lbXB0eSgpLEllPTA7SWU8ZS5sZW5ndGg7SWUrKyllW0llXS5iVmlzaWJsZSYmdC5jb2xncm91cC5hcHBlbmQoZVtJZV0uY29sRWwpfWZ1bmN0aW9uIGRsKHQpe3ZhciBlPXQublRIZWFkLHI9ZS5xdWVyeVNlbGVjdG9yQWxsKCJ0ciIpLG49dC5iU29ydENlbGxzVG9wLHM9Jzpub3QoW2RhdGEtZHQtb3JkZXI9ImRpc2FibGUiXSk6bm90KFtkYXRhLWR0LW9yZGVyPSJpY29uLW9ubHkiXSknO249PT0hMD9lPXJbMF06bj09PSExJiYoZT1yW3IubGVuZ3RoLTFdKSxycyh0LGUsZT09PXQublRIZWFkPyJ0ciIrcysiIHRoIitzKyIsIHRyIitzKyIgdGQiK3M6InRoIitzKyIsIHRkIitzKTt2YXIgYT1bXTtxcih0LGEsdC5hYVNvcnRpbmcpLHQuYWFTb3J0aW5nPWF9ZnVuY3Rpb24gcnModCxlLHIsbixzKXtpcyhlLHIsZnVuY3Rpb24oYSl7dmFyIGw9ITEsYz1uPT09dm9pZCAwP3hpKGEudGFyZ2V0KTpbbl07aWYoYy5sZW5ndGgpe2Zvcih2YXIgcD0wLGI9Yy5sZW5ndGg7cDxiO3ArKyl7dmFyIG09dWwodCxjW3BdLHAsYS5zaGlmdEtleSk7aWYobSE9PSExJiYobD0hMCksdC5hYVNvcnRpbmcubGVuZ3RoPT09MSYmdC5hYVNvcnRpbmdbMF1bMV09PT0iIilicmVha31sJiYoRmUodCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe0RpKHQpLG5zKHQsdC5haURpc3BsYXkpLEZlKHQsITEpLFByKHQsITEsITEpLHMmJnMoKX0sMCkpfX0pfWZ1bmN0aW9uIG5zKHQsZSl7dmFyIHI9dC5haURpc3BsYXlNYXN0ZXIsbj17fSxzPXt9LGE7Zm9yKGE9MDthPHIubGVuZ3RoO2ErKyluW3JbYV1dPWE7Zm9yKGE9MDthPGUubGVuZ3RoO2ErKylzW2VbYV1dPW5bZVthXV07ZS5zb3J0KGZ1bmN0aW9uKGwsYyl7cmV0dXJuIHNbbF0tc1tjXX0pfWZ1bmN0aW9uIHFyKHQsZSxyKXt2YXIgbj1mdW5jdGlvbihhKXtpZihXLmlzUGxhaW5PYmplY3QoYSkpe2lmKGEuaWR4IT09dm9pZCAwKWUucHVzaChbYS5pZHgsYS5kaXJdKTtlbHNlIGlmKGEubmFtZSl7dmFyIGw9eGUodC5hb0NvbHVtbnMsInNOYW1lIiksYz1sLmluZGV4T2YoYS5uYW1lKTtjIT09LTEmJmUucHVzaChbYyxhLmRpcl0pfX1lbHNlIGUucHVzaChhKX07aWYoVy5pc1BsYWluT2JqZWN0KHIpKW4ocik7ZWxzZSBpZihyLmxlbmd0aCYmdHlwZW9mIHJbMF09PSJudW1iZXIiKW4ocik7ZWxzZSBpZihyLmxlbmd0aClmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyluKHJbc10pfWZ1bmN0aW9uIEFuKHQpe3ZhciBlLHIsbixzPVtdLGE9dnQuZXh0LnR5cGUub3JkZXIsbD10LmFvQ29sdW1ucyxjLHAsYixtLHk9dC5hYVNvcnRpbmdGaXhlZCxUPVcuaXNQbGFpbk9iamVjdCh5KSx3PVtdO2lmKCF0Lm9GZWF0dXJlcy5iU29ydClyZXR1cm4gcztmb3IoQXJyYXkuaXNBcnJheSh5KSYmcXIodCx3LHkpLFQmJnkucHJlJiZxcih0LHcseS5wcmUpLHFyKHQsdyx0LmFhU29ydGluZyksVCYmeS5wb3N0JiZxcih0LHcseS5wb3N0KSxlPTA7ZTx3Lmxlbmd0aDtlKyspaWYobT13W2VdWzBdLGxbbV0pZm9yKGM9bFttXS5hRGF0YVNvcnQscj0wLG49Yy5sZW5ndGg7cjxuO3IrKylwPWNbcl0sYj1sW3BdLnNUeXBlfHwic3RyaW5nIix3W2VdLl9pZHg9PT12b2lkIDAmJih3W2VdLl9pZHg9bFtwXS5hc1NvcnRpbmcuaW5kZXhPZih3W2VdWzFdKSksd1tlXVsxXSYmcy5wdXNoKHtzcmM6bSxjb2w6cCxkaXI6d1tlXVsxXSxpbmRleDp3W2VdLl9pZHgsdHlwZTpiLGZvcm1hdHRlcjphW2IrIi1wcmUiXSxzb3J0ZXI6YVtiKyItIit3W2VdWzFdXX0pO3JldHVybiBzfWZ1bmN0aW9uIERpKHQsZSxyKXt2YXIgbixzLGEsbD1bXSxjPXZ0LmV4dC50eXBlLm9yZGVyLHA9dC5hb0RhdGEsYixtPXQuYWlEaXNwbGF5TWFzdGVyLHk7aWYod2kodCksZSE9PXZvaWQgMCl7dmFyIFQ9dC5hb0NvbHVtbnNbZV07eT1be3NyYzplLGNvbDplLGRpcjpyLGluZGV4OjAsdHlwZTpULnNUeXBlLGZvcm1hdHRlcjpjW1Quc1R5cGUrIi1wcmUiXSxzb3J0ZXI6Y1tULnNUeXBlKyItIityXX1dLG09bS5zbGljZSgpfWVsc2UgeT1Bbih0KTtmb3Iobj0wLHM9eS5sZW5ndGg7bjxzO24rKyliPXlbbl0sY2wodCxiLmNvbCk7aWYoQmUodCkhPSJzc3AiJiZ5Lmxlbmd0aCE9PTApe2ZvcihuPTAsYT1tLmxlbmd0aDtuPGE7bisrKWxbbl09bjt5Lmxlbmd0aCYmeVswXS5kaXI9PT0iZGVzYyImJmwucmV2ZXJzZSgpLG0uc29ydChmdW5jdGlvbih3LGspe3ZhciBQLEYsaCxvLGYsQz15Lmxlbmd0aCxCPXBbd10uX2FTb3J0RGF0YSx1PXBba10uX2FTb3J0RGF0YTtmb3IoaD0wO2g8QztoKyspaWYoZj15W2hdLFA9QltmLmNvbF0sRj11W2YuY29sXSxmLnNvcnRlcil7aWYobz1mLnNvcnRlcihQLEYpLG8hPT0wKXJldHVybiBvfWVsc2UgaWYobz1QPEY/LTE6UD5GPzE6MCxvIT09MClyZXR1cm4gZi5kaXI9PT0iYXNjIj9vOi1vO3JldHVybiBQPWxbd10sRj1sW2tdLFA8Rj8tMTpQPkY/MTowfSl9ZWxzZSB5Lmxlbmd0aD09PTAmJm0uc29ydChmdW5jdGlvbih3LGspe3JldHVybiB3PGs/LTE6dz5rPzE6MH0pO3JldHVybiBlPT09dm9pZCAwJiYodC5iU29ydGVkPSEwLFp0KHQsbnVsbCwib3JkZXIiLFt0LHldKSksbX1mdW5jdGlvbiB1bCh0LGUscixuKXt2YXIgcz10LmFvQ29sdW1uc1tlXSxhPXQuYWFTb3J0aW5nLGw9cy5hc1NvcnRpbmcsYyxwPWZ1bmN0aW9uKG0seSl7dmFyIFQ9bS5faWR4O3JldHVybiBUPT09dm9pZCAwJiYoVD1sLmluZGV4T2YobVsxXSkpLFQrMTxsLmxlbmd0aD9UKzE6eT9udWxsOjB9O2lmKCFzLmJTb3J0YWJsZSlyZXR1cm4hMTtpZih0eXBlb2YgYVswXT09Im51bWJlciImJihhPXQuYWFTb3J0aW5nPVthXSksKG58fHIpJiZ0Lm9GZWF0dXJlcy5iU29ydE11bHRpKXt2YXIgYj14ZShhLCIwIikuaW5kZXhPZihlKTtiIT09LTE/KGM9cChhW2JdLCEwKSxjPT09bnVsbCYmYS5sZW5ndGg9PT0xJiYoYz0wKSxjPT09bnVsbD9hLnNwbGljZShiLDEpOihhW2JdWzFdPWxbY10sYVtiXS5faWR4PWMpKTpuPyhhLnB1c2goW2UsbFswXSwwXSksYVthLmxlbmd0aC0xXS5faWR4PTApOihhLnB1c2goW2UsYVswXVsxXSwwXSksYVthLmxlbmd0aC0xXS5faWR4PTApfWVsc2UgYS5sZW5ndGgmJmFbMF1bMF09PWU/KGM9cChhWzBdKSxhLmxlbmd0aD0xLGFbMF1bMV09bFtjXSxhWzBdLl9pZHg9Yyk6KGEubGVuZ3RoPTAsYS5wdXNoKFtlLGxbMF1dKSxhWzBdLl9pZHg9MCl9ZnVuY3Rpb24gZmkodCl7dmFyIGU9dC5hTGFzdFNvcnQscj10Lm9DbGFzc2VzLm9yZGVyLnBvc2l0aW9uLG49QW4odCkscz10Lm9GZWF0dXJlcyxhLGwsYztpZihzLmJTb3J0JiZzLmJTb3J0Q2xhc3Nlcyl7Zm9yKGE9MCxsPWUubGVuZ3RoO2E8bDthKyspYz1lW2FdLnNyYyxXKHhlKHQuYW9EYXRhLCJhbkNlbGxzIixjKSkucmVtb3ZlQ2xhc3MocisoYTwyP2ErMTozKSk7Zm9yKGE9MCxsPW4ubGVuZ3RoO2E8bDthKyspYz1uW2FdLnNyYyxXKHhlKHQuYW9EYXRhLCJhbkNlbGxzIixjKSkuYWRkQ2xhc3MocisoYTwyP2ErMTozKSl9dC5hTGFzdFNvcnQ9bn1mdW5jdGlvbiBjbCh0LGUpe3ZhciByPXQuYW9Db2x1bW5zW2VdLG49dnQuZXh0Lm9yZGVyW3Iuc1NvcnREYXRhVHlwZV0scztuJiYocz1uLmNhbGwodC5vSW5zdGFuY2UsdCxlLCRyKHQsZSkpKTtmb3IodmFyIGEsbCxjPXZ0LmV4dC50eXBlLm9yZGVyW3Iuc1R5cGUrIi1wcmUiXSxwPXQuYW9EYXRhLGI9MDtiPHAubGVuZ3RoO2IrKylwW2JdJiYoYT1wW2JdLGEuX2FTb3J0RGF0YXx8KGEuX2FTb3J0RGF0YT1bXSksKCFhLl9hU29ydERhdGFbZV18fG4pJiYobD1uP3NbYl06TmUodCxiLGUsInNvcnQiKSxhLl9hU29ydERhdGFbZV09Yz9jKGwsdCk6bCkpfWZ1bmN0aW9uIEluKHQpe2lmKCF0Ll9iTG9hZGluZ1N0YXRlKXt2YXIgZT17dGltZTorbmV3IERhdGUsc3RhcnQ6dC5faURpc3BsYXlTdGFydCxsZW5ndGg6dC5faURpc3BsYXlMZW5ndGgsb3JkZXI6Vy5leHRlbmQoITAsW10sdC5hYVNvcnRpbmcpLHNlYXJjaDpXLmV4dGVuZCh7fSx0Lm9QcmV2aW91c1NlYXJjaCksY29sdW1uczp0LmFvQ29sdW1ucy5tYXAoZnVuY3Rpb24ocixuKXtyZXR1cm57dmlzaWJsZTpyLmJWaXNpYmxlLHNlYXJjaDpXLmV4dGVuZCh7fSx0LmFvUHJlU2VhcmNoQ29sc1tuXSl9fSl9O3Qub1NhdmVkU3RhdGU9ZSxadCh0LCJhb1N0YXRlU2F2ZVBhcmFtcyIsInN0YXRlU2F2ZVBhcmFtcyIsW3QsZV0pLHQub0ZlYXR1cmVzLmJTdGF0ZVNhdmUmJiF0LmJEZXN0cm95aW5nJiZ0LmZuU3RhdGVTYXZlQ2FsbGJhY2suY2FsbCh0Lm9JbnN0YW5jZSx0LGUpfX1mdW5jdGlvbiBmbCh0LGUscil7aWYoIXQub0ZlYXR1cmVzLmJTdGF0ZVNhdmUpe3IoKTtyZXR1cm59dmFyIG49ZnVuY3Rpb24oYSl7aGkodCxhLHIpfSxzPXQuZm5TdGF0ZUxvYWRDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsbik7cmV0dXJuIHMhPT12b2lkIDAmJmhpKHQscyxyKSwhMH1mdW5jdGlvbiBoaSh0LGUscil7dmFyIG4scyxhPXQuYW9Db2x1bW5zO3QuX2JMb2FkaW5nU3RhdGU9ITA7dmFyIGw9dC5fYkluaXRDb21wbGV0ZT9uZXcgdnQuQXBpKHQpOm51bGw7aWYoIWV8fCFlLnRpbWUpe3QuX2JMb2FkaW5nU3RhdGU9ITEscigpO3JldHVybn12YXIgYz10LmlTdGF0ZUR1cmF0aW9uO2lmKGM+MCYmZS50aW1lPCtuZXcgRGF0ZS1jKjFlMyl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxyKCk7cmV0dXJufXZhciBwPVp0KHQsImFvU3RhdGVMb2FkUGFyYW1zIiwic3RhdGVMb2FkUGFyYW1zIixbdCxlXSk7aWYocC5pbmRleE9mKCExKSE9PS0xKXt0Ll9iTG9hZGluZ1N0YXRlPSExLHIoKTtyZXR1cm59aWYoZS5jb2x1bW5zJiZhLmxlbmd0aCE9PWUuY29sdW1ucy5sZW5ndGgpe3QuX2JMb2FkaW5nU3RhdGU9ITEscigpO3JldHVybn1pZih0Lm9Mb2FkZWRTdGF0ZT1XLmV4dGVuZCghMCx7fSxlKSxadCh0LG51bGwsInN0YXRlTG9hZEluaXQiLFt0LGVdLCEwKSxlLmxlbmd0aCE9PXZvaWQgMCYmKGw/bC5wYWdlLmxlbihlLmxlbmd0aCk6dC5faURpc3BsYXlMZW5ndGg9ZS5sZW5ndGgpLGUuc3RhcnQhPT12b2lkIDAmJihsPT09bnVsbD8odC5faURpc3BsYXlTdGFydD1lLnN0YXJ0LHQuaUluaXREaXNwbGF5U3RhcnQ9ZS5zdGFydCk6U2kodCxlLnN0YXJ0L3QuX2lEaXNwbGF5TGVuZ3RoKSksZS5vcmRlciE9PXZvaWQgMCYmKHQuYWFTb3J0aW5nPVtdLFcuZWFjaChlLm9yZGVyLGZ1bmN0aW9uKG0seSl7dC5hYVNvcnRpbmcucHVzaCh5WzBdPj1hLmxlbmd0aD9bMCx5WzFdXTp5KX0pKSxlLnNlYXJjaCE9PXZvaWQgMCYmVy5leHRlbmQodC5vUHJldmlvdXNTZWFyY2gsZS5zZWFyY2gpLGUuY29sdW1ucyl7Zm9yKG49MCxzPWUuY29sdW1ucy5sZW5ndGg7bjxzO24rKyl7dmFyIGI9ZS5jb2x1bW5zW25dO2IudmlzaWJsZSE9PXZvaWQgMCYmKGw/bC5jb2x1bW4obikudmlzaWJsZShiLnZpc2libGUsITEpOmFbbl0uYlZpc2libGU9Yi52aXNpYmxlKSxiLnNlYXJjaCE9PXZvaWQgMCYmVy5leHRlbmQodC5hb1ByZVNlYXJjaENvbHNbbl0sYi5zZWFyY2gpfWwmJmwuY29sdW1ucy5hZGp1c3QoKX10Ll9iTG9hZGluZ1N0YXRlPSExLFp0KHQsImFvU3RhdGVMb2FkZWQiLCJzdGF0ZUxvYWRlZCIsW3QsZV0pLHIoKX1mdW5jdGlvbiBQZSh0LGUscixuKXtpZihyPSJEYXRhVGFibGVzIHdhcm5pbmc6ICIrKHQ/InRhYmxlIGlkPSIrdC5zVGFibGVJZCsiIC0gIjoiIikrcixuJiYocis9Ii4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlcnJvciwgcGxlYXNlIHNlZSBodHRwczovL2RhdGF0YWJsZXMubmV0L3RuLyIrbiksZSl3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKHIpO2Vsc2V7dmFyIHM9dnQuZXh0LGE9cy5zRXJyTW9kZXx8cy5lcnJNb2RlO2lmKHQmJlp0KHQsbnVsbCwiZHQtZXJyb3IiLFt0LG4scl0sITApLGE9PSJhbGVydCIpYWxlcnQocik7ZWxzZXtpZihhPT0idGhyb3ciKXRocm93IG5ldyBFcnJvcihyKTt0eXBlb2YgYT09ImZ1bmN0aW9uIiYmYSh0LG4scil9fX1mdW5jdGlvbiBucih0LGUscixuKXtpZihBcnJheS5pc0FycmF5KHIpKXtXLmVhY2gocixmdW5jdGlvbihzLGEpe0FycmF5LmlzQXJyYXkoYSk/bnIodCxlLGFbMF0sYVsxXSk6bnIodCxlLGEpfSk7cmV0dXJufW49PT12b2lkIDAmJihuPXIpLGVbcl0hPT12b2lkIDAmJih0W25dPWVbcl0pfWZ1bmN0aW9uIE9hKHQsZSxyKXt2YXIgbjtmb3IodmFyIHMgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmKG49ZVtzXSxXLmlzUGxhaW5PYmplY3Qobik/KFcuaXNQbGFpbk9iamVjdCh0W3NdKXx8KHRbc109e30pLFcuZXh0ZW5kKCEwLHRbc10sbikpOnImJnMhPT0iZGF0YSImJnMhPT0iYWFEYXRhIiYmQXJyYXkuaXNBcnJheShuKT90W3NdPW4uc2xpY2UoKTp0W3NdPW4pO3JldHVybiB0fWZ1bmN0aW9uIGlzKHQsZSxyKXtXKHQpLm9uKCJjbGljay5EVCIsZSxmdW5jdGlvbihuKXtyKG4pfSkub24oImtleXByZXNzLkRUIixlLGZ1bmN0aW9uKG4pe24ud2hpY2g9PT0xMyYmKG4ucHJldmVudERlZmF1bHQoKSxyKG4pKX0pLm9uKCJzZWxlY3RzdGFydC5EVCIsZSxmdW5jdGlvbigpe3JldHVybiExfSl9ZnVuY3Rpb24gQWUodCxlLHIpe3ImJnRbZV0ucHVzaChyKX1mdW5jdGlvbiBadCh0LGUscixuLHMpe3ZhciBhPVtdO2lmKGUmJihhPXRbZV0uc2xpY2UoKS5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKHApe3JldHVybiBwLmFwcGx5KHQub0luc3RhbmNlLG4pfSkpLHIhPT1udWxsKXt2YXIgbD1XLkV2ZW50KHIrIi5kdCIpLGM9Vyh0Lm5UYWJsZSk7bC5kdD10LmFwaSxjW3M/InRyaWdnZXIiOiJ0cmlnZ2VySGFuZGxlciJdKGwsbikscyYmYy5wYXJlbnRzKCJib2R5IikubGVuZ3RoPT09MCYmVygiYm9keSIpLnRyaWdnZXIobCxuKSxhLnB1c2gobC5yZXN1bHQpfXJldHVybiBhfWZ1bmN0aW9uIGFzKHQpe3ZhciBlPXQuX2lEaXNwbGF5U3RhcnQscj10LmZuRGlzcGxheUVuZCgpLG49dC5faURpc3BsYXlMZW5ndGg7ZT49ciYmKGU9ci1uKSxlLT1lJW4sKG49PT0tMXx8ZTwwKSYmKGU9MCksdC5faURpc3BsYXlTdGFydD1lfWZ1bmN0aW9uIHhuKHQsZSl7dmFyIHI9dC5yZW5kZXJlcixuPXZ0LmV4dC5yZW5kZXJlcltlXTtyZXR1cm4gVy5pc1BsYWluT2JqZWN0KHIpJiZyW2VdP25bcltlXV18fG4uXzp0eXBlb2Ygcj09InN0cmluZyImJm5bcl18fG4uX31mdW5jdGlvbiBCZSh0KXtyZXR1cm4gdC5vRmVhdHVyZXMuYlNlcnZlclNpZGU/InNzcCI6dC5hamF4PyJhamF4IjoiZG9tIn1mdW5jdGlvbiBBaSh0LGUscil7dmFyIG49dC5mbkZvcm1hdE51bWJlcixzPXQuX2lEaXNwbGF5U3RhcnQrMSxhPXQuX2lEaXNwbGF5TGVuZ3RoLGw9dC5mblJlY29yZHNEaXNwbGF5KCksYz10LmZuUmVjb3Jkc1RvdGFsKCkscD1hPT09LTE7cmV0dXJuIGUucmVwbGFjZSgvX1NUQVJUXy9nLG4uY2FsbCh0LHMpKS5yZXBsYWNlKC9fRU5EXy9nLG4uY2FsbCh0LHQuZm5EaXNwbGF5RW5kKCkpKS5yZXBsYWNlKC9fTUFYXy9nLG4uY2FsbCh0LGMpKS5yZXBsYWNlKC9fVE9UQUxfL2csbi5jYWxsKHQsbCkpLnJlcGxhY2UoL19QQUdFXy9nLG4uY2FsbCh0LHA/MTpNYXRoLmNlaWwocy9hKSkpLnJlcGxhY2UoL19QQUdFU18vZyxuLmNhbGwodCxwPzE6TWF0aC5jZWlsKGwvYSkpKS5yZXBsYWNlKC9fRU5UUklFU18vZyx0LmFwaS5pMThuKCJlbnRyaWVzIiwiIixyKSkucmVwbGFjZSgvX0VOVFJJRVMtTUFYXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLGMpKS5yZXBsYWNlKC9fRU5UUklFUy1UT1RBTF8vZyx0LmFwaS5pMThuKCJlbnRyaWVzIiwiIixsKSl9dmFyIElpPVtdLGZlPUFycmF5LnByb3RvdHlwZSxobD1mdW5jdGlvbih0KXt2YXIgZSxyLG49dnQuc2V0dGluZ3Mscz14ZShuLCJuVGFibGUiKTtpZih0KXtpZih0Lm5UYWJsZSYmdC5vRmVhdHVyZXMpcmV0dXJuW3RdO2lmKHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0YWJsZSIpcmV0dXJuIGU9cy5pbmRleE9mKHQpLGUhPT0tMT9bbltlXV06bnVsbDtpZih0JiZ0eXBlb2YgdC5zZXR0aW5ncz09ImZ1bmN0aW9uIilyZXR1cm4gdC5zZXR0aW5ncygpLnRvQXJyYXkoKTt0eXBlb2YgdD09InN0cmluZyI/cj1XKHQpLmdldCgpOnQgaW5zdGFuY2VvZiBXJiYocj10LmdldCgpKX1lbHNlIHJldHVybltdO2lmKHIpcmV0dXJuIG4uZmlsdGVyKGZ1bmN0aW9uKGEsbCl7cmV0dXJuIHIuaW5jbHVkZXMoc1tsXSl9KX07V3Q9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBXdCkpcmV0dXJuIG5ldyBXdCh0LGUpO3ZhciByPVtdLG49ZnVuY3Rpb24obCl7dmFyIGM9aGwobCk7YyYmci5wdXNoLmFwcGx5KHIsYyl9O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBzPTAsYT10Lmxlbmd0aDtzPGE7cysrKW4odFtzXSk7ZWxzZSBuKHQpO3RoaXMuY29udGV4dD1yLmxlbmd0aD4xP3ByKHIpOnIsZSYmdGhpcy5wdXNoLmFwcGx5KHRoaXMsZSksdGhpcy5zZWxlY3Rvcj17cm93czpudWxsLGNvbHM6bnVsbCxvcHRzOm51bGx9LFd0LmV4dGVuZCh0aGlzLHRoaXMsSWkpfTt2dC5BcGk9V3Q7Vy5leHRlbmQoV3QucHJvdG90eXBlLHthbnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb3VudCgpIT09MH0sY29udGV4dDpbXSxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXR0ZW4oKS5sZW5ndGh9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aDtlPHI7ZSsrKXQuY2FsbCh0aGlzLHRoaXNbZV0sZSx0aGlzKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiBlLmxlbmd0aD50P25ldyBXdChlW3RdLHRoaXNbdF0pOm51bGx9LGZpbHRlcjpmdW5jdGlvbih0KXt2YXIgZT1mZS5maWx0ZXIuY2FsbCh0aGlzLHQsdGhpcyk7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsZSl9LGZsYXR0ZW46ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCx0LmNvbmNhdC5hcHBseSh0LHRoaXMudG9BcnJheSgpKSl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1t0XX0sam9pbjpmZS5qb2luLGluY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmluZGV4T2YodCkhPT0tMX0saW5kZXhPZjpmZS5pbmRleE9mLGl0ZXJhdG9yOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPVtdLGEsbCxjLHAsYixtPXRoaXMuY29udGV4dCx5LFQsdyxrPXRoaXMuc2VsZWN0b3I7Zm9yKHR5cGVvZiB0PT0ic3RyaW5nIiYmKG49cixyPWUsZT10LHQ9ITEpLGw9MCxjPW0ubGVuZ3RoO2w8YztsKyspe3ZhciBQPW5ldyBXdChtW2xdKTtpZihlPT09InRhYmxlIilhPXIuY2FsbChQLG1bbF0sbCksYSE9PXZvaWQgMCYmcy5wdXNoKGEpO2Vsc2UgaWYoZT09PSJjb2x1bW5zInx8ZT09PSJyb3dzIilhPXIuY2FsbChQLG1bbF0sdGhpc1tsXSxsKSxhIT09dm9pZCAwJiZzLnB1c2goYSk7ZWxzZSBpZihlPT09ImV2ZXJ5Inx8ZT09PSJjb2x1bW4ifHxlPT09ImNvbHVtbi1yb3dzInx8ZT09PSJyb3cifHxlPT09ImNlbGwiKWZvcihUPXRoaXNbbF0sZT09PSJjb2x1bW4tcm93cyImJih5PVBuKG1bbF0say5vcHRzKSkscD0wLGI9VC5sZW5ndGg7cDxiO3ArKyl3PVRbcF0sZT09PSJjZWxsIj9hPXIuY2FsbChQLG1bbF0sdy5yb3csdy5jb2x1bW4sbCxwKTphPXIuY2FsbChQLG1bbF0sdyxsLHAseSksYSE9PXZvaWQgMCYmcy5wdXNoKGEpfWlmKHMubGVuZ3RofHxuKXt2YXIgRj1uZXcgV3QobSx0P3MuY29uY2F0LmFwcGx5KFtdLHMpOnMpLGg9Ri5zZWxlY3RvcjtyZXR1cm4gaC5yb3dzPWsucm93cyxoLmNvbHM9ay5jb2xzLGgub3B0cz1rLm9wdHMsRn1yZXR1cm4gdGhpc30sbGFzdEluZGV4T2Y6ZmUubGFzdEluZGV4T2YsbGVuZ3RoOjAsbWFwOmZ1bmN0aW9uKHQpe3ZhciBlPWZlLm1hcC5jYWxsKHRoaXMsdCx0aGlzKTtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCxlKX0scGx1Y2s6ZnVuY3Rpb24odCl7dmFyIGU9dnQudXRpbC5nZXQodCk7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBlKHIpfSl9LHBvcDpmZS5wb3AscHVzaDpmZS5wdXNoLHJlZHVjZTpmZS5yZWR1Y2UscmVkdWNlUmlnaHQ6ZmUucmVkdWNlUmlnaHQscmV2ZXJzZTpmZS5yZXZlcnNlLHNlbGVjdG9yOm51bGwsc2hpZnQ6ZmUuc2hpZnQsc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCx0aGlzKX0sc29ydDpmZS5zb3J0LHNwbGljZTpmZS5zcGxpY2UsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmZS5zbGljZS5jYWxsKHRoaXMpfSx0byQ6ZnVuY3Rpb24oKXtyZXR1cm4gVyh0aGlzKX0sdG9KUXVlcnk6ZnVuY3Rpb24oKXtyZXR1cm4gVyh0aGlzKX0sdW5pcXVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQscHIodGhpcy50b0FycmF5KCkpKX0sdW5zaGlmdDpmZS51bnNoaWZ0fSk7ZnVuY3Rpb24gcGwodCxlLHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodHx8dGhpcyxhcmd1bWVudHMpO3JldHVybiBXdC5leHRlbmQobixuLHIubWV0aG9kRXh0KSxufX1mdW5jdGlvbiBibCh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdLm5hbWU9PT1lKXJldHVybiB0W3JdO3JldHVybiBudWxsfXdpbmRvdy5fX2FwaVN0cnVjdD1JaTtXdC5leHRlbmQ9ZnVuY3Rpb24odCxlLHIpe2lmKCEoIXIubGVuZ3RofHwhZXx8IShlIGluc3RhbmNlb2YgV3QpJiYhZS5fX2R0X3dyYXBwZXIpKXt2YXIgbixzLGE7Zm9yKG49MCxzPXIubGVuZ3RoO248cztuKyspYT1yW25dLGEubmFtZSE9PSJfX3Byb3RvX18iJiYoZVthLm5hbWVdPWEudHlwZT09PSJmdW5jdGlvbiI/cGwodCxhLnZhbCxhKTphLnR5cGU9PT0ib2JqZWN0Ij97fTphLnZhbCxlW2EubmFtZV0uX19kdF93cmFwcGVyPSEwLFd0LmV4dGVuZCh0LGVbYS5uYW1lXSxhLnByb3BFeHQpKX19O1d0LnJlZ2lzdGVyPUl0PWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKVd0LnJlZ2lzdGVyKHRbcl0sZSk7cmV0dXJufXZhciBzLGEsbD10LnNwbGl0KCIuIiksYz1JaSxwLGI7Zm9yKHM9MCxhPWwubGVuZ3RoO3M8YTtzKyspe2I9bFtzXS5pbmRleE9mKCIoKSIpIT09LTEscD1iP2xbc10ucmVwbGFjZSgiKCkiLCIiKTpsW3NdO3ZhciBtPWJsKGMscCk7bXx8KG09e25hbWU6cCx2YWw6e30sbWV0aG9kRXh0OltdLHByb3BFeHQ6W10sdHlwZToib2JqZWN0In0sYy5wdXNoKG0pKSxzPT09YS0xPyhtLnZhbD1lLG0udHlwZT10eXBlb2YgZT09ImZ1bmN0aW9uIj8iZnVuY3Rpb24iOlcuaXNQbGFpbk9iamVjdChlKT8ib2JqZWN0Ijoib3RoZXIiKTpjPWI/bS5tZXRob2RFeHQ6bS5wcm9wRXh0fX07V3QucmVnaXN0ZXJQbHVyYWw9UXQ9ZnVuY3Rpb24odCxlLHIpe1d0LnJlZ2lzdGVyKHQsciksV3QucmVnaXN0ZXIoZSxmdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuPT09dGhpcz90aGlzOm4gaW5zdGFuY2VvZiBXdD9uLmxlbmd0aD9BcnJheS5pc0FycmF5KG5bMF0pP25ldyBXdChuLmNvbnRleHQsblswXSk6blswXTp2b2lkIDA6bn0pfTt2YXIgc3M9ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcj1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHMpe3ZhciBhPXNzKHMsZSk7ci5wdXNoLmFwcGx5KHIsYSl9KSxyLmZpbHRlcihmdW5jdGlvbihzKXtyZXR1cm4gc30pfWlmKHR5cGVvZiB0PT0ibnVtYmVyIilyZXR1cm5bZVt0XV07dmFyIG49ZS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHMublRhYmxlfSk7cmV0dXJuIFcobikuZmlsdGVyKHQpLm1hcChmdW5jdGlvbigpe3ZhciBzPW4uaW5kZXhPZih0aGlzKTtyZXR1cm4gZVtzXX0pLnRvQXJyYXkoKX07SXQoInRhYmxlcygpIixmdW5jdGlvbih0KXtyZXR1cm4gdCE9bnVsbD9uZXcgV3Qoc3ModCx0aGlzLmNvbnRleHQpKTp0aGlzfSk7SXQoInRhYmxlKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudGFibGVzKHQpLHI9ZS5jb250ZXh0O3JldHVybiByLmxlbmd0aD9uZXcgV3QoclswXSk6ZX0pO1tbIm5vZGVzIiwibm9kZSIsIm5UYWJsZSJdLFsiYm9keSIsImJvZHkiLCJuVEJvZHkiXSxbImhlYWRlciIsImhlYWRlciIsIm5USGVhZCJdLFsiZm9vdGVyIiwiZm9vdGVyIiwiblRGb290Il1dLmZvckVhY2goZnVuY3Rpb24odCl7UXQoInRhYmxlcygpLiIrdFswXSsiKCkiLCJ0YWJsZSgpLiIrdFsxXSsiKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtyZXR1cm4gZVt0WzJdXX0sMSl9KX0pO1tbImhlYWRlciIsImFvSGVhZGVyIl0sWyJmb290ZXIiLCJhb0Zvb3RlciJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0l0KCJ0YWJsZSgpLiIrdFswXSsiLnN0cnVjdHVyZSgpIixmdW5jdGlvbihlKXt2YXIgcj10aGlzLmNvbHVtbnMoZSkuaW5kZXhlcygpLmZsYXR0ZW4oKSxuPXRoaXMuY29udGV4dFswXTtyZXR1cm4gS2EobixuW3RbMV1dLHIpfSl9KTtRdCgidGFibGVzKCkuY29udGFpbmVycygpIiwidGFibGUoKS5jb250YWluZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5UYWJsZVdyYXBwZXJ9LDEpfSk7SXQoInRhYmxlcygpLmV2ZXJ5KCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyLG4pe3QuY2FsbChlLnRhYmxlKG4pLG4pfSl9KTtJdCgiY2FwdGlvbigpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuY29udGV4dDtpZih0PT09dm9pZCAwKXt2YXIgbj1yWzBdLmNhcHRpb25Ob2RlO3JldHVybiBuJiZyLmxlbmd0aD9uLmlubmVySFRNTDpudWxsfXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocyl7dmFyIGE9VyhzLm5UYWJsZSksbD1XKHMuY2FwdGlvbk5vZGUpLGM9VyhzLm5UYWJsZVdyYXBwZXIpO2lmKGwubGVuZ3RofHwobD1XKCI8Y2FwdGlvbi8+IikuaHRtbCh0KSxzLmNhcHRpb25Ob2RlPWxbMF0sZXx8KGEucHJlcGVuZChsKSxlPWwuY3NzKCJjYXB0aW9uLXNpZGUiKSkpLGwuaHRtbCh0KSxlJiYobC5jc3MoImNhcHRpb24tc2lkZSIsZSksbFswXS5fY2FwdGlvblNpZGU9ZSksYy5maW5kKCJkaXYuZGF0YVRhYmxlc19zY3JvbGwiKS5sZW5ndGgpe3ZhciBwPWU9PT0idG9wIj8iSGVhZCI6IkZvb3QiO2MuZmluZCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsIitwKyIgdGFibGUiKS5wcmVwZW5kKGwpfWVsc2UgYS5wcmVwZW5kKGwpfSwxKX0pO0l0KCJjYXB0aW9uLm5vZGUoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHQ7cmV0dXJuIHQubGVuZ3RoP3RbMF0uY2FwdGlvbk5vZGU6bnVsbH0pO0l0KCJkcmF3KCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7dD09PSJwYWdlIj9GcihlKToodHlwZW9mIHQ9PSJzdHJpbmciJiYodD10IT09ImZ1bGwtaG9sZCIpLFByKGUsdD09PSExKSl9KX0pO0l0KCJwYWdlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMucGFnZS5pbmZvKCkucGFnZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7U2koZSx0KX0pfSk7SXQoInBhZ2UuaW5mbygpIixmdW5jdGlvbigpe2lmKHRoaXMuY29udGV4dC5sZW5ndGghPT0wKXt2YXIgdD10aGlzLmNvbnRleHRbMF0sZT10Ll9pRGlzcGxheVN0YXJ0LHI9dC5vRmVhdHVyZXMuYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLG49dC5mblJlY29yZHNEaXNwbGF5KCkscz1yPT09LTE7cmV0dXJue3BhZ2U6cz8wOk1hdGguZmxvb3IoZS9yKSxwYWdlczpzPzE6TWF0aC5jZWlsKG4vciksc3RhcnQ6ZSxlbmQ6dC5mbkRpc3BsYXlFbmQoKSxsZW5ndGg6cixyZWNvcmRzVG90YWw6dC5mblJlY29yZHNUb3RhbCgpLHJlY29yZHNEaXNwbGF5Om4sc2VydmVyU2lkZTpCZSh0KT09PSJzc3AifX19KTtJdCgicGFnZS5sZW4oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0Lmxlbmd0aCE9PTA/dGhpcy5jb250ZXh0WzBdLl9pRGlzcGxheUxlbmd0aDp2b2lkIDA6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe1FhKGUsdCl9KX0pO3ZhciBvcz1mdW5jdGlvbih0LGUscil7aWYocil7dmFyIG49bmV3IFd0KHQpO24ub25lKCJkcmF3IixmdW5jdGlvbigpe3Iobi5hamF4Lmpzb24oKSl9KX1pZihCZSh0KT09InNzcCIpUHIodCxlKTtlbHNle0ZlKHQsITApO3ZhciBzPXQuanFYSFI7cyYmcy5yZWFkeVN0YXRlIT09NCYmcy5hYm9ydCgpLGtpKHQse30sZnVuY3Rpb24oYSl7Q2kodCk7Zm9yKHZhciBsPURuKHQsYSksYz0wLHA9bC5sZW5ndGg7YzxwO2MrKylicih0LGxbY10pO1ByKHQsZSksd24odCksRmUodCwhMSl9KX19O0l0KCJhamF4Lmpzb24oKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHQ7aWYodC5sZW5ndGg+MClyZXR1cm4gdFswXS5qc29ufSk7SXQoImFqYXgucGFyYW1zKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoPjApcmV0dXJuIHRbMF0ub0FqYXhEYXRhfSk7SXQoImFqYXgucmVsb2FkKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtvcyhyLGU9PT0hMSx0KX0pfSk7SXQoImFqYXgudXJsKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9lLmxlbmd0aD09PTA/dm9pZCAwOihlPWVbMF0sVy5pc1BsYWluT2JqZWN0KGUuYWpheCk/ZS5hamF4LnVybDplLmFqYXgpOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtXLmlzUGxhaW5PYmplY3Qoci5hamF4KT9yLmFqYXgudXJsPXQ6ci5hamF4PXR9KX0pO0l0KCJhamF4LnVybCgpLmxvYWQoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe29zKHIsZT09PSExLHQpfSl9KTt2YXIgUGk9ZnVuY3Rpb24odCxlLHIsbixzKXt2YXIgYT1bXSxsLGMscCxiLG0seSxUPXR5cGVvZiBlO2ZvcigoIWV8fFQ9PT0ic3RyaW5nInx8VD09PSJmdW5jdGlvbiJ8fGUubGVuZ3RoPT09dm9pZCAwKSYmKGU9W2VdKSxwPTAsYj1lLmxlbmd0aDtwPGI7cCsrKWZvcihjPWVbcF0mJmVbcF0uc3BsaXQmJiFlW3BdLm1hdGNoKC9bWyg6XS8pP2VbcF0uc3BsaXQoIiwiKTpbZVtwXV0sbT0wLHk9Yy5sZW5ndGg7bTx5O20rKylsPXIodHlwZW9mIGNbbV09PSJzdHJpbmciP2NbbV0udHJpbSgpOmNbbV0pLGw9bC5maWx0ZXIoZnVuY3Rpb24oayl7cmV0dXJuIGshPW51bGx9KSxsJiZsLmxlbmd0aCYmKGE9YS5jb25jYXQobCkpO3ZhciB3PW9lLnNlbGVjdG9yW3RdO2lmKHcubGVuZ3RoKWZvcihwPTAsYj13Lmxlbmd0aDtwPGI7cCsrKWE9d1twXShuLHMsYSk7cmV0dXJuIHByKGEpfSxGaT1mdW5jdGlvbih0KXtyZXR1cm4gdHx8KHQ9e30pLHQuZmlsdGVyJiZ0LnNlYXJjaD09PXZvaWQgMCYmKHQuc2VhcmNoPXQuZmlsdGVyKSxXLmV4dGVuZCh7c2VhcmNoOiJub25lIixvcmRlcjoiY3VycmVudCIscGFnZToiYWxsIn0sdCl9LEJpPWZ1bmN0aW9uKHQpe2xldCBlPW5ldyBXdCh0LmNvbnRleHRbMF0pO3JldHVybiB0Lmxlbmd0aCYmZS5wdXNoKHRbMF0pLGUuc2VsZWN0b3I9dC5zZWxlY3RvcixlLmxlbmd0aCYmZVswXS5sZW5ndGg+MSYmZVswXS5zcGxpY2UoMSksZX0sUG49ZnVuY3Rpb24odCxlKXt2YXIgcixuLHMsYT1bXSxsPXQuYWlEaXNwbGF5LGM9dC5haURpc3BsYXlNYXN0ZXIscD1lLnNlYXJjaCxiPWUub3JkZXIsbT1lLnBhZ2U7aWYobT09ImN1cnJlbnQiKWZvcihyPXQuX2lEaXNwbGF5U3RhcnQsbj10LmZuRGlzcGxheUVuZCgpO3I8bjtyKyspYS5wdXNoKGxbcl0pO2Vsc2UgaWYoYj09ImN1cnJlbnQifHxiPT0iYXBwbGllZCIpe2lmKHA9PSJub25lIilhPWMuc2xpY2UoKTtlbHNlIGlmKHA9PSJhcHBsaWVkIilhPWwuc2xpY2UoKTtlbHNlIGlmKHA9PSJyZW1vdmVkIil7dmFyIHk9e307Zm9yKHI9MCxuPWwubGVuZ3RoO3I8bjtyKyspeVtsW3JdXT1udWxsO2MuZm9yRWFjaChmdW5jdGlvbih3KXtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSx3KXx8YS5wdXNoKHcpfSl9fWVsc2UgaWYoYj09ImluZGV4Inx8Yj09Im9yaWdpbmFsIilmb3Iocj0wLG49dC5hb0RhdGEubGVuZ3RoO3I8bjtyKyspdC5hb0RhdGFbcl0mJihwPT0ibm9uZSI/YS5wdXNoKHIpOihzPWwuaW5kZXhPZihyKSwocz09PS0xJiZwPT0icmVtb3ZlZCJ8fHM+PTAmJnA9PSJhcHBsaWVkIikmJmEucHVzaChyKSkpO2Vsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiKXt2YXIgVD1EaSh0LGIsImFzYyIpO2lmKHA9PT0ibm9uZSIpYT1UO2Vsc2UgZm9yKHI9MDtyPFQubGVuZ3RoO3IrKylzPWwuaW5kZXhPZihUW3JdKSwocz09PS0xJiZwPT0icmVtb3ZlZCJ8fHM+PTAmJnA9PSJhcHBsaWVkIikmJmEucHVzaChUW3JdKX1yZXR1cm4gYX0sdmw9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLHM9ZnVuY3Rpb24obCl7dmFyIGM9TWEobCkscD10LmFvRGF0YTtpZihjIT09bnVsbCYmIXIpcmV0dXJuW2NdO2lmKG58fChuPVBuKHQscikpLGMhPT1udWxsJiZuLmluZGV4T2YoYykhPT0tMSlyZXR1cm5bY107aWYobD09bnVsbHx8bD09PSIiKXJldHVybiBuO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXJldHVybiBuLm1hcChmdW5jdGlvbihrKXt2YXIgUD1wW2tdO3JldHVybiBsKGssUC5fYURhdGEsUC5uVHIpP2s6bnVsbH0pO2lmKGwubm9kZU5hbWUpe3ZhciBiPWwuX0RUX1Jvd0luZGV4LG09bC5fRFRfQ2VsbEluZGV4O2lmKGIhPT12b2lkIDApcmV0dXJuIHBbYl0mJnBbYl0ublRyPT09bD9bYl06W107aWYobSlyZXR1cm4gcFttLnJvd10mJnBbbS5yb3ddLm5Ucj09PWwucGFyZW50Tm9kZT9bbS5yb3ddOltdO3ZhciB5PVcobCkuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKTtyZXR1cm4geS5sZW5ndGg/W3kuZGF0YSgiZHQtcm93IildOltdfWlmKHR5cGVvZiBsPT0ic3RyaW5nIiYmbC5jaGFyQXQoMCk9PT0iIyIpe3ZhciBUPXQuYUlkc1tsLnJlcGxhY2UoL14jLywiIildO2lmKFQhPT12b2lkIDApcmV0dXJuW1QuaWR4XX12YXIgdz1XYShYcih0LmFvRGF0YSxuLCJuVHIiKSk7cmV0dXJuIFcodykuZmlsdGVyKGwpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLl9EVF9Sb3dJbmRleH0pLnRvQXJyYXkoKX0sYT1QaSgicm93IixlLHMsdCxyKTtyZXR1cm4oci5vcmRlcj09PSJjdXJyZW50Inx8ci5vcmRlcj09PSJhcHBsaWVkIikmJm5zKHQsYSksYX07SXQoInJvd3MoKSIsZnVuY3Rpb24odCxlKXt0PT09dm9pZCAwP3Q9IiI6Vy5pc1BsYWluT2JqZWN0KHQpJiYoZT10LHQ9IiIpLGU9RmkoZSk7dmFyIHI9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4pe3JldHVybiB2bChuLHQsZSl9LDEpO3JldHVybiByLnNlbGVjdG9yLnJvd3M9dCxyLnNlbGVjdG9yLm9wdHM9ZSxyfSk7SXQoInJvd3MoKS5ub2RlcygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9EYXRhW2VdLm5Ucnx8dm9pZCAwfSwxKX0pO0l0KCJyb3dzKCkuZGF0YSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCEwLCJyb3dzIixmdW5jdGlvbih0LGUpe3JldHVybiBYcih0LmFvRGF0YSxlLCJfYURhdGEiKX0sMSl9KTtRdCgicm93cygpLmNhY2hlKCkiLCJyb3coKS5jYWNoZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihlLHIpe3ZhciBuPWUuYW9EYXRhW3JdO3JldHVybiB0PT09InNlYXJjaCI/bi5fYUZpbHRlckRhdGE6bi5fYVNvcnREYXRhfSwxKX0pO1F0KCJyb3dzKCkuaW52YWxpZGF0ZSgpIiwicm93KCkuaW52YWxpZGF0ZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihlLHIpe1NuKGUscix0KX0pfSk7UXQoInJvd3MoKS5pbmRleGVzKCkiLCJyb3coKS5pbmRleCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9LDEpfSk7UXQoInJvd3MoKS5pZHMoKSIsInJvdygpLmlkKCkiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPXRoaXMuY29udGV4dCxuPTAscz1yLmxlbmd0aDtuPHM7bisrKWZvcih2YXIgYT0wLGw9dGhpc1tuXS5sZW5ndGg7YTxsO2ErKyl7dmFyIGM9cltuXS5yb3dJZEZuKHJbbl0uYW9EYXRhW3RoaXNbbl1bYV1dLl9hRGF0YSk7ZS5wdXNoKCh0PT09ITA/IiMiOiIiKStjKX1yZXR1cm4gbmV3IFd0KHIsZSl9KTtRdCgicm93cygpLnJlbW92ZSgpIiwicm93KCkucmVtb3ZlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXt2YXIgcj10LmFvRGF0YSxuPXJbZV0scz10LmFpRGlzcGxheU1hc3Rlci5pbmRleE9mKGUpO3MhPT0tMSYmdC5haURpc3BsYXlNYXN0ZXIuc3BsaWNlKHMsMSksdC5faVJlY29yZHNEaXNwbGF5PjAmJnQuX2lSZWNvcmRzRGlzcGxheS0tLGFzKHQpO3ZhciBhPXQucm93SWRGbihuLl9hRGF0YSk7YSE9PXZvaWQgMCYmZGVsZXRlIHQuYUlkc1thXSxyW2VdPW51bGx9KSx0aGlzfSk7SXQoInJvd3MuYWRkKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXt2YXIgcyxhLGwsYz1bXTtmb3IoYT0wLGw9dC5sZW5ndGg7YTxsO2ErKylzPXRbYV0scy5ub2RlTmFtZSYmcy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09IlRSIj9jLnB1c2goX2kobixzKVswXSk6Yy5wdXNoKGJyKG4scykpO3JldHVybiBjfSwxKSxyPXRoaXMucm93cygtMSk7cmV0dXJuIHIucG9wKCksci5wdXNoLmFwcGx5KHIsZSkscn0pO0l0KCJyb3coKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gQmkodGhpcy5yb3dzKHQsZSkpfSk7SXQoInJvdygpLmRhdGEoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O2lmKHQ9PT12b2lkIDApcmV0dXJuIGUubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmdGhpc1swXS5sZW5ndGg/ZVswXS5hb0RhdGFbdGhpc1swXV0uX2FEYXRhOnZvaWQgMDt2YXIgcj1lWzBdLmFvRGF0YVt0aGlzWzBdXTtyZXR1cm4gci5fYURhdGE9dCxBcnJheS5pc0FycmF5KHQpJiZyLm5UciYmci5uVHIuaWQmJmZyKGVbMF0ucm93SWQpKHQsci5uVHIuaWQpLFNuKGVbMF0sdGhpc1swXSwiZGF0YSIpLHRoaXN9KTtJdCgicm93KCkubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0aGlzWzBdLmxlbmd0aCYmdFswXS5hb0RhdGFbdGhpc1swXV0ublRyfHxudWxsfSk7SXQoInJvdy5hZGQoKSIsZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIFcmJnQubGVuZ3RoJiYodD10WzBdKTt2YXIgZT10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PSJUUiI/X2kocix0KVswXTpicihyLHQpfSk7cmV0dXJuIHRoaXMucm93KGVbMF0pfSk7Vyhkb2N1bWVudCkub24oInBsdWdpbi1pbml0LmR0IixmdW5jdGlvbih0LGUpe3ZhciByPW5ldyBXdChlKTtyLm9uKCJzdGF0ZVNhdmVQYXJhbXMuRFQiLGZ1bmN0aW9uKG4scyxhKXtmb3IodmFyIGw9cy5yb3dJZEZuLGM9cy5haURpc3BsYXlNYXN0ZXIscD1bXSxiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBtPWNbYl0seT1zLmFvRGF0YVttXTt5Ll9kZXRhaWxzU2hvdyYmcC5wdXNoKCIjIitsKHkuX2FEYXRhKSl9YS5jaGlsZFJvd3M9cH0pLHIub24oInN0YXRlTG9hZGVkLkRUIixmdW5jdGlvbihuLHMsYSl7UmEocixhKX0pLFJhKHIsci5zdGF0ZS5sb2FkZWQoKSl9KTt2YXIgUmE9ZnVuY3Rpb24odCxlKXtlJiZlLmNoaWxkUm93cyYmdC5yb3dzKGUuY2hpbGRSb3dzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5yZXBsYWNlKC8oPzwhXFwpOi9nLCJcXDoiKX0pKS5ldmVyeShmdW5jdGlvbigpe1p0KHQuc2V0dGluZ3MoKVswXSxudWxsLCJyZXF1ZXN0Q2hpbGQiLFt0aGlzXSl9KX0sbWw9ZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9W10sYT1mdW5jdGlvbihsLGMpe2lmKEFycmF5LmlzQXJyYXkobCl8fGwgaW5zdGFuY2VvZiBXKXtmb3IodmFyIHA9MCxiPWwubGVuZ3RoO3A8YjtwKyspYShsW3BdLGMpO3JldHVybn1pZihsLm5vZGVOYW1lJiZsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idHIiKWwuc2V0QXR0cmlidXRlKCJkYXRhLWR0LXJvdyIsZS5pZHgpLHMucHVzaChsKTtlbHNle3ZhciBtPVcoIjx0cj48dGQ+PC90ZD48L3RyPiIpLmF0dHIoImRhdGEtZHQtcm93IixlLmlkeCkuYWRkQ2xhc3MoYyk7VygidGQiLG0pLmFkZENsYXNzKGMpLmh0bWwobClbMF0uY29sU3Bhbj1rbih0KSxzLnB1c2gobVswXSl9fTthKHIsbiksZS5fZGV0YWlscyYmZS5fZGV0YWlscy5kZXRhY2goKSxlLl9kZXRhaWxzPVcocyksZS5fZGV0YWlsc1Nob3cmJmUuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoZS5uVHIpfSxscz12dC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKHQpe0luKHRbMF0pfSw1MDApLE5pPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5jb250ZXh0O2lmKHIubGVuZ3RoKXt2YXIgbj1yWzBdLmFvRGF0YVtlIT09dm9pZCAwP2U6dFswXV07biYmbi5fZGV0YWlscyYmKG4uX2RldGFpbHMucmVtb3ZlKCksbi5fZGV0YWlsc1Nob3c9dm9pZCAwLG4uX2RldGFpbHM9dm9pZCAwLFcobi5uVHIpLnJlbW92ZUNsYXNzKCJkdC1oYXNDaGlsZCIpLGxzKHIpKX19LGRzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5jb250ZXh0O2lmKHIubGVuZ3RoJiZ0Lmxlbmd0aCl7dmFyIG49clswXS5hb0RhdGFbdFswXV07bi5fZGV0YWlscyYmKG4uX2RldGFpbHNTaG93PWUsZT8obi5fZGV0YWlscy5pbnNlcnRBZnRlcihuLm5UciksVyhuLm5UcikuYWRkQ2xhc3MoImR0LWhhc0NoaWxkIikpOihuLl9kZXRhaWxzLmRldGFjaCgpLFcobi5uVHIpLnJlbW92ZUNsYXNzKCJkdC1oYXNDaGlsZCIpKSxadChyWzBdLG51bGwsImNoaWxkUm93IixbZSx0LnJvdyh0WzBdKV0pLGdsKHJbMF0pLGxzKHIpKX19LGdsPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBXdCh0KSxyPSIuZHQuRFRfZGV0YWlscyIsbj0iZHJhdyIrcixzPSJjb2x1bW4tc2l6aW5nIityLGE9ImRlc3Ryb3kiK3IsbD10LmFvRGF0YTtlLm9mZihuKyIgIitzKyIgIithKSx4ZShsLCJfZGV0YWlscyIpLmxlbmd0aD4wJiYoZS5vbihuLGZ1bmN0aW9uKGMscCl7dD09PXAmJmUucm93cyh7cGFnZToiY3VycmVudCJ9KS5lcSgwKS5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBtPWxbYl07bS5fZGV0YWlsc1Nob3cmJm0uX2RldGFpbHMuaW5zZXJ0QWZ0ZXIobS5uVHIpfSl9KSxlLm9uKHMsZnVuY3Rpb24oYyxwKXtpZih0PT09cClmb3IodmFyIGIsbT1rbihwKSx5PTAsVD1sLmxlbmd0aDt5PFQ7eSsrKWI9bFt5XSxiJiZiLl9kZXRhaWxzJiZiLl9kZXRhaWxzLmVhY2goZnVuY3Rpb24oKXt2YXIgdz1XKHRoaXMpLmNoaWxkcmVuKCJ0ZCIpO3cubGVuZ3RoPT0xJiZ3LmF0dHIoImNvbHNwYW4iLG0pfSl9KSxlLm9uKGEsZnVuY3Rpb24oYyxwKXtpZih0PT09cClmb3IodmFyIGI9MCxtPWwubGVuZ3RoO2I8bTtiKyspbFtiXSYmbFtiXS5fZGV0YWlscyYmTmkoZSxiKX0pKX0seWw9IiIsWnI9eWwrInJvdygpLmNoaWxkIixGbj1acisiKCkiO0l0KEZuLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5jb250ZXh0O3JldHVybiB0PT09dm9pZCAwP3IubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmclswXS5hb0RhdGFbdGhpc1swXV0/clswXS5hb0RhdGFbdGhpc1swXV0uX2RldGFpbHM6dm9pZCAwOih0PT09ITA/dGhpcy5jaGlsZC5zaG93KCk6dD09PSExP05pKHRoaXMpOnIubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmbWwoclswXSxyWzBdLmFvRGF0YVt0aGlzWzBdXSx0LGUpLHRoaXMpfSk7SXQoW1pyKyIuc2hvdygpIixGbisiLnNob3coKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIGRzKHRoaXMsITApLHRoaXN9KTtJdChbWnIrIi5oaWRlKCkiLEZuKyIuaGlkZSgpIl0sZnVuY3Rpb24oKXtyZXR1cm4gZHModGhpcywhMSksdGhpc30pO0l0KFtacisiLnJlbW92ZSgpIixGbisiLnJlbW92ZSgpIl0sZnVuY3Rpb24oKXtyZXR1cm4gTmkodGhpcyksdGhpc30pO0l0KFpyKyIuaXNTaG93bigpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0WzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsc1Nob3d8fCExfSk7dmFyIHdsPS9eKFteOl0rKToobmFtZXx0aXRsZXx2aXNJZHh8dmlzaWJsZSkkLyxFaT1mdW5jdGlvbih0LGUscixuLHMsYSl7Zm9yKHZhciBsPVtdLGM9MCxwPXMubGVuZ3RoO2M8cDtjKyspbC5wdXNoKE5lKHQsc1tjXSxlLGEpKTtyZXR1cm4gbH0sdXM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuYW9IZWFkZXIscz1yIT09dm9pZCAwP3I6dC5iU29ydENlbGxzVG9wPzA6bi5sZW5ndGgtMTtyZXR1cm4gbltzXVtlXS5jZWxsfSx4bD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5hb0NvbHVtbnMscz14ZShuLCJzTmFtZSIpLGE9eGUobiwic1RpdGxlIiksbD12dC51dGlsLmdldCgiW10uW10uY2VsbCIpKHQuYW9IZWFkZXIpLGM9cHIobWkoW10sbCkpLHA9ZnVuY3Rpb24oYil7dmFyIG09TWEoYik7aWYoYj09PSIiKXJldHVybiBjcihuLmxlbmd0aCk7aWYobSE9PW51bGwpcmV0dXJuW20+PTA/bTpuLmxlbmd0aCttXTtpZih0eXBlb2YgYj09ImZ1bmN0aW9uIil7dmFyIHk9UG4odCxyKTtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oaCxvKXtyZXR1cm4gYihvLEVpKHQsbywwLDAseSksdXModCxvKSk/bzpudWxsfSl9dmFyIFQ9dHlwZW9mIGI9PSJzdHJpbmciP2IubWF0Y2god2wpOiIiO2lmKFQpc3dpdGNoKFRbMl0pe2Nhc2UidmlzSWR4IjpjYXNlInZpc2libGUiOnZhciB3PXBhcnNlSW50KFRbMV0sMTApO2lmKHc8MCl7dmFyIGs9bi5tYXAoZnVuY3Rpb24oaCxvKXtyZXR1cm4gaC5iVmlzaWJsZT9vOm51bGx9KTtyZXR1cm5ba1trLmxlbmd0aCt3XV19cmV0dXJuW2dpKHQsdyldO2Nhc2UibmFtZSI6cmV0dXJuIHMubWFwKGZ1bmN0aW9uKGgsbyl7cmV0dXJuIGg9PT1UWzFdP286bnVsbH0pO2Nhc2UidGl0bGUiOnJldHVybiBhLm1hcChmdW5jdGlvbihoLG8pe3JldHVybiBoPT09VFsxXT9vOm51bGx9KTtkZWZhdWx0OnJldHVybltdfWlmKGIubm9kZU5hbWUmJmIuX0RUX0NlbGxJbmRleClyZXR1cm5bYi5fRFRfQ2VsbEluZGV4LmNvbHVtbl07dmFyIFA9VyhjKS5maWx0ZXIoYikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHhpKHRoaXMpfSkudG9BcnJheSgpO2lmKFAubGVuZ3RofHwhYi5ub2RlTmFtZSlyZXR1cm4gUDt2YXIgRj1XKGIpLmNsb3Nlc3QoIipbZGF0YS1kdC1jb2x1bW5dIik7cmV0dXJuIEYubGVuZ3RoP1tGLmRhdGEoImR0LWNvbHVtbiIpXTpbXX07cmV0dXJuIFBpKCJjb2x1bW4iLGUscCx0LHIpfSxfbD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5hb0NvbHVtbnMscz1uW2VdLGE9dC5hb0RhdGEsbCxjLHAsYjtpZihyPT09dm9pZCAwKXJldHVybiBzLmJWaXNpYmxlO2lmKHMuYlZpc2libGU9PT1yKXJldHVybiExO2lmKHIpe3ZhciBtPXhlKG4sImJWaXNpYmxlIikuaW5kZXhPZighMCxlKzEpO2ZvcihjPTAscD1hLmxlbmd0aDtjPHA7YysrKWFbY10mJihiPWFbY10ublRyLGw9YVtjXS5hbkNlbGxzLGImJmIuaW5zZXJ0QmVmb3JlKGxbZV0sbFttXXx8bnVsbCkpfWVsc2UgVyh4ZSh0LmFvRGF0YSwiYW5DZWxscyIsZSkpLmRldGFjaCgpO3JldHVybiBzLmJWaXNpYmxlPXIsZXModCksITB9O0l0KCJjb2x1bW5zKCkiLGZ1bmN0aW9uKHQsZSl7dD09PXZvaWQgMD90PSIiOlcuaXNQbGFpbk9iamVjdCh0KSYmKGU9dCx0PSIiKSxlPUZpKGUpO3ZhciByPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtyZXR1cm4geGwobix0LGUpfSwxKTtyZXR1cm4gci5zZWxlY3Rvci5jb2xzPXQsci5zZWxlY3Rvci5vcHRzPWUscn0pO1F0KCJjb2x1bW5zKCkuaGVhZGVyKCkiLCJjb2x1bW4oKS5oZWFkZXIoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxyKXtyZXR1cm4gdXMoZSxyLHQpfSwxKX0pO1F0KCJjb2x1bW5zKCkuZm9vdGVyKCkiLCJjb2x1bW4oKS5mb290ZXIoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmFvRm9vdGVyO3JldHVybiBuLmxlbmd0aD9lLmFvRm9vdGVyW3QhPT12b2lkIDA/dDowXVtyXS5jZWxsOm51bGx9LDEpfSk7UXQoImNvbHVtbnMoKS5kYXRhKCkiLCJjb2x1bW4oKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixFaSwxKX0pO1F0KCJjb2x1bW5zKCkucmVuZGVyKCkiLCJjb2x1bW4oKS5yZW5kZXIoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbihlLHIsbixzLGEpe3JldHVybiBFaShlLHIsbixzLGEsdCl9LDEpfSk7UXQoImNvbHVtbnMoKS5kYXRhU3JjKCkiLCJjb2x1bW4oKS5kYXRhU3JjKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0NvbHVtbnNbZV0ubURhdGF9LDEpfSk7UXQoImNvbHVtbnMoKS5jYWNoZSgpIiwiY29sdW1uKCkuY2FjaGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbihlLHIsbixzLGEpe3JldHVybiBYcihlLmFvRGF0YSxhLHQ9PT0ic2VhcmNoIj8iX2FGaWx0ZXJEYXRhIjoiX2FTb3J0RGF0YSIscil9LDEpfSk7UXQoImNvbHVtbnMoKS5pbml0KCkiLCJjb2x1bW4oKS5pbml0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0NvbHVtbnNbZV19LDEpfSk7UXQoImNvbHVtbnMoKS5ub2RlcygpIiwiY29sdW1uKCkubm9kZXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uLXJvd3MiLGZ1bmN0aW9uKHQsZSxyLG4scyl7cmV0dXJuIFhyKHQuYW9EYXRhLHMsImFuQ2VsbHMiLGUpfSwxKX0pO1F0KCJjb2x1bW5zKCkudGl0bGVzKCkiLCJjb2x1bW4oKS50aXRsZSgpIixmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIsbil7dHlwZW9mIHQ9PSJudW1iZXIiJiYoZT10LHQ9dm9pZCAwKTt2YXIgcz1XKCJzcGFuLmR0LWNvbHVtbi10aXRsZSIsdGhpcy5jb2x1bW4obikuaGVhZGVyKGUpKTtyZXR1cm4gdCE9PXZvaWQgMD8ocy5odG1sKHQpLHRoaXMpOnMuaHRtbCgpfSwxKX0pO1F0KCJjb2x1bW5zKCkudHlwZXMoKSIsImNvbHVtbigpLnR5cGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbih0LGUpe3ZhciByPXQuYW9Db2x1bW5zW2VdLnNUeXBlO3JldHVybiByfHx3aSh0KSxyfSwxKX0pO1F0KCJjb2x1bW5zKCkudmlzaWJsZSgpIiwiY29sdW1uKCkudmlzaWJsZSgpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj1bXSxzPXRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oYSxsKXtpZih0PT09dm9pZCAwKXJldHVybiBhLmFvQ29sdW1uc1tsXS5iVmlzaWJsZTtfbChhLGwsdCkmJm4ucHVzaChsKX0pO3JldHVybiB0IT09dm9pZCAwJiZ0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYSl7eW4oYSxhLmFvSGVhZGVyKSx5bihhLGEuYW9Gb290ZXIpLGEuYWlEaXNwbGF5Lmxlbmd0aHx8VyhhLm5UQm9keSkuZmluZCgidGRbY29sc3Bhbl0iKS5hdHRyKCJjb2xzcGFuIixrbihhKSksSW4oYSksci5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihsLGMpe24uaW5jbHVkZXMoYykmJlp0KGwsbnVsbCwiY29sdW1uLXZpc2liaWxpdHkiLFtsLGMsdCxlXSl9KSxuLmxlbmd0aCYmKGU9PT12b2lkIDB8fGUpJiZyLmNvbHVtbnMuYWRqdXN0KCl9KSxzfSk7UXQoImNvbHVtbnMoKS53aWR0aHMoKSIsImNvbHVtbigpLndpZHRoKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksZT1XKCI8dHI+IikuaHRtbCgiPHRkPiIrQXJyYXkodCkuam9pbigiPC90ZD48dGQ+IikrIjwvdGQ+Iik7Vyh0aGlzLnRhYmxlKCkuYm9keSgpKS5hcHBlbmQoZSk7dmFyIHI9ZS5jaGlsZHJlbigpLm1hcChmdW5jdGlvbigpe3JldHVybiBXKHRoaXMpLm91dGVyV2lkdGgoKX0pO3JldHVybiBlLnJlbW92ZSgpLHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24obixzKXt2YXIgYT0kcihuLHMpO3JldHVybiBhIT09bnVsbD9yW2FdOjB9LDEpfSk7UXQoImNvbHVtbnMoKS5pbmRleGVzKCkiLCJjb2x1bW4oKS5pbmRleCgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihlLHIpe3JldHVybiB0PT09InZpc2libGUiPyRyKGUscik6cn0sMSl9KTtJdCgiY29sdW1ucy5hZGp1c3QoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe1RuKHQpfSwxKX0pO0l0KCJjb2x1bW4uaW5kZXgoKSIsZnVuY3Rpb24odCxlKXtpZih0aGlzLmNvbnRleHQubGVuZ3RoIT09MCl7dmFyIHI9dGhpcy5jb250ZXh0WzBdO2lmKHQ9PT0iZnJvbVZpc2libGUifHx0PT09InRvRGF0YSIpcmV0dXJuIGdpKHIsZSk7aWYodD09PSJmcm9tRGF0YSJ8fHQ9PT0idG9WaXNpYmxlIilyZXR1cm4gJHIocixlKX19KTtJdCgiY29sdW1uKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJpKHRoaXMuY29sdW1ucyh0LGUpKX0pO3ZhciBDbD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5hb0RhdGEscz1Qbih0LHIpLGE9V2EoWHIobixzLCJhbkNlbGxzIikpLGw9VyhtaShbXSxhKSksYyxwPXQuYW9Db2x1bW5zLmxlbmd0aCxiLG0seSxULHcsayxQPWZ1bmN0aW9uKEYpe3ZhciBoPXR5cGVvZiBGPT0iZnVuY3Rpb24iO2lmKEY9PW51bGx8fGgpe2ZvcihiPVtdLG09MCx5PXMubGVuZ3RoO208eTttKyspZm9yKGM9c1ttXSxUPTA7VDxwO1QrKyl3PXtyb3c6Yyxjb2x1bW46VH0saD8oaz1uW2NdLEYodyxOZSh0LGMsVCksay5hbkNlbGxzP2suYW5DZWxsc1tUXTpudWxsKSYmYi5wdXNoKHcpKTpiLnB1c2godyk7cmV0dXJuIGJ9aWYoVy5pc1BsYWluT2JqZWN0KEYpKXJldHVybiBGLmNvbHVtbiE9PXZvaWQgMCYmRi5yb3chPT12b2lkIDAmJnMuaW5kZXhPZihGLnJvdykhPT0tMT9bRl06W107dmFyIG89bC5maWx0ZXIoRikubWFwKGZ1bmN0aW9uKGYsQyl7cmV0dXJue3JvdzpDLl9EVF9DZWxsSW5kZXgucm93LGNvbHVtbjpDLl9EVF9DZWxsSW5kZXguY29sdW1ufX0pLnRvQXJyYXkoKTtyZXR1cm4gby5sZW5ndGh8fCFGLm5vZGVOYW1lP286KGs9VyhGKS5jbG9zZXN0KCIqW2RhdGEtZHQtcm93XSIpLGsubGVuZ3RoP1t7cm93OmsuZGF0YSgiZHQtcm93IiksY29sdW1uOmsuZGF0YSgiZHQtY29sdW1uIil9XTpbXSl9O3JldHVybiBQaSgiY2VsbCIsZSxQLHQscil9O0l0KCJjZWxscygpIixmdW5jdGlvbih0LGUscil7aWYoVy5pc1BsYWluT2JqZWN0KHQpJiYodC5yb3c9PT12b2lkIDA/KHI9dCx0PW51bGwpOihyPWUsZT1udWxsKSksVy5pc1BsYWluT2JqZWN0KGUpJiYocj1lLGU9bnVsbCksZT09bnVsbClyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKFQpe3JldHVybiBDbChULHQsRmkocikpfSk7dmFyIG49cj97cGFnZTpyLnBhZ2Usb3JkZXI6ci5vcmRlcixzZWFyY2g6ci5zZWFyY2h9Ont9LHM9dGhpcy5jb2x1bW5zKGUsbiksYT10aGlzLnJvd3ModCxuKSxsLGMscCxiLG09dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKFQsdyl7dmFyIGs9W107Zm9yKGw9MCxjPWFbd10ubGVuZ3RoO2w8YztsKyspZm9yKHA9MCxiPXNbd10ubGVuZ3RoO3A8YjtwKyspay5wdXNoKHtyb3c6YVt3XVtsXSxjb2x1bW46c1t3XVtwXX0pO3JldHVybiBrfSwxKSx5PXImJnIuc2VsZWN0ZWQ/dGhpcy5jZWxscyhtLHIpOm07cmV0dXJuIFcuZXh0ZW5kKHkuc2VsZWN0b3Ise2NvbHM6ZSxyb3dzOnQsb3B0czpyfSkseX0pO1F0KCJjZWxscygpLm5vZGVzKCkiLCJjZWxsKCkubm9kZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbih0LGUscil7dmFyIG49dC5hb0RhdGFbZV07cmV0dXJuIG4mJm4uYW5DZWxscz9uLmFuQ2VsbHNbcl06dm9pZCAwfSwxKX0pO0l0KCJjZWxscygpLmRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLHIpe3JldHVybiBOZSh0LGUscil9LDEpfSk7UXQoImNlbGxzKCkuY2FjaGUoKSIsImNlbGwoKS5jYWNoZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD10PT09InNlYXJjaCI/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiLHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZS5hb0RhdGFbcl1bdF1bbl19LDEpfSk7UXQoImNlbGxzKCkucmVuZGVyKCkiLCJjZWxsKCkucmVuZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLHIsbil7cmV0dXJuIE5lKGUscixuLHQpfSwxKX0pO1F0KCJjZWxscygpLmluZGV4ZXMoKSIsImNlbGwoKS5pbmRleCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbih0LGUscil7cmV0dXJue3JvdzplLGNvbHVtbjpyLGNvbHVtblZpc2libGU6JHIodCxyKX19LDEpfSk7UXQoImNlbGxzKCkuaW52YWxpZGF0ZSgpIiwiY2VsbCgpLmludmFsaWRhdGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKGUscixuKXtTbihlLHIsdCxuKX0pfSk7SXQoImNlbGwoKSIsZnVuY3Rpb24odCxlLHIpe3JldHVybiBCaSh0aGlzLmNlbGxzKHQsZSxyKSl9KTtJdCgiY2VsbCgpLmRhdGEoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0LHI9dGhpc1swXTtyZXR1cm4gdD09PXZvaWQgMD9lLmxlbmd0aCYmci5sZW5ndGg/TmUoZVswXSxyWzBdLnJvdyxyWzBdLmNvbHVtbik6dm9pZCAwOihabyhlWzBdLHJbMF0ucm93LHJbMF0uY29sdW1uLHQpLFNuKGVbMF0sclswXS5yb3csImRhdGEiLHJbMF0uY29sdW1uKSx0aGlzKX0pO0l0KCJvcmRlcigpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuY29udGV4dCxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT12b2lkIDA/ci5sZW5ndGghPT0wP3JbMF0uYWFTb3J0aW5nOnZvaWQgMDoodHlwZW9mIHQ9PSJudW1iZXIiP3Q9W1t0LGVdXTpuLmxlbmd0aD4xJiYodD1uKSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocyl7cy5hYVNvcnRpbmc9QXJyYXkuaXNBcnJheSh0KT90LnNsaWNlKCk6dH0pKX0pO0l0KCJvcmRlci5saXN0ZW5lcigpIixmdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtycyhuLHQse30sZSxyKX0pfSk7SXQoIm9yZGVyLmZpeGVkKCkiLGZ1bmN0aW9uKHQpe2lmKCF0KXt2YXIgZT10aGlzLmNvbnRleHQscj1lLmxlbmd0aD9lWzBdLmFhU29ydGluZ0ZpeGVkOnZvaWQgMDtyZXR1cm4gQXJyYXkuaXNBcnJheShyKT97cHJlOnJ9OnJ9cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtuLmFhU29ydGluZ0ZpeGVkPVcuZXh0ZW5kKCEwLHt9LHQpfSl9KTtJdChbImNvbHVtbnMoKS5vcmRlcigpIiwiY29sdW1uKCkub3JkZXIoKSJdLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQ/dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIsbil7ci5hYVNvcnRpbmc9ZVtuXS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuW3MsdF19KX0pOnRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocixuKXtmb3IodmFyIHM9QW4ociksYT0wLGw9cy5sZW5ndGg7YTxsO2ErKylpZihzW2FdLmNvbD09PW4pcmV0dXJuIHNbYV0uZGlyO3JldHVybiBudWxsfSwxKX0pO1F0KCJjb2x1bW5zKCkub3JkZXJhYmxlKCkiLCJjb2x1bW4oKS5vcmRlcmFibGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmFvQ29sdW1uc1tyXTtyZXR1cm4gdD9uLmFzU29ydGluZzpuLmJTb3J0YWJsZX0sMSl9KTtJdCgicHJvY2Vzc2luZygpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe0ZlKGUsdCl9KX0pO0l0KCJzZWFyY2goKSIsZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9dGhpcy5jb250ZXh0O3JldHVybiB0PT09dm9pZCAwP3MubGVuZ3RoIT09MD9zWzBdLm9QcmV2aW91c1NlYXJjaC5zZWFyY2g6dm9pZCAwOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihhKXthLm9GZWF0dXJlcy5iRmlsdGVyJiYodHlwZW9mIGU9PSJvYmplY3QiP0dyKGEsVy5leHRlbmQoYS5vUHJldmlvdXNTZWFyY2gsZSx7c2VhcmNoOnR9KSk6R3IoYSxXLmV4dGVuZChhLm9QcmV2aW91c1NlYXJjaCx7c2VhcmNoOnQscmVnZXg6ZT09PW51bGw/ITE6ZSxzbWFydDpyPT09bnVsbD8hMDpyLGNhc2VJbnNlbnNpdGl2ZTpuPT09bnVsbD8hMDpufSkpKX0pfSk7SXQoInNlYXJjaC5maXhlZCgpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihuKXt2YXIgcz1uLnNlYXJjaEZpeGVkO2lmKHQpe2lmKGU9PT12b2lkIDApcmV0dXJuIHNbdF07ZT09PW51bGw/ZGVsZXRlIHNbdF06c1t0XT1lfWVsc2UgcmV0dXJuIE9iamVjdC5rZXlzKHMpO3JldHVybiB0aGlzfSk7cmV0dXJuIHQhPT12b2lkIDAmJmU9PT12b2lkIDA/clswXTpyfSk7UXQoImNvbHVtbnMoKS5zZWFyY2goKSIsImNvbHVtbigpLnNlYXJjaCgpIixmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihzLGEpe3ZhciBsPXMuYW9QcmVTZWFyY2hDb2xzO2lmKHQ9PT12b2lkIDApcmV0dXJuIGxbYV0uc2VhcmNoO3Mub0ZlYXR1cmVzLmJGaWx0ZXImJih0eXBlb2YgZT09Im9iamVjdCI/Vy5leHRlbmQobFthXSxlLHtzZWFyY2g6dH0pOlcuZXh0ZW5kKGxbYV0se3NlYXJjaDp0LHJlZ2V4OmU9PT1udWxsPyExOmUsc21hcnQ6cj09PW51bGw/ITA6cixjYXNlSW5zZW5zaXRpdmU6bj09PW51bGw/ITA6bn0pLEdyKHMscy5vUHJldmlvdXNTZWFyY2gpKX0pfSk7SXQoWyJjb2x1bW5zKCkuc2VhcmNoLmZpeGVkKCkiLCJjb2x1bW4oKS5zZWFyY2guZml4ZWQoKSJdLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5pdGVyYXRvcighMCwiY29sdW1uIixmdW5jdGlvbihuLHMpe3ZhciBhPW4uYW9Db2x1bW5zW3NdLnNlYXJjaEZpeGVkO2lmKHQpe2lmKGU9PT12b2lkIDApcmV0dXJuIGFbdF07ZT09PW51bGw/ZGVsZXRlIGFbdF06YVt0XT1lfWVsc2UgcmV0dXJuIE9iamVjdC5rZXlzKGEpO3JldHVybiB0aGlzfSk7cmV0dXJuIHQhPT12b2lkIDAmJmU9PT12b2lkIDA/clswXTpyfSk7SXQoInN0YXRlKCkiLGZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLm9TYXZlZFN0YXRlOm51bGw7dmFyIHI9Vy5leHRlbmQoITAse30sdCk7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtlIT09ITEmJihyLnRpbWU9K25ldyBEYXRlKzEwMCksaGkobixyLGZ1bmN0aW9uKCl7fSl9KX0pO0l0KCJzdGF0ZS5jbGVhcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7dC5mblN0YXRlU2F2ZUNhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCx7fSl9KX0pO0l0KCJzdGF0ZS5sb2FkZWQoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0Lmxlbmd0aD90aGlzLmNvbnRleHRbMF0ub0xvYWRlZFN0YXRlOm51bGx9KTtJdCgic3RhdGUuc2F2ZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7SW4odCl9KX0pO3Z0LnVzZT1mdW5jdGlvbih0LGUpe2U9PT0ibGliInx8dC5mbj9XPXQ6ZT09IndpbiJ8fHQuZG9jdW1lbnQ/KHdpbmRvdz10LGRvY3VtZW50PXQuZG9jdW1lbnQpOihlPT09ImRhdGV0aW1lInx8dC50eXBlPT09IkRhdGVUaW1lIikmJih2dC5EYXRlVGltZT10KX07dnQuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciByPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihXPWUscj0hMCkscn07dnQudmVyc2lvbkNoZWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWU/ZS5zcGxpdCgiLiIpOnZ0LnZlcnNpb24uc3BsaXQoIi4iKSxuPXQuc3BsaXQoIi4iKSxzLGEsbD0wLGM9bi5sZW5ndGg7bDxjO2wrKylpZihzPXBhcnNlSW50KHJbbF0sMTApfHwwLGE9cGFyc2VJbnQobltsXSwxMCl8fDAscyE9PWEpcmV0dXJuIHM+YTtyZXR1cm4hMH07dnQuaXNEYXRhVGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9Vyh0KS5nZXQoMCkscj0hMTtyZXR1cm4gdCBpbnN0YW5jZW9mIHZ0LkFwaT8hMDooVy5lYWNoKHZ0LnNldHRpbmdzLGZ1bmN0aW9uKG4scyl7dmFyIGE9cy5uU2Nyb2xsSGVhZD9XKCJ0YWJsZSIscy5uU2Nyb2xsSGVhZClbMF06bnVsbCxsPXMublNjcm9sbEZvb3Q/VygidGFibGUiLHMublNjcm9sbEZvb3QpWzBdOm51bGw7KHMublRhYmxlPT09ZXx8YT09PWV8fGw9PT1lKSYmKHI9ITApfSkscil9O3Z0LnRhYmxlcz1mdW5jdGlvbih0KXt2YXIgZT0hMTtXLmlzUGxhaW5PYmplY3QodCkmJihlPXQuYXBpLHQ9dC52aXNpYmxlKTt2YXIgcj12dC5zZXR0aW5ncy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuISEoIXR8fHQmJlcobi5uVGFibGUpLmlzKCI6dmlzaWJsZSIpKX0pLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5uVGFibGV9KTtyZXR1cm4gZT9uZXcgV3Qocik6cn07dnQuY2FtZWxUb0h1bmdhcmlhbj1lcjtJdCgiJCgpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMucm93cyhlKS5ub2RlcygpLG49VyhyKTtyZXR1cm4gVyhbXS5jb25jYXQobi5maWx0ZXIodCkudG9BcnJheSgpLG4uZmluZCh0KS50b0FycmF5KCkpKX0pO1cuZWFjaChbIm9uIiwib25lIiwib2ZmIl0sZnVuY3Rpb24odCxlKXtJdChlKyIoKSIsZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JbMF09clswXS5zcGxpdCgvXHMvKS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHMubWF0Y2goL1wuZHRcYi8pP3M6cysiLmR0In0pLmpvaW4oIiAiKTt2YXIgbj1XKHRoaXMudGFibGVzKCkubm9kZXMoKSk7cmV0dXJuIG5bZV0uYXBwbHkobixyKSx0aGlzfSl9KTtJdCgiY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe0NpKHQpfSl9KTtJdCgiZXJyb3IoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtQZShlLDAsdCl9KX0pO0l0KCJzZXR0aW5ncygpIixmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHRoaXMuY29udGV4dCl9KTtJdCgiaW5pdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGg/dFswXS5vSW5pdDpudWxsfSk7SXQoImRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3JldHVybiB4ZSh0LmFvRGF0YSwiX2FEYXRhIil9KS5mbGF0dGVuKCl9KTtJdCgidHJpZ2dlcigpIixmdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtyZXR1cm4gWnQobixudWxsLHQsZSxyKX0pLmZsYXR0ZW4oKX0pO0l0KCJyZWFkeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ/dGhpcy50YWJsZXMoKS5ldmVyeShmdW5jdGlvbigpe3RoaXMuY29udGV4dFswXS5fYkluaXRDb21wbGV0ZT90LmNhbGwodGhpcyk6dGhpcy5vbigiaW5pdCIsZnVuY3Rpb24oKXt0LmNhbGwodGhpcyl9KX0pOmUubGVuZ3RoP2VbMF0uX2JJbml0Q29tcGxldGV8fCExOm51bGx9KTtJdCgiZGVzdHJveSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD10fHwhMSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5vQ2xhc3NlcyxuPWUublRhYmxlLHM9ZS5uVEJvZHksYT1lLm5USGVhZCxsPWUublRGb290LGM9VyhuKSxwPVcocyksYj1XKGUublRhYmxlV3JhcHBlciksbT1lLmFvRGF0YS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEY/Ri5uVHI6bnVsbH0pLHk9ci5vcmRlcjtlLmJEZXN0cm95aW5nPSEwLFp0KGUsImFvRGVzdHJveUNhbGxiYWNrIiwiZGVzdHJveSIsW2VdLCEwKSx0fHxuZXcgV3QoZSkuY29sdW1ucygpLnZpc2libGUoITApLGIub2ZmKCIuRFQiKS5maW5kKCI6bm90KHRib2R5ICopIikub2ZmKCIuRFQiKSxXKHdpbmRvdykub2ZmKCIuRFQtIitlLnNJbnN0YW5jZSksbiE9YS5wYXJlbnROb2RlJiYoYy5jaGlsZHJlbigidGhlYWQiKS5kZXRhY2goKSxjLmFwcGVuZChhKSksbCYmbiE9bC5wYXJlbnROb2RlJiYoYy5jaGlsZHJlbigidGZvb3QiKS5kZXRhY2goKSxjLmFwcGVuZChsKSksZS5jb2xncm91cC5yZW1vdmUoKSxlLmFhU29ydGluZz1bXSxlLmFhU29ydGluZ0ZpeGVkPVtdLGZpKGUpLFcoInRoLCB0ZCIsYSkucmVtb3ZlQ2xhc3MoeS5jYW5Bc2MrIiAiK3kuY2FuRGVzYysiICIreS5pc0FzYysiICIreS5pc0Rlc2MpLmNzcygid2lkdGgiLCIiKSxwLmNoaWxkcmVuKCkuZGV0YWNoKCkscC5hcHBlbmQobSk7dmFyIFQ9ZS5uVGFibGVXcmFwcGVyLnBhcmVudE5vZGUsdz1lLm5UYWJsZVdyYXBwZXIubmV4dFNpYmxpbmcsaz10PyJyZW1vdmUiOiJkZXRhY2giO2Nba10oKSxiW2tdKCksIXQmJlQmJihULmluc2VydEJlZm9yZShuLHcpLGMuY3NzKCJ3aWR0aCIsZS5zRGVzdHJveVdpZHRoKS5yZW1vdmVDbGFzcyhyLnRhYmxlKSk7dmFyIFA9dnQuc2V0dGluZ3MuaW5kZXhPZihlKTtQIT09LTEmJnZ0LnNldHRpbmdzLnNwbGljZShQLDEpfSl9KTtXLmVhY2goWyJjb2x1bW4iLCJyb3ciLCJjZWxsIl0sZnVuY3Rpb24odCxlKXtJdChlKyJzKCkuZXZlcnkoKSIsZnVuY3Rpb24ocil7dmFyIG49dGhpcy5zZWxlY3Rvci5vcHRzLHM9dGhpcyxhLGw9MDtyZXR1cm4gdGhpcy5pdGVyYXRvcigiZXZlcnkiLGZ1bmN0aW9uKGMscCxiKXthPXNbZV0ocCxuKSxlPT09ImNlbGwiP3IuY2FsbChhLGFbMF1bMF0ucm93LGFbMF1bMF0uY29sdW1uLGIsbCk6ci5jYWxsKGEscCxiLGwpLGwrK30pfSl9KTtJdCgiaTE4bigpIixmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5jb250ZXh0WzBdLHM9SXIodCkobi5vTGFuZ3VhZ2UpO3JldHVybiBzPT09dm9pZCAwJiYocz1lKSxXLmlzUGxhaW5PYmplY3QocykmJihzPXIhPT12b2lkIDAmJnNbcl0hPT12b2lkIDA/c1tyXTpzLl8pLHR5cGVvZiBzPT0ic3RyaW5nIj9zLnJlcGxhY2UoIiVkIixyKTpzfSk7dnQudmVyc2lvbj0iMi4wLjUiO3Z0LnNldHRpbmdzPVtdO3Z0Lm1vZGVscz17fTt2dC5tb2RlbHMub1NlYXJjaD17Y2FzZUluc2Vuc2l0aXZlOiEwLHNlYXJjaDoiIixyZWdleDohMSxzbWFydDohMCxyZXR1cm46ITF9O3Z0Lm1vZGVscy5vUm93PXtuVHI6bnVsbCxhbkNlbGxzOm51bGwsX2FEYXRhOltdLF9hU29ydERhdGE6bnVsbCxfYUZpbHRlckRhdGE6bnVsbCxfc0ZpbHRlclJvdzpudWxsLHNyYzpudWxsLGlkeDotMSxkaXNwbGF5RGF0YTpudWxsfTt2dC5tb2RlbHMub0NvbHVtbj17aWR4Om51bGwsYURhdGFTb3J0Om51bGwsYXNTb3J0aW5nOm51bGwsYlNlYXJjaGFibGU6bnVsbCxiU29ydGFibGU6bnVsbCxiVmlzaWJsZTpudWxsLF9zTWFudWFsVHlwZTpudWxsLF9iQXR0clNyYzohMSxmbkNyZWF0ZWRDZWxsOm51bGwsZm5HZXREYXRhOm51bGwsZm5TZXREYXRhOm51bGwsbURhdGE6bnVsbCxtUmVuZGVyOm51bGwsc0NsYXNzOm51bGwsc0NvbnRlbnRQYWRkaW5nOm51bGwsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6bnVsbCxzU29ydERhdGFUeXBlOiJzdGQiLHNTb3J0aW5nQ2xhc3M6bnVsbCxzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsLHNXaWR0aE9yaWc6bnVsbCxtYXhMZW5TdHJpbmc6bnVsbCxzZWFyY2hGaXhlZDpudWxsfTt2dC5kZWZhdWx0cz17YWFEYXRhOm51bGwsYWFTb3J0aW5nOltbMCwiYXNjIl1dLGFhU29ydGluZ0ZpeGVkOltdLGFqYXg6bnVsbCxhTGVuZ3RoTWVudTpbMTAsMjUsNTAsMTAwXSxhb0NvbHVtbnM6bnVsbCxhb0NvbHVtbkRlZnM6bnVsbCxhb1NlYXJjaENvbHM6W10sYkF1dG9XaWR0aDohMCxiRGVmZXJSZW5kZXI6ITAsYkRlc3Ryb3k6ITEsYkZpbHRlcjohMCxiSW5mbzohMCxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTohMCxiUHJvY2Vzc2luZzohMSxiUmV0cmlldmU6ITEsYlNjcm9sbENvbGxhcHNlOiExLGJTZXJ2ZXJTaWRlOiExLGJTb3J0OiEwLGJTb3J0TXVsdGk6ITAsYlNvcnRDZWxsc1RvcDpudWxsLGJTb3J0Q2xhc3NlczohMCxiU3RhdGVTYXZlOiExLGZuQ3JlYXRlZFJvdzpudWxsLGZuRHJhd0NhbGxiYWNrOm51bGwsZm5Gb290ZXJDYWxsYmFjazpudWxsLGZuRm9ybWF0TnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0aGlzLm9MYW5ndWFnZS5zVGhvdXNhbmRzKX0sZm5IZWFkZXJDYWxsYmFjazpudWxsLGZuSW5mb0NhbGxiYWNrOm51bGwsZm5Jbml0Q29tcGxldGU6bnVsbCxmblByZURyYXdDYWxsYmFjazpudWxsLGZuUm93Q2FsbGJhY2s6bnVsbCxmblN0YXRlTG9hZENhbGxiYWNrOmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSgodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuZ2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSkpfWNhdGNoe3JldHVybnt9fX0sZm5TdGF0ZUxvYWRQYXJhbXM6bnVsbCxmblN0YXRlTG9hZGVkOm51bGwsZm5TdGF0ZVNhdmVDYWxsYmFjazpmdW5jdGlvbih0LGUpe3RyeXsodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuc2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSxKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2h7fX0sZm5TdGF0ZVNhdmVQYXJhbXM6bnVsbCxpU3RhdGVEdXJhdGlvbjo3MjAwLGlEaXNwbGF5TGVuZ3RoOjEwLGlEaXNwbGF5U3RhcnQ6MCxpVGFiSW5kZXg6MCxvQ2xhc3Nlczp7fSxvTGFuZ3VhZ2U6e29BcmlhOntvcmRlcmFibGU6IjogQWN0aXZhdGUgdG8gc29ydCIsb3JkZXJhYmxlUmV2ZXJzZToiOiBBY3RpdmF0ZSB0byBpbnZlcnQgc29ydGluZyIsb3JkZXJhYmxlUmVtb3ZlOiI6IEFjdGl2YXRlIHRvIHJlbW92ZSBzb3J0aW5nIixwYWdpbmF0ZTp7Zmlyc3Q6IkZpcnN0IixsYXN0OiJMYXN0IixuZXh0OiJOZXh0IixwcmV2aW91czoiUHJldmlvdXMifX0sb1BhZ2luYXRlOntzRmlyc3Q6Ilx4QUIiLHNMYXN0OiJceEJCIixzTmV4dDoiXHUyMDNBIixzUHJldmlvdXM6Ilx1MjAzOSJ9LGVudHJpZXM6e186ImVudHJpZXMiLDE6ImVudHJ5In0sc0VtcHR5VGFibGU6Ik5vIGRhdGEgYXZhaWxhYmxlIGluIHRhYmxlIixzSW5mbzoiU2hvd2luZyBfU1RBUlRfIHRvIF9FTkRfIG9mIF9UT1RBTF8gX0VOVFJJRVMtVE9UQUxfIixzSW5mb0VtcHR5OiJTaG93aW5nIDAgdG8gMCBvZiAwIF9FTlRSSUVTLVRPVEFMXyIsc0luZm9GaWx0ZXJlZDoiKGZpbHRlcmVkIGZyb20gX01BWF8gdG90YWwgX0VOVFJJRVMtTUFYXykiLHNJbmZvUG9zdEZpeDoiIixzRGVjaW1hbDoiIixzVGhvdXNhbmRzOiIsIixzTGVuZ3RoTWVudToiX01FTlVfIF9FTlRSSUVTXyBwZXIgcGFnZSIsc0xvYWRpbmdSZWNvcmRzOiJMb2FkaW5nLi4uIixzUHJvY2Vzc2luZzoiIixzU2VhcmNoOiJTZWFyY2g6IixzU2VhcmNoUGxhY2Vob2xkZXI6IiIsc1VybDoiIixzWmVyb1JlY29yZHM6Ik5vIG1hdGNoaW5nIHJlY29yZHMgZm91bmQifSxvU2VhcmNoOlcuZXh0ZW5kKHt9LHZ0Lm1vZGVscy5vU2VhcmNoKSxsYXlvdXQ6e3RvcFN0YXJ0OiJwYWdlTGVuZ3RoIix0b3BFbmQ6InNlYXJjaCIsYm90dG9tU3RhcnQ6ImluZm8iLGJvdHRvbUVuZDoicGFnaW5nIn0sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiJmdWxsX251bWJlcnMiLHNTY3JvbGxYOiIiLHNTY3JvbGxYSW5uZXI6IiIsc1Njcm9sbFk6IiIsc1NlcnZlck1ldGhvZDoiR0VUIixyZW5kZXJlcjpudWxsLHJvd0lkOiJEVF9Sb3dJZCIsY2FwdGlvbjpudWxsfTtDbih2dC5kZWZhdWx0cyk7dnQuZGVmYXVsdHMuY29sdW1uPXthRGF0YVNvcnQ6bnVsbCxpRGF0YVNvcnQ6LTEsYXJpYVRpdGxlOiIiLGFzU29ydGluZzpbImFzYyIsImRlc2MiLCIiXSxiU2VhcmNoYWJsZTohMCxiU29ydGFibGU6ITAsYlZpc2libGU6ITAsZm5DcmVhdGVkQ2VsbDpudWxsLG1EYXRhOm51bGwsbVJlbmRlcjpudWxsLHNDZWxsVHlwZToidGQiLHNDbGFzczoiIixzQ29udGVudFBhZGRpbmc6IiIsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6IiIsc1NvcnREYXRhVHlwZToic3RkIixzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsfTtDbih2dC5kZWZhdWx0cy5jb2x1bW4pO3Z0Lm1vZGVscy5vU2V0dGluZ3M9e29GZWF0dXJlczp7YkF1dG9XaWR0aDpudWxsLGJEZWZlclJlbmRlcjpudWxsLGJGaWx0ZXI6bnVsbCxiSW5mbzohMCxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTpudWxsLGJQcm9jZXNzaW5nOm51bGwsYlNlcnZlclNpZGU6bnVsbCxiU29ydDpudWxsLGJTb3J0TXVsdGk6bnVsbCxiU29ydENsYXNzZXM6bnVsbCxiU3RhdGVTYXZlOm51bGx9LG9TY3JvbGw6e2JDb2xsYXBzZTpudWxsLGlCYXJXaWR0aDowLHNYOm51bGwsc1hJbm5lcjpudWxsLHNZOm51bGx9LG9MYW5ndWFnZTp7Zm5JbmZvQ2FsbGJhY2s6bnVsbH0sb0Jyb3dzZXI6e2JTY3JvbGxiYXJMZWZ0OiExLGJhcldpZHRoOjB9LGFqYXg6bnVsbCxhYW5GZWF0dXJlczpbXSxhb0RhdGE6W10sYWlEaXNwbGF5OltdLGFpRGlzcGxheU1hc3RlcjpbXSxhSWRzOnt9LGFvQ29sdW1uczpbXSxhb0hlYWRlcjpbXSxhb0Zvb3RlcjpbXSxvUHJldmlvdXNTZWFyY2g6e30sc2VhcmNoRml4ZWQ6e30sYW9QcmVTZWFyY2hDb2xzOltdLGFhU29ydGluZzpudWxsLGFhU29ydGluZ0ZpeGVkOltdLHNEZXN0cm95V2lkdGg6MCxhb1Jvd0NhbGxiYWNrOltdLGFvSGVhZGVyQ2FsbGJhY2s6W10sYW9Gb290ZXJDYWxsYmFjazpbXSxhb0RyYXdDYWxsYmFjazpbXSxhb1Jvd0NyZWF0ZWRDYWxsYmFjazpbXSxhb1ByZURyYXdDYWxsYmFjazpbXSxhb0luaXRDb21wbGV0ZTpbXSxhb1N0YXRlU2F2ZVBhcmFtczpbXSxhb1N0YXRlTG9hZFBhcmFtczpbXSxhb1N0YXRlTG9hZGVkOltdLHNUYWJsZUlkOiIiLG5UYWJsZTpudWxsLG5USGVhZDpudWxsLG5URm9vdDpudWxsLG5UQm9keTpudWxsLG5UYWJsZVdyYXBwZXI6bnVsbCxiSW5pdGlhbGlzZWQ6ITEsYW9PcGVuUm93czpbXSxzRG9tOm51bGwsc2VhcmNoRGVsYXk6bnVsbCxzUGFnaW5hdGlvblR5cGU6InR3b19idXR0b24iLHBhZ2luZ0NvbnRyb2xzOjAsaVN0YXRlRHVyYXRpb246MCxhb1N0YXRlU2F2ZTpbXSxhb1N0YXRlTG9hZDpbXSxvU2F2ZWRTdGF0ZTpudWxsLG9Mb2FkZWRTdGF0ZTpudWxsLGJBamF4RGF0YUdldDohMCxqcVhIUjpudWxsLGpzb246dm9pZCAwLG9BamF4RGF0YTp2b2lkIDAsc1NlcnZlck1ldGhvZDpudWxsLGZuRm9ybWF0TnVtYmVyOm51bGwsYUxlbmd0aE1lbnU6bnVsbCxpRHJhdzowLGJEcmF3aW5nOiExLGlEcmF3RXJyb3I6LTEsX2lEaXNwbGF5TGVuZ3RoOjEwLF9pRGlzcGxheVN0YXJ0OjAsX2lSZWNvcmRzVG90YWw6MCxfaVJlY29yZHNEaXNwbGF5OjAsb0NsYXNzZXM6e30sYkZpbHRlcmVkOiExLGJTb3J0ZWQ6ITEsYlNvcnRDZWxsc1RvcDpudWxsLG9Jbml0Om51bGwsYW9EZXN0cm95Q2FsbGJhY2s6W10sZm5SZWNvcmRzVG90YWw6ZnVuY3Rpb24oKXtyZXR1cm4gQmUodGhpcyk9PSJzc3AiP3RoaXMuX2lSZWNvcmRzVG90YWwqMTp0aGlzLmFpRGlzcGxheU1hc3Rlci5sZW5ndGh9LGZuUmVjb3Jkc0Rpc3BsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gQmUodGhpcyk9PSJzc3AiP3RoaXMuX2lSZWNvcmRzRGlzcGxheSoxOnRoaXMuYWlEaXNwbGF5Lmxlbmd0aH0sZm5EaXNwbGF5RW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faURpc3BsYXlMZW5ndGgsZT10aGlzLl9pRGlzcGxheVN0YXJ0LHI9ZSt0LG49dGhpcy5haURpc3BsYXkubGVuZ3RoLHM9dGhpcy5vRmVhdHVyZXMsYT1zLmJQYWdpbmF0ZTtyZXR1cm4gcy5iU2VydmVyU2lkZT9hPT09ITF8fHQ9PT0tMT9lK246TWF0aC5taW4oZSt0LHRoaXMuX2lSZWNvcmRzRGlzcGxheSk6IWF8fHI+bnx8dD09PS0xP246cn0sb0luc3RhbmNlOm51bGwsc0luc3RhbmNlOm51bGwsaVRhYkluZGV4OjAsblNjcm9sbEhlYWQ6bnVsbCxuU2Nyb2xsRm9vdDpudWxsLGFMYXN0U29ydDpbXSxvUGx1Z2luczp7fSxyb3dJZEZuOm51bGwscm93SWQ6bnVsbCxjYXB0aW9uOiIiLGNhcHRpb25Ob2RlOm51bGwsY29sZ3JvdXA6bnVsbH07dmFyIFRsPXZ0LmV4dC5wYWdlcjtXLmV4dGVuZChUbCx7c2ltcGxlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmV2aW91cyIsIm5leHQiXX0sZnVsbDpmdW5jdGlvbigpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIsIm5leHQiLCJsYXN0Il19LG51bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bIm51bWJlcnMiXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiXX0sZnVsbF9udW1iZXJzOmZ1bmN0aW9uKCl7cmV0dXJuWyJmaXJzdCIsInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiLCJsYXN0Il19LGZpcnN0X2xhc3Q6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibGFzdCJdfSxmaXJzdF9sYXN0X251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibnVtYmVycyIsImxhc3QiXX0sX251bWJlcnM6YnMsbnVtYmVyc19sZW5ndGg6N30pO1cuZXh0ZW5kKCEwLHZ0LmV4dC5yZW5kZXJlcix7cGFnaW5nQnV0dG9uOntfOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9dC5vQ2xhc3Nlcy5wYWdpbmcsbD1bYS5idXR0b25dLGM7cmV0dXJuIG4mJmwucHVzaChhLmFjdGl2ZSkscyYmbC5wdXNoKGEuZGlzYWJsZWQpLGU9PT0iZWxsaXBzaXMiP2M9VygnPHNwYW4gY2xhc3M9ImVsbGlwc2lzIj48L3NwYW4+JykuaHRtbChyKVswXTpjPVcoIjxidXR0b24+Iix7Y2xhc3M6bC5qb2luKCIgIikscm9sZToibGluayIsdHlwZToiYnV0dG9uIn0pLmh0bWwocikse2Rpc3BsYXk6YyxjbGlja2VyOmN9fX0scGFnaW5nQ29udGFpbmVyOntfOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9fX0pO3ZhciBCbj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gWmUocil8fHR5cGVvZiByIT0ic3RyaW5nInx8KHI9ci5yZXBsYWNlKGpvLCIgIiksdCYmKHI9aHIocikpLGUmJihyPW1uKHIsITEpKSkscn19O2Z1bmN0aW9uIGNzKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcV10vZywiXyIpfWZ1bmN0aW9uIExhKHQsZSxyLG4scyl7cmV0dXJuIHdpbmRvdy5tb21lbnQ/dFtlXShzKTp3aW5kb3cubHV4b24/dFtyXShzKTpuP3Rbbl0ocyk6dH12YXIgemE9ITE7ZnVuY3Rpb24gX24odCxlLHIpe3ZhciBuO2lmKHdpbmRvdy5tb21lbnQpe2lmKG49d2luZG93Lm1vbWVudC51dGModCxlLHIsITApLCFuLmlzVmFsaWQoKSlyZXR1cm4gbnVsbH1lbHNlIGlmKHdpbmRvdy5sdXhvbil7aWYobj1lJiZ0eXBlb2YgdD09InN0cmluZyI/d2luZG93Lmx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXQodCxlKTp3aW5kb3cubHV4b24uRGF0ZVRpbWUuZnJvbUlTTyh0KSwhbi5pc1ZhbGlkKXJldHVybiBudWxsO24uc2V0TG9jYWxlKHIpfWVsc2UgZT8oemF8fGFsZXJ0KCJEYXRhVGFibGVzIHdhcm5pbmc6IEZvcm1hdHRlZCBkYXRlIHdpdGhvdXQgTW9tZW50LmpzIG9yIEx1eG9uIC0gaHR0cHM6Ly9kYXRhdGFibGVzLm5ldC90bi8xNyIpLHphPSEwKTpuPW5ldyBEYXRlKHQpO3JldHVybiBufWZ1bmN0aW9uIG9pKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbixzKXthcmd1bWVudHMubGVuZ3RoPT09MD8obj0iZW4iLHI9bnVsbCxlPW51bGwpOmFyZ3VtZW50cy5sZW5ndGg9PT0xPyhuPSJlbiIscj1lLGU9bnVsbCk6YXJndW1lbnRzLmxlbmd0aD09PTImJihuPXIscj1lLGU9bnVsbCk7dmFyIGE9ImRhdGV0aW1lIisocj8iLSIrY3Mocik6IiIpO3JldHVybiB2dC5leHQudHlwZS5vcmRlclthXXx8dnQudHlwZShhLHtkZXRlY3Q6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PT1hP2E6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24obCl7cmV0dXJuIGwudmFsdWVPZigpfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KSxmdW5jdGlvbihsLGMpe2lmKGw9PW51bGwpaWYocz09PSItLW5vdyIpe3ZhciBwPW5ldyBEYXRlO2w9bmV3IERhdGUoRGF0ZS5VVEMocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSxwLmdldERhdGUoKSxwLmdldEhvdXJzKCkscC5nZXRNaW51dGVzKCkscC5nZXRTZWNvbmRzKCkpKX1lbHNlIGw9IiI7aWYoYz09PSJ0eXBlIilyZXR1cm4gYTtpZihsPT09IiIpcmV0dXJuIGMhPT0ic29ydCI/IiI6X24oIjAwMDAtMDEtMDEgMDA6MDA6MDAiLG51bGwsbik7aWYociE9PW51bGwmJmU9PT1yJiZjIT09InNvcnQiJiZjIT09InR5cGUiJiYhKGwgaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbDt2YXIgYj1fbihsLGUsbik7aWYoYj09PW51bGwpcmV0dXJuIGw7aWYoYz09PSJzb3J0IilyZXR1cm4gYjt2YXIgbT1yPT09bnVsbD9MYShiLCJ0b0RhdGUiLCJ0b0pTRGF0ZSIsIiIpW3RdKCk6TGEoYiwiZm9ybWF0IiwidG9Gb3JtYXQiLCJ0b0lTT1N0cmluZyIscik7cmV0dXJuIGM9PT0iZGlzcGxheSI/RHIobSk6bX19fXZhciBmcz0iLCIsaHM9Ii4iO2lmKHdpbmRvdy5JbnRsIT09dm9pZCAwKXRyeXtmb3IoU3I9bmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0VG9QYXJ0cygxMDAwMDAuMSksSWU9MDtJZTxTci5sZW5ndGg7SWUrKylTcltJZV0udHlwZT09PSJncm91cCI/ZnM9U3JbSWVdLnZhbHVlOlNyW0llXS50eXBlPT09ImRlY2ltYWwiJiYoaHM9U3JbSWVdLnZhbHVlKX1jYXRjaHt9dmFyIFNyLEllO3Z0LmRhdGV0aW1lPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ImRhdGV0aW1lLWRldGVjdC0iK2NzKHQpO2V8fChlPSJlbiIpLHZ0LmV4dC50eXBlLm9yZGVyW3JdfHx2dC50eXBlKHIse2RldGVjdDpmdW5jdGlvbihuKXt2YXIgcz1fbihuLHQsZSk7cmV0dXJuIG49PT0iInx8cz9yOiExfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKG4pe3JldHVybiBfbihuLHQsZSl8fDB9fSxjbGFzc05hbWU6ImR0LXJpZ2h0In0pfTt2dC5yZW5kZXI9e2RhdGU6b2koInRvTG9jYWxlRGF0ZVN0cmluZyIpLGRhdGV0aW1lOm9pKCJ0b0xvY2FsZVN0cmluZyIpLHRpbWU6b2koInRvTG9jYWxlVGltZVN0cmluZyIpLG51bWJlcjpmdW5jdGlvbih0LGUscixuLHMpe3JldHVybiB0PT1udWxsJiYodD1mcyksZT09bnVsbCYmKGU9aHMpLHtkaXNwbGF5OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ibnVtYmVyIiYmdHlwZW9mIGEhPSJzdHJpbmcifHxhPT09IiJ8fGE9PT1udWxsKXJldHVybiBhO3ZhciBsPWE8MD8iLSI6IiIsYz1wYXJzZUZsb2F0KGEpLHA9TWF0aC5hYnMoYyk7aWYocD49MWUxMXx8cDwxZS00JiZwIT09MCl7dmFyIGI9Yy50b0V4cG9uZW50aWFsKHIpLnNwbGl0KC9lXCs/Lyk7cmV0dXJuIGJbMF0rIiB4IDEwPHN1cD4iK2JbMV0rIjwvc3VwPiJ9aWYoaXNOYU4oYykpcmV0dXJuIERyKGEpO2M9Yy50b0ZpeGVkKHIpLGE9TWF0aC5hYnMoYyk7dmFyIG09cGFyc2VJbnQoYSwxMCkseT1yP2UrKGEtbSkudG9GaXhlZChyKS5zdWJzdHJpbmcoMik6IiI7cmV0dXJuIG09PT0wJiZwYXJzZUZsb2F0KHkpPT09MCYmKGw9IiIpLGwrKG58fCIiKSttLnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0KSt5KyhzfHwiIil9fX0sdGV4dDpmdW5jdGlvbigpe3JldHVybntkaXNwbGF5OkRyLGZpbHRlcjpEcn19fTt2YXIgaGU9dnQuZXh0LnR5cGU7dnQudHlwZT1mdW5jdGlvbih0LGUscil7aWYoIWUpcmV0dXJue2NsYXNzTmFtZTpoZS5jbGFzc05hbWVbdF0sZGV0ZWN0OmhlLmRldGVjdC5maW5kKGZ1bmN0aW9uKGwpe3JldHVybiBsLm5hbWU9PT10fSksb3JkZXI6e3ByZTpoZS5vcmRlclt0KyItcHJlIl0sYXNjOmhlLm9yZGVyW3QrIi1hc2MiXSxkZXNjOmhlLm9yZGVyW3QrIi1kZXNjIl19LHJlbmRlcjpoZS5yZW5kZXJbdF0sc2VhcmNoOmhlLnNlYXJjaFt0XX07dmFyIG49ZnVuY3Rpb24obCxjKXtoZVtsXVt0XT1jfSxzPWZ1bmN0aW9uKGwpe3ZhciBjPWZ1bmN0aW9uKGIsbSl7dmFyIHk9bChiLG0pO3JldHVybiB5PT09ITA/dDp5fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYywibmFtZSIse3ZhbHVlOnR9KTt2YXIgcD1oZS5kZXRlY3QuZmluZEluZGV4KGZ1bmN0aW9uKGIpe3JldHVybiBiLm5hbWU9PT10fSk7cD09PS0xP2hlLmRldGVjdC51bnNoaWZ0KGMpOmhlLmRldGVjdC5zcGxpY2UocCwxLGMpfSxhPWZ1bmN0aW9uKGwpe2hlLm9yZGVyW3QrIi1wcmUiXT1sLnByZSxoZS5vcmRlclt0KyItYXNjIl09bC5hc2MsaGUub3JkZXJbdCsiLWRlc2MiXT1sLmRlc2N9O3I9PT12b2lkIDAmJihyPWUsZT1udWxsKSxlPT09ImNsYXNzTmFtZSI/bigiY2xhc3NOYW1lIixyKTplPT09ImRldGVjdCI/cyhyKTplPT09Im9yZGVyIj9hKHIpOmU9PT0icmVuZGVyIj9uKCJyZW5kZXIiLHIpOmU9PT0ic2VhcmNoIj9uKCJzZWFyY2giLHIpOmV8fChyLmNsYXNzTmFtZSYmbigiY2xhc3NOYW1lIixyLmNsYXNzTmFtZSksci5kZXRlY3QhPT12b2lkIDAmJnMoci5kZXRlY3QpLHIub3JkZXImJmEoci5vcmRlciksci5yZW5kZXIhPT12b2lkIDAmJm4oInJlbmRlciIsci5yZW5kZXIpLHIuc2VhcmNoIT09dm9pZCAwJiZuKCJzZWFyY2giLHIuc2VhcmNoKSl9O3Z0LnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGhlLmRldGVjdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pfTt2dC50eXBlKCJzdHJpbmciLHtkZXRlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIn0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXtyZXR1cm4gWmUodCk/IiI6dHlwZW9mIHQ9PSJzdHJpbmciP3QudG9Mb3dlckNhc2UoKTp0LnRvU3RyaW5nP3QudG9TdHJpbmcoKToiIn19LHNlYXJjaDpCbighMSwhMCl9KTt2dC50eXBlKCJodG1sIix7ZGV0ZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBaZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIjwiKSE9PS0xPyJodG1sIjpudWxsfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQpe3JldHVybiBaZSh0KT8iIjp0LnJlcGxhY2U/aHIodCkudHJpbSgpLnRvTG93ZXJDYXNlKCk6dCsiIn19LHNlYXJjaDpCbighMCwhMCl9KTt2dC50eXBlKCJkYXRlIix7Y2xhc3NOYW1lOiJkdC10eXBlLWRhdGUiLGRldGVjdDpmdW5jdGlvbih0KXtpZih0JiYhKHQgaW5zdGFuY2VvZiBEYXRlKSYmIVZvLnRlc3QodCkpcmV0dXJuIG51bGw7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gZSE9PW51bGwmJiFpc05hTihlKXx8WmUodCk/ImRhdGUiOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gaXNOYU4oZSk/LTEvMDplfX19KTt2dC50eXBlKCJodG1sLW51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIEhhKHQsciwhMCk/Imh0bWwtbnVtLWZtdCI6bnVsbH0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBObih0LHIscGksYmkpfX0sc2VhcmNoOkJuKCEwLCEwKX0pO3Z0LnR5cGUoImh0bWwtbnVtIix7Y2xhc3NOYW1lOiJkdC10eXBlLW51bWVyaWMiLGRldGVjdDpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIYSh0LHIpPyJodG1sLW51bSI6bnVsbH0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBObih0LHIscGkpfX0sc2VhcmNoOkJuKCEwLCEwKX0pO3Z0LnR5cGUoIm51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIHZpKHQsciwhMCk/Im51bS1mbXQiOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gTm4odCxyLGJpKX19fSk7dnQudHlwZSgibnVtIix7Y2xhc3NOYW1lOiJkdC10eXBlLW51bWVyaWMiLGRldGVjdDpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiB2aSh0LHIpPyJudW0iOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gTm4odCxyKX19fSk7dmFyIE5uPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQhPT0wJiYoIXR8fHQ9PT0iLSIpKXJldHVybi0xLzA7dmFyIHM9dHlwZW9mIHQ7cmV0dXJuIHM9PT0ibnVtYmVyInx8cz09PSJiaWdpbnQiP3Q6KGUmJih0PVZhKHQsZSkpLHQucmVwbGFjZSYmKHImJih0PXQucmVwbGFjZShyLCIiKSksbiYmKHQ9dC5yZXBsYWNlKG4sIiIpKSksdCoxKX07Vy5leHRlbmQoITAsdnQuZXh0LnJlbmRlcmVyLHtmb290ZXI6e186ZnVuY3Rpb24odCxlLHIpe2UuYWRkQ2xhc3Moci50Zm9vdC5jZWxsKX19LGhlYWRlcjp7XzpmdW5jdGlvbih0LGUscil7ZS5hZGRDbGFzcyhyLnRoZWFkLmNlbGwpLHQub0ZlYXR1cmVzLmJTb3J0fHxlLmFkZENsYXNzKHIub3JkZXIubm9uZSk7dmFyIG49dC5iU29ydENlbGxzVG9wLHM9ZS5jbG9zZXN0KCJ0aGVhZCIpLmZpbmQoInRyIiksYT1lLnBhcmVudCgpLmluZGV4KCk7ZS5hdHRyKCJkYXRhLWR0LW9yZGVyIik9PT0iZGlzYWJsZSJ8fGUucGFyZW50KCkuYXR0cigiZGF0YS1kdC1vcmRlciIpPT09ImRpc2FibGUifHxuPT09ITAmJmEhPT0wfHxuPT09ITEmJmEhPT1zLmxlbmd0aC0xfHxXKHQublRhYmxlKS5vbigib3JkZXIuZHQuRFQiLGZ1bmN0aW9uKGwsYyxwKXtpZih0PT09Yyl7dmFyIGI9ci5vcmRlcixtPWMuYXBpLmNvbHVtbnMoZSkseT10LmFvQ29sdW1uc1ttLmZsYXR0ZW4oKVswXV0sVD1tLm9yZGVyYWJsZSgpLmluY2x1ZGVzKCEwKSx3PSIiLGs9bS5pbmRleGVzKCksUD1tLm9yZGVyYWJsZSghMCkuZmxhdHRlbigpLEY9IiwiK3AubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBCLmNvbH0pLmpvaW4oIiwiKSsiLCI7ZS5yZW1vdmVDbGFzcyhiLmlzQXNjKyIgIitiLmlzRGVzYykudG9nZ2xlQ2xhc3MoYi5ub25lLCFUKS50b2dnbGVDbGFzcyhiLmNhbkFzYyxUJiZQLmluY2x1ZGVzKCJhc2MiKSkudG9nZ2xlQ2xhc3MoYi5jYW5EZXNjLFQmJlAuaW5jbHVkZXMoImRlc2MiKSk7dmFyIGg9Ri5pbmRleE9mKCIsIitrLnRvQXJyYXkoKS5qb2luKCIsIikrIiwiKTtpZihoIT09LTEpe3ZhciBvPW0ub3JkZXIoKTtlLmFkZENsYXNzKG8uaW5jbHVkZXMoImFzYyIpP2IuaXNBc2M6IiIrby5pbmNsdWRlcygiZGVzYyIpP2IuaXNEZXNjOiIiKX1pZihoPT09MCl7dmFyIGY9cFswXSxDPXkuYXNTb3J0aW5nO2UuYXR0cigiYXJpYS1zb3J0IixmLmRpcj09PSJhc2MiPyJhc2NlbmRpbmciOiJkZXNjZW5kaW5nIiksdz1DW2YuaW5kZXgrMV0/IlJldmVyc2UiOiJSZW1vdmUifWVsc2UgZS5yZW1vdmVBdHRyKCJhcmlhLXNvcnQiKTtlLmF0dHIoImFyaWEtbGFiZWwiLFQ/eS5hcmlhVGl0bGUrYy5hcGkuaTE4bigib0FyaWEub3JkZXJhYmxlIit3KTp5LmFyaWFUaXRsZSksVCYmKGUuZmluZCgiLmR0LWNvbHVtbi10aXRsZSIpLmF0dHIoInJvbGUiLCJidXR0b24iKSxlLmF0dHIoInRhYmluZGV4IiwwKSl9fSl9fSxsYXlvdXQ6e186ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVcoIjxkaXYvPiIpLmFkZENsYXNzKCJkdC1sYXlvdXQtcm93IikuYXBwZW5kVG8oZSk7Vy5lYWNoKHIsZnVuY3Rpb24ocyxhKXt2YXIgbD1hLnRhYmxlPyIiOiJkdC0iK3MrIiAiO2EudGFibGUmJm4uYWRkQ2xhc3MoImR0LWxheW91dC10YWJsZSIpLFcoIjxkaXYvPiIpLmF0dHIoe2lkOmEuaWR8fG51bGwsY2xhc3M6ImR0LWxheW91dC1jZWxsICIrbCsoYS5jbGFzc05hbWV8fCIiKX0pLmFwcGVuZChhLmNvbnRlbnRzKS5hcHBlbmRUbyhuKX0pfX19KTt2dC5mZWF0dXJlPXt9O3Z0LmZlYXR1cmUucmVnaXN0ZXI9ZnVuY3Rpb24odCxlLHIpe3Z0LmV4dC5mZWF0dXJlc1t0XT1lLHImJm9lLmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6cixmbkluaXQ6ZX0pfTt2dC5mZWF0dXJlLnJlZ2lzdGVyKCJpbmZvIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iSW5mbylyZXR1cm4gbnVsbDt2YXIgcj10Lm9MYW5ndWFnZSxuPXQuc1RhYmxlSWQscz1XKCI8ZGl2Lz4iLHtjbGFzczp0Lm9DbGFzc2VzLmluZm8uY29udGFpbmVyfSk7cmV0dXJuIGU9Vy5leHRlbmQoe2NhbGxiYWNrOnIuZm5JbmZvQ2FsbGJhY2ssZW1wdHk6ci5zSW5mb0VtcHR5LHBvc3RmaXg6ci5zSW5mb1Bvc3RGaXgsc2VhcmNoOnIuc0luZm9GaWx0ZXJlZCx0ZXh0OnIuc0luZm99LGUpLHQuYW9EcmF3Q2FsbGJhY2sucHVzaChmdW5jdGlvbihhKXtrbChhLGUscyl9KSx0Ll9pbmZvRWx8fChzLmF0dHIoeyJhcmlhLWxpdmUiOiJwb2xpdGUiLGlkOm4rIl9pbmZvIixyb2xlOiJzdGF0dXMifSksVyh0Lm5UYWJsZSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsbisiX2luZm8iKSx0Ll9pbmZvRWw9cyksc30sImkiKTtmdW5jdGlvbiBrbCh0LGUscil7dmFyIG49dC5faURpc3BsYXlTdGFydCsxLHM9dC5mbkRpc3BsYXlFbmQoKSxhPXQuZm5SZWNvcmRzVG90YWwoKSxsPXQuZm5SZWNvcmRzRGlzcGxheSgpLGM9bD9lLnRleHQ6ZS5lbXB0eTtsIT09YSYmKGMrPSIgIitlLnNlYXJjaCksYys9ZS5wb3N0Zml4LGM9QWkodCxjKSxlLmNhbGxiYWNrJiYoYz1lLmNhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxuLHMsYSxsLGMpKSxyLmh0bWwoYyksWnQodCxudWxsLCJpbmZvIixbdCxyWzBdLGNdKX12YXIgbGk9MDt2dC5mZWF0dXJlLnJlZ2lzdGVyKCJzZWFyY2giLGZ1bmN0aW9uKHQsZSl7aWYoIXQub0ZlYXR1cmVzLmJGaWx0ZXIpcmV0dXJuIG51bGw7dmFyIHI9dC5vQ2xhc3Nlcy5zZWFyY2gsbj10LnNUYWJsZUlkLHM9dC5vTGFuZ3VhZ2UsYT10Lm9QcmV2aW91c1NlYXJjaCxsPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBjbGFzcz0iJytyLmlucHV0KyciLz4nO2U9Vy5leHRlbmQoe3BsYWNlaG9sZGVyOnMuc1NlYXJjaFBsYWNlaG9sZGVyLHRleHQ6cy5zU2VhcmNofSxlKSxlLnRleHQuaW5kZXhPZigiX0lOUFVUXyIpPT09LTEmJihlLnRleHQrPSJfSU5QVVRfIiksZS50ZXh0PUFpKHQsZS50ZXh0KTt2YXIgYz1lLnRleHQubWF0Y2goL19JTlBVVF8kLykscD1lLnRleHQubWF0Y2goL15fSU5QVVRfLyksYj1lLnRleHQucmVwbGFjZSgvX0lOUFVUXy8sIiIpLG09IjxsYWJlbD4iK2UudGV4dCsiPC9sYWJlbD4iO3A/bT0iX0lOUFVUXzxsYWJlbD4iK2IrIjwvbGFiZWw+IjpjJiYobT0iPGxhYmVsPiIrYisiPC9sYWJlbD5fSU5QVVRfIik7dmFyIHk9VygiPGRpdj4iKS5hZGRDbGFzcyhyLmNvbnRhaW5lcikuYXBwZW5kKG0ucmVwbGFjZSgvX0lOUFVUXy8sbCkpO3kuZmluZCgibGFiZWwiKS5hdHRyKCJmb3IiLCJkdC1zZWFyY2gtIitsaSkseS5maW5kKCJpbnB1dCIpLmF0dHIoImlkIiwiZHQtc2VhcmNoLSIrbGkpLGxpKys7dmFyIFQ9ZnVuY3Rpb24oUCl7dmFyIEY9dGhpcy52YWx1ZTthLnJldHVybiYmUC5rZXkhPT0iRW50ZXIifHxGIT1hLnNlYXJjaCYmKGEuc2VhcmNoPUYsR3IodCxhKSx0Ll9pRGlzcGxheVN0YXJ0PTAsRnIodCkpfSx3PXQuc2VhcmNoRGVsYXkhPT1udWxsP3Quc2VhcmNoRGVsYXk6MCxrPVcoImlucHV0Iix5KS52YWwoYS5zZWFyY2gpLmF0dHIoInBsYWNlaG9sZGVyIixlLnBsYWNlaG9sZGVyKS5vbigia2V5dXAuRFQgc2VhcmNoLkRUIGlucHV0LkRUIHBhc3RlLkRUIGN1dC5EVCIsdz92dC51dGlsLmRlYm91bmNlKFQsdyk6VCkub24oIm1vdXNldXAuRFQiLGZ1bmN0aW9uKFApe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtULmNhbGwoa1swXSxQKX0sMTApfSkub24oImtleXByZXNzLkRUIixmdW5jdGlvbihQKXtpZihQLmtleUNvZGU9PTEzKXJldHVybiExfSkuYXR0cigiYXJpYS1jb250cm9scyIsbik7cmV0dXJuIFcodC5uVGFibGUpLm9uKCJzZWFyY2guZHQuRFQiLGZ1bmN0aW9uKFAsRil7dD09PUYmJmtbMF0hPT1kb2N1bWVudC5hY3RpdmVFbGVtZW50JiZrLnZhbCh0eXBlb2YgYS5zZWFyY2ghPSJmdW5jdGlvbiI/YS5zZWFyY2g6IiIpfSkseX0sImYiKTt2dC5mZWF0dXJlLnJlZ2lzdGVyKCJwYWdpbmciLGZ1bmN0aW9uKHQsZSl7aWYoIXQub0ZlYXR1cmVzLmJQYWdpbmF0ZSlyZXR1cm4gbnVsbDtlPVcuZXh0ZW5kKHtidXR0b25zOnZ0LmV4dC5wYWdlci5udW1iZXJzX2xlbmd0aCx0eXBlOnQuc1BhZ2luYXRpb25UeXBlLGJvdW5kYXJ5TnVtYmVyczohMH0sZSksZS5udW1iZXJzJiYoZS5idXR0b25zPWUubnVtYmVycyk7dmFyIHI9VygiPGRpdi8+IikuYWRkQ2xhc3ModC5vQ2xhc3Nlcy5wYWdpbmcuY29udGFpbmVyKyIgcGFnaW5nXyIrZS50eXBlKSxuPWZ1bmN0aW9uKCl7cHModCxyLGUpfTtyZXR1cm4gdC5hb0RyYXdDYWxsYmFjay5wdXNoKG4pLFcodC5uVGFibGUpLm9uKCJjb2x1bW4tc2l6aW5nLmR0LkRUIixuKSxyfSwicCIpO2Z1bmN0aW9uIHBzKHQsZSxyKXtpZih0Ll9iSW5pdENvbXBsZXRlKXtmb3IodmFyIG49dnQuZXh0LnBhZ2VyW3IudHlwZV0scz10Lm9MYW5ndWFnZS5vQXJpYS5wYWdpbmF0ZXx8e30sYT10Ll9pRGlzcGxheVN0YXJ0LGw9dC5faURpc3BsYXlMZW5ndGgsYz10LmZuUmVjb3Jkc0Rpc3BsYXkoKSxwPWw9PT0tMSxiPXA/MDpNYXRoLmNlaWwoYS9sKSxtPXA/MTpNYXRoLmNlaWwoYy9sKSx5PW4oKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGY9PT0ibnVtYmVycyI/YnMoYixtLHIuYnV0dG9ucyxyLmJvdW5kYXJ5TnVtYmVycyk6Zn0pLmZsYXQoKSxUPVtdLHc9MDt3PHkubGVuZ3RoO3crKyl7dmFyIGs9eVt3XSxQPVNsKHQsayxiLG0pLEY9eG4odCwicGFnaW5nQnV0dG9uIikodCxrLFAuZGlzcGxheSxQLmFjdGl2ZSxQLmRpc2FibGVkKTtXKEYuY2xpY2tlcikuYXR0cih7ImFyaWEtY29udHJvbHMiOnQuc1RhYmxlSWQsImFyaWEtZGlzYWJsZWQiOlAuZGlzYWJsZWQ/InRydWUiOm51bGwsImFyaWEtY3VycmVudCI6UC5hY3RpdmU/InBhZ2UiOm51bGwsImFyaWEtbGFiZWwiOnNba10sImRhdGEtZHQtaWR4IjprLHRhYkluZGV4OlAuZGlzYWJsZWQ/LTE6dC5pVGFiSW5kZXh9KSx0eXBlb2YgayE9Im51bWJlciImJlcoRi5jbGlja2VyKS5hZGRDbGFzcyhrKSxpcyhGLmNsaWNrZXIse2FjdGlvbjprfSxmdW5jdGlvbihmKXtmLnByZXZlbnREZWZhdWx0KCksU2kodCxmLmRhdGEuYWN0aW9uLCEwKX0pLFQucHVzaChGLmRpc3BsYXkpfXZhciBoPXhuKHQsInBhZ2luZ0NvbnRhaW5lciIpKHQsVCksbz1lLmZpbmQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuZGF0YSgiZHQtaWR4Iik7ZS5lbXB0eSgpLmFwcGVuZChoKSxvIT09dm9pZCAwJiZlLmZpbmQoIltkYXRhLWR0LWlkeD0iK28rIl0iKS50cmlnZ2VyKCJmb2N1cyIpLFQubGVuZ3RoJiZyLm51bWJlcnM+MSYmVyhlKS5oZWlnaHQoKT49VyhUWzBdKS5vdXRlckhlaWdodCgpKjItMTAmJnBzKHQsZSxXLmV4dGVuZCh7fSxyLHtudW1iZXJzOnIubnVtYmVycy0yfSkpfX1mdW5jdGlvbiBTbCh0LGUscixuKXt2YXIgcz10Lm9MYW5ndWFnZS5vUGFnaW5hdGUsYT17ZGlzcGxheToiIixhY3RpdmU6ITEsZGlzYWJsZWQ6ITF9O3N3aXRjaChlKXtjYXNlImVsbGlwc2lzIjphLmRpc3BsYXk9IiYjeDIwMjY7IixhLmRpc2FibGVkPSEwO2JyZWFrO2Nhc2UiZmlyc3QiOmEuZGlzcGxheT1zLnNGaXJzdCxyPT09MCYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UicHJldmlvdXMiOmEuZGlzcGxheT1zLnNQcmV2aW91cyxyPT09MCYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibmV4dCI6YS5kaXNwbGF5PXMuc05leHQsKG49PT0wfHxyPT09bi0xKSYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibGFzdCI6YS5kaXNwbGF5PXMuc0xhc3QsKG49PT0wfHxyPT09bi0xKSYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGU9PSJudW1iZXIiJiYoYS5kaXNwbGF5PXQuZm5Gb3JtYXROdW1iZXIoZSsxKSxyPT09ZSYmKGEuYWN0aXZlPSEwKSk7YnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gYnModCxlLHIsbil7dmFyIHM9W10sYT1NYXRoLmZsb29yKHIvMiksbD1uPzI6MSxjPW4/MTowO3JldHVybiBlPD1yP3M9Y3IoMCxlKTpyPT09MT9zPVt0XTpyPT09Mz90PD0xP3M9WzAsMSwiZWxsaXBzaXMiXTp0Pj1lLTI/KHM9Y3IoZS0yLGUpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSk6cz1bImVsbGlwc2lzIix0LCJlbGxpcHNpcyJdOnQ8PWE/KHM9Y3IoMCxyLWwpLHMucHVzaCgiZWxsaXBzaXMiKSxuJiZzLnB1c2goZS0xKSk6dD49ZS0xLWE/KHM9Y3IoZS0oci1sKSxlKSxzLnVuc2hpZnQoImVsbGlwc2lzIiksbiYmcy51bnNoaWZ0KDApKToocz1jcih0LWErbCx0K2EtYykscy5wdXNoKCJlbGxpcHNpcyIpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSxuJiYocy5wdXNoKGUtMSkscy51bnNoaWZ0KDApKSksc312YXIgZGk9MDt2dC5mZWF0dXJlLnJlZ2lzdGVyKCJwYWdlTGVuZ3RoIixmdW5jdGlvbih0LGUpe3ZhciByPXQub0ZlYXR1cmVzO2lmKCFyLmJQYWdpbmF0ZXx8IXIuYkxlbmd0aENoYW5nZSlyZXR1cm4gbnVsbDtlPVcuZXh0ZW5kKHttZW51OnQuYUxlbmd0aE1lbnUsdGV4dDp0Lm9MYW5ndWFnZS5zTGVuZ3RoTWVudX0sZSk7dmFyIG49dC5vQ2xhc3Nlcy5sZW5ndGgscz10LnNUYWJsZUlkLGE9ZS5tZW51LGw9W10sYz1bXSxwO2lmKEFycmF5LmlzQXJyYXkoYVswXSkpbD1hWzBdLGM9YVsxXTtlbHNlIGZvcihwPTA7cDxhLmxlbmd0aDtwKyspVy5pc1BsYWluT2JqZWN0KGFbcF0pPyhsLnB1c2goYVtwXS52YWx1ZSksYy5wdXNoKGFbcF0ubGFiZWwpKToobC5wdXNoKGFbcF0pLGMucHVzaChhW3BdKSk7dmFyIGI9ZS50ZXh0Lm1hdGNoKC9fTUVOVV8kLyksbT1lLnRleHQubWF0Y2goL15fTUVOVV8vKSx5PWUudGV4dC5yZXBsYWNlKC9fTUVOVV8vLCIiKSxUPSI8bGFiZWw+IitlLnRleHQrIjwvbGFiZWw+IjttP1Q9Il9NRU5VXzxsYWJlbD4iK3krIjwvbGFiZWw+IjpiJiYoVD0iPGxhYmVsPiIreSsiPC9sYWJlbD5fTUVOVV8iKTt2YXIgdz1XKCI8ZGl2Lz4iKS5hZGRDbGFzcyhuLmNvbnRhaW5lcikuYXBwZW5kKFQucmVwbGFjZSgiX01FTlVfIiwiPHNwYW4+PC9zcGFuPiIpKSxrPVtdO3cuZmluZCgibGFiZWwiKVswXS5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24oaCl7aC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFJiZrLnB1c2goe2VsOmgsdGV4dDpoLnRleHRDb250ZW50fSl9KTt2YXIgUD1mdW5jdGlvbihoKXtrLmZvckVhY2goZnVuY3Rpb24obyl7by5lbC50ZXh0Q29udGVudD1BaSh0LG8udGV4dCxoKX0pfSxGPVcoIjxzZWxlY3QvPiIse25hbWU6cysiX2xlbmd0aCIsImFyaWEtY29udHJvbHMiOnMsY2xhc3M6bi5zZWxlY3R9KTtmb3IocD0wO3A8bC5sZW5ndGg7cCsrKUZbMF1bcF09bmV3IE9wdGlvbih0eXBlb2YgY1twXT09Im51bWJlciI/dC5mbkZvcm1hdE51bWJlcihjW3BdKTpjW3BdLGxbcF0pO3JldHVybiB3LmZpbmQoImxhYmVsIikuYXR0cigiZm9yIiwiZHQtbGVuZ3RoLSIrZGkpLEYuYXR0cigiaWQiLCJkdC1sZW5ndGgtIitkaSksZGkrKyx3LmZpbmQoInNwYW4iKS5yZXBsYWNlV2l0aChGKSxXKCJzZWxlY3QiLHcpLnZhbCh0Ll9pRGlzcGxheUxlbmd0aCkub24oImNoYW5nZS5EVCIsZnVuY3Rpb24oKXtRYSh0LFcodGhpcykudmFsKCkpLEZyKHQpfSksVyh0Lm5UYWJsZSkub24oImxlbmd0aC5kdC5EVCIsZnVuY3Rpb24oaCxvLGYpe3Q9PT1vJiYoVygic2VsZWN0Iix3KS52YWwoZiksUChmKSl9KSxQKHQuX2lEaXNwbGF5TGVuZ3RoKSx3fSwibCIpO1cuZm4uZGF0YVRhYmxlPXZ0O3Z0LiQ9VztXLmZuLmRhdGFUYWJsZVNldHRpbmdzPXZ0LnNldHRpbmdzO1cuZm4uZGF0YVRhYmxlRXh0PXZ0LmV4dDtXLmZuLkRhdGFUYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gVyh0aGlzKS5kYXRhVGFibGUodCkuYXBpKCl9O1cuZWFjaCh2dCxmdW5jdGlvbih0LGUpe1cuZm4uRGF0YVRhYmxlW3RdPWV9KTt2YXIgc3Q9dnQ7dmFyIEtlPXN0O3ZhciBObD1uZShpZSgpLDEpO3ZhciB5cz1uZShpZSgpLDEpO3ZhciBodD15cy5kZWZhdWx0LEFsPTAsSWw9MCxfZT1zdC5leHQuYnV0dG9ucyxPaT1udWxsO2Z1bmN0aW9uIFJpKHQsZSxyKXtodC5mbi5hbmltYXRlP3Quc3RvcCgpLmZhZGVJbihlLHIpOih0LmNzcygiZGlzcGxheSIsImJsb2NrIiksciYmci5jYWxsKHQpKX1mdW5jdGlvbiBMaSh0LGUscil7aHQuZm4uYW5pbWF0ZT90LnN0b3AoKS5mYWRlT3V0KGUscik6KHQuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLHImJnIuY2FsbCh0KSl9dmFyIEp0PWZ1bmN0aW9uKHQsZSl7aWYoIXN0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IEJ1dHRvbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIjtpZighKHRoaXMgaW5zdGFuY2VvZiBKdCkpcmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBuZXcgSnQocix0KS5jb250YWluZXIoKX07dHlwZW9mIGU+InUiJiYoZT17fSksZT09PSEwJiYoZT17fSksQXJyYXkuaXNBcnJheShlKSYmKGU9e2J1dHRvbnM6ZX0pLHRoaXMuYz1odC5leHRlbmQoITAse30sSnQuZGVmYXVsdHMsZSksZS5idXR0b25zJiYodGhpcy5jLmJ1dHRvbnM9ZS5idXR0b25zKSx0aGlzLnM9e2R0Om5ldyBzdC5BcGkodCksYnV0dG9uczpbXSxsaXN0ZW5LZXlzOiIiLG5hbWVzcGFjZToiZHRiIitBbCsrfSx0aGlzLmRvbT17Y29udGFpbmVyOmh0KCI8Iit0aGlzLmMuZG9tLmNvbnRhaW5lci50YWcrIi8+IikuYWRkQ2xhc3ModGhpcy5jLmRvbS5jb250YWluZXIuY2xhc3NOYW1lKX0sdGhpcy5fY29uc3RydWN0b3IoKX07aHQuZXh0ZW5kKEp0LnByb3RvdHlwZSx7YWN0aW9uOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP3IuY29uZi5hY3Rpb246KHIuY29uZi5hY3Rpb249ZSx0aGlzKX0sYWN0aXZlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpLG49dGhpcy5jLmRvbS5idXR0b24uYWN0aXZlLHM9aHQoci5ub2RlKTtyZXR1cm4gci5pbkNvbGxlY3Rpb24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24uYWN0aXZlIT09dm9pZCAwJiYobj10aGlzLmMuZG9tLmNvbGxlY3Rpb24uYnV0dG9uLmFjdGl2ZSksZT09PXZvaWQgMD9zLmhhc0NsYXNzKG4pOihzLnRvZ2dsZUNsYXNzKG4sZT09PXZvaWQgMD8hMDplKSx0aGlzKX0sYWRkOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnMuYnV0dG9ucztpZih0eXBlb2YgZT09InN0cmluZyIpe2Zvcih2YXIgcz1lLnNwbGl0KCItIiksYT10aGlzLnMsbD0wLGM9cy5sZW5ndGgtMTtsPGM7bCsrKWE9YS5idXR0b25zW3NbbF0qMV07bj1hLmJ1dHRvbnMsZT1zW3MubGVuZ3RoLTFdKjF9cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbihuLHQsdCE9PXZvaWQgMD90LnNwbGl0OnZvaWQgMCwodD09PXZvaWQgMHx8dC5zcGxpdD09PXZvaWQgMHx8dC5zcGxpdC5sZW5ndGg9PT0wKSYmYSE9PXZvaWQgMCwhMSxlKSwocj09PXZvaWQgMHx8cj09PSEwKSYmdGhpcy5fZHJhdygpLHRoaXN9LGNvbGxlY3Rpb25SZWJ1aWxkOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO2lmKGUhPT12b2lkIDApe3ZhciBuO2ZvcihuPXIuYnV0dG9ucy5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZShyLmJ1dHRvbnNbbl0ubm9kZSk7Zm9yKHIuY29uZi5wcmVmaXhCdXR0b25zJiZlLnVuc2hpZnQuYXBwbHkoZSxyLmNvbmYucHJlZml4QnV0dG9ucyksci5jb25mLnBvc3RmaXhCdXR0b25zJiZlLnB1c2guYXBwbHkoZSxyLmNvbmYucG9zdGZpeEJ1dHRvbnMpLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHM9ZVtuXTt0aGlzLl9leHBhbmRCdXR0b24oci5idXR0b25zLHMscyE9PXZvaWQgMCYmcy5jb25maWchPT12b2lkIDAmJnMuY29uZmlnLnNwbGl0IT09dm9pZCAwLCEwLHMucGFyZW50Q29uZiE9PXZvaWQgMCYmcy5wYXJlbnRDb25mLnNwbGl0IT09dm9pZCAwLG51bGwscy5wYXJlbnRDb25mKX19dGhpcy5fZHJhdyhyLmNvbGxlY3Rpb24sci5idXR0b25zKX0sY29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGh0KGUubm9kZSkuYWRkQ2xhc3ModGhpcy5jLmRvbS5idXR0b24uZGlzYWJsZWQpLnByb3AoImRpc2FibGVkIiwhMCksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe2h0KCJib2R5Iikub2ZmKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UpO3ZhciB0PXRoaXMucy5idXR0b25zLnNsaWNlKCksZSxyO2ZvcihlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKXRoaXMucmVtb3ZlKHRbZV0ubm9kZSk7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZSgpO3ZhciBuPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2ZvcihlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKWlmKG4uaW5zdD09PXRoaXMpe24uc3BsaWNlKGUsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0LGUpe2lmKGU9PT0hMSlyZXR1cm4gdGhpcy5kaXNhYmxlKHQpO3ZhciByPXRoaXMuX25vZGVUb0J1dHRvbih0KTtyZXR1cm4gaHQoci5ub2RlKS5yZW1vdmVDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCkucHJvcCgiZGlzYWJsZWQiLCExKSx0aGlzfSxpbmRleDpmdW5jdGlvbih0LGUscil7ZXx8KGU9IiIscj10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciBuPTAscz1yLmxlbmd0aDtuPHM7bisrKXt2YXIgYT1yW25dLmJ1dHRvbnM7aWYocltuXS5ub2RlPT09dClyZXR1cm4gZStuO2lmKGEmJmEubGVuZ3RoKXt2YXIgbD10aGlzLmluZGV4KHQsbisiLSIsYSk7aWYobCE9PW51bGwpcmV0dXJuIGx9fXJldHVybiBudWxsfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5uYW1lfSxub2RlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzLmRvbS5jb250YWluZXI7dmFyIGU9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBodChlLm5vZGUpfSxwcm9jZXNzaW5nOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5zLmR0LG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP2h0KG4ubm9kZSkuaGFzQ2xhc3MoInByb2Nlc3NpbmciKTooaHQobi5ub2RlKS50b2dnbGVDbGFzcygicHJvY2Vzc2luZyIsZSksaHQoci50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtcHJvY2Vzc2luZy5kdCIsW2Usci5idXR0b24odCkscixodCh0KSxuLmNvbmZdKSx0aGlzKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVUb0J1dHRvbih0KSxyPXRoaXMuX25vZGVUb0hvc3QodCksbj10aGlzLnMuZHQ7aWYoZS5idXR0b25zLmxlbmd0aClmb3IodmFyIHM9ZS5idXR0b25zLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlKGUuYnV0dG9uc1tzXS5ub2RlKTtlLmNvbmYuZGVzdHJveWluZz0hMCxlLmNvbmYuZGVzdHJveSYmZS5jb25mLmRlc3Ryb3kuY2FsbChuLmJ1dHRvbih0KSxuLGh0KHQpLGUuY29uZiksdGhpcy5fcmVtb3ZlS2V5KGUuY29uZiksaHQoZS5ub2RlKS5yZW1vdmUoKTt2YXIgYT1odC5pbkFycmF5KGUscik7cmV0dXJuIHIuc3BsaWNlKGEsMSksdGhpc30sdGV4dDpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX25vZGVUb0J1dHRvbih0KSxuPXIudGV4dE5vZGUscz10aGlzLnMuZHQsYT1odChyLm5vZGUpLGw9ZnVuY3Rpb24oYyl7cmV0dXJuIHR5cGVvZiBjPT0iZnVuY3Rpb24iP2MocyxhLHIuY29uZik6Y307cmV0dXJuIGU9PT12b2lkIDA/bChyLmNvbmYudGV4dCk6KHIuY29uZi50ZXh0PWUsbi5odG1sKGwoZSkpLHRoaXMpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LHI9ZS5zZXR0aW5ncygpWzBdLG49dGhpcy5jLmJ1dHRvbnM7ci5fYnV0dG9uc3x8KHIuX2J1dHRvbnM9W10pLHIuX2J1dHRvbnMucHVzaCh7aW5zdDp0aGlzLG5hbWU6dGhpcy5jLm5hbWV9KTtmb3IodmFyIHM9MCxhPW4ubGVuZ3RoO3M8YTtzKyspdGhpcy5hZGQobltzXSk7ZS5vbigiZGVzdHJveSIsZnVuY3Rpb24obCxjKXtjPT09ciYmdC5kZXN0cm95KCl9KSxodCgiYm9keSIpLm9uKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UsZnVuY3Rpb24obCl7aWYoIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5KXt2YXIgYz1TdHJpbmcuZnJvbUNoYXJDb2RlKGwua2V5Q29kZSkudG9Mb3dlckNhc2UoKTt0LnMubGlzdGVuS2V5cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoYykhPT0tMSYmdC5fa2V5cHJlc3MoYyxsKX19KX0sX2FkZEtleTpmdW5jdGlvbih0KXt0LmtleSYmKHRoaXMucy5saXN0ZW5LZXlzKz1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXkpfSxfZHJhdzpmdW5jdGlvbih0LGUpe3R8fCh0PXRoaXMuZG9tLmNvbnRhaW5lcixlPXRoaXMucy5idXR0b25zKSx0LmNoaWxkcmVuKCkuZGV0YWNoKCk7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQuYXBwZW5kKGVbcl0uaW5zZXJ0ZXIpLHQuYXBwZW5kKCIgIiksZVtyXS5idXR0b25zJiZlW3JdLmJ1dHRvbnMubGVuZ3RoJiZ0aGlzLl9kcmF3KGVbcl0uY29sbGVjdGlvbixlW3JdLmJ1dHRvbnMpfSxfZXhwYW5kQnV0dG9uOmZ1bmN0aW9uKHQsZSxyLG4scyxhLGwpe3ZhciBjPXRoaXMucy5kdCxwPSExLGI9dGhpcy5jLmRvbS5jb2xsZWN0aW9uLG09QXJyYXkuaXNBcnJheShlKT9lOltlXTtlPT09dm9pZCAwJiYobT1BcnJheS5pc0FycmF5KHIpP3I6W3JdKTtmb3IodmFyIHk9MCxUPW0ubGVuZ3RoO3k8VDt5Kyspe3ZhciB3PXRoaXMuX3Jlc29sdmVFeHRlbmRzKG1beV0pO2lmKHcpe2lmKHA9ISEody5jb25maWcmJncuY29uZmlnLnNwbGl0KSxBcnJheS5pc0FycmF5KHcpKXt0aGlzLl9leHBhbmRCdXR0b24odCx3LGshPT12b2lkIDAmJmsuY29uZiE9PXZvaWQgMD9rLmNvbmYuc3BsaXQ6dm9pZCAwLG4sbCE9PXZvaWQgMCYmbC5zcGxpdCE9PXZvaWQgMCxhLGwpO2NvbnRpbnVlfXZhciBrPXRoaXMuX2J1aWxkQnV0dG9uKHcsbix3LnNwbGl0IT09dm9pZCAwfHx3LmNvbmZpZyE9PXZvaWQgMCYmdy5jb25maWcuc3BsaXQhPT12b2lkIDAscyk7aWYoayl7aWYoYSE9bnVsbD8odC5zcGxpY2UoYSwwLGspLGErKyk6dC5wdXNoKGspLGsuY29uZi5idXR0b25zJiYoay5jb2xsZWN0aW9uPWh0KCI8IitiLmNvbnRhaW5lci5jb250ZW50LnRhZysiLz4iKSxrLmNvbmYuX2NvbGxlY3Rpb249ay5jb2xsZWN0aW9uLGh0KGsubm9kZSkuYXBwZW5kKGIuYWN0aW9uLmRyb3BIdG1sKSx0aGlzLl9leHBhbmRCdXR0b24oay5idXR0b25zLGsuY29uZi5idXR0b25zLGsuY29uZi5zcGxpdCwhcCxwLGEsay5jb25mKSksay5jb25mLnNwbGl0KXtrLmNvbGxlY3Rpb249aHQoIjwiK2IuY29udGFpbmVyLnRhZysiLz4iKSxrLmNvbmYuX2NvbGxlY3Rpb249ay5jb2xsZWN0aW9uO2Zvcih2YXIgUD0wO1A8ay5jb25mLnNwbGl0Lmxlbmd0aDtQKyspe3ZhciBGPWsuY29uZi5zcGxpdFtQXTt0eXBlb2YgRj09Im9iamVjdCImJihGLnBhcmVudD1sLEYuY29sbGVjdGlvbkxheW91dD09PXZvaWQgMCYmKEYuY29sbGVjdGlvbkxheW91dD1rLmNvbmYuY29sbGVjdGlvbkxheW91dCksRi5kcm9wdXA9PT12b2lkIDAmJihGLmRyb3B1cD1rLmNvbmYuZHJvcHVwKSxGLmZhZGU9PT12b2lkIDAmJihGLmZhZGU9ay5jb25mLmZhZGUpKX10aGlzLl9leHBhbmRCdXR0b24oay5idXR0b25zLGsuY29uZi5idXR0b25zLGsuY29uZi5zcGxpdCwhcCxwLGEsay5jb25mKX1rLmNvbmYucGFyZW50PWwsdy5pbml0JiZ3LmluaXQuY2FsbChjLmJ1dHRvbihrLm5vZGUpLGMsaHQoay5ub2RlKSx3KX19fX0sX2J1aWxkQnV0dG9uOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPXRoaXMsYT10aGlzLmMuZG9tLGwsYz10aGlzLnMuZHQscD1mdW5jdGlvbihldCl7cmV0dXJuIHR5cGVvZiBldD09ImZ1bmN0aW9uIj9ldChjLHksdCk6ZXR9LGI9aHQuZXh0ZW5kKCEwLHt9LGEuYnV0dG9uKTtpZihlJiZyJiZhLmNvbGxlY3Rpb24uc3BsaXQ/aHQuZXh0ZW5kKCEwLGIsYS5jb2xsZWN0aW9uLnNwbGl0LmFjdGlvbik6bnx8ZT9odC5leHRlbmQoITAsYixhLmNvbGxlY3Rpb24uYnV0dG9uKTpyJiZodC5leHRlbmQoITAsYixhLnNwbGl0LmJ1dHRvbiksdC5zcGFjZXIpe3ZhciBtPWh0KCI8IitiLnNwYWNlci50YWcrIi8+IikuYWRkQ2xhc3MoImR0LWJ1dHRvbi1zcGFjZXIgIit0LnN0eWxlKyIgIitiLnNwYWNlci5jbGFzc05hbWUpLmh0bWwocCh0LnRleHQpKTtyZXR1cm57Y29uZjp0LG5vZGU6bSxpbnNlcnRlcjptLGJ1dHRvbnM6W10saW5Db2xsZWN0aW9uOmUsaXNTcGxpdDpyLGNvbGxlY3Rpb246bnVsbCx0ZXh0Tm9kZTptfX1pZih0LmF2YWlsYWJsZSYmIXQuYXZhaWxhYmxlKGMsdCkmJiF0Lmh0bWwpcmV0dXJuITE7dmFyIHk7aWYodC5odG1sKXk9aHQodC5odG1sKTtlbHNle3ZhciBUPWZ1bmN0aW9uKGV0LE8sWixnLF8pe2cuYWN0aW9uLmNhbGwoTy5idXR0b24oWiksZXQsTyxaLGcsXyksaHQoTy50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbTy5idXR0b24oWiksTyxaLGddKX0sdz1mdW5jdGlvbihldCxPLFosZyl7Zy5hc3luYz8ocy5wcm9jZXNzaW5nKFpbMF0sITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtUKGV0LE8sWixnLGZ1bmN0aW9uKCl7cy5wcm9jZXNzaW5nKFpbMF0sITEpfSl9LGcuYXN5bmMpKTpUKGV0LE8sWixnLGZ1bmN0aW9uKCl7fSl9LGs9dC50YWd8fGIudGFnLFA9dC5jbGlja0JsdXJzPT09dm9pZCAwPyEwOnQuY2xpY2tCbHVycztpZih5PWh0KCI8IitrKyIvPiIpLmFkZENsYXNzKGIuY2xhc3NOYW1lKS5hdHRyKCJ0YWJpbmRleCIsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0uaVRhYkluZGV4KS5hdHRyKCJhcmlhLWNvbnRyb2xzIix0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkuaWQpLm9uKCJjbGljay5kdGIiLGZ1bmN0aW9uKGV0KXtldC5wcmV2ZW50RGVmYXVsdCgpLCF5Lmhhc0NsYXNzKGIuZGlzYWJsZWQpJiZ0LmFjdGlvbiYmdyhldCxjLHksdCksUCYmeS50cmlnZ2VyKCJibHVyIil9KS5vbigia2V5cHJlc3MuZHRiIixmdW5jdGlvbihldCl7ZXQua2V5Q29kZT09PTEzJiYoZXQucHJldmVudERlZmF1bHQoKSwheS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJncoZXQsYyx5LHQpKX0pLGsudG9Mb3dlckNhc2UoKT09PSJhIiYmeS5hdHRyKCJocmVmIiwiIyIpLGsudG9Mb3dlckNhc2UoKT09PSJidXR0b24iJiZ5LmF0dHIoInR5cGUiLCJidXR0b24iKSxiLmxpbmVyLnRhZyl7dmFyIEY9aHQoIjwiK2IubGluZXIudGFnKyIvPiIpLmh0bWwocCh0LnRleHQpKS5hZGRDbGFzcyhiLmxpbmVyLmNsYXNzTmFtZSk7Yi5saW5lci50YWcudG9Mb3dlckNhc2UoKT09PSJhIiYmRi5hdHRyKCJocmVmIiwiIyIpLHkuYXBwZW5kKEYpLGw9Rn1lbHNlIHkuaHRtbChwKHQudGV4dCkpLGw9eTt0LmVuYWJsZWQ9PT0hMSYmeS5hZGRDbGFzcyhiLmRpc2FibGVkKSx0LmNsYXNzTmFtZSYmeS5hZGRDbGFzcyh0LmNsYXNzTmFtZSksdC50aXRsZUF0dHImJnkuYXR0cigidGl0bGUiLHAodC50aXRsZUF0dHIpKSx0LmF0dHImJnkuYXR0cih0LmF0dHIpLHQubmFtZXNwYWNlfHwodC5uYW1lc3BhY2U9Ii5kdC1idXR0b24tIitJbCsrKSx0LmNvbmZpZyE9PXZvaWQgMCYmdC5jb25maWcuc3BsaXQmJih0LnNwbGl0PXQuY29uZmlnLnNwbGl0KX12YXIgaD10aGlzLmMuZG9tLmJ1dHRvbkNvbnRhaW5lcixvO2gmJmgudGFnP289aHQoIjwiK2gudGFnKyIvPiIpLmFkZENsYXNzKGguY2xhc3NOYW1lKS5hcHBlbmQoeSk6bz15LHRoaXMuX2FkZEtleSh0KSx0aGlzLmMuYnV0dG9uQ3JlYXRlZCYmKG89dGhpcy5jLmJ1dHRvbkNyZWF0ZWQodCxvKSk7dmFyIGY7aWYocil7dmFyIEM9ZT9odC5leHRlbmQoITAsdGhpcy5jLmRvbS5zcGxpdCx0aGlzLmMuZG9tLmNvbGxlY3Rpb24uc3BsaXQpOnRoaXMuYy5kb20uc3BsaXQsQj1DLndyYXBwZXI7Zj1odCgiPCIrQi50YWcrIi8+IikuYWRkQ2xhc3MoQi5jbGFzc05hbWUpLmFwcGVuZCh5KTt2YXIgdT1odC5leHRlbmQodCx7YWxpZ246Qy5kcm9wZG93bi5hbGlnbixhdHRyOnsiYXJpYS1oYXNwb3B1cCI6ImRpYWxvZyIsImFyaWEtZXhwYW5kZWQiOiExfSxjbGFzc05hbWU6Qy5kcm9wZG93bi5jbGFzc05hbWUsY2xvc2VCdXR0b246ITEsc3BsaXRBbGlnbkNsYXNzOkMuZHJvcGRvd24uc3BsaXRBbGlnbkNsYXNzLHRleHQ6Qy5kcm9wZG93bi50ZXh0fSk7dGhpcy5fYWRkS2V5KHUpO3ZhciB6PWZ1bmN0aW9uKGV0LE8sWixnKXtfZS5zcGxpdC5hY3Rpb24uY2FsbChPLmJ1dHRvbihmKSxldCxPLFosZyksaHQoTy50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbTy5idXR0b24oWiksTyxaLGddKSxaLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX0scT1odCgnPGJ1dHRvbiBjbGFzcz0iJytDLmRyb3Bkb3duLmNsYXNzTmFtZSsnIGR0LWJ1dHRvbiI+PC9idXR0b24+JykuaHRtbChDLmRyb3Bkb3duLmRyb3BIdG1sKS5vbigiY2xpY2suZHRiIixmdW5jdGlvbihldCl7ZXQucHJldmVudERlZmF1bHQoKSxldC5zdG9wUHJvcGFnYXRpb24oKSxxLmhhc0NsYXNzKGIuZGlzYWJsZWQpfHx6KGV0LGMscSx1KSxQJiZxLnRyaWdnZXIoImJsdXIiKX0pLm9uKCJrZXlwcmVzcy5kdGIiLGZ1bmN0aW9uKGV0KXtldC5rZXlDb2RlPT09MTMmJihldC5wcmV2ZW50RGVmYXVsdCgpLHEuaGFzQ2xhc3MoYi5kaXNhYmxlZCl8fHooZXQsYyxxLHUpKX0pO3Quc3BsaXQubGVuZ3RoPT09MCYmcS5hZGRDbGFzcygiZHRiLWhpZGUtZHJvcCIpLGYuYXBwZW5kKHEpLmF0dHIodS5hdHRyKX1yZXR1cm57Y29uZjp0LG5vZGU6cj9mLmdldCgwKTp5LmdldCgwKSxpbnNlcnRlcjpyP2Y6byxidXR0b25zOltdLGluQ29sbGVjdGlvbjplLGlzU3BsaXQ6cixpblNwbGl0Om4sY29sbGVjdGlvbjpudWxsLHRleHROb2RlOmx9fSxfbm9kZVRvQnV0dG9uOmZ1bmN0aW9uKHQsZSl7ZXx8KGU9dGhpcy5zLmJ1dHRvbnMpO2Zvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7aWYoZVtyXS5ub2RlPT09dClyZXR1cm4gZVtyXTtpZihlW3JdLmJ1dHRvbnMubGVuZ3RoKXt2YXIgcz10aGlzLl9ub2RlVG9CdXR0b24odCxlW3JdLmJ1dHRvbnMpO2lmKHMpcmV0dXJuIHN9fX0sX25vZGVUb0hvc3Q6ZnVuY3Rpb24odCxlKXtlfHwoZT10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtpZihlW3JdLm5vZGU9PT10KXJldHVybiBlO2lmKGVbcl0uYnV0dG9ucy5sZW5ndGgpe3ZhciBzPXRoaXMuX25vZGVUb0hvc3QodCxlW3JdLmJ1dHRvbnMpO2lmKHMpcmV0dXJuIHN9fX0sX2tleXByZXNzOmZ1bmN0aW9uKHQsZSl7aWYoIWUuX2J1dHRvbnNIYW5kbGVkKXt2YXIgcj1mdW5jdGlvbihzLGEpe2lmKHMua2V5KXtpZihzLmtleT09PXQpZS5fYnV0dG9uc0hhbmRsZWQ9ITAsaHQoYSkuY2xpY2soKTtlbHNlIGlmKGh0LmlzUGxhaW5PYmplY3Qocy5rZXkpKXtpZihzLmtleS5rZXkhPT10fHxzLmtleS5zaGlmdEtleSYmIWUuc2hpZnRLZXl8fHMua2V5LmFsdEtleSYmIWUuYWx0S2V5fHxzLmtleS5jdHJsS2V5JiYhZS5jdHJsS2V5fHxzLmtleS5tZXRhS2V5JiYhZS5tZXRhS2V5KXJldHVybjtlLl9idXR0b25zSGFuZGxlZD0hMCxodChhKS5jbGljaygpfX19LG49ZnVuY3Rpb24ocyl7Zm9yKHZhciBhPTAsbD1zLmxlbmd0aDthPGw7YSsrKXIoc1thXS5jb25mLHNbYV0ubm9kZSksc1thXS5idXR0b25zLmxlbmd0aCYmbihzW2FdLmJ1dHRvbnMpfTtuKHRoaXMucy5idXR0b25zKX19LF9yZW1vdmVLZXk6ZnVuY3Rpb24odCl7aWYodC5rZXkpe3ZhciBlPWh0LmlzUGxhaW5PYmplY3QodC5rZXkpP3Qua2V5LmtleTp0LmtleSxyPXRoaXMucy5saXN0ZW5LZXlzLnNwbGl0KCIiKSxuPWh0LmluQXJyYXkoZSxyKTtyLnNwbGljZShuLDEpLHRoaXMucy5saXN0ZW5LZXlzPXIuam9pbigiIil9fSxfcmVzb2x2ZUV4dGVuZHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXRoaXMucy5kdCxuLHMsYT1mdW5jdGlvbihtKXtmb3IodmFyIHk9MDshaHQuaXNQbGFpbk9iamVjdChtKSYmIUFycmF5LmlzQXJyYXkobSk7KXtpZihtPT09dm9pZCAwKXJldHVybjtpZih0eXBlb2YgbT09ImZ1bmN0aW9uIil7aWYobT1tLmNhbGwoZSxyLHQpLCFtKXJldHVybiExfWVsc2UgaWYodHlwZW9mIG09PSJzdHJpbmciKXtpZighX2VbbV0pcmV0dXJue2h0bWw6bX07bT1fZVttXX1pZih5KysseT4zMCl0aHJvdyJCdXR0b25zOiBUb28gbWFueSBpdGVyYXRpb25zIn1yZXR1cm4gQXJyYXkuaXNBcnJheShtKT9tOmh0LmV4dGVuZCh7fSxtKX07Zm9yKHQ9YSh0KTt0JiZ0LmV4dGVuZDspe2lmKCFfZVt0LmV4dGVuZF0pdGhyb3ciQ2Fubm90IGV4dGVuZCB1bmtub3duIGJ1dHRvbiB0eXBlOiAiK3QuZXh0ZW5kO3ZhciBsPWEoX2VbdC5leHRlbmRdKTtpZihBcnJheS5pc0FycmF5KGwpKXJldHVybiBsO2lmKCFsKXJldHVybiExO3ZhciBjPWwuY2xhc3NOYW1lO3QuY29uZmlnIT09dm9pZCAwJiZsLmNvbmZpZyE9PXZvaWQgMCYmKHQuY29uZmlnPWh0LmV4dGVuZCh7fSxsLmNvbmZpZyx0LmNvbmZpZykpLHQ9aHQuZXh0ZW5kKHt9LGwsdCksYyYmdC5jbGFzc05hbWUhPT1jJiYodC5jbGFzc05hbWU9YysiICIrdC5jbGFzc05hbWUpLHQuZXh0ZW5kPWwuZXh0ZW5kfXZhciBwPXQucG9zdGZpeEJ1dHRvbnM7aWYocClmb3IodC5idXR0b25zfHwodC5idXR0b25zPVtdKSxuPTAscz1wLmxlbmd0aDtuPHM7bisrKXQuYnV0dG9ucy5wdXNoKHBbbl0pO3ZhciBiPXQucHJlZml4QnV0dG9ucztpZihiKWZvcih0LmJ1dHRvbnN8fCh0LmJ1dHRvbnM9W10pLG49MCxzPWIubGVuZ3RoO248cztuKyspdC5idXR0b25zLnNwbGljZShuLDAsYltuXSk7cmV0dXJuIHR9LF9wb3BvdmVyOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLHM9dGhpcy5jLGE9ITEsbD1odC5leHRlbmQoe2FsaWduOiJidXR0b24tbGVmdCIsYXV0b0Nsb3NlOiExLGJhY2tncm91bmQ6ITAsYmFja2dyb3VuZENsYXNzTmFtZToiZHQtYnV0dG9uLWJhY2tncm91bmQiLGNsb3NlQnV0dG9uOiEwLGNvbnRhaW5lckNsYXNzTmFtZTpzLmRvbS5jb2xsZWN0aW9uLmNvbnRhaW5lci5jbGFzc05hbWUsY29udGVudENsYXNzTmFtZTpzLmRvbS5jb2xsZWN0aW9uLmNvbnRhaW5lci5jb250ZW50LmNsYXNzTmFtZSxjb2xsZWN0aW9uTGF5b3V0OiIiLGNvbGxlY3Rpb25UaXRsZToiIixkcm9wdXA6ITEsZmFkZTo0MDAscG9wb3ZlclRpdGxlOiIiLHJpZ2h0QWxpZ25DbGFzc05hbWU6ImR0LWJ1dHRvbi1yaWdodCIsdGFnOnMuZG9tLmNvbGxlY3Rpb24uY29udGFpbmVyLnRhZ30sciksYz1sLnRhZysiLiIrbC5jb250YWluZXJDbGFzc05hbWUucmVwbGFjZSgvIC9nLCIuIikscD1lLm5vZGUoKSxiPWZ1bmN0aW9uKCl7YT0hMCxMaShodChjKSxsLmZhZGUsZnVuY3Rpb24oKXtodCh0aGlzKS5kZXRhY2goKX0pLGh0KG4uYnV0dG9ucygnW2FyaWEtaGFzcG9wdXA9ImRpYWxvZyJdW2FyaWEtZXhwYW5kZWQ9InRydWUiXScpLm5vZGVzKCkpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGh0KCJkaXYuZHQtYnV0dG9uLWJhY2tncm91bmQiKS5vZmYoImNsaWNrLmR0Yi1jb2xsZWN0aW9uIiksSnQuYmFja2dyb3VuZCghMSxsLmJhY2tncm91bmRDbGFzc05hbWUsbC5mYWRlLHApLGh0KHdpbmRvdykub2ZmKCJyZXNpemUucmVzaXplLmR0Yi1jb2xsZWN0aW9uIiksaHQoImJvZHkiKS5vZmYoIi5kdGItY29sbGVjdGlvbiIpLG4ub2ZmKCJidXR0b25zLWFjdGlvbi5iLWludGVybmFsIiksbi5vZmYoImRlc3Ryb3kiKX07aWYodD09PSExKXtiKCk7cmV0dXJufXZhciBtPWh0KG4uYnV0dG9ucygnW2FyaWEtaGFzcG9wdXA9ImRpYWxvZyJdW2FyaWEtZXhwYW5kZWQ9InRydWUiXScpLm5vZGVzKCkpO20ubGVuZ3RoJiYocC5jbG9zZXN0KGMpLmxlbmd0aCYmKHA9bS5lcSgwKSksYigpKTt2YXIgeT1odCgiLmR0LWJ1dHRvbiIsdCkubGVuZ3RoLFQ9IiI7eT09PTM/VD0iZHRiLWIzIjp5PT09Mj9UPSJkdGItYjIiOnk9PT0xJiYoVD0iZHRiLWIxIik7dmFyIHc9aHQoIjwiK2wudGFnKyIvPiIpLmFkZENsYXNzKGwuY29udGFpbmVyQ2xhc3NOYW1lKS5hZGRDbGFzcyhsLmNvbGxlY3Rpb25MYXlvdXQpLmFkZENsYXNzKGwuc3BsaXRBbGlnbkNsYXNzKS5hZGRDbGFzcyhUKS5jc3MoImRpc3BsYXkiLCJub25lIikuYXR0cih7ImFyaWEtbW9kYWwiOiEwLHJvbGU6ImRpYWxvZyJ9KTt0PWh0KHQpLmFkZENsYXNzKGwuY29udGVudENsYXNzTmFtZSkuYXR0cigicm9sZSIsIm1lbnUiKS5hcHBlbmRUbyh3KSxwLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikscC5wYXJlbnRzKCJib2R5IilbMF0hPT1kb2N1bWVudC5ib2R5JiYocD1kb2N1bWVudC5ib2R5Lmxhc3RDaGlsZCksbC5wb3BvdmVyVGl0bGU/dy5wcmVwZW5kKCc8ZGl2IGNsYXNzPSJkdC1idXR0b24tY29sbGVjdGlvbi10aXRsZSI+JytsLnBvcG92ZXJUaXRsZSsiPC9kaXY+Iik6bC5jb2xsZWN0aW9uVGl0bGUmJncucHJlcGVuZCgnPGRpdiBjbGFzcz0iZHQtYnV0dG9uLWNvbGxlY3Rpb24tdGl0bGUiPicrbC5jb2xsZWN0aW9uVGl0bGUrIjwvZGl2PiIpLGwuY2xvc2VCdXR0b24mJncucHJlcGVuZCgnPGRpdiBjbGFzcz0iZHRiLXBvcG92ZXItY2xvc2UiPiZ0aW1lczs8L2Rpdj4nKS5hZGRDbGFzcygiZHRiLWNvbGxlY3Rpb24tY2xvc2VhYmxlIiksUmkody5pbnNlcnRBZnRlcihwKSxsLmZhZGUpO3ZhciBrPWh0KGUudGFibGUoKS5jb250YWluZXIoKSksUD13LmNzcygicG9zaXRpb24iKTtpZigobC5zcGFuPT09ImNvbnRhaW5lciJ8fGwuYWxpZ249PT0iZHQtY29udGFpbmVyIikmJihwPXAucGFyZW50KCksdy5jc3MoIndpZHRoIixrLndpZHRoKCkpKSxQPT09ImFic29sdXRlIil7dmFyIEY9aHQocFswXS5vZmZzZXRQYXJlbnQpLGg9cC5wb3NpdGlvbigpLG89cC5vZmZzZXQoKSxmPUYub2Zmc2V0KCksQz1GLnBvc2l0aW9uKCksQj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShGWzBdKTtmLmhlaWdodD1GLm91dGVySGVpZ2h0KCksZi53aWR0aD1GLndpZHRoKCkrcGFyc2VGbG9hdChCLnBhZGRpbmdMZWZ0KSxmLnJpZ2h0PWYubGVmdCtmLndpZHRoLGYuYm90dG9tPWYudG9wK2YuaGVpZ2h0O3ZhciB1PWgudG9wK3Aub3V0ZXJIZWlnaHQoKSx6PWgubGVmdDt3LmNzcyh7dG9wOnUsbGVmdDp6fSksQj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh3WzBdKTt2YXIgcT13Lm9mZnNldCgpO3EuaGVpZ2h0PXcub3V0ZXJIZWlnaHQoKSxxLndpZHRoPXcub3V0ZXJXaWR0aCgpLHEucmlnaHQ9cS5sZWZ0K3Eud2lkdGgscS5ib3R0b209cS50b3ArcS5oZWlnaHQscS5tYXJnaW5Ub3A9cGFyc2VGbG9hdChCLm1hcmdpblRvcCkscS5tYXJnaW5Cb3R0b209cGFyc2VGbG9hdChCLm1hcmdpbkJvdHRvbSksbC5kcm9wdXAmJih1PWgudG9wLXEuaGVpZ2h0LXEubWFyZ2luVG9wLXEubWFyZ2luQm90dG9tKSwobC5hbGlnbj09PSJidXR0b24tcmlnaHQifHx3Lmhhc0NsYXNzKGwucmlnaHRBbGlnbkNsYXNzTmFtZSkpJiYoej1oLmxlZnQtcS53aWR0aCtwLm91dGVyV2lkdGgoKSksKGwuYWxpZ249PT0iZHQtY29udGFpbmVyInx8bC5hbGlnbj09PSJjb250YWluZXIiKSYmejxoLmxlZnQmJih6PS1oLmxlZnQpLEMubGVmdCt6K3Eud2lkdGg+aHQod2luZG93KS53aWR0aCgpJiYoej1odCh3aW5kb3cpLndpZHRoKCktcS53aWR0aC1DLmxlZnQpLG8ubGVmdCt6PDAmJih6PS1vLmxlZnQpLEMudG9wK3UrcS5oZWlnaHQ+aHQod2luZG93KS5oZWlnaHQoKStodCh3aW5kb3cpLnNjcm9sbFRvcCgpJiYodT1oLnRvcC1xLmhlaWdodC1xLm1hcmdpblRvcC1xLm1hcmdpbkJvdHRvbSksQy50b3ArdTxodCh3aW5kb3cpLnNjcm9sbFRvcCgpJiYodT1oLnRvcCtwLm91dGVySGVpZ2h0KCkpLHcuY3NzKHt0b3A6dSxsZWZ0Onp9KX1lbHNle3ZhciBldD1mdW5jdGlvbigpe3ZhciBPPWh0KHdpbmRvdykuaGVpZ2h0KCkvMixaPXcuaGVpZ2h0KCkvMjtaPk8mJihaPU8pLHcuY3NzKCJtYXJnaW5Ub3AiLFoqLTEpfTtldCgpLGh0KHdpbmRvdykub24oInJlc2l6ZS5kdGItY29sbGVjdGlvbiIsZnVuY3Rpb24oKXtldCgpfSl9bC5iYWNrZ3JvdW5kJiZKdC5iYWNrZ3JvdW5kKCEwLGwuYmFja2dyb3VuZENsYXNzTmFtZSxsLmZhZGUsbC5iYWNrZ3JvdW5kSG9zdHx8cCksaHQoImRpdi5kdC1idXR0b24tYmFja2dyb3VuZCIpLm9uKCJjbGljay5kdGItY29sbGVjdGlvbiIsZnVuY3Rpb24oKXt9KSxsLmF1dG9DbG9zZSYmc2V0VGltZW91dChmdW5jdGlvbigpe24ub24oImJ1dHRvbnMtYWN0aW9uLmItaW50ZXJuYWwiLGZ1bmN0aW9uKE8sWixnLF8pe19bMF0hPT1wWzBdJiZiKCl9KX0sMCksaHQodykudHJpZ2dlcigiYnV0dG9ucy1wb3BvdmVyLmR0Iiksbi5vbigiZGVzdHJveSIsYiksc2V0VGltZW91dChmdW5jdGlvbigpe2E9ITEsaHQoImJvZHkiKS5vbigiY2xpY2suZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKE8pe2lmKCFhKXt2YXIgWj1odC5mbi5hZGRCYWNrPyJhZGRCYWNrIjoiYW5kU2VsZiIsZz1odChPLnRhcmdldCkucGFyZW50KClbMF07KCFodChPLnRhcmdldCkucGFyZW50cygpW1pdKCkuZmlsdGVyKHQpLmxlbmd0aCYmIWh0KGcpLmhhc0NsYXNzKCJkdC1idXR0b25zIil8fGh0KE8udGFyZ2V0KS5oYXNDbGFzcygiZHQtYnV0dG9uLWJhY2tncm91bmQiKSkmJmIoKX19KS5vbigia2V5dXAuZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKE8pe08ua2V5Q29kZT09PTI3JiZiKCl9KS5vbigia2V5ZG93bi5kdGItY29sbGVjdGlvbiIsZnVuY3Rpb24oTyl7dmFyIFo9aHQoImEsIGJ1dHRvbiIsdCksZz1kb2N1bWVudC5hY3RpdmVFbGVtZW50O08ua2V5Q29kZT09PTkmJihaLmluZGV4KGcpPT09LTE/KFouZmlyc3QoKS5mb2N1cygpLE8ucHJldmVudERlZmF1bHQoKSk6Ty5zaGlmdEtleT9nPT09WlswXSYmKFoubGFzdCgpLmZvY3VzKCksTy5wcmV2ZW50RGVmYXVsdCgpKTpnPT09Wi5sYXN0KClbMF0mJihaLmZpcnN0KCkuZm9jdXMoKSxPLnByZXZlbnREZWZhdWx0KCkpKX0pfSwwKX19KTtKdC5iYWNrZ3JvdW5kPWZ1bmN0aW9uKHQsZSxyLG4pe3I9PT12b2lkIDAmJihyPTQwMCksbnx8KG49ZG9jdW1lbnQuYm9keSksdD9SaShodCgiPGRpdi8+IikuYWRkQ2xhc3MoZSkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmluc2VydEFmdGVyKG4pLHIpOkxpKGh0KCJkaXYuIitlKSxyLGZ1bmN0aW9uKCl7aHQodGhpcykucmVtb3ZlQ2xhc3MoZSkucmVtb3ZlKCl9KX07SnQuaW5zdGFuY2VTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKHQ9PW51bGwpcmV0dXJuIGh0Lm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9KTt2YXIgcj1bXSxuPWh0Lm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9KSxzPWZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpe2Zvcih2YXIgbD0wLGM9YS5sZW5ndGg7bDxjO2wrKylzKGFbbF0pO3JldHVybn1pZih0eXBlb2YgYT09InN0cmluZyIpaWYoYS5pbmRleE9mKCIsIikhPT0tMSlzKGEuc3BsaXQoIiwiKSk7ZWxzZXt2YXIgcD1odC5pbkFycmF5KGEudHJpbSgpLG4pO3AhPT0tMSYmci5wdXNoKGVbcF0uaW5zdCl9ZWxzZSBpZih0eXBlb2YgYT09Im51bWJlciIpci5wdXNoKGVbYV0uaW5zdCk7ZWxzZSBpZih0eXBlb2YgYT09Im9iamVjdCImJmEubm9kZU5hbWUpZm9yKHZhciBiPTA7YjxlLmxlbmd0aDtiKyspZVtiXS5pbnN0LmRvbS5jb250YWluZXJbMF09PT1hJiZyLnB1c2goZVtiXS5pbnN0KTtlbHNlIHR5cGVvZiBhPT0ib2JqZWN0IiYmci5wdXNoKGEpfTtyZXR1cm4gcyh0KSxyfTtKdC5idXR0b25TZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1bXSxuPWZ1bmN0aW9uKHAsYixtKXtmb3IodmFyIHksVCx3PTAsaz1iLmxlbmd0aDt3PGs7dysrKXk9Ylt3XSx5JiYoVD1tIT09dm9pZCAwP20rdzp3KyIiLHAucHVzaCh7bm9kZTp5Lm5vZGUsbmFtZTp5LmNvbmYubmFtZSxpZHg6VH0pLHkuYnV0dG9ucyYmbihwLHkuYnV0dG9ucyxUKyItIikpfSxzPWZ1bmN0aW9uKHAsYil7dmFyIG0seSxUPVtdO24oVCxiLnMuYnV0dG9ucyk7dmFyIHc9aHQubWFwKFQsZnVuY3Rpb24obyl7cmV0dXJuIG8ubm9kZX0pO2lmKEFycmF5LmlzQXJyYXkocCl8fHAgaW5zdGFuY2VvZiBodCl7Zm9yKG09MCx5PXAubGVuZ3RoO208eTttKyspcyhwW21dLGIpO3JldHVybn1pZihwPT1udWxsfHxwPT09IioiKWZvcihtPTAseT1ULmxlbmd0aDttPHk7bSsrKXIucHVzaCh7aW5zdDpiLG5vZGU6VFttXS5ub2RlfSk7ZWxzZSBpZih0eXBlb2YgcD09Im51bWJlciIpYi5zLmJ1dHRvbnNbcF0mJnIucHVzaCh7aW5zdDpiLG5vZGU6Yi5zLmJ1dHRvbnNbcF0ubm9kZX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJzdHJpbmciKWlmKHAuaW5kZXhPZigiLCIpIT09LTEpe3ZhciBrPXAuc3BsaXQoIiwiKTtmb3IobT0wLHk9ay5sZW5ndGg7bTx5O20rKylzKGtbbV0udHJpbSgpLGIpfWVsc2UgaWYocC5tYXRjaCgvXlxkKyhcLVxkKykqJC8pKXt2YXIgUD1odC5tYXAoVCxmdW5jdGlvbihvKXtyZXR1cm4gby5pZHh9KTtyLnB1c2goe2luc3Q6Yixub2RlOlRbaHQuaW5BcnJheShwLFApXS5ub2RlfSl9ZWxzZSBpZihwLmluZGV4T2YoIjpuYW1lIikhPT0tMSl7dmFyIEY9cC5yZXBsYWNlKCI6bmFtZSIsIiIpO2ZvcihtPTAseT1ULmxlbmd0aDttPHk7bSsrKVRbbV0ubmFtZT09PUYmJnIucHVzaCh7aW5zdDpiLG5vZGU6VFttXS5ub2RlfSl9ZWxzZSBodCh3KS5maWx0ZXIocCkuZWFjaChmdW5jdGlvbigpe3IucHVzaCh7aW5zdDpiLG5vZGU6dGhpc30pfSk7ZWxzZSBpZih0eXBlb2YgcD09Im9iamVjdCImJnAubm9kZU5hbWUpe3ZhciBoPWh0LmluQXJyYXkocCx3KTtoIT09LTEmJnIucHVzaCh7aW5zdDpiLG5vZGU6d1toXX0pfX0sYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7dmFyIGM9dFthXTtzKGUsYyl9cmV0dXJuIHJ9O0p0LnN0cmlwRGF0YT1mdW5jdGlvbih0LGUpe3JldHVybiB0eXBlb2YgdCE9InN0cmluZyJ8fCh0PUp0LnN0cmlwSHRtbFNjcmlwdCh0KSx0PUp0LnN0cmlwSHRtbENvbW1lbnRzKHQpLCghZXx8ZS5zdHJpcEh0bWwpJiYodD1zdC51dGlsLnN0cmlwSHRtbCh0KSksKCFlfHxlLnRyaW0pJiYodD10LnRyaW0oKSksKCFlfHxlLnN0cmlwTmV3bGluZXMpJiYodD10LnJlcGxhY2UoL1xuL2csIiAiKSksKCFlfHxlLmRlY29kZUVudGl0aWVzKSYmKE9pP3Q9T2kodCk6KG1zLmlubmVySFRNTD10LHQ9bXMudmFsdWUpKSksdH07SnQuZW50aXR5RGVjb2Rlcj1mdW5jdGlvbih0KXtPaT10fTtKdC5zdHJpcEh0bWxDb21tZW50cz1mdW5jdGlvbih0KXt2YXIgZTtkbyBlPXQsdD10LnJlcGxhY2UoLyg8IS0tLio/LS0hPz4pfCg8IS0tW1xTXHNdKz8tLSE/Pil8KDwhLS1bXFNcc10qPyQpL2csIiIpO3doaWxlKHQhPT1lKTtyZXR1cm4gdH07SnQuc3RyaXBIdG1sU2NyaXB0PWZ1bmN0aW9uKHQpe3ZhciBlO2RvIGU9dCx0PXQucmVwbGFjZSgvPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHRbXj5dKj4pPFtePF0qKSo8XC9zY3JpcHRbXj5dKj4vZ2ksIiIpO3doaWxlKHQhPT1lKTtyZXR1cm4gdH07SnQuZGVmYXVsdHM9e2J1dHRvbnM6WyJjb3B5IiwiZXhjZWwiLCJjc3YiLCJwZGYiLCJwcmludCJdLG5hbWU6Im1haW4iLHRhYkluZGV4OjAsZG9tOntjb250YWluZXI6e3RhZzoiZGl2IixjbGFzc05hbWU6ImR0LWJ1dHRvbnMifSxjb2xsZWN0aW9uOnthY3Rpb246e2Ryb3BIdG1sOic8c3BhbiBjbGFzcz0iZHQtYnV0dG9uLWRvd24tYXJyb3ciPiYjeDI1QkM7PC9zcGFuPid9LGNvbnRhaW5lcjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tY29sbGVjdGlvbiIsY29udGVudDp7Y2xhc3NOYW1lOiIiLHRhZzoiZGl2In0sdGFnOiJkaXYifX0sYnV0dG9uOnt0YWc6ImJ1dHRvbiIsY2xhc3NOYW1lOiJkdC1idXR0b24iLGFjdGl2ZToiZHQtYnV0dG9uLWFjdGl2ZSIsZGlzYWJsZWQ6ImRpc2FibGVkIixzcGFjZXI6e2NsYXNzTmFtZToiZHQtYnV0dG9uLXNwYWNlciIsdGFnOiJzcGFuIn0sbGluZXI6e3RhZzoic3BhbiIsY2xhc3NOYW1lOiIifX0sc3BsaXQ6e2FjdGlvbjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tc3BsaXQtZHJvcC1idXR0b24gZHQtYnV0dG9uIix0YWc6ImJ1dHRvbiJ9LGRyb3Bkb3duOnthbGlnbjoic3BsaXQtcmlnaHQiLGNsYXNzTmFtZToiZHQtYnV0dG9uLXNwbGl0LWRyb3AiLGRyb3BIdG1sOic8c3BhbiBjbGFzcz0iZHQtYnV0dG9uLWRvd24tYXJyb3ciPiYjeDI1QkM7PC9zcGFuPicsc3BsaXRBbGlnbkNsYXNzOiJkdC1idXR0b24tc3BsaXQtbGVmdCIsdGFnOiJidXR0b24ifSx3cmFwcGVyOntjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGxpdCIsdGFnOiJkaXYifX19fTtKdC52ZXJzaW9uPSIzLjAuMiI7aHQuZXh0ZW5kKF9lLHtjb2xsZWN0aW9uOnt0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iKX0sY2xhc3NOYW1lOiJidXR0b25zLWNvbGxlY3Rpb24iLGNsb3NlQnV0dG9uOiExLGluaXQ6ZnVuY3Rpb24odCxlKXtlLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4pe24uX2NvbGxlY3Rpb24ucGFyZW50cygiYm9keSIpLmxlbmd0aD90aGlzLnBvcG92ZXIoITEsbik6dGhpcy5wb3BvdmVyKG4uX2NvbGxlY3Rpb24sbiksdC50eXBlPT09ImtleXByZXNzIiYmaHQoImEsIGJ1dHRvbiIsbi5fY29sbGVjdGlvbikuZXEoMCkuZm9jdXMoKX0sYXR0cjp7ImFyaWEtaGFzcG9wdXAiOiJkaWFsb2cifX0sc3BsaXQ6e3RleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5zcGxpdCIsIlNwbGl0Iil9LGNsYXNzTmFtZToiYnV0dG9ucy1zcGxpdCIsY2xvc2VCdXR0b246ITEsaW5pdDpmdW5jdGlvbih0LGUpe3JldHVybiBlLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4pe3RoaXMucG9wb3ZlcihuLl9jb2xsZWN0aW9uLG4pfSxhdHRyOnsiYXJpYS1oYXNwb3B1cCI6ImRpYWxvZyJ9fSxjb3B5OmZ1bmN0aW9uKCl7aWYoX2UuY29weUh0bWw1KXJldHVybiJjb3B5SHRtbDUifSxjc3Y6ZnVuY3Rpb24odCxlKXtpZihfZS5jc3ZIdG1sNSYmX2UuY3N2SHRtbDUuYXZhaWxhYmxlKHQsZSkpcmV0dXJuImNzdkh0bWw1In0sZXhjZWw6ZnVuY3Rpb24odCxlKXtpZihfZS5leGNlbEh0bWw1JiZfZS5leGNlbEh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJleGNlbEh0bWw1In0scGRmOmZ1bmN0aW9uKHQsZSl7aWYoX2UucGRmSHRtbDUmJl9lLnBkZkh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJwZGZIdG1sNSJ9LHBhZ2VMZW5ndGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5zZXR0aW5ncygpWzBdLmFMZW5ndGhNZW51LHI9W10sbj1bXSxzPWZ1bmN0aW9uKGMpe3JldHVybiBjLmkxOG4oImJ1dHRvbnMucGFnZUxlbmd0aCIseyItMSI6IlNob3cgYWxsIHJvd3MiLF86IlNob3cgJWQgcm93cyJ9LGMucGFnZS5sZW4oKSl9O2lmKEFycmF5LmlzQXJyYXkoZVswXSkpcj1lWzBdLG49ZVsxXTtlbHNlIGZvcih2YXIgYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgbD1lW2FdO2h0LmlzUGxhaW5PYmplY3QobCk/KHIucHVzaChsLnZhbHVlKSxuLnB1c2gobC5sYWJlbCkpOihyLnB1c2gobCksbi5wdXNoKGwpKX1yZXR1cm57ZXh0ZW5kOiJjb2xsZWN0aW9uIix0ZXh0OnMsY2xhc3NOYW1lOiJidXR0b25zLXBhZ2UtbGVuZ3RoIixhdXRvQ2xvc2U6ITAsYnV0dG9uczpodC5tYXAocixmdW5jdGlvbihjLHApe3JldHVybnt0ZXh0Om5bcF0sY2xhc3NOYW1lOiJidXR0b24tcGFnZS1sZW5ndGgiLGFjdGlvbjpmdW5jdGlvbihiLG0pe20ucGFnZS5sZW4oYykuZHJhdygpfSxpbml0OmZ1bmN0aW9uKGIsbSx5KXt2YXIgVD10aGlzLHc9ZnVuY3Rpb24oKXtULmFjdGl2ZShiLnBhZ2UubGVuKCk9PT1jKX07Yi5vbigibGVuZ3RoLmR0Iit5Lm5hbWVzcGFjZSx3KSx3KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oYixtLHkpe2Iub2ZmKCJsZW5ndGguZHQiK3kubmFtZXNwYWNlKX19fSksaW5pdDpmdW5jdGlvbihjLHAsYil7dmFyIG09dGhpcztjLm9uKCJsZW5ndGguZHQiK2IubmFtZXNwYWNlLGZ1bmN0aW9uKCl7bS50ZXh0KGIudGV4dCl9KX0sZGVzdHJveTpmdW5jdGlvbihjLHAsYil7Yy5vZmYoImxlbmd0aC5kdCIrYi5uYW1lc3BhY2UpfX19LHNwYWNlcjp7c3R5bGU6ImVtcHR5IixzcGFjZXI6ITAsdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLnNwYWNlciIsIiIpfX19KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKSIsZnVuY3Rpb24odCxlKXtlPT09dm9pZCAwJiYoZT10LHQ9dm9pZCAwKSx0aGlzLnNlbGVjdG9yLmJ1dHRvbkdyb3VwPXQ7dmFyIHI9dGhpcy5pdGVyYXRvcighMCwidGFibGUiLGZ1bmN0aW9uKG4pe2lmKG4uX2J1dHRvbnMpcmV0dXJuIEp0LmJ1dHRvblNlbGVjdG9yKEp0Lmluc3RhbmNlU2VsZWN0b3IodCxuLl9idXR0b25zKSxlKX0sITApO3JldHVybiByLl9ncm91cFNlbGVjdG9yPXQscn0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkiLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5idXR0b25zKHQsZSk7cmV0dXJuIHIubGVuZ3RoPjEmJnIuc3BsaWNlKDEsci5sZW5ndGgpLHJ9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5hY3RpdmUoKSIsImJ1dHRvbigpLmFjdGl2ZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LmFjdGl2ZShlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5hY3RpdmUoZS5ub2RlLHQpfSl9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5hY3Rpb24oKSIsImJ1dHRvbigpLmFjdGlvbigpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LmFjdGlvbihlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5hY3Rpb24oZS5ub2RlLHQpfSl9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5jb2xsZWN0aW9uUmVidWlsZCgpIiwiYnV0dG9uKCkuY29sbGVjdGlvblJlYnVpbGQoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0eXBlb2YgdFtyXT09Im9iamVjdCImJih0W3JdLnBhcmVudENvbmY9ZSk7ZS5pbnN0LmNvbGxlY3Rpb25SZWJ1aWxkKGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyKFsiYnV0dG9ucygpLmVuYWJsZSgpIiwiYnV0dG9uKCkuZW5hYmxlKCkiXSxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5lbmFibGUoZS5ub2RlLHQpfSl9KTtzdC5BcGkucmVnaXN0ZXIoWyJidXR0b25zKCkuZGlzYWJsZSgpIiwiYnV0dG9uKCkuZGlzYWJsZSgpIl0sZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5kaXNhYmxlKHQubm9kZSl9KX0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXt2YXIgdD1udWxsO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZS5pbnN0LmluZGV4KGUubm9kZSk7ciE9PW51bGwmJih0PXIpfSksdH0pO3N0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLm5vZGVzKCkiLCJidXR0b24oKS5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9aHQoKTtyZXR1cm4gaHQodGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3Q9dC5hZGQoZS5pbnN0Lm5vZGUoZS5ub2RlKSl9KSksdH0pO3N0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnByb2Nlc3NpbmcoKSIsImJ1dHRvbigpLnByb2Nlc3NpbmcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5wcm9jZXNzaW5nKGUubm9kZSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oZSl7ZS5pbnN0LnByb2Nlc3NpbmcoZS5ub2RlLHQpfSl9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS50ZXh0KCkiLCJidXR0b24oKS50ZXh0KCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluc3QudGV4dChlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC50ZXh0KGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkudHJpZ2dlcigpIiwiYnV0dG9uKCkudHJpZ2dlcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dC5pbnN0Lm5vZGUodC5ub2RlKS50cmlnZ2VyKCJjbGljayIpfSl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpLnBvcG92ZXIoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIuaW5zdC5fcG9wb3Zlcih0LHRoaXMuYnV0dG9uKHRoaXNbMF0ubm9kZSksZSl9KX0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9ucygpLmNvbnRhaW5lcnMoKSIsZnVuY3Rpb24oKXt2YXIgdD1odCgpLGU9dGhpcy5fZ3JvdXBTZWxlY3RvcjtyZXR1cm4gdGhpcy5pdGVyYXRvcighMCwidGFibGUiLGZ1bmN0aW9uKHIpe2lmKHIuX2J1dHRvbnMpZm9yKHZhciBuPUp0Lmluc3RhbmNlU2VsZWN0b3IoZSxyLl9idXR0b25zKSxzPTAsYT1uLmxlbmd0aDtzPGE7cysrKXQ9dC5hZGQobltzXS5jb250YWluZXIoKSl9KSx0fSk7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVycygpLmVxKDApfSk7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b24oKS5hZGQoKSIsZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuY29udGV4dDtpZihuLmxlbmd0aCl7dmFyIHM9SnQuaW5zdGFuY2VTZWxlY3Rvcih0aGlzLl9ncm91cFNlbGVjdG9yLG5bMF0uX2J1dHRvbnMpO3MubGVuZ3RoJiZzWzBdLmFkZChlLHQscil9cmV0dXJuIHRoaXMuYnV0dG9uKHRoaXMuX2dyb3VwU2VsZWN0b3IsdCl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKS5kZXN0cm95KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGx1Y2soImluc3QiKS51bmlxdWUoKS5lYWNoKGZ1bmN0aW9uKHQpe3QuZGVzdHJveSgpfSksdGhpc30pO3N0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnJlbW92ZSgpIiwiYnV0dG9ucygpLnJlbW92ZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dC5pbnN0LnJlbW92ZSh0Lm5vZGUpfSksdGhpc30pO3ZhciBLcjtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuaW5mbygpIixmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcztyZXR1cm4gdD09PSExPyh0aGlzLm9mZigiZGVzdHJveS5idG4taW5mbyIpLExpKGh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKSw0MDAsZnVuY3Rpb24oKXtodCh0aGlzKS5yZW1vdmUoKX0pLGNsZWFyVGltZW91dChLciksS3I9bnVsbCx0aGlzKTooS3ImJmNsZWFyVGltZW91dChLciksaHQoIiNkYXRhdGFibGVzX2J1dHRvbnNfaW5mbyIpLmxlbmd0aCYmaHQoIiNkYXRhdGFibGVzX2J1dHRvbnNfaW5mbyIpLnJlbW92ZSgpLHQ9dD8iPGgyPiIrdCsiPC9oMj4iOiIiLFJpKGh0KCc8ZGl2IGlkPSJkYXRhdGFibGVzX2J1dHRvbnNfaW5mbyIgY2xhc3M9ImR0LWJ1dHRvbi1pbmZvIi8+JykuaHRtbCh0KS5hcHBlbmQoaHQoIjxkaXYvPiIpW3R5cGVvZiBlPT0ic3RyaW5nIj8iaHRtbCI6ImFwcGVuZCJdKGUpKS5jc3MoImRpc3BsYXkiLCJub25lIikuYXBwZW5kVG8oImJvZHkiKSksciE9PXZvaWQgMCYmciE9PTAmJihLcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5idXR0b25zLmluZm8oITEpfSxyKSksdGhpcy5vbigiZGVzdHJveS5idG4taW5mbyIsZnVuY3Rpb24oKXtuLmJ1dHRvbnMuaW5mbyghMSl9KSx0aGlzKX0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9ucy5leHBvcnREYXRhKCkiLGZ1bmN0aW9uKHQpe2lmKHRoaXMuY29udGV4dC5sZW5ndGgpcmV0dXJuIEJsKG5ldyBzdC5BcGkodGhpcy5jb250ZXh0WzBdKSx0KX0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9ucy5leHBvcnRJbmZvKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0fHwodD17fSkse2ZpbGVuYW1lOlBsKHQsdGhpcyksdGl0bGU6RmwodCx0aGlzKSxtZXNzYWdlVG9wOnZzKHRoaXMsdCx0Lm1lc3NhZ2V8fHQubWVzc2FnZVRvcCwidG9wIiksbWVzc2FnZUJvdHRvbTp2cyh0aGlzLHQsdC5tZXNzYWdlQm90dG9tLCJib3R0b20iKX19KTt2YXIgUGw9ZnVuY3Rpb24odCxlKXt2YXIgcj10LmZpbGVuYW1lPT09IioiJiZ0LnRpdGxlIT09IioiJiZ0LnRpdGxlIT09dm9pZCAwJiZ0LnRpdGxlIT09bnVsbCYmdC50aXRsZSE9PSIiP3QudGl0bGU6dC5maWxlbmFtZTtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIiYmKHI9cih0LGUpKSxyPT1udWxsKXJldHVybiBudWxsO3IuaW5kZXhPZigiKiIpIT09LTEmJihyPXIucmVwbGFjZSgvXCovZyxodCgiaGVhZCA+IHRpdGxlIikudGV4dCgpKS50cmltKCkpLHI9ci5yZXBsYWNlKC9bXmEtekEtWjAtOV9cdTAwQTEtXHVGRkZGXC4sXC1fICFcKFwpXS9nLCIiKTt2YXIgbj16aSh0LmV4dGVuc2lvbix0LGUpO3JldHVybiBufHwobj0iIikscitufSx6aT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9PW51bGw/bnVsbDp0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUscik6dH0sRmw9ZnVuY3Rpb24odCxlKXt2YXIgcj16aSh0LnRpdGxlLHQsZSk7cmV0dXJuIHI9PT1udWxsP251bGw6ci5pbmRleE9mKCIqIikhPT0tMT9yLnJlcGxhY2UoL1wqL2csaHQoImhlYWQgPiB0aXRsZSIpLnRleHQoKXx8IkV4cG9ydGVkIGRhdGEiKTpyfSx2cz1mdW5jdGlvbih0LGUscixuKXt2YXIgcz16aShyLGUsdCk7aWYocz09PW51bGwpcmV0dXJuIG51bGw7dmFyIGE9aHQoImNhcHRpb24iLHQudGFibGUoKS5jb250YWluZXIoKSkuZXEoMCk7aWYocz09PSIqIil7dmFyIGw9YS5jc3MoImNhcHRpb24tc2lkZSIpO3JldHVybiBsIT09bj9udWxsOmEubGVuZ3RoP2EudGV4dCgpOiIifXJldHVybiBzfSxtcz1odCgiPHRleHRhcmVhLz4iKVswXSxCbD1mdW5jdGlvbih0LGUpe3ZhciByPWh0LmV4dGVuZCghMCx7fSx7cm93czpudWxsLGNvbHVtbnM6IiIsbW9kaWZpZXI6e3NlYXJjaDoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSxvcnRob2dvbmFsOiJkaXNwbGF5IixzdHJpcEh0bWw6ITAsc3RyaXBOZXdsaW5lczohMCxkZWNvZGVFbnRpdGllczohMCx0cmltOiEwLGZvcm1hdDp7aGVhZGVyOmZ1bmN0aW9uKEMpe3JldHVybiBKdC5zdHJpcERhdGEoQyxyKX0sZm9vdGVyOmZ1bmN0aW9uKEMpe3JldHVybiBKdC5zdHJpcERhdGEoQyxyKX0sYm9keTpmdW5jdGlvbihDKXtyZXR1cm4gSnQuc3RyaXBEYXRhKEMscil9fSxjdXN0b21pemVEYXRhOm51bGwsY3VzdG9taXplWmlwOm51bGx9LGUpLG49dC5jb2x1bW5zKHIuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihDKXt2YXIgQj10LmNvbHVtbihDKTtyZXR1cm4gci5mb3JtYXQuaGVhZGVyKEIudGl0bGUoKSxDLEIuaGVhZGVyKCkpfSkudG9BcnJheSgpLHM9dC50YWJsZSgpLmZvb3RlcigpP3QuY29sdW1ucyhyLmNvbHVtbnMpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oQyl7dmFyIEI9dC5jb2x1bW4oQykuZm9vdGVyKCksdT0iIjtpZihCKXt2YXIgej1odCgiLmR0LWNvbHVtbi10aXRsZSIsQik7dT16Lmxlbmd0aD96Lmh0bWwoKTpodChCKS5odG1sKCl9cmV0dXJuIHIuZm9ybWF0LmZvb3Rlcih1LEMsQil9KS50b0FycmF5KCk6bnVsbCxhPWh0LmV4dGVuZCh7fSxyLm1vZGlmaWVyKTt0LnNlbGVjdCYmdHlwZW9mIHQuc2VsZWN0LmluZm89PSJmdW5jdGlvbiImJmEuc2VsZWN0ZWQ9PT12b2lkIDAmJnQucm93cyhyLnJvd3MsaHQuZXh0ZW5kKHtzZWxlY3RlZDohMH0sYSkpLmFueSgpJiZodC5leHRlbmQoYSx7c2VsZWN0ZWQ6ITB9KTtmb3IodmFyIGw9dC5yb3dzKHIucm93cyxhKS5pbmRleGVzKCkudG9BcnJheSgpLGM9dC5jZWxscyhsLHIuY29sdW1ucyx7b3JkZXI6YS5vcmRlcn0pLHA9Yy5yZW5kZXIoci5vcnRob2dvbmFsKS50b0FycmF5KCksYj1jLm5vZGVzKCkudG9BcnJheSgpLG09Yy5pbmRleGVzKCkudG9BcnJheSgpLHk9dC5jb2x1bW5zKHIuY29sdW1ucykuY291bnQoKSxUPXk+MD9wLmxlbmd0aC95OjAsdz1bXSxrPTAsUD0wLEY9VDtQPEY7UCsrKXtmb3IodmFyIGg9W3ldLG89MDtvPHk7bysrKWhbb109ci5mb3JtYXQuYm9keShwW2tdLG1ba10ucm93LG1ba10uY29sdW1uLGJba10pLGsrKzt3W1BdPWh9dmFyIGY9e2hlYWRlcjpuLGhlYWRlclN0cnVjdHVyZTpncyhyLmZvcm1hdC5oZWFkZXIsdC50YWJsZSgpLmhlYWRlci5zdHJ1Y3R1cmUoci5jb2x1bW5zKSksZm9vdGVyOnMsZm9vdGVyU3RydWN0dXJlOmdzKHIuZm9ybWF0LmZvb3Rlcix0LnRhYmxlKCkuZm9vdGVyLnN0cnVjdHVyZShyLmNvbHVtbnMpKSxib2R5Ond9O3JldHVybiByLmN1c3RvbWl6ZURhdGEmJnIuY3VzdG9taXplRGF0YShmKSxmfTtmdW5jdGlvbiBncyh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWZvcih2YXIgbj0wO248ZVtyXS5sZW5ndGg7bisrKXt2YXIgcz1lW3JdW25dO3MmJihzLnRpdGxlPXQocy50aXRsZSxuLHMuY2VsbCkpfXJldHVybiBlfWh0LmZuLmRhdGFUYWJsZS5CdXR0b25zPUp0O2h0LmZuLkRhdGFUYWJsZS5CdXR0b25zPUp0O2h0KGRvY3VtZW50KS5vbigiaW5pdC5kdCBwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24odCxlKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQuYnV0dG9uc3x8c3QuZGVmYXVsdHMuYnV0dG9ucztyJiYhZS5fYnV0dG9ucyYmbmV3IEp0KGUscikuY29udGFpbmVyKCl9fSk7ZnVuY3Rpb24gd3ModCxlKXt2YXIgcj1uZXcgc3QuQXBpKHQpLG49ZXx8ci5pbml0KCkuYnV0dG9uc3x8c3QuZGVmYXVsdHMuYnV0dG9ucztyZXR1cm4gbmV3IEp0KHIsbikuY29udGFpbmVyKCl9c3QuZXh0LmZlYXR1cmUucHVzaCh7Zm5Jbml0OndzLGNGZWF0dXJlOiJCIn0pO3N0LmZlYXR1cmUmJnN0LmZlYXR1cmUucmVnaXN0ZXIoImJ1dHRvbnMiLHdzKTt2YXIgQ3M9bmUoaWUoKSwxKTt2YXIgYWU9Q3MuZGVmYXVsdCxUcyxrcztmdW5jdGlvbiBqaSgpe3JldHVybiBUc3x8d2luZG93LkpTWmlwfWZ1bmN0aW9uIE1pKCl7cmV0dXJuIGtzfHx3aW5kb3cucGRmTWFrZX1zdC5CdXR0b25zLnBkZk1ha2U9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIE1pKCk7a3M9dH07c3QuQnV0dG9ucy5qc3ppcD1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gamkoKTtUcz10fTt2YXIgT249ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2lmKCEodHlwZW9mIHQ+InUifHx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmL01TSUUgWzEtOV1cLi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkpe3ZhciBlPXQuZG9jdW1lbnQscj1mdW5jdGlvbigpe3JldHVybiB0LlVSTHx8dC53ZWJraXRVUkx8fHR9LG49ZS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJhIikscz0iZG93bmxvYWQiaW4gbixhPWZ1bmN0aW9uKGgpe3ZhciBvPW5ldyBNb3VzZUV2ZW50KCJjbGljayIpO2guZGlzcGF0Y2hFdmVudChvKX0sbD0vY29uc3RydWN0b3IvaS50ZXN0KHQuSFRNTEVsZW1lbnQpfHx0LnNhZmFyaSxjPS9DcmlPU1wvW1xkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscD1mdW5jdGlvbihoKXsodC5zZXRJbW1lZGlhdGV8fHQuc2V0VGltZW91dCkoZnVuY3Rpb24oKXt0aHJvdyBofSwwKX0sYj0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixtPTFlMyo0MCx5PWZ1bmN0aW9uKGgpe3ZhciBvPWZ1bmN0aW9uKCl7dHlwZW9mIGg9PSJzdHJpbmciP3IoKS5yZXZva2VPYmplY3RVUkwoaCk6aC5yZW1vdmUoKX07c2V0VGltZW91dChvLG0pfSxUPWZ1bmN0aW9uKGgsbyxmKXtvPVtdLmNvbmNhdChvKTtmb3IodmFyIEM9by5sZW5ndGg7Qy0tOyl7dmFyIEI9aFsib24iK29bQ11dO2lmKHR5cGVvZiBCPT0iZnVuY3Rpb24iKXRyeXtCLmNhbGwoaCxmfHxoKX1jYXRjaCh1KXtwKHUpfX19LHc9ZnVuY3Rpb24oaCl7cmV0dXJuL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGgudHlwZSk/bmV3IEJsb2IoWyJcdUZFRkYiLGhdLHt0eXBlOmgudHlwZX0pOmh9LGs9ZnVuY3Rpb24oaCxvLGYpe2Z8fChoPXcoaCkpO3ZhciBDPXRoaXMsQj1oLnR5cGUsdT1CPT09Yix6LHE9ZnVuY3Rpb24oKXtUKEMsIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgd3JpdGVlbmQiLnNwbGl0KCIgIikpfSxldD1mdW5jdGlvbigpe2lmKChjfHx1JiZsKSYmdC5GaWxlUmVhZGVyKXt2YXIgTz1uZXcgRmlsZVJlYWRlcjtPLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBnPWM/Ty5yZXN1bHQ6Ty5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywiZGF0YTphdHRhY2htZW50L2ZpbGU7IiksXz10Lm9wZW4oZywiX2JsYW5rIik7X3x8KHQubG9jYXRpb24uaHJlZj1nKSxnPXZvaWQgMCxDLnJlYWR5U3RhdGU9Qy5ET05FLHEoKX0sTy5yZWFkQXNEYXRhVVJMKGgpLEMucmVhZHlTdGF0ZT1DLklOSVQ7cmV0dXJufWlmKHp8fCh6PXIoKS5jcmVhdGVPYmplY3RVUkwoaCkpLHUpdC5sb2NhdGlvbi5ocmVmPXo7ZWxzZXt2YXIgWj10Lm9wZW4oeiwiX2JsYW5rIik7Wnx8KHQubG9jYXRpb24uaHJlZj16KX1DLnJlYWR5U3RhdGU9Qy5ET05FLHEoKSx5KHopfTtpZihDLnJlYWR5U3RhdGU9Qy5JTklULHMpe3o9cigpLmNyZWF0ZU9iamVjdFVSTChoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5ocmVmPXosbi5kb3dubG9hZD1vLGEobikscSgpLHkoeiksQy5yZWFkeVN0YXRlPUMuRE9ORX0pO3JldHVybn1ldCgpfSxQPWsucHJvdG90eXBlLEY9ZnVuY3Rpb24oaCxvLGYpe3JldHVybiBuZXcgayhoLG98fGgubmFtZXx8ImRvd25sb2FkIixmKX07cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYj9mdW5jdGlvbihoLG8sZil7cmV0dXJuIG89b3x8aC5uYW1lfHwiZG93bmxvYWQiLGZ8fChoPXcoaCkpLG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGgsbyl9OihQLmFib3J0PWZ1bmN0aW9uKCl7fSxQLnJlYWR5U3RhdGU9UC5JTklUPTAsUC5XUklUSU5HPTEsUC5ET05FPTIsUC5lcnJvcj1QLm9ud3JpdGVzdGFydD1QLm9ucHJvZ3Jlc3M9UC5vbndyaXRlPVAub25hYm9ydD1QLm9uZXJyb3I9UC5vbndyaXRlZW5kPW51bGwsRil9fSh0eXBlb2Ygc2VsZjwidSImJnNlbGZ8fHR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3d8fCh2b2lkIDApLmNvbnRlbnQpO3N0LmZpbGVTYXZlPU9uO3ZhciB4cz1mdW5jdGlvbih0KXt2YXIgZT0iU2hlZXQxIjtyZXR1cm4gdC5zaGVldE5hbWUmJihlPXQuc2hlZXROYW1lLnJlcGxhY2UoL1tcW1xdXCpcL1xcXD9cOl0vZywiIikpLGV9LFNzPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5ld2xpbmU/dC5uZXdsaW5lOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MvKT9gXHIKYDpgCmB9LERzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9U3MoZSksbj10LmJ1dHRvbnMuZXhwb3J0RGF0YShlLmV4cG9ydE9wdGlvbnMpLHM9ZS5maWVsZEJvdW5kYXJ5LGE9ZS5maWVsZFNlcGFyYXRvcixsPW5ldyBSZWdFeHAocywiZyIpLGM9ZS5lc2NhcGVDaGFyIT09dm9pZCAwP2UuZXNjYXBlQ2hhcjoiXFwiLHA9ZnVuY3Rpb24oayl7Zm9yKHZhciBQPSIiLEY9MCxoPWsubGVuZ3RoO0Y8aDtGKyspRj4wJiYoUCs9YSksUCs9cz9zKygiIitrW0ZdKS5yZXBsYWNlKGwsYytzKStzOmtbRl07cmV0dXJuIFB9LGI9IiIsbT0iIix5PVtdO2UuaGVhZGVyJiYoYj1uLmhlYWRlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIHAoay5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrciksZS5mb290ZXImJm4uZm9vdGVyJiYobT1uLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIHAoay5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrcik7Zm9yKHZhciBUPTAsdz1uLmJvZHkubGVuZ3RoO1Q8dztUKyspeS5wdXNoKHAobi5ib2R5W1RdKSk7cmV0dXJue3N0cjpiK3kuam9pbihyKStyK20scm93czp5Lmxlbmd0aH19LEFzPWZ1bmN0aW9uKCl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSE9PS0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpPT09LTEmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKT09PS0xO2lmKCF0KXJldHVybiExO3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC8oXGQrXC5cZCspLyk7cmV0dXJuISEoZSYmZS5sZW5ndGg+MSYmZVsxXSoxPDYwMy4xKX07ZnVuY3Rpb24gUXIodCl7Zm9yKHZhciBlPTY1LHI9OTAsbj1yLWUrMSxzPSIiO3Q+PTA7KXM9U3RyaW5nLmZyb21DaGFyQ29kZSh0JW4rZSkrcyx0PU1hdGguZmxvb3IodC9uKS0xO3JldHVybiBzfXRyeXtSbj1uZXcgWE1MU2VyaWFsaXplcn1jYXRjaHt9dmFyIFJuLFlyO2Z1bmN0aW9uIElzKHQsZSl7WXI9PT12b2lkIDAmJihZcj1Sbi5zZXJpYWxpemVUb1N0cmluZyhuZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhQc1sieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIl0sInRleHQveG1sIikpLmluZGV4T2YoInhtbG5zOnIiKT09PS0xKSxhZS5lYWNoKGUsZnVuY3Rpb24ocixuKXtpZihhZS5pc1BsYWluT2JqZWN0KG4pKXt2YXIgcz10LmZvbGRlcihyKTtJcyhzLG4pfWVsc2V7aWYoWXIpe3ZhciBhPW4uY2hpbGROb2Rlc1swXSxsLGMscD1bXTtmb3IobD1hLmF0dHJpYnV0ZXMubGVuZ3RoLTE7bD49MDtsLS0pe3ZhciBiPWEuYXR0cmlidXRlc1tsXS5ub2RlTmFtZSxtPWEuYXR0cmlidXRlc1tsXS5ub2RlVmFsdWU7Yi5pbmRleE9mKCI6IikhPT0tMSYmKHAucHVzaCh7bmFtZTpiLHZhbHVlOm19KSxhLnJlbW92ZUF0dHJpYnV0ZShiKSl9Zm9yKGw9MCxjPXAubGVuZ3RoO2w8YztsKyspe3ZhciB5PW4uY3JlYXRlQXR0cmlidXRlKHBbbF0ubmFtZS5yZXBsYWNlKCI6IiwiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKTt5LnZhbHVlPXBbbF0udmFsdWUsYS5zZXRBdHRyaWJ1dGVOb2RlKHkpfX12YXIgVD1Sbi5zZXJpYWxpemVUb1N0cmluZyhuKTtZciYmKFQuaW5kZXhPZigiPD94bWwiKT09PS0xJiYoVD0nPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PicrVCksVD1ULnJlcGxhY2UoL19kdF9iX25hbWVzcGFjZV90b2tlbl8vZywiOiIpLFQ9VC5yZXBsYWNlKC94bWxuczpOU1tcZF0rPSIiIE5TW1xkXSs6L2csIiIpKSxUPVQucmVwbGFjZSgvPChbXjw+XSo/KSB4bWxucz0iIihbXjw+XSo/KT4vZywiPCQxICQyPiIpLHQuZmlsZShyLFQpfX0pfWZ1bmN0aW9uIENlKHQsZSxyKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIHImJihyLmF0dHImJmFlKG4pLmF0dHIoci5hdHRyKSxyLmNoaWxkcmVuJiZhZS5lYWNoKHIuY2hpbGRyZW4sZnVuY3Rpb24ocyxhKXtuLmFwcGVuZENoaWxkKGEpfSksci50ZXh0IT09bnVsbCYmci50ZXh0IT09dm9pZCAwJiZuLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoci50ZXh0KSkpLG59ZnVuY3Rpb24gRWwodCxlKXt2YXIgcj10LmhlYWRlcltlXS5sZW5ndGgsbixzLGE7dC5mb290ZXImJnQuZm9vdGVyW2VdJiZ0LmZvb3RlcltlXS5sZW5ndGg+ciYmKHI9dC5mb290ZXJbZV0ubGVuZ3RoKTtmb3IodmFyIGw9MCxjPXQuYm9keS5sZW5ndGg7bDxjO2wrKyl7dmFyIHA9dC5ib2R5W2xdW2VdO2lmKGE9cCE9bnVsbD9wLnRvU3RyaW5nKCk6IiIsYS5pbmRleE9mKGAKYCkhPT0tMT8ocz1hLnNwbGl0KGAKYCkscy5zb3J0KGZ1bmN0aW9uKGIsbSl7cmV0dXJuIG0ubGVuZ3RoLWIubGVuZ3RofSksbj1zWzBdLmxlbmd0aCk6bj1hLmxlbmd0aCxuPnImJihyPW4pLHI+NDApcmV0dXJuIDU0fXJldHVybiByKj0xLjM1LHI+Nj9yOjZ9dmFyIFBzPXsiX3JlbHMvLnJlbHMiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+PFJlbGF0aW9uc2hpcCBJZD0icklkMSIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIgVGFyZ2V0PSJ4bC93b3JrYm9vay54bWwiLz48L1JlbGF0aW9uc2hpcHM+JywieGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+PFJlbGF0aW9uc2hpcCBJZD0icklkMSIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXQiIFRhcmdldD0id29ya3NoZWV0cy9zaGVldDEueG1sIi8+PFJlbGF0aW9uc2hpcCBJZD0icklkMiIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zdHlsZXMiIFRhcmdldD0ic3R5bGVzLnhtbCIvPjwvUmVsYXRpb25zaGlwcz4nLCJbQ29udGVudF9UeXBlc10ueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxUeXBlcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIj48RGVmYXVsdCBFeHRlbnNpb249InhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIgLz48RGVmYXVsdCBFeHRlbnNpb249InJlbHMiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIgLz48RGVmYXVsdCBFeHRlbnNpb249ImpwZWciIENvbnRlbnRUeXBlPSJpbWFnZS9qcGVnIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtib29rLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWwiIC8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvc3R5bGVzLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWwiIC8+PC9UeXBlcz4nLCJ4bC93b3JrYm9vay54bWwiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtib29rIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iIHhtbG5zOnI9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiPjxmaWxlVmVyc2lvbiBhcHBOYW1lPSJ4bCIgbGFzdEVkaXRlZD0iNSIgbG93ZXN0RWRpdGVkPSI1IiBydXBCdWlsZD0iMjQ4MTYiLz48d29ya2Jvb2tQciBzaG93SW5rQW5ub3RhdGlvbj0iMCIgYXV0b0NvbXByZXNzUGljdHVyZXM9IjAiLz48Ym9va1ZpZXdzPjx3b3JrYm9va1ZpZXcgeFdpbmRvdz0iMCIgeVdpbmRvdz0iMCIgd2luZG93V2lkdGg9IjI1NjAwIiB3aW5kb3dIZWlnaHQ9IjE5MDIwIiB0YWJSYXRpbz0iNTAwIi8+PC9ib29rVmlld3M+PHNoZWV0cz48c2hlZXQgbmFtZT0iU2hlZXQxIiBzaGVldElkPSIxIiByOmlkPSJySWQxIi8+PC9zaGVldHM+PGRlZmluZWROYW1lcy8+PC93b3JrYm9vaz4nLCJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIiB4bWxuczptYz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiIG1jOklnbm9yYWJsZT0ieDE0YWMiIHhtbG5zOngxNGFjPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMDkvOS9hYyI+PHNoZWV0RGF0YS8+PG1lcmdlQ2VsbHMgY291bnQ9IjAiLz48L3dvcmtzaGVldD4nLCJ4bC9zdHlsZXMueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3R5bGVTaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczptYz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiIG1jOklnbm9yYWJsZT0ieDE0YWMiIHhtbG5zOngxNGFjPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMDkvOS9hYyI+PG51bUZtdHMgY291bnQ9IjYiPjxudW1GbXQgbnVtRm10SWQ9IjE2NCIgZm9ybWF0Q29kZT0iWyQkLTQwOV0jLCMjMC4wMDstWyQkLTQwOV0jLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NSIgZm9ybWF0Q29kZT0iJnF1b3Q7XHhBMyZxdW90OyMsIyMwLjAwIi8+PG51bUZtdCBudW1GbXRJZD0iMTY2IiBmb3JtYXRDb2RlPSJbJFx1MjBBQy0yXSAjLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NyIgZm9ybWF0Q29kZT0iMC4wJSIvPjxudW1GbXQgbnVtRm10SWQ9IjE2OCIgZm9ybWF0Q29kZT0iIywjIzA7KCMsIyMwKSIvPjxudW1GbXQgbnVtRm10SWQ9IjE2OSIgZm9ybWF0Q29kZT0iIywjIzAuMDA7KCMsIyMwLjAwKSIvPjwvbnVtRm10cz48Zm9udHMgY291bnQ9IjUiIHgxNGFjOmtub3duRm9udHM9IjEiPjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxjb2xvciByZ2I9IkZGRkZGRkZGIiAvPjwvZm9udD48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PGIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxpIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48dSAvPjwvZm9udD48L2ZvbnRzPjxmaWxscyBjb3VudD0iNiI+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9Im5vbmUiIC8+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkZEOUQ5RDkiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJGRkQ5OTc5NSIgLz48YmdDb2xvciBpbmRleGVkPSI2NCIgLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9ImZmYzZlZmNlIiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iZmZjNmNmZWYiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PC9maWxscz48Ym9yZGVycyBjb3VudD0iMiI+PGJvcmRlcj48bGVmdCAvPjxyaWdodCAvPjx0b3AgLz48Ym90dG9tIC8+PGRpYWdvbmFsIC8+PC9ib3JkZXI+PGJvcmRlciBkaWFnb25hbFVwPSJmYWxzZSIgZGlhZ29uYWxEb3duPSJmYWxzZSI+PGxlZnQgc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvbGVmdD48cmlnaHQgc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvcmlnaHQ+PHRvcCBzdHlsZT0idGhpbiI+PGNvbG9yIGF1dG89IjEiIC8+PC90b3A+PGJvdHRvbSBzdHlsZT0idGhpbiI+PGNvbG9yIGF1dG89IjEiIC8+PC9ib3R0b20+PGRpYWdvbmFsIC8+PC9ib3JkZXI+PC9ib3JkZXJzPjxjZWxsU3R5bGVYZnMgY291bnQ9IjEiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiAvPjwvY2VsbFN0eWxlWGZzPjxjZWxsWGZzIGNvdW50PSI2OCI+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJsZWZ0Ii8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJjZW50ZXIiLz48L3hmPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5QWxpZ25tZW50PSIxIj48YWxpZ25tZW50IGhvcml6b250YWw9InJpZ2h0Ii8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJmaWxsIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCB0ZXh0Um90YXRpb249IjkwIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCB3cmFwVGV4dD0iMSIvPjwveGY+PHhmIG51bUZtdElkPSI5IiAgIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY0IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NSIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjYiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY3IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2OCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjkiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMyIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSI0IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjEiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMiIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PC9jZWxsWGZzPjxjZWxsU3R5bGVzIGNvdW50PSIxIj48Y2VsbFN0eWxlIG5hbWU9Ik5vcm1hbCIgeGZJZD0iMCIgYnVpbHRpbklkPSIwIiAvPjwvY2VsbFN0eWxlcz48ZHhmcyBjb3VudD0iMCIgLz48dGFibGVTdHlsZXMgY291bnQ9IjAiIGRlZmF1bHRUYWJsZVN0eWxlPSJUYWJsZVN0eWxlTWVkaXVtOSIgZGVmYXVsdFBpdm90U3R5bGU9IlBpdm90U3R5bGVNZWRpdW00IiAvPjwvc3R5bGVTaGVldD4nfSxfcz1be21hdGNoOi9eXC0/XGQrXC5cZCUkLyxzdHlsZTo2MCxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQvMTAwfX0se21hdGNoOi9eXC0/XGQrXC4/XGQqJSQvLHN0eWxlOjU2LGZtdDpmdW5jdGlvbih0KXtyZXR1cm4gdC8xMDB9fSx7bWF0Y2g6L15cLT9cJFtcZCxdKy4/XGQqJC8sc3R5bGU6NTd9LHttYXRjaDovXlwtP8KjW1xkLF0rLj9cZCokLyxzdHlsZTo1OH0se21hdGNoOi9eXC0/4oKsW1xkLF0rLj9cZCokLyxzdHlsZTo1OX0se21hdGNoOi9eXC0/XGQrJC8sc3R5bGU6NjV9LHttYXRjaDovXlwtP1xkK1wuXGR7Mn0kLyxzdHlsZTo2Nn0se21hdGNoOi9eXChbXGQsXStcKSQvLHN0eWxlOjYxLGZtdDpmdW5jdGlvbih0KXtyZXR1cm4tMSp0LnJlcGxhY2UoL1tcKFwpXS9nLCIiKX19LHttYXRjaDovXlwoW1xkLF0rXC5cZHsyfVwpJC8sc3R5bGU6NjIsZm10OmZ1bmN0aW9uKHQpe3JldHVybi0xKnQucmVwbGFjZSgvW1woXCldL2csIiIpfX0se21hdGNoOi9eXC0/W1xkLF0rJC8sc3R5bGU6NjN9LHttYXRjaDovXlwtP1tcZCxdK1wuXGR7Mn0kLyxzdHlsZTo2NH0se21hdGNoOi9eW1xkXXs0fVwtWzAxXVtcZF1cLVswMTIzXVtcZF0kLyxzdHlsZTo2NyxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoMjU1NjkrRGF0ZS5wYXJzZSh0KS8oODY0MDAqMWUzKSl9fV0sRW49ZnVuY3Rpb24odCxlLHIsbixzKXt2YXIgYT1hZSgibWVyZ2VDZWxscyIsdCk7YVswXS5hcHBlbmRDaGlsZChDZSh0LCJtZXJnZUNlbGwiLHthdHRyOntyZWY6UXIocikrZSsiOiIrUXIocitzLTEpKyhlK24tMSl9fSkpLGEuYXR0cigiY291bnQiLHBhcnNlRmxvYXQoYS5hdHRyKCJjb3VudCIpKSsxKX07c3QuZXh0LmJ1dHRvbnMuY29weUh0bWw1PXtjbGFzc05hbWU6ImJ1dHRvbnMtY29weSBidXR0b25zLWh0bWw1Iix0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29weSIsIkNvcHkiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9RHMoZSxuKSxsPWUuYnV0dG9ucy5leHBvcnRJbmZvKG4pLGM9U3MobikscD1hLnN0cixiPWFlKCI8ZGl2Lz4iKS5jc3Moe2hlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjB9KTtsLnRpdGxlJiYocD1sLnRpdGxlK2MrYytwKSxsLm1lc3NhZ2VUb3AmJihwPWwubWVzc2FnZVRvcCtjK2MrcCksbC5tZXNzYWdlQm90dG9tJiYocD1wK2MrYytsLm1lc3NhZ2VCb3R0b20pLG4uY3VzdG9taXplJiYocD1uLmN1c3RvbWl6ZShwLG4sZSkpO3ZhciBtPWFlKCI8dGV4dGFyZWEgcmVhZG9ubHkvPiIpLnZhbChwKS5hcHBlbmRUbyhiKTtpZihkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoImNvcHkiKSl7Yi5hcHBlbmRUbyhlLnRhYmxlKCkuY29udGFpbmVyKCkpLG1bMF0uZm9jdXMoKSxtWzBdLnNlbGVjdCgpO3RyeXt2YXIgeT1kb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpO2lmKGIucmVtb3ZlKCkseSl7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLmNvcHlUaXRsZSIsIkNvcHkgdG8gY2xpcGJvYXJkIiksZS5pMThuKCJidXR0b25zLmNvcHlTdWNjZXNzIix7MToiQ29waWVkIG9uZSByb3cgdG8gY2xpcGJvYXJkIixfOiJDb3BpZWQgJWQgcm93cyB0byBjbGlwYm9hcmQifSxhLnJvd3MpLDJlMykscygpO3JldHVybn19Y2F0Y2h7fX12YXIgVD1hZSgiPHNwYW4+IitlLmkxOG4oImJ1dHRvbnMuY29weUtleXMiLCJQcmVzcyA8aT5jdHJsPC9pPiBvciA8aT5cdTIzMTg8L2k+ICsgPGk+QzwvaT4gdG8gY29weSB0aGUgdGFibGUgZGF0YTxicj50byB5b3VyIHN5c3RlbSBjbGlwYm9hcmQuPGJyPjxicj5UbyBjYW5jZWwsIGNsaWNrIHRoaXMgbWVzc2FnZSBvciBwcmVzcyBlc2NhcGUuIikrIjwvc3Bhbj4iKS5hcHBlbmQoYik7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLmNvcHlUaXRsZSIsIkNvcHkgdG8gY2xpcGJvYXJkIiksVCwwKSxtWzBdLmZvY3VzKCksbVswXS5zZWxlY3QoKTt2YXIgdz1hZShUKS5jbG9zZXN0KCIuZHQtYnV0dG9uLWluZm8iKSxrPWZ1bmN0aW9uKCl7dy5vZmYoImNsaWNrLmJ1dHRvbnMtY29weSIpLGFlKGRvY3VtZW50KS5vZmYoIi5idXR0b25zLWNvcHkiKSxlLmJ1dHRvbnMuaW5mbyghMSl9O3cub24oImNsaWNrLmJ1dHRvbnMtY29weSIsayksYWUoZG9jdW1lbnQpLm9uKCJrZXlkb3duLmJ1dHRvbnMtY29weSIsZnVuY3Rpb24oUCl7UC5rZXlDb2RlPT09MjcmJihrKCkscygpKX0pLm9uKCJjb3B5LmJ1dHRvbnMtY29weSBjdXQuYnV0dG9ucy1jb3B5IixmdW5jdGlvbigpe2soKSxzKCl9KX0sYXN5bmM6MTAwLGV4cG9ydE9wdGlvbnM6e30sZmllbGRTZXBhcmF0b3I6IgkiLGZpZWxkQm91bmRhcnk6IiIsaGVhZGVyOiEwLGZvb3RlcjohMCx0aXRsZToiKiIsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiJ9O3N0LmV4dC5idXR0b25zLmNzdkh0bWw1PXtib206ITEsY2xhc3NOYW1lOiJidXR0b25zLWNzdiBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJndpbmRvdy5CbG9ifSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY3N2IiwiQ1NWIil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPURzKGUsbikuc3RyLGw9ZS5idXR0b25zLmV4cG9ydEluZm8obiksYz1uLmNoYXJzZXQ7bi5jdXN0b21pemUmJihhPW4uY3VzdG9taXplKGEsbixlKSksYyE9PSExPyhjfHwoYz1kb2N1bWVudC5jaGFyYWN0ZXJTZXR8fGRvY3VtZW50LmNoYXJzZXQpLGMmJihjPSI7Y2hhcnNldD0iK2MpKTpjPSIiLG4uYm9tJiYoYT0iXHVGRUZGIithKSxPbihuZXcgQmxvYihbYV0se3R5cGU6InRleHQvY3N2IitjfSksbC5maWxlbmFtZSwhMCkscygpfSxhc3luYzoxMDAsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLmNzdiIsZXhwb3J0T3B0aW9uczp7fSxmaWVsZFNlcGFyYXRvcjoiLCIsZmllbGRCb3VuZGFyeTonIicsZXNjYXBlQ2hhcjonIicsY2hhcnNldDpudWxsLGhlYWRlcjohMCxmb290ZXI6ITB9O3N0LmV4dC5idXR0b25zLmV4Y2VsSHRtbDU9e2NsYXNzTmFtZToiYnV0dG9ucy1leGNlbCBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJmppKCkhPT12b2lkIDAmJiFBcygpJiZSbn0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmV4Y2VsIiwiRXhjZWwiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9MCxsLGMscD1mdW5jdGlvbihnKXt2YXIgXz1Qc1tnXTtyZXR1cm4gYWUucGFyc2VYTUwoXyl9LGI9cCgieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIiksbT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzaGVldERhdGEiKVswXSx5PXtfcmVsczp7Ii5yZWxzIjpwKCJfcmVscy8ucmVscyIpfSx4bDp7X3JlbHM6eyJ3b3JrYm9vay54bWwucmVscyI6cCgieGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMiKX0sIndvcmtib29rLnhtbCI6cCgieGwvd29ya2Jvb2sueG1sIiksInN0eWxlcy54bWwiOnAoInhsL3N0eWxlcy54bWwiKSx3b3Jrc2hlZXRzOnsic2hlZXQxLnhtbCI6Yn19LCJbQ29udGVudF9UeXBlc10ueG1sIjpwKCJbQ29udGVudF9UeXBlc10ueG1sIil9LFQ9ZS5idXR0b25zLmV4cG9ydERhdGEobi5leHBvcnRPcHRpb25zKSx3LGssUD1mdW5jdGlvbihnKXt3PWErMSxrPUNlKGIsInJvdyIse2F0dHI6e3I6d319KTtmb3IodmFyIF89MCxTPWcubGVuZ3RoO188UztfKyspe3ZhciBOPVFyKF8pKyIiK3csUj1udWxsO2lmKGdbX109PT1udWxsfHxnW19dPT09dm9pZCAwfHxnW19dPT09IiIpaWYobi5jcmVhdGVFbXB0eUNlbGxzPT09ITApZ1tfXT0iIjtlbHNlIGNvbnRpbnVlO3ZhciBMPWdbX107Z1tfXT10eXBlb2YgZ1tfXS50cmltPT0iZnVuY3Rpb24iP2dbX10udHJpbSgpOmdbX107Zm9yKHZhciBYPTAsaj1fcy5sZW5ndGg7WDxqO1grKyl7dmFyIEc9X3NbWF07aWYoZ1tfXS5tYXRjaCYmIWdbX10ubWF0Y2goL14wXGQrLykmJmdbX10ubWF0Y2goRy5tYXRjaCkpe3ZhciBhdD1nW19dLnJlcGxhY2UoL1teXGRcLlwtXS9nLCIiKTtHLmZtdCYmKGF0PUcuZm10KGF0KSksUj1DZShiLCJjIix7YXR0cjp7cjpOLHM6Ry5zdHlsZX0sY2hpbGRyZW46W0NlKGIsInYiLHt0ZXh0OmF0fSldfSk7YnJlYWt9fWlmKCFSKWlmKHR5cGVvZiBnW19dPT0ibnVtYmVyInx8Z1tfXS5tYXRjaCYmZ1tfXS5tYXRjaCgvXi0/XGQrKFwuXGQrKT8oW2VFXVwtP1xkKyk/JC8pJiYhZ1tfXS5tYXRjaCgvXjBcZCsvKSlSPUNlKGIsImMiLHthdHRyOnt0OiJuIixyOk59LGNoaWxkcmVuOltDZShiLCJ2Iix7dGV4dDpnW19dfSldfSk7ZWxzZXt2YXIgSj1MLnJlcGxhY2U/TC5yZXBsYWNlKC9bXHgwMC1ceDA5XHgwQlx4MENceDBFLVx4MUZceDdGLVx4OUZdL2csIiIpOkw7Uj1DZShiLCJjIix7YXR0cjp7dDoiaW5saW5lU3RyIixyOk59LGNoaWxkcmVuOntyb3c6Q2UoYiwiaXMiLHtjaGlsZHJlbjp7cm93OkNlKGIsInQiLHt0ZXh0OkosYXR0cjp7InhtbDpzcGFjZSI6InByZXNlcnZlIn19KX19KX19KX1rLmFwcGVuZENoaWxkKFIpfW0uYXBwZW5kQ2hpbGQoayksYSsrfSxGPWZ1bmN0aW9uKGcpe2cuZm9yRWFjaChmdW5jdGlvbihfKXtQKF8ubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBTP1MudGl0bGU6IiJ9KSxhKSxhZSgicm93Omxhc3QgYyIsYikuYXR0cigicyIsIjIiKSxfLmZvckVhY2goZnVuY3Rpb24oUyxOKXtTJiYoUy5jb2xTcGFuPjF8fFMucm93U3Bhbj4xKSYmRW4oYixhLE4sUy5yb3dTcGFuLFMuY29sU3Bhbil9KX0pfTtuLmN1c3RvbWl6ZURhdGEmJm4uY3VzdG9taXplRGF0YShUKTt2YXIgaD1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhuKTtoLnRpdGxlJiYoUChbaC50aXRsZV0sYSksRW4oYixhLDAsMSxULmhlYWRlci5sZW5ndGgpLGFlKCJyb3c6bGFzdCBjIixiKS5hdHRyKCJzIiwiNTEiKSksaC5tZXNzYWdlVG9wJiYoUChbaC5tZXNzYWdlVG9wXSxhKSxFbihiLGEsMCwxLFQuaGVhZGVyLmxlbmd0aCkpLG4uaGVhZGVyJiZGKFQuaGVhZGVyU3RydWN0dXJlKSxsPWE7Zm9yKHZhciBvPTAsZj1ULmJvZHkubGVuZ3RoO288ZjtvKyspUChULmJvZHlbb10sYSk7Yz1hLG4uZm9vdGVyJiZULmZvb3RlciYmRihULmZvb3RlclN0cnVjdHVyZSksaC5tZXNzYWdlQm90dG9tJiYoUChbaC5tZXNzYWdlQm90dG9tXSxhKSxFbihiLGEsMCwxLFQuaGVhZGVyLmxlbmd0aCkpO3ZhciBDPUNlKGIsImNvbHMiKTthZSgid29ya3NoZWV0IixiKS5wcmVwZW5kKEMpO2Zvcih2YXIgQj0wLHU9VC5oZWFkZXIubGVuZ3RoO0I8dTtCKyspQy5hcHBlbmRDaGlsZChDZShiLCJjb2wiLHthdHRyOnttaW46QisxLG1heDpCKzEsd2lkdGg6RWwoVCxCKSxjdXN0b21XaWR0aDoxfX0pKTt2YXIgej15LnhsWyJ3b3JrYm9vay54bWwiXTthZSgic2hlZXRzIHNoZWV0Iix6KS5hdHRyKCJuYW1lIix4cyhuKSksbi5hdXRvRmlsdGVyJiYoYWUoIm1lcmdlQ2VsbHMiLGIpLmJlZm9yZShDZShiLCJhdXRvRmlsdGVyIix7YXR0cjp7cmVmOiJBIitsKyI6IitRcihULmhlYWRlci5sZW5ndGgtMSkrY319KSksYWUoImRlZmluZWROYW1lcyIseikuYXBwZW5kKENlKHosImRlZmluZWROYW1lIix7YXR0cjp7bmFtZToiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIixsb2NhbFNoZWV0SWQ6IjAiLGhpZGRlbjoxfSx0ZXh0OiInIit4cyhuKS5yZXBsYWNlKC8nL2csIicnIikrIichJEEkIitsKyI6IitRcihULmhlYWRlci5sZW5ndGgtMSkrY30pKSksbi5jdXN0b21pemUmJm4uY3VzdG9taXplKHksbixlKSxhZSgibWVyZ2VDZWxscyIsYikuY2hpbGRyZW4oKS5sZW5ndGg9PT0wJiZhZSgibWVyZ2VDZWxscyIsYikucmVtb3ZlKCk7dmFyIHE9amkoKSxldD1uZXcgcSxPPXtjb21wcmVzc2lvbjoiREVGTEFURSIsdHlwZToiYmxvYiIsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0In07SXMoZXQseSk7dmFyIFo9aC5maWxlbmFtZTtaPjE3NSYmKFo9Wi5zdWJzdHIoMCwxNzUpKSxuLmN1c3RvbWl6ZVppcCYmbi5jdXN0b21pemVaaXAoZXQsVCxaKSxldC5nZW5lcmF0ZUFzeW5jP2V0LmdlbmVyYXRlQXN5bmMoTykudGhlbihmdW5jdGlvbihnKXtPbihnLFopLHMoKX0pOihPbihldC5nZW5lcmF0ZShPKSxaKSxzKCkpfSxhc3luYzoxMDAsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLnhsc3giLGV4cG9ydE9wdGlvbnM6e30saGVhZGVyOiEwLGZvb3RlcjohMCx0aXRsZToiKiIsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiIsY3JlYXRlRW1wdHlDZWxsczohMSxhdXRvRmlsdGVyOiExLHNoZWV0TmFtZToiIn07c3QuZXh0LmJ1dHRvbnMucGRmSHRtbDU9e2NsYXNzTmFtZToiYnV0dG9ucy1wZGYgYnV0dG9ucy1odG1sNSIsYXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5GaWxlUmVhZGVyIT09dm9pZCAwJiZNaSgpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMucGRmIiwiUERGIil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPWUuYnV0dG9ucy5leHBvcnREYXRhKG4uZXhwb3J0T3B0aW9ucyksbD1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhuKSxjPVtdO24uaGVhZGVyJiZhLmhlYWRlclN0cnVjdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe2MucHVzaChULm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdz97dGV4dDp3LnRpdGxlLGNvbFNwYW46dy5jb2xzcGFuLHJvd1NwYW46dy5yb3dzcGFuLHN0eWxlOiJ0YWJsZUhlYWRlciJ9Ont9fSkpfSk7Zm9yKHZhciBwPTAsYj1hLmJvZHkubGVuZ3RoO3A8YjtwKyspYy5wdXNoKGEuYm9keVtwXS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJue3RleHQ6VD09bnVsbD8iIjp0eXBlb2YgVD09InN0cmluZyI/VDpULnRvU3RyaW5nKCl9fSkpO24uZm9vdGVyJiZhLmZvb3RlclN0cnVjdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe2MucHVzaChULm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdz97dGV4dDp3LnRpdGxlLGNvbFNwYW46dy5jb2xzcGFuLHJvd1NwYW46dy5yb3dzcGFuLHN0eWxlOiJ0YWJsZUhlYWRlciJ9Ont9fSkpfSk7dmFyIG09e3BhZ2VTaXplOm4ucGFnZVNpemUscGFnZU9yaWVudGF0aW9uOm4ub3JpZW50YXRpb24sY29udGVudDpbe3N0eWxlOiJ0YWJsZSIsdGFibGU6e2hlYWRlclJvd3M6YS5oZWFkZXJTdHJ1Y3R1cmUubGVuZ3RoLGZvb3RlclJvd3M6YS5mb290ZXJTdHJ1Y3R1cmUubGVuZ3RoLGJvZHk6Y30sbGF5b3V0OntoTGluZVdpZHRoOmZ1bmN0aW9uKFQsdyl7cmV0dXJuIFQ9PT0wfHxUPT09dy50YWJsZS5ib2R5Lmxlbmd0aD8wOi41fSx2TGluZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhMaW5lQ29sb3I6ZnVuY3Rpb24oVCx3KXtyZXR1cm4gVD09PXcudGFibGUuaGVhZGVyUm93c3x8VD09PXcudGFibGUuYm9keS5sZW5ndGgtdy50YWJsZS5mb290ZXJSb3dzPyIjMzMzIjoiI2RkZCJ9LGZpbGxDb2xvcjpmdW5jdGlvbihUKXtyZXR1cm4gVDxhLmhlYWRlclN0cnVjdHVyZS5sZW5ndGg/IiNmZmYiOlQlMj09PTA/IiNmM2YzZjMiOm51bGx9LHBhZGRpbmdUb3A6ZnVuY3Rpb24oKXtyZXR1cm4gNX0scGFkZGluZ0JvdHRvbTpmdW5jdGlvbigpe3JldHVybiA1fX19XSxzdHlsZXM6e3RhYmxlSGVhZGVyOntib2xkOiEwLGZvbnRTaXplOjExLGFsaWdubWVudDoiY2VudGVyIn0sdGFibGVGb290ZXI6e2JvbGQ6ITAsZm9udFNpemU6MTF9LHRhYmxlOnttYXJnaW46WzAsNSwwLDVdfSx0aXRsZTp7YWxpZ25tZW50OiJjZW50ZXIiLGZvbnRTaXplOjEzfSxtZXNzYWdlOnt9fSxkZWZhdWx0U3R5bGU6e2ZvbnRTaXplOjEwfX07bC5tZXNzYWdlVG9wJiZtLmNvbnRlbnQudW5zaGlmdCh7dGV4dDpsLm1lc3NhZ2VUb3Asc3R5bGU6Im1lc3NhZ2UiLG1hcmdpbjpbMCwwLDAsMTJdfSksbC5tZXNzYWdlQm90dG9tJiZtLmNvbnRlbnQucHVzaCh7dGV4dDpsLm1lc3NhZ2VCb3R0b20sc3R5bGU6Im1lc3NhZ2UiLG1hcmdpbjpbMCwwLDAsMTJdfSksbC50aXRsZSYmbS5jb250ZW50LnVuc2hpZnQoe3RleHQ6bC50aXRsZSxzdHlsZToidGl0bGUiLG1hcmdpbjpbMCwwLDAsMTJdfSksbi5jdXN0b21pemUmJm4uY3VzdG9taXplKG0sbixlKTt2YXIgeT1NaSgpLmNyZWF0ZVBkZihtKTtuLmRvd25sb2FkPT09Im9wZW4iJiYhQXMoKT95Lm9wZW4oKTp5LmRvd25sb2FkKGwuZmlsZW5hbWUpLHMoKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIucGRmIixleHBvcnRPcHRpb25zOnt9LG9yaWVudGF0aW9uOiJwb3J0cmFpdCIscGFnZVNpemU6bmF2aWdhdG9yLmxhbmd1YWdlPT09ImVuLVVTInx8bmF2aWdhdG9yLmxhbmd1YWdlPT09ImVuLUNBIj8iTEVUVEVSIjoiQTQiLGhlYWRlcjohMCxmb290ZXI6ITAsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiIsY3VzdG9taXplOm51bGwsZG93bmxvYWQ6ImRvd25sb2FkIn07dmFyIEZzPW5lKGllKCksMSk7dmFyIE5yPUZzLmRlZmF1bHQsQnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLE9sPWZ1bmN0aW9uKHQpe3ZhciBlPU5yKHQpLmNsb25lKClbMF07cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJsaW5rIiYmKGUuaHJlZj1CcyhlLmhyZWYpKSxlLm91dGVySFRNTH0sQnM9ZnVuY3Rpb24odCl7QnIuaHJlZj10O3ZhciBlPUJyLmhvc3Q7cmV0dXJuIGUuaW5kZXhPZigiLyIpPT09LTEmJkJyLnBhdGhuYW1lLmluZGV4T2YoIi8iKSE9PTAmJihlKz0iLyIpLEJyLnByb3RvY29sKyIvLyIrZStCci5wYXRobmFtZStCci5zZWFyY2h9O3N0LmV4dC5idXR0b25zLnByaW50PXtjbGFzc05hbWU6ImJ1dHRvbnMtcHJpbnQiLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5wcmludCIsIlByaW50Iil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPWUuYnV0dG9ucy5leHBvcnREYXRhKE5yLmV4dGVuZCh7ZGVjb2RlRW50aXRpZXM6ITF9LG4uZXhwb3J0T3B0aW9ucykpLGw9ZS5idXR0b25zLmV4cG9ydEluZm8obiksYz1lLmNvbHVtbnMobi5leHBvcnRPcHRpb25zLmNvbHVtbnMpLm5vZGVzKCkubWFwKGZ1bmN0aW9uKGgpe3JldHVybiBoLmNsYXNzTmFtZX0pLnRvQXJyYXkoKSxwPWZ1bmN0aW9uKGgsbyl7Zm9yKHZhciBmPSI8dHI+IixDPTAsQj1oLmxlbmd0aDtDPEI7QysrKXt2YXIgdT1oW0NdPT09bnVsbHx8aFtDXT09PXZvaWQgMD8iIjpoW0NdLHo9Y1tDXT8nY2xhc3M9IicrY1tDXSsnIic6IiI7Zis9IjwiK28rIiAiK3orIj4iK3UrIjwvIitvKyI+In1yZXR1cm4gZisiPC90cj4ifSxiPSc8dGFibGUgY2xhc3M9IicrZS50YWJsZSgpLm5vZGUoKS5jbGFzc05hbWUrJyI+JztpZihuLmhlYWRlcil7dmFyIG09YS5oZWFkZXJTdHJ1Y3R1cmUubWFwKGZ1bmN0aW9uKGgpe3JldHVybiI8dHI+IitoLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gbz8nPHRoIGNvbHNwYW49Iicrby5jb2xzcGFuKyciIHJvd3NwYW49Iicrby5yb3dzcGFuKyciPicrby50aXRsZSsiPC90aD4iOiIifSkuam9pbigiIikrIjwvdHI+In0pO2IrPSI8dGhlYWQ+IittLmpvaW4oIiIpKyI8L3RoZWFkPiJ9Yis9Ijx0Ym9keT4iO2Zvcih2YXIgeT0wLFQ9YS5ib2R5Lmxlbmd0aDt5PFQ7eSsrKWIrPXAoYS5ib2R5W3ldLCJ0ZCIpO2lmKGIrPSI8L3Rib2R5PiIsbi5mb290ZXImJmEuZm9vdGVyKXt2YXIgdz1hLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oaCl7cmV0dXJuIjx0cj4iK2gubWFwKGZ1bmN0aW9uKG8pe3JldHVybiBvPyc8dGggY29sc3Bhbj0iJytvLmNvbHNwYW4rJyIgcm93c3Bhbj0iJytvLnJvd3NwYW4rJyI+JytvLnRpdGxlKyI8L3RoPiI6IiJ9KS5qb2luKCIiKSsiPC90cj4ifSk7Yis9Ijx0Zm9vdD4iK3cuam9pbigiIikrIjwvdGZvb3Q+In1iKz0iPC90YWJsZT4iO3ZhciBrPXdpbmRvdy5vcGVuKCIiLCIiKTtpZighayl7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLnByaW50RXJyb3JUaXRsZSIsIlVuYWJsZSB0byBvcGVuIHByaW50IHZpZXciKSxlLmkxOG4oImJ1dHRvbnMucHJpbnRFcnJvck1zZyIsIlBsZWFzZSBhbGxvdyBwb3B1cHMgaW4geW91ciBicm93c2VyIGZvciB0aGlzIHNpdGUgdG8gYmUgYWJsZSB0byB2aWV3IHRoZSBwcmludCB2aWV3LiIpLDVlMyk7cmV0dXJufWsuZG9jdW1lbnQuY2xvc2UoKTt2YXIgUD0iPHRpdGxlPiIrbC50aXRsZSsiPC90aXRsZT4iO05yKCJzdHlsZSwgbGluayIpLmVhY2goZnVuY3Rpb24oKXtQKz1PbCh0aGlzKX0pO3RyeXtrLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPVB9Y2F0Y2h7TnIoay5kb2N1bWVudC5oZWFkKS5odG1sKFApfWsuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxoMT4iK2wudGl0bGUrIjwvaDE+PGRpdj4iKyhsLm1lc3NhZ2VUb3B8fCIiKSsiPC9kaXY+IitiKyI8ZGl2PiIrKGwubWVzc2FnZUJvdHRvbXx8IiIpKyI8L2Rpdj4iLE5yKGsuZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoImR0LXByaW50LXZpZXciKSxOcigiaW1nIixrLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oaCxvKXtvLnNldEF0dHJpYnV0ZSgic3JjIixCcyhvLmdldEF0dHJpYnV0ZSgic3JjIikpKX0pLG4uY3VzdG9taXplJiZuLmN1c3RvbWl6ZShrLG4sZSk7dmFyIEY9ZnVuY3Rpb24oKXtuLmF1dG9QcmludCYmKGsucHJpbnQoKSxrLmNsb3NlKCkpfTtrLnNldFRpbWVvdXQoRiwxZTMpLHMoKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITAsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTt2YXIgUmw9bmUoaWUoKSwxKTt2YXIgTnM9bmUoaWUoKSwxKTt2YXIgaXI9TnMuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiByKGwpe3Q9bCxlPXQuZm4uZGF0YVRhYmxlfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbChjLHApe3ZhciBiPXRoaXM7aWYoIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJGaXhlZENvbHVtbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIik7dmFyIG09bmV3IGUuQXBpKGMpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxsLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxsLmRlZmF1bHRzLHApLHRoaXMucz17ZHQ6bSxydGw6dChtLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCJ9LHAmJnAubGVmdENvbHVtbnMhPT12b2lkIDAmJihwLmxlZnQ9cC5sZWZ0Q29sdW1ucykscCYmcC5sZWZ0IT09dm9pZCAwJiYodGhpcy5jW3RoaXMucy5ydGw/ImVuZCI6InN0YXJ0Il09cC5sZWZ0KSxwJiZwLnJpZ2h0Q29sdW1ucyE9PXZvaWQgMCYmKHAucmlnaHQ9cC5yaWdodENvbHVtbnMpLHAmJnAucmlnaHQhPT12b2lkIDAmJih0aGlzLmNbdGhpcy5zLnJ0bD8ic3RhcnQiOiJlbmQiXT1wLnJpZ2h0KSx0aGlzLmRvbT17Ym90dG9tQmxvY2tlcjp0KCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3R0b21CbG9ja2VyKSx0b3BCbG9ja2VyOnQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcEJsb2NrZXIpLHNjcm9sbGVyOnQoImRpdi5kdC1zY3JvbGwtYm9keSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpfSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT8odGhpcy5fYWRkU3R5bGVzKCksdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpKTptLm9uZSgiaW5pdC5kdC5kdGZjIixmdW5jdGlvbigpe2IuX2FkZFN0eWxlcygpLGIuX3NldEtleVRhYmxlTGlzdGVuZXIoKX0pLG0ub24oImNvbHVtbi1zaXppbmcuZHQuZHRmYyBjb2x1bW4tcmVvcmRlci5kdC5kdGZjIGRyYXcuZHQuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fYWRkU3R5bGVzKCl9KTt2YXIgeT1lLnV0aWwuZGVib3VuY2UoZnVuY3Rpb24oKXtiLl9hZGRTdHlsZXMoKX0sNTApO3JldHVybiBtLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGZjIixmdW5jdGlvbigpe3koKX0pLHRoaXMuZG9tLnNjcm9sbGVyLm9uKCJzY3JvbGwuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fc2Nyb2xsKCl9KSx0aGlzLl9zY3JvbGwoKSxtLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucz10aGlzLG0ub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7cmV0dXJuIGIuX2Rlc3Ryb3koKX0pLHRoaXN9cmV0dXJuIGwucHJvdG90eXBlLmVuZD1mdW5jdGlvbihjKXtyZXR1cm4gYyE9PXZvaWQgMD8oYz49MCYmYzw9dGhpcy5zLmR0LmNvbHVtbnMoKS5jb3VudCgpJiYodGhpcy5jLmVuZD1jLHRoaXMuX2FkZFN0eWxlcygpKSx0aGlzKTp0aGlzLmMuZW5kfSxsLnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuZW5kKGMpOnRoaXMuc3RhcnQoYyl9LGwucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuc3RhcnQoYyk6dGhpcy5lbmQoYyl9LGwucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGMpe3JldHVybiBjIT09dm9pZCAwPyhjPj0wJiZjPD10aGlzLnMuZHQuY29sdW1ucygpLmNvdW50KCkmJih0aGlzLmMuc3RhcnQ9Yyx0aGlzLl9hZGRTdHlsZXMoKSksdGhpcyk6dGhpcy5jLnN0YXJ0fSxsLnByb3RvdHlwZS5fYWRkU3R5bGVzPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5zLmR0LHA9dGhpcyxiPXRoaXMucy5kdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksbT1jLnRhYmxlKCkuaGVhZGVyLnN0cnVjdHVyZSgiOnZpc2libGUiKSx5PWMudGFibGUoKS5mb290ZXIuc3RydWN0dXJlKCI6dmlzaWJsZSIpLFQ9Yy5jb2x1bW5zKCI6dmlzaWJsZSIpLndpZHRocygpLnRvQXJyYXkoKSx3PXQoYy50YWJsZSgpLm5vZGUoKSkuY2xvc2VzdCgiZGl2LmR0LXNjcm9sbCIpLGs9dChjLnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKVswXSxQPXRoaXMucy5ydGwsRj10aGlzLmMuc3RhcnQsaD10aGlzLmMuZW5kLG89UD9oOkYsZj1QP0Y6aCxDPWMuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtpZih3Lmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ay5vZmZzZXRXaWR0aD09PWsuY2xpZW50V2lkdGgmJihDPTApLGMuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihldCl7dmFyIE89Yy5jb2x1bW4uaW5kZXgoInRvVmlzaWJsZSIsZXQpLFo7TzxGPyhaPXAuX3N1bShULE8pLHAuX2ZpeENvbHVtbihPLFosInN0YXJ0IixtLHksQykpOk8+PWItaD8oWj1wLl9zdW0oVCxiLU8tMSwhMCkscC5fZml4Q29sdW1uKE8sWiwiZW5kIixtLHksQykpOnAuX2ZpeENvbHVtbihPLDAsIm5vbmUiLG0seSxDKX0pLHQoYy50YWJsZSgpLm5vZGUoKSkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRTdGFydCxGPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkRW5kLGg+MCkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRMZWZ0LG8+MCkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRSaWdodCxmPjApO3ZhciBCPWMudGFibGUoKS5oZWFkZXIoKSx1PWMudGFibGUoKS5mb290ZXIoKSx6PXQoQikub3V0ZXJIZWlnaHQoKSxxPXQodSkub3V0ZXJIZWlnaHQoKTt0aGlzLmRvbS50b3BCbG9ja2VyLmFwcGVuZFRvKHcpLmNzcygidG9wIiwwKS5jc3ModGhpcy5zLnJ0bD8ibGVmdCI6InJpZ2h0IiwwKS5jc3MoImhlaWdodCIseikuY3NzKCJ3aWR0aCIsQysxKS5jc3MoImRpc3BsYXkiLEM/ImJsb2NrIjoibm9uZSIpLHUmJnRoaXMuZG9tLmJvdHRvbUJsb2NrZXIuYXBwZW5kVG8odykuY3NzKCJib3R0b20iLDApLmNzcyh0aGlzLnMucnRsPyJsZWZ0IjoicmlnaHQiLDApLmNzcygiaGVpZ2h0IixxKS5jc3MoIndpZHRoIixDKzEpLmNzcygiZGlzcGxheSIsQz8iYmxvY2siOiJub25lIil9LGwucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zLmR0Lm9mZigiLmR0ZmMiKSx0aGlzLmRvbS5zY3JvbGxlci5vZmYoIi5kdGZjIiksdCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0VuZCsiICIrdGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nTGVmdCsiICIrdGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nU3RhcnQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1JpZ2h0KSx0aGlzLmRvbS5ib3R0b21CbG9ja2VyLnJlbW92ZSgpLHRoaXMuZG9tLnRvcEJsb2NrZXIucmVtb3ZlKCl9LGwucHJvdG90eXBlLl9maXhDb2x1bW49ZnVuY3Rpb24oYyxwLGIsbSx5LFQpe3ZhciB3PXRoaXMsaz10aGlzLnMuZHQsUD1mdW5jdGlvbihGLGgpe2lmKGI9PT0ibm9uZSIpRi5jc3MoInBvc2l0aW9uIiwiIikuY3NzKCJsZWZ0IiwiIikuY3NzKCJyaWdodCIsIiIpLnJlbW92ZUNsYXNzKHcuY2xhc3Nlcy5maXhlZEVuZCsiICIrdy5jbGFzc2VzLmZpeGVkTGVmdCsiICIrdy5jbGFzc2VzLmZpeGVkUmlnaHQrIiAiK3cuY2xhc3Nlcy5maXhlZFN0YXJ0KTtlbHNle3ZhciBvPWI9PT0ic3RhcnQiPyJsZWZ0IjoicmlnaHQiO3cucy5ydGwmJihvPWI9PT0ic3RhcnQiPyJyaWdodCI6ImxlZnQiKTt2YXIgZj1wO2I9PT0iZW5kIiYmKGg9PT0iaGVhZGVyInx8aD09PSJmb290ZXIiKSYmKGYrPVQpLEYuY3NzKCJwb3NpdGlvbiIsInN0aWNreSIpLmNzcyhvLGYpLmFkZENsYXNzKGI9PT0ic3RhcnQiP3cuY2xhc3Nlcy5maXhlZFN0YXJ0OncuY2xhc3Nlcy5maXhlZEVuZCkuYWRkQ2xhc3Mobz09PSJsZWZ0Ij93LmNsYXNzZXMuZml4ZWRMZWZ0OncuY2xhc3Nlcy5maXhlZFJpZ2h0KX19O20uZm9yRWFjaChmdW5jdGlvbihGKXtGW2NdJiZQKHQoRltjXS5jZWxsKSwiaGVhZGVyIil9KSxQKGsuY29sdW1uKGMrIjp2aXNpYmxlIix7cGFnZToiY3VycmVudCJ9KS5ub2RlcygpLnRvJCgpLCJib2R5IikseSYmeS5mb3JFYWNoKGZ1bmN0aW9uKEYpe0ZbY10mJlAodChGW2NdLmNlbGwpLCJmb290ZXIiKX0pfSxsLnByb3RvdHlwZS5fc2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5kb20uc2Nyb2xsZXJbMF07aWYoYyl7dmFyIHA9dCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLmFkZCh0aGlzLnMuZHQudGFibGUoKS5oZWFkZXIoKS5wYXJlbnROb2RlKS5hZGQodGhpcy5zLmR0LnRhYmxlKCkuZm9vdGVyKCkucGFyZW50Tm9kZSkuYWRkKCJkaXYuZHQtc2Nyb2xsLWhlYWRJbm5lciB0YWJsZSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpLmFkZCgiZGl2LmR0LXNjcm9sbC1mb290SW5uZXIgdGFibGUiLHRoaXMucy5kdC50YWJsZSgpLmNvbnRhaW5lcigpKSxiPWMuc2Nyb2xsTGVmdCxtPSF0aGlzLnMucnRsLHk9YiE9PTAsVD1jLnNjcm9sbFdpZHRoPmMuY2xpZW50V2lkdGgrTWF0aC5hYnMoYikrMTtwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1N0YXJ0LHkpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nRW5kLFQpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nTGVmdCx5JiZtfHxUJiYhbSkscC50b2dnbGVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdSaWdodCxUJiZtfHx5JiYhbSl9fSxsLnByb3RvdHlwZS5fc2V0S2V5VGFibGVMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBjPXRoaXM7dGhpcy5zLmR0Lm9uKCJrZXktZm9jdXMuZHQuZHRmYyIsZnVuY3Rpb24ocCxiLG0pe3ZhciB5LFQ9dChtLm5vZGUoKSkub2Zmc2V0KCksdz1jLmRvbS5zY3JvbGxlclswXSxrPXQodChjLnMuZHQudGFibGUoKS5ub2RlKCkpLmNsb3Nlc3QoImRpdi5kdC1zY3JvbGwtYm9keSIpKTtpZihjLmMuc3RhcnQ+MCl7dmFyIFA9dChjLnMuZHQuY29sdW1uKGMuYy5zdGFydC0xKS5oZWFkZXIoKSksRj1QLm9mZnNldCgpLGg9UC5vdXRlcldpZHRoKCk7dChtLm5vZGUoKSkuaGFzQ2xhc3MoYy5jbGFzc2VzLmZpeGVkTGVmdCk/ay5zY3JvbGxMZWZ0KDApOlQubGVmdDxGLmxlZnQraCYmKHk9ay5zY3JvbGxMZWZ0KCksay5zY3JvbGxMZWZ0KHktKEYubGVmdCtoLVQubGVmdCkpKX1pZihjLmMuZW5kPjApe3ZhciBvPWMucy5kdC5jb2x1bW5zKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGgsZj10KG0ubm9kZSgpKS5vdXRlcldpZHRoKCksQz10KGMucy5kdC5jb2x1bW4oby1jLmMuZW5kKS5oZWFkZXIoKSksQj1DLm9mZnNldCgpO3QobS5ub2RlKCkpLmhhc0NsYXNzKGMuY2xhc3Nlcy5maXhlZFJpZ2h0KT9rLnNjcm9sbExlZnQody5zY3JvbGxXaWR0aC13LmNsaWVudFdpZHRoKTpULmxlZnQrZj5CLmxlZnQmJih5PWsuc2Nyb2xsTGVmdCgpLGsuc2Nyb2xsTGVmdCh5LShCLmxlZnQtKFQubGVmdCtmKSkpKX19KX0sbC5wcm90b3R5cGUuX3N1bT1mdW5jdGlvbihjLHAsYil7cmV0dXJuIGI9PT12b2lkIDAmJihiPSExKSxiJiYoYz1jLnNsaWNlKCkucmV2ZXJzZSgpKSxjLnNsaWNlKDAscCkucmVkdWNlKGZ1bmN0aW9uKG0seSl7cmV0dXJuIG0reX0sMCl9LGwudmVyc2lvbj0iNS4wLjAiLGwuY2xhc3Nlcz17Ym90dG9tQmxvY2tlcjoiZHRmYy1ib3R0b20tYmxvY2tlciIsZml4ZWRFbmQ6ImR0ZmMtZml4ZWQtZW5kIixmaXhlZExlZnQ6ImR0ZmMtZml4ZWQtbGVmdCIsZml4ZWRSaWdodDoiZHRmYy1maXhlZC1yaWdodCIsZml4ZWRTdGFydDoiZHRmYy1maXhlZC1zdGFydCIsdGFibGVGaXhlZEVuZDoiZHRmYy1oYXMtZW5kIix0YWJsZUZpeGVkTGVmdDoiZHRmYy1oYXMtbGVmdCIsdGFibGVGaXhlZFJpZ2h0OiJkdGZjLWhhcy1yaWdodCIsdGFibGVGaXhlZFN0YXJ0OiJkdGZjLWhhcy1zdGFydCIsdGFibGVTY3JvbGxpbmdFbmQ6ImR0ZmMtc2Nyb2xsaW5nLWVuZCIsdGFibGVTY3JvbGxpbmdMZWZ0OiJkdGZjLXNjcm9sbGluZy1sZWZ0Iix0YWJsZVNjcm9sbGluZ1JpZ2h0OiJkdGZjLXNjcm9sbGluZy1yaWdodCIsdGFibGVTY3JvbGxpbmdTdGFydDoiZHRmYy1zY3JvbGxpbmctc3RhcnQiLHRvcEJsb2NrZXI6ImR0ZmMtdG9wLWJsb2NrZXIifSxsLmRlZmF1bHRzPXtpMThuOntidXR0b246IkZpeGVkQ29sdW1ucyJ9LHN0YXJ0OjEsZW5kOjB9LGx9KCk7cihpciksaXIuZm4uZGF0YVRhYmxlLkZpeGVkQ29sdW1ucz1uLGlyLmZuLkRhdGFUYWJsZS5GaXhlZENvbHVtbnM9bjt2YXIgcz1zdC5BcGkucmVnaXN0ZXI7cygiZml4ZWRDb2x1bW5zKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxzKCJmaXhlZENvbHVtbnMoKS5zdGFydCgpIixmdW5jdGlvbihsKXt2YXIgYz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KGMuX2ZpeGVkQ29sdW1ucy5zdGFydChsKSx0aGlzKTpjLl9maXhlZENvbHVtbnMuc3RhcnQoKX0pLHMoImZpeGVkQ29sdW1ucygpLmVuZCgpIixmdW5jdGlvbihsKXt2YXIgYz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KGMuX2ZpeGVkQ29sdW1ucy5lbmQobCksdGhpcyk6Yy5fZml4ZWRDb2x1bW5zLmVuZCgpfSkscygiZml4ZWRDb2x1bW5zKCkubGVmdCgpIixmdW5jdGlvbihsKXt2YXIgYz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KGMuX2ZpeGVkQ29sdW1ucy5sZWZ0KGwpLHRoaXMpOmMuX2ZpeGVkQ29sdW1ucy5sZWZ0KCl9KSxzKCJmaXhlZENvbHVtbnMoKS5yaWdodCgpIixmdW5jdGlvbihsKXt2YXIgYz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KGMuX2ZpeGVkQ29sdW1ucy5yaWdodChsKSx0aGlzKTpjLl9maXhlZENvbHVtbnMucmlnaHQoKX0pLHN0LmV4dC5idXR0b25zLmZpeGVkQ29sdW1ucz17YWN0aW9uOmZ1bmN0aW9uKGwsYyxwLGIpe2lyKHApLmF0dHIoImFjdGl2ZSIpPyhpcihwKS5yZW1vdmVBdHRyKCJhY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksYy5maXhlZENvbHVtbnMoKS5zdGFydCgwKSxjLmZpeGVkQ29sdW1ucygpLmVuZCgwKSk6KGlyKHApLmF0dHIoImFjdGl2ZSIsInRydWUiKS5hZGRDbGFzcygiYWN0aXZlIiksYy5maXhlZENvbHVtbnMoKS5zdGFydChiLmNvbmZpZy5zdGFydCksYy5maXhlZENvbHVtbnMoKS5lbmQoYi5jb25maWcuZW5kKSl9LGNvbmZpZzp7c3RhcnQ6MSxlbmQ6MH0saW5pdDpmdW5jdGlvbihsLGMscCl7bC5zZXR0aW5ncygpWzBdLl9maXhlZENvbHVtbnM9PT12b2lkIDAmJmEobC5zZXR0aW5ncygpLHApLGlyKGMpLmF0dHIoImFjdGl2ZSIsInRydWUiKS5hZGRDbGFzcygiYWN0aXZlIiksbC5idXR0b24oYykudGV4dChwLnRleHR8fGwuaTE4bigiYnV0dG9ucy5maXhlZENvbHVtbnMiLGwuc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zLmMuaTE4bi5idXR0b24pKX0sdGV4dDpudWxsfTtmdW5jdGlvbiBhKGwsYyl7Yz09PXZvaWQgMCYmKGM9bnVsbCk7dmFyIHA9bmV3IHN0LkFwaShsKSxiPWN8fHAuaW5pdCgpLmZpeGVkQ29sdW1uc3x8c3QuZGVmYXVsdHMuZml4ZWRDb2x1bW5zLG09bmV3IG4ocCxiKTtyZXR1cm4gbX1pcihkb2N1bWVudCkub24oInBsdWdpbi1pbml0LmR0IixmdW5jdGlvbihsLGMpe2wubmFtZXNwYWNlPT09ImR0IiYmKGMub0luaXQuZml4ZWRDb2x1bW5zfHxzdC5kZWZhdWx0cy5maXhlZENvbHVtbnMpJiYoYy5fZml4ZWRDb2x1bW5zfHxhKGMsbnVsbCkpfSl9KSgpO3ZhciBqbD1uZShpZSgpLDEpO3ZhciBFcz1uZShpZSgpLDEpO3ZhciBqdD1Fcy5kZWZhdWx0LExsPTAsemw9MCx2cj1mdW5jdGlvbih0LGUpe2lmKCFzdC52ZXJzaW9uQ2hlY2t8fCFzdC52ZXJzaW9uQ2hlY2soIjEuMTAuOCIpKXRocm93IktleVRhYmxlIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMC44IG9yIG5ld2VyIjt0aGlzLmM9anQuZXh0ZW5kKCEwLHt9LHN0LmRlZmF1bHRzLmtleVRhYmxlLHZyLmRlZmF1bHRzLGUpLHRoaXMucz17ZHQ6bmV3IHN0LkFwaSh0KSxkdERyYXdpbmc6ITEsZW5hYmxlOiEwLGZvY3VzRHJhdzohMSx3YWl0aW5nRm9yRHJhdzohMSxsYXN0Rm9jdXM6bnVsbCxuYW1lc3BhY2U6Ii5rZXlUYWJsZS0iK0xsKyssdGFiSW5wdXQ6bnVsbH0sdGhpcy5kb209e307dmFyIHI9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sbj1yLmtleXRhYmxlO2lmKG4pcmV0dXJuIG47ci5rZXl0YWJsZT10aGlzLHRoaXMuX2NvbnN0cnVjdG9yKCl9O2p0LmV4dGVuZCh2ci5wcm90b3R5cGUse2JsdXI6ZnVuY3Rpb24oKXt0aGlzLl9ibHVyKCl9LGVuYWJsZTpmdW5jdGlvbih0KXt0aGlzLnMuZW5hYmxlPXR9LGVuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmVuYWJsZX0sZm9jdXM6ZnVuY3Rpb24odCxlKXt0aGlzLl9mb2N1cyh0aGlzLnMuZHQuY2VsbCh0LGUpKX0sZm9jdXNlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnMubGFzdEZvY3VzO2lmKCFlKXJldHVybiExO3ZhciByPXRoaXMucy5sYXN0Rm9jdXMuY2VsbC5pbmRleCgpO3JldHVybiB0LnJvdz09PXIucm93JiZ0LmNvbHVtbj09PXIuY29sdW1ufSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl90YWJJbnB1dCgpO3ZhciB0PXRoaXMsZT10aGlzLnMuZHQscj1qdChlLnRhYmxlKCkubm9kZSgpKSxuPXRoaXMucy5uYW1lc3BhY2Uscz0hMTtpZihyLmNzcygicG9zaXRpb24iKT09PSJzdGF0aWMiJiZyLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLGp0KGUudGFibGUoKS5ib2R5KCkpLm9uKCJjbGljayIrbiwidGgsIHRkIixmdW5jdGlvbihjKXtpZih0LnMuZW5hYmxlIT09ITEpe3ZhciBwPWUuY2VsbCh0aGlzKTtwLmFueSgpJiZ0Ll9mb2N1cyhwLG51bGwsITEsYyl9fSksanQoZG9jdW1lbnQpLm9uKCJrZXlkb3duIituLGZ1bmN0aW9uKGMpeyFzJiYhdC5zLmR0RHJhd2luZz90Ll9rZXkoYyk6Yy5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy5jLmJsdXJhYmxlJiZqdChkb2N1bWVudCkub24oIm1vdXNlZG93biIrbixmdW5jdGlvbihjKXtqdChjLnRhcmdldCkucGFyZW50cygiLmRhdGFUYWJsZXNfZmlsdGVyLCAuZHQtc2VhcmNoIikubGVuZ3RoJiZ0Ll9ibHVyKCksIWp0KGMudGFyZ2V0KS5wYXJlbnRzKCkuZmlsdGVyKGUudGFibGUoKS5jb250YWluZXIoKSkubGVuZ3RoJiYoanQoYy50YXJnZXQpLnBhcmVudHMoImRpdi5EVEUiKS5sZW5ndGh8fGp0KGMudGFyZ2V0KS5wYXJlbnRzKCJkaXYuZWRpdG9yLWRhdGV0aW1lIikubGVuZ3RofHxqdChjLnRhcmdldCkucGFyZW50cygiZGl2LmR0LWRhdGV0aW1lIikubGVuZ3RofHxqdChjLnRhcmdldCkucGFyZW50cygpLmZpbHRlcigiLkRURkNfQ2xvbmVkIikubGVuZ3RofHx0Ll9ibHVyKCkpfSksdGhpcy5jLmVkaXRvcil7dmFyIGE9dGhpcy5jLmVkaXRvcjthLm9uKCJvcGVuLmtleVRhYmxlTWFpbiIsZnVuY3Rpb24oYyxwLGIpe3AhPT0iaW5saW5lIiYmdC5zLmVuYWJsZSYmKHQuZW5hYmxlKCExKSxhLm9uZSgiY2xvc2UiK24sZnVuY3Rpb24oKXt0LmVuYWJsZSghMCl9KSl9KSx0aGlzLmMuZWRpdE9uRm9jdXMmJmUub24oImtleS1mb2N1cyIrbisiIGtleS1yZWZvY3VzIituLGZ1bmN0aW9uKGMscCxiLG0pe3QuX2VkaXRvcihudWxsLG0sITApfSksZS5vbigia2V5IituLGZ1bmN0aW9uKGMscCxiLG0seSl7dC5fZWRpdG9yKGIseSwhMSl9KSxqdChlLnRhYmxlKCkuYm9keSgpKS5vbigiZGJsY2xpY2siK24sInRoLCB0ZCIsZnVuY3Rpb24oYyl7aWYodC5zLmVuYWJsZSE9PSExKXt2YXIgcD1lLmNlbGwodGhpcyk7cC5hbnkoKSYmKHQucy5sYXN0Rm9jdXMmJnRoaXMhPT10LnMubGFzdEZvY3VzLmNlbGwubm9kZSgpfHx0Ll9lZGl0b3IobnVsbCxjLCEwKSl9fSksYS5vbigicHJlU3VibWl0IixmdW5jdGlvbigpe3M9ITB9KS5vbigicHJlU3VibWl0Q2FuY2VsbGVkIixmdW5jdGlvbigpe3M9ITF9KS5vbigic3VibWl0Q29tcGxldGUiLGZ1bmN0aW9uKCl7cz0hMX0pfWUub24oInN0YXRlU2F2ZVBhcmFtcyIrbixmdW5jdGlvbihjLHAsYil7Yi5rZXlUYWJsZT10LnMubGFzdEZvY3VzP3Qucy5sYXN0Rm9jdXMuY2VsbC5pbmRleCgpOm51bGx9KSxlLm9uKCJjb2x1bW4tdmlzaWJpbGl0eSIrbixmdW5jdGlvbihjKXt0Ll90YWJJbnB1dCgpfSksZS5vbigiY29sdW1uLXJlb3JkZXIiK24sZnVuY3Rpb24oYyxwLGIpe3ZhciBtPXQucy5sYXN0Rm9jdXM7aWYobSYmbS5jZWxsKXt2YXIgeT1tLnJlbGF0aXZlLmNvbHVtbjttLmNlbGxbMF1bMF0uY29sdW1uPWIubWFwcGluZy5pbmRleE9mKHkpLG0ucmVsYXRpdmUuY29sdW1uPWIubWFwcGluZy5pbmRleE9mKHkpfX0pLGUub24oInByZURyYXciK24rIiBzY3JvbGxlci13aWxsLWRyYXciK24sZnVuY3Rpb24oYyl7dC5zLmR0RHJhd2luZz0hMH0pLGUub24oImRyYXciK24sZnVuY3Rpb24oYyl7aWYodC5zLmR0RHJhd2luZz0hMSx0Ll90YWJJbnB1dCgpLCF0LnMuZm9jdXNEcmF3KXt2YXIgcD10LnMubGFzdEZvY3VzO2lmKHApe3ZhciBiPXQucy5sYXN0Rm9jdXMucmVsYXRpdmUsbT1lLnBhZ2UuaW5mbygpLHk9Yi5yb3c7aWYobS5yZWNvcmRzRGlzcGxheT09PTB8fHk8bS5zdGFydHx8eT5tLnN0YXJ0K20ubGVuZ3RoKXJldHVybjt5Pj1tLnJlY29yZHNEaXNwbGF5JiYoeT1tLnJlY29yZHNEaXNwbGF5LTEpLHQuX2ZvY3VzKHksYi5jb2x1bW4sITAsYyl9fX0pLHRoaXMuYy5jbGlwYm9hcmQmJnRoaXMuX2NsaXBib2FyZCgpLGUub24oImRlc3Ryb3kiK24sZnVuY3Rpb24oKXt0Ll9ibHVyKCEwKSxlLm9mZihuKSxqdChlLnRhYmxlKCkuYm9keSgpKS5vZmYoImNsaWNrIituLCJ0aCwgdGQiKS5vZmYoImRibGNsaWNrIituLCJ0aCwgdGQiKSxqdChkb2N1bWVudCkub2ZmKCJtb3VzZWRvd24iK24pLm9mZigia2V5ZG93biIrbikub2ZmKCJjb3B5IituKS5vZmYoInBhc3RlIituKX0pO3ZhciBsPWUuc3RhdGUubG9hZGVkKCk7bCYmbC5rZXlUYWJsZT9lLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXt2YXIgYz1lLmNlbGwobC5rZXlUYWJsZSk7Yy5hbnkoKSYmYy5mb2N1cygpfSk6dGhpcy5jLmZvY3VzJiZlLmNlbGwodGhpcy5jLmZvY3VzKS5mb2N1cygpfSxfYmx1cjpmdW5jdGlvbih0KXtpZighKCF0aGlzLnMuZW5hYmxlfHwhdGhpcy5zLmxhc3RGb2N1cykpe3ZhciBlPXRoaXMucy5sYXN0Rm9jdXMuY2VsbDtqdChlLm5vZGUoKSkucmVtb3ZlQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSksdGhpcy5zLmxhc3RGb2N1cz1udWxsLHR8fCh0aGlzLl91cGRhdGVGaXhlZENvbHVtbnMoZS5pbmRleCgpLmNvbHVtbiksdGhpcy5fZW1pdEV2ZW50KCJrZXktYmx1ciIsW3RoaXMucy5kdCxlXSkpfX0sX2NsaXBib2FyZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXRoaXMscj10aGlzLnMubmFtZXNwYWNlLG49dGhpcy5jLmNsaXBib2FyZDt3aW5kb3cuZ2V0U2VsZWN0aW9uJiYoKG49PT0hMHx8bi5jb3B5KSYmanQoZG9jdW1lbnQpLm9uKCJjb3B5IityLGZ1bmN0aW9uKHMpe3ZhciBhPXMub3JpZ2luYWxFdmVudCxsPXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLGM9ZS5zLmxhc3RGb2N1czshbCYmYyYmKGEuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIixjLmNlbGwucmVuZGVyKGUuYy5jbGlwYm9hcmRPcnRob2dvbmFsKSksYS5wcmV2ZW50RGVmYXVsdCgpKX0pLChuPT09ITB8fG4ucGFzdGUpJiZqdChkb2N1bWVudCkub24oInBhc3RlIityLGZ1bmN0aW9uKHMpe3ZhciBhPXMub3JpZ2luYWxFdmVudCxsPWUucy5sYXN0Rm9jdXMsYz1kb2N1bWVudC5hY3RpdmVFbGVtZW50LHA9ZS5jLmVkaXRvcixiO2lmKGwmJighY3x8Yy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJvZHkiKSlpZihhLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsaXBib2FyZERhdGEmJndpbmRvdy5jbGlwYm9hcmREYXRhLmdldERhdGE/Yj13aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik6YS5jbGlwYm9hcmREYXRhJiZhLmNsaXBib2FyZERhdGEuZ2V0RGF0YSYmKGI9YS5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQvcGxhaW4iKSkscCl7dmFyIG09ZS5faW5saW5lT3B0aW9ucyhsLmNlbGwuaW5kZXgoKSk7cC5pbmxpbmUobS5jZWxsLG0uZmllbGQsbS5vcHRpb25zKS5zZXQocC5kaXNwbGF5ZWQoKVswXSxiKS5zdWJtaXQoKX1lbHNlIGwuY2VsbC5kYXRhKGIpLHQuZHJhdyghMSl9KSl9LF9jb2x1bW5zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zLmR0LGU9dC5jb2x1bW5zKHRoaXMuYy5jb2x1bW5zKS5pbmRleGVzKCkscj1bXTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmV2ZXJ5KGZ1bmN0aW9uKG4pe2UuaW5kZXhPZihuKSE9PS0xJiZyLnB1c2gobil9KSxyfSxfZWRpdG9yOmZ1bmN0aW9uKHQsZSxyKXtpZih0aGlzLnMubGFzdEZvY3VzJiYhKGUmJmUudHlwZT09PSJkcmF3Iikpe3ZhciBuPXRoaXMscz10aGlzLnMuZHQsYT10aGlzLmMuZWRpdG9yLGw9dGhpcy5zLmxhc3RGb2N1cy5jZWxsLGM9dGhpcy5zLm5hbWVzcGFjZSsiZSIremwrKztpZighanQoImRpdi5EVEUiLGwubm9kZSgpKS5sZW5ndGgmJiEodCE9PW51bGwmJih0Pj0wJiZ0PD05fHx0PT09MTF8fHQ9PT0xMnx8dD49MTQmJnQ8PTMxfHx0Pj0xMTImJnQ8PTEyM3x8dD49MTI3JiZ0PD0xNTkpKSl7ZSYmKGUuc3RvcFByb3BhZ2F0aW9uKCksdD09PTEzJiZlLnByZXZlbnREZWZhdWx0KCkpO3ZhciBwPWZ1bmN0aW9uKCl7dmFyIGI9bi5faW5saW5lT3B0aW9ucyhsLmluZGV4KCkpO2Eub25lKCJvcGVuIitjLGZ1bmN0aW9uKCl7YS5vZmYoImNhbmNlbE9wZW4iK2MpLHJ8fGp0KCJkaXYuRFRFX0ZpZWxkX0lucHV0Q29udHJvbCBpbnB1dCwgZGl2LkRURV9GaWVsZF9JbnB1dENvbnRyb2wgdGV4dGFyZWEiKS5zZWxlY3QoKSxzLmtleXMuZW5hYmxlKHI/InRhYi1vbmx5IjoibmF2aWdhdGlvbi1vbmx5Iikscy5vbigia2V5LWJsdXIuZWRpdG9yIixmdW5jdGlvbihtLHksVCl7YS5zLmVkaXRPcHRzLm9uQmx1ciE9PSJzdWJtaXQiJiZhLmRpc3BsYXllZCgpJiZULm5vZGUoKT09PWwubm9kZSgpJiZhLnN1Ym1pdCgpfSksciYmanQocy50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGRDbGFzcygiZHRrLWZvY3VzLWFsdCIpLGEub24oInByZVN1Ym1pdENhbmNlbGxlZCIrYyxmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuLl9mb2N1cyhsLG51bGwsITEpfSw1MCl9KSxhLm9uKCJzdWJtaXRVbnN1Y2Nlc3NmdWwiK2MsZnVuY3Rpb24oKXtuLl9mb2N1cyhsLG51bGwsITEpfSksYS5vbmUoImNsb3NlIitjLGZ1bmN0aW9uKCl7cy5rZXlzLmVuYWJsZSghMCkscy5vZmYoImtleS1ibHVyLmVkaXRvciIpLGEub2ZmKGMpLGp0KHMudGFibGUoKS5jb250YWluZXIoKSkucmVtb3ZlQ2xhc3MoImR0ay1mb2N1cy1hbHQiKSxuLnMucmV0dXJuU3VibWl0JiYobi5zLnJldHVyblN1Ym1pdD0hMSxuLl9lbWl0RXZlbnQoImtleS1yZXR1cm4tc3VibWl0IixbcyxsXSkpfSl9KS5vbmUoImNhbmNlbE9wZW4iK2MsZnVuY3Rpb24oKXthLm9mZihjKX0pLmlubGluZShiLmNlbGwsYi5maWVsZCxiLm9wdGlvbnMpfTt0PT09MTM/KHI9ITAsanQoZG9jdW1lbnQpLm9uZSgia2V5dXAiLGZ1bmN0aW9uKCl7cCgpfSkpOnAoKX19fSxfaW5saW5lT3B0aW9uczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jLmVkaXRvck9wdGlvbnM/dGhpcy5jLmVkaXRvck9wdGlvbnModCk6e2NlbGw6dCxmaWVsZDp2b2lkIDAsb3B0aW9uczp2b2lkIDB9fSxfZW1pdEV2ZW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucy5kdC5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIsbil7cmV0dXJuIGp0KHIublRhYmxlKS50cmlnZ2VySGFuZGxlcih0LGUpfSl9LF9mb2N1czpmdW5jdGlvbih0LGUscixuKXt2YXIgcz10aGlzLGE9dGhpcy5zLmR0LGw9YS5wYWdlLmluZm8oKSxjPXRoaXMucy5sYXN0Rm9jdXM7aWYobnx8KG49bnVsbCksISF0aGlzLnMuZW5hYmxlKXtpZih0eXBlb2YgdCE9Im51bWJlciIpe2lmKCF0LmFueSgpKXJldHVybjt2YXIgcD10LmluZGV4KCk7aWYoZT1wLmNvbHVtbix0PWEucm93cyh7ZmlsdGVyOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5pbmRleGVzKCkuaW5kZXhPZihwLnJvdyksdDwwKXJldHVybjtsLnNlcnZlclNpZGUmJih0Kz1sLnN0YXJ0KX1pZihsLmxlbmd0aCE9PS0xJiYodDxsLnN0YXJ0fHx0Pj1sLnN0YXJ0K2wubGVuZ3RoKSl7dGhpcy5zLmZvY3VzRHJhdz0hMCx0aGlzLnMud2FpdGluZ0ZvckRyYXc9ITAsYS5vbmUoImRyYXciLGZ1bmN0aW9uKCl7cy5zLmZvY3VzRHJhdz0hMSxzLnMud2FpdGluZ0ZvckRyYXc9ITEscy5fZm9jdXModCxlLHZvaWQgMCxuKX0pLnBhZ2UoTWF0aC5mbG9vcih0L2wubGVuZ3RoKSkuZHJhdyghMSk7cmV0dXJufWlmKGp0LmluQXJyYXkoZSx0aGlzLl9jb2x1bW5zKCkpIT09LTEpe2wuc2VydmVyU2lkZSYmKHQtPWwuc3RhcnQpO3ZhciBiPWEuY2VsbHMobnVsbCxlLHtzZWFyY2g6ImFwcGxpZWQiLG9yZGVyOiJhcHBsaWVkIn0pLmZsYXR0ZW4oKSxtPWEuY2VsbChiW3RdKSx5PXRoaXMuX2VtaXRFdmVudCgia2V5LXByZWZvY3VzIixbdGhpcy5zLmR0LG0sbnx8bnVsbF0pO2lmKHkuaW5kZXhPZighMSk9PT0tMSl7aWYoYyl7aWYoYy5ub2RlPT09bS5ub2RlKCkpe3RoaXMuX2VtaXRFdmVudCgia2V5LXJlZm9jdXMiLFt0aGlzLnMuZHQsbSxufHxudWxsXSk7cmV0dXJufXRoaXMuX2JsdXIoKX10aGlzLl9yZW1vdmVPdGhlckZvY3VzKCk7dmFyIFQ9anQobS5ub2RlKCkpO2lmKFQuYWRkQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSksdGhpcy5fdXBkYXRlRml4ZWRDb2x1bW5zKGUpLHI9PT12b2lkIDB8fHI9PT0hMCl7dGhpcy5fc2Nyb2xsKGp0KHdpbmRvdyksanQoZG9jdW1lbnQuYm9keSksVCwib2Zmc2V0Iik7dmFyIHc9YS50YWJsZSgpLmJvZHkoKS5wYXJlbnROb2RlO2lmKHchPT1hLnRhYmxlKCkuaGVhZGVyKCkucGFyZW50Tm9kZSl7dmFyIGs9anQody5wYXJlbnROb2RlKTt0aGlzLl9zY3JvbGwoayxrLFQsInBvc2l0aW9uIil9fXZhciBQPWEucGFnZS5pbmZvKCk7dGhpcy5zLmxhc3RGb2N1cz17Y2VsbDptLG5vZGU6bS5ub2RlKCkscmVsYXRpdmU6e3JvdzpQLnN0YXJ0K2Eucm93cyh7cGFnZToiY3VycmVudCJ9KS5pbmRleGVzKCkuaW5kZXhPZihtLmluZGV4KCkucm93KSxjb2x1bW46bS5pbmRleCgpLmNvbHVtbn19LHRoaXMuX2VtaXRFdmVudCgia2V5LWZvY3VzIixbdGhpcy5zLmR0LG0sbnx8bnVsbF0pLGEuc3RhdGUuc2F2ZSgpfX19fSxfa2V5OmZ1bmN0aW9uKHQpe2lmKHRoaXMucy53YWl0aW5nRm9yRHJhdyl7dC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn1pZighanQodC50YXJnZXQpLmNsb3Nlc3QoIi5kdGUtaW5saW5lQWRkIikubGVuZ3RoKXt2YXIgZT10aGlzLnMuZW5hYmxlO3RoaXMucy5yZXR1cm5TdWJtaXQ9KGU9PT0ibmF2aWdhdGlvbi1vbmx5Inx8ZT09PSJ0YWItb25seSIpJiZ0LmtleUNvZGU9PT0xMzt2YXIgcj1lPT09ITB8fGU9PT0ibmF2aWdhdGlvbi1vbmx5IjtpZihlJiYhKCh0LmtleUNvZGU9PT0wfHx0LmN0cmxLZXl8fHQubWV0YUtleXx8dC5hbHRLZXkpJiYhKHQuY3RybEtleSYmdC5hbHRLZXkpKSl7dmFyIG49dGhpcy5zLmxhc3RGb2N1cztpZihuKXtpZighdGhpcy5zLmR0LmNlbGwobi5ub2RlKS5hbnkoKSl7dGhpcy5zLmxhc3RGb2N1cz1udWxsO3JldHVybn12YXIgcz10aGlzLGE9dGhpcy5zLmR0LGw9ISF0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vU2Nyb2xsLnNZO2lmKCEodGhpcy5jLmtleXMmJmp0LmluQXJyYXkodC5rZXlDb2RlLHRoaXMuYy5rZXlzKT09PS0xKSlzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDk6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe3MuX3NoaWZ0KHQsdC5zaGlmdEtleT8ibGVmdCI6InJpZ2h0IiwhMCl9KTticmVhaztjYXNlIDI3OmlmKGp0KG4ubm9kZSkuZmluZCgiZGl2LkRURSIpLmxlbmd0aClyZXR1cm47dGhpcy5jLmJsdXJhYmxlJiZlPT09ITAmJnRoaXMuX2JsdXIoKTticmVhaztjYXNlIDMzOmNhc2UgMzQ6ciYmIWwmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7YS5wYWdlKHQua2V5Q29kZT09PTMzPyJwcmV2aW91cyI6Im5leHQiKS5kcmF3KCExKX0pKTticmVhaztjYXNlIDM1OmNhc2UgMzY6ciYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXt2YXIgYz1hLmNlbGxzKHtwYWdlOiJjdXJyZW50In0pLmluZGV4ZXMoKSxwPXMuX2NvbHVtbnMoKTtzLl9mb2N1cyhhLmNlbGwoY1t0LmtleUNvZGU9PT0zNT9jLmxlbmd0aC0xOnBbMF1dKSxudWxsLCEwLHQpfSkpO2JyZWFrO2Nhc2UgMzc6ciYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwibGVmdCIpfSk7YnJlYWs7Y2FzZSAzODpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJ1cCIpfSk7YnJlYWs7Y2FzZSAzOTpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJyaWdodCIpfSk7YnJlYWs7Y2FzZSA0MDpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJkb3duIil9KTticmVhaztjYXNlIDExMzppZih0aGlzLmMuZWRpdG9yKXt0aGlzLl9lZGl0b3IobnVsbCx0LCEwKTticmVha31kZWZhdWx0OmU9PT0hMCYmdGhpcy5fZW1pdEV2ZW50KCJrZXkiLFthLHQua2V5Q29kZSx0aGlzLnMubGFzdEZvY3VzLmNlbGwsdF0pO2JyZWFrfX19fX0sX2tleUFjdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmMuZWRpdG9yO2UmJmUubW9kZSgpP2Uuc3VibWl0KHQpOnQoKX0sX3JlbW92ZU90aGVyRm9jdXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnMuZHQudGFibGUoKS5ub2RlKCk7anQuZm4uZGF0YVRhYmxlLnRhYmxlcyh7YXBpOiEwfSkuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXt0aGlzLnRhYmxlKCkubm9kZSgpIT09dCYmdGhpcy5jZWxsLmJsdXIoKX0pfSxfc2Nyb2xsOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPXJbbl0oKSxhPXIub3V0ZXJIZWlnaHQoKSxsPXIub3V0ZXJXaWR0aCgpLGM9ZS5zY3JvbGxUb3AoKSxwPWUuc2Nyb2xsTGVmdCgpLGI9dC5oZWlnaHQoKSxtPXQud2lkdGgoKTtuPT09InBvc2l0aW9uIiYmKHMudG9wKz1wYXJzZUludChyLmNsb3Nlc3QoInRhYmxlIikuY3NzKCJ0b3AiKSwxMCkpLHMudG9wPGMmJnMudG9wK2E+Yy01JiZlLnNjcm9sbFRvcChzLnRvcCkscy5sZWZ0PHAmJmUuc2Nyb2xsTGVmdChzLmxlZnQpLHMudG9wK2E+YytiJiZzLnRvcDxjK2IrNSYmYTxiJiZlLnNjcm9sbFRvcChzLnRvcCthLWIpLHMubGVmdCtsPnArbSYmbDxtJiZlLnNjcm9sbExlZnQocy5sZWZ0K2wtbSl9LF9zaGlmdDpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5zLmR0LHM9bi5wYWdlLmluZm8oKSxhPXMucmVjb3Jkc0Rpc3BsYXksbD10aGlzLl9jb2x1bW5zKCksYz10aGlzLnMubGFzdEZvY3VzO2lmKGMpe3ZhciBwPWMuY2VsbDtpZihwKXt2YXIgYj1uLnJvd3Moe2ZpbHRlcjoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSkuaW5kZXhlcygpLmluZGV4T2YocC5pbmRleCgpLnJvdyk7cy5zZXJ2ZXJTaWRlJiYoYis9cy5zdGFydCk7dmFyIG09bi5jb2x1bW5zKGwpLmluZGV4ZXMoKS5pbmRleE9mKHAuaW5kZXgoKS5jb2x1bW4pLHk9YixUPWxbbV07anQobi50YWJsZSgpLm5vZGUoKSkuY3NzKCJkaXJlY3Rpb24iKT09PSJydGwiJiYoZT09PSJyaWdodCI/ZT0ibGVmdCI6ZT09PSJsZWZ0IiYmKGU9InJpZ2h0IikpLGU9PT0icmlnaHQiP20+PWwubGVuZ3RoLTE/KHkrKyxUPWxbMF0pOlQ9bFttKzFdOmU9PT0ibGVmdCI/bT09PTA/KHktLSxUPWxbbC5sZW5ndGgtMV0pOlQ9bFttLTFdOmU9PT0idXAiP3ktLTplPT09ImRvd24iJiZ5KysseT49MCYmeTxhJiZqdC5pbkFycmF5KFQsbCkhPT0tMT8odCYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzKHksVCwhMCx0KSk6IXJ8fCF0aGlzLmMuYmx1cmFibGU/dCYmdC5wcmV2ZW50RGVmYXVsdCgpOnRoaXMuX2JsdXIoKX19fSxfdGFiSW5wdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LHI9dGhpcy5jLnRhYkluZGV4IT09bnVsbD90aGlzLmMudGFiSW5kZXg6ZS5zZXR0aW5ncygpWzBdLmlUYWJJbmRleDtpZihyIT0tMSl7aWYoIXRoaXMucy50YWJJbnB1dCl7dmFyIG49anQoJzxkaXY+PGlucHV0IHR5cGU9InRleHQiIHRhYmluZGV4PSInK3IrJyIvPjwvZGl2PicpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixoZWlnaHQ6MSx3aWR0aDowLG92ZXJmbG93OiJoaWRkZW4ifSk7bi5jaGlsZHJlbigpLm9uKCJmb2N1cyIsZnVuY3Rpb24oYSl7dmFyIGw9ZS5jZWxsKCI6ZXEoMCkiLHQuX2NvbHVtbnMoKSx7cGFnZToiY3VycmVudCJ9KTtsLmFueSgpJiZ0Ll9mb2N1cyhsLG51bGwsITAsYSl9KSx0aGlzLnMudGFiSW5wdXQ9bn12YXIgcz10aGlzLnMuZHQuY2VsbCgiOmVxKDApIiwiMDp2aXNpYmxlIix7cGFnZToiY3VycmVudCIsb3JkZXI6ImN1cnJlbnQifSkubm9kZSgpO3MmJmp0KHMpLnByZXBlbmQodGhpcy5zLnRhYklucHV0KX19LF91cGRhdGVGaXhlZENvbHVtbnM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmR0LHI9ZS5zZXR0aW5ncygpWzBdO2lmKHIuX29GaXhlZENvbHVtbnMpe3ZhciBuPXIuX29GaXhlZENvbHVtbnMucy5pTGVmdENvbHVtbnMscz1yLmFvQ29sdW1ucy5sZW5ndGgtci5fb0ZpeGVkQ29sdW1ucy5zLmlSaWdodENvbHVtbnM7KHQ8bnx8dD49cykmJmUuZml4ZWRDb2x1bW5zKCkudXBkYXRlKCl9fX0pO3ZyLmRlZmF1bHRzPXtibHVyYWJsZTohMCxjbGFzc05hbWU6ImZvY3VzIixjbGlwYm9hcmQ6ITAsY2xpcGJvYXJkT3J0aG9nb25hbDoiZGlzcGxheSIsY29sdW1uczoiIixlZGl0b3I6bnVsbCxlZGl0T25Gb2N1czohMSxlZGl0b3JPcHRpb25zOm51bGwsZm9jdXM6bnVsbCxrZXlzOm51bGwsdGFiSW5kZXg6bnVsbH07dnIudmVyc2lvbj0iMi4xMi4wIjtqdC5mbi5kYXRhVGFibGUuS2V5VGFibGU9dnI7anQuZm4uRGF0YVRhYmxlLktleVRhYmxlPXZyO3N0LkFwaS5yZWdpc3RlcigiY2VsbC5ibHVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXt0LmtleXRhYmxlJiZ0LmtleXRhYmxlLmJsdXIoKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJjZWxsKCkuZm9jdXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLHIpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuZm9jdXMoZSxyKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJrZXlzLmRpc2FibGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuZW5hYmxlKCExKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJrZXlzLmVuYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uua2V5dGFibGUmJmUua2V5dGFibGUuZW5hYmxlKHQ9PT12b2lkIDA/ITA6dCl9KX0pO3N0LkFwaS5yZWdpc3Rlcigia2V5cy5lbmFibGVkKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gZS5sZW5ndGgmJmVbMF0ua2V5dGFibGU/ZVswXS5rZXl0YWJsZS5lbmFibGVkKCk6ITF9KTtzdC5BcGkucmVnaXN0ZXIoImtleXMubW92ZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uua2V5dGFibGUmJmUua2V5dGFibGUuX3NoaWZ0KG51bGwsdCwhMSl9KX0pO3N0LmV4dC5zZWxlY3Rvci5jZWxsLnB1c2goZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUuZm9jdXNlZCxzPXQua2V5dGFibGUsYT1bXTtpZighc3x8bj09PXZvaWQgMClyZXR1cm4gcjtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspKG49PT0hMCYmcy5mb2N1c2VkKHJbbF0pfHxuPT09ITEmJiFzLmZvY3VzZWQocltsXSkpJiZhLnB1c2gocltsXSk7cmV0dXJuIGF9KTtqdChkb2N1bWVudCkub24oInByZUluaXQuZHQuZHRrIixmdW5jdGlvbih0LGUscil7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LmtleXMscz1zdC5kZWZhdWx0cy5rZXlzO2lmKG58fHMpe3ZhciBhPWp0LmV4dGVuZCh7fSxzLG4pO24hPT0hMSYmbmV3IHZyKGUsYSl9fX0pO3ZhciBNbD1uZShpZSgpLDEpO3ZhciBPcz1uZShpZSgpLDEpO3ZhciBFZT1Pcy5kZWZhdWx0LG1yPWZ1bmN0aW9uKHQsZSl7aWYoIXN0LnZlcnNpb25DaGVja3x8IXN0LnZlcnNpb25DaGVjaygiMS4xMSIpKXRocm93IlJvd0dyb3VwIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMSBvciBuZXdlciI7dGhpcy5jPUVlLmV4dGVuZCghMCx7fSxzdC5kZWZhdWx0cy5yb3dHcm91cCxtci5kZWZhdWx0cyxlKSx0aGlzLnM9e2R0Om5ldyBzdC5BcGkodCl9LHRoaXMuZG9tPXt9O3ZhciByPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLG49ci5yb3dHcm91cDtpZihuKXJldHVybiBuO3Iucm93R3JvdXA9dGhpcyx0aGlzLl9jb25zdHJ1Y3RvcigpfTtFZS5leHRlbmQobXIucHJvdG90eXBlLHtkYXRhU3JjOmZ1bmN0aW9uKHQpe2lmKHQ9PT12b2lkIDApcmV0dXJuIHRoaXMuYy5kYXRhU3JjO3ZhciBlPXRoaXMucy5kdDtyZXR1cm4gdGhpcy5jLmRhdGFTcmM9dCxFZShlLnRhYmxlKCkubm9kZSgpKS50cmlnZ2VySGFuZGxlcigicm93Z3JvdXAtZGF0YXNyYy5kdCIsW2UsdF0pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLmVuYWJsZT0hMSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT90aGlzLmRpc2FibGUoKToodGhpcy5jLmVuYWJsZT0hMCx0aGlzKX0sZW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuZW5hYmxlfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LHI9ZS5zZXR0aW5ncygpWzBdO2Uub24oImRyYXcuZHRyZyIsZnVuY3Rpb24obixzKXt0LmMuZW5hYmxlJiZyPT09cyYmdC5fZHJhdygpfSksZS5vbigiY29sdW1uLXZpc2liaWxpdHkuZHQuZHRyZyByZXNwb25zaXZlLXJlc2l6ZS5kdC5kdHJnIixmdW5jdGlvbigpe3QuX2FkanVzdENvbHNwYW4oKX0pLGUub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZS5vZmYoIi5kdHJnIil9KX0sX2FkanVzdENvbHNwYW46ZnVuY3Rpb24oKXtFZSgidHIuIit0aGlzLmMuY2xhc3NOYW1lLHRoaXMucy5kdC50YWJsZSgpLmJvZHkoKSkuZmluZCgidGg6dmlzaWJsZSwgdGQ6dmlzaWJsZSIpLmF0dHIoImNvbHNwYW4iLHRoaXMuX2NvbHNwYW4oKSl9LF9jb2xzcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdC5jb2x1bW5zKCkudmlzaWJsZSgpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApfSxfZHJhdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXRoaXMuX2dyb3VwKDAsdC5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmluZGV4ZXMoKSk7dGhpcy5fZ3JvdXBEaXNwbGF5KDAsZSl9LF9ncm91cDpmdW5jdGlvbih0LGUpe3ZhciByPUFycmF5LmlzQXJyYXkodGhpcy5jLmRhdGFTcmMpP3RoaXMuYy5kYXRhU3JjOlt0aGlzLmMuZGF0YVNyY10sbj1zdC51dGlsLmdldChyW3RdKSxzPXRoaXMucy5kdCxhLGwsYyxwLGI9W10sbT10aGlzO2ZvcihjPTAscD1lLmxlbmd0aDtjPHA7YysrKXt2YXIgeT1lW2NdLFQ9cy5yb3coeSkuZGF0YSgpO2E9bihULHQpLGE9PW51bGwmJihhPW0uYy5lbXB0eURhdGFHcm91cCksKGw9PT12b2lkIDB8fGEhPT1sKSYmKGIucHVzaCh7ZGF0YVBvaW50OmEscm93czpbXX0pLGw9YSksYltiLmxlbmd0aC0xXS5yb3dzLnB1c2goeSl9aWYoclt0KzFdIT09dm9pZCAwKWZvcihjPTAscD1iLmxlbmd0aDtjPHA7YysrKWJbY10uY2hpbGRyZW49dGhpcy5fZ3JvdXAodCsxLGJbY10ucm93cyk7cmV0dXJuIGJ9LF9ncm91cERpc3BsYXk6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5zLmR0LG4scz0wLGE9ZS5sZW5ndGg7czxhO3MrKyl7dmFyIGw9ZVtzXSxjPWwuZGF0YVBvaW50LHAsYj1sLnJvd3M7dGhpcy5jLnN0YXJ0UmVuZGVyJiYobj10aGlzLmMuc3RhcnRSZW5kZXIuY2FsbCh0aGlzLHIucm93cyhiKSxjLHQpLHA9dGhpcy5fcm93V3JhcChuLHRoaXMuYy5zdGFydENsYXNzTmFtZSx0KSxwJiZwLmluc2VydEJlZm9yZShyLnJvdyhiWzBdKS5ub2RlKCkpKSx0aGlzLmMuZW5kUmVuZGVyJiYobj10aGlzLmMuZW5kUmVuZGVyLmNhbGwodGhpcyxyLnJvd3MoYiksYyx0KSxwPXRoaXMuX3Jvd1dyYXAobix0aGlzLmMuZW5kQ2xhc3NOYW1lLHQpLHAmJnAuaW5zZXJ0QWZ0ZXIoci5yb3coYltiLmxlbmd0aC0xXSkubm9kZSgpKSksbC5jaGlsZHJlbiYmdGhpcy5fZ3JvdXBEaXNwbGF5KHQrMSxsLmNoaWxkcmVuKX19LF9yb3dXcmFwOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbjtyZXR1cm4odD09PW51bGx8fHQ9PT0iIikmJih0PXRoaXMuYy5lbXB0eURhdGFHcm91cCksdD09bnVsbD9udWxsOih0eXBlb2YgdD09Im9iamVjdCImJnQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI/bj1FZSh0KTp0IGluc3RhbmNlb2YgRWUmJnQubGVuZ3RoJiZ0WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idHIiP249dDpuPUVlKCI8dHIvPiIpLmFwcGVuZChFZSgiPHRoLz4iKS5hdHRyKCJjb2xzcGFuIix0aGlzLl9jb2xzcGFuKCkpLmF0dHIoInNjb3BlIiwicm93IikuYXBwZW5kKHQpKSxuLmFkZENsYXNzKHRoaXMuYy5jbGFzc05hbWUpLmFkZENsYXNzKGUpLmFkZENsYXNzKCJkdHJnLWxldmVsLSIrcikpfX0pO21yLmRlZmF1bHRzPXtjbGFzc05hbWU6ImR0cmctZ3JvdXAiLGRhdGFTcmM6MCxlbXB0eURhdGFHcm91cDoiTm8gZ3JvdXAiLGVuYWJsZTohMCxlbmRDbGFzc05hbWU6ImR0cmctZW5kIixlbmRSZW5kZXI6bnVsbCxzdGFydENsYXNzTmFtZToiZHRyZy1zdGFydCIsc3RhcnRSZW5kZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZX19O21yLnZlcnNpb249IjEuNS4wIjtFZS5mbi5kYXRhVGFibGUuUm93R3JvdXA9bXI7RWUuZm4uRGF0YVRhYmxlLlJvd0dyb3VwPW1yO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5kaXNhYmxlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXt0LnJvd0dyb3VwJiZ0LnJvd0dyb3VwLmVuYWJsZSghMSl9KX0pO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5lbmFibGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLnJvd0dyb3VwJiZlLnJvd0dyb3VwLmVuYWJsZSh0PT09dm9pZCAwPyEwOnQpfSl9KTtzdC5BcGkucmVnaXN0ZXIoInJvd0dyb3VwKCkuZW5hYmxlZCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGgmJnRbMF0ucm93R3JvdXA/dFswXS5yb3dHcm91cC5lbmFibGVkKCk6ITF9KTtzdC5BcGkucmVnaXN0ZXIoInJvd0dyb3VwKCkuZGF0YVNyYygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0ucm93R3JvdXAuZGF0YVNyYygpOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLnJvd0dyb3VwJiZlLnJvd0dyb3VwLmRhdGFTcmModCl9KX0pO0VlKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHJnIixmdW5jdGlvbih0LGUscil7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LnJvd0dyb3VwLHM9c3QuZGVmYXVsdHMucm93R3JvdXA7aWYobnx8cyl7dmFyIGE9RWUuZXh0ZW5kKHt9LHMsbik7biE9PSExJiZuZXcgbXIoZSxhKX19fSk7dmFyIFZsPW5lKGllKCksMSk7dmFyIFJzPW5lKGllKCksMSk7dmFyIGFyPVJzLmRlZmF1bHQ7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0LGU7ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cubW9tZW50fWZ1bmN0aW9uIG4oKXtyZXR1cm4gd2luZG93Lmx1eG9ufWZ1bmN0aW9uIHMoaCl7dD1oLGU9aC5mbi5kYXRhVGFibGV9dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKG8sZixDLEIsdSx6LHEpe0I9PT12b2lkIDAmJihCPTApLHU9PT12b2lkIDAmJih1PTEpLHo9PT12b2lkIDAmJih6PXZvaWQgMCkscT09PXZvaWQgMCYmKHE9ITEpO3ZhciBldD10aGlzO2lmKCFlfHwhZS52ZXJzaW9uQ2hlY2t8fCFlLnZlcnNpb25DaGVjaygiMS4xMC4wIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMCBvciBuZXdlciIpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxoLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxoLmRlZmF1bHRzLHQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2hCdWlsZGVyLGYpO3ZhciBPPXRoaXMuYy5pMThuO2lmKHRoaXMucz17Y29uZGl0aW9uOnZvaWQgMCxjb25kaXRpb25zOnt9LGRhdGE6dm9pZCAwLGRhdGFJZHg6LTEsZGF0YVBvaW50czpbXSxkYXRlRm9ybWF0OiExLGRlcHRoOnUsZHQ6byxmaWxsZWQ6ITEsaW5kZXg6QixsaXZlU2VhcmNoOnEsb3JpZ0RhdGE6dm9pZCAwLHByZXZlbnRSZWRyYXc6ITEsc2VydmVyRGF0YTp6LHRvcEdyb3VwOkMsdHlwZToiIix2YWx1ZTpbXX0sdGhpcy5kb209e2J1dHRvbnM6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbkNvbnRhaW5lciksY29uZGl0aW9uOnQoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb25kaXRpb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYykuYXR0cigiYXV0b2NvbXBsZXRlIiwiaGFja2luZyIpLGNvbmRpdGlvblRpdGxlOnQoJzxvcHRpb24gdmFsdWU9IiIgZGlzYWJsZWQgc2VsZWN0ZWQgaGlkZGVuLz4nKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbiIsTy5jb25kaXRpb24pKSxjb250YWluZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbnRhaW5lciksZGF0YTp0KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGF0YSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxkYXRhVGl0bGU6dCgnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuZGF0YSIsTy5kYXRhKSksZGVmYXVsdFZhbHVlOnQoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxkZWxldGU6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5kZWxldGUiLE8uZGVsZXRlKSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRlbGV0ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmRlbGV0ZVRpdGxlIixPLmRlbGV0ZVRpdGxlKSkuYXR0cigidHlwZSIsImJ1dHRvbiIpLGlucHV0Q29udDp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaW5wdXRDb250KSxsZWZ0OnQoIjxidXR0b24vPiIpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubGVmdCIsTy5sZWZ0KSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxlZnQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInRpdGxlIix0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sZWZ0VGl0bGUiLE8ubGVmdFRpdGxlKSkuYXR0cigidHlwZSIsImJ1dHRvbiIpLHJpZ2h0OnQoIjxidXR0b24vPiIpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIucmlnaHQiLE8ucmlnaHQpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucmlnaHQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInRpdGxlIix0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5yaWdodFRpdGxlIixPLnJpZ2h0VGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksdmFsdWU6W3QoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KV0sdmFsdWVUaXRsZTp0KCc8b3B0aW9uIHZhbHVlPSItLXZhbHVlVGl0bGUtLSIgZGlzYWJsZWQgc2VsZWN0ZWQgaGlkZGVuLz4nKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnZhbHVlIixPLnZhbHVlKSl9LHRoaXMuYy5ncmV5c2NhbGUpe3RoaXMuZG9tLmRhdGEuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20uY29uZGl0aW9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpLHRoaXMuZG9tLmRlZmF1bHRWYWx1ZS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIFo9MCxnPXRoaXMuZG9tLnZhbHVlO1o8Zy5sZW5ndGg7WisrKXt2YXIgXz1nW1pdO18uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSl9fXJldHVybiB0KHdpbmRvdykub24oInJlc2l6ZS5kdHNiIixlLnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtldC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pKSx0aGlzLl9idWlsZENyaXRlcmlhKCksdGhpc31yZXR1cm4gaC5fZXNjYXBlSFRNTD1mdW5jdGlvbihvKXtyZXR1cm4gby50b1N0cmluZygpLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyZxdW90Oy9nLCciJykucmVwbGFjZSgvJmFtcDsvZywiJiIpfSxoLnByb3RvdHlwZS5kb1NlYXJjaD1mdW5jdGlvbigpe3RoaXMuYy5saXZlU2VhcmNoJiZ0aGlzLnMuZHQuZHJhdygpfSxoLnBhcnNlTnVtRm10PWZ1bmN0aW9uKG8pe3JldHVybitvLnJlcGxhY2UoLyg/IV4tKVteMC05Ll0vZywiIil9LGgucHJvdG90eXBlLnVwZGF0ZUFycm93cz1mdW5jdGlvbihvKXtvPT09dm9pZCAwJiYobz0hMSksdGhpcy5kb20uY29udGFpbmVyLmNoaWxkcmVuKCkuZGV0YWNoKCksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5kYXRhKS5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uKS5hcHBlbmQodGhpcy5kb20uaW5wdXRDb250KSx0aGlzLnNldExpc3RlbmVycygpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIik7Zm9yKHZhciBmPTE7Zjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7ZisrKXRoaXMuZG9tLmlucHV0Q29udC5hcHBlbmQodGhpcy5kb20udmFsdWVbZl0pLHQodGhpcy5kb20udmFsdWVbZl0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZGVwdGg+MSYmdGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20ubGVmdCksKHRoaXMuYy5kZXB0aExpbWl0PT09ITF8fHRoaXMucy5kZXB0aDx0aGlzLmMuZGVwdGhMaW1pdCkmJm8/dGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20ucmlnaHQpOnRoaXMuZG9tLnJpZ2h0LnJlbW92ZSgpLHRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmRlbGV0ZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5idXR0b25zKX0saC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmRhdGEub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmNvbmRpdGlvbi5vZmYoIi5kdHNiIiksdGhpcy5kb20uZGVsZXRlLm9mZigiLmR0c2IiKTtmb3IodmFyIG89MCxmPXRoaXMuZG9tLnZhbHVlO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO0Mub2ZmKCIuZHRzYiIpfXRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmUoKX0saC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKG8sZil7dmFyIEM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sQj10aGlzLnMuY29uZGl0aW9uc1t0aGlzLnMuY29uZGl0aW9uXTtpZih0aGlzLnMuY29uZGl0aW9uIT09dm9pZCAwJiZCIT09dm9pZCAwKXt2YXIgdT1vW3RoaXMucy5kYXRhSWR4XTtpZih0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIifHxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpKXt2YXIgej1bb1t0aGlzLnMuZGF0YUlkeF1dO2lmKEMub0xhbmd1YWdlLnNEZWNpbWFsIT09IiImJih6PW9bdGhpcy5zLmRhdGFJZHhdLnNwbGl0KEMub0xhbmd1YWdlLnNEZWNpbWFsKSksQy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKWZvcih2YXIgcT0wO3E8ei5sZW5ndGg7cSsrKXpbcV09eltxXS5yZXBsYWNlKEMub0xhbmd1YWdlLnNUaG91c2FuZHMsIiwiKTt1PXouam9pbigiLiIpfWlmKHRoaXMuYy5vcnRob2dvbmFsLnNlYXJjaCE9PSJmaWx0ZXIiJiYodT1DLmZhc3REYXRhKGYsdGhpcy5zLmRhdGFJZHgsdHlwZW9mIHRoaXMuYy5vcnRob2dvbmFsPT0ic3RyaW5nIj90aGlzLmMub3J0aG9nb25hbDp0aGlzLmMub3J0aG9nb25hbC5zZWFyY2gpKSx0aGlzLnMudHlwZT09PSJhcnJheSIpe0FycmF5LmlzQXJyYXkodSl8fCh1PVt1XSksdS5zb3J0KCk7Zm9yKHZhciBldD0wLE89dTtldDxPLmxlbmd0aDtldCsrKXt2YXIgWj1PW2V0XTtaJiZ0eXBlb2YgWj09InN0cmluZyImJihaPVoucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiAiKSl9fWVsc2UgdSE9PW51bGwmJnR5cGVvZiB1PT0ic3RyaW5nIiYmKHU9dS5yZXBsYWNlKC9bXHJcblx1MjAyOF0vZywiICIpKTtyZXR1cm4gdGhpcy5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmdHlwZW9mIHU9PSJzdHJpbmciJiYodT11LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKSksdT09PW51bGwmJih1PSIiKSxCLnNlYXJjaCh1LHRoaXMucy52YWx1ZSx0aGlzKX19LGgucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obyl7bz09PXZvaWQgMCYmKG89ITEpO3ZhciBmLEM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF07aWYodGhpcy5zLnR5cGUhPT1udWxsJiZ0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIifHxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl7dmFyIEI9W3RoaXMucy52YWx1ZVtmXS50b1N0cmluZygpXTtpZihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIiJiYoQj10aGlzLnMudmFsdWVbZl0uc3BsaXQoQy5vTGFuZ3VhZ2Uuc0RlY2ltYWwpKSxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpZm9yKHZhciB1PTA7dTxCLmxlbmd0aDt1KyspQlt1XT1CW3VdLnJlcGxhY2UoQy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcywiLCIpO3RoaXMucy52YWx1ZVtmXT1CLmpvaW4oIi4iKX1lbHNlIGlmKHRoaXMucy50eXBlIT09bnVsbCYmbyl7aWYodGhpcy5zLnR5cGUuaW5jbHVkZXMoImRhdGUiKXx8dGhpcy5zLnR5cGUuaW5jbHVkZXMoInRpbWUiKSlmb3IoZj0wO2Y8dGhpcy5zLnZhbHVlLmxlbmd0aDtmKyspdGhpcy5zLnZhbHVlW2ZdLm1hdGNoKC9eXGR7NH0tKFswXVxkfDFbMC0yXSktKFswLTJdXGR8M1swMV0pJC9nKT09PW51bGwmJih0aGlzLnMudmFsdWVbZl09IiIpO2Vsc2UgaWYodGhpcy5zLnR5cGUuaW5jbHVkZXMoIm1vbWVudCIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl0aGlzLnMudmFsdWVbZl0mJnRoaXMucy52YWx1ZVtmXS5sZW5ndGg+MCYmcigpKHRoaXMucy52YWx1ZVtmXSx0aGlzLnMuZGF0ZUZvcm1hdCwhMCkuaXNWYWxpZCgpJiYodGhpcy5zLnZhbHVlW2ZdPXIoKSh0aGlzLnMudmFsdWVbZl0sdGhpcy5zLmRhdGVGb3JtYXQpLmZvcm1hdCgiWVlZWS1NTS1ERCBISDptbTpzcyIpKTtlbHNlIGlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl0aGlzLnMudmFsdWVbZl0mJnRoaXMucy52YWx1ZVtmXS5sZW5ndGg+MCYmbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQodGhpcy5zLnZhbHVlW2ZdLHRoaXMucy5kYXRlRm9ybWF0KS5pbnZhbGlkPT09bnVsbCYmKHRoaXMucy52YWx1ZVtmXT1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdCh0aGlzLnMudmFsdWVbZl0sdGhpcy5zLmRhdGVGb3JtYXQpLnRvRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIikpfWlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0iKSYmdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKGY9MDtmPHRoaXMucy52YWx1ZS5sZW5ndGg7ZisrKXRoaXMucy52YWx1ZVtmXT10aGlzLnMudmFsdWVbZl0ucmVwbGFjZSgvW14wLTkuXC1dL2csIiIpO3JldHVybntjb25kaXRpb246dGhpcy5zLmNvbmRpdGlvbixkYXRhOnRoaXMucy5kYXRhLG9yaWdEYXRhOnRoaXMucy5vcmlnRGF0YSx0eXBlOnRoaXMucy50eXBlLHZhbHVlOnRoaXMucy52YWx1ZS5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHohPW51bGw/ei50b1N0cmluZygpOnp9KX19LGgucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxoLnByb3RvdHlwZS5wYXJzZU51bWJlcj1mdW5jdGlvbihvKXt2YXIgZj10aGlzLnMuZHQuaTE4bigiZGVjaW1hbCIpO3JldHVybiBmJiZmIT09Ii4iJiYobz1vLnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoZiwiLiIpKSwrby5yZXBsYWNlKC8oPyFeLSlbXjAtOS5dL2csIiIpfSxoLnByb3RvdHlwZS5wb3B1bGF0ZT1mdW5jdGlvbigpe3RoaXMuX3BvcHVsYXRlRGF0YSgpLHRoaXMucy5kYXRhSWR4IT09LTEmJih0aGlzLl9wb3B1bGF0ZUNvbmRpdGlvbigpLHRoaXMucy5jb25kaXRpb24hPT12b2lkIDAmJnRoaXMuX3BvcHVsYXRlVmFsdWUoKSl9LGgucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obyl7dmFyIGY9ITEsQyxCO2lmKHRoaXMuX3BvcHVsYXRlRGF0YSgpLG8uZGF0YSE9PXZvaWQgMCl7dmFyIHU9dGhpcy5jbGFzc2VzLml0YWxpYyx6PXRoaXMuZG9tLmRhdGE7dGhpcy5kb20uZGF0YS5jaGlsZHJlbigib3B0aW9uIikuZWFjaChmdW5jdGlvbigpeyFmJiYodCh0aGlzKS50ZXh0KCk9PT1vLmRhdGF8fG8ub3JpZ0RhdGEmJnQodGhpcykucHJvcCgib3JpZ0RhdGEiKT09PW8ub3JpZ0RhdGEpPyh0KHRoaXMpLnByb3AoInNlbGVjdGVkIiwhMCksei5yZW1vdmVDbGFzcyh1KSxmPSEwLEM9cGFyc2VJbnQodCh0aGlzKS52YWwoKSwxMCkpOnQodGhpcykucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX0pfWlmKGYpe3RoaXMucy5kYXRhPW8uZGF0YSx0aGlzLnMub3JpZ0RhdGE9by5vcmlnRGF0YSx0aGlzLnMuZGF0YUlkeD1DLHRoaXMuYy5vcnRob2dvbmFsPXRoaXMuX2dldE9wdGlvbnMoKS5vcnRob2dvbmFsLHRoaXMuZG9tLmRhdGFUaXRsZS5yZW1vdmUoKSx0aGlzLl9wb3B1bGF0ZUNvbmRpdGlvbigpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZSgpO3ZhciBxPXZvaWQgMCxldD10aGlzLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbiIpO2ZvcihCPTA7QjxldC5sZW5ndGg7QisrKXt2YXIgTz10KGV0W0JdKTtvLmNvbmRpdGlvbiE9PXZvaWQgMCYmTy52YWwoKT09PW8uY29uZGl0aW9uJiZ0eXBlb2Ygby5jb25kaXRpb249PSJzdHJpbmciPyhPLnByb3AoInNlbGVjdGVkIiwhMCkscT1PLnZhbCgpKTpPLnJlbW92ZVByb3AoInNlbGVjdGVkIil9aWYodGhpcy5zLmNvbmRpdGlvbj1xLHRoaXMucy5jb25kaXRpb24hPT12b2lkIDApe2Zvcih0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZSgpLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxCPTA7QjxldC5sZW5ndGg7QisrKXt2YXIgWj10KGV0W0JdKTtaLnZhbCgpIT09dGhpcy5zLmNvbmRpdGlvbiYmWi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfXRoaXMuX3BvcHVsYXRlVmFsdWUobyl9ZWxzZSB0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcmVwZW5kVG8odGhpcy5kb20uY29uZGl0aW9uKS5wcm9wKCJzZWxlY3RlZCIsITApfX0saC5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5kYXRhLnVuYmluZCgiY2hhbmdlIikub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe28uZG9tLmRhdGFUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgZj1vLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24uIitvLmNsYXNzZXMub3B0aW9uKSxDPTA7QzxmLmxlbmd0aDtDKyspe3ZhciBCPXQoZltDXSk7Qi52YWwoKT09PW8uZG9tLmRhdGEudmFsKCk/KG8uZG9tLmRhdGEucmVtb3ZlQ2xhc3Moby5jbGFzc2VzLml0YWxpYyksQi5wcm9wKCJzZWxlY3RlZCIsITApLG8ucy5kYXRhSWR4PStCLnZhbCgpLG8ucy5kYXRhPUIudGV4dCgpLG8ucy5vcmlnRGF0YT1CLnByb3AoIm9yaWdEYXRhIiksby5jLm9ydGhvZ29uYWw9by5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsby5fY2xlYXJDb25kaXRpb24oKSxvLl9jbGVhclZhbHVlKCksby5fcG9wdWxhdGVDb25kaXRpb24oKSxvLnMuZmlsbGVkJiYoby5zLmZpbGxlZD0hMSxvLmRvU2VhcmNoKCksby5zZXRMaXN0ZW5lcnMoKSksby5zLmR0LnN0YXRlLnNhdmUoKSk6Qi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pLHRoaXMuZG9tLmNvbmRpdGlvbi51bmJpbmQoImNoYW5nZSIpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXtvLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgZj1vLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbi4iK28uY2xhc3Nlcy5vcHRpb24pLEM9MDtDPGYubGVuZ3RoO0MrKyl7dmFyIEI9dChmW0NdKTtpZihCLnZhbCgpPT09by5kb20uY29uZGl0aW9uLnZhbCgpKXtvLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3Moby5jbGFzc2VzLml0YWxpYyksQi5wcm9wKCJzZWxlY3RlZCIsITApO2Zvcih2YXIgdT1CLnZhbCgpLHo9MCxxPU9iamVjdC5rZXlzKG8ucy5jb25kaXRpb25zKTt6PHEubGVuZ3RoO3orKyl7dmFyIGV0PXFbel07aWYoZXQ9PT11KXtvLnMuY29uZGl0aW9uPXU7YnJlYWt9fW8uX2NsZWFyVmFsdWUoKSxvLl9wb3B1bGF0ZVZhbHVlKCk7Zm9yKHZhciBPPTAsWj1vLmRvbS52YWx1ZTtPPFoubGVuZ3RoO08rKyl7dmFyIGc9WltPXTtvLnMuZmlsbGVkJiZnIT09dm9pZCAwJiZvLmRvbS5pbnB1dENvbnQuaGFzKGdbMF0pLmxlbmd0aCE9PTAmJihvLnMuZmlsbGVkPSExLG8uZG9TZWFyY2goKSxvLnNldExpc3RlbmVycygpKX0oby5kb20udmFsdWUubGVuZ3RoPT09MHx8by5kb20udmFsdWUubGVuZ3RoPT09MSYmby5kb20udmFsdWVbMF09PT12b2lkIDApJiZvLmRvU2VhcmNoKCl9ZWxzZSBCLnJlbW92ZVByb3AoInNlbGVjdGVkIil9fSl9LGgucHJvdG90eXBlLnNldHVwQnV0dG9ucz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbm5lcldpZHRoPjU1MCl7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy52ZXJ0aWNhbCksdGhpcy5kb20uYnV0dG9ucy5jc3MoImxlZnQiLG51bGwpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJ0b3AiLG51bGwpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZlcnRpY2FsKSx0aGlzLmRvbS5idXR0b25zLmNzcygibGVmdCIsdGhpcy5kb20uZGF0YS5pbm5lcldpZHRoKCkpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJ0b3AiLHRoaXMuZG9tLmRhdGEucG9zaXRpb24oKS50b3ApfSxoLnByb3RvdHlwZS5fYnVpbGRDcml0ZXJpYT1mdW5jdGlvbigpe3RoaXMuZG9tLmRhdGEuYXBwZW5kKHRoaXMuZG9tLmRhdGFUaXRsZSksdGhpcy5kb20uY29uZGl0aW9uLmFwcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5kYXRhKS5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uKSx0aGlzLmRvbS5pbnB1dENvbnQuZW1wdHkoKTtmb3IodmFyIG89MCxmPXRoaXMuZG9tLnZhbHVlO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO0MuYXBwZW5kKHRoaXMuZG9tLnZhbHVlVGl0bGUpLHRoaXMuZG9tLmlucHV0Q29udC5hcHBlbmQoQyl9dGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20uZGVsZXRlKS5hcHBlbmQodGhpcy5kb20ucmlnaHQpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uaW5wdXRDb250KS5hcHBlbmQodGhpcy5kb20uYnV0dG9ucyksdGhpcy5zZXRMaXN0ZW5lcnMoKX0saC5wcm90b3R5cGUuX2NsZWFyQ29uZGl0aW9uPWZ1bmN0aW9uKCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSx0aGlzLmRvbS5jb25kaXRpb24ucHJlcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSkucHJvcCgic2VsZWN0ZWRJbmRleCIsMCksdGhpcy5zLmNvbmRpdGlvbnM9e30sdGhpcy5zLmNvbmRpdGlvbj12b2lkIDB9LGgucHJvdG90eXBlLl9jbGVhclZhbHVlPWZ1bmN0aW9uKCl7dmFyIG87aWYodGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCl7aWYodGhpcy5kb20udmFsdWUubGVuZ3RoPjAmJnRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwKWZvcih2YXIgZj0wLEM9dGhpcy5kb20udmFsdWU7ZjxDLmxlbmd0aDtmKyspbz1DW2ZdLG8hPT12b2lkIDAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvLnJlbW92ZSgpfSw1MCk7aWYodGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxoLnVwZGF0ZUxpc3RlbmVyKSksdGhpcy5kb20udmFsdWUubGVuZ3RoPjAmJnRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwKXt0aGlzLmRvbS5pbnB1dENvbnQuZW1wdHkoKS5hcHBlbmQodGhpcy5kb20udmFsdWVbMF0pLmluc2VydEFmdGVyKHRoaXMuZG9tLmNvbmRpdGlvbiksdCh0aGlzLmRvbS52YWx1ZVswXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpO2Zvcih2YXIgQj0xO0I8dGhpcy5kb20udmFsdWUubGVuZ3RoO0IrKyl0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKHRoaXMuZG9tLnZhbHVlW0JdKSx0KHRoaXMuZG9tLnZhbHVlW0JdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIil9fWVsc2V7Zm9yKHZhciB1PTAsej10aGlzLmRvbS52YWx1ZTt1PHoubGVuZ3RoO3UrKylvPXpbdV0sbyE9PXZvaWQgMCYmc2V0VGltZW91dChmdW5jdGlvbigpe28ucmVtb3ZlKCl9LDUwKTt0aGlzLmRvbS52YWx1ZVRpdGxlLnByb3AoInNlbGVjdGVkIiwhMCksdGhpcy5kb20uZGVmYXVsdFZhbHVlLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlKS5pbnNlcnRBZnRlcih0aGlzLmRvbS5jb25kaXRpb24pfXRoaXMucy52YWx1ZT1bXSx0aGlzLmRvbS52YWx1ZT1bdCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlLmNsb25lKCkpXX0saC5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgbz10aGlzLnMuZHQ7cmV0dXJuIHQuZXh0ZW5kKCEwLHt9LGguZGVmYXVsdHMsby5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuZGF0YUlkeF0uc2VhcmNoQnVpbGRlcil9LGgucHJvdG90eXBlLl9wb3B1bGF0ZUNvbmRpdGlvbj1mdW5jdGlvbigpe3ZhciBvPVtdLGY9T2JqZWN0LmtleXModGhpcy5zLmNvbmRpdGlvbnMpLmxlbmd0aCxDPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucyxCPSt0aGlzLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb246c2VsZWN0ZWQiKS52YWwoKSx1LHo7aWYoZj09PTApe2lmKHRoaXMucy50eXBlPXRoaXMucy5kdC5jb2x1bW4oQikudHlwZSgpLEMhPT12b2lkIDApe3ZhciBxPUNbQl07cS5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMCYmcS5zZWFyY2hCdWlsZGVyVHlwZSE9PW51bGw/dGhpcy5zLnR5cGU9cS5zZWFyY2hCdWlsZGVyVHlwZToodGhpcy5zLnR5cGU9PT12b2lkIDB8fHRoaXMucy50eXBlPT09bnVsbCkmJih0aGlzLnMudHlwZT1xLnNUeXBlKX0odGhpcy5zLnR5cGU9PT1udWxsfHx0aGlzLnMudHlwZT09PXZvaWQgMCkmJih0LmZuLmRhdGFUYWJsZS5leHQub0FwaSYmdC5mbi5kYXRhVGFibGUuZXh0Lm9BcGkuX2ZuQ29sdW1uVHlwZXModGhpcy5zLmR0LnNldHRpbmdzKClbMF0pLHRoaXMucy50eXBlPXRoaXMucy5kdC5jb2x1bW4oQikudHlwZSgpKSx0aGlzLmRvbS5jb25kaXRpb24ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5lbXB0eSgpLmFwcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYyksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKTt2YXIgZXQ9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0xhbmd1YWdlLnNEZWNpbWFsO2V0IT09IiImJnRoaXMucy50eXBlLmluZGV4T2YoZXQpPT09dGhpcy5zLnR5cGUubGVuZ3RoLWV0Lmxlbmd0aCYmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0tZm10Iik/dGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShldCwiIik6dGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiYodGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShldCwiIikpKTt2YXIgTz10aGlzLmMuY29uZGl0aW9uc1t0aGlzLnMudHlwZV0hPT12b2lkIDA/dGhpcy5jLmNvbmRpdGlvbnNbdGhpcy5zLnR5cGVdOnRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT90aGlzLmMuY29uZGl0aW9ucy5tb21lbnQ6dGhpcy5zLnR5cGUuaW5jbHVkZXMoImx1eG9uIik/dGhpcy5jLmNvbmRpdGlvbnMubHV4b246dGhpcy5jLmNvbmRpdGlvbnMuc3RyaW5nO3RoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT90aGlzLnMuZGF0ZUZvcm1hdD10aGlzLnMudHlwZS5yZXBsYWNlKC9tb21lbnQtL2csIiIpOnRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpJiYodGhpcy5zLmRhdGVGb3JtYXQ9dGhpcy5zLnR5cGUucmVwbGFjZSgvbHV4b24tL2csIiIpKTtmb3IodmFyIFo9MCxnPU9iamVjdC5rZXlzKE8pO1o8Zy5sZW5ndGg7WisrKWlmKHU9Z1taXSxPW3VdIT09bnVsbCl7aWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJk9bdV0uaW5pdD09PWguaW5pdFNlbGVjdCl7dmFyIF89Q1tCXTt0aGlzLnMuc2VydmVyRGF0YSYmdGhpcy5zLnNlcnZlckRhdGFbXy5kYXRhXT8oT1t1XS5pbml0PWguaW5pdFNlbGVjdFNTUCxPW3VdLmlucHV0VmFsdWU9aC5pbnB1dFZhbHVlU2VsZWN0LE9bdV0uaXNJbnB1dFZhbGlkPWguaXNJbnB1dFZhbGlkU2VsZWN0KTooT1t1XS5pbml0PWguaW5pdElucHV0LE9bdV0uaW5wdXRWYWx1ZT1oLmlucHV0VmFsdWVJbnB1dCxPW3VdLmlzSW5wdXRWYWxpZD1oLmlzSW5wdXRWYWxpZElucHV0KX10aGlzLnMuY29uZGl0aW9uc1t1XT1PW3VdLHo9T1t1XS5jb25kaXRpb25OYW1lLHR5cGVvZiB6PT0iZnVuY3Rpb24iJiYoej16KHRoaXMucy5kdCx0aGlzLmMuaTE4bikpLG8ucHVzaCh0KCI8b3B0aW9uPiIse3RleHQ6eix2YWx1ZTp1fSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykpfX1lbHNlIGlmKGY+MCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCkucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtmb3IodmFyIFM9MCxOPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKTtTPE4ubGVuZ3RoO1MrKyl7dT1OW1NdO3ZhciBSPXRoaXMucy5jb25kaXRpb25zW3VdLmNvbmRpdGlvbk5hbWU7dHlwZW9mIFI9PSJmdW5jdGlvbiImJihSPVIodGhpcy5zLmR0LHRoaXMuYy5pMThuKSk7dmFyIEw9dCgiPG9wdGlvbj4iLHt0ZXh0OlIsdmFsdWU6dX0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5vcHRpb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ub3RJdGFsaWMpO3RoaXMucy5jb25kaXRpb24hPT12b2lkIDAmJnRoaXMucy5jb25kaXRpb249PT1SJiYoTC5wcm9wKCJzZWxlY3RlZCIsITApLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSksby5wdXNoKEwpfX1lbHNle3RoaXMuZG9tLmNvbmRpdGlvbi5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtyZXR1cm59Zm9yKHZhciBYPTAsaj1vO1g8ai5sZW5ndGg7WCsrKXt2YXIgRz1qW1hdO3RoaXMuZG9tLmNvbmRpdGlvbi5hcHBlbmQoRyl9aWYoQ1tCXS5zZWFyY2hCdWlsZGVyJiZDW0JdLnNlYXJjaEJ1aWxkZXIuZGVmYXVsdENvbmRpdGlvbil7dmFyIGF0PUNbQl0uc2VhcmNoQnVpbGRlci5kZWZhdWx0Q29uZGl0aW9uO2lmKHR5cGVvZiBhdD09Im51bWJlciIpdGhpcy5kb20uY29uZGl0aW9uLnByb3AoInNlbGVjdGVkSW5kZXgiLGF0KSx0aGlzLmRvbS5jb25kaXRpb24udHJpZ2dlcigiY2hhbmdlIik7ZWxzZSBpZih0eXBlb2YgYXQ9PSJzdHJpbmciKWZvcih2YXIgSj0wO0o8by5sZW5ndGg7SisrKWZvcih2YXIgdHQ9MCx5dD1PYmplY3Qua2V5cyh0aGlzLnMuY29uZGl0aW9ucyk7dHQ8eXQubGVuZ3RoO3R0Kyspe3ZhciBUdD15dFt0dF07aWYoej10aGlzLnMuY29uZGl0aW9uc1tUdF0uY29uZGl0aW9uTmFtZSwodHlwZW9mIHo9PSJzdHJpbmciP3o6eih0aGlzLnMuZHQsdGhpcy5jLmkxOG4pKT09PW9bSl0udGV4dCgpJiZUdD09PWF0KXt0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsdGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCkudG9BcnJheSgpLmluZGV4T2Yob1tKXVswXSkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLHRoaXMuZG9tLmNvbmRpdGlvbi50cmlnZ2VyKCJjaGFuZ2UiKSxKPW8ubGVuZ3RoO2JyZWFrfX19ZWxzZSB0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsMCl9LGgucHJvdG90eXBlLl9wb3B1bGF0ZURhdGE9ZnVuY3Rpb24oKXt2YXIgbz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnMsZj10aGlzLnMuZHQuY29sdW1ucyh0aGlzLmMuY29sdW1ucykuaW5kZXhlcygpLnRvQXJyYXkoKTt0aGlzLmRvbS5kYXRhLmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLmRhdGFUaXRsZSk7Zm9yKHZhciBDPTA7QzxvLmxlbmd0aDtDKyspaWYodGhpcy5jLmNvbHVtbnM9PT0hMHx8Zi5pbmNsdWRlcyhDKSl7dmFyIEI9b1tDXSx1PXtpbmRleDpDLG9yaWdEYXRhOkIuZGF0YSx0ZXh0OihCLnNlYXJjaEJ1aWxkZXJUaXRsZXx8Qi5zVGl0bGUpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKX07dGhpcy5kb20uZGF0YS5hcHBlbmQodCgiPG9wdGlvbj4iLHt0ZXh0OnUudGV4dCx2YWx1ZTp1LmluZGV4fSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykucHJvcCgib3JpZ0RhdGEiLEIuZGF0YSkucHJvcCgic2VsZWN0ZWQiLHRoaXMucy5kYXRhSWR4PT09dS5pbmRleCkpLHRoaXMucy5kYXRhSWR4PT09dS5pbmRleCYmdGhpcy5kb20uZGF0YVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIil9fSxoLnByb3RvdHlwZS5fcG9wdWxhdGVWYWx1ZT1mdW5jdGlvbihvKXt2YXIgZj10aGlzLEM9dGhpcy5zLmZpbGxlZCxCO3RoaXMucy5maWxsZWQ9ITEsc2V0VGltZW91dChmdW5jdGlvbigpe2YuZG9tLmRlZmF1bHRWYWx1ZS5yZW1vdmUoKX0sNTApO2Zvcih2YXIgdT1mdW5jdGlvbihaKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WiE9PXZvaWQgMCYmWi5yZW1vdmUoKX0sNTApfSx6PTAscT10aGlzLmRvbS52YWx1ZTt6PHEubGVuZ3RoO3orKyl7dmFyIGV0PXFbel07dShldCl9dmFyIE89dGhpcy5kb20uaW5wdXRDb250LmNoaWxkcmVuKCk7aWYoTy5sZW5ndGg+MSlmb3IoQj0wO0I8Ty5sZW5ndGg7QisrKXQoT1tCXSkucmVtb3ZlKCk7Zm9yKG8hPT12b2lkIDAmJnRoaXMucy5kdC5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oWil7Zi5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW1pdLnNUaXRsZT09PW8uZGF0YSYmKGYucy5kYXRhSWR4PVopfSksdGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxoLnVwZGF0ZUxpc3RlbmVyLG8hPT12b2lkIDA/by52YWx1ZTp2b2lkIDApKSxvIT09dm9pZCAwJiZvLnZhbHVlIT09dm9pZCAwJiYodGhpcy5zLnZhbHVlPW8udmFsdWUpLHRoaXMuZG9tLmlucHV0Q29udC5lbXB0eSgpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS5hcHBlbmRUbyh0aGlzLmRvbS5pbnB1dENvbnQpLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKSxCPTE7Qjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7QisrKXQodGhpcy5kb20udmFsdWVbQl0pLmluc2VydEFmdGVyKHRoaXMuZG9tLnZhbHVlW0ItMV0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZmlsbGVkPXRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmlzSW5wdXRWYWxpZCh0aGlzLmRvbS52YWx1ZSx0aGlzKSx0aGlzLnNldExpc3RlbmVycygpLCF0aGlzLnMucHJldmVudFJlZHJhdyYmQyE9PXRoaXMucy5maWxsZWQmJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8dGhpcy5kb1NlYXJjaCgpLHRoaXMuc2V0TGlzdGVuZXJzKCkpfSxoLnByb3RvdHlwZS5fdGhyb3R0bGU9ZnVuY3Rpb24obyxmKXtmPT09dm9pZCAwJiYoZj0yMDApO3ZhciBDPW51bGwsQj1udWxsLHU9dGhpcztyZXR1cm4gZj09PW51bGwmJihmPTIwMCksZnVuY3Rpb24oKXtmb3IodmFyIHo9W10scT0wO3E8YXJndW1lbnRzLmxlbmd0aDtxKyspeltxXT1hcmd1bWVudHNbcV07dmFyIGV0PStuZXcgRGF0ZTtDIT09bnVsbCYmZXQ8QytmP2NsZWFyVGltZW91dChCKTpDPWV0LEI9c2V0VGltZW91dChmdW5jdGlvbigpe0M9bnVsbCxvLmFwcGx5KHUseil9LGYpfX0saC52ZXJzaW9uPSIxLjEuMCIsaC5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixidXR0b25Db250YWluZXI6ImR0c2ItYnV0dG9uQ29udGFpbmVyIixjb25kaXRpb246ImR0c2ItY29uZGl0aW9uIixjb250YWluZXI6ImR0c2ItY3JpdGVyaWEiLGRhdGE6ImR0c2ItZGF0YSIsZGVsZXRlOiJkdHNiLWRlbGV0ZSIsZHJvcERvd246ImR0c2ItZHJvcERvd24iLGdyZXlzY2FsZToiZHRzYi1ncmV5c2NhbGUiLGlucHV0OiJkdHNiLWlucHV0IixpbnB1dENvbnQ6ImR0c2ItaW5wdXRDb250IixpdGFsaWM6ImR0c2ItaXRhbGljIixqb2luZXI6ImR0c2Itam9pbmVyIixsZWZ0OiJkdHNiLWxlZnQiLG5vdEl0YWxpYzoiZHRzYi1ub3RJdGFsaWMiLG9wdGlvbjoiZHRzYi1vcHRpb24iLHJpZ2h0OiJkdHNiLXJpZ2h0IixzZWxlY3Q6ImR0c2Itc2VsZWN0Iix2YWx1ZToiZHRzYi12YWx1ZSIsdmVydGljYWw6ImR0c2ItdmVydGljYWwifSxoLmluaXRTZWxlY3Q9ZnVuY3Rpb24obyxmLEMsQil7Qz09PXZvaWQgMCYmKEM9bnVsbCksQj09PXZvaWQgMCYmKEI9ITEpO3ZhciB1PW8uZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLHo9by5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLHE9by5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGE7by5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBldD10KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3MoaC5jbGFzc2VzLml0YWxpYykuYWRkQ2xhc3MoaC5jbGFzc2VzLnNlbGVjdCkuYXBwZW5kKG8uZG9tLnZhbHVlVGl0bGUpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZUNsYXNzKGguY2xhc3Nlcy5pdGFsaWMpLGYobyx0aGlzKX0pO28uYy5ncmV5c2NhbGUmJmV0LmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpO2Zvcih2YXIgTz1bXSxaPVtdLGc9MCxfPXo7ZzxfLmxlbmd0aDtnKyspe3ZhciBTPV9bZ10sTj1xKFMsdSx0eXBlb2Ygby5jLm9ydGhvZ29uYWw9PSJzdHJpbmciP28uYy5vcnRob2dvbmFsOm8uYy5vcnRob2dvbmFsLnNlYXJjaCksUj17ZmlsdGVyOnR5cGVvZiBOPT0ic3RyaW5nIj9OLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIgIik6TixpbmRleDpTLHRleHQ6cShTLHUsdHlwZW9mIG8uYy5vcnRob2dvbmFsPT0ic3RyaW5nIj9vLmMub3J0aG9nb25hbDpvLmMub3J0aG9nb25hbC5kaXNwbGF5KX07by5zLnR5cGU9PT0iYXJyYXkiJiYoUi5maWx0ZXI9QXJyYXkuaXNBcnJheShSLmZpbHRlcik/Ui5maWx0ZXI6W1IuZmlsdGVyXSxSLnRleHQ9QXJyYXkuaXNBcnJheShSLnRleHQpP1IudGV4dDpbUi50ZXh0XSk7dmFyIEw9ZnVuY3Rpb24oSix0dCl7by5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmSiE9PW51bGwmJnR5cGVvZiBKPT0ic3RyaW5nIiYmSi5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik7dmFyIHl0PXQoIjxvcHRpb24+Iix7dHlwZTpBcnJheS5pc0FycmF5KEopPyJBcnJheSI6IlN0cmluZyIsdmFsdWU6Sn0pLmRhdGEoInNidiIsSikuYWRkQ2xhc3Moby5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3Moby5jbGFzc2VzLm5vdEl0YWxpYykuaHRtbCh0eXBlb2YgdHQ9PSJzdHJpbmciP3R0LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTp0dCksVHQ9eXQudmFsKCk7Ty5pbmRleE9mKFR0KT09PS0xJiYoTy5wdXNoKFR0KSxaLnB1c2goeXQpLEMhPT1udWxsJiZBcnJheS5pc0FycmF5KENbMF0pJiYoQ1swXT1DWzBdLnNvcnQoKS5qb2luKCIsIikpLEMhPT1udWxsJiZ5dC52YWwoKT09PUNbMF0mJih5dC5wcm9wKCJzZWxlY3RlZCIsITApLGV0LnJlbW92ZUNsYXNzKGguY2xhc3Nlcy5pdGFsaWMpLG8uZG9tLnZhbHVlVGl0bGUucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKSkpfTtpZihCKWZvcih2YXIgWD0wO1g8Ui5maWx0ZXIubGVuZ3RoO1grKylMKFIuZmlsdGVyW1hdLFIudGV4dFtYXSk7ZWxzZSBMKFIuZmlsdGVyLEFycmF5LmlzQXJyYXkoUi50ZXh0KT9SLnRleHQuam9pbigiLCAiKTpSLnRleHQpfVouc29ydChmdW5jdGlvbihKLHR0KXtpZihvLnMudHlwZT09PSJhcnJheSJ8fG8ucy50eXBlPT09InN0cmluZyJ8fG8ucy50eXBlPT09Imh0bWwiKXJldHVybiBKLnZhbCgpPHR0LnZhbCgpPy0xOkoudmFsKCk+dHQudmFsKCk/MTowO2lmKG8ucy50eXBlPT09Im51bSJ8fG8ucy50eXBlPT09Imh0bWwtbnVtIilyZXR1cm4rSi52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik8K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8tMTorSi52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8xOjA7aWYoby5zLnR5cGU9PT0ibnVtLWZtdCJ8fG8ucy50eXBlPT09Imh0bWwtbnVtLWZtdCIpcmV0dXJuK0oudmFsKCkucmVwbGFjZSgvW14wLTkuXS9nLCIiKTwrdHQudmFsKCkucmVwbGFjZSgvW14wLTkuXS9nLCIiKT8tMTorSi52YWwoKS5yZXBsYWNlKC9bXjAtOS5dL2csIiIpPit0dC52YWwoKS5yZXBsYWNlKC9bXjAtOS5dL2csIiIpPzE6MH0pO2Zvcih2YXIgaj0wLEc9WjtqPEcubGVuZ3RoO2orKyl7dmFyIGF0PUdbal07ZXQuYXBwZW5kKGF0KX1yZXR1cm4gZXR9LGguaW5pdFNlbGVjdFNTUD1mdW5jdGlvbihvLGYsQyl7Qz09PXZvaWQgMCYmKEM9bnVsbCksby5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBCPXQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyhoLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyhoLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQoby5kb20udmFsdWVUaXRsZSkub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoaC5jbGFzc2VzLml0YWxpYyksZihvLHRoaXMpfSk7by5jLmdyZXlzY2FsZSYmQi5hZGRDbGFzcyhoLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIHU9W10sej0wLHE9by5zLnNlcnZlckRhdGFbby5zLm9yaWdEYXRhXTt6PHEubGVuZ3RoO3orKyl7dmFyIGV0PXFbel0sTz1ldC52YWx1ZSxaPWV0LmxhYmVsLGc9ZnVuY3Rpb24oUixMKXtvLnMudHlwZS5pbmNsdWRlcygiaHRtbCIpJiZSIT09bnVsbCYmdHlwZW9mIFI9PSJzdHJpbmciJiZSLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTt2YXIgWD10KCI8b3B0aW9uPiIse3R5cGU6QXJyYXkuaXNBcnJheShSKT8iQXJyYXkiOiJTdHJpbmciLHZhbHVlOlJ9KS5kYXRhKCJzYnYiLFIpLmFkZENsYXNzKG8uY2xhc3Nlcy5vcHRpb24pLmFkZENsYXNzKG8uY2xhc3Nlcy5ub3RJdGFsaWMpLmh0bWwodHlwZW9mIEw9PSJzdHJpbmciP0wucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpOkwpO3UucHVzaChYKSxDIT09bnVsbCYmWC52YWwoKT09PUNbMF0mJihYLnByb3AoInNlbGVjdGVkIiwhMCksQi5yZW1vdmVDbGFzcyhoLmNsYXNzZXMuaXRhbGljKSxvLmRvbS52YWx1ZVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIikpfTtnKE8sWil9Zm9yKHZhciBfPTAsUz11O188Uy5sZW5ndGg7XysrKXt2YXIgTj1TW19dO0IuYXBwZW5kKE4pfXJldHVybiBCfSxoLmluaXRTZWxlY3RBcnJheT1mdW5jdGlvbihvLGYsQyl7cmV0dXJuIEM9PT12b2lkIDAmJihDPW51bGwpLGguaW5pdFNlbGVjdChvLGYsQywhMCl9LGguaW5pdElucHV0PWZ1bmN0aW9uKG8sZixDKXtDPT09dm9pZCAwJiYoQz1udWxsKTt2YXIgQj1vLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSx1PXQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoaC5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhoLmNsYXNzZXMuaW5wdXQpLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLG8uX3Rocm90dGxlKGZ1bmN0aW9uKHope3ZhciBxPXoua2V5Q29kZXx8ei53aGljaDtyZXR1cm4gZihvLHRoaXMscSl9LEI9PT1udWxsPzEwMDpCKSk7cmV0dXJuIG8uYy5ncmV5c2NhbGUmJnUuYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSksQyE9PW51bGwmJnUudmFsKENbMF0pLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksdX0saC5pbml0MklucHV0PWZ1bmN0aW9uKG8sZixDKXtDPT09dm9pZCAwJiYoQz1udWxsKTt2YXIgQj1vLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSx1PVt0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmlucHV0KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixvLl90aHJvdHRsZShmdW5jdGlvbih6KXt2YXIgcT16LmtleUNvZGV8fHoud2hpY2g7cmV0dXJuIGYobyx0aGlzLHEpfSxCPT09bnVsbD8xMDA6QikpLHQoIjxzcGFuPiIpLmFkZENsYXNzKG8uY2xhc3Nlcy5qb2luZXIpLmh0bWwoby5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWVKb2luZXIiLG8uYy5pMThuLnZhbHVlSm9pbmVyKSksdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5pbnB1dCkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsby5fdGhyb3R0bGUoZnVuY3Rpb24oeil7dmFyIHE9ei5rZXlDb2RlfHx6LndoaWNoO3JldHVybiBmKG8sdGhpcyxxKX0sQj09PW51bGw/MTAwOkIpKV07cmV0dXJuIG8uYy5ncmV5c2NhbGUmJih1WzBdLmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpLHVbMl0uYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSkpLEMhPT1udWxsJiYodVswXS52YWwoQ1swXSksdVsyXS52YWwoQ1sxXSkpLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksdX0saC5pbml0RGF0ZT1mdW5jdGlvbihvLGYsQyl7Qz09PXZvaWQgMCYmKEM9bnVsbCk7dmFyIEI9by5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksdT1vLnMuZHQuaTE4bigiZGF0ZXRpbWUiLHt9KSx6PXQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoaC5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhoLmNsYXNzZXMuaW5wdXQpLmR0RGF0ZVRpbWUoe2F0dGFjaFRvOiJpbnB1dCIsZm9ybWF0Om8ucy5kYXRlRm9ybWF0P28ucy5kYXRlRm9ybWF0OnZvaWQgMCxpMThuOnV9KS5vbigiY2hhbmdlLmR0c2IiLG8uX3Rocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sQj09PW51bGw/MTAwOkIpKS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixmdW5jdGlvbihxKXtvLl90aHJvdHRsZShmdW5jdGlvbigpe3ZhciBldD1xLmtleUNvZGV8fHEud2hpY2g7cmV0dXJuIGYobyx0aGlzLGV0KX0sQj09PW51bGw/MTAwOkIpfSk7cmV0dXJuIG8uYy5ncmV5c2NhbGUmJnouYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSksQyE9PW51bGwmJnoudmFsKENbMF0pLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksen0saC5pbml0Tm9WYWx1ZT1mdW5jdGlvbihvKXtyZXR1cm4gby5zLmR0Lm9uZSgiZHJhdy5kdHNiIixmdW5jdGlvbigpe28ucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSxbXX0saC5pbml0MkRhdGU9ZnVuY3Rpb24obyxmLEMpe3ZhciBCPXRoaXM7Qz09PXZvaWQgMCYmKEM9bnVsbCk7dmFyIHU9by5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksej1vLnMuZHQuaTE4bigiZGF0ZXRpbWUiLHt9KSxxPVt0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpvLnMuZGF0ZUZvcm1hdD9vLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjp6fSkub24oImNoYW5nZS5kdHNiIix1IT09bnVsbD9zdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sdSk6ZnVuY3Rpb24oKXtmKG8sQil9KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixmdW5jdGlvbihldCl7c3QudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3ZhciBPPWV0LmtleUNvZGV8fGV0LndoaWNoO3JldHVybiBmKG8sdGhpcyxPKX0sdT09PW51bGw/MDp1KX0pLHQoIjxzcGFuPiIpLmFkZENsYXNzKG8uY2xhc3Nlcy5qb2luZXIpLmh0bWwoby5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWVKb2luZXIiLG8uYy5pMThuLnZhbHVlSm9pbmVyKSksdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5pbnB1dCkuZHREYXRlVGltZSh7YXR0YWNoVG86ImlucHV0Iixmb3JtYXQ6by5zLmRhdGVGb3JtYXQ/by5zLmRhdGVGb3JtYXQ6dm9pZCAwLGkxOG46en0pLm9uKCJjaGFuZ2UuZHRzYiIsdSE9PW51bGw/c3QudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBmKG8sdGhpcyl9LHUpOmZ1bmN0aW9uKCl7ZihvLEIpfSkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsIW8uYy5lbnRlclNlYXJjaCYmIShvLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2ghPT12b2lkIDAmJm8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaC5yZXR1cm4pJiZ1IT09bnVsbD9zdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sdSk6ZnVuY3Rpb24oZXQpe3ZhciBPPWV0LmtleUNvZGV8fGV0LndoaWNoO2YobyxCLE8pfSldO3JldHVybiBvLmMuZ3JleXNjYWxlJiYocVswXS5hZGRDbGFzcyhoLmNsYXNzZXMuZ3JleXNjYWxlKSxxWzJdLmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpKSxDIT09bnVsbCYmQy5sZW5ndGg+MCYmKHFbMF0udmFsKENbMF0pLHFbMl0udmFsKENbMV0pKSxvLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7by5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLHF9LGguaXNJbnB1dFZhbGlkU2VsZWN0PWZ1bmN0aW9uKG8pe2Zvcih2YXIgZj0hMCxDPTAsQj1vO0M8Qi5sZW5ndGg7QysrKXt2YXIgdT1CW0NdO3UuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmxlbmd0aD09PXUuY2hpbGRyZW4oIm9wdGlvbiIpLmxlbmd0aC11LmNoaWxkcmVuKCJvcHRpb24uIitoLmNsYXNzZXMubm90SXRhbGljKS5sZW5ndGgmJnUuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmxlbmd0aD09PTEmJnUuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpWzBdPT09dS5jaGlsZHJlbigib3B0aW9uIilbMF0mJihmPSExKX1yZXR1cm4gZn0saC5pc0lucHV0VmFsaWRJbnB1dD1mdW5jdGlvbihvKXtmb3IodmFyIGY9ITAsQz0wLEI9bztDPEIubGVuZ3RoO0MrKyl7dmFyIHU9QltDXTt1LmlzKCJpbnB1dCIpJiZ1LnZhbCgpLmxlbmd0aD09PTAmJihmPSExKX1yZXR1cm4gZn0saC5pbnB1dFZhbHVlU2VsZWN0PWZ1bmN0aW9uKG8pe2Zvcih2YXIgZj1bXSxDPTAsQj1vO0M8Qi5sZW5ndGg7QysrKXt2YXIgdT1CW0NdO3UuaXMoInNlbGVjdCIpJiZmLnB1c2goaC5fZXNjYXBlSFRNTCh1LmNoaWxkcmVuKCJvcHRpb246c2VsZWN0ZWQiKS5kYXRhKCJzYnYiKSkpfXJldHVybiBmfSxoLmlucHV0VmFsdWVJbnB1dD1mdW5jdGlvbihvKXtmb3IodmFyIGY9W10sQz0wLEI9bztDPEIubGVuZ3RoO0MrKyl7dmFyIHU9QltDXTt1LmlzKCJpbnB1dCIpJiZmLnB1c2goaC5fZXNjYXBlSFRNTCh1LnZhbCgpKSl9cmV0dXJuIGZ9LGgudXBkYXRlTGlzdGVuZXI9ZnVuY3Rpb24obyxmLEMpe3ZhciBCPW8ucy5jb25kaXRpb25zW28ucy5jb25kaXRpb25dLHU7aWYoby5zLmZpbGxlZD1CLmlzSW5wdXRWYWxpZChvLmRvbS52YWx1ZSxvKSxvLnMudmFsdWU9Qi5pbnB1dFZhbHVlKG8uZG9tLnZhbHVlLG8pLCFvLnMuZmlsbGVkKXsoIW8uYy5lbnRlclNlYXJjaCYmIShvLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2ghPT12b2lkIDAmJm8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaC5yZXR1cm4pfHxDPT09MTMpJiZvLmRvU2VhcmNoKCk7cmV0dXJufWZvcihBcnJheS5pc0FycmF5KG8ucy52YWx1ZSl8fChvLnMudmFsdWU9W28ucy52YWx1ZV0pLHU9MDt1PG8ucy52YWx1ZS5sZW5ndGg7dSsrKUFycmF5LmlzQXJyYXkoby5zLnZhbHVlW3VdKSYmby5zLnZhbHVlW3VdLnNvcnQoKTt2YXIgej1udWxsLHE9bnVsbDtmb3IodT0wO3U8by5kb20udmFsdWUubGVuZ3RoO3UrKylmPT09by5kb20udmFsdWVbdV1bMF0mJih6PXUsZi5zZWxlY3Rpb25TdGFydCE9PXZvaWQgMCYmKHE9Zi5zZWxlY3Rpb25TdGFydCkpOyghby5jLmVudGVyU2VhcmNoJiYhKG8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmby5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybil8fEM9PT0xMykmJm8uZG9TZWFyY2goKSx6IT09bnVsbCYmKG8uZG9tLnZhbHVlW3pdLnJlbW92ZUNsYXNzKG8uY2xhc3Nlcy5pdGFsaWMpLG8uZG9tLnZhbHVlW3pdLmZvY3VzKCkscSE9PW51bGwmJm8uZG9tLnZhbHVlW3pdWzBdLnNldFNlbGVjdGlvblJhbmdlKHEscSkpfSxoLmRhdGVDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMiLGYuY29uZGl0aW9ucy5kYXRlLmVxdWFscyl9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG89PT1mWzBdfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdCIsZi5jb25kaXRpb25zLmRhdGUubm90KX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG89by5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbyE9PWZbMF19fSwiPCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUiLGYuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSl9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG88ZlswXX19LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmFmdGVyIixmLmNvbmRpdGlvbnMuZGF0ZS5hZnRlcil9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG8+ZlswXX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuIixmLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuKX0saW5pdDpoLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLGZbMF08ZlsxXT9mWzBdPD1vJiZvPD1mWzFdOmZbMV08PW8mJm88PWZbMF19fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsZi5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6aC5pbml0MkRhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gbz1vLnJlcGxhY2UoLyhcL3wtfCwpL2csIi0iKSxmWzBdPGZbMV0/IShmWzBdPD1vJiZvPD1mWzFdKTohKGZbMV08PW8mJm88PWZbMF0pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsfHxvLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGYuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIShvPT1udWxsfHxvLmxlbmd0aD09PTApfX19LGgubW9tZW50RGF0ZUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVxdWFscyIsZi5jb25kaXRpb25zLmRhdGUuZXF1YWxzKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKT09PXIoKShmWzBdLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixmLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiByKCkobyxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpIT09cigpKGZbMF0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsZi5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTxyKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYWZ0ZXIiLGYuY29uZGl0aW9ucy5kYXRlLmFmdGVyKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKT5yKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGYuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmguaW5pdDJEYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1yKCkobyxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLHU9cigpKGZbMF0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKSx6PXIoKShmWzFdLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCk7cmV0dXJuIHU8ej91PD1CJiZCPD16Ono8PUImJkI8PXV9fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsZi5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6aC5pbml0MkRhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3ZhciBCPXIoKShvLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksdT1yKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLHo9cigpKGZbMV0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTtyZXR1cm4gdTx6PyEoK3U8PStCJiYrQjw9K3opOiEoK3o8PStCJiYrQjw9K3UpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsfHxvLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGYuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIShvPT1udWxsfHxvLmxlbmd0aD09PTApfX19LGgubHV4b25EYXRlQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZXF1YWxzIixmLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBuKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cz09PW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMF0sQy5zLmRhdGVGb3JtYXQpLnRzfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdCIsZi5jb25kaXRpb25zLmRhdGUubm90KX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHMhPT1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50c319LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsZi5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHM8bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoZlswXSxDLnMuZGF0ZUZvcm1hdCkudHN9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5hZnRlciIsZi5jb25kaXRpb25zLmRhdGUuYWZ0ZXIpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBuKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cz5uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50c319LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuIixmLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuKX0saW5pdDpoLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7dmFyIEI9bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHMsdT1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50cyx6PW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMV0sQy5zLmRhdGVGb3JtYXQpLnRzO3JldHVybiB1PHo/dTw9QiYmQjw9ejp6PD1CJiZCPD11fX0sIiFiZXR3ZWVuIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdEJldHdlZW4iLGYuY29uZGl0aW9ucy5kYXRlLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJEYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cyx1PW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMF0sQy5zLmRhdGVGb3JtYXQpLnRzLHo9bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoZlsxXSxDLnMuZGF0ZUZvcm1hdCkudHM7cmV0dXJuIHU8ej8hKCt1PD0rQiYmK0I8PSt6KTohKCt6PD0rQiYmK0I8PSt1KX19LG51bGw6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSIsZi5jb25kaXRpb25zLmRhdGUuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiEobz09bnVsbHx8by5sZW5ndGg9PT0wKX19fSxoLm51bUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzIixmLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyl9LGluaXQ6aC5pbml0U2VsZWN0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4rbz09K2ZbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3QiLGYuY29uZGl0aW9ucy5udW1iZXIubm90KX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitvIT0rZlswXX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubHQiLGYuY29uZGl0aW9ucy5udW1iZXIubHQpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK288K2ZbMF19fSwiPD0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdGUiLGYuY29uZGl0aW9ucy5udW1iZXIubHRlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitvPD0rZlswXX19LCI+PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSIsZi5jb25kaXRpb25zLm51bWJlci5ndGUpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK28+PStmWzBdfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ndCIsZi5jb25kaXRpb25zLm51bWJlci5ndCl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4rbz4rZlswXX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmJldHdlZW4iLGYuY29uZGl0aW9ucy5udW1iZXIuYmV0d2Vlbil9LGluaXQ6aC5pbml0MklucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK2ZbMF08K2ZbMV0/K2ZbMF08PStvJiYrbzw9K2ZbMV06K2ZbMV08PStvJiYrbzw9K2ZbMF19fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RCZXR3ZWVuIixmLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitmWzBdPCtmWzFdPyEoK2ZbMF08PStvJiYrbzw9K2ZbMV0pOiEoK2ZbMV08PStvJiYrbzw9K2ZbMF0pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5udW1GbXRDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyIsZi5jb25kaXRpb25zLm51bWJlci5lcXVhbHMpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gQy5wYXJzZU51bWJlcihvKT09PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3QiLGYuY29uZGl0aW9ucy5udW1iZXIubm90KX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobykhPT1DLnBhcnNlTnVtYmVyKGZbMF0pfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdCIsZi5jb25kaXRpb25zLm51bWJlci5sdCl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBDLnBhcnNlTnVtYmVyKG8pPEMucGFyc2VOdW1iZXIoZlswXSl9fSwiPD0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdGUiLGYuY29uZGl0aW9ucy5udW1iZXIubHRlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk8PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiPj0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ndGUiLGYuY29uZGl0aW9ucy5udW1iZXIuZ3RlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk+PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0IixmLmNvbmRpdGlvbnMubnVtYmVyLmd0KX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk+Qy5wYXJzZU51bWJlcihmWzBdKX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmJldHdlZW4iLGYuY29uZGl0aW9ucy5udW1iZXIuYmV0d2Vlbil9LGluaXQ6aC5pbml0MklucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1DLnBhcnNlTnVtYmVyKG8pLHU9Qy5wYXJzZU51bWJlcihmWzBdKSx6PUMucGFyc2VOdW1iZXIoZlsxXSk7cmV0dXJuK3U8K3o/K3U8PStCJiYrQjw9K3o6K3o8PStCJiYrQjw9K3V9fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RCZXR3ZWVuIixmLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7dmFyIEI9Qy5wYXJzZU51bWJlcihvKSx1PUMucGFyc2VOdW1iZXIoZlswXSksej1DLnBhcnNlTnVtYmVyKGZbMV0pO3JldHVybit1PCt6PyEoK3U8PStCJiYrQjw9K3opOiEoK3o8PStCJiYrQjw9K3UpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5zdHJpbmdDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuc3RyaW5nLmVxdWFscyIsZi5jb25kaXRpb25zLnN0cmluZy5lcXVhbHMpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG89PT1mWzBdfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90IixmLmNvbmRpdGlvbnMuc3RyaW5nLm5vdCl9LGluaXQ6aC5pbml0U2VsZWN0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvIT09ZlswXX19LHN0YXJ0czp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuc3RhcnRzV2l0aCIsZi5jb25kaXRpb25zLnN0cmluZy5zdGFydHNXaXRoKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmWzBdLnRvTG93ZXJDYXNlKCkpPT09MH19LCIhc3RhcnRzIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90U3RhcnRzV2l0aCIsZi5jb25kaXRpb25zLnN0cmluZy5ub3RTdGFydHNXaXRoKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmWzBdLnRvTG93ZXJDYXNlKCkpIT09MH19LGNvbnRhaW5zOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5jb250YWlucyIsZi5jb25kaXRpb25zLnN0cmluZy5jb250YWlucyl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZbMF0udG9Mb3dlckNhc2UoKSl9fSwiIWNvbnRhaW5zIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90Q29udGFpbnMiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90Q29udGFpbnMpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIW8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmWzBdLnRvTG93ZXJDYXNlKCkpfX0sZW5kczp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZW5kc1dpdGgiLGYuY29uZGl0aW9ucy5zdHJpbmcuZW5kc1dpdGgpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aChmWzBdLnRvTG93ZXJDYXNlKCkpfX0sIiFlbmRzIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90RW5kc1dpdGgiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90RW5kc1dpdGgpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIW8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aChmWzBdLnRvTG93ZXJDYXNlKCkpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZW1wdHkiLGYuY29uZGl0aW9ucy5zdHJpbmcuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90RW1wdHkiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5hcnJheUNvbmRpdGlvbnM9e2NvbnRhaW5zOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5LmNvbnRhaW5zIixmLmNvbmRpdGlvbnMuYXJyYXkuY29udGFpbnMpfSxpbml0OmguaW5pdFNlbGVjdEFycmF5LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pbmNsdWRlcyhmWzBdKX19LHdpdGhvdXQ6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkud2l0aG91dCIsZi5jb25kaXRpb25zLmFycmF5LndpdGhvdXQpfSxpbml0OmguaW5pdFNlbGVjdEFycmF5LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pbmRleE9mKGZbMF0pPT09LTF9fSwiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuZXF1YWxzIixmLmNvbmRpdGlvbnMuYXJyYXkuZXF1YWxzKX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYpe2lmKG8ubGVuZ3RoPT09ZlswXS5sZW5ndGgpe2Zvcih2YXIgQz0wO0M8by5sZW5ndGg7QysrKWlmKG9bQ10hPT1mWzBdW0NdKXJldHVybiExO3JldHVybiEwfXJldHVybiExfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5ub3QiLGYuY29uZGl0aW9ucy5hcnJheS5ub3QpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZil7aWYoby5sZW5ndGg9PT1mWzBdLmxlbmd0aCl7Zm9yKHZhciBDPTA7QzxvLmxlbmd0aDtDKyspaWYob1tDXSE9PWZbMF1bQ10pcmV0dXJuITA7cmV0dXJuITF9cmV0dXJuITB9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5LmVtcHR5IixmLmNvbmRpdGlvbnMuYXJyYXkuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5ub3RFbXB0eSIsZi5jb25kaXRpb25zLmFycmF5Lm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIG8hPW51bGwmJm8ubGVuZ3RoIT09MH19fSxoLmRlZmF1bHRzPXtjb2x1bW5zOiEwLGNvbmRpdGlvbnM6e2FycmF5OmguYXJyYXlDb25kaXRpb25zLGRhdGU6aC5kYXRlQ29uZGl0aW9ucyxodG1sOmguc3RyaW5nQ29uZGl0aW9ucywiaHRtbC1udW0iOmgubnVtQ29uZGl0aW9ucywiaHRtbC1udW0tZm10IjpoLm51bUZtdENvbmRpdGlvbnMsbHV4b246aC5sdXhvbkRhdGVDb25kaXRpb25zLG1vbWVudDpoLm1vbWVudERhdGVDb25kaXRpb25zLG51bTpoLm51bUNvbmRpdGlvbnMsIm51bS1mbXQiOmgubnVtRm10Q29uZGl0aW9ucyxzdHJpbmc6aC5zdHJpbmdDb25kaXRpb25zfSxkZXB0aExpbWl0OiExLGVudGVyU2VhcmNoOiExLGZpbHRlckNoYW5nZWQ6dm9pZCAwLGdyZXlzY2FsZTohMSxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxpdmVTZWFyY2g6ITAsbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxofSgpLGwsYztmdW5jdGlvbiBwKGgpe2w9aCxjPWguZm4uZGF0YVRhYmxlfXZhciBiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChvLGYsQyxCLHUseixxKXtpZihCPT09dm9pZCAwJiYoQj0wKSx1PT09dm9pZCAwJiYodT0hMSksej09PXZvaWQgMCYmKHo9MSkscT09PXZvaWQgMCYmKHE9dm9pZCAwKSwhY3x8IWMudmVyc2lvbkNoZWNrfHwhYy52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtyZXR1cm4gdGhpcy5jbGFzc2VzPWwuZXh0ZW5kKCEwLHt9LGguY2xhc3NlcyksdGhpcy5jPWwuZXh0ZW5kKCEwLHt9LGguZGVmYXVsdHMsZiksdGhpcy5zPXtjcml0ZXJpYTpbXSxkZXB0aDp6LGR0Om8saW5kZXg6Qixpc0NoaWxkOnUsbG9naWM6dm9pZCAwLG9wdHM6ZixwcmV2ZW50UmVkcmF3OiExLHNlcnZlckRhdGE6cSx0b0Ryb3A6dm9pZCAwLHRvcEdyb3VwOkN9LHRoaXMuZG9tPXthZGQ6bCgiPGJ1dHRvbi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmFkZCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNsZWFyOmwoIjxidXR0b24+JnRpbWVzPC9idXR0b24+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNsZWFyR3JvdXApLmF0dHIoInR5cGUiLCJidXR0b24iKSxjb250YWluZXI6bCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyb3VwKSxsb2dpYzpsKCI8YnV0dG9uPjxkaXYvPjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sb2dpYykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGxvZ2ljQ29udGFpbmVyOmwoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sb2dpY0NvbnRhaW5lciksc2VhcmNoOmwoIjxidXR0b24vPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2gpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHRoaXMucy50b3BHcm91cD09PXZvaWQgMCYmKHRoaXMucy50b3BHcm91cD10aGlzLmRvbS5jb250YWluZXIpLHRoaXMuX3NldHVwKCksdGhpc31yZXR1cm4gaC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmFkZC5vZmYoIi5kdHNiIiksdGhpcy5kb20ubG9naWMub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLnNlYXJjaC5vZmYoIi5kdHNiIiksdGhpcy5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZGVzdHJveSIpLnJlbW92ZSgpLHRoaXMucy5jcml0ZXJpYT1bXX0saC5wcm90b3R5cGUuZ2V0RGV0YWlscz1mdW5jdGlvbihvKXtpZihvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJue307Zm9yKHZhciBmPXtjcml0ZXJpYTpbXSxsb2dpYzp0aGlzLnMubG9naWN9LEM9MCxCPXRoaXMucy5jcml0ZXJpYTtDPEIubGVuZ3RoO0MrKyl7dmFyIHU9QltDXTtmLmNyaXRlcmlhLnB1c2godS5jcml0ZXJpYS5nZXREZXRhaWxzKG8pKX1yZXR1cm4gZn0saC5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGgucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obyl7dmFyIGY7aWYoIShvLmNyaXRlcmlhPT09dm9pZCAwfHxvLmNyaXRlcmlhPT09bnVsbHx8QXJyYXkuaXNBcnJheShvLmNyaXRlcmlhKSYmby5jcml0ZXJpYS5sZW5ndGg9PT0wKSl7aWYodGhpcy5zLmxvZ2ljPW8ubG9naWMsdGhpcy5kb20ubG9naWMuY2hpbGRyZW4oKS5maXJzdCgpLmh0bWwodGhpcy5zLmxvZ2ljPT09Ik9SIj90aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKTp0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSxBcnJheS5pc0FycmF5KG8uY3JpdGVyaWEpKWZvcih2YXIgQz0wLEI9by5jcml0ZXJpYTtDPEIubGVuZ3RoO0MrKylmPUJbQ10sZi5sb2dpYyE9PXZvaWQgMD90aGlzLl9hZGRQcmV2R3JvdXAoZik6Zi5sb2dpYz09PXZvaWQgMCYmdGhpcy5fYWRkUHJldkNyaXRlcmlhKGYpO2Zvcih2YXIgdT0wLHo9dGhpcy5zLmNyaXRlcmlhO3U8ei5sZW5ndGg7dSsrKWY9elt1XSxmLmNyaXRlcmlhIGluc3RhbmNlb2YgYSYmKGYuY3JpdGVyaWEudXBkYXRlQXJyb3dzKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg+MSksdGhpcy5fc2V0Q3JpdGVyaWFMaXN0ZW5lcnMoZi5jcml0ZXJpYSkpfX0saC5wcm90b3R5cGUucmVkcmF3Q29udGVudHM9ZnVuY3Rpb24oKXtpZighdGhpcy5zLnByZXZlbnRSZWRyYXcpe3RoaXMuZG9tLmNvbnRhaW5lci5jaGlsZHJlbigpLmRldGFjaCgpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20ubG9naWNDb250YWluZXIpLmFwcGVuZCh0aGlzLmRvbS5hZGQpLHRoaXMuYy5saXZlU2VhcmNofHx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnNlYXJjaCksdGhpcy5zLmNyaXRlcmlhLnNvcnQoZnVuY3Rpb24oQyxCKXtyZXR1cm4gQy5jcml0ZXJpYS5zLmluZGV4PEIuY3JpdGVyaWEucy5pbmRleD8tMTpDLmNyaXRlcmlhLnMuaW5kZXg+Qi5jcml0ZXJpYS5zLmluZGV4PzE6MH0pLHRoaXMuc2V0TGlzdGVuZXJzKCk7Zm9yKHZhciBvPTA7bzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO28rKyl7dmFyIGY9dGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhO2YgaW5zdGFuY2VvZiBhPyh0aGlzLnMuY3JpdGVyaWFbb10uaW5kZXg9byx0aGlzLnMuY3JpdGVyaWFbb10uY3JpdGVyaWEucy5pbmRleD1vLHRoaXMucy5jcml0ZXJpYVtvXS5jcml0ZXJpYS5kb20uY29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmRvbS5hZGQpLHRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKGYpLHRoaXMucy5jcml0ZXJpYVtvXS5jcml0ZXJpYS5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnJlYnVpbGQodGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLmdldERldGFpbHMoKSksdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnMucHJldmVudFJlZHJhdz0hMSk6ZiBpbnN0YW5jZW9mIGgmJmYucy5jcml0ZXJpYS5sZW5ndGg+MD8odGhpcy5zLmNyaXRlcmlhW29dLmluZGV4PW8sdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnMuaW5kZXg9byx0aGlzLnMuY3JpdGVyaWFbb10uY3JpdGVyaWEuZG9tLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSxmLnMucHJldmVudFJlZHJhdz10aGlzLnMucHJldmVudFJlZHJhdyxmLnJlZHJhd0NvbnRlbnRzKCksZi5zLnByZXZlbnRSZWRyYXc9ITEsdGhpcy5fc2V0R3JvdXBMaXN0ZW5lcnMoZikpOih0aGlzLnMuY3JpdGVyaWEuc3BsaWNlKG8sMSksby0tKX10aGlzLnNldHVwTG9naWMoKX19LGgucHJvdG90eXBlLnJlZHJhd0xvZ2ljPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPTAsZj10aGlzLnMuY3JpdGVyaWE7bzxmLmxlbmd0aDtvKyspe3ZhciBDPWZbb107Qy5jcml0ZXJpYSBpbnN0YW5jZW9mIGgmJkMuY3JpdGVyaWEucmVkcmF3TG9naWMoKX10aGlzLnNldHVwTG9naWMoKX0saC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKG8sZil7cmV0dXJuIHRoaXMucy5sb2dpYz09PSJBTkQiP3RoaXMuX2FuZFNlYXJjaChvLGYpOnRoaXMucy5sb2dpYz09PSJPUiI/dGhpcy5fb3JTZWFyY2gobyxmKTohMH0saC5wcm90b3R5cGUuc2V0dXBMb2dpYz1mdW5jdGlvbigpe2lmKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLnJlbW92ZSgpLHRoaXMuZG9tLmNsZWFyLnJlbW92ZSgpLHRoaXMucy5jcml0ZXJpYS5sZW5ndGg8MSl7dGhpcy5zLmlzQ2hpbGR8fCh0aGlzLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1kZXN0cm95IiksdGhpcy5kb20uY29udGFpbmVyLmNzcygibWFyZ2luLWxlZnQiLDApKSx0aGlzLmRvbS5zZWFyY2guY3NzKCJkaXNwbGF5Iiwibm9uZSIpO3JldHVybn10aGlzLmRvbS5jbGVhci5oZWlnaHQoIjBweCIpLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5jbGVhciksdGhpcy5zLmlzQ2hpbGR8fHRoaXMuZG9tLnNlYXJjaC5jc3MoImRpc3BsYXkiLCJpbmxpbmUtYmxvY2siKSx0aGlzLmRvbS5jb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS5sb2dpY0NvbnRhaW5lcik7Zm9yKHZhciBvPTAsZj10aGlzLnMuY3JpdGVyaWE7bzxmLmxlbmd0aDtvKyspe3ZhciBDPWZbb107Qy5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJkMuY3JpdGVyaWEuc2V0dXBCdXR0b25zKCl9dmFyIEI9dGhpcy5kb20uY29udGFpbmVyLm91dGVySGVpZ2h0KCktMTt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci53aWR0aChCKSx0aGlzLl9zZXRMb2dpY0xpc3RlbmVyKCksdGhpcy5kb20uY29udGFpbmVyLmNzcygibWFyZ2luLWxlZnQiLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm91dGVySGVpZ2h0KCEwKSk7dmFyIHU9dGhpcy5kb20ubG9naWNDb250YWluZXIub2Zmc2V0KCksej11LmxlZnQscT10aGlzLmRvbS5jb250YWluZXIub2Zmc2V0KCkubGVmdCxldD16LXEsTz16LWV0LXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm91dGVySGVpZ2h0KCEwKTt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vZmZzZXQoe2xlZnQ6T30pO3ZhciBaPXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm5leHQoKSxnPXUudG9wLF89bChaKS5vZmZzZXQoKS50b3AsUz1nLV8sTj1nLVM7dGhpcy5kb20ubG9naWNDb250YWluZXIub2Zmc2V0KHt0b3A6Tn0pLHRoaXMuZG9tLmNsZWFyLm91dGVySGVpZ2h0KHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmhlaWdodCgpKSx0aGlzLl9zZXRDbGVhckxpc3RlbmVyKCl9LGgucHJvdG90eXBlLnNldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5kb20uYWRkLnVuYmluZCgiY2xpY2siKSx0aGlzLmRvbS5hZGQub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8ucy5pc0NoaWxkfHxvLmRvbS5jb250YWluZXIucHJlcGVuZChvLmRvbS5sb2dpY0NvbnRhaW5lciksby5hZGRDcml0ZXJpYSgpLG8uZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLG8ucy5kdC5zdGF0ZS5zYXZlKCksITF9KSx0aGlzLmRvbS5zZWFyY2gub2ZmKCJjbGljay5kdHNiIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5zLmR0LmRyYXcoKX0pO2Zvcih2YXIgZj0wLEM9dGhpcy5zLmNyaXRlcmlhO2Y8Qy5sZW5ndGg7ZisrKXt2YXIgQj1DW2ZdO0IuY3JpdGVyaWEuc2V0TGlzdGVuZXJzKCl9dGhpcy5fc2V0Q2xlYXJMaXN0ZW5lcigpLHRoaXMuX3NldExvZ2ljTGlzdGVuZXIoKX0saC5wcm90b3R5cGUuYWRkQ3JpdGVyaWE9ZnVuY3Rpb24obyl7bz09PXZvaWQgMCYmKG89bnVsbCk7dmFyIGY9bz09PW51bGw/dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDpvLnMuaW5kZXgsQz1uZXcgYSh0aGlzLnMuZHQsdGhpcy5zLm9wdHMsdGhpcy5zLnRvcEdyb3VwLGYsdGhpcy5zLmRlcHRoLHRoaXMucy5zZXJ2ZXJEYXRhLHRoaXMuYy5saXZlU2VhcmNoKTtvIT09bnVsbCYmKEMuYz1vLmMsQy5zPW8ucyxDLnMuZGVwdGg9dGhpcy5zLmRlcHRoLEMuY2xhc3Nlcz1vLmNsYXNzZXMpLEMucG9wdWxhdGUoKTtmb3IodmFyIEI9ITEsdT0wO3U8dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDt1KyspdT09PTAmJnRoaXMucy5jcml0ZXJpYVt1XS5jcml0ZXJpYS5zLmluZGV4PkMucy5pbmRleD8oQy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKHRoaXMucy5jcml0ZXJpYVt1XS5jcml0ZXJpYS5kb20uY29udGFpbmVyKSxCPSEwKTp1PHRoaXMucy5jcml0ZXJpYS5sZW5ndGgtMSYmdGhpcy5zLmNyaXRlcmlhW3VdLmNyaXRlcmlhLnMuaW5kZXg8Qy5zLmluZGV4JiZ0aGlzLnMuY3JpdGVyaWFbdSsxXS5jcml0ZXJpYS5zLmluZGV4PkMucy5pbmRleCYmKEMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKHRoaXMucy5jcml0ZXJpYVt1XS5jcml0ZXJpYS5kb20uY29udGFpbmVyKSxCPSEwKTtCfHxDLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSx0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6QyxpbmRleDpmfSksdGhpcy5zLmNyaXRlcmlhPXRoaXMucy5jcml0ZXJpYS5zb3J0KGZ1bmN0aW9uKE8sWil7cmV0dXJuIE8uY3JpdGVyaWEucy5pbmRleC1aLmNyaXRlcmlhLnMuaW5kZXh9KTtmb3IodmFyIHo9MCxxPXRoaXMucy5jcml0ZXJpYTt6PHEubGVuZ3RoO3orKyl7dmFyIGV0PXFbel07ZXQuY3JpdGVyaWEgaW5zdGFuY2VvZiBhJiZldC5jcml0ZXJpYS51cGRhdGVBcnJvd3ModGhpcy5zLmNyaXRlcmlhLmxlbmd0aD4xKX10aGlzLl9zZXRDcml0ZXJpYUxpc3RlbmVycyhDKSxDLnNldExpc3RlbmVycygpLHRoaXMuc2V0dXBMb2dpYygpfSxoLnByb3RvdHlwZS5jaGVja0ZpbGxlZD1mdW5jdGlvbigpe2Zvcih2YXIgbz0wLGY9dGhpcy5zLmNyaXRlcmlhO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO2lmKEMuY3JpdGVyaWEgaW5zdGFuY2VvZiBhJiZDLmNyaXRlcmlhLnMuZmlsbGVkfHxDLmNyaXRlcmlhIGluc3RhbmNlb2YgaCYmQy5jcml0ZXJpYS5jaGVja0ZpbGxlZCgpKXJldHVybiEwfXJldHVybiExfSxoLnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe2Zvcih2YXIgbz0wLGY9MCxDPXRoaXMucy5jcml0ZXJpYTtmPEMubGVuZ3RoO2YrKyl7dmFyIEI9Q1tmXTtCLmNyaXRlcmlhIGluc3RhbmNlb2YgaD9vKz1CLmNyaXRlcmlhLmNvdW50KCk6bysrfXJldHVybiBvfSxoLnByb3RvdHlwZS5fYWRkUHJldkdyb3VwPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXMucy5jcml0ZXJpYS5sZW5ndGgsQz1uZXcgaCh0aGlzLnMuZHQsdGhpcy5jLHRoaXMucy50b3BHcm91cCxmLCEwLHRoaXMucy5kZXB0aCsxLHRoaXMucy5zZXJ2ZXJEYXRhKTt0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6QyxpbmRleDpmLGxvZ2ljOkMucy5sb2dpY30pLEMucmVidWlsZChvKSx0aGlzLnMuY3JpdGVyaWFbZl0uY3JpdGVyaWE9Qyx0aGlzLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLHRoaXMuX3NldEdyb3VwTGlzdGVuZXJzKEMpfSxoLnByb3RvdHlwZS5fYWRkUHJldkNyaXRlcmlhPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXMucy5jcml0ZXJpYS5sZW5ndGgsQz1uZXcgYSh0aGlzLnMuZHQsdGhpcy5zLm9wdHMsdGhpcy5zLnRvcEdyb3VwLGYsdGhpcy5zLmRlcHRoLHRoaXMucy5zZXJ2ZXJEYXRhKTtDLnBvcHVsYXRlKCksdGhpcy5zLmNyaXRlcmlhLnB1c2goe2NyaXRlcmlhOkMsaW5kZXg6Zn0pLEMucy5wcmV2ZW50UmVkcmF3PXRoaXMucy5wcmV2ZW50UmVkcmF3LEMucmVidWlsZChvKSxDLnMucHJldmVudFJlZHJhdz0hMSx0aGlzLnMuY3JpdGVyaWFbZl0uY3JpdGVyaWE9Qyx0aGlzLnMucHJldmVudFJlZHJhd3x8dGhpcy5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKX0saC5wcm90b3R5cGUuX2FuZFNlYXJjaD1mdW5jdGlvbihvLGYpe2lmKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybiEwO2Zvcih2YXIgQz0wLEI9dGhpcy5zLmNyaXRlcmlhO0M8Qi5sZW5ndGg7QysrKXt2YXIgdT1CW0NdO2lmKCEodS5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJiF1LmNyaXRlcmlhLnMuZmlsbGVkKSYmIXUuY3JpdGVyaWEuc2VhcmNoKG8sZikpcmV0dXJuITF9cmV0dXJuITB9LGgucHJvdG90eXBlLl9vclNlYXJjaD1mdW5jdGlvbihvLGYpe2lmKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybiEwO2Zvcih2YXIgQz0hMSxCPTAsdT10aGlzLnMuY3JpdGVyaWE7Qjx1Lmxlbmd0aDtCKyspe3ZhciB6PXVbQl07aWYoei5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJnouY3JpdGVyaWEucy5maWxsZWQpe2lmKEM9ITAsei5jcml0ZXJpYS5zZWFyY2gobyxmKSlyZXR1cm4hMH1lbHNlIGlmKHouY3JpdGVyaWEgaW5zdGFuY2VvZiBoJiZ6LmNyaXRlcmlhLmNoZWNrRmlsbGVkKCkmJihDPSEwLHouY3JpdGVyaWEuc2VhcmNoKG8sZikpKXJldHVybiEwfXJldHVybiFDfSxoLnByb3RvdHlwZS5fcmVtb3ZlQ3JpdGVyaWE9ZnVuY3Rpb24obyxmKXtmPT09dm9pZCAwJiYoZj0hMSk7dmFyIEM7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aDw9MSYmdGhpcy5zLmlzQ2hpbGQpdGhpcy5kZXN0cm95KCk7ZWxzZXt2YXIgQj12b2lkIDA7Zm9yKEM9MDtDPHRoaXMucy5jcml0ZXJpYS5sZW5ndGg7QysrKXRoaXMucy5jcml0ZXJpYVtDXS5pbmRleD09PW8ucy5pbmRleCYmKCFmfHx0aGlzLnMuY3JpdGVyaWFbQ10uY3JpdGVyaWEgaW5zdGFuY2VvZiBoKSYmKEI9Qyk7Zm9yKEIhPT12b2lkIDAmJnRoaXMucy5jcml0ZXJpYS5zcGxpY2UoQiwxKSxDPTA7Qzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO0MrKyl0aGlzLnMuY3JpdGVyaWFbQ10uaW5kZXg9Qyx0aGlzLnMuY3JpdGVyaWFbQ10uY3JpdGVyaWEucy5pbmRleD1DfX0saC5wcm90b3R5cGUuX3NldENyaXRlcmlhTGlzdGVuZXJzPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXM7by5kb20uZGVsZXRlLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtmLl9yZW1vdmVDcml0ZXJpYShvKSxvLmRvbS5jb250YWluZXIucmVtb3ZlKCk7Zm9yKHZhciBDPTAsQj1mLnMuY3JpdGVyaWE7QzxCLmxlbmd0aDtDKyspe3ZhciB1PUJbQ107dS5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJnUuY3JpdGVyaWEudXBkYXRlQXJyb3dzKGYucy5jcml0ZXJpYS5sZW5ndGg+MSl9cmV0dXJuIG8uZGVzdHJveSgpLGYucy5kdC5kcmF3KCksZi5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSwhMX0pLG8uZG9tLnJpZ2h0LnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXt2YXIgQz1vLnMuaW5kZXgsQj1uZXcgaChmLnMuZHQsZi5zLm9wdHMsZi5zLnRvcEdyb3VwLG8ucy5pbmRleCwhMCxmLnMuZGVwdGgrMSxmLnMuc2VydmVyRGF0YSk7cmV0dXJuIEIuYWRkQ3JpdGVyaWEobyksZi5zLmNyaXRlcmlhW0NdLmNyaXRlcmlhPUIsZi5zLmNyaXRlcmlhW0NdLmxvZ2ljPSJBTkQiLGYucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksZi5fc2V0R3JvdXBMaXN0ZW5lcnMoQiksITF9KSxvLmRvbS5sZWZ0LnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtmLnMudG9Ecm9wPW5ldyBhKGYucy5kdCxmLnMub3B0cyxmLnMudG9wR3JvdXAsby5zLmluZGV4LHZvaWQgMCxmLnMuc2VydmVyRGF0YSksZi5zLnRvRHJvcC5zPW8ucyxmLnMudG9Ecm9wLmM9by5jLGYucy50b0Ryb3AuY2xhc3Nlcz1vLmNsYXNzZXMsZi5zLnRvRHJvcC5wb3B1bGF0ZSgpO3ZhciBDPWYucy50b0Ryb3Aucy5pbmRleDtyZXR1cm4gZi5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZHJvcENyaXRlcmlhIiksby5zLmluZGV4PUMsZi5fcmVtb3ZlQ3JpdGVyaWEobyksZi5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSxmLnMuZHQuZHJhdygpLCExfSl9LGgucHJvdG90eXBlLl9zZXRDbGVhckxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5jbGVhci51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8ucy5pc0NoaWxkPyhvLmRlc3Ryb3koKSxvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLCExKTooby5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItY2xlYXJDb250ZW50cyIpLCExKX0pfSxoLnByb3RvdHlwZS5fc2V0R3JvdXBMaXN0ZW5lcnM9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztvLmRvbS5hZGQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3JldHVybiBmLnNldHVwTG9naWMoKSxmLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1hZGQiKSwhMX0pLG8uZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItYWRkIikub24oImR0c2ItYWRkLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGYuc2V0dXBMb2dpYygpLGYuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLCExfSksby5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1kZXN0cm95Iikub24oImR0c2ItZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe3JldHVybiBmLl9yZW1vdmVDcml0ZXJpYShvLCEwKSxvLmRvbS5jb250YWluZXIucmVtb3ZlKCksZi5zZXR1cExvZ2ljKCksITF9KSxvLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWRyb3BDcml0ZXJpYSIpLm9uKCJkdHNiLWRyb3BDcml0ZXJpYS5kdHNiIixmdW5jdGlvbigpe3ZhciBDPW8ucy50b0Ryb3A7cmV0dXJuIEMucy5pbmRleD1vLnMuaW5kZXgsQy51cGRhdGVBcnJvd3MoZi5zLmNyaXRlcmlhLmxlbmd0aD4xKSxmLmFkZENyaXRlcmlhKEMpLCExfSksby5zZXRMaXN0ZW5lcnMoKX0saC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLmRvbS5hZGQuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5hZGQiLHRoaXMuYy5pMThuLmFkZCkpLHRoaXMuZG9tLnNlYXJjaC5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnNlYXJjaCIsdGhpcy5jLmkxOG4uc2VhcmNoKSksdGhpcy5kb20ubG9naWMuY2hpbGRyZW4oKS5maXJzdCgpLmh0bWwodGhpcy5jLmxvZ2ljPT09Ik9SIj90aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKTp0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSx0aGlzLnMubG9naWM9dGhpcy5jLmxvZ2ljPT09Ik9SIj8iT1IiOiJBTkQiLHRoaXMuYy5ncmV5c2NhbGUmJnRoaXMuZG9tLmxvZ2ljLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5sb2dpYykuYXBwZW5kKHRoaXMuZG9tLmNsZWFyKSx0aGlzLnMuaXNDaGlsZCYmdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5sb2dpY0NvbnRhaW5lciksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5hZGQpLHRoaXMuYy5saXZlU2VhcmNofHx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnNlYXJjaCl9LGgucHJvdG90eXBlLl9zZXRMb2dpY0xpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5sb2dpYy51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5fdG9nZ2xlTG9naWMoKSxvLnMuZHQuZHJhdygpO2Zvcih2YXIgZj0wLEM9by5zLmNyaXRlcmlhO2Y8Qy5sZW5ndGg7ZisrKXt2YXIgQj1DW2ZdO0IuY3JpdGVyaWEuc2V0TGlzdGVuZXJzKCl9fSl9LGgucHJvdG90eXBlLl90b2dnbGVMb2dpYz1mdW5jdGlvbigpe3RoaXMucy5sb2dpYz09PSJPUiI/KHRoaXMucy5sb2dpYz0iQU5EIix0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSk6dGhpcy5zLmxvZ2ljPT09IkFORCImJih0aGlzLnMubG9naWM9Ik9SIix0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKSkpfSxoLnZlcnNpb249IjEuMS4wIixoLmNsYXNzZXM9e2FkZDoiZHRzYi1hZGQiLGJ1dHRvbjoiZHRzYi1idXR0b24iLGNsZWFyR3JvdXA6ImR0c2ItY2xlYXJHcm91cCIsZ3JleXNjYWxlOiJkdHNiLWdyZXlzY2FsZSIsZ3JvdXA6ImR0c2ItZ3JvdXAiLGlucHV0QnV0dG9uOiJkdHNiLWlwdGJ0biIsbG9naWM6ImR0c2ItbG9naWMiLGxvZ2ljQ29udGFpbmVyOiJkdHNiLWxvZ2ljQ29udGFpbmVyIixzZWFyY2g6ImR0c2Itc2VhcmNoIn0saC5kZWZhdWx0cz17Y29sdW1uczohMCxjb25kaXRpb25zOntkYXRlOmEuZGF0ZUNvbmRpdGlvbnMsaHRtbDphLnN0cmluZ0NvbmRpdGlvbnMsImh0bWwtbnVtIjphLm51bUNvbmRpdGlvbnMsImh0bWwtbnVtLWZtdCI6YS5udW1GbXRDb25kaXRpb25zLGx1eG9uOmEubHV4b25EYXRlQ29uZGl0aW9ucyxtb21lbnQ6YS5tb21lbnREYXRlQ29uZGl0aW9ucyxudW06YS5udW1Db25kaXRpb25zLCJudW0tZm10IjphLm51bUZtdENvbmRpdGlvbnMsc3RyaW5nOmEuc3RyaW5nQ29uZGl0aW9uc30sZGVwdGhMaW1pdDohMSxlbnRlclNlYXJjaDohMSxmaWx0ZXJDaGFuZ2VkOnZvaWQgMCxncmV5c2NhbGU6ITEsbGl2ZVNlYXJjaDohMCxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxvZ2ljOiJBTkQiLG9ydGhvZ29uYWw6e2Rpc3BsYXk6ImRpc3BsYXkiLHNlYXJjaDoiZmlsdGVyIn0scHJlRGVmaW5lZDohMX0saH0oKSxtLHk7ZnVuY3Rpb24gVChoKXttPWgseT1oLmZuLkRhdGFUYWJsZX12YXIgdz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgobyxmKXt2YXIgQz10aGlzO2lmKCF5fHwheS52ZXJzaW9uQ2hlY2t8fCF5LnZlcnNpb25DaGVjaygiMS4xMC4wIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hCdWlsZGVyIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMCBvciBuZXdlciIpO3ZhciBCPW5ldyB5LkFwaShvKTtpZih0aGlzLmNsYXNzZXM9bS5leHRlbmQoITAse30saC5jbGFzc2VzKSx0aGlzLmM9bS5leHRlbmQoITAse30saC5kZWZhdWx0cyxmKSx0aGlzLmRvbT17Y2xlYXJBbGw6bSgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPicrQi5pMThuKCJzZWFyY2hCdWlsZGVyLmNsZWFyQWxsIix0aGlzLmMuaTE4bi5jbGVhckFsbCkrIjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckFsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNvbnRhaW5lcjptKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSx0aXRsZTptKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGUpLHRpdGxlUm93Om0oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50aXRsZVJvdyksdG9wR3JvdXA6dm9pZCAwfSx0aGlzLnM9e2R0OkIsb3B0czpmLHNlYXJjaDp2b2lkIDAsc2VydmVyRGF0YTp2b2lkIDAsdG9wR3JvdXA6dm9pZCAwfSxCLnNldHRpbmdzKClbMF0uX3NlYXJjaEJ1aWxkZXI9PT12b2lkIDApcmV0dXJuIEIuc2V0dGluZ3MoKVswXS5fc2VhcmNoQnVpbGRlcj10aGlzLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYodGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24odSx6LHEpe3ZhciBldD1DLnMuZHQuc3RhdGUubG9hZGVkKCk7ZXQmJmV0LnNlYXJjaEJ1aWxkZXImJihxLnNlYXJjaEJ1aWxkZXI9Qy5fY29sbGFwc2VBcnJheShldC5zZWFyY2hCdWlsZGVyKSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNiIixmdW5jdGlvbih1LHoscSl7cSYmcS5zZWFyY2hCdWlsZGVyJiZxLnNlYXJjaEJ1aWxkZXIub3B0aW9ucyYmKEMucy5zZXJ2ZXJEYXRhPXEuc2VhcmNoQnVpbGRlci5vcHRpb25zKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zZXRVcCgpOkIub25lKCJpbml0LmR0IixmdW5jdGlvbigpe0MuX3NldFVwKCl9KSx0aGlzfXJldHVybiBoLnByb3RvdHlwZS5nZXREZXRhaWxzPWZ1bmN0aW9uKG8pe3JldHVybiBvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zLnRvcEdyb3VwLmdldERldGFpbHMobyl9LGgucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxoLnByb3RvdHlwZS5yZWJ1aWxkPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLmRvbS5jbGVhckFsbC5jbGljaygpLG89PW51bGw/dGhpczoodGhpcy5zLnRvcEdyb3VwLnMucHJldmVudFJlZHJhdz0hMCx0aGlzLnMudG9wR3JvdXAucmVidWlsZChvKSx0aGlzLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMuX2NoZWNrQ2xlYXIoKSx0aGlzLl91cGRhdGVUaXRsZSh0aGlzLnMudG9wR3JvdXAuY291bnQoKSksdGhpcy5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksdGhpcy5zLmR0LmRyYXcoITEpLHRoaXMucy50b3BHcm91cC5zZXRMaXN0ZW5lcnMoKSx0aGlzKX0saC5wcm90b3R5cGUuX2FwcGx5UHJlRGVmRGVmYXVsdHM9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztvLmNyaXRlcmlhIT09dm9pZCAwJiZvLmxvZ2ljPT09dm9pZCAwJiYoby5sb2dpYz0iQU5EIik7Zm9yKHZhciBDPWZ1bmN0aW9uKGV0KXtldC5jcml0ZXJpYSE9PXZvaWQgMD9ldD1CLl9hcHBseVByZURlZkRlZmF1bHRzKGV0KTpCLnMuZHQuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKE8pe2Yucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1tPXS5zVGl0bGU9PT1ldC5kYXRhJiYoZXQuZGF0YUlkeD1PKX0pfSxCPXRoaXMsdT0wLHo9by5jcml0ZXJpYTt1PHoubGVuZ3RoO3UrKyl7dmFyIHE9elt1XTtDKHEpfXJldHVybiBvfSxoLnByb3RvdHlwZS5fc2V0VXA9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztpZihvPT09dm9pZCAwJiYobz0hMCksdHlwZW9mIHRoaXMucy5kdC5jb2x1bW4oKS50eXBlIT0iZnVuY3Rpb24iJiZzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImNvbHVtbnMoKS50eXBlcygpIiwiY29sdW1uKCkudHlwZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKF8sUyl7cmV0dXJuIF8uYW9Db2x1bW5zW1NdLnNUeXBlfSwxKX0pLCF5LkRhdGVUaW1lKXt2YXIgQz10aGlzLnMuZHQuY29sdW1ucygpLnR5cGVzKCkudG9BcnJheSgpO2lmKEM9PT12b2lkIDB8fEMuaW5jbHVkZXModm9pZCAwKXx8Qy5pbmNsdWRlcyhudWxsKSl7Qz1bXTtmb3IodmFyIEI9MCx1PXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucztCPHUubGVuZ3RoO0IrKyl7dmFyIHo9dVtCXTtDLnB1c2goei5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMD96LnNlYXJjaEJ1aWxkZXJUeXBlOnouc1R5cGUpfX12YXIgcT10aGlzLnMuZHQuY29sdW1ucygpLnRvQXJyYXkoKTsoQz09PXZvaWQgMHx8Qy5pbmNsdWRlcyh2b2lkIDApfHxDLmluY2x1ZGVzKG51bGwpKSYmKG0uZm4uZGF0YVRhYmxlLmV4dC5vQXBpJiZtLmZuLmRhdGFUYWJsZS5leHQub0FwaS5fZm5Db2x1bW5UeXBlcyh0aGlzLnMuZHQuc2V0dGluZ3MoKVswXSksQz10aGlzLnMuZHQuY29sdW1ucygpLnR5cGVzKCkudG9BcnJheSgpKTtmb3IodmFyIGV0PTA7ZXQ8cVswXS5sZW5ndGg7ZXQrKyl7dmFyIE89cVswXVtldF0sWj1DW09dO2lmKCh0aGlzLmMuY29sdW1ucz09PSEwfHxBcnJheS5pc0FycmF5KHRoaXMuYy5jb2x1bW5zKSYmdGhpcy5jLmNvbHVtbnMuaW5jbHVkZXMoZXQpKSYmKFouaW5jbHVkZXMoImRhdGUiKXx8Wi5pbmNsdWRlcygibW9tZW50Iil8fFouaW5jbHVkZXMoImx1eG9uIikpKXRocm93IGFsZXJ0KCJTZWFyY2hCdWlsZGVyIFJlcXVpcmVzIERhdGVUaW1lIHdoZW4gdXNlZCB3aXRoIGRhdGVzLiIpLG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRlVGltZSIpfX1pZih0aGlzLnMudG9wR3JvdXA9bmV3IGIodGhpcy5zLmR0LHRoaXMuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdGhpcy5zLnNlcnZlckRhdGEpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNiIixmdW5jdGlvbihfLFMsTil7Ti5zZWFyY2hCdWlsZGVyPWYuZ2V0RGV0YWlscygpLE4uc2Nyb2xsZXI/Ti5zdGFydD1mLnMuZHQuc3RhdGUoKS5zdGFydDpOLnBhZ2U9Zi5zLmR0LnBhZ2UoKX0pLHRoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c2IiLGZ1bmN0aW9uKF8sUyxOKXtmLnJlYnVpbGQoTi5zZWFyY2hCdWlsZGVyKX0pLHRoaXMuX2J1aWxkKCksdGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oXyxTLE4pe2Yucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYoTi5zZWFyY2hCdWlsZGVyPWYuX2NvbGxhcHNlQXJyYXkoZi5nZXREZXRhaWxzKCEwKSkpfSksdGhpcy5zLmR0Lm9uKHkudmVyc2lvbkNoZWNrKCIyIik/ImNvbHVtbnMtcmVvcmRlcmVkIjoiY29sdW1uLXJlb3JkZXIiLGZ1bmN0aW9uKCl7Zi5yZWJ1aWxkKGYuZ2V0RGV0YWlscygpKX0pLG8pe3ZhciBnPXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKTtnIT09bnVsbCYmZy5zZWFyY2hCdWlsZGVyIT09dm9pZCAwPyh0aGlzLnMudG9wR3JvdXAucmVidWlsZChnLnNlYXJjaEJ1aWxkZXIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8KGcucGFnZT90aGlzLnMuZHQucGFnZShnLnBhZ2UpLmRyYXcoInBhZ2UiKTp0aGlzLnMuZHQuc2Nyb2xsZXImJmcuc2Nyb2xsZXImJnRoaXMucy5kdC5zY3JvbGxlcigpLnNjcm9sbFRvUm93KGcuc2Nyb2xsZXIudG9wUm93KSksdGhpcy5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpKTp0aGlzLmMucHJlRGVmaW5lZCE9PSExJiYodGhpcy5jLnByZURlZmluZWQ9dGhpcy5fYXBwbHlQcmVEZWZEZWZhdWx0cyh0aGlzLmMucHJlRGVmaW5lZCksdGhpcy5yZWJ1aWxkKHRoaXMuYy5wcmVEZWZpbmVkKSl9dGhpcy5fc2V0RW1wdHlMaXN0ZW5lcigpLHRoaXMucy5kdC5zdGF0ZS5zYXZlKCl9LGgucHJvdG90eXBlLl9jb2xsYXBzZUFycmF5PWZ1bmN0aW9uKG8pe2lmKG8ubG9naWM9PT12b2lkIDApby52YWx1ZSE9PXZvaWQgMCYmKG8udmFsdWUuc29ydChmdW5jdGlvbihDLEIpe3JldHVybiBpc05hTigrQyl8fChDPStDLEI9K0IpLEM8Qj8tMTpCPEM/MTowfSksby52YWx1ZTE9by52YWx1ZVswXSxvLnZhbHVlMj1vLnZhbHVlWzFdKTtlbHNlIGZvcih2YXIgZj0wO2Y8by5jcml0ZXJpYS5sZW5ndGg7ZisrKW8uY3JpdGVyaWFbZl09dGhpcy5fY29sbGFwc2VBcnJheShvLmNyaXRlcmlhW2ZdKTtyZXR1cm4gb30saC5wcm90b3R5cGUuX3VwZGF0ZVRpdGxlPWZ1bmN0aW9uKG8pe3RoaXMuZG9tLnRpdGxlLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudGl0bGUiLHRoaXMuYy5pMThuLnRpdGxlLG8pKX0saC5wcm90b3R5cGUuX2J1aWxkPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5jbGVhckFsbC5yZW1vdmUoKSx0aGlzLmRvbS5jb250YWluZXIuZW1wdHkoKTt2YXIgZj10aGlzLnMudG9wR3JvdXAuY291bnQoKTt0aGlzLl91cGRhdGVUaXRsZShmKSx0aGlzLmRvbS50aXRsZVJvdy5hcHBlbmQodGhpcy5kb20udGl0bGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLnRvcEdyb3VwPXRoaXMucy50b3BHcm91cC5nZXROb2RlKCksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS50b3BHcm91cCksdGhpcy5fc2V0UmVkcmF3TGlzdGVuZXIoKTt2YXIgQz10aGlzLnMuZHQudGFibGUoMCkubm9kZSgpO20uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5jbHVkZXModGhpcy5zLnNlYXJjaCl8fCh0aGlzLnMuc2VhcmNoPWZ1bmN0aW9uKEIsdSx6KXtyZXR1cm4gQi5uVGFibGUhPT1DPyEwOm8ucy50b3BHcm91cC5zZWFyY2godSx6KX0sbS5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKHRoaXMucy5zZWFyY2gpKSx0aGlzLnMuZHQub24oImRlc3Ryb3kuZHRzYiIsZnVuY3Rpb24oKXtvLmRvbS5jb250YWluZXIucmVtb3ZlKCksby5kb20uY2xlYXJBbGwucmVtb3ZlKCk7Zm9yKHZhciBCPW0uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZihvLnMuc2VhcmNoKTtCIT09LTE7KW0uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guc3BsaWNlKEIsMSksQj1tLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2Yoby5zLnNlYXJjaCk7by5zLmR0Lm9mZigiLmR0c2IiKSxtKG8ucy5kdC50YWJsZSgpLm5vZGUoKSkub2ZmKCIuZHRzYiIpfSl9LGgucHJvdG90eXBlLl9jaGVja0NsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zLnRvcEdyb3VwLnMuY3JpdGVyaWEubGVuZ3RoPjA/KHRoaXMuZG9tLmNsZWFyQWxsLmluc2VydEFmdGVyKHRoaXMuZG9tLnRpdGxlKSx0aGlzLl9zZXRDbGVhckxpc3RlbmVyKCkpOnRoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZSgpfSxoLnByb3RvdHlwZS5fZmlsdGVyQ2hhbmdlZD1mdW5jdGlvbihvKXt2YXIgZj10aGlzLmMuZmlsdGVyQ2hhbmdlZDt0eXBlb2YgZj09ImZ1bmN0aW9uIiYmZihvLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmJ1dHRvbiIsdGhpcy5jLmkxOG4uYnV0dG9uLG8pKX0saC5wcm90b3R5cGUuX3NldENsZWFyTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbz10aGlzO3RoaXMuZG9tLmNsZWFyQWxsLnVuYmluZCgiY2xpY2siKSx0aGlzLmRvbS5jbGVhckFsbC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gby5zLnRvcEdyb3VwPW5ldyBiKG8ucy5kdCxvLmMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG8ucy5zZXJ2ZXJEYXRhKSxvLl9idWlsZCgpLG8ucy5kdC5kcmF3KCksby5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpLG8uZG9tLmNsZWFyQWxsLnJlbW92ZSgpLG8uX3NldEVtcHR5TGlzdGVuZXIoKSxvLl9maWx0ZXJDaGFuZ2VkKDApLCExfSl9LGgucHJvdG90eXBlLl9zZXRSZWRyYXdMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3Q29udGVudHMuZHRzYiIsZnVuY3Rpb24oKXtvLl9jaGVja0NsZWFyKCksby5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksby5zLnRvcEdyb3VwLnNldHVwTG9naWMoKSxvLl9zZXRFbXB0eUxpc3RlbmVyKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKSxvLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8by5zLmR0LmRyYXcoKSxvLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdy5kdHNiIixmdW5jdGlvbigpe28uX2NoZWNrQ2xlYXIoKSxvLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSEwLG8ucy50b3BHcm91cC5yZWRyYXdDb250ZW50cygpLG8ucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITEsby5zLnRvcEdyb3VwLnNldHVwTG9naWMoKSxvLl9zZXRFbXB0eUxpc3RlbmVyKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKX0pLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1yZWRyYXdMb2dpYyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLXJlZHJhd0xvZ2ljLmR0c2IiLGZ1bmN0aW9uKCl7by5zLnRvcEdyb3VwLnJlZHJhd0xvZ2ljKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKX0pLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1hZGQiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1hZGQuZHRzYiIsZnVuY3Rpb24oKXt2YXIgZj1vLnMudG9wR3JvdXAuY291bnQoKTtvLl91cGRhdGVUaXRsZShmKSxvLl9maWx0ZXJDaGFuZ2VkKGYpLG8uX2NoZWNrQ2xlYXIoKX0pLHRoaXMucy5kdC5vbigicG9zdEVkaXQuZHRzYiBwb3N0Q3JlYXRlLmR0c2IgcG9zdFJlbW92ZS5kdHNiIixmdW5jdGlvbigpe28ucy50b3BHcm91cC5yZWRyYXdDb250ZW50cygpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWNsZWFyQ29udGVudHMiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1jbGVhckNvbnRlbnRzLmR0c2IiLGZ1bmN0aW9uKCl7by5fc2V0VXAoITEpLG8uX2ZpbHRlckNoYW5nZWQoMCksby5zLmR0LmRyYXcoKX0pfSxoLnByb3RvdHlwZS5fc2V0RW1wdHlMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5zLnRvcEdyb3VwLmRvbS5hZGQub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5fY2hlY2tDbGVhcigpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe28uZG9tLmNsZWFyQWxsLnJlbW92ZSgpfSl9LGgudmVyc2lvbj0iMS43LjEiLGguY2xhc3Nlcz17YnV0dG9uOiJkdHNiLWJ1dHRvbiIsY2xlYXJBbGw6ImR0c2ItY2xlYXJBbGwiLGNvbnRhaW5lcjoiZHRzYi1zZWFyY2hCdWlsZGVyIixpbnB1dEJ1dHRvbjoiZHRzYi1pcHRidG4iLHRpdGxlOiJkdHNiLXRpdGxlIix0aXRsZVJvdzoiZHRzYi10aXRsZVJvdyJ9LGguZGVmYXVsdHM9e2NvbHVtbnM6ITAsY29uZGl0aW9uczp7ZGF0ZTphLmRhdGVDb25kaXRpb25zLGh0bWw6YS5zdHJpbmdDb25kaXRpb25zLCJodG1sLW51bSI6YS5udW1Db25kaXRpb25zLCJodG1sLW51bS1mbXQiOmEubnVtRm10Q29uZGl0aW9ucyxsdXhvbjphLmx1eG9uRGF0ZUNvbmRpdGlvbnMsbW9tZW50OmEubW9tZW50RGF0ZUNvbmRpdGlvbnMsbnVtOmEubnVtQ29uZGl0aW9ucywibnVtLWZtdCI6YS5udW1GbXRDb25kaXRpb25zLHN0cmluZzphLnN0cmluZ0NvbmRpdGlvbnN9LGRlcHRoTGltaXQ6ITEsZW50ZXJTZWFyY2g6ITEsZmlsdGVyQ2hhbmdlZDp2b2lkIDAsZ3JleXNjYWxlOiExLGxpdmVTZWFyY2g6ITAsaTE4bjp7YWRkOiJBZGQgQ29uZGl0aW9uIixidXR0b246ezA6IlNlYXJjaCBCdWlsZGVyIixfOiJTZWFyY2ggQnVpbGRlciAoJWQpIn0sY2xlYXJBbGw6IkNsZWFyIEFsbCIsY29uZGl0aW9uOiJDb25kaXRpb24iLGNvbmRpdGlvbnM6e2FycmF5Ontjb250YWluczoiQ29udGFpbnMiLGVtcHR5OiJFbXB0eSIsZXF1YWxzOiJFcXVhbHMiLG5vdDoiTm90Iixub3RFbXB0eToiTm90IEVtcHR5Iix3aXRob3V0OiJXaXRob3V0In0sZGF0ZTp7YWZ0ZXI6IkFmdGVyIixiZWZvcmU6IkJlZm9yZSIsYmV0d2VlbjoiQmV0d2VlbiIsZW1wdHk6IkVtcHR5IixlcXVhbHM6IkVxdWFscyIsbm90OiJOb3QiLG5vdEJldHdlZW46Ik5vdCBCZXR3ZWVuIixub3RFbXB0eToiTm90IEVtcHR5In0sbnVtYmVyOntiZXR3ZWVuOiJCZXR3ZWVuIixlbXB0eToiRW1wdHkiLGVxdWFsczoiRXF1YWxzIixndDoiR3JlYXRlciBUaGFuIixndGU6IkdyZWF0ZXIgVGhhbiBFcXVhbCBUbyIsbHQ6Ikxlc3MgVGhhbiIsbHRlOiJMZXNzIFRoYW4gRXF1YWwgVG8iLG5vdDoiTm90Iixub3RCZXR3ZWVuOiJOb3QgQmV0d2VlbiIsbm90RW1wdHk6Ik5vdCBFbXB0eSJ9LHN0cmluZzp7Y29udGFpbnM6IkNvbnRhaW5zIixlbXB0eToiRW1wdHkiLGVuZHNXaXRoOiJFbmRzIFdpdGgiLGVxdWFsczoiRXF1YWxzIixub3Q6Ik5vdCIsbm90Q29udGFpbnM6IkRvZXMgTm90IENvbnRhaW4iLG5vdEVtcHR5OiJOb3QgRW1wdHkiLG5vdEVuZHNXaXRoOiJEb2VzIE5vdCBFbmQgV2l0aCIsbm90U3RhcnRzV2l0aDoiRG9lcyBOb3QgU3RhcnQgV2l0aCIsc3RhcnRzV2l0aDoiU3RhcnRzIFdpdGgifX0sZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxvZ2ljOiJBTkQiLG9ydGhvZ29uYWw6e2Rpc3BsYXk6ImRpc3BsYXkiLHNlYXJjaDoiZmlsdGVyIn0scHJlRGVmaW5lZDohMX0saH0oKTtUKGFyKSxwKGFyKSxzKGFyKTt2YXIgaz1hci5mbi5kYXRhVGFibGU7c3QuU2VhcmNoQnVpbGRlcj13LGsuU2VhcmNoQnVpbGRlcj13LHN0Lkdyb3VwPWIsay5Hcm91cD1iLHN0LkNyaXRlcmlhPWEsay5Dcml0ZXJpYT1hO3ZhciBQPXN0LkFwaS5yZWdpc3RlcjtzdC5leHQuc2VhcmNoQnVpbGRlcj17Y29uZGl0aW9uczp7fX0sc3QuZXh0LmJ1dHRvbnMuc2VhcmNoQnVpbGRlcj17YWN0aW9uOmZ1bmN0aW9uKGgsbyxmLEMpe3RoaXMucG9wb3ZlcihDLl9zZWFyY2hCdWlsZGVyLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pO3ZhciBCPUMuX3NlYXJjaEJ1aWxkZXIucy50b3BHcm91cDtCIT09dm9pZCAwJiZCLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cy1ub0RyYXciKSxCLnMuY3JpdGVyaWEubGVuZ3RoPT09MCYmYXIoIi4iK2FyLmZuLmRhdGFUYWJsZS5Hcm91cC5jbGFzc2VzLmFkZC5yZXBsYWNlKC8gL2csIi4iKSkuY2xpY2soKX0sY29uZmlnOnt9LGluaXQ6ZnVuY3Rpb24oaCxvLGYpe3ZhciBDPW5ldyBzdC5TZWFyY2hCdWlsZGVyKGgsYXIuZXh0ZW5kKHtmaWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKEIsdSl7aC5idXR0b24obykudGV4dCh1KX19LGYuY29uZmlnKSk7aC5idXR0b24obykudGV4dChmLnRleHR8fGguaTE4bigic2VhcmNoQnVpbGRlci5idXR0b24iLEMuYy5pMThuLmJ1dHRvbiwwKSksZi5fc2VhcmNoQnVpbGRlcj1DfSx0ZXh0Om51bGx9LFAoInNlYXJjaEJ1aWxkZXIuZ2V0RGV0YWlscygpIixmdW5jdGlvbihoKXtoPT09dm9pZCAwJiYoaD0hMSk7dmFyIG89dGhpcy5jb250ZXh0WzBdO3JldHVybiBvLl9zZWFyY2hCdWlsZGVyP28uX3NlYXJjaEJ1aWxkZXIuZ2V0RGV0YWlscyhoKTpudWxsfSksUCgic2VhcmNoQnVpbGRlci5yZWJ1aWxkKCkiLGZ1bmN0aW9uKGgpe3ZhciBvPXRoaXMuY29udGV4dFswXTtyZXR1cm4gby5fc2VhcmNoQnVpbGRlcj09PXZvaWQgMD9udWxsOihvLl9zZWFyY2hCdWlsZGVyLnJlYnVpbGQoaCksdGhpcyl9KSxQKCJzZWFyY2hCdWlsZGVyLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3ZhciBoPXRoaXMuY29udGV4dFswXTtyZXR1cm4gaC5fc2VhcmNoQnVpbGRlcj9oLl9zZWFyY2hCdWlsZGVyLmdldE5vZGUoKTpudWxsfSk7ZnVuY3Rpb24gRihoLG8pe3ZhciBmPW5ldyBzdC5BcGkoaCksQz1vfHxmLmluaXQoKS5zZWFyY2hCdWlsZGVyfHxzdC5kZWZhdWx0cy5zZWFyY2hCdWlsZGVyLEI9bmV3IHcoZixDKSx1PUIuZ2V0Tm9kZSgpO3JldHVybiB1fWFyKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbihoLG8pe2gubmFtZXNwYWNlPT09ImR0IiYmKG8ub0luaXQuc2VhcmNoQnVpbGRlcnx8c3QuZGVmYXVsdHMuc2VhcmNoQnVpbGRlcikmJihvLl9zZWFyY2hCdWlsZGVyfHxGKG8pKX0pLHN0LmV4dC5mZWF0dXJlLnB1c2goe2NGZWF0dXJlOiJRIixmbkluaXQ6Rn0pLHN0LmZlYXR1cmUmJnN0LmZlYXR1cmUucmVnaXN0ZXIoInNlYXJjaEJ1aWxkZXIiLEYpfSkoKTt2YXIgSGw9bmUoaWUoKSwxKTt2YXIgTHM9bmUoaWUoKSwxKTt2YXIgcWU9THMuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiByKGcpe3Q9ZyxlPWcuZm4uZGF0YVRhYmxlfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhfLFMsTixSLEwpe3ZhciBYPXRoaXM7aWYoTD09PXZvaWQgMCYmKEw9bnVsbCksIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIxLjEwLjAiKSl0aHJvdyBuZXcgRXJyb3IoIlNlYXJjaFBhbmUgcmVxdWlyZXMgRGF0YVRhYmxlcyAxLjEwIG9yIG5ld2VyIik7aWYoIWUuc2VsZWN0KXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBTZWxlY3QiKTt2YXIgaj1uZXcgZS5BcGkoXyk7dGhpcy5jbGFzc2VzPXQuZXh0ZW5kKCEwLHt9LGcuY2xhc3NlcyksdGhpcy5jPXQuZXh0ZW5kKCEwLHt9LGcuZGVmYXVsdHMsUyxMKSxTJiZTLmhpZGVDb3VudCYmUy52aWV3Q291bnQ9PT12b2lkIDAmJih0aGlzLmMudmlld0NvdW50PSF0aGlzLmMuaGlkZUNvdW50KTt2YXIgRz1qLmNvbHVtbnMoKS5lcSgwKS50b0FycmF5KCkubGVuZ3RoO3RoaXMucz17Y29sRXhpc3RzOk48Ryxjb2xPcHRzOnZvaWQgMCxjdXN0b21QYW5lU2V0dGluZ3M6TCxkaXNwbGF5ZWQ6ITEsZHQ6aixkdFBhbmU6dm9pZCAwLGZpcnN0U2V0OiEwLGluZGV4Ok4saW5kZXhlczpbXSxsaXN0U2V0OiExLG5hbWU6dm9pZCAwLHJvd0RhdGE6e2FycmF5RmlsdGVyOltdLGFycmF5T3JpZ2luYWw6W10sYmluczp7fSxiaW5zT3JpZ2luYWw6e30sZmlsdGVyTWFwOm5ldyBNYXAsdG90YWxPcHRpb25zOjB9LHNjcm9sbFRvcDowLHNlYXJjaEZ1bmN0aW9uOnZvaWQgMCxzZWxlY3Rpb25zOltdLHNlcnZlclNlbGVjdDpbXSxzZXJ2ZXJTZWxlY3Rpbmc6ITEsdGFibGVMZW5ndGg6bnVsbCx1cGRhdGluZzohMX0sdGhpcy5zLmNvbE9wdHM9dGhpcy5zLmNvbEV4aXN0cz90aGlzLl9nZXRPcHRpb25zKCk6dGhpcy5fZ2V0Qm9udXNPcHRpb25zKCksdGhpcy5kb209e2J1dHRvbkdyb3VwOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b25Hcm91cCksY2xlYXI6dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPiYjMjE1OzwvYnV0dG9uPicpLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVCdXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckJ1dHRvbikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY2xlYXJQYW5lIix0aGlzLmMuaTE4bi5jbGVhclBhbmUpKSxjb2xsYXBzZUJ1dHRvbjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PHNwYW4gY2xhc3M9IicrdGhpcy5jbGFzc2VzLmNhcmV0KyciPiYjeDVlOzwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQnV0dG9uKSxjb250YWluZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbnRhaW5lcikuYWRkQ2xhc3ModGhpcy5zLmNvbE9wdHMuY2xhc3NOYW1lKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubGF5b3V0KyhwYXJzZUludCh0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMV0sMTApPDEwP3RoaXMuYy5sYXlvdXQ6dGhpcy5jLmxheW91dC5zcGxpdCgiLSIpWzBdKyItOSIpKS5hZGRDbGFzcyh0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZT90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZToiIiksY291bnRCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvdW50QnV0dG9uKSxkdFA6dCgnPHRhYmxlIHdpZHRoPSIxMDAlIj48dGhlYWQ+PHRyPjx0aD4nKyh0aGlzLnMuY29sRXhpc3RzP3QodGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmhlYWRlcigpKS50ZXh0KCk6dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXJ8fCJDdXN0b20gUGFuZSIpKyI8L3RoPjx0aC8+PC90cj48L3RoZWFkPjwvdGFibGU+IiksbG93ZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvdzIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pLG5hbWVCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hbWVCdXR0b24pLHBhbmVzQ29udGFpbmVyOnQoUiksc2VhcmNoQm94OnQoIjxpbnB1dC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVJbnB1dEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaCksc2VhcmNoQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3Bhbj48L3NwYW4+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaEljb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKSxzZWFyY2hDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2hDb250KSxzZWFyY2hMYWJlbENvbnQ6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaExhYmVsQ29udCksdG9wUm93OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50b3BSb3cpLHVwcGVyOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zdWJSb3cxKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKX0sdGhpcy5zLmNvbE9wdHMubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY29sT3B0cy5uYW1lOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm5hbWU6dGhpcy5zLm5hbWU9dGhpcy5zLmNvbEV4aXN0cz90KHRoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS5oZWFkZXIoKSkudGV4dCgpOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyfHwiQ3VzdG9tIFBhbmUiO3ZhciBhdD10aGlzLnMuZHQudGFibGUoMCkubm9kZSgpO3JldHVybiB0aGlzLnMuc2VhcmNoRnVuY3Rpb249ZnVuY3Rpb24oSix0dCx5dCl7aWYoWC5zLnNlbGVjdGlvbnMubGVuZ3RoPT09MHx8Si5uVGFibGUhPT1hdClyZXR1cm4hMDt2YXIgVHQ9bnVsbDtyZXR1cm4gWC5zLmNvbEV4aXN0cyYmKFR0PXR0W1gucy5pbmRleF0sWC5zLmNvbE9wdHMub3J0aG9nb25hbC5maWx0ZXIhPT0iZmlsdGVyIiYmKFR0PVgucy5yb3dEYXRhLmZpbHRlck1hcC5nZXQoeXQpLFR0IGluc3RhbmNlb2YgdC5mbi5kYXRhVGFibGUuQXBpJiYoVHQ9VHQudG9BcnJheSgpKSkpLFguX3NlYXJjaChUdCx5dCl9LHQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2gucHVzaCh0aGlzLnMuc2VhcmNoRnVuY3Rpb24pLHRoaXMuYy5jbGVhciYmdGhpcy5kb20uY2xlYXIub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIEo9WC5kb20uY29udGFpbmVyLmZpbmQoIi4iK1guY2xhc3Nlcy5zZWFyY2gucmVwbGFjZSgvXHMrL2csIi4iKSk7Si5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxYLmNsZWFyUGFuZSgpfSksdGhpcy5zLmR0Lm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIFguYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImJ1dHRvbnMtYWN0aW9uLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIFguYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImNvbHVtbi1yZW9yZGVyLmR0c3AiLGZ1bmN0aW9uKEosdHQseXQpe1gucy5pbmRleD15dC5tYXBwaW5nW1gucy5pbmRleF19KSx0aGlzfXJldHVybiBnLnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oXyxTLE4sUixMLFgsail7WHx8KFg9dGhpcy5zLnJvd0RhdGEuYmluc1tTXT90aGlzLnMucm93RGF0YS5iaW5zW1NdOjApLGp8fChqPXRoaXMuX2dldFNob3duKFMpKTtmb3IodmFyIEcsYXQ9MCxKPXRoaXMucy5pbmRleGVzO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTt0dC5maWx0ZXI9PT1TJiYoRz10dC5pbmRleCl9cmV0dXJuIEc9PT12b2lkIDAmJihHPXRoaXMucy5pbmRleGVzLmxlbmd0aCx0aGlzLnMuaW5kZXhlcy5wdXNoKHtmaWx0ZXI6UyxpbmRleDpHfSkpLHRoaXMucy5kdFBhbmUucm93LmFkZCh7Y2xhc3NOYW1lOkwsZGlzcGxheTpfIT09IiI/Xzp0aGlzLmVtcHR5TWVzc2FnZSgpLGZpbHRlcjpTLGluZGV4Okcsc2hvd246aixzb3J0Ok4sdG90YWw6WCx0eXBlOlJ9KX0sZy5wcm90b3R5cGUuYWRqdXN0VG9wUm93PWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3dzQ29udGFpbmVyLnJlcGxhY2UoL1xzKy9nLCIuIikpLFM9dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3cxLnJlcGxhY2UoL1xzKy9nLCIuIikpLE49dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3cyLnJlcGxhY2UoL1xzKy9nLCIuIikpLFI9dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy50b3BSb3cucmVwbGFjZSgvXHMrL2csIi4iKSk7KHQoX1swXSkud2lkdGgoKTwyNTJ8fHQoUlswXSkud2lkdGgoKTwyNTIpJiZ0KF9bMF0pLndpZHRoKCkhPT0wPyh0KF9bMF0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3cpLHQoU1swXSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1NlYXJjaCksdChOWzBdKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93QnV0dG9uKSk6KHQoX1swXSkucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvdyksdChTWzBdKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKSx0KE5bMF0pLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTdWIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pKX0sZy5wcm90b3R5cGUuY2xlYXJEYXRhPWZ1bmN0aW9uKCl7dGhpcy5zLnJvd0RhdGE9e2FycmF5RmlsdGVyOltdLGFycmF5T3JpZ2luYWw6W10sYmluczp7fSxiaW5zT3JpZ2luYWw6e30sZmlsdGVyTWFwOm5ldyBNYXAsdG90YWxPcHRpb25zOjB9fSxnLnByb3RvdHlwZS5jbGVhclBhbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCksdGhpcy51cGRhdGVUYWJsZSgpLHRoaXN9LGcucHJvdG90eXBlLmNvbGxhcHNlPWZ1bmN0aW9uKCl7dmFyIF89dGhpczshdGhpcy5zLmRpc3BsYXllZHx8IXRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMHx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2U9PT0hMXx8KHQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLmRvbS50b3BSb3cuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJvcmRlcmVkKSx0aGlzLmRvbS5uYW1lQnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY291bnRCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5zZWFyY2hCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucm90YXRlZCksdGhpcy5kb20udG9wUm93Lm9uZSgiY2xpY2suZHRzcCIsZnVuY3Rpb24oKXtyZXR1cm4gXy5zaG93KCl9KSx0aGlzLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKSl9LGcucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnMuZHRQYW5lJiZ0aGlzLnMuZHRQYW5lLm9mZigiLmR0c3AiKSx0aGlzLnMuZHQub2ZmKCIuZHRzcCIpLHRoaXMuZG9tLmNsZWFyLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5uYW1lQnV0dG9uLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb3VudEJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5vZmYoIi5kdHNwIiksdCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb250YWluZXIuZGV0YWNoKCk7Zm9yKHZhciBfPXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZih0aGlzLnMuc2VhcmNoRnVuY3Rpb24pO18hPT0tMTspdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5zcGxpY2UoXywxKSxfPXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZih0aGlzLnMuc2VhcmNoRnVuY3Rpb24pO3RoaXMucy5kdFBhbmUmJnRoaXMucy5kdFBhbmUuZGVzdHJveSgpLHRoaXMucy5saXN0U2V0PSExfSxnLnByb3RvdHlwZS5lbXB0eU1lc3NhZ2U9ZnVuY3Rpb24oKXt2YXIgXz10aGlzLmMuaTE4bi5lbXB0eU1lc3NhZ2U7cmV0dXJuIHRoaXMuYy5lbXB0eU1lc3NhZ2UmJihfPXRoaXMuYy5lbXB0eU1lc3NhZ2UpLHRoaXMucy5jb2xPcHRzLmVtcHR5TWVzc2FnZSE9PSExJiZ0aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UhPT1udWxsJiYoXz10aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UpLHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eU1lc3NhZ2UiLF8pfSxnLnByb3RvdHlwZS5nZXRQYW5lQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0UGFuZT90aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg6MH0sZy5wcm90b3R5cGUucmVidWlsZFBhbmU9ZnVuY3Rpb24oXyxTKXtfPT09dm9pZCAwJiYoXz1udWxsKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5jbGVhckRhdGEoKTt2YXIgTj1bXTt0aGlzLnMuc2VydmVyU2VsZWN0PVtdO3ZhciBSPW51bGw7cmV0dXJuIHRoaXMucy5kdFBhbmUmJihTJiYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGU/dGhpcy5zLnNlcnZlclNlbGVjdD10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKTpOPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpKSx0aGlzLnMuZHRQYW5lLmNsZWFyKCkuZGVzdHJveSgpLFI9dGhpcy5kb20uY29udGFpbmVyLnByZXYoKSx0aGlzLmRlc3Ryb3koKSx0aGlzLnMuZHRQYW5lPXZvaWQgMCx0LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaEZ1bmN0aW9uKSksdGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITEsdGhpcy5fYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJTZWxlY3Q6TixfLFIpLHRoaXN9LGcucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihfKXt0aGlzLmMubGF5b3V0PV8sdGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNob3cpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLmFkZENsYXNzKHRoaXMucy5jb2xPcHRzLmNsYXNzTmFtZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxheW91dCsocGFyc2VJbnQoXy5zcGxpdCgiLSIpWzFdLDEwKTwxMD9fOl8uc3BsaXQoIi0iKVswXSsiLTkiKSkuYWRkQ2xhc3ModGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyE9PW51bGwmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lOiIiKSx0aGlzLmFkanVzdFRvcFJvdygpfSxnLnByb3RvdHlwZS5zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgXz10aGlzO3RoaXMucy5kdFBhbmUmJih0aGlzLnMuZHRQYW5lLm9mZigic2VsZWN0LmR0c3AiKS5vbigic2VsZWN0LmR0c3AiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KF8ucy5kZXNlbGVjdFRpbWVvdXQpLF8uX3VwZGF0ZVNlbGVjdGlvbighXy5zLnVwZGF0aW5nKSxfLmRvbS5jbGVhci5yZW1vdmVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIil9KSx0aGlzLnMuZHRQYW5lLm9mZigiZGVzZWxlY3QuZHRzcCIpLm9uKCJkZXNlbGVjdC5kdHNwIixmdW5jdGlvbigpe18ucy5kZXNlbGVjdFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe18uX3VwZGF0ZVNlbGVjdGlvbighMCksXy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoPT09MCYmXy5kb20uY2xlYXIuYWRkQ2xhc3MoXy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKX0sNTApfSksdGhpcy5zLmZpcnN0U2V0JiYodGhpcy5zLmZpcnN0U2V0PSExLHRoaXMucy5kdC5vbigic3RhdGVTYXZlUGFyYW1zLmR0c3AiLGZ1bmN0aW9uKFMsTixSKXtpZih0LmlzRW1wdHlPYmplY3QoUikpe18ucy5kdFBhbmUuc3RhdGUuY2xlYXIoKTtyZXR1cm59dmFyIEwsWCxqPVtdLEcsYXQsSjtfLnMuZHRQYW5lJiYoaj1fLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLm1hcChmdW5jdGlvbih5dCl7cmV0dXJuIHl0LmZpbHRlciE9PW51bGw/eXQuZmlsdGVyLnRvU3RyaW5nKCk6bnVsbH0pLnRvQXJyYXkoKSxhdD1fLmRvbS5zZWFyY2hCb3gudmFsKCksWD1fLnMuZHRQYW5lLm9yZGVyKCksTD1fLnMucm93RGF0YS5iaW5zT3JpZ2luYWwsSj1fLnMucm93RGF0YS5hcnJheU9yaWdpbmFsLEc9Xy5kb20uY29sbGFwc2VCdXR0b24uaGFzQ2xhc3MoXy5jbGFzc2VzLnJvdGF0ZWQpKSxSLnNlYXJjaFBhbmVzPT09dm9pZCAwJiYoUi5zZWFyY2hQYW5lcz17fSksUi5zZWFyY2hQYW5lcy5wYW5lcz09PXZvaWQgMCYmKFIuc2VhcmNoUGFuZXMucGFuZXM9W10pO2Zvcih2YXIgdHQ9MDt0dDxSLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDt0dCsrKVIuc2VhcmNoUGFuZXMucGFuZXNbdHRdLmlkPT09Xy5zLmluZGV4JiYoUi5zZWFyY2hQYW5lcy5wYW5lcy5zcGxpY2UodHQsMSksdHQtLSk7Ui5zZWFyY2hQYW5lcy5wYW5lcy5wdXNoKHthcnJheUZpbHRlcjpKLGJpbnM6TCxjb2xsYXBzZWQ6RyxpZDpfLnMuaW5kZXgsb3JkZXI6WCxzZWFyY2hUZXJtOmF0LHNlbGVjdGVkOmp9KX0pKSx0aGlzLnMuZHRQYW5lLm9mZigidXNlci1zZWxlY3QuZHRzcCIpLm9uKCJ1c2VyLXNlbGVjdC5kdHNwIixmdW5jdGlvbihTLE4sUixMLFgpe1guc3RvcFByb3BhZ2F0aW9uKCl9KSx0aGlzLnMuZHRQYW5lLm9mZigiZHJhdy5kdHNwIikub24oImRyYXcuZHRzcCIsZnVuY3Rpb24oKXtyZXR1cm4gXy5hZGp1c3RUb3BSb3coKX0pLHRoaXMuZG9tLm5hbWVCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9Xy5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO18ucy5kdFBhbmUub3JkZXIoWzAsUz09PSJhc2MiPyJkZXNjIjoiYXNjIl0pLmRyYXcoKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9Xy5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO18ucy5kdFBhbmUub3JkZXIoWzEsUz09PSJhc2MiPyJkZXNjIjoiYXNjIl0pLmRyYXcoKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKFMpe1Muc3RvcFByb3BhZ2F0aW9uKCk7dmFyIE49dChfLnMuZHRQYW5lLnRhYmxlKCkuY29udGFpbmVyKCkpO04udG9nZ2xlQ2xhc3MoXy5jbGFzc2VzLmhpZGRlbiksXy5kb20udG9wUm93LnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5ib3JkZXJlZCksXy5kb20ubmFtZUJ1dHRvbi50b2dnbGVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLF8uZG9tLmNvdW50QnV0dG9uLnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksXy5kb20uc2VhcmNoQnV0dG9uLnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksXy5kb20uY29sbGFwc2VCdXR0b24udG9nZ2xlQ2xhc3MoXy5jbGFzc2VzLnJvdGF0ZWQpLE4uaGFzQ2xhc3MoXy5jbGFzc2VzLmhpZGRlbik/Xy5kb20udG9wUm93Lm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3JldHVybiBfLmRvbS5jb2xsYXBzZUJ1dHRvbi5jbGljaygpfSk6Xy5kb20udG9wUm93Lm9mZigiY2xpY2suZHRzcCIpLF8ucy5kdC5zdGF0ZS5zYXZlKCksXy5kb20udG9wUm93LnRyaWdnZXIoImNvbGxhcHNlLmR0c3BzIil9KSx0aGlzLmRvbS5jbGVhci5vZmYoImNsaWNrLmR0c3AiKS5vbigiY2xpY2suZHRzcCIsZnVuY3Rpb24oKXt2YXIgUz1fLmRvbS5jb250YWluZXIuZmluZCgiLiIrXy5jbGFzc2VzLnNlYXJjaC5yZXBsYWNlKC8gL2csIi4iKSk7Uy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxfLmNsZWFyUGFuZSgpfSksdGhpcy5kb20uc2VhcmNoQnV0dG9uLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3JldHVybiBfLmRvbS5zZWFyY2hCb3guZm9jdXMoKX0pLHRoaXMuZG9tLnNlYXJjaEJveC5vZmYoImNsaWNrLmR0c3AiKS5vbigiaW5wdXQuZHRzcCIsZnVuY3Rpb24oKXt2YXIgUz1fLmRvbS5zZWFyY2hCb3gudmFsKCk7Xy5zLmR0UGFuZS5zZWFyY2goUykuZHJhdygpLHR5cGVvZiBTPT0ic3RyaW5nIiYmKFMubGVuZ3RoPjB8fFMubGVuZ3RoPT09MCYmXy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoPjApP18uZG9tLmNsZWFyLnJlbW92ZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTpfLmRvbS5jbGVhci5hZGRDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLF8ucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLnMuZHRQYW5lLnNlbGVjdC5zdHlsZSh0aGlzLnMuY29sT3B0cy5kdE9wdHMmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWxlY3QmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWxlY3Quc3R5bGU/dGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdC5zdHlsZTp0aGlzLmMuZHRPcHRzJiZ0aGlzLmMuZHRPcHRzLnNlbGVjdCYmdGhpcy5jLmR0T3B0cy5zZWxlY3Quc3R5bGU/dGhpcy5jLmR0T3B0cy5zZWxlY3Quc3R5bGU6Im9zIikpfSxnLnByb3RvdHlwZS5fc2VydmVyUG9wdWxhdGU9ZnVuY3Rpb24oXyl7Xy50YWJsZUxlbmd0aD8odGhpcy5zLnRhYmxlTGVuZ3RoPV8udGFibGVMZW5ndGgsdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPXRoaXMucy50YWJsZUxlbmd0aCk6KHRoaXMucy50YWJsZUxlbmd0aD09PW51bGx8fHRoaXMucy5kdC5yb3dzKClbMF0ubGVuZ3RoPnRoaXMucy50YWJsZUxlbmd0aCkmJih0aGlzLnMudGFibGVMZW5ndGg9dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgsdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPXRoaXMucy50YWJsZUxlbmd0aCk7dmFyIFM9dGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmRhdGFTcmMoKTtpZihfLnNlYXJjaFBhbmVzLm9wdGlvbnNbU10pZm9yKHZhciBOPTAsUj1fLnNlYXJjaFBhbmVzLm9wdGlvbnNbU107TjxSLmxlbmd0aDtOKyspe3ZhciBMPVJbTl07dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIucHVzaCh7ZGlzcGxheTpMLmxhYmVsLGZpbHRlcjpMLnZhbHVlLHNvcnQ6TC5sYWJlbCx0eXBlOkwubGFiZWx9KSx0aGlzLnMucm93RGF0YS5iaW5zW0wudmFsdWVdPUwudG90YWx9dmFyIFg9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLGo9dGhpcy5fdW5pcXVlUmF0aW8oWCx0aGlzLnMudGFibGVMZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP2o+dGhpcy5jLnRocmVzaG9sZDpqPnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZCl8fHRoaXMucy5jb2xPcHRzLnNob3chPT0hMCYmWDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn10aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zLHRoaXMucy5kaXNwbGF5ZWQ9ITB9LGcucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLnMuZGlzcGxheWVkJiYodGhpcy5kb20udG9wUm93LnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5ib3JkZXJlZCksdGhpcy5kb20ubmFtZUJ1dHRvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLHRoaXMuZG9tLmNvdW50QnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLnJvdGF0ZWQpLHQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKSl9LGcucHJvdG90eXBlLl91bmlxdWVSYXRpbz1mdW5jdGlvbihfLFMpe3JldHVybiBTPjAmJih0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM+MCYmIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLnRhYmxlTGVuZ3RoPjApP18vdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zOjF9LGcucHJvdG90eXBlLnVwZGF0ZVRhYmxlPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBTLmZpbHRlcn0pO3RoaXMucy5zZWxlY3Rpb25zPV8sdGhpcy5fc2VhcmNoRXh0cmFzKCl9LGcucHJvdG90eXBlLl9nZXRDb21wYXJpc29uUm93cz1mdW5jdGlvbigpe3ZhciBfPXRoaXMucy5jb2xPcHRzLm9wdGlvbnM/dGhpcy5zLmNvbE9wdHMub3B0aW9uczp0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM/dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zOnZvaWQgMDtpZihfIT09dm9pZCAwKXt2YXIgUz10aGlzLnMuZHQucm93cygpLE49Uy5kYXRhKCkudG9BcnJheSgpLFI9W107dGhpcy5zLmR0UGFuZS5jbGVhcigpLHRoaXMucy5pbmRleGVzPVtdO2Zvcih2YXIgTD0wLFg9XztMPFgubGVuZ3RoO0wrKyl7dmFyIGo9WFtMXSxHPWoubGFiZWwhPT0iIj9qLmxhYmVsOnRoaXMuZW1wdHlNZXNzYWdlKCksYXQ9e2NsYXNzTmFtZTpqLmNsYXNzTmFtZSxkaXNwbGF5OkcsZmlsdGVyOnR5cGVvZiBqLnZhbHVlPT0iZnVuY3Rpb24iP2oudmFsdWU6W10sc29ydDpqLm9yZGVyIT09dm9pZCAwP2oub3JkZXI6Ryx0b3RhbDowLHR5cGU6R307aWYodHlwZW9mIGoudmFsdWU9PSJmdW5jdGlvbiIpe2Zvcih2YXIgSj0wO0o8Ti5sZW5ndGg7SisrKWoudmFsdWUuY2FsbCh0aGlzLnMuZHQsTltKXSxTWzBdW0pdKSYmYXQudG90YWwrKzt0eXBlb2YgYXQuZmlsdGVyIT0iZnVuY3Rpb24iJiZhdC5maWx0ZXIucHVzaChqLmZpbHRlcil9Ui5wdXNoKHRoaXMuYWRkUm93KGF0LmRpc3BsYXksYXQuZmlsdGVyLGF0LnNvcnQsYXQudHlwZSxhdC5jbGFzc05hbWUsYXQudG90YWwpKX1yZXR1cm4gUn19LGcucHJvdG90eXBlLl9nZXRNZXNzYWdlPWZ1bmN0aW9uKF8pe3JldHVybiB0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KS5yZXBsYWNlKC97dG90YWx9L2csXy50b3RhbCl9LGcucHJvdG90eXBlLl9nZXRTaG93bj1mdW5jdGlvbihfKXt9LGcucHJvdG90eXBlLl9nZXRQYW5lQ29uZmlnPWZ1bmN0aW9uKCl7dmFyIF89dGhpcyxTPWUuU2Nyb2xsZXIsTj10aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vTGFuZ3VhZ2U7cmV0dXJuIE4udXJsPXZvaWQgMCxOLnNVcmw9dm9pZCAwLHtjb2x1bW5EZWZzOlt7Y2xhc3NOYW1lOiJkdHNwLW5hbWVDb2x1bW4iLGRhdGE6ImRpc3BsYXkiLHJlbmRlcjpmdW5jdGlvbihSLEwsWCl7aWYoTD09PSJzb3J0IilyZXR1cm4gWC5zb3J0O2lmKEw9PT0idHlwZSIpcmV0dXJuIFgudHlwZTt2YXIgaj1fLl9nZXRNZXNzYWdlKFgpLEc9JzxzcGFuIGNsYXNzPSInK18uY2xhc3Nlcy5waWxsKyciPicraisiPC9zcGFuPiI7cmV0dXJuKCFfLmMudmlld0NvdW50fHwhXy5zLmNvbE9wdHMudmlld0NvdW50KSYmKEc9IiIpLEw9PT0iZmlsdGVyIj90eXBlb2YgUj09InN0cmluZyImJlIubWF0Y2goLzxbXj5dKj4vKSE9PW51bGw/Ui5yZXBsYWNlKC88W14+XSo+L2csIiIpOlI6JzxkaXYgY2xhc3M9IicrXy5jbGFzc2VzLm5hbWVDb250KyciPjxzcGFuIHRpdGxlPSInKyh0eXBlb2YgUj09InN0cmluZyImJlIubWF0Y2goLzxbXj5dKj4vKSE9PW51bGw/Ui5yZXBsYWNlKC88W14+XSo+L2csIiIpOlIpKyciIGNsYXNzPSInK18uY2xhc3Nlcy5uYW1lKyciPicrUisiPC9zcGFuPiIrRysiPC9kaXY+In0sdGFyZ2V0czowLHR5cGU6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0/dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uX3NNYW51YWxUeXBlOm51bGx9LHtjbGFzc05hbWU6ImR0c3AtY291bnRDb2x1bW4gIit0aGlzLmNsYXNzZXMuYmFkZ2VQaWxsLGRhdGE6InRvdGFsIixzZWFyY2hhYmxlOiExLHRhcmdldHM6MSx2aXNpYmxlOiExfV0sZGVmZXJSZW5kZXI6ITAsaW5mbzohMSxsYW5ndWFnZTpOLHBhZ2luZzohIVMsc2Nyb2xsWDohMSxzY3JvbGxZOiIyMDBweCIsc2Nyb2xsZXI6ISFTLHNlbGVjdDohMCxzdGF0ZVNhdmU6ISF0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vRmVhdHVyZXMuYlN0YXRlU2F2ZX19LGcucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUYWJsZSgpLHRoaXMucy51cGRhdGluZz0hMCx0aGlzLnMuZHQuZHJhdygpLHRoaXMucy51cGRhdGluZz0hMX0sZy5wcm90b3R5cGUuX3BvcHVsYXRlUGFuZUFycmF5PWZ1bmN0aW9uKF8sUyxOLFIpe1I9PT12b2lkIDAmJihSPXRoaXMucy5yb3dEYXRhLmJpbnMpO3ZhciBMPU4uZmFzdERhdGE7aWYodHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciKXt2YXIgWD1MKF8sdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwpO3RoaXMucy5yb3dEYXRhLmZpbHRlck1hcC5zZXQoXyxYKSx0aGlzLl9hZGRPcHRpb24oWCxYLFgsWCxTLFIpLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrfWVsc2V7dmFyIGo9TChfLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnNlYXJjaCk7aj09PW51bGwmJihqPSIiKSx0eXBlb2Ygaj09InN0cmluZyImJihqPWoucmVwbGFjZSgvPFtePl0qPi9nLCIiKSksdGhpcy5zLnJvd0RhdGEuZmlsdGVyTWFwLnNldChfLGopLFJbal0/KFJbal0rKyx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKyk6KFJbal09MSx0aGlzLl9hZGRPcHRpb24oaixMKF8sdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuZGlzcGxheSksTChfLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnNvcnQpLEwoXyx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC50eXBlKSxTLFIpLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKX19LGcucHJvdG90eXBlLl9yZWxvYWRTZWxlY3Q9ZnVuY3Rpb24oXyl7aWYoXyE9PXZvaWQgMCl7Zm9yKHZhciBTLE49MDtOPF8uc2VhcmNoUGFuZXMucGFuZXMubGVuZ3RoO04rKylpZihfLnNlYXJjaFBhbmVzLnBhbmVzW05dLmlkPT09dGhpcy5zLmluZGV4KXtTPU47YnJlYWt9aWYoUylmb3IodmFyIFI9dGhpcy5zLmR0UGFuZSxMPVIucm93cyh7b3JkZXI6ImluZGV4In0pLmRhdGEoKS5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEouZmlsdGVyIT09bnVsbD9KLmZpbHRlci50b1N0cmluZygpOm51bGx9KS50b0FycmF5KCksWD0wLGo9Xy5zZWFyY2hQYW5lcy5wYW5lc1tTXS5zZWxlY3RlZDtYPGoubGVuZ3RoO1grKyl7dmFyIEc9altYXSxhdD0tMTtHIT09bnVsbCYmKGF0PUwuaW5kZXhPZihHLnRvU3RyaW5nKCkpKSxhdD4tMSYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsUi5yb3coYXQpLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpfX19LGcucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oXyl7dmFyIFM9dGhpcyxOPWZ1bmN0aW9uKEwpe2lmKHN0LnZlcnNpb25DaGVjaygiMiIpKVMucy5kdC5wcm9jZXNzaW5nKEwpO2Vsc2V7dmFyIFg9Uy5zLmR0LnNldHRpbmdzKClbMF0saj1YLm9BcGk7ai5fZm5Qcm9jZXNzaW5nRGlzcGxheShYLCExKX19LFI9ZnVuY3Rpb24oKXtTLnMuc2Nyb2xsVG9wPXQoUy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKSkucGFyZW50KClbMF0uc2Nyb2xsVG9wLFMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYhUy5zLnVwZGF0aW5nP1Mucy5zZXJ2ZXJTZWxlY3Rpbmd8fChTLnMuc2VydmVyU2VsZWN0PVMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLFMucy5kdC5kcmF3KCExKSk6XyYmUy5fbWFrZVNlbGVjdGlvbigpLE4oITEpfTtOKCEwKSxzZXRUaW1lb3V0KFIsMSl9LGcucHJvdG90eXBlLl9hZGRPcHRpb249ZnVuY3Rpb24oXyxTLE4sUixMLFgpe2lmKEFycmF5LmlzQXJyYXkoXyl8fF8gaW5zdGFuY2VvZiBlLkFwaSl7aWYoXyBpbnN0YW5jZW9mIGUuQXBpJiYoXz1fLnRvQXJyYXkoKSxTPVMudG9BcnJheSgpKSxfLmxlbmd0aD09PVMubGVuZ3RoKXtmb3IodmFyIGo9MDtqPF8ubGVuZ3RoO2orKylYW19bal1dP1hbX1tqXV0rKzooWFtfW2pdXT0xLEwucHVzaCh7ZGlzcGxheTpTW2pdLGZpbHRlcjpfW2pdLHNvcnQ6TltqXSx0eXBlOlJbal19KSksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKys7cmV0dXJufXRocm93IG5ldyBFcnJvcigiZGlzcGxheSBhbmQgZmlsdGVyIG5vdCB0aGUgc2FtZSBsZW5ndGgiKX1lbHNlIHR5cGVvZiB0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsPT0ic3RyaW5nIj9YW19dPyhYW19dKyssdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspOihYW19dPTEsTC5wdXNoKHtkaXNwbGF5OlMsZmlsdGVyOl8sc29ydDpOLHR5cGU6Un0pLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKTpMLnB1c2goe2Rpc3BsYXk6UyxmaWx0ZXI6Xyxzb3J0Ok4sdHlwZTpSfSl9LGcucHJvdG90eXBlLl9idWlsZFBhbmU9ZnVuY3Rpb24oXyxTLE4pe3ZhciBSPXRoaXM7Xz09PXZvaWQgMCYmKF89W10pLFM9PT12b2lkIDAmJihTPW51bGwpLE49PT12b2lkIDAmJihOPW51bGwpLHRoaXMucy5zZWxlY3Rpb25zPVtdO3ZhciBMPXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKSxYO2lmKHRoaXMucy5saXN0U2V0JiYoTD10aGlzLnMuZHQuc3RhdGUoKSksdGhpcy5zLmNvbEV4aXN0cyl7dmFyIGo9LTE7aWYoTCYmTC5zZWFyY2hQYW5lcyYmTC5zZWFyY2hQYW5lcy5wYW5lcyl7Zm9yKHZhciBHPTA7RzxMLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDtHKyspaWYoTC5zZWFyY2hQYW5lcy5wYW5lc1tHXS5pZD09PXRoaXMucy5pbmRleCl7aj1HO2JyZWFrfX1pZigodGhpcy5zLmNvbE9wdHMuc2hvdz09PSExfHx0aGlzLnMuY29sT3B0cy5zaG93IT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy5zaG93IT09ITApJiZqPT09LTEpcmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExLCExO2lmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09ITB8fGohPT0tMSkmJih0aGlzLnMuZGlzcGxheWVkPSEwKSwhdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJighU3x8IVMuc2VhcmNoUGFuZXN8fCFTLnNlYXJjaFBhbmVzLm9wdGlvbnMpKXt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5sZW5ndGg9PT0wJiYodGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPTAsdGhpcy5fcG9wdWxhdGVQYW5lKCksdGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcix0aGlzLnMucm93RGF0YS5iaW5zT3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYmlucyk7dmFyIGF0PU9iamVjdC5rZXlzKHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbCkubGVuZ3RoLEo9dGhpcy5fdW5pcXVlUmF0aW8oYXQsdGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP0o+dGhpcy5jLnRocmVzaG9sZDpKPnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZCl8fHRoaXMucy5jb2xPcHRzLnNob3chPT0hMCYmYXQ8PTEpKXt0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5zLmRpc3BsYXllZD0hMTtyZXR1cm59dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zaG93KSx0aGlzLnMuZGlzcGxheWVkPSEwfWVsc2UgUyYmUy5zZWFyY2hQYW5lcyYmUy5zZWFyY2hQYW5lcy5vcHRpb25zJiZ0aGlzLl9zZXJ2ZXJQb3B1bGF0ZShTKX1lbHNlIHRoaXMucy5kaXNwbGF5ZWQ9ITA7dGhpcy5fZGlzcGxheVBhbmUoKSx0aGlzLnMubGlzdFNldHx8dGhpcy5kb20uZHRQLm9uKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcCIsZnVuY3Rpb24ocHQsbXQscnQpe3QuaXNFbXB0eU9iamVjdChSLnMuZHQuc3RhdGUubG9hZGVkKCkpJiZ0LmVhY2gocnQsZnVuY3Rpb24oZ3Qpe2RlbGV0ZSBydFtndF19KX0pLE4hPT1udWxsJiZ0aGlzLmRvbS5wYW5lc0NvbnRhaW5lci5oYXMoTikubGVuZ3RoPjA/dGhpcy5kb20uY29udGFpbmVyLmluc2VydEFmdGVyKE4pOnRoaXMuZG9tLnBhbmVzQ29udGFpbmVyLnByZXBlbmQodGhpcy5kb20uY29udGFpbmVyKTt2YXIgdHQ9dC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU7dC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU9Im5vbmUiLHRoaXMuZG9tLmR0UC5vbigiaW5pdC5kdCIsZnVuY3Rpb24ocHQsbXQpe3ZhciBydD1SLmRvbS5kdFAuRGF0YVRhYmxlKCksZ3Q9cnQuc2VsZWN0LnN0eWxlKCk7cnQuc2VsZWN0LnN0eWxlKGd0KX0pLHRoaXMucy5kdFBhbmU9dGhpcy5kb20uZHRQLkRhdGFUYWJsZSh0LmV4dGVuZCghMCx0aGlzLl9nZXRQYW5lQ29uZmlnKCksdGhpcy5jLmR0T3B0cyx0aGlzLnMuY29sT3B0cz90aGlzLnMuY29sT3B0cy5kdE9wdHM6e30sdGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8IXRoaXMucy5jb2xFeGlzdHM/e2NyZWF0ZWRSb3c6ZnVuY3Rpb24ocHQsbXQpe3QocHQpLmFkZENsYXNzKG10LmNsYXNzTmFtZSl9fTp2b2lkIDAsdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyE9PW51bGwmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzOnt9LHQuZm4uZGF0YVRhYmxlLnZlcnNpb25DaGVjaygiMiIpP3tsYXlvdXQ6e2JvdHRvbVN0YXJ0Om51bGwsYm90dG9tRW5kOm51bGwsdG9wU3RhcnQ6bnVsbCx0b3BFbmQ6bnVsbH19Ontkb206InQifSkpLHRoaXMuZG9tLmR0UC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGFibGUpO3ZhciB5dD0iQ3VzdG9tIFBhbmUiO2lmKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyP3l0PXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyOnRoaXMucy5jb2xPcHRzLmhlYWRlcj95dD10aGlzLnMuY29sT3B0cy5oZWFkZXI6dGhpcy5zLmNvbEV4aXN0cyYmKHl0PXQuZm4uZGF0YVRhYmxlLnZlcnNpb25DaGVjaygiMiIpP3RoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS50aXRsZSgpOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdLnNUaXRsZSkseXQ9dGhpcy5fZXNjYXBlSFRNTCh5dCksdGhpcy5kb20uc2VhcmNoQm94LmF0dHIoInBsYWNlaG9sZGVyIix5dCksdC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU9dHQsdGhpcy5zLmNvbEV4aXN0cylmb3IodmFyIFR0PTAsQXQ9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIubGVuZ3RoO1R0PEF0O1R0KyspaWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe1g9dGhpcy5hZGRSb3codGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmRpc3BsYXksdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmZpbHRlcix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltUdF0uc29ydCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltUdF0udHlwZSk7Zm9yKHZhciBrdD0wLEx0PXRoaXMucy5zZXJ2ZXJTZWxlY3Q7a3Q8THQubGVuZ3RoO2t0Kyspe3ZhciBCdD1MdFtrdF07QnQuZmlsdGVyPT09dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmZpbHRlciYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsWC5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExKX19ZWxzZSF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdP3RoaXMuYWRkUm93KHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1R0XS5kaXNwbGF5LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1R0XS5maWx0ZXIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLnNvcnQsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLnR5cGUpOnRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLmFkZFJvdygiIiwiIiwiIiwiIik7KHRoaXMucy5jb2xPcHRzLm9wdGlvbnN8fHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucykmJnRoaXMuX2dldENvbXBhcmlzb25Sb3dzKCksdGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wLHRoaXMuYWRqdXN0VG9wUm93KCksdGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLnMubGlzdFNldD0hMDtmb3IodmFyICR0PTAsS3Q9XzskdDxLdC5sZW5ndGg7JHQrKyl7dmFyIEQ9S3RbJHRdO2lmKEQpZm9yKHZhciB1dD0wLG90PXRoaXMucy5kdFBhbmUucm93cygpLmluZGV4ZXMoKS50b0FycmF5KCk7dXQ8b3QubGVuZ3RoO3V0KyspWD1vdFt1dF0sdGhpcy5zLmR0UGFuZS5yb3coWCkuZGF0YSgpJiZELmZpbHRlcj09PXRoaXMucy5kdFBhbmUucm93KFgpLmRhdGEoKS5maWx0ZXImJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT8odGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCx0aGlzLnMuZHRQYW5lLnJvdyhYKS5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExKTp0aGlzLnMuZHRQYW5lLnJvdyhYKS5zZWxlY3QoKSl9aWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJnRoaXMucy5kdFBhbmUuc2VhcmNoKHRoaXMuZG9tLnNlYXJjaEJveC52YWwoKSkuZHJhdygpLCh0aGlzLmMuaW5pdENvbGxhcHNlZCYmdGhpcy5zLmNvbE9wdHMuaW5pdENvbGxhcHNlZCE9PSExfHx0aGlzLnMuY29sT3B0cy5pbml0Q29sbGFwc2VkKSYmKHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMXx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2UpJiYodGhpcy5zLmR0UGFuZS5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP3RoaXMuY29sbGFwc2UoKTp0aGlzLnMuZHRQYW5lLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXtyZXR1cm4gUi5jb2xsYXBzZSgpfSkpLEwmJkwuc2VhcmNoUGFuZXMmJkwuc2VhcmNoUGFuZXMucGFuZXMmJighU3x8Uy5kcmF3PT09MSkpe3RoaXMuX3JlbG9hZFNlbGVjdChMKTtmb3IodmFyIEg9MCxNPUwuc2VhcmNoUGFuZXMucGFuZXM7SDxNLmxlbmd0aDtIKyspe3ZhciBZPU1bSF07WS5pZD09PXRoaXMucy5pbmRleCYmKFkuc2VhcmNoVGVybSYmWS5zZWFyY2hUZXJtLmxlbmd0aD4wJiZ0aGlzLmRvbS5zZWFyY2hCb3gudmFsKFkuc2VhcmNoVGVybSkudHJpZ2dlcigiaW5wdXQiKSxZLm9yZGVyJiZ0aGlzLnMuZHRQYW5lLm9yZGVyKFkub3JkZXIpLmRyYXcoKSxZLmNvbGxhcHNlZD90aGlzLmNvbGxhcHNlKCk6dGhpcy5zaG93KCkpfX1yZXR1cm4hMH0sZy5wcm90b3R5cGUuX2Rpc3BsYXlQYW5lPWZ1bmN0aW9uKCl7dGhpcy5kb20uZHRQLmVtcHR5KCksdGhpcy5kb20udG9wUm93LmVtcHR5KCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcFJvdykscGFyc2VJbnQodGhpcy5jLmxheW91dC5zcGxpdCgiLSIpWzFdLDEwKT4zJiZ0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNtYWxsR2FwKSx0aGlzLmRvbS50b3BSb3cuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvd3NDb250YWluZXIpLmFwcGVuZCh0aGlzLmRvbS51cHBlci5hcHBlbmQodGhpcy5kb20uc2VhcmNoQ29udCkpLmFwcGVuZCh0aGlzLmRvbS5sb3dlci5hcHBlbmQodGhpcy5kb20uYnV0dG9uR3JvdXApKSwodGhpcy5jLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmNvbE9wdHMuZHRPcHRzJiZ0aGlzLnMuY29sT3B0cy5kdE9wdHMuc2VhcmNoaW5nPT09ITF8fCF0aGlzLmMuY29udHJvbHN8fCF0aGlzLnMuY29sT3B0cy5jb250cm9sc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZyE9PXZvaWQgMCYmIXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZykmJnRoaXMuZG9tLnNlYXJjaEJveC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUlucHV0QnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLHRoaXMuZG9tLnNlYXJjaEJveC5hcHBlbmRUbyh0aGlzLmRvbS5zZWFyY2hDb250KSx0aGlzLl9zZWFyY2hDb250U2V0dXAoKSx0aGlzLmMuY2xlYXImJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNsZWFyLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSx0aGlzLmMub3JkZXJhYmxlJiZ0aGlzLnMuY29sT3B0cy5vcmRlcmFibGUmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLm5hbWVCdXR0b24uYXBwZW5kVG8odGhpcy5kb20uYnV0dG9uR3JvdXApLHRoaXMuYy52aWV3Q291bnQmJnRoaXMucy5jb2xPcHRzLnZpZXdDb3VudCYmdGhpcy5jLm9yZGVyYWJsZSYmdGhpcy5zLmNvbE9wdHMub3JkZXJhYmxlJiZ0aGlzLmMuY29udHJvbHMmJnRoaXMucy5jb2xPcHRzLmNvbnRyb2xzJiZ0aGlzLmRvbS5jb3VudEJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksKHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMXx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2UpJiZ0aGlzLmMuY29udHJvbHMmJnRoaXMucy5jb2xPcHRzLmNvbnRyb2xzJiZ0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmQodGhpcy5kb20udG9wUm93KS5hcHBlbmQodGhpcy5kb20uZHRQKS5zaG93KCl9LGcucHJvdG90eXBlLl9lc2NhcGVIVE1MPWZ1bmN0aW9uKF8pe3JldHVybiBfLnRvU3RyaW5nKCkucmVwbGFjZSgvJmFtcDsvZywiJiIpLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9LGcucHJvdG90eXBlLl9nZXRCb251c09wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgXz17dGhyZXNob2xkOm51bGx9O3JldHVybiB0LmV4dGVuZCghMCx7fSxnLmRlZmF1bHRzLF8sdGhpcy5jP3RoaXMuYzp7fSl9LGcucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0LFM9e2NvbGxhcHNlOm51bGwsZW1wdHlNZXNzYWdlOiExLGluaXRDb2xsYXBzZWQ6bnVsbCx0aHJlc2hvbGQ6bnVsbH0sTj1fLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uc2VhcmNoUGFuZXMsUj10LmV4dGVuZCghMCx7fSxnLmRlZmF1bHRzLFMsTik7cmV0dXJuIE4mJk4uaGlkZUNvdW50JiZOLnZpZXdDb3VudD09PXZvaWQgMCYmKFIudmlld0NvdW50PSFOLmhpZGVDb3VudCksUn0sZy5wcm90b3R5cGUuX3BvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnM9e307dmFyIF89dGhpcy5zLmR0LmNvbnRleHRbMF07aWYoIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKWZvcih2YXIgUz0wLE49dGhpcy5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpO1M8Ti5sZW5ndGg7UysrKXt2YXIgUj1OW1NdO3RoaXMuX3BvcHVsYXRlUGFuZUFycmF5KFIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsXyl9fSxnLnByb3RvdHlwZS5fc2VhcmNoPWZ1bmN0aW9uKF8sUyl7Zm9yKHZhciBOPXRoaXMucy5jb2xPcHRzLFI9dGhpcy5zLmR0LEw9MCxYPXRoaXMucy5zZWxlY3Rpb25zO0w8WC5sZW5ndGg7TCsrKXt2YXIgaj1YW0xdO2lmKHR5cGVvZiBqPT0ic3RyaW5nIiYmdHlwZW9mIF89PSJzdHJpbmciJiYoaj10aGlzLl9lc2NhcGVIVE1MKGopKSxBcnJheS5pc0FycmF5KF8pKXtpZihOLmNvbWJpbmVyPT09ImFuZCIpe2lmKCFfLmluY2x1ZGVzKGopKXJldHVybiExfWVsc2UgaWYoXy5pbmNsdWRlcyhqKSlyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBqPT0iZnVuY3Rpb24iKXtpZihqLmNhbGwoUixSLnJvdyhTKS5kYXRhKCksUykpe2lmKE4uY29tYmluZXI9PT0ib3IiKXJldHVybiEwfWVsc2UgaWYoTi5jb21iaW5lcj09PSJhbmQiKXJldHVybiExfWVsc2UgaWYoXz09PWp8fCEodHlwZW9mIF89PSJzdHJpbmciJiZfLmxlbmd0aD09PTApJiZfPT1qfHxqPT09bnVsbCYmdHlwZW9mIF89PSJzdHJpbmciJiZfPT09IiIpcmV0dXJuITB9cmV0dXJuIE4uY29tYmluZXI9PT0iYW5kIn0sZy5wcm90b3R5cGUuX3NlYXJjaENvbnRTZXR1cD1mdW5jdGlvbigpe3RoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLnNlYXJjaEJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5zZWFyY2hMYWJlbENvbnQpLHRoaXMuYy5kdE9wdHMuc2VhcmNoaW5nPT09ITF8fHRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZyE9PXZvaWQgMCYmIXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZ3x8dGhpcy5kb20uc2VhcmNoTGFiZWxDb250LmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaENvbnQpfSxnLnByb3RvdHlwZS5fc2VhcmNoRXh0cmFzPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLnVwZGF0aW5nO3RoaXMucy51cGRhdGluZz0hMDt2YXIgUz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnBsdWNrKCJmaWx0ZXIiKS50b0FycmF5KCksTj1TLmluZGV4T2YodGhpcy5lbXB0eU1lc3NhZ2UoKSksUj10KHRoaXMucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSk7Tj4tMSYmKFNbTl09IiIpLFMubGVuZ3RoPjA/Ui5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0ZWQpOlMubGVuZ3RoPT09MCYmUi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0ZWQpLHRoaXMucy51cGRhdGluZz1ffSxnLnZlcnNpb249IjIuMS4yIixnLmNsYXNzZXM9e2JvcmRlcmVkOiJkdHNwLWJvcmRlcmVkIixidXR0b25Hcm91cDoiZHRzcC1idXR0b25Hcm91cCIsYnV0dG9uU3ViOiJkdHNwLWJ1dHRvblN1YiIsY2FyZXQ6ImR0c3AtY2FyZXQiLGNsZWFyOiJkdHNwLWNsZWFyIixjbGVhckFsbDoiZHRzcC1jbGVhckFsbCIsY2xlYXJCdXR0b246ImNsZWFyQnV0dG9uIixjb2xsYXBzZUFsbDoiZHRzcC1jb2xsYXBzZUFsbCIsY29sbGFwc2VCdXR0b246ImR0c3AtY29sbGFwc2VCdXR0b24iLGNvbnRhaW5lcjoiZHRzcC1zZWFyY2hQYW5lIixjb3VudEJ1dHRvbjoiZHRzcC1jb3VudEJ1dHRvbiIsZGlzYWJsZWRCdXR0b246ImR0c3AtZGlzYWJsZWRCdXR0b24iLGhpZGRlbjoiZHRzcC1oaWRkZW4iLGhpZGU6ImR0c3AtaGlkZSIsbGF5b3V0OiJkdHNwLSIsbmFtZToiZHRzcC1uYW1lIixuYW1lQnV0dG9uOiJkdHNwLW5hbWVCdXR0b24iLG5hbWVDb250OiJkdHNwLW5hbWVDb250IixuYXJyb3c6ImR0c3AtbmFycm93IixwYW5lQnV0dG9uOiJkdHNwLXBhbmVCdXR0b24iLHBhbmVJbnB1dEJ1dHRvbjoiZHRzcC1wYW5lSW5wdXRCdXR0b24iLHBpbGw6ImR0c3AtcGlsbCIscm90YXRlZDoiZHRzcC1yb3RhdGVkIixzZWFyY2g6ImR0c3Atc2VhcmNoIixzZWFyY2hDb250OiJkdHNwLXNlYXJjaENvbnQiLHNlYXJjaEljb246ImR0c3Atc2VhcmNoSWNvbiIsc2VhcmNoTGFiZWxDb250OiJkdHNwLXNlYXJjaEJ1dHRvbkNvbnQiLHNlbGVjdGVkOiJkdHNwLXNlbGVjdGVkIixzbWFsbEdhcDoiZHRzcC1zbWFsbEdhcCIsc3ViUm93MToiZHRzcC1zdWJSb3cxIixzdWJSb3cyOiJkdHNwLXN1YlJvdzIiLHN1YlJvd3NDb250YWluZXI6ImR0c3Atc3ViUm93c0NvbnRhaW5lciIsdGl0bGU6ImR0c3AtdGl0bGUiLHRvcFJvdzoiZHRzcC10b3BSb3cifSxnLmRlZmF1bHRzPXtjbGVhcjohMCxjb2xsYXBzZTohMCxjb21iaW5lcjoib3IiLGNvbnRhaW5lcjpmdW5jdGlvbihfKXtyZXR1cm4gXy50YWJsZSgpLmNvbnRhaW5lcigpfSxjb250cm9sczohMCxkdE9wdHM6e30sZW1wdHlNZXNzYWdlOm51bGwsaGlkZUNvdW50OiExLGkxOG46e2NsZWFyUGFuZToiJnRpbWVzOyIsY291bnQ6Int0b3RhbH0iLGVtcHR5TWVzc2FnZToiPGVtPk5vIGRhdGE8L2VtPiJ9LGluaXRDb2xsYXBzZWQ6ITEsbGF5b3V0OiJhdXRvIixuYW1lOnZvaWQgMCxvcmRlcmFibGU6ITAsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsZmlsdGVyOiJmaWx0ZXIiLGhpZGVDb3VudDohMSxzZWFyY2g6ImZpbHRlciIsc2hvdzp2b2lkIDAsc29ydDoic29ydCIsdGhyZXNob2xkOi42LHR5cGU6InR5cGUiLHZpZXdDb3VudDohMH0scHJlU2VsZWN0OltdLHRocmVzaG9sZDouNix2aWV3Q291bnQ6ITB9LGd9KCkscz13aW5kb3cmJndpbmRvdy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGc9ZnVuY3Rpb24oXyxTKXtyZXR1cm4gZz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oTixSKXtOLl9fcHJvdG9fXz1SfXx8ZnVuY3Rpb24oTixSKXtmb3IodmFyIEwgaW4gUilSLmhhc093blByb3BlcnR5KEwpJiYoTltMXT1SW0xdKX0sZyhfLFMpfTtyZXR1cm4gZnVuY3Rpb24oXyxTKXtnKF8sUyk7ZnVuY3Rpb24gTigpe3RoaXMuY29uc3RydWN0b3I9X31fLnByb3RvdHlwZT1TPT09bnVsbD9PYmplY3QuY3JlYXRlKFMpOihOLnByb3RvdHlwZT1TLnByb3RvdHlwZSxuZXcgTil9fSgpLGE9ZnVuY3Rpb24oZyl7cyhfLGcpO2Z1bmN0aW9uIF8oUyxOLFIsTCxYKXtyZXR1cm4gZy5jYWxsKHRoaXMsUyxOLFIsTCxYKXx8dGhpc31yZXR1cm4gXy5wcm90b3R5cGUuX2VtcHR5UGFuZT1mdW5jdGlvbigpe3ZhciBTPXRoaXMucy5kdFBhbmU7aWYoc3QudmVyc2lvbkNoZWNrKCIyIikpe3ZhciBOPVMuc2VsZWN0Lmxhc3QoKSxSO3JldHVybiBOJiZTLnJvdyhOLnJvdykuYW55KCkmJihSPVMucm93KE4ucm93KS5kYXRhKCkuaW5kZXgpLFMucm93cygpLnJlbW92ZSgpLGZ1bmN0aW9uKCl7aWYoUiE9PXZvaWQgMCl7dmFyIEw9Uy5yb3coZnVuY3Rpb24oWCxqKXtyZXR1cm4gai5pbmRleD09PVJ9KS5pbmRleCgpO1Muc2VsZWN0Lmxhc3Qoe3JvdzpMLGNvbHVtbjowfSl9fX1yZXR1cm4gUy5yb3dzKCkucmVtb3ZlKCksZnVuY3Rpb24oKXt9fSxfLnByb3RvdHlwZS5fc2VydmVyUG9wdWxhdGU9ZnVuY3Rpb24oUyl7dmFyIE4sUixMO3RoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fSx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcj1bXSxTLnRhYmxlTGVuZ3RoIT09dm9pZCAwPyh0aGlzLnMudGFibGVMZW5ndGg9Uy50YWJsZUxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKToodGhpcy5zLnRhYmxlTGVuZ3RoPT09bnVsbHx8dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGg+dGhpcy5zLnRhYmxlTGVuZ3RoKSYmKHRoaXMucy50YWJsZUxlbmd0aD10aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKTt2YXIgWD10aGlzLnMuZHQuY29sdW1uKHRoaXMucy5pbmRleCkuZGF0YVNyYygpO2lmKFMuc2VhcmNoUGFuZXMub3B0aW9uc1tYXSE9PXZvaWQgMClmb3IodmFyIGo9MCxHPVMuc2VhcmNoUGFuZXMub3B0aW9uc1tYXTtqPEcubGVuZ3RoO2orKyl7dmFyIGF0PUdbal07dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIucHVzaCh7ZGlzcGxheTphdC5sYWJlbCxmaWx0ZXI6YXQudmFsdWUsc2hvd246K2F0LmNvdW50LHNvcnQ6YXQubGFiZWwsdG90YWw6K2F0LnRvdGFsLHR5cGU6YXQubGFiZWx9KSx0aGlzLnMucm93RGF0YS5iaW5zU2hvd25bYXQudmFsdWVdPSthdC5jb3VudCx0aGlzLnMucm93RGF0YS5iaW5zW2F0LnZhbHVlXT0rYXQudG90YWx9dmFyIEo9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLHR0PXRoaXMuX3VuaXF1ZVJhdGlvKEosdGhpcy5zLnRhYmxlTGVuZ3RoKTtpZighdGhpcy5zLmNvbE9wdHMuc2hvdyYmdGhpcy5zLmRpc3BsYXllZD09PSExJiYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZD09PW51bGw/dHQ+dGhpcy5jLnRocmVzaG9sZDp0dD50aGlzLnMuY29sT3B0cy50aHJlc2hvbGQpfHx0aGlzLnMuY29sT3B0cy5zaG93IT09ITAmJko8PTEpKXt0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5zLmRpc3BsYXllZD0hMTtyZXR1cm59aWYodGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcix0aGlzLnMucm93RGF0YS5iaW5zT3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYmlucyx0aGlzLnMuZGlzcGxheWVkPSEwLHRoaXMucy5kdFBhbmUpe2Zvcih2YXIgeXQ9dGhpcy5zLnNlcnZlclNlbGVjdCxUdD10aGlzLl9lbXB0eVBhbmUoKSxBdD0wLGt0PXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyO0F0PGt0Lmxlbmd0aDtBdCsrKWlmKEw9a3RbQXRdLHRoaXMuX3Nob3VsZEFkZFJvdyhMKSl7Uj10aGlzLmFkZFJvdyhMLmRpc3BsYXksTC5maWx0ZXIsTC5zb3J0LEwudHlwZSk7Zm9yKHZhciBMdD0wO0x0PHl0Lmxlbmd0aDtMdCsrKWlmKE49eXRbTHRdLE4uZmlsdGVyPT09TC5maWx0ZXIpe3RoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsUi5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExLHl0LnNwbGljZShMdCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKEwuZmlsdGVyKTticmVha319Zm9yKHZhciBCdD0wLCR0PXl0O0J0PCR0Lmxlbmd0aDtCdCsrKXtOPSR0W0J0XTtmb3IodmFyIEt0PTAsRD10aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsO0t0PEQubGVuZ3RoO0t0KyspTD1EW0t0XSxMLmZpbHRlcj09PU4uZmlsdGVyJiYoUj10aGlzLmFkZFJvdyhMLmRpc3BsYXksTC5maWx0ZXIsTC5zb3J0LEwudHlwZSksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxSLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEsdGhpcy5zLnNlbGVjdGlvbnMucHVzaChMLmZpbHRlcikpfXRoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCksdGhpcy5zLmR0UGFuZS5kcmF3KCksVHQoKX19LF8ucHJvdG90eXBlLnVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTtmb3IodmFyIFM9MCxOPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtTPE4ubGVuZ3RoO1MrKyl7dmFyIFI9TltTXTt0aGlzLl91cGRhdGVTaG93bihSLHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fWZvcih2YXIgTD1mdW5jdGlvbihKKXtKLnNob3duPXR5cGVvZiBYLnMucm93RGF0YS5iaW5zU2hvd25bSi5maWx0ZXJdPT0ibnVtYmVyIj9YLnMucm93RGF0YS5iaW5zU2hvd25bSi5maWx0ZXJdOjAsWC5zLmR0UGFuZS5yb3coZnVuY3Rpb24odHQseXQpe3JldHVybiB5dCYmeXQuaW5kZXg9PT1KLmluZGV4fSkuZGF0YShKKX0sWD10aGlzLGo9MCxHPXRoaXMucy5kdFBhbmUucm93cygpLmRhdGEoKS50b0FycmF5KCk7ajxHLmxlbmd0aDtqKyspe3ZhciBhdD1HW2pdO0woYXQpfXRoaXMucy5kdFBhbmUuZHJhdygpLHRoaXMucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3A9dGhpcy5zLnNjcm9sbFRvcH0sXy5wcm90b3R5cGUuX21ha2VTZWxlY3Rpb249ZnVuY3Rpb24oKXt9LF8ucHJvdG90eXBlLl9yZWxvYWRTZWxlY3Q9ZnVuY3Rpb24oKXt9LF8ucHJvdG90eXBlLl9zaG91bGRBZGRSb3c9ZnVuY3Rpb24oUyl7cmV0dXJuITB9LF8ucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmIXRoaXMucy51cGRhdGluZyYmIXRoaXMucy5zZXJ2ZXJTZWxlY3RpbmcmJih0aGlzLnMuc2VydmVyU2VsZWN0PXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpKX0sXy5wcm90b3R5cGUuX3VwZGF0ZVNob3duPWZ1bmN0aW9uKFMsTixSKXtSPT09dm9pZCAwJiYoUj10aGlzLnMucm93RGF0YS5iaW5zU2hvd24pO3ZhciBMPXR5cGVvZiB0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsPT0ic3RyaW5nIj90aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsOnRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc2VhcmNoLFg9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGEsaj1YKFMsdGhpcy5zLmluZGV4LEwpLEc9ZnVuY3Rpb24oeXQpe1JbeXRdP1JbeXRdKys6Ult5dF09MX07aWYoQXJyYXkuaXNBcnJheShqKSlmb3IodmFyIGF0PTAsSj1qO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTtHKHR0KX1lbHNlIEcoail9LF99KG4pLGw9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBnPWZ1bmN0aW9uKF8sUyl7cmV0dXJuIGc9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKE4sUil7Ti5fX3Byb3RvX189Un18fGZ1bmN0aW9uKE4sUil7Zm9yKHZhciBMIGluIFIpUi5oYXNPd25Qcm9wZXJ0eShMKSYmKE5bTF09UltMXSl9LGcoXyxTKX07cmV0dXJuIGZ1bmN0aW9uKF8sUyl7ZyhfLFMpO2Z1bmN0aW9uIE4oKXt0aGlzLmNvbnN0cnVjdG9yPV99Xy5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooTi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IE4pfX0oKSxjO2Z1bmN0aW9uIHAoZyl7Yz1nfXZhciBiPWZ1bmN0aW9uKGcpe2woXyxnKTtmdW5jdGlvbiBfKFMsTixSLEwsWCl7dmFyIGo9dGhpcyxHPXtpMThuOntjb3VudEZpbHRlcmVkOiJ7c2hvd259ICh7dG90YWx9KSJ9fTtyZXR1cm4gaj1nLmNhbGwodGhpcyxTLGMuZXh0ZW5kKEcsTiksUixMLFgpfHx0aGlzLGp9cmV0dXJuIF8ucHJvdG90eXBlLl9nZXRNZXNzYWdlPWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudCIsdGhpcy5jLmkxOG4uY291bnQpLFI9dGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50RmlsdGVyZWQiLHRoaXMuYy5pMThuLmNvdW50RmlsdGVyZWQpO3JldHVybih0aGlzLnMuZmlsdGVyaW5nQWN0aXZlP1I6TikucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0sXy5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0sX30oYSksbT13aW5kb3cmJndpbmRvdy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGc9ZnVuY3Rpb24oXyxTKXtyZXR1cm4gZz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oTixSKXtOLl9fcHJvdG9fXz1SfXx8ZnVuY3Rpb24oTixSKXtmb3IodmFyIEwgaW4gUilSLmhhc093blByb3BlcnR5KEwpJiYoTltMXT1SW0xdKX0sZyhfLFMpfTtyZXR1cm4gZnVuY3Rpb24oXyxTKXtnKF8sUyk7ZnVuY3Rpb24gTigpe3RoaXMuY29uc3RydWN0b3I9X31fLnByb3RvdHlwZT1TPT09bnVsbD9PYmplY3QuY3JlYXRlKFMpOihOLnByb3RvdHlwZT1TLnByb3RvdHlwZSxuZXcgTil9fSgpLHk7ZnVuY3Rpb24gVChnKXt5PWd9dmFyIHc9ZnVuY3Rpb24oZyl7bShfLGcpO2Z1bmN0aW9uIF8oUyxOLFIsTCxYKXt2YXIgaj10aGlzLEc9e2kxOG46e2NvdW50OiJ7c2hvd259In19O3JldHVybiBqPWcuY2FsbCh0aGlzLFMseS5leHRlbmQoRyxOKSxSLEwsWCl8fHRoaXMsan1yZXR1cm4gXy5wcm90b3R5cGUudXBkYXRlUm93cz1mdW5jdGlvbigpe3ZhciBTPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLE47aWYodGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zKXt0aGlzLl9nZXRDb21wYXJpc29uUm93cygpO2Zvcih2YXIgUj10aGlzLnMuZHRQYW5lLnJvd3MoKS50b0FycmF5KClbMF0sTD0wO0w8Ui5sZW5ndGg7TCsrKXt2YXIgWD10aGlzLnMuZHRQYW5lLnJvdyhSW0xdKSxqPVguZGF0YSgpO2lmKGohPT12b2lkIDApe2lmKGouc2hvd249PT0wKXtYLnJlbW92ZSgpLFI9dGhpcy5zLmR0UGFuZS5yb3dzKCkudG9BcnJheSgpWzBdLEwtLTtjb250aW51ZX1mb3IodmFyIEc9MCxhdD1TO0c8YXQubGVuZ3RoO0crKylpZihOPWF0W0ddLGouZmlsdGVyPT09Ti5maWx0ZXIpe1guc2VsZWN0KCksUy5zcGxpY2UoTCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKGouZmlsdGVyKTticmVha319fX1lbHNle2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dGhpcy5fYWN0aXZlUG9wdWxhdGVQYW5lKCksdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9O2Zvcih2YXIgSj0wLHR0PXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtKPHR0Lmxlbmd0aDtKKyspe3ZhciB5dD10dFtKXTt0aGlzLl91cGRhdGVTaG93bih5dCx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXSx0aGlzLnMucm93RGF0YS5iaW5zU2hvd24pfX10aGlzLnMuZHRQYW5lLnJvd3MoKS5yZW1vdmUoKTtmb3IodmFyIFR0PTAsQXQ9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI7VHQ8QXQubGVuZ3RoO1R0Kyspe3ZhciBrdD1BdFtUdF07aWYoa3Quc2hvd24hPT0wKWZvcih2YXIgTHQ9dGhpcy5hZGRSb3coa3QuZGlzcGxheSxrdC5maWx0ZXIsa3Quc29ydCxrdC50eXBlLHZvaWQgMCksQnQ9MDtCdDxTLmxlbmd0aDtCdCsrKXt2YXIgJHQ9U1tCdF07aWYoJHQuZmlsdGVyPT09a3QuZmlsdGVyKXtMdC5zZWxlY3QoKSxTLnNwbGljZShCdCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKGt0LmZpbHRlcik7YnJlYWt9fX1mb3IodmFyIEt0PTAsRD1TO0t0PEQubGVuZ3RoO0t0Kyspe049RFtLdF07Zm9yKHZhciB1dD0wLG90PXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw7dXQ8b3QubGVuZ3RoO3V0Kyspe3ZhciBIPW90W3V0XTtpZihILmZpbHRlcj09PU4uZmlsdGVyKXt2YXIgTT10aGlzLmFkZFJvdyhILmRpc3BsYXksSC5maWx0ZXIsSC5zb3J0LEgudHlwZSx2b2lkIDApO00uc2VsZWN0KCksdGhpcy5zLnNlbGVjdGlvbnMucHVzaChILmZpbHRlcil9fX19dGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLnMuZHQuZHJhdyghMSl9LF8ucHJvdG90eXBlLl9hY3RpdmVQb3B1bGF0ZVBhbmU9ZnVuY3Rpb24oKXt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcj1bXSx0aGlzLnMucm93RGF0YS5iaW5zPXt9O3ZhciBTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSlmb3IodmFyIE49MCxSPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtOPFIubGVuZ3RoO04rKyl7dmFyIEw9UltOXTt0aGlzLl9wb3B1bGF0ZVBhbmVBcnJheShMLHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLFMpfX0sXy5wcm90b3R5cGUuX2dldENvbXBhcmlzb25Sb3dzPWZ1bmN0aW9uKCl7dmFyIFM9dGhpcy5zLmNvbE9wdHMub3B0aW9ucz90aGlzLnMuY29sT3B0cy5vcHRpb25zOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucz90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM6dm9pZCAwO2lmKFMhPT12b2lkIDApe3ZhciBOPXRoaXMucy5kdC5yb3dzKCksUj10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLEw9Ti5kYXRhKCkudG9BcnJheSgpLFg9Ui5kYXRhKCkudG9BcnJheSgpLGo9W107dGhpcy5zLmR0UGFuZS5jbGVhcigpLHRoaXMucy5pbmRleGVzPVtdO2Zvcih2YXIgRz0wLGF0PVM7RzxhdC5sZW5ndGg7RysrKXt2YXIgSj1hdFtHXSx0dD1KLmxhYmVsIT09IiI/Si5sYWJlbDp0aGlzLmVtcHR5TWVzc2FnZSgpLHl0PXtjbGFzc05hbWU6Si5jbGFzc05hbWUsZGlzcGxheTp0dCxmaWx0ZXI6dHlwZW9mIEoudmFsdWU9PSJmdW5jdGlvbiI/Si52YWx1ZTpbXSxzaG93bjowLHNvcnQ6dHQsdG90YWw6MCx0eXBlOnR0fTtpZih0eXBlb2YgSi52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciBUdD0wO1R0PEwubGVuZ3RoO1R0KyspSi52YWx1ZS5jYWxsKHRoaXMucy5kdCxMW1R0XSxOWzBdW1R0XSkmJnl0LnRvdGFsKys7Zm9yKHZhciBBdD0wO0F0PFgubGVuZ3RoO0F0KyspSi52YWx1ZS5jYWxsKHRoaXMucy5kdCxYW0F0XSxSWzBdW0F0XSkmJnl0LnNob3duKys7dHlwZW9mIHl0LmZpbHRlciE9ImZ1bmN0aW9uIiYmeXQuZmlsdGVyLnB1c2goSi5maWx0ZXIpfWoucHVzaCh0aGlzLmFkZFJvdyh5dC5kaXNwbGF5LHl0LmZpbHRlcix5dC5zb3J0LHl0LnR5cGUseXQuY2xhc3NOYW1lLHl0LnRvdGFsLHl0LnNob3duKSl9cmV0dXJuIGp9fSxfLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0sXy5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0sXy5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4gUy5zaG93bj4wfSxffShhKSxrPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZz1mdW5jdGlvbihfLFMpe3JldHVybiBnPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihOLFIpe04uX19wcm90b19fPVJ9fHxmdW5jdGlvbihOLFIpe2Zvcih2YXIgTCBpbiBSKVIuaGFzT3duUHJvcGVydHkoTCkmJihOW0xdPVJbTF0pfSxnKF8sUyl9O3JldHVybiBmdW5jdGlvbihfLFMpe2coXyxTKTtmdW5jdGlvbiBOKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ffV8ucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KE4ucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBOKX19KCksUDtmdW5jdGlvbiBGKGcpe1A9Z312YXIgaD1mdW5jdGlvbihnKXtrKF8sZyk7ZnVuY3Rpb24gXyhTLE4sUixMLFgpe3ZhciBqPXRoaXMsRz17aTE4bjp7Y291bnQ6Int0b3RhbH0iLGNvdW50RmlsdGVyZWQ6IntzaG93bn0gKHt0b3RhbH0pIn19O3JldHVybiBqPWcuY2FsbCh0aGlzLFMsUC5leHRlbmQoRyxOKSxSLEwsWCl8fHRoaXMsan1yZXR1cm4gXy5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTt2YXIgUz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBOPTAsUj10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKS50b0FycmF5KCk7TjxSLmxlbmd0aDtOKyspe3ZhciBMPVJbTl07dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoTCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixTLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fSxfLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgTj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxSPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9SOk4pLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LF99KHcpLG8sZjtmdW5jdGlvbiBDKGcpe289ZyxmPWcuZm4uZGF0YVRhYmxlfXZhciBCPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhfLFMsTixSKXt2YXIgTD10aGlzO2lmKE49PT12b2lkIDAmJihOPSExKSxSPT09dm9pZCAwJiYoUj1uKSwhZnx8IWYudmVyc2lvbkNoZWNrfHwhZi52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighZi5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciBYPW5ldyBmLkFwaShfKTtpZih0aGlzLmNsYXNzZXM9by5leHRlbmQoITAse30sZy5jbGFzc2VzKSx0aGlzLmM9by5leHRlbmQoITAse30sZy5kZWZhdWx0cyxTKSx0aGlzLmRvbT17Y2xlYXJBbGw6bygnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY2xlYXJBbGwpLmh0bWwoWC5pMThuKCJzZWFyY2hQYW5lcy5jbGVhck1lc3NhZ2UiLHRoaXMuYy5pMThuLmNsZWFyTWVzc2FnZSkpLGNvbGxhcHNlQWxsOm8oJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQWxsKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2VNZXNzYWdlIix0aGlzLmMuaTE4bi5jb2xsYXBzZU1lc3NhZ2UpKSxjb250YWluZXI6bygiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVzKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMubG9hZE1lc3NhZ2UiLHRoaXMuYy5pMThuLmxvYWRNZXNzYWdlKSksZW1wdHlNZXNzYWdlOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5lbXB0eU1lc3NhZ2UpLHBhbmVzOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLHNob3dBbGw6bygnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2hvd0FsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMuc2hvd01lc3NhZ2UiLHRoaXMuYy5pMThuLnNob3dNZXNzYWdlKSksdGl0bGU6bygiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRpdGxlKSx0aXRsZVJvdzpvKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGVSb3cpfSx0aGlzLnM9e2NvbE9wdHM6W10sZHQ6WCxmaWx0ZXJDb3VudDowLG1pblBhbmVXaWR0aDoyNjAscGFnZTowLHBhZ2luZzohMSxwYWdpbmdTVDohMSxwYW5lQ2xhc3M6UixwYW5lczpbXSxzZWxlY3Rpb25MaXN0OltdLHNlcnZlckRhdGE6e30sc3RhdGVSZWFkOiExLHVwZGF0aW5nOiExfSwhWC5zZXR0aW5ncygpWzBdLl9zZWFyY2hQYW5lcyl7aWYobyhkb2N1bWVudCkub24oImRyYXcuZHQiLGZ1bmN0aW9uKEcpe0wuZG9tLmNvbnRhaW5lci5maW5kKEcudGFyZ2V0KS5sZW5ndGgmJkwuX3VwZGF0ZUZpbHRlckNvdW50KCl9KSx0aGlzLl9nZXRTdGF0ZSgpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgaj10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTt0aGlzLnMuZHQub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oRyxhdCxKKXtpZihqPT09YXQpe0ouc2VhcmNoUGFuZXM9PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzPXt9KSxKLnNlYXJjaFBhbmVzX251bGw9PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzX251bGw9e30pO2Zvcih2YXIgdHQseXQ9MCxUdD1MLnMuc2VsZWN0aW9uTGlzdDt5dDxUdC5sZW5ndGg7eXQrKyl7dmFyIEF0PVR0W3l0XTt0dD1MLnMuZHQuY29sdW1uKEF0LmNvbHVtbikuZGF0YVNyYygpLEouc2VhcmNoUGFuZXNbdHRdPT09dm9pZCAwJiYoSi5zZWFyY2hQYW5lc1t0dF09e30pLEouc2VhcmNoUGFuZXNfbnVsbFt0dF09PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzX251bGxbdHRdPXt9KTtmb3IodmFyIGt0PTA7a3Q8QXQucm93cy5sZW5ndGg7a3QrKylKLnNlYXJjaFBhbmVzW3R0XVtrdF09QXQucm93c1trdF0sSi5zZWFyY2hQYW5lc1t0dF1ba3RdPT09bnVsbD9KLnNlYXJjaFBhbmVzX251bGxbdHRdW2t0XT0hMDpKLnNlYXJjaFBhbmVzX251bGxbdHRdW2t0XT0hMX1MLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGg+MCYmKEouc2VhcmNoUGFuZXNMYXN0PXR0KSxKLnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6TC5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6TC5jLnZpZXdDb3VudCx2aWV3VG90YWw6TC5jLnZpZXdUb3RhbH19fSl9cmV0dXJuIHRoaXMuX3NldFhIUigpLFguc2V0dGluZ3MoKVswXS5fc2VhcmNoUGFuZXM9dGhpcyx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZXx8Tj90aGlzLl9wYW5lRGVjbGFyZShYLF8sUyk6WC5vbmUoInByZUluaXQuZHRzcHMiLGZ1bmN0aW9uKCl7TC5fcGFuZURlY2xhcmUoWCxfLFMpfSksdGhpc319cmV0dXJuIGcucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgXyxTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspXz1OW1NdLF8ucy5kdFBhbmUmJihfLnMuc2Nyb2xsVG9wPV8ucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3ApO3ZhciBSPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoL1xzKy9nLCIuIikpO1IuZWFjaChmdW5jdGlvbigpe28odGhpcykudmFsKCIiKS50cmlnZ2VyKCJpbnB1dCIpfSksdGhpcy5zLnNlbGVjdGlvbkxpc3Q9W107Zm9yKHZhciBMPVtdLFg9MCxqPXRoaXMucy5wYW5lcztYPGoubGVuZ3RoO1grKylfPWpbWF0sXy5zLmR0UGFuZSYmTC5wdXNoKF8uY2xlYXJQYW5lKCkpO3JldHVybiBMfSxnLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihfLFMpe189PT12b2lkIDAmJihfPSExKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5kb20uZW1wdHlNZXNzYWdlLmRldGFjaCgpLF89PT0hMSYmdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIE49W10sUj0wLEw9dGhpcy5zLnBhbmVzO1I8TC5sZW5ndGg7UisrKXt2YXIgWD1MW1JdOyhfPT09ITF8fFgucy5pbmRleD09PV8pJiYoWC5jbGVhckRhdGEoKSxYLnJlYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCxTKSx0aGlzLmRvbS5wYW5lcy5hcHBlbmQoWC5kb20uY29udGFpbmVyKSxOLnB1c2goWCkpfXJldHVybiB0aGlzLl91cGRhdGVTZWxlY3Rpb24oKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLHRoaXMuX2F0dGFjaFBhbmVDb250YWluZXIoKSx0aGlzLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzKCExKSx0aGlzLnMuZHQuZHJhdyghUyksdGhpcy5yZXNpemVQYW5lcygpLE4ubGVuZ3RoPT09MT9OWzBdOk59LGcucHJvdG90eXBlLnJlc2l6ZVBhbmVzPWZ1bmN0aW9uKCl7dmFyIF87aWYodGhpcy5jLmxheW91dD09PSJhdXRvIil7Zm9yKHZhciBTPW8odGhpcy5zLmR0LnNlYXJjaFBhbmVzLmNvbnRhaW5lcigpKS53aWR0aCgpLE49TWF0aC5mbG9vcihTL3RoaXMucy5taW5QYW5lV2lkdGgpLFI9MSxMPTAsWD1bXSxqPTAsRz10aGlzLnMucGFuZXM7ajxHLmxlbmd0aDtqKyspXz1HW2pdLF8ucy5kaXNwbGF5ZWQmJlgucHVzaChfLnMuaW5kZXgpO3ZhciBhdD1YLmxlbmd0aDtpZihOPT09YXQpUj1OO2Vsc2UgZm9yKHZhciBKPU47Sj4xO0otLSl7dmFyIHR0PWF0JUo7aWYodHQ9PT0wKXtSPUosTD0wO2JyZWFrfWVsc2UgdHQ+TCYmKFI9SixMPXR0KX12YXIgeXQ9TCE9PTA/WC5zbGljZShYLmxlbmd0aC1MLFgubGVuZ3RoKTpbXTt0aGlzLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihrdCl7a3Qucy5kaXNwbGF5ZWQmJmt0LnJlc2l6ZSgiY29sdW1ucy0iKyh5dC5pbmNsdWRlcyhrdC5zLmluZGV4KT9MOlIpKX0pfWVsc2UgZm9yKHZhciBUdD0wLEF0PXRoaXMucy5wYW5lcztUdDxBdC5sZW5ndGg7VHQrKylfPUF0W1R0XSxfLmFkanVzdFRvcFJvdygpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihfKXt9LGcucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXt9LGcucHJvdG90eXBlLl9zZXRYSFI9ZnVuY3Rpb24oKXt2YXIgXz10aGlzLFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sTj1mdW5jdGlvbihSKXtSJiZSLnNlYXJjaFBhbmVzJiZSLnNlYXJjaFBhbmVzLm9wdGlvbnMmJihfLnMuc2VydmVyRGF0YT1SLF8ucy5zZXJ2ZXJEYXRhLnRhYmxlTGVuZ3RoPVIucmVjb3Jkc1RvdGFsLF8uX3NlcnZlclRvdGFscygpKX07dGhpcy5zLmR0Lm9uKCJ4aHIuZHRzcHMiLGZ1bmN0aW9uKFIsTCxYKXtTPT09TCYmTihYKX0pLE4odGhpcy5zLmR0LmFqYXguanNvbigpKX0sZy5wcm90b3R5cGUuX3N0YXRlTG9hZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIF89dGhpcyxTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO3RoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c3BzIixmdW5jdGlvbihOLFIsTCl7aWYoIShMLnNlYXJjaFBhbmVzPT09dm9pZCAwfHxSIT09Uykpe2lmKF8uY2xlYXJTZWxlY3Rpb25zKCksXy5zLnNlbGVjdGlvbkxpc3Q9TC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P0wuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxMLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgWD0wLGo9TC5zZWFyY2hQYW5lcy5wYW5lcztYPGoubGVuZ3RoO1grKylmb3IodmFyIEc9altYXSxhdD0wLEo9Xy5zLnBhbmVzO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTtHLmlkPT09dHQucy5pbmRleCYmdHQucy5kdFBhbmUmJih0dC5kb20uc2VhcmNoQm94LnZhbChHLnNlYXJjaFRlcm0pLHR0LnMuZHRQYW5lLm9yZGVyKEcub3JkZXIpKX1fLl9tYWtlU2VsZWN0aW9ucyhfLnMuc2VsZWN0aW9uTGlzdCl9fSl9LGcucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuc2VsZWN0aW9uTGlzdD1bXTtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtpZihOLnMuZHRQYW5lKXt2YXIgUj1OLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEwuZmlsdGVyfSk7Ui5sZW5ndGgmJnRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpOLnMuaW5kZXgscm93czpSfSl9fX0sZy5wcm90b3R5cGUuX2F0dGFjaD1mdW5jdGlvbigpe3ZhciBfPXRoaXM7dGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLmRldGFjaCgpLmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5jLmNsZWFyJiZ0aGlzLmRvbS5jbGVhckFsbC5hcHBlbmRUbyh0aGlzLmRvbS50aXRsZVJvdykub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gXy5jbGVhclNlbGVjdGlvbnMoKX0pLHRoaXMuYy5jb2xsYXBzZSYmKHRoaXMuZG9tLnNob3dBbGwuYXBwZW5kVG8odGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLmNvbGxhcHNlQWxsLmFwcGVuZFRvKHRoaXMuZG9tLnRpdGxlUm93KSx0aGlzLl9zZXRDb2xsYXBzZUxpc3RlbmVyKCkpO2Zvcih2YXIgUz0wLE49dGhpcy5zLnBhbmVzO1M8Ti5sZW5ndGg7UysrKXt2YXIgUj1OW1NdO3RoaXMuZG9tLnBhbmVzLmFwcGVuZChSLmRvbS5jb250YWluZXIpfXRoaXMuZG9tLmNvbnRhaW5lci50ZXh0KCIiKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSkuYXBwZW5kKHRoaXMuZG9tLnRpdGxlUm93KS5hcHBlbmQodGhpcy5kb20ucGFuZXMpLHRoaXMucy5wYW5lcy5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBMLnNldExpc3RlbmVycygpfSksbygiZGl2LiIrdGhpcy5jbGFzc2VzLmNvbnRhaW5lcikubGVuZ3RoPT09MCYmdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmRUbyh0aGlzLnMuZHQpfSxnLnByb3RvdHlwZS5fYXR0YWNoTWVzc2FnZT1mdW5jdGlvbigpe3ZhciBfO3RyeXtfPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eVBhbmVzIix0aGlzLmMuaTE4bi5lbXB0eVBhbmVzKX1jYXRjaHtfPW51bGx9aWYoXz09PW51bGwpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLHRoaXMuZG9tLnRpdGxlUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRlKSx0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuaHRtbChfKS5hcHBlbmRUbyh0aGlzLmRvbS5jb250YWluZXIpfSxnLnByb3RvdHlwZS5fYXR0YWNoUGFuZUNvbnRhaW5lcj1mdW5jdGlvbigpe2Zvcih2YXIgXz0wLFM9dGhpcy5zLnBhbmVzO188Uy5sZW5ndGg7XysrKXt2YXIgTj1TW19dO2lmKE4ucy5kaXNwbGF5ZWQ9PT0hMCl7dGhpcy5fYXR0YWNoKCk7cmV0dXJufX10aGlzLl9hdHRhY2hNZXNzYWdlKCl9LGcucHJvdG90eXBlLl9jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBfPSEwLFM9ITAsTj0wLFI9dGhpcy5zLnBhbmVzO048Ui5sZW5ndGg7TisrKXt2YXIgTD1SW05dO0wucy5kaXNwbGF5ZWQmJihMLmRvbS5jb2xsYXBzZUJ1dHRvbi5oYXNDbGFzcyhMLmNsYXNzZXMucm90YXRlZCk/KHRoaXMuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLFM9ITEpOih0aGlzLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksXz0hMSkpfV8mJnRoaXMuZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksUyYmdGhpcy5kb20uc2hvd0FsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpfSxnLnByb3RvdHlwZS5fY2hlY2tNZXNzYWdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBfPTAsUz10aGlzLnMucGFuZXM7XzxTLmxlbmd0aDtfKyspe3ZhciBOPVNbX107aWYoTi5zLmRpc3BsYXllZD09PSEwKXt0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuZGV0YWNoKCksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn19dGhpcy5fYXR0YWNoTWVzc2FnZSgpfSxnLnByb3RvdHlwZS5fY29sbGFwc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtOLmNvbGxhcHNlKCl9fSxnLnByb3RvdHlwZS5fZmluZFBhbmU9ZnVuY3Rpb24oXyl7Zm9yKHZhciBTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspe3ZhciBSPU5bU107aWYoXz09PVIucy5uYW1lKXJldHVybiBSfX0sZy5wcm90b3R5cGUuX2dldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpO18mJl8uc2VhcmNoUGFuZXMmJl8uc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PV8uc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCl9LGcucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9ucz1mdW5jdGlvbihfKXtmb3IodmFyIFM9MCxOPV87UzxOLmxlbmd0aDtTKyspe2Zvcih2YXIgUj1OW1NdLEw9dm9pZCAwLFg9MCxqPXRoaXMucy5wYW5lcztYPGoubGVuZ3RoO1grKyl7dmFyIEc9altYXTtpZihHLnMuaW5kZXg9PT1SLmNvbHVtbil7TD1HO2JyZWFrfX1pZihMJiZMLnMuZHRQYW5lKXtmb3IodmFyIGF0PTA7YXQ8TC5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7YXQrKylSLnJvd3MuaW5jbHVkZXModHlwZW9mIEwucy5kdFBhbmUucm93KGF0KS5kYXRhKCkuZmlsdGVyPT0iZnVuY3Rpb24iP0wucy5kdFBhbmUuY2VsbChhdCwwKS5kYXRhKCk6TC5zLmR0UGFuZS5yb3coYXQpLmRhdGEoKS5maWx0ZXIpJiZMLnMuZHRQYW5lLnJvdyhhdCkuc2VsZWN0KCk7TC51cGRhdGVUYWJsZSgpfX19LGcucHJvdG90eXBlLl9wYW5lRGVjbGFyZT1mdW5jdGlvbihfLFMsTil7dmFyIFI9dGhpcztfLmNvbHVtbnModGhpcy5jLmNvbHVtbnMubGVuZ3RoPjA/dGhpcy5jLmNvbHVtbnM6dm9pZCAwKS5lcSgwKS5lYWNoKGZ1bmN0aW9uKEcpe1Iucy5wYW5lcy5wdXNoKG5ldyBSLnMucGFuZUNsYXNzKFMsTixHLFIuZG9tLnBhbmVzKSl9KTtmb3IodmFyIEw9Xy5jb2x1bW5zKCkuZXEoMCkudG9BcnJheSgpLmxlbmd0aCxYPTA7WDx0aGlzLmMucGFuZXMubGVuZ3RoO1grKyl7dmFyIGo9TCtYO3RoaXMucy5wYW5lcy5wdXNoKG5ldyB0aGlzLnMucGFuZUNsYXNzKFMsTixqLHRoaXMuZG9tLnBhbmVzLHRoaXMuYy5wYW5lc1tYXSkpfXRoaXMuYy5vcmRlci5sZW5ndGg+MCYmKHRoaXMucy5wYW5lcz10aGlzLmMub3JkZXIubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBSLl9maW5kUGFuZShHKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zdGFydHVwKF8pOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvSW5pdENvbXBsZXRlLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gUi5fc3RhcnR1cChfKX0pfSxnLnByb3RvdHlwZS5fc2V0Q29sbGFwc2VMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBfPXRoaXM7dGhpcy5kb20uY29sbGFwc2VBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtfLl9jb2xsYXBzZUFsbCgpLF8uZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksXy5kb20uc2hvd0FsbC5yZW1vdmVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksXy5zLmR0LnN0YXRlLnNhdmUoKX0pLHRoaXMuZG9tLnNob3dBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtfLl9zaG93QWxsKCksXy5kb20uc2hvd0FsbC5hZGRDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLF8uZG9tLmNvbGxhcHNlQWxsLnJlbW92ZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSk7Zm9yKHZhciBTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspe3ZhciBSPU5bU107Ui5kb20udG9wUm93Lm9mZigiY29sbGFwc2UuZHRzcHMiKS5vbigiY29sbGFwc2UuZHRzcHMiLGZ1bmN0aW9uKCl7cmV0dXJuIF8uX2NoZWNrQ29sbGFwc2UoKX0pfXRoaXMuX2NoZWNrQ29sbGFwc2UoKX0sZy5wcm90b3R5cGUuX3Nob3dBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtOLnNob3coKX19LGcucHJvdG90eXBlLl9zdGFydHVwPWZ1bmN0aW9uKF8pe3ZhciBTPXRoaXM7dGhpcy5fYXR0YWNoKCksdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIE49dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sUj0wLEw9dGhpcy5zLnBhbmVzO1I8TC5sZW5ndGg7UisrKXt2YXIgWD1MW1JdO1gucmVidWlsZFBhbmUoT2JqZWN0LmtleXModGhpcy5zLnNlcnZlckRhdGEpLmxlbmd0aD4wP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCksdGhpcy5kb20ucGFuZXMuYXBwZW5kKFguZG9tLmNvbnRhaW5lcil9dGhpcy5jLmxheW91dD09PSJhdXRvIiYmdGhpcy5yZXNpemVQYW5lcygpO3ZhciBqPXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKTshdGhpcy5zLnN0YXRlUmVhZCYmaiYmdGhpcy5zLmR0LnBhZ2Uoai5zdGFydC90aGlzLnMuZHQucGFnZS5sZW4oKSkuZHJhdygicGFnZSIpLHRoaXMucy5zdGF0ZVJlYWQ9ITAsdGhpcy5fY2hlY2tNZXNzYWdlKCksXy5vbigicHJlRHJhdy5kdHNwcyIsZnVuY3Rpb24oKXshUy5zLnVwZGF0aW5nJiYhUy5zLnBhZ2luZyYmKFMuX3VwZGF0ZUZpbHRlckNvdW50KCksUy5fdXBkYXRlU2VsZWN0aW9uKCkpLFMucy5wYWdpbmc9ITF9KSxvKHdpbmRvdykub24oInJlc2l6ZS5kdHNwcyIsZi51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIFMucmVzaXplUGFuZXMoKX0pKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNwcyIsZnVuY3Rpb24oYXQsSix0dCl7Sj09PU4mJih0dC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzPXt9KSx0dC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0PVMucy5zZWxlY3Rpb25MaXN0KX0pLHRoaXMuX3N0YXRlTG9hZExpc3RlbmVyKCksXy5vZmYoInBhZ2UuZHRzcHMgcGFnZS1uYy5kdHNwcyIpLm9uKCJwYWdlLmR0c3BzIHBhZ2UtbmMuZHRzcHMiLGZ1bmN0aW9uKGF0LEope1Mucy5wYWdpbmc9ITAsUy5zLnBhZ2luZ1NUPSEwLFMucy5wYWdlPVMucy5kdC5wYWdlKCl9KSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT9fLm9mZigicHJlWGhyLmR0c3BzIikub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oYXQsSix0dCl7aWYoSj09PU4pe3R0LnNlYXJjaFBhbmVzfHwodHQuc2VhcmNoUGFuZXM9e30pLHR0LnNlYXJjaFBhbmVzX251bGx8fCh0dC5zZWFyY2hQYW5lc19udWxsPXt9KTtmb3IodmFyIHl0PTAsVHQ9MCxBdD1TLnMucGFuZXM7VHQ8QXQubGVuZ3RoO1R0Kyspe3ZhciBrdD1BdFtUdF0sTHQ9Uy5zLmR0LmNvbHVtbihrdC5zLmluZGV4KS5kYXRhU3JjKCk7aWYodHQuc2VhcmNoUGFuZXNbTHRdfHwodHQuc2VhcmNoUGFuZXNbTHRdPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsW0x0XXx8KHR0LnNlYXJjaFBhbmVzX251bGxbTHRdPXt9KSxrdC5zLmR0UGFuZSlmb3IodmFyIEJ0PWt0LnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSwkdD0wOyR0PEJ0Lmxlbmd0aDskdCsrKXR0LnNlYXJjaFBhbmVzW0x0XVskdF09QnRbJHRdLmZpbHRlcix0dC5zZWFyY2hQYW5lc1tMdF1bJHRdP3R0LnNlYXJjaFBhbmVzX251bGxbTHRdWyR0XT0hMTp0dC5zZWFyY2hQYW5lc19udWxsW0x0XVskdF09ITAseXQrK315dD4wJiYoeXQhPT1TLnMuZmlsdGVyQ291bnQ/KHR0LnN0YXJ0PTAsUy5zLnBhZ2U9MCk6dHQuc3RhcnQ9Uy5zLnBhZ2UqUy5zLmR0LnBhZ2UubGVuKCksUy5zLmR0LnBhZ2UoUy5zLnBhZ2UpLFMucy5maWx0ZXJDb3VudD15dCksUy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJih0dC5zZWFyY2hQYW5lc0xhc3Q9Uy5zLmR0LmNvbHVtbihTLnMuc2VsZWN0aW9uTGlzdFtTLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGgtMV0uY29sdW1uKS5kYXRhU3JjKCkpLHR0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Uy5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Uy5jLnZpZXdDb3VudCx2aWV3VG90YWw6Uy5jLnZpZXdUb3RhbH19fSk6Xy5vbigicHJlWGhyLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBTLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihhdCl7cmV0dXJuIGF0LmNsZWFyRGF0YSgpfSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNwcyIsZnVuY3Rpb24oYXQsSil7aWYoSi5uVGFibGU9PT1TLnMuZHQudGFibGUoKS5ub2RlKCkmJiFTLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dmFyIHR0PSExO1Mucy5kdC5vbmUoInByZURyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7aWYoIXR0KXt2YXIgeXQ9Uy5zLmR0LnBhZ2UoKTt0dD0hMCxTLnMudXBkYXRpbmc9ITAsUy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIFR0PTAsQXQ9Uy5zLnBhbmVzO1R0PEF0Lmxlbmd0aDtUdCsrKXt2YXIga3Q9QXRbVHRdO2t0LmNsZWFyRGF0YSgpLGt0LnJlYnVpbGRQYW5lKHZvaWQgMCwhMCksUy5kb20ucGFuZXMuYXBwZW5kKGt0LmRvbS5jb250YWluZXIpfVMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHxTLnMuZHQuZHJhdygpLFMucy51cGRhdGluZz0hMSxTLl91cGRhdGVTZWxlY3Rpb24oKSxTLl9jaGVja01lc3NhZ2UoKSxTLnMuZHQub25lKCJkcmF3LmR0c3BzIixmdW5jdGlvbigpe1Mucy51cGRhdGluZz0hMCxTLnMuZHQucGFnZSh5dCkuZHJhdyghMSksUy5zLnVwZGF0aW5nPSExfSl9fSl9fSk7dmFyIEc9dGhpcy5jLnByZVNlbGVjdDtqJiZqLnNlYXJjaFBhbmVzJiZqLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3QmJihHPWouc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCksdGhpcy5fbWFrZVNlbGVjdGlvbnMoRyksdGhpcy5fdXBkYXRlRmlsdGVyQ291bnQoKSxfLm9uKCJkZXN0cm95LmR0c3BzIixmdW5jdGlvbihhdCxKKXtpZihKPT09Til7Zm9yKHZhciB0dD0wLHl0PVMucy5wYW5lczt0dDx5dC5sZW5ndGg7dHQrKyl7dmFyIFR0PXl0W3R0XTtUdC5kZXN0cm95KCl9Xy5vZmYoIi5kdHNwcyIpLFMuZG9tLnNob3dBbGwub2ZmKCIuZHRzcHMiKSxTLmRvbS5jbGVhckFsbC5vZmYoIi5kdHNwcyIpLFMuZG9tLmNvbGxhcHNlQWxsLm9mZigiLmR0c3BzIiksbyhfLnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNwcyIpLFMuZG9tLmNvbnRhaW5lci5kZXRhY2goKSxTLmNsZWFyU2VsZWN0aW9ucygpfX0pLHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5fc2V0Q29sbGFwc2VMaXN0ZW5lcigpLHRoaXMuYy5jbGVhciYmdGhpcy5kb20uY2xlYXJBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gUy5jbGVhclNlbGVjdGlvbnMoKX0pLE4uX3NlYXJjaFBhbmVzPXRoaXMsdGhpcy5zLmR0LnN0YXRlLnNhdmUoKX0sZy5wcm90b3R5cGUuX3VwZGF0ZUZpbHRlckNvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBfPTAsUz0wLE49MCxSPXRoaXMucy5wYW5lcztOPFIubGVuZ3RoO04rKyl7dmFyIEw9UltOXTtMLnMuZHRQYW5lJiYoXys9TC5nZXRQYW5lQ291bnQoKSxMLnMuZHRQYW5lLnNlYXJjaCgpJiZTKyspfXRoaXMuZG9tLnRpdGxlLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLnRpdGxlIix0aGlzLmMuaTE4bi50aXRsZSxfKSksdGhpcy5jLmZpbHRlckNoYW5nZWQmJnR5cGVvZiB0aGlzLmMuZmlsdGVyQ2hhbmdlZD09ImZ1bmN0aW9uIiYmdGhpcy5jLmZpbHRlckNoYW5nZWQuY2FsbCh0aGlzLnMuZHQsXyksXz09PTAmJlM9PT0wP3RoaXMuZG9tLmNsZWFyQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIik6dGhpcy5kb20uY2xlYXJBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfSxnLnZlcnNpb249IjIuMy4wIixnLmNsYXNzZXM9e2NsZWFyOiJkdHNwLWNsZWFyIixjbGVhckFsbDoiZHRzcC1jbGVhckFsbCIsY29sbGFwc2VBbGw6ImR0c3AtY29sbGFwc2VBbGwiLGNvbnRhaW5lcjoiZHRzcC1zZWFyY2hQYW5lcyIsZGlzYWJsZWRCdXR0b246ImR0c3AtZGlzYWJsZWRCdXR0b24iLGVtcHR5TWVzc2FnZToiZHRzcC1lbXB0eU1lc3NhZ2UiLGhpZGU6ImR0c3AtaGlkZGVuIixwYW5lczoiZHRzcC1wYW5lc0NvbnRhaW5lciIsc2VhcmNoOiJkdHNwLXNlYXJjaCIsc2hvd0FsbDoiZHRzcC1zaG93QWxsIix0aXRsZToiZHRzcC10aXRsZSIsdGl0bGVSb3c6ImR0c3AtdGl0bGVSb3cifSxnLmRlZmF1bHRzPXtjYXNjYWRlUGFuZXM6ITEsY2xlYXI6ITAsY29sbGFwc2U6ITAsY29sdW1uczpbXSxjb250YWluZXI6ZnVuY3Rpb24oXyl7cmV0dXJuIF8udGFibGUoKS5jb250YWluZXIoKX0sZmlsdGVyQ2hhbmdlZDp2b2lkIDAsaTE4bjp7Y2xlYXJNZXNzYWdlOiJDbGVhciBBbGwiLGNsZWFyUGFuZToiJnRpbWVzOyIsY29sbGFwc2U6ezA6IlNlYXJjaFBhbmVzIixfOiJTZWFyY2hQYW5lcyAoJWQpIn0sY29sbGFwc2VNZXNzYWdlOiJDb2xsYXBzZSBBbGwiLGNvdW50OiJ7dG90YWx9IixlbXB0eU1lc3NhZ2U6IjxlbT5ObyBkYXRhPC9lbT4iLGVtcHR5UGFuZXM6Ik5vIFNlYXJjaFBhbmVzIixsb2FkTWVzc2FnZToiTG9hZGluZyBTZWFyY2ggUGFuZXMuLi4iLHNob3dNZXNzYWdlOiJTaG93IEFsbCIsdGl0bGU6IkZpbHRlcnMgQWN0aXZlIC0gJWQifSxsYXlvdXQ6ImF1dG8iLG9yZGVyOltdLHBhbmVzOltdLHByZVNlbGVjdDpbXSx2aWV3Q291bnQ6ITAsdmlld1RvdGFsOiExfSxnfSgpLHU9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBnPWZ1bmN0aW9uKF8sUyl7cmV0dXJuIGc9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKE4sUil7Ti5fX3Byb3RvX189Un18fGZ1bmN0aW9uKE4sUil7Zm9yKHZhciBMIGluIFIpUi5oYXNPd25Qcm9wZXJ0eShMKSYmKE5bTF09UltMXSl9LGcoXyxTKX07cmV0dXJuIGZ1bmN0aW9uKF8sUyl7ZyhfLFMpO2Z1bmN0aW9uIE4oKXt0aGlzLmNvbnN0cnVjdG9yPV99Xy5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooTi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IE4pfX0oKSx6PWZ1bmN0aW9uKGcpe3UoXyxnKTtmdW5jdGlvbiBfKFMsTixSKXtSPT09dm9pZCAwJiYoUj0hMSk7dmFyIEw9dGhpcyxYO04uY2FzY2FkZVBhbmVzJiZOLnZpZXdUb3RhbD9YPWg6Ti5jYXNjYWRlUGFuZXM/WD13Ok4udmlld1RvdGFsJiYoWD1iKSxMPWcuY2FsbCh0aGlzLFMsTixSLFgpfHx0aGlzO3ZhciBqPUwucy5kdCxHPWouc3RhdGUubG9hZGVkKCksYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTC5faW5pdFNlbGVjdGlvbkxpc3RlbmVycyghMCxHJiZHLnNlYXJjaFBhbmVzJiZHLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3Q/Ry5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0OkwuYy5wcmVTZWxlY3QpfTtyZXR1cm4gai5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP2F0KCk6ai5vZmYoImluaXQuZHRzcHMiKS5vbigiaW5pdC5kdHNwcyIsYXQpLEx9cmV0dXJuIF8ucHJvdG90eXBlLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzPWZ1bmN0aW9uKFMsTil7Uz09PXZvaWQgMCYmKFM9ITApLE49PT12b2lkIDAmJihOPVtdKSxTJiYodGhpcy5zLnNlbGVjdGlvbkxpc3Q9Tik7Zm9yKHZhciBSPTAsTD10aGlzLnMucGFuZXM7UjxMLmxlbmd0aDtSKyspe3ZhciBYPUxbUl07WC5zLmRpc3BsYXllZCYmWC5zLmR0UGFuZS5vZmYoInNlbGVjdC5kdHNwIikub24oInNlbGVjdC5kdHNwIix0aGlzLl91cGRhdGUoWCkpLm9mZigiZGVzZWxlY3QuZHRzcCIpLm9uKCJkZXNlbGVjdC5kdHNwIix0aGlzLl91cGRhdGVUaW1lb3V0KFgpKX10aGlzLnMuZHQub2ZmKCJkcmF3LmR0c3BzIikub24oImRyYXcuZHRzcHMiLHRoaXMuX3VwZGF0ZSgpKSx0aGlzLl91cGRhdGVTZWxlY3Rpb25MaXN0KCl9LF8ucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXtmb3IodmFyIFM9MCxOPXRoaXMucy5wYW5lcztTPE4ubGVuZ3RoO1MrKyl7dmFyIFI9TltTXTtpZihSLnMuY29sT3B0cy5zaG93KXt2YXIgTD10aGlzLnMuZHQuY29sdW1uKFIucy5pbmRleCkuZGF0YVNyYygpLFg9ITA7aWYodGhpcy5zLnNlcnZlckRhdGEuc2VhcmNoUGFuZXMub3B0aW9uc1tMXSlmb3IodmFyIGo9MCxHPXRoaXMucy5zZXJ2ZXJEYXRhLnNlYXJjaFBhbmVzLm9wdGlvbnNbTF07ajxHLmxlbmd0aDtqKyspe3ZhciBhdD1HW2pdO2lmKGF0LnRvdGFsIT09YXQuY291bnQpe1g9ITE7YnJlYWt9fVIucy5maWx0ZXJpbmdBY3RpdmU9IVgsUi5fc2VydmVyUG9wdWxhdGUodGhpcy5zLnNlcnZlckRhdGEpfX19LF8ucHJvdG90eXBlLl9zdGF0ZUxvYWRMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBTPXRoaXMsTj1mdW5jdGlvbihSLEwsWCl7aWYoWC5zZWFyY2hQYW5lcyE9PXZvaWQgMCl7aWYoUy5zLnNlbGVjdGlvbkxpc3Q9WC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P1guc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxYLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgaj0wLEc9WC5zZWFyY2hQYW5lcy5wYW5lcztqPEcubGVuZ3RoO2orKylmb3IodmFyIGF0PUdbal0sSj0wLHR0PVMucy5wYW5lcztKPHR0Lmxlbmd0aDtKKyspe3ZhciB5dD10dFtKXTthdC5pZD09PXl0LnMuaW5kZXgmJnl0LnMuZHRQYW5lJiYoeXQuZG9tLnNlYXJjaEJveC52YWwoYXQuc2VhcmNoVGVybSkseXQucy5kdFBhbmUub3JkZXIoYXQub3JkZXIpKX1TLl91cGRhdGVTZWxlY3Rpb25MaXN0KCl9fTt0aGlzLnMuZHQub2ZmKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcHMiLE4pLm9uKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcHMiLE4pfSxfLnByb3RvdHlwZS5fdXBkYXRlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7fSxfLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXM7cmV0dXJuIFM9PT12b2lkIDAmJihTPXZvaWQgMCksZnVuY3Rpb24oKXtTJiZjbGVhclRpbWVvdXQoUy5zLmRlc2VsZWN0VGltZW91dCksTi5fdXBkYXRlU2VsZWN0aW9uTGlzdChTKX19LF8ucHJvdG90eXBlLl91cGRhdGVUaW1lb3V0PWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXM7cmV0dXJuIFM9PT12b2lkIDAmJihTPXZvaWQgMCksZnVuY3Rpb24oKXtyZXR1cm4gUz9TLnMuZGVzZWxlY3RUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gTi5fdXBkYXRlU2VsZWN0aW9uTGlzdChTKX0sNTApOk4uX3VwZGF0ZVNlbGVjdGlvbkxpc3QoKX19LF8ucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb25MaXN0PWZ1bmN0aW9uKFMpe2lmKFM9PT12b2lkIDAmJihTPXZvaWQgMCksdGhpcy5zLnBhZ2luZ1NUKXt0aGlzLnMucGFnaW5nU1Q9ITE7cmV0dXJufWVsc2UgaWYodGhpcy5zLnVwZGF0aW5nfHxTJiZTLnMuc2VydmVyU2VsZWN0aW5nKXJldHVybjtpZihTIT09dm9pZCAwKXt0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmUy5fdXBkYXRlU2VsZWN0aW9uKCk7dmFyIE49Uy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubWFwKGZ1bmN0aW9uKFIpe3JldHVybiBSLmZpbHRlcn0pO3RoaXMucy5zZWxlY3Rpb25MaXN0PXRoaXMucy5zZWxlY3Rpb25MaXN0LmZpbHRlcihmdW5jdGlvbihSKXtyZXR1cm4gUi5jb2x1bW4hPT1TLnMuaW5kZXh9KSxOLmxlbmd0aD4wPyh0aGlzLnMuc2VsZWN0aW9uTGlzdC5wdXNoKHtjb2x1bW46Uy5zLmluZGV4LHJvd3M6Tn0pLFMuZG9tLmNsZWFyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKSk6Uy5kb20uY2xlYXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLmR0LmRyYXcoITEpfXRoaXMuX3JlbWFrZVNlbGVjdGlvbnMoKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpfSxfLnByb3RvdHlwZS5fcmVtYWtlU2VsZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBTLE47aWYodGhpcy5zLnVwZGF0aW5nPSEwLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt0aGlzLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGg+MCYmKE49dGhpcy5zLnBhbmVzW3RoaXMucy5zZWxlY3Rpb25MaXN0W3RoaXMucy5zZWxlY3Rpb25MaXN0Lmxlbmd0aC0xXS5jb2x1bW5dKTtmb3IodmFyIEN0PTAseHQ9dGhpcy5zLnBhbmVzO0N0PHh0Lmxlbmd0aDtDdCsrKVM9eHRbQ3RdLFMucy5kaXNwbGF5ZWQmJighTnx8Uy5zLmluZGV4IT09Ti5zLmluZGV4KSYmUy51cGRhdGVSb3dzKCl9ZWxzZXt2YXIgUj10aGlzLnMuc2VsZWN0aW9uTGlzdCxMPSExO3RoaXMuY2xlYXJTZWxlY3Rpb25zKCksdGhpcy5zLmR0LmRyYXcoITEpLHRoaXMucy5kdC5yb3dzKCkudG9BcnJheSgpWzBdLmxlbmd0aD50aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLnRvQXJyYXkoKVswXS5sZW5ndGgmJihMPSEwKSx0aGlzLnMuc2VsZWN0aW9uTGlzdD1SO2Zvcih2YXIgWD0wLGo9dGhpcy5zLnBhbmVzO1g8ai5sZW5ndGg7WCsrKU49altYXSxOLnMuZGlzcGxheWVkJiYoTi5zLmZpbHRlcmluZ0FjdGl2ZT1MLE4udXBkYXRlUm93cygpKTtmb3IodmFyIEc9MCxhdD10aGlzLnMuc2VsZWN0aW9uTGlzdDtHPGF0Lmxlbmd0aDtHKyspe3ZhciBKPWF0W0ddO049bnVsbDtmb3IodmFyIHR0PTAseXQ9dGhpcy5zLnBhbmVzO3R0PHl0Lmxlbmd0aDt0dCsrKXt2YXIgVHQ9eXRbdHRdO2lmKFR0LnMuaW5kZXg9PT1KLmNvbHVtbil7Tj1UdDticmVha319aWYoTi5zLmR0UGFuZSl7Zm9yKHZhciBBdD1OLnMuZHRQYW5lLnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLGt0PTA7a3Q8Si5yb3dzLmxlbmd0aDtrdCsrKXtmb3IodmFyIEx0PSExLEJ0PTAsJHQ9QXQ7QnQ8JHQubGVuZ3RoO0J0Kyspe3ZhciBLdD0kdFtCdF0sRD1OLnMuZHRQYW5lLnJvdyhLdCksdXQ9RC5kYXRhKCk7Si5yb3dzW2t0XT09PXV0LmZpbHRlciYmKEQuc2VsZWN0KCksTHQ9ITApfUx0fHwoSi5yb3dzLnNwbGljZShrdCwxKSxrdC0tKX1pZihOLnMuc2VsZWN0aW9ucz1KLnJvd3MsSi5yb3dzLmxlbmd0aCE9PTApe3RoaXMucy5kdC5kcmF3KCk7Zm9yKHZhciBvdD0hMSxIPTAsTT0wLFk9MCxwdD0wLG10PXRoaXMucy5wYW5lcztwdDxtdC5sZW5ndGg7cHQrKylTPW10W3B0XSxTLnMuZHRQYW5lJiYoSCs9Uy5nZXRQYW5lQ291bnQoKSxIPk0mJihZKyssTT1IKSk7b3Q9SD4wO2Zvcih2YXIgcnQ9MCxndD10aGlzLnMucGFuZXM7cnQ8Z3QubGVuZ3RoO3J0KyspUz1ndFtydF0sUy5zLmRpc3BsYXllZCYmKEx8fE4ucy5pbmRleCE9PVMucy5pbmRleHx8IW90P1Mucy5maWx0ZXJpbmdBY3RpdmU9b3R8fEw6WT09PTEmJihTLnMuZmlsdGVyaW5nQWN0aXZlPSExKSxTLnMuaW5kZXghPT1OLnMuaW5kZXgmJlMudXBkYXRlUm93cygpKX19fXRoaXMucy5kdC5kcmF3KCExKX10aGlzLnMudXBkYXRpbmc9ITF9LF99KEIpO3IocWUpLEMocWUpLHAocWUpLFQocWUpLEYocWUpO3ZhciBxPXFlLmZuLmRhdGFUYWJsZTtxLlNlYXJjaFBhbmVzPUIsc3QuU2VhcmNoUGFuZXM9QixxLlNlYXJjaFBhbmVzU1Q9eixzdC5TZWFyY2hQYW5lc1NUPXoscS5TZWFyY2hQYW5lPW4sc3QuU2VhcmNoUGFuZT1uLHEuU2VhcmNoUGFuZVZpZXdUb3RhbD1iLHN0LlNlYXJjaFBhbmVWaWV3VG90YWw9YixxLlNlYXJjaFBhbmVDYXNjYWRlPXcsc3QuU2VhcmNoUGFuZUNhc2NhZGU9dyxxLlNlYXJjaFBhbmVDYXNjYWRlVmlld1RvdGFsPWgsc3QuU2VhcmNoUGFuZUNhc2NhZGVWaWV3VG90YWw9aDt2YXIgZXQ9cWUuZm4uZGF0YVRhYmxlLkFwaS5yZWdpc3RlcjtldCgic2VhcmNoUGFuZXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGV0KCJzZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGcpe2cuX3NlYXJjaFBhbmVzJiZnLl9zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0pfSksZXQoInNlYXJjaFBhbmVzLnJlYnVpbGRQYW5lKCkiLGZ1bmN0aW9uKGcsXyl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihTKXtTLl9zZWFyY2hQYW5lcyYmUy5fc2VhcmNoUGFuZXMucmVidWlsZChnLF8pfSl9KSxldCgic2VhcmNoUGFuZXMucmVzaXplUGFuZXMoKSIsZnVuY3Rpb24oKXt2YXIgZz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGcuX3NlYXJjaFBhbmVzP2cuX3NlYXJjaFBhbmVzLnJlc2l6ZVBhbmVzKCk6bnVsbH0pLGV0KCJzZWFyY2hQYW5lcy5jb250YWluZXIoKSIsZnVuY3Rpb24oKXt2YXIgZz10aGlzLmNvbnRleHRbMF07cmV0dXJuIGcuX3NlYXJjaFBhbmVzP2cuX3NlYXJjaFBhbmVzLmdldE5vZGUoKTpudWxsfSksc3QuZXh0LmJ1dHRvbnMuc2VhcmNoUGFuZXNDbGVhcj17YWN0aW9uOmZ1bmN0aW9uKGcsXyl7Xy5zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0sdGV4dDoiQ2xlYXIgUGFuZXMifSxzdC5leHQuYnV0dG9ucy5zZWFyY2hQYW5lcz17YWN0aW9uOmZ1bmN0aW9uKGcsXyxTLE4pe3ZhciBSPXRoaXMsTD10aGlzO04uX3BhbmVzPyh0aGlzLnBvcG92ZXIoTi5fcGFuZXMuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSksTi5fcGFuZXMucmVidWlsZCh2b2lkIDAsITApKToodGhpcy5wcm9jZXNzaW5nKCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TyhfLFMsTiksUi5wb3BvdmVyKE4uX3BhbmVzLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pLE4uX3BhbmVzLnJlYnVpbGQodm9pZCAwLCEwKSxxZSgidGFibGUuZGF0YVRhYmxlIixOLl9wYW5lcy5nZXROb2RlKCkpLkRhdGFUYWJsZSgpLmNvbHVtbnMuYWRqdXN0KCksTC5wcm9jZXNzaW5nKCExKX0sMTApKX0saW5pdDpmdW5jdGlvbihnLF8sUyl7Zy5idXR0b24oXykudGV4dChTLnRleHR8fGcuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2UiLCJTZWFyY2hQYW5lcyIsMCkpLChnLmluaXQoKS5zdGF0ZVNhdmV8fFMuZGVsYXlJbml0PT09ITEpJiZPKGcsXyxTKX0sY29uZmlnOnt9LHRleHQ6IiIsZGVsYXlJbml0OiEwfTtmdW5jdGlvbiBPKGcsXyxTKXt2YXIgTj1xZS5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oTCl7Zy5idXR0b24oXykudGV4dChnLmkxOG4oInNlYXJjaFBhbmVzLmNvbGxhcHNlIixnLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNlYXJjaFBhbmVzIT09dm9pZCAwP2cuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc2VhcmNoUGFuZXMuY29sbGFwc2U6Zy5jb250ZXh0WzBdLl9zZWFyY2hQYW5lcy5jLmkxOG4uY29sbGFwc2UsTCkpfX0sUy5jb25maWcpLFI9TiYmKE4uY2FzY2FkZVBhbmVzfHxOLnZpZXdUb3RhbCk/bmV3IHN0LlNlYXJjaFBhbmVzU1QoZyxOKTpuZXcgc3QuU2VhcmNoUGFuZXMoZyxOKTtnLmJ1dHRvbihfKS50ZXh0KFMudGV4dHx8Zy5pMThuKCJzZWFyY2hQYW5lcy5jb2xsYXBzZSIsUi5jLmkxOG4uY29sbGFwc2UsMCkpLFMuX3BhbmVzPVJ9ZnVuY3Rpb24gWihnLF8sUyl7Xz09PXZvaWQgMCYmKF89bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpO3ZhciBOPW5ldyBxLkFwaShnKSxSPV98fE4uaW5pdCgpLnNlYXJjaFBhbmVzfHxxLmRlZmF1bHRzLnNlYXJjaFBhbmVzLEw9UiYmKFIuY2FzY2FkZVBhbmVzfHxSLnZpZXdUb3RhbCk/bmV3IHooTixSLFMpOm5ldyBCKE4sUixTKSxYPUwuZ2V0Tm9kZSgpO3JldHVybiBYfXFlKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbihnLF8pe2cubmFtZXNwYWNlPT09ImR0IiYmKF8ub0luaXQuc2VhcmNoUGFuZXN8fHN0LmRlZmF1bHRzLnNlYXJjaFBhbmVzKSYmKF8uX3NlYXJjaFBhbmVzfHxaKF8sbnVsbCwhMCkpfSksc3QuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlAiLGZuSW5pdDpafSksc3QuZmVhdHVyZSYmc3QuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoUGFuZXMiLFopfSkoKTt2YXIgcWw9bmUoaWUoKSwxKTt2YXIgSHM9bmUoaWUoKSwxKTt2YXIgUnQ9SHMuZGVmYXVsdDtzdC5zZWxlY3Q9e307c3Quc2VsZWN0LnZlcnNpb249IjIuMC4xIjtzdC5zZWxlY3QuaW5pdD1mdW5jdGlvbih0KXt2YXIgZT10LnNldHRpbmdzKClbMF07aWYoIXN0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IFNlbGVjdCByZXF1aXJlcyBEYXRhVGFibGVzIDIgb3IgbmV3ZXIiO2lmKCFlLl9zZWxlY3Qpe3ZhciByPXQuc3RhdGUubG9hZGVkKCksbj1mdW5jdGlvbihGLGgsbyl7aWYoIShvPT09bnVsbHx8by5zZWxlY3Q9PT12b2lkIDApKXtpZih0LnJvd3Moe3NlbGVjdGVkOiEwfSkuYW55KCkmJnQucm93cygpLmRlc2VsZWN0KCksby5zZWxlY3Qucm93cyE9PXZvaWQgMCYmdC5yb3dzKG8uc2VsZWN0LnJvd3MpLnNlbGVjdCgpLHQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5jb2x1bW5zKCkuZGVzZWxlY3QoKSxvLnNlbGVjdC5jb2x1bW5zIT09dm9pZCAwJiZ0LmNvbHVtbnMoby5zZWxlY3QuY29sdW1ucykuc2VsZWN0KCksdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5jZWxscygpLmRlc2VsZWN0KCksby5zZWxlY3QuY2VsbHMhPT12b2lkIDApZm9yKHZhciBmPTA7ZjxvLnNlbGVjdC5jZWxscy5sZW5ndGg7ZisrKXQuY2VsbChvLnNlbGVjdC5jZWxsc1tmXS5yb3csby5zZWxlY3QuY2VsbHNbZl0uY29sdW1uKS5zZWxlY3QoKTt0LnN0YXRlLnNhdmUoKX19O3Qub24oInN0YXRlU2F2ZVBhcmFtcyIsZnVuY3Rpb24oRixoLG8pe28uc2VsZWN0PXt9LG8uc2VsZWN0LnJvd3M9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmlkcyghMCkudG9BcnJheSgpLG8uc2VsZWN0LmNvbHVtbnM9dC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pWzBdLG8uc2VsZWN0LmNlbGxzPXQuY2VsbHMoe3NlbGVjdGVkOiEwfSlbMF0ubWFwKGZ1bmN0aW9uKGYpe3JldHVybntyb3c6dC5yb3coZi5yb3cpLmlkKCEwKSxjb2x1bW46Zi5jb2x1bW59fSl9KS5vbigic3RhdGVMb2FkUGFyYW1zIixuKS5vbmUoImluaXQiLGZ1bmN0aW9uKCl7bih2b2lkIDAsdm9pZCAwLHIpfSk7dmFyIHM9ZS5vSW5pdC5zZWxlY3QsYT1zdC5kZWZhdWx0cy5zZWxlY3QsbD1zPT09dm9pZCAwP2E6cyxjPSJyb3ciLHA9ImFwaSIsYj0hMSxtPSEwLHk9ITAsVD0idGQsIHRoIix3PSJzZWxlY3RlZCIsaz0hMCxQPSExO2UuX3NlbGVjdD17aW5mb0VsczpbXX0sbD09PSEwPyhwPSJvcyIsUD0hMCk6dHlwZW9mIGw9PSJzdHJpbmciPyhwPWwsUD0hMCk6UnQuaXNQbGFpbk9iamVjdChsKSYmKGwuYmx1cmFibGUhPT12b2lkIDAmJihiPWwuYmx1cmFibGUpLGwudG9nZ2xlYWJsZSE9PXZvaWQgMCYmKG09bC50b2dnbGVhYmxlKSxsLmluZm8hPT12b2lkIDAmJih5PWwuaW5mbyksbC5pdGVtcyE9PXZvaWQgMCYmKGM9bC5pdGVtcyksbC5zdHlsZSE9PXZvaWQgMD8ocD1sLnN0eWxlLFA9ITApOihwPSJvcyIsUD0hMCksbC5zZWxlY3RvciE9PXZvaWQgMCYmKFQ9bC5zZWxlY3RvciksbC5jbGFzc05hbWUhPT12b2lkIDAmJih3PWwuY2xhc3NOYW1lKSxsLmhlYWRlckNoZWNrYm94IT09dm9pZCAwJiYoaz1sLmhlYWRlckNoZWNrYm94KSksdC5zZWxlY3Quc2VsZWN0b3IoVCksdC5zZWxlY3QuaXRlbXMoYyksdC5zZWxlY3Quc3R5bGUocCksdC5zZWxlY3QuYmx1cmFibGUoYiksdC5zZWxlY3QudG9nZ2xlYWJsZShtKSx0LnNlbGVjdC5pbmZvKHkpLGUuX3NlbGVjdC5jbGFzc05hbWU9dywhUCYmUnQodC50YWJsZSgpLm5vZGUoKSkuaGFzQ2xhc3MoInNlbGVjdGFibGUiKSYmdC5zZWxlY3Quc3R5bGUoIm9zIiksayYmKE1zKHQpLHQub24oImluaXQiLGZ1bmN0aW9uKCl7TXModCl9KSl9fTtmdW5jdGlvbiB6cyh0LGUscil7dmFyIG4scyxhLGw9ZnVuY3Rpb24ocCxiKXtpZihwPmIpe3ZhciBtPWI7Yj1wLHA9bX12YXIgeT0hMTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmluZGV4ZXMoKS5maWx0ZXIoZnVuY3Rpb24oVCl7cmV0dXJuIFQ9PT1wJiYoeT0hMCksVD09PWI/KHk9ITEsITApOnl9KX0sYz1mdW5jdGlvbihwLGIpe3ZhciBtPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKTtpZihtLmluZGV4T2YocCk+bS5pbmRleE9mKGIpKXt2YXIgeT1iO2I9cCxwPXl9dmFyIFQ9ITE7cmV0dXJuIG0uZmlsdGVyKGZ1bmN0aW9uKHcpe3JldHVybiB3PT09cCYmKFQ9ITApLHc9PT1iPyhUPSExLCEwKTpUfSl9OyF0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiYhcj8ocz1sKDAsZS5jb2x1bW4pLGE9YygwLGUucm93KSk6KHM9bChyLmNvbHVtbixlLmNvbHVtbiksYT1jKHIucm93LGUucm93KSksbj10LmNlbGxzKGEscykuZmxhdHRlbigpLHQuY2VsbHMoZSx7c2VsZWN0ZWQ6ITB9KS5hbnkoKT90LmNlbGxzKG4pLmRlc2VsZWN0KCk6dC5jZWxscyhuKS5zZWxlY3QoKX1mdW5jdGlvbiBVaSh0KXt2YXIgZT10LnNldHRpbmdzKClbMF0scj1lLl9zZWxlY3Quc2VsZWN0b3I7UnQodC50YWJsZSgpLmNvbnRhaW5lcigpKS5vZmYoIm1vdXNlZG93bi5kdFNlbGVjdCIscikub2ZmKCJtb3VzZXVwLmR0U2VsZWN0IixyKS5vZmYoImNsaWNrLmR0U2VsZWN0IixyKSxSdCgiYm9keSIpLm9mZigiY2xpY2suZHRTZWxlY3QiK3FpKHQudGFibGUoKS5ub2RlKCkpKX1mdW5jdGlvbiBXcyh0KXt2YXIgZT1SdCh0LnRhYmxlKCkuY29udGFpbmVyKCkpLHI9dC5zZXR0aW5ncygpWzBdLG49ci5fc2VsZWN0LnNlbGVjdG9yLHM7ZS5vbigibW91c2Vkb3duLmR0U2VsZWN0IixuLGZ1bmN0aW9uKGEpeyhhLnNoaWZ0S2V5fHxhLm1ldGFLZXl8fGEuY3RybEtleSkmJmUuY3NzKCItbW96LXVzZXItc2VsZWN0Iiwibm9uZSIpLm9uZSgic2VsZWN0c3RhcnQuZHRTZWxlY3QiLG4sZnVuY3Rpb24oKXtyZXR1cm4hMX0pLHdpbmRvdy5nZXRTZWxlY3Rpb24mJihzPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSl9KS5vbigibW91c2V1cC5kdFNlbGVjdCIsbixmdW5jdGlvbigpe2UuY3NzKCItbW96LXVzZXItc2VsZWN0IiwiIil9KS5vbigiY2xpY2suZHRTZWxlY3QiLG4sZnVuY3Rpb24oYSl7dmFyIGw9dC5zZWxlY3QuaXRlbXMoKSxjO2lmKHMpe3ZhciBwPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZigoIXAuYW5jaG9yTm9kZXx8UnQocC5hbmNob3JOb2RlKS5jbG9zZXN0KCJ0YWJsZSIpWzBdPT09dC50YWJsZSgpLm5vZGUoKSkmJnAhPT1zKXJldHVybn12YXIgYj10LnNldHRpbmdzKClbMF0sbT10LnRhYmxlKCkuY29udGFpbmVyKCk7aWYoUnQoYS50YXJnZXQpLmNsb3Nlc3QoImRpdi5kdC1jb250YWluZXIiKVswXT09bSl7dmFyIHk9dC5jZWxsKFJ0KGEudGFyZ2V0KS5jbG9zZXN0KCJ0ZCwgdGgiKSk7aWYoeS5hbnkoKSl7dmFyIFQ9UnQuRXZlbnQoInVzZXItc2VsZWN0LmR0Iik7aWYoR2UodCxULFtsLHksYV0pLCFULmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgdz15LmluZGV4KCk7bD09PSJyb3ciPyhjPXcucm93LFZpKGEsdCxiLCJyb3ciLGMpKTpsPT09ImNvbHVtbiI/KGM9eS5pbmRleCgpLmNvbHVtbixWaShhLHQsYiwiY29sdW1uIixjKSk6bD09PSJjZWxsIiYmKGM9eS5pbmRleCgpLFZpKGEsdCxiLCJjZWxsIixjKSksYi5fc2VsZWN0X2xhc3RDZWxsPXd9fX19KSxSdCgiYm9keSIpLm9uKCJjbGljay5kdFNlbGVjdCIrcWkodC50YWJsZSgpLm5vZGUoKSksZnVuY3Rpb24oYSl7aWYoci5fc2VsZWN0LmJsdXJhYmxlKXtpZihSdChhLnRhcmdldCkucGFyZW50cygpLmZpbHRlcih0LnRhYmxlKCkuY29udGFpbmVyKCkpLmxlbmd0aHx8UnQoYS50YXJnZXQpLnBhcmVudHMoImh0bWwiKS5sZW5ndGg9PT0wfHxSdChhLnRhcmdldCkucGFyZW50cygiZGl2LkRURSIpLmxlbmd0aClyZXR1cm47dmFyIGw9UnQuRXZlbnQoInNlbGVjdC1ibHVyLmR0Iik7aWYoR2UodCxsLFthLnRhcmdldCxhXSksbC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47SnIociwhMCl9fSl9ZnVuY3Rpb24gR2UodCxlLHIsbil7biYmIXQuZmxhdHRlbigpLmxlbmd0aHx8KHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9ZSsiLmR0Iiksci51bnNoaWZ0KHQpLFJ0KHQudGFibGUoKS5ub2RlKCkpLnRyaWdnZXIoZSxyKSl9ZnVuY3Rpb24ganModCxlKXtpZighKHQuc2VsZWN0LnN0eWxlKCk9PT0iYXBpInx8dC5zZWxlY3QuaW5mbygpPT09ITEpKXt2YXIgcj10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCxuPXQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLGE9ZnVuY3Rpb24oYixtLHkpe2IuYXBwZW5kKFJ0KCc8c3BhbiBjbGFzcz0ic2VsZWN0LWl0ZW0iLz4nKS5hcHBlbmQodC5pMThuKCJzZWxlY3QuIittKyJzIix7XzoiJWQgIittKyJzIHNlbGVjdGVkIiwwOiIiLDE6IjEgIittKyIgc2VsZWN0ZWQifSx5KSkpfSxsPVJ0KGUpLGM9UnQoJzxzcGFuIGNsYXNzPSJzZWxlY3QtaW5mbyIvPicpO2EoYywicm93IixyKSxhKGMsImNvbHVtbiIsbiksYShjLCJjZWxsIixzKTt2YXIgcD1sLmNoaWxkcmVuKCJzcGFuLnNlbGVjdC1pbmZvIik7cC5sZW5ndGgmJnAucmVtb3ZlKCksYy50ZXh0KCkhPT0iIiYmbC5hcHBlbmQoYyl9fWZ1bmN0aW9uIE1zKHQpe3QuY29sdW1ucygiLmR0LXNlbGVjdCIpLmV2ZXJ5KGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWFkZXIoKTtpZighUnQoImlucHV0IixlKS5sZW5ndGgpe3ZhciByPVJ0KCI8aW5wdXQ+IikuYXR0cih7Y2xhc3M6ImR0LXNlbGVjdC1jaGVja2JveCIsdHlwZToiY2hlY2tib3giLCJhcmlhLWxhYmVsIjp0LmkxOG4oInNlbGVjdC5hcmlhLmhlYWRlckNoZWNrYm94Iil8fCJTZWxlY3QgYWxsIHJvd3MifSkuYXBwZW5kVG8oZSkub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ/dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKG4pe24uc3RvcFByb3BhZ2F0aW9uKCl9KTt0Lm9uKCJkcmF3IHNlbGVjdCBkZXNlbGVjdCIsZnVuY3Rpb24obixzLGEpe2lmKGE9PT0icm93Inx8IWEpe3ZhciBsPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5jb3VudCgpLGM9dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQiLHNlbGVjdGVkOiEwfSkuY291bnQoKSxwPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmNvdW50KCk7YyYmYzw9bCYmYz09PXA/ci5wcm9wKCJjaGVja2VkIiwhMCkucHJvcCgiaW5kZXRlcm1pbmF0ZSIsITEpOmM9PT0wJiZsPT09MD9yLnByb3AoImNoZWNrZWQiLCExKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMSk6ci5wcm9wKCJjaGVja2VkIiwhMSkucHJvcCgiaW5kZXRlcm1pbmF0ZSIsITApfX0pfX0pfWZ1bmN0aW9uIFdsKHQpe3ZhciBlPW5ldyBzdC5BcGkodCk7dC5fc2VsZWN0X2luaXQ9ITAsdC5hb1Jvd0NyZWF0ZWRDYWxsYmFjay5wdXNoKGZ1bmN0aW9uKHIsbixzKXt2YXIgYSxsLGM9dC5hb0RhdGFbc107Zm9yKGMuX3NlbGVjdF9zZWxlY3RlZCYmUnQocikuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSkuZmluZCgiaW5wdXQuZHQtc2VsZWN0LWNoZWNrYm94IikucHJvcCgiY2hlY2tlZCIsITApLGE9MCxsPXQuYW9Db2x1bW5zLmxlbmd0aDthPGw7YSsrKSh0LmFvQ29sdW1uc1thXS5fc2VsZWN0X3NlbGVjdGVkfHxjLl9zZWxlY3RlZF9jZWxscyYmYy5fc2VsZWN0ZWRfY2VsbHNbYV0pJiZSdChjLmFuQ2VsbHNbYV0pLmFkZENsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpfSksZS5vbigicHJlWGhyLmR0LmR0U2VsZWN0IixmdW5jdGlvbihyLG4pe2lmKG49PT1lLnNldHRpbmdzKClbMF0pe3ZhciBzPWUucm93cyh7c2VsZWN0ZWQ6ITB9KS5pZHMoITApLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gbCE9PXZvaWQgMH0pLGE9ZS5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5lcSgwKS5tYXAoZnVuY3Rpb24obCl7dmFyIGM9ZS5yb3cobC5yb3cpLmlkKCEwKTtyZXR1cm4gYz97cm93OmMsY29sdW1uOmwuY29sdW1ufTp2b2lkIDB9KS5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJuIGwhPT12b2lkIDB9KTtlLm9uZSgiZHJhdy5kdC5kdFNlbGVjdCIsZnVuY3Rpb24oKXtlLnJvd3Mocykuc2VsZWN0KCksYS5hbnkoKSYmYS5lYWNoKGZ1bmN0aW9uKGwpe2UuY2VsbHMobC5yb3csbC5jb2x1bW4pLnNlbGVjdCgpfSl9KX19KSxlLm9uKCJpbmZvLmR0IixmdW5jdGlvbihyLG4scyl7bi5fc2VsZWN0LmluZm9FbHMuaW5jbHVkZXMocyl8fG4uX3NlbGVjdC5pbmZvRWxzLnB1c2gocyksanMoZSxzKX0pLGUub24oInNlbGVjdC5kdFNlbGVjdC5kdCBkZXNlbGVjdC5kdFNlbGVjdC5kdCIsZnVuY3Rpb24oKXt0Ll9zZWxlY3QuaW5mb0Vscy5mb3JFYWNoKGZ1bmN0aW9uKHIpe2pzKGUscil9KSxlLnN0YXRlLnNhdmUoKX0pLGUub24oImRlc3Ryb3kuZHRTZWxlY3QiLGZ1bmN0aW9uKCl7UnQoZS5yb3dzKHtzZWxlY3RlZDohMH0pLm5vZGVzKCkpLnJlbW92ZUNsYXNzKGUuc2V0dGluZ3MoKVswXS5fc2VsZWN0LmNsYXNzTmFtZSksVWkoZSksZS5vZmYoIi5kdFNlbGVjdCIpLFJ0KCJib2R5Iikub2ZmKCIuZHRTZWxlY3QiK3FpKGUudGFibGUoKS5ub2RlKCkpKX0pfWZ1bmN0aW9uIFZzKHQsZSxyLG4pe3ZhciBzPXRbZSsicyJdKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLGE9cy5pbmRleE9mKG4pLGw9cy5pbmRleE9mKHIpO2lmKCF0W2UrInMiXSh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmYT09PS0xKXMuc3BsaWNlKHMuaW5kZXhPZihyKSsxLHMubGVuZ3RoKTtlbHNle2lmKGE+bCl7dmFyIGM9bDtsPWEsYT1jfXMuc3BsaWNlKGwrMSxzLmxlbmd0aCkscy5zcGxpY2UoMCxhKX10W2VdKHIse3NlbGVjdGVkOiEwfSkuYW55KCk/KHMuc3BsaWNlKHMuaW5kZXhPZihyKSwxKSx0W2UrInMiXShzKS5kZXNlbGVjdCgpKTp0W2UrInMiXShzKS5zZWxlY3QoKX1mdW5jdGlvbiBKcih0LGUpe2lmKGV8fHQuX3NlbGVjdC5zdHlsZT09PSJzaW5nbGUiKXt2YXIgcj1uZXcgc3QuQXBpKHQpO3Iucm93cyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpLHIuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpLHIuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKX19ZnVuY3Rpb24gVmkodCxlLHIsbixzKXt2YXIgYT1lLnNlbGVjdC5zdHlsZSgpLGw9ZS5zZWxlY3QudG9nZ2xlYWJsZSgpLGM9ZVtuXShzLHtzZWxlY3RlZDohMH0pLmFueSgpO2lmKCEoYyYmIWwpKWlmKGE9PT0ib3MiKWlmKHQuY3RybEtleXx8dC5tZXRhS2V5KWVbbl0ocykuc2VsZWN0KCFjKTtlbHNlIGlmKHQuc2hpZnRLZXkpbj09PSJjZWxsIj96cyhlLHMsci5fc2VsZWN0X2xhc3RDZWxsfHxudWxsKTpWcyhlLG4scyxyLl9zZWxlY3RfbGFzdENlbGw/ci5fc2VsZWN0X2xhc3RDZWxsW25dOm51bGwpO2Vsc2V7dmFyIHA9ZVtuKyJzIl0oe3NlbGVjdGVkOiEwfSk7YyYmcC5mbGF0dGVuKCkubGVuZ3RoPT09MT9lW25dKHMpLmRlc2VsZWN0KCk6KHAuZGVzZWxlY3QoKSxlW25dKHMpLnNlbGVjdCgpKX1lbHNlIGE9PSJtdWx0aStzaGlmdCImJnQuc2hpZnRLZXk/bj09PSJjZWxsIj96cyhlLHMsci5fc2VsZWN0X2xhc3RDZWxsfHxudWxsKTpWcyhlLG4scyxyLl9zZWxlY3RfbGFzdENlbGw/ci5fc2VsZWN0X2xhc3RDZWxsW25dOm51bGwpOmVbbl0ocykuc2VsZWN0KCFjKX1mdW5jdGlvbiBxaSh0KXtyZXR1cm4gdC5pZC5yZXBsYWNlKC9bXmEtekEtWjAtOVwtXF9dL2csIi0iKX1SdC5lYWNoKFt7dHlwZToicm93Iixwcm9wOiJhb0RhdGEifSx7dHlwZToiY29sdW1uIixwcm9wOiJhb0NvbHVtbnMifV0sZnVuY3Rpb24odCxlKXtzdC5leHQuc2VsZWN0b3JbZS50eXBlXS5wdXNoKGZ1bmN0aW9uKHIsbixzKXt2YXIgYT1uLnNlbGVjdGVkLGwsYz1bXTtpZihhIT09ITAmJmEhPT0hMSlyZXR1cm4gcztmb3IodmFyIHA9MCxiPXMubGVuZ3RoO3A8YjtwKyspbD1yW2UucHJvcF1bc1twXV0sbCYmKGE9PT0hMCYmbC5fc2VsZWN0X3NlbGVjdGVkPT09ITB8fGE9PT0hMSYmIWwuX3NlbGVjdF9zZWxlY3RlZCkmJmMucHVzaChzW3BdKTtyZXR1cm4gY30pfSk7c3QuZXh0LnNlbGVjdG9yLmNlbGwucHVzaChmdW5jdGlvbih0LGUscil7dmFyIG49ZS5zZWxlY3RlZCxzLGE9W107aWYobj09PXZvaWQgMClyZXR1cm4gcjtmb3IodmFyIGw9MCxjPXIubGVuZ3RoO2w8YztsKyspcz10LmFvRGF0YVtyW2xdLnJvd10scyYmKG49PT0hMCYmcy5fc2VsZWN0ZWRfY2VsbHMmJnMuX3NlbGVjdGVkX2NlbGxzW3JbbF0uY29sdW1uXT09PSEwfHxuPT09ITEmJighcy5fc2VsZWN0ZWRfY2VsbHN8fCFzLl9zZWxlY3RlZF9jZWxsc1tyW2xdLmNvbHVtbl0pKSYmYS5wdXNoKHJbbF0pO3JldHVybiBhfSk7dmFyIHplPXN0LkFwaS5yZWdpc3RlcixPcj1zdC5BcGkucmVnaXN0ZXJQbHVyYWw7emUoInNlbGVjdCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7c3Quc2VsZWN0LmluaXQobmV3IHN0LkFwaSh0KSl9KX0pO3plKCJzZWxlY3QuYmx1cmFibGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3QuYmx1cmFibGU6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC5ibHVyYWJsZT10fSl9KTt6ZSgic2VsZWN0LnRvZ2dsZWFibGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3QudG9nZ2xlYWJsZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0LnRvZ2dsZWFibGU9dH0pfSk7emUoInNlbGVjdC5pbmZvKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LmluZm86dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC5pbmZvPXR9KX0pO3plKCJzZWxlY3QuaXRlbXMoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3QuaXRlbXM6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC5pdGVtcz10LEdlKG5ldyBzdC5BcGkoZSksInNlbGVjdEl0ZW1zIixbdF0pfSl9KTt6ZSgic2VsZWN0LnN0eWxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnN0eWxlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3R8fHN0LnNlbGVjdC5pbml0KG5ldyBzdC5BcGkoZSkpLGUuX3NlbGVjdF9pbml0fHxXbChlKSxlLl9zZWxlY3Quc3R5bGU9dDt2YXIgcj1uZXcgc3QuQXBpKGUpO1VpKHIpLHQhPT0iYXBpIiYmV3MociksR2UobmV3IHN0LkFwaShlKSwic2VsZWN0U3R5bGUiLFt0XSl9KX0pO3plKCJzZWxlY3Quc2VsZWN0b3IoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3Quc2VsZWN0b3I6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe1VpKG5ldyBzdC5BcGkoZSkpLGUuX3NlbGVjdC5zZWxlY3Rvcj10LGUuX3NlbGVjdC5zdHlsZSE9PSJhcGkiJiZXcyhuZXcgc3QuQXBpKGUpKX0pfSk7emUoInNlbGVjdC5sYXN0KCkiLGZ1bmN0aW9uKHQpe2xldCBlPXRoaXMuY29udGV4dFswXTtyZXR1cm4gdD8oZS5fc2VsZWN0X2xhc3RDZWxsPXQsdGhpcyk6ZS5fc2VsZWN0X2xhc3RDZWxsfSk7T3IoInJvd3MoKS5zZWxlY3QoKSIsInJvdygpLnNlbGVjdCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0PT09ITE/dGhpcy5kZXNlbGVjdCgpOih0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKHIsbil7SnIocik7dmFyIHM9ci5hb0RhdGFbbl0sYT1yLmFvQ29sdW1ucztSdChzLm5UcikuYWRkQ2xhc3Moci5fc2VsZWN0LmNsYXNzTmFtZSkscy5fc2VsZWN0X3NlbGVjdGVkPSEwO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgYz1hW2xdO2lmKGMuc1R5cGU9PT1udWxsJiZlLmNvbHVtbnMoKS50eXBlcygpLGMuc1R5cGU9PT0ic2VsZWN0LWNoZWNrYm94Iil7dmFyIHA9cy5hbkNlbGxzO3AmJnBbbF0mJlJ0KCJpbnB1dC5kdC1zZWxlY3QtY2hlY2tib3giLHBbbF0pLnByb3AoImNoZWNrZWQiLCEwKSxzLl9hU29ydERhdGEhPT1udWxsJiYocy5fYVNvcnREYXRhW2xdPW51bGwpfX19KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocixuKXtHZShlLCJzZWxlY3QiLFsicm93IixlW25dXSwhMCl9KSx0aGlzKX0pO3plKCJyb3coKS5zZWxlY3RlZCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dFswXTtyZXR1cm4hISh0JiZ0aGlzLmxlbmd0aCYmdC5hb0RhdGFbdGhpc1swXV0mJnQuYW9EYXRhW3RoaXNbMF1dLl9zZWxlY3Rfc2VsZWN0ZWQpfSk7T3IoImNvbHVtbnMoKS5zZWxlY3QoKSIsImNvbHVtbigpLnNlbGVjdCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0PT09ITE/dGhpcy5kZXNlbGVjdCgpOih0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIsbil7SnIociksci5hb0NvbHVtbnNbbl0uX3NlbGVjdF9zZWxlY3RlZD0hMDt2YXIgcz1uZXcgc3QuQXBpKHIpLmNvbHVtbihuKTtSdChzLmhlYWRlcigpKS5hZGRDbGFzcyhyLl9zZWxlY3QuY2xhc3NOYW1lKSxSdChzLmZvb3RlcigpKS5hZGRDbGFzcyhyLl9zZWxlY3QuY2xhc3NOYW1lKSxzLm5vZGVzKCkudG8kKCkuYWRkQ2xhc3Moci5fc2VsZWN0LmNsYXNzTmFtZSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocixuKXtHZShlLCJzZWxlY3QiLFsiY29sdW1uIixlW25dXSwhMCl9KSx0aGlzKX0pO3plKCJjb2x1bW4oKS5zZWxlY3RlZCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dFswXTtyZXR1cm4hISh0JiZ0aGlzLmxlbmd0aCYmdC5hb0NvbHVtbnNbdGhpc1swXV0mJnQuYW9Db2x1bW5zW3RoaXNbMF1dLl9zZWxlY3Rfc2VsZWN0ZWQpfSk7T3IoImNlbGxzKCkuc2VsZWN0KCkiLCJjZWxsKCkuc2VsZWN0KCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQ9PT0hMT90aGlzLmRlc2VsZWN0KCk6KHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKHIsbixzKXtKcihyKTt2YXIgYT1yLmFvRGF0YVtuXTthLl9zZWxlY3RlZF9jZWxscz09PXZvaWQgMCYmKGEuX3NlbGVjdGVkX2NlbGxzPVtdKSxhLl9zZWxlY3RlZF9jZWxsc1tzXT0hMCxhLmFuQ2VsbHMmJlJ0KGEuYW5DZWxsc1tzXSkuYWRkQ2xhc3Moci5fc2VsZWN0LmNsYXNzTmFtZSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocixuKXtHZShlLCJzZWxlY3QiLFsiY2VsbCIsZS5jZWxscyhlW25dKS5pbmRleGVzKCkudG9BcnJheSgpXSwhMCl9KSx0aGlzKX0pO3plKCJjZWxsKCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07aWYodCYmdGhpcy5sZW5ndGgpe3ZhciBlPXQuYW9EYXRhW3RoaXNbMF1bMF0ucm93XTtpZihlJiZlLl9zZWxlY3RlZF9jZWxscyYmZS5fc2VsZWN0ZWRfY2VsbHNbdGhpc1swXVswXS5jb2x1bW5dKXJldHVybiEwfXJldHVybiExfSk7T3IoInJvd3MoKS5kZXNlbGVjdCgpIiwicm93KCkuZGVzZWxlY3QoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUscil7dmFyIG49ZS5hb0RhdGFbcl0scz1lLmFvQ29sdW1ucztSdChuLm5UcikucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSksbi5fc2VsZWN0X3NlbGVjdGVkPSExLGUuX3NlbGVjdF9sYXN0Q2VsbD1udWxsO2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgbD1zW2FdO2lmKGwuc1R5cGU9PT1udWxsJiZ0LmNvbHVtbnMoKS50eXBlcygpLGwuc1R5cGU9PT0ic2VsZWN0LWNoZWNrYm94Iil7dmFyIGM9bi5hbkNlbGxzO2MmJmNbYV0mJlJ0KCJpbnB1dC5kdC1zZWxlY3QtY2hlY2tib3giLG4uYW5DZWxsc1thXSkucHJvcCgiY2hlY2tlZCIsITEpLG4uX2FTb3J0RGF0YSE9PW51bGwmJihuLl9hU29ydERhdGFbYV09bnVsbCl9fX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbInJvdyIsdFtyXV0sITApfSksdGhpc30pO09yKCJjb2x1bW5zKCkuZGVzZWxlY3QoKSIsImNvbHVtbigpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihlLHIpe2UuYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQ9ITE7dmFyIG49bmV3IHN0LkFwaShlKSxzPW4uY29sdW1uKHIpO1J0KHMuaGVhZGVyKCkpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLFJ0KHMuZm9vdGVyKCkpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLG4uY2VsbHMobnVsbCxyKS5pbmRleGVzKCkuZWFjaChmdW5jdGlvbihhKXt2YXIgbD1lLmFvRGF0YVthLnJvd10sYz1sLl9zZWxlY3RlZF9jZWxscztsLmFuQ2VsbHMmJighY3x8IWNbYS5jb2x1bW5dKSYmUnQobC5hbkNlbGxzW2EuY29sdW1uXSkucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSl9KX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbImNvbHVtbiIsdFtyXV0sITApfSksdGhpc30pO09yKCJjZWxscygpLmRlc2VsZWN0KCkiLCJjZWxsKCkuZGVzZWxlY3QoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLHIsbil7dmFyIHM9ZS5hb0RhdGFbcl07cy5fc2VsZWN0ZWRfY2VsbHMhPT12b2lkIDAmJihzLl9zZWxlY3RlZF9jZWxsc1tuXT0hMSkscy5hbkNlbGxzJiYhZS5hb0NvbHVtbnNbbl0uX3NlbGVjdF9zZWxlY3RlZCYmUnQocy5hbkNlbGxzW25dKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbImNlbGwiLHRbcl1dLCEwKX0pLHRoaXN9KTtmdW5jdGlvbiBFcih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gci5pMThuKCJidXR0b25zLiIrdCxlKX19ZnVuY3Rpb24gSGkodCl7dmFyIGU9dC5fZXZlbnROYW1lc3BhY2U7cmV0dXJuImRyYXcuZHQuRFQiK2UrIiBzZWxlY3QuZHQuRFQiK2UrIiBkZXNlbGVjdC5kdC5EVCIrZX1mdW5jdGlvbiBVbCh0LGUpe3JldHVybiEhKGUubGltaXRUby5pbmRleE9mKCJyb3dzIikhPT0tMSYmdC5yb3dzKHtzZWxlY3RlZDohMH0pLmFueSgpfHxlLmxpbWl0VG8uaW5kZXhPZigiY29sdW1ucyIpIT09LTEmJnQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKXx8ZS5saW1pdFRvLmluZGV4T2YoImNlbGxzIikhPT0tMSYmdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSl9dmFyIFdpPTA7UnQuZXh0ZW5kKHN0LmV4dC5idXR0b25zLHtzZWxlY3RlZDp7dGV4dDpFcigic2VsZWN0ZWQiLCJTZWxlY3RlZCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3RlZCIsbGltaXRUbzpbInJvd3MiLCJjb2x1bW5zIiwiY2VsbHMiXSxpbml0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzO3IuX2V2ZW50TmFtZXNwYWNlPSIuc2VsZWN0IitXaSsrLHQub24oSGkociksZnVuY3Rpb24oKXtuLmVuYWJsZShVbCh0LHIpKX0pLHRoaXMuZGlzYWJsZSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQsZSxyKXt0Lm9mZihyLl9ldmVudE5hbWVzcGFjZSl9fSxzZWxlY3RlZFNpbmdsZTp7dGV4dDpFcigic2VsZWN0ZWRTaW5nbGUiLCJTZWxlY3RlZCBzaW5nbGUiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0ZWQtc2luZ2xlIixpbml0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzO3IuX2V2ZW50TmFtZXNwYWNlPSIuc2VsZWN0IitXaSsrLHQub24oSGkociksZnVuY3Rpb24oKXt2YXIgcz10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCt0LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCt0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGg7bi5lbmFibGUocz09PTEpfSksdGhpcy5kaXNhYmxlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCxlLHIpe3Qub2ZmKHIuX2V2ZW50TmFtZXNwYWNlKX19LHNlbGVjdEFsbDp7dGV4dDpFcigic2VsZWN0QWxsIiwiU2VsZWN0IGFsbCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3QtYWxsIixhY3Rpb246ZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9dGhpcy5zZWxlY3QuaXRlbXMoKSxhPW4uc2VsZWN0b3JNb2RpZmllcjthPyh0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKGE9YS5jYWxsKGUsdCxlLHIsbikpLHRoaXNbcysicyJdKGEpLnNlbGVjdCgpKTp0aGlzW3MrInMiXSgpLnNlbGVjdCgpfX0sc2VsZWN0Tm9uZTp7dGV4dDpFcigic2VsZWN0Tm9uZSIsIkRlc2VsZWN0IGFsbCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3Qtbm9uZSIsYWN0aW9uOmZ1bmN0aW9uKCl7SnIodGhpcy5zZXR0aW5ncygpWzBdLCEwKX0saW5pdDpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcztyLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrV2krKyx0Lm9uKEhpKHIpLGZ1bmN0aW9uKCl7dmFyIHM9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoO24uZW5hYmxlKHM+MCl9KSx0aGlzLmRpc2FibGUoKX0sZGVzdHJveTpmdW5jdGlvbih0LGUscil7dC5vZmYoci5fZXZlbnROYW1lc3BhY2UpfX0sc2hvd1NlbGVjdGVkOnt0ZXh0OkVyKCJzaG93U2VsZWN0ZWQiLCJTaG93IG9ubHkgc2VsZWN0ZWQiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2hvdy1zZWxlY3RlZCIsYWN0aW9uOmZ1bmN0aW9uKHQsZSl7aWYoZS5zZWFyY2guZml4ZWQoImR0LXNlbGVjdCIpKWUuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiLG51bGwpLHRoaXMuYWN0aXZlKCExKTtlbHNle3ZhciByPWUuc2V0dGluZ3MoKVswXS5hb0RhdGE7ZS5zZWFyY2guZml4ZWQoImR0LXNlbGVjdCIsZnVuY3Rpb24obixzLGEpe3JldHVybiByW2FdLl9zZWxlY3Rfc2VsZWN0ZWR9KSx0aGlzLmFjdGl2ZSghMCl9ZS5kcmF3KCl9fX0pO1J0LmVhY2goWyJSb3ciLCJDb2x1bW4iLCJDZWxsIl0sZnVuY3Rpb24odCxlKXt2YXIgcj1lLnRvTG93ZXJDYXNlKCk7c3QuZXh0LmJ1dHRvbnNbInNlbGVjdCIrZSsicyJdPXt0ZXh0OkVyKCJzZWxlY3QiK2UrInMiLCJTZWxlY3QgIityKyJzIiksY2xhc3NOYW1lOiJidXR0b25zLXNlbGVjdC0iK3IrInMiLGFjdGlvbjpmdW5jdGlvbigpe3RoaXMuc2VsZWN0Lml0ZW1zKHIpfSxpbml0OmZ1bmN0aW9uKG4pe3ZhciBzPXRoaXM7bi5vbigic2VsZWN0SXRlbXMuZHQuRFQiLGZ1bmN0aW9uKGEsbCxjKXtzLmFjdGl2ZShjPT09cil9KX19fSk7c3QudHlwZSgic2VsZWN0LWNoZWNrYm94Iix7Y2xhc3NOYW1lOiJkdC1zZWxlY3QiLGRldGVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSJzZWxlY3QtY2hlY2tib3giP3Q6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0iWCI/LTE6MH19fSk7UnQuZXh0ZW5kKCEwLHN0LmRlZmF1bHRzLm9MYW5ndWFnZSx7c2VsZWN0OnthcmlhOntyb3dDaGVja2JveDoiU2VsZWN0IHJvdyJ9fX0pO3N0LnJlbmRlci5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgcj10P3N0LnV0aWwuZ2V0KHQpOm51bGwsbj1lP3N0LnV0aWwuZ2V0KGUpOm51bGw7cmV0dXJuIGZ1bmN0aW9uKHMsYSxsLGMpe3ZhciBwPWMuc2V0dGluZ3MuYW9EYXRhW2Mucm93XSxiPXAuX3NlbGVjdF9zZWxlY3RlZCxtPWMuc2V0dGluZ3Mub0xhbmd1YWdlLnNlbGVjdC5hcmlhLnJvd0NoZWNrYm94O3JldHVybiBhPT09ImRpc3BsYXkiP1J0KCI8aW5wdXQ+IikuYXR0cih7ImFyaWEtbGFiZWwiOm0sY2xhc3M6ImR0LXNlbGVjdC1jaGVja2JveCIsbmFtZTpuP24obCk6bnVsbCx0eXBlOiJjaGVja2JveCIsdmFsdWU6cj9yKGwpOm51bGwsY2hlY2tlZDpifSlbMF06YT09PSJ0eXBlIj8ic2VsZWN0LWNoZWNrYm94IjphPT09ImZpbHRlciI/IiI6Yj8iWCI6IiJ9fTtzdC5leHQub3JkZXJbInNlbGVjdC1jaGVja2JveCJdPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYXBpKCkuY29sdW1uKGUse29yZGVyOiJpbmRleCJ9KS5ub2RlcygpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gdC5fc2VsZWN0Lml0ZW1zPT09InJvdyI/UnQocikucGFyZW50KCkuaGFzQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSk6dC5fc2VsZWN0Lml0ZW1zPT09ImNlbGwiP1J0KHIpLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpOiExfSl9O1J0LmZuLkRhdGFUYWJsZS5zZWxlY3Q9c3Quc2VsZWN0O1J0KGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdFNlbGVjdCIsZnVuY3Rpb24odCxlKXt0Lm5hbWVzcGFjZT09PSJkdCImJnN0LnNlbGVjdC5pbml0KG5ldyBzdC5BcGkoZSkpfSk7S2UuQnV0dG9ucy5qc3ppcChVcy5kZWZhdWx0KTt2YXIgZXhwb3J0X2pRdWVyeT1HbC5kZWZhdWx0O2V4cG9ydHtLZSBhcyBEYXRhVGFibGUsZXhwb3J0X2pRdWVyeSBhcyBqUXVlcnl9OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKanN6aXAvZGlzdC9qc3ppcC5taW4uanM6CiAgKCohCiAgCiAgSlNaaXAgdjMuMTAuMSAtIEEgSmF2YVNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXMKICA8aHR0cDovL3N0dWFydGsuY29tL2pzemlwPgogIAogIChjKSAyMDA5LTIwMTYgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+CiAgRHVhbCBsaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2Ugb3IgR1BMdjMuIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL1N0dWsvanN6aXAvbWFpbi9MSUNFTlNFLm1hcmtkb3duLgogIAogIEpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgogIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21haW4vTElDRU5TRQogICopCgpqcXVlcnkvZGlzdC9qcXVlcnkuanM6CiAgKCohCiAgICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My43LjEKICAgKiBodHRwczovL2pxdWVyeS5jb20vCiAgICoKICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogICAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAgICoKICAgKiBEYXRlOiAyMDIzLTA4LTI4VDEzOjM3WgogICAqKQoKZGF0YXRhYmxlcy5uZXQvanMvZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgMi4wLjUKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZHQvanMvZGF0YVRhYmxlcy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIGludGVncmF0aW9uCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvZGF0YVRhYmxlcy5idXR0b25zLm1qczoKICAoKiEgQnV0dG9ucyBmb3IgRGF0YVRhYmxlcyAzLjAuMgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zLWR0L2pzL2J1dHRvbnMuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBCdXR0b25zCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5odG1sNS5tanM6CiAgKCohCiAgICogSFRNTDUgZXhwb3J0IGJ1dHRvbnMgZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKgogICAqIEZpbGVTYXZlci5qcyAoMS4zLjMpIC0gTUlUIGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgwqkgMjAxNiBFbGkgR3JleSAtIGh0dHA6Ly9lbGlncmV5LmNvbQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9idXR0b25zLnByaW50Lm1qczoKICAoKiEKICAgKiBQcmludCBidXR0b24gZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWZpeGVkY29sdW1ucy9qcy9kYXRhVGFibGVzLmZpeGVkQ29sdW1ucy5tanM6CiAgKCohIEZpeGVkQ29sdW1ucyA1LjAuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMtZHQvanMvZml4ZWRDb2x1bW5zLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIGludGVncmF0aW9uIGZvciBEYXRhVGFibGVzJyBGaXhlZENvbHVtbnMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQta2V5dGFibGUvanMvZGF0YVRhYmxlcy5rZXlUYWJsZS5tanM6CiAgKCohIEtleVRhYmxlIDIuMTIuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1rZXl0YWJsZS1kdC9qcy9rZXlUYWJsZS5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIEtleVRhYmxlCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXJvd2dyb3VwL2pzL2RhdGFUYWJsZXMucm93R3JvdXAubWpzOgogICgqISBSb3dHcm91cCAxLjUuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1yb3dncm91cC1kdC9qcy9yb3dHcm91cC5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIFJvd0dyb3VwCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXIvanMvZGF0YVRhYmxlcy5zZWFyY2hCdWlsZGVyLm1qczoKICAoKiEgU2VhcmNoQnVpbGRlciAxLjcuMQogICAqIMKpU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hidWlsZGVyLWR0L2pzL3NlYXJjaEJ1aWxkZXIuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgaW50ZWdyYXRpb24gZm9yIERhdGFUYWJsZXMnIFNlYXJjaEJ1aWxkZXIKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNocGFuZXMvanMvZGF0YVRhYmxlcy5zZWFyY2hQYW5lcy5tanM6CiAgKCohIFNlYXJjaFBhbmVzIDIuMy4wCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaHBhbmVzLWR0L2pzL3NlYXJjaFBhbmVzLmRhdGFUYWJsZXMubWpzOgogICgqISBCb290c3RyYXAgaW50ZWdyYXRpb24gZm9yIERhdGFUYWJsZXMnIFNlYXJjaFBhbmVzCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlbGVjdC9qcy9kYXRhVGFibGVzLnNlbGVjdC5tanM6CiAgKCohIFNlbGVjdCBmb3IgRGF0YVRhYmxlcyAyLjAuMQogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlL21pdAogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VsZWN0LWR0L2pzL3NlbGVjdC5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIFNlbGVjdAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCiovCg==\";\n",
"document.querySelectorAll(\"#itables_init_notebook_mode_36789e7b_9187_4d2a_9029_befcc802bd6c\").forEach(e => e.remove());\n",
"</script>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from v2realbot.tools.loadbatch import load_batch\n",
"from v2realbot.utils.utils import zoneNY\n",
"import pandas as pd\n",
"import numpy as np\n",
"import vectorbtpro as vbt\n",
"from itables import init_notebook_mode, show\n",
"import datetime\n",
"from itertools import product\n",
"\n",
"init_notebook_mode(all_interactive=True)\n",
"\n",
"vbt.settings.set_theme(\"dark\")\n",
"vbt.settings['plotting']['layout']['width'] = 1280\n",
"vbt.settings.plotting.auto_rangebreaks = True\n",
"# Set the option to display with pagination\n",
"pd.set_option('display.notebook_repr_html', True)\n",
"pd.set_option('display.max_rows', 10) # Number of rows per page\n",
"\n",
"# Define the market open and close times\n",
"market_open = datetime.time(9, 30)\n",
"market_close = datetime.time(16, 0)\n",
"entry_window_opens = 1\n",
"entry_window_closes = 370\n",
"\n",
"forced_exit_start = 380\n",
"forced_exit_end = 390\n",
"\n",
"res, df = load_batch(batch_id=\"0fb5043a\", #0fb5043a bde6d0be\n",
" space_resolution_evenly=False,\n",
" indicators_columns=[\"Rsi14\"],\n",
" main_session_only=True,\n",
" verbose = False)\n",
"if res < 0:\n",
" print(\"Error\" + str(res) + str(df))\n",
"df = df[\"bars\"]\n",
"\n",
"#df\n",
"\n",
"basic_data = vbt.Data.from_data(vbt.symbol_dict({\"BAC\": df}), tz_convert=zoneNY)\n",
"#m1_data = basic_data[['Open', 'High', 'Low', 'Close', 'Volume']]\n",
"basic_data = basic_data.transform(lambda df: df.between_time('09:30', '16:00'))\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#parameters (primary y line, secondary y line, close)\n",
"def plot_2y_close(priminds, secinds, close):\n",
" fig = vbt.make_subplots(rows=1, cols=1, shared_xaxes=True, specs=[[{\"secondary_y\": True}]], vertical_spacing=0.02, subplot_titles=(\"MOM\", \"Price\" ))\n",
" close.vbt.plot(fig=fig, add_trace_kwargs=dict(secondary_y=False), trace_kwargs=dict(line=dict(color=\"blue\")))\n",
" for ind in priminds:\n",
" ind.plot(fig=fig, add_trace_kwargs=dict(secondary_y=False))\n",
" for ind in secinds:\n",
" ind.plot(fig=fig, add_trace_kwargs=dict(secondary_y=True))\n",
" return fig\n",
"\n",
"# close = basic_data.xloc[\"09:30\":\"10:00\"].close"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "432df5ba322140efacd83f8f97fbcf51",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1000 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table id=\"itables_cf1c324e_0ea4_471a_b6c8_2fcd50153d45\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
"<thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>Total Return [%]</th>\n",
" <th>Max Drawdown [%]</th>\n",
" <th>Total Trades</th>\n",
" <th>Win Rate [%]</th>\n",
" <th>Expectancy</th>\n",
" </tr>\n",
" <tr>\n",
" <th>entry_window_closes</th>\n",
" <th>mom_timeperiod</th>\n",
" <th>mom_th</th>\n",
" <th>sl_stop</th>\n",
" <th>tp_stop</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead><tbody><tr>\n",
"<td style=\"vertical-align:middle; text-align:left\">\n",
"<div style=\"float:left; margin-right: 10px;\">\n",
"<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
"width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
" <g style=\"fill:#d9d7fc\">\n",
" <path d=\"M100,400H500V357H100Z\" />\n",
" <path d=\"M100,300H400V257H100Z\" />\n",
" <path d=\"M0,200H400V157H0Z\" />\n",
" <path d=\"M100,100H500V57H100Z\" />\n",
" <path d=\"M100,350H500V307H100Z\" />\n",
" <path d=\"M100,250H400V207H100Z\" />\n",
" <path d=\"M0,150H400V107H0Z\" />\n",
" <path d=\"M100,50H500V7H100Z\" />\n",
" </g>\n",
" <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
" <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"0;0;400\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;300;0\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;400\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
" <g transform=\"translate(45 50) rotate(-45)\">\n",
" <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
" <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(450 152)\">\n",
" <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
" <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(50 352)\">\n",
" <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
" <polygon points=\"-35,10 0,45 35,10\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(75 250)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(425 250) rotate(180)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
" </g>\n",
" </g>\n",
"</svg>\n",
"</a>\n",
"</div>\n",
"<div>\n",
"Loading ITables v2.0.1 from the <code>init_notebook_mode</code> cell...\n",
"(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
"</div>\n",
"</tr></tbody>\n",
"\n",
"</table>\n",
"<script type=\"module\">\n",
" const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_0_1);\n",
"\n",
" document.querySelectorAll(\"#itables_cf1c324e_0ea4_471a_b6c8_2fcd50153d45:not(.dataTable)\").forEach(table => {\n",
" // Define the table data\n",
" const data = [[17, 9, 0.07, 0.0043, 0.0063, \" 3.167786\", \" 2.202921\", \"55\", \" 43.636364\", \" 0.057596\"], [2, 6, 0.03, 0.0048, 0.0063, \" 2.779712\", \" 2.321028\", \"44\", \" 45.454545\", \" 0.063175\"], [2, 10, 0.03, 0.0038, 0.0063, \" 2.643149\", \" 2.285255\", \"45\", \" 40.0\", \" 0.058737\"], [8, 3, 0.07, 0.0028, 0.0033, \" 2.239084\", \" 0.726632\", \"16\", \" 75.0\", \" 0.139943\"], [11, 3, 0.07, 0.0033, 0.0053, \" 2.202983\", \" 0.845649\", \"18\", \" 66.666667\", \" 0.122388\"], [2, 11, 0.01, 0.0063, 0.0068, \" 2.151785\", \" 2.961709\", \"47\", \" 44.680851\", \" 0.045783\"], [41, 2, 0.05, 0.0013, 0.0063, \" 1.978812\", \" 0.63705\", \"55\", \" 41.818182\", \" 0.035978\"], [5, 6, 0.07, 0.0038, 0.0068, \" 1.88659\", \" 1.392719\", \"24\", \" 37.5\", \" 0.078608\"], [11, 11, 0.07, 0.0048, 0.0068, \" 1.82018\", \" 3.002539\", \"54\", \" 40.740741\", \" 0.033707\"], [32, 3, 0.07, 0.0043, 0.0068, \" 1.587151\", \" 1.888306\", \"22\", \" 40.909091\", \" 0.072143\"], [32, 5, 0.07, 0.0028, 0.0068, \" 1.552219\", \" 1.780398\", \"42\", \" 40.47619\", \" 0.036958\"], [14, 3, 0.05, 0.0033, 0.0068, \" 1.54808\", \" 2.305488\", \"53\", \" 41.509434\", \" 0.029209\"], [38, 7, 0.07, 0.0008, 0.0058, \" 1.507991\", \" 0.54179\", \"71\", \" 42.253521\", \" 0.021239\"], [26, 2, 0.05, 0.0013, 0.0063, \" 1.486708\", \" 0.63705\", \"48\", \" 41.666667\", \" 0.030973\"], [17, 2, 0.07, 0.0028, 0.0068, \" 1.449192\", \" 0.577686\", \"12\", \" 58.333333\", \" 0.120766\"], [20, 5, 0.07, 0.0033, 0.0038, \" 1.419973\", \" 1.299415\", \"34\", \" 47.058824\", \" 0.041764\"], [2, 4, 0.05, 0.0018, 0.0058, \" 1.389335\", \" 0.991645\", \"32\", \" 43.75\", \" 0.043417\"], [8, 2, 0.07, 0.0023, 0.0063, \" 1.377205\", \" 0.497111\", \"11\", \" 72.727273\", \" 0.1252\"], [17, 8, 0.07, 0.0018, 0.0053, \" 1.366194\", \" 1.431781\", \"69\", \" 44.927536\", \" 0.0198\"], [26, 4, 0.05, 0.0038, 0.0063, \" 1.355837\", \" 2.25563\", \"67\", \" 37.313433\", \" 0.020236\"], [20, 8, 0.15, 0.0063, 0.0068, \" 1.296935\", \" 0.619006\", \"2\", \" 100.0\", \" 0.648468\"], [29, 10, 0.17, 0.0053, 0.0068, \" 1.296935\", \" 0.27894\", \"2\", \" 100.0\", \" 0.648468\"], [29, 7, 0.13, 0.0043, 0.0063, \" 1.202662\", \" 0.483231\", \"5\", \" 60.0\", \" 0.240532\"], [20, 10, 0.17, 0.0038, 0.0063, \" 1.196347\", \" 0.27894\", \"2\", \" 100.0\", \" 0.598174\"], [2, 11, 0.01, 0.0053, 0.0058, \" 1.167732\", \" 2.684581\", \"47\", \" 44.680851\", \" 0.024845\"], [35, 4, 0.05, 0.0028, 0.0068, \" 1.017341\", \" 2.624233\", \"86\", \" 36.046512\", \" 0.01183\"], [29, 10, 0.17, 0.0043, 0.0053, \" 0.995322\", \" 0.27894\", \"2\", \" 100.0\", \" 0.497661\"], [32, 8, 0.09, 0.0023, 0.0058, \" 0.930668\", \" 1.003611\", \"30\", \" 46.666667\", \" 0.031022\"], [47, 8, 0.07, 0.0018, 0.0068, \" 0.922659\", \" 1.539611\", \"79\", \" 41.772152\", \" 0.011679\"], [11, 9, 0.17, 0.0028, 0.0063, \" 0.879298\", \" 0.357857\", \"3\", \" 66.666667\", \" 0.293099\"], [35, 9, 0.17, 0.0028, 0.0063, \" 0.879298\", \" 0.357857\", \"3\", \" 66.666667\", \" 0.293099\"], [5, 3, 0.09, 0.0028, 0.0063, \" 0.877656\", \" 0.523581\", \"8\", \" 75.0\", \" 0.109707\"], [41, 6, 0.09, 0.0008, 0.0063, \" 0.830254\", \" 0.589077\", \"23\", \" 30.434783\", \" 0.036098\"], [35, 2, 0.09, 0.0038, 0.0068, \" 0.815862\", \" 0.469152\", \"4\", \" 50.0\", \" 0.203965\"], [47, 3, 0.07, 0.0003, 0.0048, \" 0.812318\", \" 0.322331\", \"28\", \" 42.857143\", \" 0.029011\"], [44, 8, 0.07, 0.0003, 0.0058, \" 0.780941\", \" 0.609806\", \"97\", \" 40.206186\", \" 0.008051\"], [47, 6, 0.09, 0.0008, 0.0058, \" 0.780154\", \" 0.589077\", \"23\", \" 30.434783\", \" 0.03392\"], [11, 8, 0.15, 0.0028, 0.0058, \" 0.779075\", \" 0.357857\", \"3\", \" 66.666667\", \" 0.259692\"], [23, 4, 0.09, 0.0018, 0.0068, \" 0.778324\", \" 0.585602\", \"10\", \" 60.0\", \" 0.077832\"], [2, 8, 0.07, 0.0008, 0.0058, \" 0.739069\", \" 0.341762\", \"23\", \" 43.478261\", \" 0.032133\"], [29, 4, 0.09, 0.0018, 0.0033, \" 0.726168\", \" 0.585602\", \"10\", \" 60.0\", \" 0.072617\"], [29, 2, 0.05, 0.0008, 0.0028, \" 0.722125\", \" 0.442381\", \"52\", \" 38.461538\", \" 0.013887\"], [32, 4, 0.09, 0.0008, 0.0033, \" 0.700363\", \" 0.376131\", \"11\", \" 45.454545\", \" 0.063669\"], [38, 2, 0.05, 0.0023, 0.0033, \" 0.690313\", \" 1.669668\", \"51\", \" 43.137255\", \" 0.013536\"], [29, 8, 0.09, 0.0008, 0.0048, \" 0.655302\", \" 0.699283\", \"29\", \" 34.482759\", \" 0.022597\"], [8, 8, 0.21, 0.0033, 0.0068, \" 0.646378\", \" 0.27894\", \"1\", \" 100.0\", \" 0.646378\"], [38, 8, 0.21, 0.0053, 0.0068, \" 0.646378\", \" 0.27894\", \"1\", \" 100.0\", \" 0.646378\"], [11, 11, 0.23, 0.0038, 0.0068, \" 0.646378\", \" 0.27894\", \"1\", \" 100.0\", \" 0.646378\"], [20, 11, 0.25, 0.0038, 0.0068, \" 0.646378\", \" 0.27894\", \"1\", \" 100.0\", \" 0.646378\"], [29, 11, 0.23, 0.0038, 0.0068, \" 0.646378\", \" 0.27894\", \"1\", \" 100.0\", \" 0.646378\"], [8, 7, 0.13, 0.0023, 0.0033, \" 0.642774\", \" 0.525942\", \"5\", \" 80.0\", \" 0.128555\"], [41, 9, 0.17, 0.0053, 0.0063, \" 0.626392\", \" 0.607662\", \"3\", \" 66.666667\", \" 0.208797\"], [35, 10, 0.21, 0.0058, 0.0063, \" 0.596395\", \" 0.27894\", \"1\", \" 100.0\", \" 0.596395\"], [32, 9, 0.21, 0.0033, 0.0063, \" 0.596395\", \" 0.27894\", \"1\", \" 100.0\", \" 0.596395\"], [47, 9, 0.21, 0.0053, 0.0063, \" 0.596395\", \" 0.27894\", \"1\", \" 100.0\", \" 0.596395\"], [20, 11, 0.21, 0.0038, 0.0063, \" 0.596395\", \" 0.27894\", \"1\", \" 100.0\", \" 0.596395\"], [29, 11, 0.25, 0.0033, 0.0063, \" 0.596395\", \" 0.27894\", \"1\", \" 100.0\", \" 0.596395\"], [5, 6, 0.07, 0.0013, 0.0068, \" 0.567421\", \" 0.89425\", \"33\", \" 36.363636\", \" 0.017195\"], [17, 10, 0.13, 0.0008, 0.0033, \" 0.553749\", \" 0.254547\", \"8\", \" 50.0\", \" 0.069219\"], [23, 10, 0.13, 0.0008, 0.0033, \" 0.553749\", \" 0.254547\", \"8\", \" 50.0\", \" 0.069219\"], [11, 6, 0.13, 0.0003, 0.0063, \" 0.547937\", \" 0.080071\", \"3\", \" 66.666667\", \" 0.182646\"], [29, 3, 0.13, 0.0043, 0.0058, \" 0.546412\", \" 0.27894\", \"1\", \" 100.0\", \" 0.546412\"], [38, 8, 0.23, 0.0048, 0.0058, \" 0.546412\", \" 0.27894\", \"1\", \" 100.0\", \" 0.546412\"], [41, 8, 0.21, 0.0028, 0.0058, \" 0.546412\", \" 0.27894\", \"1\", \" 100.0\", \" 0.546412\"], [47, 4, 0.13, 0.0048, 0.0058, \" 0.546412\", \" 0.27894\", \"1\", \" 100.0\", \" 0.546412\"], [23, 11, 0.21, 0.0038, 0.0058, \" 0.546412\", \" 0.27894\", \"1\", \" 100.0\", \" 0.546412\"], [32, 8, 0.07, 0.0013, 0.0063, \" 0.540909\", \" 1.30666\", \"81\", \" 38.271605\", \" 0.006678\"], [11, 4, 0.11, 0.0033, 0.0058, \" 0.519117\", \" 0.363284\", \"2\", \" 50.0\", \" 0.259558\"], [20, 10, 0.13, 0.0008, 0.0063, \" 0.51885\", \" 0.254547\", \"8\", \" 50.0\", \" 0.064856\"], [26, 10, 0.13, 0.0008, 0.0058, \" 0.51885\", \" 0.254547\", \"8\", \" 50.0\", \" 0.064856\"], [14, 7, 0.11, 0.0008, 0.0058, \" 0.51751\", \" 0.388215\", \"9\", \" 44.444444\", \" 0.057501\"], [26, 4, 0.07, 0.0043, 0.0048, \" 0.512911\", \" 1.712522\", \"26\", \" 38.461538\", \" 0.019727\"], [20, 7, 0.13, 0.0008, 0.0043, \" 0.500552\", \" 0.243266\", \"5\", \" 60.0\", \" 0.10011\"], [5, 5, 0.13, 0.0028, 0.0053, \" 0.496429\", \" 0.27894\", \"1\", \" 100.0\", \" 0.496429\"], [14, 8, 0.23, 0.0048, 0.0053, \" 0.496429\", \" 0.27894\", \"1\", \" 100.0\", \" 0.496429\"], [17, 5, 0.13, 0.0048, 0.0053, \" 0.496429\", \" 0.27894\", \"1\", \" 100.0\", \" 0.496429\"], [14, 5, 0.05, 0.0043, 0.0068, \" 0.494521\", \" 3.763263\", \"67\", \" 37.313433\", \" 0.007381\"], [17, 7, 0.13, 0.0003, 0.0048, \" 0.488734\", \" 0.143405\", \"5\", \" 60.0\", \" 0.097747\"], [26, 7, 0.11, 0.0023, 0.0043, \" 0.469323\", \" 0.707027\", \"11\", \" 63.636364\", \" 0.042666\"], [29, 8, 0.21, 0.0038, 0.0048, \" 0.446445\", \" 0.27894\", \"1\", \" 100.0\", \" 0.446445\"], [2, 3, 0.07, 0.0023, 0.0063, \" 0.441502\", \" 0.637312\", \"9\", \" 66.666667\", \" 0.049056\"], [17, 2, 0.09, 0.0008, 0.0028, \" 0.422129\", \" 0.141394\", \"4\", \" 50.0\", \" 0.105532\"], [41, 7, 0.11, 0.0018, 0.0043, \" 0.415409\", \" 0.638064\", \"13\", \" 53.846154\", \" 0.031955\"], [41, 8, 0.07, 0.0003, 0.0028, \" 0.404387\", \" 0.609806\", \"97\", \" 40.206186\", \" 0.004169\"], [32, 2, 0.09, 0.0023, 0.0048, \" 0.399503\", \" 0.319287\", \"4\", \" 75.0\", \" 0.099876\"], [11, 7, 0.09, 0.0003, 0.0033, \" 0.392974\", \" 0.461285\", \"23\", \" 34.782609\", \" 0.017086\"], [17, 6, 0.11, 0.0033, 0.0043, \" 0.392395\", \" 1.034077\", \"9\", \" 33.333333\", \" 0.043599\"], [38, 6, 0.13, 0.0003, 0.0053, \" 0.384931\", \" 0.080071\", \"4\", \" 50.0\", \" 0.096233\"], [17, 8, 0.11, 0.0008, 0.0028, \" 0.382972\", \" 0.360312\", \"12\", \" 33.333333\", \" 0.031914\"], [8, 4, 0.11, 0.0038, 0.0048, \" 0.368801\", \" 0.413268\", \"2\", \" 50.0\", \" 0.184401\"], [2, 10, 0.01, 0.0028, 0.0038, \" 0.363235\", \" 1.967988\", \"52\", \" 40.384615\", \" 0.006985\"], [14, 11, 0.15, 0.0038, 0.0068, \" 0.35917\", \" 0.8526\", \"5\", \" 40.0\", \" 0.071834\"], [23, 6, 0.11, 0.0003, 0.0033, \" 0.350245\", \" 0.243735\", \"11\", \" 45.454545\", \" 0.03184\"], [14, 8, 0.09, 0.0013, 0.0038, \" 0.348251\", \" 0.641356\", \"25\", \" 44.0\", \" 0.01393\"], [32, 10, 0.21, 0.0013, 0.0038, \" 0.346479\", \" 0.016697\", \"1\", \" 100.0\", \" 0.346479\"], [20, 3, 0.13, 0.0008, 0.0038, \" 0.346479\", \" 0.044696\", \"1\", \" 100.0\", \" 0.346479\"], [26, 11, 0.21, 0.0028, 0.0038, \" 0.346479\", \" 0.27894\", \"1\", \" 100.0\", \" 0.346479\"], [14, 11, 0.17, 0.0003, 0.0033, \" 0.340059\", \" 0.046695\", \"2\", \" 100.0\", \" 0.17003\"], [23, 7, 0.07, 0.0058, 0.0068, \" 0.338256\", \" 5.652611\", \"44\", \" 38.636364\", \" 0.007688\"], [20, 7, 0.15, 0.0003, 0.0043, \" 0.332826\", \" 0.080071\", \"2\", \" 50.0\", \" 0.166413\"], [44, 4, 0.13, 0.0003, 0.0068, \" 0.328414\", \" 0.046695\", \"1\", \" 100.0\", \" 0.328414\"], [11, 9, 0.15, 0.0023, 0.0033, \" 0.32696\", \" 0.279971\", \"4\", \" 50.0\", \" 0.08174\"], [41, 7, 0.15, 0.0003, 0.0058, \" 0.313634\", \" 0.11005\", \"3\", \" 33.333333\", \" 0.104545\"], [14, 8, 0.15, 0.0003, 0.0048, \" 0.308371\", \" 0.108052\", \"3\", \" 66.666667\", \" 0.10279\"], [47, 2, 0.05, 0.0033, 0.0038, \" 0.302524\", \" 2.385322\", \"47\", \" 44.680851\", \" 0.006437\"], [32, 6, 0.13, 0.0053, 0.0058, \" 0.300952\", \" 0.579821\", \"4\", \" 50.0\", \" 0.075238\"], [5, 11, 0.19, 0.0013, 0.0033, \" 0.296495\", \" 0.044696\", \"1\", \" 100.0\", \" 0.296495\"], [2, 11, 0.17, 0.0018, 0.0053, \" 0.29522\", \" 0.19667\", \"1\", \" 100.0\", \" 0.29522\"], [32, 9, 0.21, 0.0008, 0.0068, \" 0.278235\", \" 0.096687\", \"1\", \" 100.0\", \" 0.278235\"], [26, 7, 0.15, 0.0008, 0.0053, \" 0.276875\", \" 0.130046\", \"2\", \" 50.0\", \" 0.138438\"], [14, 11, 0.25, 0.0003, 0.0053, \" 0.269449\", \" 0.046695\", \"1\", \" 100.0\", \" 0.269449\"], [32, 8, 0.13, 0.0018, 0.0033, \" 0.266094\", \" 0.576629\", \"8\", \" 50.0\", \" 0.033262\"], [20, 4, 0.09, 0.0003, 0.0013, \" 0.265293\", \" 0.210596\", \"10\", \" 60.0\", \" 0.026529\"], [8, 9, 0.13, 0.0028, 0.0053, \" 0.262575\", \" 0.828463\", \"7\", \" 42.857143\", \" 0.037511\"], [20, 11, 0.21, 0.0018, 0.0028, \" 0.246512\", \" 0.016697\", \"1\", \" 100.0\", \" 0.246512\"], [29, 11, 0.23, 0.0008, 0.0028, \" 0.246512\", \" 0.016697\", \"1\", \" 100.0\", \" 0.246512\"], [5, 4, 0.13, 0.0018, 0.0028, \" 0.246512\", \" 0.044696\", \"1\", \" 100.0\", \" 0.246512\"], [29, 5, 0.13, 0.0023, 0.0028, \" 0.246512\", \" 0.044696\", \"1\", \" 100.0\", \" 0.246512\"], [38, 8, 0.23, 0.0023, 0.0028, \" 0.246512\", \" 0.044696\", \"1\", \" 100.0\", \" 0.246512\"], [11, 6, 0.07, 0.0003, 0.0028, \" 0.233711\", \" 0.395106\", \"53\", \" 39.622642\", \" 0.00441\"], [35, 5, 0.13, 0.0028, 0.0058, \" 0.231979\", \" 0.312725\", \"2\", \" 50.0\", \" 0.115989\"], [14, 7, 0.19, 0.0028, 0.0058, \" 0.231399\", \" 0.329946\", \"2\", \" 50.0\", \" 0.1157\"], [44, 7, 0.19, 0.0033, 0.0063, \" 0.230944\", \" 0.379921\", \"2\", \" 50.0\", \" 0.115472\"], [17, 9, 0.21, 0.0013, 0.0058, \" 0.228056\", \" 0.146678\", \"1\", \" 100.0\", \" 0.228056\"], [23, 9, 0.21, 0.0013, 0.0043, \" 0.228056\", \" 0.146678\", \"1\", \" 100.0\", \" 0.228056\"], [29, 9, 0.15, 0.0023, 0.0028, \" 0.226988\", \" 0.279971\", \"4\", \" 50.0\", \" 0.056747\"], [14, 9, 0.15, 0.0028, 0.0033, \" 0.226427\", \" 0.329946\", \"4\", \" 50.0\", \" 0.056607\"], [26, 11, 0.13, 0.0003, 0.0053, \" 0.207341\", \" 0.253297\", \"11\", \" 45.454545\", \" 0.018849\"], [17, 10, 0.21, 0.0018, 0.0043, \" 0.205937\", \" 0.19667\", \"1\", \" 100.0\", \" 0.205937\"], [2, 9, 0.13, 0.0008, 0.0043, \" 0.199237\", \" 0.134009\", \"4\", \" 50.0\", \" 0.049809\"], [35, 11, 0.07, 0.0003, 0.0033, \" 0.191365\", \" 1.084044\", \"134\", \" 39.552239\", \" 0.001428\"], [5, 3, 0.13, 0.0018, 0.0058, \" 0.177876\", \" 0.19667\", \"1\", \" 100.0\", \" 0.177876\"], [11, 8, 0.21, 0.0018, 0.0063, \" 0.177876\", \" 0.19667\", \"1\", \" 100.0\", \" 0.177876\"], [29, 5, 0.13, 0.0018, 0.0048, \" 0.177876\", \" 0.19667\", \"1\", \" 100.0\", \" 0.177876\"], [14, 9, 0.17, 0.0003, 0.0023, \" 0.176512\", \" 0.108052\", \"3\", \" 66.666667\", \" 0.058837\"], [29, 7, 0.13, 0.0003, 0.0023, \" 0.175177\", \" 0.143405\", \"6\", \" 50.0\", \" 0.029196\"], [11, 11, 0.17, 0.0013, 0.0053, \" 0.171288\", \" 0.203234\", \"2\", \" 50.0\", \" 0.085644\"], [17, 10, 0.17, 0.0013, 0.0043, \" 0.171288\", \" 0.203234\", \"2\", \" 50.0\", \" 0.085644\"], [44, 10, 0.17, 0.0013, 0.0053, \" 0.171288\", \" 0.203234\", \"2\", \" 50.0\", \" 0.085644\"], [35, 11, 0.21, 0.0013, 0.0063, \" 0.169149\", \" 0.146678\", \"1\", \" 100.0\", \" 0.169149\"], [41, 5, 0.13, 0.0008, 0.0043, \" 0.165131\", \" 0.209368\", \"2\", \" 50.0\", \" 0.082565\"], [38, 8, 0.13, 0.0003, 0.0023, \" 0.164614\", \" 0.126729\", \"9\", \" 55.555556\", \" 0.01829\"], [35, 6, 0.15, 0.0008, 0.0068, \" 0.164552\", \" 0.158013\", \"2\", \" 50.0\", \" 0.082276\"], [35, 11, 0.21, 0.0003, 0.0018, \" 0.146545\", \" 0.016697\", \"1\", \" 100.0\", \" 0.146545\"], [38, 11, 0.07, 0.0038, 0.0058, \" 0.146432\", \" 3.528348\", \"78\", \" 35.897436\", \" 0.001877\"], [2, 3, 0.09, 0.0033, 0.0043, \" 0.143388\", \" 0.618914\", \"6\", \" 66.666667\", \" 0.023898\"], [35, 7, 0.13, 0.0008, 0.0028, \" 0.143021\", \" 0.243266\", \"7\", \" 42.857143\", \" 0.020432\"], [47, 10, 0.17, 0.0008, 0.0018, \" 0.139934\", \" 0.096687\", \"2\", \" 50.0\", \" 0.069967\"], [11, 11, 0.19, 0.0023, 0.0043, \" 0.127697\", \" 0.246662\", \"1\", \" 100.0\", \" 0.127697\"], [20, 10, 0.19, 0.0023, 0.0063, \" 0.127697\", \" 0.246662\", \"1\", \" 100.0\", \" 0.127697\"], [29, 9, 0.21, 0.0023, 0.0063, \" 0.127697\", \" 0.246662\", \"1\", \" 100.0\", \" 0.127697\"], [32, 3, 0.13, 0.0023, 0.0068, \" 0.127697\", \" 0.246662\", \"1\", \" 100.0\", \" 0.127697\"], [14, 9, 0.13, 0.0023, 0.0068, \" 0.103363\", \" 0.679214\", \"7\", \" 57.142857\", \" 0.014766\"], [44, 4, 0.11, 0.0013, 0.0058, \" 0.102539\", \" 0.309213\", \"4\", \" 50.0\", \" 0.025635\"], [44, 4, 0.11, 0.0013, 0.0068, \" 0.102539\", \" 0.309213\", \"4\", \" 50.0\", \" 0.025635\"], [17, 5, 0.13, 0.0003, 0.0013, \" 0.096562\", \" 0.044696\", \"1\", \" 100.0\", \" 0.096562\"], [20, 9, 0.21, 0.0008, 0.0013, \" 0.096562\", \" 0.044696\", \"1\", \" 100.0\", \" 0.096562\"], [47, 10, 0.23, 0.0043, 0.0068, \" 0.093131\", \" 0.446628\", \"1\", \" 100.0\", \" 0.093131\"], [38, 6, 0.09, 0.0013, 0.0038, \" 0.092802\", \" 0.773303\", \"24\", \" 37.5\", \" 0.003867\"], [32, 8, 0.17, 0.0003, 0.0018, \" 0.083068\", \" 0.108052\", \"2\", \" 50.0\", \" 0.041534\"], [17, 11, 0.11, 0.0003, 0.0023, \" 0.082095\", \" 0.290363\", \"18\", \" 38.888889\", \" 0.004561\"], [38, 10, 0.23, 0.0008, 0.0048, \" 0.082051\", \" 0.096687\", \"1\", \" 100.0\", \" 0.082051\"], [14, 8, 0.17, 0.0028, 0.0043, \" 0.081919\", \" 0.357857\", \"2\", \" 50.0\", \" 0.040959\"], [20, 7, 0.19, 0.0033, 0.0048, \" 0.081539\", \" 0.379921\", \"2\", \" 50.0\", \" 0.04077\"], [8, 7, 0.17, 0.0053, 0.0068, \" 0.079521\", \" 0.579821\", \"2\", \" 50.0\", \" 0.03976\"], [32, 5, 0.11, 0.0013, 0.0063, \" 0.07535\", \" 0.326435\", \"6\", \" 50.0\", \" 0.012558\"], [5, 11, 0.23, 0.0023, 0.0058, \" 0.06885\", \" 0.246662\", \"1\", \" 100.0\", \" 0.06885\"], [29, 11, 0.23, 0.0023, 0.0053, \" 0.06885\", \" 0.246662\", \"1\", \" 100.0\", \" 0.06885\"], [17, 5, 0.09, 0.0028, 0.0038, \" 0.041097\", \" 1.227791\", \"12\", \" 50.0\", \" 0.003425\"], [14, 11, 0.23, 0.0003, 0.0013, \" 0.033117\", \" 0.063384\", \"2\", \" 50.0\", \" 0.016558\"], [11, 7, 0.17, 0.0003, 0.0013, \" 0.033117\", \" 0.080071\", \"2\", \" 50.0\", \" 0.016558\"], [11, 6, 0.15, 0.0003, 0.0013, \" 0.033117\", \" 0.108052\", \"2\", \" 50.0\", \" 0.016558\"], [20, 6, 0.15, 0.0003, 0.0013, \" 0.033117\", \" 0.108052\", \"2\", \" 50.0\", \" 0.016558\"], [11, 7, 0.15, 0.0048, 0.0058, \" 0.030373\", \" 0.529846\", \"2\", \" 50.0\", \" 0.015187\"], [14, 9, 0.19, 0.0053, 0.0063, \" 0.029819\", \" 0.607662\", \"2\", \" 50.0\", \" 0.014909\"], [23, 8, 0.17, 0.0058, 0.0068, \" 0.029214\", \" 0.657623\", \"2\", \" 50.0\", \" 0.014607\"], [35, 9, 0.15, 0.0003, 0.0013, \" 0.013133\", \" 0.11005\", \"4\", \" 50.0\", \" 0.003283\"], [8, 8, 0.15, 0.0013, 0.0058, \" 0.007657\", \" 0.207974\", \"3\", \" 33.333333\", \" 0.002552\"], [29, 8, 0.15, 0.0013, 0.0063, \" 0.007657\", \" 0.207974\", \"3\", \" 33.333333\", \" 0.002552\"], [2, 2, 0.21, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 2, 0.25, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 2, 0.49, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 2, 0.49, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 3, 0.27, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 3, 0.33, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 3, 0.41, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 3, 0.45, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 3, 0.51, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 4, 0.17, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 4, 0.33, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 4, 0.47, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 4, 0.49, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 5, 0.15, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 5, 0.17, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 5, 0.21, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 5, 0.31, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 5, 0.33, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 6, 0.21, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 6, 0.25, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 6, 0.27, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 6, 0.51, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 7, 0.15, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 7, 0.17, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 7, 0.33, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 7, 0.43, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.25, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.27, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.33, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.37, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.37, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.41, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 8, 0.51, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 9, 0.23, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 9, 0.23, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 9, 0.25, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 9, 0.33, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 9, 0.47, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 10, 0.23, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 10, 0.23, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 10, 0.41, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.19, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.29, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.35, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.37, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.39, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.43, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.45, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [2, 11, 0.49, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 2, 0.17, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 2, 0.21, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 2, 0.31, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 2, 0.41, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 2, 0.49, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 3, 0.31, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 3, 0.37, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 3, 0.39, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 3, 0.47, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 3, 0.47, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 4, 0.19, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 4, 0.21, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 4, 0.31, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 4, 0.43, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 4, 0.45, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 5, 0.23, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 5, 0.35, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 5, 0.37, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.29, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.31, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.33, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.35, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.41, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.43, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 6, 0.45, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 7, 0.37, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 7, 0.41, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.27, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.31, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.35, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.37, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.39, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 8, 0.49, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.25, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.27, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.37, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.39, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.39, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 9, 0.49, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 10, 0.31, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 10, 0.33, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 10, 0.37, 0.0008, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 10, 0.39, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 11, 0.31, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [5, 11, 0.37, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.15, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.21, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.27, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.27, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.33, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.35, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 2, 0.49, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 3, 0.19, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 3, 0.39, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 3, 0.47, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 3, 0.51, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 4, 0.45, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 4, 0.49, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 5, 0.17, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 5, 0.45, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 6, 0.29, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 6, 0.37, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 7, 0.25, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 7, 0.39, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.33, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.35, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.35, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.41, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.45, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 8, 0.49, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 9, 0.25, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 9, 0.33, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 9, 0.35, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 9, 0.43, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 9, 0.47, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 10, 0.31, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 10, 0.41, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 11, 0.43, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 11, 0.43, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [8, 11, 0.51, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 2, 0.23, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 2, 0.37, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 2, 0.49, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 2, 0.49, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.19, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.31, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.37, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.39, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.47, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.49, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 4, 0.35, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 5, 0.31, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 5, 0.37, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 5, 0.41, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 5, 0.45, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 5, 0.51, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 6, 0.35, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 6, 0.47, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 6, 0.49, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 7, 0.45, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 7, 0.47, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 7, 0.47, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 7, 0.49, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 8, 0.27, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 8, 0.51, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 9, 0.35, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 9, 0.51, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 10, 0.37, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 10, 0.45, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 10, 0.47, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 10, 0.49, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 10, 0.49, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 11, 0.37, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 11, 0.49, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 2, 0.15, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 2, 0.27, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 2, 0.33, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 2, 0.39, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 3, 0.35, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 3, 0.35, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 3, 0.49, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 4, 0.21, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 4, 0.29, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 4, 0.51, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.23, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.25, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.27, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.29, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.31, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 5, 0.33, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 8, 0.31, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 9, 0.41, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 9, 0.49, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 10, 0.25, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 10, 0.25, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 10, 0.33, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 10, 0.37, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [14, 11, 0.35, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 2, 0.13, 0.0008, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 2, 0.27, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 2, 0.37, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 2, 0.45, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 2, 0.51, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 3, 0.15, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 3, 0.19, 0.0033, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 3, 0.19, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 3, 0.31, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 3, 0.41, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 4, 0.17, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 4, 0.21, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 4, 0.29, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 4, 0.31, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 4, 0.37, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 5, 0.31, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 5, 0.45, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 6, 0.35, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 6, 0.37, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 6, 0.37, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.27, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.29, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.35, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.39, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.43, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 7, 0.51, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 8, 0.37, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 8, 0.37, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 8, 0.39, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 8, 0.49, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 9, 0.37, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 9, 0.41, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 9, 0.45, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 10, 0.33, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 11, 0.37, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [17, 11, 0.49, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.11, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.17, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.27, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.35, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.41, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 2, 0.47, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.15, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.19, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.19, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.25, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.29, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.35, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.35, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 3, 0.45, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 4, 0.31, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 4, 0.35, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 4, 0.35, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 4, 0.49, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 5, 0.49, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 5, 0.51, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 5, 0.51, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 6, 0.21, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 6, 0.23, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 6, 0.29, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 6, 0.31, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 7, 0.37, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 7, 0.41, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 7, 0.41, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 7, 0.45, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 7, 0.49, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 8, 0.31, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 8, 0.37, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 8, 0.41, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 8, 0.49, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 8, 0.51, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 9, 0.41, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 9, 0.45, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 10, 0.29, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 10, 0.41, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 10, 0.41, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 10, 0.47, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 10, 0.51, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 11, 0.35, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 11, 0.41, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [20, 11, 0.43, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 2, 0.13, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 2, 0.21, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 2, 0.21, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 2, 0.23, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 2, 0.43, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 3, 0.29, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 3, 0.31, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 3, 0.33, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 3, 0.37, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 4, 0.17, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 4, 0.27, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 4, 0.33, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 4, 0.45, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 4, 0.49, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 5, 0.25, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 5, 0.27, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 5, 0.49, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 5, 0.51, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 6, 0.35, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 6, 0.41, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 6, 0.47, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 7, 0.25, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 7, 0.39, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 7, 0.49, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.39, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.39, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.39, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.39, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.45, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 8, 0.47, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 9, 0.39, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 9, 0.47, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 9, 0.49, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 11, 0.35, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 11, 0.39, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 11, 0.45, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [23, 11, 0.47, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 3, 0.15, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 3, 0.17, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 3, 0.25, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 3, 0.25, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 3, 0.35, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 4, 0.43, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 4, 0.45, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 4, 0.47, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 4, 0.49, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 5, 0.31, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 5, 0.35, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 5, 0.45, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 5, 0.49, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 5, 0.51, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 6, 0.31, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 6, 0.43, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.25, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.37, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.43, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.47, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.51, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 7, 0.51, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 8, 0.25, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 8, 0.35, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 8, 0.39, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 8, 0.45, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 8, 0.49, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 9, 0.31, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 9, 0.37, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 9, 0.41, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 9, 0.51, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 10, 0.25, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 10, 0.43, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 10, 0.45, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 11, 0.49, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [26, 11, 0.51, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 2, 0.27, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 3, 0.15, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.19, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.19, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.19, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.19, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.35, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.47, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 4, 0.51, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 5, 0.43, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 5, 0.49, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 5, 0.51, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.31, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.35, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.35, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.45, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.45, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.47, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 6, 0.49, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 7, 0.23, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 7, 0.25, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 7, 0.33, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 8, 0.41, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 8, 0.49, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 9, 0.35, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 9, 0.51, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 10, 0.25, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 10, 0.29, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 10, 0.49, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 11, 0.29, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 11, 0.31, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 11, 0.37, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [29, 11, 0.49, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.29, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.33, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.37, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.39, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.39, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 2, 0.51, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 3, 0.21, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 3, 0.23, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 3, 0.37, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 3, 0.39, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 3, 0.43, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 4, 0.25, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 4, 0.37, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 4, 0.41, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 4, 0.45, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.19, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.19, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.19, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.19, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.21, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.25, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.31, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.43, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.45, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 5, 0.47, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 6, 0.23, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 6, 0.25, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 6, 0.43, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 6, 0.43, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 6, 0.51, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 7, 0.37, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 7, 0.41, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 7, 0.45, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 7, 0.47, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.25, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.29, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.31, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.39, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.43, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.49, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 8, 0.51, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 9, 0.37, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 9, 0.45, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.25, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.29, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.33, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.37, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.41, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.43, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 10, 0.51, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 11, 0.33, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [32, 11, 0.39, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.15, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.21, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.27, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.41, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.41, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.45, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.47, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.49, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 2, 0.49, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.15, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.21, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.37, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.37, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.43, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.43, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 3, 0.49, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 4, 0.33, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 5, 0.31, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 5, 0.37, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 5, 0.43, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 5, 0.51, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 5, 0.51, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 6, 0.33, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 7, 0.29, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 7, 0.33, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 7, 0.43, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 7, 0.51, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 8, 0.33, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 8, 0.33, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 8, 0.41, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 8, 0.47, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 8, 0.49, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 9, 0.27, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 9, 0.35, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 9, 0.41, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 10, 0.27, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 10, 0.47, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 10, 0.47, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 10, 0.51, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 11, 0.29, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 11, 0.33, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 11, 0.33, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [35, 11, 0.35, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 2, 0.17, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 2, 0.19, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 2, 0.43, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.15, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.17, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.33, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.35, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.41, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.45, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 3, 0.45, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.19, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.37, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.37, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.39, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.51, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 4, 0.51, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 5, 0.23, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 5, 0.39, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 5, 0.41, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 6, 0.27, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 6, 0.31, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 6, 0.41, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 6, 0.49, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 7, 0.27, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 7, 0.31, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 7, 0.31, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 7, 0.47, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.27, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.33, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.35, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.37, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.41, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.43, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 8, 0.45, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.29, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.31, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.37, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.43, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.43, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 9, 0.47, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 10, 0.25, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 10, 0.33, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 10, 0.45, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 11, 0.33, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 11, 0.35, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 11, 0.39, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 11, 0.49, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [38, 11, 0.51, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.23, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.27, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.33, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.37, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.43, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.43, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 2, 0.49, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 3, 0.23, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 3, 0.25, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 3, 0.31, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 3, 0.31, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 4, 0.21, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 4, 0.39, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 4, 0.45, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 4, 0.47, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 5, 0.25, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 5, 0.39, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 5, 0.39, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 5, 0.51, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 6, 0.33, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 6, 0.37, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 6, 0.43, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 7, 0.39, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 7, 0.41, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 8, 0.29, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 8, 0.31, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 8, 0.35, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 8, 0.45, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 8, 0.45, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 9, 0.27, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 9, 0.35, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 9, 0.35, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 9, 0.35, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 10, 0.25, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 10, 0.37, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 10, 0.37, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 10, 0.41, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.33, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.35, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.35, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.43, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.49, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [41, 11, 0.51, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 2, 0.11, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 2, 0.23, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 2, 0.23, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 3, 0.25, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 3, 0.31, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 3, 0.37, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 3, 0.39, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 4, 0.17, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 4, 0.17, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 4, 0.31, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.21, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.25, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.27, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.29, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.31, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.35, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 5, 0.49, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 6, 0.21, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 6, 0.23, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 6, 0.27, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 6, 0.33, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 7, 0.27, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 7, 0.33, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 7, 0.47, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 7, 0.49, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 8, 0.29, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 8, 0.45, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 8, 0.47, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.29, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.31, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.39, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.41, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.45, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 9, 0.51, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 10, 0.49, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 10, 0.51, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 11, 0.29, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 11, 0.33, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 11, 0.41, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 11, 0.45, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [44, 11, 0.49, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 2, 0.15, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 2, 0.17, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 2, 0.21, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 2, 0.25, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 2, 0.35, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 3, 0.23, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 3, 0.31, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 3, 0.33, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 4, 0.27, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 4, 0.45, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 5, 0.19, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 5, 0.35, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 6, 0.29, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 6, 0.35, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 6, 0.41, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 7, 0.27, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 7, 0.41, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 7, 0.43, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 7, 0.47, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 7, 0.47, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 8, 0.25, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 8, 0.35, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 9, 0.33, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 10, 0.27, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 10, 0.31, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 10, 0.35, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 10, 0.49, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 11, 0.31, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 11, 0.39, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 11, 0.43, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [47, 11, 0.45, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [11, 3, 0.05, 0.0003, 0.0013, \"-0.000615\", \" 0.667404\", \"72\", \" 44.444444\", \"-0.000009\"], [17, 11, 0.13, 0.0013, 0.0048, \"-0.004466\", \" 0.537232\", \"11\", \" 45.454545\", \"-0.000406\"], [29, 7, 0.19, 0.0028, 0.0033, \"-0.017734\", \" 0.329946\", \"2\", \" 50.0\", \"-0.008867\"], [20, 8, 0.17, 0.0048, 0.0053, \"-0.019353\", \" 0.557701\", \"2\", \" 50.0\", \"-0.009677\"], [11, 8, 0.17, 0.0053, 0.0058, \"-0.019883\", \" 0.607662\", \"2\", \" 50.0\", \"-0.009942\"], [11, 7, 0.15, 0.0023, 0.0068, \"-0.02397\", \" 0.279971\", \"2\", \" 50.0\", \"-0.011985\"], [41, 6, 0.15, 0.0018, 0.0043, \"-0.035837\", \" 0.257935\", \"2\", \" 50.0\", \"-0.017919\"], [38, 10, 0.07, 0.0013, 0.0048, \"-0.041276\", \" 1.458528\", \"102\", \" 35.294118\", \"-0.000405\"], [41, 5, 0.11, 0.0018, 0.0038, \"-0.056966\", \" 0.426214\", \"6\", \" 50.0\", \"-0.009494\"], [23, 6, 0.19, 0.0003, 0.0058, \"-0.063384\", \" 0.063384\", \"1\", \" 0.0\", \"-0.063384\"], [38, 6, 0.19, 0.0003, 0.0068, \"-0.063384\", \" 0.063384\", \"1\", \" 0.0\", \"-0.063384\"], [32, 10, 0.23, 0.0023, 0.0063, \"-0.068193\", \" 0.246662\", \"1\", \" 0.0\", \"-0.068193\"], [11, 9, 0.11, 0.0018, 0.0033, \"-0.077065\", \" 0.65153\", \"14\", \" 50.0\", \"-0.005505\"], [2, 8, 0.03, 0.0003, 0.0028, \"-0.077503\", \" 1.09764\", \"96\", \" 32.291667\", \"-0.000807\"], [2, 6, 0.09, 0.0013, 0.0048, \"-0.078254\", \" 0.630379\", \"10\", \" 40.0\", \"-0.007825\"], [11, 5, 0.11, 0.0003, 0.0008, \"-0.081822\", \" 0.143405\", \"6\", \" 50.0\", \"-0.013637\"], [8, 11, 0.27, 0.0008, 0.0028, \"-0.113368\", \" 0.113368\", \"1\", \" 0.0\", \"-0.113368\"], [17, 7, 0.07, 0.0033, 0.0048, \"-0.122598\", \" 2.791211\", \"50\", \" 40.0\", \"-0.002452\"], [44, 10, 0.15, 0.0008, 0.0023, \"-0.130348\", \" 0.455015\", \"8\", \" 25.0\", \"-0.016293\"], [20, 6, 0.09, 0.0003, 0.0013, \"-0.136863\", \" 0.408037\", \"21\", \" 38.095238\", \"-0.006517\"], [41, 4, 0.11, 0.0043, 0.0048, \"-0.145723\", \" 0.464842\", \"3\", \" 33.333333\", \"-0.048574\"], [8, 10, 0.15, 0.0023, 0.0033, \"-0.150133\", \" 0.553798\", \"6\", \" 33.333333\", \"-0.025022\"], [41, 8, 0.15, 0.0013, 0.0063, \"-0.155706\", \" 0.366253\", \"4\", \" 25.0\", \"-0.038927\"], [32, 7, 0.21, 0.0013, 0.0028, \"-0.163351\", \" 0.163351\", \"1\", \" 0.0\", \"-0.163351\"], [41, 7, 0.21, 0.0013, 0.0038, \"-0.163351\", \" 0.163351\", \"1\", \" 0.0\", \"-0.163351\"], [17, 4, 0.05, 0.0003, 0.0043, \"-0.184616\", \" 1.174605\", \"116\", \" 34.482759\", \"-0.001592\"], [44, 9, 0.13, 0.0028, 0.0063, \"-0.194049\", \" 1.116702\", \"10\", \" 40.0\", \"-0.019405\"], [20, 7, 0.21, 0.0018, 0.0038, \"-0.213334\", \" 0.213334\", \"1\", \" 0.0\", \"-0.213334\"], [32, 7, 0.21, 0.0018, 0.0053, \"-0.213334\", \" 0.213334\", \"1\", \" 0.0\", \"-0.213334\"], [35, 11, 0.27, 0.0018, 0.0028, \"-0.213334\", \" 0.213334\", \"1\", \" 0.0\", \"-0.213334\"], [44, 7, 0.21, 0.0018, 0.0048, \"-0.213334\", \" 0.213334\", \"1\", \" 0.0\", \"-0.213334\"], [8, 10, 0.15, 0.0013, 0.0038, \"-0.215664\", \" 0.517119\", \"7\", \" 28.571429\", \"-0.030809\"], [14, 10, 0.15, 0.0023, 0.0043, \"-0.218825\", \" 0.715916\", \"6\", \" 33.333333\", \"-0.036471\"], [47, 10, 0.07, 0.0003, 0.0033, \"-0.225414\", \" 0.968101\", \"131\", \" 33.587786\", \"-0.001721\"], [5, 7, 0.11, 0.0008, 0.0013, \"-0.225919\", \" 0.434955\", \"9\", \" 33.333333\", \"-0.025102\"], [29, 10, 0.09, 0.0023, 0.0058, \"-0.230349\", \" 1.940405\", \"34\", \" 38.235294\", \"-0.006775\"], [47, 9, 0.17, 0.0013, 0.0018, \"-0.236904\", \" 0.236904\", \"4\", \" 25.0\", \"-0.059226\"], [29, 6, 0.17, 0.0023, 0.0053, \"-0.263318\", \" 0.263318\", \"1\", \" 0.0\", \"-0.263318\"], [32, 11, 0.15, 0.0013, 0.0033, \"-0.265367\", \" 0.491949\", \"7\", \" 28.571429\", \"-0.03791\"], [35, 7, 0.11, 0.0023, 0.0058, \"-0.27002\", \" 1.166645\", \"13\", \" 53.846154\", \"-0.020771\"], [44, 6, 0.07, 0.0058, 0.0068, \"-0.28039\", \" 4.285647\", \"37\", \" 40.540541\", \"-0.007578\"], [17, 6, 0.09, 0.0003, 0.0008, \"-0.284626\", \" 0.480542\", \"21\", \" 38.095238\", \"-0.013554\"], [20, 3, 0.05, 0.0013, 0.0053, \"-0.298095\", \" 1.436805\", \"77\", \" 33.766234\", \"-0.003871\"], [11, 6, 0.17, 0.0028, 0.0043, \"-0.313301\", \" 0.313301\", \"1\", \" 0.0\", \"-0.313301\"], [23, 6, 0.17, 0.0028, 0.0043, \"-0.313301\", \" 0.313301\", \"1\", \" 0.0\", \"-0.313301\"], [38, 7, 0.21, 0.0028, 0.0058, \"-0.313301\", \" 0.313301\", \"1\", \" 0.0\", \"-0.313301\"], [38, 7, 0.21, 0.0028, 0.0068, \"-0.313301\", \" 0.313301\", \"1\", \" 0.0\", \"-0.313301\"], [41, 10, 0.15, 0.0008, 0.0013, \"-0.329529\", \" 0.554331\", \"8\", \" 25.0\", \"-0.041191\"], [32, 7, 0.15, 0.0033, 0.0043, \"-0.331662\", \" 0.379921\", \"3\", \" 33.333333\", \"-0.110554\"], [2, 7, 0.07, 0.0038, 0.0053, \"-0.338066\", \" 1.474215\", \"17\", \" 29.411765\", \"-0.019886\"], [26, 6, 0.19, 0.0033, 0.0068, \"-0.363284\", \" 0.363284\", \"1\", \" 0.0\", \"-0.363284\"], [35, 6, 0.17, 0.0033, 0.0058, \"-0.363284\", \" 0.363284\", \"1\", \" 0.0\", \"-0.363284\"], [11, 11, 0.15, 0.0023, 0.0053, \"-0.369377\", \" 0.715916\", \"6\", \" 33.333333\", \"-0.061563\"], [32, 6, 0.17, 0.0038, 0.0063, \"-0.413268\", \" 0.413268\", \"1\", \" 0.0\", \"-0.413268\"], [35, 5, 0.07, 0.0023, 0.0058, \"-0.438837\", \" 2.10516\", \"48\", \" 31.25\", \"-0.009142\"], [29, 5, 0.09, 0.0028, 0.0038, \"-0.456682\", \" 1.305968\", \"14\", \" 42.857143\", \"-0.03262\"], [35, 6, 0.17, 0.0043, 0.0068, \"-0.463251\", \" 0.463251\", \"1\", \" 0.0\", \"-0.463251\"], [35, 10, 0.15, 0.0023, 0.0043, \"-0.481567\", \" 0.977348\", \"7\", \" 28.571429\", \"-0.068795\"], [14, 11, 0.07, 0.0013, 0.0053, \"-0.506947\", \" 1.391449\", \"91\", \" 36.263736\", \"-0.005571\"], [47, 5, 0.09, 0.0038, 0.0068, \"-0.521241\", \" 1.77465\", \"14\", \" 21.428571\", \"-0.037231\"], [44, 4, 0.07, 0.0058, 0.0068, \"-0.559577\", \" 3.31605\", \"27\", \" 33.333333\", \"-0.020725\"], [29, 6, 0.19, 0.0053, 0.0068, \"-0.563217\", \" 0.563217\", \"1\", \" 0.0\", \"-0.563217\"], [20, 10, 0.09, 0.0023, 0.0038, \"-0.576359\", \" 1.709536\", \"32\", \" 40.625\", \"-0.018011\"], [35, 3, 0.11, 0.0038, 0.0043, \"-0.591867\", \" 0.825986\", \"4\", \" 25.0\", \"-0.147967\"], [11, 9, 0.09, 0.0003, 0.0018, \"-0.69961\", \" 0.937074\", \"35\", \" 22.857143\", \"-0.019989\"], [5, 2, 0.03, 0.0003, 0.0068, \"-0.701979\", \" 2.022947\", \"191\", \" 31.413613\", \"-0.003675\"], [38, 7, 0.11, 0.0048, 0.0058, \"-0.712273\", \" 2.861989\", \"13\", \" 30.769231\", \"-0.05479\"], [35, 5, 0.05, 0.0003, 0.0043, \"-0.716704\", \" 1.519794\", \"173\", \" 31.213873\", \"-0.004143\"], [38, 11, 0.13, 0.0033, 0.0038, \"-0.737175\", \" 1.160456\", \"11\", \" 36.363636\", \"-0.067016\"], [38, 4, 0.05, 0.0023, 0.0043, \"-0.738156\", \" 2.4319\", \"97\", \" 36.082474\", \"-0.00761\"], [41, 3, 0.05, 0.0033, 0.0038, \"-0.820977\", \" 2.344507\", \"72\", \" 38.888889\", \"-0.011402\"], [41, 7, 0.11, 0.0033, 0.0058, \"-0.892609\", \" 1.683412\", \"13\", \" 23.076923\", \"-0.068662\"], [2, 7, 0.03, 0.0008, 0.0028, \"-0.971275\", \" 1.399654\", \"75\", \" 33.333333\", \"-0.01295\"], [47, 11, 0.07, 0.0018, 0.0063, \"-1.006574\", \" 2.121307\", \"103\", \" 34.951456\", \"-0.009773\"], [20, 8, 0.09, 0.0048, 0.0068, \"-1.0276\", \" 2.485865\", \"23\", \" 34.782609\", \"-0.044678\"], [14, 9, 0.11, 0.0028, 0.0048, \"-1.064052\", \" 1.368933\", \"14\", \" 21.428571\", \"-0.076004\"], [38, 8, 0.05, 0.0053, 0.0063, \"-1.149593\", \" 4.804238\", \"105\", \" 39.047619\", \"-0.010949\"], [44, 7, 0.09, 0.0028, 0.0043, \"-1.154922\", \" 1.702139\", \"25\", \" 32.0\", \"-0.046197\"], [23, 8, 0.09, 0.0043, 0.0053, \"-1.209457\", \" 2.336315\", \"24\", \" 33.333333\", \"-0.050394\"], [5, 11, 0.03, 0.0003, 0.0053, \"-1.312762\", \" 2.058039\", \"270\", \" 35.555556\", \"-0.004862\"], [23, 11, 0.05, 0.0063, 0.0068, \"-1.351681\", \" 6.275688\", \"88\", \" 40.909091\", \"-0.01536\"], [41, 10, 0.09, 0.0008, 0.0013, \"-1.448509\", \" 1.475213\", \"41\", \" 24.390244\", \"-0.035329\"], [44, 8, 0.05, 0.0038, 0.0043, \"-1.471794\", \" 5.399412\", \"136\", \" 37.5\", \"-0.010822\"], [2, 9, 0.09, 0.0033, 0.0043, \"-1.578495\", \" 1.626182\", \"12\", \" 16.666667\", \"-0.131541\"], [35, 6, 0.05, 0.0003, 0.0048, \"-1.590915\", \" 2.624811\", \"206\", \" 29.126214\", \"-0.007723\"], [23, 4, 0.05, 0.0013, 0.0043, \"-1.612793\", \" 1.942403\", \"107\", \" 31.775701\", \"-0.015073\"], [8, 9, 0.09, 0.0028, 0.0033, \"-1.668265\", \" 2.033664\", \"26\", \" 30.769231\", \"-0.064164\"], [35, 8, 0.07, 0.0013, 0.0018, \"-1.669158\", \" 2.027611\", \"89\", \" 35.955056\", \"-0.018755\"], [23, 10, 0.11, 0.0043, 0.0063, \"-1.695229\", \" 1.80687\", \"14\", \" 28.571429\", \"-0.121088\"], [2, 11, 0.09, 0.0028, 0.0033, \"-1.807586\", \" 1.832348\", \"13\", \" 15.384615\", \"-0.139045\"], [23, 7, 0.09, 0.0043, 0.0053, \"-1.857412\", \" 2.498155\", \"20\", \" 25.0\", \"-0.092871\"], [8, 11, 0.05, 0.0003, 0.0023, \"-1.919183\", \" 2.182898\", \"200\", \" 34.0\", \"-0.009596\"], [26, 9, 0.09, 0.0038, 0.0043, \"-1.931942\", \" 2.343842\", \"28\", \" 32.142857\", \"-0.068998\"], [47, 9, 0.07, 0.0013, 0.0023, \"-2.099843\", \" 2.635835\", \"102\", \" 34.313725\", \"-0.020587\"], [32, 9, 0.09, 0.0038, 0.0048, \"-2.106763\", \" 2.999491\", \"32\", \" 31.25\", \"-0.065836\"], [35, 6, 0.11, 0.0058, 0.0068, \"-2.137642\", \" 2.982266\", \"11\", \" 18.181818\", \"-0.194331\"], [41, 10, 0.05, 0.0038, 0.0043, \"-2.141773\", \" 7.406549\", \"152\", \" 39.473684\", \"-0.014091\"], [11, 11, 0.09, 0.0043, 0.0058, \"-2.3079\", \" 3.373219\", \"24\", \" 33.333333\", \"-0.096162\"], [17, 11, 0.11, 0.0053, 0.0058, \"-2.466163\", \" 2.606253\", \"14\", \" 28.571429\", \"-0.176154\"], [41, 5, 0.05, 0.0018, 0.0063, \"-2.523159\", \" 3.787825\", \"141\", \" 37.588652\", \"-0.017895\"], [17, 5, 0.03, 0.0038, 0.0063, \"-2.602808\", \" 6.122932\", \"133\", \" 35.338346\", \"-0.01957\"], [26, 11, 0.09, 0.0038, 0.0043, \"-2.667072\", \" 3.111118\", \"33\", \" 30.30303\", \"-0.08082\"], [17, 11, 0.11, 0.0048, 0.0068, \"-2.709654\", \" 2.784199\", \"14\", \" 28.571429\", \"-0.193547\"], [5, 11, 0.01, 0.0013, 0.0028, \"-2.787194\", \" 3.428363\", \"187\", \" 33.15508\", \"-0.014905\"], [5, 9, 0.03, 0.0013, 0.0058, \"-2.938613\", \" 2.958289\", \"160\", \" 30.0\", \"-0.018366\"], [17, 6, 0.05, 0.0058, 0.0068, \"-2.949592\", \" 6.628776\", \"75\", \" 36.0\", \"-0.039328\"], [5, 7, 0.01, 0.0008, 0.0048, \"-3.033825\", \" 3.509811\", \"273\", \" 33.699634\", \"-0.011113\"], [41, 10, 0.09, 0.0038, 0.0053, \"-3.204996\", \" 4.314839\", \"34\", \" 26.470588\", \"-0.094265\"], [26, 11, 0.05, 0.0043, 0.0048, \"-3.208976\", \" 6.182159\", \"124\", \" 35.483871\", \"-0.025879\"], [29, 4, 0.03, 0.0053, 0.0063, \"-3.278075\", \" 5.838607\", \"125\", \" 39.2\", \"-0.026225\"], [29, 10, 0.11, 0.0058, 0.0063, \"-3.312047\", \" 3.312047\", \"14\", \" 21.428571\", \"-0.236575\"], [29, 11, 0.05, 0.0003, 0.0068, \"-3.329051\", \" 3.410851\", \"341\", \" 31.671554\", \"-0.009763\"], [11, 6, 0.05, 0.0008, 0.0018, \"-3.333093\", \" 3.400658\", \"144\", \" 29.861111\", \"-0.023146\"], [8, 8, 0.05, 0.0023, 0.0058, \"-3.373116\", \" 4.890611\", \"94\", \" 34.042553\", \"-0.035884\"], [44, 2, 0.03, 0.0043, 0.0063, \"-3.461921\", \" 6.31815\", \"147\", \" 36.734694\", \"-0.02355\"], [29, 5, 0.05, 0.0003, 0.0008, \"-3.472919\", \" 3.472919\", \"170\", \" 32.352941\", \"-0.020429\"], [41, 7, 0.05, 0.0043, 0.0053, \"-3.611908\", \" 6.55168\", \"114\", \" 35.964912\", \"-0.031683\"], [44, 4, 0.03, 0.0043, 0.0048, \"-3.941889\", \" 6.953198\", \"184\", \" 36.956522\", \"-0.021423\"], [14, 11, 0.05, 0.0003, 0.0013, \"-3.961652\", \" 4.009511\", \"285\", \" 32.280702\", \"-0.013901\"], [26, 6, 0.05, 0.0013, 0.0043, \"-4.126679\", \" 4.193689\", \"163\", \" 28.834356\", \"-0.025317\"], [35, 4, 0.03, 0.0028, 0.0068, \"-4.274458\", \" 6.066017\", \"234\", \" 34.188034\", \"-0.018267\"], [35, 11, 0.05, 0.0003, 0.0018, \"-4.608569\", \" 4.656105\", \"366\", \" 31.967213\", \"-0.012592\"], [20, 11, 0.05, 0.0018, 0.0058, \"-4.628751\", \" 5.557912\", \"192\", \" 31.770833\", \"-0.024108\"], [8, 7, 0.01, 0.0038, 0.0048, \"-4.780707\", \" 6.49601\", \"114\", \" 35.087719\", \"-0.041936\"], [23, 7, 0.05, 0.0018, 0.0028, \"-4.924953\", \" 5.342347\", \"174\", \" 34.482759\", \"-0.028304\"], [8, 9, 0.05, 0.0028, 0.0033, \"-4.964493\", \" 6.010379\", \"96\", \" 33.333333\", \"-0.051713\"], [20, 7, 0.05, 0.0013, 0.0048, \"-5.149731\", \" 5.456154\", \"176\", \" 27.272727\", \"-0.02926\"], [20, 5, 0.01, 0.0038, 0.0063, \"-5.239772\", \" 7.3964\", \"169\", \" 36.094675\", \"-0.031005\"], [38, 9, 0.05, 0.0018, 0.0068, \"-5.296046\", \" 6.276215\", \"215\", \" 34.418605\", \"-0.024633\"], [26, 9, 0.01, 0.0028, 0.0053, \"-5.32296\", \" 7.557114\", \"271\", \" 33.579336\", \"-0.019642\"], [8, 3, 0.03, 0.0038, 0.0058, \"-5.371508\", \" 5.846198\", \"92\", \" 32.608696\", \"-0.058386\"], [41, 10, 0.03, 0.0053, 0.0063, \"-5.450725\", \" 7.821\", \"145\", \" 37.241379\", \"-0.037591\"], [11, 6, 0.03, 0.0013, 0.0048, \"-5.589659\", \" 5.99414\", \"290\", \" 32.068966\", \"-0.019275\"], [17, 3, 0.01, 0.0053, 0.0063, \"-5.59312\", \" 8.276392\", \"119\", \" 35.294118\", \"-0.047001\"], [20, 9, 0.01, 0.0043, 0.0063, \"-5.673685\", \" 8.350313\", \"145\", \" 33.793103\", \"-0.039129\"], [44, 9, 0.01, 0.0053, 0.0058, \"-5.754282\", \" 9.48008\", \"166\", \" 36.144578\", \"-0.034664\"], [14, 3, 0.03, 0.0023, 0.0053, \"-5.826582\", \" 5.919587\", \"193\", \" 33.160622\", \"-0.03019\"], [14, 9, 0.03, 0.0008, 0.0043, \"-5.938506\", \" 6.08411\", \"461\", \" 33.839479\", \"-0.012882\"], [41, 8, 0.05, 0.0023, 0.0038, \"-6.058726\", \" 7.106979\", \"187\", \" 34.759358\", \"-0.0324\"], [32, 8, 0.05, 0.0018, 0.0028, \"-6.188364\", \" 6.62692\", \"210\", \" 33.809524\", \"-0.029468\"], [35, 2, 0.03, 0.0003, 0.0028, \"-6.213494\", \" 6.257236\", \"456\", \" 27.850877\", \"-0.013626\"], [47, 10, 0.05, 0.0023, 0.0033, \"-6.216891\", \" 8.082265\", \"219\", \" 35.616438\", \"-0.028388\"], [41, 10, 0.03, 0.0038, 0.0068, \"-6.42262\", \" 10.238488\", \"198\", \" 32.323232\", \"-0.032437\"], [41, 8, 0.05, 0.0013, 0.0053, \"-6.477653\", \" 6.806444\", \"230\", \" 29.130435\", \"-0.028164\"], [26, 8, 0.01, 0.0033, 0.0053, \"-6.790492\", \" 8.556677\", \"230\", \" 33.913043\", \"-0.029524\"], [44, 10, 0.03, 0.0043, 0.0058, \"-6.842078\", \" 10.320357\", \"186\", \" 34.946237\", \"-0.036785\"], [20, 7, 0.03, 0.0023, 0.0063, \"-6.877897\", \" 8.31578\", \"244\", \" 34.836066\", \"-0.028188\"], [29, 5, 0.03, 0.0033, 0.0043, \"-7.09633\", \" 8.522039\", \"218\", \" 35.321101\", \"-0.032552\"], [20, 10, 0.03, 0.0023, 0.0063, \"-7.736294\", \" 9.669461\", \"250\", \" 34.0\", \"-0.030945\"], [20, 3, 0.01, 0.0048, 0.0058, \"-8.030566\", \" 9.635078\", \"145\", \" 33.793103\", \"-0.055383\"], [32, 5, 0.01, 0.0038, 0.0048, \"-8.219837\", \" 10.479264\", \"218\", \" 35.779817\", \"-0.037706\"], [38, 10, 0.01, 0.0028, 0.0063, \"-8.478\", \" 10.714152\", \"311\", \" 32.154341\", \"-0.02726\"], [14, 2, 0.01, 0.0018, 0.0048, \"-8.61119\", \" 8.95606\", \"370\", \" 30.27027\", \"-0.023273\"], [11, 4, 0.01, 0.0023, 0.0028, \"-8.829155\", \" 9.142076\", \"270\", \" 34.074074\", \"-0.032701\"], [32, 11, 0.01, 0.0028, 0.0063, \"-8.851183\", \" 10.453947\", \"282\", \" 31.914894\", \"-0.031387\"], [47, 11, 0.05, 0.0008, 0.0013, \"-8.853737\", \" 9.078574\", \"340\", \" 28.235294\", \"-0.02604\"], [44, 6, 0.03, 0.0023, 0.0043, \"-8.941836\", \" 10.040903\", \"364\", \" 35.989011\", \"-0.024565\"], [20, 2, 0.03, 0.0013, 0.0028, \"-9.580584\", \" 9.736987\", \"303\", \" 28.382838\", \"-0.031619\"], [47, 9, 0.03, 0.0028, 0.0063, \"-9.615512\", \" 11.99661\", \"295\", \" 32.542373\", \"-0.032595\"], [47, 10, 0.01, 0.0028, 0.0063, \"-9.620809\", \" 12.12301\", \"341\", \" 32.258065\", \"-0.028214\"], [23, 4, 0.03, 0.0008, 0.0053, \"-9.954981\", \" 10.043909\", \"515\", \" 30.291262\", \"-0.01933\"], [23, 2, 0.01, 0.0028, 0.0048, \"-10.058575\", \" 10.706774\", \"290\", \" 32.413793\", \"-0.034685\"], [35, 9, 0.03, 0.0023, 0.0043, \"-10.742529\", \" 12.532283\", \"358\", \" 34.636872\", \"-0.030007\"], [44, 8, 0.01, 0.0023, 0.0038, \"-11.9336\", \" 13.198336\", \"482\", \" 35.477178\", \"-0.024759\"], [17, 9, 0.03, 0.0018, 0.0023, \"-12.280513\", \" 12.303455\", \"357\", \" 31.932773\", \"-0.034399\"], [23, 2, 0.01, 0.0018, 0.0043, \"-12.641081\", \" 13.082299\", \"503\", \" 31.411531\", \"-0.025131\"], [26, 3, 0.03, 0.0013, 0.0023, \"-12.643244\", \" 13.191379\", \"425\", \" 30.588235\", \"-0.029749\"], [38, 3, 0.03, 0.0013, 0.0038, \"-12.856945\", \" 13.070425\", \"453\", \" 30.022075\", \"-0.028382\"], [38, 10, 0.03, 0.0018, 0.0068, \"-13.419902\", \" 13.949422\", \"437\", \" 30.892449\", \"-0.030709\"], [38, 8, 0.03, 0.0003, 0.0043, \"-14.670797\", \" 14.670797\", \"1091\", \" 28.230981\", \"-0.013447\"], [41, 8, 0.03, 0.0008, 0.0068, \"-15.946654\", \" 16.377025\", \"825\", \" 29.333333\", \"-0.019329\"], [32, 10, 0.03, 0.0018, 0.0023, \"-16.42\", \" 16.630007\", \"505\", \" 31.881188\", \"-0.032515\"], [44, 4, 0.03, 0.0013, 0.0023, \"-16.603264\", \" 16.782412\", \"553\", \" 28.571429\", \"-0.030024\"], [35, 10, 0.03, 0.0013, 0.0038, \"-17.038206\", \" 17.246905\", \"590\", \" 29.152542\", \"-0.028878\"], [35, 5, 0.01, 0.0018, 0.0033, \"-17.421261\", \" 18.176945\", \"607\", \" 31.136738\", \"-0.028701\"], [38, 11, 0.03, 0.0008, 0.0043, \"-18.932767\", \" 19.337136\", \"851\", \" 28.907168\", \"-0.022248\"], [41, 6, 0.03, 0.0013, 0.0023, \"-19.864197\", \" 19.963098\", \"640\", \" 29.21875\", \"-0.031038\"], [44, 10, 0.03, 0.0018, 0.0023, \"-20.030104\", \" 20.387502\", \"583\", \" 30.874786\", \"-0.034357\"], [44, 4, 0.01, 0.0013, 0.0053, \"-22.335553\", \" 22.891993\", \"965\", \" 30.984456\", \"-0.023146\"], [20, 3, 0.01, 0.0003, 0.0053, \"-29.506456\", \" 29.540014\", \"1989\", \" 26.495726\", \"-0.014835\"], [38, 4, 0.01, 0.0013, 0.0018, \"-30.583247\", \" 30.976062\", \"1112\", \" 30.935252\", \"-0.027503\"], [20, 2, 0.01, 0.0003, 0.0068, \"-30.680305\", \" 30.731768\", \"2030\", \" 25.862069\", \"-0.015113\"], [32, 3, 0.01, 0.0008, 0.0048, \"-31.577651\", \" 31.720567\", \"1476\", \" 27.777778\", \"-0.021394\"], [29, 10, 0.01, 0.0003, 0.0018, \"-33.182111\", \" 33.20104\", \"2081\", \" 26.621816\", \"-0.015945\"], [32, 11, 0.01, 0.0003, 0.0068, \"-35.436208\", \" 35.466976\", \"2239\", \" 25.636445\", \"-0.015827\"], [47, 4, 0.01, 0.0008, 0.0038, \"-38.02391\", \" 38.350362\", \"1805\", \" 28.033241\", \"-0.021066\"], [35, 11, 0.01, 0.0003, 0.0033, \"-38.769788\", \" 38.798915\", \"2406\", \" 25.103907\", \"-0.016114\"], [35, 9, 0.01, 0.0003, 0.0008, \"-48.84716\", \" 48.871493\", \"2604\", \" 25.076805\", \"-0.018759\"], [47, 2, 0.01, 0.0003, 0.0063, \"-53.943508\", \" 53.971448\", \"3624\", \" 23.289183\", \"-0.014885\"]];\n",
"\n",
" // Define the dt_args\n",
" let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_dom\": true};\n",
" dt_args[\"data\"] = data;\n",
"\n",
" \n",
" new DataTable(table, dt_args);\n",
" });\n",
"</script>\n"
],
"text/plain": [
" Total Return [%] \\\n",
"entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \n",
"17 9 0.07 0.0043 0.0063 3.167786 \n",
"2 6 0.03 0.0048 0.0063 2.779712 \n",
" 10 0.03 0.0038 0.0063 2.643149 \n",
"8 3 0.07 0.0028 0.0033 2.239084 \n",
"11 3 0.07 0.0033 0.0053 2.202983 \n",
"... ... \n",
"32 11 0.01 0.0003 0.0068 -35.436208 \n",
"47 4 0.01 0.0008 0.0038 -38.02391 \n",
"35 11 0.01 0.0003 0.0033 -38.769788 \n",
" 9 0.01 0.0003 0.0008 -48.84716 \n",
"47 2 0.01 0.0003 0.0063 -53.943508 \n",
"\n",
" Max Drawdown [%] \\\n",
"entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \n",
"17 9 0.07 0.0043 0.0063 2.202921 \n",
"2 6 0.03 0.0048 0.0063 2.321028 \n",
" 10 0.03 0.0038 0.0063 2.285255 \n",
"8 3 0.07 0.0028 0.0033 0.726632 \n",
"11 3 0.07 0.0033 0.0053 0.845649 \n",
"... ... \n",
"32 11 0.01 0.0003 0.0068 35.466976 \n",
"47 4 0.01 0.0008 0.0038 38.350362 \n",
"35 11 0.01 0.0003 0.0033 38.798915 \n",
" 9 0.01 0.0003 0.0008 48.871493 \n",
"47 2 0.01 0.0003 0.0063 53.971448 \n",
"\n",
" Total Trades \\\n",
"entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \n",
"17 9 0.07 0.0043 0.0063 55 \n",
"2 6 0.03 0.0048 0.0063 44 \n",
" 10 0.03 0.0038 0.0063 45 \n",
"8 3 0.07 0.0028 0.0033 16 \n",
"11 3 0.07 0.0033 0.0053 18 \n",
"... ... \n",
"32 11 0.01 0.0003 0.0068 2239 \n",
"47 4 0.01 0.0008 0.0038 1805 \n",
"35 11 0.01 0.0003 0.0033 2406 \n",
" 9 0.01 0.0003 0.0008 2604 \n",
"47 2 0.01 0.0003 0.0063 3624 \n",
"\n",
" Win Rate [%] \\\n",
"entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \n",
"17 9 0.07 0.0043 0.0063 43.636364 \n",
"2 6 0.03 0.0048 0.0063 45.454545 \n",
" 10 0.03 0.0038 0.0063 40.0 \n",
"8 3 0.07 0.0028 0.0033 75.0 \n",
"11 3 0.07 0.0033 0.0053 66.666667 \n",
"... ... \n",
"32 11 0.01 0.0003 0.0068 25.636445 \n",
"47 4 0.01 0.0008 0.0038 28.033241 \n",
"35 11 0.01 0.0003 0.0033 25.103907 \n",
" 9 0.01 0.0003 0.0008 25.076805 \n",
"47 2 0.01 0.0003 0.0063 23.289183 \n",
"\n",
" Expectancy \n",
"entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \n",
"17 9 0.07 0.0043 0.0063 0.057596 \n",
"2 6 0.03 0.0048 0.0063 0.063175 \n",
" 10 0.03 0.0038 0.0063 0.058737 \n",
"8 3 0.07 0.0028 0.0033 0.139943 \n",
"11 3 0.07 0.0033 0.0053 0.122388 \n",
"... ... \n",
"32 11 0.01 0.0003 0.0068 -0.015827 \n",
"47 4 0.01 0.0008 0.0038 -0.021066 \n",
"35 11 0.01 0.0003 0.0033 -0.016114 \n",
" 9 0.01 0.0003 0.0008 -0.018759 \n",
"47 2 0.01 0.0003 0.0063 -0.014885 \n",
"\n",
"[1000 rows x 5 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#PIPELINE - FOR - LOOP\n",
"\n",
"#indicator parameters\n",
"mom_timeperiod = list(range(2, 12))\n",
"\n",
"#uzavreni okna od 1 do 200\n",
"entry_window_closes = list(range(2, 50, 3))\n",
"#entry_window_closes = [3, 7, 15, 29, 45, 50, 70]\n",
"#threshold entries parameters\n",
"#long\n",
"mom_th = np.round(np.arange(0.01, 0.5 + 0.02, 0.02),4).tolist()#-0.02\n",
"# short mom_th = np.round(np.arange(-0.01, -0.3 - 0.02, -0.02),4).tolist()#-0.02\n",
"roc_th = np.round(np.arange(-0.2, -0.8 - 0.05, -0.05),4).tolist()#-0.2\n",
"#print(mom_th, roc_th)\n",
"\n",
"#portfolio simulation parameters\n",
"sl_stop =np.round(np.arange(0.03/100, 0.7/100, 0.05/100),4).tolist()\n",
"tp_stop = np.round(np.arange(0.03/100, 0.7/100, 0.05/100),4).tolist()\n",
"\n",
"combs = list(product(mom_timeperiod, mom_th, roc_th, sl_stop, tp_stop))\n",
"\n",
"@vbt.parameterized(merge_func = \"concat\", random_subset = 1000, show_progress=True) \n",
"def test_strat(entry_window_closes=60,\n",
" mom_timeperiod=2,\n",
" mom_th=-0.04,\n",
" #roc_th=-0.2,\n",
" sl_stop=0.19/100,\n",
" tp_stop=0.19/100):\n",
" # mom_timeperiod=2\n",
" # mom_th=-0.06\n",
" # roc_th=-0.2\n",
" # sl_stop=0.04/100\n",
" # tp_stop=0.04/100\n",
"\n",
" momshort = vbt.indicator(\"talib:MOM\").run(basic_data.close, timeperiod=mom_timeperiod, short_name = \"slope_short\")\n",
" rocp = vbt.indicator(\"talib:ROC\").run(basic_data.close, short_name = \"rocp\")\n",
" #rate of change + momentum\n",
"\n",
" #momshort.plot rocp.real_crossed_below(roc_th) & \n",
" short_signal = momshort.real_crossed_below(mom_th)\n",
" long_signal = momshort.real_crossed_above(mom_th)\n",
" # print(\"short signal\")\n",
" # print(short_signal.value_counts())\n",
"\n",
" #forced_exit = pd.Series(False, index=close.index)\n",
" forced_exit = basic_data.symbol_wrapper.fill(False)\n",
" #entry_window_open = pd.Series(False, index=close.index)\n",
" entry_window_open= basic_data.symbol_wrapper.fill(False)\n",
"\n",
" #print(entry_window_closes, \"entry window closes\")\n",
" # Calculate the time difference in minutes from market open for each timestamp\n",
" elapsed_min_from_open = (forced_exit.index.hour - market_open.hour) * 60 + (forced_exit.index.minute - market_open.minute)\n",
"\n",
" entry_window_open[(elapsed_min_from_open >= entry_window_opens) & (elapsed_min_from_open < entry_window_closes)] = True\n",
"\n",
" #print(entry_window_open.value_counts())\n",
"\n",
" forced_exit[(elapsed_min_from_open >= forced_exit_start) & (elapsed_min_from_open < forced_exit_end)] = True\n",
" short_entries = (short_signal & entry_window_open)\n",
" short_exits = forced_exit\n",
" entries = (long_signal & entry_window_open)\n",
" exits = forced_exit\n",
" #long_entries.info()\n",
" #number of trues and falses in long_entries\n",
" # print(short_exits.value_counts())\n",
" # print(short_entries.value_counts())\n",
"\n",
" #fig = plot_2y_close([],[momshort, rocp], close)\n",
" #short_signal.vbt.signals.plot_as_entries(close, fig=fig, add_trace_kwargs=dict(secondary_y=False))\n",
" #print(sl_stop)\n",
" #tsl_th=sl_stop, \n",
" #short_entries=short_entries, short_exits=short_exits,\n",
" pf = vbt.Portfolio.from_signals(close=basic_data.close, entries=entries, exits=exits, tsl_stop=sl_stop, tp_stop = tp_stop, fees=0.0167/100, freq=\"1s\", price=\"nextopen\") #sl_stop=sl_stop, tp_stop = sl_stop,\n",
" \n",
" return pf.stats([\n",
" 'total_return',\n",
" 'max_dd', \n",
" 'total_trades', \n",
" 'win_rate', \n",
" 'expectancy'\n",
" ])\n",
"\n",
"pf_results = test_strat(vbt.Param(entry_window_closes),\n",
" vbt.Param(mom_timeperiod),\n",
" vbt.Param(mom_th),\n",
" #vbt.Param(roc_th)\n",
" vbt.Param(sl_stop),\n",
" vbt.Param(tp_stop, condition=\"tp_stop > sl_stop\"))\n",
"pf_results = pf_results.unstack(level=-1)\n",
"pf_results.sort_values(by=[\"Total Return [%]\", \"Max Drawdown [%]\"], ascending=[False, True])\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PosixPath('8tiscomb_tsl.pickle')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#pf_results.load(\"10tiscomb.pickle\")\n",
"#pf_results.info()\n",
"\n",
"vbt.save(pf_results, \"8tiscomb_tsl.pickle\")\n",
"\n",
"# pf_results = vbt.load(\"8tiscomb_tsl.pickle\")\n",
"# pf_results\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'PXDFAccessor' object has no attribute 'pairplot'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[13], line 12\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# parallel_coordinates method¶\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# attach_px_methods.<locals>.plot_func(\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 8\u001b[0m \n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# pf_results.vbt.px.parallel_coordinates() #ocdf\u001b[39;00m\n\u001b[1;32m 11\u001b[0m res \u001b[38;5;241m=\u001b[39m pf_results\u001b[38;5;241m.\u001b[39mreset_index()\n\u001b[0;32m---> 12\u001b[0m \u001b[43mres\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvbt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpairplot\u001b[49m()\n",
"\u001b[0;31mAttributeError\u001b[0m: 'PXDFAccessor' object has no attribute 'pairplot'"
]
}
],
"source": [
"# parallel_coordinates method¶\n",
"\n",
"# attach_px_methods.<locals>.plot_func(\n",
"# *args,\n",
"# layout=None,\n",
"# **kwargs\n",
"# )\n",
"\n",
"# pf_results.vbt.px.parallel_coordinates() #ocdf\n",
"\n",
"res = pf_results.reset_index()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table id=\"itables_a9fb7564_fd47_4aec_aa8b_cbed21e787d1\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
"<thead>\n",
" <tr style=\"text-align: right;\">\n",
" \n",
" <th>entry_window_closes</th>\n",
" <th>mom_timeperiod</th>\n",
" <th>mom_th</th>\n",
" <th>sl_stop</th>\n",
" <th>tp_stop</th>\n",
" <th>Total Return [%]</th>\n",
" <th>Max Drawdown [%]</th>\n",
" <th>Total Trades</th>\n",
" <th>Win Rate [%]</th>\n",
" <th>Expectancy</th>\n",
" </tr>\n",
" </thead><tbody><tr>\n",
"<td style=\"vertical-align:middle; text-align:left\">\n",
"<div style=\"float:left; margin-right: 10px;\">\n",
"<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
"width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
" <g style=\"fill:#d9d7fc\">\n",
" <path d=\"M100,400H500V357H100Z\" />\n",
" <path d=\"M100,300H400V257H100Z\" />\n",
" <path d=\"M0,200H400V157H0Z\" />\n",
" <path d=\"M100,100H500V57H100Z\" />\n",
" <path d=\"M100,350H500V307H100Z\" />\n",
" <path d=\"M100,250H400V207H100Z\" />\n",
" <path d=\"M0,150H400V107H0Z\" />\n",
" <path d=\"M100,50H500V7H100Z\" />\n",
" </g>\n",
" <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
" <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"0;0;400\"\n",
" dur=\"3.5s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;300;0\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;400\"\n",
" dur=\"3s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
" <animate\n",
" attributeName=\"width\"\n",
" values=\"0;400;0\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" <animate\n",
" attributeName=\"x\"\n",
" values=\"100;100;500\"\n",
" dur=\"4s\"\n",
" repeatCount=\"indefinite\" />\n",
" </rect>\n",
" <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
" <g transform=\"translate(45 50) rotate(-45)\">\n",
" <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
" <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(450 152)\">\n",
" <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
" <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(50 352)\">\n",
" <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
" <polygon points=\"-35,10 0,45 35,10\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(75 250)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
"\n",
" <g transform=\"translate(425 250) rotate(180)\">\n",
" <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
" <polyline points=\"0,30 -30,0 0,-30\" />\n",
" </g>\n",
" </g>\n",
" </g>\n",
"</svg>\n",
"</a>\n",
"</div>\n",
"<div>\n",
"Loading ITables v2.0.1 from the <code>init_notebook_mode</code> cell...\n",
"(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
"</div>\n",
"</tr></tbody>\n",
"\n",
"</table>\n",
"<script type=\"module\">\n",
" const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_0_1);\n",
"\n",
" document.querySelectorAll(\"#itables_a9fb7564_fd47_4aec_aa8b_cbed21e787d1:not(.dataTable)\").forEach(table => {\n",
" // Define the table data\n",
" const data = [[3, 2, -0.31, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.31, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.29, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.29, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.29, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.29, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.29, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.27, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.25, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.23, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.23, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.23, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.23, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.21, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.19, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.19, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.19, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.19, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.19, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0033, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.17, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.15, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.15, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.15, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.15, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.15, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0033, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.13, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.11, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 2, -0.09, 0.0008, 0.0048, \"-0.000913\", \" 0.096496\", \"1\", \" 0.0\", \"-0.000913\"], [3, 2, -0.09, 0.0008, 0.0063, \"-0.000913\", \" 0.096496\", \"1\", \" 0.0\", \"-0.000913\"], [3, 2, -0.09, 0.0013, 0.0028, \" 0.246606\", \" 0.126298\", \"1\", \" 100.0\", \" 0.246606\"], [3, 2, -0.09, 0.0013, 0.0058, \" 0.230486\", \" 0.145572\", \"1\", \" 100.0\", \" 0.230486\"], [3, 2, -0.09, 0.0018, 0.0033, \" 0.296606\", \" 0.126298\", \"1\", \" 100.0\", \" 0.296606\"], [3, 2, -0.09, 0.0018, 0.0053, \" 0.180683\", \" 0.195188\", \"1\", \" 100.0\", \" 0.180683\"], [3, 2, -0.09, 0.0023, 0.0048, \" 0.130879\", \" 0.244805\", \"1\", \" 100.0\", \" 0.130879\"], [3, 2, -0.09, 0.0028, 0.0038, \" 0.346606\", \" 0.126298\", \"1\", \" 100.0\", \" 0.346606\"], [3, 2, -0.09, 0.0033, 0.0043, \" 0.031273\", \" 0.344038\", \"1\", \" 100.0\", \" 0.031273\"], [3, 2, -0.09, 0.0033, 0.0048, \" 0.031273\", \" 0.344038\", \"1\", \" 100.0\", \" 0.031273\"], [3, 2, -0.09, 0.0038, 0.0053, \"-0.018531\", \" 0.393654\", \"1\", \" 0.0\", \"-0.018531\"], [3, 2, -0.09, 0.0063, 0.0068, \"-0.267547\", \" 0.641736\", \"1\", \" 0.0\", \"-0.267547\"], [3, 2, -0.07, 0.0003, 0.0013, \"-0.037645\", \" 0.236568\", \"5\", \" 40.0\", \"-0.007529\"], [3, 2, -0.07, 0.0003, 0.0043, \"-0.040567\", \" 0.236568\", \"5\", \" 40.0\", \"-0.008113\"], [3, 2, -0.07, 0.0013, 0.0063, \" 0.067541\", \" 0.308708\", \"3\", \" 33.333333\", \" 0.022514\"], [3, 2, -0.07, 0.0018, 0.0068, \"-0.082174\", \" 0.408139\", \"3\", \" 33.333333\", \"-0.027391\"], [3, 2, -0.07, 0.0023, 0.0063, \"-0.231739\", \" 0.50752\", \"3\", \" 33.333333\", \"-0.077246\"], [3, 2, -0.07, 0.0033, 0.0063, \" 0.567388\", \" 0.612668\", \"3\", \" 66.666667\", \" 0.189129\"], [3, 2, -0.05, 0.0008, 0.0023, \"-1.052934\", \" 1.164182\", \"25\", \" 24.0\", \"-0.042117\"], [3, 2, -0.05, 0.0013, 0.0058, \"-1.105037\", \" 1.201952\", \"23\", \" 26.086957\", \"-0.048045\"], [3, 2, -0.05, 0.0023, 0.0048, \"-1.187813\", \" 1.444356\", \"22\", \" 22.727273\", \"-0.053992\"], [3, 2, -0.05, 0.0028, 0.0033, \"-1.204566\", \" 1.403019\", \"20\", \" 30.0\", \"-0.060228\"], [3, 2, -0.05, 0.0038, 0.0068, \"-0.882346\", \" 2.094615\", \"19\", \" 31.578947\", \"-0.046439\"], [3, 2, -0.03, 0.0013, 0.0043, \"-2.475118\", \" 3.237959\", \"81\", \" 32.098765\", \"-0.030557\"], [3, 2, -0.03, 0.0018, 0.0023, \"-2.855781\", \" 3.409206\", \"73\", \" 30.136986\", \"-0.03912\"], [3, 2, -0.03, 0.0018, 0.0048, \"-2.520364\", \" 3.109399\", \"70\", \" 30.0\", \"-0.036005\"], [3, 2, -0.03, 0.0018, 0.0053, \"-2.195775\", \" 2.786772\", \"68\", \" 30.882353\", \"-0.032291\"], [3, 2, -0.03, 0.0018, 0.0068, \"-2.211473\", \" 2.802375\", \"68\", \" 30.882353\", \"-0.032522\"], [3, 2, -0.03, 0.0033, 0.0043, \"-0.197482\", \" 2.884571\", \"55\", \" 41.818182\", \"-0.003591\"], [3, 2, -0.03, 0.0038, 0.0048, \" 0.993581\", \" 2.498117\", \"50\", \" 46.0\", \" 0.019872\"], [3, 2, -0.03, 0.0058, 0.0063, \"-3.240132\", \" 6.227668\", \"45\", \" 33.333333\", \"-0.072003\"], [3, 2, -0.01, 0.0003, 0.0038, \"-3.411318\", \" 4.004755\", \"316\", \" 30.379747\", \"-0.010795\"], [3, 2, -0.01, 0.0008, 0.0013, \"-7.570455\", \" 7.847877\", \"242\", \" 30.578512\", \"-0.031283\"], [3, 2, -0.01, 0.0008, 0.0028, \"-5.595962\", \" 6.303889\", \"217\", \" 29.953917\", \"-0.025788\"], [3, 2, -0.01, 0.0028, 0.0048, \"-2.209508\", \" 4.626698\", \"83\", \" 33.73494\", \"-0.026621\"], [3, 2, -0.01, 0.0028, 0.0053, \"-1.064854\", \" 4.319734\", \"81\", \" 34.567901\", \"-0.013146\"], [3, 2, -0.01, 0.0048, 0.0068, \"-1.478394\", \" 4.935465\", \"59\", \" 38.983051\", \"-0.025058\"], [3, 3, -0.31, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.31, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.31, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.31, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.29, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.27, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.25, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.25, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.25, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.25, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.23, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.23, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.23, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.23, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.23, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.21, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.19, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.17, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.15, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.13, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.11, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.11, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.11, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.11, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.11, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 3, -0.09, 0.0003, 0.0008, \" 0.093233\", \" 0.016697\", \"2\", \" 100.0\", \" 0.046616\"], [3, 3, -0.09, 0.0008, 0.0018, \" 0.014736\", \" 0.125392\", \"2\", \" 50.0\", \" 0.007368\"], [3, 3, -0.09, 0.0013, 0.0018, \" 0.140433\", \" 0.205024\", \"2\", \" 50.0\", \" 0.070217\"], [3, 3, -0.09, 0.0043, 0.0058, \" 0.449629\", \" 0.443519\", \"2\", \" 50.0\", \" 0.224814\"], [3, 3, -0.07, 0.0003, 0.0058, \"-0.297573\", \" 0.391501\", \"13\", \" 23.076923\", \"-0.02289\"], [3, 3, -0.07, 0.0013, 0.0028, \"-0.457651\", \" 0.489383\", \"10\", \" 20.0\", \"-0.045765\"], [3, 3, -0.07, 0.0018, 0.0038, \"-0.676424\", \" 0.847435\", \"10\", \" 20.0\", \"-0.067642\"], [3, 3, -0.07, 0.0023, 0.0063, \"-0.785359\", \" 1.00804\", \"10\", \" 20.0\", \"-0.078536\"], [3, 3, -0.07, 0.0028, 0.0043, \"-0.27522\", \" 0.969267\", \"9\", \" 33.333333\", \"-0.03058\"], [3, 3, -0.07, 0.0028, 0.0053, \"-0.076459\", \" 0.969267\", \"9\", \" 33.333333\", \"-0.008495\"], [3, 3, -0.07, 0.0028, 0.0063, \" 0.122499\", \" 0.969267\", \"9\", \" 33.333333\", \" 0.013611\"], [3, 3, -0.07, 0.0033, 0.0068, \"-0.128171\", \" 1.11796\", \"9\", \" 33.333333\", \"-0.014241\"], [3, 3, -0.07, 0.0038, 0.0063, \"-0.576203\", \" 1.266504\", \"9\", \" 22.222222\", \"-0.064023\"], [3, 3, -0.07, 0.0053, 0.0068, \"-1.038232\", \" 1.711243\", \"8\", \" 25.0\", \"-0.129779\"], [3, 3, -0.07, 0.0063, 0.0068, \"-1.631788\", \" 2.006992\", \"8\", \" 25.0\", \"-0.203974\"], [3, 3, -0.05, 0.0003, 0.0023, \" 0.061039\", \" 0.382354\", \"42\", \" 40.47619\", \" 0.001453\"], [3, 3, -0.05, 0.0013, 0.0023, \"-1.367189\", \" 1.367189\", \"37\", \" 29.72973\", \"-0.036951\"], [3, 3, -0.05, 0.0013, 0.0033, \"-1.2779\", \" 1.2779\", \"37\", \" 29.72973\", \"-0.034538\"], [3, 3, -0.05, 0.0023, 0.0038, \"-1.762008\", \" 1.931576\", \"33\", \" 30.30303\", \"-0.053394\"], [3, 3, -0.05, 0.0033, 0.0038, \"-1.159653\", \" 2.122396\", \"30\", \" 33.333333\", \"-0.038655\"], [3, 3, -0.05, 0.0033, 0.0058, \"-0.538832\", \" 1.761534\", \"29\", \" 34.482759\", \"-0.01858\"], [3, 3, -0.05, 0.0038, 0.0058, \"-0.720519\", \" 2.05279\", \"29\", \" 37.931034\", \"-0.024845\"], [3, 3, -0.03, 0.0003, 0.0028, \" 0.165412\", \" 0.87594\", \"120\", \" 42.5\", \" 0.001378\"], [3, 3, -0.03, 0.0003, 0.0043, \" 0.196993\", \" 0.87594\", \"120\", \" 42.5\", \" 0.001642\"], [3, 3, -0.03, 0.0003, 0.0058, \" 0.196993\", \" 0.87594\", \"120\", \" 42.5\", \" 0.001642\"], [3, 3, -0.03, 0.0008, 0.0068, \"-0.556962\", \" 1.58461\", \"103\", \" 37.864078\", \"-0.005407\"], [3, 3, -0.03, 0.0013, 0.0018, \"-1.894879\", \" 2.687688\", \"92\", \" 33.695652\", \"-0.020597\"], [3, 3, -0.03, 0.0023, 0.0033, \"-1.381903\", \" 2.698697\", \"68\", \" 36.764706\", \"-0.020322\"], [3, 3, -0.03, 0.0023, 0.0043, \"-0.901423\", \" 2.161321\", \"68\", \" 36.764706\", \"-0.013256\"], [3, 3, -0.03, 0.0038, 0.0063, \" 3.276255\", \" 2.068009\", \"52\", \" 48.076923\", \" 0.063005\"], [3, 3, -0.03, 0.0053, 0.0063, \" 0.666661\", \" 3.729367\", \"48\", \" 43.75\", \" 0.013889\"], [3, 3, -0.03, 0.0058, 0.0063, \"-1.422156\", \" 5.085866\", \"47\", \" 38.297872\", \"-0.030259\"], [3, 3, -0.01, 0.0018, 0.0068, \"-2.139486\", \" 3.642764\", \"99\", \" 30.30303\", \"-0.021611\"], [3, 3, -0.01, 0.0028, 0.0033, \"-3.80719\", \" 5.575562\", \"84\", \" 34.52381\", \"-0.045324\"], [3, 3, -0.01, 0.0028, 0.0063, \"-0.964667\", \" 4.049286\", \"79\", \" 35.443038\", \"-0.012211\"], [3, 3, -0.01, 0.0033, 0.0048, \"-2.966569\", \" 5.547334\", \"74\", \" 35.135135\", \"-0.040089\"], [3, 3, -0.01, 0.0033, 0.0063, \"-1.171536\", \" 4.515128\", \"71\", \" 35.211268\", \"-0.016501\"], [3, 4, -0.31, 0.0003, 0.0008, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.31, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0008, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.29, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0013, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.27, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.25, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.23, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.23, 0.0003, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.23, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.23, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.23, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.21, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.19, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.17, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.17, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.17, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.17, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.17, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.15, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 4, -0.13, 0.0008, 0.0068, \"-0.113394\", \" 0.113394\", \"1\", \" 0.0\", \"-0.113394\"], [3, 4, -0.13, 0.0018, 0.0033, \" 0.068406\", \" 0.195626\", \"1\", \" 100.0\", \" 0.068406\"], [3, 4, -0.13, 0.0023, 0.0033, \" 0.018547\", \" 0.245354\", \"1\", \" 100.0\", \" 0.018547\"], [3, 4, -0.13, 0.0033, 0.0043, \"-0.081172\", \" 0.34481\", \"1\", \" 0.0\", \"-0.081172\"], [3, 4, -0.11, 0.0003, 0.0023, \"-0.061283\", \" 0.110009\", \"2\", \" 50.0\", \"-0.030641\"], [3, 4, -0.11, 0.0018, 0.0048, \"-0.079484\", \" 0.339449\", \"2\", \" 50.0\", \"-0.039742\"], [3, 4, -0.11, 0.0033, 0.0058, \" 0.46499\", \" 0.34481\", \"2\", \" 50.0\", \" 0.232495\"], [3, 4, -0.09, 0.0003, 0.0053, \" 0.060149\", \" 0.109958\", \"3\", \" 66.666667\", \" 0.02005\"], [3, 4, -0.09, 0.0008, 0.0053, \"-0.089712\", \" 0.209768\", \"3\", \" 66.666667\", \"-0.029904\"], [3, 4, -0.09, 0.0013, 0.0063, \" 0.041351\", \" 0.308708\", \"3\", \" 33.333333\", \" 0.013784\"], [3, 4, -0.09, 0.0023, 0.0048, \"-0.257903\", \" 0.50752\", \"3\", \" 33.333333\", \"-0.085968\"], [3, 4, -0.09, 0.0028, 0.0043, \" 0.467504\", \" 0.563192\", \"3\", \" 66.666667\", \" 0.155835\"], [3, 4, -0.07, 0.0003, 0.0023, \"-0.595852\", \" 0.595852\", \"23\", \" 21.73913\", \"-0.025907\"], [3, 4, -0.07, 0.0003, 0.0028, \"-0.595852\", \" 0.595852\", \"23\", \" 21.73913\", \"-0.025907\"], [3, 4, -0.07, 0.0008, 0.0033, \"-1.154407\", \" 1.154407\", \"22\", \" 22.727273\", \"-0.052473\"], [3, 4, -0.07, 0.0008, 0.0063, \"-1.154407\", \" 1.154407\", \"22\", \" 22.727273\", \"-0.052473\"], [3, 4, -0.07, 0.0018, 0.0048, \"-1.485437\", \" 1.655055\", \"19\", \" 31.578947\", \"-0.078181\"], [3, 4, -0.05, 0.0003, 0.0028, \"-0.185954\", \" 0.635686\", \"51\", \" 35.294118\", \"-0.003646\"], [3, 4, -0.05, 0.0008, 0.0038, \"-1.056713\", \" 1.101227\", \"48\", \" 31.25\", \"-0.022015\"], [3, 4, -0.05, 0.0018, 0.0048, \"-0.78177\", \" 1.352344\", \"41\", \" 31.707317\", \"-0.019068\"], [3, 4, -0.05, 0.0038, 0.0048, \" 0.601489\", \" 1.89325\", \"36\", \" 41.666667\", \" 0.016708\"], [3, 4, -0.05, 0.0038, 0.0068, \" 1.183575\", \" 1.62695\", \"35\", \" 42.857143\", \" 0.033816\"], [3, 4, -0.03, 0.0003, 0.0018, \"-1.211519\", \" 1.433646\", \"139\", \" 35.251799\", \"-0.008716\"], [3, 4, -0.03, 0.0008, 0.0068, \"-1.402371\", \" 2.015254\", \"113\", \" 34.513274\", \"-0.01241\"], [3, 4, -0.03, 0.0018, 0.0023, \"-2.943698\", \" 3.741749\", \"84\", \" 32.142857\", \"-0.035044\"], [3, 4, -0.03, 0.0038, 0.0053, \" 1.855724\", \" 1.962524\", \"54\", \" 46.296296\", \" 0.034365\"], [3, 4, -0.03, 0.0053, 0.0058, \" 0.036367\", \" 3.672633\", \"50\", \" 44.0\", \" 0.000727\"], [3, 4, -0.01, 0.0008, 0.0018, \"-5.949169\", \" 6.510457\", \"195\", \" 31.282051\", \"-0.030509\"], [3, 4, -0.01, 0.0008, 0.0033, \"-4.995863\", \" 5.590813\", \"190\", \" 31.578947\", \"-0.026294\"], [3, 4, -0.01, 0.0008, 0.0053, \"-4.680195\", \" 5.277123\", \"188\", \" 31.914894\", \"-0.024895\"], [3, 4, -0.01, 0.0013, 0.0023, \"-4.800773\", \" 5.784495\", \"144\", \" 27.777778\", \"-0.033339\"], [3, 4, -0.01, 0.0018, 0.0068, \"-1.468244\", \" 3.529039\", \"94\", \" 31.914894\", \"-0.01562\"], [3, 4, -0.01, 0.0023, 0.0058, \"-0.235579\", \" 3.412114\", \"79\", \" 36.708861\", \"-0.002982\"], [3, 4, -0.01, 0.0023, 0.0063, \" 0.361385\", \" 3.316027\", \"79\", \" 36.708861\", \" 0.004574\"], [3, 4, -0.01, 0.0028, 0.0053, \"-0.547923\", \" 4.053263\", \"75\", \" 34.666667\", \"-0.007306\"], [3, 4, -0.01, 0.0033, 0.0058, \"-0.364456\", \" 4.01948\", \"67\", \" 35.820896\", \"-0.00544\"], [3, 4, -0.01, 0.0043, 0.0063, \" 0.684406\", \" 2.777321\", \"59\", \" 38.983051\", \" 0.0116\"], [3, 4, -0.01, 0.0053, 0.0058, \"-0.494071\", \" 3.942401\", \"54\", \" 42.592593\", \"-0.009149\"], [3, 5, -0.31, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0003, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0008, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.31, 0.0058, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0003, 0.0013, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0048, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.29, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.27, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.27, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.27, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.27, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.25, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.25, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.25, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.25, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.23, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.23, 0.0013, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.23, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0008, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0018, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.21, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.19, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.19, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.17, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.15, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.15, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.15, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.15, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.15, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [3, 5, -0.13, 0.0003, 0.0063, \" 0.002113\", \" 0.046644\", \"1\", \" 100.0\", \" 0.002113\"], [3, 5, -0.13, 0.0008, 0.0013, \"-0.047854\", \" 0.096587\", \"1\", \" 0.0\", \"-0.047854\"], [3, 5, -0.13, 0.0023, 0.0068, \"-0.197756\", \" 0.246415\", \"1\", \" 0.0\", \"-0.197756\"], [3, 5, -0.13, 0.0028, 0.0038, \" 0.346606\", \" 0.248691\", \"1\", \" 100.0\", \" 0.346606\"], [3, 5, -0.13, 0.0048, 0.0063, \" 0.596606\", \" 0.248691\", \"1\", \" 100.0\", \" 0.596606\"], [3, 5, -0.11, 0.0008, 0.0033, \"-0.161194\", \" 0.209872\", \"2\", \" 0.0\", \"-0.080597\"], [3, 5, -0.11, 0.0008, 0.0043, \"-0.161194\", \" 0.209872\", \"2\", \" 0.0\", \"-0.080597\"], [3, 5, -0.11, 0.0008, 0.0063, \"-0.161194\", \" 0.209872\", \"2\", \" 0.0\", \"-0.080597\"], [3, 5, -0.11, 0.0013, 0.0018, \" 0.048641\", \" 0.289578\", \"2\", \" 50.0\", \" 0.02432\"], [3, 5, -0.11, 0.0013, 0.0023, \" 0.098592\", \" 0.289578\", \"2\", \" 50.0\", \" 0.049296\"], [3, 5, -0.11, 0.0018, 0.0023, \" 0.048526\", \" 0.339449\", \"2\", \" 50.0\", \" 0.024263\"], [3, 5, -0.11, 0.0038, 0.0068, \" 0.514727\", \" 0.394538\", \"2\", \" 50.0\", \" 0.257363\"], [3, 5, -0.11, 0.0063, 0.0068, \" 0.263818\", \" 0.643177\", \"2\", \" 50.0\", \" 0.131909\"], [3, 5, -0.09, 0.0008, 0.0063, \"-0.361319\", \" 0.361319\", \"8\", \" 37.5\", \"-0.045165\"], [3, 5, -0.09, 0.0018, 0.0063, \" 0.117674\", \" 0.512947\", \"7\", \" 42.857143\", \" 0.016811\"], [3, 5, -0.09, 0.0038, 0.0063, \"-0.546605\", \" 0.951784\", \"6\", \" 33.333333\", \"-0.091101\"], [3, 5, -0.07, 0.0003, 0.0033, \"-0.670499\", \" 0.712116\", \"30\", \" 26.666667\", \"-0.02235\"], [3, 5, -0.07, 0.0003, 0.0053, \"-0.670499\", \" 0.712116\", \"30\", \" 26.666667\", \"-0.02235\"], [3, 5, -0.07, 0.0008, 0.0023, \"-1.430832\", \" 1.487617\", \"29\", \" 27.586207\", \"-0.049339\"], [3, 5, -0.07, 0.0008, 0.0028, \"-1.472846\", \" 1.529606\", \"29\", \" 27.586207\", \"-0.050788\"], [3, 5, -0.07, 0.0033, 0.0038, \"-0.207254\", \" 1.690324\", \"22\", \" 40.909091\", \"-0.009421\"], [3, 5, -0.07, 0.0033, 0.0048, \"-0.817234\", \" 1.718774\", \"22\", \" 40.909091\", \"-0.037147\"], [3, 5, -0.07, 0.0048, 0.0058, \"-0.605023\", \" 2.136709\", \"22\", \" 36.363636\", \"-0.027501\"], [3, 5, -0.05, 0.0008, 0.0018, \"-1.852047\", \" 2.02758\", \"59\", \" 27.118644\", \"-0.031391\"], [3, 5, -0.05, 0.0028, 0.0053, \"-1.076635\", \" 3.216617\", \"41\", \" 34.146341\", \"-0.026259\"], [3, 5, -0.05, 0.0033, 0.0048, \"-0.161238\", \" 2.824909\", \"40\", \" 42.5\", \"-0.004031\"], [3, 5, -0.03, 0.0003, 0.0018, \"-1.811654\", \" 2.049606\", \"149\", \" 36.241611\", \"-0.012159\"], [3, 5, -0.03, 0.0003, 0.0028, \"-1.591392\", \" 1.829879\", \"148\", \" 36.486486\", \"-0.010753\"], [3, 5, -0.03, 0.0003, 0.0058, \"-1.584832\", \" 1.823335\", \"148\", \" 36.486486\", \"-0.010708\"], [3, 5, -0.03, 0.0008, 0.0013, \"-3.066778\", \" 3.69137\", \"126\", \" 32.539683\", \"-0.02434\"], [3, 5, -0.03, 0.0013, 0.0028, \"-3.046576\", \" 3.640588\", \"98\", \" 29.591837\", \"-0.031088\"], [3, 5, -0.03, 0.0013, 0.0063, \"-2.366422\", \" 3.150724\", \"93\", \" 27.956989\", \"-0.025445\"], [3, 5, -0.03, 0.0043, 0.0053, \" 1.445325\", \" 2.847863\", \"53\", \" 47.169811\", \" 0.02727\"], [3, 5, -0.03, 0.0048, 0.0058, \"-0.175746\", \" 3.872713\", \"52\", \" 42.307692\", \"-0.00338\"], [70, 8, -0.03, 0.0018, 0.0043, \"-12.071101\", \" 13.923285\", \"564\", \" 33.865248\", \"-0.021403\"], [70, 8, -0.03, 0.0023, 0.0033, \"-14.006673\", \" 16.029465\", \"501\", \" 33.133733\", \"-0.027957\"], [70, 8, -0.03, 0.0028, 0.0033, \"-9.405029\", \" 12.800134\", \"410\", \" 34.634146\", \"-0.022939\"], [70, 8, -0.03, 0.0028, 0.0063, \"-5.750959\", \" 9.721317\", \"340\", \" 33.235294\", \"-0.016915\"], [70, 8, -0.03, 0.0038, 0.0063, \"-3.868006\", \" 8.544818\", \"245\", \" 35.102041\", \"-0.015788\"], [70, 8, -0.03, 0.0048, 0.0058, \"-7.470763\", \" 11.694015\", \"208\", \" 33.173077\", \"-0.035917\"], [70, 8, -0.03, 0.0053, 0.0058, \"-8.217598\", \" 12.553385\", \"189\", \" 33.862434\", \"-0.043479\"], [70, 8, -0.03, 0.0058, 0.0063, \"-5.731443\", \" 11.190726\", \"162\", \" 34.567901\", \"-0.035379\"], [70, 8, -0.01, 0.0003, 0.0038, \"-60.86103\", \" 60.939141\", \"4238\", \" 23.360076\", \"-0.014361\"], [70, 8, -0.01, 0.0008, 0.0053, \"-44.155178\", \" 44.807166\", \"2105\", \" 26.983373\", \"-0.020976\"], [70, 8, -0.01, 0.0013, 0.0063, \"-24.522739\", \" 25.590642\", \"1134\", \" 30.070547\", \"-0.021625\"], [70, 8, -0.01, 0.0023, 0.0028, \"-19.332252\", \" 21.023725\", \"663\", \" 33.936652\", \"-0.029159\"], [70, 8, -0.01, 0.0028, 0.0068, \"-7.907616\", \" 11.849208\", \"394\", \" 31.979695\", \"-0.02007\"], [70, 8, -0.01, 0.0033, 0.0043, \"-11.266881\", \" 14.896937\", \"368\", \" 35.054348\", \"-0.030617\"], [70, 8, -0.01, 0.0058, 0.0063, \"-2.921027\", \" 10.241884\", \"165\", \" 37.575758\", \"-0.017703\"], [70, 9, -0.31, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.31, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.29, 0.0048, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0018, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0033, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0043, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.27, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.25, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.25, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.25, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.25, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.25, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0008, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0033, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0043, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.23, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0048, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.21, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0003, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0003, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.19, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 9, -0.17, 0.0008, 0.0018, \"-0.339798\", \" 0.339798\", \"3\", \" 0.0\", \"-0.113266\"], [70, 9, -0.17, 0.0008, 0.0048, \"-0.339798\", \" 0.339798\", \"3\", \" 0.0\", \"-0.113266\"], [70, 9, -0.17, 0.0008, 0.0058, \"-0.339798\", \" 0.339798\", \"3\", \" 0.0\", \"-0.113266\"], [70, 9, -0.17, 0.0018, 0.0063, \" 0.027287\", \" 0.383919\", \"2\", \" 50.0\", \" 0.013643\"], [70, 9, -0.17, 0.0028, 0.0048, \"-0.172188\", \" 0.483187\", \"2\", \" 0.0\", \"-0.086094\"], [70, 9, -0.17, 0.0028, 0.0063, \"-0.172188\", \" 0.483187\", \"2\", \" 0.0\", \"-0.086094\"], [70, 9, -0.15, 0.0003, 0.0063, \"-0.190063\", \" 0.190063\", \"3\", \" 0.0\", \"-0.063354\"], [70, 9, -0.15, 0.0013, 0.0068, \"-0.045322\", \" 0.309055\", \"2\", \" 50.0\", \"-0.022661\"], [70, 9, -0.15, 0.0018, 0.0033, \" 0.027287\", \" 0.383919\", \"2\", \" 50.0\", \" 0.013643\"], [70, 9, -0.15, 0.0018, 0.0048, \" 0.027287\", \" 0.383919\", \"2\", \" 50.0\", \" 0.013643\"], [70, 9, -0.15, 0.0028, 0.0058, \"-0.172188\", \" 0.483187\", \"2\", \" 0.0\", \"-0.086094\"], [70, 9, -0.13, 0.0008, 0.0038, \"-0.368851\", \" 0.413539\", \"9\", \" 11.111111\", \"-0.040983\"], [70, 9, -0.13, 0.0013, 0.0038, \"-0.190937\", \" 0.427222\", \"8\", \" 25.0\", \"-0.023867\"], [70, 9, -0.13, 0.0018, 0.0063, \"-0.119998\", \" 0.560123\", \"8\", \" 37.5\", \"-0.015\"], [70, 9, -0.13, 0.0028, 0.0068, \" 0.241719\", \" 0.857901\", \"8\", \" 37.5\", \" 0.030215\"], [70, 9, -0.13, 0.0033, 0.0048, \" 0.040191\", \" 0.951139\", \"8\", \" 50.0\", \" 0.005024\"], [70, 9, -0.11, 0.0013, 0.0038, \"-0.347575\", \" 0.703555\", \"10\", \" 20.0\", \"-0.034758\"], [70, 9, -0.11, 0.0013, 0.0048, \"-0.363699\", \" 0.703555\", \"10\", \" 20.0\", \"-0.03637\"], [70, 9, -0.11, 0.0043, 0.0068, \" 0.229353\", \" 1.242\", \"9\", \" 33.333333\", \" 0.025484\"], [70, 9, -0.11, 0.0048, 0.0058, \"-0.36884\", \" 1.443902\", \"9\", \" 33.333333\", \"-0.040982\"], [70, 9, -0.11, 0.0058, 0.0068, \"-0.670278\", \" 1.834171\", \"9\", \" 33.333333\", \"-0.074475\"], [70, 9, -0.09, 0.0008, 0.0028, \"-1.78746\", \" 1.78746\", \"42\", \" 21.428571\", \"-0.042559\"], [70, 9, -0.09, 0.0018, 0.0038, \"-0.293917\", \" 1.475175\", \"36\", \" 36.111111\", \"-0.008164\"], [70, 9, -0.09, 0.0018, 0.0048, \"-0.267521\", \" 1.487706\", \"36\", \" 33.333333\", \"-0.007431\"], [70, 9, -0.09, 0.0033, 0.0048, \" 1.530994\", \" 1.936589\", \"33\", \" 45.454545\", \" 0.046394\"], [70, 9, -0.09, 0.0038, 0.0048, \" 1.564882\", \" 1.788931\", \"32\", \" 46.875\", \" 0.048903\"], [70, 9, -0.09, 0.0053, 0.0058, \" 0.614201\", \" 2.239796\", \"29\", \" 44.827586\", \" 0.021179\"], [70, 9, -0.09, 0.0058, 0.0068, \" 1.231504\", \" 1.841557\", \"26\", \" 53.846154\", \" 0.047366\"], [70, 9, -0.07, 0.0008, 0.0068, \"-1.74511\", \" 2.235486\", \"131\", \" 37.40458\", \"-0.013321\"], [70, 9, -0.07, 0.0018, 0.0023, \" 1.092383\", \" 2.565612\", \"115\", \" 46.086957\", \" 0.009499\"], [70, 9, -0.07, 0.0023, 0.0038, \" 3.742661\", \" 2.261839\", \"103\", \" 44.660194\", \" 0.036337\"], [70, 9, -0.07, 0.0028, 0.0058, \" 2.965401\", \" 2.326313\", \"92\", \" 45.652174\", \" 0.032233\"], [70, 9, -0.07, 0.0033, 0.0058, \" 4.42344\", \" 2.822401\", \"83\", \" 48.192771\", \" 0.053294\"], [70, 9, -0.07, 0.0048, 0.0063, \" 3.349258\", \" 3.127949\", \"70\", \" 42.857143\", \" 0.047847\"], [70, 9, -0.05, 0.0008, 0.0033, \"-5.597995\", \" 5.682368\", \"308\", \" 31.493506\", \"-0.018175\"], [70, 9, -0.05, 0.0008, 0.0063, \"-5.020647\", \" 5.105536\", \"304\", \" 31.25\", \"-0.016515\"], [70, 9, -0.05, 0.0018, 0.0023, \"-5.147505\", \" 6.298261\", \"253\", \" 37.15415\", \"-0.020346\"], [70, 9, -0.05, 0.0023, 0.0043, \"-1.680767\", \" 4.622948\", \"205\", \" 36.585366\", \"-0.008199\"], [70, 9, -0.05, 0.0023, 0.0058, \"-1.223131\", \" 4.925472\", \"199\", \" 34.170854\", \"-0.006146\"], [70, 9, -0.05, 0.0028, 0.0048, \"-0.233449\", \" 4.356303\", \"177\", \" 37.288136\", \"-0.001319\"], [70, 9, -0.05, 0.0028, 0.0053, \" 0.235125\", \" 4.26931\", \"175\", \" 36.571429\", \" 0.001344\"], [70, 9, -0.03, 0.0003, 0.0013, \"-25.698163\", \" 25.759099\", \"1461\", \" 27.310062\", \"-0.017589\"], [70, 9, -0.03, 0.0018, 0.0023, \"-15.321885\", \" 17.009404\", \"664\", \" 34.487952\", \"-0.023075\"], [70, 9, -0.03, 0.0018, 0.0033, \"-12.967675\", \" 14.926964\", \"603\", \" 33.499171\", \"-0.021505\"], [70, 9, -0.03, 0.0023, 0.0043, \"-9.866131\", \" 12.440593\", \"457\", \" 34.573304\", \"-0.021589\"], [70, 9, -0.03, 0.0043, 0.0058, \"-7.632319\", \" 11.859725\", \"229\", \" 32.31441\", \"-0.033329\"], [70, 9, -0.03, 0.0048, 0.0058, \"-7.436793\", \" 11.626758\", \"207\", \" 32.850242\", \"-0.035927\"], [70, 9, -0.01, 0.0003, 0.0028, \"-61.562691\", \" 61.590519\", \"4185\", \" 23.345281\", \"-0.01471\"], [70, 9, -0.01, 0.0013, 0.0068, \"-23.872216\", \" 24.880482\", \"1108\", \" 29.873646\", \"-0.021545\"], [70, 9, -0.01, 0.0018, 0.0053, \"-17.095968\", \" 18.876797\", \"736\", \" 31.11413\", \"-0.023228\"], [70, 9, -0.01, 0.0038, 0.0048, \"-8.391294\", \" 12.887665\", \"301\", \" 35.548173\", \"-0.027878\"], [70, 9, -0.01, 0.0048, 0.0068, \"-5.208072\", \" 10.23961\", \"215\", \" 34.883721\", \"-0.024224\"], [70, 9, -0.01, 0.0058, 0.0063, \"-2.949801\", \" 10.697892\", \"165\", \" 37.575758\", \"-0.017878\"], [70, 10, -0.31, 0.0003, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0008, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0013, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0033, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0043, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.31, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0003, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.29, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0008, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0038, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.27, 0.0053, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0028, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.25, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0018, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0033, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.23, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0013, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0023, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0028, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0033, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0033, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.21, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0003, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0003, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0008, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0018, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0023, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0023, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0028, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0053, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.19, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 10, -0.17, 0.0003, 0.0048, \"-0.063394\", \" 0.063394\", \"1\", \" 0.0\", \"-0.063394\"], [70, 10, -0.17, 0.0003, 0.0068, \"-0.063394\", \" 0.063394\", \"1\", \" 0.0\", \"-0.063394\"], [70, 10, -0.17, 0.0008, 0.0023, \"-0.113394\", \" 0.113394\", \"1\", \" 0.0\", \"-0.113394\"], [70, 10, -0.17, 0.0013, 0.0053, \" 0.118265\", \" 0.145899\", \"1\", \" 100.0\", \" 0.118265\"], [70, 10, -0.17, 0.0013, 0.0063, \" 0.118265\", \" 0.145899\", \"1\", \" 100.0\", \" 0.118265\"], [70, 10, -0.17, 0.0018, 0.0023, \" 0.196606\", \" 0.143258\", \"1\", \" 100.0\", \" 0.196606\"], [70, 10, -0.17, 0.0023, 0.0048, \" 0.018547\", \" 0.245354\", \"1\", \" 100.0\", \" 0.018547\"], [70, 10, -0.17, 0.0023, 0.0053, \" 0.018547\", \" 0.245354\", \"1\", \" 100.0\", \" 0.018547\"], [70, 10, -0.17, 0.0023, 0.0068, \" 0.018547\", \" 0.245354\", \"1\", \" 100.0\", \" 0.018547\"], [70, 10, -0.17, 0.0033, 0.0058, \"-0.081172\", \" 0.34481\", \"1\", \" 0.0\", \"-0.081172\"], [70, 10, -0.17, 0.0048, 0.0058, \"-0.23075\", \" 0.493993\", \"1\", \" 0.0\", \"-0.23075\"], [70, 10, -0.15, 0.0003, 0.0013, \"-0.31657\", \" 0.31657\", \"5\", \" 0.0\", \"-0.063314\"], [70, 10, -0.15, 0.0003, 0.0043, \"-0.31657\", \" 0.31657\", \"5\", \" 0.0\", \"-0.063314\"], [70, 10, -0.15, 0.0003, 0.0048, \"-0.31657\", \" 0.31657\", \"5\", \" 0.0\", \"-0.063314\"], [70, 10, -0.15, 0.0008, 0.0068, \"-0.375549\", \" 0.375549\", \"4\", \" 0.0\", \"-0.093887\"], [70, 10, -0.15, 0.0018, 0.0038, \"-0.108546\", \" 0.519194\", \"3\", \" 33.333333\", \"-0.036182\"], [70, 10, -0.15, 0.0018, 0.0058, \"-0.108546\", \" 0.519194\", \"3\", \" 33.333333\", \"-0.036182\"], [70, 10, -0.15, 0.0043, 0.0053, \"-0.640117\", \" 1.015254\", \"3\", \" 0.0\", \"-0.213372\"], [70, 10, -0.15, 0.0048, 0.0068, \"-0.789031\", \" 1.114317\", \"3\", \" 0.0\", \"-0.26301\"], [70, 10, -0.15, 0.0063, 0.0068, \"-1.23488\", \" 1.495473\", \"3\", \" 0.0\", \"-0.411627\"], [70, 10, -0.13, 0.0008, 0.0028, \"-0.223564\", \" 0.251252\", \"7\", \" 14.285714\", \"-0.031938\"], [70, 10, -0.13, 0.0013, 0.0043, \" 0.132912\", \" 0.262183\", \"6\", \" 33.333333\", \" 0.022152\"], [70, 10, -0.13, 0.0013, 0.0058, \" 0.084776\", \" 0.399793\", \"6\", \" 33.333333\", \" 0.014129\"], [70, 10, -0.13, 0.0023, 0.0028, \"-0.200472\", \" 0.380382\", \"6\", \" 33.333333\", \"-0.033412\"], [70, 10, -0.13, 0.0023, 0.0048, \"-0.144794\", \" 0.461002\", \"6\", \" 33.333333\", \"-0.024132\"], [70, 10, -0.13, 0.0023, 0.0058, \"-0.045383\", \" 0.461002\", \"6\", \" 33.333333\", \"-0.007564\"], [70, 10, -0.13, 0.0033, 0.0058, \" 0.541126\", \" 0.659624\", \"6\", \" 66.666667\", \" 0.090188\"], [70, 10, -0.13, 0.0043, 0.0058, \" 0.139915\", \" 0.863464\", \"6\", \" 33.333333\", \" 0.023319\"], [70, 10, -0.13, 0.0043, 0.0068, \" 0.806336\", \" 0.858046\", \"5\", \" 40.0\", \" 0.161267\"], [70, 10, -0.11, 0.0008, 0.0018, \"-0.43304\", \" 0.557604\", \"14\", \" 21.428571\", \"-0.030931\"], [70, 10, -0.11, 0.0018, 0.0048, \"-0.098145\", \" 0.624686\", \"11\", \" 45.454545\", \"-0.008922\"], [70, 10, -0.11, 0.0018, 0.0058, \"-0.093169\", \" 0.624686\", \"11\", \" 45.454545\", \"-0.00847\"], [70, 10, -0.11, 0.0023, 0.0048, \"-0.441087\", \" 0.919442\", \"11\", \" 27.272727\", \"-0.040099\"], [70, 10, -0.11, 0.0033, 0.0048, \"-0.089089\", \" 1.121117\", \"11\", \" 45.454545\", \"-0.008099\"], [70, 10, -0.11, 0.0038, 0.0068, \" 1.307563\", \" 1.218319\", \"10\", \" 50.0\", \" 0.130756\"], [70, 10, -0.11, 0.0058, 0.0063, \"-0.713765\", \" 1.981807\", \"11\", \" 36.363636\", \"-0.064888\"], [70, 10, -0.09, 0.0003, 0.0008, \"-1.119918\", \" 1.164659\", \"56\", \" 32.142857\", \"-0.019999\"], [70, 10, -0.09, 0.0013, 0.0023, \"-0.832024\", \" 1.618115\", \"51\", \" 41.176471\", \"-0.016314\"], [70, 10, -0.09, 0.0013, 0.0043, \" 0.613735\", \" 1.483405\", \"48\", \" 37.5\", \" 0.012786\"], [70, 10, -0.09, 0.0013, 0.0058, \" 1.821741\", \" 1.267689\", \"47\", \" 38.297872\", \" 0.03876\"], [70, 10, -0.09, 0.0018, 0.0023, \"-1.16087\", \" 2.006806\", \"49\", \" 36.734694\", \"-0.023691\"], [70, 10, -0.09, 0.0018, 0.0033, \"-0.096118\", \" 1.861906\", \"46\", \" 36.956522\", \"-0.00209\"], [70, 10, -0.09, 0.0023, 0.0033, \" 0.01555\", \" 1.602643\", \"45\", \" 42.222222\", \" 0.000346\"], [70, 10, -0.09, 0.0023, 0.0068, \" 1.405931\", \" 1.474146\", \"41\", \" 39.02439\", \" 0.034291\"], [70, 10, -0.09, 0.0033, 0.0058, \" 2.175099\", \" 2.177658\", \"39\", \" 38.461538\", \" 0.055772\"], [70, 10, -0.09, 0.0043, 0.0063, \" 2.35248\", \" 1.673186\", \"32\", \" 46.875\", \" 0.073515\"], [70, 10, -0.09, 0.0063, 0.0068, \" 1.717138\", \" 2.098794\", \"29\", \" 44.827586\", \" 0.059212\"], [70, 10, -0.07, 0.0013, 0.0053, \" 2.077756\", \" 1.53593\", \"120\", \" 39.166667\", \" 0.017315\"], [70, 10, -0.07, 0.0013, 0.0068, \" 2.825333\", \" 1.388964\", \"116\", \" 39.655172\", \" 0.024356\"], [70, 10, -0.07, 0.0028, 0.0053, \" 1.398887\", \" 2.824119\", \"99\", \" 40.40404\", \" 0.01413\"], [70, 10, -0.07, 0.0033, 0.0053, \" 2.468384\", \" 2.820006\", \"90\", \" 45.555556\", \" 0.027426\"], [70, 10, -0.07, 0.0038, 0.0053, \" 2.874122\", \" 2.823103\", \"85\", \" 44.705882\", \" 0.033813\"], [70, 10, -0.05, 0.0008, 0.0063, \"-4.860923\", \" 5.061182\", \"328\", \" 30.792683\", \"-0.01482\"], [70, 10, -0.05, 0.0013, 0.0023, \"-6.465615\", \" 6.966434\", \"307\", \" 33.876221\", \"-0.021061\"], [70, 10, -0.05, 0.0013, 0.0038, \"-4.988659\", \" 6.17997\", \"288\", \" 33.333333\", \"-0.017322\"], [70, 10, -0.05, 0.0013, 0.0058, \"-2.910015\", \" 4.376408\", \"276\", \" 32.608696\", \"-0.010544\"], [70, 10, -0.05, 0.0013, 0.0063, \"-2.861705\", \" 4.471411\", \"273\", \" 32.234432\", \"-0.010482\"], [70, 10, -0.05, 0.0018, 0.0028, \"-5.46383\", \" 6.128211\", \"266\", \" 35.714286\", \"-0.020541\"], [70, 10, -0.05, 0.0018, 0.0033, \"-4.426404\", \" 5.427467\", \"258\", \" 36.434109\", \"-0.017157\"], [70, 10, -0.05, 0.0018, 0.0043, \"-2.761316\", \" 4.832132\", \"248\", \" 35.887097\", \"-0.011134\"], [70, 10, -0.05, 0.0023, 0.0038, \"-3.370065\", \" 5.247414\", \"231\", \" 34.632035\", \"-0.014589\"], [70, 10, -0.05, 0.0023, 0.0053, \"-3.480864\", \" 5.315535\", \"218\", \" 33.486239\", \"-0.015967\"], [70, 10, -0.05, 0.0028, 0.0058, \"-1.378154\", \" 5.460502\", \"189\", \" 34.920635\", \"-0.007292\"], [70, 10, -0.05, 0.0038, 0.0068, \" 1.919264\", \" 5.459586\", \"146\", \" 40.410959\", \" 0.013146\"], [70, 10, -0.05, 0.0048, 0.0063, \"-1.600387\", \" 5.001645\", \"131\", \" 35.877863\", \"-0.012217\"], [70, 10, -0.05, 0.0058, 0.0068, \" 0.520842\", \" 5.395579\", \"107\", \" 40.186916\", \" 0.004868\"], [70, 10, -0.03, 0.0003, 0.0018, \"-25.984808\", \" 26.186599\", \"1518\", \" 25.428195\", \"-0.017118\"], [70, 10, -0.03, 0.0018, 0.0053, \"-9.98709\", \" 12.924738\", \"552\", \" 34.057971\", \"-0.018093\"], [70, 10, -0.03, 0.0038, 0.0058, \"-3.576963\", \" 7.950196\", \"251\", \" 36.25498\", \"-0.014251\"], [70, 10, -0.01, 0.0003, 0.0018, \"-62.371546\", \" 62.388656\", \"4117\", \" 23.220792\", \"-0.01515\"], [70, 10, -0.01, 0.0003, 0.0033, \"-61.122512\", \" 61.143125\", \"4104\", \" 23.269981\", \"-0.014893\"], [70, 10, -0.01, 0.0008, 0.0033, \"-44.718839\", \" 45.316702\", \"2054\", \" 25.949367\", \"-0.021772\"], [70, 10, -0.01, 0.0018, 0.0038, \"-19.734161\", \" 21.015718\", \"771\", \" 30.869001\", \"-0.025596\"], [70, 10, -0.01, 0.0018, 0.0043, \"-17.574363\", \" 19.947231\", \"747\", \" 31.057564\", \"-0.023527\"], [70, 10, -0.01, 0.0018, 0.0058, \"-15.810136\", \" 18.041249\", \"711\", \" 30.942335\", \"-0.022236\"], [70, 10, -0.01, 0.0023, 0.0063, \"-13.418947\", \" 16.065717\", \"518\", \" 33.204633\", \"-0.025905\"], [70, 10, -0.01, 0.0023, 0.0068, \"-12.748792\", \" 15.646738\", \"515\", \" 32.815534\", \"-0.024755\"], [70, 10, -0.01, 0.0033, 0.0053, \"-10.830129\", \" 15.037294\", \"341\", \" 34.604106\", \"-0.03176\"], [70, 10, -0.01, 0.0043, 0.0053, \"-8.442259\", \" 12.735821\", \"256\", \" 33.984375\", \"-0.032978\"], [70, 11, -0.31, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.31, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.31, 0.0013, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.31, 0.0018, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.31, 0.0023, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0003, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0013, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0033, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0038, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.29, 0.0058, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0003, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0023, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0033, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0038, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.27, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0003, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0008, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0013, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0013, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0018, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0018, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0023, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0028, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0038, 0.0063, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.25, 0.0053, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0013, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0013, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0028, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0043, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.23, 0.0063, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.21, 0.0018, 0.0028, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.21, 0.0023, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.21, 0.0043, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.21, 0.0048, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0008, 0.0018, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0008, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0008, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0023, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0028, 0.0038, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.19, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0008, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0008, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0013, 0.0023, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0018, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0018, 0.0058, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0023, 0.0033, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0028, 0.0043, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0028, 0.0048, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0038, 0.0053, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.17, 0.0038, 0.0068, \" 0.0\", \"NaN\", \"0\", \"NaN\", \"NaN\"], [70, 11, -0.15, 0.0003, 0.0058, \"-0.218544\", \" 0.23647\", \"7\", \" 14.285714\", \"-0.031221\"], [70, 11, -0.15, 0.0013, 0.0023, \"-0.052973\", \" 0.30965\", \"3\", \" 33.333333\", \"-0.017658\"], [70, 11, -0.15, 0.0013, 0.0053, \"-0.131118\", \" 0.394624\", \"3\", \" 33.333333\", \"-0.043706\"], [70, 11, -0.15, 0.0018, 0.0038, \"-0.108546\", \" 0.519194\", \"3\", \" 33.333333\", \"-0.036182\"], [70, 11, -0.15, 0.0023, 0.0063, \"-0.258098\", \" 0.618505\", \"3\", \" 33.333333\", \"-0.086033\"], [70, 11, -0.15, 0.0033, 0.0063, \"-0.341843\", \" 0.816979\", \"3\", \" 33.333333\", \"-0.113948\"], [70, 11, -0.15, 0.0038, 0.0063, \"-0.491054\", \" 0.916141\", \"3\", \" 0.0\", \"-0.163685\"], [70, 11, -0.15, 0.0043, 0.0068, \"-0.640117\", \" 1.015254\", \"3\", \" 0.0\", \"-0.213372\"], [70, 11, -0.15, 0.0048, 0.0058, \"-0.789031\", \" 1.114317\", \"3\", \" 0.0\", \"-0.26301\"], [70, 11, -0.13, 0.0018, 0.0043, \"-0.028952\", \" 0.361945\", \"6\", \" 50.0\", \"-0.004825\"], [70, 11, -0.13, 0.0023, 0.0048, \"-0.228859\", \" 0.461414\", \"6\", \" 33.333333\", \"-0.038143\"], [70, 11, -0.13, 0.0028, 0.0053, \" 0.340879\", \" 0.560832\", \"6\", \" 33.333333\", \" 0.056813\"], [70, 11, -0.13, 0.0043, 0.0063, \" 0.15481\", \" 0.85879\", \"6\", \" 33.333333\", \" 0.025802\"], [70, 11, -0.13, 0.0053, 0.0063, \"-0.245428\", \" 1.112834\", \"6\", \" 33.333333\", \"-0.040905\"], [70, 11, -0.11, 0.0003, 0.0008, \"-0.302373\", \" 0.446645\", \"19\", \" 36.842105\", \"-0.015914\"], [70, 11, -0.11, 0.0003, 0.0018, \"-0.056586\", \" 0.409871\", \"19\", \" 36.842105\", \"-0.002978\"], [70, 11, -0.11, 0.0008, 0.0028, \"-0.438973\", \" 0.782337\", \"17\", \" 29.411765\", \"-0.025822\"], [70, 11, -0.11, 0.0008, 0.0033, \"-0.476149\", \" 0.810665\", \"17\", \" 29.411765\", \"-0.028009\"], [70, 11, -0.11, 0.0008, 0.0048, \"-0.476149\", \" 0.810665\", \"17\", \" 29.411765\", \"-0.028009\"], [70, 11, -0.11, 0.0018, 0.0038, \" 0.232219\", \" 0.849512\", \"14\", \" 50.0\", \" 0.016587\"], [70, 11, -0.11, 0.0023, 0.0048, \"-0.213264\", \" 1.047747\", \"14\", \" 42.857143\", \"-0.015233\"], [70, 11, -0.11, 0.0058, 0.0068, \" 1.492044\", \" 1.442099\", \"11\", \" 54.545455\", \" 0.13564\"], [70, 11, -0.11, 0.0063, 0.0068, \" 1.188043\", \" 1.540524\", \"11\", \" 45.454545\", \" 0.108004\"], [70, 11, -0.09, 0.0003, 0.0013, \"-0.962122\", \" 1.012985\", \"72\", \" 31.944444\", \"-0.013363\"], [70, 11, -0.09, 0.0003, 0.0048, \"-0.549882\", \" 0.735674\", \"70\", \" 31.428571\", \"-0.007855\"], [70, 11, -0.09, 0.0008, 0.0058, \"-1.543648\", \" 1.641695\", \"64\", \" 29.6875\", \"-0.024119\"], [70, 11, -0.09, 0.0018, 0.0023, \"-1.353346\", \" 2.411145\", \"59\", \" 35.59322\", \"-0.022938\"], [70, 11, -0.09, 0.0018, 0.0028, \"-0.569568\", \" 2.060055\", \"58\", \" 36.206897\", \"-0.00982\"], [70, 11, -0.09, 0.0023, 0.0043, \"-0.198465\", \" 2.541508\", \"57\", \" 38.596491\", \"-0.003482\"], [70, 11, -0.09, 0.0028, 0.0043, \"-0.165424\", \" 2.477724\", \"53\", \" 39.622642\", \"-0.003121\"], [70, 11, -0.09, 0.0038, 0.0043, \" 1.98144\", \" 2.506516\", \"45\", \" 44.444444\", \" 0.044032\"], [70, 11, -0.09, 0.0043, 0.0063, \" 2.395731\", \" 2.182957\", \"40\", \" 47.5\", \" 0.059893\"], [70, 11, -0.09, 0.0043, 0.0068, \" 2.26948\", \" 2.134339\", \"38\", \" 47.368421\", \" 0.059723\"], [70, 11, -0.09, 0.0063, 0.0068, \" 2.687797\", \" 2.38014\", \"33\", \" 51.515152\", \" 0.081448\"], [70, 11, -0.07, 0.0003, 0.0018, \"-2.405671\", \" 2.599762\", \"189\", \" 29.62963\", \"-0.012728\"], [70, 11, -0.07, 0.0003, 0.0068, \"-1.702365\", \" 2.360456\", \"187\", \" 28.877005\", \"-0.009104\"], [70, 11, -0.07, 0.0008, 0.0013, \"-4.532871\", \" 4.687577\", \"176\", \" 32.386364\", \"-0.025755\"], [70, 11, -0.07, 0.0008, 0.0033, \"-2.76661\", \" 2.987415\", \"163\", \" 31.90184\", \"-0.016973\"], [70, 11, -0.07, 0.0013, 0.0023, \"-1.89203\", \" 2.501024\", \"149\", \" 36.241611\", \"-0.012698\"], [70, 11, -0.07, 0.0018, 0.0053, \" 0.40218\", \" 2.518718\", \"127\", \" 38.582677\", \" 0.003167\"], [70, 11, -0.07, 0.0028, 0.0048, \" 0.901165\", \" 2.868717\", \"111\", \" 41.441441\", \" 0.008119\"], [70, 11, -0.07, 0.0033, 0.0038, \" 1.816224\", \" 2.778927\", \"106\", \" 45.283019\", \" 0.017134\"], [70, 11, -0.07, 0.0053, 0.0058, \" 2.55894\", \" 3.706266\", \"79\", \" 43.037975\", \" 0.032392\"], [70, 11, -0.07, 0.0053, 0.0063, \" 2.167256\", \" 4.137561\", \"77\", \" 42.857143\", \" 0.028146\"], [70, 11, -0.07, 0.0058, 0.0063, \" 1.389388\", \" 4.01481\", \"77\", \" 41.558442\", \" 0.018044\"], [70, 11, -0.05, 0.0008, 0.0043, \"-6.20272\", \" 6.577832\", \"357\", \" 31.652661\", \"-0.017375\"], [70, 11, -0.05, 0.0013, 0.0048, \"-4.886977\", \" 6.643108\", \"295\", \" 32.881356\", \"-0.016566\"], [70, 11, -0.05, 0.0018, 0.0023, \"-6.557669\", \" 7.379543\", \"295\", \" 37.288136\", \"-0.022229\"], [70, 11, -0.05, 0.0018, 0.0028, \"-5.619495\", \" 6.86778\", \"286\", \" 37.412587\", \"-0.019649\"], [70, 11, -0.05, 0.0038, 0.0053, \"-0.799632\", \" 5.347049\", \"161\", \" 38.509317\", \"-0.004967\"], [70, 11, -0.05, 0.0043, 0.0048, \"-3.311672\", \" 6.070259\", \"154\", \" 38.311688\", \"-0.021504\"], [70, 11, -0.05, 0.0048, 0.0068, \"-3.125466\", \" 7.58458\", \"138\", \" 35.507246\", \"-0.022648\"], [70, 11, -0.03, 0.0003, 0.0048, \"-25.074183\", \" 25.263161\", \"1566\", \" 25.925926\", \"-0.016012\"], [70, 11, -0.03, 0.0048, 0.0063, \"-5.6526\", \" 10.166311\", \"207\", \" 34.299517\", \"-0.027307\"], [70, 11, -0.03, 0.0048, 0.0068, \"-4.18932\", \" 9.364114\", \"200\", \" 34.5\", \"-0.020947\"], [70, 11, -0.03, 0.0053, 0.0063, \"-6.713101\", \" 11.204112\", \"190\", \" 34.736842\", \"-0.035332\"], [70, 11, -0.03, 0.0063, 0.0068, \"-0.88714\", \" 9.018054\", \"150\", \" 39.333333\", \"-0.005914\"], [70, 11, -0.01, 0.0003, 0.0018, \"-60.724025\", \" 60.747552\", \"4025\", \" 23.701863\", \"-0.015087\"], [70, 11, -0.01, 0.0003, 0.0038, \"-59.557376\", \" 59.581603\", \"4017\", \" 23.749066\", \"-0.014826\"], [70, 11, -0.01, 0.0028, 0.0038, \"-13.574229\", \" 16.599702\", \"451\", \" 33.259424\", \"-0.030098\"], [70, 11, -0.01, 0.0033, 0.0053, \"-9.970892\", \" 14.327723\", \"338\", \" 34.023669\", \"-0.0295\"], [70, 11, -0.01, 0.0038, 0.0053, \"-7.135743\", \" 12.027996\", \"280\", \" 34.642857\", \"-0.025485\"]];\n",
"\n",
" // Define the dt_args\n",
" let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_dom\": true, \"fnInfoCallback\": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) { return sPre + ' (<a href=\"https://mwouts.github.io/itables/downsampling.html\">downsampled</a> from 8,000x10 to 819x10 as maxBytes=64KB)'; }};\n",
" dt_args[\"data\"] = data;\n",
"\n",
" \n",
" new DataTable(table, dt_args);\n",
" });\n",
"</script>\n"
],
"text/plain": [
" entry_window_closes mom_timeperiod mom_th sl_stop tp_stop \\\n",
"0 3 2 -0.31 0.0003 0.0018 \n",
"1 3 2 -0.31 0.0003 0.0068 \n",
"2 3 2 -0.31 0.0013 0.0028 \n",
"3 3 2 -0.31 0.0013 0.0058 \n",
"4 3 2 -0.31 0.0018 0.0038 \n",
"... ... ... ... ... ... \n",
"7995 70 11 -0.01 0.0003 0.0018 \n",
"7996 70 11 -0.01 0.0003 0.0038 \n",
"7997 70 11 -0.01 0.0028 0.0038 \n",
"7998 70 11 -0.01 0.0033 0.0053 \n",
"7999 70 11 -0.01 0.0038 0.0053 \n",
"\n",
" Total Return [%] Max Drawdown [%] Total Trades Win Rate [%] Expectancy \n",
"0 0.0 NaN 0 NaN NaN \n",
"1 0.0 NaN 0 NaN NaN \n",
"2 0.0 NaN 0 NaN NaN \n",
"3 0.0 NaN 0 NaN NaN \n",
"4 0.0 NaN 0 NaN NaN \n",
"... ... ... ... ... ... \n",
"7995 -60.724025 60.747552 4025 23.701863 -0.015087 \n",
"7996 -59.557376 59.581603 4017 23.749066 -0.014826 \n",
"7997 -13.574229 16.599702 451 33.259424 -0.030098 \n",
"7998 -9.970892 14.327723 338 34.023669 -0.0295 \n",
"7999 -7.135743 12.027996 280 34.642857 -0.025485 \n",
"\n",
"[8000 rows x 10 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pf_results"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/8p/dwqnp65s0s77jdbm4_6z4vp80000gn/T/ipykernel_3935/927237224.py:13: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
"\n",
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
"\n",
"\n",
" pf_results['Max Drawdown [%]'].fillna(pf_results['Max Drawdown [%]'].median(), inplace=True)\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Assuming pf_results is your DataFrame\n",
"# Convert columns to numeric, assuming NaNs where conversion fails\n",
"metrics = ['Total Return [%]', 'Max Drawdown [%]', 'Total Trades']\n",
"for metric in metrics:\n",
" pf_results[metric] = pd.to_numeric(pf_results[metric], errors='coerce')\n",
"\n",
"# Handle missing values, for example filling with the median\n",
"pf_results['Max Drawdown [%]'].fillna(pf_results['Max Drawdown [%]'].median(), inplace=True)\n",
"\n",
"# Extract the metrics into a new DataFrame\n",
"data_for_pca = pf_results[metrics]\n",
"\n",
"# Standardize the data before applying PCA\n",
"scaler = StandardScaler()\n",
"data_scaled = scaler.fit_transform(data_for_pca)\n",
"\n",
"# Apply PCA\n",
"pca = PCA(n_components=2) # Adjust components as needed\n",
"principal_components = pca.fit_transform(data_scaled)\n",
"\n",
"# Create a DataFrame with the principal components\n",
"pca_results = pd.DataFrame(data=principal_components, columns=['PC1', 'PC2'])\n",
"\n",
"# Visualize the results\n",
"plt.figure(figsize=(8,6))\n",
"plt.scatter(pca_results['PC1'], pca_results['PC2'], alpha=0.5)\n",
"plt.xlabel('Principal Component 1')\n",
"plt.ylabel('Principal Component 2')\n",
"plt.title('PCA of Strategy Optimization Results')\n",
"plt.grid(True)\n",
"plt.savefig(\"ddd.png\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Check if there is any unnamed level and rename it\n",
"if None in df.index.names:\n",
" # Generate new names list replacing None with 'stat'\n",
" new_names = ['stat' if name is None else name for name in df.index.names]\n",
" df.index.set_names(new_names, inplace=True)\n",
"\n",
"rs= df\n",
"\n",
"rs.info()\n",
"\n",
"\n",
"# # Now, 'stat' is the name of the previously unnamed level\n",
"\n",
"# # Filter for 'Total Return' assuming it is a correct identifier in the 'stat' level\n",
"# total_return_series = df.xs('Total Return [%]', level='stat')\n",
"\n",
"# # Sort the Series to get the largest 'Total Return' values\n",
"# sorted_series = total_return_series.sort_values(ascending=False)\n",
"\n",
"# # Print the sorted filtered data\n",
"# sorted_series.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sorted_series.vbt.save()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#df.info()\n",
"total_return_series = df.xs('Total Return [%]')\n",
"sorted_series = total_return_series.sort_values(ascending=False)\n",
"\n",
"# Display the top N entries, e.g., top 5\n",
"sorted_series.head(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"comb_stats_df.nlargest(10, 'Total Return [%]')\n",
"#stats_df.info()\n",
"\n",
"\n",
"8\t-0.06\t-0.2\t0.0028\t0.0048\t4.156254\n",
"4 -0.02 -0.25 0.0028 0.0048 0.84433\n",
"3 -0.02 -0.25 0.0033 0.0023 Total Return [%] 0.846753\n",
"#2\t-0.04\t-0.2\t0.0019\t0.0019\n",
"# 2\t-0.04\t-0.2\t0.0019\t0.0019\t0.556919\t91\t60.43956\t0.00612\n",
"# 2\t-0.04\t-0.25\t0.0019\t0.0019\t0.556919\t91\t60.43956\t0.00612\n",
"# 2\t-0.04\t-0.3\t0.0019\t0.0019\t0.556919\t91\t60.43956\t0.00612\n",
"# 2\t-0.04\t-0.35\t0.0019\t0.0019\t0.556919\t91\t60.43956\t0.00612\n",
"# 2\t-0.04\t-0.4\t0.0019\t0.0019\t0.556919\t91\t60.43956\t0.00612\n",
"# 2\t-0.04\t-0.2\t0.0019\t0.0017\t0.451338\t93\t63.44086\t0.004853\n",
"# 2\t-0.04\t-0.25\t0.0019\t0.0017\t0.451338\t93\t63.44086\t0.004853\n",
"# 2\t-0.04\t-0.3\t0.0019\t0.0017\t0.451338\t93\t63.44086\t0.004853\n",
"# 2\t-0.04\t-0.35\t0.0019\t0.0017\t0.451338\t93\t63.44086\t0.004853\n",
"# 2\t-0.04\t-0.4\t0.0019\t0.0017\t0.451338\t93\t63.44086\t0.004853"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"basic_data.symbols"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
">>> def apply_func(ts, entries, exits, fastw, sloww, minp=None):\n",
"... fast_ma = vbt.nb.rolling_mean_nb(ts, fastw, minp=minp)\n",
"... slow_ma = vbt.nb.rolling_mean_nb(ts, sloww, minp=minp)\n",
"... entries[:] = vbt.nb.crossed_above_nb(fast_ma, slow_ma) \n",
"... exits[:] = vbt.nb.crossed_above_nb(slow_ma, fast_ma)\n",
"... return (fast_ma, slow_ma) \n",
"\n",
">>> CrossSig = vbt.IF(\n",
"... class_name=\"CrossSig\",\n",
"... input_names=['ts'],\n",
"... in_output_names=['entries', 'exits'],\n",
"... param_names=['fastw', 'sloww'],\n",
"... output_names=['fast_ma', 'slow_ma']\n",
"... ).with_apply_func(\n",
"... apply_func,\n",
"... in_output_settings=dict(\n",
"... entries=dict(dtype=np.bool_), #initialize output with bool\n",
"... exits=dict(dtype=np.bool_)\n",
"... )\n",
"... )\n",
">>> cross_sig = CrossSig.run(ts2, 2, 4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#PIPELINE - parameters in one go\n",
"\n",
"\n",
"#TOTO prepsat do FOR-LOOPu\n",
"\n",
"\n",
"#indicator parameters\n",
"mom_timeperiod = list(range(2, 6))\n",
"\n",
"#threshold entries parameters\n",
"mom_th = np.round(np.arange(-0.02, -0.1 - 0.02, -0.02),4).tolist()#-0.02\n",
"roc_th = np.round(np.arange(-0.2, -0.4 - 0.05, -0.05),4).tolist()#-0.2\n",
"#print(mom_th, roc_th)\n",
"#jejich product\n",
"# mom_th_prod, roc_th_prod = zip(*product(mom_th, roc_th))\n",
"\n",
"# #convert threshold to vbt param\n",
"# mom_th_index = vbt.Param(mom_th_prod, name='mom_th_th') \n",
"# roc_th_index = vbt.Param(roc_th_prod, name='roc_th_th')\n",
"\n",
"mom_th = vbt.Param(mom_th, name='mom_th')\n",
"roc_th = vbt.Param(roc_th, name='roc_th')\n",
"\n",
"#portfolio simulation parameters\n",
"sl_stop = np.arange(0.03/100, 0.2/100, 0.02/100).tolist()\n",
"# Using the round function\n",
"sl_stop = [round(val, 4) for val in sl_stop]\n",
"tp_stop = np.arange(0.03/100, 0.2/100, 0.02/100).tolist()\n",
"# Using the round function\n",
"tp_stop = [round(val, 4) for val in tp_stop]\n",
"sl_stop = vbt.Param(sl_stop) #np.nan mean s no stoploss\n",
"tp_stop = vbt.Param(tp_stop) #np.nan mean s no stoploss\n",
"\n",
"\n",
"#def test_mom(window=14, mom_th=0.2, roc_th=0.2, sl_stop=0.03/100, tp_stop=0.03/100):\n",
"#close = basic_data.xloc[\"09:30\":\"10:00\"].close\n",
"momshort = vbt.indicator(\"talib:MOM\").run(basic_data.get(\"Close\"), timeperiod=mom_timeperiod, short_name = \"slope_short\")\n",
"\n",
"#ht_trendline = vbt.indicator(\"talib:HT_TRENDLINE\").run(close, short_name = \"httrendline\")\n",
"rocp = vbt.indicator(\"talib:ROC\").run(basic_data.get(\"Close\"), short_name = \"rocp\")\n",
"#rate of change + momentum\n",
"\n",
"rocp_signal = rocp.real_crossed_below(mom_th)\n",
"mom_signal = momshort.real_crossed_below(roc_th)\n",
"\n",
"#mom_signal\n",
"print(rocp_signal.info())\n",
"print(mom_signal.info())\n",
"#print(rocp.real)\n",
"\n",
"\n",
"short_signal = (mom_signal.vbt & rocp_signal)\n",
"\n",
"# #short_signal = (rocp.real_crossed_below(roc_th_index) & momshort.real_crossed_below(mom_th_index))\n",
"# forced_exit = m1_data.symbol_wrapper.fill(False)\n",
"# entry_window_open= m1_data.symbol_wrapper.fill(False)\n",
"\n",
"\n",
"# # Calculate the time difference in minutes from market open for each timestamp\n",
"# elapsed_min_from_open = (forced_exit.index.hour - market_open.hour) * 60 + (forced_exit.index.minute - market_open.minute)\n",
"\n",
"# entry_window_open[(elapsed_min_from_open >= entry_window_opens) & (elapsed_min_from_open < entry_window_closes)] = True\n",
"# forced_exit[(elapsed_min_from_open >= forced_exit_start) & (elapsed_min_from_open < forced_exit_end)] = True\n",
"# short_entries = (short_signal & entry_window_open)\n",
"# short_exits = forced_exit\n",
"# #long_entries.info()\n",
"# #number of trues and falses in long_entries\n",
"# #short_exits.value_counts()\n",
"# #short_entries.value_counts()\n",
"\n",
"\n",
"# pf = vbt.Portfolio.from_signals(close=close, short_entries=short_entries, short_exits=short_exits, sl_stop=sl_stop, tp_stop = tp_stop, fees=0.0167/100, freq=\"1s\") #sl_stop=sl_stop, tp_stop = sl_stop,\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# filter dates"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#filter na dny\n",
"dates_of_interest = pd.to_datetime(['2024-04-22']).tz_localize('US/Eastern')\n",
"filtered_df = df.loc[df.index.normalize().isin(dates_of_interest)]\n",
"\n",
"df = filtered_df\n",
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# import plotly.io as pio\n",
"# pio.renderers.default = 'notebook'\n",
"\n",
"#naloadujeme do vbt symbol as column\n",
"basic_data = vbt.Data.from_data({\"BAC\": df}, tz_convert=zoneNY)\n",
"\n",
"vbt.settings.plotting.auto_rangebreaks = True\n",
"#basic_data.data[\"BAC\"].vbt.ohlcv.plot()\n",
"\n",
"#basic_data.data[\"BAC\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"m1_data = basic_data[['Open', 'High', 'Low', 'Close', 'Volume']]\n",
"\n",
"m1_data.data[\"BAC\"]\n",
"#m5_data = m1_data.resample(\"5T\")\n",
"\n",
"#m5_data.data[\"BAC\"].head(10)\n",
"\n",
"# m15_data = m1_data.resample(\"15T\")\n",
"\n",
"# m15 = m15_data.data[\"BAC\"]\n",
"\n",
"# m15.vbt.ohlcv.plot()\n",
"\n",
"# m1_data.wrapper.index\n",
"\n",
"# m1_resampler = m1_data.wrapper.get_resampler(\"1T\")\n",
"# m1_resampler.index_difference(reverse=True)\n",
"\n",
"\n",
"# m5_resampler.prettify()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# MOM indicator"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"vbt.phelp(vbt.indicator(\"talib:ROCP\").run)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"vyuzití rychleho klesani na sekundove urovni behem open rush\n",
"- MOM + ROC during open rush\n",
"- short signal\n",
"- pipeline kombinace thresholdu pro vstup mom_th, roc_th + hodnota sl_stop a tp_stop (pripadne trailing) - nalezeni optimalni kombinace atributu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# fig = plot_2y_close([ht_trendline],[momshort, rocp], close)\n",
"# short_signal.vbt.signals.plot_as_entries(close, fig=fig, add_trace_kwargs=dict(secondary_y=False)) \n",
"\n",
"#parameters (primary y line, secondary y line, close)\n",
"def plot_2y_close(priminds, secinds, close):\n",
" fig = vbt.make_subplots(rows=1, cols=1, shared_xaxes=True, specs=[[{\"secondary_y\": True}]], vertical_spacing=0.02, subplot_titles=(\"MOM\", \"Price\" ))\n",
" close.vbt.plot(fig=fig, add_trace_kwargs=dict(secondary_y=False), trace_kwargs=dict(line=dict(color=\"blue\")))\n",
" for ind in priminds:\n",
" ind.plot(fig=fig, add_trace_kwargs=dict(secondary_y=False))\n",
" for ind in secinds:\n",
" ind.plot(fig=fig, add_trace_kwargs=dict(secondary_y=True))\n",
" return fig\n",
"\n",
"close = m1_data.xloc[\"09:30\":\"10:00\"].close\n",
"momshort = vbt.indicator(\"talib:MOM\").run(close, timeperiod=3, short_name = \"slope_short\")\n",
"ht_trendline = vbt.indicator(\"talib:HT_TRENDLINE\").run(close, short_name = \"httrendline\")\n",
"rocp = vbt.indicator(\"talib:ROC\").run(close, short_name = \"rocp\")\n",
"#rate of change + momentum\n",
"short_signal = (rocp.real_crossed_below(-0.2) & momshort.real_crossed_below(-0.02))\n",
"#indlong = vbt.indicator(\"talib:MOM\").run(close, timeperiod=10, short_name = \"slope_long\")\n",
"fig = plot_2y_close([ht_trendline],[momshort, rocp], close)\n",
"short_signal.vbt.signals.plot_as_entries(close, fig=fig, add_trace_kwargs=dict(secondary_y=False)) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"close = m1_data.close\n",
"#vbt.phelp(vbt.OLS.run)\n",
"\n",
"#oer steepmnes of regression line\n",
"#talib.LINEARREG_SLOPE(close, timeperiod=timeperiod)\n",
"#a také ON BALANCE VOLUME - http://5.161.179.223:8000/static/js/vbt/api/indicators/custom/obv/index.html\n",
"\n",
"\n",
"\n",
"mom_ind = vbt.indicator(\"talib:MOM\") \n",
"#vbt.phelp(mom_ind.run)\n",
"\n",
"mom = mom_ind.run(close, timeperiod=10)\n",
"\n",
"plot_2y_close(mom, close)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# defining ENTRY WINDOW and forced EXIT window"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#m1_data.data[\"BAC\"].info()\n",
"import datetime\n",
"# Define the market open and close times\n",
"market_open = datetime.time(9, 30)\n",
"market_close = datetime.time(16, 0)\n",
"entry_window_opens = 2\n",
"entry_window_closes = 30\n",
"\n",
"forced_exit_start = 380\n",
"forced_exit_end = 390\n",
"\n",
"forced_exit = m1_data.symbol_wrapper.fill(False)\n",
"entry_window_open= m1_data.symbol_wrapper.fill(False)\n",
"\n",
"# Calculate the time difference in minutes from market open for each timestamp\n",
"elapsed_min_from_open = (forced_exit.index.hour - market_open.hour) * 60 + (forced_exit.index.minute - market_open.minute)\n",
"\n",
"entry_window_open[(elapsed_min_from_open >= entry_window_opens) & (elapsed_min_from_open < entry_window_closes)] = True\n",
"forced_exit[(elapsed_min_from_open >= forced_exit_start) & (elapsed_min_from_open < forced_exit_end)] = True\n",
"\n",
"#entry_window_open.info()\n",
"# forced_exit.tail(100)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"close = m1_data.close\n",
"\n",
"#rsi = vbt.RSI.run(close, window=14)\n",
"\n",
"short_entries = (short_signal & entry_window_open)\n",
"short_exits = forced_exit\n",
"#long_entries.info()\n",
"#number of trues and falses in long_entries\n",
"#short_exits.value_counts()\n",
"short_entries.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def plot_rsi(close, entries, exits):\n",
" fig = vbt.make_subplots(rows=1, cols=1, shared_xaxes=True, specs=[[{\"secondary_y\": True}]], vertical_spacing=0.02, subplot_titles=(\"RSI\", \"Price\" ))\n",
" close.vbt.plot(fig=fig, add_trace_kwargs=dict(secondary_y=True))\n",
" #rsi.plot(fig=fig, add_trace_kwargs=dict(secondary_y=False))\n",
" entries.vbt.signals.plot_as_entries(close, fig=fig, add_trace_kwargs=dict(secondary_y=False)) \n",
" exits.vbt.signals.plot_as_exits(close, fig=fig, add_trace_kwargs=dict(secondary_y=False)) \n",
" return fig\n",
"\n",
"plot_rsi(close, short_entries, short_exits)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"vbt.phelp(vbt.Portfolio.from_signals)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sl_stop = np.arange(0.03/100, 0.2/100, 0.02/100).tolist()\n",
"# Using the round function\n",
"sl_stop = [round(val, 4) for val in sl_stop]\n",
"print(sl_stop)\n",
"sl_stop = vbt.Param(sl_stop) #np.nan mean s no stoploss\n",
"\n",
"pf = vbt.Portfolio.from_signals(close=close, short_entries=short_entries, short_exits=short_exits, sl_stop=0.03/100, tp_stop = 0.03/100, fees=0.0167/100, freq=\"1s\") #sl_stop=sl_stop, tp_stop = sl_stop,\n",
"\n",
"#pf.stats()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#list of orders\n",
"#pf.orders.records_readable\n",
"#pf.orders.plots()\n",
"#pf.stats()\n",
"pf.stats()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf[(0.0015,0.0013)].plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf[0.03].plot_trade_signals()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# pristup k pf jako multi index"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#pf[0.03].plot()\n",
"#pf.order_records\n",
"pf[(0.03)].stats()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#zgrupovane statistiky\n",
"stats_df = pf.stats([\n",
" 'total_return',\n",
" 'total_trades',\n",
" 'win_rate',\n",
" 'expectancy'\n",
"], agg_func=None)\n",
"stats_df\n",
"\n",
"\n",
"stats_df.nlargest(10, 'Total Return [%]')\n",
"#stats_df.info()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf[(0.0011,0.0013000000000000002)].plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from pandas.tseries.offsets import DateOffset\n",
"\n",
"temp_data = basic_data['2024-4-22']\n",
"temp_data\n",
"res1m = temp_data[[\"Open\", \"High\", \"Low\", \"Close\", \"Volume\"]]\n",
"\n",
"# Define a custom date offset that starts at 9:30 AM and spans 4 hours\n",
"custom_offset = DateOffset(hours=4, minutes=30)\n",
"\n",
"# res1m = res1m.get().resample(\"4H\").agg({ \n",
"# \"Open\": \"first\",\n",
"# \"High\": \"max\",\n",
"# \"Low\": \"min\",\n",
"# \"Close\": \"last\",\n",
"# \"Volume\": \"sum\"\n",
"# })\n",
"\n",
"res4h = res1m.resample(\"1h\", resample_kwargs=dict(origin=\"start\"))\n",
"\n",
"res4h.data\n",
"\n",
"res15m = res1m.resample(\"15T\", resample_kwargs=dict(origin=\"start\"))\n",
"\n",
"res15m.data[\"BAC\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"@vbt.njit\n",
"def long_entry_place_func_nb(c, low, close, time_in_ns, rsi14, window_open, window_close):\n",
" market_open_minutes = 570 # 9 hours * 60 minutes + 30 minutes\n",
"\n",
" for out_i in range(len(c.out)):\n",
" i = c.from_i + out_i\n",
"\n",
" current_minutes = vbt.dt_nb.hour_nb(time_in_ns[i]) * 60 + vbt.dt_nb.minute_nb(time_in_ns[i])\n",
" #print(\"current_minutes\", current_minutes)\n",
" # Calculate elapsed minutes since market open at 9:30 AM\n",
" elapsed_from_open = current_minutes - market_open_minutes\n",
" elapsed_from_open = elapsed_from_open if elapsed_from_open >= 0 else 0\n",
" #print( \"elapsed_from_open\", elapsed_from_open)\n",
"\n",
" #elapsed_from_open = elapsed_minutes_from_open_nb(time_in_ns) \n",
" in_window = elapsed_from_open > window_open and elapsed_from_open < window_close\n",
" #print(\"in_window\", in_window)\n",
" # if in_window:\n",
" # print(\"in window\")\n",
"\n",
" if in_window and rsi14[i] > 60: # and low[i, c.col] <= hit_price: # and hour == 9: # (4)!\n",
" return out_i\n",
" return -1\n",
"\n",
"@vbt.njit\n",
"def long_exit_place_func_nb(c, high, close, time_index, tp, sl): # (5)!\n",
" entry_i = c.from_i - c.wait\n",
" entry_price = close[entry_i, c.col]\n",
" hit_price = entry_price * (1 + tp)\n",
" stop_price = entry_price * (1 - sl)\n",
" for out_i in range(len(c.out)):\n",
" i = c.from_i + out_i\n",
" last_bar_of_day = vbt.dt_nb.day_changed_nb(time_index[i], time_index[i + 1])\n",
"\n",
" #print(next_day)\n",
" if last_bar_of_day: #pokud je dalsi next day, tak zavirame posledni\n",
" print(\"ted\",out_i)\n",
" return out_i\n",
" if close[i, c.col] >= hit_price or close[i, c.col] <= stop_price :\n",
" return out_i\n",
" return -1\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))\n",
"\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.sum()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.11"
}
},
"nbformat": 4,
"nbformat_minor": 2
}