Location_Analysis-checkpoint.ipynb 381 KB
Newer Older
wx002's avatar
wx002 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The Story told By Your Location Data\n",
    "\n",
    "**By: Corrine, Brad, and Ben**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction\n",
    "With modern technology, there are various applications that utilize location to enhance user experience. While many of these uses could be considered to be very beneficial, there is also another question to consider, how do we keep this data anonymous? Given how frequently online services keep track of personal location data, is it possible to identify individuals based on “anonymous” location data? Would these location data collecting features allow inference of personal information such as gender, name, location, or even unique identity? This project aims to explore such questions and determine if location data should be considered a major privacy infringement, and question whether or not it should be publicly available.\n",
    "\n",
    "# Overview\n",
    "We will start off with a small dataset, looking a the location history of an android phone over a month during 2014. Without any prior knowledge, our goal is to find out as much as possible about this particular individual carrying this phone. Then we will move forward looking at two distinct social network data sets and see how location data can be exploited when is within a group of users.\n",
    "\n",
    "# Android Phone Data \n",
    "This dataset consist of locations of an android phone for a month. An plain text example of an entry is shown below."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#Datasets/phone_history.json\n",
    "\n",
    "  \"locations\" : [ {\n",
    "    \"timestampMs\" : \"1415051512187\",\n",
    "    \"latitudeE7\" : 404212794,\n",
    "    \"longitudeE7\" : -36286372,\n",
    "    \"accuracy\" : 34\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Because of the structure of this dataset is not easy to work with, we have created a python script to converted into a much more nicer format to handle. Also, we have converted latitudeE7 and longtitudeE7 into latitude/longtiude as well as time stamps into proper datatime formats for readibility."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
49
   "execution_count": 7,
wx002's avatar
wx002 committed
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_json_history(filename):\n",
    "    f = open(filename)\n",
    "    file_str = f.read()\n",
    "    phone_data = json.loads(file_str)['locations']\n",
    "\n",
    "    # process into a normal txt\n",
    "    phone_data_new = open('Datasets/phone_data.txt', 'w+')\n",
    "    phone_data_new.write('Dates\\tLat\\tLong\\tAccuracy\\n')\n",
    "    for d in phone_data:\n",
    "        time = str(pd.to_datetime(d['timestampMs'], unit='ms'))\n",
    "        lat = int(d['latitudeE7'])/(10**7)\n",
    "        lon = int(d['longitudeE7'])/(10**7)\n",
    "        acc = d['accuracy']\n",
    "        line = '{}\\t{}\\t{}\\t{}\\n'.format(time,lat,lon,acc)\n",
    "        phone_data_new.write(line)\n",
    "    phone_data_new.close()\n",
    "    print('finsh making file!')\n",
    "\n",
wx002's avatar
wx002 committed
71
    "#convert_json_history('Datasets/phone_history.json') # Already ran, created phone_data.txt in Datasets"
wx002's avatar
wx002 committed
72 73 74 75 76 77 78 79 80 81 82 83 84 85
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: The json dataset is obtained from [google's location data takeout](https://takeout.google.com/settings/takeout/custom/location_history?pli=1). Hence, this function works for any datasets that is generated from there.\n",
    "\n",
    "# Data Analysis\n",
    "Now that we have processed the data into a more manageable form, we can start to look at the information."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import datetime\n",
    "import warnings\n",
    "from urllib.request import urlopen\n",
    "import json\n",
    "import re\n",
    "\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
wx002's avatar
wx002 committed
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Lat</th>\n",
       "      <th>Long</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014-11-03 21:51:52.187</td>\n",
       "      <td>40.421279</td>\n",
       "      <td>-3.628637</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014-11-03 21:50:50.228</td>\n",
       "      <td>40.421265</td>\n",
       "      <td>-3.628646</td>\n",
       "      <td>35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2014-11-03 21:49:50.132</td>\n",
       "      <td>40.421271</td>\n",
       "      <td>-3.628650</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2014-11-03 21:48:50.127</td>\n",
       "      <td>40.421274</td>\n",
       "      <td>-3.628639</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2014-11-03 21:47:49.271</td>\n",
       "      <td>40.421286</td>\n",
       "      <td>-3.628635</td>\n",
       "      <td>33</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Dates        Lat      Long  Accuracy\n",
       "0 2014-11-03 21:51:52.187  40.421279 -3.628637        34\n",
       "1 2014-11-03 21:50:50.228  40.421265 -3.628646        35\n",
       "2 2014-11-03 21:49:50.132  40.421271 -3.628650        34\n",
       "3 2014-11-03 21:48:50.127  40.421274 -3.628639        34\n",
       "4 2014-11-03 21:47:49.271  40.421286 -3.628635        33"
      ]
     },
wx002's avatar
wx002 committed
184
     "execution_count": 8,
wx002's avatar
wx002 committed
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phone_df = pd.read_csv('Datasets/phone_data.txt', parse_dates=['Dates'], sep='\\t')\n",
    "phone_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The dataset consist of time, latitude and longtitude. First, we want to combine latitude and longtitude into one single column. This is to make it easier to handle and preping for feeding into Bing's location API because it takes in a order pair of latitude and longtitude."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
203
   "execution_count": 9,
wx002's avatar
wx002 committed
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014-11-03 21:51:52.187</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.421279399999996, -3.6286372000000005)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014-11-03 21:50:50.228</td>\n",
       "      <td>35</td>\n",
       "      <td>(40.4212652, -3.6286462999999998)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2014-11-03 21:49:50.132</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.421271000000004, -3.6286498999999997)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2014-11-03 21:48:50.127</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.4212744, -3.6286388)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2014-11-03 21:47:49.271</td>\n",
       "      <td>33</td>\n",
       "      <td>(40.421286200000004, -3.6286354)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Dates  Accuracy                                   Location\n",
       "0 2014-11-03 21:51:52.187        34  (40.421279399999996, -3.6286372000000005)\n",
       "1 2014-11-03 21:50:50.228        35          (40.4212652, -3.6286462999999998)\n",
       "2 2014-11-03 21:49:50.132        34  (40.421271000000004, -3.6286498999999997)\n",
       "3 2014-11-03 21:48:50.127        34                   (40.4212744, -3.6286388)\n",
       "4 2014-11-03 21:47:49.271        33           (40.421286200000004, -3.6286354)"
      ]
     },
wx002's avatar
wx002 committed
276
     "execution_count": 9,
wx002's avatar
wx002 committed
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phone_df['Location'] = tuple(phone_df[['Lat','Long']].values)\n",
    "phone_df = phone_df.drop(columns = ['Lat', 'Long'])\n",
    "phone_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next thing we want to do is looking at the location data more closely. To do this, we need to group them by dates after sorting it."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
296
   "execution_count": 10,
wx002's avatar
wx002 committed
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                        Dates  Accuracy  \\\n",
      "43780 2014-09-30 21:54:03.688        27   \n",
      "43779 2014-09-30 21:55:03.956        21   \n",
      "43778 2014-09-30 21:56:03.888        26   \n",
      "43777 2014-09-30 21:57:03.784        35   \n",
      "43776 2014-09-30 21:58:03.933        37   \n",
      "\n",
      "                                        Location  \n",
      "43780                   (40.4212446, -3.6286241)  \n",
      "43779          (40.4212787, -3.6285733999999996)  \n",
      "43778  (40.421249200000005, -3.6286188999999998)  \n",
      "43777                    (40.421282, -3.6286157)  \n",
      "43776          (40.4212636, -3.6286042000000003)  \n",
      "                    Dates  Accuracy                                   Location\n",
      "4 2014-11-03 21:47:49.271        33           (40.421286200000004, -3.6286354)\n",
      "3 2014-11-03 21:48:50.127        34                   (40.4212744, -3.6286388)\n",
      "2 2014-11-03 21:49:50.132        34  (40.421271000000004, -3.6286498999999997)\n",
      "1 2014-11-03 21:50:50.228        35          (40.4212652, -3.6286462999999998)\n",
      "0 2014-11-03 21:51:52.187        34  (40.421279399999996, -3.6286372000000005)\n"
     ]
    }
   ],
   "source": [
    "df = phone_df.sort_values('Dates')\n",
    "print(df.head())\n",
    "print(df.tail())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By this, we know that the the data starts off with 2014-09-30, and ends at 2014-11-03. Next, we will be looking more into the location parts. \n",
    "\n",
    "Specifically, we are interested in the following questions:\n",
    "1. How often does the android phone keep track of location data?\n",
    "2. What are some common places that the person go to?\n",
    "3. What info can be interpret based on our previous answers?\n",
    "4. How likely can we identify this individual?\n",
    "\n",
    "In order to do this, we first need to seperate the date and time."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
348
   "execution_count": 11,
wx002's avatar
wx002 committed
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
   "metadata": {},
   "outputs": [],
   "source": [
    "df['Time'] = df['Dates'].dt.time\n",
    "df['Dates'] = df['Dates'].dt.date\n",
    "df = df[['Dates', 'Time', 'Location', 'Accuracy']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Time</th>\n",
       "      <th>Location</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>43780</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:54:03.688000</td>\n",
       "      <td>(40.4212446, -3.6286241)</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43779</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:55:03.956000</td>\n",
       "      <td>(40.4212787, -3.6285733999999996)</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43778</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:56:03.888000</td>\n",
       "      <td>(40.421249200000005, -3.6286188999999998)</td>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43777</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:57:03.784000</td>\n",
       "      <td>(40.421282, -3.6286157)</td>\n",
       "      <td>35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43776</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:58:03.933000</td>\n",
       "      <td>(40.4212636, -3.6286042000000003)</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Dates             Time                                   Location  \\\n",
       "43780  2014-09-30  21:54:03.688000                   (40.4212446, -3.6286241)   \n",
       "43779  2014-09-30  21:55:03.956000          (40.4212787, -3.6285733999999996)   \n",
       "43778  2014-09-30  21:56:03.888000  (40.421249200000005, -3.6286188999999998)   \n",
       "43777  2014-09-30  21:57:03.784000                    (40.421282, -3.6286157)   \n",
       "43776  2014-09-30  21:58:03.933000          (40.4212636, -3.6286042000000003)   \n",
       "\n",
       "       Accuracy  \n",
       "43780        27  \n",
       "43779        21  \n",
       "43778        26  \n",
       "43777        35  \n",
       "43776        37  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
456
   "execution_count": 12,
wx002's avatar
wx002 committed
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dates</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-09-30</th>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-01</th>\n",
       "      <td>1307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-02</th>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-03</th>\n",
       "      <td>1372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-04</th>\n",
       "      <td>1413</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Location\n",
       "Dates               \n",
       "2014-09-30       126\n",
       "2014-10-01      1307\n",
       "2014-10-02      1349\n",
       "2014-10-03      1372\n",
       "2014-10-04      1413"
      ]
     },
wx002's avatar
wx002 committed
522
     "execution_count": 12,
wx002's avatar
wx002 committed
523 524 525 526 527 528 529 530 531 532 533 534 535
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Now we check distinct places per day.\n",
    "df_day = df[['Dates', 'Location']]\n",
    "df_freq = df_day.groupby(['Dates']).count()\n",
    "df_freq.head()"
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
536
   "execution_count": 13,
wx002's avatar
wx002 committed
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>35.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1250.885714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>254.348044</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>126.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1262.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1338.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1383.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1429.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Location\n",
       "count    35.000000\n",
       "mean   1250.885714\n",
       "std     254.348044\n",
       "min     126.000000\n",
       "25%    1262.000000\n",
       "50%    1338.000000\n",
       "75%    1383.000000\n",
       "max    1429.000000"
      ]
     },
wx002's avatar
wx002 committed
612
     "execution_count": 13,
wx002's avatar
wx002 committed
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_freq.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By this, we already can see that the android phone keep track of your location at least 126 times within a day. \n",
    "Next, we will look at specific locations. "
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
631
   "execution_count": 14,
wx002's avatar
wx002 committed
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Location</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(39.847814, -5.6267378)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.8596804, -5.613139)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.871458399999995, -5.582563200000001)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.871547, -5.5995402)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.8723041, -5.5697503)</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                          Dates\n",
       "Location                                       \n",
       "(39.847814, -5.6267378)                       1\n",
       "(39.8596804, -5.613139)                       1\n",
       "(39.871458399999995, -5.582563200000001)      1\n",
       "(39.871547, -5.5995402)                       1\n",
       "(39.8723041, -5.5697503)                      2"
      ]
     },
wx002's avatar
wx002 committed
697
     "execution_count": 14,
wx002's avatar
wx002 committed
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_loc = df_day.groupby('Location').count()\n",
    "df_loc.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We group locations and did a count on how many times it had been visited over the month. By this, it's clear that there are many random locations that the person just happen to be there once or twice, which is not interested to look at since there is just not enough information about it to make any sort of logical interpretation. Hence, we have decided to only focus on the most frequent locations.\n",
    "\n",
    "We will be generating the results of the most frequent ones below."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
718
   "execution_count": 15,
wx002's avatar
wx002 committed
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Location</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(40.4202487, -3.6303093)</th>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.115815399999995, -5.949015)</th>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.4207664, -3.6332066)</th>\n",
       "      <td>754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.419880799999994, -3.630936)</th>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.4207763, -3.6332088)</th>\n",
       "      <td>655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 Count\n",
       "Location                              \n",
       "(40.4202487, -3.6303093)          1013\n",
       "(40.115815399999995, -5.949015)    913\n",
       "(40.4207664, -3.6332066)           754\n",
       "(40.419880799999994, -3.630936)    675\n",
       "(40.4207763, -3.6332088)           655"
      ]
     },
wx002's avatar
wx002 committed
784
     "execution_count": 15,
wx002's avatar
wx002 committed
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_locations = df_loc.sort_values('Dates', ascending=False)\n",
    "df_locations = df_locations.rename(index=str, columns= {'Dates':'Count'})\n",
    "df_locations.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above consist of locations that had been visited the most. We will feed this into an reverse geocoding API to get better insights of the location itself. In order to limit the amount of queries, we choose to only consider locations that have at least 10 visits throughout the month, which a way to filter out useless locations."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
804
   "execution_count": 16,
wx002's avatar
wx002 committed
805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "296\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "      <th>Count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(40.4202487, -3.6303093)</td>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(40.115815399999995, -5.949015)</td>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(40.4207664, -3.6332066)</td>\n",
       "      <td>754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(40.419880799999994, -3.630936)</td>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(40.4207763, -3.6332088)</td>\n",
       "      <td>655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          Location  Count\n",
       "0         (40.4202487, -3.6303093)   1013\n",
       "1  (40.115815399999995, -5.949015)    913\n",
       "2         (40.4207664, -3.6332066)    754\n",
       "3  (40.419880799999994, -3.630936)    675\n",
       "4         (40.4207763, -3.6332088)    655"
      ]
     },
wx002's avatar
wx002 committed
878
     "execution_count": 16,
wx002's avatar
wx002 committed
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new = df_locations.reset_index()\n",
    "freq_locations = df_new[df_new['Count']>10]\n",
    "freq_locations = freq_locations.rename(index=str, columns={'Dates':'Count'})\n",
    "print(len(freq_locations))\n",
    "freq_locations.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This data had been reduced to only consist of 296 entires, which is much more managable to handle. \n",
    "\n",
    "Below are the code to generate the readable addresses using Bing API and save it into a text file to preserve API usage."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\nimport geocoder\\nbing_key = 'AiEfap-qUoZalL1qK8ollM-SwVdoJFemh60tHo0EeraVYP8V4WPJXAVD2YjqzgA1'\\ncoordinates = freq_locations['Location']\\naddr_file = open('Datasets/phone_address_new.txt', 'w+', encoding='utf-8')\\nfor cord in coordinates:\\n    cord_list = list(cord)\\n    g = geocoder.bing(cord_list, method = 'reverse', key = bing_key)\\n    for r in g:\\n        line_str = r.address + ',' + r.city + ',' + r.country + '\\n'\\n        addr_file.write(str(cord_list) + ' : ' + line_str)\\n        print('{} : {}'.format(cord_list, line_str))\\naddr_file.close()\\nprint('finish address!')\\n\""
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "import geocoder\n",
    "bing_key = 'AiEfap-qUoZalL1qK8ollM-SwVdoJFemh60tHo0EeraVYP8V4WPJXAVD2YjqzgA1'\n",
    "coordinates = freq_locations['Location']\n",
    "addr_file = open('Datasets/phone_address_new.txt', 'w+', encoding='utf-8')\n",
    "for cord in coordinates:\n",
    "    cord_list = list(cord)\n",
    "    g = geocoder.bing(cord_list, method = 'reverse', key = bing_key)\n",
    "    for r in g:\n",
    "        line_str = r.address + ',' + r.city + ',' + r.country + '\\n'\n",
    "        addr_file.write(str(cord_list) + ' : ' + line_str)\n",
    "        print('{} : {}'.format(cord_list, line_str))\n",
    "addr_file.close()\n",
    "print('finish address!')\n",
    "'''\n",
    "# Already ran, created phone_address_new.txt in Datasets using Bing API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To preserve our results, we decided to save it into a text file and load it up after. This is the reason why it is commented out. This is to ensure we don't exceed the maximum query count.\n",
    "\n",
    "After checking references of coordinates to address, it seems like because of how precise the location data is being keep track of, there are different coordinates that represents the same general area, so we have to do another parse to reduce the redundency of our results by summing the count of any share addresses. Because of this, we have reduce the number places to 152."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
946
   "execution_count": 17,
wx002's avatar
wx002 committed
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most frequent visted places: 152\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Address</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Calle de Nicolás Salmerón, 7, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>2971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Autovía del Norte, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>1661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Villasilos, 8B, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Nicolás Salmerón, 17, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida de Bruselas, 37, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>1147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Matamorosa, 3, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CC-51, 10617 El Torno (Cáceres),El Torno,Spain</th>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida Bruselas, 31, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>768</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de la Caléndula, 87, 28109 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida de Fuencarral, 18, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>567</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                    Count\n",
       "Address                                                  \n",
       " Calle de Nicolás Salmerón, 7, 28017 Madrid (Ma...   2971\n",
       " Autovía del Norte, 28108 Alcobendas (Madrid),A...   1661\n",
       " Calle de Villasilos, 8B, 28017 Madrid (Madrid)...   1451\n",
       " Calle de Nicolás Salmerón, 17, 28017 Madrid (M...   1429\n",
       " Avenida de Bruselas, 37, 28108 Alcobendas (Mad...   1147\n",
       " Calle de Matamorosa, 3, 28017 Madrid (Madrid),...   1013\n",
       " CC-51, 10617 El Torno (Cáceres),El Torno,Spain       913\n",
       " Avenida Bruselas, 31, 28108 Alcobendas (Madrid...    768\n",
       " Calle de la Caléndula, 87, 28109 Alcobendas (M...    574\n",
       " Avenida de Fuencarral, 18, 28108 Alcobendas (M...    567"
      ]
     },
wx002's avatar
wx002 committed
1046
     "execution_count": 17,
wx002's avatar
wx002 committed
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "address = pd.read_csv('Datasets\\phone_address_new.txt', sep=':', header = None)\n",
    "freq_locations['Address'] = address[1].values\n",
    "freq = freq_locations.groupby(['Address']).sum().sort_values('Count', ascending=False)\n",
    "print('Most frequent visted places: {}'.format(len(freq)))\n",
    "freq[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below is the map of the precise traveling locations of the phone on geo coordinates. This represents the general traveling locations of the person. This is not the reduced version based on unique addresses since we want the detail locations. This map represent the general area of operation for the person throughout this month."
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
1068
   "execution_count": 18,
wx002's avatar
wx002 committed
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
   "metadata": {},
   "outputs": [],
   "source": [
    "def tuple_str_to_list(string):\n",
    "    string = string.replace('(', '')\n",
    "    string = string.replace(')', '')\n",
    "    return [float(s) for s in string.split(',')]"
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
1080
   "execution_count": 19,
wx002's avatar
wx002 committed
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import folium\n",
    "# build the location list\n",
    "coordinates = freq_locations['Location'].tolist()\n",
    "m = tuple_str_to_list(coordinates[0])\n",
    "m = folium.Map(location=m, zoom_start=10)\n",
    "for c in coordinates:\n",
    "    c_list = tuple_str_to_list(c)\n",
    "    folium.Marker(c_list, popup=str(c_list)).add_to(m)"
   ]
  },
  {
   "cell_type": "code",
wx002's avatar
wx002 committed
1098
   "execution_count": 20,
wx002's avatar
wx002 committed
1099 1100 1101 1102 1103 1104 1105
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
wx002's avatar
wx002 committed
1106
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1NyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcgPSBMLm1hcCgKICAgICAgICAnbWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3JywgewogICAgICAgIGNlbnRlcjogWzQwLjQyMDI0ODcsIC0zLjYzMDMwOTNdLAogICAgICAgIHpvb206IDEwLAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCgogICAgCiAgICB2YXIgdGlsZV9sYXllcl8wMzc1ZDkwM2IwYzk0ZjUzOWEzZDJiNTE1OTcxMTRjZiA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJvcGFjaXR5IjogMSwKICAgICAgICAic3ViZG9tYWlucyI6ICJhYmMiLAogICAgICAgICJ0bXMiOiBmYWxzZQp9KS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNTViMjdhODhjM2E0ZGY2OTJmZjM5NzUxNjRhYmJkMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIwMjQ4NywgLTMuNjMwMzA5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkZGJjNzk1YzUyNzQzYjhhYmUyNTNkNzgyNmJlYzZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4NWFjNTUxOGFiNTRlYjdhZTdiNzFlNjNhYjc0YWZmID0gJChgPGRpdiBpZD0iaHRtbF84ODVhYzU1MThhYjU0ZWI3YWU3YjcxZTYzYWI3NGFmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDI0ODcsIC0zLjYzMDMwOTNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGRiYzc5NWM1Mjc0M2I4YWJlMjUzZDc4MjZiZWM2ZS5zZXRDb250ZW50KGh0bWxfODg1YWM1NTE4YWI1NGViN2FlN2I3MWU2M2FiNzRhZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNTViMjdhODhjM2E0ZGY2OTJmZjM5NzUxNjRhYmJkMS5iaW5kUG9wdXAocG9wdXBfZmRkYmM3OTVjNTI3NDNiOGFiZTI1M2Q3ODI2YmVjNmUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yMmU3OTQ2NDc3ODA0MTVmYjAxZWUyOTczNGZhMTUyNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMTE1ODE1Mzk5OTk5OTk1LCAtNS45NDkwMTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDQyYTEzYmY5M2M0ZWEzOTQwMzc0NWM3MDAwNmU2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMTMzYTZkZWYzM2E0Y2ZhYWQ5NDg2NzEzYTA0NzFhMCA9ICQoYDxkaXYgaWQ9Imh0bWxfMjEzM2E2ZGVmMzNhNGNmYWFkOTQ4NjcxM2EwNDcxYTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xMTU4MTUzOTk5OTk5OTUsIC01Ljk0OTAxNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNDJhMTNiZjkzYzRlYTM5NDAzNzQ1YzcwMDA2ZTYwLnNldENvbnRlbnQoaHRtbF8yMTMzYTZkZWYzM2E0Y2ZhYWQ5NDg2NzEzYTA0NzFhMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIyZTc5NDY0Nzc4MDQxNWZiMDFlZTI5NzM0ZmExNTI3LmJpbmRQb3B1cChwb3B1cF85MDQyYTEzYmY5M2M0ZWEzOTQwMzc0NWM3MDAwNmU2MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QwNDEzNDNiMjFmNDRiZWI4ZDQ4Y2Y0YjQ4NGY5YzBkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3NjY0LCAtMy42MzMyMDY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGU5MGFkY2RhZDMwNGM2M2I3NDliZTBlYmFjOTVkM2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWI5ZWM4NjA2ODYzNDA1Zjg1NDNlOGZlOGExNzIyOTMgPSAkKGA8ZGl2IGlkPSJodG1sX2FiOWVjODYwNjg2MzQwNWY4NTQzZThmZThhMTcyMjkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzY2NCwgLTMuNjMzMjA2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlOTBhZGNkYWQzMDRjNjNiNzQ5YmUwZWJhYzk1ZDNkLnNldENvbnRlbnQoaHRtbF9hYjllYzg2MDY4NjM0MDVmODU0M2U4ZmU4YTE3MjI5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QwNDEzNDNiMjFmNDRiZWI4ZDQ4Y2Y0YjQ4NGY5YzBkLmJpbmRQb3B1cChwb3B1cF84ZTkwYWRjZGFkMzA0YzYzYjc0OWJlMGViYWM5NWQzZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNkYzNmYWI4ZWI5ZjQ5YmNiMDUzZWQ2MDAxMGQzOWJkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk4ODA3OTk5OTk5OTQsIC0zLjYzMDkzNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NzdhODI4OGZkYzQ0ODk5YWY1ODQwMWZiMjQ4MTNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQzYmI2ZjM0ZWI4NTRmNTNiZjk1MzlmMTI2MTFlODExID0gJChgPGRpdiBpZD0iaHRtbF80M2JiNmYzNGViODU0ZjUzYmY5NTM5ZjEyNjExZTgxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTg4MDc5OTk5OTk5NCwgLTMuNjMwOTM2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDc3N2E4Mjg4ZmRjNDQ4OTlhZjU4NDAxZmIyNDgxM2Euc2V0Q29udGVudChodG1sXzQzYmI2ZjM0ZWI4NTRmNTNiZjk1MzlmMTI2MTFlODExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2RjM2ZhYjhlYjlmNDliY2IwNTNlZDYwMDEwZDM5YmQuYmluZFBvcHVwKHBvcHVwX2Q3NzdhODI4OGZkYzQ0ODk5YWY1ODQwMWZiMjQ4MTNhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTMyNTAzNDM2Yjg3NDU0OTk2ZmIyNjhjYzFiMjFjOWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc3NjMsIC0zLjYzMzIwODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWU1M2YxZGJmYTQ0NjQwYjA3MGU1NTUyOWFlMDdmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjExODk1NzQ3MTk0YTNmOGMyMzU4NWRjNWNkMWE1NCA9ICQoYDxkaXYgaWQ9Imh0bWxfNTIxMTg5NTc0NzE5NGEzZjhjMjM1ODVkYzVjZDFhNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3NzYzLCAtMy42MzMyMDg4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDllNTNmMWRiZmE0NDY0MGIwNzBlNTU1MjlhZTA3ZjIuc2V0Q29udGVudChodG1sXzUyMTE4OTU3NDcxOTRhM2Y4YzIzNTg1ZGM1Y2QxYTU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTMyNTAzNDM2Yjg3NDU0OTk2ZmIyNjhjYzFiMjFjOWEuYmluZFBvcHVwKHBvcHVwXzA5ZTUzZjFkYmZhNDQ2NDBiMDcwZTU1NTI5YWUwN2YyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWE0NWQ0ZGQzM2JmNGZhNWFkYmJmNGRjYTY5NWJjNjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1NTgsIC0zLjYyODYzMzI5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZjgyYjBjYmUzNDY0OGY3YTA1YzI3NWFkOTE0ZGRlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTE1NDlhYWJlMzQ0NGVkYjkwYzI3YWNiOTJlMDFlMyA9ICQoYDxkaXYgaWQ9Imh0bWxfZjExNTQ5YWFiZTM0NDRlZGI5MGMyN2FjYjkyZTAxZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjEyNTU4LCAtMy42Mjg2MzMyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2Y4MmIwY2JlMzQ2NDhmN2EwNWMyNzVhZDkxNGRkZWQuc2V0Q29udGVudChodG1sX2YxMTU0OWFhYmUzNDQ0ZWRiOTBjMjdhY2I5MmUwMWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWE0NWQ0ZGQzM2JmNGZhNWFkYmJmNGRjYTY5NWJjNjAuYmluZFBvcHVwKHBvcHVwXzdmODJiMGNiZTM0NjQ4ZjdhMDVjMjc1YWQ5MTRkZGVkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNWVhNjZjYzBlYTlhNDhjMTk0YWVjZjRlN2IyZjM5MGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1MywgLTMuNjI4NjQxMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYTUwZTBmNTcwNjQxYjc4NTJkN2JhZThiZTRjYmFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmZWVkNzljYWJiNTRmZGZhYTFlYTU1N2QzYmU2N2I4ID0gJChgPGRpdiBpZD0iaHRtbF9hZmVlZDc5Y2FiYjU0ZmRmYWExZWE1NTdkM2JlNjdiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MywgLTMuNjI4NjQxMV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxYTUwZTBmNTcwNjQxYjc4NTJkN2JhZThiZTRjYmFiLnNldENvbnRlbnQoaHRtbF9hZmVlZDc5Y2FiYjU0ZmRmYWExZWE1NTdkM2JlNjdiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVlYTY2Y2MwZWE5YTQ4YzE5NGFlY2Y0ZTdiMmYzOTBhLmJpbmRQb3B1cChwb3B1cF81MWE1MGUwZjU3MDY0MWI3ODUyZDdiYWU4YmU0Y2JhYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI4YzU2NjBjMzgzMjQ1OGNhYzRjZDU5MjdiY2FlMTcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzQxNzQ3OTk5OTk5OTUsIC0zLjY0MzY0ODNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjQwNjFmZjMyYTI0OGE3OWJhYTc3Nzg4NmU1NjgzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTFmZjZkMzZlOWI0OWJmYmU0M2NlZDYzYzQzNGI0MCA9ICQoYDxkaXYgaWQ9Imh0bWxfMmUxZmY2ZDM2ZTliNDliZmJlNDNjZWQ2M2M0MzRiNDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzQxNzQ3OTk5OTk5OTUsIC0zLjY0MzY0ODNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjQwNjFmZjMyYTI0OGE3OWJhYTc3Nzg4NmU1NjgzNS5zZXRDb250ZW50KGh0bWxfMmUxZmY2ZDM2ZTliNDliZmJlNDNjZWQ2M2M0MzRiNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOGM1NjYwYzM4MzI0NThjYWM0Y2Q1OTI3YmNhZTE3MC5iaW5kUG9wdXAocG9wdXBfNmI0MDYxZmYzMmEyNDhhNzliYWE3Nzc4ODZlNTY4MzUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xNGYzMzI3NDJkMDU0ZmRiOWNlMjJiNDMyNDY0ZmU0NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIzNjQ0NSwgLTMuNjI4MDE2Nzk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiZGQyNmZlZDYzYjRlYjU4ODAyOTMwODc0MWNjNTMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyZjcwZTM0NDM3NDQ5YTBhZGI1ZTVmYjgxMDhmZGIyID0gJChgPGRpdiBpZD0iaHRtbF9lMmY3MGUzNDQzNzQ0OWEwYWRiNWU1ZmI4MTA4ZmRiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMzY0NDUsIC0zLjYyODAxNjc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYmRkMjZmZWQ2M2I0ZWI1ODgwMjkzMDg3NDFjYzUzMS5zZXRDb250ZW50KGh0bWxfZTJmNzBlMzQ0Mzc0NDlhMGFkYjVlNWZiODEwOGZkYjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNGYzMzI3NDJkMDU0ZmRiOWNlMjJiNDMyNDY0ZmU0Ni5iaW5kUG9wdXAocG9wdXBfZmJkZDI2ZmVkNjNiNGViNTg4MDI5MzA4NzQxY2M1MzEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82MmI1NmEyNzljOGY0N2FjOWYxNDM0OWUyM2FmZmVkNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5OTA0Mjk5OTk5OTksIC0zLjYzMDkyMzM5OTk5OTk5OTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWNlY2NjZDg4ZDY0ZmE0YmUyMzE3MjFiOTZmNWEyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZmMxZjYxNzcyOTQ0NzAwODFkMzY2ZDk1MWRjMTJmYiA9ICQoYDxkaXYgaWQ9Imh0bWxfYWZjMWY2MTc3Mjk0NDcwMDgxZDM2NmQ5NTFkYzEyZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTk5MDQyOTk5OTk5OSwgLTMuNjMwOTIzMzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1Y2VjY2NkODhkNjRmYTRiZTIzMTcyMWI5NmY1YTIxLnNldENvbnRlbnQoaHRtbF9hZmMxZjYxNzcyOTQ0NzAwODFkMzY2ZDk1MWRjMTJmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYyYjU2YTI3OWM4ZjQ3YWM5ZjE0MzQ5ZTIzYWZmZWQ2LmJpbmRQb3B1cChwb3B1cF81NWNlY2NjZDg4ZDY0ZmE0YmUyMzE3MjFiOTZmNWEyMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I5NGJlYzQzM2U0NDQ0ZDc5M2NhODk5ZjkwZWU4NWEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTk5LCAtMy42MzMxODA3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWNhZTIxNDVkZTUxNDYwNTk2OWI3MTc3MDRjOTFkMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWFmNDgzNmMzMTI2NDU0NTkzMWUyODc0ODExYjQyYTUgPSAkKGA8ZGl2IGlkPSJodG1sXzFhZjQ4MzZjMzEyNjQ1NDU5MzFlMjg3NDgxMWI0MmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzk5OSwgLTMuNjMzMTgwN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljYWUyMTQ1ZGU1MTQ2MDU5NjliNzE3NzA0YzkxZDMzLnNldENvbnRlbnQoaHRtbF8xYWY0ODM2YzMxMjY0NTQ1OTMxZTI4NzQ4MTFiNDJhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I5NGJlYzQzM2U0NDQ0ZDc5M2NhODk5ZjkwZWU4NWEzLmJpbmRQb3B1cChwb3B1cF85Y2FlMjE0NWRlNTE0NjA1OTY5YjcxNzcwNGM5MWQzMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2M4YWE1ZjMwNjM0YTQ0ZTE4MzZhMmNkNzQ1NjliMDEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkwMTM1LCAtMy42NDE3MzAyMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGYzOTM3YjcxOTIxNGE0ZmJlMzA1MmZkYjQ0YTc2MTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjRlZTA0YjUzYjFmNDBlYzk5Yjc3NTJjZGYxY2Q1ZTMgPSAkKGA8ZGl2IGlkPSJodG1sX2Y0ZWUwNGI1M2IxZjQwZWM5OWI3NzUyY2RmMWNkNWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5MDEzNSwgLTMuNjQxNzMwMjAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmMzkzN2I3MTkyMTRhNGZiZTMwNTJmZGI0NGE3NjE0LnNldENvbnRlbnQoaHRtbF9mNGVlMDRiNTNiMWY0MGVjOTliNzc1MmNkZjFjZDVlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M4YWE1ZjMwNjM0YTQ0ZTE4MzZhMmNkNzQ1NjliMDEwLmJpbmRQb3B1cChwb3B1cF8wZjM5MzdiNzE5MjE0YTRmYmUzMDUyZmRiNDRhNzYxNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NiNjVmYWJjYjc2ZDRlMzViYWNjNmE2ZGRkM2JiODkxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTksIC0zLjYzMzE4NTEwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mN2VmZTEzMTMzZjM0Y2QxOTAwMTBiMDIyY2E3MGNhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzkwYjdkZjQ1OTg0YjZlYmVjZTYwOGIwMjQ1YTBjNCA9ICQoYDxkaXYgaWQ9Imh0bWxfNjM5MGI3ZGY0NTk4NGI2ZWJlY2U2MDhiMDI0NWEwYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3OTksIC0zLjYzMzE4NTEwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2VmZTEzMTMzZjM0Y2QxOTAwMTBiMDIyY2E3MGNhZS5zZXRDb250ZW50KGh0bWxfNjM5MGI3ZGY0NTk4NGI2ZWJlY2U2MDhiMDI0NWEwYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYjY1ZmFiY2I3NmQ0ZTM1YmFjYzZhNmRkZDNiYjg5MS5iaW5kUG9wdXAocG9wdXBfZjdlZmUxMzEzM2YzNGNkMTkwMDEwYjAyMmNhNzBjYWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82MTc2MDI1ZTdmOTI0ZjRhYjMxZDQ1ZGYzZTRiMTUzYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE3MTQzNCwgLTMuNjQxMDU4N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1N2YxNTM2MWM0YTQ2MGQ5ZWI2ZDk0ODgzZTlhN2Q2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyNGVhNWViOTQ4YjQ4MWU5OGM2ZDExYWU2N2IwMmNmID0gJChgPGRpdiBpZD0iaHRtbF8wMjRlYTVlYjk0OGI0ODFlOThjNmQxMWFlNjdiMDJjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxNzE0MzQsIC0zLjY0MTA1ODddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTdmMTUzNjFjNGE0NjBkOWViNmQ5NDg4M2U5YTdkNi5zZXRDb250ZW50KGh0bWxfMDI0ZWE1ZWI5NDhiNDgxZTk4YzZkMTFhZTY3YjAyY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MTc2MDI1ZTdmOTI0ZjRhYjMxZDQ1ZGYzZTRiMTUzYS5iaW5kUG9wdXAocG9wdXBfZTU3ZjE1MzYxYzRhNDYwZDllYjZkOTQ4ODNlOWE3ZDYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82YTQ1YmY4YWM2OTQ0YTc3YjRiZmJlMzVlYWJmODJjNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI1NDgzMywgLTMuNjQ0NjE3Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiMDVjMzk4NTk4OTQ2YzY4NzI5Y2JkNjhiNDFmYTlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5MzkzODNkZWUzODQyMDI4MTIyZmRjODdlNWY1OTRiID0gJChgPGRpdiBpZD0iaHRtbF85OTM5MzgzZGVlMzg0MjAyODEyMmZkYzg3ZTVmNTk0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNTQ4MzMsIC0zLjY0NDYxNzZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYjA1YzM5ODU5ODk0NmM2ODcyOWNiZDY4YjQxZmE5ZC5zZXRDb250ZW50KGh0bWxfOTkzOTM4M2RlZTM4NDIwMjgxMjJmZGM4N2U1ZjU5NGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82YTQ1YmY4YWM2OTQ0YTc3YjRiZmJlMzVlYWJmODJjNy5iaW5kUG9wdXAocG9wdXBfMGIwNWMzOTg1OTg5NDZjNjg3MjljYmQ2OGI0MWZhOWQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xNzczZDM5NTAzYzE0MTI4YTUwZTM2NmFiYjhlZGY0YiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NTY0LCAtMy42NDQ2NzkxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWNiNDFmYWE2NzkxNGNhZWI4ZGFkZTIwM2M3MmFhYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODdlMzk2MmUwYmZjNGJiOWI2MmY4YjE0NjUyZGQ3MTUgPSAkKGA8ZGl2IGlkPSJodG1sXzg3ZTM5NjJlMGJmYzRiYjliNjJmOGIxNDY1MmRkNzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTY0LCAtMy42NDQ2NzkxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWNiNDFmYWE2NzkxNGNhZWI4ZGFkZTIwM2M3MmFhYmUuc2V0Q29udGVudChodG1sXzg3ZTM5NjJlMGJmYzRiYjliNjJmOGIxNDY1MmRkNzE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTc3M2QzOTUwM2MxNDEyOGE1MGUzNjZhYmI4ZWRmNGIuYmluZFBvcHVwKHBvcHVwXzljYjQxZmFhNjc5MTRjYWViOGRhZGUyMDNjNzJhYWJlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmU3YTU0NzhmNDc5NGE4M2E2MTFlOWQ2NmE0YTUzZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODEwNTksIC0zLjY0MzQzNzRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNThkNzlkYWI3ODk0NzI5YTQ0Mzk2MjVjZTc1M2JiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjhkOWJjYTgyY2Y0ODUxYjk0OGU3NGJmMmRjZWJiMSA9ICQoYDxkaXYgaWQ9Imh0bWxfN2I4ZDliY2E4MmNmNDg1MWI5NDhlNzRiZjJkY2ViYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjgxMDU5LCAtMy42NDM0Mzc0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDU4ZDc5ZGFiNzg5NDcyOWE0NDM5NjI1Y2U3NTNiYmIuc2V0Q29udGVudChodG1sXzdiOGQ5YmNhODJjZjQ4NTFiOTQ4ZTc0YmYyZGNlYmIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmU3YTU0NzhmNDc5NGE4M2E2MTFlOWQ2NmE0YTUzZWEuYmluZFBvcHVwKHBvcHVwX2Q1OGQ3OWRhYjc4OTQ3MjlhNDQzOTYyNWNlNzUzYmJiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZDRhMjRhZDZhYWY0NGRhMzgwMGFkMTdhOTdlY2QzMDggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODU0NDEsIC0zLjY0MjU1NzRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzY2NjUzODVjMzg0ODIyODQ0NDFhMDhjOTJlOWYwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NzQzNGNlYmY1Yjk0ZmFmYWUzOWM1YTc5MmEwOTVlNyA9ICQoYDxkaXYgaWQ9Imh0bWxfOTc0MzRjZWJmNWI5NGZhZmFlMzljNWE3OTJhMDk1ZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1NDQxLCAtMy42NDI1NTc0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM2NjY1Mzg1YzM4NDgyMjg0NDQxYTA4YzkyZTlmMDcuc2V0Q29udGVudChodG1sXzk3NDM0Y2ViZjViOTRmYWZhZTM5YzVhNzkyYTA5NWU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDRhMjRhZDZhYWY0NGRhMzgwMGFkMTdhOTdlY2QzMDguYmluZFBvcHVwKHBvcHVwXzFjNjY2NTM4NWMzODQ4MjI4NDQ0MWEwOGM5MmU5ZjA3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzIzOWVhMGQxNWM4NDZmZTgxMTFhZmJhZDU2N2Q4YmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjE3NzYxMzYsIC01LjgzMDg1MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2MTkyYWQ2ZDhiMDRjMGE4MDY2MmRlMDlhNjc5NzFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I3OTA2ZWRmNGY2ZjQ0OTJiNGU3YzNiNWNiNDQ2Njc5ID0gJChgPGRpdiBpZD0iaHRtbF9iNzkwNmVkZjRmNmY0NDkyYjRlN2MzYjVjYjQ0NjY3OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjE3NzYxMzYsIC01LjgzMDg1MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2MTkyYWQ2ZDhiMDRjMGE4MDY2MmRlMDlhNjc5NzFlLnNldENvbnRlbnQoaHRtbF9iNzkwNmVkZjRmNmY0NDkyYjRlN2MzYjVjYjQ0NjY3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MyMzllYTBkMTVjODQ2ZmU4MTExYWZiYWQ1NjdkOGJhLmJpbmRQb3B1cChwb3B1cF85NjE5MmFkNmQ4YjA0YzBhODA2NjJkZTA5YTY3OTcxZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzllY2NjYTVjOTJkMjRjYTI5MTcyNDdmZWMyYmRmMTUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MjI3LCAtMy42NDUzNzY1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTUyNzUwMGVhNzJhNDE0NThlN2FiNWE1OWQ0Y2MwOTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE0YWNlMmMyOGUxNGYwN2JiNmZkYjMyNDhhYzE2M2IgPSAkKGA8ZGl2IGlkPSJodG1sXzIxNGFjZTJjMjhlMTRmMDdiYjZmZGIzMjQ4YWMxNjNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjIyNywgLTMuNjQ1Mzc2NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1Mjc1MDBlYTcyYTQxNDU4ZTdhYjVhNTlkNGNjMDk3LnNldENvbnRlbnQoaHRtbF8yMTRhY2UyYzI4ZTE0ZjA3YmI2ZmRiMzI0OGFjMTYzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzllY2NjYTVjOTJkMjRjYTI5MTcyNDdmZWMyYmRmMTUzLmJpbmRQb3B1cChwb3B1cF9lNTI3NTAwZWE3MmE0MTQ1OGU3YWI1YTU5ZDRjYzA5NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdhOGIwODZiZDJiMzQ3NTlhYzE4NmFmMGYxODAzNzk0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MTc5LCAtMy42NDUzNzk0OTk5OTk5OTk4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQzNTE3ZmM4YzZkNDRhNWI3NjlhMzg3YjQ1YTdkNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZjNzFhMjcwYjIyNGNjOWE5OWYxYmZkNTgwNGQ0YzMgPSAkKGA8ZGl2IGlkPSJodG1sX2VmYzcxYTI3MGIyMjRjYzlhOTlmMWJmZDU4MDRkNGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjE3OSwgLTMuNjQ1Mzc5NDk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkMzUxN2ZjOGM2ZDQ0YTViNzY5YTM4N2I0NWE3ZDU0LnNldENvbnRlbnQoaHRtbF9lZmM3MWEyNzBiMjI0Y2M5YTk5ZjFiZmQ1ODA0ZDRjMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdhOGIwODZiZDJiMzQ3NTlhYzE4NmFmMGYxODAzNzk0LmJpbmRQb3B1cChwb3B1cF82ZDM1MTdmYzhjNmQ0NGE1Yjc2OWEzODdiNDVhN2Q1NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkxOGViMzU4YzdmNTQ3YjFhMTEzZmQxMmNmNmYzMDZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjg1MTE5LCAtMy42NDMxODAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVmZmQwMzI4ODc0NDI4YWJhMGEyMWJiNTk3ZTZiYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2RmNjc5YjA4YzQzNDY1Y2EyNDEyOTUzNTVkYTgxN2MgPSAkKGA8ZGl2IGlkPSJodG1sXzNkZjY3OWIwOGM0MzQ2NWNhMjQxMjk1MzU1ZGE4MTdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4NTExOSwgLTMuNjQzMTgwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlZmZkMDMyODg3NDQyOGFiYTBhMjFiYjU5N2U2YmFhLnNldENvbnRlbnQoaHRtbF8zZGY2NzliMDhjNDM0NjVjYTI0MTI5NTM1NWRhODE3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkxOGViMzU4YzdmNTQ3YjFhMTEzZmQxMmNmNmYzMDZiLmJpbmRQb3B1cChwb3B1cF9mZWZmZDAzMjg4NzQ0MjhhYmEwYTIxYmI1OTdlNmJhYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRhZTA3YzVlZDQ4MzRlNWY5ZWI5YjAxOTM5ZTY0ZDUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjg3Nzc3LCAtMy42NDIyNTAxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ2YWRlYWY0Zjg2NGUxMDg5YzE4MWZlYTRiMmE0YzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWZiNmMwMGM4ZGRiNGE4NzhlMmIxM2JmZmUzZWQ4OGYgPSAkKGA8ZGl2IGlkPSJodG1sXzFmYjZjMDBjOGRkYjRhODc4ZTJiMTNiZmZlM2VkODhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4Nzc3NywgLTMuNjQyMjUwMTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkNmFkZWFmNGY4NjRlMTA4OWMxODFmZWE0YjJhNGM2LnNldENvbnRlbnQoaHRtbF8xZmI2YzAwYzhkZGI0YTg3OGUyYjEzYmZmZTNlZDg4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRhZTA3YzVlZDQ4MzRlNWY5ZWI5YjAxOTM5ZTY0ZDUyLmJpbmRQb3B1cChwb3B1cF9hZDZhZGVhZjRmODY0ZTEwODljMTgxZmVhNGIyYTRjNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2E4MTI0OGEwN2QwNTQ2MTY5ZmE5NjVmZDIzNzcyYWU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTc3LCAtMy42MzMxNTc4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGRiYTIyOWFjNDQyNGJhNDhhMDY2MjEwMTQxZjQwYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTIwODZiMzc5NmIwNGQzMzliZDYzMzExMDQ4Y2Q3ZDQgPSAkKGA8ZGl2IGlkPSJodG1sXzEyMDg2YjM3OTZiMDRkMzM5YmQ2MzMxMTA0OGNkN2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzk3NywgLTMuNjMzMTU3OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkYmEyMjlhYzQ0MjRiYTQ4YTA2NjIxMDE0MWY0MGEzLnNldENvbnRlbnQoaHRtbF8xMjA4NmIzNzk2YjA0ZDMzOWJkNjMzMTEwNDhjZDdkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E4MTI0OGEwN2QwNTQ2MTY5ZmE5NjVmZDIzNzcyYWU4LmJpbmRQb3B1cChwb3B1cF84ZGJhMjI5YWM0NDI0YmE0OGEwNjYyMTAxNDFmNDBhMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2MwZjMxNzg3NjM4NjQxMzlhMGNiN2Y1Y2EyMjczNGUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3NjkyLCAtMy42MzMyMjY1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTgzN2M2MTM0OTg5NDdmMjk3ZDIzNzczODRjMjZmNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODc0ZDAyOGI5NTk5NGZlYjkwYjkxODFiYmViMDQ5ZTEgPSAkKGA8ZGl2IGlkPSJodG1sXzg3NGQwMjhiOTU5OTRmZWI5MGI5MTgxYmJlYjA0OWUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzY5MiwgLTMuNjMzMjI2NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4MzdjNjEzNDk4OTQ3ZjI5N2QyMzc3Mzg0YzI2ZjZkLnNldENvbnRlbnQoaHRtbF84NzRkMDI4Yjk1OTk0ZmViOTBiOTE4MWJiZWIwNDllMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwZjMxNzg3NjM4NjQxMzlhMGNiN2Y1Y2EyMjczNGUzLmJpbmRQb3B1cChwb3B1cF81ODM3YzYxMzQ5ODk0N2YyOTdkMjM3NzM4NGMyNmY2ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QwNzQ0YjU1ODEzODRmM2ZhZWRjODM0MGMyNWMxN2M3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEyOTk5OTk5OTUsIC0zLjY0MDY5NTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOThhNWJjMGI4OWI0ZmY2ODMwMGM3OTVlYmQ0MjNjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDcyNWQzM2ZlN2Y0YzRiYmY0YmFkZGU1Y2IwYjYwYiA9ICQoYDxkaXYgaWQ9Imh0bWxfZjQ3MjVkMzNmZTdmNGM0YmJmNGJhZGRlNWNiMGI2MGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDEyOTk5OTk5OTUsIC0zLjY0MDY5NTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOThhNWJjMGI4OWI0ZmY2ODMwMGM3OTVlYmQ0MjNjMC5zZXRDb250ZW50KGh0bWxfZjQ3MjVkMzNmZTdmNGM0YmJmNGJhZGRlNWNiMGI2MGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMDc0NGI1NTgxMzg0ZjNmYWVkYzgzNDBjMjVjMTdjNy5iaW5kUG9wdXAocG9wdXBfZjk4YTViYzBiODliNGZmNjgzMDBjNzk1ZWJkNDIzYzApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82YTIzOGJhNDU1MDU0NzI4ODQ5NmZjM2IyMjEwNmViNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NDk0NywgLTMuNjQyNjM5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwMTc3MWVjYzRhZjQxMTQ5ODg5ODU3ZmYxNzQ3MGJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjNzVlZjQ2N2YxZTQzYjNiMGE4YTVjZDczZWVjY2VjID0gJChgPGRpdiBpZD0iaHRtbF8xYzc1ZWY0NjdmMWU0M2IzYjBhOGE1Y2Q3M2VlY2NlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODQ5NDcsIC0zLjY0MjYzOTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDE3NzFlY2M0YWY0MTE0OTg4OTg1N2ZmMTc0NzBiZS5zZXRDb250ZW50KGh0bWxfMWM3NWVmNDY3ZjFlNDNiM2IwYThhNWNkNzNlZWNjZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82YTIzOGJhNDU1MDU0NzI4ODQ5NmZjM2IyMjEwNmViNi5iaW5kUG9wdXAocG9wdXBfMDAxNzcxZWNjNGFmNDExNDk4ODk4NTdmZjE3NDcwYmUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kMzk3N2RjNGFhNzA0ZjhkOGE5ODk4ZGQyODRlNjdkOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTE5NiwgLTMuNjQzMTk1OTAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1ZWEwZmUxODcyMDQ4MTNiYWZmZTkwZTllZmMyNDVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkY2RmOWQ2NmE5MTQ3M2FhM2NkZGIwN2NkZjAwZGM0ID0gJChgPGRpdiBpZD0iaHRtbF9lZGNkZjlkNjZhOTE0NzNhYTNjZGRiMDdjZGYwMGRjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxOTYsIC0zLjY0MzE5NTkwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWVhMGZlMTg3MjA0ODEzYmFmZmU5MGU5ZWZjMjQ1ZS5zZXRDb250ZW50KGh0bWxfZWRjZGY5ZDY2YTkxNDczYWEzY2RkYjA3Y2RmMDBkYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMzk3N2RjNGFhNzA0ZjhkOGE5ODk4ZGQyODRlNjdkOC5iaW5kUG9wdXAocG9wdXBfNzVlYTBmZTE4NzIwNDgxM2JhZmZlOTBlOWVmYzI0NWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hOWU5YTA4ZGQ0MWU0MzlkODcyZTQ3OTlkYWM4ZTdlNCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5ODkyMjk5OTk5OTk0LCAtMy42MzA5MzI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzY2ZGZlNjVlZDkzNDJjMGE3OWZjOTUxZjhhNWY2MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWEzODQ4ODI1ZjRiNGE2Mzg4YzNkM2I4OGI1NDRmYzQgPSAkKGA8ZGl2IGlkPSJodG1sXzlhMzg0ODgyNWY0YjRhNjM4OGMzZDNiODhiNTQ0ZmM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5ODkyMjk5OTk5OTk0LCAtMy42MzA5MzI5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY2ZGZlNjVlZDkzNDJjMGE3OWZjOTUxZjhhNWY2MmUuc2V0Q29udGVudChodG1sXzlhMzg0ODgyNWY0YjRhNjM4OGMzZDNiODhiNTQ0ZmM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTllOWEwOGRkNDFlNDM5ZDg3MmU0Nzk5ZGFjOGU3ZTQuYmluZFBvcHVwKHBvcHVwX2M2NmRmZTY1ZWQ5MzQyYzBhNzlmYzk1MWY4YTVmNjJlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZmU5MDE4MmQ3NWJkNGJlMDllODRiNjQ2MDlmNDgxNjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMzQzMywgLTMuNjI3NjA2Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiN2U5OWM1NzBhMzQ0MzdhZmYzZjkwOWMyZTNhN2FhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2YzFiZjgzNmVkYjQ4NmI5MjU3MjVjYjNhYTQwYzc4ID0gJChgPGRpdiBpZD0iaHRtbF9hNmMxYmY4MzZlZGI0ODZiOTI1NzI1Y2IzYWE0MGM3OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMzQzMywgLTMuNjI3NjA2Mjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiN2U5OWM1NzBhMzQ0MzdhZmYzZjkwOWMyZTNhN2FhLnNldENvbnRlbnQoaHRtbF9hNmMxYmY4MzZlZGI0ODZiOTI1NzI1Y2IzYWE0MGM3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZlOTAxODJkNzViZDRiZTA5ZTg0YjY0NjA5ZjQ4MTY5LmJpbmRQb3B1cChwb3B1cF8yYjdlOTljNTcwYTM0NDM3YWZmM2Y5MDljMmUzYTdhYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzUxYzUzMDFkMTE3ODQ1ZjY5ZmMxOTc5NzM5ZmU5ZjNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTcxMzQzLCAtMy43MDg3NTg2MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE3YzZlMDI5YmFmNGJkZjlhODhhZjA4MGMwNWViYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGZlMGMwZGVhZGEwNDQwNDllM2JjYmM1MTMxNTJmMDYgPSAkKGA8ZGl2IGlkPSJodG1sX2RmZTBjMGRlYWRhMDQ0MDQ5ZTNiY2JjNTEzMTUyZjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk3MTM0MywgLTMuNzA4NzU4NjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExN2M2ZTAyOWJhZjRiZGY5YTg4YWYwODBjMDVlYmE2LnNldENvbnRlbnQoaHRtbF9kZmUwYzBkZWFkYTA0NDA0OWUzYmNiYzUxMzE1MmYwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxYzUzMDFkMTE3ODQ1ZjY5ZmMxOTc5NzM5ZmU5ZjNjLmJpbmRQb3B1cChwb3B1cF9hMTdjNmUwMjliYWY0YmRmOWE4OGFmMDgwYzA1ZWJhNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFhYzJlNjdjMDJhNTRkODRhNTcyYzIyN2FhMzdjMjM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTEwMDI1LCAtMy42Mjg4NDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjViN2I1NmQwMGQ0ODI0YmEyNThiZjczMWY0NjY4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjRiYWVhODJiZDE0YmJjYWEwNGRkYTZjZDFmZjcxMCA9ICQoYDxkaXYgaWQ9Imh0bWxfZGY0YmFlYTgyYmQxNGJiY2FhMDRkZGE2Y2QxZmY3MTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTEwMDI1LCAtMy42Mjg4NDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMjViN2I1NmQwMGQ0ODI0YmEyNThiZjczMWY0NjY4OC5zZXRDb250ZW50KGh0bWxfZGY0YmFlYTgyYmQxNGJiY2FhMDRkZGE2Y2QxZmY3MTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYWMyZTY3YzAyYTU0ZDg0YTU3MmMyMjdhYTM3YzIzNS5iaW5kUG9wdXAocG9wdXBfMjI1YjdiNTZkMDBkNDgyNGJhMjU4YmY3MzFmNDY2ODgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zMGU0MmFlNzkxYzk0ZGYyODlmYmU5YjA2OGZiYjE2ZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDg1Nzk5OTk5OTk0LCAtMy42NDU1MjExMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzMwOGI2YmVlZTM2NGU3Zjk3ZDg0MjEzOTU2MzkyMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDY1NDZmYjQ3MTc3NGZhNGEyNTI5YzA0MTM5MDBiMzUgPSAkKGA8ZGl2IGlkPSJodG1sXzA2NTQ2ZmI0NzE3NzRmYTRhMjUyOWMwNDEzOTAwYjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg1Nzk5OTk5OTk0LCAtMy42NDU1MjExMDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzMwOGI2YmVlZTM2NGU3Zjk3ZDg0MjEzOTU2MzkyMTYuc2V0Q29udGVudChodG1sXzA2NTQ2ZmI0NzE3NzRmYTRhMjUyOWMwNDEzOTAwYjM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzBlNDJhZTc5MWM5NGRmMjg5ZmJlOWIwNjhmYmIxNmYuYmluZFBvcHVwKHBvcHVwXzMzMDhiNmJlZWUzNjRlN2Y5N2Q4NDIxMzk1NjM5MjE2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDA1Yjc2NzQyYmVkNDk5NWEyZGFmMDBmODkzNGZmODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzUzNzQsIC0zLjY0NDc1MTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTFhNzQwMTY0NGM0OWMxYWQwZDJiM2JjZTJhNDdmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTYxNjdmYTUwOGE0ZTEzYmZiMDMyZGZmMGY3MjQzNiA9ICQoYDxkaXYgaWQ9Imh0bWxfYTk2MTY3ZmE1MDhhNGUxM2JmYjAzMmRmZjBmNzI0MzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc1Mzc0LCAtMy42NDQ3NTE1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmExYTc0MDE2NDRjNDljMWFkMGQyYjNiY2UyYTQ3ZjUuc2V0Q29udGVudChodG1sX2E5NjE2N2ZhNTA4YTRlMTNiZmIwMzJkZmYwZjcyNDM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDA1Yjc2NzQyYmVkNDk5NWEyZGFmMDBmODkzNGZmODkuYmluZFBvcHVwKHBvcHVwXzZhMWE3NDAxNjQ0YzQ5YzFhZDBkMmIzYmNlMmE0N2Y1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDk2NGE2MjZlNzk2NDY4NWJhNTk3YWY4MWJmMzBiYmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyOTIzMTgsIC0zLjY0MDY4ODFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NDE3YmQ2Mjc4NjE0ZmY2ODJkOTg0Y2Y4YzhlYTE0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzcyNjMwYmZkZWM0MTg1OGZmMmZkMDhmMGZkZmRmNSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjc3MjYzMGJmZGVjNDE4NThmZjJmZDA4ZjBmZGZkZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyMzE4LCAtMy42NDA2ODgxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQxN2JkNjI3ODYxNGZmNjgyZDk4NGNmOGM4ZWExNDIuc2V0Q29udGVudChodG1sX2I3NzI2MzBiZmRlYzQxODU4ZmYyZmQwOGYwZmRmZGY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDk2NGE2MjZlNzk2NDY4NWJhNTk3YWY4MWJmMzBiYmUuYmluZFBvcHVwKHBvcHVwXzg0MTdiZDYyNzg2MTRmZjY4MmQ5ODRjZjhjOGVhMTQyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjYzNjFjNTY4ZjU0NDc2MWE1ZTQ5NzM0NGY0MmU4ZGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNDU4ODcsIC0zLjY0NjIyOTFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzc3NjJmYWFjZGY0ZjlhOTJjZDVmODk5NDcxNDZhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTRmNDY1NDg3YWE0OGIxYWQ2NzAxZGVkNzEzYzJjYSA9ICQoYDxkaXYgaWQ9Imh0bWxfZDU0ZjQ2NTQ4N2FhNDhiMWFkNjcwMWRlZDcxM2MyY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjQ1ODg3LCAtMy42NDYyMjkxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWM3NzYyZmFhY2RmNGY5YTkyY2Q1Zjg5OTQ3MTQ2YTYuc2V0Q29udGVudChodG1sX2Q1NGY0NjU0ODdhYTQ4YjFhZDY3MDFkZWQ3MTNjMmNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjYzNjFjNTY4ZjU0NDc2MWE1ZTQ5NzM0NGY0MmU4ZGUuYmluZFBvcHVwKHBvcHVwX2VjNzc2MmZhYWNkZjRmOWE5MmNkNWY4OTk0NzE0NmE2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjgzZTIwMWU3NzdjNDcwMjg4NWRhZDFjMmE1MGMxZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc5MjksIC0zLjYzMzIwOTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZWQ2NmIzNmJmMTc0N2JlYTRjMzYxNjAyNjRkOThlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTRmNmEwMjM2OGM0ZjEyODBjYjg5MmMxOGExZjk5ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfMjU0ZjZhMDIzNjhjNGYxMjgwY2I4OTJjMThhMWY5OWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3OTI5LCAtMy42MzMyMDk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2VkNjZiMzZiZjE3NDdiZWE0YzM2MTYwMjY0ZDk4ZTYuc2V0Q29udGVudChodG1sXzI1NGY2YTAyMzY4YzRmMTI4MGNiODkyYzE4YTFmOTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjgzZTIwMWU3NzdjNDcwMjg4NWRhZDFjMmE1MGMxZDEuYmluZFBvcHVwKHBvcHVwXzNlZDY2YjM2YmYxNzQ3YmVhNGMzNjE2MDI2NGQ5OGU2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWFhNTExZjUxYmMyNDkyYjk0MGMxNTA2MTQ3N2E3OGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc5MDk5OTk5OTk5NCwgLTMuNjMzMjA5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxYzZjZjkxYTE3NzRlMmU4NTY1NTkyZDU3YzQ1NGU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmYTUwOTcxMzIxZDRhZjM5Njg4ODE1OWY5OTMyZTY2ID0gJChgPGRpdiBpZD0iaHRtbF9iZmE1MDk3MTMyMWQ0YWYzOTY4ODgxNTlmOTkzMmU2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDc5MDk5OTk5OTk5NCwgLTMuNjMzMjA5M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxYzZjZjkxYTE3NzRlMmU4NTY1NTkyZDU3YzQ1NGU4LnNldENvbnRlbnQoaHRtbF9iZmE1MDk3MTMyMWQ0YWYzOTY4ODgxNTlmOTkzMmU2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhYTUxMWY1MWJjMjQ5MmI5NDBjMTUwNjE0NzdhNzhjLmJpbmRQb3B1cChwb3B1cF9jMWM2Y2Y5MWExNzc0ZTJlODU2NTU5MmQ1N2M0NTRlOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I1YmIxOWY1ODAxYTRlYTQ5ZGEzY2MzMjg5OWIyNDYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI0NDMxMDAwMDAwMDQsIC0zLjcwNDQ3MDc5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYWJiZTkzNDU1ZDg0MDFiYWIwNGFlZDM5MDc1NjcxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWExZGUxNDBhNmE0ZGNjODllYzg4NTU1ZTA2ZDIyOSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjFhMWRlMTQwYTZhNGRjYzg5ZWM4ODU1NWUwNmQyMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTI0NDMxMDAwMDAwMDQsIC0zLjcwNDQ3MDc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWJiZTkzNDU1ZDg0MDFiYWIwNGFlZDM5MDc1NjcxMy5zZXRDb250ZW50KGh0bWxfYjFhMWRlMTQwYTZhNGRjYzg5ZWM4ODU1NWUwNmQyMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNWJiMTlmNTgwMWE0ZWE0OWRhM2NjMzI4OTliMjQ2Mi5iaW5kUG9wdXAocG9wdXBfZGFiYmU5MzQ1NWQ4NDAxYmFiMDRhZWQzOTA3NTY3MTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iM2ZjMjc1ZGFlNzk0N2ZhYjA3YjY2N2UwOTZiYzQ5ZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MjE0NiwgLTMuNjUxMDQ3MjAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2YzU5YjEwYWYyYjRkN2FiY2RhNDRkMDliYTYxMzU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxYTU0NmI1MGRkYjRhNWZhNGE1M2JjNDBlZDA4MTg2ID0gJChgPGRpdiBpZD0iaHRtbF83MWE1NDZiNTBkZGI0YTVmYTRhNTNiYzQwZWQwODE4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTIxNDYsIC0zLjY1MTA0NzIwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNmM1OWIxMGFmMmI0ZDdhYmNkYTQ0ZDA5YmE2MTM1OC5zZXRDb250ZW50KGh0bWxfNzFhNTQ2YjUwZGRiNGE1ZmE0YTUzYmM0MGVkMDgxODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iM2ZjMjc1ZGFlNzk0N2ZhYjA3YjY2N2UwOTZiYzQ5ZS5iaW5kUG9wdXAocG9wdXBfYzZjNTliMTBhZjJiNGQ3YWJjZGE0NGQwOWJhNjEzNTgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82NTQ1YTY1OTE5NGY0MmNkOGExOTk2ODliMjliMjcxMiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk0NTA5ODk5OTk5OTk2LCAtMy43MDEwOTY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzZkOTU5MWRkMGUxNDVkNjk0OGI2NmE5ODdlNzMwN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjVjMDlhMDhlZmYxNDcxZGFkMDc0MDhkNWJhYmZhNTEgPSAkKGA8ZGl2IGlkPSJodG1sX2Y1YzA5YTA4ZWZmMTQ3MWRhZDA3NDA4ZDViYWJmYTUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk0NTA5ODk5OTk5OTk2LCAtMy43MDEwOTY2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzZkOTU5MWRkMGUxNDVkNjk0OGI2NmE5ODdlNzMwN2Euc2V0Q29udGVudChodG1sX2Y1YzA5YTA4ZWZmMTQ3MWRhZDA3NDA4ZDViYWJmYTUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjU0NWE2NTkxOTRmNDJjZDhhMTk5Njg5YjI5YjI3MTIuYmluZFBvcHVwKHBvcHVwXzc2ZDk1OTFkZDBlMTQ1ZDY5NDhiNjZhOTg3ZTczMDdhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWU4N2E0MTY3MWNhNDg3MmFjNGRiY2I1NzM0NGNhMDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUwNDksIC0zLjY0MzI1ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Yjk1M2EwMDI0NGM0NTc3OThkZjhiY2M4MjA1ZWY5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOWE0NjllNTViZjM0NjFkYTBlNTdlNDY5Mjg4YTFmMyA9ICQoYDxkaXYgaWQ9Imh0bWxfMDlhNDY5ZTU1YmYzNDYxZGEwZTU3ZTQ2OTI4OGExZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MDQ5LCAtMy42NDMyNTg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWI5NTNhMDAyNDRjNDU3Nzk4ZGY4YmNjODIwNWVmOTcuc2V0Q29udGVudChodG1sXzA5YTQ2OWU1NWJmMzQ2MWRhMGU1N2U0NjkyODhhMWYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWU4N2E0MTY3MWNhNDg3MmFjNGRiY2I1NzM0NGNhMDIuYmluZFBvcHVwKHBvcHVwXzViOTUzYTAwMjQ0YzQ1Nzc5OGRmOGJjYzgyMDVlZjk3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjVlMDk2ZTk4YWE0NGZiOTliOTFkYTQ4ODZiZDFhMDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM1MzkwMzQsIC0zLjgxODgwNTIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNjI2NjU1ODJmZWI0OGJhOTdhY2YyNmU0NGQwY2JhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NDU5ZTAwYzc2NzY0MzM5ODljMGNiMWI0ZTk3NTk2YSA9ICQoYDxkaXYgaWQ9Imh0bWxfOTQ1OWUwMGM3Njc2NDMzOTg5YzBjYjFiNGU5NzU5NmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNTM5MDM0LCAtMy44MTg4MDUyMDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDYyNjY1NTgyZmViNDhiYTk3YWNmMjZlNDRkMGNiYWQuc2V0Q29udGVudChodG1sXzk0NTllMDBjNzY3NjQzMzk4OWMwY2IxYjRlOTc1OTZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjVlMDk2ZTk4YWE0NGZiOTliOTFkYTQ4ODZiZDFhMDAuYmluZFBvcHVwKHBvcHVwX2Q2MjY2NTU4MmZlYjQ4YmE5N2FjZjI2ZTQ0ZDBjYmFkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzAxMWU2Y2UzMmE4NDMwOThkMTIwMDM0ZDMxM2YzYTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUwNywgLTMuNjQzMjY0NzAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzY2NhZTVkNjU1MTQ4ZjliZTEzZDFiNmI5NjRmZDVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1ZGFhZWRhNzMwMTRmZDlhNmI4N2JkZWYxZWJhZjQ2ID0gJChgPGRpdiBpZD0iaHRtbF82NWRhYWVkYTczMDE0ZmQ5YTZiODdiZGVmMWViYWY0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUwNywgLTMuNjQzMjY0NzAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzY2NhZTVkNjU1MTQ4ZjliZTEzZDFiNmI5NjRmZDVlLnNldENvbnRlbnQoaHRtbF82NWRhYWVkYTczMDE0ZmQ5YTZiODdiZGVmMWViYWY0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMwMTFlNmNlMzJhODQzMDk4ZDEyMDAzNGQzMTNmM2EzLmJpbmRQb3B1cChwb3B1cF9mM2NjYWU1ZDY1NTE0OGY5YmUxM2QxYjZiOTY0ZmQ1ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2JlNjNkZDYwNmYzNTQzMTZiYmMzNWFlMDY2YzhmNGRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA4MDAyLCAtMy42MzMxODU4OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk4ZTllNzg4MTIwNDYwNzkyMTk2M2ZhODAxNjljOGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjRjNjUzZThkZmRjNDg2M2I5YWM2ZGI1YTFiYjk1MmMgPSAkKGA8ZGl2IGlkPSJodG1sX2Y0YzY1M2U4ZGZkYzQ4NjNiOWFjNmRiNWExYmI5NTJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwODAwMiwgLTMuNjMzMTg1ODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5OGU5ZTc4ODEyMDQ2MDc5MjE5NjNmYTgwMTY5YzhlLnNldENvbnRlbnQoaHRtbF9mNGM2NTNlOGRmZGM0ODYzYjlhYzZkYjVhMWJiOTUyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JlNjNkZDYwNmYzNTQzMTZiYmMzNWFlMDY2YzhmNGRmLmJpbmRQb3B1cChwb3B1cF85OThlOWU3ODgxMjA0NjA3OTIxOTYzZmE4MDE2OWM4ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2MyNmZhMWQ5NDlhZDQ4ZGVhNTc0MDBjOWRjMjg4MjMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjcwMTkzOTk5OTk5OSwgLTMuNjQ2NDQ0Mjk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlZmVkYmFhMzdhYzRkMGE4ZjZkMzdhYTM2MTgxN2ZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzMWI1ZmZmZTYxNjQzZjM4NjU2YjA4ZTBmNWU4ZTAwID0gJChgPGRpdiBpZD0iaHRtbF9kMzFiNWZmZmU2MTY0M2YzODY1NmIwOGUwZjVlOGUwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzAxOTM5OTk5OTk5LCAtMy42NDY0NDQyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVmZWRiYWEzN2FjNGQwYThmNmQzN2FhMzYxODE3ZmYuc2V0Q29udGVudChodG1sX2QzMWI1ZmZmZTYxNjQzZjM4NjU2YjA4ZTBmNWU4ZTAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzI2ZmExZDk0OWFkNDhkZWE1NzQwMGM5ZGMyODgyMzIuYmluZFBvcHVwKHBvcHVwXzRlZmVkYmFhMzdhYzRkMGE4ZjZkMzdhYTM2MTgxN2ZmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmQwYTU0M2I3NTZlNDFjM2E5MWVjYjc3MjBkZTVhMTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI4OTksIC0zLjYyODU2NTQwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOGNmMWU3MTk2NjM0YzY0YmI3MGI2ZTc3OGVhMzRhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTc3MzQ0YjEwNDA0NDJiOWE3YWI0NDRkODRlMTg3OSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjE3NzM0NGIxMDQwNDQyYjlhN2FiNDQ0ZDg0ZTE4NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjEyODk5LCAtMy42Mjg1NjU0MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDhjZjFlNzE5NjYzNGM2NGJiNzBiNmU3NzhlYTM0YTEuc2V0Q29udGVudChodG1sX2IxNzczNDRiMTA0MDQ0MmI5YTdhYjQ0NGQ4NGUxODc5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmQwYTU0M2I3NTZlNDFjM2E5MWVjYjc3MjBkZTVhMTEuYmluZFBvcHVwKHBvcHVwX2Q4Y2YxZTcxOTY2MzRjNjRiYjcwYjZlNzc4ZWEzNGExKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTFjZDE5MWU2ZDgzNDkyM2JhMGNmMjFhM2E1OTg5N2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyOTIzNzQsIC0zLjY0MDczMDkwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOGU4Yzc0YjBlNTc0NGIwYjM0M2YwMDNmMWUyZTQyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NmE0NzNhNDBiMTk0OGJmYTY2NDBhMjYyM2FiZDdlNCA9ICQoYDxkaXYgaWQ9Imh0bWxfNzZhNDczYTQwYjE5NDhiZmE2NjQwYTI2MjNhYmQ3ZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyMzc0LCAtMy42NDA3MzA5MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzhlOGM3NGIwZTU3NDRiMGIzNDNmMDAzZjFlMmU0MmYuc2V0Q29udGVudChodG1sXzc2YTQ3M2E0MGIxOTQ4YmZhNjY0MGEyNjIzYWJkN2U0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTFjZDE5MWU2ZDgzNDkyM2JhMGNmMjFhM2E1OTg5N2UuYmluZFBvcHVwKHBvcHVwXzM4ZThjNzRiMGU1NzQ0YjBiMzQzZjAwM2YxZTJlNDJmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDczNGE0OThjOWQyNDEzN2I5MjE1NjAwYjIzNGE2MjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUyMzc5OTk5OTk5NSwgLTMuNjQzMjQxMzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwNGVhNmNmYWE0NDQ0YTViNzIzNjcyZTY4ZTM0ODZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0MDkzYWY2ODhlNTQyMTY4Mzc0MzllODU3ODQ4ZDA2ID0gJChgPGRpdiBpZD0iaHRtbF83NDA5M2FmNjg4ZTU0MjE2ODM3NDM5ZTg1Nzg0OGQwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUyMzc5OTk5OTk5NSwgLTMuNjQzMjQxMzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwNGVhNmNmYWE0NDQ0YTViNzIzNjcyZTY4ZTM0ODZjLnNldENvbnRlbnQoaHRtbF83NDA5M2FmNjg4ZTU0MjE2ODM3NDM5ZTg1Nzg0OGQwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ3MzRhNDk4YzlkMjQxMzdiOTIxNTYwMGIyMzRhNjIxLmJpbmRQb3B1cChwb3B1cF8zMDRlYTZjZmFhNDQ0NGE1YjcyMzY3MmU2OGUzNDg2YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YzNzY3YjU5YTgyNjRlYmFhMDkzYWNiZDU3ZmNmYzlmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3MzYxLCAtMy42MTYzNzA1MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjZlMTA2ZDE3OTYwNGFhOTllYmY1MTNlYzhmMzljNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTZhODcyYTk1MmU1NGVmMzk3ZThiZGNkYjljNzQxZWEgPSAkKGA8ZGl2IGlkPSJodG1sXzk2YTg3MmE5NTJlNTRlZjM5N2U4YmRjZGI5Yzc0MWVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzM2MSwgLTMuNjE2MzcwNTAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2ZTEwNmQxNzk2MDRhYTk5ZWJmNTEzZWM4ZjM5YzZiLnNldENvbnRlbnQoaHRtbF85NmE4NzJhOTUyZTU0ZWYzOTdlOGJkY2RiOWM3NDFlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YzNzY3YjU5YTgyNjRlYmFhMDkzYWNiZDU3ZmNmYzlmLmJpbmRQb3B1cChwb3B1cF8yNmUxMDZkMTc5NjA0YWE5OWViZjUxM2VjOGYzOWM2YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRkNDNhYjEzZjYwODQxZTZhODc0MjY2OTZiYWZhYTE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NDkxNTc2LCAtMy42OTYwMjU4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTIzODBiODczNzZiNDRiYjg0ZDBjNTQyYWZmZTE5YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTRhNjkzMTAwZjA2NGQzMmIyOGI5OGE3NDBjMmY2ZDAgPSAkKGA8ZGl2IGlkPSJodG1sX2E0YTY5MzEwMGYwNjRkMzJiMjhiOThhNzQwYzJmNmQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDQ5MTU3NiwgLTMuNjk2MDI1OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyMzgwYjg3Mzc2YjQ0YmI4NGQwYzU0MmFmZmUxOWEzLnNldENvbnRlbnQoaHRtbF9hNGE2OTMxMDBmMDY0ZDMyYjI4Yjk4YTc0MGMyZjZkMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRkNDNhYjEzZjYwODQxZTZhODc0MjY2OTZiYWZhYTE5LmJpbmRQb3B1cChwb3B1cF9lMjM4MGI4NzM3NmI0NGJiODRkMGM1NDJhZmZlMTlhMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3ZTIxYzE0YWNlZTQzN2RiZDZiMmJmNmE2ODQ2NTgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3Njg1OTk5OTk5OTUsIC0zLjYzMzIxNjRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZmJjY2IwMGVlOWI0MTI3YTJiYzQ0YTA1ZTY2ODhmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYThiZWJmZDI3NzA0MzY5Yjg4MWZjY2FkYjQxZDYzYSA9ICQoYDxkaXYgaWQ9Imh0bWxfZWE4YmViZmQyNzcwNDM2OWI4ODFmY2NhZGI0MWQ2M2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3Njg1OTk5OTk5OTUsIC0zLjYzMzIxNjRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZmJjY2IwMGVlOWI0MTI3YTJiYzQ0YTA1ZTY2ODhmMS5zZXRDb250ZW50KGh0bWxfZWE4YmViZmQyNzcwNDM2OWI4ODFmY2NhZGI0MWQ2M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mN2UyMWMxNGFjZWU0MzdkYmQ2YjJiZjZhNjg0NjU4MS5iaW5kUG9wdXAocG9wdXBfZWZiY2NiMDBlZTliNDEyN2EyYmM0NGEwNWU2Njg4ZjEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iNGYyYjFlZDE0MGE0YmZhYTQzZmFjMTYzZTdjYmZjNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNjM4Mzk5OTk5OTk0LCAtMy42NDUzNzIyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDExZGMzYzhiNDExNDk5NzkxODM3M2Q4MGM5ZjViM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmMzNTFjNzEzODBiNDlkM2EwNDJhMzliMzk4MTQ3MjggPSAkKGA8ZGl2IGlkPSJodG1sX2ZjMzUxYzcxMzgwYjQ5ZDNhMDQyYTM5YjM5ODE0NzI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjM4Mzk5OTk5OTk0LCAtMy42NDUzNzIyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDExZGMzYzhiNDExNDk5NzkxODM3M2Q4MGM5ZjViM2Yuc2V0Q29udGVudChodG1sX2ZjMzUxYzcxMzgwYjQ5ZDNhMDQyYTM5YjM5ODE0NzI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjRmMmIxZWQxNDBhNGJmYWE0M2ZhYzE2M2U3Y2JmYzcuYmluZFBvcHVwKHBvcHVwXzQxMWRjM2M4YjQxMTQ5OTc5MTgzNzNkODBjOWY1YjNmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDhmZjEzMzUxZjMyNDFkMWEwMWMxZTEwZmIyN2UwZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjAzNTM2MDIsIC02LjA3OTkwNTIwMDAwMDAwMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmMTQzNjQxMjFlZTQxMzRiOGFkZDZlYjY2NDFlODJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3ODNkYTMyODhlMDRlODk5Mjk1ZWRhYjdkOGJjODZjID0gJChgPGRpdiBpZD0iaHRtbF9kNzgzZGEzMjg4ZTA0ZTg5OTI5NWVkYWI3ZDhiYzg2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjAzNTM2MDIsIC02LjA3OTkwNTIwMDAwMDAwMV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmMTQzNjQxMjFlZTQxMzRiOGFkZDZlYjY2NDFlODJlLnNldENvbnRlbnQoaHRtbF9kNzgzZGEzMjg4ZTA0ZTg5OTI5NWVkYWI3ZDhiYzg2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ4ZmYxMzM1MWYzMjQxZDFhMDFjMWUxMGZiMjdlMGViLmJpbmRQb3B1cChwb3B1cF9mZjE0MzY0MTIxZWU0MTM0YjhhZGQ2ZWI2NjQxZTgyZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VkNDU0ZjAzY2UxZjQxYTNiMzMyYWYxNjYxMGUxZTg4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2Mzc4OTk5OTk5OTUsIC0zLjY0NTM2OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NTFjNmViMGU2NDY0ZDRlOGQ4Zjk3ZGY2YmUyN2JjYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjhiZmNhNGFlZGE0MWMxYmQ1N2RhN2Y5N2NhMDVhMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZDI4YmZjYTRhZWRhNDFjMWJkNTdkYTdmOTdjYTA1YTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2Mzc4OTk5OTk5OTUsIC0zLjY0NTM2OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTFjNmViMGU2NDY0ZDRlOGQ4Zjk3ZGY2YmUyN2JjYS5zZXRDb250ZW50KGh0bWxfZDI4YmZjYTRhZWRhNDFjMWJkNTdkYTdmOTdjYTA1YTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZDQ1NGYwM2NlMWY0MWEzYjMzMmFmMTY2MTBlMWU4OC5iaW5kUG9wdXAocG9wdXBfNTUxYzZlYjBlNjQ2NGQ0ZThkOGY5N2RmNmJlMjdiY2EpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wYmE0NzU3NDNkMzQ0YTE5OWEyMGMzNjgwYWY4ODU0YSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjMyNSwgLTMuNjQwNjg3Mzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3NWM2NWJiOWQ3YTRhZmJiN2NhMjk2YWVkZTFhM2MyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhNjk2ZTA1N2M1NTQ5ZGZhNTNkZTBlYzRhZWUzZTVmID0gJChgPGRpdiBpZD0iaHRtbF80YTY5NmUwNTdjNTU0OWRmYTUzZGUwZWM0YWVlM2U1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyOTIzMjUsIC0zLjY0MDY4NzM5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzVjNjViYjlkN2E0YWZiYjdjYTI5NmFlZGUxYTNjMi5zZXRDb250ZW50KGh0bWxfNGE2OTZlMDU3YzU1NDlkZmE1M2RlMGVjNGFlZTNlNWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYmE0NzU3NDNkMzQ0YTE5OWEyMGMzNjgwYWY4ODU0YS5iaW5kUG9wdXAocG9wdXBfODc1YzY1YmI5ZDdhNGFmYmI3Y2EyOTZhZWRlMWEzYzIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jMDg1YTgwNzg4ZTk0OTYzOTAzZGZjNTI1ZWE5ZTI3NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMDg4MDEwMTAwMDAwMDA1LCAtNS45ODM5ODAxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIxMTQwZGVhYWM1NDk3M2FmNTAzMTIyOTM3ZDZmZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmJiYThkY2Y0MzdjNDkyOWIwYTlhYWVjZDJmMDgyY2QgPSAkKGA8ZGl2IGlkPSJodG1sX2JiYmE4ZGNmNDM3YzQ5MjliMGE5YWFlY2QyZjA4MmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMDg4MDEwMTAwMDAwMDA1LCAtNS45ODM5ODAxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzIxMTQwZGVhYWM1NDk3M2FmNTAzMTIyOTM3ZDZmZjQuc2V0Q29udGVudChodG1sX2JiYmE4ZGNmNDM3YzQ5MjliMGE5YWFlY2QyZjA4MmNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzA4NWE4MDc4OGU5NDk2MzkwM2RmYzUyNWVhOWUyNzYuYmluZFBvcHVwKHBvcHVwXzMyMTE0MGRlYWFjNTQ5NzNhZjUwMzEyMjkzN2Q2ZmY0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjRmNTI3MmEwMTlmNDgyMDgwMmZiMjIyZTZhNTBlODQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNDUyMDMsIC0zLjY0NjE2NjFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzMzYzcxYzRhYzM0N2YwODUxZTJmNjNlNDlhOWE1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNTQxZDI0OGFjOWU0MWRlOTQyNWQzN2RkOTM0OGU0MiA9ICQoYDxkaXYgaWQ9Imh0bWxfYjU0MWQyNDhhYzllNDFkZTk0MjVkMzdkZDkzNDhlNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjQ1MjAzLCAtMy42NDYxNjYxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzczM2M3MWM0YWMzNDdmMDg1MWUyZjYzZTQ5YTlhNTIuc2V0Q29udGVudChodG1sX2I1NDFkMjQ4YWM5ZTQxZGU5NDI1ZDM3ZGQ5MzQ4ZTQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjRmNTI3MmEwMTlmNDgyMDgwMmZiMjIyZTZhNTBlODQuYmluZFBvcHVwKHBvcHVwXzM3MzNjNzFjNGFjMzQ3ZjA4NTFlMmY2M2U0OWE5YTUyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDZjMWU3YTE0Y2M4NDkyYTk0MWJiZDY0ZjExN2ZhZWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDU4ODYsIC0zLjc5OTEzMzNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDU3OWJmMDM1MWU0YTk3OTcyZTYwNzhmZDQ4NDc4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOWM3ZGE1NmFmMmQ0YmMzYjcyYjU4MGM2MGU4ZGUxNSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjljN2RhNTZhZjJkNGJjM2I3MmI1ODBjNjBlOGRlMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA1ODg2LCAtMy43OTkxMzMzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTA1NzliZjAzNTFlNGE5Nzk3MmU2MDc4ZmQ0ODQ3OGEuc2V0Q29udGVudChodG1sXzI5YzdkYTU2YWYyZDRiYzNiNzJiNTgwYzYwZThkZTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDZjMWU3YTE0Y2M4NDkyYTk0MWJiZDY0ZjExN2ZhZWMuYmluZFBvcHVwKHBvcHVwXzkwNTc5YmYwMzUxZTRhOTc5NzJlNjA3OGZkNDg0NzhhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzMwMDQ1MGQyYWM2NDM2ZWJkYjViZGFkODMxYjhkZDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjkxMzQsIC0zLjY0NzA3NThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGFiZDFjZjUwZDk0NDlkODZkMWE3YzdkZjRhYmE2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDI3NjE4MzA4MjA0N2VkYmMyYWE4OGY5OThiYjE0MSA9ICQoYDxkaXYgaWQ9Imh0bWxfNTAyNzYxODMwODIwNDdlZGJjMmFhODhmOTk4YmIxNDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MTM0LCAtMy42NDcwNzU4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThhYmQxY2Y1MGQ5NDQ5ZDg2ZDFhN2M3ZGY0YWJhNjYuc2V0Q29udGVudChodG1sXzUwMjc2MTgzMDgyMDQ3ZWRiYzJhYTg4Zjk5OGJiMTQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzMwMDQ1MGQyYWM2NDM2ZWJkYjViZGFkODMxYjhkZDQuYmluZFBvcHVwKHBvcHVwXzU4YWJkMWNmNTBkOTQ0OWQ4NmQxYTdjN2RmNGFiYTY2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZGMyYTY3ZjM4NDlkNGQ0YmE0NWViMzMzMDhkYzQyNzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI3NzIwMDAwMDAwNiwgLTMuNjI4NjE5OTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlMWI1ZDY1YjU2YjQyMTBhMzhjYjk0ZGUxN2FjYWYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxYWYxNjE0YzVmMDQ0YmFiZDhiYjI0NDczZjA5Yjc3ID0gJChgPGRpdiBpZD0iaHRtbF8wMWFmMTYxNGM1ZjA0NGJhYmQ4YmIyNDQ3M2YwOWI3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI3NzIwMDAwMDAwNiwgLTMuNjI4NjE5OTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlMWI1ZDY1YjU2YjQyMTBhMzhjYjk0ZGUxN2FjYWYxLnNldENvbnRlbnQoaHRtbF8wMWFmMTYxNGM1ZjA0NGJhYmQ4YmIyNDQ3M2YwOWI3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjMmE2N2YzODQ5ZDRkNGJhNDVlYjMzMzA4ZGM0Mjc3LmJpbmRQb3B1cChwb3B1cF83ZTFiNWQ2NWI1NmI0MjEwYTM4Y2I5NGRlMTdhY2FmMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRiYWRjODE3ZGE5ZjQzN2ZhYmUzNWVmM2FkNGJiODUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ3MzI3LCAtMy43MDA3ODQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Y3ZWFhNTQzMDA3NDM4ZDk4MzI0NTNlNTYyMGU3ZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjdjMzU1Nzk3OTEzNDNkNGE0NDg3ZDg3MTI3MmZjYzggPSAkKGA8ZGl2IGlkPSJodG1sX2I3YzM1NTc5NzkxMzQzZDRhNDQ4N2Q4NzEyNzJmY2M4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0NzMyNywgLTMuNzAwNzg0M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NmN2VhYTU0MzAwNzQzOGQ5ODMyNDUzZTU2MjBlN2RmLnNldENvbnRlbnQoaHRtbF9iN2MzNTU3OTc5MTM0M2Q0YTQ0ODdkODcxMjcyZmNjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRiYWRjODE3ZGE5ZjQzN2ZhYmUzNWVmM2FkNGJiODUyLmJpbmRQb3B1cChwb3B1cF9jZjdlYWE1NDMwMDc0MzhkOTgzMjQ1M2U1NjIwZTdkZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzc5YjdmYjkzY2JkZTQ1ODk5YjQ5NjM3MGU5MjUwZDhlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEyLCAtMy42NDA2OTU1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjU5ZDUxNjRlYzcxNGUzNWE5YTk2NDY2ZGI1ZjU1NGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmI4YjJiMjYzYzVmNDY1NGExZWNlNzE3MmJmZjYwZTkgPSAkKGA8ZGl2IGlkPSJodG1sX2ZiOGIyYjI2M2M1ZjQ2NTRhMWVjZTcxNzJiZmY2MGU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5MjQxMiwgLTMuNjQwNjk1NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1OWQ1MTY0ZWM3MTRlMzVhOWE5NjQ2NmRiNWY1NTRiLnNldENvbnRlbnQoaHRtbF9mYjhiMmIyNjNjNWY0NjU0YTFlY2U3MTcyYmZmNjBlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc5YjdmYjkzY2JkZTQ1ODk5YjQ5NjM3MGU5MjUwZDhlLmJpbmRQb3B1cChwb3B1cF9iNTlkNTE2NGVjNzE0ZTM1YTlhOTY0NjZkYjVmNTU0YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkzZWE5NzkxM2VkZjRhMTdhZjlhZjRmYzQ3YTJiOGEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0ODAxMDAwMDAwMDUsIC0zLjY0NjA2NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyYjI5MmY3ZDNkYzQzZjViZTIzNmMwOTgwZGI4ZDQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NmQyMWM5YmUzYjRlZjE5OTYzY2RhMDk4OThlNTE5ID0gJChgPGRpdiBpZD0iaHRtbF8zNzZkMjFjOWJlM2I0ZWYxOTk2M2NkYTA5ODk4ZTUxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ4MDEwMDAwMDAwNSwgLTMuNjQ2MDY1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJiMjkyZjdkM2RjNDNmNWJlMjM2YzA5ODBkYjhkNDEuc2V0Q29udGVudChodG1sXzM3NmQyMWM5YmUzYjRlZjE5OTYzY2RhMDk4OThlNTE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTNlYTk3OTEzZWRmNGExN2FmOWFmNGZjNDdhMmI4YTIuYmluZFBvcHVwKHBvcHVwXzQyYjI5MmY3ZDNkYzQzZjViZTIzNmMwOTgwZGI4ZDQxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmI2MTI5MmE5ZjRjNDkzOWFiNDIwMDA5YjA5MTg4YzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4ODUwMDAwMDAwNCwgLTMuNjQ1NTE5MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwMWUzYzdmNTE2NjRmMTU4ZWY2Y2Q5NzE1YmZiMjcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiMTZjMGUyMjUyMDQ5YmY5MTZjYjNlODMwMTBkODU2ID0gJChgPGRpdiBpZD0iaHRtbF83YjE2YzBlMjI1MjA0OWJmOTE2Y2IzZTgzMDEwZDg1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ4ODUwMDAwMDAwNCwgLTMuNjQ1NTE5MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwMWUzYzdmNTE2NjRmMTU4ZWY2Y2Q5NzE1YmZiMjcwLnNldENvbnRlbnQoaHRtbF83YjE2YzBlMjI1MjA0OWJmOTE2Y2IzZTgzMDEwZDg1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JiNjEyOTJhOWY0YzQ5MzlhYjQyMDAwOWIwOTE4OGM3LmJpbmRQb3B1cChwb3B1cF9jMDFlM2M3ZjUxNjY0ZjE1OGVmNmNkOTcxNWJmYjI3MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NiMmZiMDZmZjQ1MDQ0YWQ4YzY5NDVlOWY0YzkxZTQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkyNzU1LCAtMy42NjI4NTcxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThmYTFjNmJjOGQ1NDBlOGI3Mjg1YTE1OWVmNzQ5MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDUwYmZmMjc5NTA5NGZmZDk5NTkwY2NkOWY0YjJiZDYgPSAkKGA8ZGl2IGlkPSJodG1sXzA1MGJmZjI3OTUwOTRmZmQ5OTU5MGNjZDlmNGIyYmQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5Mjc1NSwgLTMuNjYyODU3MTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZmExYzZiYzhkNTQwZThiNzI4NWExNTllZjc0OTAzLnNldENvbnRlbnQoaHRtbF8wNTBiZmYyNzk1MDk0ZmZkOTk1OTBjY2Q5ZjRiMmJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiMmZiMDZmZjQ1MDQ0YWQ4YzY5NDVlOWY0YzkxZTQ3LmJpbmRQb3B1cChwb3B1cF85OGZhMWM2YmM4ZDU0MGU4YjcyODVhMTU5ZWY3NDkwMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzBjODlhMTE5YTkyMTRiYmE4Zjk1NDRiNWZmYzAyMDQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MzcyOTk5OTk5OTUsIC0zLjY0NTM3MjldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xM2QwMWVkMDlkOGU0NGE1OTI1MzM0MGM1OGEwNjc3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDg1YTY2MGIyYzI0MjEwODljMDYyMjY4YzdjYTA3MyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTA4NWE2NjBiMmMyNDIxMDg5YzA2MjI2OGM3Y2EwNzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2MzcyOTk5OTk5OTUsIC0zLjY0NTM3MjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xM2QwMWVkMDlkOGU0NGE1OTI1MzM0MGM1OGEwNjc3Zi5zZXRDb250ZW50KGh0bWxfZTA4NWE2NjBiMmMyNDIxMDg5YzA2MjI2OGM3Y2EwNzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYzg5YTExOWE5MjE0YmJhOGY5NTQ0YjVmZmMwMjA0NC5iaW5kUG9wdXAocG9wdXBfMTNkMDFlZDA5ZDhlNDRhNTkyNTMzNDBjNThhMDY3N2YpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl84ZjBjMzg0ZTRkMmU0NTBjOWU3YWVkZmFjYmU4NmY4YiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NTI3Mjk5OTk5OTk2LCAtMy42NDQ3NTk5MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDJiOTBlZjU0MjEyNDAwZDg2ZjVlMTA1ZmQ3YTgxOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjA5YjlhMGFmZGI0NDVhOTlhNWY0ZDk3NDdiZTgyMTQgPSAkKGA8ZGl2IGlkPSJodG1sXzIwOWI5YTBhZmRiNDQ1YTk5YTVmNGQ5NzQ3YmU4MjE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTI3Mjk5OTk5OTk2LCAtMy42NDQ3NTk5MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJiOTBlZjU0MjEyNDAwZDg2ZjVlMTA1ZmQ3YTgxOTkuc2V0Q29udGVudChodG1sXzIwOWI5YTBhZmRiNDQ1YTk5YTVmNGQ5NzQ3YmU4MjE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGYwYzM4NGU0ZDJlNDUwYzllN2FlZGZhY2JlODZmOGIuYmluZFBvcHVwKHBvcHVwXzAyYjkwZWY1NDIxMjQwMGQ4NmY1ZTEwNWZkN2E4MTk5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjBjMDljOGY0ZTZkNDgyNjg0ZmM0NzE4ODIwYjc3ODcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODU5NDYsIC0zLjY0NTgyMTEwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjc4MmI5NDM0Yzk0NzZhYTBhZDY2MmUyNDFjNWMyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDhlY2Y3ZjYxMTE0OWY2YmVkNWJlMDBlZWUwOTI4NSA9ICQoYDxkaXYgaWQ9Imh0bWxfNGQ4ZWNmN2Y2MTExNDlmNmJlZDViZTAwZWVlMDkyODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1OTQ2LCAtMy42NDU4MjExMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY3ODJiOTQzNGM5NDc2YWEwYWQ2NjJlMjQxYzVjMjQuc2V0Q29udGVudChodG1sXzRkOGVjZjdmNjExMTQ5ZjZiZWQ1YmUwMGVlZTA5Mjg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjBjMDljOGY0ZTZkNDgyNjg0ZmM0NzE4ODIwYjc3ODcuYmluZFBvcHVwKHBvcHVwXzA2NzgyYjk0MzRjOTQ3NmFhMGFkNjYyZTI0MWM1YzI0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjMxMmM4OTlhMTZiNDQ5Njk1OTAzM2RmMTRkMThkZjggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ5MDcsIC0zLjY0NTUxNzZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYmFhNzcwNDFkNjI0N2NmODYxZGVmNDhkNzQ2MzAyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMjYxMmVhMDFmYzM0MWVlOGVkM2RmYzg4Mzc0ZWQ1OSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzI2MTJlYTAxZmMzNDFlZThlZDNkZmM4ODM3NGVkNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA0OTA3LCAtMy42NDU1MTc2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJhYTc3MDQxZDYyNDdjZjg2MWRlZjQ4ZDc0NjMwMjkuc2V0Q29udGVudChodG1sX2MyNjEyZWEwMWZjMzQxZWU4ZWQzZGZjODgzNzRlZDU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjMxMmM4OTlhMTZiNDQ5Njk1OTAzM2RmMTRkMThkZjguYmluZFBvcHVwKHBvcHVwXzBiYWE3NzA0MWQ2MjQ3Y2Y4NjFkZWY0OGQ3NDYzMDI5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODllZDY2ZjM2ZTU3NGU1NmEwZjdiZTY5MjcyMTlhMjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDMzNzcwMDAwMDAwNSwgLTMuNjcyNzI1Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlZGFmMjE5NGM4MjRjMjU4MzQ4ZDY0Y2U4MDNlOGQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0YWQ1NThiMWZjZDQ1MjhiNGY4NDg4ODllNWZjYTRmID0gJChgPGRpdiBpZD0iaHRtbF8yNGFkNTU4YjFmY2Q0NTI4YjRmODQ4ODg5ZTVmY2E0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDMzNzcwMDAwMDAwNSwgLTMuNjcyNzI1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlZGFmMjE5NGM4MjRjMjU4MzQ4ZDY0Y2U4MDNlOGQwLnNldENvbnRlbnQoaHRtbF8yNGFkNTU4YjFmY2Q0NTI4YjRmODQ4ODg5ZTVmY2E0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg5ZWQ2NmYzNmU1NzRlNTZhMGY3YmU2OTI3MjE5YTIwLmJpbmRQb3B1cChwb3B1cF9kZWRhZjIxOTRjODI0YzI1ODM0OGQ2NGNlODAzZThkMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdmYzQzYWU0MWJkMDQ4MTRiYWYyYmEzMTNlMjU2NDc0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkyNjM2LCAtMy42MzUyODAzOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWYyZTQzZjI3MTE4NDEzMjhhOGVmZDFlZjgzMDhmZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM4ODcxOTA5NmZiNDRiMTkxOWQ0MGM3NmYyMDc5N2YgPSAkKGA8ZGl2IGlkPSJodG1sX2EzODg3MTkwOTZmYjQ0YjE5MTlkNDBjNzZmMjA3OTdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MjYzNiwgLTMuNjM1MjgwMzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmMmU0M2YyNzExODQxMzI4YThlZmQxZWY4MzA4ZmU2LnNldENvbnRlbnQoaHRtbF9hMzg4NzE5MDk2ZmI0NGIxOTE5ZDQwYzc2ZjIwNzk3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdmYzQzYWU0MWJkMDQ4MTRiYWYyYmEzMTNlMjU2NDc0LmJpbmRQb3B1cChwb3B1cF8xZjJlNDNmMjcxMTg0MTMyOGE4ZWZkMWVmODMwOGZlNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFiNTQ5NTQ0NWViOTQ2ZDRiY2QyOGQxNDA2MDRjZTdmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3NjY4LCAtMy42MTYyNTU1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzg0ZTBlMDIwMmY1NDFlZjlhNzBmNTI1YTZmYmFhNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM3MWJjZDkwNzllNDEyMDgxMDQ3ZGNkY2Y0MDRiOTkgPSAkKGA8ZGl2IGlkPSJodG1sXzAzNzFiY2Q5MDc5ZTQxMjA4MTA0N2RjZGNmNDA0Yjk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzY2OCwgLTMuNjE2MjU1NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4NGUwZTAyMDJmNTQxZWY5YTcwZjUyNWE2ZmJhYTVlLnNldENvbnRlbnQoaHRtbF8wMzcxYmNkOTA3OWU0MTIwODEwNDdkY2RjZjQwNGI5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFiNTQ5NTQ0NWViOTQ2ZDRiY2QyOGQxNDA2MDRjZTdmLmJpbmRQb3B1cChwb3B1cF83ODRlMGUwMjAyZjU0MWVmOWE3MGY1MjVhNmZiYWE1ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzg2Yzc0MGQ2YjVjZjQ4NWE4YjhiNDYyOGM1N2YzMmViID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MzI3MDAwMDAwMDUsIC0zLjY0NTM2OTk5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NzUwZjFjYzE3Zjk0ZTFkODhjOGFhYmY3ZGNlZmQwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mY2E2NDRjODQzMjQ0ZTFiOTljN2NhZjgwNDYwNmMxMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZmNhNjQ0Yzg0MzI0NGUxYjk5YzdjYWY4MDQ2MDZjMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2MzI3MDAwMDAwMDUsIC0zLjY0NTM2OTk5OTk5OTk5OThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NzUwZjFjYzE3Zjk0ZTFkODhjOGFhYmY3ZGNlZmQwMi5zZXRDb250ZW50KGh0bWxfZmNhNjQ0Yzg0MzI0NGUxYjk5YzdjYWY4MDQ2MDZjMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NmM3NDBkNmI1Y2Y0ODVhOGI4YjQ2MjhjNTdmMzJlYi5iaW5kUG9wdXAocG9wdXBfOTc1MGYxY2MxN2Y5NGUxZDg4YzhhYWJmN2RjZWZkMDIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iOWU4ZjkyNjM0MDM0MDMwYTU2Y2M2YzAxYjBjNDhlNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE0OTY2NywgLTMuNjE0NzY4Nzk5OTk5OTk5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjYzM3YjRiOTc0MTRhYzhhYWRmNmJjZmJiYjRmMDkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiMDYyNWIyMjQxODQxMDZiMjMxNDE0NjE3ZWIxZTE5ID0gJChgPGRpdiBpZD0iaHRtbF8xYjA2MjViMjI0MTg0MTA2YjIzMTQxNDYxN2ViMWUxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNDk2NjcsIC0zLjYxNDc2ODc5OTk5OTk5OTNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mY2MzN2I0Yjk3NDE0YWM4YWFkZjZiY2ZiYmI0ZjA5MC5zZXRDb250ZW50KGh0bWxfMWIwNjI1YjIyNDE4NDEwNmIyMzE0MTQ2MTdlYjFlMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iOWU4ZjkyNjM0MDM0MDMwYTU2Y2M2YzAxYjBjNDhlNy5iaW5kUG9wdXAocG9wdXBfZmNjMzdiNGI5NzQxNGFjOGFhZGY2YmNmYmJiNGYwOTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yNmQ5MGNiYWM4Zjk0ODNmOWYwNTBlNDJhZDhiZGI5ZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjQsIC0zLjY0MDY3NjYwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MmY1Y2Y4N2M5YTU0Zjc0ODA4NjJhYWJiODc3MzIyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmY4M2NjZmU2Nzc0YzE5OGM1MTYxYTJkOTkwZDQ5YyA9ICQoYDxkaXYgaWQ9Imh0bWxfZWJmODNjY2ZlNjc3NGMxOThjNTE2MWEyZDk5MGQ0OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNCwgLTMuNjQwNjc2NjAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyZjVjZjg3YzlhNTRmNzQ4MDg2MmFhYmI4NzczMjIyLnNldENvbnRlbnQoaHRtbF9lYmY4M2NjZmU2Nzc0YzE5OGM1MTYxYTJkOTkwZDQ5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI2ZDkwY2JhYzhmOTQ4M2Y5ZjA1MGU0MmFkOGJkYjlmLmJpbmRQb3B1cChwb3B1cF81MmY1Y2Y4N2M5YTU0Zjc0ODA4NjJhYWJiODc3MzIyMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2JlMWFjODAwMDlmNDQwZjdhZTYzODlmMjFmODMzMGVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjQ2MzM2LCAtMy42Mjk4MDE3OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQyOThkODVhNDY2NGJkNzgwYTRjZDFkMDI4OGQ3NjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2QzOGEyNDEyMGEzNGM3NmI5OGM3NTJlMDlmOTY4N2UgPSAkKGA8ZGl2IGlkPSJodG1sX2NkMzhhMjQxMjBhMzRjNzZiOThjNzUyZTA5Zjk2ODdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDI0NjMzNiwgLTMuNjI5ODAxNzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0Mjk4ZDg1YTQ2NjRiZDc4MGE0Y2QxZDAyODhkNzY2LnNldENvbnRlbnQoaHRtbF9jZDM4YTI0MTIwYTM0Yzc2Yjk4Yzc1MmUwOWY5Njg3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JlMWFjODAwMDlmNDQwZjdhZTYzODlmMjFmODMzMGVlLmJpbmRQb3B1cChwb3B1cF9mNDI5OGQ4NWE0NjY0YmQ3ODBhNGNkMWQwMjg4ZDc2NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzZhOTBlMDY5MjJjMTRhOTY5ZjM4ZDY0NTkwZGFlZmExID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ2OTU5LCAtMy43MDEyNDY0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODRjYzVlNDEyY2IzNGU0Mjk5MDNlNDEzYzhhNjI4Y2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWY3NDRlNDE1ZjI1NDA0ZWFiZDRjN2FkNDQ0ODJmZmQgPSAkKGA8ZGl2IGlkPSJodG1sXzVmNzQ0ZTQxNWYyNTQwNGVhYmQ0YzdhZDQ0NDgyZmZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0Njk1OSwgLTMuNzAxMjQ2NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0Y2M1ZTQxMmNiMzRlNDI5OTAzZTQxM2M4YTYyOGNjLnNldENvbnRlbnQoaHRtbF81Zjc0NGU0MTVmMjU0MDRlYWJkNGM3YWQ0NDQ4MmZmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZhOTBlMDY5MjJjMTRhOTY5ZjM4ZDY0NTkwZGFlZmExLmJpbmRQb3B1cChwb3B1cF84NGNjNWU0MTJjYjM0ZTQyOTkwM2U0MTNjOGE2MjhjYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RlNmNjNzNhNDk2OTQ4NmU5Mzg5NzJmYjI1ZTI1NmNkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MTgxMTk4LCAtMy42NDM4MTI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmE4ZGMzODZiNDhhNGEyZmFhOGEwNjUyZjEwMGRhNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjI5MTIwNjlkOTE2NGIwZmFjMjJmMDZiNGI5NTMzMzkgPSAkKGA8ZGl2IGlkPSJodG1sX2YyOTEyMDY5ZDkxNjRiMGZhYzIyZjA2YjRiOTUzMzM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE4MTE5OCwgLTMuNjQzODEyOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhOGRjMzg2YjQ4YTRhMmZhYThhMDY1MmYxMDBkYTRhLnNldENvbnRlbnQoaHRtbF9mMjkxMjA2OWQ5MTY0YjBmYWMyMmYwNmI0Yjk1MzMzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RlNmNjNzNhNDk2OTQ4NmU5Mzg5NzJmYjI1ZTI1NmNkLmJpbmRQb3B1cChwb3B1cF9mYThkYzM4NmI0OGE0YTJmYWE4YTA2NTJmMTAwZGE0YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRiOWE2NDg0YjI0YzRhNmU4NDk1Mzk2ZmVmNDIxNDdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTQ1NzEsIC0zLjYwODQ2MTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZmQzMzMyYmNmZmU0NTRhOGQ5YjY0Mzk5ODAzMjI3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMzZlODBlNjdkZTI0OTY4YjI2ZGEyNmUzYjMzOTY5OSA9ICQoYDxkaXYgaWQ9Imh0bWxfMzM2ZTgwZTY3ZGUyNDk2OGIyNmRhMjZlM2IzMzk2OTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NTQ1NzEsIC0zLjYwODQ2MTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZmQzMzMyYmNmZmU0NTRhOGQ5YjY0Mzk5ODAzMjI3NC5zZXRDb250ZW50KGh0bWxfMzM2ZTgwZTY3ZGUyNDk2OGIyNmRhMjZlM2IzMzk2OTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YjlhNjQ4NGIyNGM0YTZlODQ5NTM5NmZlZjQyMTQ3Yy5iaW5kUG9wdXAocG9wdXBfOWZkMzMzMmJjZmZlNDU0YThkOWI2NDM5OTgwMzIyNzQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80NGJlNzE2Nzc5MmI0NDNmYmEzNjIxNzFiNjJlNmRhNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NjI2NzAwMDAwMDEsIC0zLjY0MDM4Njg5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NTEzZmM3ZjIwY2M0NjBlYTQ4Y2FjMjE2NTcyZGU0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NDhkMGVmMzBiMzY0MGU1OGEwZTJjNjY3NTZmODYzYSA9ICQoYDxkaXYgaWQ9Imh0bWxfOTQ4ZDBlZjMwYjM2NDBlNThhMGUyYzY2NzU2Zjg2M2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY2MjY3MDAwMDAwMSwgLTMuNjQwMzg2ODk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1MTNmYzdmMjBjYzQ2MGVhNDhjYWMyMTY1NzJkZTQ5LnNldENvbnRlbnQoaHRtbF85NDhkMGVmMzBiMzY0MGU1OGEwZTJjNjY3NTZmODYzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ0YmU3MTY3NzkyYjQ0M2ZiYTM2MjE3MWI2MmU2ZGE1LmJpbmRQb3B1cChwb3B1cF82NTEzZmM3ZjIwY2M0NjBlYTQ4Y2FjMjE2NTcyZGU0OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RmNTUwNDE5MTMzMzRkYTE5MGExZmZkMGI3NjRiNjJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjUyODc3MDAwMDAwMSwgLTMuNjQ1NTk3OV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhZDU1ODlmZDJhNDRhMzFiZjcxOWE2NDdhMWQ2OGMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlZTFhNTQzMzNmZDQzZDA5MmQ2YTQ4OTNiM2Y0MzQzID0gJChgPGRpdiBpZD0iaHRtbF80ZWUxYTU0MzMzZmQ0M2QwOTJkNmE0ODkzYjNmNDM0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNTI4NzcwMDAwMDAxLCAtMy42NDU1OTc5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWFkNTU4OWZkMmE0NGEzMWJmNzE5YTY0N2ExZDY4YzAuc2V0Q29udGVudChodG1sXzRlZTFhNTQzMzNmZDQzZDA5MmQ2YTQ4OTNiM2Y0MzQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGY1NTA0MTkxMzMzNGRhMTkwYTFmZmQwYjc2NGI2MmIuYmluZFBvcHVwKHBvcHVwXzFhZDU1ODlmZDJhNDRhMzFiZjcxOWE2NDdhMWQ2OGMwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzkwMjIzNjZiM2VmNDE3YjgzNzBiNmJiMGQwNGQ3NGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNTQ0OTcsIC0zLjY0NDY3MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWVlMWVlMzQwYTg0ODk0ODIyM2M5YjU5YWMyMDAwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NDA5ZWEwMTQyMjQ0ZTYzYWQ5MDZiNGZmODViMjdiMSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDQwOWVhMDE0MjI0NGU2M2FkOTA2YjRmZjg1YjI3YjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjU0NDk3LCAtMy42NDQ2NzE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDVlZTFlZTM0MGE4NDg5NDgyMjNjOWI1OWFjMjAwMGIuc2V0Q29udGVudChodG1sXzQ0MDllYTAxNDIyNDRlNjNhZDkwNmI0ZmY4NWIyN2IxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzkwMjIzNjZiM2VmNDE3YjgzNzBiNmJiMGQwNGQ3NGYuYmluZFBvcHVwKHBvcHVwXzA1ZWUxZWUzNDBhODQ4OTQ4MjIzYzliNTlhYzIwMDBiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjhjN2Q0MjcwOTk5NDUxZTg2N2RiM2YxMTAwYjMwM2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0MDA5Mzc5OTk5OTk5NCwgLTMuNjI4MzI2N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjNGRmMWQ5ZjUxYzQxODg5MTBiNDQ4NTdiMzJkNWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5ZTg5MDcxMGIwMjQ3Y2NhNGM0YzE3ZjhmNDU0MTU2ID0gJChgPGRpdiBpZD0iaHRtbF80OWU4OTA3MTBiMDI0N2NjYTRjNGMxN2Y4ZjQ1NDE1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjU0MDA5Mzc5OTk5OTk5NCwgLTMuNjI4MzI2N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjNGRmMWQ5ZjUxYzQxODg5MTBiNDQ4NTdiMzJkNWViLnNldENvbnRlbnQoaHRtbF80OWU4OTA3MTBiMDI0N2NjYTRjNGMxN2Y4ZjQ1NDE1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y4YzdkNDI3MDk5OTQ1MWU4NjdkYjNmMTEwMGIzMDNiLmJpbmRQb3B1cChwb3B1cF9iYzRkZjFkOWY1MWM0MTg4OTEwYjQ0ODU3YjMyZDVlYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzU4NTYwNzAyYWMyYTRmNjk5NmZmOGEwMzI1NWIwNjY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY1Mzk0LCAtMy42NDQwOTQxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQxYWI0ZGNkZTI5NGQzMmExYTRjZWUzZmI4NjRhNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjcyYzQxZGJkOTBjNDExNWFiMTdmNmRjMWU1ZTVhZWUgPSAkKGA8ZGl2IGlkPSJodG1sX2Y3MmM0MWRiZDkwYzQxMTVhYjE3ZjZkYzFlNWU1YWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NTM5NCwgLTMuNjQ0MDk0MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlkMWFiNGRjZGUyOTRkMzJhMWE0Y2VlM2ZiODY0YTVkLnNldENvbnRlbnQoaHRtbF9mNzJjNDFkYmQ5MGM0MTE1YWIxN2Y2ZGMxZTVlNWFlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU4NTYwNzAyYWMyYTRmNjk5NmZmOGEwMzI1NWIwNjY2LmJpbmRQb3B1cChwb3B1cF85ZDFhYjRkY2RlMjk0ZDMyYTFhNGNlZTNmYjg2NGE1ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ2ZjRmNmMzNTMxZDQ1NTRiNTliOGNmZWM3OTg1NzJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NTU4LCAtMy42NDYxMzM1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjcxZWUzYTRhZGQ3NGNkZjk2NTc2OTllOTg2MGQ5YjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGY3MTdkOWFiOTlkNGVmYTgwYTZhMjA3ZjVkZDU3N2MgPSAkKGA8ZGl2IGlkPSJodG1sX2RmNzE3ZDlhYjk5ZDRlZmE4MGE2YTIwN2Y1ZGQ1NzdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDU1OCwgLTMuNjQ2MTMzNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3MWVlM2E0YWRkNzRjZGY5NjU3Njk5ZTk4NjBkOWI5LnNldENvbnRlbnQoaHRtbF9kZjcxN2Q5YWI5OWQ0ZWZhODBhNmEyMDdmNWRkNTc3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ2ZjRmNmMzNTMxZDQ1NTRiNTliOGNmZWM3OTg1NzJmLmJpbmRQb3B1cChwb3B1cF8yNzFlZTNhNGFkZDc0Y2RmOTY1NzY5OWU5ODYwZDliOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzVhYTMzYTQ4MWExNzQ2MzZiOTFhOGI5YjBkZjdmYzUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzY4NjE2LCAtMy42MTc4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1N2NlZGUzY2M1OTQxZjhhYWVjYWE0MGU1NzdhZDlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1NzlhZTNhMThkZDQyNzA5MzJlMmE2Y2FkNmJhOGU0ID0gJChgPGRpdiBpZD0iaHRtbF9hNTc5YWUzYTE4ZGQ0MjcwOTMyZTJhNmNhZDZiYThlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzNjg2MTYsIC0zLjYxNzg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTU3Y2VkZTNjYzU5NDFmOGFhZWNhYTQwZTU3N2FkOWEuc2V0Q29udGVudChodG1sX2E1NzlhZTNhMThkZDQyNzA5MzJlMmE2Y2FkNmJhOGU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWFhMzNhNDgxYTE3NDYzNmI5MWE4YjliMGRmN2ZjNTMuYmluZFBvcHVwKHBvcHVwX2E1N2NlZGUzY2M1OTQxZjhhYWVjYWE0MGU1NzdhZDlhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjdmYjk4Yjg3OTljNDQwNWI5YTQwM2Y5MGY3MTBhYjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4ODg5OTk5OTk5NSwgLTMuNjQ1NTE4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFmYjllZjE3ZDliNGZhMGIxOTQzNzIyMjM5NGE0YzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBlNWI1MjI0NjYzNDk1OWExZTdiNDI4M2I4ODU3Y2IgPSAkKGA8ZGl2IGlkPSJodG1sXzcwZTViNTIyNDY2MzQ5NTlhMWU3YjQyODNiODg1N2NiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg4ODk5OTk5OTk1LCAtMy42NDU1MThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMWZiOWVmMTdkOWI0ZmEwYjE5NDM3MjIyMzk0YTRjNy5zZXRDb250ZW50KGh0bWxfNzBlNWI1MjI0NjYzNDk1OWExZTdiNDI4M2I4ODU3Y2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yN2ZiOThiODc5OWM0NDA1YjlhNDAzZjkwZjcxMGFiNi5iaW5kUG9wdXAocG9wdXBfYzFmYjllZjE3ZDliNGZhMGIxOTQzNzIyMjM5NGE0YzcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl84MWQyMGY5NTliZDM0ZDFkOTAxNzJjNmZhNGU1MzMyMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDkwNywgLTMuNjQ1NTMyNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjMzY0MTJhMDA3MjQwYThiMGNlMmNhNzc4ZjdlYWQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmMDc0OWIzYWYzODQ0MmRhMTdiOGVhYzVmNWViYTUxID0gJChgPGRpdiBpZD0iaHRtbF8xZjA3NDliM2FmMzg0NDJkYTE3YjhlYWM1ZjVlYmE1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ5MDcsIC0zLjY0NTUzMjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzM2NDEyYTAwNzI0MGE4YjBjZTJjYTc3OGY3ZWFkOC5zZXRDb250ZW50KGh0bWxfMWYwNzQ5YjNhZjM4NDQyZGExN2I4ZWFjNWY1ZWJhNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MWQyMGY5NTliZDM0ZDFkOTAxNzJjNmZhNGU1MzMyMS5iaW5kUG9wdXAocG9wdXBfN2MzNjQxMmEwMDcyNDBhOGIwY2UyY2E3NzhmN2VhZDgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yYjVlZjc5ZWI5YzU0ZmQzYmFhNzVkOThjNWRiNTQxYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIwODAyLCAtMy42MzMxMzczXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM0OGQ5NDJlMDFjNGFlMGI3ZDJlZjMwNzEzYzI0ODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWIzZGU1MWZmMGZmNDA3ZmJjZDc3NDhmMmUwODNkMDUgPSAkKGA8ZGl2IGlkPSJodG1sXzliM2RlNTFmZjBmZjQwN2ZiY2Q3NzQ4ZjJlMDgzZDA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwODAyLCAtMy42MzMxMzczXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM0OGQ5NDJlMDFjNGFlMGI3ZDJlZjMwNzEzYzI0ODAuc2V0Q29udGVudChodG1sXzliM2RlNTFmZjBmZjQwN2ZiY2Q3NzQ4ZjJlMDgzZDA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmI1ZWY3OWViOWM1NGZkM2JhYTc1ZDk4YzVkYjU0MWMuYmluZFBvcHVwKHBvcHVwXzEzNDhkOTQyZTAxYzRhZTBiN2QyZWYzMDcxM2MyNDgwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODZjZGQxODk1OGQyNDZmMTg3N2FkOTg0NDEzNTkxMTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQzMzE2MTYwMDAwMDAwNSwgLTMuNjM0NjUwOV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiNzg2YjFlOThlZjRhY2ZiYTUxMGU2YWI2OGI3ZDY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE4ZTlhZDVjNDEwZTQ4OWM4Y2M1NjI1Y2FjNGRkNGMxID0gJChgPGRpdiBpZD0iaHRtbF8xOGU5YWQ1YzQxMGU0ODljOGNjNTYyNWNhYzRkZDRjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQzMzE2MTYwMDAwMDAwNSwgLTMuNjM0NjUwOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiNzg2YjFlOThlZjRhY2ZiYTUxMGU2YWI2OGI3ZDY1LnNldENvbnRlbnQoaHRtbF8xOGU5YWQ1YzQxMGU0ODljOGNjNTYyNWNhYzRkZDRjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg2Y2RkMTg5NThkMjQ2ZjE4NzdhZDk4NDQxMzU5MTE3LmJpbmRQb3B1cChwb3B1cF9kYjc4NmIxZTk4ZWY0YWNmYmE1MTBlNmFiNjhiN2Q2NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNlZTVkYjdkM2I2MzRiZGFhMzdkMjg5MDcyNDA5OGE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0ODA0LCAtMy42NDYwNTQwOTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU2MmRkNDQzZTYzNDAxMWE2ZjgyZmNiMDEzYmMwYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI0NzI3NmY4NmU3NDE4ZWI3YzY0NDAwZWVkZmY5NjcgPSAkKGA8ZGl2IGlkPSJodG1sXzhiNDcyNzZmODZlNzQxOGViN2M2NDQwMGVlZGZmOTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDgwNCwgLTMuNjQ2MDU0MDk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1NjJkZDQ0M2U2MzQwMTFhNmY4MmZjYjAxM2JjMGExLnNldENvbnRlbnQoaHRtbF84YjQ3Mjc2Zjg2ZTc0MThlYjdjNjQ0MDBlZWRmZjk2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNlZTVkYjdkM2I2MzRiZGFhMzdkMjg5MDcyNDA5OGE3LmJpbmRQb3B1cChwb3B1cF80NTYyZGQ0NDNlNjM0MDExYTZmODJmY2IwMTNiYzBhMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2ZiOGQ3YjVhOTZjMTQwNDdiMGRhZTkxYjA2ODVlYjNlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3NTI2LCAtMy42MTYyOTc3OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU1NTg2MzU3NDYzNGMyM2I1YThlNDdkZTRhNTJiNjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDcwYTkwNmU1YjI3NGE5MzllY2Y0NTAxNjQ3YjhmZGQgPSAkKGA8ZGl2IGlkPSJodG1sX2Q3MGE5MDZlNWIyNzRhOTM5ZWNmNDUwMTY0N2I4ZmRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzUyNiwgLTMuNjE2Mjk3Nzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NTU4NjM1NzQ2MzRjMjNiNWE4ZTQ3ZGU0YTUyYjYwLnNldENvbnRlbnQoaHRtbF9kNzBhOTA2ZTViMjc0YTkzOWVjZjQ1MDE2NDdiOGZkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZiOGQ3YjVhOTZjMTQwNDdiMGRhZTkxYjA2ODVlYjNlLmJpbmRQb3B1cChwb3B1cF8xNTU1ODYzNTc0NjM0YzIzYjVhOGU0N2RlNGE1MmI2MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRhZjg4YzA4ZDQzMDQ2ZGE4NjYzZWZhOGExN2U5MmMwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc1NzAzLCAtMy42NDQ3MTg3MDAwMDAwMDA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzFkMTMwNjM2MDZjNDZkYmIyZTkyMTYzMzM1NWFmZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWFkZmU5YmI5ZTAxNDMwN2EyNzBlMjhiZjI0NmI1NDAgPSAkKGA8ZGl2IGlkPSJodG1sXzlhZGZlOWJiOWUwMTQzMDdhMjcwZTI4YmYyNDZiNTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTcwMywgLTMuNjQ0NzE4NzAwMDAwMDAwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxZDEzMDYzNjA2YzQ2ZGJiMmU5MjE2MzMzNTVhZmY0LnNldENvbnRlbnQoaHRtbF85YWRmZTliYjllMDE0MzA3YTI3MGUyOGJmMjQ2YjU0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRhZjg4YzA4ZDQzMDQ2ZGE4NjYzZWZhOGExN2U5MmMwLmJpbmRQb3B1cChwb3B1cF8zMWQxMzA2MzYwNmM0NmRiYjJlOTIxNjMzMzU1YWZmNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNlMjRkZDA2MmYxMDRhMTliNTE0ZTlhNjZjNmEyMGQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MTcyMTU3LCAtMy42NTQ1MzkyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkxNzllM2VlNTFkNDkxMjhjOTEyZjY3ZDZiOTgzZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzIwN2ViNDdkYjE4NGU3Yzg1MTkzZTQ3ZjQyMGEwN2IgPSAkKGA8ZGl2IGlkPSJodG1sXzMyMDdlYjQ3ZGIxODRlN2M4NTE5M2U0N2Y0MjBhMDdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE3MjE1NywgLTMuNjU0NTM5Ml08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5MTc5ZTNlZTUxZDQ5MTI4YzkxMmY2N2Q2Yjk4M2RmLnNldENvbnRlbnQoaHRtbF8zMjA3ZWI0N2RiMTg0ZTdjODUxOTNlNDdmNDIwYTA3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNlMjRkZDA2MmYxMDRhMTliNTE0ZTlhNjZjNmEyMGQxLmJpbmRQb3B1cChwb3B1cF9lOTE3OWUzZWU1MWQ0OTEyOGM5MTJmNjdkNmI5ODNkZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YwOGRmY2NjZjE0YjRhM2M5OWFhOGJiYzBiMzkyYjlhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjQ2MjM5LCAtMy42NDYxODQzMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODJlMjQ0OWM1OTAwNGVkNjg5NTA1ZWIxZGE4OTg0ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTYyZDM2OTNhOWU3NGMxZmJiNWFjMzA1MThmYWZiNDggPSAkKGA8ZGl2IGlkPSJodG1sXzE2MmQzNjkzYTllNzRjMWZiYjVhYzMwNTE4ZmFmYjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0NjIzOSwgLTMuNjQ2MTg0MzAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyZTI0NDljNTkwMDRlZDY4OTUwNWViMWRhODk4NGYxLnNldENvbnRlbnQoaHRtbF8xNjJkMzY5M2E5ZTc0YzFmYmI1YWMzMDUxOGZhZmI0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YwOGRmY2NjZjE0YjRhM2M5OWFhOGJiYzBiMzkyYjlhLmJpbmRQb3B1cChwb3B1cF84MmUyNDQ5YzU5MDA0ZWQ2ODk1MDVlYjFkYTg5ODRmMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzU4MDI1ZGE3ZmRlMTQwZTFhNjdlOWUyYzI0ZDUzZjYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzNDIxLCAtMy42MzU3MTI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmU5NzkzODk3YjEzNDNlNDhiZTU0MGQxZTU0OTNkMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTEyZDRhNzA0NDUxNDZhYWExZTBkNGNhYmI5ZmUwMjUgPSAkKGA8ZGl2IGlkPSJodG1sXzkxMmQ0YTcwNDQ1MTQ2YWFhMWUwZDRjYWJiOWZlMDI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MzQyMSwgLTMuNjM1NzEyOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlOTc5Mzg5N2IxMzQzZTQ4YmU1NDBkMWU1NDkzZDI3LnNldENvbnRlbnQoaHRtbF85MTJkNGE3MDQ0NTE0NmFhYTFlMGQ0Y2FiYjlmZTAyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU4MDI1ZGE3ZmRlMTQwZTFhNjdlOWUyYzI0ZDUzZjYyLmJpbmRQb3B1cChwb3B1cF8yZTk3OTM4OTdiMTM0M2U0OGJlNTQwZDFlNTQ5M2QyNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA2MjA1MTU1ZTQxNDQxYTk5NzBmNWZiNjBlZDlhNjU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTUyNjI3MDAwMDAwMSwgLTMuNjUxMTU4NDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmNjAzZjhlYzIwZjRkNjhhMzM3ZDA4NjRiYzBlMDc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwMWNhMzU3OWRiYTRlZmRiYzgyNTU0ZjViMTY1YWIxID0gJChgPGRpdiBpZD0iaHRtbF80MDFjYTM1NzlkYmE0ZWZkYmM4MjU1NGY1YjE2NWFiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTI2MjcwMDAwMDAxLCAtMy42NTExNTg0MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y2MDNmOGVjMjBmNGQ2OGEzMzdkMDg2NGJjMGUwNzcuc2V0Q29udGVudChodG1sXzQwMWNhMzU3OWRiYTRlZmRiYzgyNTU0ZjViMTY1YWIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDYyMDUxNTVlNDE0NDFhOTk3MGY1ZmI2MGVkOWE2NTguYmluZFBvcHVwKHBvcHVwX2NmNjAzZjhlYzIwZjRkNjhhMzM3ZDA4NjRiYzBlMDc3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDFhOTRhYTU3Y2RjNDA4ZWI2ODVhNmQyMGZlZjdjMjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0NTcyNzgsIC0zLjY0MzczODFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjk2YzFhNDdlYTc0NDBiYjhjM2U3NjRlMjkyMWNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjMyZmY3ZDEwYjQ0YmY5OGFmNmU4M2QwMTFkNGM1MyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTIzMmZmN2QxMGI0NGJmOThhZjZlODNkMDExZDRjNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDU3Mjc4LCAtMy42NDM3MzgxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY5NmMxYTQ3ZWE3NDQwYmI4YzNlNzY0ZTI5MjFjZWQuc2V0Q29udGVudChodG1sX2UyMzJmZjdkMTBiNDRiZjk4YWY2ZTgzZDAxMWQ0YzUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDFhOTRhYTU3Y2RjNDA4ZWI2ODVhNmQyMGZlZjdjMjIuYmluZFBvcHVwKHBvcHVwXzA2OTZjMWE0N2VhNzQ0MGJiOGMzZTc2NGUyOTIxY2VkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNzM5NmY2NDllMDNlNDlhOGJlZDlhNTU1MWU5ZGIxNGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDYyNDcwMDAwMDAwNCwgLTMuNjQ1MzczNzk5OTk5OTk5OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmNmFlMWFlNTA5NjQyZWM5NzdmNmMxOTIzMjdlNGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhMjNhYTZhN2I5YzQ5Y2E5ZDE5NGMwNTg0Nzk2YTQ5ID0gJChgPGRpdiBpZD0iaHRtbF9mYTIzYWE2YTdiOWM0OWNhOWQxOTRjMDU4NDc5NmE0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDYyNDcwMDAwMDAwNCwgLTMuNjQ1MzczNzk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmNmFlMWFlNTA5NjQyZWM5NzdmNmMxOTIzMjdlNGRlLnNldENvbnRlbnQoaHRtbF9mYTIzYWE2YTdiOWM0OWNhOWQxOTRjMDU4NDc5NmE0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzczOTZmNjQ5ZTAzZTQ5YThiZWQ5YTU1NTFlOWRiMTRmLmJpbmRQb3B1cChwb3B1cF9kZjZhZTFhZTUwOTY0MmVjOTc3ZjZjMTkyMzI3ZTRkZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2EyZDQ3ZTgzNjIyNDQ4NTg4YzBjODg3MjlmOWEzMGY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzMDgxLCAtMy42MzUyNDEzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWY0MDU1YTVmMjI5NDE0OThhOTAyMDgzZWU5YjkxODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTY0YTBjM2UxOTI0NDY0ZmE4NjE0MmNjZGVkMDQyN2MgPSAkKGA8ZGl2IGlkPSJodG1sX2U2NGEwYzNlMTkyNDQ2NGZhODYxNDJjY2RlZDA0MjdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MzA4MSwgLTMuNjM1MjQxM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmNDA1NWE1ZjIyOTQxNDk4YTkwMjA4M2VlOWI5MTg3LnNldENvbnRlbnQoaHRtbF9lNjRhMGMzZTE5MjQ0NjRmYTg2MTQyY2NkZWQwNDI3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EyZDQ3ZTgzNjIyNDQ4NTg4YzBjODg3MjlmOWEzMGY5LmJpbmRQb3B1cChwb3B1cF8xZjQwNTVhNWYyMjk0MTQ5OGE5MDIwODNlZTliOTE4NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk4NmRmZTBjMzRhYTRlMTc5MWVmNzZlM2QxOWFhNWFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA0MzYzLCAtMy42MzI3ODI4OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVkMjgzMmQxOTdlNDliMGE0NjQ5YTcyOWJkN2VlNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTllNmIzOGEzMDA2NDM1ZjhlYzljOTNlOTg5NGM2ZDMgPSAkKGA8ZGl2IGlkPSJodG1sXzE5ZTZiMzhhMzAwNjQzNWY4ZWM5YzkzZTk4OTRjNmQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNDM2MywgLTMuNjMyNzgyODk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlZDI4MzJkMTk3ZTQ5YjBhNDY0OWE3MjliZDdlZTY1LnNldENvbnRlbnQoaHRtbF8xOWU2YjM4YTMwMDY0MzVmOGVjOWM5M2U5ODk0YzZkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk4NmRmZTBjMzRhYTRlMTc5MWVmNzZlM2QxOWFhNWFlLmJpbmRQb3B1cChwb3B1cF9mZWQyODMyZDE5N2U0OWIwYTQ2NDlhNzI5YmQ3ZWU2NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3OTM5NGNlZjVjODRhMDM4YmU4NmZkMjZhNTViMTZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjA5LCAtMy42NDYxMTY5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU4NTVkMDk2ZDEzNDVjMTk5NDkzNDMyYWEwMmRkZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E3NDQ4YmYzYmIxNDY3MGI0YTRiNmEzMjRlZGI1YjQgPSAkKGA8ZGl2IGlkPSJodG1sXzNhNzQ0OGJmM2JiMTQ2NzBiNGE0YjZhMzI0ZWRiNWI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDYwOSwgLTMuNjQ2MTE2OV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1ODU1ZDA5NmQxMzQ1YzE5OTQ5MzQzMmFhMDJkZGUxLnNldENvbnRlbnQoaHRtbF8zYTc0NDhiZjNiYjE0NjcwYjRhNGI2YTMyNGVkYjViNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3OTM5NGNlZjVjODRhMDM4YmU4NmZkMjZhNTViMTZiLmJpbmRQb3B1cChwb3B1cF80NTg1NWQwOTZkMTM0NWMxOTk0OTM0MzJhYTAyZGRlMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzgzY2EwNzNiOTJjYjRkOWM5Mjc3NzllYTEwYTEzYjFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4yMDQ1MTkyOTk5OTk5OTQsIC01Ljc4NTU2OTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWU0NGY5NDdlMDU0ZjZhOTdjMjJjZWM4ZTEwZjg2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMjY0YmYyZTllZjM0NGIxYTBjNzIwZDY0YTc1Yzc1YiA9ICQoYDxkaXYgaWQ9Imh0bWxfYzI2NGJmMmU5ZWYzNDRiMWEwYzcyMGQ2NGE3NWM3NWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4yMDQ1MTkyOTk5OTk5OTQsIC01Ljc4NTU2OTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWU0NGY5NDdlMDU0ZjZhOTdjMjJjZWM4ZTEwZjg2OS5zZXRDb250ZW50KGh0bWxfYzI2NGJmMmU5ZWYzNDRiMWEwYzcyMGQ2NGE3NWM3NWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84M2NhMDczYjkyY2I0ZDljOTI3Nzc5ZWExMGExM2IxYy5iaW5kUG9wdXAocG9wdXBfODFlNDRmOTQ3ZTA1NGY2YTk3YzIyY2VjOGUxMGY4NjkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81ZjJlMDEwYmFmZmE0MDc4OTViMTk4ZTI2MzFjMDk2MCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyNDMzNiwgLTMuODA0MTQ0Mzk5OTk5OTk5OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjYzIyMWJhZmU1OTQzZjk5OTM5NjVjZTJhMThkZWNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0N2NiNzRmNWRlOTRiZTQ5NDZlZDViNmNmMmE5MTcwID0gJChgPGRpdiBpZD0iaHRtbF9hNDdjYjc0ZjVkZTk0YmU0OTQ2ZWQ1YjZjZjJhOTE3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMjQzMzYsIC0zLjgwNDE0NDM5OTk5OTk5OThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2MyMjFiYWZlNTk0M2Y5OTkzOTY1Y2UyYTE4ZGVjZC5zZXRDb250ZW50KGh0bWxfYTQ3Y2I3NGY1ZGU5NGJlNDk0NmVkNWI2Y2YyYTkxNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81ZjJlMDEwYmFmZmE0MDc4OTViMTk4ZTI2MzFjMDk2MC5iaW5kUG9wdXAocG9wdXBfMWNjMjIxYmFmZTU5NDNmOTk5Mzk2NWNlMmExOGRlY2QpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iYzk2NzVmZjM0N2M0NmVhOWJhMDYxY2U1OThjYjY4NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk1Njc5MywgLTMuNjk5MjUxMjAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjMzA0OWVjZmM5ZTQyZDk5MDMzZTU0MWI2NDUxMDEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmMThkY2ZhNDY0NTQ2NzY4N2VhMTBkYjhjYTlkYmQ4ID0gJChgPGRpdiBpZD0iaHRtbF8yZjE4ZGNmYTQ2NDU0Njc2ODdlYTEwZGI4Y2E5ZGJkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NTY3OTMsIC0zLjY5OTI1MTIwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYzMwNDllY2ZjOWU0MmQ5OTAzM2U1NDFiNjQ1MTAxMi5zZXRDb250ZW50KGh0bWxfMmYxOGRjZmE0NjQ1NDY3Njg3ZWExMGRiOGNhOWRiZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYzk2NzVmZjM0N2M0NmVhOWJhMDYxY2U1OThjYjY4Ni5iaW5kUG9wdXAocG9wdXBfMGMzMDQ5ZWNmYzllNDJkOTkwMzNlNTQxYjY0NTEwMTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zMjM1MTA1YjYyMGM0MmI3YjU4MWJhOTM4ZTk5YTE1MSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MDc5NiwgLTMuNjQ2NDU5Nzk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwMzMzZDZlNjE3MDQ2Mjk4N2UwOWQwZDg1MDlhZjU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzOTgzZGIxMDlmZDQ1ZjY4MjIxZDQ2NTI0NzJlOGMzID0gJChgPGRpdiBpZD0iaHRtbF85Mzk4M2RiMTA5ZmQ0NWY2ODIyMWQ0NjUyNDcyZThjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzA3OTYsIC0zLjY0NjQ1OTc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDMzM2Q2ZTYxNzA0NjI5ODdlMDlkMGQ4NTA5YWY1OC5zZXRDb250ZW50KGh0bWxfOTM5ODNkYjEwOWZkNDVmNjgyMjFkNDY1MjQ3MmU4YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMjM1MTA1YjYyMGM0MmI3YjU4MWJhOTM4ZTk5YTE1MS5iaW5kUG9wdXAocG9wdXBfZDAzMzNkNmU2MTcwNDYyOTg3ZTA5ZDBkODUwOWFmNTgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zMDk0ZjdiMzQyYjI0YjRkYWI3NDVmNDY3ODE0MWE0MiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE4OTI5MiwgLTMuODAxNjA3NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkOTU3ZDUwMDNmZTRjYzRiNzE0YThlMzc2ZWVmMjJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkNzg1ZTA1NGM0OTQ1MGJiZDhmZWJiZTU5ZTlkNWQxID0gJChgPGRpdiBpZD0iaHRtbF8yZDc4NWUwNTRjNDk0NTBiYmQ4ZmViYmU1OWU5ZDVkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxODkyOTIsIC0zLjgwMTYwNzRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDk1N2Q1MDAzZmU0Y2M0YjcxNGE4ZTM3NmVlZjIyYi5zZXRDb250ZW50KGh0bWxfMmQ3ODVlMDU0YzQ5NDUwYmJkOGZlYmJlNTllOWQ1ZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMDk0ZjdiMzQyYjI0YjRkYWI3NDVmNDY3ODE0MWE0Mi5iaW5kUG9wdXAocG9wdXBfM2Q5NTdkNTAwM2ZlNGNjNGI3MTRhOGUzNzZlZWYyMmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yMmM2MGIxYTY2YmM0NDJlOWY0YzQ3YjgzMjJhNWMxMiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MjIzNCwgLTMuNjUxMDY5MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlN2ZkNmE0YjY4YjRiOWFhMWNlMjI1MjZlOWJkMGEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4M2M2NTg4NmI5NDRkNzA5ZjcyZmMyZmU2NDkzODZhID0gJChgPGRpdiBpZD0iaHRtbF84ODNjNjU4ODZiOTQ0ZDcwOWY3MmZjMmZlNjQ5Mzg2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTIyMzQsIC0zLjY1MTA2OTFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZTdmZDZhNGI2OGI0YjlhYTFjZTIyNTI2ZTliZDBhMi5zZXRDb250ZW50KGh0bWxfODgzYzY1ODg2Yjk0NGQ3MDlmNzJmYzJmZTY0OTM4NmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMmM2MGIxYTY2YmM0NDJlOWY0YzQ3YjgzMjJhNWMxMi5iaW5kUG9wdXAocG9wdXBfNGU3ZmQ2YTRiNjhiNGI5YWExY2UyMjUyNmU5YmQwYTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hM2I5NDc1MDJhOGQ0MDM0YTJhZTUzODUxZDA0MGMzMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTIxMjk5OTk5OTk1LCAtMy42NDM0MTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWFlZWEyMjU5OGU0NDMzYWFlMjAzNGI2YzZhYTkyY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjJjNDZmMTNiYzRkNDgzYTk0ZTRiNjFlNDE3Yjk1NTAgPSAkKGA8ZGl2IGlkPSJodG1sXzIyYzQ2ZjEzYmM0ZDQ4M2E5NGU0YjYxZTQxN2I5NTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0OTIxMjk5OTk5OTk1LCAtMy42NDM0MTk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWFlZWEyMjU5OGU0NDMzYWFlMjAzNGI2YzZhYTkyY2Uuc2V0Q29udGVudChodG1sXzIyYzQ2ZjEzYmM0ZDQ4M2E5NGU0YjYxZTQxN2I5NTUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTNiOTQ3NTAyYThkNDAzNGEyYWU1Mzg1MWQwNDBjMzEuYmluZFBvcHVwKHBvcHVwXzlhZWVhMjI1OThlNDQzM2FhZTIwMzRiNmM2YWE5MmNlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTIxMzQ2NDEwMTI5NGY5MmFjYWMzZmQ4NmNiZmY1MTggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NDc1ODQsIC0zLjY2NjQ3NDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzcxMTM2ZTZlYzM0ZmZlODYxMzY0Yjg4M2YzYTRjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzU2Y2RlZjZjMWY0MmIwOGFlZjE0NzkzNmExNGY3MiA9ICQoYDxkaXYgaWQ9Imh0bWxfMjM1NmNkZWY2YzFmNDJiMDhhZWYxNDc5MzZhMTRmNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zOTQ3NTg0LCAtMy42NjY0NzQ0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc3MTEzNmU2ZWMzNGZmZTg2MTM2NGI4ODNmM2E0YzAuc2V0Q29udGVudChodG1sXzIzNTZjZGVmNmMxZjQyYjA4YWVmMTQ3OTM2YTE0ZjcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTIxMzQ2NDEwMTI5NGY5MmFjYWMzZmQ4NmNiZmY1MTguYmluZFBvcHVwKHBvcHVwXzU3NzExMzZlNmVjMzRmZmU4NjEzNjRiODgzZjNhNGMwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYWEyYzQ5YmQwY2YyNDE4ODlhNmY3YTVhYmY3NTUzYzggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ1OSwgLTMuNjQ2MTIwNTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3ZDVmYWRkMGE2YjQxMjJhMzgyYWJmMTgyMzMzMWZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3MzcwZjU0NjVlNjQ5NDNiMWNhZTQ0MTYwNjY3NmRkID0gJChgPGRpdiBpZD0iaHRtbF84NzM3MGY1NDY1ZTY0OTQzYjFjYWU0NDE2MDY2NzZkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ1OSwgLTMuNjQ2MTIwNTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3ZDVmYWRkMGE2YjQxMjJhMzgyYWJmMTgyMzMzMWZmLnNldENvbnRlbnQoaHRtbF84NzM3MGY1NDY1ZTY0OTQzYjFjYWU0NDE2MDY2NzZkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FhMmM0OWJkMGNmMjQxODg5YTZmN2E1YWJmNzU1M2M4LmJpbmRQb3B1cChwb3B1cF9lN2Q1ZmFkZDBhNmI0MTIyYTM4MmFiZjE4MjMzMzFmZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY5MzY0ZmNiMWJhODQ0MzliYTc1OWJhOWJkYTg4NTU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA0NzUzOTk5OTk5OSwgLTMuNjQ1NTE5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1YmU4MGMxZGJkZjRjZWM4MjhkNTcxZDQ2MGQ3OTc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlOGIyOTRjNWYzYTQxMjQ4NGU2N2MzYWJiZDFmNDYwID0gJChgPGRpdiBpZD0iaHRtbF9lZThiMjk0YzVmM2E0MTI0ODRlNjdjM2FiYmQxZjQ2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ3NTM5OTk5OTk5LCAtMy42NDU1MTk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODViZTgwYzFkYmRmNGNlYzgyOGQ1NzFkNDYwZDc5NzUuc2V0Q29udGVudChodG1sX2VlOGIyOTRjNWYzYTQxMjQ4NGU2N2MzYWJiZDFmNDYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjkzNjRmY2IxYmE4NDQzOWJhNzU5YmE5YmRhODg1NTYuYmluZFBvcHVwKHBvcHVwXzg1YmU4MGMxZGJkZjRjZWM4MjhkNTcxZDQ2MGQ3OTc1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDk1MGVkZjE4ZjU0NGQ2YWJhZDdmNjJjZDVkNWFkYTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQwMDAxOTQsIC0zLjYwMjkzODddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjE1YWQ5OWQ1ZTM0ZDdlYjkxODRmMGNlYmU0Njc0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NDIwYTgxZDQxNzQ0NTE0YjFiZWU5MDg0MTMwY2IzMyA9ICQoYDxkaXYgaWQ9Imh0bWxfOTQyMGE4MWQ0MTc0NDUxNGIxYmVlOTA4NDEzMGNiMzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MDAwMTk0LCAtMy42MDI5Mzg3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzYxNWFkOTlkNWUzNGQ3ZWI5MTg0ZjBjZWJlNDY3NGYuc2V0Q29udGVudChodG1sXzk0MjBhODFkNDE3NDQ1MTRiMWJlZTkwODQxMzBjYjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDk1MGVkZjE4ZjU0NGQ2YWJhZDdmNjJjZDVkNWFkYTcuYmluZFBvcHVwKHBvcHVwXzM2MTVhZDk5ZDVlMzRkN2ViOTE4NGYwY2ViZTQ2NzRmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDg0MTI3OTE4ODg4NDFkNDgyZThmZmI0NDQ0M2JlZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ5MjYsIC0zLjY0NDc5NThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzUzYjgxN2U1MGI0ZTg4OTBkZDQ3MGQ4NTZkZjU0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGUxOTRiZDc3MDA0OTYwOTFmYzQ1ZTk4ZjM3MDA2NyA9ICQoYDxkaXYgaWQ9Imh0bWxfNjhlMTk0YmQ3NzAwNDk2MDkxZmM0NWU5OGYzNzAwNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0OTI2LCAtMy42NDQ3OTU4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM1M2I4MTdlNTBiNGU4ODkwZGQ0NzBkODU2ZGY1NGUuc2V0Q29udGVudChodG1sXzY4ZTE5NGJkNzcwMDQ5NjA5MWZjNDVlOThmMzcwMDY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDg0MTI3OTE4ODg4NDFkNDgyZThmZmI0NDQ0M2JlZjUuYmluZFBvcHVwKHBvcHVwXzAzNTNiODE3ZTUwYjRlODg5MGRkNDcwZDg1NmRmNTRlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjA5YTM2OTQzM2NmNGM0NWIyNmJlNTQ1NTRkNzk0ZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDYyNzQsIC0zLjY0NTM3MjQ5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZGMzMzBlNzY1ZDg0ZDg3OThlYTY3Mjg5YmViMGFmOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDJiNDE3ZjEyMDM0MjU3OTYxNzcxY2YyYTEwZjFiYSA9ICQoYDxkaXYgaWQ9Imh0bWxfNWQyYjQxN2YxMjAzNDI1Nzk2MTc3MWNmMmExMGYxYmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2Mjc0LCAtMy42NDUzNzI0OTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmRjMzMwZTc2NWQ4NGQ4Nzk4ZWE2NzI4OWJlYjBhZjkuc2V0Q29udGVudChodG1sXzVkMmI0MTdmMTIwMzQyNTc5NjE3NzFjZjJhMTBmMWJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjA5YTM2OTQzM2NmNGM0NWIyNmJlNTQ1NTRkNzk0ZTMuYmluZFBvcHVwKHBvcHVwX2ZkYzMzMGU3NjVkODRkODc5OGVhNjcyODliZWIwYWY5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjQ4OTQzZGQxNGJhNDFkZGEwNjcyMjA5ZjNmZjZiY2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2MzQ3NzEsIC0zLjYxMjc4MjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZDU3NTIzY2RkYzg0NDJiYTUwYzc5MGFjZWVmMWI5OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODMzOTlmOTg5Mjg0MDNhODhmOWRkZmQ4MDUwMTc5NiA9ICQoYDxkaXYgaWQ9Imh0bWxfMDgzMzk5Zjk4OTI4NDAzYTg4ZjlkZGZkODA1MDE3OTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NjM0NzcxLCAtMy42MTI3ODI1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWQ1NzUyM2NkZGM4NDQyYmE1MGM3OTBhY2VlZjFiOTkuc2V0Q29udGVudChodG1sXzA4MzM5OWY5ODkyODQwM2E4OGY5ZGRmZDgwNTAxNzk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjQ4OTQzZGQxNGJhNDFkZGEwNjcyMjA5ZjNmZjZiY2IuYmluZFBvcHVwKHBvcHVwXzVkNTc1MjNjZGRjODQ0MmJhNTBjNzkwYWNlZWYxYjk5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjMwMDVkZTgyNDE3NGI1N2FjNDk3NWZiYzI0ZjEyMDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNjI2OTIsIC0zLjYyMzY5NzVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZWNmMDhiNTA5NDM0ODNiOTUxNDMxMWU2Njk2ZTQ2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTRkNzZiMDkxNmE0YzdiYThlYTUzNGE5ODY1ZWJlMSA9ICQoYDxkaXYgaWQ9Imh0bWxfOWU0ZDc2YjA5MTZhNGM3YmE4ZWE1MzRhOTg2NWViZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTYyNjkyLCAtMy42MjM2OTc1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWVjZjA4YjUwOTQzNDgzYjk1MTQzMTFlNjY5NmU0NmUuc2V0Q29udGVudChodG1sXzllNGQ3NmIwOTE2YTRjN2JhOGVhNTM0YTk4NjVlYmUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjMwMDVkZTgyNDE3NGI1N2FjNDk3NWZiYzI0ZjEyMDkuYmluZFBvcHVwKHBvcHVwXzFlY2YwOGI1MDk0MzQ4M2I5NTE0MzExZTY2OTZlNDZlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNWE0MzU3NzMwNDM1NDljZjlhNjQ3ZTZhYjU4MDcyNjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDQ2NzYsIC0zLjYzMjkwMzZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOTQwYmQ5NzIwOTI0MDU5YWMzYTQ5NTQzZmFjOWNkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGEyZDc5YzY3M2I0ODExYmE0NmQzMGU4YjQxMWRkMyA9ICQoYDxkaXYgaWQ9Imh0bWxfYTRhMmQ3OWM2NzNiNDgxMWJhNDZkMzBlOGI0MTFkZDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA0Njc2LCAtMy42MzI5MDM2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTk0MGJkOTcyMDkyNDA1OWFjM2E0OTU0M2ZhYzljZDQuc2V0Q29udGVudChodG1sX2E0YTJkNzljNjczYjQ4MTFiYTQ2ZDMwZThiNDExZGQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWE0MzU3NzMwNDM1NDljZjlhNjQ3ZTZhYjU4MDcyNjMuYmluZFBvcHVwKHBvcHVwXzE5NDBiZDk3MjA5MjQwNTlhYzNhNDk1NDNmYWM5Y2Q0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzlmNzc3MTg0MjUzNGNhZmJkMzUwMWZjNzA1MGExZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ5NTYsIC0zLjY0NDc5MDYwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDU1NWY4YjljZTI0NWE3ODlkZTkwYWY1M2E1NDBhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNjE3OWRjMGNjNWU0MWFjYWY1N2YwOTQzY2ViYzE2NiA9ICQoYDxkaXYgaWQ9Imh0bWxfZTYxNzlkYzBjYzVlNDFhY2FmNTdmMDk0M2NlYmMxNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0OTU2LCAtMy42NDQ3OTA2MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmQ1NTVmOGI5Y2UyNDVhNzg5ZGU5MGFmNTNhNTQwYTcuc2V0Q29udGVudChodG1sX2U2MTc5ZGMwY2M1ZTQxYWNhZjU3ZjA5NDNjZWJjMTY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzlmNzc3MTg0MjUzNGNhZmJkMzUwMWZjNzA1MGExZWEuYmluZFBvcHVwKHBvcHVwXzZkNTU1ZjhiOWNlMjQ1YTc4OWRlOTBhZjUzYTU0MGE3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmE5OTczMjExYzQyNDAwMzljNTE0ODI0ZWFjN2JiZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzIwMjgsIC0zLjY0NjU5NjcwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzE2ZDY4NDkxMDY0NWIxYTEwODhjMmVlNzYwYTI5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzhiMDU0ZGY5N2E0YzQ0Yjk0MzlkMDJjZjBiNTMxMiA9ICQoYDxkaXYgaWQ9Imh0bWxfM2M4YjA1NGRmOTdhNGM0NGI5NDM5ZDAyY2YwYjUzMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjcyMDI4LCAtMy42NDY1OTY3MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjcxNmQ2ODQ5MTA2NDViMWExMDg4YzJlZTc2MGEyOTQuc2V0Q29udGVudChodG1sXzNjOGIwNTRkZjk3YTRjNDRiOTQzOWQwMmNmMGI1MzEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmE5OTczMjExYzQyNDAwMzljNTE0ODI0ZWFjN2JiZjYuYmluZFBvcHVwKHBvcHVwX2Y3MTZkNjg0OTEwNjQ1YjFhMTA4OGMyZWU3NjBhMjk0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWQ5OTViMjY3YTZiNDhiMzliNDNhMmJlODk0MzgyNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjE3NzY0MDQsIC01LjgzMDgxMTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZGZiMTZkY2MzNzU0MzlhYjFjZGUyNTYxZmNkNDU5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mM2Y1MjAxYzZmMTg0YzE2ODkyNmQ3ZDY1NWNiMGIwOCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjNmNTIwMWM2ZjE4NGMxNjg5MjZkN2Q2NTVjYjBiMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xNzc2NDA0LCAtNS44MzA4MTE0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2RmYjE2ZGNjMzc1NDM5YWIxY2RlMjU2MWZjZDQ1OTIuc2V0Q29udGVudChodG1sX2YzZjUyMDFjNmYxODRjMTY4OTI2ZDdkNjU1Y2IwYjA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWQ5OTViMjY3YTZiNDhiMzliNDNhMmJlODk0MzgyNTguYmluZFBvcHVwKHBvcHVwX2NkZmIxNmRjYzM3NTQzOWFiMWNkZTI1NjFmY2Q0NTkyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmVkMTI0NDhjN2MzNDRhMTg3MWEzY2ViZWI5MjRiZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTMyNzM5OTk5OTk5NiwgLTMuNjI4Njk5ODk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyYjk0OTBkN2IzNTQ2ZGViZGNhZWU1NGVkMDcwNjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzNDI4ZTNjZjgyNDRiOGI5YmQ3ZDI2YzJiYzQ0NWY4ID0gJChgPGRpdiBpZD0iaHRtbF8xMzQyOGUzY2Y4MjQ0YjhiOWJkN2QyNmMyYmM0NDVmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTMyNzM5OTk5OTk5NiwgLTMuNjI4Njk5ODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyYjk0OTBkN2IzNTQ2ZGViZGNhZWU1NGVkMDcwNjIxLnNldENvbnRlbnQoaHRtbF8xMzQyOGUzY2Y4MjQ0YjhiOWJkN2QyNmMyYmM0NDVmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JlZDEyNDQ4YzdjMzQ0YTE4NzFhM2NlYmViOTI0YmZiLmJpbmRQb3B1cChwb3B1cF9iMmI5NDkwZDdiMzU0NmRlYmRjYWVlNTRlZDA3MDYyMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzMxNzAyYTg3Y2MzZjQ5MWE4YzBhZWIzNzFjYjhkY2QzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjgzMTEzLCAtMy42NDgwMDAyMDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGU2Zjk1OGMzOTBmNDM4ZDg3ZTA4MDNmMTBiZThkZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVkM2Q5ZTQ5MjkyNDQ1ODg5Yzc2MDY0NjhlZGI3ZWYgPSAkKGA8ZGl2IGlkPSJodG1sXzM1ZDNkOWU0OTI5MjQ0NTg4OWM3NjA2NDY4ZWRiN2VmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4MzExMywgLTMuNjQ4MDAwMjAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlNmY5NThjMzkwZjQzOGQ4N2UwODAzZjEwYmU4ZGUxLnNldENvbnRlbnQoaHRtbF8zNWQzZDllNDkyOTI0NDU4ODljNzYwNjQ2OGVkYjdlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMxNzAyYTg3Y2MzZjQ5MWE4YzBhZWIzNzFjYjhkY2QzLmJpbmRQb3B1cChwb3B1cF84ZTZmOTU4YzM5MGY0MzhkODdlMDgwM2YxMGJlOGRlMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NjNDc2MDI1YjU4ZDRkNjk5ZTRjYjY1OTBhYWZjZDI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTIxOTQyLCAtMy42Mjg4NjM3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWUzYmVmYTY0M2UzNDUxZDhlOTczN2IwZjRmYzIxYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDRiMmNiMzA5YWQyNGIxZDk1ODQ1MTZlY2QxZDJmZWEgPSAkKGA8ZGl2IGlkPSJodG1sX2Q0YjJjYjMwOWFkMjRiMWQ5NTg0NTE2ZWNkMWQyZmVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEyMTk0MiwgLTMuNjI4ODYzN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlM2JlZmE2NDNlMzQ1MWQ4ZTk3MzdiMGY0ZmMyMWMxLnNldENvbnRlbnQoaHRtbF9kNGIyY2IzMDlhZDI0YjFkOTU4NDUxNmVjZDFkMmZlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NjNDc2MDI1YjU4ZDRkNjk5ZTRjYjY1OTBhYWZjZDI1LmJpbmRQb3B1cChwb3B1cF8xZTNiZWZhNjQzZTM0NTFkOGU5NzM3YjBmNGZjMjFjMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2JmOWVmMTliOWQzZTRmNjY5NTU2MmJkYjkxNTQ5YmEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzcxOTE2LCAtMy42MTc5ODE2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTA3MDQ3ZjEyYTVhNDkxODlhMmViMzBmMTU2ZTdiMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjFhZTNhYjA5NzRhNDM4N2IxMzQzZjcwNjU2MmJjZTIgPSAkKGA8ZGl2IGlkPSJodG1sX2YxYWUzYWIwOTc0YTQzODdiMTM0M2Y3MDY1NjJiY2UyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM3MTkxNiwgLTMuNjE3OTgxNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwNzA0N2YxMmE1YTQ5MTg5YTJlYjMwZjE1NmU3YjM0LnNldENvbnRlbnQoaHRtbF9mMWFlM2FiMDk3NGE0Mzg3YjEzNDNmNzA2NTYyYmNlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JmOWVmMTliOWQzZTRmNjY5NTU2MmJkYjkxNTQ5YmEyLmJpbmRQb3B1cChwb3B1cF81MDcwNDdmMTJhNWE0OTE4OWEyZWIzMGYxNTZlN2IzNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzEwZGU1ODRjZTBjYjQ5OTU5ZTZiZGQzODQzOGE5YzhlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzLCAtMy42MzUyMzgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYwZmFkZTYzMTA0NDhmMmEwNzMyMTM3ZDE5MjVhNWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTI2ZTY0NTIxZDUwNDBlYjlhOWVkNjhkOWZhMDdlMGQgPSAkKGA8ZGl2IGlkPSJodG1sX2EyNmU2NDUyMWQ1MDQwZWI5YTllZDY4ZDlmYTA3ZTBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MywgLTMuNjM1MjM4MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2MGZhZGU2MzEwNDQ4ZjJhMDczMjEzN2QxOTI1YTVjLnNldENvbnRlbnQoaHRtbF9hMjZlNjQ1MjFkNTA0MGViOWE5ZWQ2OGQ5ZmEwN2UwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEwZGU1ODRjZTBjYjQ5OTU5ZTZiZGQzODQzOGE5YzhlLmJpbmRQb3B1cChwb3B1cF83NjBmYWRlNjMxMDQ0OGYyYTA3MzIxMzdkMTkyNWE1YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzlhM2VjYTMxZjkwZTRiNjZiMjFlOWMwNmQ5MmZkYzkwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTYwNDE2LCAtMy42NjM1MTMzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE4ZTBmYzgyMTg1NDBiMWI1NjUyZDVlY2Q3OWQ2MDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVmYTAwYmQyMzU3NGE0ZGEyNDYwNGUzNjg2NGNiNDAgPSAkKGA8ZGl2IGlkPSJodG1sX2RlZmEwMGJkMjM1NzRhNGRhMjQ2MDRlMzY4NjRjYjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE2MDQxNiwgLTMuNjYzNTEzM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxOGUwZmM4MjE4NTQwYjFiNTY1MmQ1ZWNkNzlkNjA1LnNldENvbnRlbnQoaHRtbF9kZWZhMDBiZDIzNTc0YTRkYTI0NjA0ZTM2ODY0Y2I0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlhM2VjYTMxZjkwZTRiNjZiMjFlOWMwNmQ5MmZkYzkwLmJpbmRQb3B1cChwb3B1cF9lMThlMGZjODIxODU0MGIxYjU2NTJkNWVjZDc5ZDYwNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzBiNTk1NDVmZGU1NjQ1NWQ4YWJjMWY1ZmYyMTI4Y2Q3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzIwODk1MDAwMDAwMDUsIC0zLjYzOTQ2ODRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTc5OTM1N2ZiNTM0YjViYjUyNzU3MDJhNmY0YWNkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDgwZjQxNWZjZmE0NGE4OTgyNWYzZDA3YTVlYTVhMyA9ICQoYDxkaXYgaWQ9Imh0bWxfY2Q4MGY0MTVmY2ZhNDRhODk4MjVmM2QwN2E1ZWE1YTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzIwODk1MDAwMDAwMDUsIC0zLjYzOTQ2ODRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTc5OTM1N2ZiNTM0YjViYjUyNzU3MDJhNmY0YWNkNC5zZXRDb250ZW50KGh0bWxfY2Q4MGY0MTVmY2ZhNDRhODk4MjVmM2QwN2E1ZWE1YTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYjU5NTQ1ZmRlNTY0NTVkOGFiYzFmNWZmMjEyOGNkNy5iaW5kUG9wdXAocG9wdXBfZDE3OTkzNTdmYjUzNGI1YmI1Mjc1NzAyYTZmNGFjZDQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80YzVkNjJmYjI1OGE0OWMyYjJiOTM5MTJiNDcwMWU1NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDg2NzAwMDAwMDA0LCAtMy42NDU1MjEyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDU4ZDQ5ZWViYjNmNDY0ZmJlY2MzMGFmYzNjNDhiMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWUxYmZmMmRiNGQ0NGFmOGJmYTllYzc1NjkxODBiYTEgPSAkKGA8ZGl2IGlkPSJodG1sXzVlMWJmZjJkYjRkNDRhZjhiZmE5ZWM3NTY5MTgwYmExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg2NzAwMDAwMDA0LCAtMy42NDU1MjEyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDU4ZDQ5ZWViYjNmNDY0ZmJlY2MzMGFmYzNjNDhiMGQuc2V0Q29udGVudChodG1sXzVlMWJmZjJkYjRkNDRhZjhiZmE5ZWM3NTY5MTgwYmExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGM1ZDYyZmIyNThhNDljMmIyYjkzOTEyYjQ3MDFlNTYuYmluZFBvcHVwKHBvcHVwXzA1OGQ0OWVlYmIzZjQ2NGZiZWNjMzBhZmMzYzQ4YjBkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYTRkNDJiNzA5YmYzNGQ4ZWExZjk2ZmQwYzE0MDk1Y2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQwMTM4MzMsIC0zLjY2ODAxNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3NGE1NzA2MTNlMjQwZTViODQ2ZTBlNjg4Mjc2M2I5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMGRkZjg1OGQ0MTQzNzY5MzZiOTczNGM3ZjI0MjI2ID0gJChgPGRpdiBpZD0iaHRtbF8wMDBkZGY4NThkNDE0Mzc2OTM2Yjk3MzRjN2YyNDIyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwMTM4MzMsIC0zLjY2ODAxNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3NGE1NzA2MTNlMjQwZTViODQ2ZTBlNjg4Mjc2M2I5LnNldENvbnRlbnQoaHRtbF8wMDBkZGY4NThkNDE0Mzc2OTM2Yjk3MzRjN2YyNDIyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E0ZDQyYjcwOWJmMzRkOGVhMWY5NmZkMGMxNDA5NWNjLmJpbmRQb3B1cChwb3B1cF8xNzRhNTcwNjEzZTI0MGU1Yjg0NmUwZTY4ODI3NjNiOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NkODhmZmQ5ZjdhYzRkZmI4NTU3NGE5YWY5NjQ4MzA5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU2ODk4OTk5OTk5OTQsIC0zLjYxNjUyNDI5OTk5OTk5OTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWZhNGNmZjY3MzA0NzA4OGYwYmZkYmQ0OGIzM2RiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MDgwMWZkNDIxNGU0NDAxOWFlMTcyYzVlMGZmYzU5MSA9ICQoYDxkaXYgaWQ9Imh0bWxfNjA4MDFmZDQyMTRlNDQwMTlhZTE3MmM1ZTBmZmM1OTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU2ODk4OTk5OTk5OTQsIC0zLjYxNjUyNDI5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMWZhNGNmZjY3MzA0NzA4OGYwYmZkYmQ0OGIzM2RiYi5zZXRDb250ZW50KGh0bWxfNjA4MDFmZDQyMTRlNDQwMTlhZTE3MmM1ZTBmZmM1OTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZDg4ZmZkOWY3YWM0ZGZiODU1NzRhOWFmOTY0ODMwOS5iaW5kUG9wdXAocG9wdXBfYTFmYTRjZmY2NzMwNDcwODhmMGJmZGJkNDhiMzNkYmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82OTQzMzQ4MWY3NzE0ZTZlYWExNjgwM2VjYjk4MjNkOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NDIzMiwgLTMuNjQ0ODcwMjAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmNzMzYzk3YWUzYTRmM2Y5ZjU0YmIxMGFlYTgxNDhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxODY5NjY0OTI1YTQ2NjY5ZDc3NDBiOGE5ZWNiNjYyID0gJChgPGRpdiBpZD0iaHRtbF80MTg2OTY2NDkyNWE0NjY2OWQ3NzQwYjhhOWVjYjY2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQyMzIsIC0zLjY0NDg3MDIwMDAwMDAwMDZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjczM2M5N2FlM2E0ZjNmOWY1NGJiMTBhZWE4MTQ4Yy5zZXRDb250ZW50KGh0bWxfNDE4Njk2NjQ5MjVhNDY2NjlkNzc0MGI4YTllY2I2NjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82OTQzMzQ4MWY3NzE0ZTZlYWExNjgwM2VjYjk4MjNkOC5iaW5kUG9wdXAocG9wdXBfNWY3MzNjOTdhZTNhNGYzZjlmNTRiYjEwYWVhODE0OGMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zNzI1YzdjZWVhYzg0MWViODc0NjdlYjMwYTEwM2M4OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5ODgwNSwgLTMuNjMwOTM1MTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzNzk5MmY3MDM2YjQ4YzdiNDBlNDI4NjQwNzgyMzJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc2MDU5OTkxMjM5ODQ2NDdiZDJkNGNlODc4ZTM3M2NlID0gJChgPGRpdiBpZD0iaHRtbF83NjA1OTk5MTIzOTg0NjQ3YmQyZDRjZTg3OGUzNzNjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTg4MDUsIC0zLjYzMDkzNTE5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzc5OTJmNzAzNmI0OGM3YjQwZTQyODY0MDc4MjMyYS5zZXRDb250ZW50KGh0bWxfNzYwNTk5OTEyMzk4NDY0N2JkMmQ0Y2U4NzhlMzczY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNzI1YzdjZWVhYzg0MWViODc0NjdlYjMwYTEwM2M4OC5iaW5kUG9wdXAocG9wdXBfZTM3OTkyZjcwMzZiNDhjN2I0MGU0Mjg2NDA3ODIzMmEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yYThkY2FiNTU4OGY0OThkYjM0YzA3MDkwZTQ5Njg5NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE1NzUzMTAwMDAwMDA1LCAtMy42MzU2ODQ4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY1ZGU2Zjg4MzdkNDNjZWJjMDVlMDJlNTAyNDk0ZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDBjM2JlZGYwMzk1NDRmOGE4OTIxZjk5NGUxNjhiYTMgPSAkKGA8ZGl2IGlkPSJodG1sXzQwYzNiZWRmMDM5NTQ0ZjhhODkyMWY5OTRlMTY4YmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE1NzUzMTAwMDAwMDA1LCAtMy42MzU2ODQ4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY1ZGU2Zjg4MzdkNDNjZWJjMDVlMDJlNTAyNDk0ZjAuc2V0Q29udGVudChodG1sXzQwYzNiZWRmMDM5NTQ0ZjhhODkyMWY5OTRlMTY4YmEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmE4ZGNhYjU1ODhmNDk4ZGIzNGMwNzA5MGU0OTY4OTcuYmluZFBvcHVwKHBvcHVwX2I2NWRlNmY4ODM3ZDQzY2ViYzA1ZTAyZTUwMjQ5NGYwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTdlYWZhYzI0ZGI2NDI2MDkxZDg3MGI3Y2E5MDU3YzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUxODIyNDEwMDAwMDAwNSwgLTMuNjUzMzQyMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwOWQzMjM0MzM0MTRjOGU5ZTQ0OTFlMTMwNzA2MTNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5OTAwZDZjNGNiYjRkZmY5NjRiZDkzMmJkNjRjYzljID0gJChgPGRpdiBpZD0iaHRtbF9hOTkwMGQ2YzRjYmI0ZGZmOTY0YmQ5MzJiZDY0Y2M5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxODIyNDEwMDAwMDAwNSwgLTMuNjUzMzQyMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwOWQzMjM0MzM0MTRjOGU5ZTQ0OTFlMTMwNzA2MTNiLnNldENvbnRlbnQoaHRtbF9hOTkwMGQ2YzRjYmI0ZGZmOTY0YmQ5MzJiZDY0Y2M5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU3ZWFmYWMyNGRiNjQyNjA5MWQ4NzBiN2NhOTA1N2MwLmJpbmRQb3B1cChwb3B1cF82MDlkMzIzNDMzNDE0YzhlOWU0NDkxZTEzMDcwNjEzYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzIwZjEzYzQ0MWUzNDQ3ODQ5M2IzNzQ1OWZhZjM1YmY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTUzMDA2LCAtMy42NjA1Mjc1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmJkMGMwNTQyYjk5NDQ1NGFiZDA2YzIyZTRhNjNhNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOThhYThlM2E4ZGU3NGJmZGFjNzVkYWI2ZThmYTVjMmUgPSAkKGA8ZGl2IGlkPSJodG1sXzk4YWE4ZTNhOGRlNzRiZmRhYzc1ZGFiNmU4ZmE1YzJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1MzAwNiwgLTMuNjYwNTI3NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiZDBjMDU0MmI5OTQ0NTRhYmQwNmMyMmU0YTYzYTYxLnNldENvbnRlbnQoaHRtbF85OGFhOGUzYThkZTc0YmZkYWM3NWRhYjZlOGZhNWMyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIwZjEzYzQ0MWUzNDQ3ODQ5M2IzNzQ1OWZhZjM1YmY4LmJpbmRQb3B1cChwb3B1cF9iYmQwYzA1NDJiOTk0NDU0YWJkMDZjMjJlNGE2M2E2MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzc0MWM2NzkzMTJlZTQ0ZDc5MzFlZDY5NGUzYmViOTNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc1NzQ5LCAtMy42NDQ2NzMwMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQwMTc4ZDIwNDU1NDY4ODg0ZjJiMGJlMDg5NWIwNzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjgxM2Y1NWMwMTJkNGUyOGI0NmI4MGNiOWY3MzUyOGUgPSAkKGA8ZGl2IGlkPSJodG1sXzI4MTNmNTVjMDEyZDRlMjhiNDZiODBjYjlmNzM1MjhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTc0OSwgLTMuNjQ0NjczMDAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0MDE3OGQyMDQ1NTQ2ODg4NGYyYjBiZTA4OTViMDcwLnNldENvbnRlbnQoaHRtbF8yODEzZjU1YzAxMmQ0ZTI4YjQ2YjgwY2I5ZjczNTI4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc0MWM2NzkzMTJlZTQ0ZDc5MzFlZDY5NGUzYmViOTNhLmJpbmRQb3B1cChwb3B1cF83NDAxNzhkMjA0NTU0Njg4ODRmMmIwYmUwODk1YjA3MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VlNzU3MTI4NWM4MjQ0N2NhYjJmOWRjMmVkZDZjMDY3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41NDU4MDk4LCAtMy42NDM4MzA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjg1M2JjMmY4ZTdlNGZjY2JhZjc2YTFiNzMxYzA4NzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjExZDczYmIxYTc1NGFkNzlmYzYzMWZlYjk1Y2UwYWQgPSAkKGA8ZGl2IGlkPSJodG1sXzYxMWQ3M2JiMWE3NTRhZDc5ZmM2MzFmZWI5NWNlMGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTQ1ODA5OCwgLTMuNjQzODMwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4NTNiYzJmOGU3ZTRmY2NiYWY3NmExYjczMWMwODc1LnNldENvbnRlbnQoaHRtbF82MTFkNzNiYjFhNzU0YWQ3OWZjNjMxZmViOTVjZTBhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VlNzU3MTI4NWM4MjQ0N2NhYjJmOWRjMmVkZDZjMDY3LmJpbmRQb3B1cChwb3B1cF82ODUzYmMyZjhlN2U0ZmNjYmFmNzZhMWI3MzFjMDg3NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFkOWFlMzc1YWFiNTRjOWNiMTJkNzNlYWVmNjRjNjk1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzYzNjM2LCAtMy42MTQ1MzY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk2ZDZkMDE2YmU0NGI3NWEzNTZmOWM5NDBiNzVmODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjY1NDg5NzE2MWY2NDFjOWIzZmNlYzFhMDJjNzRkOGQgPSAkKGA8ZGl2IGlkPSJodG1sX2Y2NTQ4OTcxNjFmNjQxYzliM2ZjZWMxYTAyYzc0ZDhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM2MzYzNiwgLTMuNjE0NTM2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5NmQ2ZDAxNmJlNDRiNzVhMzU2ZjljOTQwYjc1Zjg0LnNldENvbnRlbnQoaHRtbF9mNjU0ODk3MTYxZjY0MWM5YjNmY2VjMWEwMmM3NGQ4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFkOWFlMzc1YWFiNTRjOWNiMTJkNzNlYWVmNjRjNjk1LmJpbmRQb3B1cChwb3B1cF85OTZkNmQwMTZiZTQ0Yjc1YTM1NmY5Yzk0MGI3NWY4NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2U5ZDAxYWJmOTVlYjQ1YzM4Zjg4NjYzNWRmMTM5NGI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjM4LCAtMy42NDYwOTg3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VlMmZhNDVhYmJkNDNhYjllYjFlNWViNjhmZTkyODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQzMjA3N2Y5MTA0NDI5Y2E5NzM0OWRhMzNhZTFlYTkgPSAkKGA8ZGl2IGlkPSJodG1sXzA0MzIwNzdmOTEwNDQyOWNhOTczNDlkYTMzYWUxZWE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDYzOCwgLTMuNjQ2MDk4N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlZTJmYTQ1YWJiZDQzYWI5ZWIxZTVlYjY4ZmU5MjgzLnNldENvbnRlbnQoaHRtbF8wNDMyMDc3ZjkxMDQ0MjljYTk3MzQ5ZGEzM2FlMWVhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U5ZDAxYWJmOTVlYjQ1YzM4Zjg4NjYzNWRmMTM5NGI3LmJpbmRQb3B1cChwb3B1cF83ZWUyZmE0NWFiYmQ0M2FiOWViMWU1ZWI2OGZlOTI4MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ0MDk1MDFhOGZhNjRjZTdhMWY3MjI3NWRiMDIxOWIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEsIC0zLjY0MDY5NjRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzdjZjNkNjk1NjM0MTFmYjA2OTY3MzFhNTcwZjE2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzI5YWEzZjQ1YzU0YTdiOTlmNGY0NTNkMWUyYjE1OCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDMyOWFhM2Y0NWM1NGE3Yjk5ZjRmNDUzZDFlMmIxNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDEsIC0zLjY0MDY5NjRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzdjZjNkNjk1NjM0MTFmYjA2OTY3MzFhNTcwZjE2Yi5zZXRDb250ZW50KGh0bWxfZDMyOWFhM2Y0NWM1NGE3Yjk5ZjRmNDUzZDFlMmIxNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NDA5NTAxYThmYTY0Y2U3YTFmNzIyNzVkYjAyMTliMi5iaW5kUG9wdXAocG9wdXBfY2M3Y2YzZDY5NTYzNDExZmIwNjk2NzMxYTU3MGYxNmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mMTcyODU0MTRjNmY0ODQ2YTA4NjM5MjlhOWI0NmJkYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NDEzMjk5OTk5OTk0LCAtMy42NDQxNTg1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY3MmZhM2Q3NmU5NGM4MmE0NGY2NmExYWExMDRhMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2YxOTE1ODI4YzM1NDUyNWJjODVkMjlkNmQwYmZlNmQgPSAkKGA8ZGl2IGlkPSJodG1sX2NmMTkxNTgyOGMzNTQ1MjViYzg1ZDI5ZDZkMGJmZTZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NDEzMjk5OTk5OTk0LCAtMy42NDQxNTg1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjY3MmZhM2Q3NmU5NGM4MmE0NGY2NmExYWExMDRhMmYuc2V0Q29udGVudChodG1sX2NmMTkxNTgyOGMzNTQ1MjViYzg1ZDI5ZDZkMGJmZTZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjE3Mjg1NDE0YzZmNDg0NmEwODYzOTI5YTliNDZiZGEuYmluZFBvcHVwKHBvcHVwXzY2NzJmYTNkNzZlOTRjODJhNDRmNjZhMWFhMTA0YTJmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZDVhZTA1NmI1NzgyNGM1MDk2ODEzNmU1N2VjNGM4NTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2Mjk0MDEwMDAwMDAwNCwgLTMuNjYwMzQyMjk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljZTA1NWVmNTNlOTQwZjQ4MjkxM2QzNGNhOWMzM2JkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4YTJmY2JhOGQ2ZTQ1MTJhYWM1ZGQ1NjRjYTFiYjA1ID0gJChgPGRpdiBpZD0iaHRtbF80OGEyZmNiYThkNmU0NTEyYWFjNWRkNTY0Y2ExYmIwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2Mjk0MDEwMDAwMDAwNCwgLTMuNjYwMzQyMjk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljZTA1NWVmNTNlOTQwZjQ4MjkxM2QzNGNhOWMzM2JkLnNldENvbnRlbnQoaHRtbF80OGEyZmNiYThkNmU0NTEyYWFjNWRkNTY0Y2ExYmIwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q1YWUwNTZiNTc4MjRjNTA5NjgxMzZlNTdlYzRjODUwLmJpbmRQb3B1cChwb3B1cF85Y2UwNTVlZjUzZTk0MGY0ODI5MTNkMzRjYTljMzNiZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRmMDgyZmViMzI2NTRlMzdhYjFhYTg1OTA0YTg1YzNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU4NjcyLCAtMy42NjQzMjA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmZjZTFjMmEzMzk0NGE0NmI3YTFhZTI5YmZhM2VkZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTZjZjU4NDE0OTYzNDk0ZWE3MDQ5OWFmNDEwNTMzMmMgPSAkKGA8ZGl2IGlkPSJodG1sXzk2Y2Y1ODQxNDk2MzQ5NGVhNzA0OTlhZjQxMDUzMzJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1ODY3MiwgLTMuNjY0MzIwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmY2UxYzJhMzM5NDRhNDZiN2ExYWUyOWJmYTNlZGYwLnNldENvbnRlbnQoaHRtbF85NmNmNTg0MTQ5NjM0OTRlYTcwNDk5YWY0MTA1MzMyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRmMDgyZmViMzI2NTRlMzdhYjFhYTg1OTA0YTg1YzNiLmJpbmRQb3B1cChwb3B1cF8yZmNlMWMyYTMzOTQ0YTQ2YjdhMWFlMjliZmEzZWRmMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE3N2FkNzdmNWQzYzQzYTM5NTRkYzRiZjdjYjBhNWE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzAzLCAtMy42NDYwODg1OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWZkZWVhNWQ1YTEwNDVmYWIzMTdhNzdiNzQ2NGZiMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU5NDcyZmVkYjEzNDlhNDk1YjY0ZWUzODNjMDUwNDQgPSAkKGA8ZGl2IGlkPSJodG1sXzJlOTQ3MmZlZGIxMzQ5YTQ5NWI2NGVlMzgzYzA1MDQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDcwMywgLTMuNjQ2MDg4NTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmZGVlYTVkNWExMDQ1ZmFiMzE3YTc3Yjc0NjRmYjEwLnNldENvbnRlbnQoaHRtbF8yZTk0NzJmZWRiMTM0OWE0OTViNjRlZTM4M2MwNTA0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE3N2FkNzdmNWQzYzQzYTM5NTRkYzRiZjdjYjBhNWE3LmJpbmRQb3B1cChwb3B1cF85ZmRlZWE1ZDVhMTA0NWZhYjMxN2E3N2I3NDY0ZmIxMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzgzZDdkOTc3OGEyMDQ3YzViOTNjODllY2QzNjJhZTc0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjM4OTk5OTk5OTQsIC0zLjY0NjEyMDFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZThlMWQwZjBlMDE0NTczYTQ1NWMyNzk1M2M0Y2FiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZjRmNGQ5NzBiNmM0MDdhOTNkZWVlZmRiMzFiNDY0ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfMGY0ZjRkOTcwYjZjNDA3YTkzZGVlZWZkYjMxYjQ2NGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0NjM4OTk5OTk5OTQsIC0zLjY0NjEyMDFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZThlMWQwZjBlMDE0NTczYTQ1NWMyNzk1M2M0Y2FiMi5zZXRDb250ZW50KGh0bWxfMGY0ZjRkOTcwYjZjNDA3YTkzZGVlZWZkYjMxYjQ2NGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84M2Q3ZDk3NzhhMjA0N2M1YjkzYzg5ZWNkMzYyYWU3NC5iaW5kUG9wdXAocG9wdXBfNWU4ZTFkMGYwZTAxNDU3M2E0NTVjMjc5NTNjNGNhYjIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jNDAyMGM4NGU5MTg0YmUyYmFlMWQ5MmNlODBjMjkwNCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2OTE0MSwgLTMuNjQ3MDcxMTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiMDY0ZDIzMDgxYTQ1NTJiODMyZGZhMDEwMjllOTVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwYTU4NjI0MTVlOTQyNTBhODVlZDJkNzY3NjhiN2E0ID0gJChgPGRpdiBpZD0iaHRtbF9mMGE1ODYyNDE1ZTk0MjUwYTg1ZWQyZDc2NzY4YjdhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjkxNDEsIC0zLjY0NzA3MTEwMDAwMDAwMDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjA2NGQyMzA4MWE0NTUyYjgzMmRmYTAxMDI5ZTk1Zi5zZXRDb250ZW50KGh0bWxfZjBhNTg2MjQxNWU5NDI1MGE4NWVkMmQ3Njc2OGI3YTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNDAyMGM4NGU5MTg0YmUyYmFlMWQ5MmNlODBjMjkwNC5iaW5kUG9wdXAocG9wdXBfZmIwNjRkMjMwODFhNDU1MmI4MzJkZmEwMTAyOWU5NWYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81NDU2MDNjODg4MGQ0MDZhYTcwNzUxNzgzMDk2NjQwYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4MDUzNCwgLTMuNjQ0MDI3OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxMjliODdlMGUwZjRlODBiNmNjMmEwZGE5NTk4ZDlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyYjViYjI2OGQ0ZDQyYmJiZTQ4YmZhN2FjMjNhMmQ0ID0gJChgPGRpdiBpZD0iaHRtbF83MmI1YmIyNjhkNGQ0MmJiYmU0OGJmYTdhYzIzYTJkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODA1MzQsIC0zLjY0NDAyNzhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTI5Yjg3ZTBlMGY0ZTgwYjZjYzJhMGRhOTU5OGQ5ZC5zZXRDb250ZW50KGh0bWxfNzJiNWJiMjY4ZDRkNDJiYmJlNDhiZmE3YWMyM2EyZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NDU2MDNjODg4MGQ0MDZhYTcwNzUxNzgzMDk2NjQwYy5iaW5kUG9wdXAocG9wdXBfYjEyOWI4N2UwZTBmNGU4MGI2Y2MyYTBkYTk1OThkOWQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80ZDdlNzFlYzcxZmM0ZTQwYmU2ZDQ4Y2Q4MjZkZDYxNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMyOTg3Mjk5OTk5OTk1LCAtMy42Mzg5OTYyOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2MwMGJlYjJmMDM3NDAwNmFkNmMzNTc0MWY2NjY1NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODVhMDFhY2IxNDE4NGU5YTg1NGI3YmZjZmVkNWM3MjEgPSAkKGA8ZGl2IGlkPSJodG1sXzg1YTAxYWNiMTQxODRlOWE4NTRiN2JmY2ZlZDVjNzIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMyOTg3Mjk5OTk5OTk1LCAtMy42Mzg5OTYyOTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2MwMGJlYjJmMDM3NDAwNmFkNmMzNTc0MWY2NjY1NGEuc2V0Q29udGVudChodG1sXzg1YTAxYWNiMTQxODRlOWE4NTRiN2JmY2ZlZDVjNzIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGQ3ZTcxZWM3MWZjNGU0MGJlNmQ0OGNkODI2ZGQ2MTUuYmluZFBvcHVwKHBvcHVwXzNjMDBiZWIyZjAzNzQwMDZhZDZjMzU3NDFmNjY2NTRhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZGIxZDBiYzdlMTA4NGNjYmJmMTg4ODQ3YmQ1MzVlZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4NDEsIC0zLjY0NTUyMTldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTBiZTMyMzM4MzU0NDI2ODQ0MDJiNWRmY2ViYjBhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzZlMDJlYmQ4ZDM0MmQzOGQ2MGYyYTBmY2M1YTQxZiA9ICQoYDxkaXYgaWQ9Imh0bWxfZGM2ZTAyZWJkOGQzNDJkMzhkNjBmMmEwZmNjNWE0MWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA0ODQxLCAtMy42NDU1MjE5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWEwYmUzMjMzODM1NDQyNjg0NDAyYjVkZmNlYmIwYTYuc2V0Q29udGVudChodG1sX2RjNmUwMmViZDhkMzQyZDM4ZDYwZjJhMGZjYzVhNDFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGIxZDBiYzdlMTA4NGNjYmJmMTg4ODQ3YmQ1MzVlZWYuYmluZFBvcHVwKHBvcHVwX2FhMGJlMzIzMzgzNTQ0MjY4NDQwMmI1ZGZjZWJiMGE2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZGQyZjRmMGNlNGM5NDhhZGI2ZDhhNzdiMjUyODU5MmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzNTc2NjUsIC0zLjYxNjI2MjA5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjJiNjYwMGIyOGY0NmYwODQyMmJhMDk1ZDczOTVmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZTFlNWE5YWU4MmI0YzE1YWQ3Y2MwY2NlMjRiNTNjYyA9ICQoYDxkaXYgaWQ9Imh0bWxfNmUxZTVhOWFlODJiNGMxNWFkN2NjMGNjZTI0YjUzY2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU3NjY1LCAtMy42MTYyNjIwOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjYyYjY2MDBiMjhmNDZmMDg0MjJiYTA5NWQ3Mzk1ZmQuc2V0Q29udGVudChodG1sXzZlMWU1YTlhZTgyYjRjMTVhZDdjYzBjY2UyNGI1M2NjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQyZjRmMGNlNGM5NDhhZGI2ZDhhNzdiMjUyODU5MmUuYmluZFBvcHVwKHBvcHVwXzY2MmI2NjAwYjI4ZjQ2ZjA4NDIyYmEwOTVkNzM5NWZkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWNmYmMzY2Q0NjAwNGY5YWE2MmMyMDY1MTQwZTk4NzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjAzNzc0NTYsIC02LjA3OTAyNDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYmEyOWI5ZDBlM2Y0MGQ5YjIzMjkyZjI4NmEyOTQ0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNTRlNjU4NDFjNDg0NTMyODdhMmFlOWYyY2Y1MTM4MSA9ICQoYDxkaXYgaWQ9Imh0bWxfMTU0ZTY1ODQxYzQ4NDUzMjg3YTJhZTlmMmNmNTEzODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4wMzc3NDU2LCAtNi4wNzkwMjQ1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWJhMjliOWQwZTNmNDBkOWIyMzI5MmYyODZhMjk0NDUuc2V0Q29udGVudChodG1sXzE1NGU2NTg0MWM0ODQ1MzI4N2EyYWU5ZjJjZjUxMzgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWNmYmMzY2Q0NjAwNGY5YWE2MmMyMDY1MTQwZTk4NzAuYmluZFBvcHVwKHBvcHVwX2ViYTI5YjlkMGUzZjQwZDliMjMyOTJmMjg2YTI5NDQ1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOGVlZmZlMDRmZGNjNGVjZmFkNWJhODFmYjc4MDAyMmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc3ODAwMDAwMDAwNiwgLTMuNjMzMjIxMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU5ODgxZDQ4ZWRlYTRjOTY4ZmQyNWY4Zjg3ZTJlMTM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlYjZmMWUzYmQxOTQ5OTliOTM5OTVhNDE3OGU0ZTNkID0gJChgPGRpdiBpZD0iaHRtbF9hZWI2ZjFlM2JkMTk0OTk5YjkzOTk1YTQxNzhlNGUzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDc3ODAwMDAwMDAwNiwgLTMuNjMzMjIxMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5ODgxZDQ4ZWRlYTRjOTY4ZmQyNWY4Zjg3ZTJlMTM0LnNldENvbnRlbnQoaHRtbF9hZWI2ZjFlM2JkMTk0OTk5YjkzOTk1YTQxNzhlNGUzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhlZWZmZTA0ZmRjYzRlY2ZhZDViYTgxZmI3ODAwMjJjLmJpbmRQb3B1cChwb3B1cF81OTg4MWQ0OGVkZWE0Yzk2OGZkMjVmOGY4N2UyZTEzNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhjZGFiMDc0Y2U3MjQwYTlhZDdlMDdlNjI0YjczYTczID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY0ODU1LCAtMy42NDQyMzYxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzVlMzIyMGRiZDdhNDRiMGI2Y2JiZDVhZjAwNGRmNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVkNGM0YzZhZjgyNDMyMGJiYjIzMzdiOTQxMGY4ZTMgPSAkKGA8ZGl2IGlkPSJodG1sXzM1ZDRjNGM2YWY4MjQzMjBiYmIyMzM3Yjk0MTBmOGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NDg1NSwgLTMuNjQ0MjM2MTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1ZTMyMjBkYmQ3YTQ0YjBiNmNiYmQ1YWYwMDRkZjVhLnNldENvbnRlbnQoaHRtbF8zNWQ0YzRjNmFmODI0MzIwYmJiMjMzN2I5NDEwZjhlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhjZGFiMDc0Y2U3MjQwYTlhZDdlMDdlNjI0YjczYTczLmJpbmRQb3B1cChwb3B1cF9jNWUzMjIwZGJkN2E0NGIwYjZjYmJkNWFmMDA0ZGY1YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RlZWVjN2Y3YjUxNDQ3NGM4YmJmMGZmZmVjNTAxYjhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY5MTcyOTk5OTk5OTQsIC0zLjY0NzA4MzVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDM3NjYyYWIyMmY0NmM2OWNiYzk2YTI3ZmExZDhhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMWJjNmRhNDVhMjM0ZjFjOTNmYmM1MTFjZjQxMzBhYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMjFiYzZkYTQ1YTIzNGYxYzkzZmJjNTExY2Y0MTMwYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MTcyOTk5OTk5OTQsIC0zLjY0NzA4MzVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDM3NjYyYWIyMmY0NmM2OWNiYzk2YTI3ZmExZDhhNS5zZXRDb250ZW50KGh0bWxfMjFiYzZkYTQ1YTIzNGYxYzkzZmJjNTExY2Y0MTMwYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZWVlYzdmN2I1MTQ0NzRjOGJiZjBmZmZlYzUwMWI4Yi5iaW5kUG9wdXAocG9wdXBfNDAzNzY2MmFiMjJmNDZjNjljYmM5NmEyN2ZhMWQ4YTUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xNjUxNmRlYjcyMmE0NjIyOTE4ZDI1YjAxYmY5YTgwOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk5MjY0NiwgLTMuNjYyNTcwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkMTE0NGE5YjY3YTQzZGVhMDM1YjhhMjFiOWZiYzQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyZGQzZTBjNDVlZDQwNmU5OGU3ZGMyOGI4MjU1NWY0ID0gJChgPGRpdiBpZD0iaHRtbF8zMmRkM2UwYzQ1ZWQ0MDZlOThlN2RjMjhiODI1NTVmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTI2NDYsIC0zLjY2MjU3MDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZDExNDRhOWI2N2E0M2RlYTAzNWI4YTIxYjlmYmM0OS5zZXRDb250ZW50KGh0bWxfMzJkZDNlMGM0NWVkNDA2ZTk4ZTdkYzI4YjgyNTU1ZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNjUxNmRlYjcyMmE0NjIyOTE4ZDI1YjAxYmY5YTgwOS5iaW5kUG9wdXAocG9wdXBfMWQxMTQ0YTliNjdhNDNkZWEwMzViOGEyMWI5ZmJjNDkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83ZTA2ZTBkYzBlYWE0OWY3Yjc4MmU4YjQ2YzZkNTllNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NzM2MywgLTMuNjQyMzQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJkYWY3ZDM1NWJmNGU1MWFmOTQ2MWM1NDlmYTZkYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY0NDRlMjJmMDUyNGFlZDk4YTE0M2VkMGU3NjY5NmYgPSAkKGA8ZGl2IGlkPSJodG1sXzU2NDQ0ZTIyZjA1MjRhZWQ5OGExNDNlZDBlNzY2OTZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4NzM2MywgLTMuNjQyMzQzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJkYWY3ZDM1NWJmNGU1MWFmOTQ2MWM1NDlmYTZkYzIuc2V0Q29udGVudChodG1sXzU2NDQ0ZTIyZjA1MjRhZWQ5OGExNDNlZDBlNzY2OTZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2UwNmUwZGMwZWFhNDlmN2I3ODJlOGI0NmM2ZDU5ZTUuYmluZFBvcHVwKHBvcHVwXzRiZGFmN2QzNTViZjRlNTFhZjk0NjFjNTQ5ZmE2ZGMyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfY2Q3ZTk1YmIyNGVmNDQzMGI5NTY1MTIwNDk5NmZmY2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzE5NzQsIC0zLjY0NjU3ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NGJjYTAwMjg4ZDY0ZjY1YWIzNTY0NjkxZTM0YjI2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNGM3YzU3N2JkYmQ0ODU5ODgwOTZkZTFmNWNkNDIzOSA9ICQoYDxkaXYgaWQ9Imh0bWxfMzRjN2M1NzdiZGJkNDg1OTg4MDk2ZGUxZjVjZDQyMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjcxOTc0LCAtMy42NDY1Nzg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDRiY2EwMDI4OGQ2NGY2NWFiMzU2NDY5MWUzNGIyNjAuc2V0Q29udGVudChodG1sXzM0YzdjNTc3YmRiZDQ4NTk4ODA5NmRlMWY1Y2Q0MjM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2Q3ZTk1YmIyNGVmNDQzMGI5NTY1MTIwNDk5NmZmY2MuYmluZFBvcHVwKHBvcHVwXzQ0YmNhMDAyODhkNjRmNjVhYjM1NjQ2OTFlMzRiMjYwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYWExNDgyNWFkZDQ5NDAxNmJmNDFhM2FmZWM4ZmUxZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0NTE1MzcsIC0zLjY0MzM0MjEwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NWE5Yzk4YjRlYTI0NzkxODBjZjRlNWE1YmZmMTFkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MTVmOGU2MjQ5YjU0ZDhkYmI0ZGE3NDAwNjg4NGVkZiA9ICQoYDxkaXYgaWQ9Imh0bWxfNjE1ZjhlNjI0OWI1NGQ4ZGJiNGRhNzQwMDY4ODRlZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDUxNTM3LCAtMy42NDMzNDIxMDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODVhOWM5OGI0ZWEyNDc5MTgwY2Y0ZTVhNWJmZjExZGQuc2V0Q29udGVudChodG1sXzYxNWY4ZTYyNDliNTRkOGRiYjRkYTc0MDA2ODg0ZWRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWExNDgyNWFkZDQ5NDAxNmJmNDFhM2FmZWM4ZmUxZWIuYmluZFBvcHVwKHBvcHVwXzg1YTljOThiNGVhMjQ3OTE4MGNmNGU1YTViZmYxMWRkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmE1MWFlMGU2Y2Q0NGUxYmE5NGZjZGRiYTdhYmNkNTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzE5ODc5OTk5OTk5NCwgLTMuNjQ2NTgyNzAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1OWM5NmNlOGVmMTRiMDRhNDFjNjkzZTA0OTJlYmRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyNmFhMjhjNWZlNjRjZTE4ZTVkM2YzODU3YmUzZjA1ID0gJChgPGRpdiBpZD0iaHRtbF8yMjZhYTI4YzVmZTY0Y2UxOGU1ZDNmMzg1N2JlM2YwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzE5ODc5OTk5OTk5NCwgLTMuNjQ2NTgyNzAwMDAwMDAwNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1OWM5NmNlOGVmMTRiMDRhNDFjNjkzZTA0OTJlYmRmLnNldENvbnRlbnQoaHRtbF8yMjZhYTI4YzVmZTY0Y2UxOGU1ZDNmMzg1N2JlM2YwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhNTFhZTBlNmNkNDRlMWJhOTRmY2RkYmE3YWJjZDUyLmJpbmRQb3B1cChwb3B1cF83NTljOTZjZThlZjE0YjA0YTQxYzY5M2UwNDkyZWJkZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2JkYmJmZTg2OGYxYjQxOTc4MTA5M2ZiMGRmN2E1NzQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzQyOTk5OTk5OTQsIC0zLjY0NDgwMjldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMmE0NmM5ZDRmYTQ0YjAxYTQ3NjcxYmQzNjViZDQxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDA5Njg3ZWJmOGI0NjdmYmFiYzA2ZGJjOTFlZWI3NyA9ICQoYDxkaXYgaWQ9Imh0bWxfZDAwOTY4N2ViZjhiNDY3ZmJhYmMwNmRiYzkxZWViNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0NzQyOTk5OTk5OTQsIC0zLjY0NDgwMjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmE0NmM5ZDRmYTQ0YjAxYTQ3NjcxYmQzNjViZDQxMC5zZXRDb250ZW50KGh0bWxfZDAwOTY4N2ViZjhiNDY3ZmJhYmMwNmRiYzkxZWViNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZGJiZmU4NjhmMWI0MTk3ODEwOTNmYjBkZjdhNTc0My5iaW5kUG9wdXAocG9wdXBfZDJhNDZjOWQ0ZmE0NGIwMWE0NzY3MWJkMzY1YmQ0MTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iN2VjOGNlZjM1NmY0YTg2OTFhZTE4NWE0MDM4NzUzZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMjUzNSwgLTMuNzkzODEzNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhM2JmMmI1MDg1ZTRiMDliMjExYjRmNDk3ZjIxOGY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3OTRkZmE5ODQzNzQwY2U5NzA1ZDkyMThlMGI4MTkxID0gJChgPGRpdiBpZD0iaHRtbF84Nzk0ZGZhOTg0Mzc0MGNlOTcwNWQ5MjE4ZTBiODE5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MzUsIC0zLjc5MzgxMzVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTNiZjJiNTA4NWU0YjA5YjIxMWI0ZjQ5N2YyMThmOS5zZXRDb250ZW50KGh0bWxfODc5NGRmYTk4NDM3NDBjZTk3MDVkOTIxOGUwYjgxOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iN2VjOGNlZjM1NmY0YTg2OTFhZTE4NWE0MDM4NzUzZS5iaW5kUG9wdXAocG9wdXBfNWEzYmYyYjUwODVlNGIwOWIyMTFiNGY0OTdmMjE4ZjkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80YzI3NWUxMGIyOWE0YmM2YjI0MmMyMDViNzAxOTJmYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk5MjU2NSwgLTMuNjYyNTg5Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExNTlhNzIxODJkMjQyNjliM2RhZjM4OThlNzMxNTQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlMWMxY2NiOGUwYjRlNjRhMGYxMmM4YWZkZmZkMTYzID0gJChgPGRpdiBpZD0iaHRtbF81ZTFjMWNjYjhlMGI0ZTY0YTBmMTJjOGFmZGZmZDE2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTI1NjUsIC0zLjY2MjU4OTI5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTU5YTcyMTgyZDI0MjY5YjNkYWYzODk4ZTczMTU0MS5zZXRDb250ZW50KGh0bWxfNWUxYzFjY2I4ZTBiNGU2NGEwZjEyYzhhZmRmZmQxNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YzI3NWUxMGIyOWE0YmM2YjI0MmMyMDViNzAxOTJmYy5iaW5kUG9wdXAocG9wdXBfYTE1OWE3MjE4MmQyNDI2OWIzZGFmMzg5OGU3MzE1NDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80OTBmMTBmYjE4Nzg0YjdkOGRjMWQ2MDM4OTM2NGM3YiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MjAwNiwgLTMuNjQ2NTk3Nzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMTNhODMyNGI3NjQ2YzA5MjIxMTdiZDEyOTVkYTk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmY2QyMmFjNzg5MzQ4OGY4NzkyZjc4M2ViNmQwMzdmID0gJChgPGRpdiBpZD0iaHRtbF9kZmNkMjJhYzc4OTM0ODhmODc5MmY3ODNlYjZkMDM3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzIwMDYsIC0zLjY0NjU5Nzc5OTk5OTk5OTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTEzYTgzMjRiNzY0NmMwOTIyMTE3YmQxMjk1ZGE5Ny5zZXRDb250ZW50KGh0bWxfZGZjZDIyYWM3ODkzNDg4Zjg3OTJmNzgzZWI2ZDAzN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80OTBmMTBmYjE4Nzg0YjdkOGRjMWQ2MDM4OTM2NGM3Yi5iaW5kUG9wdXAocG9wdXBfMDExM2E4MzI0Yjc2NDZjMDkyMjExN2JkMTI5NWRhOTcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jZTE0Y2E5ZmVjMjk0YmJmOTQzYjIyNmZjZmExMjYzYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzkyMTAyNywgLTMuNzAxMDIyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNlY2I5ODBmYjhiNGU1MjhmMzY0NzMxOTEzOTliNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E5MzhjNDUyNjY1NDU4ZmI5MTkxOTdkMzU0YTVkYzkgPSAkKGA8ZGl2IGlkPSJodG1sX2NhOTM4YzQ1MjY2NTQ1OGZiOTE5MTk3ZDM1NGE1ZGM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzkyMTAyNywgLTMuNzAxMDIyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNlY2I5ODBmYjhiNGU1MjhmMzY0NzMxOTEzOTliNDIuc2V0Q29udGVudChodG1sX2NhOTM4YzQ1MjY2NTQ1OGZiOTE5MTk3ZDM1NGE1ZGM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2UxNGNhOWZlYzI5NGJiZjk0M2IyMjZmY2ZhMTI2M2IuYmluZFBvcHVwKHBvcHVwXzgzZWNiOTgwZmI4YjRlNTI4ZjM2NDczMTkxMzk5YjQyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMGE1ZDk0NWZjNWIwNGE5ODljN2I4Yzg1OGFjNzBkMWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ3NiwgLTMuNjQ2MDcyNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwMDQwNDU3NTA1YzRiNjdhNGExNzgxZjAwYzA3ZTY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5ZGY5YjVhZmY1MjRhYjFiNjAwNzVmNGE4NmQ0OGY3ID0gJChgPGRpdiBpZD0iaHRtbF83OWRmOWI1YWZmNTI0YWIxYjYwMDc1ZjRhODZkNDhmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ3NiwgLTMuNjQ2MDcyNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwMDQwNDU3NTA1YzRiNjdhNGExNzgxZjAwYzA3ZTY5LnNldENvbnRlbnQoaHRtbF83OWRmOWI1YWZmNTI0YWIxYjYwMDc1ZjRhODZkNDhmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBhNWQ5NDVmYzViMDRhOTg5YzdiOGM4NThhYzcwZDFkLmJpbmRQb3B1cChwb3B1cF81MDA0MDQ1NzUwNWM0YjY3YTRhMTc4MWYwMGMwN2U2OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzU2YWE3NGY0ZmMyNzRmZmY4MTVlMzEwYTFmYTE4YzJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3MjA4OTk5OTk5OTQsIC0zLjYxNjQ3NzIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOGI2ODJlN2MxOGM0YzdjODgyYzU2MDNjNjAyOTUxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZmNkMWQxOTY3NDc0MjZkYmVjM2JkNmJmYTMyMWE5NiA9ICQoYDxkaXYgaWQ9Imh0bWxfNGZjZDFkMTk2NzQ3NDI2ZGJlYzNiZDZiZmEzMjFhOTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU3MjA4OTk5OTk5OTQsIC0zLjYxNjQ3NzIwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOGI2ODJlN2MxOGM0YzdjODgyYzU2MDNjNjAyOTUxMy5zZXRDb250ZW50KGh0bWxfNGZjZDFkMTk2NzQ3NDI2ZGJlYzNiZDZiZmEzMjFhOTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NmFhNzRmNGZjMjc0ZmZmODE1ZTMxMGExZmExOGMyYi5iaW5kUG9wdXAocG9wdXBfYThiNjgyZTdjMThjNGM3Yzg4MmM1NjAzYzYwMjk1MTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kNTcwMmRlZWUzYTE0NzNjYjNhZTZmZjg1NmM3MmVjNCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MTA0NywgLTMuNjE1Mzg5NzAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5YTgxZDdlMTMxMjQxMDM4OTBhYTJmMGNiZGVlMTQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxNTIyM2E5NTgxZDRjMDk4N2E0ODRhZmQ4YjY0YmJjID0gJChgPGRpdiBpZD0iaHRtbF8wMTUyMjNhOTU4MWQ0YzA5ODdhNDg0YWZkOGI2NGJiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTEwNDcsIC0zLjYxNTM4OTcwMDAwMDAwMDZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOWE4MWQ3ZTEzMTI0MTAzODkwYWEyZjBjYmRlZTE0OS5zZXRDb250ZW50KGh0bWxfMDE1MjIzYTk1ODFkNGMwOTg3YTQ4NGFmZDhiNjRiYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNTcwMmRlZWUzYTE0NzNjYjNhZTZmZjg1NmM3MmVjNC5iaW5kUG9wdXAocG9wdXBfYzlhODFkN2UxMzEyNDEwMzg5MGFhMmYwY2JkZWUxNDkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iN2E2OGFhODAzNWU0NjdlYTIzNGM0YzZmMmExYjYxOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTAzMSwgLTMuNjQzMjY5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0NDFkODVkN2RmNzRmNTFhNjA0MTY5ZmQ3NDgwYTllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiNWM5YTFjYzNmYzQ4OWI5MzM3ZWNiOTJhZGRlYmIzID0gJChgPGRpdiBpZD0iaHRtbF80YjVjOWExY2MzZmM0ODliOTMzN2VjYjkyYWRkZWJiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUwMzEsIC0zLjY0MzI2OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDQxZDg1ZDdkZjc0ZjUxYTYwNDE2OWZkNzQ4MGE5ZS5zZXRDb250ZW50KGh0bWxfNGI1YzlhMWNjM2ZjNDg5YjkzMzdlY2I5MmFkZGViYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iN2E2OGFhODAzNWU0NjdlYTIzNGM0YzZmMmExYjYxOS5iaW5kUG9wdXAocG9wdXBfNzQ0MWQ4NWQ3ZGY3NGY1MWE2MDQxNjlmZDc0ODBhOWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mN2RjN2FjYzAwOTM0ZThmYmM4NGQ3MmE2YzFiM2Q3NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MDgxNCwgLTMuNjQ2NDQ4MDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiOTE1ZmFjODdmZTQxYjRhYjkxZjIyOTMwZTEyNWEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2ZDQ3YWZlNDkwMjRlOTFiYjlkY2E5N2RiMjZjMmM0ID0gJChgPGRpdiBpZD0iaHRtbF9jNmQ0N2FmZTQ5MDI0ZTkxYmI5ZGNhOTdkYjI2YzJjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzA4MTQsIC0zLjY0NjQ0ODAwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjkxNWZhYzg3ZmU0MWI0YWI5MWYyMjkzMGUxMjVhMy5zZXRDb250ZW50KGh0bWxfYzZkNDdhZmU0OTAyNGU5MWJiOWRjYTk3ZGIyNmMyYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mN2RjN2FjYzAwOTM0ZThmYmM4NGQ3MmE2YzFiM2Q3Ny5iaW5kUG9wdXAocG9wdXBfOGI5MTVmYWM4N2ZlNDFiNGFiOTFmMjI5MzBlMTI1YTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mMjY2YjAwMGVhYjI0NzFiODM2MTc4NTVkOTM1YzVjZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyMDI0NSwgLTMuODA0NjExNzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkYzM1YjRjZjkyMDQ3ZTNhZDUxODExNDc0ZjY0M2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5Y2VjZjcwZGM1OTQzNDFiZTIzNjI1MWQ0M2EyOTYwID0gJChgPGRpdiBpZD0iaHRtbF8zOWNlY2Y3MGRjNTk0MzQxYmUyMzYyNTFkNDNhMjk2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMjAyNDUsIC0zLjgwNDYxMTc5OTk5OTk5OTVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGMzNWI0Y2Y5MjA0N2UzYWQ1MTgxMTQ3NGY2NDNhMi5zZXRDb250ZW50KGh0bWxfMzljZWNmNzBkYzU5NDM0MWJlMjM2MjUxZDQzYTI5NjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMjY2YjAwMGVhYjI0NzFiODM2MTc4NTVkOTM1YzVjZS5iaW5kUG9wdXAocG9wdXBfZWRjMzViNGNmOTIwNDdlM2FkNTE4MTE0NzRmNjQzYTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wZjgwYzNjMGRhODY0ODgxYjUwZmExNmE4NmI5NDQ0NSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI1Mzg4Nzk5OTk5OTk1LCAtMy42NDQ3MDY1MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjc0MDZlNzRlMzg3NDU5ZDhmYjY2MWNhNjVmM2ZkZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2U5M2UzMjQxYzg4NGMwMThmMjlhNDRjNWI4YTljOGUgPSAkKGA8ZGl2IGlkPSJodG1sXzdlOTNlMzI0MWM4ODRjMDE4ZjI5YTQ0YzViOGE5YzhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI1Mzg4Nzk5OTk5OTk1LCAtMy42NDQ3MDY1MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjc0MDZlNzRlMzg3NDU5ZDhmYjY2MWNhNjVmM2ZkZTcuc2V0Q29udGVudChodG1sXzdlOTNlMzI0MWM4ODRjMDE4ZjI5YTQ0YzViOGE5YzhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGY4MGMzYzBkYTg2NDg4MWI1MGZhMTZhODZiOTQ0NDUuYmluZFBvcHVwKHBvcHVwXzI3NDA2ZTc0ZTM4NzQ1OWQ4ZmI2NjFjYTY1ZjNmZGU3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZDJiZTIzNGE3Mzg0NGYyYmJjNmFmYjk1MWExZTliNjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjkyNjksIC0zLjY0NzA2NDhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOWY4ZWRjOWRkZDQ0NmE3OTRjZjM1OWMxZWY1ODllZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTYyMDUzZDBiN2M0NTFiODg1YmRhM2FlYWM0NTMxYSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjk2MjA1M2QwYjdjNDUxYjg4NWJkYTNhZWFjNDUzMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MjY5LCAtMy42NDcwNjQ4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjlmOGVkYzlkZGQ0NDZhNzk0Y2YzNTljMWVmNTg5ZWUuc2V0Q29udGVudChodG1sXzI5NjIwNTNkMGI3YzQ1MWI4ODViZGEzYWVhYzQ1MzFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDJiZTIzNGE3Mzg0NGYyYmJjNmFmYjk1MWExZTliNjcuYmluZFBvcHVwKHBvcHVwXzI5ZjhlZGM5ZGRkNDQ2YTc5NGNmMzU5YzFlZjU4OWVlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjNkMjMwYzhjOGJmNGE4OGEyNWQ0NWQwZmY3YzdiM2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ0NzMzNDMsIC0zLjY2MDY2NDcwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2U3YTMzMmEyODg0ZDdkODJkZDFlYTk2YzFhMzdiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWUzOWFhMjBkZGE0ZDg1YjA5NTQxMzk3OTg1MWYxMSA9ICQoYDxkaXYgaWQ9Imh0bWxfMWVlMzlhYTIwZGRhNGQ4NWIwOTU0MTM5Nzk4NTFmMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NDczMzQzLCAtMy42NjA2NjQ3MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWNlN2EzMzJhMjg4NGQ3ZDgyZGQxZWE5NmMxYTM3YjAuc2V0Q29udGVudChodG1sXzFlZTM5YWEyMGRkYTRkODViMDk1NDEzOTc5ODUxZjExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjNkMjMwYzhjOGJmNGE4OGEyNWQ0NWQwZmY3YzdiM2UuYmluZFBvcHVwKHBvcHVwXzFjZTdhMzMyYTI4ODRkN2Q4MmRkMWVhOTZjMWEzN2IwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTgyYzNjZTdlODQwNGQzYWE2NThlNmMxODk0ZTVhMjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjk0Nzc5OTk5OTk5NSwgLTMuNjQ0NjAxMjAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyZmYxYjllNjkwZTQzYTJhZmE5ZTVmZWIyODEwYWVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5Y2Y3NjE2YmM1YTRjNzZhYTIwZTNkMzYxYWYxYjlmID0gJChgPGRpdiBpZD0iaHRtbF8wOWNmNzYxNmJjNWE0Yzc2YWEyMGUzZDM2MWFmMWI5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjk0Nzc5OTk5OTk5NSwgLTMuNjQ0NjAxMjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyZmYxYjllNjkwZTQzYTJhZmE5ZTVmZWIyODEwYWVlLnNldENvbnRlbnQoaHRtbF8wOWNmNzYxNmJjNWE0Yzc2YWEyMGUzZDM2MWFmMWI5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE4MmMzY2U3ZTg0MDRkM2FhNjU4ZTZjMTg5NGU1YTI3LmJpbmRQb3B1cChwb3B1cF8xMmZmMWI5ZTY5MGU0M2EyYWZhOWU1ZmViMjgxMGFlZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA4OTgwYmE0OGE0ZDQ2MjY5ZjdhM2EyOGI0MmY4NTFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTk5MzU3LCAtMy42NjQ0Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0ZGM1NWI2ZjVkMTRiOWRhOGMxZmJmMWUyYzYzYjg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0NjQ0NDEyYWNiNDQxNTI4ZWRlZDZkYWM3OGFjMjFmID0gJChgPGRpdiBpZD0iaHRtbF83NDY0NDQxMmFjYjQ0MTUyOGVkZWQ2ZGFjNzhhYzIxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTkzNTcsIC0zLjY2NDQ2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRkYzU1YjZmNWQxNGI5ZGE4YzFmYmYxZTJjNjNiODUuc2V0Q29udGVudChodG1sXzc0NjQ0NDEyYWNiNDQxNTI4ZWRlZDZkYWM3OGFjMjFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDg5ODBiYTQ4YTRkNDYyNjlmN2EzYTI4YjQyZjg1MWEuYmluZFBvcHVwKHBvcHVwXzg0ZGM1NWI2ZjVkMTRiOWRhOGMxZmJmMWUyYzYzYjg1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjExMGNiMzMwYTgxNDgzNjkxNTU3NDEwMGEwZTQ4YWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNTAwMDAwMDAwNiwgLTMuNjQzMjA1Nzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxYWRiMWM5MTA5NzRmZjI4MmI5YWQyY2FiMGRjYjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2YzYzZWIzYmI5ZTQ5OWRiOWFhOTE4Yzg3YmMwOTU3ID0gJChgPGRpdiBpZD0iaHRtbF9iNmM2M2ViM2JiOWU0OTlkYjlhYTkxOGM4N2JjMDk1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNTAwMDAwMDAwNiwgLTMuNjQzMjA1Nzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxYWRiMWM5MTA5NzRmZjI4MmI5YWQyY2FiMGRjYjNlLnNldENvbnRlbnQoaHRtbF9iNmM2M2ViM2JiOWU0OTlkYjlhYTkxOGM4N2JjMDk1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IxMTBjYjMzMGE4MTQ4MzY5MTU1NzQxMDBhMGU0OGFmLmJpbmRQb3B1cChwb3B1cF83MWFkYjFjOTEwOTc0ZmYyODJiOWFkMmNhYjBkY2IzZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzUxODgwNDFkYzAzNzQyZTA4MDc5ZjkzNjIzYmRjOTZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjEzNDAyLCAtMy42Mjg1OTM0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQyYzczYmUwMTE1NDc3OTg3OTliNDI2MzA3NDNiMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzU3ZjhmZTZjY2I1NDYyYTkwNjIxNmY4ZTUxZTA4YzYgPSAkKGA8ZGl2IGlkPSJodG1sXzM1N2Y4ZmU2Y2NiNTQ2MmE5MDYyMTZmOGU1MWUwOGM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzQwMiwgLTMuNjI4NTkzNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkMmM3M2JlMDExNTQ3Nzk4Nzk5YjQyNjMwNzQzYjE1LnNldENvbnRlbnQoaHRtbF8zNTdmOGZlNmNjYjU0NjJhOTA2MjE2ZjhlNTFlMDhjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxODgwNDFkYzAzNzQyZTA4MDc5ZjkzNjIzYmRjOTZiLmJpbmRQb3B1cChwb3B1cF82ZDJjNzNiZTAxMTU0Nzc5ODc5OWI0MjYzMDc0M2IxNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ3ZTI1NTMxYmM4NzQzZThhNzA2NWZkYWJkOTUyZjVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA5NTIsIC0zLjY0MTIyOTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTJiYzQ3OWFmMGQ0MGY0ODdiODAyYzkzZTNhNTA0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMDNiYzFiNGFmOWY0ZGUyOWEyMmNiYjkxZGIwZTE5MiA9ICQoYDxkaXYgaWQ9Imh0bWxfYzAzYmMxYjRhZjlmNGRlMjlhMjJjYmI5MWRiMGUxOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA5NTIsIC0zLjY0MTIyOTJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTJiYzQ3OWFmMGQ0MGY0ODdiODAyYzkzZTNhNTA0NS5zZXRDb250ZW50KGh0bWxfYzAzYmMxYjRhZjlmNGRlMjlhMjJjYmI5MWRiMGUxOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80N2UyNTUzMWJjODc0M2U4YTcwNjVmZGFiZDk1MmY1Zi5iaW5kUG9wdXAocG9wdXBfZDUyYmM0NzlhZjBkNDBmNDg3YjgwMmM5M2UzYTUwNDUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82ZmVmMDU1ODE0NjU0YWRhOTg4MTZjYzNmNTg1ODFkOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzg4NTcwNiwgLTMuNjA4ODI2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzUxMzkyYjUwMWVlNDkwOTkwNDliZjI5ZjY3ZmQ5ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGYwNGRjNmU3MTczNGE2YWE5NjllYzMyZGMwZWViYWMgPSAkKGA8ZGl2IGlkPSJodG1sXzhmMDRkYzZlNzE3MzRhNmFhOTY5ZWMzMmRjMGVlYmFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzg4NTcwNiwgLTMuNjA4ODI2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzUxMzkyYjUwMWVlNDkwOTkwNDliZjI5ZjY3ZmQ5ZjEuc2V0Q29udGVudChodG1sXzhmMDRkYzZlNzE3MzRhNmFhOTY5ZWMzMmRjMGVlYmFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmZlZjA1NTgxNDY1NGFkYTk4ODE2Y2MzZjU4NTgxZDguYmluZFBvcHVwKHBvcHVwXzM1MTM5MmI1MDFlZTQ5MDk5MDQ5YmYyOWY2N2ZkOWYxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2M4NGIxN2Y3N2JiNDZiODlkYjkyZjIwOTJjYTI1MGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjI5Nzk0ODYwMDAwMDAwNSwgLTMuOTUxNTA5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4YTFjYTA1OGFmMzRjY2E4ZWE4MDA4MDY0ZGYyOTIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzZTBlZmRjNTI1MzQwMDk5NGZmYTMwNmZjYzAzYTZkID0gJChgPGRpdiBpZD0iaHRtbF8yM2UwZWZkYzUyNTM0MDA5OTRmZmEzMDZmY2MwM2E2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjI5Nzk0ODYwMDAwMDAwNSwgLTMuOTUxNTA5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4YTFjYTA1OGFmMzRjY2E4ZWE4MDA4MDY0ZGYyOTIzLnNldENvbnRlbnQoaHRtbF8yM2UwZWZkYzUyNTM0MDA5OTRmZmEzMDZmY2MwM2E2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdjODRiMTdmNzdiYjQ2Yjg5ZGI5MmYyMDkyY2EyNTBkLmJpbmRQb3B1cChwb3B1cF8wOGExY2EwNThhZjM0Y2NhOGVhODAwODA2NGRmMjkyMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY1M2ZjZDNkYTc1NjQ5YjE5NGY3OWRlZGUwZjcyMjEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjU2ODE4OTk5OTk5OTQsIC0zLjc5ODAzODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZDA2MDU0ZjQ5NWQ0ZDk2ODFiYjg4Y2RkMDVjNGE2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTU1MzgzYzU0YWM0MDk5ODg5OWFmNzkwNTViYjc5YiA9ICQoYDxkaXYgaWQ9Imh0bWxfNzE1NTM4M2M1NGFjNDA5OTg4OTlhZjc5MDU1YmI3OWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjU2ODE4OTk5OTk5OTQsIC0zLjc5ODAzODhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZDA2MDU0ZjQ5NWQ0ZDk2ODFiYjg4Y2RkMDVjNGE2Ni5zZXRDb250ZW50KGh0bWxfNzE1NTM4M2M1NGFjNDA5OTg4OTlhZjc5MDU1YmI3OWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTNmY2QzZGE3NTY0OWIxOTRmNzlkZWRlMGY3MjIxMi5iaW5kUG9wdXAocG9wdXBfZWQwNjA1NGY0OTVkNGQ5NjgxYmI4OGNkZDA1YzRhNjYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85OTYwMGFlN2I4Mzc0MmVhOTg5MmFiNmMwNDM0M2ZkMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4MTA1Mjk5OTk5OTksIC0zLjY0MzQzNTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTVhNTVmZjk1NjA0MzhhYmMwNTE1ODlhNGMzZDczNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGU4YWRmYjJlZGU0YTJkOTgwMzRiZGMyZWE0ZmJiMSA9ICQoYDxkaXYgaWQ9Imh0bWxfNWRlOGFkZmIyZWRlNGEyZDk4MDM0YmRjMmVhNGZiYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjgxMDUyOTk5OTk5OSwgLTMuNjQzNDM1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlNWE1NWZmOTU2MDQzOGFiYzA1MTU4OWE0YzNkNzM0LnNldENvbnRlbnQoaHRtbF81ZGU4YWRmYjJlZGU0YTJkOTgwMzRiZGMyZWE0ZmJiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk5NjAwYWU3YjgzNzQyZWE5ODkyYWI2YzA0MzQzZmQzLmJpbmRQb3B1cChwb3B1cF9mZTVhNTVmZjk1NjA0MzhhYmMwNTE1ODlhNGMzZDczNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFlOTFjNDE1YWVlOTQyOGZhMjk4ZDQyMjZiNDdmOTdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjE5OTU5LCAtMy44MDM2MDA4OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM2YWRmZGMzOTllNDFmNmIxZjlkZDBmMWIxNGVlYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTFiYmUzNzFmZjk3NDEwMThhZjZhZGQ5NDNmYmYzOGYgPSAkKGA8ZGl2IGlkPSJodG1sXzUxYmJlMzcxZmY5NzQxMDE4YWY2YWRkOTQzZmJmMzhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxOTk1OSwgLTMuODAzNjAwODk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzNmFkZmRjMzk5ZTQxZjZiMWY5ZGQwZjFiMTRlZWFlLnNldENvbnRlbnQoaHRtbF81MWJiZTM3MWZmOTc0MTAxOGFmNmFkZDk0M2ZiZjM4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFlOTFjNDE1YWVlOTQyOGZhMjk4ZDQyMjZiNDdmOTdjLmJpbmRQb3B1cChwb3B1cF8wMzZhZGZkYzM5OWU0MWY2YjFmOWRkMGYxYjE0ZWVhZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzAzOTE3MDZlOTVmZjRkY2RiODU0NGVhMDY4NjRhNmU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ0OTI2LCAtMy42NjUxNTM0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWU3ZmE1ZjEwM2NhNGRmM2E4MjljMTg1ODAxMjFiODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU2MmViMGVkOGVhNGE5ZGI3Nzg3OTBhZTExM2NjZDIgPSAkKGA8ZGl2IGlkPSJodG1sX2Q1NjJlYjBlZDhlYTRhOWRiNzc4NzkwYWUxMTNjY2QyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0NDkyNiwgLTMuNjY1MTUzNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlN2ZhNWYxMDNjYTRkZjNhODI5YzE4NTgwMTIxYjg1LnNldENvbnRlbnQoaHRtbF9kNTYyZWIwZWQ4ZWE0YTlkYjc3ODc5MGFlMTEzY2NkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAzOTE3MDZlOTVmZjRkY2RiODU0NGVhMDY4NjRhNmU3LmJpbmRQb3B1cChwb3B1cF9hZTdmYTVmMTAzY2E0ZGYzYTgyOWMxODU4MDEyMWI4NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YxNTc4NTg0M2Q1YjQ3YzdiMjlmNGExOWIwZGY1M2NiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszOS45NjE4NjkxLCAtNC44MjMyNTA0OTk5OTk5OTldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZDJmZTAwODViYzA0YWYyYmM5OGQ0Y2RlNjdiMmMyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YmExOTBkODVlNTM0ZGNlYjE2MTNkMTE5ZDE1OGI4YiA9ICQoYDxkaXYgaWQ9Imh0bWxfNGJhMTkwZDg1ZTUzNGRjZWIxNjEzZDExOWQxNThiOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlszOS45NjE4NjkxLCAtNC44MjMyNTA0OTk5OTk5OTldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDJmZTAwODViYzA0YWYyYmM5OGQ0Y2RlNjdiMmMyMy5zZXRDb250ZW50KGh0bWxfNGJhMTkwZDg1ZTUzNGRjZWIxNjEzZDExOWQxNThiOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMTU3ODU4NDNkNWI0N2M3YjI5ZjRhMTliMGRmNTNjYi5iaW5kUG9wdXAocG9wdXBfZmQyZmUwMDg1YmMwNGFmMmJjOThkNGNkZTY3YjJjMjMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wZjliODFiZTNiODk0NWMyYTM0ZjY0MDQwZmM0NjhiNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NDU4NiwgLTMuNjQ2MTExNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4NzdiNGM0YjY3MDQ3ODE4YWJlNjgwOGQxZTVjZTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0ZmI4NTdiMDljZjQzOGJhNTI2OWRkNDA4YTU4ZDg2ID0gJChgPGRpdiBpZD0iaHRtbF9iNGZiODU3YjA5Y2Y0MzhiYTUyNjlkZDQwOGE1OGQ4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ1ODYsIC0zLjY0NjExMTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODc3YjRjNGI2NzA0NzgxOGFiZTY4MDhkMWU1Y2U0MC5zZXRDb250ZW50KGh0bWxfYjRmYjg1N2IwOWNmNDM4YmE1MjY5ZGQ0MDhhNThkODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZjliODFiZTNiODk0NWMyYTM0ZjY0MDQwZmM0NjhiNi5iaW5kUG9wdXAocG9wdXBfMTg3N2I0YzRiNjcwNDc4MThhYmU2ODA4ZDFlNWNlNDApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85OGEwYTA4MGQ3OTA0MWQ3OWE3NmZjZDQ2OTBmZWVkNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk0MjYwNiwgLTMuNzAxMDgxNTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyNTMzMDNlMjQ5MzRmNjFiNTdlYjk5MzQyOTYzMzk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1YWZkMmE3ZGNmZTRmMzc5NTAyOGUyZGM2NTJhMzQ4ID0gJChgPGRpdiBpZD0iaHRtbF82NWFmZDJhN2RjZmU0ZjM3OTUwMjhlMmRjNjUyYTM0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NDI2MDYsIC0zLjcwMTA4MTU5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjUzMzAzZTI0OTM0ZjYxYjU3ZWI5OTM0Mjk2MzM5OS5zZXRDb250ZW50KGh0bWxfNjVhZmQyYTdkY2ZlNGYzNzk1MDI4ZTJkYzY1MmEzNDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85OGEwYTA4MGQ3OTA0MWQ3OWE3NmZjZDQ2OTBmZWVkNy5iaW5kUG9wdXAocG9wdXBfYzI1MzMwM2UyNDkzNGY2MWI1N2ViOTkzNDI5NjMzOTkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yMDQ0MDYwM2RmMDA0ZGU0Yjc0NDQ4MWNkNGQ0ZmJhOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTM3MTg1LCAtMy42MTgwMjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmQ5ZDgwMmMwNWQ0NTc4YjdhMzIwZjhjYzg4OGUyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNWMyNDc5NjhkNzc0M2RiOGU2YzFlODExYmNhNGVhNyA9ICQoYDxkaXYgaWQ9Imh0bWxfYTVjMjQ3OTY4ZDc3NDNkYjhlNmMxZTgxMWJjYTRlYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzcxODUsIC0zLjYxODAyNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2ZDlkODAyYzA1ZDQ1NzhiN2EzMjBmOGNjODg4ZTIyLnNldENvbnRlbnQoaHRtbF9hNWMyNDc5NjhkNzc0M2RiOGU2YzFlODExYmNhNGVhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIwNDQwNjAzZGYwMDRkZTRiNzQ0NDgxY2Q0ZDRmYmE4LmJpbmRQb3B1cChwb3B1cF8zNmQ5ZDgwMmMwNWQ0NTc4YjdhMzIwZjhjYzg4OGUyMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA0YjRiOWM3MTU2MjQwNzFiMTU1ODRiYWMyOTZhNTNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI5NzY3OTk5OTk5OTYsIC0zLjYyNDQzNjZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzRlMDgyMjVjNzY0NWE3YTRhNzAwMWIyN2RhODNkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NjcxZTVjMjY3Y2I0NWRkYThmMDcxMzIxODBlMDAyNiA9ICQoYDxkaXYgaWQ9Imh0bWxfNTY3MWU1YzI2N2NiNDVkZGE4ZjA3MTMyMTgwZTAwMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTI5NzY3OTk5OTk5OTYsIC0zLjYyNDQzNjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzRlMDgyMjVjNzY0NWE3YTRhNzAwMWIyN2RhODNkYS5zZXRDb250ZW50KGh0bWxfNTY3MWU1YzI2N2NiNDVkZGE4ZjA3MTMyMTgwZTAwMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNGI0YjljNzE1NjI0MDcxYjE1NTg0YmFjMjk2YTUzYy5iaW5kUG9wdXAocG9wdXBfZjc0ZTA4MjI1Yzc2NDVhN2E0YTcwMDFiMjdkYTgzZGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kM2YxOTNjY2JkNzA0NTJiOTAwZjc0ZjZhMjkzNzZhMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyNDY5Nzk5OTk5OTk1LCAtMy44MDQwNzk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM1NWFjYzg4ODdlNDk1MmEyOTA0NDc0NTg5MDUzNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjFjM2EwNzgyMzY0NDViMWEyOTBkNWE2YTQxNmE0OWQgPSAkKGA8ZGl2IGlkPSJodG1sX2YxYzNhMDc4MjM2NDQ1YjFhMjkwZDVhNmE0MTZhNDlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIyNDY5Nzk5OTk5OTk1LCAtMy44MDQwNzk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM1NWFjYzg4ODdlNDk1MmEyOTA0NDc0NTg5MDUzNGYuc2V0Q29udGVudChodG1sX2YxYzNhMDc4MjM2NDQ1YjFhMjkwZDVhNmE0MTZhNDlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDNmMTkzY2NiZDcwNDUyYjkwMGY3NGY2YTI5Mzc2YTAuYmluZFBvcHVwKHBvcHVwXzkzNTVhY2M4ODg3ZTQ5NTJhMjkwNDQ3NDU4OTA1MzRmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2FkYjhhNTg1ODc3NDY4Mzk3ZTVhNDAzOWY3ZjQ4MDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNzQsIC0zLjY0MzE3NTcwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yODVlNTFhMWZlNzk0OGRkYjdjMTI4YmJiOGIzZWI2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kM2QyODcwYTQ0NWY0YzEwYWRlYjFlNjQ2MGQ4ZTA1MCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDNkMjg3MGE0NDVmNGMxMGFkZWIxZTY0NjBkOGUwNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MTc0LCAtMy42NDMxNzU3MDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg1ZTUxYTFmZTc5NDhkZGI3YzEyOGJiYjhiM2ViNjguc2V0Q29udGVudChodG1sX2QzZDI4NzBhNDQ1ZjRjMTBhZGViMWU2NDYwZDhlMDUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2FkYjhhNTg1ODc3NDY4Mzk3ZTVhNDAzOWY3ZjQ4MDUuYmluZFBvcHVwKHBvcHVwXzI4NWU1MWExZmU3OTQ4ZGRiN2MxMjhiYmI4YjNlYjY4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWJjNDRjZjk5ZDViNGNmZWJmODM0OWQ3NTkwODZjMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNywgLTMuNjQzMTc2MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjN2ZjM2QwYmU1MjRiNGE5OGJiMWQ1NjJiNzgzMTY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1OGQ4ZGVhNmNjYzQ2YjhiYTM5ZjExZjdlNjYyMDNkID0gJChgPGRpdiBpZD0iaHRtbF8wNThkOGRlYTZjY2M0NmI4YmEzOWYxMWY3ZTY2MjAzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNywgLTMuNjQzMTc2MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjN2ZjM2QwYmU1MjRiNGE5OGJiMWQ1NjJiNzgzMTY5LnNldENvbnRlbnQoaHRtbF8wNThkOGRlYTZjY2M0NmI4YmEzOWYxMWY3ZTY2MjAzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFiYzQ0Y2Y5OWQ1YjRjZmViZjgzNDlkNzU5MDg2YzM5LmJpbmRQb3B1cChwb3B1cF9lYzdmYzNkMGJlNTI0YjRhOThiYjFkNTYyYjc4MzE2OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VkZDY2ZTg4OGMzMTQzMDliOWJiZGFlOTM0MGZiYjdiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjM1ODE3OTk5OTk5OTQsIC0zLjYyNzMyOTQ5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjQ1NWVlYzdjNzQ0NDllYjg2N2ZhMGY0OWYxZjNkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjI5YTJiNjdmZDU0NmI4YWMxNmU2MjlmODA4YzZiZCA9ICQoYDxkaXYgaWQ9Imh0bWxfYjYyOWEyYjY3ZmQ1NDZiOGFjMTZlNjI5ZjgwOGM2YmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjM1ODE3OTk5OTk5OTQsIC0zLjYyNzMyOTQ5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjQ1NWVlYzdjNzQ0NDllYjg2N2ZhMGY0OWYxZjNkMC5zZXRDb250ZW50KGh0bWxfYjYyOWEyYjY3ZmQ1NDZiOGFjMTZlNjI5ZjgwOGM2YmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZGQ2NmU4ODhjMzE0MzA5YjliYmRhZTkzNDBmYmI3Yi5iaW5kUG9wdXAocG9wdXBfMmY0NTVlZWM3Yzc0NDQ5ZWI4NjdmYTBmNDlmMWYzZDApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80MTY5MDVhODk0NTE0ZjQwYjZiZTM2YTM0YjdlMTQxYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDAzODE0MywgLTMuNjYyMzE4MTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczOWMzMzVkYWM1ZDQ0NjY5Mzg3ZGRmYzYxNmZkYTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzM2UxOTBlN2VjZTQ4Yjg4YjNiNTgxODUxYjkzZGM5ID0gJChgPGRpdiBpZD0iaHRtbF8yMzNlMTkwZTdlY2U0OGI4OGIzYjU4MTg1MWI5M2RjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwMzgxNDMsIC0zLjY2MjMxODEwMDAwMDAwMDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzljMzM1ZGFjNWQ0NDY2OTM4N2RkZmM2MTZmZGExYy5zZXRDb250ZW50KGh0bWxfMjMzZTE5MGU3ZWNlNDhiODhiM2I1ODE4NTFiOTNkYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MTY5MDVhODk0NTE0ZjQwYjZiZTM2YTM0YjdlMTQxYS5iaW5kUG9wdXAocG9wdXBfNzM5YzMzNWRhYzVkNDQ2NjkzODdkZGZjNjE2ZmRhMWMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83MTVmYWJhZmRiNTc0ZTdiYWU0ODBjZWFiYjgyMWZjOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NjI2NSwgLTMuNjM5MzcyOV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjMDYzOTU4MmIxNzRkNWE4MzI3ZGU0M2IzZjU4MzYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4OWNlY2M1ODUxNTRkYzg5OGE1ZTViMzRiYmU5YjkxID0gJChgPGRpdiBpZD0iaHRtbF9iODljZWNjNTg1MTU0ZGM4OThhNWU1YjM0YmJlOWI5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjYyNjUsIC0zLjYzOTM3MjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzA2Mzk1ODJiMTc0ZDVhODMyN2RlNDNiM2Y1ODM2My5zZXRDb250ZW50KGh0bWxfYjg5Y2VjYzU4NTE1NGRjODk4YTVlNWIzNGJiZTliOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MTVmYWJhZmRiNTc0ZTdiYWU0ODBjZWFiYjgyMWZjOC5iaW5kUG9wdXAocG9wdXBfZGMwNjM5NTgyYjE3NGQ1YTgzMjdkZTQzYjNmNTgzNjMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wMzhmYjEwNGNkZGM0OGJlYTM4NGQ0OWY2ZTNiMTdkNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE4MzA2NSwgLTMuNjUzMzQyNzAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4MjU4ZjAxYzgwOTQ4N2NiNTQ3NGRhYTRlMGYyNTA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkZmEzOGRiZTI3ODRhNWM5NjEwYzc0MTA2NGUxNTkzID0gJChgPGRpdiBpZD0iaHRtbF9hZGZhMzhkYmUyNzg0YTVjOTYxMGM3NDEwNjRlMTU5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxODMwNjUsIC0zLjY1MzM0MjcwMDAwMDAwMDVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ODI1OGYwMWM4MDk0ODdjYjU0NzRkYWE0ZTBmMjUwNy5zZXRDb250ZW50KGh0bWxfYWRmYTM4ZGJlMjc4NGE1Yzk2MTBjNzQxMDY0ZTE1OTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMzhmYjEwNGNkZGM0OGJlYTM4NGQ0OWY2ZTNiMTdkNy5iaW5kUG9wdXAocG9wdXBfODgyNThmMDFjODA5NDg3Y2I1NDc0ZGFhNGUwZjI1MDcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wYTY4ZmViZDVjM2M0MzMzYjI5YmNlMTMyZWY0NjA0MyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDExOTEyNiwgLTMuODIwMDgxNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3NWQ5ODRlMTZhMzRlYmU4ODk4YTRhNjRiYjllNTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2OGM2OTA2YzI5MTQxY2JiNzAxMTM3ODYyYWFiNTU4ID0gJChgPGRpdiBpZD0iaHRtbF9mNjhjNjkwNmMyOTE0MWNiYjcwMTEzNzg2MmFhYjU1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMTkxMjYsIC0zLjgyMDA4MTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzVkOTg0ZTE2YTM0ZWJlODg5OGE0YTY0YmI5ZTUzYy5zZXRDb250ZW50KGh0bWxfZjY4YzY5MDZjMjkxNDFjYmI3MDExMzc4NjJhYWI1NTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYTY4ZmViZDVjM2M0MzMzYjI5YmNlMTMyZWY0NjA0My5iaW5kUG9wdXAocG9wdXBfYzc1ZDk4NGUxNmEzNGViZTg4OThhNGE2NGJiOWU1M2MpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mYTBhNzk4MTM4MjU0OTFlODYxODNjNDFlMjhiZDhjMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTE1MiwgLTMuNjQzMjAxMDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc4MGIwODJiZTExMDQxYWE4OTI1NjU0YjYyMDJlOTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkMWI2ZDc1ZTdlMjQwZDA4Njk0ZTE2NDQxNzdkMDk1ID0gJChgPGRpdiBpZD0iaHRtbF8yZDFiNmQ3NWU3ZTI0MGQwODY5NGUxNjQ0MTc3ZDA5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNTIsIC0zLjY0MzIwMTAwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ODBiMDgyYmUxMTA0MWFhODkyNTY1NGI2MjAyZTk5Yi5zZXRDb250ZW50KGh0bWxfMmQxYjZkNzVlN2UyNDBkMDg2OTRlMTY0NDE3N2QwOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYTBhNzk4MTM4MjU0OTFlODYxODNjNDFlMjhiZDhjMC5iaW5kUG9wdXAocG9wdXBfNzgwYjA4MmJlMTEwNDFhYTg5MjU2NTRiNjIwMmU5OWIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yOTBmZjAzYjljNjM0NTg5YmRkZTA4YjZiOTk2NzIxNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk3MDY2NSwgLTMuNjYxNTA3ODk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmMmEyYzE3MTZhNTQ2OGE4ZjRmZGYwOGJmNzJjYTcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzY2VmY2MyNWY4ZjRiMjQ4ODMxNDZiNGY2NDRiYmQ4ID0gJChgPGRpdiBpZD0iaHRtbF8yM2NlZmNjMjVmOGY0YjI0ODgzMTQ2YjRmNjQ0YmJkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NzA2NjUsIC0zLjY2MTUwNzg5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZjJhMmMxNzE2YTU0NjhhOGY0ZmRmMDhiZjcyY2E3Mi5zZXRDb250ZW50KGh0bWxfMjNjZWZjYzI1ZjhmNGIyNDg4MzE0NmI0ZjY0NGJiZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOTBmZjAzYjljNjM0NTg5YmRkZTA4YjZiOTk2NzIxNi5iaW5kUG9wdXAocG9wdXBfOWYyYTJjMTcxNmE1NDY4YThmNGZkZjA4YmY3MmNhNzIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zMzE4MzYwNTBiMTc0ZWQ2ODkwMzUzNjlkOTM1MDNhOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjQyMjk5OTk5OTksIC0zLjY0MDY4NDM5OTk5OTk5OTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80Y2VmYzA3NjVjZGY0NmI2OGE5NTk3YjM0Njg1YjFhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTE0OTcyZmEwZWI0MDQzODQ0MjM2NjcyOWU1YjkzZiA9ICQoYDxkaXYgaWQ9Imh0bWxfYTExNDk3MmZhMGViNDA0Mzg0NDIzNjY3MjllNWI5M2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDIyOTk5OTk5OSwgLTMuNjQwNjg0Mzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjZWZjMDc2NWNkZjQ2YjY4YTk1OTdiMzQ2ODViMWFlLnNldENvbnRlbnQoaHRtbF9hMTE0OTcyZmEwZWI0MDQzODQ0MjM2NjcyOWU1YjkzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMzMTgzNjA1MGIxNzRlZDY4OTAzNTM2OWQ5MzUwM2E5LmJpbmRQb3B1cChwb3B1cF80Y2VmYzA3NjVjZGY0NmI2OGE5NTk3YjM0Njg1YjFhZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM0YzZjYjAwMWM5MjRmMTNhZjJiZTQ4YmJlYzU4MzIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTY1MDE0LCAtMy42NjQxMzMyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI0OGI5MzQ3ZjY3NDM1M2EzNTdlNDJkMWU5MzczOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQ1MWRhMmVlZTBjNDU3MjkxMzljMTI1NTQ4ZDExZGIgPSAkKGA8ZGl2IGlkPSJodG1sXzE0NTFkYTJlZWUwYzQ1NzI5MTM5YzEyNTU0OGQxMWRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk2NTAxNCwgLTMuNjY0MTMzMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyNDhiOTM0N2Y2NzQzNTNhMzU3ZTQyZDFlOTM3Mzk0LnNldENvbnRlbnQoaHRtbF8xNDUxZGEyZWVlMGM0NTcyOTEzOWMxMjU1NDhkMTFkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM0YzZjYjAwMWM5MjRmMTNhZjJiZTQ4YmJlYzU4MzIwLmJpbmRQb3B1cChwb3B1cF81MjQ4YjkzNDdmNjc0MzUzYTM1N2U0MmQxZTkzNzM5NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdkOTgwMjhjNzIyZDRhOGE4YjMzMDQxOGNjY2VkMmI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xNzkyMjcwMDAwMDAwMDQsIC00LjEzODM4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4NjU0MzBjZTMyNjQ5ZTM4ZmQ1OGI5YmYxMDE3MzkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4MzUyZDczOWFiOTRlMWRiMzFkOTgxZGY2ZTllMDA2ID0gJChgPGRpdiBpZD0iaHRtbF9kODM1MmQ3MzlhYjk0ZTFkYjMxZDk4MWRmNmU5ZTAwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjE3OTIyNzAwMDAwMDAwNCwgLTQuMTM4Mzg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjg2NTQzMGNlMzI2NDllMzhmZDU4YjliZjEwMTczOTIuc2V0Q29udGVudChodG1sX2Q4MzUyZDczOWFiOTRlMWRiMzFkOTgxZGY2ZTllMDA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2Q5ODAyOGM3MjJkNGE4YThiMzMwNDE4Y2NjZWQyYjUuYmluZFBvcHVwKHBvcHVwX2Y4NjU0MzBjZTMyNjQ5ZTM4ZmQ1OGI5YmYxMDE3MzkyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTkyOWM1NDZmOWUzNDJjM2EyZWFkMTg0ZjczZTczNDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODQ3NzQsIC0zLjY0MzI4NjddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYWQ2NGM3YmFiZjE0ZDI2OGMxNGJhMmIyYmIyZDg1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjgxMDY2MWEzNDg0ODIxOTlmM2E0NjdlMmZmNWU1MSA9ICQoYDxkaXYgaWQ9Imh0bWxfOGY4MTA2NjFhMzQ4NDgyMTk5ZjNhNDY3ZTJmZjVlNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg0Nzc0LCAtMy42NDMyODY3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGFkNjRjN2JhYmYxNGQyNjhjMTRiYTJiMmJiMmQ4NWEuc2V0Q29udGVudChodG1sXzhmODEwNjYxYTM0ODQ4MjE5OWYzYTQ2N2UyZmY1ZTUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTkyOWM1NDZmOWUzNDJjM2EyZWFkMTg0ZjczZTczNDEuYmluZFBvcHVwKHBvcHVwX2RhZDY0YzdiYWJmMTRkMjY4YzE0YmEyYjJiYjJkODVhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZmQ4NjA1NjY1MWM2NGMyM2IwN2Q5NGY3YjhhYTBkZDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzcxMTc5OTk5OTk5NCwgLTMuNjUxNTk0Mjk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxOGY0YjM1NGU3ODQ0OGNiMjNlNmQ2ZmY3NmU5NWQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkZjQ3N2I4Zjc4OTQxODM4ZjNjM2M0YWQwNTU0NzgwID0gJChgPGRpdiBpZD0iaHRtbF8wZGY0NzdiOGY3ODk0MTgzOGYzYzNjNGFkMDU1NDc4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMzcxMTc5OTk5OTk5NCwgLTMuNjUxNTk0Mjk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxOGY0YjM1NGU3ODQ0OGNiMjNlNmQ2ZmY3NmU5NWQzLnNldENvbnRlbnQoaHRtbF8wZGY0NzdiOGY3ODk0MTgzOGYzYzNjNGFkMDU1NDc4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZkODYwNTY2NTFjNjRjMjNiMDdkOTRmN2I4YWEwZGQ0LmJpbmRQb3B1cChwb3B1cF9kMThmNGIzNTRlNzg0NDhjYjIzZTZkNmZmNzZlOTVkMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzJhMWM2MmQyYWQ3NDQzYjU4YjdkMmNlYzJiYjUyOGQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MDg1MDg4LCAtMy42NzU3ODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NWM4N2U0ZmE4ZGE0MTExOGQzOTVjMzljZWJlNjg0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmI0YTEwODM1ZDM0MzdlOTMyZjE0Y2QyYjkwYzc0NCA9ICQoYDxkaXYgaWQ9Imh0bWxfYmZiNGExMDgzNWQzNDM3ZTkzMmYxNGNkMmI5MGM3NDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MDg1MDg4LCAtMy42NzU3ODhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWM4N2U0ZmE4ZGE0MTExOGQzOTVjMzljZWJlNjg0OS5zZXRDb250ZW50KGh0bWxfYmZiNGExMDgzNWQzNDM3ZTkzMmYxNGNkMmI5MGM3NDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYTFjNjJkMmFkNzQ0M2I1OGI3ZDJjZWMyYmI1MjhkNC5iaW5kUG9wdXAocG9wdXBfNzVjODdlNGZhOGRhNDExMThkMzk1YzM5Y2ViZTY4NDkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jMWU0NmYyYTRiYWQ0OTBjYmNiMjk4NGFhMzYwMWYxNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzAzLCAtMy42Mjg1NTcxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzc3YmVjMjEwOTA0NGE1YTg2MTBmNjY3OTBlMmRkODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2EyOTJhYWRiYWIyNDhjY2I0NDZjNTYwMGYxY2NhNTAgPSAkKGA8ZGl2IGlkPSJodG1sXzdhMjkyYWFkYmFiMjQ4Y2NiNDQ2YzU2MDBmMWNjYTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzAzLCAtMy42Mjg1NTcxMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzc3YmVjMjEwOTA0NGE1YTg2MTBmNjY3OTBlMmRkODUuc2V0Q29udGVudChodG1sXzdhMjkyYWFkYmFiMjQ4Y2NiNDQ2YzU2MDBmMWNjYTUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzFlNDZmMmE0YmFkNDkwY2JjYjI5ODRhYTM2MDFmMTcuYmluZFBvcHVwKHBvcHVwX2M3N2JlYzIxMDkwNDRhNWE4NjEwZjY2NzkwZTJkZDg1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzQyNmU4ZDViYmZhNDZlOTk5NWZjYjBhZmNjODk3YjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ0OTE3NzI5OTk5OTk5NSwgLTMuNjk2MzkwN10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0NjBkNGQ2MzM4MDRiNjRiMTg1MTM2YmI2MDZhNjAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3NTZlMmJjNzI3MjQ3NzBiNThjZDE4NGVmYzI0NjQzID0gJChgPGRpdiBpZD0iaHRtbF9kNzU2ZTJiYzcyNzI0NzcwYjU4Y2QxODRlZmMyNDY0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ0OTE3NzI5OTk5OTk5NSwgLTMuNjk2MzkwN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0NjBkNGQ2MzM4MDRiNjRiMTg1MTM2YmI2MDZhNjAzLnNldENvbnRlbnQoaHRtbF9kNzU2ZTJiYzcyNzI0NzcwYjU4Y2QxODRlZmMyNDY0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM0MjZlOGQ1YmJmYTQ2ZTk5OTVmY2IwYWZjYzg5N2IzLmJpbmRQb3B1cChwb3B1cF8wNDYwZDRkNjMzODA0YjY0YjE4NTEzNmJiNjA2YTYwMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzc4NGY5ZGYxZmFjODQ5ODU4MWQxMmY3Y2NlNjUxOGQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU0ODk5LCAtMy42NjQ0NjUwMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTAwNjMyM2E2YTVkNGI5NGE2YWYzYjRlNThiYTliZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRhZmUwMGUxODBlNDFmYzkzYWZhYWYzYjgxZDU3MDUgPSAkKGA8ZGl2IGlkPSJodG1sXzlkYWZlMDBlMTgwZTQxZmM5M2FmYWFmM2I4MWQ1NzA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1NDg5OSwgLTMuNjY0NDY1MDAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwMDYzMjNhNmE1ZDRiOTRhNmFmM2I0ZTU4YmE5YmU1LnNldENvbnRlbnQoaHRtbF85ZGFmZTAwZTE4MGU0MWZjOTNhZmFhZjNiODFkNTcwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc4NGY5ZGYxZmFjODQ5ODU4MWQxMmY3Y2NlNjUxOGQxLmJpbmRQb3B1cChwb3B1cF85MDA2MzIzYTZhNWQ0Yjk0YTZhZjNiNGU1OGJhOWJlNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzlmMDY2M2RhODRjNjRmMmNiZWQ2MzU1ZDY4MDJkNDI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjM1ODg2LCAtMy42MjczMjQxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE2YzNmYTQzMmI3NDQ5OTkyZTE3YWM1NzQxNmM3ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNiMDZmNzNkZWU0NDNlNTgzNmU3OTVhZGY2YmI4ZWMgPSAkKGA8ZGl2IGlkPSJodG1sXzRjYjA2ZjczZGVlNDQzZTU4MzZlNzk1YWRmNmJiOGVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIzNTg4NiwgLTMuNjI3MzI0MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExNmMzZmE0MzJiNzQ0OTk5MmUxN2FjNTc0MTZjN2Y1LnNldENvbnRlbnQoaHRtbF80Y2IwNmY3M2RlZTQ0M2U1ODM2ZTc5NWFkZjZiYjhlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlmMDY2M2RhODRjNjRmMmNiZWQ2MzU1ZDY4MDJkNDI2LmJpbmRQb3B1cChwb3B1cF9hMTZjM2ZhNDMyYjc0NDk5OTJlMTdhYzU3NDE2YzdmNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA0MWQxMTUzOTJhNTRiYWQ4MGIxNGIyZWUxMjg5Y2ZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTQ4ODI2LCAtMy42NTQ1MTcyOTk5OTk5OTkzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTUyNDMyNGFkYzI0NDc0ZDliOWIzNzVkYjEwYzFiMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjAzMWNmYzQ2ZThkNGQ5OTgxMTM2NzNlZGJjYTFkMjkgPSAkKGA8ZGl2IGlkPSJodG1sX2IwMzFjZmM0NmU4ZDRkOTk4MTEzNjczZWRiY2ExZDI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDU0ODgyNiwgLTMuNjU0NTE3Mjk5OTk5OTk5M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1MjQzMjRhZGMyNDQ3NGQ5YjliMzc1ZGIxMGMxYjBiLnNldENvbnRlbnQoaHRtbF9iMDMxY2ZjNDZlOGQ0ZDk5ODExMzY3M2VkYmNhMWQyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA0MWQxMTUzOTJhNTRiYWQ4MGIxNGIyZWUxMjg5Y2ZmLmJpbmRQb3B1cChwb3B1cF85NTI0MzI0YWRjMjQ0NzRkOWI5YjM3NWRiMTBjMWIwYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzYzZjJlZWRkMjQzMjRiODliY2ZhMGQ2YzM1N2YxZTk0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTg4NzI5LCAtMy42Njg5ODE4OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDk0ZGFkMzE5MzIxNDJhM2ExNDkyNzdmMGJmYWVjNTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWJjMTIyMzlmYzRiNDM0ZjllZWI5ODAyYTk2Njg4MzcgPSAkKGA8ZGl2IGlkPSJodG1sXzViYzEyMjM5ZmM0YjQzNGY5ZWViOTgwMmE5NjY4ODM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk4ODcyOSwgLTMuNjY4OTgxODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5NGRhZDMxOTMyMTQyYTNhMTQ5Mjc3ZjBiZmFlYzUxLnNldENvbnRlbnQoaHRtbF81YmMxMjIzOWZjNGI0MzRmOWVlYjk4MDJhOTY2ODgzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYzZjJlZWRkMjQzMjRiODliY2ZhMGQ2YzM1N2YxZTk0LmJpbmRQb3B1cChwb3B1cF80OTRkYWQzMTkzMjE0MmEzYTE0OTI3N2YwYmZhZWM1MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRiOWMyOGMzMTI1MTQ2MjhiODAyOWUzNTgyNzAxNmVjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY5MDM5LCAtMy42MzgyNzg4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQ1ZGZlNTVhNWI1NGRlOWE0NTIxZmI3Zjc1NjQwNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhjZDBjMGU4MjkzNGRhNGE4Yzg2Yzk1ZjNmYjc3N2EgPSAkKGA8ZGl2IGlkPSJodG1sXzA4Y2QwYzBlODI5MzRkYTRhOGM4NmM5NWYzZmI3NzdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2OTAzOSwgLTMuNjM4Mjc4OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkNWRmZTU1YTViNTRkZTlhNDUyMWZiN2Y3NTY0MDRkLnNldENvbnRlbnQoaHRtbF8wOGNkMGMwZTgyOTM0ZGE0YThjODZjOTVmM2ZiNzc3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRiOWMyOGMzMTI1MTQ2MjhiODAyOWUzNTgyNzAxNmVjLmJpbmRQb3B1cChwb3B1cF80ZDVkZmU1NWE1YjU0ZGU5YTQ1MjFmYjdmNzU2NDA0ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Q3NmYwMmU4OTY2MjRhOTA5NThlMDE4NTVlOGMxN2ZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41NDUxNjMyMDAwMDAwMDUsIC0zLjY1MTQ5NzY5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTkzNmJjZmQ2OTg0ZjVkOGMzN2U2ZGMzMWU1YWJhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YThmMjdhNGVlM2M0OTU0YTBkYWE2ZmEwNmE5NGRkOSA9ICQoYDxkaXYgaWQ9Imh0bWxfN2E4ZjI3YTRlZTNjNDk1NGEwZGFhNmZhMDZhOTRkZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDUxNjMyMDAwMDAwMDUsIC0zLjY1MTQ5NzY5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTkzNmJjZmQ2OTg0ZjVkOGMzN2U2ZGMzMWU1YWJhMS5zZXRDb250ZW50KGh0bWxfN2E4ZjI3YTRlZTNjNDk1NGEwZGFhNmZhMDZhOTRkZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNzZmMDJlODk2NjI0YTkwOTU4ZTAxODU1ZThjMTdmYS5iaW5kUG9wdXAocG9wdXBfNmU5MzZiY2ZkNjk4NGY1ZDhjMzdlNmRjMzFlNWFiYTEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xZWFhM2IyYTQ4YTE0NmVlOWM3YTQzYmFlMjgyZjFmZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTE4NSwgLTMuNjQzNDcyMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzOWI0ZWQ3YmRhZjRlZjZiNmNiYjk2Mzg3NDA2MGNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5Njk5NzQ1NDEyMzQ5YTY4NDk1YjJmMGNhMmRmYmUyID0gJChgPGRpdiBpZD0iaHRtbF83OTY5OTc0NTQxMjM0OWE2ODQ5NWIyZjBjYTJkZmJlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNDkxODUsIC0zLjY0MzQ3MjJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzliNGVkN2JkYWY0ZWY2YjZjYmI5NjM4NzQwNjBjZi5zZXRDb250ZW50KGh0bWxfNzk2OTk3NDU0MTIzNDlhNjg0OTViMmYwY2EyZGZiZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZWFhM2IyYTQ4YTE0NmVlOWM3YTQzYmFlMjgyZjFmZS5iaW5kUG9wdXAocG9wdXBfMzM5YjRlZDdiZGFmNGVmNmI2Y2JiOTYzODc0MDYwY2YpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85MjlkNmM0MjczMDg0OGQwOTc2MWZiYTJlMjNkMmQ0NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMyNDAxMSwgLTMuNjM5NTAzMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2OTVhYzdiZjI5MTRhMjk5MTkyNmVkNjg1YTE5MDYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0OGM3NWUwOTZlZjQ4NmZhNWE2Y2MzMWVmM2U2NDliID0gJChgPGRpdiBpZD0iaHRtbF8wNDhjNzVlMDk2ZWY0ODZmYTVhNmNjMzFlZjNlNjQ5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMjQwMTEsIC0zLjYzOTUwMzFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjk1YWM3YmYyOTE0YTI5OTE5MjZlZDY4NWExOTA2MC5zZXRDb250ZW50KGh0bWxfMDQ4Yzc1ZTA5NmVmNDg2ZmE1YTZjYzMxZWYzZTY0OWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjlkNmM0MjczMDg0OGQwOTc2MWZiYTJlMjNkMmQ0Ny5iaW5kUG9wdXAocG9wdXBfYTY5NWFjN2JmMjkxNGEyOTkxOTI2ZWQ2ODVhMTkwNjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83MWMwNmQ1ZjRkNzM0NGUyYmFhYzgwZTFiMWJiMmU3NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4OTc0NjAwMDAwMDA1LCAtMy42NDcxNTYzOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjJhNjlkOTAyMmZmNGZiMmIzMDc3MmU3NTU4NmFmYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk3MDdjYzE3ZGM2NDViZWIyNmMwMzk1YWMzYWEwODggPSAkKGA8ZGl2IGlkPSJodG1sXzE5NzA3Y2MxN2RjNjQ1YmViMjZjMDM5NWFjM2FhMDg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4OTc0NjAwMDAwMDA1LCAtMy42NDcxNTYzOTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJhNjlkOTAyMmZmNGZiMmIzMDc3MmU3NTU4NmFmYTIuc2V0Q29udGVudChodG1sXzE5NzA3Y2MxN2RjNjQ1YmViMjZjMDM5NWFjM2FhMDg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzFjMDZkNWY0ZDczNDRlMmJhYWM4MGUxYjFiYjJlNzcuYmluZFBvcHVwKHBvcHVwXzIyYTY5ZDkwMjJmZjRmYjJiMzA3NzJlNzU1ODZhZmEyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYTA0OWExNTE2MTNmNGU1N2JhODU4NjVhMjE2ZGZkMmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMjk2MjgsIC0zLjYzOTAxMTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNGI5Y2RjZDEwYTI0NTRiODNhN2YzNmUwMzM4MjcxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDAxNDFjZDIzYzE0MzY5OWE2MzU1MGFhYjg4MjMyOSA9ICQoYDxkaXYgaWQ9Imh0bWxfYmQwMTQxY2QyM2MxNDM2OTlhNjM1NTBhYWI4ODIzMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzI5NjI4LCAtMy42MzkwMTEyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjRiOWNkY2QxMGEyNDU0YjgzYTdmMzZlMDMzODI3MTkuc2V0Q29udGVudChodG1sX2JkMDE0MWNkMjNjMTQzNjk5YTYzNTUwYWFiODgyMzI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTA0OWExNTE2MTNmNGU1N2JhODU4NjVhMjE2ZGZkMmYuYmluZFBvcHVwKHBvcHVwX2I0YjljZGNkMTBhMjQ1NGI4M2E3ZjM2ZTAzMzgyNzE5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOTU2ZGUyODZkY2UwNGU3NWE5MGQxOTRkODk5NTU5MTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTk0MzIwMDAwMDAwNiwgLTMuNjMwOTAwMjk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2YTIxZmZkYTZjMTQyYzQ4M2YyNmM2YTE0ZGFjNmI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMGI2OTlmZDBkZTQ4OThiY2YyM2UwY2UyZGE5N2JmID0gJChgPGRpdiBpZD0iaHRtbF8xYTBiNjk5ZmQwZGU0ODk4YmNmMjNlMGNlMmRhOTdiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTk0MzIwMDAwMDAwNiwgLTMuNjMwOTAwMjk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2YTIxZmZkYTZjMTQyYzQ4M2YyNmM2YTE0ZGFjNmI5LnNldENvbnRlbnQoaHRtbF8xYTBiNjk5ZmQwZGU0ODk4YmNmMjNlMGNlMmRhOTdiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk1NmRlMjg2ZGNlMDRlNzVhOTBkMTk0ZDg5OTU1OTE0LmJpbmRQb3B1cChwb3B1cF81NmEyMWZmZGE2YzE0MmM0ODNmMjZjNmExNGRhYzZiOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdkODY3MWI4MTMyYjQ4YTlhYmY0ZmY0ZDA3NTFlMjA3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xODg1NTEzOTk5OTk5OTQsIC00LjEyODcwNjZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTAzMWNlNmU0NTU0NTM5YWFlNTdhMjhlZjhhNzYyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZTEwODJmNTBkNzk0YjA3ODZiYTUzNGJmZjBmZTlmMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZWUxMDgyZjUwZDc5NGIwNzg2YmE1MzRiZmYwZmU5ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xODg1NTEzOTk5OTk5OTQsIC00LjEyODcwNjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YTAzMWNlNmU0NTU0NTM5YWFlNTdhMjhlZjhhNzYyYi5zZXRDb250ZW50KGh0bWxfZWUxMDgyZjUwZDc5NGIwNzg2YmE1MzRiZmYwZmU5ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZDg2NzFiODEzMmI0OGE5YWJmNGZmNGQwNzUxZTIwNy5iaW5kUG9wdXAocG9wdXBfNmEwMzFjZTZlNDU1NDUzOWFhZTU3YTI4ZWY4YTc2MmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mODJlODhlN2EyM2E0NzAzYjc4NTRhYjRhY2ZmODhmOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzU2MzIxLCAtMy44MTAyODg2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQyNWYzYWVlNjRhNDgxM2I5ODc0YzA2NzllZWVlZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBhNmYzMzI1MGFlNDFhYTlkYWNiODU5MDk4NTYwMDggPSAkKGA8ZGl2IGlkPSJodG1sX2YwYTZmMzMyNTBhZTQxYWE5ZGFjYjg1OTA5ODU2MDA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzU2MzIxLCAtMy44MTAyODg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQyNWYzYWVlNjRhNDgxM2I5ODc0YzA2NzllZWVlZDguc2V0Q29udGVudChodG1sX2YwYTZmMzMyNTBhZTQxYWE5ZGFjYjg1OTA5ODU2MDA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjgyZTg4ZTdhMjNhNDcwM2I3ODU0YWI0YWNmZjg4ZjguYmluZFBvcHVwKHBvcHVwXzU0MjVmM2FlZTY0YTQ4MTNiOTg3NGMwNjc5ZWVlZWQ4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTFlMjQ3MDk1NmFjNDY5ZGJkNTE3MTI2NDE1MDBlNWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NDQ5MDAwMDAwMDAwNSwgLTMuNzAxMDk2Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmN2ZjOTQwM2E2MTQ2Njk5MGRlMWVjNDczNWRlNWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3MjM4YWJkYmI2NTRhNGE5ZGViMjJmM2YzZTQ2MDNkID0gJChgPGRpdiBpZD0iaHRtbF9hNzIzOGFiZGJiNjU0YTRhOWRlYjIyZjNmM2U0NjAzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NDQ5MDAwMDAwMDAwNSwgLTMuNzAxMDk2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmN2ZjOTQwM2E2MTQ2Njk5MGRlMWVjNDczNWRlNWQyLnNldENvbnRlbnQoaHRtbF9hNzIzOGFiZGJiNjU0YTRhOWRlYjIyZjNmM2U0NjAzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UxZTI0NzA5NTZhYzQ2OWRiZDUxNzEyNjQxNTAwZTViLmJpbmRQb3B1cChwb3B1cF81ZjdmYzk0MDNhNjE0NjY5OTBkZTFlYzQ3MzVkZTVkMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VhMTZjNWNiZWQzNjQzMmViYTI0ZmU3OWUyNjg4ODRkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU0OTU3MDAwMDAwMSwgLTMuNjY0NDEyNzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNmY5OTBlNTY0MTQwNDY4MTE4YmJmYTAwN2ExNzA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjZGUxZDY5MTcwYzQzMTI5MjhiMjZmYmNlMjhmNjZmID0gJChgPGRpdiBpZD0iaHRtbF8xY2RlMWQ2OTE3MGM0MzEyOTI4YjI2ZmJjZTI4ZjY2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTQ5NTcwMDAwMDAxLCAtMy42NjQ0MTI3OTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE2Zjk5MGU1NjQxNDA0NjgxMThiYmZhMDA3YTE3MDYuc2V0Q29udGVudChodG1sXzFjZGUxZDY5MTcwYzQzMTI5MjhiMjZmYmNlMjhmNjZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWExNmM1Y2JlZDM2NDMyZWJhMjRmZTc5ZTI2ODg4NGQuYmluZFBvcHVwKHBvcHVwX2UxNmY5OTBlNTY0MTQwNDY4MTE4YmJmYTAwN2ExNzA2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWVjMzdiMWMzODUzNGJjODkwNzE0MjkxZDZmNTkyOGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjg3MDksIC0zLjY0NzA3Ml0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhYTUwNDJkZjcyNjQwZWNiZmRlYjkxMDFjODdlNDBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmNzk5MWNhYzBiNjRjNThhZmRjMDc3MTIwMjM0N2FiID0gJChgPGRpdiBpZD0iaHRtbF9kZjc5OTFjYWMwYjY0YzU4YWZkYzA3NzEyMDIzNDdhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjg3MDksIC0zLjY0NzA3Ml08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhYTUwNDJkZjcyNjQwZWNiZmRlYjkxMDFjODdlNDBmLnNldENvbnRlbnQoaHRtbF9kZjc5OTFjYWMwYjY0YzU4YWZkYzA3NzEyMDIzNDdhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFlYzM3YjFjMzg1MzRiYzg5MDcxNDI5MWQ2ZjU5MjhlLmJpbmRQb3B1cChwb3B1cF83YWE1MDQyZGY3MjY0MGVjYmZkZWI5MTAxYzg3ZTQwZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRkYzdjMjUwNTUxMTQwNzBiNmQ5YjlkM2M2Mzk3M2UxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTE3MjE4LCAtMy42NTI2OTU4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzQzN2QxZTQyOTVlNDQxNzhhZWVlZTNiY2U4MDUxMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMwNzIzMGFiODk3NDcxZmJlNGM4NTlhNmVlMTc0NDkgPSAkKGA8ZGl2IGlkPSJodG1sXzZjMDcyMzBhYjg5NzQ3MWZiZTRjODU5YTZlZTE3NDQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDUxNzIxOCwgLTMuNjUyNjk1OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0MzdkMWU0Mjk1ZTQ0MTc4YWVlZWUzYmNlODA1MTA0LnNldENvbnRlbnQoaHRtbF82YzA3MjMwYWI4OTc0NzFmYmU0Yzg1OWE2ZWUxNzQ0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRkYzdjMjUwNTUxMTQwNzBiNmQ5YjlkM2M2Mzk3M2UxLmJpbmRQb3B1cChwb3B1cF9jNDM3ZDFlNDI5NWU0NDE3OGFlZWVlM2JjZTgwNTEwNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY5ZDFiNmRkN2Y5YjRiZWFiNmJhMmY5ZWE3Y2ZmMWZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU2MzY2MDAwMDAwMDYsIC0zLjY2NDA1NTAwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NGQ3ZmU2ZjJlYTM0ZjM0OTJmODBjMjc2NmE1NWRmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmYxNTJkOTY1MjU0MDI2ODFiYTY4ZTRiM2FkZGNmZiA9ICQoYDxkaXYgaWQ9Imh0bWxfN2ZmMTUyZDk2NTI1NDAyNjgxYmE2OGU0YjNhZGRjZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTU2MzY2MDAwMDAwMDYsIC0zLjY2NDA1NTAwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NGQ3ZmU2ZjJlYTM0ZjM0OTJmODBjMjc2NmE1NWRmNi5zZXRDb250ZW50KGh0bWxfN2ZmMTUyZDk2NTI1NDAyNjgxYmE2OGU0YjNhZGRjZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82OWQxYjZkZDdmOWI0YmVhYjZiYTJmOWVhN2NmZjFmZi5iaW5kUG9wdXAocG9wdXBfNjRkN2ZlNmYyZWEzNGYzNDkyZjgwYzI3NjZhNTVkZjYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yNTY5MmFiYTlhNTQ0YWQ4YTcyMmJkZGQwNjJmZjAzZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5MzEwOSwgLTMuNjM1MjU2Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4MjZmNDJmZDA2MzRjNzViNTY2MzVhNzk2MjBkZTZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhZmYwNDlhNjY1MjQ1YTdiOGE0Yzk5YzU1M2RmNDQyID0gJChgPGRpdiBpZD0iaHRtbF9lYWZmMDQ5YTY2NTI0NWE3YjhhNGM5OWM1NTNkZjQ0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTMxMDksIC0zLjYzNTI1NjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hODI2ZjQyZmQwNjM0Yzc1YjU2NjM1YTc5NjIwZGU2Zi5zZXRDb250ZW50KGh0bWxfZWFmZjA0OWE2NjUyNDVhN2I4YTRjOTljNTUzZGY0NDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNTY5MmFiYTlhNTQ0YWQ4YTcyMmJkZGQwNjJmZjAzZi5iaW5kUG9wdXAocG9wdXBfYTgyNmY0MmZkMDYzNGM3NWI1NjYzNWE3OTYyMGRlNmYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85MWYyYmZkNmE1MzA0YmJjYTc4NjY0YzRkOWE3Mzg1NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwMTAzMiwgLTMuNjQyOTIwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzNWQ3M2NkNjk1ZjRkNjQ4MTcyNjlhZmQxOWFlM2ViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwYzFmNDdlNWUzMzQ0MWFhMTMzZDgxYzBkZDg4MmM2ID0gJChgPGRpdiBpZD0iaHRtbF82MGMxZjQ3ZTVlMzM0NDFhYTEzM2Q4MWMwZGQ4ODJjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDEwMzIsIC0zLjY0MjkyMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzVkNzNjZDY5NWY0ZDY0ODE3MjY5YWZkMTlhZTNlYi5zZXRDb250ZW50KGh0bWxfNjBjMWY0N2U1ZTMzNDQxYWExMzNkODFjMGRkODgyYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MWYyYmZkNmE1MzA0YmJjYTc4NjY0YzRkOWE3Mzg1Ny5iaW5kUG9wdXAocG9wdXBfMDM1ZDczY2Q2OTVmNGQ2NDgxNzI2OWFmZDE5YWUzZWIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82MjAzODU1ZDNkMWI0MTFlOTk4YzY1NWI5YzM4YzA1OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDI2OTAxNiwgLTMuNjU5ODc2NjAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyZGFjOGJjODQ5MzRjMDhiNjNkNGI5YWEwYjFhZTE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwZTdlMzRkMjM0ZjRmYzFhZTYzZGNhNDgxNWVjNGIyID0gJChgPGRpdiBpZD0iaHRtbF8yMGU3ZTM0ZDIzNGY0ZmMxYWU2M2RjYTQ4MTVlYzRiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyNjkwMTYsIC0zLjY1OTg3NjYwMDAwMDAwMDVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmRhYzhiYzg0OTM0YzA4YjYzZDRiOWFhMGIxYWUxNC5zZXRDb250ZW50KGh0bWxfMjBlN2UzNGQyMzRmNGZjMWFlNjNkY2E0ODE1ZWM0YjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MjAzODU1ZDNkMWI0MTFlOTk4YzY1NWI5YzM4YzA1OC5iaW5kUG9wdXAocG9wdXBfYTJkYWM4YmM4NDkzNGMwOGI2M2Q0YjlhYTBiMWFlMTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mMTVlYWZlYjI1ZTE0ODhlOGUzMWZlOWJjMmUyZGQ1NSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDEzNzM4LCAtMy42NTE3NDczXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzVlYzhiZTczMjY3NGM4Y2IwYjhjMDk3NzE5ZDA4OWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDJmZWRmYTEwMTA0NDBkMThiMmI5Njc0NDA5YmU1OTggPSAkKGA8ZGl2IGlkPSJodG1sX2QyZmVkZmExMDEwNDQwZDE4YjJiOTY3NDQwOWJlNTk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEzNzM4LCAtMy42NTE3NDczXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVlYzhiZTczMjY3NGM4Y2IwYjhjMDk3NzE5ZDA4OWYuc2V0Q29udGVudChodG1sX2QyZmVkZmExMDEwNDQwZDE4YjJiOTY3NDQwOWJlNTk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjE1ZWFmZWIyNWUxNDg4ZThlMzFmZTliYzJlMmRkNTUuYmluZFBvcHVwKHBvcHVwX2M1ZWM4YmU3MzI2NzRjOGNiMGI4YzA5NzcxOWQwODlmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNzAzODA0NTQ5YzgxNDkxOWJjYmUyZjA4NDZjMzE5MjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NzIyMDksIC0zLjY2Mjg0ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGNhNzRjOTE0ZmQ0ZDRjODgyODNiNjE2MGRkNDc1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTk2Zjc2NTQ0MzE0Nzg0YWEzMzQ3ZWViZTYyOWQ2ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjE5NmY3NjU0NDMxNDc4NGFhMzM0N2VlYmU2MjlkNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zOTcyMjA5LCAtMy42NjI4NDg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRjYTc0YzkxNGZkNGQ0Yzg4MjgzYjYxNjBkZDQ3NTguc2V0Q29udGVudChodG1sX2YxOTZmNzY1NDQzMTQ3ODRhYTMzNDdlZWJlNjI5ZDZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzAzODA0NTQ5YzgxNDkxOWJjYmUyZjA4NDZjMzE5MjAuYmluZFBvcHVwKHBvcHVwXzg0Y2E3NGM5MTRmZDRkNGM4ODI4M2I2MTYwZGQ0NzU4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTBmOWIxNWU0NmUwNGVkNzg5MjI3ZjQ4ZmJjMjkwMzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzc1MTgsIC0zLjY1MTc4M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwYmVlYWZlNGE1ZDQ1OThiMGFhNzFmMjAyZWM5NmFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwYjZkNWI3MzI2YTRjZmM4ZTRhYWExNDhjNjUwZjZlID0gJChgPGRpdiBpZD0iaHRtbF80MGI2ZDViNzMyNmE0Y2ZjOGU0YWFhMTQ4YzY1MGY2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMzc1MTgsIC0zLjY1MTc4M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwYmVlYWZlNGE1ZDQ1OThiMGFhNzFmMjAyZWM5NmFiLnNldENvbnRlbnQoaHRtbF80MGI2ZDViNzMyNmE0Y2ZjOGU0YWFhMTQ4YzY1MGY2ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEwZjliMTVlNDZlMDRlZDc4OTIyN2Y0OGZiYzI5MDM2LmJpbmRQb3B1cChwb3B1cF9jMGJlZWFmZTRhNWQ0NTk4YjBhYTcxZjIwMmVjOTZhYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzMwY2EwOGFhOTE5NDRiYjJhNmZiOGZhMjczODRkYWIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjU0MDc5LCAtMy42NDQ3MDMyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzA4MWNjYTM1OTBjNDdhMGE3MDYxNjJhODVjYTI2Y2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDViYWM1ZjFhNmIwNGYyNzg5ZDUzOTE0ODg2NDRlZTggPSAkKGA8ZGl2IGlkPSJodG1sX2Q1YmFjNWYxYTZiMDRmMjc4OWQ1MzkxNDg4NjQ0ZWU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI1NDA3OSwgLTMuNjQ0NzAzMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwODFjY2EzNTkwYzQ3YTBhNzA2MTYyYTg1Y2EyNmNmLnNldENvbnRlbnQoaHRtbF9kNWJhYzVmMWE2YjA0ZjI3ODlkNTM5MTQ4ODY0NGVlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMwY2EwOGFhOTE5NDRiYjJhNmZiOGZhMjczODRkYWIwLmJpbmRQb3B1cChwb3B1cF9jMDgxY2NhMzU5MGM0N2EwYTcwNjE2MmE4NWNhMjZjZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE1NzQzNTllMjk5NTRlNGM4ZDY4ODBiYjEwNWZhYThiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNTU4MzY3MDAwMDAwMDUsIC0zLjgxMjM1MDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYTNmNTllNzM5OGU0NWNkYTM1ZTM5ZGJiNGYwMmJhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGE1NjdlOTA2NTQ0YmM5OGJmODEyMjVlYTVjODFjYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMTBhNTY3ZTkwNjU0NGJjOThiZjgxMjI1ZWE1YzgxY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNTU4MzY3MDAwMDAwMDUsIC0zLjgxMjM1MDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTNmNTllNzM5OGU0NWNkYTM1ZTM5ZGJiNGYwMmJhYS5zZXRDb250ZW50KGh0bWxfMTBhNTY3ZTkwNjU0NGJjOThiZjgxMjI1ZWE1YzgxY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNTc0MzU5ZTI5OTU0ZTRjOGQ2ODgwYmIxMDVmYWE4Yi5iaW5kUG9wdXAocG9wdXBfMWEzZjU5ZTczOThlNDVjZGEzNWUzOWRiYjRmMDJiYWEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85NWQwYTkxMjgyNTc0M2QzYTE0MzU0NmFjYWExMmJmZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTIxNTAwMDAwMDA1LCAtMy42NDM0MjE2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDdlYjI4ZGE2MjQ4NGJhNTlhNDk2OTdhOWI0OThmZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNhM2E2YjJmYmRkNGMxNTk1NzI5OTZiM2JjNTU4M2EgPSAkKGA8ZGl2IGlkPSJodG1sXzMzYTNhNmIyZmJkZDRjMTU5NTcyOTk2YjNiYzU1ODNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0OTIxNTAwMDAwMDA1LCAtMy42NDM0MjE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdlYjI4ZGE2MjQ4NGJhNTlhNDk2OTdhOWI0OThmZTkuc2V0Q29udGVudChodG1sXzMzYTNhNmIyZmJkZDRjMTU5NTcyOTk2YjNiYzU1ODNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTVkMGE5MTI4MjU3NDNkM2ExNDM1NDZhY2FhMTJiZmUuYmluZFBvcHVwKHBvcHVwX2Q3ZWIyOGRhNjI0ODRiYTU5YTQ5Njk3YTliNDk4ZmU5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODZjM2E3YmFiMzBkNDg0M2E4NDYyMjlkYzFmN2JmZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTI4NzcwMDAwMDAwNSwgLTMuNjM1MjY4Nzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5NGJkNjBiMTIyZTQ2MTRhZjQ1ZDAwODgwMzcwNDMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiNjIxZjJjMjgyNjQzZDE5NmVkNjQ3YmNkNmYzZDY1ID0gJChgPGRpdiBpZD0iaHRtbF80YjYyMWYyYzI4MjY0M2QxOTZlZDY0N2JjZDZmM2Q2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTI4NzcwMDAwMDAwNSwgLTMuNjM1MjY4Nzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5NGJkNjBiMTIyZTQ2MTRhZjQ1ZDAwODgwMzcwNDMzLnNldENvbnRlbnQoaHRtbF80YjYyMWYyYzI4MjY0M2QxOTZlZDY0N2JjZDZmM2Q2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg2YzNhN2JhYjMwZDQ4NDNhODQ2MjI5ZGMxZjdiZmViLmJpbmRQb3B1cChwb3B1cF83OTRiZDYwYjEyMmU0NjE0YWY0NWQwMDg4MDM3MDQzMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzgyZDc4Zjk3ZjhlNzRjMmU5YmY3ODJkODU3MDgwZDY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNjM1Njk4LCAtMy43MTI4MjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmEwNzczMDQ3YWI0ZGE2YWUzYjAwY2JiNzQwOThmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTJiODQzMDE1ZmM0ZDE3ODRiOTQ5MWEyOGU0OGRhOCA9ICQoYDxkaXYgaWQ9Imh0bWxfY2UyYjg0MzAxNWZjNGQxNzg0Yjk0OTFhMjhlNDhkYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNjM1Njk4LCAtMy43MTI4MjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YmEwNzczMDQ3YWI0ZGE2YWUzYjAwY2JiNzQwOThmZC5zZXRDb250ZW50KGh0bWxfY2UyYjg0MzAxNWZjNGQxNzg0Yjk0OTFhMjhlNDhkYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MmQ3OGY5N2Y4ZTc0YzJlOWJmNzgyZDg1NzA4MGQ2NS5iaW5kUG9wdXAocG9wdXBfNGJhMDc3MzA0N2FiNGRhNmFlM2IwMGNiYjc0MDk4ZmQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xZGZlZGRhYzlhZTk0YWY1OGJiMjliZjIzZjIwZmUyOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzExNSwgLTMuNjI4NzE5MjAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlNTczNmFiYmM5MTQ1YWZiNGFmNjdkODNhOGNlOTQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwYmQ0ZDJjZWQ4ZTQzY2VhOTdiYTI2ZmFmMzQ1ZjEyID0gJChgPGRpdiBpZD0iaHRtbF9kMGJkNGQyY2VkOGU0M2NlYTk3YmEyNmZhZjM0NWYxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTMxMTUsIC0zLjYyODcxOTIwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZTU3MzZhYmJjOTE0NWFmYjRhZjY3ZDgzYThjZTk0OC5zZXRDb250ZW50KGh0bWxfZDBiZDRkMmNlZDhlNDNjZWE5N2JhMjZmYWYzNDVmMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZGZlZGRhYzlhZTk0YWY1OGJiMjliZjIzZjIwZmUyOC5iaW5kUG9wdXAocG9wdXBfMGU1NzM2YWJiYzkxNDVhZmI0YWY2N2Q4M2E4Y2U5NDgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lZGMzN2U1MzMwYTM0MDMxYTJiNWI5ZjgwMTY3NmEyNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDEzNjc2MjAwMDAwMDA1LCAtMy42NTE1NTNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTk3ZTgxNGY1M2Y0MjNhOTA4MGQ3N2U1ODMzNzY4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzIzMGU5OTFjZWI0ZDNiYWFjZGRmNTI0ZTMxYmU4YiA9ICQoYDxkaXYgaWQ9Imh0bWxfZTcyMzBlOTkxY2ViNGQzYmFhY2RkZjUyNGUzMWJlOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM2NzYyMDAwMDAwMDUsIC0zLjY1MTU1M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhOTdlODE0ZjUzZjQyM2E5MDgwZDc3ZTU4MzM3NjhhLnNldENvbnRlbnQoaHRtbF9lNzIzMGU5OTFjZWI0ZDNiYWFjZGRmNTI0ZTMxYmU4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VkYzM3ZTUzMzBhMzQwMzFhMmI1YjlmODAxNjc2YTI1LmJpbmRQb3B1cChwb3B1cF8zYTk3ZTgxNGY1M2Y0MjNhOTA4MGQ3N2U1ODMzNzY4YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE4NjliMjBlNDVlNDRhMjNiMGIzNDFmZTJkYjVlMTQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkxMjE2LCAtMy43NjgzMjMzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ4ZDI5MTJkY2FhNDRjOWJhNjcwMTBhZGVlNmIwMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTI1ZjEzNjNiZTRhNDBmZmI2OTQyOWYwNDhjOWUyMDYgPSAkKGA8ZGl2IGlkPSJodG1sXzkyNWYxMzYzYmU0YTQwZmZiNjk0MjlmMDQ4YzllMjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5MTIxNiwgLTMuNzY4MzIzM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0OGQyOTEyZGNhYTQ0YzliYTY3MDEwYWRlZTZiMDM0LnNldENvbnRlbnQoaHRtbF85MjVmMTM2M2JlNGE0MGZmYjY5NDI5ZjA0OGM5ZTIwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE4NjliMjBlNDVlNDRhMjNiMGIzNDFmZTJkYjVlMTQxLmJpbmRQb3B1cChwb3B1cF85NDhkMjkxMmRjYWE0NGM5YmE2NzAxMGFkZWU2YjAzNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFhOTg0YmMzNzE3YjQ4ZDJhNTdjNjQ4YmQ5NGQ1M2ZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzAxMjc3LCAtMy42NDI4NzI2MDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWFkM2NkZGY2MWFjNDFmNGI3NzA2YzYzNGI2NWY2ODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTMwMGU2MzExNTRiNGVmNWJiYTA2NzVjOTMxYWMxNzEgPSAkKGA8ZGl2IGlkPSJodG1sX2EzMDBlNjMxMTU0YjRlZjViYmEwNjc1YzkzMWFjMTcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwMTI3NywgLTMuNjQyODcyNjAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhZDNjZGRmNjFhYzQxZjRiNzcwNmM2MzRiNjVmNjgxLnNldENvbnRlbnQoaHRtbF9hMzAwZTYzMTE1NGI0ZWY1YmJhMDY3NWM5MzFhYzE3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhOTg0YmMzNzE3YjQ4ZDJhNTdjNjQ4YmQ5NGQ1M2ZiLmJpbmRQb3B1cChwb3B1cF9lYWQzY2RkZjYxYWM0MWY0Yjc3MDZjNjM0YjY1ZjY4MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NiODczYzYzMWZiMjRkNWJiNDIwYTRjYWJmNmE3MzFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjcyNDU3MDAwMDAwMSwgLTMuNjQ2NjA5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkMGNiMWM0NmRjNzRkZWY5NmQ1MTI5OWUwMDUzZjI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwOTllYjBhODcwNDRjMjdiYWVhYWM0Yjg5NmU3MmE5ID0gJChgPGRpdiBpZD0iaHRtbF8wMDk5ZWIwYTg3MDQ0YzI3YmFlYWFjNGI4OTZlNzJhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzI0NTcwMDAwMDAxLCAtMy42NDY2MDk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmQwY2IxYzQ2ZGM3NGRlZjk2ZDUxMjk5ZTAwNTNmMjYuc2V0Q29udGVudChodG1sXzAwOTllYjBhODcwNDRjMjdiYWVhYWM0Yjg5NmU3MmE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2I4NzNjNjMxZmIyNGQ1YmI0MjBhNGNhYmY2YTczMWQuYmluZFBvcHVwKHBvcHVwX2JkMGNiMWM0NmRjNzRkZWY5NmQ1MTI5OWUwMDUzZjI2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWZmYjFhMWYxZWZjNDFhYTk5OGUzMTM2YmEwYTBhMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUyOTIsIC0zLjY0MzE5MTMwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZjkxZTgyMTVhYWM0ODU0YmI5ZDI2OTVhMDRmM2Y2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZmJlOTVmMTQ4MjQ0YzFhYmE0MjI3MWJmYTQxMDRjZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYWZiZTk1ZjE0ODI0NGMxYWJhNDIyNzFiZmE0MTA0Y2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MjkyLCAtMy42NDMxOTEzMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y5MWU4MjE1YWFjNDg1NGJiOWQyNjk1YTA0ZjNmNjAuc2V0Q29udGVudChodG1sX2FmYmU5NWYxNDgyNDRjMWFiYTQyMjcxYmZhNDEwNGNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWZmYjFhMWYxZWZjNDFhYTk5OGUzMTM2YmEwYTBhMzQuYmluZFBvcHVwKHBvcHVwX2NmOTFlODIxNWFhYzQ4NTRiYjlkMjY5NWEwNGYzZjYwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjAwNzM3OTY3YzVjNGQwM2IyNTYzZGJlNWZjNWEyNDggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1MTcwMDAwMDAwNiwgLTMuNjYwOTY2NTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkM2E1YTNmNTE5YTQ4OGI4MWUxMTNkZmY4Nzg0ZDk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljMDA0YzMxZDgwYTQzOTQ4Y2YxOGE4MTlhMGI3OGJiID0gJChgPGRpdiBpZD0iaHRtbF85YzAwNGMzMWQ4MGE0Mzk0OGNmMThhODE5YTBiNzhiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MTcwMDAwMDAwNiwgLTMuNjYwOTY2NTAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkM2E1YTNmNTE5YTQ4OGI4MWUxMTNkZmY4Nzg0ZDk5LnNldENvbnRlbnQoaHRtbF85YzAwNGMzMWQ4MGE0Mzk0OGNmMThhODE5YTBiNzhiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IwMDczNzk2N2M1YzRkMDNiMjU2M2RiZTVmYzVhMjQ4LmJpbmRQb3B1cChwb3B1cF82ZDNhNWEzZjUxOWE0ODhiODFlMTEzZGZmODc4NGQ5OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzUyNjgyZDRiMDE2ZDQ1OWFhNmQ4MzJmZjU2YzQ3ZGQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc4OTY1MDAwMDAwMDQsIC0zLjYzNjMyNTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOWY2MmQ2YjFiMGQ0ODBhYmYyYTEyZDRjNDNiNTJhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YzJjMzAxNzkxYjQ0NWFlODAzNjkzMWExOGNiMzI4MSA9ICQoYDxkaXYgaWQ9Imh0bWxfOWMyYzMwMTc5MWI0NDVhZTgwMzY5MzFhMThjYjMyODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc4OTY1MDAwMDAwMDQsIC0zLjYzNjMyNTJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOWY2MmQ2YjFiMGQ0ODBhYmYyYTEyZDRjNDNiNTJhMC5zZXRDb250ZW50KGh0bWxfOWMyYzMwMTc5MWI0NDVhZTgwMzY5MzFhMThjYjMyODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81MjY4MmQ0YjAxNmQ0NTlhYTZkODMyZmY1NmM0N2RkOS5iaW5kUG9wdXAocG9wdXBfYjlmNjJkNmIxYjBkNDgwYWJmMmExMmQ0YzQzYjUyYTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lYTgxNTYyMWM5NWU0NTVlYjUyMTg1M2ZiNDQ3MTA1MiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDQ1OTg5OSwgLTMuNjYxMjQ2ODk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4ZWM5M2QzYmZmODRhZDlhNWNkM2NiYzJlY2RhMDQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0NzE5NjlkZDNiMzQwYWRiOWM2ODRhNDRlNDE0MjU3ID0gJChgPGRpdiBpZD0iaHRtbF9kNDcxOTY5ZGQzYjM0MGFkYjljNjg0YTQ0ZTQxNDI1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ0NTk4OTksIC0zLjY2MTI0Njg5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGVjOTNkM2JmZjg0YWQ5YTVjZDNjYmMyZWNkYTA0Mi5zZXRDb250ZW50KGh0bWxfZDQ3MTk2OWRkM2IzNDBhZGI5YzY4NGE0NGU0MTQyNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lYTgxNTYyMWM5NWU0NTVlYjUyMTg1M2ZiNDQ3MTA1Mi5iaW5kUG9wdXAocG9wdXBfMThlYzkzZDNiZmY4NGFkOWE1Y2QzY2JjMmVjZGEwNDIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81YmM0ODc0YWIxZDc0MzEyYjQ3ZTJlOWZiNmUxYzI3OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTIwNTg1Nzk5OTk5OTksIC0zLjY1NTI1NDIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDliOTExM2UzYmQ0MDJlODQ2NjAzNWM2ZjBlMTMwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYjZhYWQ0ZTQ1NmM0Zjc0OTcyNDA2Y2I3YWI4MWQ2OCA9ICQoYDxkaXYgaWQ9Imh0bWxfYWI2YWFkNGU0NTZjNGY3NDk3MjQwNmNiN2FiODFkNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjA1ODU3OTk5OTk5OSwgLTMuNjU1MjU0MjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkOWI5MTEzZTNiZDQwMmU4NDY2MDM1YzZmMGUxMzA3LnNldENvbnRlbnQoaHRtbF9hYjZhYWQ0ZTQ1NmM0Zjc0OTcyNDA2Y2I3YWI4MWQ2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzViYzQ4NzRhYjFkNzQzMTJiNDdlMmU5ZmI2ZTFjMjc4LmJpbmRQb3B1cChwb3B1cF8wZDliOTExM2UzYmQ0MDJlODQ2NjAzNWM2ZjBlMTMwNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2E3ZWY1MGY4MTk5NzRjNWU4NTRmYTcxODRiODNlZDRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4wMDczMjU2LCAtNi4xMjc1NTM0MDAwMDAwMDFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNzZhNDU5N2E0YmQ0YmU3YWU2MzI4ZjExYzI1ZjI1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MDkyNGRlZTI3MTU0Mjk0ODJhYzViZWY4MjJlOGM3NCA9ICQoYDxkaXYgaWQ9Imh0bWxfODA5MjRkZWUyNzE1NDI5NDgyYWM1YmVmODIyZThjNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4wMDczMjU2LCAtNi4xMjc1NTM0MDAwMDAwMDFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzZhNDU5N2E0YmQ0YmU3YWU2MzI4ZjExYzI1ZjI1ZC5zZXRDb250ZW50KGh0bWxfODA5MjRkZWUyNzE1NDI5NDgyYWM1YmVmODIyZThjNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hN2VmNTBmODE5OTc0YzVlODU0ZmE3MTg0YjgzZWQ0Yy5iaW5kUG9wdXAocG9wdXBfYzc2YTQ1OTdhNGJkNGJlN2FlNjMyOGYxMWMyNWYyNWQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mN2ZhODNkYWIyODk0ZDEwYWJjMmEwZTkyZThjZjJkMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTM1NjIsIC0zLjYxNjM0MDIwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MGY0MmRiNDk3YjI0NWM3OTQ0NTEwYjgxNjlmYzI2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjVhNjQ0NzQwZjY0MGU2OWFlN2M0Y2E5NjU4NjIyYiA9ICQoYDxkaXYgaWQ9Imh0bWxfM2I1YTY0NDc0MGY2NDBlNjlhZTdjNGNhOTY1ODYyMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU2MiwgLTMuNjE2MzQwMjAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwZjQyZGI0OTdiMjQ1Yzc5NDQ1MTBiODE2OWZjMjYxLnNldENvbnRlbnQoaHRtbF8zYjVhNjQ0NzQwZjY0MGU2OWFlN2M0Y2E5NjU4NjIyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3ZmE4M2RhYjI4OTRkMTBhYmMyYTBlOTJlOGNmMmQwLmJpbmRQb3B1cChwb3B1cF85MGY0MmRiNDk3YjI0NWM3OTQ0NTEwYjgxNjlmYzI2MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM4ZGI4OTAxODYyYzRiZTBhMTkyOGM3NjExMmI5MjRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzMyMDIsIC0zLjYzNTIzMjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODBkNDY2ZDg4YzE0ZjhjYjU5N2IyZDk2ZmY5ZDQ5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YzY5NzkyNTBjMDI0NjE4YjUzY2Q1MDQ5ZmVlYWYzYyA9ICQoYDxkaXYgaWQ9Imh0bWxfOGM2OTc5MjUwYzAyNDYxOGI1M2NkNTA0OWZlZWFmM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MzMyMDIsIC0zLjYzNTIzMjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODBkNDY2ZDg4YzE0ZjhjYjU5N2IyZDk2ZmY5ZDQ5Yy5zZXRDb250ZW50KGh0bWxfOGM2OTc5MjUwYzAyNDYxOGI1M2NkNTA0OWZlZWFmM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zOGRiODkwMTg2MmM0YmUwYTE5MjhjNzYxMTJiOTI0Yi5iaW5kUG9wdXAocG9wdXBfOTgwZDQ2NmQ4OGMxNGY4Y2I1OTdiMmQ5NmZmOWQ0OWMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zNDNmNzIyZmMyM2U0NjYwYjdiNmUwNTkzM2FlYzk5ZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDY5MjE3Nzk5OTk5OTk2LCAtMy42MjM5MzM2MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzkwMDc0OTMzMTI3NDg4OWI2NzEwYmU0MWU5NTQzYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWM0MDdhNjExMjU0NGI2NTljZTYwMTBlY2VjZmI0OGMgPSAkKGA8ZGl2IGlkPSJodG1sXzFjNDA3YTYxMTI1NDRiNjU5Y2U2MDEwZWNlY2ZiNDhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDY5MjE3Nzk5OTk5OTk2LCAtMy42MjM5MzM2MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzkwMDc0OTMzMTI3NDg4OWI2NzEwYmU0MWU5NTQzYTguc2V0Q29udGVudChodG1sXzFjNDA3YTYxMTI1NDRiNjU5Y2U2MDEwZWNlY2ZiNDhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzQzZjcyMmZjMjNlNDY2MGI3YjZlMDU5MzNhZWM5OWYuYmluZFBvcHVwKHBvcHVwX2M5MDA3NDkzMzEyNzQ4ODliNjcxMGJlNDFlOTU0M2E4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWU2NThlYjQwNjdlNDc5OTk1NDQwYmU2MzNjOTQyNmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNzYyNjYsIC0zLjgwMDQ4MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjQ1ZTAyYmI5MDg0MWU3YTFjNWQxZDNjN2ExNmY0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzNjOWFmNzU1ODk0ODA4YWFiYjM2OWFkMWFiNjViNCA9ICQoYDxkaXYgaWQ9Imh0bWxfYmMzYzlhZjc1NTg5NDgwOGFhYmIzNjlhZDFhYjY1YjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTc2MjY2LCAtMy44MDA0ODE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI0NWUwMmJiOTA4NDFlN2ExYzVkMWQzYzdhMTZmNDQuc2V0Q29udGVudChodG1sX2JjM2M5YWY3NTU4OTQ4MDhhYWJiMzY5YWQxYWI2NWI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWU2NThlYjQwNjdlNDc5OTk1NDQwYmU2MzNjOTQyNmEuYmluZFBvcHVwKHBvcHVwX2IyNDVlMDJiYjkwODQxZTdhMWM1ZDFkM2M3YTE2ZjQ0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTljNTkzZDJkYzNmNGNhMjg5Mzc4ZTYxNWJmNjhiN2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2MDUwMDM5OTk5OTk5NCwgLTMuNjYwNTg1Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiNzg5NWU3MmZhMzRhMjlhYmFiMzA1NjYxNjI1ODViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1Y2M1MDdhZDJlYjQyMzRhMjNmZGMwZDA1Nzc1ODQ2ID0gJChgPGRpdiBpZD0iaHRtbF9kNWNjNTA3YWQyZWI0MjM0YTIzZmRjMGQwNTc3NTg0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2MDUwMDM5OTk5OTk5NCwgLTMuNjYwNTg1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiNzg5NWU3MmZhMzRhMjlhYmFiMzA1NjYxNjI1ODViLnNldENvbnRlbnQoaHRtbF9kNWNjNTA3YWQyZWI0MjM0YTIzZmRjMGQwNTc3NTg0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE5YzU5M2QyZGMzZjRjYTI4OTM3OGU2MTViZjY4YjdlLmJpbmRQb3B1cChwb3B1cF84Yjc4OTVlNzJmYTM0YTI5YWJhYjMwNTY2MTYyNTg1YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRkNzMzZGQyYTM2YjQ0M2Y5NzU0ZDAzN2ViZWRmNWU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjM0Mjg2LCAtMy42MTI3NjE0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTdiZDNlZWI0ZTQ5NDNiOGFmODdkMTEzNmU4MTI1NTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FkYmIxNTYxNDdkNDBkYjg5ZTIwY2E2MGIyMGU1NTYgPSAkKGA8ZGl2IGlkPSJodG1sXzNhZGJiMTU2MTQ3ZDQwZGI4OWUyMGNhNjBiMjBlNTU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDYzNDI4NiwgLTMuNjEyNzYxNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk3YmQzZWViNGU0OTQzYjhhZjg3ZDExMzZlODEyNTUzLnNldENvbnRlbnQoaHRtbF8zYWRiYjE1NjE0N2Q0MGRiODllMjBjYTYwYjIwZTU1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRkNzMzZGQyYTM2YjQ0M2Y5NzU0ZDAzN2ViZWRmNWU5LmJpbmRQb3B1cChwb3B1cF85N2JkM2VlYjRlNDk0M2I4YWY4N2QxMTM2ZTgxMjU1MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA4ZTc3NjU5M2Y0NzQ2NGM4ZGIyNGUwMWIwYzVkMWNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzkxLCAtMy42NDYwNTI3OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGFiNjNhZGZkOGVhNDg3NjllZDQ4YzBiNjlkNWRkOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA0Zjk3YWM0OTYwNDRmYzlkN2IwY2UyZmVhYzQ5MDUgPSAkKGA8ZGl2IGlkPSJodG1sX2YwNGY5N2FjNDk2MDQ0ZmM5ZDdiMGNlMmZlYWM0OTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDc5MSwgLTMuNjQ2MDUyNzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhYjYzYWRmZDhlYTQ4NzY5ZWQ0OGMwYjY5ZDVkZDljLnNldENvbnRlbnQoaHRtbF9mMDRmOTdhYzQ5NjA0NGZjOWQ3YjBjZTJmZWFjNDkwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA4ZTc3NjU5M2Y0NzQ2NGM4ZGIyNGUwMWIwYzVkMWNjLmJpbmRQb3B1cChwb3B1cF80YWI2M2FkZmQ4ZWE0ODc2OWVkNDhjMGI2OWQ1ZGQ5YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzIwNGM1NjI2OWU5ODQwNWZhNGNmYzI1OWJkNWNlYjU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzE1OTI1LCAtMy42Mzg2MzQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2Q0NWI4NGU0N2Q3NDk1Njk0YzEwYjNmZjEzZDhmY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDBkYTllNmY1NTZlNGZmMTg4YzBkYmM4OWFmY2VjMDEgPSAkKGA8ZGl2IGlkPSJodG1sXzAwZGE5ZTZmNTU2ZTRmZjE4OGMwZGJjODlhZmNlYzAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMxNTkyNSwgLTMuNjM4NjM0M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkNDViODRlNDdkNzQ5NTY5NGMxMGIzZmYxM2Q4ZmNiLnNldENvbnRlbnQoaHRtbF8wMGRhOWU2ZjU1NmU0ZmYxODhjMGRiYzg5YWZjZWMwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIwNGM1NjI2OWU5ODQwNWZhNGNmYzI1OWJkNWNlYjU1LmJpbmRQb3B1cChwb3B1cF8zZDQ1Yjg0ZTQ3ZDc0OTU2OTRjMTBiM2ZmMTNkOGZjYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhlOTM3MzhiYjQ4ZDQzMWU4MmMwMDljNzFhNTE3OTFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkxMzg2LCAtMy43MDgzNTM1MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmIyYjg5NDdhYzVlNDBjOGIyYzM0MmFlMTgxNTNiYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDU0MWJhMGIyYjAzNDQyODljMDA0MzdiNGJiMGE1OWIgPSAkKGA8ZGl2IGlkPSJodG1sXzQ1NDFiYTBiMmIwMzQ0Mjg5YzAwNDM3YjRiYjBhNTliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5MTM4NiwgLTMuNzA4MzUzNTAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiMmI4OTQ3YWM1ZTQwYzhiMmMzNDJhZTE4MTUzYmFkLnNldENvbnRlbnQoaHRtbF80NTQxYmEwYjJiMDM0NDI4OWMwMDQzN2I0YmIwYTU5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhlOTM3MzhiYjQ4ZDQzMWU4MmMwMDljNzFhNTE3OTFhLmJpbmRQb3B1cChwb3B1cF9iYjJiODk0N2FjNWU0MGM4YjJjMzQyYWUxODE1M2JhZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzJmYjNmNGJlZDUzNzQyYjc4NThhYjFlMzAwM2UzMGZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzgwNzE3LCAtMy42MjE0NDUyMDAwMDAwMDA2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjk2NmYyOGM0YjkzNGQ4MzgzNjM4ZDUxYmYzYWEyMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTIwNzYxMGNmNTZiNDA2YThiMjFlYzQ4MWU1NDY0OTIgPSAkKGA8ZGl2IGlkPSJodG1sXzEyMDc2MTBjZjU2YjQwNmE4YjIxZWM0ODFlNTQ2NDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDM4MDcxNywgLTMuNjIxNDQ1MjAwMDAwMDAwNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5NjZmMjhjNGI5MzRkODM4MzYzOGQ1MWJmM2FhMjIyLnNldENvbnRlbnQoaHRtbF8xMjA3NjEwY2Y1NmI0MDZhOGIyMWVjNDgxZTU0NjQ5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJmYjNmNGJlZDUzNzQyYjc4NThhYjFlMzAwM2UzMGZiLmJpbmRQb3B1cChwb3B1cF9iOTY2ZjI4YzRiOTM0ZDgzODM2MzhkNTFiZjNhYTIyMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA3ODU0NDNjMWE1NzQxZWI5NzM2MzVhZjQxYjc4MWE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjkxNjE3LCAtMy42MTAwODEyOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA4NTdhNmJhYzQ2NDY3ZmIzOWYyODM4MWVlYmY2OTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI3NjE0ZTcwNjcxNDcwYzhjM2E4YTg3OWE3ZDc5ZGQgPSAkKGA8ZGl2IGlkPSJodG1sX2JiNzYxNGU3MDY3MTQ3MGM4YzNhOGE4NzlhN2Q3OWRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDY5MTYxNywgLTMuNjEwMDgxMjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwODU3YTZiYWM0NjQ2N2ZiMzlmMjgzODFlZWJmNjk5LnNldENvbnRlbnQoaHRtbF9iYjc2MTRlNzA2NzE0NzBjOGMzYThhODc5YTdkNzlkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA3ODU0NDNjMWE1NzQxZWI5NzM2MzVhZjQxYjc4MWE2LmJpbmRQb3B1cChwb3B1cF9hMDg1N2E2YmFjNDY0NjdmYjM5ZjI4MzgxZWViZjY5OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzcxOTQ4NjNjZTcwYzQxODc5YTEwNmYwMjNhNDYzMmEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszOS45NTk5NTU5MDAwMDAwMDQsIC00LjgyNDg4MjhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjU3MTFlOTYzNGU0NTdkOWMyZTBjZDJiYWZkNWUwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MGZiNTIyMGNlZDU0YzcxODgyYmUwZjEzZjllYjdkZSA9ICQoYDxkaXYgaWQ9Imh0bWxfNzBmYjUyMjBjZWQ1NGM3MTg4MmJlMGYxM2Y5ZWI3ZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlszOS45NTk5NTU5MDAwMDAwMDQsIC00LjgyNDg4MjhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjU3MTFlOTYzNGU0NTdkOWMyZTBjZDJiYWZkNWUwNi5zZXRDb250ZW50KGh0bWxfNzBmYjUyMjBjZWQ1NGM3MTg4MmJlMGYxM2Y5ZWI3ZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MTk0ODYzY2U3MGM0MTg3OWExMDZmMDIzYTQ2MzJhMC5iaW5kUG9wdXAocG9wdXBfZTI1NzExZTk2MzRlNDU3ZDljMmUwY2QyYmFmZDVlMDYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wY2Q0NGMyNzNjYWM0MmMyOTMyNmZjYmY3NjlmODYxYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDA5MDM2MSwgLTMuNjY3NjE4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiZDYyNzU5MDYwMTRiNjZiNTczOWVhYmU4NTdiM2YyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2YzMwY2ViODhhMDRmMzFiYTJjYjVjZDYwMDM3Mzk3ID0gJChgPGRpdiBpZD0iaHRtbF9iNmMzMGNlYjg4YTA0ZjMxYmEyY2I1Y2Q2MDAzNzM5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwOTAzNjEsIC0zLjY2NzYxODZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YmQ2Mjc1OTA2MDE0YjY2YjU3MzllYWJlODU3YjNmMi5zZXRDb250ZW50KGh0bWxfYjZjMzBjZWI4OGEwNGYzMWJhMmNiNWNkNjAwMzczOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wY2Q0NGMyNzNjYWM0MmMyOTMyNmZjYmY3NjlmODYxYS5iaW5kUG9wdXAocG9wdXBfOGJkNjI3NTkwNjAxNGI2NmI1NzM5ZWFiZTg1N2IzZjIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mYTMwZjg0NzQ0YTE0NzY5OTRmYTU4ZWZlZTZjMTg3ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDY2ODkwMiwgLTMuNjY4MTYzOF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjMTVjZjcyYTcxODRiOTlhMTJlMTU0OTU4YWFiZmEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzYjllMTkyNGY4MTQ5NGU4NWE4YzdiMjZmZGEzZDY1ID0gJChgPGRpdiBpZD0iaHRtbF82M2I5ZTE5MjRmODE0OTRlODVhOGM3YjI2ZmRhM2Q2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2Njg5MDIsIC0zLjY2ODE2MzhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzE1Y2Y3MmE3MTg0Yjk5YTEyZTE1NDk1OGFhYmZhMy5zZXRDb250ZW50KGh0bWxfNjNiOWUxOTI0ZjgxNDk0ZTg1YThjN2IyNmZkYTNkNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYTMwZjg0NzQ0YTE0NzY5OTRmYTU4ZWZlZTZjMTg3ZC5iaW5kUG9wdXAocG9wdXBfZWMxNWNmNzJhNzE4NGI5OWExMmUxNTQ5NThhYWJmYTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mZTYxMGE3MDgyYzU0NThhOTM3ODMzYmNjNGYyNDY3NSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzI5ODk5OTk5OTk2LCAtMy42Mjg1NzIyMDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGY3MTllMDE5Y2QwNDhkZGE0ZjU5YTEyOGVkYjExODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI0MmU0NDM0NzNkNDVlMjk2Yzc1Y2RiZDU0YWRkNWYgPSAkKGA8ZGl2IGlkPSJodG1sXzcyNDJlNDQzNDczZDQ1ZTI5NmM3NWNkYmQ1NGFkZDVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzI5ODk5OTk5OTk2LCAtMy42Mjg1NzIyMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGY3MTllMDE5Y2QwNDhkZGE0ZjU5YTEyOGVkYjExODEuc2V0Q29udGVudChodG1sXzcyNDJlNDQzNDczZDQ1ZTI5NmM3NWNkYmQ1NGFkZDVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmU2MTBhNzA4MmM1NDU4YTkzNzgzM2JjYzRmMjQ2NzUuYmluZFBvcHVwKHBvcHVwXzRmNzE5ZTAxOWNkMDQ4ZGRhNGY1OWExMjhlZGIxMTgxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYWQzYzNjYzc4ZWFmNDg0NDg2NGJjOTY2MjA5MzMwNjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNTQ5NDYsIC0zLjY2NDQ1NTYwMDAwMDAwMDZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzIxNTJkODI2Njg0NGM5OThkMzRlMTA0MjRiZjYxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDliZjU0YTZhMzI0MTM3YmNmYmIzYWIwODI4ODUxMiA9ICQoYDxkaXYgaWQ9Imh0bWxfYzQ5YmY1NGE2YTMyNDEzN2JjZmJiM2FiMDgyODg1MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTU0OTQ2LCAtMy42NjQ0NTU2MDAwMDAwMDA2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMyMTUyZDgyNjY4NDRjOTk4ZDM0ZTEwNDI0YmY2MTIuc2V0Q29udGVudChodG1sX2M0OWJmNTRhNmEzMjQxMzdiY2ZiYjNhYjA4Mjg4NTEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWQzYzNjYzc4ZWFmNDg0NDg2NGJjOTY2MjA5MzMwNjMuYmluZFBvcHVwKHBvcHVwX2RjMjE1MmQ4MjY2ODQ0Yzk5OGQzNGUxMDQyNGJmNjEyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTVkNGVlY2U3MGFlNGUxYWJmNDMxNDNlYTkyN2ZhZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM2NDQ0MywgLTMuNzEwMzk3M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1NDFiNWI1NGViMjQyZmQ5NDQ5MWE5YWZiOWJlY2IxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkMzIwNDQ4OWQ1YzRhYzdhMTU3NDRkNDFjOGE1NGZmID0gJChgPGRpdiBpZD0iaHRtbF9mZDMyMDQ0ODlkNWM0YWM3YTE1NzQ0ZDQxYzhhNTRmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM2NDQ0MywgLTMuNzEwMzk3M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1NDFiNWI1NGViMjQyZmQ5NDQ5MWE5YWZiOWJlY2IxLnNldENvbnRlbnQoaHRtbF9mZDMyMDQ0ODlkNWM0YWM3YTE1NzQ0ZDQxYzhhNTRmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U1ZDRlZWNlNzBhZTRlMWFiZjQzMTQzZWE5MjdmYWUyLmJpbmRQb3B1cChwb3B1cF81NTQxYjViNTRlYjI0MmZkOTQ0OTFhOWFmYjliZWNiMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NiZWM5ZTBhNzBhMzQwMTRhMGM3ZTk5YzAwMTY4NWI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjQ1LCAtMy42NDYxMTgzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNmMzBlNDVjZWE4NGU2MWEyZmYxYmRjYWYyMGE2ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNkOTY3N2FlZDM1NDU1MGJhZWZjNWQwNDVjY2JhNWQgPSAkKGA8ZGl2IGlkPSJodG1sX2ZjZDk2NzdhZWQzNTQ1NTBiYWVmYzVkMDQ1Y2NiYTVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDY0NSwgLTMuNjQ2MTE4M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzZjMwZTQ1Y2VhODRlNjFhMmZmMWJkY2FmMjBhNmQ3LnNldENvbnRlbnQoaHRtbF9mY2Q5Njc3YWVkMzU0NTUwYmFlZmM1ZDA0NWNjYmE1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiZWM5ZTBhNzBhMzQwMTRhMGM3ZTk5YzAwMTY4NWI0LmJpbmRQb3B1cChwb3B1cF9iM2YzMGU0NWNlYTg0ZTYxYTJmZjFiZGNhZjIwYTZkNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RmOTEzMmY4Y2I5NDQ3NGZhZTY2NWRlYzllOGRkMmUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk5NDc2LCAtMy42MzA4OTM2MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI2ZDZjMDMwNTliNGI1Mzk5M2Y5ZTkwMDgwYjc2OGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTkyM2Q5NWNiNDJjNDE1ODgzMzU0ZTA2MmZjZTUxMzQgPSAkKGA8ZGl2IGlkPSJodG1sXzU5MjNkOTVjYjQyYzQxNTg4MzM1NGUwNjJmY2U1MTM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5OTQ3NiwgLTMuNjMwODkzNjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyNmQ2YzAzMDU5YjRiNTM5OTNmOWU5MDA4MGI3NjhiLnNldENvbnRlbnQoaHRtbF81OTIzZDk1Y2I0MmM0MTU4ODMzNTRlMDYyZmNlNTEzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RmOTEzMmY4Y2I5NDQ3NGZhZTY2NWRlYzllOGRkMmUxLmJpbmRQb3B1cChwb3B1cF85MjZkNmMwMzA1OWI0YjUzOTkzZjllOTAwODBiNzY4YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRhNjQ5MGUxM2ZmYjQzYjU4Mzk0YzRhYWNlMmQzOGZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjE0Njc1LCAtMy42Mjg2OTEzOTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk2M2FlY2NlN2IyNDJhMzhmZDJiZTBjOGFhMWZiNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTUzMzViY2JhYTA4NGM5MmJlNWE0ZjM0NmY5NzY0MDQgPSAkKGA8ZGl2IGlkPSJodG1sXzk1MzM1YmNiYWEwODRjOTJiZTVhNGYzNDZmOTc2NDA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxNDY3NSwgLTMuNjI4NjkxMzk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5NjNhZWNjZTdiMjQyYTM4ZmQyYmUwYzhhYTFmYjYyLnNldENvbnRlbnQoaHRtbF85NTMzNWJjYmFhMDg0YzkyYmU1YTRmMzQ2Zjk3NjQwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRhNjQ5MGUxM2ZmYjQzYjU4Mzk0YzRhYWNlMmQzOGZhLmJpbmRQb3B1cChwb3B1cF85OTYzYWVjY2U3YjI0MmEzOGZkMmJlMGM4YWExZmI2MikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhlMzNmNjM5MzE5YTQyZTdiMTE0ZWU2NGQwYzdjZWI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNjY1ODE3MDAwMDAwMDUsIC0zLjcxMDkyNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4N2RiZmEzM2VkYjQ5NTY4YzFjMzAwNWIwYjk1ZGY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3OGEyMDAzNzMzMjQ4Y2JiN2ViNjg4NDY2M2NhMGQwID0gJChgPGRpdiBpZD0iaHRtbF81NzhhMjAwMzczMzI0OGNiYjdlYjY4ODQ2NjNjYTBkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM2NjU4MTcwMDAwMDAwNSwgLTMuNzEwOTI1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg3ZGJmYTMzZWRiNDk1NjhjMWMzMDA1YjBiOTVkZjYuc2V0Q29udGVudChodG1sXzU3OGEyMDAzNzMzMjQ4Y2JiN2ViNjg4NDY2M2NhMGQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGUzM2Y2MzkzMTlhNDJlN2IxMTRlZTY0ZDBjN2NlYjQuYmluZFBvcHVwKHBvcHVwXzI4N2RiZmEzM2VkYjQ5NTY4YzFjMzAwNWIwYjk1ZGY2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzFmNTczMzY1ZjJlNGJkY2I4MzI1NmZkOGNhZjcxNGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxODk0MDUwMDAwMDAwNSwgLTMuODAxNjE3NzAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmOTUyY2ViNGQzNDRiOTI4MWUxN2UzYWY3NDgxZTM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiYTk4NWNlZDczODQ2YjRiZDA3NWUyM2JlOWViOTQ1ID0gJChgPGRpdiBpZD0iaHRtbF9kYmE5ODVjZWQ3Mzg0NmI0YmQwNzVlMjNiZTllYjk0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxODk0MDUwMDAwMDAwNSwgLTMuODAxNjE3NzAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmOTUyY2ViNGQzNDRiOTI4MWUxN2UzYWY3NDgxZTM0LnNldENvbnRlbnQoaHRtbF9kYmE5ODVjZWQ3Mzg0NmI0YmQwNzVlMjNiZTllYjk0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MxZjU3MzM2NWYyZTRiZGNiODMyNTZmZDhjYWY3MTRiLmJpbmRQb3B1cChwb3B1cF84Zjk1MmNlYjRkMzQ0YjkyODFlMTdlM2FmNzQ4MWUzNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI0MDllNzQ0YmRlZTRhMGU5ZWEwZmExZjZiNzZmM2UyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzIxNDkxMDAwMDAwMDUsIC0zLjYzOTUzNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiZWJkZTJiNGM0YTRiMjk5MDBlMTA2NGFjMTc1MTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyZmUzNjMxNmFlZTQ4ZDU4OTk3ZDhhN2U0ZmQ2OWNmID0gJChgPGRpdiBpZD0iaHRtbF9lMmZlMzYzMTZhZWU0OGQ1ODk5N2Q4YTdlNGZkNjljZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMjE0OTEwMDAwMDAwNSwgLTMuNjM5NTM1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWJlYmRlMmI0YzRhNGIyOTkwMGUxMDY0YWMxNzUxMzguc2V0Q29udGVudChodG1sX2UyZmUzNjMxNmFlZTQ4ZDU4OTk3ZDhhN2U0ZmQ2OWNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjQwOWU3NDRiZGVlNGEwZTllYTBmYTFmNmI3NmYzZTIuYmluZFBvcHVwKHBvcHVwX2FiZWJkZTJiNGM0YTRiMjk5MDBlMTA2NGFjMTc1MTM4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODc5MTcwZDQwZWQ2NDFkMDgwMjQ3NDg5ZWNhNmM0ODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ3MTMwMTUsIC0zLjYwNzg1MDcwMDAwMDAwMDZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YjFlOTZkOTkxZGE0MzZhOGQ4NTgwYjUzZGUyOGYxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MWQ5ODUxYTY2NDQ0ZTBhYmFiMGM3NmExMGRkNGU2ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDFkOTg1MWE2NjQ0NGUwYWJhYjBjNzZhMTBkZDRlNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NzEzMDE1LCAtMy42MDc4NTA3MDAwMDAwMDA2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGIxZTk2ZDk5MWRhNDM2YThkODU4MGI1M2RlMjhmMTMuc2V0Q29udGVudChodG1sXzQxZDk4NTFhNjY0NDRlMGFiYWIwYzc2YTEwZGQ0ZTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODc5MTcwZDQwZWQ2NDFkMDgwMjQ3NDg5ZWNhNmM0ODYuYmluZFBvcHVwKHBvcHVwXzRiMWU5NmQ5OTFkYTQzNmE4ZDg1ODBiNTNkZTI4ZjEzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTkzYjdjOWRhZDUwNDMzOTlmNjEzZDlhYmNjNjIxZmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUxODI5NjcsIC0zLjY1MzM5NTFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTNlZWEwZWQ4ODc0N2QwYTZlMTYyYmMwZmQxZWMyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWYzMzA0MTkxZjI0YzdlOTZkZTQ2MDU0OWY5NWRiOSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDlmMzMwNDE5MWYyNGM3ZTk2ZGU0NjA1NDlmOTVkYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MTgyOTY3LCAtMy42NTMzOTUxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODkzZWVhMGVkODg3NDdkMGE2ZTE2MmJjMGZkMWVjMjMuc2V0Q29udGVudChodG1sXzQ5ZjMzMDQxOTFmMjRjN2U5NmRlNDYwNTQ5Zjk1ZGI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTkzYjdjOWRhZDUwNDMzOTlmNjEzZDlhYmNjNjIxZmEuYmluZFBvcHVwKHBvcHVwXzg5M2VlYTBlZDg4NzQ3ZDBhNmUxNjJiYzBmZDFlYzIzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzEyYWM4NGNlZjY2NDVhZmIxNTYyYjI2MzMxMjc4Y2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5MzAzMiwgLTMuNzAxMDA4Nzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwMGVjN2U2ZWZlYjQ4MzM5N2FkMDU1ZGUwZWNjM2E4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwNDBjMzZmZTliZjRmMGU5NWQyOWI0MDc0NzcwOTY5ID0gJChgPGRpdiBpZD0iaHRtbF9jMDQwYzM2ZmU5YmY0ZjBlOTVkMjliNDA3NDc3MDk2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5MzAzMiwgLTMuNzAxMDA4Nzk5OTk5OTk5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwMGVjN2U2ZWZlYjQ4MzM5N2FkMDU1ZGUwZWNjM2E4LnNldENvbnRlbnQoaHRtbF9jMDQwYzM2ZmU5YmY0ZjBlOTVkMjliNDA3NDc3MDk2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MxMmFjODRjZWY2NjQ1YWZiMTU2MmIyNjMzMTI3OGNlLmJpbmRQb3B1cChwb3B1cF83MDBlYzdlNmVmZWI0ODMzOTdhZDA1NWRlMGVjYzNhOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VhY2MxMTMyYmNkYTRiYTlhZGRmYTY0NDQ3NGU5NjI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTk5NjcxMDAwMDAwMDUsIC0zLjY2NDY2OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY4NTVlY2Q2NWIxNDRhODc4OTY4YTExODZlZTNjZTc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxODZlYjlhNGMwNDRhZDM5ZmFlZTkyZTk2Y2I4MDI0ID0gJChgPGRpdiBpZD0iaHRtbF9iMTg2ZWI5YTRjMDQ0YWQzOWZhZWU5MmU5NmNiODAyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTk2NzEwMDAwMDAwNSwgLTMuNjY0NjY4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjg1NWVjZDY1YjE0NGE4Nzg5NjhhMTE4NmVlM2NlNzUuc2V0Q29udGVudChodG1sX2IxODZlYjlhNGMwNDRhZDM5ZmFlZTkyZTk2Y2I4MDI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWFjYzExMzJiY2RhNGJhOWFkZGZhNjQ0NDc0ZTk2MjcuYmluZFBvcHVwKHBvcHVwXzY4NTVlY2Q2NWIxNDRhODc4OTY4YTExODZlZTNjZTc1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMGIwYTYxYzIyMGU3NGYyZDhiYzg2NzcwZTczYTRiZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjg5MDEsIC0zLjY0NDg2MTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OWIyMmEzYmMzNTU0M2I1YTQ0NzJkM2IzYzViNjNkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGUwOGViMzNkZTQ0NmJmYTMzZmNkMDNiMzIzZTM1NiA9ICQoYDxkaXYgaWQ9Imh0bWxfYTRlMDhlYjMzZGU0NDZiZmEzM2ZjZDAzYjMyM2UzNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY4OTAxLCAtMy42NDQ4NjE0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTliMjJhM2JjMzU1NDNiNWE0NDcyZDNiM2M1YjYzZGYuc2V0Q29udGVudChodG1sX2E0ZTA4ZWIzM2RlNDQ2YmZhMzNmY2QwM2IzMjNlMzU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGIwYTYxYzIyMGU3NGYyZDhiYzg2NzcwZTczYTRiZTIuYmluZFBvcHVwKHBvcHVwXzU5YjIyYTNiYzM1NTQzYjVhNDQ3MmQzYjNjNWI2M2RmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDg0NDQ2NmZhNWZhNDhiOGE5MjQ3YjYwNTRmZWZjMDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzcwOTEsIC0zLjY1MTU5NDI5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjU3OTliZTMyYzc0Y2JjYjQyNmUzODQxOGQ0ZjgwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGUyM2VhZTk4OTU0OWM3OWQ5NGMyNzhjMWMzNDY4MyA9ICQoYDxkaXYgaWQ9Imh0bWxfMzhlMjNlYWU5ODk1NDljNzlkOTRjMjc4YzFjMzQ2ODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM3MDkxLCAtMy42NTE1OTQyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY1Nzk5YmUzMmM3NGNiY2I0MjZlMzg0MThkNGY4MDYuc2V0Q29udGVudChodG1sXzM4ZTIzZWFlOTg5NTQ5Yzc5ZDk0YzI3OGMxYzM0NjgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDg0NDQ2NmZhNWZhNDhiOGE5MjQ3YjYwNTRmZWZjMDAuYmluZFBvcHVwKHBvcHVwXzM2NTc5OWJlMzJjNzRjYmNiNDI2ZTM4NDE4ZDRmODA2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZmNjMzEwYjNhMjYxNDg5MThiNTg2OTFhNjU3ZTJhMTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQzOTQ0MjEsIC0zLjYyMTA3NjM5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OThkYWQ5ZGI1OGE0NjRiODcxZGZjYjFmNzJhOWJlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZWMxNTRjYjYyOWM0OTg2YTc2OWUxMjljZDgyYTdhNCA9ICQoYDxkaXYgaWQ9Imh0bWxfY2VjMTU0Y2I2MjljNDk4NmE3NjllMTI5Y2Q4MmE3YTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40Mzk0NDIxLCAtMy42MjEwNzYzOTk5OTk5OTk4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTk4ZGFkOWRiNThhNDY0Yjg3MWRmY2IxZjcyYTliZTIuc2V0Q29udGVudChodG1sX2NlYzE1NGNiNjI5YzQ5ODZhNzY5ZTEyOWNkODJhN2E0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmNjMzEwYjNhMjYxNDg5MThiNTg2OTFhNjU3ZTJhMTMuYmluZFBvcHVwKHBvcHVwXzk5OGRhZDlkYjU4YTQ2NGI4NzFkZmNiMWY3MmE5YmUyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNzQwYzE1NTM1ZWE4NGZlYzk3MTg5M2YxYzkyMDZlNzIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNjI2NjIsIC0zLjYyMzkwNDldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzI1YzEzM2I5NTg0MzBjYTMxNTMzYjhmYTk3NDU1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYTA5ODc1M2I2YzQ0MDZmOTE4ZjNjNzc2ODkxNGE4YSA9ICQoYDxkaXYgaWQ9Imh0bWxfMWEwOTg3NTNiNmM0NDA2ZjkxOGYzYzc3Njg5MTRhOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTYyNjYyLCAtMy42MjM5MDQ5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2MyNWMxMzNiOTU4NDMwY2EzMTUzM2I4ZmE5NzQ1NTEuc2V0Q29udGVudChodG1sXzFhMDk4NzUzYjZjNDQwNmY5MThmM2M3NzY4OTE0YThhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzQwYzE1NTM1ZWE4NGZlYzk3MTg5M2YxYzkyMDZlNzIuYmluZFBvcHVwKHBvcHVwX2NjMjVjMTMzYjk1ODQzMGNhMzE1MzNiOGZhOTc0NTUxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOWFkYTU1NWQzOWY4NGVmYThjNGU0ZjQ0MmEyNjkwNDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NjUzNjEwMDAwMDAwNiwgLTMuNjYyMDM2Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2YTM0NGZkODVhZTQyNmRhMTZkZjI3MWRmNzU0M2IyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3NmI4ODhhMDA0NzQyYjliYjJjNDJhMjM5MDI5ZTVjID0gJChgPGRpdiBpZD0iaHRtbF80NzZiODg4YTAwNDc0MmI5YmIyYzQyYTIzOTAyOWU1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NjUzNjEwMDAwMDAwNiwgLTMuNjYyMDM2Mjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2YTM0NGZkODVhZTQyNmRhMTZkZjI3MWRmNzU0M2IyLnNldENvbnRlbnQoaHRtbF80NzZiODg4YTAwNDc0MmI5YmIyYzQyYTIzOTAyOWU1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlhZGE1NTVkMzlmODRlZmE4YzRlNGY0NDJhMjY5MDQ5LmJpbmRQb3B1cChwb3B1cF8wNmEzNDRmZDg1YWU0MjZkYTE2ZGYyNzFkZjc1NDNiMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2FhNmVjZjVkMjJhZTQ5YWM5Y2QwZTdkNDQ0MTBjY2ZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTM4NjE2LCAtMy43MDA5NjY1OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmRjYTE5MWU4N2I4NGM5Zjk5NGJmZmI0ZDdhNTc3YzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU1Yjg3ODMyYzhlNDkwOWIyNzNmYzY1NmVhYjBkMWMgPSAkKGA8ZGl2IGlkPSJodG1sXzhlNWI4NzgzMmM4ZTQ5MDliMjczZmM2NTZlYWIwZDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzkzODYxNiwgLTMuNzAwOTY2NTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkY2ExOTFlODdiODRjOWY5OTRiZmZiNGQ3YTU3N2M4LnNldENvbnRlbnQoaHRtbF84ZTViODc4MzJjOGU0OTA5YjI3M2ZjNjU2ZWFiMGQxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FhNmVjZjVkMjJhZTQ5YWM5Y2QwZTdkNDQ0MTBjY2ZlLmJpbmRQb3B1cChwb3B1cF9mZGNhMTkxZTg3Yjg0YzlmOTk0YmZmYjRkN2E1NzdjOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzBiZjE0MmZkNzVlNDQ1OGJiNzdkM2JjNjkxZTRkMGIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTM3MDcyMDAwMDAwMDUsIC0zLjY1MTY0Nzc5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OGEwOTYzMjI2NmY0M2Y0YjI1ODdlNjFlNWU0YzAzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDk4MDgwMzcxMDI0ZGQ2YWZjNTcwN2IxNjkzN2EwNiA9ICQoYDxkaXYgaWQ9Imh0bWxfMGQ5ODA4MDM3MTAyNGRkNmFmYzU3MDdiMTY5MzdhMDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM3MDcyMDAwMDAwMDUsIC0zLjY1MTY0Nzc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OGEwOTYzMjI2NmY0M2Y0YjI1ODdlNjFlNWU0YzAzYy5zZXRDb250ZW50KGh0bWxfMGQ5ODA4MDM3MTAyNGRkNmFmYzU3MDdiMTY5MzdhMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYmYxNDJmZDc1ZTQ0NThiYjc3ZDNiYzY5MWU0ZDBiMC5iaW5kUG9wdXAocG9wdXBfOThhMDk2MzIyNjZmNDNmNGIyNTg3ZTYxZTVlNGMwM2MpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wYWM4ZDg4MmExNTc0MzA4YTRmMDVmODNlNDBmN2Y0NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5ODEwOTk5OTk5OTk1LCAtMy42NDc2NzQyOTk5OTk5OTk0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVlZDEzMjBkNWE4NDIyNWFkNjJhNmVkNzMxMmUzNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGFlYzM5YjU0NzA4NDg3MWI3ZGNkMzdmOTA5MWU4ZWYgPSAkKGA8ZGl2IGlkPSJodG1sXzBhZWMzOWI1NDcwODQ4NzFiN2RjZDM3ZjkwOTFlOGVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5ODEwOTk5OTk5OTk1LCAtMy42NDc2NzQyOTk5OTk5OTk0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzVlZDEzMjBkNWE4NDIyNWFkNjJhNmVkNzMxMmUzNzQuc2V0Q29udGVudChodG1sXzBhZWMzOWI1NDcwODQ4NzFiN2RjZDM3ZjkwOTFlOGVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGFjOGQ4ODJhMTU3NDMwOGE0ZjA1ZjgzZTQwZjdmNDcuYmluZFBvcHVwKHBvcHVwXzM1ZWQxMzIwZDVhODQyMjVhZDYyYTZlZDczMTJlMzc0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOTNjZWI3NzQ5MzQ2NDZkNTk4NDAwYTlmOWI2Y2FjOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTMxMzIwMDAwMDAwNSwgLTMuNjM1MjM3Mzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlNThmODNkM2NlMDQxODdhYzg0ODBlYzAxZGRmNWI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4YzViNzY1ZTNmNTRlMDhhMjY2MzU3OTkzMjM5MGM4ID0gJChgPGRpdiBpZD0iaHRtbF9kOGM1Yjc2NWUzZjU0ZTA4YTI2NjM1Nzk5MzIzOTBjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTMxMzIwMDAwMDAwNSwgLTMuNjM1MjM3Mzk5OTk5OTk5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlNThmODNkM2NlMDQxODdhYzg0ODBlYzAxZGRmNWI3LnNldENvbnRlbnQoaHRtbF9kOGM1Yjc2NWUzZjU0ZTA4YTI2NjM1Nzk5MzIzOTBjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzY2ViNzc0OTM0NjQ2ZDU5ODQwMGE5ZjliNmNhYzkwLmJpbmRQb3B1cChwb3B1cF82ZTU4ZjgzZDNjZTA0MTg3YWM4NDgwZWMwMWRkZjViNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RlYzg4NzhiYjkxOTRlYTU5Y2QzNTgwOTVjZDYwNTA1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjE1NTk5LCAtMy42NTk2MTE0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjBiZDdjZWFmODdmNDFjZjg4M2QyMjdkMDVkOGRkMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc2NDk2NmE1NDY2NGM0Njk4YTIyNGUxNjk4MGQ0NjggPSAkKGA8ZGl2IGlkPSJodG1sXzE3NjQ5NjZhNTQ2NjRjNDY5OGEyMjRlMTY5ODBkNDY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDYxNTU5OSwgLTMuNjU5NjExNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwYmQ3Y2VhZjg3ZjQxY2Y4ODNkMjI3ZDA1ZDhkZDIwLnNldENvbnRlbnQoaHRtbF8xNzY0OTY2YTU0NjY0YzQ2OThhMjI0ZTE2OTgwZDQ2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RlYzg4NzhiYjkxOTRlYTU5Y2QzNTgwOTVjZDYwNTA1LmJpbmRQb3B1cChwb3B1cF9mMGJkN2NlYWY4N2Y0MWNmODgzZDIyN2QwNWQ4ZGQyMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y4NjNiNzkyMTI3MTQ0MTBiZGFiNmFkNGUzMTkyOTc3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjk4MDYzLCAtMy42NDc2NzU0MDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGY0MjlhNTJmMTczNDc3ZWEwNWVhNTU3N2YyZmZmMDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2IxYzJjNWEzNmRkNGJhNWE2ZjA1ZGRkZTEzMzkwNjYgPSAkKGA8ZGl2IGlkPSJodG1sX2NiMWMyYzVhMzZkZDRiYTVhNmYwNWRkZGUxMzM5MDY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5ODA2MywgLTMuNjQ3Njc1NDAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmNDI5YTUyZjE3MzQ3N2VhMDVlYTU1NzdmMmZmZjA5LnNldENvbnRlbnQoaHRtbF9jYjFjMmM1YTM2ZGQ0YmE1YTZmMDVkZGRlMTMzOTA2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y4NjNiNzkyMTI3MTQ0MTBiZGFiNmFkNGUzMTkyOTc3LmJpbmRQb3B1cChwb3B1cF80ZjQyOWE1MmYxNzM0NzdlYTA1ZWE1NTc3ZjJmZmYwOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA1ZGUwNTU2NWY5NjRiODNhZWFiMTZjMjA0MThjNTE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI1NzY2LCAtMy43OTY1OTc1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzhiMDIzOTQ4NjIzNDBkOGI4ZmI5YTYwYzFlMmE0YTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjM4N2U1NzQyODQyNGE4ZWI5ZjY1ZDQ2MzM1NDExMzMgPSAkKGA8ZGl2IGlkPSJodG1sXzIzODdlNTc0Mjg0MjRhOGViOWY2NWQ0NjMzNTQxMTMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEyNTc2NiwgLTMuNzk2NTk3NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4YjAyMzk0ODYyMzQwZDhiOGZiOWE2MGMxZTJhNGE4LnNldENvbnRlbnQoaHRtbF8yMzg3ZTU3NDI4NDI0YThlYjlmNjVkNDYzMzU0MTEzMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1ZGUwNTU2NWY5NjRiODNhZWFiMTZjMjA0MThjNTE3LmJpbmRQb3B1cChwb3B1cF83OGIwMjM5NDg2MjM0MGQ4YjhmYjlhNjBjMWUyYTRhOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzcwMjc0ZmZlZGU4YzRmOTg5ODc5YTFlNGQyYWZmZjFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTcwMjUxLCAtMy42NjEzMDU5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjgyYjNhZDYzNmRjNDY3Njk1NjQ0MTA0MDQ5NWM4YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTdkMzc0N2FiOTgxNDdiMWE4OGI5OWU0OTBjZWJlNzUgPSAkKGA8ZGl2IGlkPSJodG1sXzU3ZDM3NDdhYjk4MTQ3YjFhODhiOTllNDkwY2ViZTc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk3MDI1MSwgLTMuNjYxMzA1OV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4MmIzYWQ2MzZkYzQ2NzY5NTY0NDEwNDA0OTVjOGI3LnNldENvbnRlbnQoaHRtbF81N2QzNzQ3YWI5ODE0N2IxYTg4Yjk5ZTQ5MGNlYmU3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcwMjc0ZmZlZGU4YzRmOTg5ODc5YTFlNGQyYWZmZjFkLmJpbmRQb3B1cChwb3B1cF9iODJiM2FkNjM2ZGM0Njc2OTU2NDQxMDQwNDk1YzhiNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY1YjBhODJkM2Q4YTRjZGNiNzU1ODRjNDY4MjMxNjFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2NDUxLCAtMy42NDUzNzM3OTk5OTk5OTk4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQ3NWM5NDhmMGIzNDg3ZmFhODM5NmRjYWVhN2U2ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjZjN2U0MDliMGJmNDIxMDk2Njc4NTU0OWRmODYyNmEgPSAkKGA8ZGl2IGlkPSJodG1sX2I2YzdlNDA5YjBiZjQyMTA5NjY3ODU1NDlkZjg2MjZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjQ1MSwgLTMuNjQ1MzczNzk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0NzVjOTQ4ZjBiMzQ4N2ZhYTgzOTZkY2FlYTdlNjg4LnNldENvbnRlbnQoaHRtbF9iNmM3ZTQwOWIwYmY0MjEwOTY2Nzg1NTQ5ZGY4NjI2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY1YjBhODJkM2Q4YTRjZGNiNzU1ODRjNDY4MjMxNjFhLmJpbmRQb3B1cChwb3B1cF9mNDc1Yzk0OGYwYjM0ODdmYWE4Mzk2ZGNhZWE3ZTY4OCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YyMTVhZWQ2NDhiODQ0NWFhODY3YTA5MDlmYmRhN2ZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk2MjMxLCAtMy42MzMzMTgxMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzk3ZGUxMmUxNGIyNDNkNWE2ZmU0MWM1ZjUwODZiNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQ5ODVjZGU2NjkzNDEwMGIxYTM5OGYyZjc0YjliMGIgPSAkKGA8ZGl2IGlkPSJodG1sXzI0OTg1Y2RlNjY5MzQxMDBiMWEzOThmMmY3NGI5YjBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5NjIzMSwgLTMuNjMzMzE4MTAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM5N2RlMTJlMTRiMjQzZDVhNmZlNDFjNWY1MDg2Yjc3LnNldENvbnRlbnQoaHRtbF8yNDk4NWNkZTY2OTM0MTAwYjFhMzk4ZjJmNzRiOWIwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YyMTVhZWQ2NDhiODQ0NWFhODY3YTA5MDlmYmRhN2ZmLmJpbmRQb3B1cChwb3B1cF8zOTdkZTEyZTE0YjI0M2Q1YTZmZTQxYzVmNTA4NmI3NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkzMTRhZGE3ZjdlNjQ4Njc5NGM0ZWU0NjVjNjBmNjZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xOTU5ODQ5LCAtNC4xMTUyMjY3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2M2Nzk2Njc1NGUwYTQxOTY4ZDhjMTQxOGQxYTEwMTU3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZThmOGRkYTc4MTBhNDVmNDg4YjdiNzA4YzEzOWVkYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmVjNzI1OWYyYWFkNDExZTg3OWMxNWNkMjRkMGEzMGEgPSAkKGA8ZGl2IGlkPSJodG1sXzJlYzcyNTlmMmFhZDQxMWU4NzljMTVjZDI0ZDBhMzBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMTk1OTg0OSwgLTQuMTE1MjI2N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4ZjhkZGE3ODEwYTQ1ZjQ4OGI3YjcwOGMxMzllZGExLnNldENvbnRlbnQoaHRtbF8yZWM3MjU5ZjJhYWQ0MTFlODc5YzE1Y2QyNGQwYTMwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzMTRhZGE3ZjdlNjQ4Njc5NGM0ZWU0NjVjNjBmNjZhLmJpbmRQb3B1cChwb3B1cF9lOGY4ZGRhNzgxMGE0NWY0ODhiN2I3MDhjMTM5ZWRhMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE4NWYyY2VhNmFlYjQ3N2Y5ZmRlODdjYWJmZTYxZDE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzQ1MDQ3OTk5OTk5OSwgLTMuNjAzODk4NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZDU3NDA2OTdjMDQ5ZjJiYTk1ZGNkMmZjNmE5ZTk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1NjcwOTdlOTIzNjQ4ODJiNWFlM2FiZWU5Y2RhNjc2ID0gJChgPGRpdiBpZD0iaHRtbF9iNTY3MDk3ZTkyMzY0ODgyYjVhZTNhYmVlOWNkYTY3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQzNDUwNDc5OTk5OTk5LCAtMy42MDM4OTg1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRkNTc0MDY5N2MwNDlmMmJhOTVkY2QyZmM2YTllOTUuc2V0Q29udGVudChodG1sX2I1NjcwOTdlOTIzNjQ4ODJiNWFlM2FiZWU5Y2RhNjc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTg1ZjJjZWE2YWViNDc3ZjlmZGU4N2NhYmZlNjFkMTcuYmluZFBvcHVwKHBvcHVwX2VkZDU3NDA2OTdjMDQ5ZjJiYTk1ZGNkMmZjNmE5ZTk1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODY1MTkxMDhlZDI4NDg0Yzg3YmVlNjA5Njc0ZDVhYTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxODQwMzcsIC0zLjYyMTg3MDIwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNmViOWVjY2QwNWQ0YjBmOGUzNDliZDM5MTVlZWQ0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWEzNDg2NTQzOTA0ZTZjYmY5YjQ5NTE1YmNhY2I3MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNDlhMzQ4NjU0MzkwNGU2Y2JmOWI0OTUxNWJjYWNiNzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTg0MDM3LCAtMy42MjE4NzAyMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDZlYjllY2NkMDVkNGIwZjhlMzQ5YmQzOTE1ZWVkNGIuc2V0Q29udGVudChodG1sXzQ5YTM0ODY1NDM5MDRlNmNiZjliNDk1MTViY2FjYjczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODY1MTkxMDhlZDI4NDg0Yzg3YmVlNjA5Njc0ZDVhYTAuYmluZFBvcHVwKHBvcHVwX2Q2ZWI5ZWNjZDA1ZDRiMGY4ZTM0OWJkMzkxNWVlZDRiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNmVhODQ2MGE2Mzg1NDY2Y2FhZmFiMDliYTYzZTBhMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNTE5NzUsIC0zLjY1MTA1MDIwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzY3OTY2NzU0ZTBhNDE5NjhkOGMxNDE4ZDFhMTAxNTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZDY5YmQ4MzQ1ZmE0ZDMxYmU2ZjVhMjYwMjU3M2M1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNmI4MWI5OWRiNmI0YjhjYjE0YjFmNGU5YzUwYzllMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZjZiODFiOTlkYjZiNGI4Y2IxNGIxZjRlOWM1MGM5ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTUxOTc1LCAtMy42NTEwNTAyMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2Q2OWJkODM0NWZhNGQzMWJlNmY1YTI2MDI1NzNjNTguc2V0Q29udGVudChodG1sX2Y2YjgxYjk5ZGI2YjRiOGNiMTRiMWY0ZTljNTBjOWUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmVhODQ2MGE2Mzg1NDY2Y2FhZmFiMDliYTYzZTBhMzQuYmluZFBvcHVwKHBvcHVwXzdkNjliZDgzNDVmYTRkMzFiZTZmNWEyNjAyNTczYzU4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTJlMGY2MWI5MWUzNDNhNWFlMDgyYzg1ZGQ5ZmE5ZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDIxNTAwMDAwMDAwNSwgLTMuNjQxMDk0OTk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jNjc5NjY3NTRlMGE0MTk2OGQ4YzE0MThkMWExMDE1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkNTIxMWRiOWE3MDQzNjE4Yzc2MzQyOTM2YjJhZGY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzMmM3MWRiMGFjYzRhOTQ4NDQ1MmUzNzdmNzQwYTk0ID0gJChgPGRpdiBpZD0iaHRtbF82MzJjNzFkYjBhY2M0YTk0ODQ0NTJlMzc3Zjc0MGE5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDIxNTAwMDAwMDAwNSwgLTMuNjQxMDk0OTk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkNTIxMWRiOWE3MDQzNjE4Yzc2MzQyOTM2YjJhZGY0LnNldENvbnRlbnQoaHRtbF82MzJjNzFkYjBhY2M0YTk0ODQ0NTJlMzc3Zjc0MGE5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUyZTBmNjFiOTFlMzQzYTVhZTA4MmM4NWRkOWZhOWZmLmJpbmRQb3B1cChwb3B1cF9kZDUyMTFkYjlhNzA0MzYxOGM3NjM0MjkzNmIyYWRmNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
wx002's avatar
wx002 committed
1107 1108
      ],
      "text/plain": [
wx002's avatar
wx002 committed
1109
       "<folium.folium.Map at 0xb5d2210>"
wx002's avatar
wx002 committed
1110 1111
      ]
     },
wx002's avatar
wx002 committed
1112
     "execution_count": 20,
wx002's avatar
wx002 committed
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With the limitations of API and time constriants, we did not manage to references all the address to notable locations. However, we can do some basic searches to get some ideas of the person by manually lookup the top 10 most visited locations. Our results are as followed:\n",
    "1. Calle de Nicolás Salmerón - Sports Club\n",
    "2. Autovía A-1 - Route\n",
    "3. Shango - Bar \n",
    "4. Calle de Nicolás Salmerón - Residential Area\n",
    "5. Parking Lot close to Amusement Center\n",
    "6. Sala Bohemia - Music School\n",
    "7. CC-51 - Route close to Gas Station\n",
    "8. Different Parking Lot to Amusement Center\n",
    "9. Car Rental Agency - Calle de la Caléndula\n",
    "10. Aist Madrid - Medical Clinic\n",
    "\n",
    "Based on these, it should be safe to inference that the person helps people travel to places and live at Calle de Nicolás Salmerón. There is constant visit of a sports Club, so we can assume is a Male. \n",
    "\n",
    "# Conclusion - Phone Data\n",
    "This is as much as we can do so far with this dataset. For the future, we could consider referencing external datasets, such as history taxi or other means of transportation and see if there are correlation to possibly identify the person. However, this dataset still indicate the following information, which could be consider a breach of privacy.\n",
    "1. Perosnal home address is exposed\n",
    "2. Occupation\n",
    "3. General area mobility\n",
    "4. Habits\n",
    "5. Gender (Inference)\n",
    "6. Private info such as going to medical clinic\n",
    "With how frequent the android phone keep track of the location data on a daily basis, the data could have the potential to reavel much more info if it gets larger since this is just a month.\n",
    "\n",
    "Next, we will be looking at social network location datasets and try to see if we can find similar info for group of users rather than a specific individual."
   ]
  },
wx002's avatar
wx002 committed
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Brightkite - Reading Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We start by reading the csv files of our datasets into a pandas DataFrame using pd.read_csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data = pd.read_csv('Datasets/Brightkite.txt', delim_whitespace = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can see below that the Brightkite file contains 5 columns: UserID, Time, Latitude, Longitude, and PlaceID  \n",
    "\n",
    "UserID: An ID number corresponding to an individual User. These are currently repeated (not linkably) across datasets, so we will have to find a way to ensure all IDs are unique in the future  \n",
    "\n",
    "Time: The time(s) a user visited a location  \n",
    "\n",
    "Latitude and Longitude: coordinates of actual location  \n",
    "\n",
    "PlaceID: a place that corresponds to that location  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'Brightkite_data' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-2-b1e3a7c58f82>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mBrightkite_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'Brightkite_data' is not defined"
     ]
    }
   ],
   "source": [
    "Brightkite_data.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Combine Latitude and Longitude into one column: Coordinates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data['Coordinates'] = tuple(Brightkite_data[['Latitude','Longitude']].values)\n",
    "Brightkite_data.drop(['Latitude','Longitude'], axis=1, inplace = True)\n",
    "Brightkite_data.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'Brightkite_data' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-3-71d83c12e8d3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mBrightkite_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'UserID'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'Brightkite_data' is not defined"
     ]
    }
   ],
   "source": [
    "Brightkite_data['UserID'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Preprocessing Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#this code is used to find places with unusually high rates of visitors\n",
    "place_groups = Brightkite_data.groupby(['Coordinates'], group_keys=True)\n",
    "location_counts = place_groups['Coordinates'].count()\n",
    "location_rankings = location_counts.sort_values().tail(40)\n",
    "location_rankings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#remove NAs. There are over 256000 datapoints at (0.0,0.0). This is the middle of nowhere.\n",
    "#It is safe to assume these people didn't actually go there.\n",
    "Brightkite_data = Brightkite_data[Brightkite_data.Coordinates != (0.0,0.0)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "group_by_user = Brightkite_data.groupby(['UserID'], group_keys = True)#group by person\n",
    "places_per_user = group_by_user['Coordinates'].unique() #find number of unique locations each person visited"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "places_per_user[0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "countin = 0\n",
    "countout = 0\n",
    "keepers = []\n",
    "minimum_places = 15\n",
    "for i in places_per_user:\n",
    "    if i.size < minimum_places:\n",
    "        countout += 1\n",
    "        keepers.append(False)\n",
    "    else:\n",
    "        countin += 1\n",
    "        keepers.append(True)\n",
    "print(countin, countout)\n",
    "print(places_per_user.index)\n",
    "print(type(places_per_user))\n",
    "#the only problem with keepers is that its index does not match the index of places per user.\n",
    "#if we can get index in keepers to match userID like it does in places per user it might help\n",
    "\n",
    "#now we have the list of all users who have more than minimum_places unique coordinates logged"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We were able to successfully separate users who provided sufficient data from those who didn't."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(countin, countout)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " Below you can see the location data of the users who were able to provide sufficient data, along with their user ID's."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(places_per_user[keepers].head(10))\n",
    "print(places_per_user[keepers].tail(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " At this point we can see all of the users that we want and the ones that we don't want. Now it is time to sort them out."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Finalize the Processed Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "invalid_users = []\n",
    "for i in places_per_user.index:\n",
    "    if places_per_user[i].size < minimum_places:\n",
    "        invalid_users.append(i)\n",
    "Brightkite_data = Brightkite_data[~Brightkite_data['UserID'].isin(invalid_users)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Convert Datetime into Date and Time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The datasets we used presented its \"Time\" information in an unusable string format. In order to make use of this data, we had to convert it into something easier to utilize."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "time = Brightkite_data['Time'].str.split(\"T\", n = 1, expand = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data.drop(columns=[\"Time\"], inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data['Date'] = time[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data['Time'] = time[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'Brightkite_data' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-4-63205129c5ad>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mBrightkite_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Time'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mBrightkite_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Time'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mslice\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'Brightkite_data' is not defined"
     ]
    }
   ],
   "source": [
    "Brightkite_data['Time'] = Brightkite_data['Time'].str.slice(0,-4,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " In order to tell which users have gone to different locations together, we split the time strings into Date and Time.  We then removed the old version of the data, as it was no longer necessary. After that we put in the new \"Date\" and \"Time\" columns.  We also converted time to simply contain minutes and seconds. This made the data much easier to work with."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Remove duplicates and save \n",
    "\n",
    "Sometimes users visit the same place multiple times a day, they may also check in to the same place several times during one visit. We decided to eliminate these repeat visits and just count whether or not a person visited a given place at all during the day"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data = Brightkite_data[~Brightkite_data.duplicated(['UserID','Coordinates','Date'],keep='first')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Brightkite_data.to_csv('Datasets/Brightkite_light.txt')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Challenges\n",
    "Throughout this project, we have encounter numerous challenges that we have manage to overcome.\n",
    "1. Large dataset, which results long run time or not capable of running on laptops.\n",
    "Solution: Pre-process the dataset by removing useless informations such as places that only been visited once or twice to reduce the number of entries.\n",
    "2. Limitation of Location API - Bing\n",
    "Solution: Similar to previous, pre-process the dataset to make it smaller, so we don't have the risk of going over the free limits and long run time.\n",
    "\n",
    "\n",
    "# Future Research\n",
    "There various ways that could take this concept into the next level and do much more. We will talk specific toward the phone dataset and the brightkite dataset.\n",
    "\n",
    "## Phone Dataset\n",
    "1. Use the accuracy column to get a more precise result of locations. Also, this can be apply to Google's Place API to get point of interest around that circle of radius in meters.\n",
    "2. Resample the time intervals by a smaller time frame, such as looking at location changes every 6 hours to get a more precise routing map\n",
    "\n",
    "## BrightKite Dataset\n",
    "1. Route tracing for multiple users at once to get a better sense of where do people go\n",
    "2. Find details of possible home address of each users\n",
    "\n",
    "Additionally, there is also the possiblilty of finding more about the users by reference other datasets.\n",
    "\n",
    "\n",
    "# Conclusion\n",
    "Overall, we found out that location dataset could be very dangerous for anyone to collect. With sufficent location information, it is rather easy identify users' private informations solely using location data. This is clearly shown by our analysis in both of our datasets. We were capable of finding popular user locations and general area of operations for each users. Also, by knowing exactly where users normally go, we can draw inferences about users based on this. Hence, users should be very careful when sharing location data because this can provide critical information to external parties that can be use against you. Especially with social media, given people normally provide their date of birth, by knowing the precise home address of users, it is rather easy to uniquely identify individuals. "
   ]
  },
wx002's avatar
wx002 committed
1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Appendix - Who Did What\n",
    "Ben - Ben did most of the planning and all the code and anaylsis for the phone location dataset as the foundation and help with the data analysis of the Brightkite dataset. He is also the person mainly in charge of researching tools and various API for reverse geocoding. He also contributed to the writing and the presentation slides.\n",
    "\n",
    "Brad - Brad contributed to the Brightkite dataset analysis, this includes contribution to creating code to analyze and processing the Brightkite dataset. He also contributed to slide creation. Additionally, he brought food for everyone during meeting times.\n",
    "\n",
    "Corrine - Corrine did most of the reading and research for our topic. She also contributed to working with the Brightkite dataset, this includes analyzing and processing data, working along side with Brad. Also, she does most of the proof-reading and editing for all our writing assignements, this includes all our checkpoints and slides."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}