{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Lab 12 - Visualization Primer.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GJNQPhLVOaMd",
"colab_type": "text"
},
"source": [
"# Visualization\n",
"\n",
"In this final lab, we'll see how to make some advanced plots, changing pallettes, and leverage the top two packages for this purpose: [Matplotlib](https://matplotlib.org/) and [plot.ly](). We'll also enhance our visualization methods using [Seaborn]().\n",
"\n",
"## Matplotlib, Pyplot and Seaborn\n",
"\n",
"The best known package for plotting is Matplotlib, which imports the Matlab plot syntaxis into python. This is mostly done through its subpackage [pyplot](https://matplotlib.org/tutorials/introductory/pyplot.html). It is very well documented, I suggest you go through the tutorial yourself! \n",
"\n",
"We have used many times the pyplot package, so we will focus mostly on some more advanced plots that we have not seen before, and in ways to stile and use our plots more effectively.\n",
"\n",
"The basic pyplot structure involves:\n",
"\n",
"1. Define an empty plot.\n",
"2. Define the data and the basic structure.\n",
"3. Add details (labels, axes, marks, sizes...)\n",
"4. Display the plot.\n",
"\n",
"However, there are so many types of plots that the explanation above is too simplistic. Much better choice is to start using a few plots and playing around with them.\n",
"\n",
"For this example we'll plot a violin plot, which is a great way to see distributions.\n",
"\n",
"Let's import all packages we need."
]
},
{
"cell_type": "code",
"metadata": {
"id": "hmZ7DBv1dqL1",
"colab_type": "code",
"colab": {}
},
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from scipy import stats\n",
"%matplotlib inline"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYp_KQ_CeQFa",
"colab_type": "text"
},
"source": [
"A violin plot is a type of box plot which simultaneously shows distribution and dispersion. For this, we'll also use matplotlibs companion package seaborn, which simplifies some plots.\n",
"\n",
"Warning: Seaborn can be very restrictive. Sometimes is much better to simply use pyplot and use seaborn to style the plot.\n",
"\n",
"We will plot the honorable dataset iris, the best known dataset in pattern recognition. The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. One class is linearly separable from the other 2; the latter are NOT linearly separable from each other. \n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "YepPHE37ePUy",
"colab_type": "code",
"colab": {}
},
"source": [
"# Load dataframe. \n",
"df = sns.load_dataset('iris')\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0wU88ubKjrru",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "214eeee8-954d-4bec-b5d9-62c3be535187"
},
"source": [
"# Violin plot\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=\"Blues\")"
],
"execution_count": 5,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Yw8F5X9_kA5M",
"colab_type": "text"
},
"source": [
"Let's alter the plot a bit. Seaborn allows using \"styles\". Each style will give the plot a completely different look. The five basic styles are darkgrid, whitegrid, dark, white, and ticks, and each can be set with the function ```set_style```."
]
},
{
"cell_type": "code",
"metadata": {
"id": "LS8soHJVkOKl",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "b27aa048-750a-43a8-f926-26462a6a7ceb"
},
"source": [
"sns.set_style(\"darkgrid\")\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=\"Blues\")"
],
"execution_count": 7,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nxC+jh+5nHj+JsAAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "0xk4g41pkfzG",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "e0a5d694-e913-41f2-f60c-4181045b39d9"
},
"source": [
"sns.set_style(\"dark\")\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=\"Blues\")"
],
"execution_count": 8,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kL8bBS_Vkq60",
"colab_type": "text"
},
"source": [
"What if we want to focus on a particular group? We can do this by simply assigning a pallete colour for each element."
]
},
{
"cell_type": "code",
"metadata": {
"id": "F8qfLb8Hk1Qw",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "a1b57edb-7a79-488a-e70f-87360de393c6"
},
"source": [
"my_pal = {\"versicolor\": \"g\", \"setosa\": \"lightgrey\", \"virginica\":\"lightgrey\"}\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=my_pal)"
],
"execution_count": 14,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nJHxBEAQ7IRK+IAiCnRAJXxAEwU6IhC8IgmAnRMIXBEGwEyLhm1B4eDgJCQlyhyEUwpw5czh8+HC+\nj4uMjGTAgAEmiMg+JSQkMHjw4HwfN27cOK5cufLc56xcuZL169cXNDSrItbhm1Dv3r0ZOXIk1atX\nlzsU4TkkSUKSJKPuu5yXDX/+Kzs7G0dHsT1Ffom/W/6Iv1Q+qdVqPvvsM+Lj4zEYDHzyyScEBwfz\n5Zdfolar8fHxYebMmZw6dYqoqCiGDx+Oi4sLq1ev5vTp03z11Vfo9XqqVavGlClTcHJyYtasWURE\nRKBUKgkJCWHUqFFERETw008/kZWVRZEiRZg1axZ+fn5y//oWbdasWRQvXpx3330XgLlz5+Lm5oYk\nSWzbto3MzEzatGnD4MGDiY2NpW/fvtSsWZPo6GgWLlzI3LlziYqKQqFQ8Prrr9OnTx9Gjx5N8+bN\nCQ0N5ezZs8yYMQO1Wo2TkxNLly5FpVIxefJkoqKiUCqVjB49moYNGz4SV0pKCmPHjuXWrVu4uroy\ndepUXn75ZebOnUtMTAy3bt2iRIkSfPvtt3L82SzOs17HP//8k82bNxMeHs7OnTtRq9UYDAbCwsKY\nOnUqR48epXjx4jg6OvL6668TGhr6yKDrlVde4b333uOvv/7CxcWF+fPn4+fnl9t+3759uXnzJpMm\nTSI5ORmlUsmcOXMoWrQon3zyCampqWRnZzNkyBBat24t81+pgCQhX7Zv3y6NGzcu93Zqaqr01ltv\nSUlJSZIkSdKWLVuk0aNHS5IkSb169ZLOnj0rSZIkabVa6dVXX5WuXbsmSZIkjRgxQlqyZImUnJws\ntW3bVjIYDJIkSdKDBw8kSZKklJSU3Pv++OMPaebMmeb5Ba1YdHS09O677+bebt++vRQeHi6NHz9e\nMhgMkl6vl/r37y8dO3ZMunXrllSpUiXp9OnTkiRJ0rlz56Q+ffrkHvvwdRg1apS0bds2SafTSS1b\ntpTOnDkjSZIkpaWlSVlZWdLixYtzX+8rV65IzZo1k7RarXT06FGpf//+kiRJ0tSpU6W5c+dKkiRJ\nhw8flrp06SJJkiT98MMPUrdu3SSNRmPiv4x1edrrePz4caljx46SJEnSunXrpKZNm0r379+XJEmS\ntm3bJvXr10/S6/VSYmKiVLduXWnbtm2SJD36HqxYsaK0Z88eSZIk6auvvpJ+/PFHSZJyXodffvlF\n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\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MUxPQoSJlU36",
"colab_type": "text"
},
"source": [
"There are many colours we can use, the full list is [here](https://matplotlib.org/2.0.2/examples/color/named_colors.html).\n",
"\n",
"We can control a whole set of parameters in seaborn. To see the full list, run the following\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "WM6NnOkQl3Pj",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 538
},
"outputId": "22bee77d-1e38-4963-faae-fa0d93ce1d11"
},
"source": [
"sns.axes_style()"
],
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'axes.axisbelow': True,\n",
" 'axes.edgecolor': 'white',\n",
" 'axes.facecolor': '#EAEAF2',\n",
" 'axes.grid': False,\n",
" 'axes.labelcolor': '.15',\n",
" 'axes.spines.bottom': True,\n",
" 'axes.spines.left': True,\n",
" 'axes.spines.right': True,\n",
" 'axes.spines.top': True,\n",
" 'figure.facecolor': 'white',\n",
" 'font.family': ['sans-serif'],\n",
" 'font.sans-serif': ['Arial',\n",
" 'DejaVu Sans',\n",
" 'Liberation Sans',\n",
" 'Bitstream Vera Sans',\n",
" 'sans-serif'],\n",
" 'grid.color': 'white',\n",
" 'grid.linestyle': '-',\n",
" 'image.cmap': 'rocket',\n",
" 'lines.solid_capstyle': 'round',\n",
" 'patch.edgecolor': 'w',\n",
" 'patch.force_edgecolor': True,\n",
" 'text.color': '.15',\n",
" 'xtick.bottom': False,\n",
" 'xtick.color': '.15',\n",
" 'xtick.direction': 'out',\n",
" 'xtick.top': False,\n",
" 'ytick.color': '.15',\n",
" 'ytick.direction': 'out',\n",
" 'ytick.left': False,\n",
" 'ytick.right': False}"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XEw__KAjl5tm",
"colab_type": "text"
},
"source": [
"To set any of these, run the ```set_style``` function, and give it a dictionary with which parameters you would like to alter."
]
},
{
"cell_type": "code",
"metadata": {
"id": "WKoV4Ib9l4-c",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "336bf034-4b3a-44c1-c0af-d3ef2fafa0ef"
},
"source": [
"sns.set_style(\"darkgrid\", {\"axes.grid\": \"True\"})\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=my_pal)\n"
],
"execution_count": 18,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd8U9X7wPFPmqZ70wWUskE2MpRR\nZNOyh6iooCgI4hdBkL1BhgNUBFFABIssgcreVDaUKaMMZZZS2kKhdGS0Te7vj0p/Iqsjyc0479eL\nl016c87TxDw5Offc5ygkSZIQBEEQbJ6D3AEIgiAI5iESviAIgp0QCV8QBMFOiIQvCIJgJ0TCFwRB\nsBMi4QuCINgJkfAFQRDshEj4giAIdkIkfEEQBDvhKHcA/2YwGNDrxYW/giAIBaFSKfN1nEUlfL1e\nIjVVLXcYgiAIViUgwDNfx4kpHUEQBDshEr4gCIKdEAlfEATBToiELwiCYCdEwhcEQbATIuELgiDY\nCZHwBUEQ7IRI+IIg2DxJkhC7uYqELwiCjcvJyaFLl7a89lonDAaD3OHIyqKutBUEQTC21NRUUlLu\nAqDRqHF395A5IvmIEb4gCDYtIyM97+f09AwZI5GfSPiCINi0Bw8e5P2clpYqYyTyEwlfEASb9uDB\n/yf51FSR8AVBEGzWw/n7//5sj0TCFwTBpt25k/zEn+2RWKUjCIJNS0y8TUBAADqdjsTE23KHIyuR\n8AVBsGm3bsUTGBhIVlYW8fE35Q5HVmJKRxAEmyVJEnFx1ylZsiTFixfn5s04uUOSlUj4giDYrJSU\nFNLT0ylZsiSlSpXizp1kMjLsdy2+SPiCINisK1f+BqB06dKULl36kfvskUj4giDYrAsXYgEoV64c\n5cqVA+DixfNyhiQrcdJWEASbdf78OUqWLIm7uzvu7u4EBAQQG3tO7rBkI0b4giDYJIPBwJkzp3nh\nhRfy7qtcuTJnzvxpt6WSRcIXBMEmXbnyNxkZ6VStWjXvvqpVq3L37h27Xa0jEr4gCDbp2LEYAGrW\nrJl3X61atR75nb0RCV8QBJt05MghSpUqhZ+fX959wcHBBAUFERNzSMbI5GPyhL9kyRLat29Phw4d\nGDp0KDqdztRdCoJg5zIyMjh9+hR169Z97Hd169bl+PGjaLVaGSKTl0kTflJSEpGRkaxdu5ZNmzah\n1+vZvHmzKbsUBEHgyJGD6PV66tev/9jv6tWrR1ZWFseP29+0jslH+Hq9Hq1WS05ODlqtlsDAQFN3\nKQiCndu79w98fX2pVKnSY7+rVq0a7u7u7NkTLUNk8jLpOvygoCDef/99mjdvjrOzM40bNyYsLOyp\nxyuVCnx83EwZkiAINk6j0XD48AFeeeUVHBweH9M6OjpSv359Dh7ch7u7IyqVkwxRysOkCf/Bgwfs\n3r2b3bt34+npyeDBg1m/fj2dO3d+4vF6vURqqtqUIQmCYOP++GMXWq2WRo0aPfWYRo0asWfPHnbt\n2kPDhk8fhFqLgADPfB1n0imdQ4cOERISgp+fHyqVijZt2nDq1ClTdikIgp3bvXsn3t7ej6y//6+a\nNWvi5ubO7t07zRiZ/Eya8EuUKMHp06fRaDRIksThw4cpX768KbsUBMGOqdVqDh8+QMOGDVEqlU89\nTqVS8fLLL7F//x6ysrLMGKG8TJrwa9WqRXh4OF27dqVjx44YDAbeeOMNU3YpCIIdO3hwHzqdjsaN\nG+fdt2fPHvbs2fPYsY0bNyYzM5OjRw+bMUJ5mbx42qBBgxg0aJCpuxEEQSA6ehe+vr6P1M+Jjs5d\njdOsWbNHjq1Rowaenp7s3r2TsLCm5gxTNuJKW0EQbIJarSYm5hANGjR44uqc//r3ah17mdYRCV8Q\nBJtw5MghsrKyaNCgQb4f07BhQ9RqNcePHzVhZJZDJHxBEGzC/v178PLyokqVKvl+TI0aNXB1dWX/\n/r0mjMxyiIQvCILVy8nJ4ciRg9SpU+eZq3P+S6VSUbt2bQ4d2m8XNfJFwhcEwepduBBLeno6derU\nKfBj69SpQ0rKXS5ftv29bkXCFwTB6h07FoNCocird18QtWvXzmvD1omELwiC1Ttx4hjlypXDw8Oj\nwI/18/MjJCSEEyds/8StSPiCIFi17Oxszp+PfWYpheepWrUq586dQa/XGzEyyyMSviAIVu2vvy6R\nnZ1F5cqVC91G5cqVyczM5Nq1q0aMzPKIhC8IglW7eDEW4Im17/Pr4WMvXjxvlJgslUj4giBYtUuX\nLuLt7f3I3rUFFRwcjJubG5cuXTRiZJZHJHxBEKza5ct/U6ZMGRQKRaHbcHBwIDQ0lKtXLxsxMssj\nEr4gCFbLYDBw48Y1SpUqVeS2HiZ8W74ASyR8QRCsVlJSIjqdjpCQkCK3VbJkSdLT00lNTTVCZJZJ\nJHxBEKzWzZtxQO5mS0X1sI24uBtFbstSiYQvCILVio+/CUDx4sWL3FZwcDAACQnxRW7LUomELwiC\n1bp16yZOTk74+voWua3AwEAcHBzyPkRskUj4gpAP+/btYfToYTZ/YY61SUi4RVBQUJFW6Dzk6OiI\nv78/t26JEb4g2LW1a1exf/8eDh7cJ3cowr/cunWLwMBAo7UXFBTE7dsJRmvP0oiELwj5kJmZAcCD\nBw9kjkR4SJIkEhJu5c29G0NQUJAY4QuCvbubcheAe/fuyhyJ8FBKSgparcaoCT84OJjU1Pt5H/C2\nRiR8QXgOvV7PvXspACQmJcocjfBQfHzukkxjrNB56OHSzJs3bfPErUj4gvAcd+4kY9AbAGz66761\nebhevmTJkkZr8//X4l83WpuWRCR8QXiOmzdzE0tWsSxS7t5Fq9XKHJEAcP36VZycnPD39zdam8HB\nwTg4ONjsaiyR8AXhOa5evQKALliHJElcv26bycDaXLlymdDQUBwcjJfGVCoVJUuWtNkiaiLhC8Jz\n/PXXRXCFLP8sAJsvoWsNJEni8uW/KV26tNHbDg0N5e+//zJ6u5ZAJHxBeI7TZ/5E56VD76YHZ4iN\nPSt3SHYvMfE2Dx6kUr58eaO3XaFCBZKTk7h//57R25abSPiC8Ax37iSTePs2Wb5ZoACdj44TJ4/J\nHZbdO3/+HJCbnI3t4YdIbOw5o7ctN5HwBeEZYmIOA/8/nZNVLIukxMS8Ko2CPM6c+RMXFxfKlClj\n9LYrVKiAo6MjZ878afS25SYSviA8w4EDe8EV9J56AHSBun/uFyUW5HTy5HEqV66MUqk0etvOzs5U\nqFCBU6dOGL1tuYmELwhPkZmZwZGYQ6gD1fBPbS6DmwG9t57oP3bKG5wdu3v3LteuXaVmzZom66Nm\nzZpcunSBtLQ0k/UhB5HwBeEp/vhjNznZOWhLPLruXhOs4cL5WDGtI5MjRw4AULt2bZP1UatWLQwG\nA0ePHjZZH3IQCV8QnmLDxt8xeBjI8cl55H5tSS0oYNOm9TJFZt8OHNiHv7+/SZZkPlSxYkW8vLxs\nbupOJHxBeIK//77E+dhzZIZk5k3nPGRwMaAL1LFh4+/odDp5ArRTmZkZxMQc4aWXXjJKDfynUSqV\nvPTSSxw6tN+mXmOR8AXhCVatWg6OoC315DIK6tJq0tPS2Llzq5kjs28HDuwjOzuLxo0bm7yvhg0b\nolarOXLkoMn7MheTJvyrV6/SuXPnvH916tRhyZIlpuxSEIosMTGRHTu3og5RI6mkJx6TXSwbvbee\npb8uQa/XmzlC+7Vt22YCAwOpVKmSyfuqUaMGvr6+bNu2xeR9mYtJE365cuVYv34969evJyoqCldX\nV1q3bm3KLgWhyH79dQkGyYC6rPrpBykgo1wGt+LjiY4WK3bMITHxNsePH6Vp06ZGrZ/zNEqlkiZN\nmnDo0P688tjWzmxTOocPH6ZUqVJGLWUqCMaWmJjIxo2/oympweBqyLvfJd4Fl3iXR47VBesweBpY\n9PMCMco3g40b1wHQokULs/XZsmVL9Ho9mzdvNFufpuRoro42b95Mhw4dnnmMUqnAx8fNTBEJwuNm\nzfoZvaQns0LmI/c/TPbakH/N6SsgvWI68SfjOHBgN507dzFnqHYlKyuLTZvWUadOHaPuYfs8ISEh\nVKtWjQ0bohgwoB+OjmZLmSZhluizsrKIjo7m008/feZxer1EauozvkYLggldv36Ndet+R11a/cjo\n/ll0QTr0Pnq+mf0NDRo0xdnZ2cRR2qdt2zaTkpLCRx99ZPa+27dvz5dffsmmTVtp1qyl2fvPj4AA\nz3wdZ5YpnX379lGtWjWjblQgCMb2ww/fITlKj43un0kBaZXSuJt8h6io1aYLzo5JksSKFUspVaoU\ntWrVMnv/9erVIygoiBUrliJJTz6Jby3MkvA3b95M+/btzdGVIBTK6dOnOHhwPxllM5CcCvamzvbP\nJisgiyW/LLS5S/EtwZEjh7hy5TKdO3cu8Np7SZK4d+8e8fHxbN++vVAJW6lU0qlTJ2Jjz/HnnycL\n/HhLYvKEr1arOXToEG3atDF1V4JQKJIkMWfuN+DKs1fmPEN65XQyMzL59dfFRo7OvkmSRGTkz/j7\n+xMWFlbgx2/fvp3bt2/z4MEDFixYwPbt2wsVR/PmzfH29iYy8udCPd5S5HsO/9q1ayxatIiEhARy\ncv7/UvPIyMhnPs7NzY2YmJjCRygIJrZnz24uXjhPWo00KGTxRb2XHk1JDb+tXkG3bm8QHBxs3CDt\n1KlTJzh79jR9+/ZFpVIV+PHHjx9/7HZERESB23F2dqZTp04sXbqUc+fOUr16jQK3YQnynfAHDx5M\njx49eP31182yBlYQzCEnJ4cf58/F4Gl4dAVOIWRWysQ10ZVFi35k7NhJxgnQjkmSxKJF8/Hz8yv0\nUsysrKxn3i6I8PBw1q1bx+LFC5g1a06h25FTvjO3o6Mjb731FjVr1qR69ep5/wTBmm3btolb8fGk\nVUp7rGZOQRlcDahD1Wzbtpnr168ZJ0A7duLEMU6fPkXXrl0tYvWTq6srnTt3JibmMOfOnZE7nEJ5\nbsJPTU0lNTWV5s2bs2zZMpKTk/PuS01NNUeMgmASWVlZ/PTzfHJ8c8gKLPzI798yy2ciOUosWvSj\nUdqzV5IksXDhPPz9/WnVqpXc4eRp27Yt3t7eLFz4g9yhFMpzp3S6deuGQqHIO7u9aNGivN8pFAp2\n795tuugEwYS2bNnA3eQ7ZNTPKPLo/iHJSSIzNJM//tjN1auXKVfO+Huu2oPDhw8SG3uO/v374+Tk\nJHc4eVxcXOjWrRuLFy/m5Mnj1KlTT+6QCuS5CT86OhoAnU732NcqWyobKtiXnJwcIpcuJscnJ2+/\nWmNRl1XjfsOdyMjFTJo0zaht24Pc0f0PBAUFmbWMQn61adOGDRs2sHDhD8yb95NJyzQbW77n8Hv0\n6JGv+wTBGkRH7yI5KYmM8sYb3T8kOUlklsokOnont28nGLdxO7Bv3x7+/vsSr732mkWWMnBycuLV\nV1/l7NnTHD16RO5wCuS5Cf/OnTucO3cOrVbL+fPniY2NJTY2lpiYGDQajTliFASjkiSJFSuXYvA0\nGG3u/r80ZTQYMLB69QqTtG+rDAYDP/88nxIlSvDKK6/IHc5TtWjRgoCAABYtmm9VV98+9+PzwIED\nREVFkZiYyIwZM/Lud3d3Z+jQoSYNThBMITb2LH//dYmMasYf3T9kcDWgDdKycdM6+vYdgJubKAqY\nH/v37+XKlcsMHjwYpbKQF0WYgUqlolu3bsyfP59jx2J46aUGcoeUL89N+F27dqVr165s376d8PBw\nc8QkCCb1++9rQAW6kqY9B6UprcHliAu7dm2nU6euJu3LFuReVbuI4OBgs+xoVVTNmzdnzZo1/PLL\nIttJ+A8lJCSwePGjl417eHhQvXp1qlSpYvTABMEU0tLSiI7eibq4GsnRtF/Fs32zMXgZWL8hSiT8\nfDh16gSXLl2kf//+Fj26f0ilUtGpUycWL15MbOw5qlWz/OuS8n3S9ty5c6xcuZKkpCSSkpJYuXIl\n+/fvZ9y4cSxcuNCUMQqC0ezevYPs7Oyn7lVrVArILJnJpYsXuHr1sun7s3KrVi3D29ubZs2ayR1K\nvrVs2RI3N3dWrVomdyj5ku+En5iYSFRUFKNGjWLUqFFERUVx7949li1bxu+//27KGAXBaDZv2YDB\ny0COV87zDzYCbQktOMDWrZvN0p+1SkxM5PDhg7Rq1cqi1t0/j6urKy1aNGfv3mir2AYx3wk/JSXl\nkRdCpVJx9+5dXFxcrOoFEuzXzZtxXLxwHnUJtclO1v6X5Cyh89exbcdmsQ3iM2zZsgFJkizqqtr8\nat26NXq9nm3bLP9DPd9z+B07duT111+nZcvcHV+io6Pp0KEDarWa8uXLmyxAQTCWHTu2Av+Mus1I\nW1LL/VP3OHXqBPXqvWTWvq2BJEns2rWDqlWrmnX7QmMJCQmhYsWK7N69g7feekfucJ4p3yP8//3v\nf0yePBlPT088PT2ZPHkyAwcOxM3NjVmzZpkyRkEoMkmS2LptE9nFsjG45G/7QmPRBepA9f8fOMKj\nrl+/RlzcdRo1aiR3KIXWsGFDLl26aPEX2hWoznG1atWIiIigdevWFCtWjIQEy/7jBOGh2NhzJN6+\njaaEDBcLKkETpCH6j53odOb9dmENjh8/CkCdOnWM3rZarcbNzY133nkHNzc31GrT7Jn9MPYTJ46a\npH1jyfeUztKlS5k7dy7+/v6P1MPfuHGjSQITBGPavn0LKEEXLE/9J20JLdp4Lfv376VVK3E9y7+d\nPn2KwMBAk0znZGZm0r17d8aOHQvAtm3bjN4H5E7reHt78+efp+jQoYtJ+jCGfCf8yMhItm3bhq+v\nrynjEQSj0+l07Ni5BW2gFkklz2Xw2cWykdwktmzdKBL+f1y9epmyZcuapG13d3fWrFkDwJo1awgK\nCjJJPwqFgjJlynD16hWTtG8s+Z7SCQ4OxtPT05SxCIJJ7N+/h8yMTDQhMtZ+UoC6hJpjR2NISkqU\nLw4LYzAYuHUrnhIlSpik/YfTOJGRkXnTO6YSEhLCzZtxJmvfGPI9wi9VqhS9evWiWbNmjyzDfO+9\n90wSmCAYy/oNUUhuEtn+2bLGoQnR4H7ZnU2b1tOnT39ZY7EUGRkZ6PV6fHx85A6lyLy8vNBo1GRl\nZVnsUvV8j/BLlChB48aNyc7OJjMzM++fIFiyuLjrnDp5gsyQTLOtvX8ag5uBrIAs1m1YS06OeS78\nsnQPT2JbaoIsCBcXFwC0Wss9MZ/vEf7AgQMB0Gg0uLq6miwgQTCmqKjV4ACaUpZRylsdqub+iXvs\n37+H5s2t7yIjY3N0VAHYxAfgw7/Bkj+88j3CP3XqFO3ataNt27YAXLx4kUmTJpkqLkEosoyMDDZu\nWo+muAbJ2TJqlmcFZiG5S1ZTe8XUPDw8UCgUpKenyx1KkaWlpaFSOdlGwp8+fTqLFi3Km2t74YUX\nOH78uMkCE4Si2rDhd3RaLZoyRRzdS+CgdUCZocTlhgsU5bNDARmhGZw7d5bY2HNFi8sGqFQq/P0D\nSEpKkjuUIktKSqJ48eKPLFu3NAWKrHjx4o8+2IL/MMG+ZWdns3LVr2QXyybHu2jTBa5xrjiqHVFm\nKfGK9cI1rmhTmtpSWnCCFSsii9SOrShfvgJXr16VO4wiu3LlisVvWp/vjF28eHFOnjyJQqEgOzub\nRYsWiRo6gsXatWs791JSyCxb9IUFTslOz7xdUJKjRGZIJnv3/kF8/M0itWULatSoxc2bN3nw4IHc\noRTanTt3uHPnDjVr1pI7lGfKd8KfNGkSy5YtIykpiVdeeYULFy4wYcIEU8YmCIViMBhY+utiDF65\nq2KKSqFXPPN2YWjKapAcJJYvF6P8Bg1yd7ey5iniY8eOAdCggWXXA8r3Kh0/Pz9RJE2wCocO7Sfu\nxg3Sa6XLvhTzaQzOBjQlNGzespH33++Pv7+/3CHJplKlyhQvXoIDBw7kVeO1NgcOHKBs2XKEhpaR\nO5Rnem7C/+yzz1Aonv6uGTdunFEDEoSikCSJyKWLkdwkdMXlqZuTX+pyalzjXVm9egUDBnwsdziy\nUSgUtG/fiZ9++pHbt28/dq6wKP67YsYUK2hu3LjBpUuXGDjwE6O3bWzPndKpXr061apVe+o/QbAk\nZ86c5nzsOTLKZBRwSYL56d31aIO0RP3+G5mZGXKHI6sOHTqjVCrZsmWLUdutV6/eM28bw+bNm1Gp\nnGjbtoPR2za2547wu3bN3+bLn332GePHjy9yQIJQFMuX/wLOyFs3pwDU5dS4HHJhw4Z1vPlmT7nD\nkY2/fwDh4e3YtWs7r776qtFKLYSHh7Np0ybUajVvvPEGbdq0MUq7D929e5e9e/fSqVNXvL0tvzyE\n0cZAJ0+eNFZTglAocXE3OHjoAJmlMgtwdkpeOT45ZBfLZtVvy2ziatOi6NmzNzk5OURFRRmtTYVC\ngZ+fHyEhIYSHhz9zerowVq9eDWDxO109ZOFfem1HRkYGq1Yt4/DhA3KHYrNWr14JCgl1adNscmEq\nmWUyuXvnDnv3RssdiqxCQ0vTrl1Htm/fTmKi5VcUjY+PJzo6mi5duhMcbLzzDqYkEr6Z7Nq1nTlz\nvmH48E8wGMy7xZ49SE9PZ8vWDRZVRiG/8sot/LZc7lBk16dPfxwdHVm6dKncoTzXkiVLcHV15d13\n+8gdSr4ZLeFL0pPfZGlpaQwaNIiIiAjatm3LqVOnjNWlVblx43rez8nJ1n8ZuaXZtm0zOq2u6GUU\n5PBPuYXzsef466+Lckcjq4CAQHr27M2RI0c4e/as3OE81fHjxzl16hTvvfeBVW0KZbSE/847T57D\nmjZtGk2aNGHbtm2sX7/ebq/O/fcb+dIl+35TG5skSayN+o0c35wil1GQizZEC0r4/fe1cociuzff\n7EmJEiVZuHAh2dny7mHwJDqdjkWLFhEaWoZXX31D7nAK5Lmntj788MNn/v7HH38EoFu3bo/9Lj09\nnWPHjvH5558DuWtgLbmSnKnodDouXIilTZs2/PHHH5w5c4qmTZvLHZbNOHPmT+JvxqGuYV1z9/8m\nqSQ0wRp27NzCxx9/gpubu9whycbZ2YUhQ0YwfPhgNmzYwKuvvip3SI9Yu3YtycnJfPfdj6hUKrnD\nKZDnJvz333+/0I3Hx8fj5+fH6NGjuXjxItWqVWPs2LEm3WbMEp06dYKsrCzq1atHYmIihw8f5OOP\nh8odls3YuHEdqEBb3HI3nsgPTagG11uuREfvokOHznKHI6uGDRvTtGkL1qxZQ+PGjQkODpY7JADi\n4uJYt24d4eHtqFPH+Gv6Te25Cf+ll14qdOM5OTmcP3+e8ePHU6tWLaZOncqCBQv45JMnX5GmVCrw\n8bG9D4N9+3bj5uZGjRo1uHPnDgsXLiQxMY4XXnhB7tCsnlqdyR97dqEJ1ljNUsynyfHJweBhYNv2\njfTs+abc4chu4sQJdOzYgfnz5zNhwgSjL6ksKIPBwI8//oinpydjx46xylyV77fI9evX+frrr7l8\n+TI63f9fsr579+6nPiY4OJjg4GBq1cqtIBcREcGCBQueerxeL5Gaar1fy58kPT2dHTu2ExYWhpOT\nE40bN2bJkiUsW7aCTz8dKXd4Vm/bti3otDq0Ja17dA/kbXT+56k/OX/+b0qUKCl3RLJycvLgww8H\nMmvW5+zdu5dmzZrJGs+OHTu4dOkSY8dOwsHBxaJyVUCAZ76Oy/dJ29GjR/Pmm2+iVCqJjIykS5cu\ndOrU6TlBBBAcHJxX6/rw4cN2d9J23bq1aLVaIiIiAPD09KRx48Zs3bqRBw9SZY7O+u3YuTV3g3Jf\nyzu5VxgPP7h2794hcySWoXPnblSvXpMlS5bIWj45JSWFZcuWUbdufSIi2ssWR1HlO+HrdDoaNmwI\nQMmSJfn444/Zu3fvcx83fvx4hg0bRseOHblw4cJzTwLbErU6k5Urf6V27dqULVs27/7OnTuj0+lY\nseJXGaOzfmlpDzh+/CjqYLXFVsUsKIOrgRzfHHbu2iZ3KBbBwcGBESPGotFoWLJkiWxxLFq0iJyc\nHEaMGCv71FJR5DvhOzk5YTAYKF26NL/++is7d+4kM/P5m0tUqVKFqKgoNm7cyLx58/D29i5SwNZk\nxYpfefAglR49ejxyf2hoKI0bN2b16hXcuZMsU3TW7+DB/Rj0BnTBpq2KqchW4ObmxjvvvIObmxuK\nbNO+4TVBGq5eucKtW/Em7cdalCtXnp49e7Nv3z7+/PNPs/cfExNDTEwM77/fj5IlQ8zevzHlO+GP\nGTMGjUbDuHHjiI2NZf369XzxxRemjM2qJSYmsnx5JI0aNaJixYqP/f6tt95Cr9fzww9zZIjONhw8\nuB9cMfnae0WOgu7duzN27Fi6d++OIse0CT8rKHfTFlGG4//16vUepUqFsmDBgkfOIZqaWq3+Z3e/\nCvToYf3F7fKd8GvWrIm7uzseHh6MHTuWuXPnUrt2bVPGZtXmzJmFJEn06tXrib8PCgqiU6dO7Nix\nldOn7fPq46LQ6/UcPXYYTTGNyadzJEeJNWvWMG3aNNasWYPkaNrSDXp3PZK7REzMYZP2Y02cnZ0Z\nPnwMSUlJrFmzxmz9rlixgnv37jFixDgcHa18GRgFSPhnz56lY8eOdOrUKe/fuXPnTBmb1Tp06AB7\n9/7Ba6+9RmBg4FOP6969OwEBAXz11XSLvKLQkl29egV1ppqsYkXfwvB5JJWEWq0mMjIStVqNpDJ9\nrR6tn5Y/T58UdZf+pU6dekREtGf9+vXExcWZvL8rV66wbds2unR5lWrVqpu8P3Mo0JTOxIkTiY6O\nJjo6mgkTJjB69GhTxmaV1Go1s2Z9TqlSpejYsWPe/Xv27GHPnj2PHOvs7MwHH3zA9evXWLbsFzNH\nat0uXjwP5K5dt0XZPtlo1Bqxyfl/DBw4BHd3dxYuXPjU+l3GoNfrWbBgAT4+vvTr9z+T9WNu+U74\nSqXykd1i6tWrZxNfcYxtwYJ5JCcn8eGHHz5y2fXDD8r/qlu3Lo0aNeKXXxY9UmBNeLbr16+BEvRu\nerlDMYkcz9wPshs3rskciWXx8fFhwIBBnD9/Pl+rBAtr165dXL58mY8/HoKnZ/7WuFuDfCf8+vXr\nM2HCBGJiYjh69CiTJk3ipZdj4qfwAAAgAElEQVReIjY2ltjYWFPGaDXOnTvD2rWrCA8PL9BVtH36\n9MHZ2ZnPP/9MfIXPp+TkJCRXyWaWY/6X3jX3gywpyfLrwptb+/adqFq1OkuXLs3XSsGCSktLY/ny\n5bz4Yl1atQo3evtyynfCv3jxIteuXWPu3LnMmTOHK1eucP78eT7//HOxWofc6xRmzJhCsWLF6Nmz\nYGfzfXx86N27N2fPnmbt2t9MFKFtyczMRO9om6N7IO/EsFptOVdzWgoHBweGDh3BgwcP+O03479f\nVqxYgVqtYciQEVa95v5J8j0nYw0bEshp0aL53LhxnXHjxuHq6lrgxzdr1oyDBw8yf/5cGjZsTEhI\nKRNEaTscHZUoJNt6M/7bw79NqVTKHIlleuGFqnTo0JktWzbSunVrQkKMsz7+2rVr7Ny5k+7de1Cu\nnO1VBcj3CP/u3buMGTOGvn37AnD58uW8/Rzt3enTp1ixYimtWrXixRdfLFQbCoWCAQMGoFQqmTp1\ngt3vb/o8Pj6+KLNsNxk66HLfmj4+1rO5hrn16/c/XFxcjXYFriRJLF68GC8vb9577wOjtGlp8p3w\nR40aRVhYGMnJuVeGlilThsjISJMFZi3S0h4wefI4goKC6N27d5HaKlasGB988AHnzp1lyZKfjBOg\njSpdugxoQKGzzVG+Y1rul+/SpcvIG4gF8/X1pXfvvpw6dcooV+AePXqU2NhY+vb9EC8vLyNEaHny\nnfDv379Pu3btcHDIfYijo2Pez/bKYDDw2WcTuXcvhSFDhhRqKue/mjRpQvPmzfnll0XiwptnqF27\nLgBOd21zQx2nu044uzhTuXIVuUOxaK+++jolSpQkMjISvb7w53RycnJYunQppUuXoWPHLkaM0LLk\nO2O7ublx//79vJMYf/75p00tVyqMRYvmc/jwAXr37k2FChWM1u4HH3xAaGgokyaN4eZN019gYo2q\nVKlKYFAQrvFF/5C1OHpwTXTllSbNrW5HJXNzcnKif///cePGDfbv31/odnbv3s3t27cZMGCQTS83\nL9CUzoABA4iLi6NHjx6MHDmScePGmTI2i7Zly0Z++WURLVu2zCt9bCzOzs6MHJlbK3/YsEHcv3/f\nqO3bAgcHB7p1fQ2nFCcc79vWG9T1hitkQ7dur8kdilVo3rwVlSu/wKpVqwp1xbpOp2P16tXUqFGL\nxo2bmCBCy5HvhB8XF8dPP/3EypUrCQsLo3Tp0kX6CmXNDhzYx+efT6VmzZr069fPJEu3goKCGDVq\nFHfuJDN8+CDUauOvN7Z23bq9jpePN14XvcCE1Q4kpfTM28bkoHXA86on9V96mRo1apmsH1vi4OBA\n374DSE5OfuLFjS1atKBFixZPffz27du5f/8+/fv/z+aWYf5XvhP+vHnz8PDw4MGDB8TExPDWW28x\nadIkE4ZmmY4di2H8+FGULVuGESNGmPTr3wsvvMDQoUP5669LDB/+CRqNxmR9WSM3NzcGf/wpjvcd\ncb1muqmdrMCsZ942Ggk8z3niKDky5JMRpunDRjVo0Ijq1Wvw+++/PzbKb9as2VN3y9LpdKxfv566\ndetTu3YdM0QqrwKVVgDYu3cvr7/+Os2aNbO7gl/Hjh1h5MghlChRnPHjxxvlJO3z1K9fn8GDB3P2\n7GlGjPhEXIjzH23atKVJk2Z4/uVpsqkdTaiGHLcc9E560qqloQk1zQev6zVXnJOdGfDhx4SGljZJ\nH7ZKoVDw7rt9uXPnDvv27cv343bv3k1qaiq9e/c1YXSWI98JPygoiAkTJrBlyxaaNm1KVlaWXZUB\nOHToACNGDKV48eJMmjTJrCesw8LCGDRoEKdPn+LTTz8mIyPDbH1bOoVCwejREwgOKo7fST8c1CZY\nOaYAg4sBvYcebWmtSco5OCU74XnJkyZNmvH6628ZvwM70KBBIypWrMSGDRvylZv0ej2bNm2ievUa\ndjG6hwIk/G+//ZawsDAWLVqEl5cXqampjBhhH187d+/eyejRnxIaWorJkyfLska3SZMmDBkyhPPn\nzzF48Iekpor9cB/y8vJi1sw5uCrd8DvuZ3Vr8x1THfH505fy5SswfvwUm59HNhWFQkGPHj2Jj4/P\n17r8Y8eOkZSUxJtv9rKb5zzfCd/V1ZU2bdpQpkwZAAIDAwkLCzNVXBZj48Z1TJ48lkqVKjFx4kRZ\nl6I2atSIkSNHcu3aVf73v74kJyfJFoulKV26DDO/mo2zzjk36Zt4G0JjUaYp8TvuR3BAMLNmzsXN\nzU3ukKxaixat8fPzY/v27c89dtu2bQQFBRMW1tQMkVkG+75y6hkkSWLp0iV88cVUatWqxfjx43F3\nd5c7LOrWrcu4ceNITk5iwIA+xMVdlzski1Gr1otMnz4Tpwwn/I5ZftJXpispdqwYfp7FmP3tD/j7\n+8sdktVTqVS0b9+ZkydPkpKS8tTjbt++zdmzZ+nUqatd1SsSCf8JDAYD3333NfPnzyUsLIyRI0fi\n7Owsd1h5qlWrxpQpU9BqNQwY0Jfz58XOYw81bNiYadO+RJWusuikr0xXUuxoMXzdffl+7kKr3xzb\nknTo0BmDwfDMk7d79+5FoVDQrl3Hpx5ji0TC/w+dTsuECaNZvXoF7du3Z/DgwRZ5tWO5cuWYOnUq\nLi7ODBr0IQcOmG4zCGsTFtaU6dO+windMkf6yrR/kr2HH9/P/YlSpULlDsmmlCwZQvXqNZ965a0k\nSRw4cIA6deoREPD0LUhtkUj4/3L37l0GDuzP3r3RvPvuu7z33nsWXS+oRIkSTJ8+nZCQEEaPHsby\n5UtNuu2bNQkLa/rP9I4zfkctJ+kr0/6ZxvEoxry5P4nllybSvHlLbty4we3btx/7XVxcHLdv36ZF\ni9YyRCYvy81mZnb27Gn69u3FtWtXGD58OJ06dbKKM/c+Pj5MmTKFBg0aMG/ebKZMGS8u0PpH48ZN\nmGFBc/p5c/YexZj3vRjZm1KTJs0AOHHixGO/O378OABhYa+YMySLYPcJ32AwsGzZLwwc2A+l0oFp\n06bx8ssvyx1WgTg7OzN06FDefPNNdu3azgcfvMOVK5flDssiNGoUxrRpX6FKV+F73Bdk2mZAmZmb\n7H09/Jj3/U9igxsTK1GiJKVKhT5xeebp06epWLEyxYrZ30lyu074t28nMHjwAH74YQ7169fnyy+/\nzFt2am0cHBzo3r0748ePJzX1Pn37vsPy5Uvttt7Rv4WFvcKkidNRparwOeUDZr5e0EHngN9xPzyd\nPPnu2x9FsjeTunVf4uLFi4+8B7Kzs7l06RJ169aXMTL52GXCz8nJ4bffltOr1+tcuHCeAQMGMGzY\nMDw8POQOrchq1arF119/Te3atZg3bzYffvgely//LXdYsmvRohXDho3G6Y4TnrGeJi229gg9+B73\nxTnHma9nzaVs2XJm6lioUaMmGo2Gmzdv5t139epVcnJy7LYwnd0l/NOn/6Rv3158993XVK1alW+/\n/YZWrVpZxXx9fnl7ezNy5Eg++eQTEhJu8f77PZk9exbp6elyhyarzp270bNnb1xvuuaWIDY1CbzO\neKFMc2TK5M+pUqWa6fsU8jx8vq9evZp338Ofq1SpKktMcrOtQuLPkJBwix9/nEN09C6KFSvGsGHD\naNCggVkSvSRJ3Lt3D7Vazfbt22nTpo3J+1UoFDRp0oTatWuzYsUK1qxZyY4dW+nb90M6duxi05s8\nPEu/fh9x+crfHIk5SLZPNjk+ppvUd41zxeW2C/37f2SXJwjlVrJkCC4uLly/fj3vvhs3buDl5WV3\nyzEfsvkRflpaGt9/P5u33+7OgQP7eP311/nuu+9o2LCh2Ub127dv5/bt2zx48IAFCxbk67JvY/H0\n9KRfv358+eWXhISUZNasz3nnnR4cOLDPLpdwOjg4MGH8FPyLBeB7xhdMdIpDmaHE86InL7/ckLff\nftc0nQjPpFQqKVWqNAkJCXn3JSQkULp0WZv6Rl8QNpvws7KyWLnyV954ozMrV/5KWFgYc+fO5Y03\n3sDFxcWssTxcBva02+ZQrlw5Jk+ezMiRI9Hrsxk1aigff9yfCxdizR6L3Ly8vBk/bgqKDAXuf5ug\nXIYE3me9cXfzYOzYSRZ9LYetCwkpRWJiYt7txMREuz5pbnPf6yVJYu/eaObN+46EhFvUrl2bXr16\nybr6Jisr65m3zUWhUPDSSy9Rp04ddu3axapVv/HBB+/SunU4H374MUFBwbLEJYe6devTvn1nNm9d\njzZEi97DeEN9l3gXHO878snYYfj5FTNau0LBBQYGcfBg7rdZg8HA/fv37er/8/+yqYQfF3edmTM/\n5+TJ44SGhjJ+/Hhq164td1gWx9HRkYiICF555RV+//13Nm3axP79e3nnnfd5881eFllKwhQ+/HAg\n0X/swOOSBw/qPjBOo3rwuuxFlarVCA9vZ5w2hUILCAggKyuLzMzMvD087LlInU1819Tr9SxduoR3\n332TS5cu8MEHHzBz5kyR7J/Dzc2Nt99+m9mzZ1OrVi0WLJhHnz69+Pvvv+QOzSx8fX15+613cU5y\nxjHVOGMf1zhX0MBHAwaJqRwL4OPjC+Sey0tLS3vkPntk9f9HpqWlMXToQObPn0u9evWYPXs2ERER\ndlXytKgCAwMZMWIEo0aN4v79FPr1e5eNG9fJHZZZvPZaD1zd3HC7aoQ69AbwvO5JrVov8uKLdYve\nnlBkXl7eAGRkZOQtS354nz0y+ZROixYtcHd3x8HBAaVSSVRUlNHaTk1NZeDAD4iPv8mAAQNo2bKl\n3Z59N4b69etTqVIlZs+ezRdfTCU1NZVevXrLHZZJubt70LVLd5aviCRDk4HBtfCX4TonOoMG3nrr\nHSNGKBSFu3vuxZQajQadTvfIffbILCP8X375hfXr1xs12UuSxIQJo7h1K55x48bZ3MVTcvH29mbM\nmDGEhYUxf/5cuyi73K3bayhQ4HqzaBdjucW5EVy8OA0bNjZSZEJRubnlvqZarRatVgvk7t5nr6x2\nSufIkYOcPHmc3r17U6NGDbnDsSmOjo4MHDiQ0NBQ5s791ubX6wcHF+ellxrgfsu90CUXlBlKVPdU\ndO70qpi7tyAPNy7KysrKG+Gbe1m2JTHL/5l9+vShW7durFq1ymhtHj9+FCcnJ1q1amW0Nk1FrVbj\n5ubGO++8g5ubG2q1Wu6QnkulUtGmTRvi42/axd65HTt2AQ043XEq1ONdbrng4OBA27YdjByZUBRO\nTrnJXafT5S2HtqTd68zN5HP4K1asICgoiJSUFN577z3KlStH/fpPrlSnVCrw8cnfyTNXV+e8tbWW\nLjMzk+7duzN27Fggd/Nka/CwyqCvr0e+Xxdr1b59OF98ORXtLS1ZgQW8TkIC9wR3GjduTIUKosa9\nJcnJ8frnvzlkZ2cDEBDgbbebxZs84QcFBQFQrFgxWrduzZkzZ56a8PV6idTU/I1+a9Wqx5Ili9m1\naxft2ln2emd3d3fWrFkDwJo1a/KeE0uWlZXFzp07KVu2PCqVe75fF2vWpnVb1q77jfTsdCRV/ud2\nVCkq0ECrVu3s4nmyJhpN7qAlJyeHnJzcuklqtZ6sLNt6nQICPPN1nEmndNRqNRkZGXk/Hzx4kIoV\nKxql7Xr1XqJ+/QYsXbqUixcvGqVNU3k4jRMZGZk3vWPJDAYD8+fPJz4+no8++thuToZHRLQHPTjf\nLthXftd4V1zd3ESBNAv08CLC7OzsvG+s9rxk26QJPyUlhbfeeotOnTrx2muv0bRpU155xThvCoVC\nwYQJUwgKCuazz6Zy8uRJo7Rr77Kzs5kzZw579uyhT5/+NGwYJndIZvPCC1UpFRqK2638fyArchS4\nJLvSpnWEXc8NW6qHVWH1ej05OTk4OjrazQDmSUw6pVOqVCk2bNhgsvZ9ff2YM2c+w4d/wowZM3jj\njTfo2rWrXX+CF0VSUhKzZs3iypUr9O//P3r27C13SGalUCho364TP/44F2WG8pH6OtoQ7RMf43zb\nGXIkcbLWQimVShQKBdnZ2XkJ355Z/foxf/8Avv9+IS1btmHFihVMmjSJpCTbX1ViTJIkER0dzaef\nfkpiYhLTp8+kV6/37HIkFBHRHoVCgcutR5fuaUO0T0z6rrfcCClVimrVxNJgS6RQKHB0VOWdtLWX\nOlFPY/UJH3LnyCdM+IyxYydx/fp1hg4dypYtW8R+rvlw9+5dpk2bxvfff0/lylVYsmQ5r7zSTO6w\nZOPvH0CDBo1wT3j+mvzctfeOdOzQxS4/HK2Fk5OK7OzsfxJ+4Zbd2gqbSPiQ+0netm0HIiN/o2bN\n2ixatIhx48YRFxcnd2gWSa/Xs3nzZgYP/oQLFy7wySfD+O67HylevITcocmuQ4fO+VqT7xKfu/Y+\nPLy9mSITCsPJySkv4dv7eRabSfgPBQcHM2vWHMaPn0JiYhLDhg1j2bJlstWgt0TXr19nzJgx/Pzz\nz9SsWYvIyFV0795DXCH6j0aNmuDp5YVL/DOuyDTkrr1/uUEjuy63aw2cnJzJysoiKytLjPDlDsAU\nFAoF4eHtWL58La1bRxAVFcXQoUOJjZVndycnJ6dn3jaXrKwsli1bxogRI7h7N4WJE6cya9YcSpQo\nKUs8lkqlUhER3h6XZBcUWU+eqnG66wRa6NC+k5mjEwrK2dklL+G7utpvWQWw0YT/kI+PD+PGTeab\nb+YCCiZMmMDChQvRaDRmjaNevXrPvG0Of/31F8OGDSMqKorWrSNYtmw1rVtHiLnnp2jXrgMYwOX2\nkxOEyy0XPDw9aNSoiZkjEwrKxcUFnU6HVqvF2VkkfJtXv34DIiNX8dprb7J9+3Y+/fRTs16sFR4e\nTvHixfH29qZfv36Eh4ebre/s7GyWLVvG2LFjyc7OYdasOYwbNxlvbx+zxWCNKlSoRJkyZXFNeLyy\n4sO1961aRtj9qg9r4OrqilarRafT4epq2Rc9mppdJHzIfdEHD/6UOXPm4+CgZPz48axcudIsK3kU\nCgV+fn6EhIQQHh5utlF1QkICY8eOJSoqirZtO7B06SpefrmhWfq2dg+nBR3vO+KgefRt4pTkBHqJ\nNm0iZIpOKIhHE74Y4duV2rXrsGTJctq0acvq1auZPHkyqampcodldIcPH2bEiBEkJyczbdpXjB49\nwa43fiiMFi1aA4+XWnBJdMGvWDGqV68pR1hCAbm6uqHVatFoNLi5ucsdjqzsLuFD7o4348ZNZuzY\nSVy+fJnhw4fz999/yx2WUeTu77uUmTNnUq5ceRYvXkHTps3lDssqlSwZQtly5XBJ/teoUA/Od51p\n3qylWNVkJdzd3dFoNP8kfDGlY7fatu3Ajz8uxsnJmfHjx3Pw4EG5QyoSjUbDl19+ybp16+jc+VXm\nzl1IcHCw3GFZtbDGTVHdV6HIzp2Gc0pxAj3iZK0VyS1emJvwxRy+natYsRILF0ZSpUo1vv76a5PW\n/jGlBw8eMHHiRE6ePMnQoSMZPny0OKFoBC+/3BCkf0ogk7sc01HlSO3aL8ocmZBf7u4eaLUaDAYD\n7u5iSsfu+fr68s0339OsWUt++eUXli9fblXb+t29e5dx48YRHx/PjBmz6NbtNblDshlVq1ZHpVLh\ndC/32gnn+85Uq1bD7pf3WZN/j+rFHL4A5G57NnnydDp27MLatWv55ZdfrCLpJycnM378eB48eMA3\n33xP48ZiqsGYnJyceKFKVZxSnSAHlGlKatUUo3tr8u9RvYeHfS9csO9aof+hVCoZMWIsTk7OrF27\nCkmS6N27t8VenJScnMyECRPQarXMnv0DL7xQVe6QbFK1qjU4G3saVZoKJKhSRTzP1uTfJ2rt/aSt\nSPj/oVAo+OSTYSgUsGbNKhwdHenZs6fFJf2UlBQmTZqERpOb7CtXfkHukGxWhQoVc1fnJDr/c7uS\nzBEJBfHvaRx7n9IRCf8JFAoFgwcPIycnh3Xr1uLs7Mzrr78ud1h5UlNTmTRpEunp6SLZm0GZMuUA\ncE5yxsnZiaAgsfLJmvx7VO/q+viV0/ZEJPynUCgUDB06Ep1Ox6pVq3B2dqZz585yh0V6ejpTpkzh\n3r17fP31XKpUqSZ3SDYvJKQUAEqNkhJlS4r191ZGnLT9fyLhP4ODgwOjRo1Hp9MSGRmJs7MzERHy\nXU6fmZnJZ599RkLCbb788htq1qwtWyz2xMPDA1c3NzRqNSWKh8gdjlBA/x7Vu7jY9+oqkfCfQ6lU\nMmHCVLKysli4cCFKpZLWrVubPQ61Ws3UqVO5ceMG06fPpH79l80egz3z9/fnZlwcAQEBcociFNC/\nk7y9T+mI76b54OjoyJQpn9OgQSN+/PFHdu3aZdb+NRoNU6dO5fLlK0yePINGjcLM2r8AQYG58/YB\nAYEyRyIU1L8Tvr1fPyFG+Pnk5OTEtGlfMWbMMH744QcMBgNt2rQxeb+ZmZl5yX7KlOmiLo5MhgwZ\nwZkzf9r1fr/W6t9JXq7NhyyFGOEXgLOzM9Onz6RhwzDmz5/Ppk2bTNpfeno6kydP5urVq3z22ec0\na9bSpP0JT1e6dBk6duwi9hGwQv9O8pa2vNrcRMIvoNyk/xVNmzZn8eLFrFmzxiRX5N6/f5/x48cT\nF3eT6dNnipG9IBSSWFX1/8QzUQgqlYrJk2cQEdGeFStWEBkZadSkn5SUxNixY7lz5y6zZn0n5uwF\nQTAKMYdfSI6OjowZMxE3N3eion5DrVbTr18/lEplkdqNj49n8uTJZGdnM3v2D1SrVt1IEQuC/XJ2\ndsbFxb5X6IBI+EXi4ODAkCHD8fDwIDLyZzQaDYMGDcLR8fGntUWLFs9tL3eu/jMcHVXMnbuQ8uUr\nmCJsQbA7q1dvQKEQExoKyYJKQmZn60lNVcsdRqEsW/YLP/wwh5dffpmhQ4c+Mek/y+XLl5kyZQoe\nHp7Mnv1D3tWdgiAIzxMQ4Jmv48RHnpG8/fa7DB48jJiYGL755psCbY5+9epVpkyZgpeXN99/v1Ak\ne0EQTEIkfCN67bUeDBo0lCNHjvDDDz/k60RuQkICn332GR4ensyZM5/g4OJmiFQQBHsk5vCN7PXX\n3yI9PZ3FixcSGBj4zCqb6enpTJ06FQcHJd9+O08ke0EQTEokfBN4//1+3L6dwKpVqyhbtiz169d/\n7Bi9Xs/XX3/NvXv3mDNnAaVKhcoQqSAI9kRM6ZiAQqFg+PAxVKxYme+//5779+8/dszGjRs5c+YM\nQ4aMoHr1GjJEKQiCvREJ30Ry98idhlar4+eff37kd4mJiaxcuZJXXmlGx45dZIpQEAR7IxK+CYWG\nlqFnz3c5dOgQf/31V979y5cvR6lUMmTICLuv7SEIgvmYJeHr9Xq6dOlC//79zdGdRXnzzV54eXkT\nFRUFwO3btzl06BDdu/cQpXYFQTArsyT8yMhIypcvb46uLI6bmxudO3fjxIkTpKSksGvXLhwcHOje\nvYfcoQmCYGdMnvATExPZs2cP3bt3N3VXFqtt2/YYDAZiYmI4fPgw9eu/jL+/v9xhCYJgZ0ye8KdP\nn87w4cPtukRpaGgZSpYMYefOnSQlJdGwoah+KQiC+Zl0Hf4ff/yBn58f1atXJyYm5rnHK5UKfHzc\nnnucNapXrx7r168DoHHjBjb7dwqCYLlMmvBPnjxJdHQ0+/btQ6fTkZGRwbBhw5g5c+YTj9frJast\nnvY8lSpVBdbh5uZGsWLFbfbvFATB/PJbPM1s1TJjYmL4+eefmT9//lOPseZqmc9jMBiIj4/D09Mb\nX19fucMRBMGG5Dfhi9IKZuLg4EBoaBm5wxAEwY6JeviCIAhWTtTDFwRBEB4hEr4gCIKdEAlfEATB\nToiELwiCYCdEwhcEQbATIuELgiDYCYtalikIgiCYjhjhC4Ig2AmR8AVBEOyESPiCIAh2QiR8QRAE\nOyESviAIgp0QCV8QBMFOiIRvQlFRUSQlJckdhlAEs2fP5tChQwV+XExMDP379zdBRPYpKSmJQYMG\nFfhxY8eO5fLly888ZsWKFaxbt66woVkVsQ7fhHr16sWIESOoUaOG3KEIzyBJEpIkGXXf5fxs+PNv\nOTk5ODqK7SkKSjxvBSOeqQJSq9V88sknJCYmYjAY+OijjwgNDeXzzz9HrVbj6+vLjBkzOHnyJOfO\nnWPYsGG4uLiwatUqTp06xRdffIFer6d69epMnjwZJycnZs6cSXR0NEqlkrCwMEaOHEl0dDQ//PAD\n2dnZ+Pj4MHPmTPz9/eX+8y3azJkzKV68OG+//TYAc+bMwc3NDUmS2Lp1K1lZWbRu3ZpBgwYRHx9P\nnz59qFWrFrGxsSxYsIA5c+Zw7tw5FAoFr776Kr1792bUqFE0a9aMiIgIzpw5w/Tp01Gr1Tg5ObFk\nyRJUKhWTJk3i3LlzKJVKRo0aRYMGDR6JKzU1lTFjxnDz5k1cXV2ZMmUKL7zwAnPmzCEuLo6bN29S\nokQJvv76azmeNovztNfx999/Z9OmTURFRbFjxw7UajUGg4HIyEimTJnCkSNHKF68OI6Ojrz66qtE\nREQ8Muh68cUXeeedd/jjjz9wcXFh3rx5+Pv757Xfp08fbty4wcSJE7l37x5KpZLZs2dTrFgxPvro\nI9LS0sjJyWHw4MG0atVK5mepkCShQLZt2yaNHTs273ZaWpr0xhtvSCkpKZIkSdLmzZulUaNGSZIk\nST179pTOnDkjSZIkabVa6ZVXXpGuXr0qSZIkDR8+XFq8eLF07949qU2bNpLBYJAkSZIePHggSZIk\npaam5t3322+/STNmzDDPH2jFYmNjpbfffjvvdtu2baWoqChp3LhxksFgkPR6vdSvXz/p6NGj0s2b\nN6XKlStLp06dkiRJks6ePSv17t0777EPX4eRI0dKW7dulXQ6ndSiRQvp9OnTkiRJUnp6upSdnS0t\nWrQo7/W+fPmy1LRpU0mr1UpHjhyR+vXrJ0mSJE2ZMkWaM2eOJEmSdOjQIalTp06SJEnSd999J3Xt\n2lXSaDQmfmasy5Nexyxqu4gAAAdWSURBVGPHjknt27eXJEmS1q5dKzVp0kS6f/++JEmStHXrVqlv\n376SXq+XkpOTpXr16klbt26VJOnR92ClSpWk3bt3S5IkSV988YX0/fffS5KU+zr89NNPkiRJUvfu\n3aUdO3ZIkpT7nlWr1VJ2draUnp4uSZIkpaSkSK1atcp7b1obMcIvoEqVKvHFF1/w1Vdf0bx5c7y8\nvPjrr7947733gNy9awMCAh573LVr1wgJCaFs2bIAdO3alWXLltGzZ0+cnZ0ZM2YMzZs3p1mzZgAk\nJiYyZMgQ7ty5Q1ZWFiEhIWb7G61V1apVSUlJISkpifv37+e9NgcPHqRLly5A7je069evU7x4cUqU\nKEHt2rUBKFWqFDdv3uSzzz6jadOmhIWFPdL2tWvXCAgIoGbNmgB4eHgAcOLECXr27AlA+fLlKVGi\nBNeuXXvksSdOnGDOnDkANGzYkNTUVDIyMgBo0aIFLi4uJnpGrNOTXsfg4OBHjmncuDE+Pj5A7vMb\nERGBg4MDAQEBvPzyy09sV6VS0bx5cwCqV6/OwYMHH/l9RkYGSUlJtG7dGgBnZ2cAsrOz+frrrzl2\n7BgODg4kJSVx9+7dJ77PLZ1I+AVUtmxZoqKi2Lt3L99++y0NGjSgYsWKrFq1qlDtOTo6smbNGg4f\nPsy2bdv49ddfiYyMZOrUqfTu3ZuWLVsSExPD3LlzjfyX2KaIiAi2b9/O3bt3adeuHQkJCfTr148e\nPXo8clx8fDxubm55t729vVm/fj0HDhxg5cqVbN26lRkzZpg8XldXV5P3YY3++zr+V2GeN5VKhUKh\nAHL3mNbr9fl63MaNG7l37x5RUVGoVCpatGiBTqcrcP+WQKzSKaCkpCRcXV3p3Lkzffr04fTp09y7\nd49Tp04BuaOBv//+GwB3d3cyMzOB3A+KW7ducePGDQDWr19P/fr1yczMJD09naZNmzJmzBguXboE\nQHp6OkFBQQB2s4LAGNq1a8eWLVvYvn07ERERhIWFsXbt2rzXISkpiZSUlMced+/ePSRJIjw8nE8+\n+YTz588/8vuyZcty584dzpw5A+SOBnNycqhXrx4bN24Ecr8F3L59m3Llyj3y2Hr16rFhwwYg92Su\nr69v3jcE4cn++zo+S506ddixYwcGg4G7d+9y9OjRQvXp4eFBcHAwu3btAiArKwuNRkN6ejrFihVD\npVJx5MgRbt26Vaj2LYEY4RfQX3/9xZdffomDgwOOjo5MmjQJR0dHpk6dSnp6Onq9nnfffZeKFSvS\ntWtXJk6cmHfSdsaMGQwePDjvpO2bb75JamoqH330Ud6IYdSoUQAMHDiQwYMH4+3tzcsvv0x8fLyc\nf7bVqFixIpmZmQQGBub9u3LlSt4I383Nja+++uqxFTnJycmMHj0ag8EAwNChQx/5vZOTE9988w1T\np05Fq9Xi4uLC4sWLeeutt5g0aRIdO3ZEqVQyY8YMnJycHnnswIEDGTNmDB07dsTV1ZXPP//chM+A\nbfjv6/is///Dw8M5fPgw7dq1o3jx4lStWhVPz/xt6v1fX375JRMmTGD27NmoVCpmz55Nx44dGTBg\nAB07dqR69eqPfaBbE7EsUxAEq5eZmYm7uzv379/ntddeY8WKFVY5x25qYoQvCILV+/DDD0lLSyM7\nO5uPPvpIJPunECN8QRAEOyFO2gqCINgJkfAFQRDshEj4giAIdkIkfEEogg8++IC0tDS5wxCEfBEn\nbQVBEOyEWJYp2LwnVTidOXMmERER7N+/H2dnZ2bNmkXp0qW5d+8eEydOJCEhAYAxY8ZQt25dMjMz\nmTp1KufOnQNyL6YKDw+nRYsWrFmzBj8/P9avX8/SpUvJzs6mVq1aTJw4Ecityf7fKpyCIAeR8AWb\nt3//fgIDA1mwYAGQW7Zi5syZeHp6snHjRtatW8f06dOZP38+06ZN491336VevXokJCTQp08ftm7d\nyrx58/Dw8Mgro/DgwYNH+rhy5Qpbt25lxYoVeSWTN27cSIUK/9fe/aoqDMZhHP8iOGwGb+HcgLCi\nCGIRRIvgZQgGu+G9ALtZLGaZWBXcDSgm48KawYHFedIZZ+r5kxT2Pp+4MQYLDy+/9+XZB2EYslgs\nADT+kbdS4Evm3Tecuq4LQKfTAaDdbidFadvtNvWHpPP5TBRF+L6f6qsvFoupd/i+z263o9frAXC5\nXCiVSjQajV9bOEVeSYEvmfes4fQncRwzn8+Tatz/ut1udLtdhsPhw713tHCKPKNTOpJ59w2nX02Y\ny+USAM/zKJfLANRqNabTafLs4XAAoFqtMpvNkuv3I51KpcJqtUqaOE+nE0EQ/NnCKfJKOqUjmbfZ\nbB4aTgeDAa1Wi/V6jeM4jMfjZNPWGMPxeOR6veK6LsYYoijCGMN+vyeXy9Hv92k2m6lNW8/zmEwm\nxHFMPp9nNBpRKBQeWjjr9fqbv4jYSoEvVvoe1CK20EhHRMQSWuGLiFhCK3wREUso8EVELKHAFxGx\nhAJfRMQSCnwREUso8EVELPEJWGtGliCe2rYAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zfZNZE1yndOJ",
"colab_type": "text"
},
"source": [
"Seaborn also comes with \"contexts\" which are predefined parameters refering to a certain potential use of the plot. These are paper, notebook, talk, and poster."
]
},
{
"cell_type": "code",
"metadata": {
"id": "jX-JOaPsn8OU",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 310
},
"outputId": "87da552c-a1cc-4b60-ecb9-fa395edbbb60"
},
"source": [
"sns.set_context(\"paper\")\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=my_pal)\n",
"ax.set_title(\"Paper context\")"
],
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Paper context')"
]
},
"metadata": {
"tags": []
},
"execution_count": 21
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nQmCC\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "y5rGtcHfoWQe",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 338
},
"outputId": "bb27e568-318a-461d-8b1c-9902e510690d"
},
"source": [
"sns.set_context(\"talk\")\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=my_pal)\n",
"ax.set_title(\"Talk context\")"
],
"execution_count": 22,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Talk context')"
]
},
"metadata": {
"tags": []
},
"execution_count": 22
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZMAAAEwCAYAAABylJwhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd8U1UbwPFf0r0LLbRsZAqy90ZZ\nshRlCCIbwYEIvAUtr8oScWBFARWtouy9obIpq1BmARFqLRtaCpTONGmT3PePmEDflpE26U2a8/18\n/NjeJOc+LW2f3HvOeR6FJEkSgiAIglAISrkDEARBEOyfSCaCIAhCoYlkIgiCIBSaSCaCIAhCoYlk\nIgiCIBSaSCaCIAhCoYlkIjiMzMxMatasyYwZMx57TBAE8znLHYAgPKxmzZpP/dw9e/ZQvnx5K0Zj\nHyIiIrh27Rpvv/12kZ0zPDyc4OBgXnrppSI7p2DbRDIRbMpXX32V6/OTJ0+yatUq+vfvT+PGjXM9\nVrJkyaIMzWZt376dgwcPFmky+eWXX2jQoIFIJoKJSCaCTenVq1euz3U6HatWraJBgwZ5HhMEwXaI\nORPBrmVnZzN//nwGDBhAy5YtqVOnDh06dGDmzJmkp6cXeNxTp07RvHlzevXqRVJS0hOff+bMGcaM\nGWOK4YUXXmDSpEkkJCSYniNJEsuWLePll1+mXr16NGnShFGjRnH27NlcYz08jxMdHc2AAQOoX78+\nLVq0YNq0aajVatNze/fuzY4dO1CpVNSsWdP03/bt203PuXXrFh9//DHt2rWjTp06tGvXjunTp5OS\nkmJ6TkpKCu3bt6dDhw6kpaXlimfmzJnUrFmTiIgIU2wpKSlERkbmOmdycrLZ32eh+BBXJoJdy8jI\nYMmSJXTp0oUXX3wRNzc3YmJiWL58OTExMaxatQonJyezxty9ezchISE0aNCA77//Hm9v78c+/48/\n/mDixIn4+vrSp08fKlasSFJSEpGRkVy5coUyZcoAMGPGDJYvX06jRo0ICQkhLS2NFStWMHDgQH79\n9VeaN2+ea9yYmBi2bdtGv3796NWrF1FRUaxYsQI3NzcmT54MwLhx45g3bx6xsbHMnDnT9Np69eoB\ncPnyZQYOHIhSqaRv376UK1eOy5cvs2LFCo4fP87q1avx9PTE39+fsLAwhgwZwscff8zcuXMBw7zU\n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\nin2/+d69+wHgmuSKMqtg9VPdE9xRapW4uLgU6+Rrbzw8DAleo9GY5lOLQ6ULSzPrpz4xMZFKlR4U\nl9u3bx/ly5dn4sSJ9OjRgwEDBnDkyBGzg5g0aRKNGzemfv36jBgxIlcdHGvavn0bAD169KB+/fpF\ncs6CeNRuc1vehe7s7C0IzA8AACAASURBVGwqL5OZmcmhQ/vlDsmq2rZ9nhIlSqJAgfvNgs1zuN9w\nf2isEpYMTygE47yVRqMxFbJ1dXXs9gz5Mes2V05OTq717tHR0bl2xFeoUIE7d+489XguLi68+OKL\ntGvXjhIlShAbG8vChQsZOHAga9eu5ZlnnjEnPAAUCvDze7p3DYmJhg1ItWvXNvs8Rcn4AxwSEsKg\nQYNYunQpYWFhNl+h2cfHhwoVKvD333+TknL3qf9d7NVLL73E4sWLcL/hjqqqyqyJeKVKiWuy4bbW\na6/1LfbfK3vi42O4paXVak3L8f38vIrVv5El1hmZdWUSHBzM6dOnAUOxs+vXr5t2RIOhlaU59xIb\nNWrE3Llz6du3Lx07duTdd99l6dKlqNVq5s+fb05oBWKs7nvu3Dmrn6swjL0UBg0ahKenJ4MGDcp1\n3FalpaWZSr6UK1dO5mis7+WXewHgrHLGOcW8tS3Gq5nSpUvTooV167wJ5jF2Sc3JyTHdihfzWXmZ\n9RPfo0cPfvjhB5KTk4mLi8Pb25v27dubHr9w4YLZk+//79lnn6Vly5YcPXq0QK+XJEhNfXTJl4e9\n+GJPfvppPn/88QdNmzYtsvIo5jLuwF26dKnpyuTh47ZIp9Mxf/58NBoNXl5eNG3a5qn/XexVcHBF\natSoyd9/x+Jxw4P0EulP90IJPG4a3uV26tSVjAzbvuJ0NHq94W27TqczJROt9un/ztiDgADvQl+d\nmHVl8tZbb/Hqq68SExODQqHgyy+/NNXiSk9PZ+/evRapnlumTBlSU61fmuO1116natVq6PV6vvji\nC86cOWP1cxaE8V1QWFgYDRs2NC12sNV3R9nZ2Xz77bem3tnvvx+Ct7e3zFEVja5dDct53RLc4Ckv\nHF3uu+Ckcvr39cV7X449cnbOe2UiytvkZdZ3xNXVlVmzZuX7mJeXF4cOHcLdvfCbrK5fv14kE5Bu\nbm58+eW3vPfeKBITE/jss88YPHgwPXv2tKnNio+KxZZiNLpz5w5hYWGmng+DBw+nR4+XZY6q6HTu\n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\nQmCC\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "u9iJ63CPodfN",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 354
},
"outputId": "cddc3c73-0888-4d90-b544-415c53c9513d"
},
"source": [
"sns.set_context(\"poster\")\n",
"ax = sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=my_pal)\n",
"ax.set_title(\"Poster context\")"
],
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Poster context')"
]
},
"metadata": {
"tags": []
},
"execution_count": 23
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAFACAYAAAARRRPYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XdcU9f7B/DPTSAQwhbELSpGEWVY\n3LXOqlhFFEdbtY6i9Vdra6vWqq2jdY+2VrTOOqviHlUcuLcguBABBwIKyl4ZZNzfH/lyILJDQhI4\n79err96Re+9DwDy595zzHIZlWRYURVEUpUccfQdAURRFUTQZURRFUXpHkxFFURSldzQZURRFUXpH\nkxFFURSldzQZURRFUXpHkxFFURSldyb6DoCqWX766SccPXq02HaBQIDGjRuja9euGDduHOrVq6eH\n6AqtW7cOADBu3DhYW1vrNZaaIDs7Gzt37gQATJs2Tc/RqAsJCUFUVBQ6duyITp066TscqhT0zojS\nCVNTUzg4OMDBwQF16tSBSCTC06dP8c8//2Dw4MEICwvTa3yBgYEIDAxEdna2XuOoKbKzs8l7amhC\nQkIQGBiIu3fv6jsUqgw0GVE64eXlhRs3buDGjRu4efMmIiIisGLFClhbWyM7OxvTp0+HRCLRd5gU\nRRkImoyoasHn8+Hn54d58+YBAFJSUhASEqLnqCiKMhQMrU1HaVNBm1HHjh2xe/fuYvvz8/Ph4eEB\npVKJiRMnYvbs2Wr7U1NTsXXrVly+fBlJSUkwMTFBs2bNMHDgQIwZMwY8Hq/E64aEhCAoKAiRkZHI\nysqCQCCAnZ0d3Nzc0LdvXwwcOFAtvtIMHToUy5cvV9uWnp6O7du34/Lly0hMTATLsmjUqBH69OmD\nCRMmwNbWtth5evfujdevX2PXrl1wdnbG33//jWvXruHt27do0aIFjh8/Xu57WUAmk+HIkSM4ffo0\noqOjkZubC0dHRzRr1gz9+/fH4MGDYWFhoXZMfn4+/v33X5w+fRovXryATCZD/fr10bNnTwQEBMDR\n0bHYdY4cOYI5c+aQ393Fixexfft2REVFQaFQoGXLlvjiiy8waNAgtePGjh1b5iOwb775plg7UmJi\nIrZv347r168jOTkZHA4HzZo1w4ABAzBmzJhiP8+MGTPw33//wdnZGceOHQOfzy/28/r7+yMmJga9\nevXCxo0bcefOHXzxxRdlvrfR0dFl7qeqD+3AQFUrHo8HOzs7pKWlITc3V23fw4cPMWnSJGRmZgJQ\ndXqQyWR49OgRHj16hOPHj+Off/5BnTp11I77448/sHHjRrIuEAggkUgQFxeHuLg43LlzhyQjS0tL\nODg4IDU1FQBgZ2cHLpdLjrW0tFQ7d1hYGKZOnUpiMjU1BYfDQWxsLGJjY0lMzZs3L/HnjYuLw3ff\nfYeMjAzw+XyYmppW6v16+/YtvvrqK0RFRQEAOBwOrK2tkZKSgjdv3uDGjRtwdnZWa5hPT0/Hl19+\niSdPngBQveempqaIi4vDjh07cPToUWzevBmenp6lXnf9+vX466+/wOFwIBAIIBKJ8ODBA8yYMQOp\nqakYP348ea2NjQ3s7OyQkZEBAHBwcFA71/uJ5dy5c5g5cyakUikA1V2zTCZDZGQkIiMjcfLkSWzf\nvl3tPAsWLEBYWBji4uKwfPlyLFq0SO2cf/zxB2JiYlCnTh0sWbIEQGG7ZU5ODqRSKSwsLIrFQhkQ\nlqK0aPbs2axQKGTHjBlT4n6xWMy2atWKFQqF7IoVK8j2zMxMtlu3bqxQKGQHDRrEPnjwgGVZlpXL\n5WxwcDDboUMHVigUsuPHj1c7X0JCAtu6dWtWKBSya9asYdPS0si+tLQ09syZM+ycOXOKxSEUClmh\nUMgmJCSU+rMkJiay3t7erFAoZBcsWMDGxcWxCoWCVSgUbHR0NDtx4kRWKBSyAwcOZOVyudqxvXr1\nYoVCIevp6ckOGjSIvXfvHtkXFxdXxjtYSCqVsn5+fqxQKGQ7derEHj16lM3LyyPvy+PHj9klS5aw\n9+/fVzvuyy+/ZIVCIduhQwf29OnTJLaHDx+ygwYNYoVCIdu1a1e194plWfbw4cOsUChkP/jgA9bV\n1ZVdv349m5WVxbIsy6akpLDTpk1jhUIh265dOzYjI0Pt2ISEBPKeluXBgwesm5sb26ZNG/b3339n\nk5OTyc8THh7ODhs2jBUKhezEiROLHXvz5k3yt3P58mWy/c6dO+Rv4MKFC8WOK/ib/Ouvv8qMjdIv\nmoworSovGe3evZt8aJ05c4ZsDwwMZIVCIevt7c2+e/eu2HHXrl0jx928eZNsP3XqFCsUCtkBAwZU\nKs6KJKMZM2awQqGQXb16dYn7pVIpO3jwYFYoFLLBwcFq+wqSkbe3N5uSklKp2Ars2bOHFQqFbNu2\nbdmoqKgKHRMaGkp+tqtXrxbbn5KSQhL7n3/+qbavIBkJhUJ2w4YNxY4Vi8Vs586dWaFQyB49elRt\nX0WT0aeffsoKhUJ23759Je7PyMggX0oePnxYbP+yZcvUkmlOTg55r+fNm1fiOWkyMg60AwOlcyzL\nIjExEdu2bcOqVasAAA0bNkSvXr3Ia86ePQsAGD58eIntGR9++CG8vLwAAMHBwWR7wWO1nJwciMVi\nrcUsFotx5swZcDgcTJgwocTX8Hg89O/fHwBw8+bNEl8zZMiQYo+tKqqgXWnYsGFo3bp1hY45c+YM\nAKBt27bo3r17sf0ODg749NNPAai/j0WZmZlh3Lhxxbabm5vjww8/BADExMRUKJ6i4uPjER4eDmtr\nawwfPrzE19ja2uKjjz4CUPJ7+sMPP0AoFCI1NRU///wzfv31V7x+/RpNmjTBnDlzKh0TZThomxGl\nE3fv3kWrVq1K3Ofo6Ij169eTzgj5+fmIjY0FAHTu3LnUc3bq1AkRERGkLQQAPDw8YGtri5SUFIwa\nNQqjR49G165d0bhx4yrFHxkZCZlMBoZhMHjw4FJfV9A9PSkpqcT9BQm0sgraUACgR48eFT6u4L0p\na3Bn586dsWnTJsTFxUEkEhVrR3FxcSm1bcXJyQkANBqfFR4eDgAQiURl/kwikQhAye8pj8fDqlWr\nMGLECFy4cAEAwOVysXLlSggEgkrHRBkOmowonTA1NYWNjQ0AgGEY8Pl8UoFhxIgRZB8AZGVlQalU\nAij8sCtJQdWG9PR0ss3GxgYrV67ErFmzEB0djfnz5wNQJbxu3brB398fHTt2rHT87969A6C6qyvo\n7FCW0sZM2dvbV/ragOo9kcvlAIAGDRpU+LiC96as97FgH8uyyMjIKJZ4yvpQNzMzAwASW2WkpKSQ\nY6vynrZu3RoTJkzApk2bAADjx4/XOOlThoMmI0onvLy8SuzaXZ6CHlaV0aNHD1y4cAHBwcG4efMm\n7t27h3fv3uHYsWM4duwYRo4cid9++61S52T/N+LBysqqStUiOBz9PAnX5H3UtYL3tHXr1pXq2v6+\nvLw8tUeM9+/fh1Kp1Nt7TWkH/e1RemdjY0M+SN68eVPq65KTkwGUfLdhZWWFkSNH4s8//8S1a9dw\n6tQpjBw5EgBw4MABXL58uVIxFXQfz83NRU5OTqWO1QYbGxuYmKi+K75+/brCxxW8N6U9NgRU3cUB\n1R2rnZ1dFaKsnIL3tOD3qKlly5YhPj4e9evXh6WlJe7du4etW7dqI0RKj2gyovSOx+OhZcuWAIA7\nd+6U+rqCfW3atCn3nC4uLvjtt9/IWJr3B2UyDAOg8Nv6+9q2bQsTExOwLItr166V/0NomampKdzc\n3AAAV65cqfBxBe9NaGhoqT/b7du3AQDOzs5aG3dT9K6ktOsW/C4yMzPx4MEDja5z8eJFHDx4EBwO\nBytXrsTPP/8MAPjrr7/IWKz3lfe7pgwDTUaUQSjolXb06FHSXlPU9evXERERAQDw8fEh2/Pz88s8\nb0Ebx/uvK9oLrySWlpbo168fAGDt2rXFBugWJZfLkZeXV2YcmhgyZAgA1Xvy9OnTCh0zYMAAAEBs\nbCxp4C8qNTUV+/fvB6D+PlZV0cHCpXVuaNGiBUlIq1atgkwmK/V8Eomk2O8sLS2NJJ/x48ejY8eO\nGDp0KPr16weZTIZZs2aV+PdQEBstimvYaDKiDMKYMWPg6OgIiUSCgIAAPHr0CACgUChw9uxZ/PDD\nDwCArl27okuXLuS4ffv24csvv8TJkyfVklh2djY2btxI7oje7+bs4uICADh27BgUCkWJMc2YMQO2\ntraIi4vDZ599hqtXr5IPUJZlERcXh+3bt8PHxwePHz/W0jtRaMSIEXB1dUV+fj7Gjx+PY8eOke7r\nCoUCjx49ws8//6x2l+Ht7U1+1rlz5+LMmTPk53v8+DEmTpyIrKwsODg4lFsqpzKsra1Rt25dAKqy\nQqWZN28eeDweQkNDMX78eISFhZHOKwqFAtHR0QgMDETfvn2LfSmZN28e0tLSIBQK8f3335PtixYt\ngqOjI2JjY7FmzZpi1yy467527VqJX3Qow0A7MFAGwcbGBhs2bEBAQACio6MxfPhwCAQCyOVy0hjf\nqlUrrF69Wu04lmVx/fp1XL9+HYCq9IyJiYnat+BRo0YV60o8YsQIREREYOfOndi/fz/q1KkDhmHQ\nv39/Ui+vUaNG2LJlC6ZOnYqYmBhMmjQJpqamEAgEyMvLU/tmX/AoSJt4PB7+/vtvTJ48GTExMZg9\nezbmzp0LKysrteu/3/V85cqVmDhxIqKiovDdd9/BzMwMJiYm5O7NxsYGgYGBWm8vGjFiBNavX4/l\ny5fjr7/+Iuf/4osvSPkgd3d3BAYGYsaMGQgLC8Po0aPB4/FgYWFR5nt64MABXLp0Caampli1apVa\njUJ7e3ssXrwYX331FXbu3IlevXqpDRHo27cv1qxZg7i4OPTo0QN16tQhx1+8eFGr7wGlOZqMKIPh\n7u6OU6dOqRVK5XK5aNu2LSmUWvDYrcDgwYMhEAhw8+ZNREdHIyUlBSKRCI6OjmjXrh1GjBiB3r17\nF7uWv78/lEolDhw4gGfPniEpKYl0dX4/puDgYOzbtw8XLlzAixcvkJOTA4FAgFatWsHLywv9+/dH\nhw4ddPKe1K9fH4cPH0ZQUBCCg4MRGxsLkUiEunXrksKi7u7uasfY29sjKCgI//77L06dOoWXL19C\nJpPB2dkZPXr0QEBAALmL0aapU6eCz+fj5MmTiI+PJx0v3n8U2qNHD5w9exa7d+/G1atX8erVK+Tk\n5MDKygrNmjVDhw4dMGDAADRs2BCAarDssmXLAADTp08vcQBwz549MWrUKAQFBeGnn37CiRMnyKSJ\n9vb22LlzJ9avX4/w8HCkp6eXejdM6Q+t2k1RFEXpHW0zoiiKovSOJiOKoihK72gyoiiKovSOJiOK\noihK72gyoiiKovSOJiOKoihK7+g4oyKUShZyOR1/QFEUVREmJlxwONoZ8E2TURFyuQJZWdqbLZSi\nKKoms7Hhg8fTThqhj+koiqIovaPJiKIoitI7mowoiqIovaPJiKIoitI7mowoiqIovaPJiKIoSkdS\nUt4hKiqSTnleATQZURRF6UBo6B34+w/CpEnjsGjRz/oOx+DRZERRFKUDly6FkCnVQ0LOkmWqZDQZ\nURRF6UBubq7aukgk0lMkxoEmI4qiKB3Iyckuc51SR5MRRVGUDmRlZb63nqWnSIwDTUYURVE6kJ6e\nrraekZGmp0iMA01GFEVRWqZQKJCRoZ6MUlJS9BSNcaDJiKIoSstSUlKgUKhPR/P2bbKeojEONBlR\nFEVpWXLym2LbkpKKb6MK0WREURSlZQkJ8SVse6WHSIwHTUYURVFaFhf3sti2V69e0bJAZaDJiKIo\nSstevHhWbJtIlIfk5CQ9RGMcaDKiKIrSIpZlERPzlKw7ODiQ5ejoKH2EZBRoMqIoitKiN29ekwGu\nlpaW6NatG9n35EmkvsIyeCb6DqA8ycnJ2LJlC65fv46kpCSwLIv69eujc+fOmDRpEho3bqzvECmK\nooiHD++TZRcXFwiFQrL+6NEDfYRkFAz6zujJkycYPHgw9uzZA4lEgg8//BDdu3eHRCJBUFAQfH19\nER4eru8wKYqiiPv3Cz+T2rRpA1dXV7IeFRUJiUSij7AMnkEno19//RXZ2dkYOXIkQkJCsGHDBmzY\nsAEXLlyAv78/RCIRFi5cqO8wKYqiAKjai8LC7pJ1Nzc32NjYoFGjRgAAuVyOBw8i9BWeQTPYZCSV\nShERofqlTZs2DaampmSfqakppk+fDgCIjo6GWCzWS4wURVFFxce/IpUWLCws4OLiAgDw8PAgr7l7\n95ZeYjN0BpuMOBwOTEzKb9KysLCAubl5NUREURRVths3rpHldu3akc8wLy8vsv3mzevVHpcxMNhk\nZGpqis6dOwMA1q1bB5lMRvbJZDKsXbsWAODv7w+GYfQSI0VRVFE3blwly97e3mTZzc0NZmZmAFTV\nGeLj46o7NINn0L3pFi5ciICAABw4cABXr15F27ZtAQCPHj1CdnY2xo0bh1mzZuk5SoqiKCA9PY30\npGMYBu3btyf7eDwePD09cefOHQDAlSuXMXbseH2EabAMOhk1btwY+/btw+zZs3H16lUkJxdWvW3b\nti28vb3V2pKqisczgaOjldbOR1FU7XHhwilS7sfV1RW2trZq+zt16kSS0fXrl/DDD9OqPUZDZrCP\n6QAgPDwcgwcPRnx8PDZs2IBbt27h1q1bWL9+PbKzszFt2jQEBgbqO0yKoiicOXOGLHfq1KnYfm9v\nb9KGFBkZiYSEhGqLzRgwrIFW7svOzkb//v0hFotx8uTJYoNbX716BV9fX8jlcpw6dQrOzs5VvmZ+\nvhxZWbRnHkVRlZORkY4hQwZAqVQCADZv3ow6deoUe93SpUtx7949AMBXX31j9I/qbGz44PG084DN\nYO+MLl++jPT0dHh4eJRYZaFp06Zwd3eHXC7H3bt3SzgDRVFU9bh06QJJRK6uriUmIgDo2rUrWb54\n8Vy1xGYsDDYZJSWpqttaWZXehmNtbQ0AyMzMrJaYKIqiSnLx4nmyXDThnDhxAgEBAThx4gQAoGPH\njqSdOzY2BvHxdI6jAgabjOrWrQtA9Wy1aLfuAjKZDJGRqqKDBaObKYqiqltqaiqpqsAwDLp06UL2\nBQUFISMjA0FBQQBU4yKLjjkqmsRqO4NNRh999BH4fD7evHmDZcuWIT8/n+zLz8/H4sWLkZSUBBsb\nG3Tv3l2PkVIUVZtdvXqJ9KJr06YN7OzsyL6COnRF69EVvXO6fPliNUVp+Krc8iSXy/Hq1StkZ2dD\nLpeX+doOHTpU+Lx16tTBggULMG/ePPz77784f/483NzcAACPHz9GSkoKeDweli5dWuajPIqiKF26\ncqUwoRS9KypNwZAUmUyGZ89ikJiYgEaN6OwDGiejhIQE/P7777h48aLaXUtpGIbBkydPKnWNoUOH\nQigUYufOnQgLC8ONGzcAAE5OThg+fDgmTJhAaj9RFEVVt+zsLLUq3SV16X4fn8+Hh4cHwsLCAADX\nrl3BZ5+N0VmMxkKjZPTq1SuMGjUKWVlZYFkWDMOgTp064PF42o4Pbm5uWLlypdbPS1EUVVW3bt2A\nQqEAALRs2RL29vYVOq5Dhw4kGd24cZUmI2iYjNauXYvMzEzUq1cPc+fORe/evStU1JSiKKomuX37\nJlkuWouuPEVf++jRA+Tk5NT65gaNOjDcvn0bDMNgzZo16NevH01EFEXVOkqlEqGht8l60Vp05bG1\ntUWLFi0AAAqFAuHhoVqPz9holIzy8vJgbm6ODz74QNvxUBRFGYUXL56TMY7W1taVrgJTdI6j8PAw\nbYZmlDRKRvXr14dSqYSBVhKiKIrSufv375FlNzc3cDiV+zgtmIUAACIi7pXxytpBo2T0ySefID8/\nH7du0RkLKYqqnR49ekCW27RpU+njW7VqRRLYy5cvkJOTo7XYjJFGyWjy5Mlo3bo15s+fTyvPUhRV\nKz15EkmWW7VqVenjzc3N0axZMwAAy7J4+jSynCNqtnJ7Hhw7dqzE7cOGDcO6devg6+uL/v37o127\ndhAIBGWey8/PT7MoKYqiDEhWViaSkt4AAExMTNCkSRONztOiRQs8f/4cAPD06VN06NBZazEam3KT\n0U8//VTqtN4FbUbHjx/H8ePHy70YTUYURdUEz58/I8tNmzbVeJLPgjsjAHj2LKbKcRmzcpNRZUr4\nUBRF1QYvXqgnI00VPbboOWujcpPR7t27qyMOiqIooxEXF0eWqzJrQNG52hITE6BQKMDlcqsSmtEy\n2KrdFEVRhio+Po4sN2zYUOPzWFhYkCrfMpkMyclJVQ3NaGmUjAIDA7F9+/YKv37Xrl0IDAzU5FIU\nRVEGJzGxsBdx/fr1q3SuBg0alHje2kbjZLRt27YKv37Hjh1Yv369JpeiKIoyKFKpFCkp7wAAHA6H\nTASqKScnJ7JMkxFFUQbpjz9WYsCAXpgx41u1Cdoo/UlOTiI9iR0cHDTuSVegXr16ZPnNm9dVOpcx\nq5ZklJGRAXNz8+q4FEXVGC9fvsDhwweQm5uDO3duqk3iRunP69eJZLnoXY2mip7jzZvEMl5Zs+m0\n3HZOTg4OHz4MsViM1q1b6/JSFFXjvHv3Vm397dtkPUVCFVU0YWgjGdE7I5UKJaPAwMBibT5paWlw\ndXWt0EUYhsHgwYMrHx1F1WLp6Wlq6xkZGXqKhCoqMVF3d0avXyeSCUtrmwo/pmNZlvzHMIzaeln/\nOTo64uuvv8bEiRN1+XNQVI2Tmpr63nqKniKhinr9Wns96QDAysoKlpaWAACJRIK0tNRyjqiZKnRn\nNG7cOAwdOhSAKin17dsX9vb2OHjwYKnHcDgcWFpa1vrZCylKU2/fqo85qc1jUAxJfPwrsqyNZFRw\nntjYWHJ+BwdHrZzXmFQoGVlZWakllQ4dOsDOzq5Kg70oiirb+918ExMTau0jHEMhlUpJgVSGYbSW\njBo2bEiSUVzcS7RvX/EpzGsKjTow0BJBFKV7cXEv1dZzcrKRkZEOe/s6eoqIevXqJZRKJQCgbt26\nMDMz08p5i5YUevHiuVbOaWzoOCOKMkAZGRklthHFxtbuys769n61bm0peq7nz2O1dl5jotGdUWVL\n+/B4PFhbW6NFixbw8PAAj8fT5LIUVWtERZU80dqTJ4/RqVOXao6GKhAd/ZQsOzs7a+28RaeSiI2N\nrpUFUzVORpo+t7a0tMTnn3+OqVOn0qREUaV48CCCLCt5SnDyOcW2U9Wv6JcEFxcXrZ3Xzs4O9vb2\nSE9Ph0QiQVzcS7Roob3zGwONkpGfnx8YhsGFCxeQnZ0NPp+Ptm3bkhpN7969Q2RkJEQiEWxsbNCr\nVy/k5OTgyZMnSEpKwubNm/H48WNs2bKFzAFPUVSh0NA7ZDnPJQ9WT1QdiB4+fACpVAIzM1rRpLpJ\npRJER0eRdW0mIwBo2bIl7txR/d4fPbpf65KRRplg2bJlyM3NhUgkwqxZs3Dr1i3s3r0ba9aswZo1\na7B7927cunULP/74I/Ly8iCVSrF+/XpcunQJq1evhpmZGW7evFmh2WEpqrZJSXmHmBjV4yCWYSFp\nKIFcIAcA5OdLce9emD7Dq7UiIx9DLlf9Hho0aAAbGxutnr9oEYGIiHCtntsYaJSMdu3ahZCQEMyZ\nMwdffvlliXXnzMzMMHHiRMyZMwdnzpzBv//+CwAYNGgQvv/+e7AsS5MRRZXg6tVLZFlmLwNrykLq\nJCXbLl++oI+war2id6tt27bV+vnd3NzI8r17oaTXXm2hUTI6cuQIuFwuRowYUe5rR4wYAS6Xi0OH\nDpFtQ4cOBcMwiI6O1uTyFFWjnTt3hixL60nV/g8AV65chFRKK3hXtzt3bpFld3d3rZ/f2dkZ1tbW\nAIDMzAzExNSuz0eNklF8fDwEAkGFOiDweDwIBAK1aXqtra1hbW2NnJwcTS5PUTXWy5cvEBn5CMD/\nHtHVUyUduY0ccgvVI6K8vDxcvkwreFenoo9OuVyuTpIRh8OBp6cnWb9x46rWr2HINEpGPB4P2dnZ\nSEoqvzzJmzdvkJWVpTbnB8uyEIlE5FsARVEqx44VPkGQ1pWCNVPNmwMGkDSSlPg6SveKTt/Rpk0b\nCAQCnVzH27uw8kLRx7W1gUbJyMPDAwCwaNEi0qBXEoVCgd9++w0Mw6hl/Ldv30Imk8HRsfbVX6Ko\n0uTk5OD06f/IuripWG2/pLEELKNKTo8ePSx1LBKlfRcvhpDlLl10N86rffv25InT8+fPilXhqMk0\nSkZfffUVGIbBlStX4O/vjyNHjiAuLg55eXnIy8tDXFwcDh8+jGHDhuHy5ctgGAZTpkwhx4eEqH6x\nH3zwgXZ+CoqqAY4dOwyxWAQAkFvKIasjU9uvNFNCWr+w7ejff3dVa3y11Zs3r/Hw4X0AqkdpnTt3\n1tm1+Hw+vLy8yPrZs6d1di1Do9E4ow8++ABLly7FL7/8gujoaMybN6/E17EsC1NTUyxatAjt27cn\n2/Py8jB48GD4+vpqFjVF1TBisRhBQXvIuqiZCChhXLmouQjmb1S9V69cuYiXL1+gWbPm1RVmrRQc\nXHi36unpqfUu3e/r0aMHGW909uxpBARMqRXVGDQecern54fjx49jyJAhEAgExeYxEggEGDJkCI4d\nO4Zhw4apHfvVV19h1apVao/uKKo2O3LkADIzMwEACnMFJA1L7i0nt5ZDWld1d8SyLHbs2FJtMdZG\ncrkcp06dIOu9evXS+TXbt29P2tPfvXur1ouvJqvStOPNmzfHihUrwLIsEhISyEyUdnZ2aNy4MS11\nT1EVkJubi717Cx+55bnkka+J/Bd8WLy0gKiZCOLmYrLf7J2qWvSFC+cxZswEtGwprPa4a4ObN6+T\n6d9tbGzQoUMHnV/T1NQUvXr1IuMwjx49iK5dP9T5dfVNK7V4GIZBkyZN4OHhAQ8PDzRp0oQmIoqq\noP379yArKwsAoOAr1HrNCWIF4Eq5EMQW9t6S2xbeHQHA5s3rqy/YWubgwX1kuXfv3mq9gsuSn5+P\nM2fOqG07c+YM8vPzK3R8v379yGforVs31Cb0q6loYTiK0qPU1FTs31/YVpQnzFP7V8lRcNT+XyC3\nVS5YqHrW3bp1A+HhtESQtkXE5TegAAAgAElEQVRHP0VExD0Aqo4LAwYMqNBxCoUCK1euxJYt6o9Q\nt2zZgpUrV0KhUJR7jnr16ql18DpwYG8lIjdOVXpMBwDJycmIiYlBdnZ2md28AVU7E0VRhf75ZxMk\nEtWdkMxKBkmDilVWUFip2pX4r/kAgL///gubNu2ghYe16N9/d5LlLl26wMHBoULHnTx5EhERJVdX\nj4iIwMmTJyv0WTho0CCEham+ZJw+fRITJ06u0RMrapyMHjx4gCVLluDRo0cVPoYmI4oqFBf3Uq1x\nPK91Xok96EqTJ8yDeZI5GCWDqKgnuHjxPPr27a+DSGuf+Pg4XLpUOLaoMp9dd+/eLXd/Rc7Xtm1b\nuLi44NmzZ8jPz8f+/f/i66+/rXAcxkajZPT48WOMGzcOUqkULMuiXr16cHJyovMTUVQlbNy4jjyy\nya+Tj3yHirUnFFDylRA5iyB4oWpP2rRpA3r0qHi7BlW63bt3gGVVj0E9PT3RvHnFu88/f172tOHl\n7S/AMAyGDRuGlStXAlB1ZBg9+gvY2NhWOBZjovHkehKJBEKhEMuWLVOrNktRVPkePryP69cLa4/l\nts6t1F1RAVELEfgJfHBkHCQlvcbx44cxfPinWoy09klMTMC5c8FkvSIFoYsqr7mivP1FdejQAU2a\nNEF8fDzEYjH27/8XX301tVLxGAuNHjBHRESAYRisXr2aJiKKqiSWZbFpU2EPOEkDCeQ2Ff+AUjuX\nKYu8FnlkfefOfyAWi8s4girPjh1byR1ru3bt0Lp1a73FwuFwMHz4cLJ+6FAQGY9W02iUjKRSKSws\nLCAU0rENFFVZoaF3yPThLMMiV5hbpfOJm4qhMFd9eGZkpOPQoaAqx1hbxcW9VLsr+vRT/d9ldunS\nBU2aNAEAiMUi7N27s5wjjJNGyahJkybIz8+v1O0mRVGqu6Jt2zaRdXFjMZQWVZxEjQvktSy8O9q3\nbzdEorwyDqBK888/m8mkdl5eXnq9KyrA4XAwatQosn748AGkpqbqMSLd0CgZDRs2DDKZDBcu0Bkn\nKaoywsPDCucr4rAQtRBp5byShhIo+Kq7o+zsLBw7dlgr561NYmNjcPHiebJuCHdFBTp16kQ6UUil\nUuzZs13PEWmfRsnoiy++QLdu3bBgwYJS+9NTFFXcnj07yLK4kRhKvpamluZAre0oKGhvhUf7Uyrb\ntm0kyx06dICLi4seo1HHMIxacjx+/Ajevk3WY0Tap1Fvug0bNsDd3R2PHj3C559/Dm9vb7Rt27bc\nCae++eYbjYKkqJrg2bNYhIaqqjGzYCFqrp27ogKShhJSPigtLRUhIWcxcOBgrV6jpoqOfqrWu9GQ\n7ooKtG/fHq1atUJ0dDRkMhl2796OmTPn6DssrdG4azfDMKQffmhoKBkpXBKWZcEwDE1GVK126NB+\nsiytJ616W9H7uIDYWQzLaEtyPR+fQbROZAUUrX7epUsXODs76y+YUjAMg1GjRuHXX38FAPz333GM\nHTsBTk719ByZdmiUjPz8/OgfOEVVQnZ2Ns6fLyycKXbWTfdrcWMxBLECMEoGMTHRiIx8jLZt2+nk\nWjXF8+fPcO3aFbJe2XFF1cnd3R2tW7fG06dPIZfLsW/fHkyfPlPfYWmFRslo+fLl2o6Domq08+eD\nIZWqKm3LrGSQ2cnKOUIzLI+FpIEE/ERVzboTJ47QZFSOotN3dOzYEU2bNtVjNGVjGAb+/v5YsmQJ\nAODkyaOYOHESrK11O+FfdaBVFSmqGhStQSdpItGo2kJFiZsU3nVduhQCkUi7bVM1SWpqCkJCzpL1\n9ycCNUReXl7kMaJUKq0xPSdpMqIoHXv+/BliYqIBqLpzV7Qyt6bkNnLILVVjAMViMS5fpkMwSnPy\n5DFSbcHV1RUtW7bUc0TlYxgGgwcXdkw5duxwhaalMHRVSkYJCQlYvHgxfHx84OXlhTZt2qjtz87O\nRmBgINavXw+ZTDePJSjK0J09e4osS52kYE1Z3V6QgdoEfWfPBpfx4tpLoVDg5MljZN3Hx0eP0VRO\nt27d1KYmv3v3tp4jqjqNk9H58+fh6+uLf//9Fy9fvoRYLCa96wpYW1vjzp07CAwMxMWLF6scLEUZ\nG4VCgfPnCx8DSRrq9q6IXKeBhEy+Fx4eipSUd9VyXWPy6NEDMqW4lZUVOnbsqOeIKs7U1BQ9e/Yk\n6yEhZ0p/sZHQKBk9f/4cM2fOhFgsxsiRI7Fnzx7Y2dmV+NoRI0aAZVlcvny5KnFSlFG6fz+cJAIl\nT1npaSI0pTRXQlZH9TSCZVm1nnyUStH5irp27Wp0U290796dLF+7dtXoBzlrlIy2bdsGqVSK8ePH\nY9GiRfD29gaXyy3xtV27dgUAPHz4UPMoKcpInT17mixL6kuqtZW26F3YuXM0Gb3vzp1bZLlz5846\nuYarqysCAgJ0UuOuWbNmcHJyAgCIRHl4/Ni4P2M1+qdx+/ZtMAyDgICAcl/r4OAAPp+PpKQkTS5F\nUUZLIpHg8uXCx9PV9YiugNRJCpajelT37FkMnj2LrdbrG7J3794iMTEBAMDj8eDq6qr1a7i6uuLg\nwYOYNWsWDh06pPWExDAMPDw8yHp4eOmFB4yBRskoJSUFAoGgwnPC83g82oGBqnWuXr1MqmfLLeQa\nz1mkKdaUhdRJStaDg/+r1usbsoLejQDg4uKik0d03bp1I+c1NTVFt27dtH6Nokk0Nja6jFcaPo2S\nkYWFBcRicYW6E+bm5iInJwc2NsY/KIuiKkNtbFEj3Y4tKo16r7rT9Evh/8TFvSDLuhrkev36dfJ+\ny2Qy3LhxQ+vXKJjnCABevnxRxisNn0bJyMXFBUqlEpGRkeW+Njg4GEqlEm3bttXkUhRllF6/TsS9\ne3cBqIqiVvcjugL5Dvlk4r3MzAxcv36lnCNqh7S0NLJct25dnVzj6dOnGD58OFauXInhw4fj6dOn\nWr9GQZsRAKSnp5XxSsOnUTLy8fEBy7JYu3YtmYiqJNHR0Vi9enWxQVoUVdMdP36ELOc75mtvqojK\nem/MUdG4arPs7CyybGlpqbPrPH36FNu2bdNJIgIAc3Nz0nlMIpGQklPGSKNkNGrUKLRq1Qo3b97E\nuHHjcP78eTLra3R0NC5duoRFixZh1KhRyMrKQvv27TFw4ECtBk5RhkoqleDUqeNkvWh5ngpTAPxX\nfLVN/Fd8QIOB9uLGYjLmKCzsLl69iqv8SWqYmlLo+f2fg8Mx3qI6GhVKNTU1xdatW/F///d/xaaP\n8PPzI8ssy8LT0xPr1q2rMb98iirP+fNnkJWl+uat4CuQX7eS4z9YwCbcBmYpZmqbrSKtwHvHQ5Z3\nVqXan5R8JfKd8mH2VnW+Q4eCMGPG7MrFVMOYmRW+t8Z8NyGTyUjbPYfDgYmJRh/pBkHjNOro6Ij9\n+/fjt99+g5eXF0xMTMCyLFiWBYfDgbu7OxYuXIg9e/bA3t5emzFTlMFiWRZBQXvJuqipqNIdFyxe\nWBRLRAXMUsxg8cKi0nGJmhYWSw0OPomsrMxKn6MmcXQsbCdKSUnRYyRVUzR2BwdHo/7SX6U0amJi\nghEjRmDEiBFQKBTIysqCUqmEra2tUWdoitLU7ds3Sa8mJVcJSePKd1wouIMpDe8dD6IWlavELasj\ng8xKBtMcU0gkEhw9egjjx5c/TrCmatCgEVmOj4/XYyRVk5CQQJYbNGiox0iqTmsPGLlcLuzt7eHg\n4EATEVVr7du3myxLGks0Kopqkl32vx/TLA3GxDCAuHlh29Xhwwcgleqnh58hcHUtLOocExNTZkcs\nQ1a0Y0SbNm56jKTqjLe1i6IMzJMnj8koeJZhIWqm2TxCjLLsRy3l7S+NpL6EdPPOyEjH6dO1dxBs\no0aNYW9fBwCQl5eHmJgYPUekmfDwcLLs7u6px0iqrtxbmNDQUK1drEOHDlo7F0UZmj17dpJlaX2p\n/rpzl4YDiJqJYBVlBUB1Fzd4sF+tfJLBMAy6dfsIJ08eBQDcuHFDJ/XjdCkhIQGJiYkAVB0yPvjA\neKqOl6Tcv8KxY8dqpVGMYRg8efKkyuehKEP06lUcrl27TNbzWuTpL5gySBpLIHgmAEfGwZs3r3H5\n8gX07dtf32HpRe/efUgyunr1KsaMGaPWy87QhYQUVh3v0uVD8Pn8Ml5t+MpNRg0aNKiOOCjKqO3b\nt5vM5yWtK4XCyjBn3mRNWIibiiF4JgAA7N27C3369DPqXlia+uCDjqhfvwGSkt4gNzcX169fR58+\nfap8XhMTEzLusrT9VSUSiXDp0iWy7us7tMrn1Ldy3xU6KR5FlS01NVVtqghRc83aiqqLyFkEixcW\nYJQMYmKiERZ2Fx06dNJ3WNWOw+HAz88ff/+9DgBw9OhR9OzZs9TpcCqqRYsWiI4uvWhpixYtqnR+\nADh79izy8lR3340aNYG3t3E/ogP03IHh7du3ePPmTbmvk0gk2LJlC/z9/eHt7Q0PDw/07t0b3377\nLe7du1cNkVJU6Q4fDiosiGkrg8zOsIuRsjwW4saFPev27dujx2j0a8gQf1IOKCkpCdeuXavyOcub\nMbaqM8qKRCKcOFFYhHfMmC+MuvJCAb3+BP7+/ujbt2+Zr0lISICvry9Wr16Nt2/folOnTujRowfs\n7e1x4cIF3Llzp5qiNU7R0U+xcOE8LFw4D9HRuqmPVZtJJBIcO3aYrIuaVX6Qqz6InQtLBN29e8vo\nKz5rytLSEiNGfEbW9+/fX+XK5oMHD4aXl1eJ+7y8vKpcp/PEiRPIzs4GADg51UP//p9U6XyGQu/d\naAqes5dEJBJh4sSJSEhIwIwZM/Dll1+q3UJnZGQgM7N2jyQvz/LlvyI2VtVt9dWrl9i+fW85R1CV\nce5cMHJyVB8MCr4C0nrGUVpGIVC8VyJoP2bNmqvnqPTj009H4+jRg8jMzERKSgr+++8/DB2qeRsM\nl8vFjz/+iEuXLmHz5s1k++TJk9GrV68qPQZMTU3F8eOFdQ8DAqYY3XTppTHoe7u///4b8fHxGD16\nNCZPnlzsl2hnZ4dmzZrpKTrDJ5VKSSICgNjYGKOuw2VoWJbF4cMHyLompX/0SeRc2LZ19uxp5OTk\n6DEa/REILDFhwiSyfujQIaSnp1fpnDweD/37q/dS7N+/P3g8XpXOu2vXLuTnq2odurgI0a+fT5XO\nZ0gMNhnl5+fjwAHVP/Tx48frNxgjVdKjl9r6OEYXHj9+iOfPVVN5s1xWo9I/+iSzl0Fuqer1JZFI\ncO7c6XKOqLmGDPFHs2bNAajeix07dug3oBI8evRIbYK+6dNnVrmzhSEx2GQUGRmJzMxMODk5oXHj\nxoiMjMSff/6J+fPnY+3atWqVwqmSRUY+rNA2SjNF5waSNNCs9I9eMYC4aWFHhuPHj5T52LwmMzEx\nwfff/0jWb9y4gQcPHugxInUymUztkV+fPv3g6dlejxFpn8Emo4LyHE5OTlixYgWGDRuGv//+G0FB\nQdiwYQNGjx6NqVOnQiQy7G60+nT37u0KbaMqLzc3F5cuFQ46LNo7zZhIGkjAclUJ6MWL54iMfKzn\niPSnfXtvtcdemzdvNpjH2kePHiU9jy0sBJg27Qc9R6R9eu/AUJqC+WCioqLw8OFDjBs3DmPGjIGt\nrS1CQ0OxaNEihISEYNGiRVixYoVWrsnjmcDR0Uor59K3nJwchIYW72kYGnoH5uaAlVXN+Dn15dKl\nYPJBJbOSQW5T+iBHQ8aaspDUl4CfqBq9f+nSGfTq1VXPUenPggU/4/btG8jOzkZycjIOHjyIMWPG\n6DWmxMREHD5c2GNzxowf4Opa89rKDfbOqKCKrkwmg6+vL+bOnYsmTZrA2toaffr0wfr168EwDI4f\nP27UJeB15b///iMNnc7OznB2dgagaos7deqUHiOrGY4dO0aWJY0kRtVx4X1FpyUPDg4mfze1kYOD\nA2bOnEnWT5w4gbi4OL3Fo1QqsXHjRlLRwd3dHZ999lk5Rxkng70zEggEZHnkyJHF9rdr1w5ubm54\n/Pgx7t69iyZNmlT5mvn5cmRlGefjlqKUSiW2b99B1nv37g2WZbF9+3YAwPbtO9Crl0+NGCinD8nJ\nSWSwNcuwkDQwro4L75PZyaDgK8AVc5GdnY0TJ86gR49e+g5Lb3r2HAAPj6N48CACCoUCGzduxJIl\nS/TSWSAkJARRUVEAVF3Gf/hhDtLTDadpwsaGDx5PO2nEYD+NGjVqVOJySa9JTU2tlpiMxeXLF/Hq\nVRwAgM/no2fPnujVqxcppBgX9xKXL9MyT5q6ePE8Wc53yAdrprtGf1dXVwQEBOi2ojQDtYR68eI5\n3V3LCHA4HPz44zwyfic2NhZnzpyp9jgyMjKwe3fh/FiffTYWLi4tqz2O6mKwyahNm8LJr0ob2JqR\nkQEAsLCo/DTMNZVcLseWLRvI+oABAyAQCCAQCDBgwACyfevWv8ss5kiVrmgil9bXXQO3q6srDh48\niFmzZuHQoUM6TUiS+oXJ6ObNGwbTcK8vTZs6Y+zYCWR979691f6ld9u2baSDVqNGjTFhQs2emVev\nyaisbqROTk7w8PAAANy6davY/qysLDIlRdu2bXUToBE6cuQgEhJUbWgWFhYYMmQI2TdkyBCSuOPj\nX+HIkYN6idGYpaWl4skTVY8zlmEhrau7D+1u3bqRb+empqbo1q2bzq6lsFJAbqH6ciIWixARQWs+\njhkzHs7Oqo4CBfUxq6vre1hYmNrn3qxZc2FmZl4t19YXvSajefPmYenSpaXunzJlCgBg06ZNePTo\nEdkulUqxcOFC5OTkwM3NrdQ6ULVNWloqtm3bSNb9/f3Ves1ZWVnB39+frG/bthFpafQRZ2UU7Rov\ns5OB5enuw+n69euFBVhlMrUBj1rHAPl1Czsu3L59U3fXMhI8Hg+zZs0j62FhYbh7967Or1uQ+AoM\nHDgYH3xQ8ycm1WsyGjhwYJk1oHr37o2JEyciMzMTn332GRlb1LdvX5w+fRpOTk74/fffa+VcLCVZ\nt+4PUla+QYMG+OST4gUUP/nkEzJHVV5eHgID/6zWGI1d0TuGfAfd9jp7+vQphg8fjpUrV2L48OF4\n+lS3hW7zHQt/HnpnpOLh4ak2V9DWrVshFuu2k9OBAwfII0EbGxt8/fV3Or2eoSi3G8ScOXO0ciGG\nYcq8CyrN7Nmz4eXlhT179iAqKgpisRgNGjTAhAkTMHnyZNjb22slPmN3+/ZNhIScJesBAQHkEc+J\nEydw4sQJ+Pr6wtfXFwEBAfj1118BAOfPn0H//gPRuXPtHVtSGQWP6ABVOR1de/r0qc6TUAGZnQws\nWDBg8PLlc4hEItoeC2DKlGm4du0KMjLSkZ6ejgMHDmDcuHE6uVZ8fDxOnjxJ1qdOnQ5bW1udXMvQ\nlJuMjh49CoZhqvysVNNkBAD9+vVDv379qnT9mkwkEmH16mVk/aOPPiLtbQAQFBQEiUSCoKAg+Pr6\nwsPDA927dydzt6xevQy7dgXRD55y5Ofnk16KLFjIbAx73qLKYk1YKCwVMMk1gVKpxIsXz9G2bTt9\nh6V31tbWmDbte/z66y8AVGP4evbsiaZNm2r1OizLYvPmzWSMpadne/j4DNLqNQxZucnom2++qY44\nqCrYvHkDkpOTAKjmZ3m/sKxEIlH7PwBMmDABERERyM3NRXJyErZs+RvffTej2mI2RsnJb8iXMiVf\nCdScGpWEXCCHSa7qY+HNm9c0Gf3Pxx8PwMmTxxARcQ9KpRJbt27Fr7/+qtUmgqtXr743pmh2rWqC\noMnIyD169ACHDweR9QkTJsDGxqbc42xsbDBhwgSsW6eacvnQof3o3bsv2rXzKOfI2qugRBUAKM2U\neoxEd4r+XDk5WWW8snZhGAY//DAb48d/BoVCgSdPnuD69evo3r27Vs4vFouxa9cusj5y5Odo3rzq\n05MbE4MdZ0SVTyKRYOnSReTbupeXF3r06FHh43v06AFPT08AqkcES5cuUrt7otQVnQGUZWpodesi\nnwj5+TXrMWRVNWvWXG1W2F27dmnt38uhQ4fIeEoHB8caP6aoJDQZGbGNG9eRMUV8Ph9fffVVpW7r\nGYbBlClTSGWGhIR4bNy4Tiex1gQF7xMAMPKa+fik6M/F59fscS2amDAhAPb2dQAA6enpOHr0aJXP\nmZycjP/++4+sf/31t7CwEJRxRM2klWTEsiwyMzORlJSEN2/elPofpT03blzDoUOFj+fGjx8PR0fH\nSp/H0dFRrY3p0KEg3LhxTRsh1jj16tUny1wRF6iBN0fcvMKGsHr1GugxEsMkEFjiq6+mkvUTJ04g\nLS2tSufcvXs3qYbStq07Pv54QDlH1ExVqnB39uxZ7N27Fw8ePCi3fAjDMKRiAlU1SUlvsHjxArLe\noUMH9OnTR+Pz9enTB2FhYQgNDQUALFmyENu27Ub9+vTDqChbWzvUqeOAtLRUcBQcmGSZQG5bg0oq\nyQHTLFOy6uIi1GMwhsvHZxAOHz6AmJinyM/Px969ezFt2jSNzvX06VPcvl04kHratB9qVaeFojS+\nM1qwYAGmT5+OO3fuQCKRgGXZMv8r6K5IVY1IJMKcOTORk5MNALC3t8fXX39dpT9ghmHw9ddfkzFb\n2dlZmDNnps4H9xkbhmHg7d2RrJu/qVmPscyTzcEoVX9HzZo1h4ODg54jMkwcDgfffDOdrF+5ckWj\naSZYllXrtNCnTz+4udXe0mYaJaOzZ88iKCgIfD4fK1euJCUyHBwc8OTJE1y9ehXLly+Hs7Mz7Ozs\n8M8//1TbwL2aTC6XY9GieXj2TDULromJCWbMmAFra+sqn9va2hozZsyAiYnqZvnZsxgsXDiXFlN9\nT//+A8myeaI5mPwa8i2WBSxeFo4z69dvYBkvptq390aXLqpagSzLYu/evZU+R1hYGKKjowGo/i0X\nffxXG2mUjA4ePAiGYTBz5kz4+vqqfRhyOBzUrVsXfn5+OHLkCBo1aoSpU6fi+fPnWgu6NlIqlVi1\naqlae86kSZO0Wsm5devWmDRpElm/ceMaVq1aSu9qi/D27ghn5+YAAI6cA0GM9huaWU7ZjVHl7deE\neaI5THJUX0T4fD4GDRpSzhHUlCnTyBOJe/fuISYmpthrzM3N1f5fQKlUYv/+/WTdz88fDRo01GG0\nhk+jZFTQ9uPr66u2/f0qDRYWFvjll18gFouxefNmDUOkWJbF2rWrcerUCbJt6NCh6Nu3r9av1bdv\nX/j5+ZH1U6dOYO3a1dVWrdjQcTgcTJo0hazz4/kwTTMt44jKk1uXfTeq7coPHDEHlk8tyfrw4Z/C\nzs5Oq9eoiVq0cEHv3h+T9YMHi1fBHzVqFOzs7DBq1Ci17aGhoeTRnrm5udp0FbWVRskoOzsblpaW\nsLQs/AM2NTUlc28U5e7uDj6fjzt37mgeZS1WkIgOHz5AtvXu3RujR4/W2TXHjBmD3r17k/XDhw/Q\nhFTERx/1IrX8GDCwvm8NRqq9x3VSp7I7AxWtrl1lSsD6vjU4MtVHQf36DfHFFxO1d/4abuLEyeTu\nKDw8HC9evFDb7+vri61bt6p9cWdZFocPHybrQ4eOQJ06tH1Oo2RkZ2dX7IPJxsYGEokE6enpxV6v\nVCqr3P2xNlIqlVi9eplaF+5u3bphypQpOu1xUzD+qOj8OYcOBWH16mX0kR1U78+PP84jBSy5Ui5s\n79kCCu2cX9RcBKljyQlJ6iiFqLmWpp1mAavHVuBl8ACo7vp+/nmh2ngqqmxNmzqjV6/CJxTHjh0r\n95jHjx+TZgsezwyffqq7L5bGRKNkVL9+feTl5SE7O5tsK2i7uH79utprQ0NDIZVKK1Sihiokl8ux\nePECHD9+hGzr2rUrvvvuO3C5ui+KxuVy8d1336Fr18Jq3sePH8HixQtopwYAdes64ZdffgOHo/on\nZJppCpv7NoA2cjUDZLXPQrZbttrmbLdsZLXPArT0PUQQKwA/sTDxTJ78NTw86NxglTVmTGEF71u3\nbiElJaXM1xetyj1w4CB6V/Q/GiUjd3d3AKreIAX69+8PlmWxfPlyBAcHIy4uDufOncPs2apif7qc\npbKmkUolmDdvFs6dCybbPvroI0yfPr1aElEBLpeL6dOn46OPPiLbzp0Lxs8//1jrp6UGgE6dumDa\ntB/IutlbM1g9stLOYFguIGmqXmpG0lSiteKs/Bd8CJ4Vdr4YMOATjB6tm2kRajqhsDXat/cGoHqa\nce7cuVJfm5ycjPDwcACqO+yRIz+vlhiNgUbJaMCAAWBZFidOFDaoDxs2DJ6enkhPT8cPP/wAHx8f\nfPfdd3jz5g3s7Ozw7bffai3omiw3NxczZnyr1muuX79+mDZtWrUmogJcLhfTpk1Tm8Lj+vWrmDFj\nGnJzc6s9HkMzYsSn+PzzsWSd/5qvvYSkI/w4PqyeFs4A3KlTV8ye/XOtHWypDf7+hR0ULly4UOrT\ng5CQENLE0alTFzRpot1pKIyZRsnI29sb4eHhWL58OdnG5XLxzz//4Msvv0TDhg3B5XJha2uLTz75\nBEFBQWjYsHZ3W6yI1NQUTJ06Cffvh5Ntfn5+mDx5MnkcpA8cDgeTJ09W62V3/344pk6dhNTUsh9J\n1Ab/93/fYvDgwtlA+YmGm5D4cXxYPSlMRO7unli8eAWZiJHSTLdu3eHgoCrHlZWVhfv37xd7jUKh\nwJUrV8j6kCHDqi0+Y6DxJ5yFhUWxvvMWFhaYNWsWQkJC8PjxY9y6dQtr1qxB48aNqxxoTffixTNM\nnjwez5/Hkm1jx47F2LFjDeIbK8MwJJ4Cz5/HYvLk8Xjx4pkeI9M/hmEwa9YcDBw4mGzjJ/Jh9dCw\nEhL/pXoiatvWHatXr6UdFrTAxMREbUB00aRT4MmTJ6SDl62tHbp0+bDa4jMGtGq3Abh16zqmTPkS\n7969BVBQbuQbtTsRQ+Hn54dvvvmG3Km9e/cWU6Z8iVu3rpdzZM3G4XAwe/bP6gnpteEkJP5LPqyi\nChNRu3buWLPmr1pZHcLjtXgAACAASURBVFpX+vXzIcvh4eHIz1fvgl+0Bl3fvv1ItRNKRWvJSC6X\nIz1dNUc87W1VMUqlEjt2bMWPP34PkSgPgGoA3Ny5c9GrVy89R1e6Xr16Ye7cueTOWCTKw48/fo8d\nO7bW6q7fXC4XP/30CwYPLvwSYQhtSPw49UTk7u6JNWvWQSCwLOMoqrKaN2+Bxo2bAFDNNfbw4UOy\nj2VZUjYNAHr21LywcU1VpWSUk5ODjRs3YujQofD09ES3bt3QrVs3eHp6YujQodi8eTNycnK0FWuN\nkpaWipkzv8XWrRtJg6aDgwOWLFkCLy/D717r5eWFJUuWkGKaLMti69aNmDnzW6Slpeo5Ov3hcDiY\nNWtusTYkyyeWeklI5gnmxdqIVq+md0S6wDAMPvywcHLLBw8ekOWEhATyiM7KyprOqFwCjZNRWFgY\nfHx8sHbtWkRFRUEul5MK3XK5HFFRUfjjjz/g4+ODe/fuaTNmo8ayLC5eDMEXX4zC3buFt+1ubm5Y\nsWIFnJ2d9RdcJTk7O2PFihVwc3Mj2+7evY0vvhiFixdDam3FBlVCmoNPPikcdW/xygIWzyzKOEr7\neMk81V3Z/7Rrp2ojsrCo3jhqk44dO5HlondGRZe9vTvqpWesodPooWVcXBwmTZoEsVgMW1tbjBo1\nCh07doSTkxMA4N27d7hz5w4OHjyI1NRUBAQE4OjRo0b1QasLb98m488/V+HatcLGTYZh4Ofnh88+\n+8wo/0BtbW0xf/587Nu3j4w+z8rKwvz5P6F79x6YPn0WnJzq6TnK6sfhcPDjj/MgkUhw4YJq3Ill\nrCWUfCUkjXQ/tbtJpgls7tuA+d8IWaGwNVatondEutaunSe4XC4UCgUSExORm5sLS0tLUp0bADw9\n2+sxQsOl0Z3RunXrIBaL4ebmhuDgYHz//ffo1q0bXFxc4OLigq5du+L777/H6dOn4ebmBrFYjMDA\nQG3HbjSkUil2796O0aOHqyUiBwcHzJ8/H2PGjNFJIsrPz8eZM2fUtp05c6ZYw2pVmZiYYOzYsViw\nYAHq1KlDtl+7dgWjRw/H7t3ba+UgWS6Xi19++RUdOhR+W7Z6bAWTDN02XHMkHNjcsyFzEzVs2Ahr\n1vylVkuS0g1zc3O1SQkLyv7Exhb2km3Xzr3a4zIGGiWjW7dugWEYLFmypMzqvra2tliyZAk5prYp\neCQ3ZsxIbNq0HhJJ4Tfijz/+GL///jupZqFtCoUCK1euxJYtW9S2b9myBStXroRCoaVCakW4u7vj\njz/+wMcfF1Yylkgk2LRpPcaMGVkrH92ZmJhgyZKVaNHCBQDAKBnYRNjobh4kVlX4lCtVfbmxsrLG\nmjXrYGdnr5vrUcUIhYXTurx69Qp5eXmkRJCJiQmaNWuhr9AMmkbJKC8vD5aWlhWaS6d169awtLRE\nXl6eJpcyWg8e3MeUKRMxf/5PSEp6TbY3adIEixcvxpQpUyAQ6O6RycmTJxEREVHivoiICLX6WNok\nEAgwZcoULF68GE2aNCHbk5JeY/78n/B///clHj4sPiCwJrOwEGDZsjWwtlbVZ+RKuLB6bFXOURpe\n67kFeOmFhU9/+205GjWi4/yqk4uLC1lOSEhAYmIiWW/atBkdYFwKjZJRgwYNIJVKK/TtWqFQID8/\nH/Xr19fkUkYnPv4V5syZialTAxAZ+Yhst7KyQkBAAFavXg1XV1edx1G0G6km+6vK1dUVq1evRkBA\ngNrjocePH+LrrwMwZ85MxMe/0mkMhqRBg4aYO3cBWTdPNodZkplWr8HN5arVmxs/PkBtmnSqejRu\nXFjiJykpCUlJSUX2NSnpEAoaJiMfHx/IZDKcPn263NeePn0a+fn5+OSTTzS5lNHIzs7Gn3+uxtix\nI3Ht2mWy3cTEBL6+vggMDISPj0+1dVIob2bd6ph5l8vlwsfHB+vXr4evr6/aIL9r1y5j7NiR+PPP\n1WrV32uyDz/8SK3Lt2WUJRi5lh7XsYBVpBVpJ3J1bUPnJdKThg0bkeWUlBS1Kt4NGjTQR0hGQaNk\nNGXKFLi7u2P+/Pk4depUqa87ffo05s+fD09PT0yePFnjIA0Zy7IIDv4Pn38+DIcO7Ve7W+zevTv+\n+usvjBs3rtobj8sbeFydA5MtLS0xbtw4/PXXX+jevTvZrlAocOjQfnz++TAEB/9XK9qTpk79Dvb2\nqk4eXAkX/JfaKcXDS+GBl6Z6PMflcjF79i90hL+eFIy9A4CMjAykphaOu6tb10kfIRkFjf5aN2/e\njM6dO+PFixeYOXMmfv/9d3Ts2BF169YFoOraHRoaitevX8PKygqdOnUqddrxb775RvPo9Sw1NRVL\nly5UGy8EAG3atMG4cePUnh1TgJOTE6ZPn45BgwZh586dZPr6zMxMLFmyEOfPn8HcuQvV/jHXNJaW\nlpg8+WssX/4bAMDipQXEzmKwplVIxCwgiCl8PDdkyDC4uLSsaqiUhszMzGFpaYnc3FwoFAq8efOG\n7LO3r7l/21XFsBp8HW3dujUYhin2TbagoGdp24tiWRYMwyAqKqqyl9eZ/Hw5srLEFXrtgwcRmDdv\nFjIzM8k2BwcHjB8/Hp07d9Z7cVN/f/9yX1N06uPqxrIsbt++jR07dqh9c1T1wFxVoyd5k8vl+OKL\nUaTNLFeYC5FLybO31j1dlyy/G/iuxNfwUniwDVXNOmtmZoYDB47TCdv0bNQoP7x+req4YGtrSz4n\n1q79Gx980EGfoWmVjQ0fPJ527sA1Ooufn5/eP2z16fbtm5gzZwZkMhkAVbIdNGgQPv3002KVzKmS\nMQyDLl26wNPTE/v378epU6fAsiwyMzPx/fdTsWzZGnTq1EXfYeqEalzWBCxZshAAwH/FV00lrmE9\nlKKP+nx9h9FEZAAsLQt7Sxb9wmplpZtelDWBRsmo6DxGtU1CQjx++eUnkohsbW0xffp0tGvXTs+R\nGSc+n48JEybA29sbf/zxB7KyspCfn4+ff56Nf/7ZU2N7H3388QBs3BiItLRUcKVcmCWbQdqg8gOD\nuXlcmKWqeuVxOByMGPGptkOlNFDasA1aAaN0dAqJStq0KRBiseqRioODA5YuXUoTkRa0a9cOy5Yt\nI+1FYrEImzbV3KodJiYmapOr8RM068hgnlB4J96lSzc0aEAnsTQE5uYl/z7p3FGlo8moEqRSKa5f\nv0rWZ86cSerxGTJXV1cEBARUaJCyPjk5OWHmzJlk/caNazW6jNAnn/iSeaF4aTxwRJX856gEzF8X\nJiNfXzpzqKEwMyt5DBmPp92xZTVJlZJRQkICFi9eDB8fH3h5eaFNmzZq+7OzsxEYGIj169eTx1rG\nLDMzg3SJtrS0RMuWht9jydXVFQcPHsSsWbNw6NAhg09ILVu2JI84ZP/f3p2HRVW2fwD/DsMMgiAI\nCijignoGlGQRMBUREUIxd80Wt8SwfpZLmkAKgUruIOjrvkOFmUqJW2muuaCIuKSYaK+Kgohsww7z\n/P7g5eg4ww4Oy/25rq6c52zPnAPc59mLipCZmVHJEY2XkZEx7O3f5T+/HliqQvxCzE/7Y2DQpsm2\nsTVGYrHyWRbEYvFbzknjUeNg9Mcff2DEiBH44Ycf8PDhQ+Tl5Sn0omvVqhUuX76M9evX488//6x1\nZlWtdWt9fioPqVQqNxNvQ9W/f38+zyKRCP3791dxjip29+5dfuookUgEPb3y5z5sCjw83uf/3SKp\nRbXWPGrx5FXwcncfSuOKGhCRSHnQoamAylejYJSYmIj58+cjLy8PH3zwASIiIsqdMHX8+PFgjOH0\n6dO1yWeDIBaLMXCgC/957dq1SEtLU2GOKnf+/Hm+VFpUVIS//vpLxTkqX1paGkJDQ/nPzs6Dm/yb\npKOjEz8gWj1XHaL0qv2xEhQJoPH8VZXPkCFNe4aTxkZZMFJXV+erZYmiGt2Z7du3o6CgAFOnTkVg\nYCDs7OzKneamX79+AOQXl2rMZsyYyfeIef78ORYtWiQ3EWJDc/fuXYwbNw4rV67EuHHjcPfuXVVn\nSaknT55g0aJFeP68dCyNllZLeHn9n4pzVf80NFpg0KBXs5xXtapO45kGP/UPx5nDzIwGWDckIpFi\nKZVKrhWrUTC6dOkSBAIBpk+fXum+bdq0gaamptxkgY1Zu3btERAQxAff58+fw9vbu0GXOO7evYvt\n27c32EB0/vx5eHt784FIKBQiICAI7do1j3m8hg59VarReKYBVGF1D80nr3plvV7VRxoGdXXFEm55\nVXekVI2CUWpqKlq2bFnlaVvEYnGT6MBQpl8/RwQFreIHuObn5yM4OBihoaGQSqUqzl3jIZVKERoa\nipCQEH6tpxYtWuD771ejXz9HFefu7XnnHSt06FA6nkqtWA0aya+q32RCmdz/gdLZuUUZpX/s1NXV\n4eo65C3mllSFsrYhKhlVrEbBSEtLC3l5eVVaQkIqlSI7Oxu6uro1uVSD5ejohA0btsnN0Hv27FnM\nnj0bly9fVmHOGofLly9j9uzZOHv2VVd5E5MO2LBhG/r3H1DBkU2PQCCQK928XurJ6Z6DEo0S5HR/\ntR7Y6x0XHB2doKen93YySqpMWTCizgsVq1Ew6tatG2QyGW7fvl3pvkePHoVMJoOlpWVNLtWgcZw5\ntm+PkGs8zsjIwMqVK7Fy5Uq8fPlShblrmNLS0vj78/o0KUOGDMP27RFyq2Q2J0OGDFM65ijPLA9p\ng9OQZ/a/ORNl8sHIw2PEW88rqZyywNPUO+PUVo3XM2KMITQ0FDKZrNz9EhISsHr1aggEAgwfPrzG\nmWzItLW1sWhRIL7/fjUMDAz49LI3/2PHjlV4j5oLmUyGY8eOYc6cOXIlRwMDA3z//WosWhT41pfZ\naEgMDY3kxhy9Xjp6nThVDGHhq7FFDg7vKt2PqJayQa8UjCpWo2A0YcIESCQSXLhwAVOmTMEff/zB\nDwZNSEjAqVOnEBgYiAkTJiAzMxO2trbw8PCo04w3NE5OzggP34f33x/Jp+Xm5mLr1q3w8/N76z3u\nKquffpv110+ePIGfnx+2bt2K3NxXs1MPHz4K4eH74OTk/Nby0pANG/aqlFPemKPXS0VDhgyjdogG\nSkNDsVeksjTySo1+kkUiEbZt24YvvvgCV65cwdWrV/lto0aN4v/NGIO1tTXWrVvXLGb5btWqFXx8\n/PDee0OxatX3ePz4EYDS3mzz58/Hhx9+iOHDh7+V1V67du1a4aDcrl271nseSkpK8Ntvv2Hv3r1y\nHVhMTTvim2++ha2tXb3noTFxdHSCjk4rZGdnQZgnhOilCEUGr+6boFB+bNGwYU2ztqEpUFYyKm+K\nIFKqxiOw2rZti8jISCxZsgQ2NjZQV1cHYwyMMaipqaFXr14ICAhAREQE9PX16zLPDZ6trR127foJ\nU6Z48oGnqKgI4eHh8PPzQ3Jycr3nwcHBoVbbays5ORl+fn6IiIjgA5FQKMSUKZ7YtesnCkRKiMVi\nuLq685/fHHPU4lkLCFjpS12PHpbo2LHz28weqQZlE6XSJKkVq1UZX11dHePHj8f48eNRUlKCzMxM\nyGQy6OnpNfvqAw0NDXz22Rdwdh6M5cuXICGhdBHBhIQEzJs3D15eXhg4cGC9XX/48OG4desW4uLi\nFLbZ2NjUaxvemTNnsGXLFr67NgBIJBbw9fWnFUgr4e4+FAcP7gMAaCRrINsym39l1Hiq8dp+Tbva\nu7FTFnjKm8mblKqzuSmEQiH09fXRpk0bZGVl4ezZszhx4oRcj6nmqHt3Dps378T06Z/zpaT8/HyE\nhYVh48aNKCwsrJfrCoVCLFiwAF5eXnLpXl5eWLBgQb1UFRYWFmLDhg0ICwvjA5FQKMT06Z9j8+ad\nFIiqoGfPd/jBvmrFahC/KG30VstX46cKUlNTg4uLq8rySCqnqamlkKalpZhGXqlRMLp+/TrmzZuH\nLVu2KGz79ddf4erqihkzZuCrr77CoEGDcOjQoVpntDFTV1fH1KnTsXnzTn5wIwCcOHECfn5+9Ta/\nnVgshru7u1yau7t7vfTqSUtLw6JFi3Dy5Ek+rUOHjti8eSemTp3e7EvKVSUQCODsPJj/rJGiwf9f\ngNIqOhub3mjdunlVfTc2WlrKqukoGFWkRsHot99+w5EjRxS64v73v//FwoULkZubC6FQCLFYjLy8\nPPj6+uLevXt1kuHGzNy8B3bsCIeb26sR8/fv34e3tzcePHigwpzVzoMHD+Dt7Y3ExEQ+zc1tCHbs\nCIe5eY8KjiTKDBjwqvpW/FwMsP/9X8l20jBpaSkOUyhv9VdSqkbBKDY2FgDg4uIilx4ZGYni4mLY\n29vj8uXLuHLlCoYOHYri4mLs2bOn9rltArS0WsLffwnmzJnPV5Wlp6fDz88P169fV3Huqu/69evw\n8/NDeno6gNJquTlz5sPffwktsVxDPXu+g1atSmcsERYIoZ6lDvHLV8Gob9/mM1VSY6WsSo6q6SpW\no2D04sULCIVChVVOz5w5A4FAgFmzZqFly5YQi8X8yp1XrlypfW6bCIFAgHHjPsSaNeugra0DoLQd\nadmyZbh48aKKc1d1Fy9exLJly/j2IW1tHQQHr8e4cR82i6789UUoFMr1NtR6oAVBSen9bN/eRG4K\nKtIwKQs8VDKqWI2CUWZmJlq2bCn3BycjIwMPHjyAtrY27Oxe/SKZmJhAU1PzrXRnbmzs7BywceN2\nGBqWBvXi4mIEBwfj3LlzKs5Z5c6dO4fg4GB+sLORkTE2bdqB3r3tVZyzpsHGpjf/7xbPXnXxtra2\nVUV2SDWpq6srjCuimoKK1SgYaWpqIjs7W64nWFnJx9raWuGtWCQS0aJS5ejSxQwbN25Hx46dAJRO\nmxMWFtagA9K5c+cQFhbGT3PUqVNnbNy4HZ07d1FxzpoOS8teStPfecfqLeeE1FTLlvLtRlRNV7Ea\nRYiuXbuCMYbff/+dTztw4AAEAoHCYMqcnBxkZ2fD0NCwdjltwoyMjLF+/RaYmZXOilAWkBpild3F\nixflApGZWVesW7eZL92RumFm1lVpD0SJpHlOJNsYvRl8qGRUsVpNlOrn54fAwEB8+eWXOHXqFIRC\nocIcdHFxcWCMoVOnTnWS4aZKX98AoaGb0KWLGYDSgBQSEiI31ZKqXb16FSEhIXKBKDR0E/T1DSo5\nklSXSCRCp06d5dLU1NTQqROVPhsLCkbVU6Ng9PHHH8Pe3h55eXmIjIzEiRMnAAAzZ86EiYmJ3L6H\nDx+GQCDAu+/S7MKVad26NUJDN/JVdiUlJVi9ejXi4+NVnDMgPj4eq1ev5tew6tixE9au3YDWrVur\nOGdN15vT/Rgbt6P5zRqRN4MPVdNVrMYTpe7atQuHDh1CfHw8tLW14eTkBHt7+cbroqIiFBQUwMXF\nBYMGDaqTDDd1pSWkjZg58zM8fZqEoqIirFixAn5+frCwsFBJnu7cuYMVK1bwc8y1b2+C0NCNVCKq\nZ28uu96+vUk5e5KGqGwl6DI0N13FajwsXigUYtSoUXKzdL9JJBIhODi4ppdottq2NeQD0vPnKSgo\nKEBQUBD8/f3BcdxbzUtCQgKWLl2KgoICAKXr7oSGbkTbttQGWN+MjIzlPlO7XOPy5lx0NDddxaiL\nWwPVrl17rF27gS995OXlYfHixW91Jot79+5hyZIl/DgiAwMDrF27QeGNndSPNm3avPG5rYpyQmri\nzZIQlYwqRsGoAevYsRNCQzdCT6+0XaYsIN29e7fer33nzh0sXrwYeXmly13r6bXG2rWv2rNI/eva\ntbvcMInu3d9uqZjUzpuTEdP8jBWjYNTAdelihrAwxYB08+bNervmzZs3sWTJErlAFBa2ke/pR96O\nDh1MERi4DO+9NxRffTUXTk7U7tqY0Cwk1UPBqBEwM+uGsLBN/EzNZW1I9THF0pUrVxAUFMS3EbVu\nrY+wsE0wM+tW59cilXNxcYW//xJMmPDJW1khmBBVoWDUSJiZdcX69Vv4jgNFRUVYtWpVnc7UcO7c\nOaxcuZLvNde2rSH+859Xg3EJIaS+UDBqRDp16oz//Gcr38W3pKQEoaGhcjNh1NTx48cRGhrKD2ht\n394EGzZso6WtCakhdXWRqrPQqFAwamRKg8R2vv2GMYbNmzfjt99+K/eYsvEOb457KPPbb79hy5Yt\nYIwBKG2n2rBhO/WaI6QW3NxeLWw5dOj7KsxJ4yAMCAgIUHUmGoqSEhkKCopVnY1KaWlpYfBgN8TF\nXcWLF6kASmdIUFdXR48eiovZiUQiPHr0CGPHjoVEIpHb9ssvvyAiIoL/bGHRA6GhG2klUUJqydDQ\nCHZ2fWBjY4sPP5wIkajplZRatBBBKKybMo2Alb0OExQWFiMzM0/V2aiynBwpvL2/xvXr1/i0iRMn\nYvTo0VU6/sCBA/jhhx/4z9bWtli5MoTm0CKEVImuribE4rrpsk7VdI1Yy5baWL06DHZ2r2ZKj4iI\nqFIb0u+//y4XiOzsHLB6dRgFIkKISlAwauRatGiB5cuD5VYG3bp1K780vDKxsbHYunUr/7l3b3us\nWBFcbpsSIYTUNwpGTUBZQDI3L20vkslkWLt2LZ49e6aw77Nnz7B27Vq+15yFRQ8sW7YGGhoUiAgh\nqtOoglFwcDAkEgkkEgm2b9+u6uw0KFpaWli5MoSfXDM3NxchISH8kg9AaVfwkJAQ5ObmAiidiHPF\nihCa2p4QonKNJhjduHED27Ztoyk2KqCvb4CgoFX8HFiJiYmIjo7mt0dHRyMxMRFA6TxZQUGraBkI\nQkiD0CiCUWFhIXx8fGBgYIDBgwerOjsNmrm5BTw9Z/Cf9+3bh6ysLGRlZWHfvn18uqfn5zA3V836\nSIQQ8qZGEYxCQ0ORmJiIwMBA6OjoqDo7Dd5HH03il6zOy8vD4cOHcfjwYX7i006dOuOjjyaqMIeE\nECKvwQej+Ph47Ny5E++//z5cXFxUnZ1GQV1dHdOmefGfjx07hmPHjvGfp02bQdPZE0IalAYdjAoK\nCuDt7Q1dXV0sXLhQ1dlpVAYOdOEXY5NKpZBKpQBKF2gbOJCWIiCENCwN+vU4JCQEDx8+REhICPT1\n6396GrFYHW3bNp1qQA+PodizZ49CWrt2rVWUI0IIUa7BloyuXbuG3bt3w9XVFR4eHqrOTqPk6OhY\npTRCCFG1Blkyys/Ph6+vL7S1tfHdd9+9tes2trnpKmNiorgyq4mJGVJTs1WQG0JIU9Pk56YLDg7G\nv//+Cx8fHxgaGqo6O42Wrq4eevWy5j9bWdlAV1dPhTkihBDlGuSs3S4uLnj27Bns7OwUtj148AAv\nXryAqakp2rVrh44dOyIoKKhOrtvUSkYAkJWVhb/+OgsA6N/fCa1atVJxjgghTUVdlowaZDUdUDq/\nWkxMTLnbHz9+jMePHyMrK+st5qrxadWqFS3sRQhp8BpkyagiPj4+OHjwIBYsWABPT886PXdTLBkR\nQkh9afJtRoQQQpoXCkaEEEJUjoIRIYQQlWt0bUb1idqMCCGk6uqyzYiC0WtkMobi4pLKdySEEAJ1\ndSHU1OpmjTkKRoQQQlSO2owIIYSoHAUjQgghKkfBiBBCiMpRMCKEEKJyFIwIIYSoHAUjQgghKkfB\niBBCiMpRMCKEEKJyFIwIIYSoHAUjQgghKkfBiBBCiMpRMCKEEKJyFIwIIYSoHAUjQgghKkfBiBBC\niMpRMCKkAZk0aRIkEgkuX76skuu7uLhAIpHgyZMnKrl+XVPF91m3bh0kEgnWrVtXJ+e7fPkyJBIJ\nJk2aVCfna6goGDVyTe2PByGkeaqbxcsJIXVixYoVyMvLQ/v27VWdlSZh165dKCoqgpGR0Vu75ief\nfAIPDw+0bt26Ts7Xq1cvHDlyBJqamnVyvoaKghEhDQgFobrVsWPHt35NfX196Ovr19n5NDU10bVr\n1zo7X0NF1XT17MGDB/D29sagQYNgaWkJGxsbuLi4YObMmTh+/LjC/vHx8Zg7dy6cnJxgaWmJd999\nF59//jmuXr0qt9+BAwcgkUiQlJQEABg8eDAkEgn/35vVdqdPn8b06dPRp08fWFpaYuDAgfD29kZi\nYqLSfKekpGDx4sVwc3PDO++8AysrKzg7O8PT0xN79+6V27eoqAhRUVH4+uuv4e7uDhsbG1hZWcHD\nwwOrVq1CRkZGbW5htSQmJkIikaBv374oKipSuk9xcTEcHR0hkUhw7949Pj03Nxdbt27F2LFjYWtr\ni169emHYsGFYt24dcnJyFM7zettAUlISfH194eTkhB49eiAoKIjf7/Dhw5g8eTIcHBzQs2dP9OnT\nB8OHD0dgYCAePXokd87K2ozOnTuHL7/8Eo6OjrC0tET//v3x4YcfYsuWLcjPz5fblzGGqKgoTJo0\nCfb29njnnXfg6uqKwMBAPHv2rMr39PX7s3HjRowYMQLW1tawtrbGyJEjsWnTJuTl5Sns/3pbR15e\nHkJCQjBkyBD06tULI0eOrNa1a/pcy6vGfv0+X7lyBV5eXujTpw/Mzc1x4sQJfr+cnBysWbMGgwcP\n5n9vFi9ejIyMDPj4+EAikeDAgQNy5y6vzajsd9bHxwdSqRQrVqyAi4sLLC0tMWDAAHz33XdKf1cq\nazNKT09HaGgoRo0aBVtbW1hbW+O9996Dj48Prl27JrdvfHw8VqxYgTFjxqBfv36wtLSEo6MjZs2a\nhevXr5dz998OKhnVo4SEBHz00UfIycmBmZkZBg0aBIFAgJSUFJw/fx75+flwd3fn99+xYwdWrlwJ\nAOjRowesra2RkpKCM2fO4MyZMwgMDMQHH3wAoPSNb/To0Th+/Dhyc3Ph7u4OLS0t/lyv/3vNmjXY\nsmUL1NTU0Lt3bxgZGSEhIQFRUVE4evQowsLC4OzszO///PlzjB07FqmpqTAxMcGAAQMgFouRkpKC\n+Ph4JCUlYcKECfz+aWlp8Pb2hq6uLszMzGBhYQGpVIpbt25h27ZtOH78OH7++ec6fVssT9euXWFl\nZYX4+HicOXMG8QLmSAAAGr5JREFUrq6uCvucP38eqamp6NmzJziOAwAkJyfD09MT9+/fh76+Pmxs\nbCAWi3Hz5k2sX78ef/zxB8LDw6Grq6twvn///RejR4+GWCyGra0tSkpK0KpVKwClf5jWr18PkUgE\nGxsbGBoaIisrC0lJSfjxxx9hZ2dXpbd3xhgCAgIQGRkJALC0tISDgwMyMzORmJiINWvWwMPDAx06\ndOD3nz9/PqKjoyESieDg4ABdXV3cuHEDP/74I44cOYKtW7eiV69eVbqvL1++xJQpU3Dv3j3o6urC\n0dERQOkfypCQEBw9ehS7d++Gnp6ewrEFBQWYNGkSEhMTYW9vD3Nz83IDSnlq+lwrc+zYMURGRqJb\nt27o378/0tPToa5e+mdRKpVi8uTJuH37NrS1teHk5AShUIjDhw/j/Pnz6NatW7W+Q5ns7Gx89NFH\neP78Oezs7MBxHGJjYxEZGYmbN29i7969EIlEVTrX33//DS8vL6SmpkJPTw8ODg7Q0NDA06dPER0d\nDQCwtbXl9w8JCUFMTAy6deuGXr16QSwW4+HDhzh+/DhOnDiBNWvWYOjQoTX6XrXGSL3x8fFhHMex\nTZs2KWyTSqXs2rVr/OfTp08zjuOYo6Mju379uty+V69eZba2tqxnz57swYMHctsGDRrEOI5jjx8/\nVpqHsvNaW1uzmJgYuW1bt25lHMex3r17sxcvXvDp69atYxzHMT8/PyaTyeSOKSgoUDhPdnY2O3ny\nJCssLJRLz8vL4++Bv7+/0vzVh59++olxHMdmzpypdPusWbMYx3EsPDycMcaYTCZjEyZMYBzHscWL\nF7O8vDx+37y8PDZ//nzGcRzz9vaWO09YWBjjOI5xHMd8fHxYQUGB3PaCggLWq1cvZm1trfDcGGPs\n4cOH7NGjR3JpEydOZBzHsUuXLsml79y5k3Ecx/r168fi4uLktslkMnbhwgWWlZXFp0VERPD737t3\nj08vLi5mS5YsYRzHsUGDBinkubyfp7J79vHHH7PMzEw+PSMjg793c+fOlTvm0qVL/P0ZOXIkS01N\nVbgH1VHd51rR9ym7zxzHscjISKXnW7p0KeM4jo0ePZqlpaXx6dnZ2XLH79+/X+64sp+LsLAwufT9\n+/fzx3z22WdMKpXy25KTk9nAgQMZx3Hs119/lTuu7D5OnDhRLl0qlTInJyf+9+v1n1vGGEtLS2NX\nrlyRSztz5ozS53Dy5EnWs2dP5uDgwHJzc5Xej/pG1XT1KC0tDQDg5OSksK1ly5awsbHhP69fvx4A\nsHTpUlhZWcnt27t3b/zf//0fioqKFKrIKrNjxw4AwOTJk2Fvby+3bfr06bC2tkZ2djZ+/vlnpfkW\nCARyx4jFYoXzaGtrw8XFReFtrkWLFvD394e6ujp+//33auW7NoYNGwYNDQ2cPn0a6enpctsyMzPx\n559/QiQS4f333wcAnD17FnFxcbC2tsbChQvRokULue8QGBgIAwMDHDp0CJmZmQrX09PTw8KFCyEW\ni+XSpVIp8vPz0bFjR3Tp0kXhuM6dO8PU1LTS71NcXIxNmzYBAJYtWwZra2u57QKBAH379oWOjg6f\ntnPnTgDA7Nmz0b17dz5dKBRiwYIFaN++PZKSknDs2LFKr5+UlITjx49DTU0NS5Ys4Ut9AKCrq4ul\nS5dCTU0NR48eLbf6z9/fH23atKn0WhWp7nOtiv79+8uV8svk5eXhl19+AQB8++23cqV6bW1tfPfd\ndwq/G1WlpaWFoKAgtGzZkk8zMjLCJ598AgC4ePFilc6zb98+JCcnw8bGBgEBAXI/t0Bp25WdnZ1c\nmpOTk9Ln4OLiAnd3d2RkZKhsWAEFo3pUVgXy3Xff4a+//kJhYaHS/V6+fIkbN25AW1ubr/54U1kA\nqE69bnFxMV9nPHr0aKX7jBkzBgAQExOjkO9Vq1bhxIkTyM3NrdL1/v77b2zfvh2LFy+Gr68vfHx8\nEBgYCJFIhJcvXyr9Q14fdHR04OrqiqKiIhw6dEhu2+HDh1FYWAgXFxe+Suns2bMAgPfeew9qaoq/\nElpaWrC0tERxcTFu3rypsL1fv37Q1tZWSNfX14eJiQnu3r2L5cuXl9s+V5lbt24hPT0dxsbGSl9s\n3pScnIzHjx9DTU1NaduMWCzG8OHDAcg/9/JcvXoVjDFYWVnBzMxMYXu3bt1gZWUFmUyGK1euKGxv\n06aNXFVRTVX3uVaFm5ub0vTbt28jNzcX7dq1U/iDDpR+Z3Nz8+p9gf+xtLRE27ZtFdLL7u3z58+r\ndJ5z584BAMaOHVutwPjy5UscOHAAK1aswMKFC+Hj4wMfHx/8888/AEqrnVWB2ozqkaenJ65evYqL\nFy9i2rRpEIvFsLCwgL29PUaMGAGJRAIAfOOqVCpFjx49Kjzny5cvq3z9jIwMFBYWQk1NrdxeWmVv\n5ikpKXzayJEjcf78eURHR2PmzJkQCoXo3r077O3t4eHhofCHJScnB/Pnz8eff/5ZYX6kUqnSNpf6\nMGbMGBw+fBhRUVGYPHkynx4VFQVAPjg/fvwYALBy5Uq+za48yu5/RT3gVq5ciVmzZmHnzp3YuXMn\n9PX1YWVlhQEDBmDEiBFypZnyPH36FACUlq6UKXuWbdu2hYaGhtJ9lD33ys5X1h6lTIcOHRAXF6f0\nfHXZQ7A6z7Uqystb2feoKO/t27fHnTt3qnU9AGjXrp3S9LIXmvJeWt9U3Z8LAIiMjMTy5cuVdjgp\nI5VKq3y+ukTBqB5pampi165diI+Px7lz53Dt2jXExcUhPj4e27Ztw1dffYUvv/wSMpkMwKs3v4rU\ndOxCdd6c1NTUsGbNGsyYMQOnT5/GtWvXcO3aNYSHhyM8PBxjx47F999/z+8fHByMP//8E926dcO8\nefNgaWmJ1q1b89V2jo6OSE1NBWOsRnmviX79+sHY2Bi3b99GQkICJBIJHjx4gPj4eLRt2xYDBgzg\n9y0pKQEAODg4wMTEpMLzKvvj9Gb1yOvs7Oxw8uRJnDp1CjExMYiLi8Pp06dx6tQprFu3Djt27Kj0\nBaSmalqNVNfnq+j+VFd1nmtd5K2i76ysFF0VNT3uTdV9Hjdu3EBAQADU1dWxYMECDBo0CMbGxtDU\n1IRAIEBwcDA2b978Vn9PX0fB6C2wsrLi24EKCwsRHR0NPz8/rF+/Hh4eHvybkrq6OpYvX15n19XT\n04NYLEZhYSGSkpLQuXNnhX3KSgXKBgVyHMf3SpLJZDhz5gzmzZuH/fv3w8PDg69SLGt3CAkJUejF\nlJubixcvXtTZd6qqsiqqzZs34+DBg/Dx8cHBgwcBAMOHD+d7TAGv3lSHDBnC19vXJU1NTXh4eMDD\nwwNAaTXMsmXLcOTIESxevJjvIVeesgD48OHDKl2v7Fk+f/4chYWFCm1ZQMXPvbzzlR2jTFnpvr4H\nl1bnudaGoaEhgFelD2XKhlWoSrt27ZCYmIiHDx8qrUp80++//w7GGCZNmgRPT0+F7f/973/rI5tV\nRm1Gb5lYLMaYMWNgZWUFxhgSEhJgZGQEjuOQnp5e7cbDstJH2dv969TV1fkqtbJqjDeV/SI7ODhU\neB01NTUMGjQIgwcPBgDcvXuX31bWFqSs+iE6Olplb1plVTaHDh1CYWEhfvvtN7n0MmXtMFVpzK8L\nhoaGmDt3LgD5+1ienj17onXr1khOTubbCSpibGwMU1NTyGQy/PrrrwrbX29zqey5A6WlO4FAgPj4\neKUBMTExEfHx8VBTU1Po3FIfqvpca8PS0hKampp4+vQp4uLiFLYnJiZW6dnVp7JS4P79+6v0O1b2\ne2psbKyw7eXLl7hw4ULdZrCaKBjVox9++AEPHjxQSH/8+DHu378PAHy10OzZswEA33zzDc6fP69w\nTElJCS5evKjQgaHsDa68xvFPP/0UALB7927ExsbKbdu5cyfi4uKgo6OD8ePH8+lRUVG4ffu2wrnS\n09P5679eXVVWZ/3jjz/K7X/z5k2sWbNGab7ehi5dusDGxgYvXrzAypUrkZycrHQMiqurK3r27ImY\nmBj4+/srHXiYmpoq1+OwKpKSkrBv3z6ldfBl7WtVaU8RiUSYMWMGAMDX1xc3btyQ284Yw6VLl5Cd\nnc2nlT330NBQuZ+NkpISrFq1Ck+fPoWJiQmGDBlS6fVNTEzw3nvvQSaTwd/fX+46WVlZ8Pf3h0wm\nw9ChQ8ttD6lLVX2utaGpqYmxY8cCKO3h+nrvPalUisWLF/PV66oybtw4GBoaIi4uDkuWLEFBQYHc\n9pcvX8oNli/rIPHrr7/KDeKWSqX49ttvkZWV9XYyXg6qpqtHP//8MxYvXgxTU1N0794dWlpaePHi\nBWJjY1FUVIRhw4bxPddcXV3h4+ODVatWwdPTE507d0aXLl3QsmVLpKam4s6dO8jKykJAQIBc1143\nNzfExMRg/vz5cHR05BvE58+fj9atW8PZ2RmfffYZtm7diokTJ8LOzg6Ghoa4d+8e7t27Bw0NDaxa\ntUquu+fvv/8Ob29vGBkZwcLCAjo6OsjIyEBsbCxyc3NhZ2cn1wtp5syZmD17NoKDg3HkyBF07doV\nz58/R2xsLDw8PBAXF6eyKo0xY8YgLi4O4eHh/Oc3qampYcOGDfjss8+wd+9eREdHw9zcHO3atUNB\nQQH+/fdf3L9/HwYGBvyg46rIysrCokWLEBgYCAsLC3To0AEymQyJiYn4559/IBKJ8M0331TpXFOn\nTkViYiL27duHDz74AJaWlujUqRMyMjKQmJiIZ8+e4eTJk/zz//jjj3Ht2jVER0dj5MiR6NOnDz/o\n9fHjx9DV1cXatWuVVuEpExAQgIcPHyImJgaurq58iery5cvIzMyEubk5/P39q3xvaqsqz7W25s6d\ni9jYWNy6dQtubm7o06cPhEIhYmJioKOjAxcXF747uSpoa2tjw4YNmDFjBn744QccPnwYtra2/KDX\nv//+G++//z5fhTdmzBjs3r0bt2/fhqurK3r37g3GGK5evQqRSISxY8di//79KvkuAAWjejVnzhyc\nOnUKN27cQFxcHKRSKdq0aQMHBweMHz9ebvYFoPRttm/fvggPD0dMTAwuXLgAoVAIQ0ND2NnZwcXF\nRaEr6sSJEyGVSnHo0CGcOnWK74nzxRdf8J0d5s+fj969eyMiIgK3bt1CXFwc9PX1MXLkSHh5eSmM\nJJ82bRpMTEwQFxeHW7duITMzE61bt0aPHj0wevRojBgxQu4XcMiQIdizZw/+85//ICEhAY8ePUKn\nTp3w7bff4pNPPqm0U0Z98vDwQFBQEPLz8yscg2JsbIxffvkFv/zyC44ePYp79+7hxo0b0NPTg6Gh\nIT799NNyuwGXx9TUFL6+voiJicH9+/dx//59CAQCGBkZYcKECZg8eXKVR/ELBAIsXboUgwcPRmRk\nJG7cuIG7d+9CT08PHTt2xMSJE+W6CwsEAqxevRoDBgzAvn37EB8fj/z8fBgaGuKjjz7CjBkzqlWK\n0dfXR2RkJHbv3o2jR4/y3eE7deqEadOmYfLkyXKzftS3qj7X2tDW1kZERAQ2btyIo0eP4syZM9DX\n14e7uztmz56Nr7/+GkDNOxXVhXfeeQeHDh3Crl27cOrUKVy4cAFqamowNDTE8OHD5cZQ6erqYv/+\n/QgNDcVff/2F06dPw8DAAG5ubpg1a1a1xzDWNQFTVYU+IYQ0UtnZ2XB1dUVmZiYuXLjwVqa6auqo\nzYgQQspx69Ythbah9PR0+Pr6IiMjA87OzhSI6giVjAghpBxOTk4oKSlB9+7doa+vj9TUVPz999+Q\nSqUwNjbGjz/+WOnYNFI1FIwIIaQcu3btwsmTJ/Hw4UNkZGRAXV0dHTp0gLOzM6ZNm0alojpEwYgQ\nQojKUZsRIYQQlaNgRAghROUoGBFCCFE5CkaENEESiQQSiYSfwJSQho6CESGEEJWj6YAIaYLKJq9V\n1bxphFQXde0mhBCiclRNRwghROWomo40W4WFhfjpp59w9OhR3L9/H3l5edDV1UWbNm3Qu3dvjBgx\nAjY2NgCAAwcOwNfXFw4ODggPD8fBgwfx008/8TNxW1pawtPTk1+orzx//vkn9u3bhxs3biAzMxM6\nOjqwsrLCJ598UuGS2UVFRThw4ACOHDmChIQESKVStG3bFl26dIG7uzuGDx8uN2u2RCIBAJw8eRId\nOnRQOF9OTg7Cw8Pxxx9/4N9//0VhYSHatWsHJycneHp6Kp3RWyaTISoqCgcPHsS9e/cglUqho6MD\nAwMD9OrVC0OHDq30+xNSHqqmI81ScXExPv30U8TExAAoXXJBR0cHOTk5/Kq5Hh4eCAkJASAfjCws\nLLB7926oqalBW1sb2dnZ/EqbCxYsULqkc1FREXx9ffkVVoHSJQpeX3hv+vTpStc3SklJwYwZM3Dn\nzh0ApesvtWrVCjk5OSgqKgIA7NmzB3369OGPqSgYJSYm4rPPPuPXmFJXV4dYLEZubi6A0qUGNm7c\niN69e8sdN2/ePERHR/OfdXR0kJ+fz+fBysqq2gsQEsJjhDRDBw8eZBzHMSsrKxYVFcXy8/MZY4wV\nFxezpKQkFhERwTZt2sTvv3//fsZxHLO1tWUcx7FVq1axrKwsxhhjKSkpbN68eYzjOCaRSNiVK1cU\nrhcUFMQ4jmNubm7syJEjLCcnhzHGWHZ2Nvvhhx+YjY0N4ziOHTp0SO64goICNmrUKMZxHOvTpw87\nePAgf2xxcTG7desWCwoKYtevX5c7juM4xnEce/z4sVx6VlYWGzRoEOM4js2aNYvduXOHFRcXM8YY\ne/ToEfv6668Zx3GsX79+LDMzkz8uJiaGcRzHLCws2M6dO1l2djZjjDGZTMZSUlLYgQMH2PLly6v/\nIAj5HwpGpFn67rvvGMdxzN/fv0r7lwUjjuPYwoULFbbLZDI2adIkxnEcmzJlity2hw8fMolEwt59\n91329OlTpeePjo5mHMexYcOGyaVHREQwjuOYpaUlu3PnTtW+HCs/GAUHBzOO49jXX39d7rGenp6M\n4zi2bds2Pm3Lli2M4zjm6elZ5TwQUh3UgYE0S9ra2gCA1NTUah87Y8YMhTSBQMCnX7p0CRkZGfy2\nqKgoMMbg4eFR7uqq7u7uEIvF+Oeff/D8+XM+/ddffwVQumS0ubl5tfP6pqioKAClqwqXp2zV1AsX\nLvBpZffr5cuXCuv7EFIXqAMDaZacnJywdetWnDx5Ep9//jnGjBkDe3v7SpeQbt++PUxNTZVu6927\nN4RCIUpKSnDnzh307dsXABAXFwcAOHjwII4dO1buuYuLiwEAycnJMDQ0RFFREW7fvg0AGDhwYLW/\n45uePXuG5ORkAICXlxcEAoHS/cragJ49e8an9e3bFyKRCLdv38akSZPwwQcf4N1334WRkVGt80UI\nQMGINFMODg6YNWsWNmzYgFOnTuHUqVMAADMzMzg7O2PChAno3LmzwnEV/fFt0aIFWrVqhfT0dKSn\np/PpZaWvnJwc5OTkVJq3vLw8AEBmZiYfoNq3b1/l71ae10uBaWlple6fn5/P/7tz584ICAjAkiVL\ncPXqVVy9ehUAYGJiggEDBmDChAno0aNHrfNImi8KRqTZmjlzJkaMGIGjR4/i8uXLuH79Oh48eIAH\nDx5gz549CAoKwqhRo2p9nbJqLV9fX0ydOrXW56ttPgDgypUraNWqVbWOHzduHJydnXH48GFcvnwZ\nsbGxSEpKQmRkJPbu3Ys5c+bg888/r+tsk2aC2oxIs2ZqagovLy9s374dMTEx2LNnD+zt7VFcXIzA\nwECFEsTr7TlvKigoQFZWFgDIVfe1adMGgHy1V1Xo6upCXb30fbGsG3ZtGBgY8P9++vRpjc7Rpk0b\nTJkyBRs2bMClS5ewb98+uLm5gTGG0NBQ3L17t9b5JM0TBSNC/kcoFKJPnz7YtGkTRCIRcnNzcevW\nLbl9kpKSyp0JOzY2FiUlJRAIBLCwsODTra2tAQDnzp2rVn5EIhF69uwJADhz5ky1jlXG1NSUD4xn\nz56t9fkEAgF69eqF0NBQGBsbQyaTITY2ttbnJc0TBSPSLBUWFpa7TSwWQ01Nrdz9tmzZopDGGOPT\n+/btCz09PX7bqFGjIBAIkJiYiMjIyArzlZmZKfd55MiRAEo7P9RFqWP06NEAgB07diAlJaXc/Rhj\nfCkPqPh+CYVCvgRX1vmBkOqiYESaJW9vb/j6+uLcuXNysyA8efIE3t7eKCgoQIsWLRRmIdDW1sbe\nvXsRHByM7OxsAKUdA7y9vXHx4kUIBALMnDlT7phu3brxbUWBgYFYs2YN36sNAKRSKc6fP4/58+dj\n9uzZcseOHz8eFhYWKCwsxNSpUxEVFcV3cCgpKcHNmzexaNEixMfHV+l7e3l5wdTUFOnp6fjwww9x\n5MgRuY4KT58+xd69ezF69GicOHGCTw8JCcGsWbNw4sQJuW7rL168wNKlS/HkyRMIBAL069evSvkg\n5E3UgYE0SwUFBThy5AgOHDjATwVUVFTE/6EXCoUIDAyEvr6+3HE9evSAhYUFNm/ejG3btkFbWxtZ\nWVn8dEDffPMN7OzsFK73zTffID8/Hz/99BO2bNmCLVu2QFtbGwKBAFKplD/ewcFB7jixWIyNGzfC\ny8sL9+7dg7e3N7799lt+6qKyksjw4cOr9L1btWqF7du344svvkBiYiLmzp0LoVDIT+3zemB6vet3\ncXExjh8/juPHjwMoDcqMMbnegXPmzAHHcVXKByFvEgYEBASoOhOEvG3m5uZo3749hEIhGGPIzs5G\nSUkJTExMMHjwYCxbtgyOjo78/nfu3MHJkydhYmKCkJAQmJiYICUlBWlpaRCJRLC1tUVAQABfDfYm\nNTU1ODs7o1+/figqKoJUKuWvaWxsDHt7e0yaNAmzZs2Cpqam3LE6OjoYN24cDAwMkJOTg+zsbOTl\n5cHQ0BBWVlbw8vLCgAED5NYuWr9+PQBgypQpCr3m9PT0MH78eBgaGiI/Px9SqRRSqRQikQhmZmZw\ndXXF7Nmz4ebmxldXdu3aFaamphCJRHwQKiwshJGREZycnBAQEIARI0bUybMhzRNNlEpIFbw5azch\npG5RmxEhhBCVo2BECCFE5SgYEUIIUTkKRoQQQlSOOjAQQghROSoZEUIIUTkKRoQQQlSOghEhhBCV\no2BECCFE5SgYEUIIUTkKRoQQQlTu/wGFJfcsMTqqkQAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IAhB4XF_ovIL",
"colab_type": "text"
},
"source": [
"You can again finetune these parameters using the function ```set``` or providing a dictionary.\n",
"\n",
"### Multiple figures\n",
"\n",
"Seaborn returns a matplotlib \"axis\". We can manipulate these axis and change multiple properties. The list is exhaustive, it is much better to just experiment with them.\n",
"\n",
"For example, let's plot the violin plots for the whole dataset, in a square plot. Seaborn provides a grid plot, which will try to create a list of the different elements and plot to each one. See the [axis grid tutorial](https://seaborn.pydata.org/tutorial/axis_grids.html) for more details. However, the more detailed control comes from pyplot. The following plot will create a plot per axis, for each variable."
]
},
{
"cell_type": "code",
"metadata": {
"id": "C3_yugocpPDQ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 617
},
"outputId": "7f28e05f-2b41-41f2-c634-b3e81629ad72"
},
"source": [
"sns.set_context(\"notebook\")\n",
"sns.set_style(\"dark\")\n",
"\n",
"# Subplots, in a square shape\n",
"fig, axs = plt.subplots(nrows = 2, ncols = 2, figsize=(10,10))\n",
"sns.violinplot( x=df[\"species\"], y=df[\"sepal_length\"], palette=\"Blues\", ax=axs[0,0])\n",
"sns.violinplot( x=df[\"species\"], y=df[\"sepal_width\"], palette=\"Blues\", ax=axs[0,1])\n",
"sns.violinplot( x=df[\"species\"], y=df[\"petal_length\"], palette=\"Blues\", ax=axs[1,0])\n",
"sns.violinplot( x=df[\"species\"], y=df[\"petal_width\"], palette=\"Blues\", ax=axs[1,1])\n",
"\n",
"plt.show()\n"
],
"execution_count": 34,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n8tRTT9G7d28WLVrEqlWreO2116isrMTGxob33nsPgB07dhAVFYWFhQUajaZqUuP8+fNZunQpERER\n9x2S/TNq0qQJQUFBbNmyhZ9++gmAmTNn8uGHHzJ+/Hg0Gg0ajYY5c+bg6Oh4x/nV9Xnbtm2rEheA\ng4MDy5cv59VXX6162mbFihW4uLjctb9/z9nZmddee41p06YBN69mly1bVgu9UfOq69/7WblyJQsX\nLmTTpk04Ozvj7OxM8+bNHzmGmTNnsmbNGsaOHYuFhQX29vasX7+e2bNn8/e//51///vfdOnSBT8/\nv0duQ9QMyWEPR/JX7ZL89fBkaQsh6onr16/TtGlTNBoNOTk5PPfcc+zcuZMWLVqYOjQhhLinhp6/\nZGRMiHri6NGjrFq1ilvXV8uXL28wiUwIUbc19PwlI2NCCCGEECYkE/iFEEIIIUxIijEhhBBCCBOS\nYkwIIYQQwoSkGBN1ko+PD6dOnTJ1GEII8dAkf4k/kgn8QgghhBAmJCNjQgghhBAmJMWYqDGbNm1i\nwIAB+Pj4EBwcTGJiIhEREcydO5dXXnkFHx8fQkNDb9uU9fz587z88sv4+/sTGBjIF198UfWaXq9n\n48aNDB06FB8fH8aNG8e5c+cAcHFxqdp+RafTsXLlSgYPHky/fv1YvHhx1ZYmxcXFzJo1C19fX3r3\n7s3kyZMxGAxG7BUhRF0g+UuYlBKiBuTm5qqBAweqoqIipZRSp06dUgUFBWr9+vXK3d1d7dixQ+l0\nOvXJJ5+oIUOGKJ1Op/R6vQoNDVURERGqoqJCFRYWqsDAQBUfH6+UUurjjz9Wo0aNUrm5ucpgMKiM\njAxVXFyslFLK2dlZ5efnK6WUeuedd9SsWbPUlStXVElJiZo1a5ZavXq1Ukqp1atXqzfffFPpdDql\n0+lUUlKSMhgMJughIcSfleQvYWoyMiZqhFarRafTkZuby40bN+jUqRN2dnYAdO/enZCQECwsLJg6\ndSo6nY5jx46RmppKcXExc+bMwdLSks6dOzNx4kRiYmIAiIyMZN68eXTt2hWNRoOrqyutWrW6rV2l\nFJs3b2bhwoW0bNkSKysrZs2axQ8//ACAubk5Fy9e5OzZs1hYWODr63vfTWuFEA2L5C9harIdkqgR\n9vb2LFy4kIiICHJycujfvz/h4eEAtGvXruo4MzMz2rZty4ULFwC4cOECvr6+Va/r9fqqr4uKiqoS\n4t0UFxdTVlbGuHHjqr6nlKoayp8+fToffvhh1Wa7YWFhzJw5swY+sRCivpD8JUxNijFRY0aPHs3o\n0aMpLS1l8eLFrF69Gjs7O4qKiqqOMRgMnD9/HltbW7RaLZ06dSI2Nrba92vXrh2FhYU4Ozvftc1W\nrVrRuHFjfvjhB9q2bXvH61ZWVoSHhxMeHk52djYvvPACnp6e9O3b9/E/sBCi3pD8JUxJblOKGnHy\n5EkSExPR6XRYWlrSqFEjzMxu/nodP36c2NhYKisr+fzzz7G0tKRHjx54eXnRrFkzNm3aRHl5OXq9\nnuzsbFJSUgCYMGECH3zwAfn5+SilyMzM5MqVK7e1a2ZmxoQJE3j33Xe5fPkycHNS7b59+wDYs2cP\nBQUFKKVo3rw5Wq1WhvmFELeR/CVMTYoxUSN0Oh1r1qyhT58+9O/fn+LiYv76178CEBQURExMDH5+\nfmzfvp2IiAgsLCzQarVs3LiRzMxMgoKC8Pf3Z9GiRZSWlgIwdepURowYwbRp0+jZsydvvPEGFRUV\nd7T9t7/9DXt7eyZOnEjPnj158cUXycvLA6CgoICpU6fi4+NDWFgYzzzzDP7+/sbrGCHEn57kL2Fq\nsuirqFUREREUFBSwevVqU4cihBAPRfKXMBYZGRNCCCGEMCEpxoQQQgghTEhuUwohhBBCmJCMjAkh\nhBBCmJAUY0IIIYQQJiTFmBBCCCGECUkxJoQQQghhQlKMCSGEEEKYkBRjQgghhBAm9P8BDXHuoelf\ncF0AAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uwjD74iOsC34",
"colab_type": "text"
},
"source": [
"### Two dimensional plots.\n",
"\n",
"A final plot we'll see is the kernel density estimator, which allows visualizing densities. A simple one will plot two variables for all classes."
]
},
{
"cell_type": "code",
"metadata": {
"id": "pOrgSm_nsQYz",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 437
},
"outputId": "a8524109-fc35-4779-978c-c3951bdebbda"
},
"source": [
"sns.jointplot(x=\"sepal_length\", y=\"sepal_width\", data=df, kind=\"kde\");\n"
],
"execution_count": 35,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DKamg3xgscDC",
"colab_type": "text"
},
"source": [
"A much more sophisticated plot can use the KDE density estimator, for all variables at once. It requires a ```pairgrid```."
]
},
{
"cell_type": "code",
"metadata": {
"id": "lOTWnd0bskJb",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 725
},
"outputId": "fa0b9361-cb90-4978-b18f-22fc10f489ab"
},
"source": [
"sns.set_style(\"white\")\n",
"\n",
"# Define a grid for each element in the dataframe.\n",
"g = sns.PairGrid(df)\n",
"\n",
"# Apply seaborn function kdeplot for each level for the diagonal.\n",
"g.map_diag(sns.kdeplot)\n",
"\n",
"# Apply function off the diagonal\n",
"g.map_offdiag(sns.kdeplot, n_levels=6);"
],
"execution_count": 37,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\niJv3n1C2ROGkX49/9OTpM4aPn4JjsSIsXzAT3b9ICC2+nWVrNuLj94bt61ck6wXw8vVn2eZdNKxZ\nmUY1Exdx2HPyMscv32HUL22oWroIr3wD6TpjA+YmRuyY0hs7S3OeegUyaOVR3P3f0bxiIQY1rZis\njSmKwoFrLkz+7Sw9lxxg/4ROZM5kSJcGFVm8+ww+ge/IbmVB8fwO3HV5ASQu7WiVxRy/gORvGLS0\ntL5osqIQQnyv1Go1w8ZN5cSZ84wa1Je+v/yctC/sfQTDZ/7KhRv3aVKrEjNH9sUkk1Hi5+yF28ze\ndIh34RG0q1uREZ2aYGmeOdm1g8IiOH3XjdN33bj57DVx8QkAmGYywDSTAVGx8QSHRTJ/93nWjWhP\n9eJ5/rKuiqLwqTg26F0IFqaZU2wPDn4LQNYsfx04p6a/jUTKlSsHwM2bNzE0NPzmFcpoNBoNI8ZN\nxe3FKzYsX0Thgom/xDy8/egydCJGhgbsXD6LbNZWjF60if1nrtKlWW0m9OnA5t+vMWvrCQrlsmWN\n089o6+jSYe4ubrv5UKVILqZ0rkMe279vTJZmxqwb3JLm07YxeuNJLs3vhb6uDlUdE2c43n32mmJ5\nEgPuP48m8A96y0tPb9o2rpPiuqFhYfQbNhoLc3NWL5n7r1auE/+di6sb67Zsp22LplQoWzrZvjkr\nN6Gjrc3EIb0A8At8y8y1u6hYoiB92jYkLCKKHrM3o6ujzfbJvbCzNOfcw1cMXHmEzEb67BjdnoqF\ncqYoU6VS0bpKUTJnMqD30oMsOnCVse1r0LSKI4t3n+HsXVe6NapMfns7Tl69l3SeqYkx4e8jkl0r\nLi7uk8tKCiFERqDRaBg9ZRYnzpxn7LCB9OzSIWmfh88beo6Zjc+bQKYM6cHPLRugUqnw9Ati3Iqd\n3HjynJIF7Nk0uR/F8n78LI6Ji+fUXTf2XX7EdRdPNIqCvY0FP9cuQ+WiDpTIkw0Lk49LqfsEh9J7\n0V76L93HiVm9yGX96dghPCKK4ND35LJJuWDTs1evKZwv5YI7Lz1eA5A7V8rvirTyxd1sa9eu/eR2\nPT09bGxsqFq1qqw69gmrNmzhzIVLTHAaRrXKFQAIDgml+/DJKChsWzIdOxsrRi3YwMFz1xncuTmD\nOjZl1tYTbDx+lQYVirJoUHvuvfRj8KpjxKnVzOvRgDZViqJSqYiIiefkw9dcdvXlVUAYCYpCdgtj\n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\nzIM0t0IIIYQQosiQ5jYflixZQtOmTfH09KRly5bs27eP3NxclixZQvPmzfHz82PYsGFcv34d+Odr\n1DVr1uDv74+/vz/Lly83Le/o0aN07doVb29v/P39CQsLIysr65Ey7ty5k/bt2+Pt7U23bt2IjIw0\nTQsKCmL58uW0bdsWLy8vhg8fTmZmpmn60qVLTTnXrl1r+op3zZo1/PDDDyxfvhxPT08GDhxomufk\nyZP3XJ7QhrnVaXR0NN7e3uTm5gIwbtw4GjdubJo+atQoVq5cCeQ9GpuTk8P06dPx8/MjODiY3bt3\nm+aZPXs2v//+O2FhYXh6ehIWFmaa9uuvvxISEoK3tzeTJk1C7k9jHoKCgli8eDGtW7fGx8eHsWPH\nmrYX99pujRo1itjYWAYOHIinpydLly4Fbt3V8Pnnn8fLy4sePXpw5syZR8qWkJDA0KFDadSoEUFB\nQaxatco0bd68eQwbNox3330XT09PQkNDOXbsmGn68ePH6dChA56enrz11lsMHz6c2bNnk56eTr9+\n/UhMTMTT0xNPT08SEhIAyM7OvufyhPbMqVZ79uzJ1q1bATh06BDu7u7s2rULgH379tG+fXvgzqOx\ne/fupVWrVnh5eREWFmbaDkZFRTFx4kQOHz6Mp6cn3t7epnmSk5Pp378/np6edO7cmYsXLxbgr2dm\nlLivqKgo9cILL6j4+HillFLR0dHqwoULauXKlapz584qLi5OZWZmqvHjx6sRI0aYnuPm5qZGjBih\n0tLSVGRkpPLz81N79+5VSil17Ngx9eeff6rs7GwVHR2tWrVqpVasWGFap5ubmzp//vx9c40ePVrN\nmjVLKaXU8ePHVaNGjdThw4eV0WhU4eHhKjAwUGVmZiqllAoMDFQvvfSSio+PV0lJSapVq1bq66+/\nVkoptXv3btWkSRN1+vRplZ6ert5+++086799PX+73/KENsy1TgMCAtSxY8eUUkqFhISooKAgdfbs\nWdO048ePK6WU6tmzp/r222+VUkp9/fXXqmXLlio2NlYlJSWpnj17Kjc3N5WdnX3Hc2/P0r9/f3Xj\nxg116dIl5efnp3bv3v0of1LxmAQGBqrQ0FDT+9m1a1c1a9asfG23/q7Fv61du1alpKSozMxMNWXK\nFNWuXTvTtLttq/7tt99+U02bNlVKKZWTk6M6duyo5s2bpzIzM9XFixdVUFCQ+uWXX5RSSs2dO1fV\n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\ngg==\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GPH1YAvDQSb3",
"colab_type": "text"
},
"source": [
"This is just a taster of the many plots you can create. We can create many plots using matplotlib, seaborn and all the subpackages available. Go through the [Python Plot Gallery](https://python-graph-gallery.com/) to get inspired!\n",
"\n",
"## Plot.ly\n",
"\n",
"Plot.ly is a commercial package with an open source component aimed at supporting professional interactive dashboarbs. It is a very powerful package, thus it is a bit more complicated to use than\n",
"Matplotlib.\n",
"\n",
"First, in order to use the package, we need to import a few lines of code which will tell colab what does it need in order to render the plot correctly. We'll define a function which will simply tell colab \"this is how you plot this\"."
]
},
{
"cell_type": "code",
"metadata": {
"id": "Mtm1-AGkQnlu",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/static/components/requirejs/require.js": {
"data": "LyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjEuMjIgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS4KICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcyBmb3IgZGV0YWlscwogKi8KLy9Ob3QgdXNpbmcgc3RyaWN0OiB1bmV2ZW4gc3RyaWN0IHN1cHBvcnQgaW4gYnJvd3NlcnMsICMzOTIsIGFuZCBjYXVzZXMKLy9wcm9ibGVtcyB3aXRoIHJlcXVpcmVqcy5leGVjKCkvdHJhbnNwaWxlciBwbHVnaW5zIHRoYXQgbWF5IG5vdCBiZSBzdHJpY3QuCi8qanNsaW50IHJlZ2V4cDogdHJ1ZSwgbm9tZW46IHRydWUsIHNsb3BweTogdHJ1ZSAqLwovKmdsb2JhbCB3aW5kb3csIG5hdmlnYXRvciwgZG9jdW1lbnQsIGltcG9ydFNjcmlwdHMsIHNldFRpbWVvdXQsIG9wZXJhICovCgp2YXIgcmVxdWlyZWpzLCByZXF1aXJlLCBkZWZpbmU7CihmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICB2YXIgcmVxLCBzLCBoZWFkLCBiYXNlRWxlbWVudCwgZGF0YU1haW4sIHNyYywKICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCwgY3VycmVudGx5QWRkaW5nU2NyaXB0LCBtYWluU2NyaXB0LCBzdWJQYXRoLAogICAgICAgIHZlcnNpb24gPSAnMi4xLjIyJywKICAgICAgICBjb21tZW50UmVnRXhwID0gLyhcL1wqKFtcc1xTXSo/KVwqXC98KFteOl18XilcL1wvKC4qKSQpL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgYXAgPSBBcnJheS5wcm90b3R5cGUsCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaXQpIHsKICAgICAgICByZXR1cm4gb3N0cmluZy5jYWxsKGl0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0FycmF5KGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEFycmF5XSc7CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5LiBJZiB0aGUgZnVuYyByZXR1cm5zCiAgICAgKiBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoKGFyeSwgZnVuYykgewogICAgICAgIGlmIChhcnkpIHsKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgYmFja3dhcmRzLiBJZiB0aGUgZnVuYwogICAgICogcmV0dXJucyBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoUmV2ZXJzZShhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSBhcnkubGVuZ3RoIC0gMTsgaSA+IC0xOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYXNQcm9wKG9iaiwgcHJvcCkgewogICAgICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIHByb3ApOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE93bihvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzUHJvcChvYmosIHByb3ApICYmIG9ialtwcm9wXTsKICAgIH0KCiAgICAvKioKICAgICAqIEN5Y2xlcyBvdmVyIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0IGFuZCBjYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoCiAgICAgKiBwcm9wZXJ0eSB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWUsIHRoZW4gdGhlCiAgICAgKiBpdGVyYXRpb24gaXMgc3RvcHBlZC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFByb3Aob2JqLCBmdW5jKSB7CiAgICAgICAgdmFyIHByb3A7CiAgICAgICAgZm9yIChwcm9wIGluIG9iaikgewogICAgICAgICAgICBpZiAoaGFzUHJvcChvYmosIHByb3ApKSB7CiAgICAgICAgICAgICAgICBpZiAoZnVuYyhvYmpbcHJvcF0sIHByb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8gbWl4IGluIHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgaW50byB0YXJnZXQsCiAgICAgKiBidXQgb25seSBpZiB0YXJnZXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCBzb3VyY2UsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pIHsKICAgICAgICBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIGVhY2hQcm9wKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9yY2UgfHwgIWhhc1Byb3AodGFyZ2V0LCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZWVwU3RyaW5nTWl4aW4gJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNBcnJheSh2YWx1ZSkgJiYgIWlzRnVuY3Rpb24odmFsdWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4odGFyZ2V0W3Byb3BdLCB2YWx1ZSwgZm9yY2UsIGRlZXBTdHJpbmdNaXhpbik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICAvL1NpbWlsYXIgdG8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIGJ1dCB0aGUgJ3RoaXMnIG9iamVjdCBpcyBzcGVjaWZpZWQKICAgIC8vZmlyc3QsIHNpbmNlIGl0IGlzIGVhc2llciB0byByZWFkL2ZpZ3VyZSBvdXQgd2hhdCAndGhpcycgd2lsbCBiZS4KICAgIGZ1bmN0aW9uIGJpbmQob2JqLCBmbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShvYmosIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY3JpcHRzKCkgewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IoZXJyKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgfQoKICAgIC8vQWxsb3cgZ2V0dGluZyBhIGdsb2JhbCB0aGF0IGlzIGV4cHJlc3NlZCBpbgogICAgLy9kb3Qgbm90YXRpb24sIGxpa2UgJ2EuYi5jJy4KICAgIGZ1bmN0aW9uIGdldEdsb2JhbCh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICB2YXIgZyA9IGdsb2JhbDsKICAgICAgICBlYWNoKHZhbHVlLnNwbGl0KCcuJyksIGZ1bmN0aW9uIChwYXJ0KSB7CiAgICAgICAgICAgIGcgPSBnW3BhcnRdOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBlcnJvciB3aXRoIGEgcG9pbnRlciB0byBhbiBVUkwgd2l0aCBtb3JlIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIHRoZSBlcnJvciBJRCB0aGF0IG1hcHMgdG8gYW4gSUQgb24gYSB3ZWIgcGFnZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGh1bWFuIHJlYWRhYmxlIGVycm9yLgogICAgICogQHBhcmFtIHtFcnJvcn0gW2Vycl0gdGhlIG9yaWdpbmFsIGVycm9yLCBpZiB0aGVyZSBpcyBvbmUuCiAgICAgKgogICAgICogQHJldHVybnMge0Vycm9yfQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRXJyb3IoaWQsIG1zZywgZXJyLCByZXF1aXJlTW9kdWxlcykgewogICAgICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyArICdcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjJyArIGlkKTsKICAgICAgICBlLnJlcXVpcmVUeXBlID0gaWQ7CiAgICAgICAgZS5yZXF1aXJlTW9kdWxlcyA9IHJlcXVpcmVNb2R1bGVzOwogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgZS5vcmlnaW5hbEVycm9yID0gZXJyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvL0lmIGEgZGVmaW5lIGlzIGFscmVhZHkgaW4gcGxheSB2aWEgYW5vdGhlciBBTUQgbG9hZGVyLAogICAgICAgIC8vZG8gbm90IG92ZXJ3cml0ZS4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVvZiByZXF1aXJlanMgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgaWYgKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSkgewogICAgICAgICAgICAvL0RvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcmVxdWlyZWpzIGluc3RhbmNlLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNmZyA9IHJlcXVpcmVqczsKICAgICAgICByZXF1aXJlanMgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgLy9BbGxvdyBmb3IgYSByZXF1aXJlIGNvbmZpZyBvYmplY3QKICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzRnVuY3Rpb24ocmVxdWlyZSkpIHsKICAgICAgICAvL2Fzc3VtZSBpdCBpcyBhIGNvbmZpZyBvYmplY3QuCiAgICAgICAgY2ZnID0gcmVxdWlyZTsKICAgICAgICByZXF1aXJlID0gdW5kZWZpbmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ld0NvbnRleHQoY29udGV4dE5hbWUpIHsKICAgICAgICB2YXIgaW5DaGVja0xvYWRlZCwgTW9kdWxlLCBjb250ZXh0LCBoYW5kbGVycywKICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQsCiAgICAgICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIC8vRGVmYXVsdHMuIERvIG5vdCBzZXQgYSBkZWZhdWx0IGZvciBtYXAKICAgICAgICAgICAgICAgIC8vY29uZmlnIHRvIHNwZWVkIHVwIG5vcm1hbGl6ZSgpLCB3aGljaAogICAgICAgICAgICAgICAgLy93aWxsIHJ1biBmYXN0ZXIgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgICAgIHdhaXRTZWNvbmRzOiA3LAogICAgICAgICAgICAgICAgYmFzZVVybDogJy4vJywKICAgICAgICAgICAgICAgIHBhdGhzOiB7fSwKICAgICAgICAgICAgICAgIGJ1bmRsZXM6IHt9LAogICAgICAgICAgICAgICAgcGtnczoge30sCiAgICAgICAgICAgICAgICBzaGltOiB7fSwKICAgICAgICAgICAgICAgIGNvbmZpZzoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgLy9yZWdpc3RyeSBvZiBqdXN0IGVuYWJsZWQgbW9kdWxlcywgdG8gc3BlZWQKICAgICAgICAgICAgLy9jeWNsZSBicmVha2luZyBjb2RlIHdoZW4gbG90cyBvZiBtb2R1bGVzCiAgICAgICAgICAgIC8vYXJlIHJlZ2lzdGVyZWQsIGJ1dCBub3QgYWN0aXZhdGVkLgogICAgICAgICAgICBlbmFibGVkUmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgdW5kZWZFdmVudHMgPSB7fSwKICAgICAgICAgICAgZGVmUXVldWUgPSBbXSwKICAgICAgICAgICAgZGVmaW5lZCA9IHt9LAogICAgICAgICAgICB1cmxGZXRjaGVkID0ge30sCiAgICAgICAgICAgIGJ1bmRsZXNNYXAgPSB7fSwKICAgICAgICAgICAgcmVxdWlyZUNvdW50ZXIgPSAxLAogICAgICAgICAgICB1bm5vcm1hbGl6ZWRDb3VudGVyID0gMTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpbXMgdGhlIC4gYW5kIC4uIGZyb20gYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKiBJdCB3aWxsIGtlZXAgYSBsZWFkaW5nIHBhdGggc2VnbWVudCBpZiBhIC4uIHdpbGwgYmVjb21lCiAgICAgICAgICogdGhlIGZpcnN0IHBhdGggc2VnbWVudCwgdG8gaGVscCB3aXRoIG1vZHVsZSBuYW1lIGxvb2t1cHMsCiAgICAgICAgICogd2hpY2ggYWN0IGxpa2UgcGF0aHMsIGJ1dCBjYW4gYmUgcmVtYXBwZWQuIEJ1dCB0aGUgZW5kIHJlc3VsdCwKICAgICAgICAgKiBhbGwgcGF0aHMgdGhhdCB1c2UgdGhpcyBmdW5jdGlvbiBzaG91bGQgbG9vayBub3JtYWxpemVkLgogICAgICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIE1PRElGSUVTIHRoZSBpbnB1dCBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnkgdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbURvdHMoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpLCBwYXJ0OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gYXJ5W2ldOwogICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgdGhlIHN0YXJ0LCBvciBwcmV2aW91cyB2YWx1ZSBpcyBzdGlsbCAuLiwKICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZW0gc28gdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGggaXQgbWF5CiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgd29yayB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGgsIGV2ZW4gdGhvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgYW4gSUQgaXQgaXMgbGVzcyB0aGFuIGlkZWFsLiBJbiBsYXJnZXIgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlcywgbWF5IGJlIGJldHRlciB0byBqdXN0IGtpY2sgb3V0IGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IChpID09PSAxICYmIGFyeVsyXSA9PT0gJy4uJykgfHwgYXJ5W2kgLSAxXSA9PT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhIHJlbGF0aXZlIG1vZHVsZSBuYW1lLCBsaWtlIC4vc29tZXRoaW5nLCBub3JtYWxpemUgaXQgdG8KICAgICAgICAgKiBhIHJlYWwgbmFtZSB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBwYXRoLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGl2ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2VOYW1lIGEgcmVhbCBuYW1lIHRoYXQgdGhlIG5hbWUgYXJnIGlzIHJlbGF0aXZlCiAgICAgICAgICogdG8uCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBseU1hcCBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgdmFsdWUuIFNob3VsZAogICAgICAgICAqIG9ubHkgYmUgZG9uZSBpZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgZm9yIGEgZGVwZW5kZW5jeSBJRC4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBub3JtYWxpemVkIG5hbWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciBwa2dNYWluLCBtYXBWYWx1ZSwgbmFtZVBhcnRzLCBpLCBqLCBuYW1lU2VnbWVudCwgbGFzdEluZGV4LAogICAgICAgICAgICAgICAgZm91bmRNYXAsIGZvdW5kSSwgZm91bmRTdGFyTWFwLCBzdGFySSwgbm9ybWFsaXplZEJhc2VQYXJ0cywKICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IChiYXNlTmFtZSAmJiBiYXNlTmFtZS5zcGxpdCgnLycpKSwKICAgICAgICAgICAgICAgIG1hcCA9IGNvbmZpZy5tYXAsCiAgICAgICAgICAgICAgICBzdGFyTWFwID0gbWFwICYmIG1hcFsnKiddOwoKICAgICAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG5hbWUubGVuZ3RoIC0gMTsKCiAgICAgICAgICAgICAgICAvLyBJZiB3YW50aW5nIG5vZGUgSUQgY29tcGF0aWJpbGl0eSwgc3RyaXAgLmpzIGZyb20gZW5kCiAgICAgICAgICAgICAgICAvLyBvZiBJRHMuIEhhdmUgdG8gZG8gdGhpcyBoZXJlLCBhbmQgbm90IGluIG5hbWVUb1VybAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub2RlIGFsbG93cyBlaXRoZXIgLmpzIG9yIG5vbiAuanMgdG8gbWFwCiAgICAgICAgICAgICAgICAvLyB0byBzYW1lIGZpbGUuCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5vZGVJZENvbXBhdCAmJiBqc1N1ZmZpeFJlZ0V4cC50ZXN0KG5hbWVbbGFzdEluZGV4XSkpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lW2xhc3RJbmRleF0gPSBuYW1lW2xhc3RJbmRleF0ucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0cyB3aXRoIGEgJy4nIHNvIG5lZWQgdGhlIGJhc2VOYW1lCiAgICAgICAgICAgICAgICBpZiAobmFtZVswXS5jaGFyQXQoMCkgPT09ICcuJyAmJiBiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgYmFzZU5hbWUgdG8gYXJyYXksIGFuZCBsb3Agb2ZmIHRoZSBsYXN0IHBhcnQsCiAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IC4gbWF0Y2hlcyB0aGF0ICdkaXJlY3RvcnknIGFuZCBub3QgbmFtZSBvZiB0aGUgYmFzZU5hbWUncwogICAgICAgICAgICAgICAgICAgIC8vbW9kdWxlLiBGb3IgaW5zdGFuY2UsIGJhc2VOYW1lIG9mICdvbmUvdHdvL3RocmVlJywgbWFwcyB0bwogICAgICAgICAgICAgICAgICAgIC8vJ29uZS90d28vdGhyZWUuanMnLCBidXQgd2Ugd2FudCB0aGUgZGlyZWN0b3J5LCAnb25lL3R3bycgZm9yCiAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5vcm1hbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5zbGljZSgwLCBiYXNlUGFydHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZWRCYXNlUGFydHMuY29uY2F0KG5hbWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyaW1Eb3RzKG5hbWUpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuam9pbignLycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FwcGx5IG1hcCBjb25maWcgaWYgYXZhaWxhYmxlLgogICAgICAgICAgICBpZiAoYXBwbHlNYXAgJiYgbWFwICYmIChiYXNlUGFydHMgfHwgc3Rhck1hcCkpIHsKICAgICAgICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKCiAgICAgICAgICAgICAgICBvdXRlckxvb3A6IGZvciAoaSA9IG5hbWVQYXJ0cy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lU2VnbWVudCA9IG5hbWVQYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9GaW5kIHRoZSBsb25nZXN0IGJhc2VOYW1lIHNlZ21lbnQgbWF0Y2ggaW4gdGhlIGNvbmZpZy4KICAgICAgICAgICAgICAgICAgICAgICAgLy9TbywgZG8gam9pbnMgb24gdGhlIGJpZ2dlc3QgdG8gc21hbGxlc3QgbGVuZ3RocyBvZiBiYXNlUGFydHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGJhc2VQYXJ0cy5sZW5ndGg7IGogPiAwOyBqIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlID0gZ2V0T3duKG1hcCwgYmFzZVBhcnRzLnNsaWNlKDAsIGopLmpvaW4oJy8nKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXNlTmFtZSBzZWdtZW50IGhhcyBjb25maWcsIGZpbmQgaWYgaXQgaGFzIG9uZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwVmFsdWUsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCwgdXBkYXRlIG5hbWUgdG8gdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXAgPSBtYXBWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYSBzdGFyIG1hcCBtYXRjaCwgYnV0IGp1c3QgaG9sZCBvbiB0byBpdCwKICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgc2hvcnRlciBzZWdtZW50IG1hdGNoIGxhdGVyIGluIGEgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAvL2NvbmZpZywgdGhlbiBmYXZvciBvdmVyIHRoaXMgc3RhciBtYXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFN0YXJNYXAgJiYgc3Rhck1hcCAmJiBnZXRPd24oc3Rhck1hcCwgbmFtZVNlZ21lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3Rhck1hcCA9IGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJJID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZE1hcCAmJiBmb3VuZFN0YXJNYXApIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IGZvdW5kU3Rhck1hcDsKICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBzdGFySTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXApIHsKICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMuc3BsaWNlKDAsIGZvdW5kSSwgZm91bmRNYXApOwogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHMuam9pbignLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgbmFtZSBwb2ludHMgdG8gYSBwYWNrYWdlJ3MgbmFtZSwgdXNlCiAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlIG1haW4gaW5zdGVhZC4KICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbmFtZSk7CgogICAgICAgICAgICByZXR1cm4gcGtnTWFpbiA/IHBrZ01haW4gOiBuYW1lOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KG5hbWUpIHsKICAgICAgICAgICAgaWYgKGlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgZWFjaChzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKSA9PT0gbmFtZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWNvbnRleHQnKSA9PT0gY29udGV4dC5jb250ZXh0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYXNQYXRoRmFsbGJhY2soaWQpIHsKICAgICAgICAgICAgdmFyIHBhdGhDb25maWcgPSBnZXRPd24oY29uZmlnLnBhdGhzLCBpZCk7CiAgICAgICAgICAgIGlmIChwYXRoQ29uZmlnICYmIGlzQXJyYXkocGF0aENvbmZpZykgJiYgcGF0aENvbmZpZy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvL1BvcCBvZmYgdGhlIGZpcnN0IGFycmF5IHZhbHVlLCBzaW5jZSBpdCBmYWlsZWQsIGFuZAogICAgICAgICAgICAgICAgLy9yZXRyeQogICAgICAgICAgICAgICAgcGF0aENvbmZpZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlLnVuZGVmKGlkKTsKCiAgICAgICAgICAgICAgICAvL0N1c3RvbSByZXF1aXJlIHRoYXQgZG9lcyBub3QgZG8gbWFwIHRyYW5zbGF0aW9uLCBzaW5jZQogICAgICAgICAgICAgICAgLy9JRCBpcyAiYWJzb2x1dGUiLCBhbHJlYWR5IG1hcHBlZC9yZXNvbHZlZC4KICAgICAgICAgICAgICAgIGNvbnRleHQubWFrZVJlcXVpcmUobnVsbCwgewogICAgICAgICAgICAgICAgICAgIHNraXBNYXA6IHRydWUKICAgICAgICAgICAgICAgIH0pKFtpZF0pOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL1R1cm5zIGEgcGx1Z2luIXJlc291cmNlIHRvIFtwbHVnaW4sIHJlc291cmNlXQogICAgICAgIC8vd2l0aCB0aGUgcGx1Z2luIGJlaW5nIHVuZGVmaW5lZCBpZiB0aGUgbmFtZQogICAgICAgIC8vZGlkIG5vdCBoYXZlIGEgcGx1Z2luIHByZWZpeC4KICAgICAgICBmdW5jdGlvbiBzcGxpdFByZWZpeChuYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmVmaXgsCiAgICAgICAgICAgICAgICBpbmRleCA9IG5hbWUgPyBuYW1lLmluZGV4T2YoJyEnKSA6IC0xOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcHJlZml4LCBuYW1lXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBtb2R1bGUgbWFwcGluZyB0aGF0IGluY2x1ZGVzIHBsdWdpbiBwcmVmaXgsIG1vZHVsZQogICAgICAgICAqIG5hbWUsIGFuZCBwYXRoLiBJZiBwYXJlbnRNb2R1bGVNYXAgaXMgcHJvdmlkZWQgaXQgd2lsbAogICAgICAgICAqIGFsc28gbm9ybWFsaXplIHRoZSBuYW1lIHZpYSByZXF1aXJlLm5vcm1hbGl6ZSgpCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmVudE1vZHVsZU1hcF0gcGFyZW50IG1vZHVsZSBtYXAKICAgICAgICAgKiBmb3IgdGhlIG1vZHVsZSBuYW1lLCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc05vcm1hbGl6ZWQ6IGlzIHRoZSBJRCBhbHJlYWR5IG5vcm1hbGl6ZWQuCiAgICAgICAgICogVGhpcyBpcyB0cnVlIGlmIHRoaXMgY2FsbCBpcyBkb25lIGZvciBhIGRlZmluZSgpIG1vZHVsZSBJRC4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwOiBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgSUQuCiAgICAgICAgICogU2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBkZXBlbmRlbmN5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYWtlTW9kdWxlTWFwKG5hbWUsIHBhcmVudE1vZHVsZU1hcCwgaXNOb3JtYWxpemVkLCBhcHBseU1hcCkgewogICAgICAgICAgICB2YXIgdXJsLCBwbHVnaW5Nb2R1bGUsIHN1ZmZpeCwgbmFtZVBhcnRzLAogICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbCwKICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnRNb2R1bGVNYXAgPyBwYXJlbnRNb2R1bGVNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWUgPSBuYW1lLAogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSB0cnVlLAogICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSAnJzsKCiAgICAgICAgICAgIC8vSWYgbm8gbmFtZSwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIHJlcXVpcmUgY2FsbCwgZ2VuZXJhdGUgYW4KICAgICAgICAgICAgLy9pbnRlcm5hbCBuYW1lLgogICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgIGlzRGVmaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuYW1lID0gJ19AcicgKyAocmVxdWlyZUNvdW50ZXIgKz0gMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5hbWVQYXJ0cyA9IHNwbGl0UHJlZml4KG5hbWUpOwogICAgICAgICAgICBwcmVmaXggPSBuYW1lUGFydHNbMF07CiAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHNbMV07CgogICAgICAgICAgICBpZiAocHJlZml4KSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBub3JtYWxpemUocHJlZml4LCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICBwbHVnaW5Nb2R1bGUgPSBnZXRPd24oZGVmaW5lZCwgcHJlZml4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9BY2NvdW50IGZvciByZWxhdGl2ZSBwYXRocyBpZiB0aGVyZSBpcyBhIGJhc2UgbmFtZS4KICAgICAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhhdCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiBIb3dldmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gaXQgZm9yIGRlZmluZSgpJ2QgIG1vZHVsZXMuIHJlcXVpcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVpciBjYWxsYmFja3MgKCM2OTkpLiBIb3dldmVyIGlmIGEgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25FcnJvciBpcyBzZXQsIHVzZSB0aGF0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5ldmVudHMuZXJyb3IgJiYgdGhpcy5tYXAuaXNEZWZpbmUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1hcCA9IHRoaXMubWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSB0aGlzLm1hcC5pc0RlZmluZSA/IFt0aGlzLm1hcC5pZF0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcigodGhpcy5lcnJvciA9IGVycikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZy4gSWYgcHJvbWlzZXMgY291bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCwgdGhpcyB3b3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBtYWtpbmcgZG8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgd2FudCB0byBjb21wbGV0ZWx5IGxvc2UgdGhlIGVycm9yLiBXaGlsZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbWVzcyB1cCBwcm9jZXNzaW5nIGFuZCBsZWFkIHRvIHNpbWlsYXIgcmVzdWx0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBidWcgMTQ0MCwgaXQgYXQgbGVhc3Qgc3VyZmFjZXMgdGhlIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIGxpdGVyYWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLmlzRGVmaW5lICYmICF0aGlzLmlnbm9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZFtpZF0gPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEub25SZXNvdXJjZUxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzTG9hZE1hcHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNMb2FkTWFwcy5wdXNoKGRlcE1hcC5ub3JtYWxpemVkTWFwIHx8IGRlcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uUmVzb3VyY2VMb2FkKGNvbnRleHQsIHRoaXMubWFwLCByZXNMb2FkTWFwcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9GaW5pc2hlZCB0aGUgZGVmaW5lIHN0YWdlLiBBbGxvdyBjYWxsaW5nIGNoZWNrIGFnYWluCiAgICAgICAgICAgICAgICAgICAgLy90byBhbGxvdyBkZWZpbmUgbm90aWZpY2F0aW9ucyBiZWxvdyBpbiB0aGUgY2FzZSBvZiBhCiAgICAgICAgICAgICAgICAgICAgLy9jeWNsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmluZWQgJiYgIXRoaXMuZGVmaW5lRW1pdHRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlZmluZWQnLCB0aGlzLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLm1hcCwKICAgICAgICAgICAgICAgICAgICBpZCA9IG1hcC5pZCwKICAgICAgICAgICAgICAgICAgICAvL01hcCBhbHJlYWR5IG5vcm1hbGl6ZWQgdGhlIHByZWZpeC4KICAgICAgICAgICAgICAgICAgICBwbHVnaW5NYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXgpOwoKICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKHBsdWdpbk1hcCk7CgogICAgICAgICAgICAgICAgb24ocGx1Z2luTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkLCBub3JtYWxpemVkTWFwLCBub3JtYWxpemVkTW9kLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCB0aGlzLm1hcC5pZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLm1hcC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gdGhpcy5tYXAucGFyZW50TWFwID8gdGhpcy5tYXAucGFyZW50TWFwLm5hbWUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKG1hcC5wYXJlbnRNYXAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1aWxkQ2FsbGJhY2s6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vSWYgY3VycmVudCBtYXAgaXMgbm90IG5vcm1hbGl6ZWQsIHdhaXQgZm9yIHRoYXQKICAgICAgICAgICAgICAgICAgICAvL25vcm1hbGl6ZWQgbmFtZSB0byBsb2FkIGluc3RlYWQgb2YgY29udGludWluZy4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBpZiB0aGUgcGx1Z2luIGFsbG93cyBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4ubm9ybWFsaXplKG5hbWUsIGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL3ByZWZpeCBhbmQgbmFtZSBzaG91bGQgYWxyZWFkeSBiZSBub3JtYWxpemVkLCBubyBuZWVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGFwcGx5aW5nIG1hcCBjb25maWcgYWdhaW4gZWl0aGVyLgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTWFwID0gbWFrZU1vZHVsZU1hcChtYXAucHJlZml4ICsgJyEnICsgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucGFyZW50TWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgb24obm9ybWFsaXplZE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5ub3JtYWxpemVkTWFwID0gbm9ybWFsaXplZE1hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE1vZCA9IGdldE93bihyZWdpc3RyeSwgbm9ybWFsaXplZE1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkTW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoaXMgcGx1Z2luLCBzbyBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jYW4gYmUgdHJhY2VkIGZvciBjeWNsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChub3JtYWxpemVkTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLm9uKCdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0lmIGEgcGF0aHMgY29uZmlnLCB0aGVuIGp1c3QgbG9hZCB0aGF0IGZpbGUgaW5zdGVhZCB0bwogICAgICAgICAgICAgICAgICAgIC8vcmVzb2x2ZSB0aGUgcGx1Z2luLCBhcyBpdCBpcyBidWlsdCBpbnRvIHRoYXQgcGF0aHMgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnVybCA9IGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxvYWQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBsb2FkLmVycm9yID0gYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gW2lkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRlbXAgdW5ub3JtYWxpemVkIG1vZHVsZXMgZm9yIHRoaXMgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSByZXNvbHZlZCBvdGhlcndpc2Ugbm93LgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaWQuaW5kZXhPZihpZCArICdfdW5ub3JtYWxpemVkJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KG1vZC5tYXAuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9BbGxvdyBwbHVnaW5zIHRvIGxvYWQgb3RoZXIgY29kZSB3aXRob3V0IGhhdmluZyB0byBrbm93IHRoZQogICAgICAgICAgICAgICAgICAgIC8vY29udGV4dCBvciBob3cgdG8gJ2NvbXBsZXRlJyB0aGUgbG9hZC4KICAgICAgICAgICAgICAgICAgICBsb2FkLmZyb21UZXh0ID0gYmluZCh0aGlzLCBmdW5jdGlvbiAodGV4dCwgdGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVNYXAgPSBtYWtlTW9kdWxlTWFwKG1vZHVsZU5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJhY3RpdmUgPSB1c2VJbnRlcmFjdGl2ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXMgb2YgMi4xLjAsIHN1cHBvcnQganVzdCBwYXNzaW5nIHRoZSB0ZXh0LCB0byByZWluZm9yY2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9mcm9tVGV4dCBvbmx5IGJlaW5nIGNhbGxlZCBvbmNlIHBlciByZXNvdXJjZS4gU3RpbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IG9sZCBzdHlsZSBvZiBwYXNzaW5nIG1vZHVsZU5hbWUgYnV0IGRpc2NhcmQKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGF0IG1vZHVsZU5hbWUgaW4gZmF2b3Igb2YgdGhlIGludGVybmFsIHJlZi4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRBbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0QWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1R1cm4gb2ZmIGludGVyYWN0aXZlIHNjcmlwdCBtYXRjaGluZyBmb3IgSUUgZm9yIGFueSBkZWZpbmUKICAgICAgICAgICAgICAgICAgICAgICAgLy9jYWxscyBpbiB0aGUgdGV4dCwgdGhlbiB0dXJuIGl0IGJhY2sgb24gYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1ByaW1lIHRoZSBzeXN0ZW0gYnkgY3JlYXRpbmcgYSBtb2R1bGUgaW5zdGFuY2UgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9UcmFuc2ZlciBhbnkgY29uZmlnIHRvIHRoaXMgb3RoZXIgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvcChjb25maWcuY29uZmlnLCBpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb25maWdbbW9kdWxlTmFtZV0gPSBjb25maWcuY29uZmlnW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5leGVjKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ2Zyb210ZXh0ZXZhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tVGV4dCBldmFsIGZvciAnICsgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZmFpbGVkOiAnICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgcGx1Z2luCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gobW9kdWxlTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcG9ydCBhbm9ueW1vdXMgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQobW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgdGhlIHZhbHVlIG9mIHRoYXQgbW9kdWxlIHRvIHRoZSB2YWx1ZSBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc291cmNlIElELgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUoW21vZHVsZU5hbWVdLCBsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9Vc2UgcGFyZW50TmFtZSBoZXJlIHNpbmNlIHRoZSBwbHVnaW4ncyBuYW1lIGlzIG5vdCByZWxpYWJsZSwKICAgICAgICAgICAgICAgICAgICAvL2NvdWxkIGJlIHNvbWUgd2VpcmQgc3RyaW5nIHdpdGggbm8gcGF0aCB0aGF0IGFjdHVhbGx5IHdhbnRzIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZWZlcmVuY2UgdGhlIHBhcmVudE5hbWUncyBwYXRoLgogICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2FkKG1hcC5uYW1lLCBsb2NhbFJlcXVpcmUsIGxvYWQsIGNvbmZpZyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwc1twbHVnaW5NYXAuaWRdID0gcGx1Z2luTWFwOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBlbmFibGVkUmVnaXN0cnlbdGhpcy5tYXAuaWRdID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9TZXQgZmxhZyBtZW50aW9uaW5nIHRoYXQgdGhlIG1vZHVsZSBpcyBlbmFibGluZywKICAgICAgICAgICAgICAgIC8vc28gdGhhdCBpbW1lZGlhdGUgY2FsbHMgdG8gdGhlIGRlZmluZWQgY2FsbGJhY2tzCiAgICAgICAgICAgICAgICAvL2ZvciBkZXBlbmRlbmNpZXMgZG8gbm90IHRyaWdnZXIgaW5hZHZlcnRlbnQgbG9hZAogICAgICAgICAgICAgICAgLy93aXRoIHRoZSBkZXBDb3VudCBzdGlsbCBiZWluZyB6ZXJvLgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9FbmFibGUgZWFjaCBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwTWFwLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkLCBtb2QsIGhhbmRsZXI7CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwTWFwID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0RlcGVuZGVuY3kgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgZGVwTWFwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHdpcmVkIHVwIHRvIHRoaXMgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXAgPSBtYWtlTW9kdWxlTWFwKGRlcE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXAuaXNEZWZpbmUgPyB0aGlzLm1hcCA6IHRoaXMubWFwLnBhcmVudE1hcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2tpcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwc1tpXSA9IGRlcE1hcDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRPd24oaGFuZGxlcnMsIGRlcE1hcC5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzW2ldID0gaGFuZGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBDb3VudCArPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKGRlcEV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuZGVmZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZURlcChpLCBkZXBFeHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZXJyb3InLCBiaW5kKHRoaXMsIHRoaXMuZXJyYmFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXZlbnRzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkaXJlY3QgZXJyYmFjayBvbiB0aGlzIG1vZHVsZSwgYnV0IHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBpcyBsaXN0ZW5pbmcgZm9yIGVycm9ycywgc28gYmUgc3VyZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvciBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlkID0gZGVwTWFwLmlkOwogICAgICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy9Ta2lwIHNwZWNpYWwgbW9kdWxlcyBsaWtlICdyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJwogICAgICAgICAgICAgICAgICAgIC8vQWxzbywgZG9uJ3QgY2FsbCBlbmFibGUgaWYgaXQgaXMgYWxyZWFkeSBlbmFibGVkLAogICAgICAgICAgICAgICAgICAgIC8vaW1wb3J0YW50IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2FzZXMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGhhbmRsZXJzLCBpZCkgJiYgbW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShkZXBNYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIHBsdWdpbiB0aGF0IGlzIHVzZWQgaW4KICAgICAgICAgICAgICAgIC8vYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoUHJvcCh0aGlzLnBsdWdpbk1hcHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbk1hcCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBnZXRPd24ocmVnaXN0cnksIHBsdWdpbk1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCAmJiAhbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiAobmFtZSwgY2IpIHsKICAgICAgICAgICAgICAgIHZhciBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIGlmICghY2JzKSB7CiAgICAgICAgICAgICAgICAgICAgY2JzID0gdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNicy5wdXNoKGNiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGVtaXQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHsKICAgICAgICAgICAgICAgIGVhY2godGhpcy5ldmVudHNbbmFtZV0sIGZ1bmN0aW9uIChjYikgewogICAgICAgICAgICAgICAgICAgIGNiKGV2dCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdGhhdCB0aGUgZXJyb3IgaGFuZGxlciB3YXMgdHJpZ2dlcmVkLCByZW1vdmUKICAgICAgICAgICAgICAgICAgICAvL3RoZSBsaXN0ZW5lcnMsIHNpbmNlIHRoaXMgYnJva2VuIE1vZHVsZSBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vY2FuIHN0YXkgYXJvdW5kIGZvciBhIHdoaWxlIGluIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbbmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjYWxsR2V0TW9kdWxlKGFyZ3MpIHsKICAgICAgICAgICAgLy9Ta2lwIG1vZHVsZXMgYWxyZWFkeSBkZWZpbmVkLgogICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgYXJnc1swXSkpIHsKICAgICAgICAgICAgICAgIGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKGFyZ3NbMF0sIG51bGwsIHRydWUpKS5pbml0KGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBmdW5jLCBuYW1lLCBpZU5hbWUpIHsKICAgICAgICAgICAgLy9GYXZvciBkZXRhY2hFdmVudCBiZWNhdXNlIG9mIElFOQogICAgICAgICAgICAvL2lzc3VlLCBzZWUgYXR0YWNoRXZlbnQvYWRkRXZlbnRMaXN0ZW5lciBjb21tZW50IGVsc2V3aGVyZQogICAgICAgICAgICAvL2luIHRoaXMgZmlsZS4KICAgICAgICAgICAgaWYgKG5vZGUuZGV0YWNoRXZlbnQgJiYgIWlzT3BlcmEpIHsKICAgICAgICAgICAgICAgIC8vUHJvYmFibHkgSUUuIElmIG5vdCBpdCB3aWxsIHRocm93IGFuIGVycm9yLCB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgICAgICAvL3VzZWZ1bCB0byBrbm93LgogICAgICAgICAgICAgICAgaWYgKGllTmFtZSkgewogICAgICAgICAgICAgICAgICAgIG5vZGUuZGV0YWNoRXZlbnQoaWVOYW1lLCBmdW5jKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGV2ZW50IGZyb20gYSBzY3JpcHQgbm9kZSwgZ2V0IHRoZSByZXF1aXJlanMgaW5mbyBmcm9tIGl0LAogICAgICAgICAqIGFuZCB0aGVuIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgbm9kZS4KICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBldnQKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFNjcmlwdERhdGEoZXZ0KSB7CiAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBhbmQgc3RpbGwgbWFrZXMgc2Vuc2UuCiAgICAgICAgICAgIHZhciBub2RlID0gZXZ0LmN1cnJlbnRUYXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7CgogICAgICAgICAgICAvL1JlbW92ZSB0aGUgbGlzdGVuZXJzIG9uY2UgaGVyZS4KICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobm9kZSwgY29udGV4dC5vblNjcmlwdExvYWQsICdsb2FkJywgJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IsICdlcnJvcicpOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICAgICAgICBpZDogbm9kZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJykKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGludGFrZURlZmluZXMoKSB7CiAgICAgICAgICAgIHZhciBhcmdzOwoKICAgICAgICAgICAgLy9BbnkgZGVmaW5lZCBtb2R1bGVzIGluIHRoZSBnbG9iYWwgcXVldWUsIGludGFrZSB0aGVtIG5vdy4KICAgICAgICAgICAgdGFrZUdsb2JhbFF1ZXVlKCk7CgogICAgICAgICAgICAvL01ha2Ugc3VyZSBhbnkgcmVtYWluaW5nIGRlZlF1ZXVlIGl0ZW1zIGdldCBwcm9wZXJseSBwcm9jZXNzZWQuCiAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBkZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ21pc21hdGNoJywgJ01pc21hdGNoZWQgYW5vbnltb3VzIGRlZmluZSgpIG1vZHVsZTogJyArCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL2FyZ3MgYXJlIGlkLCBkZXBzLCBmYWN0b3J5LiBTaG91bGQgYmUgbm9ybWFsaXplZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAvL2RlZmluZSgpIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwogICAgICAgIH0KCiAgICAgICAgY29udGV4dCA9IHsKICAgICAgICAgICAgY29uZmlnOiBjb25maWcsCiAgICAgICAgICAgIGNvbnRleHROYW1lOiBjb250ZXh0TmFtZSwKICAgICAgICAgICAgcmVnaXN0cnk6IHJlZ2lzdHJ5LAogICAgICAgICAgICBkZWZpbmVkOiBkZWZpbmVkLAogICAgICAgICAgICB1cmxGZXRjaGVkOiB1cmxGZXRjaGVkLAogICAgICAgICAgICBkZWZRdWV1ZTogZGVmUXVldWUsCiAgICAgICAgICAgIGRlZlF1ZXVlTWFwOiB7fSwKICAgICAgICAgICAgTW9kdWxlOiBNb2R1bGUsCiAgICAgICAgICAgIG1ha2VNb2R1bGVNYXA6IG1ha2VNb2R1bGVNYXAsCiAgICAgICAgICAgIG5leHRUaWNrOiByZXEubmV4dFRpY2ssCiAgICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0IGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlnIG9iamVjdCB0byBpbnRlZ3JhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25maWd1cmU6IGZ1bmN0aW9uIChjZmcpIHsKICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSBiYXNlVXJsIGVuZHMgaW4gYSBzbGFzaC4KICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybC5jaGFyQXQoY2ZnLmJhc2VVcmwubGVuZ3RoIC0gMSkgIT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICBjZmcuYmFzZVVybCArPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU2F2ZSBvZmYgdGhlIHBhdGhzIHNpbmNlIHRoZXkgcmVxdWlyZSBzcGVjaWFsIHByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAvL3RoZXkgYXJlIGFkZGl0aXZlLgogICAgICAgICAgICAgICAgdmFyIHNoaW0gPSBjb25maWcuc2hpbSwKICAgICAgICAgICAgICAgICAgICBvYmpzID0gewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9ianNbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKGNvbmZpZ1twcm9wXSwgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vUmV2ZXJzZSBtYXAgdGhlIGJ1bmRsZXMKICAgICAgICAgICAgICAgIGlmIChjZmcuYnVuZGxlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZy5idW5kbGVzLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlc01hcFt2XSA9IHByb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vTWVyZ2Ugc2hpbQogICAgICAgICAgICAgICAgaWYgKGNmZy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLnNoaW0sIGZ1bmN0aW9uICh2YWx1ZSwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUuZXhwb3J0cyB8fCB2YWx1ZS5pbml0KSAmJiAhdmFsdWUuZXhwb3J0c0ZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHBvcnRzRm4gPSBjb250ZXh0Lm1ha2VTaGltRXhwb3J0cyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2hpbVtpZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjb25maWcuc2hpbSA9IHNoaW07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9BZGp1c3QgcGFja2FnZXMgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgaWYgKGNmZy5wYWNrYWdlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2goY2ZnLnBhY2thZ2VzLCBmdW5jdGlvbiAocGtnT2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiwgbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBrZ09iaiA9IHR5cGVvZiBwa2dPYmogPT09ICdzdHJpbmcnID8ge25hbWU6IHBrZ09ian0gOiBwa2dPYmo7CgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGtnT2JqLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXRoc1tuYW1lXSA9IHBrZ09iai5sb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TYXZlIHBvaW50ZXIgdG8gbWFpbiBtb2R1bGUgSUQgZm9yIHBrZyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBsZWFkaW5nIGRvdCBpbiBtYWluLCBzbyBtYWluIHBhdGhzIGFyZSBub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCByZW1vdmUgYW55IHRyYWlsaW5nIC5qcywgc2luY2UgZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnZzIGhhdmUgZGlmZmVyZW50IGNvbnZlbnRpb25zOiBzb21lIHVzZSBhIG1vZHVsZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NvbWUgdXNlIGEgZmlsZSBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGtnc1tuYW1lXSA9IHBrZ09iai5uYW1lICsgJy8nICsgKHBrZ09iai5tYWluIHx8ICdtYWluJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGN1cnJEaXJSZWdFeHAsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGFyZSBhbnkgIndhaXRpbmcgdG8gZXhlY3V0ZSIgbW9kdWxlcyBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgbWFwcyBmb3IgdGhlbSwgc2luY2UgdGhlaXIgaW5mbywgbGlrZSBVUkxzIHRvIGxvYWQsCiAgICAgICAgICAgICAgICAvL21heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIG1vZHVsZSBhbHJlYWR5IGhhcyBpbml0IGNhbGxlZCwgc2luY2UgaXQgaXMgdG9vCiAgICAgICAgICAgICAgICAgICAgLy9sYXRlIHRvIG1vZGlmeSB0aGVtLCBhbmQgaWdub3JlIHVubm9ybWFsaXplZCBvbmVzCiAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGV5IGFyZSB0cmFuc2llbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2QuaW5pdGVkICYmICFtb2QubWFwLnVubm9ybWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2QubWFwID0gbWFrZU1vZHVsZU1hcChpZCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9JZiBhIGRlcHMgYXJyYXkgb3IgYSBjb25maWcgY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB0aGVuIGNhbGwKICAgICAgICAgICAgICAgIC8vcmVxdWlyZSB3aXRoIHRob3NlIGFyZ3MuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVxdWlyZSBpcyBkZWZpbmVkIGFzIGEKICAgICAgICAgICAgICAgIC8vY29uZmlnIG9iamVjdCBiZWZvcmUgcmVxdWlyZS5qcyBpcyBsb2FkZWQuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLmRlcHMgfHwgY2ZnLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlKGNmZy5kZXBzIHx8IFtdLCBjZmcuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVNoaW1FeHBvcnRzOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZuKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdmFsdWUuaW5pdC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgfHwgKHZhbHVlLmV4cG9ydHMgJiYgZ2V0R2xvYmFsKHZhbHVlLmV4cG9ydHMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG1ha2VSZXF1aXJlOiBmdW5jdGlvbiAocmVsTWFwLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbFJlcXVpcmUoZGVwcywgY2FsbGJhY2ssIGVycmJhY2spIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1hcCwgcmVxdWlyZU1vZDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlQnVpbGRDYWxsYmFjayAmJiBjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5fX3JlcXVpcmVKc0J1aWxkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdyZXF1aXJlYXJncycsICdJbnZhbGlkIHJlcXVpcmUgY2FsbCcpLCBlcnJiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiByZXF1aXJlfGV4cG9ydHN8bW9kdWxlIGFyZSByZXF1ZXN0ZWQsIGdldCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy92YWx1ZSBmb3IgdGhlbSBmcm9tIHRoZSBzcGVjaWFsIGhhbmRsZXJzLiBDYXZlYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBvbmx5IHdvcmtzIHdoaWxlIG1vZHVsZSBpcyBiZWluZyBkZWZpbmVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsTWFwICYmIGhhc1Byb3AoaGFuZGxlcnMsIGRlcHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcnNbZGVwc10ocmVnaXN0cnlbcmVsTWFwLmlkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMgYWNjZXNzIHRvIG9uZSBtb2R1bGUuIElmIHJlcXVpcmUuZ2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZhaWxhYmxlIChhcyBpbiB0aGUgTm9kZSBhZGFwdGVyKSwgcHJlZmVyIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEuZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxLmdldChjb250ZXh0LCBkZXBzLCByZWxNYXAsIGxvY2FsUmVxdWlyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIG1vZHVsZSBuYW1lLCBpZiBpdCBjb250YWlucyAuIG9yIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwcywgcmVsTWFwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGRlZmluZWQsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub3Rsb2FkZWQnLCAnTW9kdWxlIG5hbWUgIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQgZm9yIGNvbnRleHQ6ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbE1hcCA/ICcnIDogJy4gVXNlIHJlcXVpcmUoW10pJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0dyYWIgZGVmaW5lcyB3YWl0aW5nIGluIHRoZSBnbG9iYWwgcXVldWUuCiAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAvL01hcmsgYWxsIHRoZSBkZXBlbmRlbmNpZXMgYXMgbmVlZGluZyB0byBiZSBsb2FkZWQuCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vU29tZSBkZWZpbmVzIGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBzaW5jZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwsIGNvbGxlY3QgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZCA9IGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKG51bGwsIHJlbE1hcCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9yZSBpZiBtYXAgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGwgZm9yIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5za2lwTWFwID0gb3B0aW9ucy5za2lwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5pbml0KGRlcHMsIGNhbGxiYWNrLCBlcnJiYWNrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaXhpbihsb2NhbFJlcXVpcmUsIHsKICAgICAgICAgICAgICAgICAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlciwKCiAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSArIC5leHRlbnNpb24gaW50byBhbiBVUkwgcGF0aC4KICAgICAgICAgICAgICAgICAgICAgKiAqUmVxdWlyZXMqIHRoZSB1c2Ugb2YgYSBtb2R1bGUgbmFtZS4gSXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAgICAgICAgICAqIHBsYWluIFVSTHMgbGlrZSBuYW1lVG9VcmwuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lUGx1c0V4dCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtb2R1bGVOYW1lUGx1c0V4dC5sYXN0SW5kZXhPZignLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IG1vZHVsZU5hbWVQbHVzRXh0LnNwbGl0KCcvJylbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlbGF0aXZlID0gc2VnbWVudCA9PT0gJy4nIHx8IHNlZ21lbnQgPT09ICcuLic7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0hhdmUgYSBmaWxlIGV4dGVuc2lvbiBhbGlhcywgYW5kIGl0IGlzIG5vdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3RzIGZyb20gYSByZWxhdGl2ZSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xICYmICghaXNSZWxhdGl2ZSB8fCBpbmRleCA+IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBtb2R1bGVOYW1lUGx1c0V4dC5zdWJzdHJpbmcoaW5kZXgsIG1vZHVsZU5hbWVQbHVzRXh0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lUGx1c0V4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5hbWVUb1VybChub3JtYWxpemUobW9kdWxlTmFtZVBsdXNFeHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbE1hcCAmJiByZWxNYXAuaWQsIHRydWUpLCBleHQsICB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZDogZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcm9wKGRlZmluZWQsIGlkKSB8fCBoYXNQcm9wKHJlZ2lzdHJ5LCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9Pbmx5IGFsbG93IHVuZGVmIG9uIHRvcCBsZXZlbCByZXF1aXJlIGNhbGxzCiAgICAgICAgICAgICAgICBpZiAoIXJlbE1hcCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZS51bmRlZiA9IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgYW55IHdhaXRpbmcgZGVmaW5lKCkgY2FsbHMgdG8gdGhpcyBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpeCBmb3IgIzQwOAogICAgICAgICAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBtb2QudW5kZWZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxGZXRjaGVkW21hcC51cmxdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5kZWZFdmVudHNbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiBxdWV1ZWQgZGVmaW5lcyB0b28uIEdvIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAvL2luIGFycmF5IHNvIHRoYXQgdGhlIHNwbGljZXMgZG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzcyB1cCB0aGUgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUmV2ZXJzZShkZWZRdWV1ZSwgZnVuY3Rpb24oYXJncywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZGVmUXVldWVNYXBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ib2xkIG9uIHRvIGxpc3RlbmVycyBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gYmUgcmVsb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNpbmcgYSBkaWZmZXJlbnQgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5ldmVudHMuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmRXZlbnRzW2lkXSA9IG1vZC5ldmVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlcXVpcmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHRvIGVuYWJsZSBhIG1vZHVsZSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgcmVnaXN0cnkKICAgICAgICAgICAgICogYXdhaXRpbmcgZW5hYmxlbWVudC4gQSBzZWNvbmQgYXJnLCBwYXJlbnQsIHRoZSBwYXJlbnQgbW9kdWxlLAogICAgICAgICAgICAgKiBpcyBwYXNzZWQgaW4gZm9yIGNvbnRleHQsIHdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieQogICAgICAgICAgICAgKiB0aGUgb3B0aW1pemVyLiBOb3Qgc2hvd24gaGVyZSB0byBrZWVwIGNvZGUgY29tcGFjdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgZGVwTWFwLmlkKTsKICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGUoZGVwTWFwKS5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBlbnZpcm9ubWVudCBhZGFwdGVycyB0byBjb21wbGV0ZSBhIGxvYWQgZXZlbnQuCiAgICAgICAgICAgICAqIEEgbG9hZCBldmVudCBjb3VsZCBiZSBhIHNjcmlwdCBsb2FkIG9yIGp1c3QgYSBsb2FkIHBhc3MgZnJvbSBhIHN5bmNocm9ub3VzCiAgICAgICAgICAgICAqIGxvYWQgY2FsbC4KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBwb3RlbnRpYWxseSBjb21wbGV0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbXBsZXRlTG9hZDogZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCwgYXJncywgbW9kLAogICAgICAgICAgICAgICAgICAgIHNoaW0gPSBnZXRPd24oY29uZmlnLnNoaW0sIG1vZHVsZU5hbWUpIHx8IHt9LAogICAgICAgICAgICAgICAgICAgIHNoRXhwb3J0cyA9IHNoaW0uZXhwb3J0czsKCiAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYWxyZWFkeSBmb3VuZCBhbiBhbm9ueW1vdXMgbW9kdWxlIGFuZCBib3VuZCBpdAogICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoaXMgbmFtZSwgdGhlbiB0aGlzIGlzIHNvbWUgb3RoZXIgYW5vbiBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgLy93YWl0aW5nIGZvciBpdHMgY29tcGxldGVMb2FkIHRvIGZpcmUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZvdW5kIG1hdGNoaW5nIGRlZmluZSBjYWxsIGZvciB0aGlzIHNjcmlwdCEKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXAgPSB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIHRoaXMgYWZ0ZXIgdGhlIGN5Y2xlIG9mIGNhbGxHZXRNb2R1bGUgaW4gY2FzZSB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICAvL29mIHRob3NlIGNhbGxzL2luaXQgY2FsbHMgY2hhbmdlcyB0aGUgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgIWhhc1Byb3AoZGVmaW5lZCwgbW9kdWxlTmFtZSkgJiYgbW9kICYmICFtb2QuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbmZvcmNlRGVmaW5lICYmICghc2hFeHBvcnRzIHx8ICFnZXRHbG9iYWwoc2hFeHBvcnRzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BhdGhGYWxsYmFjayhtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub2RlZmluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdObyBkZWZpbmUgY2FsbCBmb3IgJyArIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9BIHNjcmlwdCB0aGF0IGRvZXMgbm90IGNhbGwgZGVmaW5lKCksIHNvIGp1c3Qgc2ltdWxhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgY2FsbCBmb3IgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoW21vZHVsZU5hbWUsIChzaGltLmRlcHMgfHwgW10pLCBzaGltLmV4cG9ydHNGbl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbnZlcnRzIGEgbW9kdWxlIG5hbWUgdG8gYSBmaWxlIHBhdGguIFN1cHBvcnRzIGNhc2VzIHdoZXJlCiAgICAgICAgICAgICAqIG1vZHVsZU5hbWUgbWF5IGFjdHVhbGx5IGJlIGp1c3QgYW4gVVJMLgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgaXQgKipkb2VzIG5vdCoqIGNhbGwgbm9ybWFsaXplIG9uIHRoZSBtb2R1bGVOYW1lLAogICAgICAgICAgICAgKiBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWQuIFRoaXMgaXMgYW4KICAgICAgICAgICAgICogaW50ZXJuYWwgQVBJLCBub3QgYSBwdWJsaWMgb25lLiBVc2UgdG9VcmwgZm9yIHRoZSBwdWJsaWMgQVBJLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbmFtZVRvVXJsOiBmdW5jdGlvbiAobW9kdWxlTmFtZSwgZXh0LCBza2lwRXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aHMsIHN5bXMsIGksIHBhcmVudE1vZHVsZSwgdXJsLAogICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsIGJ1bmRsZUlkLAogICAgICAgICAgICAgICAgICAgIHBrZ01haW4gPSBnZXRPd24oY29uZmlnLnBrZ3MsIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmIChwa2dNYWluKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IHBrZ01haW47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnVuZGxlSWQgPSBnZXRPd24oYnVuZGxlc01hcCwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkLCBleHQsIHNraXBFeHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgYSBjb2xvbiBpcyBpbiB0aGUgVVJMLCBpdCBpbmRpY2F0ZXMgYSBwcm90b2NvbCBpcyB1c2VkIGFuZCBpdCBpcyBqdXN0CiAgICAgICAgICAgICAgICAvL2FuIFVSTCB0byBhIGZpbGUsIG9yIGlmIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2gsIGNvbnRhaW5zIGEgcXVlcnkgYXJnIChpLmUuID8pCiAgICAgICAgICAgICAgICAvL29yIGVuZHMgd2l0aCAuanMsIHRoZW4gYXNzdW1lIHRoZSB1c2VyIG1lYW50IHRvIHVzZSBhbiB1cmwgYW5kIG5vdCBhIG1vZHVsZSBpZC4KICAgICAgICAgICAgICAgIC8vVGhlIHNsYXNoIGlzIGltcG9ydGFudCBmb3IgcHJvdG9jb2wtbGVzcyBVUkxzIGFzIHdlbGwgYXMgZnVsbCBwYXRocy4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIHBsYWluIHBhdGgsIG5vdCBtb2R1bGUgbmFtZSBsb29rdXAsIHNvIGp1c3QgcmV0dXJuIGl0LgogICAgICAgICAgICAgICAgICAgIC8vQWRkIGV4dGVuc2lvbiBpZiBpdCBpcyBpbmNsdWRlZC4gVGhpcyBpcyBhIGJpdCB3b25reSwgb25seSBub24tLmpzIHRoaW5ncyBwYXNzCiAgICAgICAgICAgICAgICAgICAgLy9hbiBleHRlbnNpb24sIHRoaXMgbWV0aG9kIHByb2JhYmx5IG5lZWRzIHRvIGJlIHJld29ya2VkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IG1vZHVsZU5hbWUgKyAoZXh0IHx8ICcnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIG1vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBjb25maWcucGF0aHM7CgogICAgICAgICAgICAgICAgICAgIHN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZWFjaCBtb2R1bGUgbmFtZSBzZWdtZW50LCBzZWUgaWYgdGhlcmUgaXMgYSBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy9yZWdpc3RlcmVkIGZvciBpdC4gU3RhcnQgd2l0aCBtb3N0IHNwZWNpZmljIG5hbWUKICAgICAgICAgICAgICAgICAgICAvL2FuZCB3b3JrIHVwIGZyb20gaXQuCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc3ltcy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gZ2V0T3duKHBhdGhzLCBwYXJlbnRNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbiBhcnJheSwgaXQgbWVhbnMgdGhlcmUgYXJlIGEgZmV3IGNob2ljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Nob29zZSB0aGUgb25lIHRoYXQgaXMgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkocGFyZW50UGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGFyZW50UGF0aFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuc3BsaWNlKDAsIGksIHBhcmVudFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSm9pbiB0aGUgcGF0aCBwYXJ0cyB0b2dldGhlciwgdGhlbiBmaWd1cmUgb3V0IGlmIGJhc2VVcmwgaXMgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IHN5bXMuam9pbignLycpOwogICAgICAgICAgICAgICAgICAgIHVybCArPSAoZXh0IHx8ICgvXmRhdGFcOnxcPy8udGVzdCh1cmwpIHx8IHNraXBFeHQgPyAnJyA6ICcuanMnKSk7CiAgICAgICAgICAgICAgICAgICAgdXJsID0gKHVybC5jaGFyQXQoMCkgPT09ICcvJyB8fCB1cmwubWF0Y2goL15bXHdcK1wuXC1dKzovKSA/ICcnIDogY29uZmlnLmJhc2VVcmwpICsgdXJsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcudXJsQXJncyA/IHVybCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVybEFyZ3MpIDogdXJsOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9EZWxlZ2F0ZXMgdG8gcmVxLmxvYWQuIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0bwogICAgICAgICAgICAvL2FsbG93IG92ZXJyaWRpbmcgaW4gdGhlIG9wdGltaXplci4KICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24gKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgIHJlcS5sb2FkKGNvbnRleHQsIGlkLCB1cmwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV4ZWN1dGVzIGEgbW9kdWxlIGNhbGxiYWNrIGZ1bmN0aW9uLiBCcm9rZW4gb3V0IGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24KICAgICAgICAgICAgICogc29sZWx5IHRvIGFsbG93IHRoZSBidWlsZCBzeXN0ZW0gdG8gc2VxdWVuY2UgdGhlIGZpbGVzIGluIHRoZSBidWlsdAogICAgICAgICAgICAgKiBsYXllciBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBleGVjQ2I6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgYXJncywgZXhwb3J0cykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KGV4cG9ydHMsIGFyZ3MpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGNhbGxiYWNrIGZvciBzY3JpcHQgbG9hZHMsIHVzZWQgdG8gY2hlY2sgc3RhdHVzIG9mIGxvYWRpbmcuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dCB0aGUgZXZlbnQgZnJvbSB0aGUgYnJvd3NlciBmb3IgdGhlIHNjcmlwdAogICAgICAgICAgICAgKiB0aGF0IHdhcyBsb2FkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdExvYWQ6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgICAgIC8vYWxsIG9sZCBicm93c2VycyB3aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHRoaXMgb25lIHdhcyBlYXN5IGVub3VnaAogICAgICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgICAgIGlmIChldnQudHlwZSA9PT0gJ2xvYWQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkeVJlZ0V4cC50ZXN0KChldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9SZXNldCBpbnRlcmFjdGl2ZSBzY3JpcHQgc28gYSBzY3JpcHQgbm9kZSBpcyBub3QgaGVsZCBvbnRvIGZvcgogICAgICAgICAgICAgICAgICAgIC8vdG8gbG9uZy4KICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvdXQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXRTY3JpcHREYXRhKGV2dCk7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQoZGF0YS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHNjcmlwdCBlcnJvcnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdEVycm9yOiBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgIGlmICghaGFzUGF0aEZhbGxiYWNrKGRhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19AcicpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLmRlcE1hcHMsIGZ1bmN0aW9uKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBNYXAuaWQgPT09IGRhdGEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ob2RlQ3JlYXRlZCkgewogICAgICAgICAgICAgICAgY29uZmlnLm9uTm9kZUNyZWF0ZWQobm9kZSwgY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL2lzc3Vlcy8xODcKICAgICAgICAgICAgICAgICAgICAvL2lmIHdlIGNhbiBOT1QgZmluZCBbbmF0aXZlIGNvZGVdIHRoZW4gaXQgbXVzdCBOT1QgbmF0aXZlbHkgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgIC8vaW4gSUU4LCBub2RlLmF0dGFjaEV2ZW50IGRvZXMgbm90IGhhdmUgdG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGUgdGVzdCBmb3IgIltuYXRpdmUgY29kZSIgd2l0aCBubyBjbG9zaW5nIGJyYWNlLCBzZWU6CiAgICAgICAgICAgICAgICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvaXNzdWVzLzI3MwogICAgICAgICAgICAgICAgICAgICEobm9kZS5hdHRhY2hFdmVudC50b1N0cmluZyAmJiBub2RlLmF0dGFjaEV2ZW50LnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlJykgPCAwKSAmJgogICAgICAgICAgICAgICAgICAgICFpc09wZXJhKSB7CiAgICAgICAgICAgICAgICAvL1Byb2JhYmx5IElFLiBJRSAoYXQgbGVhc3QgNi04KSBkbyBub3QgZmlyZQogICAgICAgICAgICAgICAgLy9zY3JpcHQgb25sb2FkIHJpZ2h0IGFmdGVyIGV4ZWN1dGluZyB0aGUgc2NyaXB0LCBzbwogICAgICAgICAgICAgICAgLy93ZSBjYW5ub3QgdGllIHRoZSBhbm9ueW1vdXMgZGVmaW5lIGNhbGwgdG8gYSBuYW1lLgogICAgICAgICAgICAgICAgLy9Ib3dldmVyLCBJRSByZXBvcnRzIHRoZSBzY3JpcHQgYXMgYmVpbmcgaW4gJ2ludGVyYWN0aXZlJwogICAgICAgICAgICAgICAgLy9yZWFkeVN0YXRlIGF0IHRoZSB0aW1lIG9mIHRoZSBkZWZpbmUgY2FsbC4KICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBub2RlLmF0dGFjaEV2ZW50KCdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCk7CiAgICAgICAgICAgICAgICAvL0l0IHdvdWxkIGJlIGdyZWF0IHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIGhlcmUgdG8gY2F0Y2gKICAgICAgICAgICAgICAgIC8vNDA0cyBpbiBJRTkrLiBIb3dldmVyLCBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2lsbCBmaXJlIGJlZm9yZQogICAgICAgICAgICAgICAgLy90aGUgZXJyb3IgaGFuZGxlciwgc28gdGhhdCBkb2VzIG5vdCBoZWxwLiBJZiBhZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgICAgICAvL2lzIHVzZWQsIHRoZW4gSUUgd2lsbCBmaXJlIGVycm9yIGJlZm9yZSBsb2FkLCBidXQgd2UgY2Fubm90CiAgICAgICAgICAgICAgICAvL3VzZSB0aGF0IHBhdGh3YXkgZ2l2ZW4gdGhlIGNvbm5lY3QubWljcm9zb2Z0LmNvbSBpc3N1ZQogICAgICAgICAgICAgICAgLy9tZW50aW9uZWQgYWJvdmUgYWJvdXQgbm90IGRvaW5nIHRoZSAnc2NyaXB0IGV4ZWN1dGUsCiAgICAgICAgICAgICAgICAvL3RoZW4gZmlyZSB0aGUgc2NyaXB0IGxvYWQgZXZlbnQgbGlzdGVuZXIgYmVmb3JlIGV4ZWN1dGUKICAgICAgICAgICAgICAgIC8vbmV4dCBzY3JpcHQnIHRoYXQgb3RoZXIgYnJvd3NlcnMgZG8uCiAgICAgICAgICAgICAgICAvL0Jlc3QgaG9wZTogSUUxMCBmaXhlcyB0aGUgaXNzdWVzLAogICAgICAgICAgICAgICAgLy9hbmQgdGhlbiBkZXN0cm95cyBhbGwgaW5zdGFsbHMgb2YgSUUgNi05LgogICAgICAgICAgICAgICAgLy9ub2RlLmF0dGFjaEV2ZW50KCdvbmVycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNvbnRleHQub25TY3JpcHRMb2FkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zcmMgPSB1cmw7CgogICAgICAgICAgICAvL0ZvciBzb21lIGNhY2hlIGNhc2VzIGluIElFIDYtOCwgdGhlIHNjcmlwdCBleGVjdXRlcyBiZWZvcmUgdGhlIGVuZAogICAgICAgICAgICAvL29mIHRoZSBhcHBlbmRDaGlsZCBleGVjdXRpb24sIHNvIHRvIHRpZSBhbiBhbm9ueW1vdXMgZGVmaW5lCiAgICAgICAgICAgIC8vY2FsbCB0byB0aGUgbW9kdWxlIG5hbWUgKHdoaWNoIGlzIHN0b3JlZCBvbiB0aGUgbm9kZSksIGhvbGQgb24KICAgICAgICAgICAgLy90byBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUsIGJ1dCBjbGVhciBhZnRlciB0aGUgRE9NIGluc2VydGlvbi4KICAgICAgICAgICAgY3VycmVudGx5QWRkaW5nU2NyaXB0ID0gbm9kZTsKICAgICAgICAgICAgaWYgKGJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBoZWFkLmluc2VydEJlZm9yZShub2RlLCBiYXNlRWxlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG51bGw7CgogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9IGVsc2UgaWYgKGlzV2ViV29ya2VyKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvL0luIGEgd2ViIHdvcmtlciwgdXNlIGltcG9ydFNjcmlwdHMuIFRoaXMgaXMgbm90IGEgdmVyeQogICAgICAgICAgICAgICAgLy9lZmZpY2llbnQgdXNlIG9mIGltcG9ydFNjcmlwdHMsIGltcG9ydFNjcmlwdHMgd2lsbCBibG9jayB1bnRpbAogICAgICAgICAgICAgICAgLy9pdHMgc2NyaXB0IGlzIGRvd25sb2FkZWQgYW5kIGV2YWx1YXRlZC4gSG93ZXZlciwgaWYgd2ViIHdvcmtlcnMKICAgICAgICAgICAgICAgIC8vYXJlIGluIHBsYXksIHRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGEgYnVpbGQgaGFzIGJlZW4gZG9uZSBzbwogICAgICAgICAgICAgICAgLy90aGF0IG9ubHkgb25lIHNjcmlwdCBuZWVkcyB0byBiZSBsb2FkZWQgYW55d2F5LiBUaGlzIG1heSBuZWVkCiAgICAgICAgICAgICAgICAvL3RvIGJlIHJlZXZhbHVhdGVkIGlmIG90aGVyIHVzZSBjYXNlcyBiZWNvbWUgY29tbW9uLgogICAgICAgICAgICAgICAgaW1wb3J0U2NyaXB0cyh1cmwpOwoKICAgICAgICAgICAgICAgIC8vQWNjb3VudCBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICAgICAgICAgIGNvbnRleHQuY29tcGxldGVMb2FkKG1vZHVsZU5hbWUpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IobWFrZUVycm9yKCdpbXBvcnRzY3JpcHRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0U2NyaXB0cyBmYWlsZWQgZm9yICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lICsgJyBhdCAnICsgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCkgewogICAgICAgIGlmIChpbnRlcmFjdGl2ZVNjcmlwdCAmJiBpbnRlcmFjdGl2ZVNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgICAgICB9CgogICAgICAgIGVhY2hSZXZlcnNlKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdCkgewogICAgICAgICAgICBpZiAoc2NyaXB0LnJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoaW50ZXJhY3RpdmVTY3JpcHQgPSBzY3JpcHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0OwogICAgfQoKICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gc2NyaXB0IGF0dHJpYnV0ZSwgd2hpY2ggY291bGQgYWxzbyBhZGp1c3QgdGhlIGJhc2VVcmwuCiAgICBpZiAoaXNCcm93c2VyICYmICFjZmcuc2tpcERhdGFNYWluKSB7CiAgICAgICAgLy9GaWd1cmUgb3V0IGJhc2VVcmwuIEdldCBpdCBmcm9tIHRoZSBzY3JpcHQgdGFnIHdpdGggcmVxdWlyZS5qcyBpbiBpdC4KICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgLy9TZXQgdGhlICdoZWFkJyB3aGVyZSB3ZSBjYW4gYXBwZW5kIGNoaWxkcmVuIGJ5CiAgICAgICAgICAgIC8vdXNpbmcgdGhlIHNjcmlwdCdzIHBhcmVudC4KICAgICAgICAgICAgaWYgKCFoZWFkKSB7CiAgICAgICAgICAgICAgICBoZWFkID0gc2NyaXB0LnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gYXR0cmlidXRlIHRvIHNldCBtYWluIHNjcmlwdCBmb3IgdGhlIHBhZ2UKICAgICAgICAgICAgLy90byBsb2FkLiBJZiBpdCBpcyB0aGVyZSwgdGhlIHBhdGggdG8gZGF0YSBtYWluIGJlY29tZXMgdGhlCiAgICAgICAgICAgIC8vYmFzZVVybCwgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LgogICAgICAgICAgICBkYXRhTWFpbiA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWFpbicpOwogICAgICAgICAgICBpZiAoZGF0YU1haW4pIHsKICAgICAgICAgICAgICAgIC8vUHJlc2VydmUgZGF0YU1haW4gaW4gY2FzZSBpdCBpcyBhIHBhdGggKGkuZS4gY29udGFpbnMgJz8nKQogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwoKICAgICAgICAgICAgICAgIC8vU2V0IGZpbmFsIGJhc2VVcmwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYW4gZXhwbGljaXQgb25lLgogICAgICAgICAgICAgICAgaWYgKCFjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvZmYgdGhlIGRpcmVjdG9yeSBvZiBkYXRhLW1haW4gZm9yIHVzZSBhcyB0aGUKICAgICAgICAgICAgICAgICAgICAvL2Jhc2VVcmwuCiAgICAgICAgICAgICAgICAgICAgc3JjID0gbWFpblNjcmlwdC5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBzcmMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHNyYy5sZW5ndGggPyBzcmMuam9pbignLycpICArICcvJyA6ICcuLyc7CgogICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsID0gc3ViUGF0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiBhbnkgdHJhaWxpbmcgLmpzIHNpbmNlIG1haW5TY3JpcHQgaXMgbm93CiAgICAgICAgICAgICAgICAvL2xpa2UgYSBtb2R1bGUgbmFtZS4KICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBtYWluU2NyaXB0LnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKCiAgICAgICAgICAgICAgICAvL0lmIG1haW5TY3JpcHQgaXMgc3RpbGwgYSBwYXRoLCBmYWxsIGJhY2sgdG8gZGF0YU1haW4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSkgewogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1B1dCB0aGUgZGF0YS1tYWluIHNjcmlwdCBpbiB0aGUgZmlsZXMgdG8gbG9hZC4KICAgICAgICAgICAgICAgIGNmZy5kZXBzID0gY2ZnLmRlcHMgPyBjZmcuZGVwcy5jb25jYXQobWFpblNjcmlwdCkgOiBbbWFpblNjcmlwdF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgZGVmaW5pdGlvbnMgb2YgbW9kdWxlcy4gRGlmZmVycyBmcm9tCiAgICAgKiByZXF1aXJlKCkgaW4gdGhhdCBhIHN0cmluZyBmb3IgdGhlIG1vZHVsZSBzaG91bGQgYmUgdGhlIGZpcnN0IGFyZ3VtZW50LAogICAgICogYW5kIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkIHNob3VsZAogICAgICogcmV0dXJuIGEgdmFsdWUgdG8gZGVmaW5lIHRoZSBtb2R1bGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYXJndW1lbnQncwogICAgICogbmFtZS4KICAgICAqLwogICAgZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIG5vZGUsIGNvbnRleHQ7CgogICAgICAgIC8vQWxsb3cgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAvL0FkanVzdCBhcmdzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbmFtZTsKICAgICAgICAgICAgbmFtZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvL1RoaXMgbW9kdWxlIG1heSBub3QgaGF2ZSBkZXBlbmRlbmNpZXMKICAgICAgICBpZiAoIWlzQXJyYXkoZGVwcykpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vSWYgbm8gbmFtZSwgYW5kIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24sIHRoZW4gZmlndXJlIG91dCBpZiBpdCBhCiAgICAgICAgLy9Db21tb25KUyB0aGluZyB3aXRoIGRlcGVuZGVuY2llcy4KICAgICAgICBpZiAoIWRlcHMgJiYgaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgZGVwcyA9IFtdOwogICAgICAgICAgICAvL1JlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBjYWxsYmFjayBzdHJpbmcsCiAgICAgICAgICAgIC8vbG9vayBmb3IgcmVxdWlyZSBjYWxscywgYW5kIHB1bGwgdGhlbSBpbnRvIHRoZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIC8vYnV0IG9ubHkgaWYgdGhlcmUgYXJlIGZ1bmN0aW9uIGFyZ3MuCiAgICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjb21tZW50UmVnRXhwLCAnJykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjanNSZXF1aXJlUmVnRXhwLCBmdW5jdGlvbiAobWF0Y2gsIGRlcCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL01heSBiZSBhIENvbW1vbkpTIHRoaW5nIGV2ZW4gd2l0aG91dCByZXF1aXJlIGNhbGxzLCBidXQgc3RpbGwKICAgICAgICAgICAgICAgIC8vY291bGQgdXNlIGV4cG9ydHMsIGFuZCBtb2R1bGUuIEF2b2lkIGRvaW5nIGV4cG9ydHMgYW5kIG1vZHVsZQogICAgICAgICAgICAgICAgLy93b3JrIHRob3VnaCBpZiBpdCBqdXN0IG5lZWRzIHJlcXVpcmUuCiAgICAgICAgICAgICAgICAvL1JFUVVJUkVTIHRoZSBmdW5jdGlvbiB0byBleHBlY3QgdGhlIENvbW1vbkpTIHZhcmlhYmxlcyBpbiB0aGUKICAgICAgICAgICAgICAgIC8vb3JkZXIgbGlzdGVkIGJlbG93LgogICAgICAgICAgICAgICAgZGVwcyA9IChjYWxsYmFjay5sZW5ndGggPT09IDEgPyBbJ3JlcXVpcmUnXSA6IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddKS5jb25jYXQoZGVwcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vSWYgaW4gSUUgNi04IGFuZCBoaXQgYW4gYW5vbnltb3VzIGRlZmluZSgpIGNhbGwsIGRvIHRoZSBpbnRlcmFjdGl2ZQogICAgICAgIC8vd29yay4KICAgICAgICBpZiAodXNlSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgbm9kZSA9IGN1cnJlbnRseUFkZGluZ1NjcmlwdCB8fCBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpOwogICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0c1tub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9BbHdheXMgc2F2ZSBvZmYgZXZhbHVhdGluZyB0aGUgZGVmIGNhbGwgdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgaGFuZGxlci4KICAgICAgICAvL1RoaXMgYWxsb3dzIG11bHRpcGxlIG1vZHVsZXMgdG8gYmUgaW4gYSBmaWxlIHdpdGhvdXQgcHJlbWF0dXJlbHkKICAgICAgICAvL3RyYWNpbmcgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3dzIGZvciBhbm9ueW1vdXMgbW9kdWxlIHN1cHBvcnQsCiAgICAgICAgLy93aGVyZSB0aGUgbW9kdWxlIG5hbWUgaXMgbm90IGtub3duIHVudGlsIHRoZSBzY3JpcHQgb25sb2FkIGV2ZW50CiAgICAgICAgLy9vY2N1cnMuIElmIG5vIGNvbnRleHQsIHVzZSB0aGUgZ2xvYmFsIHF1ZXVlLCBhbmQgZ2V0IGl0IHByb2Nlc3NlZAogICAgICAgIC8vaW4gdGhlIG9uc2NyaXB0IGxvYWQgY2FsbGJhY2suCiAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwW25hbWVdID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbG9iYWxEZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgIH0KICAgIH07CgogICAgZGVmaW5lLmFtZCA9IHsKICAgICAgICBqUXVlcnk6IHRydWUKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgdGV4dC4gTm9ybWFsbHkganVzdCB1c2VzIGV2YWwsIGJ1dCBjYW4gYmUgbW9kaWZpZWQKICAgICAqIHRvIHVzZSBhIGJldHRlciwgZW52aXJvbm1lbnQtc3BlY2lmaWMgY2FsbC4gT25seSB1c2VkIGZvciB0cmFuc3BpbGluZwogICAgICogbG9hZGVyIHBsdWdpbnMsIG5vdCBmb3IgcGxhaW4gSlMgbW9kdWxlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRoZSB0ZXh0IHRvIGV4ZWN1dGUvZXZhbHVhdGUuCiAgICAgKi8KICAgIHJlcS5leGVjID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgcmV0dXJuIGV2YWwodGV4dCk7CiAgICB9OwoKICAgIC8vU2V0IHVwIHdpdGggY29uZmlnIGluZm8uCiAgICByZXEoY2ZnKTsKfSh0aGlzKSk7Cg==",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "8972cde8-0f5c-4869-946a-3eca40ec26a2"
},
"source": [
"import plotly.offline as py\n",
"import pandas as pd\n",
"import plotly.graph_objs as go\n",
"\n",
"def enable_plotly_in_cell():\n",
" import IPython\n",
" from plotly.offline import init_notebook_mode\n",
" # Import a set of Javascript functions which will help\n",
" display(IPython.core.display.HTML('''\n",
" \n",
" '''))\n",
" init_notebook_mode(connected=False)"
],
"execution_count": 46,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2ITNTOKNTWxt",
"colab_type": "text"
},
"source": [
"Normally, you would need to run this in every cell where you call a plotly plot. We can automatically call this in every cell by adding a \"hook\", which will call the function in each cell. The following code does so."
]
},
{
"cell_type": "code",
"metadata": {
"id": "Xpe6BAtvQrd5",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/static/components/requirejs/require.js": {
"data": "LyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjEuMjIgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS4KICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcyBmb3IgZGV0YWlscwogKi8KLy9Ob3QgdXNpbmcgc3RyaWN0OiB1bmV2ZW4gc3RyaWN0IHN1cHBvcnQgaW4gYnJvd3NlcnMsICMzOTIsIGFuZCBjYXVzZXMKLy9wcm9ibGVtcyB3aXRoIHJlcXVpcmVqcy5leGVjKCkvdHJhbnNwaWxlciBwbHVnaW5zIHRoYXQgbWF5IG5vdCBiZSBzdHJpY3QuCi8qanNsaW50IHJlZ2V4cDogdHJ1ZSwgbm9tZW46IHRydWUsIHNsb3BweTogdHJ1ZSAqLwovKmdsb2JhbCB3aW5kb3csIG5hdmlnYXRvciwgZG9jdW1lbnQsIGltcG9ydFNjcmlwdHMsIHNldFRpbWVvdXQsIG9wZXJhICovCgp2YXIgcmVxdWlyZWpzLCByZXF1aXJlLCBkZWZpbmU7CihmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICB2YXIgcmVxLCBzLCBoZWFkLCBiYXNlRWxlbWVudCwgZGF0YU1haW4sIHNyYywKICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCwgY3VycmVudGx5QWRkaW5nU2NyaXB0LCBtYWluU2NyaXB0LCBzdWJQYXRoLAogICAgICAgIHZlcnNpb24gPSAnMi4xLjIyJywKICAgICAgICBjb21tZW50UmVnRXhwID0gLyhcL1wqKFtcc1xTXSo/KVwqXC98KFteOl18XilcL1wvKC4qKSQpL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgYXAgPSBBcnJheS5wcm90b3R5cGUsCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaXQpIHsKICAgICAgICByZXR1cm4gb3N0cmluZy5jYWxsKGl0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0FycmF5KGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEFycmF5XSc7CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5LiBJZiB0aGUgZnVuYyByZXR1cm5zCiAgICAgKiBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoKGFyeSwgZnVuYykgewogICAgICAgIGlmIChhcnkpIHsKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgYmFja3dhcmRzLiBJZiB0aGUgZnVuYwogICAgICogcmV0dXJucyBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoUmV2ZXJzZShhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSBhcnkubGVuZ3RoIC0gMTsgaSA+IC0xOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYXNQcm9wKG9iaiwgcHJvcCkgewogICAgICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIHByb3ApOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE93bihvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzUHJvcChvYmosIHByb3ApICYmIG9ialtwcm9wXTsKICAgIH0KCiAgICAvKioKICAgICAqIEN5Y2xlcyBvdmVyIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0IGFuZCBjYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoCiAgICAgKiBwcm9wZXJ0eSB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWUsIHRoZW4gdGhlCiAgICAgKiBpdGVyYXRpb24gaXMgc3RvcHBlZC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFByb3Aob2JqLCBmdW5jKSB7CiAgICAgICAgdmFyIHByb3A7CiAgICAgICAgZm9yIChwcm9wIGluIG9iaikgewogICAgICAgICAgICBpZiAoaGFzUHJvcChvYmosIHByb3ApKSB7CiAgICAgICAgICAgICAgICBpZiAoZnVuYyhvYmpbcHJvcF0sIHByb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8gbWl4IGluIHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgaW50byB0YXJnZXQsCiAgICAgKiBidXQgb25seSBpZiB0YXJnZXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCBzb3VyY2UsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pIHsKICAgICAgICBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIGVhY2hQcm9wKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9yY2UgfHwgIWhhc1Byb3AodGFyZ2V0LCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZWVwU3RyaW5nTWl4aW4gJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNBcnJheSh2YWx1ZSkgJiYgIWlzRnVuY3Rpb24odmFsdWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4odGFyZ2V0W3Byb3BdLCB2YWx1ZSwgZm9yY2UsIGRlZXBTdHJpbmdNaXhpbik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICAvL1NpbWlsYXIgdG8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIGJ1dCB0aGUgJ3RoaXMnIG9iamVjdCBpcyBzcGVjaWZpZWQKICAgIC8vZmlyc3QsIHNpbmNlIGl0IGlzIGVhc2llciB0byByZWFkL2ZpZ3VyZSBvdXQgd2hhdCAndGhpcycgd2lsbCBiZS4KICAgIGZ1bmN0aW9uIGJpbmQob2JqLCBmbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShvYmosIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY3JpcHRzKCkgewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IoZXJyKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgfQoKICAgIC8vQWxsb3cgZ2V0dGluZyBhIGdsb2JhbCB0aGF0IGlzIGV4cHJlc3NlZCBpbgogICAgLy9kb3Qgbm90YXRpb24sIGxpa2UgJ2EuYi5jJy4KICAgIGZ1bmN0aW9uIGdldEdsb2JhbCh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICB2YXIgZyA9IGdsb2JhbDsKICAgICAgICBlYWNoKHZhbHVlLnNwbGl0KCcuJyksIGZ1bmN0aW9uIChwYXJ0KSB7CiAgICAgICAgICAgIGcgPSBnW3BhcnRdOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBlcnJvciB3aXRoIGEgcG9pbnRlciB0byBhbiBVUkwgd2l0aCBtb3JlIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIHRoZSBlcnJvciBJRCB0aGF0IG1hcHMgdG8gYW4gSUQgb24gYSB3ZWIgcGFnZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGh1bWFuIHJlYWRhYmxlIGVycm9yLgogICAgICogQHBhcmFtIHtFcnJvcn0gW2Vycl0gdGhlIG9yaWdpbmFsIGVycm9yLCBpZiB0aGVyZSBpcyBvbmUuCiAgICAgKgogICAgICogQHJldHVybnMge0Vycm9yfQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRXJyb3IoaWQsIG1zZywgZXJyLCByZXF1aXJlTW9kdWxlcykgewogICAgICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyArICdcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjJyArIGlkKTsKICAgICAgICBlLnJlcXVpcmVUeXBlID0gaWQ7CiAgICAgICAgZS5yZXF1aXJlTW9kdWxlcyA9IHJlcXVpcmVNb2R1bGVzOwogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgZS5vcmlnaW5hbEVycm9yID0gZXJyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvL0lmIGEgZGVmaW5lIGlzIGFscmVhZHkgaW4gcGxheSB2aWEgYW5vdGhlciBBTUQgbG9hZGVyLAogICAgICAgIC8vZG8gbm90IG92ZXJ3cml0ZS4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVvZiByZXF1aXJlanMgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgaWYgKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSkgewogICAgICAgICAgICAvL0RvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcmVxdWlyZWpzIGluc3RhbmNlLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNmZyA9IHJlcXVpcmVqczsKICAgICAgICByZXF1aXJlanMgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgLy9BbGxvdyBmb3IgYSByZXF1aXJlIGNvbmZpZyBvYmplY3QKICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzRnVuY3Rpb24ocmVxdWlyZSkpIHsKICAgICAgICAvL2Fzc3VtZSBpdCBpcyBhIGNvbmZpZyBvYmplY3QuCiAgICAgICAgY2ZnID0gcmVxdWlyZTsKICAgICAgICByZXF1aXJlID0gdW5kZWZpbmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ld0NvbnRleHQoY29udGV4dE5hbWUpIHsKICAgICAgICB2YXIgaW5DaGVja0xvYWRlZCwgTW9kdWxlLCBjb250ZXh0LCBoYW5kbGVycywKICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQsCiAgICAgICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIC8vRGVmYXVsdHMuIERvIG5vdCBzZXQgYSBkZWZhdWx0IGZvciBtYXAKICAgICAgICAgICAgICAgIC8vY29uZmlnIHRvIHNwZWVkIHVwIG5vcm1hbGl6ZSgpLCB3aGljaAogICAgICAgICAgICAgICAgLy93aWxsIHJ1biBmYXN0ZXIgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgICAgIHdhaXRTZWNvbmRzOiA3LAogICAgICAgICAgICAgICAgYmFzZVVybDogJy4vJywKICAgICAgICAgICAgICAgIHBhdGhzOiB7fSwKICAgICAgICAgICAgICAgIGJ1bmRsZXM6IHt9LAogICAgICAgICAgICAgICAgcGtnczoge30sCiAgICAgICAgICAgICAgICBzaGltOiB7fSwKICAgICAgICAgICAgICAgIGNvbmZpZzoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgLy9yZWdpc3RyeSBvZiBqdXN0IGVuYWJsZWQgbW9kdWxlcywgdG8gc3BlZWQKICAgICAgICAgICAgLy9jeWNsZSBicmVha2luZyBjb2RlIHdoZW4gbG90cyBvZiBtb2R1bGVzCiAgICAgICAgICAgIC8vYXJlIHJlZ2lzdGVyZWQsIGJ1dCBub3QgYWN0aXZhdGVkLgogICAgICAgICAgICBlbmFibGVkUmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgdW5kZWZFdmVudHMgPSB7fSwKICAgICAgICAgICAgZGVmUXVldWUgPSBbXSwKICAgICAgICAgICAgZGVmaW5lZCA9IHt9LAogICAgICAgICAgICB1cmxGZXRjaGVkID0ge30sCiAgICAgICAgICAgIGJ1bmRsZXNNYXAgPSB7fSwKICAgICAgICAgICAgcmVxdWlyZUNvdW50ZXIgPSAxLAogICAgICAgICAgICB1bm5vcm1hbGl6ZWRDb3VudGVyID0gMTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpbXMgdGhlIC4gYW5kIC4uIGZyb20gYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKiBJdCB3aWxsIGtlZXAgYSBsZWFkaW5nIHBhdGggc2VnbWVudCBpZiBhIC4uIHdpbGwgYmVjb21lCiAgICAgICAgICogdGhlIGZpcnN0IHBhdGggc2VnbWVudCwgdG8gaGVscCB3aXRoIG1vZHVsZSBuYW1lIGxvb2t1cHMsCiAgICAgICAgICogd2hpY2ggYWN0IGxpa2UgcGF0aHMsIGJ1dCBjYW4gYmUgcmVtYXBwZWQuIEJ1dCB0aGUgZW5kIHJlc3VsdCwKICAgICAgICAgKiBhbGwgcGF0aHMgdGhhdCB1c2UgdGhpcyBmdW5jdGlvbiBzaG91bGQgbG9vayBub3JtYWxpemVkLgogICAgICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIE1PRElGSUVTIHRoZSBpbnB1dCBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnkgdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbURvdHMoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpLCBwYXJ0OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gYXJ5W2ldOwogICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgdGhlIHN0YXJ0LCBvciBwcmV2aW91cyB2YWx1ZSBpcyBzdGlsbCAuLiwKICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZW0gc28gdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGggaXQgbWF5CiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgd29yayB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGgsIGV2ZW4gdGhvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgYW4gSUQgaXQgaXMgbGVzcyB0aGFuIGlkZWFsLiBJbiBsYXJnZXIgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlcywgbWF5IGJlIGJldHRlciB0byBqdXN0IGtpY2sgb3V0IGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IChpID09PSAxICYmIGFyeVsyXSA9PT0gJy4uJykgfHwgYXJ5W2kgLSAxXSA9PT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhIHJlbGF0aXZlIG1vZHVsZSBuYW1lLCBsaWtlIC4vc29tZXRoaW5nLCBub3JtYWxpemUgaXQgdG8KICAgICAgICAgKiBhIHJlYWwgbmFtZSB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBwYXRoLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGl2ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2VOYW1lIGEgcmVhbCBuYW1lIHRoYXQgdGhlIG5hbWUgYXJnIGlzIHJlbGF0aXZlCiAgICAgICAgICogdG8uCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBseU1hcCBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgdmFsdWUuIFNob3VsZAogICAgICAgICAqIG9ubHkgYmUgZG9uZSBpZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgZm9yIGEgZGVwZW5kZW5jeSBJRC4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBub3JtYWxpemVkIG5hbWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciBwa2dNYWluLCBtYXBWYWx1ZSwgbmFtZVBhcnRzLCBpLCBqLCBuYW1lU2VnbWVudCwgbGFzdEluZGV4LAogICAgICAgICAgICAgICAgZm91bmRNYXAsIGZvdW5kSSwgZm91bmRTdGFyTWFwLCBzdGFySSwgbm9ybWFsaXplZEJhc2VQYXJ0cywKICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IChiYXNlTmFtZSAmJiBiYXNlTmFtZS5zcGxpdCgnLycpKSwKICAgICAgICAgICAgICAgIG1hcCA9IGNvbmZpZy5tYXAsCiAgICAgICAgICAgICAgICBzdGFyTWFwID0gbWFwICYmIG1hcFsnKiddOwoKICAgICAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG5hbWUubGVuZ3RoIC0gMTsKCiAgICAgICAgICAgICAgICAvLyBJZiB3YW50aW5nIG5vZGUgSUQgY29tcGF0aWJpbGl0eSwgc3RyaXAgLmpzIGZyb20gZW5kCiAgICAgICAgICAgICAgICAvLyBvZiBJRHMuIEhhdmUgdG8gZG8gdGhpcyBoZXJlLCBhbmQgbm90IGluIG5hbWVUb1VybAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub2RlIGFsbG93cyBlaXRoZXIgLmpzIG9yIG5vbiAuanMgdG8gbWFwCiAgICAgICAgICAgICAgICAvLyB0byBzYW1lIGZpbGUuCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5vZGVJZENvbXBhdCAmJiBqc1N1ZmZpeFJlZ0V4cC50ZXN0KG5hbWVbbGFzdEluZGV4XSkpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lW2xhc3RJbmRleF0gPSBuYW1lW2xhc3RJbmRleF0ucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0cyB3aXRoIGEgJy4nIHNvIG5lZWQgdGhlIGJhc2VOYW1lCiAgICAgICAgICAgICAgICBpZiAobmFtZVswXS5jaGFyQXQoMCkgPT09ICcuJyAmJiBiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgYmFzZU5hbWUgdG8gYXJyYXksIGFuZCBsb3Agb2ZmIHRoZSBsYXN0IHBhcnQsCiAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IC4gbWF0Y2hlcyB0aGF0ICdkaXJlY3RvcnknIGFuZCBub3QgbmFtZSBvZiB0aGUgYmFzZU5hbWUncwogICAgICAgICAgICAgICAgICAgIC8vbW9kdWxlLiBGb3IgaW5zdGFuY2UsIGJhc2VOYW1lIG9mICdvbmUvdHdvL3RocmVlJywgbWFwcyB0bwogICAgICAgICAgICAgICAgICAgIC8vJ29uZS90d28vdGhyZWUuanMnLCBidXQgd2Ugd2FudCB0aGUgZGlyZWN0b3J5LCAnb25lL3R3bycgZm9yCiAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5vcm1hbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5zbGljZSgwLCBiYXNlUGFydHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZWRCYXNlUGFydHMuY29uY2F0KG5hbWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyaW1Eb3RzKG5hbWUpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuam9pbignLycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FwcGx5IG1hcCBjb25maWcgaWYgYXZhaWxhYmxlLgogICAgICAgICAgICBpZiAoYXBwbHlNYXAgJiYgbWFwICYmIChiYXNlUGFydHMgfHwgc3Rhck1hcCkpIHsKICAgICAgICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKCiAgICAgICAgICAgICAgICBvdXRlckxvb3A6IGZvciAoaSA9IG5hbWVQYXJ0cy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lU2VnbWVudCA9IG5hbWVQYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9GaW5kIHRoZSBsb25nZXN0IGJhc2VOYW1lIHNlZ21lbnQgbWF0Y2ggaW4gdGhlIGNvbmZpZy4KICAgICAgICAgICAgICAgICAgICAgICAgLy9TbywgZG8gam9pbnMgb24gdGhlIGJpZ2dlc3QgdG8gc21hbGxlc3QgbGVuZ3RocyBvZiBiYXNlUGFydHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGJhc2VQYXJ0cy5sZW5ndGg7IGogPiAwOyBqIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlID0gZ2V0T3duKG1hcCwgYmFzZVBhcnRzLnNsaWNlKDAsIGopLmpvaW4oJy8nKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXNlTmFtZSBzZWdtZW50IGhhcyBjb25maWcsIGZpbmQgaWYgaXQgaGFzIG9uZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwVmFsdWUsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCwgdXBkYXRlIG5hbWUgdG8gdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXAgPSBtYXBWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYSBzdGFyIG1hcCBtYXRjaCwgYnV0IGp1c3QgaG9sZCBvbiB0byBpdCwKICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgc2hvcnRlciBzZWdtZW50IG1hdGNoIGxhdGVyIGluIGEgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAvL2NvbmZpZywgdGhlbiBmYXZvciBvdmVyIHRoaXMgc3RhciBtYXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFN0YXJNYXAgJiYgc3Rhck1hcCAmJiBnZXRPd24oc3Rhck1hcCwgbmFtZVNlZ21lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3Rhck1hcCA9IGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJJID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZE1hcCAmJiBmb3VuZFN0YXJNYXApIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IGZvdW5kU3Rhck1hcDsKICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBzdGFySTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXApIHsKICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMuc3BsaWNlKDAsIGZvdW5kSSwgZm91bmRNYXApOwogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHMuam9pbignLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgbmFtZSBwb2ludHMgdG8gYSBwYWNrYWdlJ3MgbmFtZSwgdXNlCiAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlIG1haW4gaW5zdGVhZC4KICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbmFtZSk7CgogICAgICAgICAgICByZXR1cm4gcGtnTWFpbiA/IHBrZ01haW4gOiBuYW1lOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KG5hbWUpIHsKICAgICAgICAgICAgaWYgKGlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgZWFjaChzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKSA9PT0gbmFtZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWNvbnRleHQnKSA9PT0gY29udGV4dC5jb250ZXh0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYXNQYXRoRmFsbGJhY2soaWQpIHsKICAgICAgICAgICAgdmFyIHBhdGhDb25maWcgPSBnZXRPd24oY29uZmlnLnBhdGhzLCBpZCk7CiAgICAgICAgICAgIGlmIChwYXRoQ29uZmlnICYmIGlzQXJyYXkocGF0aENvbmZpZykgJiYgcGF0aENvbmZpZy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvL1BvcCBvZmYgdGhlIGZpcnN0IGFycmF5IHZhbHVlLCBzaW5jZSBpdCBmYWlsZWQsIGFuZAogICAgICAgICAgICAgICAgLy9yZXRyeQogICAgICAgICAgICAgICAgcGF0aENvbmZpZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlLnVuZGVmKGlkKTsKCiAgICAgICAgICAgICAgICAvL0N1c3RvbSByZXF1aXJlIHRoYXQgZG9lcyBub3QgZG8gbWFwIHRyYW5zbGF0aW9uLCBzaW5jZQogICAgICAgICAgICAgICAgLy9JRCBpcyAiYWJzb2x1dGUiLCBhbHJlYWR5IG1hcHBlZC9yZXNvbHZlZC4KICAgICAgICAgICAgICAgIGNvbnRleHQubWFrZVJlcXVpcmUobnVsbCwgewogICAgICAgICAgICAgICAgICAgIHNraXBNYXA6IHRydWUKICAgICAgICAgICAgICAgIH0pKFtpZF0pOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL1R1cm5zIGEgcGx1Z2luIXJlc291cmNlIHRvIFtwbHVnaW4sIHJlc291cmNlXQogICAgICAgIC8vd2l0aCB0aGUgcGx1Z2luIGJlaW5nIHVuZGVmaW5lZCBpZiB0aGUgbmFtZQogICAgICAgIC8vZGlkIG5vdCBoYXZlIGEgcGx1Z2luIHByZWZpeC4KICAgICAgICBmdW5jdGlvbiBzcGxpdFByZWZpeChuYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmVmaXgsCiAgICAgICAgICAgICAgICBpbmRleCA9IG5hbWUgPyBuYW1lLmluZGV4T2YoJyEnKSA6IC0xOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcHJlZml4LCBuYW1lXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBtb2R1bGUgbWFwcGluZyB0aGF0IGluY2x1ZGVzIHBsdWdpbiBwcmVmaXgsIG1vZHVsZQogICAgICAgICAqIG5hbWUsIGFuZCBwYXRoLiBJZiBwYXJlbnRNb2R1bGVNYXAgaXMgcHJvdmlkZWQgaXQgd2lsbAogICAgICAgICAqIGFsc28gbm9ybWFsaXplIHRoZSBuYW1lIHZpYSByZXF1aXJlLm5vcm1hbGl6ZSgpCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmVudE1vZHVsZU1hcF0gcGFyZW50IG1vZHVsZSBtYXAKICAgICAgICAgKiBmb3IgdGhlIG1vZHVsZSBuYW1lLCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc05vcm1hbGl6ZWQ6IGlzIHRoZSBJRCBhbHJlYWR5IG5vcm1hbGl6ZWQuCiAgICAgICAgICogVGhpcyBpcyB0cnVlIGlmIHRoaXMgY2FsbCBpcyBkb25lIGZvciBhIGRlZmluZSgpIG1vZHVsZSBJRC4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwOiBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgSUQuCiAgICAgICAgICogU2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBkZXBlbmRlbmN5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYWtlTW9kdWxlTWFwKG5hbWUsIHBhcmVudE1vZHVsZU1hcCwgaXNOb3JtYWxpemVkLCBhcHBseU1hcCkgewogICAgICAgICAgICB2YXIgdXJsLCBwbHVnaW5Nb2R1bGUsIHN1ZmZpeCwgbmFtZVBhcnRzLAogICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbCwKICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnRNb2R1bGVNYXAgPyBwYXJlbnRNb2R1bGVNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWUgPSBuYW1lLAogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSB0cnVlLAogICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSAnJzsKCiAgICAgICAgICAgIC8vSWYgbm8gbmFtZSwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIHJlcXVpcmUgY2FsbCwgZ2VuZXJhdGUgYW4KICAgICAgICAgICAgLy9pbnRlcm5hbCBuYW1lLgogICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgIGlzRGVmaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuYW1lID0gJ19AcicgKyAocmVxdWlyZUNvdW50ZXIgKz0gMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5hbWVQYXJ0cyA9IHNwbGl0UHJlZml4KG5hbWUpOwogICAgICAgICAgICBwcmVmaXggPSBuYW1lUGFydHNbMF07CiAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHNbMV07CgogICAgICAgICAgICBpZiAocHJlZml4KSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBub3JtYWxpemUocHJlZml4LCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICBwbHVnaW5Nb2R1bGUgPSBnZXRPd24oZGVmaW5lZCwgcHJlZml4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9BY2NvdW50IGZvciByZWxhdGl2ZSBwYXRocyBpZiB0aGVyZSBpcyBhIGJhc2UgbmFtZS4KICAgICAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhhdCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiBIb3dldmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gaXQgZm9yIGRlZmluZSgpJ2QgIG1vZHVsZXMuIHJlcXVpcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVpciBjYWxsYmFja3MgKCM2OTkpLiBIb3dldmVyIGlmIGEgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25FcnJvciBpcyBzZXQsIHVzZSB0aGF0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5ldmVudHMuZXJyb3IgJiYgdGhpcy5tYXAuaXNEZWZpbmUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1hcCA9IHRoaXMubWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSB0aGlzLm1hcC5pc0RlZmluZSA/IFt0aGlzLm1hcC5pZF0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcigodGhpcy5lcnJvciA9IGVycikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZy4gSWYgcHJvbWlzZXMgY291bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCwgdGhpcyB3b3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBtYWtpbmcgZG8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgd2FudCB0byBjb21wbGV0ZWx5IGxvc2UgdGhlIGVycm9yLiBXaGlsZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbWVzcyB1cCBwcm9jZXNzaW5nIGFuZCBsZWFkIHRvIHNpbWlsYXIgcmVzdWx0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBidWcgMTQ0MCwgaXQgYXQgbGVhc3Qgc3VyZmFjZXMgdGhlIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIGxpdGVyYWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLmlzRGVmaW5lICYmICF0aGlzLmlnbm9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZFtpZF0gPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEub25SZXNvdXJjZUxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzTG9hZE1hcHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNMb2FkTWFwcy5wdXNoKGRlcE1hcC5ub3JtYWxpemVkTWFwIHx8IGRlcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uUmVzb3VyY2VMb2FkKGNvbnRleHQsIHRoaXMubWFwLCByZXNMb2FkTWFwcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9GaW5pc2hlZCB0aGUgZGVmaW5lIHN0YWdlLiBBbGxvdyBjYWxsaW5nIGNoZWNrIGFnYWluCiAgICAgICAgICAgICAgICAgICAgLy90byBhbGxvdyBkZWZpbmUgbm90aWZpY2F0aW9ucyBiZWxvdyBpbiB0aGUgY2FzZSBvZiBhCiAgICAgICAgICAgICAgICAgICAgLy9jeWNsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmluZWQgJiYgIXRoaXMuZGVmaW5lRW1pdHRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlZmluZWQnLCB0aGlzLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLm1hcCwKICAgICAgICAgICAgICAgICAgICBpZCA9IG1hcC5pZCwKICAgICAgICAgICAgICAgICAgICAvL01hcCBhbHJlYWR5IG5vcm1hbGl6ZWQgdGhlIHByZWZpeC4KICAgICAgICAgICAgICAgICAgICBwbHVnaW5NYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXgpOwoKICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKHBsdWdpbk1hcCk7CgogICAgICAgICAgICAgICAgb24ocGx1Z2luTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkLCBub3JtYWxpemVkTWFwLCBub3JtYWxpemVkTW9kLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCB0aGlzLm1hcC5pZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLm1hcC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gdGhpcy5tYXAucGFyZW50TWFwID8gdGhpcy5tYXAucGFyZW50TWFwLm5hbWUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKG1hcC5wYXJlbnRNYXAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1aWxkQ2FsbGJhY2s6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vSWYgY3VycmVudCBtYXAgaXMgbm90IG5vcm1hbGl6ZWQsIHdhaXQgZm9yIHRoYXQKICAgICAgICAgICAgICAgICAgICAvL25vcm1hbGl6ZWQgbmFtZSB0byBsb2FkIGluc3RlYWQgb2YgY29udGludWluZy4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBpZiB0aGUgcGx1Z2luIGFsbG93cyBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4ubm9ybWFsaXplKG5hbWUsIGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL3ByZWZpeCBhbmQgbmFtZSBzaG91bGQgYWxyZWFkeSBiZSBub3JtYWxpemVkLCBubyBuZWVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGFwcGx5aW5nIG1hcCBjb25maWcgYWdhaW4gZWl0aGVyLgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTWFwID0gbWFrZU1vZHVsZU1hcChtYXAucHJlZml4ICsgJyEnICsgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucGFyZW50TWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgb24obm9ybWFsaXplZE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5ub3JtYWxpemVkTWFwID0gbm9ybWFsaXplZE1hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE1vZCA9IGdldE93bihyZWdpc3RyeSwgbm9ybWFsaXplZE1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkTW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoaXMgcGx1Z2luLCBzbyBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jYW4gYmUgdHJhY2VkIGZvciBjeWNsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChub3JtYWxpemVkTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLm9uKCdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0lmIGEgcGF0aHMgY29uZmlnLCB0aGVuIGp1c3QgbG9hZCB0aGF0IGZpbGUgaW5zdGVhZCB0bwogICAgICAgICAgICAgICAgICAgIC8vcmVzb2x2ZSB0aGUgcGx1Z2luLCBhcyBpdCBpcyBidWlsdCBpbnRvIHRoYXQgcGF0aHMgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnVybCA9IGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxvYWQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBsb2FkLmVycm9yID0gYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gW2lkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRlbXAgdW5ub3JtYWxpemVkIG1vZHVsZXMgZm9yIHRoaXMgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSByZXNvbHZlZCBvdGhlcndpc2Ugbm93LgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaWQuaW5kZXhPZihpZCArICdfdW5ub3JtYWxpemVkJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KG1vZC5tYXAuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9BbGxvdyBwbHVnaW5zIHRvIGxvYWQgb3RoZXIgY29kZSB3aXRob3V0IGhhdmluZyB0byBrbm93IHRoZQogICAgICAgICAgICAgICAgICAgIC8vY29udGV4dCBvciBob3cgdG8gJ2NvbXBsZXRlJyB0aGUgbG9hZC4KICAgICAgICAgICAgICAgICAgICBsb2FkLmZyb21UZXh0ID0gYmluZCh0aGlzLCBmdW5jdGlvbiAodGV4dCwgdGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVNYXAgPSBtYWtlTW9kdWxlTWFwKG1vZHVsZU5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJhY3RpdmUgPSB1c2VJbnRlcmFjdGl2ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXMgb2YgMi4xLjAsIHN1cHBvcnQganVzdCBwYXNzaW5nIHRoZSB0ZXh0LCB0byByZWluZm9yY2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9mcm9tVGV4dCBvbmx5IGJlaW5nIGNhbGxlZCBvbmNlIHBlciByZXNvdXJjZS4gU3RpbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IG9sZCBzdHlsZSBvZiBwYXNzaW5nIG1vZHVsZU5hbWUgYnV0IGRpc2NhcmQKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGF0IG1vZHVsZU5hbWUgaW4gZmF2b3Igb2YgdGhlIGludGVybmFsIHJlZi4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRBbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0QWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1R1cm4gb2ZmIGludGVyYWN0aXZlIHNjcmlwdCBtYXRjaGluZyBmb3IgSUUgZm9yIGFueSBkZWZpbmUKICAgICAgICAgICAgICAgICAgICAgICAgLy9jYWxscyBpbiB0aGUgdGV4dCwgdGhlbiB0dXJuIGl0IGJhY2sgb24gYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1ByaW1lIHRoZSBzeXN0ZW0gYnkgY3JlYXRpbmcgYSBtb2R1bGUgaW5zdGFuY2UgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9UcmFuc2ZlciBhbnkgY29uZmlnIHRvIHRoaXMgb3RoZXIgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvcChjb25maWcuY29uZmlnLCBpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb25maWdbbW9kdWxlTmFtZV0gPSBjb25maWcuY29uZmlnW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5leGVjKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ2Zyb210ZXh0ZXZhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tVGV4dCBldmFsIGZvciAnICsgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZmFpbGVkOiAnICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgcGx1Z2luCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gobW9kdWxlTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcG9ydCBhbm9ueW1vdXMgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQobW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgdGhlIHZhbHVlIG9mIHRoYXQgbW9kdWxlIHRvIHRoZSB2YWx1ZSBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc291cmNlIElELgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUoW21vZHVsZU5hbWVdLCBsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9Vc2UgcGFyZW50TmFtZSBoZXJlIHNpbmNlIHRoZSBwbHVnaW4ncyBuYW1lIGlzIG5vdCByZWxpYWJsZSwKICAgICAgICAgICAgICAgICAgICAvL2NvdWxkIGJlIHNvbWUgd2VpcmQgc3RyaW5nIHdpdGggbm8gcGF0aCB0aGF0IGFjdHVhbGx5IHdhbnRzIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZWZlcmVuY2UgdGhlIHBhcmVudE5hbWUncyBwYXRoLgogICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2FkKG1hcC5uYW1lLCBsb2NhbFJlcXVpcmUsIGxvYWQsIGNvbmZpZyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwc1twbHVnaW5NYXAuaWRdID0gcGx1Z2luTWFwOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBlbmFibGVkUmVnaXN0cnlbdGhpcy5tYXAuaWRdID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9TZXQgZmxhZyBtZW50aW9uaW5nIHRoYXQgdGhlIG1vZHVsZSBpcyBlbmFibGluZywKICAgICAgICAgICAgICAgIC8vc28gdGhhdCBpbW1lZGlhdGUgY2FsbHMgdG8gdGhlIGRlZmluZWQgY2FsbGJhY2tzCiAgICAgICAgICAgICAgICAvL2ZvciBkZXBlbmRlbmNpZXMgZG8gbm90IHRyaWdnZXIgaW5hZHZlcnRlbnQgbG9hZAogICAgICAgICAgICAgICAgLy93aXRoIHRoZSBkZXBDb3VudCBzdGlsbCBiZWluZyB6ZXJvLgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9FbmFibGUgZWFjaCBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwTWFwLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkLCBtb2QsIGhhbmRsZXI7CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwTWFwID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0RlcGVuZGVuY3kgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgZGVwTWFwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHdpcmVkIHVwIHRvIHRoaXMgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXAgPSBtYWtlTW9kdWxlTWFwKGRlcE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXAuaXNEZWZpbmUgPyB0aGlzLm1hcCA6IHRoaXMubWFwLnBhcmVudE1hcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2tpcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwc1tpXSA9IGRlcE1hcDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRPd24oaGFuZGxlcnMsIGRlcE1hcC5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzW2ldID0gaGFuZGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBDb3VudCArPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKGRlcEV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuZGVmZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZURlcChpLCBkZXBFeHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZXJyb3InLCBiaW5kKHRoaXMsIHRoaXMuZXJyYmFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXZlbnRzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkaXJlY3QgZXJyYmFjayBvbiB0aGlzIG1vZHVsZSwgYnV0IHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBpcyBsaXN0ZW5pbmcgZm9yIGVycm9ycywgc28gYmUgc3VyZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvciBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlkID0gZGVwTWFwLmlkOwogICAgICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy9Ta2lwIHNwZWNpYWwgbW9kdWxlcyBsaWtlICdyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJwogICAgICAgICAgICAgICAgICAgIC8vQWxzbywgZG9uJ3QgY2FsbCBlbmFibGUgaWYgaXQgaXMgYWxyZWFkeSBlbmFibGVkLAogICAgICAgICAgICAgICAgICAgIC8vaW1wb3J0YW50IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2FzZXMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGhhbmRsZXJzLCBpZCkgJiYgbW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShkZXBNYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIHBsdWdpbiB0aGF0IGlzIHVzZWQgaW4KICAgICAgICAgICAgICAgIC8vYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoUHJvcCh0aGlzLnBsdWdpbk1hcHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbk1hcCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBnZXRPd24ocmVnaXN0cnksIHBsdWdpbk1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCAmJiAhbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiAobmFtZSwgY2IpIHsKICAgICAgICAgICAgICAgIHZhciBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIGlmICghY2JzKSB7CiAgICAgICAgICAgICAgICAgICAgY2JzID0gdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNicy5wdXNoKGNiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGVtaXQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHsKICAgICAgICAgICAgICAgIGVhY2godGhpcy5ldmVudHNbbmFtZV0sIGZ1bmN0aW9uIChjYikgewogICAgICAgICAgICAgICAgICAgIGNiKGV2dCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdGhhdCB0aGUgZXJyb3IgaGFuZGxlciB3YXMgdHJpZ2dlcmVkLCByZW1vdmUKICAgICAgICAgICAgICAgICAgICAvL3RoZSBsaXN0ZW5lcnMsIHNpbmNlIHRoaXMgYnJva2VuIE1vZHVsZSBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vY2FuIHN0YXkgYXJvdW5kIGZvciBhIHdoaWxlIGluIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbbmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjYWxsR2V0TW9kdWxlKGFyZ3MpIHsKICAgICAgICAgICAgLy9Ta2lwIG1vZHVsZXMgYWxyZWFkeSBkZWZpbmVkLgogICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgYXJnc1swXSkpIHsKICAgICAgICAgICAgICAgIGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKGFyZ3NbMF0sIG51bGwsIHRydWUpKS5pbml0KGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBmdW5jLCBuYW1lLCBpZU5hbWUpIHsKICAgICAgICAgICAgLy9GYXZvciBkZXRhY2hFdmVudCBiZWNhdXNlIG9mIElFOQogICAgICAgICAgICAvL2lzc3VlLCBzZWUgYXR0YWNoRXZlbnQvYWRkRXZlbnRMaXN0ZW5lciBjb21tZW50IGVsc2V3aGVyZQogICAgICAgICAgICAvL2luIHRoaXMgZmlsZS4KICAgICAgICAgICAgaWYgKG5vZGUuZGV0YWNoRXZlbnQgJiYgIWlzT3BlcmEpIHsKICAgICAgICAgICAgICAgIC8vUHJvYmFibHkgSUUuIElmIG5vdCBpdCB3aWxsIHRocm93IGFuIGVycm9yLCB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgICAgICAvL3VzZWZ1bCB0byBrbm93LgogICAgICAgICAgICAgICAgaWYgKGllTmFtZSkgewogICAgICAgICAgICAgICAgICAgIG5vZGUuZGV0YWNoRXZlbnQoaWVOYW1lLCBmdW5jKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGV2ZW50IGZyb20gYSBzY3JpcHQgbm9kZSwgZ2V0IHRoZSByZXF1aXJlanMgaW5mbyBmcm9tIGl0LAogICAgICAgICAqIGFuZCB0aGVuIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgbm9kZS4KICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBldnQKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFNjcmlwdERhdGEoZXZ0KSB7CiAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBhbmQgc3RpbGwgbWFrZXMgc2Vuc2UuCiAgICAgICAgICAgIHZhciBub2RlID0gZXZ0LmN1cnJlbnRUYXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7CgogICAgICAgICAgICAvL1JlbW92ZSB0aGUgbGlzdGVuZXJzIG9uY2UgaGVyZS4KICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobm9kZSwgY29udGV4dC5vblNjcmlwdExvYWQsICdsb2FkJywgJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IsICdlcnJvcicpOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICAgICAgICBpZDogbm9kZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJykKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGludGFrZURlZmluZXMoKSB7CiAgICAgICAgICAgIHZhciBhcmdzOwoKICAgICAgICAgICAgLy9BbnkgZGVmaW5lZCBtb2R1bGVzIGluIHRoZSBnbG9iYWwgcXVldWUsIGludGFrZSB0aGVtIG5vdy4KICAgICAgICAgICAgdGFrZUdsb2JhbFF1ZXVlKCk7CgogICAgICAgICAgICAvL01ha2Ugc3VyZSBhbnkgcmVtYWluaW5nIGRlZlF1ZXVlIGl0ZW1zIGdldCBwcm9wZXJseSBwcm9jZXNzZWQuCiAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBkZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ21pc21hdGNoJywgJ01pc21hdGNoZWQgYW5vbnltb3VzIGRlZmluZSgpIG1vZHVsZTogJyArCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL2FyZ3MgYXJlIGlkLCBkZXBzLCBmYWN0b3J5LiBTaG91bGQgYmUgbm9ybWFsaXplZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAvL2RlZmluZSgpIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwogICAgICAgIH0KCiAgICAgICAgY29udGV4dCA9IHsKICAgICAgICAgICAgY29uZmlnOiBjb25maWcsCiAgICAgICAgICAgIGNvbnRleHROYW1lOiBjb250ZXh0TmFtZSwKICAgICAgICAgICAgcmVnaXN0cnk6IHJlZ2lzdHJ5LAogICAgICAgICAgICBkZWZpbmVkOiBkZWZpbmVkLAogICAgICAgICAgICB1cmxGZXRjaGVkOiB1cmxGZXRjaGVkLAogICAgICAgICAgICBkZWZRdWV1ZTogZGVmUXVldWUsCiAgICAgICAgICAgIGRlZlF1ZXVlTWFwOiB7fSwKICAgICAgICAgICAgTW9kdWxlOiBNb2R1bGUsCiAgICAgICAgICAgIG1ha2VNb2R1bGVNYXA6IG1ha2VNb2R1bGVNYXAsCiAgICAgICAgICAgIG5leHRUaWNrOiByZXEubmV4dFRpY2ssCiAgICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0IGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlnIG9iamVjdCB0byBpbnRlZ3JhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25maWd1cmU6IGZ1bmN0aW9uIChjZmcpIHsKICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSBiYXNlVXJsIGVuZHMgaW4gYSBzbGFzaC4KICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybC5jaGFyQXQoY2ZnLmJhc2VVcmwubGVuZ3RoIC0gMSkgIT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICBjZmcuYmFzZVVybCArPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU2F2ZSBvZmYgdGhlIHBhdGhzIHNpbmNlIHRoZXkgcmVxdWlyZSBzcGVjaWFsIHByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAvL3RoZXkgYXJlIGFkZGl0aXZlLgogICAgICAgICAgICAgICAgdmFyIHNoaW0gPSBjb25maWcuc2hpbSwKICAgICAgICAgICAgICAgICAgICBvYmpzID0gewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9ianNbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKGNvbmZpZ1twcm9wXSwgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vUmV2ZXJzZSBtYXAgdGhlIGJ1bmRsZXMKICAgICAgICAgICAgICAgIGlmIChjZmcuYnVuZGxlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZy5idW5kbGVzLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlc01hcFt2XSA9IHByb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vTWVyZ2Ugc2hpbQogICAgICAgICAgICAgICAgaWYgKGNmZy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLnNoaW0sIGZ1bmN0aW9uICh2YWx1ZSwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUuZXhwb3J0cyB8fCB2YWx1ZS5pbml0KSAmJiAhdmFsdWUuZXhwb3J0c0ZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHBvcnRzRm4gPSBjb250ZXh0Lm1ha2VTaGltRXhwb3J0cyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2hpbVtpZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjb25maWcuc2hpbSA9IHNoaW07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9BZGp1c3QgcGFja2FnZXMgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgaWYgKGNmZy5wYWNrYWdlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2goY2ZnLnBhY2thZ2VzLCBmdW5jdGlvbiAocGtnT2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiwgbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBrZ09iaiA9IHR5cGVvZiBwa2dPYmogPT09ICdzdHJpbmcnID8ge25hbWU6IHBrZ09ian0gOiBwa2dPYmo7CgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGtnT2JqLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXRoc1tuYW1lXSA9IHBrZ09iai5sb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TYXZlIHBvaW50ZXIgdG8gbWFpbiBtb2R1bGUgSUQgZm9yIHBrZyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBsZWFkaW5nIGRvdCBpbiBtYWluLCBzbyBtYWluIHBhdGhzIGFyZSBub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCByZW1vdmUgYW55IHRyYWlsaW5nIC5qcywgc2luY2UgZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnZzIGhhdmUgZGlmZmVyZW50IGNvbnZlbnRpb25zOiBzb21lIHVzZSBhIG1vZHVsZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NvbWUgdXNlIGEgZmlsZSBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGtnc1tuYW1lXSA9IHBrZ09iai5uYW1lICsgJy8nICsgKHBrZ09iai5tYWluIHx8ICdtYWluJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGN1cnJEaXJSZWdFeHAsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGFyZSBhbnkgIndhaXRpbmcgdG8gZXhlY3V0ZSIgbW9kdWxlcyBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgbWFwcyBmb3IgdGhlbSwgc2luY2UgdGhlaXIgaW5mbywgbGlrZSBVUkxzIHRvIGxvYWQsCiAgICAgICAgICAgICAgICAvL21heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIG1vZHVsZSBhbHJlYWR5IGhhcyBpbml0IGNhbGxlZCwgc2luY2UgaXQgaXMgdG9vCiAgICAgICAgICAgICAgICAgICAgLy9sYXRlIHRvIG1vZGlmeSB0aGVtLCBhbmQgaWdub3JlIHVubm9ybWFsaXplZCBvbmVzCiAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGV5IGFyZSB0cmFuc2llbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2QuaW5pdGVkICYmICFtb2QubWFwLnVubm9ybWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2QubWFwID0gbWFrZU1vZHVsZU1hcChpZCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9JZiBhIGRlcHMgYXJyYXkgb3IgYSBjb25maWcgY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB0aGVuIGNhbGwKICAgICAgICAgICAgICAgIC8vcmVxdWlyZSB3aXRoIHRob3NlIGFyZ3MuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVxdWlyZSBpcyBkZWZpbmVkIGFzIGEKICAgICAgICAgICAgICAgIC8vY29uZmlnIG9iamVjdCBiZWZvcmUgcmVxdWlyZS5qcyBpcyBsb2FkZWQuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLmRlcHMgfHwgY2ZnLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlKGNmZy5kZXBzIHx8IFtdLCBjZmcuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVNoaW1FeHBvcnRzOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZuKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdmFsdWUuaW5pdC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgfHwgKHZhbHVlLmV4cG9ydHMgJiYgZ2V0R2xvYmFsKHZhbHVlLmV4cG9ydHMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG1ha2VSZXF1aXJlOiBmdW5jdGlvbiAocmVsTWFwLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbFJlcXVpcmUoZGVwcywgY2FsbGJhY2ssIGVycmJhY2spIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1hcCwgcmVxdWlyZU1vZDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlQnVpbGRDYWxsYmFjayAmJiBjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5fX3JlcXVpcmVKc0J1aWxkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdyZXF1aXJlYXJncycsICdJbnZhbGlkIHJlcXVpcmUgY2FsbCcpLCBlcnJiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiByZXF1aXJlfGV4cG9ydHN8bW9kdWxlIGFyZSByZXF1ZXN0ZWQsIGdldCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy92YWx1ZSBmb3IgdGhlbSBmcm9tIHRoZSBzcGVjaWFsIGhhbmRsZXJzLiBDYXZlYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBvbmx5IHdvcmtzIHdoaWxlIG1vZHVsZSBpcyBiZWluZyBkZWZpbmVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsTWFwICYmIGhhc1Byb3AoaGFuZGxlcnMsIGRlcHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcnNbZGVwc10ocmVnaXN0cnlbcmVsTWFwLmlkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMgYWNjZXNzIHRvIG9uZSBtb2R1bGUuIElmIHJlcXVpcmUuZ2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZhaWxhYmxlIChhcyBpbiB0aGUgTm9kZSBhZGFwdGVyKSwgcHJlZmVyIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEuZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxLmdldChjb250ZXh0LCBkZXBzLCByZWxNYXAsIGxvY2FsUmVxdWlyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIG1vZHVsZSBuYW1lLCBpZiBpdCBjb250YWlucyAuIG9yIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwcywgcmVsTWFwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGRlZmluZWQsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub3Rsb2FkZWQnLCAnTW9kdWxlIG5hbWUgIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQgZm9yIGNvbnRleHQ6ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbE1hcCA/ICcnIDogJy4gVXNlIHJlcXVpcmUoW10pJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0dyYWIgZGVmaW5lcyB3YWl0aW5nIGluIHRoZSBnbG9iYWwgcXVldWUuCiAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAvL01hcmsgYWxsIHRoZSBkZXBlbmRlbmNpZXMgYXMgbmVlZGluZyB0byBiZSBsb2FkZWQuCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vU29tZSBkZWZpbmVzIGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBzaW5jZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwsIGNvbGxlY3QgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZCA9IGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKG51bGwsIHJlbE1hcCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9yZSBpZiBtYXAgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGwgZm9yIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5za2lwTWFwID0gb3B0aW9ucy5za2lwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5pbml0KGRlcHMsIGNhbGxiYWNrLCBlcnJiYWNrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaXhpbihsb2NhbFJlcXVpcmUsIHsKICAgICAgICAgICAgICAgICAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlciwKCiAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSArIC5leHRlbnNpb24gaW50byBhbiBVUkwgcGF0aC4KICAgICAgICAgICAgICAgICAgICAgKiAqUmVxdWlyZXMqIHRoZSB1c2Ugb2YgYSBtb2R1bGUgbmFtZS4gSXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAgICAgICAgICAqIHBsYWluIFVSTHMgbGlrZSBuYW1lVG9VcmwuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lUGx1c0V4dCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtb2R1bGVOYW1lUGx1c0V4dC5sYXN0SW5kZXhPZignLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IG1vZHVsZU5hbWVQbHVzRXh0LnNwbGl0KCcvJylbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlbGF0aXZlID0gc2VnbWVudCA9PT0gJy4nIHx8IHNlZ21lbnQgPT09ICcuLic7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0hhdmUgYSBmaWxlIGV4dGVuc2lvbiBhbGlhcywgYW5kIGl0IGlzIG5vdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3RzIGZyb20gYSByZWxhdGl2ZSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xICYmICghaXNSZWxhdGl2ZSB8fCBpbmRleCA+IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBtb2R1bGVOYW1lUGx1c0V4dC5zdWJzdHJpbmcoaW5kZXgsIG1vZHVsZU5hbWVQbHVzRXh0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lUGx1c0V4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5hbWVUb1VybChub3JtYWxpemUobW9kdWxlTmFtZVBsdXNFeHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbE1hcCAmJiByZWxNYXAuaWQsIHRydWUpLCBleHQsICB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZDogZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcm9wKGRlZmluZWQsIGlkKSB8fCBoYXNQcm9wKHJlZ2lzdHJ5LCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9Pbmx5IGFsbG93IHVuZGVmIG9uIHRvcCBsZXZlbCByZXF1aXJlIGNhbGxzCiAgICAgICAgICAgICAgICBpZiAoIXJlbE1hcCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZS51bmRlZiA9IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgYW55IHdhaXRpbmcgZGVmaW5lKCkgY2FsbHMgdG8gdGhpcyBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpeCBmb3IgIzQwOAogICAgICAgICAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBtb2QudW5kZWZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxGZXRjaGVkW21hcC51cmxdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5kZWZFdmVudHNbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiBxdWV1ZWQgZGVmaW5lcyB0b28uIEdvIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAvL2luIGFycmF5IHNvIHRoYXQgdGhlIHNwbGljZXMgZG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzcyB1cCB0aGUgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUmV2ZXJzZShkZWZRdWV1ZSwgZnVuY3Rpb24oYXJncywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZGVmUXVldWVNYXBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ib2xkIG9uIHRvIGxpc3RlbmVycyBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gYmUgcmVsb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNpbmcgYSBkaWZmZXJlbnQgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5ldmVudHMuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmRXZlbnRzW2lkXSA9IG1vZC5ldmVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlcXVpcmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHRvIGVuYWJsZSBhIG1vZHVsZSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgcmVnaXN0cnkKICAgICAgICAgICAgICogYXdhaXRpbmcgZW5hYmxlbWVudC4gQSBzZWNvbmQgYXJnLCBwYXJlbnQsIHRoZSBwYXJlbnQgbW9kdWxlLAogICAgICAgICAgICAgKiBpcyBwYXNzZWQgaW4gZm9yIGNvbnRleHQsIHdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieQogICAgICAgICAgICAgKiB0aGUgb3B0aW1pemVyLiBOb3Qgc2hvd24gaGVyZSB0byBrZWVwIGNvZGUgY29tcGFjdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgZGVwTWFwLmlkKTsKICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGUoZGVwTWFwKS5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBlbnZpcm9ubWVudCBhZGFwdGVycyB0byBjb21wbGV0ZSBhIGxvYWQgZXZlbnQuCiAgICAgICAgICAgICAqIEEgbG9hZCBldmVudCBjb3VsZCBiZSBhIHNjcmlwdCBsb2FkIG9yIGp1c3QgYSBsb2FkIHBhc3MgZnJvbSBhIHN5bmNocm9ub3VzCiAgICAgICAgICAgICAqIGxvYWQgY2FsbC4KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBwb3RlbnRpYWxseSBjb21wbGV0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbXBsZXRlTG9hZDogZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCwgYXJncywgbW9kLAogICAgICAgICAgICAgICAgICAgIHNoaW0gPSBnZXRPd24oY29uZmlnLnNoaW0sIG1vZHVsZU5hbWUpIHx8IHt9LAogICAgICAgICAgICAgICAgICAgIHNoRXhwb3J0cyA9IHNoaW0uZXhwb3J0czsKCiAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYWxyZWFkeSBmb3VuZCBhbiBhbm9ueW1vdXMgbW9kdWxlIGFuZCBib3VuZCBpdAogICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoaXMgbmFtZSwgdGhlbiB0aGlzIGlzIHNvbWUgb3RoZXIgYW5vbiBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgLy93YWl0aW5nIGZvciBpdHMgY29tcGxldGVMb2FkIHRvIGZpcmUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZvdW5kIG1hdGNoaW5nIGRlZmluZSBjYWxsIGZvciB0aGlzIHNjcmlwdCEKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXAgPSB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIHRoaXMgYWZ0ZXIgdGhlIGN5Y2xlIG9mIGNhbGxHZXRNb2R1bGUgaW4gY2FzZSB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICAvL29mIHRob3NlIGNhbGxzL2luaXQgY2FsbHMgY2hhbmdlcyB0aGUgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgIWhhc1Byb3AoZGVmaW5lZCwgbW9kdWxlTmFtZSkgJiYgbW9kICYmICFtb2QuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbmZvcmNlRGVmaW5lICYmICghc2hFeHBvcnRzIHx8ICFnZXRHbG9iYWwoc2hFeHBvcnRzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BhdGhGYWxsYmFjayhtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub2RlZmluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdObyBkZWZpbmUgY2FsbCBmb3IgJyArIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9BIHNjcmlwdCB0aGF0IGRvZXMgbm90IGNhbGwgZGVmaW5lKCksIHNvIGp1c3Qgc2ltdWxhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgY2FsbCBmb3IgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoW21vZHVsZU5hbWUsIChzaGltLmRlcHMgfHwgW10pLCBzaGltLmV4cG9ydHNGbl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbnZlcnRzIGEgbW9kdWxlIG5hbWUgdG8gYSBmaWxlIHBhdGguIFN1cHBvcnRzIGNhc2VzIHdoZXJlCiAgICAgICAgICAgICAqIG1vZHVsZU5hbWUgbWF5IGFjdHVhbGx5IGJlIGp1c3QgYW4gVVJMLgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgaXQgKipkb2VzIG5vdCoqIGNhbGwgbm9ybWFsaXplIG9uIHRoZSBtb2R1bGVOYW1lLAogICAgICAgICAgICAgKiBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWQuIFRoaXMgaXMgYW4KICAgICAgICAgICAgICogaW50ZXJuYWwgQVBJLCBub3QgYSBwdWJsaWMgb25lLiBVc2UgdG9VcmwgZm9yIHRoZSBwdWJsaWMgQVBJLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbmFtZVRvVXJsOiBmdW5jdGlvbiAobW9kdWxlTmFtZSwgZXh0LCBza2lwRXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aHMsIHN5bXMsIGksIHBhcmVudE1vZHVsZSwgdXJsLAogICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsIGJ1bmRsZUlkLAogICAgICAgICAgICAgICAgICAgIHBrZ01haW4gPSBnZXRPd24oY29uZmlnLnBrZ3MsIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmIChwa2dNYWluKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IHBrZ01haW47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnVuZGxlSWQgPSBnZXRPd24oYnVuZGxlc01hcCwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkLCBleHQsIHNraXBFeHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgYSBjb2xvbiBpcyBpbiB0aGUgVVJMLCBpdCBpbmRpY2F0ZXMgYSBwcm90b2NvbCBpcyB1c2VkIGFuZCBpdCBpcyBqdXN0CiAgICAgICAgICAgICAgICAvL2FuIFVSTCB0byBhIGZpbGUsIG9yIGlmIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2gsIGNvbnRhaW5zIGEgcXVlcnkgYXJnIChpLmUuID8pCiAgICAgICAgICAgICAgICAvL29yIGVuZHMgd2l0aCAuanMsIHRoZW4gYXNzdW1lIHRoZSB1c2VyIG1lYW50IHRvIHVzZSBhbiB1cmwgYW5kIG5vdCBhIG1vZHVsZSBpZC4KICAgICAgICAgICAgICAgIC8vVGhlIHNsYXNoIGlzIGltcG9ydGFudCBmb3IgcHJvdG9jb2wtbGVzcyBVUkxzIGFzIHdlbGwgYXMgZnVsbCBwYXRocy4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIHBsYWluIHBhdGgsIG5vdCBtb2R1bGUgbmFtZSBsb29rdXAsIHNvIGp1c3QgcmV0dXJuIGl0LgogICAgICAgICAgICAgICAgICAgIC8vQWRkIGV4dGVuc2lvbiBpZiBpdCBpcyBpbmNsdWRlZC4gVGhpcyBpcyBhIGJpdCB3b25reSwgb25seSBub24tLmpzIHRoaW5ncyBwYXNzCiAgICAgICAgICAgICAgICAgICAgLy9hbiBleHRlbnNpb24sIHRoaXMgbWV0aG9kIHByb2JhYmx5IG5lZWRzIHRvIGJlIHJld29ya2VkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IG1vZHVsZU5hbWUgKyAoZXh0IHx8ICcnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIG1vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBjb25maWcucGF0aHM7CgogICAgICAgICAgICAgICAgICAgIHN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZWFjaCBtb2R1bGUgbmFtZSBzZWdtZW50LCBzZWUgaWYgdGhlcmUgaXMgYSBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy9yZWdpc3RlcmVkIGZvciBpdC4gU3RhcnQgd2l0aCBtb3N0IHNwZWNpZmljIG5hbWUKICAgICAgICAgICAgICAgICAgICAvL2FuZCB3b3JrIHVwIGZyb20gaXQuCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc3ltcy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gZ2V0T3duKHBhdGhzLCBwYXJlbnRNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbiBhcnJheSwgaXQgbWVhbnMgdGhlcmUgYXJlIGEgZmV3IGNob2ljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Nob29zZSB0aGUgb25lIHRoYXQgaXMgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkocGFyZW50UGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGFyZW50UGF0aFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuc3BsaWNlKDAsIGksIHBhcmVudFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSm9pbiB0aGUgcGF0aCBwYXJ0cyB0b2dldGhlciwgdGhlbiBmaWd1cmUgb3V0IGlmIGJhc2VVcmwgaXMgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IHN5bXMuam9pbignLycpOwogICAgICAgICAgICAgICAgICAgIHVybCArPSAoZXh0IHx8ICgvXmRhdGFcOnxcPy8udGVzdCh1cmwpIHx8IHNraXBFeHQgPyAnJyA6ICcuanMnKSk7CiAgICAgICAgICAgICAgICAgICAgdXJsID0gKHVybC5jaGFyQXQoMCkgPT09ICcvJyB8fCB1cmwubWF0Y2goL15bXHdcK1wuXC1dKzovKSA/ICcnIDogY29uZmlnLmJhc2VVcmwpICsgdXJsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcudXJsQXJncyA/IHVybCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVybEFyZ3MpIDogdXJsOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9EZWxlZ2F0ZXMgdG8gcmVxLmxvYWQuIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0bwogICAgICAgICAgICAvL2FsbG93IG92ZXJyaWRpbmcgaW4gdGhlIG9wdGltaXplci4KICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24gKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgIHJlcS5sb2FkKGNvbnRleHQsIGlkLCB1cmwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV4ZWN1dGVzIGEgbW9kdWxlIGNhbGxiYWNrIGZ1bmN0aW9uLiBCcm9rZW4gb3V0IGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24KICAgICAgICAgICAgICogc29sZWx5IHRvIGFsbG93IHRoZSBidWlsZCBzeXN0ZW0gdG8gc2VxdWVuY2UgdGhlIGZpbGVzIGluIHRoZSBidWlsdAogICAgICAgICAgICAgKiBsYXllciBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBleGVjQ2I6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgYXJncywgZXhwb3J0cykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KGV4cG9ydHMsIGFyZ3MpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGNhbGxiYWNrIGZvciBzY3JpcHQgbG9hZHMsIHVzZWQgdG8gY2hlY2sgc3RhdHVzIG9mIGxvYWRpbmcuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dCB0aGUgZXZlbnQgZnJvbSB0aGUgYnJvd3NlciBmb3IgdGhlIHNjcmlwdAogICAgICAgICAgICAgKiB0aGF0IHdhcyBsb2FkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdExvYWQ6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgICAgIC8vYWxsIG9sZCBicm93c2VycyB3aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHRoaXMgb25lIHdhcyBlYXN5IGVub3VnaAogICAgICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgICAgIGlmIChldnQudHlwZSA9PT0gJ2xvYWQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkeVJlZ0V4cC50ZXN0KChldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9SZXNldCBpbnRlcmFjdGl2ZSBzY3JpcHQgc28gYSBzY3JpcHQgbm9kZSBpcyBub3QgaGVsZCBvbnRvIGZvcgogICAgICAgICAgICAgICAgICAgIC8vdG8gbG9uZy4KICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvdXQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXRTY3JpcHREYXRhKGV2dCk7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQoZGF0YS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHNjcmlwdCBlcnJvcnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdEVycm9yOiBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgIGlmICghaGFzUGF0aEZhbGxiYWNrKGRhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19AcicpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLmRlcE1hcHMsIGZ1bmN0aW9uKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBNYXAuaWQgPT09IGRhdGEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ob2RlQ3JlYXRlZCkgewogICAgICAgICAgICAgICAgY29uZmlnLm9uTm9kZUNyZWF0ZWQobm9kZSwgY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL2lzc3Vlcy8xODcKICAgICAgICAgICAgICAgICAgICAvL2lmIHdlIGNhbiBOT1QgZmluZCBbbmF0aXZlIGNvZGVdIHRoZW4gaXQgbXVzdCBOT1QgbmF0aXZlbHkgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgIC8vaW4gSUU4LCBub2RlLmF0dGFjaEV2ZW50IGRvZXMgbm90IGhhdmUgdG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGUgdGVzdCBmb3IgIltuYXRpdmUgY29kZSIgd2l0aCBubyBjbG9zaW5nIGJyYWNlLCBzZWU6CiAgICAgICAgICAgICAgICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvaXNzdWVzLzI3MwogICAgICAgICAgICAgICAgICAgICEobm9kZS5hdHRhY2hFdmVudC50b1N0cmluZyAmJiBub2RlLmF0dGFjaEV2ZW50LnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlJykgPCAwKSAmJgogICAgICAgICAgICAgICAgICAgICFpc09wZXJhKSB7CiAgICAgICAgICAgICAgICAvL1Byb2JhYmx5IElFLiBJRSAoYXQgbGVhc3QgNi04KSBkbyBub3QgZmlyZQogICAgICAgICAgICAgICAgLy9zY3JpcHQgb25sb2FkIHJpZ2h0IGFmdGVyIGV4ZWN1dGluZyB0aGUgc2NyaXB0LCBzbwogICAgICAgICAgICAgICAgLy93ZSBjYW5ub3QgdGllIHRoZSBhbm9ueW1vdXMgZGVmaW5lIGNhbGwgdG8gYSBuYW1lLgogICAgICAgICAgICAgICAgLy9Ib3dldmVyLCBJRSByZXBvcnRzIHRoZSBzY3JpcHQgYXMgYmVpbmcgaW4gJ2ludGVyYWN0aXZlJwogICAgICAgICAgICAgICAgLy9yZWFkeVN0YXRlIGF0IHRoZSB0aW1lIG9mIHRoZSBkZWZpbmUgY2FsbC4KICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBub2RlLmF0dGFjaEV2ZW50KCdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCk7CiAgICAgICAgICAgICAgICAvL0l0IHdvdWxkIGJlIGdyZWF0IHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIGhlcmUgdG8gY2F0Y2gKICAgICAgICAgICAgICAgIC8vNDA0cyBpbiBJRTkrLiBIb3dldmVyLCBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2lsbCBmaXJlIGJlZm9yZQogICAgICAgICAgICAgICAgLy90aGUgZXJyb3IgaGFuZGxlciwgc28gdGhhdCBkb2VzIG5vdCBoZWxwLiBJZiBhZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgICAgICAvL2lzIHVzZWQsIHRoZW4gSUUgd2lsbCBmaXJlIGVycm9yIGJlZm9yZSBsb2FkLCBidXQgd2UgY2Fubm90CiAgICAgICAgICAgICAgICAvL3VzZSB0aGF0IHBhdGh3YXkgZ2l2ZW4gdGhlIGNvbm5lY3QubWljcm9zb2Z0LmNvbSBpc3N1ZQogICAgICAgICAgICAgICAgLy9tZW50aW9uZWQgYWJvdmUgYWJvdXQgbm90IGRvaW5nIHRoZSAnc2NyaXB0IGV4ZWN1dGUsCiAgICAgICAgICAgICAgICAvL3RoZW4gZmlyZSB0aGUgc2NyaXB0IGxvYWQgZXZlbnQgbGlzdGVuZXIgYmVmb3JlIGV4ZWN1dGUKICAgICAgICAgICAgICAgIC8vbmV4dCBzY3JpcHQnIHRoYXQgb3RoZXIgYnJvd3NlcnMgZG8uCiAgICAgICAgICAgICAgICAvL0Jlc3QgaG9wZTogSUUxMCBmaXhlcyB0aGUgaXNzdWVzLAogICAgICAgICAgICAgICAgLy9hbmQgdGhlbiBkZXN0cm95cyBhbGwgaW5zdGFsbHMgb2YgSUUgNi05LgogICAgICAgICAgICAgICAgLy9ub2RlLmF0dGFjaEV2ZW50KCdvbmVycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNvbnRleHQub25TY3JpcHRMb2FkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zcmMgPSB1cmw7CgogICAgICAgICAgICAvL0ZvciBzb21lIGNhY2hlIGNhc2VzIGluIElFIDYtOCwgdGhlIHNjcmlwdCBleGVjdXRlcyBiZWZvcmUgdGhlIGVuZAogICAgICAgICAgICAvL29mIHRoZSBhcHBlbmRDaGlsZCBleGVjdXRpb24sIHNvIHRvIHRpZSBhbiBhbm9ueW1vdXMgZGVmaW5lCiAgICAgICAgICAgIC8vY2FsbCB0byB0aGUgbW9kdWxlIG5hbWUgKHdoaWNoIGlzIHN0b3JlZCBvbiB0aGUgbm9kZSksIGhvbGQgb24KICAgICAgICAgICAgLy90byBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUsIGJ1dCBjbGVhciBhZnRlciB0aGUgRE9NIGluc2VydGlvbi4KICAgICAgICAgICAgY3VycmVudGx5QWRkaW5nU2NyaXB0ID0gbm9kZTsKICAgICAgICAgICAgaWYgKGJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBoZWFkLmluc2VydEJlZm9yZShub2RlLCBiYXNlRWxlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG51bGw7CgogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9IGVsc2UgaWYgKGlzV2ViV29ya2VyKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvL0luIGEgd2ViIHdvcmtlciwgdXNlIGltcG9ydFNjcmlwdHMuIFRoaXMgaXMgbm90IGEgdmVyeQogICAgICAgICAgICAgICAgLy9lZmZpY2llbnQgdXNlIG9mIGltcG9ydFNjcmlwdHMsIGltcG9ydFNjcmlwdHMgd2lsbCBibG9jayB1bnRpbAogICAgICAgICAgICAgICAgLy9pdHMgc2NyaXB0IGlzIGRvd25sb2FkZWQgYW5kIGV2YWx1YXRlZC4gSG93ZXZlciwgaWYgd2ViIHdvcmtlcnMKICAgICAgICAgICAgICAgIC8vYXJlIGluIHBsYXksIHRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGEgYnVpbGQgaGFzIGJlZW4gZG9uZSBzbwogICAgICAgICAgICAgICAgLy90aGF0IG9ubHkgb25lIHNjcmlwdCBuZWVkcyB0byBiZSBsb2FkZWQgYW55d2F5LiBUaGlzIG1heSBuZWVkCiAgICAgICAgICAgICAgICAvL3RvIGJlIHJlZXZhbHVhdGVkIGlmIG90aGVyIHVzZSBjYXNlcyBiZWNvbWUgY29tbW9uLgogICAgICAgICAgICAgICAgaW1wb3J0U2NyaXB0cyh1cmwpOwoKICAgICAgICAgICAgICAgIC8vQWNjb3VudCBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICAgICAgICAgIGNvbnRleHQuY29tcGxldGVMb2FkKG1vZHVsZU5hbWUpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IobWFrZUVycm9yKCdpbXBvcnRzY3JpcHRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0U2NyaXB0cyBmYWlsZWQgZm9yICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lICsgJyBhdCAnICsgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCkgewogICAgICAgIGlmIChpbnRlcmFjdGl2ZVNjcmlwdCAmJiBpbnRlcmFjdGl2ZVNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgICAgICB9CgogICAgICAgIGVhY2hSZXZlcnNlKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdCkgewogICAgICAgICAgICBpZiAoc2NyaXB0LnJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoaW50ZXJhY3RpdmVTY3JpcHQgPSBzY3JpcHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0OwogICAgfQoKICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gc2NyaXB0IGF0dHJpYnV0ZSwgd2hpY2ggY291bGQgYWxzbyBhZGp1c3QgdGhlIGJhc2VVcmwuCiAgICBpZiAoaXNCcm93c2VyICYmICFjZmcuc2tpcERhdGFNYWluKSB7CiAgICAgICAgLy9GaWd1cmUgb3V0IGJhc2VVcmwuIEdldCBpdCBmcm9tIHRoZSBzY3JpcHQgdGFnIHdpdGggcmVxdWlyZS5qcyBpbiBpdC4KICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgLy9TZXQgdGhlICdoZWFkJyB3aGVyZSB3ZSBjYW4gYXBwZW5kIGNoaWxkcmVuIGJ5CiAgICAgICAgICAgIC8vdXNpbmcgdGhlIHNjcmlwdCdzIHBhcmVudC4KICAgICAgICAgICAgaWYgKCFoZWFkKSB7CiAgICAgICAgICAgICAgICBoZWFkID0gc2NyaXB0LnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gYXR0cmlidXRlIHRvIHNldCBtYWluIHNjcmlwdCBmb3IgdGhlIHBhZ2UKICAgICAgICAgICAgLy90byBsb2FkLiBJZiBpdCBpcyB0aGVyZSwgdGhlIHBhdGggdG8gZGF0YSBtYWluIGJlY29tZXMgdGhlCiAgICAgICAgICAgIC8vYmFzZVVybCwgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LgogICAgICAgICAgICBkYXRhTWFpbiA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWFpbicpOwogICAgICAgICAgICBpZiAoZGF0YU1haW4pIHsKICAgICAgICAgICAgICAgIC8vUHJlc2VydmUgZGF0YU1haW4gaW4gY2FzZSBpdCBpcyBhIHBhdGggKGkuZS4gY29udGFpbnMgJz8nKQogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwoKICAgICAgICAgICAgICAgIC8vU2V0IGZpbmFsIGJhc2VVcmwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYW4gZXhwbGljaXQgb25lLgogICAgICAgICAgICAgICAgaWYgKCFjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvZmYgdGhlIGRpcmVjdG9yeSBvZiBkYXRhLW1haW4gZm9yIHVzZSBhcyB0aGUKICAgICAgICAgICAgICAgICAgICAvL2Jhc2VVcmwuCiAgICAgICAgICAgICAgICAgICAgc3JjID0gbWFpblNjcmlwdC5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBzcmMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHNyYy5sZW5ndGggPyBzcmMuam9pbignLycpICArICcvJyA6ICcuLyc7CgogICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsID0gc3ViUGF0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiBhbnkgdHJhaWxpbmcgLmpzIHNpbmNlIG1haW5TY3JpcHQgaXMgbm93CiAgICAgICAgICAgICAgICAvL2xpa2UgYSBtb2R1bGUgbmFtZS4KICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBtYWluU2NyaXB0LnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKCiAgICAgICAgICAgICAgICAvL0lmIG1haW5TY3JpcHQgaXMgc3RpbGwgYSBwYXRoLCBmYWxsIGJhY2sgdG8gZGF0YU1haW4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSkgewogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1B1dCB0aGUgZGF0YS1tYWluIHNjcmlwdCBpbiB0aGUgZmlsZXMgdG8gbG9hZC4KICAgICAgICAgICAgICAgIGNmZy5kZXBzID0gY2ZnLmRlcHMgPyBjZmcuZGVwcy5jb25jYXQobWFpblNjcmlwdCkgOiBbbWFpblNjcmlwdF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgZGVmaW5pdGlvbnMgb2YgbW9kdWxlcy4gRGlmZmVycyBmcm9tCiAgICAgKiByZXF1aXJlKCkgaW4gdGhhdCBhIHN0cmluZyBmb3IgdGhlIG1vZHVsZSBzaG91bGQgYmUgdGhlIGZpcnN0IGFyZ3VtZW50LAogICAgICogYW5kIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkIHNob3VsZAogICAgICogcmV0dXJuIGEgdmFsdWUgdG8gZGVmaW5lIHRoZSBtb2R1bGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYXJndW1lbnQncwogICAgICogbmFtZS4KICAgICAqLwogICAgZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIG5vZGUsIGNvbnRleHQ7CgogICAgICAgIC8vQWxsb3cgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAvL0FkanVzdCBhcmdzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbmFtZTsKICAgICAgICAgICAgbmFtZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvL1RoaXMgbW9kdWxlIG1heSBub3QgaGF2ZSBkZXBlbmRlbmNpZXMKICAgICAgICBpZiAoIWlzQXJyYXkoZGVwcykpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vSWYgbm8gbmFtZSwgYW5kIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24sIHRoZW4gZmlndXJlIG91dCBpZiBpdCBhCiAgICAgICAgLy9Db21tb25KUyB0aGluZyB3aXRoIGRlcGVuZGVuY2llcy4KICAgICAgICBpZiAoIWRlcHMgJiYgaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgZGVwcyA9IFtdOwogICAgICAgICAgICAvL1JlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBjYWxsYmFjayBzdHJpbmcsCiAgICAgICAgICAgIC8vbG9vayBmb3IgcmVxdWlyZSBjYWxscywgYW5kIHB1bGwgdGhlbSBpbnRvIHRoZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIC8vYnV0IG9ubHkgaWYgdGhlcmUgYXJlIGZ1bmN0aW9uIGFyZ3MuCiAgICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjb21tZW50UmVnRXhwLCAnJykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjanNSZXF1aXJlUmVnRXhwLCBmdW5jdGlvbiAobWF0Y2gsIGRlcCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL01heSBiZSBhIENvbW1vbkpTIHRoaW5nIGV2ZW4gd2l0aG91dCByZXF1aXJlIGNhbGxzLCBidXQgc3RpbGwKICAgICAgICAgICAgICAgIC8vY291bGQgdXNlIGV4cG9ydHMsIGFuZCBtb2R1bGUuIEF2b2lkIGRvaW5nIGV4cG9ydHMgYW5kIG1vZHVsZQogICAgICAgICAgICAgICAgLy93b3JrIHRob3VnaCBpZiBpdCBqdXN0IG5lZWRzIHJlcXVpcmUuCiAgICAgICAgICAgICAgICAvL1JFUVVJUkVTIHRoZSBmdW5jdGlvbiB0byBleHBlY3QgdGhlIENvbW1vbkpTIHZhcmlhYmxlcyBpbiB0aGUKICAgICAgICAgICAgICAgIC8vb3JkZXIgbGlzdGVkIGJlbG93LgogICAgICAgICAgICAgICAgZGVwcyA9IChjYWxsYmFjay5sZW5ndGggPT09IDEgPyBbJ3JlcXVpcmUnXSA6IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddKS5jb25jYXQoZGVwcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vSWYgaW4gSUUgNi04IGFuZCBoaXQgYW4gYW5vbnltb3VzIGRlZmluZSgpIGNhbGwsIGRvIHRoZSBpbnRlcmFjdGl2ZQogICAgICAgIC8vd29yay4KICAgICAgICBpZiAodXNlSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgbm9kZSA9IGN1cnJlbnRseUFkZGluZ1NjcmlwdCB8fCBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpOwogICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0c1tub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9BbHdheXMgc2F2ZSBvZmYgZXZhbHVhdGluZyB0aGUgZGVmIGNhbGwgdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgaGFuZGxlci4KICAgICAgICAvL1RoaXMgYWxsb3dzIG11bHRpcGxlIG1vZHVsZXMgdG8gYmUgaW4gYSBmaWxlIHdpdGhvdXQgcHJlbWF0dXJlbHkKICAgICAgICAvL3RyYWNpbmcgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3dzIGZvciBhbm9ueW1vdXMgbW9kdWxlIHN1cHBvcnQsCiAgICAgICAgLy93aGVyZSB0aGUgbW9kdWxlIG5hbWUgaXMgbm90IGtub3duIHVudGlsIHRoZSBzY3JpcHQgb25sb2FkIGV2ZW50CiAgICAgICAgLy9vY2N1cnMuIElmIG5vIGNvbnRleHQsIHVzZSB0aGUgZ2xvYmFsIHF1ZXVlLCBhbmQgZ2V0IGl0IHByb2Nlc3NlZAogICAgICAgIC8vaW4gdGhlIG9uc2NyaXB0IGxvYWQgY2FsbGJhY2suCiAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwW25hbWVdID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbG9iYWxEZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgIH0KICAgIH07CgogICAgZGVmaW5lLmFtZCA9IHsKICAgICAgICBqUXVlcnk6IHRydWUKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgdGV4dC4gTm9ybWFsbHkganVzdCB1c2VzIGV2YWwsIGJ1dCBjYW4gYmUgbW9kaWZpZWQKICAgICAqIHRvIHVzZSBhIGJldHRlciwgZW52aXJvbm1lbnQtc3BlY2lmaWMgY2FsbC4gT25seSB1c2VkIGZvciB0cmFuc3BpbGluZwogICAgICogbG9hZGVyIHBsdWdpbnMsIG5vdCBmb3IgcGxhaW4gSlMgbW9kdWxlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRoZSB0ZXh0IHRvIGV4ZWN1dGUvZXZhbHVhdGUuCiAgICAgKi8KICAgIHJlcS5leGVjID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgcmV0dXJuIGV2YWwodGV4dCk7CiAgICB9OwoKICAgIC8vU2V0IHVwIHdpdGggY29uZmlnIGluZm8uCiAgICByZXEoY2ZnKTsKfSh0aGlzKSk7Cg==",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "f6fe0a8c-7696-45a4-f642-19042f0aad11"
},
"source": [
"# Run function automatically in every cell.\n",
"get_ipython().events.register('pre_run_cell', enable_plotly_in_cell)"
],
"execution_count": 47,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6gGPebxDwBig",
"colab_type": "text"
},
"source": [
"We can now plot something. Plots in plotly can become really complex, such as this worldmap of the world GPD in 2014 on a plot called a [Choropleth Map](https://en.wikipedia.org/wiki/Choropleth_map). This particular one is stolen from [Plotly's tutorial](https://plot.ly/python/choropleth-maps/#world-choropleth-map)."
]
},
{
"cell_type": "code",
"metadata": {
"id": "rmXkwj05ULRR",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/static/components/requirejs/require.js": {
"data": "LyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjEuMjIgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS4KICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcyBmb3IgZGV0YWlscwogKi8KLy9Ob3QgdXNpbmcgc3RyaWN0OiB1bmV2ZW4gc3RyaWN0IHN1cHBvcnQgaW4gYnJvd3NlcnMsICMzOTIsIGFuZCBjYXVzZXMKLy9wcm9ibGVtcyB3aXRoIHJlcXVpcmVqcy5leGVjKCkvdHJhbnNwaWxlciBwbHVnaW5zIHRoYXQgbWF5IG5vdCBiZSBzdHJpY3QuCi8qanNsaW50IHJlZ2V4cDogdHJ1ZSwgbm9tZW46IHRydWUsIHNsb3BweTogdHJ1ZSAqLwovKmdsb2JhbCB3aW5kb3csIG5hdmlnYXRvciwgZG9jdW1lbnQsIGltcG9ydFNjcmlwdHMsIHNldFRpbWVvdXQsIG9wZXJhICovCgp2YXIgcmVxdWlyZWpzLCByZXF1aXJlLCBkZWZpbmU7CihmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICB2YXIgcmVxLCBzLCBoZWFkLCBiYXNlRWxlbWVudCwgZGF0YU1haW4sIHNyYywKICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCwgY3VycmVudGx5QWRkaW5nU2NyaXB0LCBtYWluU2NyaXB0LCBzdWJQYXRoLAogICAgICAgIHZlcnNpb24gPSAnMi4xLjIyJywKICAgICAgICBjb21tZW50UmVnRXhwID0gLyhcL1wqKFtcc1xTXSo/KVwqXC98KFteOl18XilcL1wvKC4qKSQpL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgYXAgPSBBcnJheS5wcm90b3R5cGUsCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaXQpIHsKICAgICAgICByZXR1cm4gb3N0cmluZy5jYWxsKGl0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0FycmF5KGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEFycmF5XSc7CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5LiBJZiB0aGUgZnVuYyByZXR1cm5zCiAgICAgKiBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoKGFyeSwgZnVuYykgewogICAgICAgIGlmIChhcnkpIHsKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgYmFja3dhcmRzLiBJZiB0aGUgZnVuYwogICAgICogcmV0dXJucyBhIHRydWUgdmFsdWUsIGl0IHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoUmV2ZXJzZShhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSBhcnkubGVuZ3RoIC0gMTsgaSA+IC0xOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChhcnlbaV0gJiYgZnVuYyhhcnlbaV0sIGksIGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYXNQcm9wKG9iaiwgcHJvcCkgewogICAgICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIHByb3ApOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE93bihvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzUHJvcChvYmosIHByb3ApICYmIG9ialtwcm9wXTsKICAgIH0KCiAgICAvKioKICAgICAqIEN5Y2xlcyBvdmVyIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0IGFuZCBjYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoCiAgICAgKiBwcm9wZXJ0eSB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWUsIHRoZW4gdGhlCiAgICAgKiBpdGVyYXRpb24gaXMgc3RvcHBlZC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFByb3Aob2JqLCBmdW5jKSB7CiAgICAgICAgdmFyIHByb3A7CiAgICAgICAgZm9yIChwcm9wIGluIG9iaikgewogICAgICAgICAgICBpZiAoaGFzUHJvcChvYmosIHByb3ApKSB7CiAgICAgICAgICAgICAgICBpZiAoZnVuYyhvYmpbcHJvcF0sIHByb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8gbWl4IGluIHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgaW50byB0YXJnZXQsCiAgICAgKiBidXQgb25seSBpZiB0YXJnZXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCBzb3VyY2UsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pIHsKICAgICAgICBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIGVhY2hQcm9wKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9yY2UgfHwgIWhhc1Byb3AodGFyZ2V0LCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZWVwU3RyaW5nTWl4aW4gJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNBcnJheSh2YWx1ZSkgJiYgIWlzRnVuY3Rpb24odmFsdWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4odGFyZ2V0W3Byb3BdLCB2YWx1ZSwgZm9yY2UsIGRlZXBTdHJpbmdNaXhpbik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICAvL1NpbWlsYXIgdG8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIGJ1dCB0aGUgJ3RoaXMnIG9iamVjdCBpcyBzcGVjaWZpZWQKICAgIC8vZmlyc3QsIHNpbmNlIGl0IGlzIGVhc2llciB0byByZWFkL2ZpZ3VyZSBvdXQgd2hhdCAndGhpcycgd2lsbCBiZS4KICAgIGZ1bmN0aW9uIGJpbmQob2JqLCBmbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShvYmosIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY3JpcHRzKCkgewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IoZXJyKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgfQoKICAgIC8vQWxsb3cgZ2V0dGluZyBhIGdsb2JhbCB0aGF0IGlzIGV4cHJlc3NlZCBpbgogICAgLy9kb3Qgbm90YXRpb24sIGxpa2UgJ2EuYi5jJy4KICAgIGZ1bmN0aW9uIGdldEdsb2JhbCh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICB2YXIgZyA9IGdsb2JhbDsKICAgICAgICBlYWNoKHZhbHVlLnNwbGl0KCcuJyksIGZ1bmN0aW9uIChwYXJ0KSB7CiAgICAgICAgICAgIGcgPSBnW3BhcnRdOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBlcnJvciB3aXRoIGEgcG9pbnRlciB0byBhbiBVUkwgd2l0aCBtb3JlIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIHRoZSBlcnJvciBJRCB0aGF0IG1hcHMgdG8gYW4gSUQgb24gYSB3ZWIgcGFnZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGh1bWFuIHJlYWRhYmxlIGVycm9yLgogICAgICogQHBhcmFtIHtFcnJvcn0gW2Vycl0gdGhlIG9yaWdpbmFsIGVycm9yLCBpZiB0aGVyZSBpcyBvbmUuCiAgICAgKgogICAgICogQHJldHVybnMge0Vycm9yfQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRXJyb3IoaWQsIG1zZywgZXJyLCByZXF1aXJlTW9kdWxlcykgewogICAgICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyArICdcbmh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjJyArIGlkKTsKICAgICAgICBlLnJlcXVpcmVUeXBlID0gaWQ7CiAgICAgICAgZS5yZXF1aXJlTW9kdWxlcyA9IHJlcXVpcmVNb2R1bGVzOwogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgZS5vcmlnaW5hbEVycm9yID0gZXJyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvL0lmIGEgZGVmaW5lIGlzIGFscmVhZHkgaW4gcGxheSB2aWEgYW5vdGhlciBBTUQgbG9hZGVyLAogICAgICAgIC8vZG8gbm90IG92ZXJ3cml0ZS4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVvZiByZXF1aXJlanMgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgaWYgKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSkgewogICAgICAgICAgICAvL0RvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcmVxdWlyZWpzIGluc3RhbmNlLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNmZyA9IHJlcXVpcmVqczsKICAgICAgICByZXF1aXJlanMgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgLy9BbGxvdyBmb3IgYSByZXF1aXJlIGNvbmZpZyBvYmplY3QKICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzRnVuY3Rpb24ocmVxdWlyZSkpIHsKICAgICAgICAvL2Fzc3VtZSBpdCBpcyBhIGNvbmZpZyBvYmplY3QuCiAgICAgICAgY2ZnID0gcmVxdWlyZTsKICAgICAgICByZXF1aXJlID0gdW5kZWZpbmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ld0NvbnRleHQoY29udGV4dE5hbWUpIHsKICAgICAgICB2YXIgaW5DaGVja0xvYWRlZCwgTW9kdWxlLCBjb250ZXh0LCBoYW5kbGVycywKICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQsCiAgICAgICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIC8vRGVmYXVsdHMuIERvIG5vdCBzZXQgYSBkZWZhdWx0IGZvciBtYXAKICAgICAgICAgICAgICAgIC8vY29uZmlnIHRvIHNwZWVkIHVwIG5vcm1hbGl6ZSgpLCB3aGljaAogICAgICAgICAgICAgICAgLy93aWxsIHJ1biBmYXN0ZXIgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgICAgIHdhaXRTZWNvbmRzOiA3LAogICAgICAgICAgICAgICAgYmFzZVVybDogJy4vJywKICAgICAgICAgICAgICAgIHBhdGhzOiB7fSwKICAgICAgICAgICAgICAgIGJ1bmRsZXM6IHt9LAogICAgICAgICAgICAgICAgcGtnczoge30sCiAgICAgICAgICAgICAgICBzaGltOiB7fSwKICAgICAgICAgICAgICAgIGNvbmZpZzoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgLy9yZWdpc3RyeSBvZiBqdXN0IGVuYWJsZWQgbW9kdWxlcywgdG8gc3BlZWQKICAgICAgICAgICAgLy9jeWNsZSBicmVha2luZyBjb2RlIHdoZW4gbG90cyBvZiBtb2R1bGVzCiAgICAgICAgICAgIC8vYXJlIHJlZ2lzdGVyZWQsIGJ1dCBub3QgYWN0aXZhdGVkLgogICAgICAgICAgICBlbmFibGVkUmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgdW5kZWZFdmVudHMgPSB7fSwKICAgICAgICAgICAgZGVmUXVldWUgPSBbXSwKICAgICAgICAgICAgZGVmaW5lZCA9IHt9LAogICAgICAgICAgICB1cmxGZXRjaGVkID0ge30sCiAgICAgICAgICAgIGJ1bmRsZXNNYXAgPSB7fSwKICAgICAgICAgICAgcmVxdWlyZUNvdW50ZXIgPSAxLAogICAgICAgICAgICB1bm5vcm1hbGl6ZWRDb3VudGVyID0gMTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpbXMgdGhlIC4gYW5kIC4uIGZyb20gYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKiBJdCB3aWxsIGtlZXAgYSBsZWFkaW5nIHBhdGggc2VnbWVudCBpZiBhIC4uIHdpbGwgYmVjb21lCiAgICAgICAgICogdGhlIGZpcnN0IHBhdGggc2VnbWVudCwgdG8gaGVscCB3aXRoIG1vZHVsZSBuYW1lIGxvb2t1cHMsCiAgICAgICAgICogd2hpY2ggYWN0IGxpa2UgcGF0aHMsIGJ1dCBjYW4gYmUgcmVtYXBwZWQuIEJ1dCB0aGUgZW5kIHJlc3VsdCwKICAgICAgICAgKiBhbGwgcGF0aHMgdGhhdCB1c2UgdGhpcyBmdW5jdGlvbiBzaG91bGQgbG9vayBub3JtYWxpemVkLgogICAgICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIE1PRElGSUVTIHRoZSBpbnB1dCBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnkgdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbURvdHMoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpLCBwYXJ0OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gYXJ5W2ldOwogICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgdGhlIHN0YXJ0LCBvciBwcmV2aW91cyB2YWx1ZSBpcyBzdGlsbCAuLiwKICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZW0gc28gdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGggaXQgbWF5CiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgd29yayB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGgsIGV2ZW4gdGhvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgYW4gSUQgaXQgaXMgbGVzcyB0aGFuIGlkZWFsLiBJbiBsYXJnZXIgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlcywgbWF5IGJlIGJldHRlciB0byBqdXN0IGtpY2sgb3V0IGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IChpID09PSAxICYmIGFyeVsyXSA9PT0gJy4uJykgfHwgYXJ5W2kgLSAxXSA9PT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhIHJlbGF0aXZlIG1vZHVsZSBuYW1lLCBsaWtlIC4vc29tZXRoaW5nLCBub3JtYWxpemUgaXQgdG8KICAgICAgICAgKiBhIHJlYWwgbmFtZSB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBwYXRoLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGl2ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2VOYW1lIGEgcmVhbCBuYW1lIHRoYXQgdGhlIG5hbWUgYXJnIGlzIHJlbGF0aXZlCiAgICAgICAgICogdG8uCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBseU1hcCBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgdmFsdWUuIFNob3VsZAogICAgICAgICAqIG9ubHkgYmUgZG9uZSBpZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgZm9yIGEgZGVwZW5kZW5jeSBJRC4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBub3JtYWxpemVkIG5hbWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciBwa2dNYWluLCBtYXBWYWx1ZSwgbmFtZVBhcnRzLCBpLCBqLCBuYW1lU2VnbWVudCwgbGFzdEluZGV4LAogICAgICAgICAgICAgICAgZm91bmRNYXAsIGZvdW5kSSwgZm91bmRTdGFyTWFwLCBzdGFySSwgbm9ybWFsaXplZEJhc2VQYXJ0cywKICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IChiYXNlTmFtZSAmJiBiYXNlTmFtZS5zcGxpdCgnLycpKSwKICAgICAgICAgICAgICAgIG1hcCA9IGNvbmZpZy5tYXAsCiAgICAgICAgICAgICAgICBzdGFyTWFwID0gbWFwICYmIG1hcFsnKiddOwoKICAgICAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG5hbWUubGVuZ3RoIC0gMTsKCiAgICAgICAgICAgICAgICAvLyBJZiB3YW50aW5nIG5vZGUgSUQgY29tcGF0aWJpbGl0eSwgc3RyaXAgLmpzIGZyb20gZW5kCiAgICAgICAgICAgICAgICAvLyBvZiBJRHMuIEhhdmUgdG8gZG8gdGhpcyBoZXJlLCBhbmQgbm90IGluIG5hbWVUb1VybAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub2RlIGFsbG93cyBlaXRoZXIgLmpzIG9yIG5vbiAuanMgdG8gbWFwCiAgICAgICAgICAgICAgICAvLyB0byBzYW1lIGZpbGUuCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5vZGVJZENvbXBhdCAmJiBqc1N1ZmZpeFJlZ0V4cC50ZXN0KG5hbWVbbGFzdEluZGV4XSkpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lW2xhc3RJbmRleF0gPSBuYW1lW2xhc3RJbmRleF0ucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0cyB3aXRoIGEgJy4nIHNvIG5lZWQgdGhlIGJhc2VOYW1lCiAgICAgICAgICAgICAgICBpZiAobmFtZVswXS5jaGFyQXQoMCkgPT09ICcuJyAmJiBiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgYmFzZU5hbWUgdG8gYXJyYXksIGFuZCBsb3Agb2ZmIHRoZSBsYXN0IHBhcnQsCiAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IC4gbWF0Y2hlcyB0aGF0ICdkaXJlY3RvcnknIGFuZCBub3QgbmFtZSBvZiB0aGUgYmFzZU5hbWUncwogICAgICAgICAgICAgICAgICAgIC8vbW9kdWxlLiBGb3IgaW5zdGFuY2UsIGJhc2VOYW1lIG9mICdvbmUvdHdvL3RocmVlJywgbWFwcyB0bwogICAgICAgICAgICAgICAgICAgIC8vJ29uZS90d28vdGhyZWUuanMnLCBidXQgd2Ugd2FudCB0aGUgZGlyZWN0b3J5LCAnb25lL3R3bycgZm9yCiAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5vcm1hbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5zbGljZSgwLCBiYXNlUGFydHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZWRCYXNlUGFydHMuY29uY2F0KG5hbWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyaW1Eb3RzKG5hbWUpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuam9pbignLycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FwcGx5IG1hcCBjb25maWcgaWYgYXZhaWxhYmxlLgogICAgICAgICAgICBpZiAoYXBwbHlNYXAgJiYgbWFwICYmIChiYXNlUGFydHMgfHwgc3Rhck1hcCkpIHsKICAgICAgICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKCiAgICAgICAgICAgICAgICBvdXRlckxvb3A6IGZvciAoaSA9IG5hbWVQYXJ0cy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lU2VnbWVudCA9IG5hbWVQYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9GaW5kIHRoZSBsb25nZXN0IGJhc2VOYW1lIHNlZ21lbnQgbWF0Y2ggaW4gdGhlIGNvbmZpZy4KICAgICAgICAgICAgICAgICAgICAgICAgLy9TbywgZG8gam9pbnMgb24gdGhlIGJpZ2dlc3QgdG8gc21hbGxlc3QgbGVuZ3RocyBvZiBiYXNlUGFydHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGJhc2VQYXJ0cy5sZW5ndGg7IGogPiAwOyBqIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlID0gZ2V0T3duKG1hcCwgYmFzZVBhcnRzLnNsaWNlKDAsIGopLmpvaW4oJy8nKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXNlTmFtZSBzZWdtZW50IGhhcyBjb25maWcsIGZpbmQgaWYgaXQgaGFzIG9uZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwVmFsdWUsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCwgdXBkYXRlIG5hbWUgdG8gdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXAgPSBtYXBWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYSBzdGFyIG1hcCBtYXRjaCwgYnV0IGp1c3QgaG9sZCBvbiB0byBpdCwKICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgc2hvcnRlciBzZWdtZW50IG1hdGNoIGxhdGVyIGluIGEgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAvL2NvbmZpZywgdGhlbiBmYXZvciBvdmVyIHRoaXMgc3RhciBtYXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFN0YXJNYXAgJiYgc3Rhck1hcCAmJiBnZXRPd24oc3Rhck1hcCwgbmFtZVNlZ21lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3Rhck1hcCA9IGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJJID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZE1hcCAmJiBmb3VuZFN0YXJNYXApIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IGZvdW5kU3Rhck1hcDsKICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBzdGFySTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXApIHsKICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMuc3BsaWNlKDAsIGZvdW5kSSwgZm91bmRNYXApOwogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHMuam9pbignLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgbmFtZSBwb2ludHMgdG8gYSBwYWNrYWdlJ3MgbmFtZSwgdXNlCiAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlIG1haW4gaW5zdGVhZC4KICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbmFtZSk7CgogICAgICAgICAgICByZXR1cm4gcGtnTWFpbiA/IHBrZ01haW4gOiBuYW1lOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KG5hbWUpIHsKICAgICAgICAgICAgaWYgKGlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgZWFjaChzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKSA9PT0gbmFtZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWNvbnRleHQnKSA9PT0gY29udGV4dC5jb250ZXh0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYXNQYXRoRmFsbGJhY2soaWQpIHsKICAgICAgICAgICAgdmFyIHBhdGhDb25maWcgPSBnZXRPd24oY29uZmlnLnBhdGhzLCBpZCk7CiAgICAgICAgICAgIGlmIChwYXRoQ29uZmlnICYmIGlzQXJyYXkocGF0aENvbmZpZykgJiYgcGF0aENvbmZpZy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvL1BvcCBvZmYgdGhlIGZpcnN0IGFycmF5IHZhbHVlLCBzaW5jZSBpdCBmYWlsZWQsIGFuZAogICAgICAgICAgICAgICAgLy9yZXRyeQogICAgICAgICAgICAgICAgcGF0aENvbmZpZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlLnVuZGVmKGlkKTsKCiAgICAgICAgICAgICAgICAvL0N1c3RvbSByZXF1aXJlIHRoYXQgZG9lcyBub3QgZG8gbWFwIHRyYW5zbGF0aW9uLCBzaW5jZQogICAgICAgICAgICAgICAgLy9JRCBpcyAiYWJzb2x1dGUiLCBhbHJlYWR5IG1hcHBlZC9yZXNvbHZlZC4KICAgICAgICAgICAgICAgIGNvbnRleHQubWFrZVJlcXVpcmUobnVsbCwgewogICAgICAgICAgICAgICAgICAgIHNraXBNYXA6IHRydWUKICAgICAgICAgICAgICAgIH0pKFtpZF0pOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL1R1cm5zIGEgcGx1Z2luIXJlc291cmNlIHRvIFtwbHVnaW4sIHJlc291cmNlXQogICAgICAgIC8vd2l0aCB0aGUgcGx1Z2luIGJlaW5nIHVuZGVmaW5lZCBpZiB0aGUgbmFtZQogICAgICAgIC8vZGlkIG5vdCBoYXZlIGEgcGx1Z2luIHByZWZpeC4KICAgICAgICBmdW5jdGlvbiBzcGxpdFByZWZpeChuYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmVmaXgsCiAgICAgICAgICAgICAgICBpbmRleCA9IG5hbWUgPyBuYW1lLmluZGV4T2YoJyEnKSA6IC0xOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcHJlZml4LCBuYW1lXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBtb2R1bGUgbWFwcGluZyB0aGF0IGluY2x1ZGVzIHBsdWdpbiBwcmVmaXgsIG1vZHVsZQogICAgICAgICAqIG5hbWUsIGFuZCBwYXRoLiBJZiBwYXJlbnRNb2R1bGVNYXAgaXMgcHJvdmlkZWQgaXQgd2lsbAogICAgICAgICAqIGFsc28gbm9ybWFsaXplIHRoZSBuYW1lIHZpYSByZXF1aXJlLm5vcm1hbGl6ZSgpCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmVudE1vZHVsZU1hcF0gcGFyZW50IG1vZHVsZSBtYXAKICAgICAgICAgKiBmb3IgdGhlIG1vZHVsZSBuYW1lLCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc05vcm1hbGl6ZWQ6IGlzIHRoZSBJRCBhbHJlYWR5IG5vcm1hbGl6ZWQuCiAgICAgICAgICogVGhpcyBpcyB0cnVlIGlmIHRoaXMgY2FsbCBpcyBkb25lIGZvciBhIGRlZmluZSgpIG1vZHVsZSBJRC4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwOiBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgSUQuCiAgICAgICAgICogU2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBkZXBlbmRlbmN5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYWtlTW9kdWxlTWFwKG5hbWUsIHBhcmVudE1vZHVsZU1hcCwgaXNOb3JtYWxpemVkLCBhcHBseU1hcCkgewogICAgICAgICAgICB2YXIgdXJsLCBwbHVnaW5Nb2R1bGUsIHN1ZmZpeCwgbmFtZVBhcnRzLAogICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbCwKICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnRNb2R1bGVNYXAgPyBwYXJlbnRNb2R1bGVNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWUgPSBuYW1lLAogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSB0cnVlLAogICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSAnJzsKCiAgICAgICAgICAgIC8vSWYgbm8gbmFtZSwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIHJlcXVpcmUgY2FsbCwgZ2VuZXJhdGUgYW4KICAgICAgICAgICAgLy9pbnRlcm5hbCBuYW1lLgogICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgIGlzRGVmaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuYW1lID0gJ19AcicgKyAocmVxdWlyZUNvdW50ZXIgKz0gMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5hbWVQYXJ0cyA9IHNwbGl0UHJlZml4KG5hbWUpOwogICAgICAgICAgICBwcmVmaXggPSBuYW1lUGFydHNbMF07CiAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHNbMV07CgogICAgICAgICAgICBpZiAocHJlZml4KSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBub3JtYWxpemUocHJlZml4LCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICBwbHVnaW5Nb2R1bGUgPSBnZXRPd24oZGVmaW5lZCwgcHJlZml4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9BY2NvdW50IGZvciByZWxhdGl2ZSBwYXRocyBpZiB0aGVyZSBpcyBhIGJhc2UgbmFtZS4KICAgICAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhhdCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiBIb3dldmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gaXQgZm9yIGRlZmluZSgpJ2QgIG1vZHVsZXMuIHJlcXVpcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVpciBjYWxsYmFja3MgKCM2OTkpLiBIb3dldmVyIGlmIGEgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25FcnJvciBpcyBzZXQsIHVzZSB0aGF0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5ldmVudHMuZXJyb3IgJiYgdGhpcy5tYXAuaXNEZWZpbmUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1hcCA9IHRoaXMubWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSB0aGlzLm1hcC5pc0RlZmluZSA/IFt0aGlzLm1hcC5pZF0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcigodGhpcy5lcnJvciA9IGVycikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZy4gSWYgcHJvbWlzZXMgY291bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCwgdGhpcyB3b3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBtYWtpbmcgZG8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgd2FudCB0byBjb21wbGV0ZWx5IGxvc2UgdGhlIGVycm9yLiBXaGlsZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbWVzcyB1cCBwcm9jZXNzaW5nIGFuZCBsZWFkIHRvIHNpbWlsYXIgcmVzdWx0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBidWcgMTQ0MCwgaXQgYXQgbGVhc3Qgc3VyZmFjZXMgdGhlIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIGxpdGVyYWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLmlzRGVmaW5lICYmICF0aGlzLmlnbm9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZFtpZF0gPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEub25SZXNvdXJjZUxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzTG9hZE1hcHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNMb2FkTWFwcy5wdXNoKGRlcE1hcC5ub3JtYWxpemVkTWFwIHx8IGRlcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uUmVzb3VyY2VMb2FkKGNvbnRleHQsIHRoaXMubWFwLCByZXNMb2FkTWFwcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9GaW5pc2hlZCB0aGUgZGVmaW5lIHN0YWdlLiBBbGxvdyBjYWxsaW5nIGNoZWNrIGFnYWluCiAgICAgICAgICAgICAgICAgICAgLy90byBhbGxvdyBkZWZpbmUgbm90aWZpY2F0aW9ucyBiZWxvdyBpbiB0aGUgY2FzZSBvZiBhCiAgICAgICAgICAgICAgICAgICAgLy9jeWNsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmluZWQgJiYgIXRoaXMuZGVmaW5lRW1pdHRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlZmluZWQnLCB0aGlzLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLm1hcCwKICAgICAgICAgICAgICAgICAgICBpZCA9IG1hcC5pZCwKICAgICAgICAgICAgICAgICAgICAvL01hcCBhbHJlYWR5IG5vcm1hbGl6ZWQgdGhlIHByZWZpeC4KICAgICAgICAgICAgICAgICAgICBwbHVnaW5NYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXgpOwoKICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKHBsdWdpbk1hcCk7CgogICAgICAgICAgICAgICAgb24ocGx1Z2luTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkLCBub3JtYWxpemVkTWFwLCBub3JtYWxpemVkTW9kLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCB0aGlzLm1hcC5pZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLm1hcC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gdGhpcy5tYXAucGFyZW50TWFwID8gdGhpcy5tYXAucGFyZW50TWFwLm5hbWUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKG1hcC5wYXJlbnRNYXAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1aWxkQ2FsbGJhY2s6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vSWYgY3VycmVudCBtYXAgaXMgbm90IG5vcm1hbGl6ZWQsIHdhaXQgZm9yIHRoYXQKICAgICAgICAgICAgICAgICAgICAvL25vcm1hbGl6ZWQgbmFtZSB0byBsb2FkIGluc3RlYWQgb2YgY29udGludWluZy4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBpZiB0aGUgcGx1Z2luIGFsbG93cyBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4ubm9ybWFsaXplKG5hbWUsIGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL3ByZWZpeCBhbmQgbmFtZSBzaG91bGQgYWxyZWFkeSBiZSBub3JtYWxpemVkLCBubyBuZWVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGFwcGx5aW5nIG1hcCBjb25maWcgYWdhaW4gZWl0aGVyLgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTWFwID0gbWFrZU1vZHVsZU1hcChtYXAucHJlZml4ICsgJyEnICsgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucGFyZW50TWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgb24obm9ybWFsaXplZE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5ub3JtYWxpemVkTWFwID0gbm9ybWFsaXplZE1hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE1vZCA9IGdldE93bihyZWdpc3RyeSwgbm9ybWFsaXplZE1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkTW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoaXMgcGx1Z2luLCBzbyBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jYW4gYmUgdHJhY2VkIGZvciBjeWNsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChub3JtYWxpemVkTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLm9uKCdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0lmIGEgcGF0aHMgY29uZmlnLCB0aGVuIGp1c3QgbG9hZCB0aGF0IGZpbGUgaW5zdGVhZCB0bwogICAgICAgICAgICAgICAgICAgIC8vcmVzb2x2ZSB0aGUgcGx1Z2luLCBhcyBpdCBpcyBidWlsdCBpbnRvIHRoYXQgcGF0aHMgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnVybCA9IGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxvYWQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBsb2FkLmVycm9yID0gYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gW2lkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRlbXAgdW5ub3JtYWxpemVkIG1vZHVsZXMgZm9yIHRoaXMgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSByZXNvbHZlZCBvdGhlcndpc2Ugbm93LgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaWQuaW5kZXhPZihpZCArICdfdW5ub3JtYWxpemVkJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KG1vZC5tYXAuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9BbGxvdyBwbHVnaW5zIHRvIGxvYWQgb3RoZXIgY29kZSB3aXRob3V0IGhhdmluZyB0byBrbm93IHRoZQogICAgICAgICAgICAgICAgICAgIC8vY29udGV4dCBvciBob3cgdG8gJ2NvbXBsZXRlJyB0aGUgbG9hZC4KICAgICAgICAgICAgICAgICAgICBsb2FkLmZyb21UZXh0ID0gYmluZCh0aGlzLCBmdW5jdGlvbiAodGV4dCwgdGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVNYXAgPSBtYWtlTW9kdWxlTWFwKG1vZHVsZU5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJhY3RpdmUgPSB1c2VJbnRlcmFjdGl2ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXMgb2YgMi4xLjAsIHN1cHBvcnQganVzdCBwYXNzaW5nIHRoZSB0ZXh0LCB0byByZWluZm9yY2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9mcm9tVGV4dCBvbmx5IGJlaW5nIGNhbGxlZCBvbmNlIHBlciByZXNvdXJjZS4gU3RpbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IG9sZCBzdHlsZSBvZiBwYXNzaW5nIG1vZHVsZU5hbWUgYnV0IGRpc2NhcmQKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGF0IG1vZHVsZU5hbWUgaW4gZmF2b3Igb2YgdGhlIGludGVybmFsIHJlZi4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRBbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0QWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1R1cm4gb2ZmIGludGVyYWN0aXZlIHNjcmlwdCBtYXRjaGluZyBmb3IgSUUgZm9yIGFueSBkZWZpbmUKICAgICAgICAgICAgICAgICAgICAgICAgLy9jYWxscyBpbiB0aGUgdGV4dCwgdGhlbiB0dXJuIGl0IGJhY2sgb24gYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1ByaW1lIHRoZSBzeXN0ZW0gYnkgY3JlYXRpbmcgYSBtb2R1bGUgaW5zdGFuY2UgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9UcmFuc2ZlciBhbnkgY29uZmlnIHRvIHRoaXMgb3RoZXIgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvcChjb25maWcuY29uZmlnLCBpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb25maWdbbW9kdWxlTmFtZV0gPSBjb25maWcuY29uZmlnW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5leGVjKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ2Zyb210ZXh0ZXZhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tVGV4dCBldmFsIGZvciAnICsgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZmFpbGVkOiAnICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgcGx1Z2luCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gobW9kdWxlTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcG9ydCBhbm9ueW1vdXMgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQobW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgdGhlIHZhbHVlIG9mIHRoYXQgbW9kdWxlIHRvIHRoZSB2YWx1ZSBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc291cmNlIElELgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUoW21vZHVsZU5hbWVdLCBsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9Vc2UgcGFyZW50TmFtZSBoZXJlIHNpbmNlIHRoZSBwbHVnaW4ncyBuYW1lIGlzIG5vdCByZWxpYWJsZSwKICAgICAgICAgICAgICAgICAgICAvL2NvdWxkIGJlIHNvbWUgd2VpcmQgc3RyaW5nIHdpdGggbm8gcGF0aCB0aGF0IGFjdHVhbGx5IHdhbnRzIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZWZlcmVuY2UgdGhlIHBhcmVudE5hbWUncyBwYXRoLgogICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2FkKG1hcC5uYW1lLCBsb2NhbFJlcXVpcmUsIGxvYWQsIGNvbmZpZyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwc1twbHVnaW5NYXAuaWRdID0gcGx1Z2luTWFwOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBlbmFibGVkUmVnaXN0cnlbdGhpcy5tYXAuaWRdID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9TZXQgZmxhZyBtZW50aW9uaW5nIHRoYXQgdGhlIG1vZHVsZSBpcyBlbmFibGluZywKICAgICAgICAgICAgICAgIC8vc28gdGhhdCBpbW1lZGlhdGUgY2FsbHMgdG8gdGhlIGRlZmluZWQgY2FsbGJhY2tzCiAgICAgICAgICAgICAgICAvL2ZvciBkZXBlbmRlbmNpZXMgZG8gbm90IHRyaWdnZXIgaW5hZHZlcnRlbnQgbG9hZAogICAgICAgICAgICAgICAgLy93aXRoIHRoZSBkZXBDb3VudCBzdGlsbCBiZWluZyB6ZXJvLgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9FbmFibGUgZWFjaCBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwTWFwLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkLCBtb2QsIGhhbmRsZXI7CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwTWFwID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0RlcGVuZGVuY3kgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgZGVwTWFwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHdpcmVkIHVwIHRvIHRoaXMgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXAgPSBtYWtlTW9kdWxlTWFwKGRlcE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXAuaXNEZWZpbmUgPyB0aGlzLm1hcCA6IHRoaXMubWFwLnBhcmVudE1hcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2tpcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwc1tpXSA9IGRlcE1hcDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRPd24oaGFuZGxlcnMsIGRlcE1hcC5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzW2ldID0gaGFuZGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBDb3VudCArPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKGRlcEV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuZGVmZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZURlcChpLCBkZXBFeHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZXJyb3InLCBiaW5kKHRoaXMsIHRoaXMuZXJyYmFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXZlbnRzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkaXJlY3QgZXJyYmFjayBvbiB0aGlzIG1vZHVsZSwgYnV0IHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBpcyBsaXN0ZW5pbmcgZm9yIGVycm9ycywgc28gYmUgc3VyZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvciBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlkID0gZGVwTWFwLmlkOwogICAgICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy9Ta2lwIHNwZWNpYWwgbW9kdWxlcyBsaWtlICdyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJwogICAgICAgICAgICAgICAgICAgIC8vQWxzbywgZG9uJ3QgY2FsbCBlbmFibGUgaWYgaXQgaXMgYWxyZWFkeSBlbmFibGVkLAogICAgICAgICAgICAgICAgICAgIC8vaW1wb3J0YW50IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2FzZXMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGhhbmRsZXJzLCBpZCkgJiYgbW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShkZXBNYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIHBsdWdpbiB0aGF0IGlzIHVzZWQgaW4KICAgICAgICAgICAgICAgIC8vYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoUHJvcCh0aGlzLnBsdWdpbk1hcHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbk1hcCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBnZXRPd24ocmVnaXN0cnksIHBsdWdpbk1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCAmJiAhbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiAobmFtZSwgY2IpIHsKICAgICAgICAgICAgICAgIHZhciBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIGlmICghY2JzKSB7CiAgICAgICAgICAgICAgICAgICAgY2JzID0gdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNicy5wdXNoKGNiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGVtaXQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHsKICAgICAgICAgICAgICAgIGVhY2godGhpcy5ldmVudHNbbmFtZV0sIGZ1bmN0aW9uIChjYikgewogICAgICAgICAgICAgICAgICAgIGNiKGV2dCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdGhhdCB0aGUgZXJyb3IgaGFuZGxlciB3YXMgdHJpZ2dlcmVkLCByZW1vdmUKICAgICAgICAgICAgICAgICAgICAvL3RoZSBsaXN0ZW5lcnMsIHNpbmNlIHRoaXMgYnJva2VuIE1vZHVsZSBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vY2FuIHN0YXkgYXJvdW5kIGZvciBhIHdoaWxlIGluIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbbmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjYWxsR2V0TW9kdWxlKGFyZ3MpIHsKICAgICAgICAgICAgLy9Ta2lwIG1vZHVsZXMgYWxyZWFkeSBkZWZpbmVkLgogICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgYXJnc1swXSkpIHsKICAgICAgICAgICAgICAgIGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKGFyZ3NbMF0sIG51bGwsIHRydWUpKS5pbml0KGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBmdW5jLCBuYW1lLCBpZU5hbWUpIHsKICAgICAgICAgICAgLy9GYXZvciBkZXRhY2hFdmVudCBiZWNhdXNlIG9mIElFOQogICAgICAgICAgICAvL2lzc3VlLCBzZWUgYXR0YWNoRXZlbnQvYWRkRXZlbnRMaXN0ZW5lciBjb21tZW50IGVsc2V3aGVyZQogICAgICAgICAgICAvL2luIHRoaXMgZmlsZS4KICAgICAgICAgICAgaWYgKG5vZGUuZGV0YWNoRXZlbnQgJiYgIWlzT3BlcmEpIHsKICAgICAgICAgICAgICAgIC8vUHJvYmFibHkgSUUuIElmIG5vdCBpdCB3aWxsIHRocm93IGFuIGVycm9yLCB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgICAgICAvL3VzZWZ1bCB0byBrbm93LgogICAgICAgICAgICAgICAgaWYgKGllTmFtZSkgewogICAgICAgICAgICAgICAgICAgIG5vZGUuZGV0YWNoRXZlbnQoaWVOYW1lLCBmdW5jKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGV2ZW50IGZyb20gYSBzY3JpcHQgbm9kZSwgZ2V0IHRoZSByZXF1aXJlanMgaW5mbyBmcm9tIGl0LAogICAgICAgICAqIGFuZCB0aGVuIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgbm9kZS4KICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBldnQKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFNjcmlwdERhdGEoZXZ0KSB7CiAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBhbmQgc3RpbGwgbWFrZXMgc2Vuc2UuCiAgICAgICAgICAgIHZhciBub2RlID0gZXZ0LmN1cnJlbnRUYXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7CgogICAgICAgICAgICAvL1JlbW92ZSB0aGUgbGlzdGVuZXJzIG9uY2UgaGVyZS4KICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobm9kZSwgY29udGV4dC5vblNjcmlwdExvYWQsICdsb2FkJywgJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IsICdlcnJvcicpOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICAgICAgICBpZDogbm9kZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJykKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGludGFrZURlZmluZXMoKSB7CiAgICAgICAgICAgIHZhciBhcmdzOwoKICAgICAgICAgICAgLy9BbnkgZGVmaW5lZCBtb2R1bGVzIGluIHRoZSBnbG9iYWwgcXVldWUsIGludGFrZSB0aGVtIG5vdy4KICAgICAgICAgICAgdGFrZUdsb2JhbFF1ZXVlKCk7CgogICAgICAgICAgICAvL01ha2Ugc3VyZSBhbnkgcmVtYWluaW5nIGRlZlF1ZXVlIGl0ZW1zIGdldCBwcm9wZXJseSBwcm9jZXNzZWQuCiAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBkZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ21pc21hdGNoJywgJ01pc21hdGNoZWQgYW5vbnltb3VzIGRlZmluZSgpIG1vZHVsZTogJyArCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL2FyZ3MgYXJlIGlkLCBkZXBzLCBmYWN0b3J5LiBTaG91bGQgYmUgbm9ybWFsaXplZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAvL2RlZmluZSgpIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwogICAgICAgIH0KCiAgICAgICAgY29udGV4dCA9IHsKICAgICAgICAgICAgY29uZmlnOiBjb25maWcsCiAgICAgICAgICAgIGNvbnRleHROYW1lOiBjb250ZXh0TmFtZSwKICAgICAgICAgICAgcmVnaXN0cnk6IHJlZ2lzdHJ5LAogICAgICAgICAgICBkZWZpbmVkOiBkZWZpbmVkLAogICAgICAgICAgICB1cmxGZXRjaGVkOiB1cmxGZXRjaGVkLAogICAgICAgICAgICBkZWZRdWV1ZTogZGVmUXVldWUsCiAgICAgICAgICAgIGRlZlF1ZXVlTWFwOiB7fSwKICAgICAgICAgICAgTW9kdWxlOiBNb2R1bGUsCiAgICAgICAgICAgIG1ha2VNb2R1bGVNYXA6IG1ha2VNb2R1bGVNYXAsCiAgICAgICAgICAgIG5leHRUaWNrOiByZXEubmV4dFRpY2ssCiAgICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0IGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlnIG9iamVjdCB0byBpbnRlZ3JhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25maWd1cmU6IGZ1bmN0aW9uIChjZmcpIHsKICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSBiYXNlVXJsIGVuZHMgaW4gYSBzbGFzaC4KICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybC5jaGFyQXQoY2ZnLmJhc2VVcmwubGVuZ3RoIC0gMSkgIT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICBjZmcuYmFzZVVybCArPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU2F2ZSBvZmYgdGhlIHBhdGhzIHNpbmNlIHRoZXkgcmVxdWlyZSBzcGVjaWFsIHByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAvL3RoZXkgYXJlIGFkZGl0aXZlLgogICAgICAgICAgICAgICAgdmFyIHNoaW0gPSBjb25maWcuc2hpbSwKICAgICAgICAgICAgICAgICAgICBvYmpzID0gewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9ianNbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKGNvbmZpZ1twcm9wXSwgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vUmV2ZXJzZSBtYXAgdGhlIGJ1bmRsZXMKICAgICAgICAgICAgICAgIGlmIChjZmcuYnVuZGxlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZy5idW5kbGVzLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlc01hcFt2XSA9IHByb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vTWVyZ2Ugc2hpbQogICAgICAgICAgICAgICAgaWYgKGNmZy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLnNoaW0sIGZ1bmN0aW9uICh2YWx1ZSwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUuZXhwb3J0cyB8fCB2YWx1ZS5pbml0KSAmJiAhdmFsdWUuZXhwb3J0c0ZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHBvcnRzRm4gPSBjb250ZXh0Lm1ha2VTaGltRXhwb3J0cyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2hpbVtpZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjb25maWcuc2hpbSA9IHNoaW07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9BZGp1c3QgcGFja2FnZXMgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgaWYgKGNmZy5wYWNrYWdlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2goY2ZnLnBhY2thZ2VzLCBmdW5jdGlvbiAocGtnT2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiwgbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBrZ09iaiA9IHR5cGVvZiBwa2dPYmogPT09ICdzdHJpbmcnID8ge25hbWU6IHBrZ09ian0gOiBwa2dPYmo7CgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGtnT2JqLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXRoc1tuYW1lXSA9IHBrZ09iai5sb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TYXZlIHBvaW50ZXIgdG8gbWFpbiBtb2R1bGUgSUQgZm9yIHBrZyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBsZWFkaW5nIGRvdCBpbiBtYWluLCBzbyBtYWluIHBhdGhzIGFyZSBub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCByZW1vdmUgYW55IHRyYWlsaW5nIC5qcywgc2luY2UgZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnZzIGhhdmUgZGlmZmVyZW50IGNvbnZlbnRpb25zOiBzb21lIHVzZSBhIG1vZHVsZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NvbWUgdXNlIGEgZmlsZSBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGtnc1tuYW1lXSA9IHBrZ09iai5uYW1lICsgJy8nICsgKHBrZ09iai5tYWluIHx8ICdtYWluJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGN1cnJEaXJSZWdFeHAsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGFyZSBhbnkgIndhaXRpbmcgdG8gZXhlY3V0ZSIgbW9kdWxlcyBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgbWFwcyBmb3IgdGhlbSwgc2luY2UgdGhlaXIgaW5mbywgbGlrZSBVUkxzIHRvIGxvYWQsCiAgICAgICAgICAgICAgICAvL21heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIG1vZHVsZSBhbHJlYWR5IGhhcyBpbml0IGNhbGxlZCwgc2luY2UgaXQgaXMgdG9vCiAgICAgICAgICAgICAgICAgICAgLy9sYXRlIHRvIG1vZGlmeSB0aGVtLCBhbmQgaWdub3JlIHVubm9ybWFsaXplZCBvbmVzCiAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGV5IGFyZSB0cmFuc2llbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2QuaW5pdGVkICYmICFtb2QubWFwLnVubm9ybWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2QubWFwID0gbWFrZU1vZHVsZU1hcChpZCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9JZiBhIGRlcHMgYXJyYXkgb3IgYSBjb25maWcgY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB0aGVuIGNhbGwKICAgICAgICAgICAgICAgIC8vcmVxdWlyZSB3aXRoIHRob3NlIGFyZ3MuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVxdWlyZSBpcyBkZWZpbmVkIGFzIGEKICAgICAgICAgICAgICAgIC8vY29uZmlnIG9iamVjdCBiZWZvcmUgcmVxdWlyZS5qcyBpcyBsb2FkZWQuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLmRlcHMgfHwgY2ZnLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlKGNmZy5kZXBzIHx8IFtdLCBjZmcuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVNoaW1FeHBvcnRzOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZuKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdmFsdWUuaW5pdC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgfHwgKHZhbHVlLmV4cG9ydHMgJiYgZ2V0R2xvYmFsKHZhbHVlLmV4cG9ydHMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG1ha2VSZXF1aXJlOiBmdW5jdGlvbiAocmVsTWFwLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbFJlcXVpcmUoZGVwcywgY2FsbGJhY2ssIGVycmJhY2spIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1hcCwgcmVxdWlyZU1vZDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlQnVpbGRDYWxsYmFjayAmJiBjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5fX3JlcXVpcmVKc0J1aWxkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdyZXF1aXJlYXJncycsICdJbnZhbGlkIHJlcXVpcmUgY2FsbCcpLCBlcnJiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiByZXF1aXJlfGV4cG9ydHN8bW9kdWxlIGFyZSByZXF1ZXN0ZWQsIGdldCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy92YWx1ZSBmb3IgdGhlbSBmcm9tIHRoZSBzcGVjaWFsIGhhbmRsZXJzLiBDYXZlYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBvbmx5IHdvcmtzIHdoaWxlIG1vZHVsZSBpcyBiZWluZyBkZWZpbmVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsTWFwICYmIGhhc1Byb3AoaGFuZGxlcnMsIGRlcHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcnNbZGVwc10ocmVnaXN0cnlbcmVsTWFwLmlkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMgYWNjZXNzIHRvIG9uZSBtb2R1bGUuIElmIHJlcXVpcmUuZ2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZhaWxhYmxlIChhcyBpbiB0aGUgTm9kZSBhZGFwdGVyKSwgcHJlZmVyIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEuZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxLmdldChjb250ZXh0LCBkZXBzLCByZWxNYXAsIGxvY2FsUmVxdWlyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIG1vZHVsZSBuYW1lLCBpZiBpdCBjb250YWlucyAuIG9yIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwcywgcmVsTWFwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGRlZmluZWQsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub3Rsb2FkZWQnLCAnTW9kdWxlIG5hbWUgIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQgZm9yIGNvbnRleHQ6ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbE1hcCA/ICcnIDogJy4gVXNlIHJlcXVpcmUoW10pJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0dyYWIgZGVmaW5lcyB3YWl0aW5nIGluIHRoZSBnbG9iYWwgcXVldWUuCiAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAvL01hcmsgYWxsIHRoZSBkZXBlbmRlbmNpZXMgYXMgbmVlZGluZyB0byBiZSBsb2FkZWQuCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vU29tZSBkZWZpbmVzIGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBzaW5jZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwsIGNvbGxlY3QgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZCA9IGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKG51bGwsIHJlbE1hcCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9yZSBpZiBtYXAgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGwgZm9yIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5za2lwTWFwID0gb3B0aW9ucy5za2lwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5pbml0KGRlcHMsIGNhbGxiYWNrLCBlcnJiYWNrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaXhpbihsb2NhbFJlcXVpcmUsIHsKICAgICAgICAgICAgICAgICAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlciwKCiAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSArIC5leHRlbnNpb24gaW50byBhbiBVUkwgcGF0aC4KICAgICAgICAgICAgICAgICAgICAgKiAqUmVxdWlyZXMqIHRoZSB1c2Ugb2YgYSBtb2R1bGUgbmFtZS4gSXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAgICAgICAgICAqIHBsYWluIFVSTHMgbGlrZSBuYW1lVG9VcmwuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lUGx1c0V4dCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtb2R1bGVOYW1lUGx1c0V4dC5sYXN0SW5kZXhPZignLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IG1vZHVsZU5hbWVQbHVzRXh0LnNwbGl0KCcvJylbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlbGF0aXZlID0gc2VnbWVudCA9PT0gJy4nIHx8IHNlZ21lbnQgPT09ICcuLic7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0hhdmUgYSBmaWxlIGV4dGVuc2lvbiBhbGlhcywgYW5kIGl0IGlzIG5vdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3RzIGZyb20gYSByZWxhdGl2ZSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xICYmICghaXNSZWxhdGl2ZSB8fCBpbmRleCA+IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBtb2R1bGVOYW1lUGx1c0V4dC5zdWJzdHJpbmcoaW5kZXgsIG1vZHVsZU5hbWVQbHVzRXh0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lUGx1c0V4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5hbWVUb1VybChub3JtYWxpemUobW9kdWxlTmFtZVBsdXNFeHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbE1hcCAmJiByZWxNYXAuaWQsIHRydWUpLCBleHQsICB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZDogZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcm9wKGRlZmluZWQsIGlkKSB8fCBoYXNQcm9wKHJlZ2lzdHJ5LCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9Pbmx5IGFsbG93IHVuZGVmIG9uIHRvcCBsZXZlbCByZXF1aXJlIGNhbGxzCiAgICAgICAgICAgICAgICBpZiAoIXJlbE1hcCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZS51bmRlZiA9IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgYW55IHdhaXRpbmcgZGVmaW5lKCkgY2FsbHMgdG8gdGhpcyBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpeCBmb3IgIzQwOAogICAgICAgICAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBtb2QudW5kZWZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxGZXRjaGVkW21hcC51cmxdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5kZWZFdmVudHNbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiBxdWV1ZWQgZGVmaW5lcyB0b28uIEdvIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAvL2luIGFycmF5IHNvIHRoYXQgdGhlIHNwbGljZXMgZG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzcyB1cCB0aGUgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUmV2ZXJzZShkZWZRdWV1ZSwgZnVuY3Rpb24oYXJncywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZGVmUXVldWVNYXBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ib2xkIG9uIHRvIGxpc3RlbmVycyBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gYmUgcmVsb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNpbmcgYSBkaWZmZXJlbnQgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5ldmVudHMuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmRXZlbnRzW2lkXSA9IG1vZC5ldmVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlcXVpcmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHRvIGVuYWJsZSBhIG1vZHVsZSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgcmVnaXN0cnkKICAgICAgICAgICAgICogYXdhaXRpbmcgZW5hYmxlbWVudC4gQSBzZWNvbmQgYXJnLCBwYXJlbnQsIHRoZSBwYXJlbnQgbW9kdWxlLAogICAgICAgICAgICAgKiBpcyBwYXNzZWQgaW4gZm9yIGNvbnRleHQsIHdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieQogICAgICAgICAgICAgKiB0aGUgb3B0aW1pemVyLiBOb3Qgc2hvd24gaGVyZSB0byBrZWVwIGNvZGUgY29tcGFjdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgZGVwTWFwLmlkKTsKICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGUoZGVwTWFwKS5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBlbnZpcm9ubWVudCBhZGFwdGVycyB0byBjb21wbGV0ZSBhIGxvYWQgZXZlbnQuCiAgICAgICAgICAgICAqIEEgbG9hZCBldmVudCBjb3VsZCBiZSBhIHNjcmlwdCBsb2FkIG9yIGp1c3QgYSBsb2FkIHBhc3MgZnJvbSBhIHN5bmNocm9ub3VzCiAgICAgICAgICAgICAqIGxvYWQgY2FsbC4KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBwb3RlbnRpYWxseSBjb21wbGV0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbXBsZXRlTG9hZDogZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCwgYXJncywgbW9kLAogICAgICAgICAgICAgICAgICAgIHNoaW0gPSBnZXRPd24oY29uZmlnLnNoaW0sIG1vZHVsZU5hbWUpIHx8IHt9LAogICAgICAgICAgICAgICAgICAgIHNoRXhwb3J0cyA9IHNoaW0uZXhwb3J0czsKCiAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYWxyZWFkeSBmb3VuZCBhbiBhbm9ueW1vdXMgbW9kdWxlIGFuZCBib3VuZCBpdAogICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoaXMgbmFtZSwgdGhlbiB0aGlzIGlzIHNvbWUgb3RoZXIgYW5vbiBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgLy93YWl0aW5nIGZvciBpdHMgY29tcGxldGVMb2FkIHRvIGZpcmUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZvdW5kIG1hdGNoaW5nIGRlZmluZSBjYWxsIGZvciB0aGlzIHNjcmlwdCEKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXAgPSB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIHRoaXMgYWZ0ZXIgdGhlIGN5Y2xlIG9mIGNhbGxHZXRNb2R1bGUgaW4gY2FzZSB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICAvL29mIHRob3NlIGNhbGxzL2luaXQgY2FsbHMgY2hhbmdlcyB0aGUgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgIWhhc1Byb3AoZGVmaW5lZCwgbW9kdWxlTmFtZSkgJiYgbW9kICYmICFtb2QuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbmZvcmNlRGVmaW5lICYmICghc2hFeHBvcnRzIHx8ICFnZXRHbG9iYWwoc2hFeHBvcnRzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BhdGhGYWxsYmFjayhtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub2RlZmluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdObyBkZWZpbmUgY2FsbCBmb3IgJyArIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9BIHNjcmlwdCB0aGF0IGRvZXMgbm90IGNhbGwgZGVmaW5lKCksIHNvIGp1c3Qgc2ltdWxhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgY2FsbCBmb3IgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoW21vZHVsZU5hbWUsIChzaGltLmRlcHMgfHwgW10pLCBzaGltLmV4cG9ydHNGbl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbnZlcnRzIGEgbW9kdWxlIG5hbWUgdG8gYSBmaWxlIHBhdGguIFN1cHBvcnRzIGNhc2VzIHdoZXJlCiAgICAgICAgICAgICAqIG1vZHVsZU5hbWUgbWF5IGFjdHVhbGx5IGJlIGp1c3QgYW4gVVJMLgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgaXQgKipkb2VzIG5vdCoqIGNhbGwgbm9ybWFsaXplIG9uIHRoZSBtb2R1bGVOYW1lLAogICAgICAgICAgICAgKiBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWQuIFRoaXMgaXMgYW4KICAgICAgICAgICAgICogaW50ZXJuYWwgQVBJLCBub3QgYSBwdWJsaWMgb25lLiBVc2UgdG9VcmwgZm9yIHRoZSBwdWJsaWMgQVBJLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbmFtZVRvVXJsOiBmdW5jdGlvbiAobW9kdWxlTmFtZSwgZXh0LCBza2lwRXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aHMsIHN5bXMsIGksIHBhcmVudE1vZHVsZSwgdXJsLAogICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsIGJ1bmRsZUlkLAogICAgICAgICAgICAgICAgICAgIHBrZ01haW4gPSBnZXRPd24oY29uZmlnLnBrZ3MsIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmIChwa2dNYWluKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IHBrZ01haW47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnVuZGxlSWQgPSBnZXRPd24oYnVuZGxlc01hcCwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkLCBleHQsIHNraXBFeHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgYSBjb2xvbiBpcyBpbiB0aGUgVVJMLCBpdCBpbmRpY2F0ZXMgYSBwcm90b2NvbCBpcyB1c2VkIGFuZCBpdCBpcyBqdXN0CiAgICAgICAgICAgICAgICAvL2FuIFVSTCB0byBhIGZpbGUsIG9yIGlmIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2gsIGNvbnRhaW5zIGEgcXVlcnkgYXJnIChpLmUuID8pCiAgICAgICAgICAgICAgICAvL29yIGVuZHMgd2l0aCAuanMsIHRoZW4gYXNzdW1lIHRoZSB1c2VyIG1lYW50IHRvIHVzZSBhbiB1cmwgYW5kIG5vdCBhIG1vZHVsZSBpZC4KICAgICAgICAgICAgICAgIC8vVGhlIHNsYXNoIGlzIGltcG9ydGFudCBmb3IgcHJvdG9jb2wtbGVzcyBVUkxzIGFzIHdlbGwgYXMgZnVsbCBwYXRocy4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIHBsYWluIHBhdGgsIG5vdCBtb2R1bGUgbmFtZSBsb29rdXAsIHNvIGp1c3QgcmV0dXJuIGl0LgogICAgICAgICAgICAgICAgICAgIC8vQWRkIGV4dGVuc2lvbiBpZiBpdCBpcyBpbmNsdWRlZC4gVGhpcyBpcyBhIGJpdCB3b25reSwgb25seSBub24tLmpzIHRoaW5ncyBwYXNzCiAgICAgICAgICAgICAgICAgICAgLy9hbiBleHRlbnNpb24sIHRoaXMgbWV0aG9kIHByb2JhYmx5IG5lZWRzIHRvIGJlIHJld29ya2VkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IG1vZHVsZU5hbWUgKyAoZXh0IHx8ICcnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIG1vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBjb25maWcucGF0aHM7CgogICAgICAgICAgICAgICAgICAgIHN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZWFjaCBtb2R1bGUgbmFtZSBzZWdtZW50LCBzZWUgaWYgdGhlcmUgaXMgYSBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy9yZWdpc3RlcmVkIGZvciBpdC4gU3RhcnQgd2l0aCBtb3N0IHNwZWNpZmljIG5hbWUKICAgICAgICAgICAgICAgICAgICAvL2FuZCB3b3JrIHVwIGZyb20gaXQuCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc3ltcy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gZ2V0T3duKHBhdGhzLCBwYXJlbnRNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbiBhcnJheSwgaXQgbWVhbnMgdGhlcmUgYXJlIGEgZmV3IGNob2ljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Nob29zZSB0aGUgb25lIHRoYXQgaXMgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkocGFyZW50UGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGFyZW50UGF0aFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuc3BsaWNlKDAsIGksIHBhcmVudFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSm9pbiB0aGUgcGF0aCBwYXJ0cyB0b2dldGhlciwgdGhlbiBmaWd1cmUgb3V0IGlmIGJhc2VVcmwgaXMgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IHN5bXMuam9pbignLycpOwogICAgICAgICAgICAgICAgICAgIHVybCArPSAoZXh0IHx8ICgvXmRhdGFcOnxcPy8udGVzdCh1cmwpIHx8IHNraXBFeHQgPyAnJyA6ICcuanMnKSk7CiAgICAgICAgICAgICAgICAgICAgdXJsID0gKHVybC5jaGFyQXQoMCkgPT09ICcvJyB8fCB1cmwubWF0Y2goL15bXHdcK1wuXC1dKzovKSA/ICcnIDogY29uZmlnLmJhc2VVcmwpICsgdXJsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcudXJsQXJncyA/IHVybCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVybEFyZ3MpIDogdXJsOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9EZWxlZ2F0ZXMgdG8gcmVxLmxvYWQuIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0bwogICAgICAgICAgICAvL2FsbG93IG92ZXJyaWRpbmcgaW4gdGhlIG9wdGltaXplci4KICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24gKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgIHJlcS5sb2FkKGNvbnRleHQsIGlkLCB1cmwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV4ZWN1dGVzIGEgbW9kdWxlIGNhbGxiYWNrIGZ1bmN0aW9uLiBCcm9rZW4gb3V0IGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24KICAgICAgICAgICAgICogc29sZWx5IHRvIGFsbG93IHRoZSBidWlsZCBzeXN0ZW0gdG8gc2VxdWVuY2UgdGhlIGZpbGVzIGluIHRoZSBidWlsdAogICAgICAgICAgICAgKiBsYXllciBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBleGVjQ2I6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgYXJncywgZXhwb3J0cykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KGV4cG9ydHMsIGFyZ3MpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGNhbGxiYWNrIGZvciBzY3JpcHQgbG9hZHMsIHVzZWQgdG8gY2hlY2sgc3RhdHVzIG9mIGxvYWRpbmcuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dCB0aGUgZXZlbnQgZnJvbSB0aGUgYnJvd3NlciBmb3IgdGhlIHNjcmlwdAogICAgICAgICAgICAgKiB0aGF0IHdhcyBsb2FkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdExvYWQ6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgICAgIC8vYWxsIG9sZCBicm93c2VycyB3aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHRoaXMgb25lIHdhcyBlYXN5IGVub3VnaAogICAgICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgICAgIGlmIChldnQudHlwZSA9PT0gJ2xvYWQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkeVJlZ0V4cC50ZXN0KChldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9SZXNldCBpbnRlcmFjdGl2ZSBzY3JpcHQgc28gYSBzY3JpcHQgbm9kZSBpcyBub3QgaGVsZCBvbnRvIGZvcgogICAgICAgICAgICAgICAgICAgIC8vdG8gbG9uZy4KICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvdXQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXRTY3JpcHREYXRhKGV2dCk7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQoZGF0YS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHNjcmlwdCBlcnJvcnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdEVycm9yOiBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgIGlmICghaGFzUGF0aEZhbGxiYWNrKGRhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19AcicpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLmRlcE1hcHMsIGZ1bmN0aW9uKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBNYXAuaWQgPT09IGRhdGEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ob2RlQ3JlYXRlZCkgewogICAgICAgICAgICAgICAgY29uZmlnLm9uTm9kZUNyZWF0ZWQobm9kZSwgY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL2lzc3Vlcy8xODcKICAgICAgICAgICAgICAgICAgICAvL2lmIHdlIGNhbiBOT1QgZmluZCBbbmF0aXZlIGNvZGVdIHRoZW4gaXQgbXVzdCBOT1QgbmF0aXZlbHkgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgIC8vaW4gSUU4LCBub2RlLmF0dGFjaEV2ZW50IGRvZXMgbm90IGhhdmUgdG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGUgdGVzdCBmb3IgIltuYXRpdmUgY29kZSIgd2l0aCBubyBjbG9zaW5nIGJyYWNlLCBzZWU6CiAgICAgICAgICAgICAgICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvaXNzdWVzLzI3MwogICAgICAgICAgICAgICAgICAgICEobm9kZS5hdHRhY2hFdmVudC50b1N0cmluZyAmJiBub2RlLmF0dGFjaEV2ZW50LnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlJykgPCAwKSAmJgogICAgICAgICAgICAgICAgICAgICFpc09wZXJhKSB7CiAgICAgICAgICAgICAgICAvL1Byb2JhYmx5IElFLiBJRSAoYXQgbGVhc3QgNi04KSBkbyBub3QgZmlyZQogICAgICAgICAgICAgICAgLy9zY3JpcHQgb25sb2FkIHJpZ2h0IGFmdGVyIGV4ZWN1dGluZyB0aGUgc2NyaXB0LCBzbwogICAgICAgICAgICAgICAgLy93ZSBjYW5ub3QgdGllIHRoZSBhbm9ueW1vdXMgZGVmaW5lIGNhbGwgdG8gYSBuYW1lLgogICAgICAgICAgICAgICAgLy9Ib3dldmVyLCBJRSByZXBvcnRzIHRoZSBzY3JpcHQgYXMgYmVpbmcgaW4gJ2ludGVyYWN0aXZlJwogICAgICAgICAgICAgICAgLy9yZWFkeVN0YXRlIGF0IHRoZSB0aW1lIG9mIHRoZSBkZWZpbmUgY2FsbC4KICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBub2RlLmF0dGFjaEV2ZW50KCdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCk7CiAgICAgICAgICAgICAgICAvL0l0IHdvdWxkIGJlIGdyZWF0IHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIGhlcmUgdG8gY2F0Y2gKICAgICAgICAgICAgICAgIC8vNDA0cyBpbiBJRTkrLiBIb3dldmVyLCBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2lsbCBmaXJlIGJlZm9yZQogICAgICAgICAgICAgICAgLy90aGUgZXJyb3IgaGFuZGxlciwgc28gdGhhdCBkb2VzIG5vdCBoZWxwLiBJZiBhZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgICAgICAvL2lzIHVzZWQsIHRoZW4gSUUgd2lsbCBmaXJlIGVycm9yIGJlZm9yZSBsb2FkLCBidXQgd2UgY2Fubm90CiAgICAgICAgICAgICAgICAvL3VzZSB0aGF0IHBhdGh3YXkgZ2l2ZW4gdGhlIGNvbm5lY3QubWljcm9zb2Z0LmNvbSBpc3N1ZQogICAgICAgICAgICAgICAgLy9tZW50aW9uZWQgYWJvdmUgYWJvdXQgbm90IGRvaW5nIHRoZSAnc2NyaXB0IGV4ZWN1dGUsCiAgICAgICAgICAgICAgICAvL3RoZW4gZmlyZSB0aGUgc2NyaXB0IGxvYWQgZXZlbnQgbGlzdGVuZXIgYmVmb3JlIGV4ZWN1dGUKICAgICAgICAgICAgICAgIC8vbmV4dCBzY3JpcHQnIHRoYXQgb3RoZXIgYnJvd3NlcnMgZG8uCiAgICAgICAgICAgICAgICAvL0Jlc3QgaG9wZTogSUUxMCBmaXhlcyB0aGUgaXNzdWVzLAogICAgICAgICAgICAgICAgLy9hbmQgdGhlbiBkZXN0cm95cyBhbGwgaW5zdGFsbHMgb2YgSUUgNi05LgogICAgICAgICAgICAgICAgLy9ub2RlLmF0dGFjaEV2ZW50KCdvbmVycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNvbnRleHQub25TY3JpcHRMb2FkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY29udGV4dC5vblNjcmlwdEVycm9yLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zcmMgPSB1cmw7CgogICAgICAgICAgICAvL0ZvciBzb21lIGNhY2hlIGNhc2VzIGluIElFIDYtOCwgdGhlIHNjcmlwdCBleGVjdXRlcyBiZWZvcmUgdGhlIGVuZAogICAgICAgICAgICAvL29mIHRoZSBhcHBlbmRDaGlsZCBleGVjdXRpb24sIHNvIHRvIHRpZSBhbiBhbm9ueW1vdXMgZGVmaW5lCiAgICAgICAgICAgIC8vY2FsbCB0byB0aGUgbW9kdWxlIG5hbWUgKHdoaWNoIGlzIHN0b3JlZCBvbiB0aGUgbm9kZSksIGhvbGQgb24KICAgICAgICAgICAgLy90byBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUsIGJ1dCBjbGVhciBhZnRlciB0aGUgRE9NIGluc2VydGlvbi4KICAgICAgICAgICAgY3VycmVudGx5QWRkaW5nU2NyaXB0ID0gbm9kZTsKICAgICAgICAgICAgaWYgKGJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBoZWFkLmluc2VydEJlZm9yZShub2RlLCBiYXNlRWxlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG51bGw7CgogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9IGVsc2UgaWYgKGlzV2ViV29ya2VyKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvL0luIGEgd2ViIHdvcmtlciwgdXNlIGltcG9ydFNjcmlwdHMuIFRoaXMgaXMgbm90IGEgdmVyeQogICAgICAgICAgICAgICAgLy9lZmZpY2llbnQgdXNlIG9mIGltcG9ydFNjcmlwdHMsIGltcG9ydFNjcmlwdHMgd2lsbCBibG9jayB1bnRpbAogICAgICAgICAgICAgICAgLy9pdHMgc2NyaXB0IGlzIGRvd25sb2FkZWQgYW5kIGV2YWx1YXRlZC4gSG93ZXZlciwgaWYgd2ViIHdvcmtlcnMKICAgICAgICAgICAgICAgIC8vYXJlIGluIHBsYXksIHRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGEgYnVpbGQgaGFzIGJlZW4gZG9uZSBzbwogICAgICAgICAgICAgICAgLy90aGF0IG9ubHkgb25lIHNjcmlwdCBuZWVkcyB0byBiZSBsb2FkZWQgYW55d2F5LiBUaGlzIG1heSBuZWVkCiAgICAgICAgICAgICAgICAvL3RvIGJlIHJlZXZhbHVhdGVkIGlmIG90aGVyIHVzZSBjYXNlcyBiZWNvbWUgY29tbW9uLgogICAgICAgICAgICAgICAgaW1wb3J0U2NyaXB0cyh1cmwpOwoKICAgICAgICAgICAgICAgIC8vQWNjb3VudCBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICAgICAgICAgIGNvbnRleHQuY29tcGxldGVMb2FkKG1vZHVsZU5hbWUpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IobWFrZUVycm9yKCdpbXBvcnRzY3JpcHRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0U2NyaXB0cyBmYWlsZWQgZm9yICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lICsgJyBhdCAnICsgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldEludGVyYWN0aXZlU2NyaXB0KCkgewogICAgICAgIGlmIChpbnRlcmFjdGl2ZVNjcmlwdCAmJiBpbnRlcmFjdGl2ZVNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgICAgICB9CgogICAgICAgIGVhY2hSZXZlcnNlKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdCkgewogICAgICAgICAgICBpZiAoc2NyaXB0LnJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoaW50ZXJhY3RpdmVTY3JpcHQgPSBzY3JpcHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0OwogICAgfQoKICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gc2NyaXB0IGF0dHJpYnV0ZSwgd2hpY2ggY291bGQgYWxzbyBhZGp1c3QgdGhlIGJhc2VVcmwuCiAgICBpZiAoaXNCcm93c2VyICYmICFjZmcuc2tpcERhdGFNYWluKSB7CiAgICAgICAgLy9GaWd1cmUgb3V0IGJhc2VVcmwuIEdldCBpdCBmcm9tIHRoZSBzY3JpcHQgdGFnIHdpdGggcmVxdWlyZS5qcyBpbiBpdC4KICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgLy9TZXQgdGhlICdoZWFkJyB3aGVyZSB3ZSBjYW4gYXBwZW5kIGNoaWxkcmVuIGJ5CiAgICAgICAgICAgIC8vdXNpbmcgdGhlIHNjcmlwdCdzIHBhcmVudC4KICAgICAgICAgICAgaWYgKCFoZWFkKSB7CiAgICAgICAgICAgICAgICBoZWFkID0gc2NyaXB0LnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vTG9vayBmb3IgYSBkYXRhLW1haW4gYXR0cmlidXRlIHRvIHNldCBtYWluIHNjcmlwdCBmb3IgdGhlIHBhZ2UKICAgICAgICAgICAgLy90byBsb2FkLiBJZiBpdCBpcyB0aGVyZSwgdGhlIHBhdGggdG8gZGF0YSBtYWluIGJlY29tZXMgdGhlCiAgICAgICAgICAgIC8vYmFzZVVybCwgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LgogICAgICAgICAgICBkYXRhTWFpbiA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWFpbicpOwogICAgICAgICAgICBpZiAoZGF0YU1haW4pIHsKICAgICAgICAgICAgICAgIC8vUHJlc2VydmUgZGF0YU1haW4gaW4gY2FzZSBpdCBpcyBhIHBhdGggKGkuZS4gY29udGFpbnMgJz8nKQogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwoKICAgICAgICAgICAgICAgIC8vU2V0IGZpbmFsIGJhc2VVcmwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYW4gZXhwbGljaXQgb25lLgogICAgICAgICAgICAgICAgaWYgKCFjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvZmYgdGhlIGRpcmVjdG9yeSBvZiBkYXRhLW1haW4gZm9yIHVzZSBhcyB0aGUKICAgICAgICAgICAgICAgICAgICAvL2Jhc2VVcmwuCiAgICAgICAgICAgICAgICAgICAgc3JjID0gbWFpblNjcmlwdC5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBzcmMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHNyYy5sZW5ndGggPyBzcmMuam9pbignLycpICArICcvJyA6ICcuLyc7CgogICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsID0gc3ViUGF0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiBhbnkgdHJhaWxpbmcgLmpzIHNpbmNlIG1haW5TY3JpcHQgaXMgbm93CiAgICAgICAgICAgICAgICAvL2xpa2UgYSBtb2R1bGUgbmFtZS4KICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBtYWluU2NyaXB0LnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKCiAgICAgICAgICAgICAgICAvL0lmIG1haW5TY3JpcHQgaXMgc3RpbGwgYSBwYXRoLCBmYWxsIGJhY2sgdG8gZGF0YU1haW4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSkgewogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1B1dCB0aGUgZGF0YS1tYWluIHNjcmlwdCBpbiB0aGUgZmlsZXMgdG8gbG9hZC4KICAgICAgICAgICAgICAgIGNmZy5kZXBzID0gY2ZnLmRlcHMgPyBjZmcuZGVwcy5jb25jYXQobWFpblNjcmlwdCkgOiBbbWFpblNjcmlwdF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgZGVmaW5pdGlvbnMgb2YgbW9kdWxlcy4gRGlmZmVycyBmcm9tCiAgICAgKiByZXF1aXJlKCkgaW4gdGhhdCBhIHN0cmluZyBmb3IgdGhlIG1vZHVsZSBzaG91bGQgYmUgdGhlIGZpcnN0IGFyZ3VtZW50LAogICAgICogYW5kIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkIHNob3VsZAogICAgICogcmV0dXJuIGEgdmFsdWUgdG8gZGVmaW5lIHRoZSBtb2R1bGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYXJndW1lbnQncwogICAgICogbmFtZS4KICAgICAqLwogICAgZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIG5vZGUsIGNvbnRleHQ7CgogICAgICAgIC8vQWxsb3cgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAvL0FkanVzdCBhcmdzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbmFtZTsKICAgICAgICAgICAgbmFtZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvL1RoaXMgbW9kdWxlIG1heSBub3QgaGF2ZSBkZXBlbmRlbmNpZXMKICAgICAgICBpZiAoIWlzQXJyYXkoZGVwcykpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vSWYgbm8gbmFtZSwgYW5kIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24sIHRoZW4gZmlndXJlIG91dCBpZiBpdCBhCiAgICAgICAgLy9Db21tb25KUyB0aGluZyB3aXRoIGRlcGVuZGVuY2llcy4KICAgICAgICBpZiAoIWRlcHMgJiYgaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgZGVwcyA9IFtdOwogICAgICAgICAgICAvL1JlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBjYWxsYmFjayBzdHJpbmcsCiAgICAgICAgICAgIC8vbG9vayBmb3IgcmVxdWlyZSBjYWxscywgYW5kIHB1bGwgdGhlbSBpbnRvIHRoZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIC8vYnV0IG9ubHkgaWYgdGhlcmUgYXJlIGZ1bmN0aW9uIGFyZ3MuCiAgICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjb21tZW50UmVnRXhwLCAnJykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjanNSZXF1aXJlUmVnRXhwLCBmdW5jdGlvbiAobWF0Y2gsIGRlcCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL01heSBiZSBhIENvbW1vbkpTIHRoaW5nIGV2ZW4gd2l0aG91dCByZXF1aXJlIGNhbGxzLCBidXQgc3RpbGwKICAgICAgICAgICAgICAgIC8vY291bGQgdXNlIGV4cG9ydHMsIGFuZCBtb2R1bGUuIEF2b2lkIGRvaW5nIGV4cG9ydHMgYW5kIG1vZHVsZQogICAgICAgICAgICAgICAgLy93b3JrIHRob3VnaCBpZiBpdCBqdXN0IG5lZWRzIHJlcXVpcmUuCiAgICAgICAgICAgICAgICAvL1JFUVVJUkVTIHRoZSBmdW5jdGlvbiB0byBleHBlY3QgdGhlIENvbW1vbkpTIHZhcmlhYmxlcyBpbiB0aGUKICAgICAgICAgICAgICAgIC8vb3JkZXIgbGlzdGVkIGJlbG93LgogICAgICAgICAgICAgICAgZGVwcyA9IChjYWxsYmFjay5sZW5ndGggPT09IDEgPyBbJ3JlcXVpcmUnXSA6IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddKS5jb25jYXQoZGVwcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vSWYgaW4gSUUgNi04IGFuZCBoaXQgYW4gYW5vbnltb3VzIGRlZmluZSgpIGNhbGwsIGRvIHRoZSBpbnRlcmFjdGl2ZQogICAgICAgIC8vd29yay4KICAgICAgICBpZiAodXNlSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgbm9kZSA9IGN1cnJlbnRseUFkZGluZ1NjcmlwdCB8fCBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpOwogICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0c1tub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9BbHdheXMgc2F2ZSBvZmYgZXZhbHVhdGluZyB0aGUgZGVmIGNhbGwgdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgaGFuZGxlci4KICAgICAgICAvL1RoaXMgYWxsb3dzIG11bHRpcGxlIG1vZHVsZXMgdG8gYmUgaW4gYSBmaWxlIHdpdGhvdXQgcHJlbWF0dXJlbHkKICAgICAgICAvL3RyYWNpbmcgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3dzIGZvciBhbm9ueW1vdXMgbW9kdWxlIHN1cHBvcnQsCiAgICAgICAgLy93aGVyZSB0aGUgbW9kdWxlIG5hbWUgaXMgbm90IGtub3duIHVudGlsIHRoZSBzY3JpcHQgb25sb2FkIGV2ZW50CiAgICAgICAgLy9vY2N1cnMuIElmIG5vIGNvbnRleHQsIHVzZSB0aGUgZ2xvYmFsIHF1ZXVlLCBhbmQgZ2V0IGl0IHByb2Nlc3NlZAogICAgICAgIC8vaW4gdGhlIG9uc2NyaXB0IGxvYWQgY2FsbGJhY2suCiAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwW25hbWVdID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbG9iYWxEZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgIH0KICAgIH07CgogICAgZGVmaW5lLmFtZCA9IHsKICAgICAgICBqUXVlcnk6IHRydWUKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgdGV4dC4gTm9ybWFsbHkganVzdCB1c2VzIGV2YWwsIGJ1dCBjYW4gYmUgbW9kaWZpZWQKICAgICAqIHRvIHVzZSBhIGJldHRlciwgZW52aXJvbm1lbnQtc3BlY2lmaWMgY2FsbC4gT25seSB1c2VkIGZvciB0cmFuc3BpbGluZwogICAgICogbG9hZGVyIHBsdWdpbnMsIG5vdCBmb3IgcGxhaW4gSlMgbW9kdWxlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRoZSB0ZXh0IHRvIGV4ZWN1dGUvZXZhbHVhdGUuCiAgICAgKi8KICAgIHJlcS5leGVjID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgcmV0dXJuIGV2YWwodGV4dCk7CiAgICB9OwoKICAgIC8vU2V0IHVwIHdpdGggY29uZmlnIGluZm8uCiAgICByZXEoY2ZnKTsKfSh0aGlzKSk7Cg==",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 542
},
"outputId": "5bb39485-e929-48d1-ec52-152c42af62da"
},
"source": [
"df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_world_gdp_with_codes.csv')\n",
"\n",
"data = [go.Choropleth(\n",
" locations = df['CODE'],\n",
" z = df['GDP (BILLIONS)'],\n",
" text = df['COUNTRY'],\n",
" colorscale = [\n",
" [0, \"rgb(5, 10, 172)\"],\n",
" [0.35, \"rgb(40, 60, 190)\"],\n",
" [0.5, \"rgb(70, 100, 245)\"],\n",
" [0.6, \"rgb(90, 120, 245)\"],\n",
" [0.7, \"rgb(106, 137, 247)\"],\n",
" [1, \"rgb(220, 220, 220)\"]\n",
" ],\n",
" autocolorscale = False,\n",
" reversescale = True,\n",
" marker = go.choropleth.Marker(\n",
" line = go.choropleth.marker.Line(\n",
" color = 'rgb(180,180,180)',\n",
" width = 0.5\n",
" )),\n",
" colorbar = go.choropleth.ColorBar(\n",
" tickprefix = '$',\n",
" title = 'GDP
Billions US$'),\n",
")]\n",
"\n",
"layout = go.Layout(\n",
" title = go.layout.Title(\n",
" text = '2014 Global GDP'\n",
" ),\n",
" geo = go.layout.Geo(\n",
" showframe = False,\n",
" showcoastlines = False,\n",
" projection = go.layout.geo.Projection(\n",
" type = 'equirectangular'\n",
" )\n",
" ),\n",
" annotations = [go.layout.Annotation(\n",
" x = 0.55,\n",
" y = 0.1,\n",
" xref = 'paper',\n",
" yref = 'paper',\n",
" text = 'Source: \\\n",
" CIA World Factbook',\n",
" showarrow = False\n",
" )]\n",
")\n",
"\n",
"fig = go.Figure(data = data, layout = layout)\n",
"py.iplot(fig, filename = 'd3-world-map')"
],
"execution_count": 48,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/vnd.plotly.v1+html": "",
"text/html": [
""
],
"application/vnd.plotly.v1+json": {
"layout": {
"geo": {
"projection": {
"type": "equirectangular"
},
"showcoastlines": false,
"showframe": false
},
"annotations": [
{
"xref": "paper",
"yref": "paper",
"text": "Source: CIA World Factbook",
"y": 0.1,
"x": 0.55,
"showarrow": false
}
],
"title": {
"text": "2014 Global GDP"
}
},
"config": {
"plotlyServerURL": "https://plot.ly",
"linkText": "Export to plot.ly",
"showLink": false
},
"data": [
{
"reversescale": true,
"autocolorscale": false,
"uid": "639eceae-6e25-4fc1-a019-0cd7d91f6201",
"colorscale": [
[
0,
"rgb(5, 10, 172)"
],
[
0.35,
"rgb(40, 60, 190)"
],
[
0.5,
"rgb(70, 100, 245)"
],
[
0.6,
"rgb(90, 120, 245)"
],
[
0.7,
"rgb(106, 137, 247)"
],
[
1,
"rgb(220, 220, 220)"
]
],
"text": [
"Afghanistan",
"Albania",
"Algeria",
"American Samoa",
"Andorra",
"Angola",
"Anguilla",
"Antigua and Barbuda",
"Argentina",
"Armenia",
"Aruba",
"Australia",
"Austria",
"Azerbaijan",
"Bahamas, The",
"Bahrain",
"Bangladesh",
"Barbados",
"Belarus",
"Belgium",
"Belize",
"Benin",
"Bermuda",
"Bhutan",
"Bolivia",
"Bosnia and Herzegovina",
"Botswana",
"Brazil",
"British Virgin Islands",
"Brunei",
"Bulgaria",
"Burkina Faso",
"Burma",
"Burundi",
"Cabo Verde",
"Cambodia",
"Cameroon",
"Canada",
"Cayman Islands",
"Central African Republic",
"Chad",
"Chile",
"China",
"Colombia",
"Comoros",
"Congo, Democratic Republic of the",
"Congo, Republic of the",
"Cook Islands",
"Costa Rica",
"Cote d'Ivoire",
"Croatia",
"Cuba",
"Curacao",
"Cyprus",
"Czech Republic",
"Denmark",
"Djibouti",
"Dominica",
"Dominican Republic",
"Ecuador",
"Egypt",
"El Salvador",
"Equatorial Guinea",
"Eritrea",
"Estonia",
"Ethiopia",
"Falkland Islands (Islas Malvinas)",
"Faroe Islands",
"Fiji",
"Finland",
"France",
"French Polynesia",
"Gabon",
"Gambia, The",
"Georgia",
"Germany",
"Ghana",
"Gibraltar",
"Greece",
"Greenland",
"Grenada",
"Guam",
"Guatemala",
"Guernsey",
"Guinea-Bissau",
"Guinea",
"Guyana",
"Haiti",
"Honduras",
"Hong Kong",
"Hungary",
"Iceland",
"India",
"Indonesia",
"Iran",
"Iraq",
"Ireland",
"Isle of Man",
"Israel",
"Italy",
"Jamaica",
"Japan",
"Jersey",
"Jordan",
"Kazakhstan",
"Kenya",
"Kiribati",
"Korea, North",
"Korea, South",
"Kosovo",
"Kuwait",
"Kyrgyzstan",
"Laos",
"Latvia",
"Lebanon",
"Lesotho",
"Liberia",
"Libya",
"Liechtenstein",
"Lithuania",
"Luxembourg",
"Macau",
"Macedonia",
"Madagascar",
"Malawi",
"Malaysia",
"Maldives",
"Mali",
"Malta",
"Marshall Islands",
"Mauritania",
"Mauritius",
"Mexico",
"Micronesia, Federated States of",
"Moldova",
"Monaco",
"Mongolia",
"Montenegro",
"Morocco",
"Mozambique",
"Namibia",
"Nepal",
"Netherlands",
"New Caledonia",
"New Zealand",
"Nicaragua",
"Nigeria",
"Niger",
"Niue",
"Northern Mariana Islands",
"Norway",
"Oman",
"Pakistan",
"Palau",
"Panama",
"Papua New Guinea",
"Paraguay",
"Peru",
"Philippines",
"Poland",
"Portugal",
"Puerto Rico",
"Qatar",
"Romania",
"Russia",
"Rwanda",
"Saint Kitts and Nevis",
"Saint Lucia",
"Saint Martin",
"Saint Pierre and Miquelon",
"Saint Vincent and the Grenadines",
"Samoa",
"San Marino",
"Sao Tome and Principe",
"Saudi Arabia",
"Senegal",
"Serbia",
"Seychelles",
"Sierra Leone",
"Singapore",
"Sint Maarten",
"Slovakia",
"Slovenia",
"Solomon Islands",
"Somalia",
"South Africa",
"South Sudan",
"Spain",
"Sri Lanka",
"Sudan",
"Suriname",
"Swaziland",
"Sweden",
"Switzerland",
"Syria",
"Taiwan",
"Tajikistan",
"Tanzania",
"Thailand",
"Timor-Leste",
"Togo",
"Tonga",
"Trinidad and Tobago",
"Tunisia",
"Turkey",
"Turkmenistan",
"Tuvalu",
"Uganda",
"Ukraine",
"United Arab Emirates",
"United Kingdom",
"United States",
"Uruguay",
"Uzbekistan",
"Vanuatu",
"Venezuela",
"Vietnam",
"Virgin Islands",
"West Bank",
"Yemen",
"Zambia",
"Zimbabwe"
],
"locations": [
"AFG",
"ALB",
"DZA",
"ASM",
"AND",
"AGO",
"AIA",
"ATG",
"ARG",
"ARM",
"ABW",
"AUS",
"AUT",
"AZE",
"BHM",
"BHR",
"BGD",
"BRB",
"BLR",
"BEL",
"BLZ",
"BEN",
"BMU",
"BTN",
"BOL",
"BIH",
"BWA",
"BRA",
"VGB",
"BRN",
"BGR",
"BFA",
"MMR",
"BDI",
"CPV",
"KHM",
"CMR",
"CAN",
"CYM",
"CAF",
"TCD",
"CHL",
"CHN",
"COL",
"COM",
"COD",
"COG",
"COK",
"CRI",
"CIV",
"HRV",
"CUB",
"CUW",
"CYP",
"CZE",
"DNK",
"DJI",
"DMA",
"DOM",
"ECU",
"EGY",
"SLV",
"GNQ",
"ERI",
"EST",
"ETH",
"FLK",
"FRO",
"FJI",
"FIN",
"FRA",
"PYF",
"GAB",
"GMB",
"GEO",
"DEU",
"GHA",
"GIB",
"GRC",
"GRL",
"GRD",
"GUM",
"GTM",
"GGY",
"GNB",
"GIN",
"GUY",
"HTI",
"HND",
"HKG",
"HUN",
"ISL",
"IND",
"IDN",
"IRN",
"IRQ",
"IRL",
"IMN",
"ISR",
"ITA",
"JAM",
"JPN",
"JEY",
"JOR",
"KAZ",
"KEN",
"KIR",
"PRK",
"KOR",
"KSV",
"KWT",
"KGZ",
"LAO",
"LVA",
"LBN",
"LSO",
"LBR",
"LBY",
"LIE",
"LTU",
"LUX",
"MAC",
"MKD",
"MDG",
"MWI",
"MYS",
"MDV",
"MLI",
"MLT",
"MHL",
"MRT",
"MUS",
"MEX",
"FSM",
"MDA",
"MCO",
"MNG",
"MNE",
"MAR",
"MOZ",
"NAM",
"NPL",
"NLD",
"NCL",
"NZL",
"NIC",
"NGA",
"NER",
"NIU",
"MNP",
"NOR",
"OMN",
"PAK",
"PLW",
"PAN",
"PNG",
"PRY",
"PER",
"PHL",
"POL",
"PRT",
"PRI",
"QAT",
"ROU",
"RUS",
"RWA",
"KNA",
"LCA",
"MAF",
"SPM",
"VCT",
"WSM",
"SMR",
"STP",
"SAU",
"SEN",
"SRB",
"SYC",
"SLE",
"SGP",
"SXM",
"SVK",
"SVN",
"SLB",
"SOM",
"ZAF",
"SSD",
"ESP",
"LKA",
"SDN",
"SUR",
"SWZ",
"SWE",
"CHE",
"SYR",
"TWN",
"TJK",
"TZA",
"THA",
"TLS",
"TGO",
"TON",
"TTO",
"TUN",
"TUR",
"TKM",
"TUV",
"UGA",
"UKR",
"ARE",
"GBR",
"USA",
"URY",
"UZB",
"VUT",
"VEN",
"VNM",
"VGB",
"WBG",
"YEM",
"ZMB",
"ZWE"
],
"colorbar": {
"tickprefix": "$",
"title": {
"text": "GDP
Billions US$"
}
},
"marker": {
"line": {
"color": "rgb(180,180,180)",
"width": 0.5
}
},
"z": [
21.71,
13.4,
227.8,
0.75,
4.8,
131.4,
0.18,
1.24,
536.2,
10.88,
2.52,
1483,
436.1,
77.91,
8.65,
34.05,
186.6,
4.28,
75.25,
527.8,
1.67,
9.24,
5.2,
2.09,
34.08,
19.55,
16.3,
2244,
1.1,
17.43,
55.08,
13.38,
65.29,
3.04,
1.98,
16.9,
32.16,
1794,
2.25,
1.73,
15.84,
264.1,
10360,
400.1,
0.72,
32.67,
14.11,
0.18,
50.46,
33.96,
57.18,
77.15,
5.6,
21.34,
205.6,
347.2,
1.58,
0.51,
64.05,
100.5,
284.9,
25.14,
15.4,
3.87,
26.36,
49.86,
0.16,
2.32,
4.17,
276.3,
2902,
7.15,
20.68,
0.92,
16.13,
3820,
35.48,
1.85,
246.4,
2.16,
0.84,
4.6,
58.3,
2.74,
1.04,
6.77,
3.14,
8.92,
19.37,
292.7,
129.7,
16.2,
2048,
856.1,
402.7,
232.2,
245.8,
4.08,
305,
2129,
13.92,
4770,
5.77,
36.55,
225.6,
62.72,
0.16,
28,
1410,
5.99,
179.3,
7.65,
11.71,
32.82,
47.5,
2.46,
2.07,
49.34,
5.11,
48.72,
63.93,
51.68,
10.92,
11.19,
4.41,
336.9,
2.41,
12.04,
10.57,
0.18,
4.29,
12.72,
1296,
0.34,
7.74,
6.06,
11.73,
4.66,
112.6,
16.59,
13.11,
19.64,
880.4,
11.1,
201,
11.85,
594.3,
8.29,
0.01,
1.23,
511.6,
80.54,
237.5,
0.65,
44.69,
16.1,
31.3,
208.2,
284.6,
552.2,
228.2,
93.52,
212,
199,
2057,
8,
0.81,
1.35,
0.56,
0.22,
0.75,
0.83,
1.86,
0.36,
777.9,
15.88,
42.65,
1.47,
5.41,
307.9,
304.1,
99.75,
49.93,
1.16,
2.37,
341.2,
11.89,
1400,
71.57,
70.03,
5.27,
3.84,
559.1,
679,
64.7,
529.5,
9.16,
36.62,
373.8,
4.51,
4.84,
0.49,
29.63,
49.12,
813.3,
43.5,
0.04,
26.09,
134.9,
416.4,
2848,
17420,
55.6,
63.08,
0.82,
209.2,
187.8,
5.08,
6.64,
45.45,
25.61,
13.74
],
"type": "choropleth"
}
]
}
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "BPlETM4ct2XY",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}