mirror of
https://github.com/gmihaila/ml_things.git
synced 2021-10-04 01:29:04 +03:00
6973 lines
3.9 MiB
6973 lines
3.9 MiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "catboost_gpu.ipynb",
|
|
"version": "0.3.2",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"include_colab_link": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "python3",
|
|
"display_name": "Python 3"
|
|
},
|
|
"accelerator": "GPU"
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "view-in-github",
|
|
"colab_type": "text"
|
|
},
|
|
"source": [
|
|
"<a href=\"https://colab.research.google.com/github/gmihaila/machine_learning_toolbox/blob/master/catboost_gpu.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "C2uW-NPtgk1-",
|
|
"colab_type": "text"
|
|
},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Use CatBoost with GPUS:\n",
|
|
"\n",
|
|
"\n",
|
|
"https://catboost.ai/docs/features/training-on-gpu.html"
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "NzEGWoozkv12",
|
|
"colab_type": "text"
|
|
},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Short Example with Dummy data"
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "vJBx2HTLsDjY",
|
|
"colab_type": "code",
|
|
"outputId": "318cca68-cace-4681-d0ef-d4042d9ec69a",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 215
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"!pip install catboost"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Collecting catboost\n",
|
|
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/98/03/777a0e1c12571a7f3320a4fa6d5f123dba2dd7c0bca34f4f698a6396eb48/catboost-0.12.2-cp36-none-manylinux1_x86_64.whl (55.5MB)\n",
|
|
"\u001b[K 100% |████████████████████████████████| 55.5MB 828kB/s \n",
|
|
"\u001b[?25hRequirement already satisfied: enum34 in /usr/local/lib/python3.6/dist-packages (from catboost) (1.1.6)\n",
|
|
"Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from catboost) (1.11.0)\n",
|
|
"Requirement already satisfied: pandas>=0.19.1 in /usr/local/lib/python3.6/dist-packages (from catboost) (0.22.0)\n",
|
|
"Requirement already satisfied: numpy>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from catboost) (1.14.6)\n",
|
|
"Requirement already satisfied: python-dateutil>=2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19.1->catboost) (2.5.3)\n",
|
|
"Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19.1->catboost) (2018.9)\n",
|
|
"Installing collected packages: catboost\n",
|
|
"Successfully installed catboost-0.12.2\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "m3zjzVL0kvL3",
|
|
"colab_type": "code",
|
|
"colab": {}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"from catboost import CatBoostClassifier\n",
|
|
"import numpy as np\n",
|
|
"import gc\n",
|
|
"import time\n",
|
|
"\n",
|
|
"\n",
|
|
"train_data = np.random.rand(8000000,80)\n",
|
|
"\n",
|
|
"train_labels = np.random.randint(2, size=8000000)\n",
|
|
"\n",
|
|
"model = None\n",
|
|
"del model\n",
|
|
"gc.collect()\n",
|
|
"\n",
|
|
"start = time.time()\n",
|
|
"model = CatBoostClassifier(task_type = \"GPU\")\n",
|
|
"model.fit(train_data, train_labels, verbose = False)\n",
|
|
"end = time.time()"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "zvQNynKT2dSq",
|
|
"colab_type": "code",
|
|
"outputId": "e12f8ea2-5b8e-4a7a-f96d-716b86e1ced0",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"print('CPU: ',(end - start))"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"CPU: 102.83633995056152\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "q0_aZyK13QnP",
|
|
"colab_type": "code",
|
|
"outputId": "2fe8227a-dcbb-48ed-e59a-b9f53b250210",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"print('GPU: ',(end - start))"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"GPU: 396.0033543109894\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "q2sh1EC8kxsu",
|
|
"colab_type": "text"
|
|
},
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Long Example"
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "UCs778zvgiFs",
|
|
"colab_type": "code",
|
|
"outputId": "a33aeba2-ca0d-4bdb-c2d5-344feaf40508",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# INSTALLS\n",
|
|
"\n",
|
|
"from IPython.display import clear_output\n",
|
|
"\n",
|
|
"# Install pydot\n",
|
|
"print(\"Installing graphiz and pydot\")\n",
|
|
"!apt-get -qq install -y graphviz && pip install -q pydot\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"#Install non-standard packages (assuming jupyter notebook)\n",
|
|
"print(\"Installing shap\")\n",
|
|
"!pip install shap\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"print(\"Installing lime\")\n",
|
|
"!pip install lime\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"#eli5 package (https://eli5.readthedocs.io/en/latest)\n",
|
|
"print(\"Installing eli5\")\n",
|
|
"!pip install eli5\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"print(\"Installing catboost\")\n",
|
|
"!pip install catboost\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"print(\"Installing ipywidgets\")\n",
|
|
"!pip install ipywidgets\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"print(\"Downloading pima-indians-diabetes\")\n",
|
|
"!wget https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv\n",
|
|
"clear_output()\n",
|
|
"\n",
|
|
"!ls"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"catboost_info pima-indians-diabetes.data.csv sample_data\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "zX9RspKuhKDZ",
|
|
"colab_type": "code",
|
|
"outputId": "e0bab4e8-0495-4e52-df9c-8b710cebdadd",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 204
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"import time\n",
|
|
"import numpy as np\n",
|
|
"import pandas as pd\n",
|
|
"\n",
|
|
"from catboost import CatBoostClassifier, Pool, cv\n",
|
|
"\n",
|
|
"#scikit-learn package (https://pypi.org/project/scikit-learn)\n",
|
|
"from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc, roc_auc_score\n",
|
|
"from sklearn.model_selection import train_test_split #TAKES NUMPY OR DATA FRAME!!\n",
|
|
"from sklearn.metrics.scorer import make_scorer\n",
|
|
"from sklearn.ensemble import RandomForestClassifier\n",
|
|
"\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"import eli5\n",
|
|
"from eli5.sklearn import PermutationImportance\n",
|
|
"\n",
|
|
"import itertools\n",
|
|
"\n",
|
|
"\n",
|
|
"#eli5 package (https://eli5.readthedocs.io/en/latest)\n",
|
|
"import eli5\n",
|
|
"from eli5.sklearn import PermutationImportance\n",
|
|
"\n",
|
|
"#lime package (https://github.com/marcotcr/lime)\n",
|
|
"import lime\n",
|
|
"import lime.lime_tabular\n",
|
|
"\n",
|
|
"#shap package (https://github.com/slundberg/shap)\n",
|
|
"import shap\n",
|
|
"\n",
|
|
"#Split train and test set.\n",
|
|
"RANDOM_STATE = 123\n",
|
|
"\n",
|
|
"# Parse data\n",
|
|
"path_file = 'pima-indians-diabetes.data.csv'\n",
|
|
"\n",
|
|
"df = pd.read_csv(path_file, header=None)\n",
|
|
"\n",
|
|
"x_df = df.drop(df.columns[8],axis=1)\n",
|
|
"y_df = df[df.columns[8]]\n",
|
|
"\n",
|
|
"df.head()\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Parse data\n",
|
|
"# path_file = 'BayesianNetworkGenerator_breast-cancer_small.csv'\n",
|
|
"\n",
|
|
"# df = pd.read_csv(path_file, header=None)\n",
|
|
"\n",
|
|
"# x_df = df.drop(df.columns[9],axis=1)\n",
|
|
"# y_df = df[df.columns[9]]\n",
|
|
"\n",
|
|
"\n",
|
|
"# df.head()\n",
|
|
"\n",
|
|
"\n",
|
|
"# X, X_test, y, y_test = train_test_split(x_df, y_df, train_size=0.90, random_state=42)\n",
|
|
"# X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.85, random_state=RANDOM_STATE)\n",
|
|
"\n",
|
|
"\n",
|
|
"# print(\"Train: \", X_train.shape[0])\n",
|
|
"# print(\"Validation: \",X_validation.shape[0])\n",
|
|
"# print(\"Test: \",X_test.shape[0])\n",
|
|
"\n",
|
|
"\n",
|
|
"# x_tr = pd.get_dummies(X_train)\n",
|
|
"# y_tr = [1 if a == 'no-recurrence-events' else 0 for a in y_train]"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>0</th>\n",
|
|
" <th>1</th>\n",
|
|
" <th>2</th>\n",
|
|
" <th>3</th>\n",
|
|
" <th>4</th>\n",
|
|
" <th>5</th>\n",
|
|
" <th>6</th>\n",
|
|
" <th>7</th>\n",
|
|
" <th>8</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>6</td>\n",
|
|
" <td>148</td>\n",
|
|
" <td>72</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>33.6</td>\n",
|
|
" <td>0.627</td>\n",
|
|
" <td>50</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>1</td>\n",
|
|
" <td>85</td>\n",
|
|
" <td>66</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>26.6</td>\n",
|
|
" <td>0.351</td>\n",
|
|
" <td>31</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>8</td>\n",
|
|
" <td>183</td>\n",
|
|
" <td>64</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>23.3</td>\n",
|
|
" <td>0.672</td>\n",
|
|
" <td>32</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>1</td>\n",
|
|
" <td>89</td>\n",
|
|
" <td>66</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>94</td>\n",
|
|
" <td>28.1</td>\n",
|
|
" <td>0.167</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>0</td>\n",
|
|
" <td>137</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>168</td>\n",
|
|
" <td>43.1</td>\n",
|
|
" <td>2.288</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" 0 1 2 3 4 5 6 7 8\n",
|
|
"0 6 148 72 35 0 33.6 0.627 50 1\n",
|
|
"1 1 85 66 29 0 26.6 0.351 31 0\n",
|
|
"2 8 183 64 0 0 23.3 0.672 32 1\n",
|
|
"3 1 89 66 23 94 28.1 0.167 21 0\n",
|
|
"4 0 137 40 35 168 43.1 2.288 33 1"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"execution_count": 4
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "FquskZ5zhMZJ",
|
|
"colab_type": "code",
|
|
"outputId": "83462265-e74c-45c9-dad2-e87bf2b9f4c1",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"categorical_features_indices = np.where(x_df.dtypes != np.float)[0];\n",
|
|
"categorical_features_indices"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"array([0, 1, 2, 3, 4, 7])"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"execution_count": 2
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "8nJfaeqkhN3Y",
|
|
"colab_type": "code",
|
|
"outputId": "0948aa26-89d3-425a-9838-ac817b3272cf",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 107
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"X, X_test, y, y_test = train_test_split(x_df, y_df, train_size=0.85, random_state=42)\n",
|
|
"X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.85, random_state=RANDOM_STATE)\n",
|
|
"\n",
|
|
"\n",
|
|
"print(\"Train: \", X_train.shape[0])\n",
|
|
"print(\"Validation: \",X_validation.shape[0])\n",
|
|
"print(\"Test: \",X_test.shape[0])"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Train: 554\n",
|
|
"Validation: 98\n",
|
|
"Test: 116\n"
|
|
],
|
|
"name": "stdout"
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_split.py:2179: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
|
|
" FutureWarning)\n"
|
|
],
|
|
"name": "stderr"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "DRxgok-zhP7p",
|
|
"colab_type": "code",
|
|
"outputId": "c768d109-7c0a-4f2c-9d18-9f27889e3515",
|
|
"colab": {
|
|
"resources": {
|
|
"http://localhost:8080/nbextensions/google.colab/colabwidgets/controls.min.js": {
|
|
"data": "IWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfShleHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciByPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIoaSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJiJzdHJpbmciIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQoaSxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLCJhIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD0iIixuKG4ucz0xNDApfShbZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNCkscj1pLkJ1ZmZlcjtmdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dfWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiByKHQsZSxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1pOihvKGksZSksZS5CdWZmZXI9cyksbyhyLHMpLHMuZnJvbT1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCxlLG4pfSxzLmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIodCk7cmV0dXJuIHZvaWQgMCE9PWU/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbChlLG4pOmkuZmlsbChlKTppLmZpbGwoMCksaX0scy5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKHQpfSxzLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBpLlNsb3dCdWZmZXIodCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigzMDIpKSxpKG4oMzAzKSksaShuKDMwNCkpLGkobigzMDUpKSxpKG4oMzA2KSksaShuKDE4KSksaShuKDMwNykpLGkobigzMDgpKSxpKG4oMzA5KSksaShuKDMxMCkpLGkobigzMTEpKSxpKG4oMzEyKSksaShuKDMxMykpLGkobigzMTQpKSxpKG4oMzE1KSksaShuKDMxNikpfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fCJBc3NlcnRpb24gZmFpbGVkIil9ZnVuY3Rpb24gcih0LGUpe3Quc3VwZXJfPWU7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyBuLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gbyh0LGUsbil7aWYoby5pc0JOKHQpKXJldHVybiB0O3RoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLG51bGwhPT10JiYoImxlIiE9PWUmJiJiZSIhPT1lfHwobj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxufHwiYmUiKSl9dmFyIHM7Im9iamVjdCI9PXR5cGVvZiB0P3QuZXhwb3J0cz1vOmUuQk49byxvLkJOPW8sby53b3JkU2l6ZT0yNjt0cnl7cz1uKDE4MikuQnVmZmVyfWNhdGNoKHQpe31mdW5jdGlvbiBhKHQsZSxuKXtmb3IodmFyIGk9MCxyPU1hdGgubWluKHQubGVuZ3RoLG4pLG89ZTtvPHI7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyktNDg7aTw8PTQsaXw9cz49NDkmJnM8PTU0P3MtNDkrMTA6cz49MTcmJnM8PTIyP3MtMTcrMTA6MTUmc31yZXR1cm4gaX1mdW5jdGlvbiB1KHQsZSxuLGkpe2Zvcih2YXIgcj0wLG89TWF0aC5taW4odC5sZW5ndGgsbikscz1lO3M8bztzKyspe3ZhciBhPXQuY2hhckNvZGVBdChzKS00ODtyKj1pLHIrPWE+PTQ5P2EtNDkrMTA6YT49MTc/YS0xNysxMDphfXJldHVybiByfW8uaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG98fG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3Iud29yZFNpemU9PT1vLndvcmRTaXplJiZBcnJheS5pc0FycmF5KHQud29yZHMpfSxvLm1heD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKT4wP3Q6ZX0sby5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbXAoZSk8MD90OmV9LG8ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXROdW1iZXIodCxlLG4pO2lmKCJvYmplY3QiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxuKTsiaGV4Ij09PWUmJihlPTE2KSxpKGU9PT0oMHxlKSYmZT49MiYmZTw9MzYpO3ZhciByPTA7Ii0iPT09KHQ9dC50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKSlbMF0mJnIrKywxNj09PWU/dGhpcy5fcGFyc2VIZXgodCxyKTp0aGlzLl9wYXJzZUJhc2UodCxlLHIpLCItIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSwibGUiPT09biYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUsbil9LG8ucHJvdG90eXBlLl9pbml0TnVtYmVyPWZ1bmN0aW9uKHQsZSxuKXt0PDAmJih0aGlzLm5lZ2F0aXZlPTEsdD0tdCksdDw2NzEwODg2ND8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdF0sdGhpcy5sZW5ndGg9MSk6dDw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihpKHQ8OTAwNzE5OTI1NDc0MDk5MiksdGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLCJsZSI9PT1uJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxuKX0sby5wcm90b3R5cGUuX2luaXRBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaSgibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT0wO3ZhciBvLHMsYT0wO2lmKCJiZSI9PT1uKWZvcihyPXQubGVuZ3RoLTEsbz0wO3I+PTA7ci09MylzPXRbcl18dFtyLTFdPDw4fHRbci0yXTw8MTYsdGhpcy53b3Jkc1tvXXw9czw8YSY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09cz4+PjI2LWEmNjcxMDg4NjMsKGErPTI0KT49MjYmJihhLT0yNixvKyspO2Vsc2UgaWYoImxlIj09PW4pZm9yKHI9MCxvPTA7cjx0Lmxlbmd0aDtyKz0zKXM9dFtyXXx0W3IrMV08PDh8dFtyKzJdPDwxNix0aGlzLndvcmRzW29dfD1zPDxhJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1zPj4+MjYtYSY2NzEwODg2MywoYSs9MjQpPj0yNiYmKGEtPTI2LG8rKyk7cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuX3BhcnNlSGV4PWZ1bmN0aW9uKHQsZSl7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKCh0Lmxlbmd0aC1lKS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPTA7bjx0aGlzLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT0wO3ZhciBpLHIsbz0wO2ZvcihuPXQubGVuZ3RoLTYsaT0wO24+PWU7bi09NilyPWEodCxuLG4rNiksdGhpcy53b3Jkc1tpXXw9cjw8byY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PXI+Pj4yNi1vJjQxOTQzMDMsKG8rPTI0KT49MjYmJihvLT0yNixpKyspO24rNiE9PWUmJihyPWEodCxlLG4rNiksdGhpcy53b3Jkc1tpXXw9cjw8byY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PXI+Pj4yNi1vJjQxOTQzMDMpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbih0LGUsbil7dGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MTtmb3IodmFyIGk9MCxyPTE7cjw9NjcxMDg4NjM7cio9ZSlpKys7aS0tLHI9ci9lfDA7Zm9yKHZhciBvPXQubGVuZ3RoLW4scz1vJWksYT1NYXRoLm1pbihvLG8tcykrbixjPTAsaD1uO2g8YTtoKz1pKWM9dSh0LGgsaCtpLGUpLHRoaXMuaW11bG4ociksdGhpcy53b3Jkc1swXStjPDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPWM6dGhpcy5faWFkZG4oYyk7aWYoMCE9PXMpe3ZhciBsPTE7Zm9yKGM9dSh0LGgsdC5sZW5ndGgsZSksaD0wO2g8cztoKyspbCo9ZTt0aGlzLmltdWxuKGwpLHRoaXMud29yZHNbMF0rYzw2NzEwODg2ND90aGlzLndvcmRzWzBdKz1jOnRoaXMuX2lhZGRuKGMpfX0sby5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXt0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspdC53b3Jkc1tlXT10aGlzLndvcmRzW2VdO3QubGVuZ3RoPXRoaXMubGVuZ3RoLHQubmVnYXRpdmU9dGhpcy5uZWdhdGl2ZSx0LnJlZD10aGlzLnJlZH0sby5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbyhudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9LG8ucHJvdG90eXBlLl9leHBhbmQ9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Oyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN0cmlwPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aD4xJiYwPT09dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXTspdGhpcy5sZW5ndGgtLTtyZXR1cm4gdGhpcy5fbm9ybVNpZ24oKX0sby5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF0mJih0aGlzLm5lZ2F0aXZlPTApLHRoaXN9LG8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In07dmFyIGM9WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0saD1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxsPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO2Z1bmN0aW9uIGQodCxlLG4pe24ubmVnYXRpdmU9ZS5uZWdhdGl2ZV50Lm5lZ2F0aXZlO3ZhciBpPXQubGVuZ3RoK2UubGVuZ3RofDA7bi5sZW5ndGg9aSxpPWktMXwwO3ZhciByPTB8dC53b3Jkc1swXSxvPTB8ZS53b3Jkc1swXSxzPXIqbyxhPTY3MTA4ODYzJnMsdT1zLzY3MTA4ODY0fDA7bi53b3Jkc1swXT1hO2Zvcih2YXIgYz0xO2M8aTtjKyspe2Zvcih2YXIgaD11Pj4+MjYsbD02NzEwODg2MyZ1LGQ9TWF0aC5taW4oYyxlLmxlbmd0aC0xKSxmPU1hdGgubWF4KDAsYy10Lmxlbmd0aCsxKTtmPD1kO2YrKyl7dmFyIHA9Yy1mfDA7aCs9KHM9KHI9MHx0LndvcmRzW3BdKSoobz0wfGUud29yZHNbZl0pK2wpLzY3MTA4ODY0fDAsbD02NzEwODg2MyZzfW4ud29yZHNbY109MHxsLHU9MHxofXJldHVybiAwIT09dT9uLndvcmRzW2NdPTB8dTpuLmxlbmd0aC0tLG4uc3RyaXAoKX1vLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKGU9MHxlfHwxLDE2PT09KHQ9dHx8MTApfHwiaGV4Ij09PXQpe249IiI7Zm9yKHZhciByPTAsbz0wLHM9MDtzPHRoaXMubGVuZ3RoO3MrKyl7dmFyIGE9dGhpcy53b3Jkc1tzXSx1PSgxNjc3NzIxNSYoYTw8cnxvKSkudG9TdHJpbmcoMTYpO249MCE9PShvPWE+Pj4yNC1yJjE2Nzc3MjE1KXx8cyE9PXRoaXMubGVuZ3RoLTE/Y1s2LXUubGVuZ3RoXSt1K246dStuLChyKz0yKT49MjYmJihyLT0yNixzLS0pfWZvcigwIT09byYmKG49by50b1N0cmluZygxNikrbik7bi5sZW5ndGglZSE9MDspbj0iMCIrbjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJihuPSItIituKSxufWlmKHQ9PT0oMHx0KSYmdD49MiYmdDw9MzYpe3ZhciBkPWhbdF0sZj1sW3RdO249IiI7dmFyIHA9dGhpcy5jbG9uZSgpO2ZvcihwLm5lZ2F0aXZlPTA7IXAuaXNaZXJvKCk7KXt2YXIgbT1wLm1vZG4oZikudG9TdHJpbmcodCk7bj0ocD1wLmlkaXZuKGYpKS5pc1plcm8oKT9tK246Y1tkLW0ubGVuZ3RoXSttK259Zm9yKHRoaXMuaXNaZXJvKCkmJihuPSIwIituKTtuLmxlbmd0aCVlIT0wOyluPSIwIituO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG49Ii0iK24pLG59aSghMSwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpfSxvLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD90Kz02NzEwODg2NCp0aGlzLndvcmRzWzFdOjM9PT10aGlzLmxlbmd0aCYmMT09PXRoaXMud29yZHNbMl0/dCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJmkoITEsIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLDAhPT10aGlzLm5lZ2F0aXZlPy10OnR9LG8ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKDE2KX0sby5wcm90b3R5cGUudG9CdWZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaSh2b2lkIDAhPT1zKSx0aGlzLnRvQXJyYXlMaWtlKHMsdCxlKX0sby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmJ5dGVMZW5ndGgoKSxvPW58fE1hdGgubWF4KDEscik7aShyPD1vLCJieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoIiksaShvPjAsIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpLHRoaXMuc3RyaXAoKTt2YXIgcyxhLHU9ImxlIj09PWUsYz1uZXcgdChvKSxoPXRoaXMuY2xvbmUoKTtpZih1KXtmb3IoYT0wOyFoLmlzWmVybygpO2ErKylzPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSxjW2FdPXM7Zm9yKDthPG87YSsrKWNbYV09MH1lbHNle2ZvcihhPTA7YTxvLXI7YSsrKWNbYV09MDtmb3IoYT0wOyFoLmlzWmVybygpO2ErKylzPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSxjW28tYS0xXT1zfXJldHVybiBjfSxNYXRoLmNsejMyP28ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDMyLU1hdGguY2x6MzIodCl9Om8ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9dCxuPTA7cmV0dXJuIGU+PTQwOTYmJihuKz0xMyxlPj4+PTEzKSxlPj02NCYmKG4rPTcsZT4+Pj03KSxlPj04JiYobis9NCxlPj4+PTQpLGU+PTImJihuKz0yLGU+Pj49MiksbitlfSxvLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIDI2O3ZhciBlPXQsbj0wO3JldHVybiAwPT0oODE5MSZlKSYmKG4rPTEzLGU+Pj49MTMpLDA9PSgxMjcmZSkmJihuKz03LGU+Pj49NyksMD09KDE1JmUpJiYobis9NCxlPj4+PTQpLDA9PSgzJmUpJiYobis9MixlPj4+PTIpLDA9PSgxJmUpJiZuKyssbn0sby5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSxlPXRoaXMuX2NvdW50Qml0cyh0KTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK2V9LG8ucHJvdG90eXBlLnplcm9CaXRzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gMDtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbZV0pO2lmKHQrPW4sMjYhPT1uKWJyZWFrfXJldHVybiB0fSxvLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpLzgpfSxvLnByb3RvdHlwZS50b1R3b3M9ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlP3RoaXMuYWJzKCkuaW5vdG4odCkuaWFkZG4oMSk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5mcm9tVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50ZXN0bih0LTEpP3RoaXMubm90bih0KS5pYWRkbigxKS5pbmVnKCk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5pc05lZz1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZX0sby5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCl9LG8ucHJvdG90eXBlLmluZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1plcm8oKXx8KHRoaXMubmVnYXRpdmVePTEpLHRoaXN9LG8ucHJvdG90eXBlLml1b3I9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Lmxlbmd0aDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMud29yZHNbZV09dGhpcy53b3Jkc1tlXXx0LndvcmRzW2VdO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlvcj1mdW5jdGlvbih0KXtyZXR1cm4gaSgwPT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdW9yKHQpfSxvLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxvLnByb3RvdHlwZS51b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKHQpOnQuY2xvbmUoKS5pdW9yKHRoaXMpfSxvLnByb3RvdHlwZS5pdWFuZD1mdW5jdGlvbih0KXt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPXRoaXMud29yZHNbbl0mdC53b3Jkc1tuXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBpKDA9PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1YW5kKHQpfSxvLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYW5kKHQpOnQuY2xvbmUoKS5pYW5kKHRoaXMpfSxvLnByb3RvdHlwZS51YW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXVhbmQodCk6dC5jbG9uZSgpLml1YW5kKHRoaXMpfSxvLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhlPXRoaXMsbj10KTooZT10LG49dGhpcyk7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT1lLndvcmRzW2ldXm4ud29yZHNbaV07aWYodGhpcyE9PWUpZm9yKDtpPGUubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPWUud29yZHNbaV07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gaSgwPT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdXhvcih0KX0sby5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcih0KTp0LmNsb25lKCkuaXhvcih0aGlzKX0sby5wcm90b3R5cGUudXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1eG9yKHQpOnQuY2xvbmUoKS5pdXhvcih0aGlzKX0sby5wcm90b3R5cGUuaW5vdG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPTB8TWF0aC5jZWlsKHQvMjYpLG49dCUyNjt0aGlzLl9leHBhbmQoZSksbj4wJiZlLS07Zm9yKHZhciByPTA7cjxlO3IrKyl0aGlzLndvcmRzW3JdPTY3MTA4ODYzJn50aGlzLndvcmRzW3JdO3JldHVybiBuPjAmJih0aGlzLndvcmRzW3JdPX50aGlzLndvcmRzW3JdJjY3MTA4ODYzPj4yNi1uKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm5vdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih0KX0sby5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbih0LGUpe2koIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgbj10LzI2fDAscj10JTI2O3JldHVybiB0aGlzLl9leHBhbmQobisxKSx0aGlzLndvcmRzW25dPWU/dGhpcy53b3Jkc1tuXXwxPDxyOnRoaXMud29yZHNbbl0mfigxPDxyKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLGU9dGhpcy5pc3ViKHQpLHRoaXMubmVnYXRpdmVePTEsdGhpcy5fbm9ybVNpZ24oKTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIHQubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKTt0aGlzLmxlbmd0aD50Lmxlbmd0aD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgcj0wLG89MDtvPGkubGVuZ3RoO28rKyllPSgwfG4ud29yZHNbb10pKygwfGkud29yZHNbb10pK3IsdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlLHI9ZT4+PjI2O2Zvcig7MCE9PXImJm88bi5sZW5ndGg7bysrKWU9KDB8bi53b3Jkc1tvXSkrcix0aGlzLndvcmRzW29dPTY3MTA4ODYzJmUscj1lPj4+MjY7aWYodGhpcy5sZW5ndGg9bi5sZW5ndGgsMCE9PXIpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09cix0aGlzLmxlbmd0aCsrO2Vsc2UgaWYobiE9PXRoaXMpZm9yKDtvPG4ubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPW4ud29yZHNbb107cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMCE9PXQubmVnYXRpdmUmJjA9PT10aGlzLm5lZ2F0aXZlPyh0Lm5lZ2F0aXZlPTAsZT10aGlzLnN1Yih0KSx0Lm5lZ2F0aXZlXj0xLGUpOjA9PT10Lm5lZ2F0aXZlJiYwIT09dGhpcy5uZWdhdGl2ZT8odGhpcy5uZWdhdGl2ZT0wLGU9dC5zdWIodGhpcyksdGhpcy5uZWdhdGl2ZT0xLGUpOnRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxvLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKDAhPT10Lm5lZ2F0aXZlKXt0Lm5lZ2F0aXZlPTA7dmFyIGU9dGhpcy5pYWRkKHQpO3JldHVybiB0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKX1pZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZCh0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fbm9ybVNpZ24oKTt2YXIgbixpLHI9dGhpcy5jbXAodCk7aWYoMD09PXIpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmxlbmd0aD0xLHRoaXMud29yZHNbMF09MCx0aGlzO3I+MD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgbz0wLHM9MDtzPGkubGVuZ3RoO3MrKylvPShlPSgwfG4ud29yZHNbc10pLSgwfGkud29yZHNbc10pK28pPj4yNix0aGlzLndvcmRzW3NdPTY3MTA4ODYzJmU7Zm9yKDswIT09byYmczxuLmxlbmd0aDtzKyspbz0oZT0oMHxuLndvcmRzW3NdKStvKT4+MjYsdGhpcy53b3Jkc1tzXT02NzEwODg2MyZlO2lmKDA9PT1vJiZzPG4ubGVuZ3RoJiZuIT09dGhpcylmb3IoO3M8bi5sZW5ndGg7cysrKXRoaXMud29yZHNbc109bi53b3Jkc1tzXTtyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgscyksbiE9PXRoaXMmJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXN1Yih0KX07dmFyIGY9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzPXQud29yZHMsYT1lLndvcmRzLHU9bi53b3JkcyxjPTAsaD0wfHNbMF0sbD04MTkxJmgsZD1oPj4+MTMsZj0wfHNbMV0scD04MTkxJmYsbT1mPj4+MTMsZz0wfHNbMl0sdj04MTkxJmcsYj1nPj4+MTMseT0wfHNbM10sXz04MTkxJnksdz15Pj4+MTMseD0wfHNbNF0sTT04MTkxJngsUz14Pj4+MTMsRT0wfHNbNV0sQT04MTkxJkUsQz1FPj4+MTMsaz0wfHNbNl0sTz04MTkxJmssUD1rPj4+MTMsVD0wfHNbN10saj04MTkxJlQsST1UPj4+MTMsTD0wfHNbOF0sQj04MTkxJkwsRD1MPj4+MTMsUj0wfHNbOV0sej04MTkxJlIsTj1SPj4+MTMsVz0wfGFbMF0scT04MTkxJlcsSD1XPj4+MTMsRj0wfGFbMV0sVj04MTkxJkYsVT1GPj4+MTMsSz0wfGFbMl0sWT04MTkxJkssWD1LPj4+MTMsJD0wfGFbM10sRz04MTkxJiQsSj0kPj4+MTMsWj0wfGFbNF0sUT04MTkxJlosdHQ9Wj4+PjEzLGV0PTB8YVs1XSxudD04MTkxJmV0LGl0PWV0Pj4+MTMscnQ9MHxhWzZdLG90PTgxOTEmcnQsc3Q9cnQ+Pj4xMyxhdD0wfGFbN10sdXQ9ODE5MSZhdCxjdD1hdD4+PjEzLGh0PTB8YVs4XSxsdD04MTkxJmh0LGR0PWh0Pj4+MTMsZnQ9MHxhWzldLHB0PTgxOTEmZnQsbXQ9ZnQ+Pj4xMztuLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxuLmxlbmd0aD0xOTt2YXIgZ3Q9KGMrKGk9TWF0aC5pbXVsKGwscSkpfDApKygoODE5MSYocj0ocj1NYXRoLmltdWwobCxIKSkrTWF0aC5pbXVsKGQscSl8MCkpPDwxMyl8MDtjPSgobz1NYXRoLmltdWwoZCxIKSkrKHI+Pj4xMyl8MCkrKGd0Pj4+MjYpfDAsZ3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHAscSkscj0ocj1NYXRoLmltdWwocCxIKSkrTWF0aC5pbXVsKG0scSl8MCxvPU1hdGguaW11bChtLEgpO3ZhciB2dD0oYysoaT1pK01hdGguaW11bChsLFYpfDApfDApKygoODE5MSYocj0ocj1yK01hdGguaW11bChsLFUpfDApK01hdGguaW11bChkLFYpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxVKXwwKSsocj4+PjEzKXwwKSsodnQ+Pj4yNil8MCx2dCY9NjcxMDg4NjMsaT1NYXRoLmltdWwodixxKSxyPShyPU1hdGguaW11bCh2LEgpKStNYXRoLmltdWwoYixxKXwwLG89TWF0aC5pbXVsKGIsSCksaT1pK01hdGguaW11bChwLFYpfDAscj0ocj1yK01hdGguaW11bChwLFUpfDApK01hdGguaW11bChtLFYpfDAsbz1vK01hdGguaW11bChtLFUpfDA7dmFyIGJ0PShjKyhpPWkrTWF0aC5pbXVsKGwsWSl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKGwsWCl8MCkrTWF0aC5pbXVsKGQsWSl8MCkpPDwxMyl8MDtjPSgobz1vK01hdGguaW11bChkLFgpfDApKyhyPj4+MTMpfDApKyhidD4+PjI2KXwwLGJ0Jj02NzEwODg2MyxpPU1hdGguaW11bChfLHEpLHI9KHI9TWF0aC5pbXVsKF8sSCkpK01hdGguaW11bCh3LHEpfDAsbz1NYXRoLmltdWwodyxIKSxpPWkrTWF0aC5pbXVsKHYsVil8MCxyPShyPXIrTWF0aC5pbXVsKHYsVSl8MCkrTWF0aC5pbXVsKGIsVil8MCxvPW8rTWF0aC5pbXVsKGIsVSl8MCxpPWkrTWF0aC5pbXVsKHAsWSl8MCxyPShyPXIrTWF0aC5pbXVsKHAsWCl8MCkrTWF0aC5pbXVsKG0sWSl8MCxvPW8rTWF0aC5pbXVsKG0sWCl8MDt2YXIgeXQ9KGMrKGk9aStNYXRoLmltdWwobCxHKXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxKKXwwKStNYXRoLmltdWwoZCxHKXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsSil8MCkrKHI+Pj4xMyl8MCkrKHl0Pj4+MjYpfDAseXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKE0scSkscj0ocj1NYXRoLmltdWwoTSxIKSkrTWF0aC5pbXVsKFMscSl8MCxvPU1hdGguaW11bChTLEgpLGk9aStNYXRoLmltdWwoXyxWKXwwLHI9KHI9citNYXRoLmltdWwoXyxVKXwwKStNYXRoLmltdWwodyxWKXwwLG89bytNYXRoLmltdWwodyxVKXwwLGk9aStNYXRoLmltdWwodixZKXwwLHI9KHI9citNYXRoLmltdWwodixYKXwwKStNYXRoLmltdWwoYixZKXwwLG89bytNYXRoLmltdWwoYixYKXwwLGk9aStNYXRoLmltdWwocCxHKXwwLHI9KHI9citNYXRoLmltdWwocCxKKXwwKStNYXRoLmltdWwobSxHKXwwLG89bytNYXRoLmltdWwobSxKKXwwO3ZhciBfdD0oYysoaT1pK01hdGguaW11bChsLFEpfDApfDApKygoODE5MSYocj0ocj1yK01hdGguaW11bChsLHR0KXwwKStNYXRoLmltdWwoZCxRKXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsdHQpfDApKyhyPj4+MTMpfDApKyhfdD4+PjI2KXwwLF90Jj02NzEwODg2MyxpPU1hdGguaW11bChBLHEpLHI9KHI9TWF0aC5pbXVsKEEsSCkpK01hdGguaW11bChDLHEpfDAsbz1NYXRoLmltdWwoQyxIKSxpPWkrTWF0aC5pbXVsKE0sVil8MCxyPShyPXIrTWF0aC5pbXVsKE0sVSl8MCkrTWF0aC5pbXVsKFMsVil8MCxvPW8rTWF0aC5pbXVsKFMsVSl8MCxpPWkrTWF0aC5pbXVsKF8sWSl8MCxyPShyPXIrTWF0aC5pbXVsKF8sWCl8MCkrTWF0aC5pbXVsKHcsWSl8MCxvPW8rTWF0aC5pbXVsKHcsWCl8MCxpPWkrTWF0aC5pbXVsKHYsRyl8MCxyPShyPXIrTWF0aC5pbXVsKHYsSil8MCkrTWF0aC5pbXVsKGIsRyl8MCxvPW8rTWF0aC5pbXVsKGIsSil8MCxpPWkrTWF0aC5pbXVsKHAsUSl8MCxyPShyPXIrTWF0aC5pbXVsKHAsdHQpfDApK01hdGguaW11bChtLFEpfDAsbz1vK01hdGguaW11bChtLHR0KXwwO3ZhciB3dD0oYysoaT1pK01hdGguaW11bChsLG50KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxpdCl8MCkrTWF0aC5pbXVsKGQsbnQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxpdCl8MCkrKHI+Pj4xMyl8MCkrKHd0Pj4+MjYpfDAsd3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKE8scSkscj0ocj1NYXRoLmltdWwoTyxIKSkrTWF0aC5pbXVsKFAscSl8MCxvPU1hdGguaW11bChQLEgpLGk9aStNYXRoLmltdWwoQSxWKXwwLHI9KHI9citNYXRoLmltdWwoQSxVKXwwKStNYXRoLmltdWwoQyxWKXwwLG89bytNYXRoLmltdWwoQyxVKXwwLGk9aStNYXRoLmltdWwoTSxZKXwwLHI9KHI9citNYXRoLmltdWwoTSxYKXwwKStNYXRoLmltdWwoUyxZKXwwLG89bytNYXRoLmltdWwoUyxYKXwwLGk9aStNYXRoLmltdWwoXyxHKXwwLHI9KHI9citNYXRoLmltdWwoXyxKKXwwKStNYXRoLmltdWwodyxHKXwwLG89bytNYXRoLmltdWwodyxKKXwwLGk9aStNYXRoLmltdWwodixRKXwwLHI9KHI9citNYXRoLmltdWwodix0dCl8MCkrTWF0aC5pbXVsKGIsUSl8MCxvPW8rTWF0aC5pbXVsKGIsdHQpfDAsaT1pK01hdGguaW11bChwLG50KXwwLHI9KHI9citNYXRoLmltdWwocCxpdCl8MCkrTWF0aC5pbXVsKG0sbnQpfDAsbz1vK01hdGguaW11bChtLGl0KXwwO3ZhciB4dD0oYysoaT1pK01hdGguaW11bChsLG90KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxzdCl8MCkrTWF0aC5pbXVsKGQsb3QpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxzdCl8MCkrKHI+Pj4xMyl8MCkrKHh0Pj4+MjYpfDAseHQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKGoscSkscj0ocj1NYXRoLmltdWwoaixIKSkrTWF0aC5pbXVsKEkscSl8MCxvPU1hdGguaW11bChJLEgpLGk9aStNYXRoLmltdWwoTyxWKXwwLHI9KHI9citNYXRoLmltdWwoTyxVKXwwKStNYXRoLmltdWwoUCxWKXwwLG89bytNYXRoLmltdWwoUCxVKXwwLGk9aStNYXRoLmltdWwoQSxZKXwwLHI9KHI9citNYXRoLmltdWwoQSxYKXwwKStNYXRoLmltdWwoQyxZKXwwLG89bytNYXRoLmltdWwoQyxYKXwwLGk9aStNYXRoLmltdWwoTSxHKXwwLHI9KHI9citNYXRoLmltdWwoTSxKKXwwKStNYXRoLmltdWwoUyxHKXwwLG89bytNYXRoLmltdWwoUyxKKXwwLGk9aStNYXRoLmltdWwoXyxRKXwwLHI9KHI9citNYXRoLmltdWwoXyx0dCl8MCkrTWF0aC5pbXVsKHcsUSl8MCxvPW8rTWF0aC5pbXVsKHcsdHQpfDAsaT1pK01hdGguaW11bCh2LG50KXwwLHI9KHI9citNYXRoLmltdWwodixpdCl8MCkrTWF0aC5pbXVsKGIsbnQpfDAsbz1vK01hdGguaW11bChiLGl0KXwwLGk9aStNYXRoLmltdWwocCxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKHAsc3QpfDApK01hdGguaW11bChtLG90KXwwLG89bytNYXRoLmltdWwobSxzdCl8MDt2YXIgTXQ9KGMrKGk9aStNYXRoLmltdWwobCx1dCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKGwsY3QpfDApK01hdGguaW11bChkLHV0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsY3QpfDApKyhyPj4+MTMpfDApKyhNdD4+PjI2KXwwLE10Jj02NzEwODg2MyxpPU1hdGguaW11bChCLHEpLHI9KHI9TWF0aC5pbXVsKEIsSCkpK01hdGguaW11bChELHEpfDAsbz1NYXRoLmltdWwoRCxIKSxpPWkrTWF0aC5pbXVsKGosVil8MCxyPShyPXIrTWF0aC5pbXVsKGosVSl8MCkrTWF0aC5pbXVsKEksVil8MCxvPW8rTWF0aC5pbXVsKEksVSl8MCxpPWkrTWF0aC5pbXVsKE8sWSl8MCxyPShyPXIrTWF0aC5pbXVsKE8sWCl8MCkrTWF0aC5pbXVsKFAsWSl8MCxvPW8rTWF0aC5pbXVsKFAsWCl8MCxpPWkrTWF0aC5pbXVsKEEsRyl8MCxyPShyPXIrTWF0aC5pbXVsKEEsSil8MCkrTWF0aC5pbXVsKEMsRyl8MCxvPW8rTWF0aC5pbXVsKEMsSil8MCxpPWkrTWF0aC5pbXVsKE0sUSl8MCxyPShyPXIrTWF0aC5pbXVsKE0sdHQpfDApK01hdGguaW11bChTLFEpfDAsbz1vK01hdGguaW11bChTLHR0KXwwLGk9aStNYXRoLmltdWwoXyxudCl8MCxyPShyPXIrTWF0aC5pbXVsKF8saXQpfDApK01hdGguaW11bCh3LG50KXwwLG89bytNYXRoLmltdWwodyxpdCl8MCxpPWkrTWF0aC5pbXVsKHYsb3QpfDAscj0ocj1yK01hdGguaW11bCh2LHN0KXwwKStNYXRoLmltdWwoYixvdCl8MCxvPW8rTWF0aC5pbXVsKGIsc3QpfDAsaT1pK01hdGguaW11bChwLHV0KXwwLHI9KHI9citNYXRoLmltdWwocCxjdCl8MCkrTWF0aC5pbXVsKG0sdXQpfDAsbz1vK01hdGguaW11bChtLGN0KXwwO3ZhciBTdD0oYysoaT1pK01hdGguaW11bChsLGx0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxkdCl8MCkrTWF0aC5pbXVsKGQsbHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxkdCl8MCkrKHI+Pj4xMyl8MCkrKFN0Pj4+MjYpfDAsU3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHoscSkscj0ocj1NYXRoLmltdWwoeixIKSkrTWF0aC5pbXVsKE4scSl8MCxvPU1hdGguaW11bChOLEgpLGk9aStNYXRoLmltdWwoQixWKXwwLHI9KHI9citNYXRoLmltdWwoQixVKXwwKStNYXRoLmltdWwoRCxWKXwwLG89bytNYXRoLmltdWwoRCxVKXwwLGk9aStNYXRoLmltdWwoaixZKXwwLHI9KHI9citNYXRoLmltdWwoaixYKXwwKStNYXRoLmltdWwoSSxZKXwwLG89bytNYXRoLmltdWwoSSxYKXwwLGk9aStNYXRoLmltdWwoTyxHKXwwLHI9KHI9citNYXRoLmltdWwoTyxKKXwwKStNYXRoLmltdWwoUCxHKXwwLG89bytNYXRoLmltdWwoUCxKKXwwLGk9aStNYXRoLmltdWwoQSxRKXwwLHI9KHI9citNYXRoLmltdWwoQSx0dCl8MCkrTWF0aC5pbXVsKEMsUSl8MCxvPW8rTWF0aC5pbXVsKEMsdHQpfDAsaT1pK01hdGguaW11bChNLG50KXwwLHI9KHI9citNYXRoLmltdWwoTSxpdCl8MCkrTWF0aC5pbXVsKFMsbnQpfDAsbz1vK01hdGguaW11bChTLGl0KXwwLGk9aStNYXRoLmltdWwoXyxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKF8sc3QpfDApK01hdGguaW11bCh3LG90KXwwLG89bytNYXRoLmltdWwodyxzdCl8MCxpPWkrTWF0aC5pbXVsKHYsdXQpfDAscj0ocj1yK01hdGguaW11bCh2LGN0KXwwKStNYXRoLmltdWwoYix1dCl8MCxvPW8rTWF0aC5pbXVsKGIsY3QpfDAsaT1pK01hdGguaW11bChwLGx0KXwwLHI9KHI9citNYXRoLmltdWwocCxkdCl8MCkrTWF0aC5pbXVsKG0sbHQpfDAsbz1vK01hdGguaW11bChtLGR0KXwwO3ZhciBFdD0oYysoaT1pK01hdGguaW11bChsLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxtdCl8MCkrTWF0aC5pbXVsKGQscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxtdCl8MCkrKHI+Pj4xMyl8MCkrKEV0Pj4+MjYpfDAsRXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosVikscj0ocj1NYXRoLmltdWwoeixVKSkrTWF0aC5pbXVsKE4sVil8MCxvPU1hdGguaW11bChOLFUpLGk9aStNYXRoLmltdWwoQixZKXwwLHI9KHI9citNYXRoLmltdWwoQixYKXwwKStNYXRoLmltdWwoRCxZKXwwLG89bytNYXRoLmltdWwoRCxYKXwwLGk9aStNYXRoLmltdWwoaixHKXwwLHI9KHI9citNYXRoLmltdWwoaixKKXwwKStNYXRoLmltdWwoSSxHKXwwLG89bytNYXRoLmltdWwoSSxKKXwwLGk9aStNYXRoLmltdWwoTyxRKXwwLHI9KHI9citNYXRoLmltdWwoTyx0dCl8MCkrTWF0aC5pbXVsKFAsUSl8MCxvPW8rTWF0aC5pbXVsKFAsdHQpfDAsaT1pK01hdGguaW11bChBLG50KXwwLHI9KHI9citNYXRoLmltdWwoQSxpdCl8MCkrTWF0aC5pbXVsKEMsbnQpfDAsbz1vK01hdGguaW11bChDLGl0KXwwLGk9aStNYXRoLmltdWwoTSxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKE0sc3QpfDApK01hdGguaW11bChTLG90KXwwLG89bytNYXRoLmltdWwoUyxzdCl8MCxpPWkrTWF0aC5pbXVsKF8sdXQpfDAscj0ocj1yK01hdGguaW11bChfLGN0KXwwKStNYXRoLmltdWwodyx1dCl8MCxvPW8rTWF0aC5pbXVsKHcsY3QpfDAsaT1pK01hdGguaW11bCh2LGx0KXwwLHI9KHI9citNYXRoLmltdWwodixkdCl8MCkrTWF0aC5pbXVsKGIsbHQpfDAsbz1vK01hdGguaW11bChiLGR0KXwwO3ZhciBBdD0oYysoaT1pK01hdGguaW11bChwLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwocCxtdCl8MCkrTWF0aC5pbXVsKG0scHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwobSxtdCl8MCkrKHI+Pj4xMyl8MCkrKEF0Pj4+MjYpfDAsQXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosWSkscj0ocj1NYXRoLmltdWwoeixYKSkrTWF0aC5pbXVsKE4sWSl8MCxvPU1hdGguaW11bChOLFgpLGk9aStNYXRoLmltdWwoQixHKXwwLHI9KHI9citNYXRoLmltdWwoQixKKXwwKStNYXRoLmltdWwoRCxHKXwwLG89bytNYXRoLmltdWwoRCxKKXwwLGk9aStNYXRoLmltdWwoaixRKXwwLHI9KHI9citNYXRoLmltdWwoaix0dCl8MCkrTWF0aC5pbXVsKEksUSl8MCxvPW8rTWF0aC5pbXVsKEksdHQpfDAsaT1pK01hdGguaW11bChPLG50KXwwLHI9KHI9citNYXRoLmltdWwoTyxpdCl8MCkrTWF0aC5pbXVsKFAsbnQpfDAsbz1vK01hdGguaW11bChQLGl0KXwwLGk9aStNYXRoLmltdWwoQSxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKEEsc3QpfDApK01hdGguaW11bChDLG90KXwwLG89bytNYXRoLmltdWwoQyxzdCl8MCxpPWkrTWF0aC5pbXVsKE0sdXQpfDAscj0ocj1yK01hdGguaW11bChNLGN0KXwwKStNYXRoLmltdWwoUyx1dCl8MCxvPW8rTWF0aC5pbXVsKFMsY3QpfDAsaT1pK01hdGguaW11bChfLGx0KXwwLHI9KHI9citNYXRoLmltdWwoXyxkdCl8MCkrTWF0aC5pbXVsKHcsbHQpfDAsbz1vK01hdGguaW11bCh3LGR0KXwwO3ZhciBDdD0oYysoaT1pK01hdGguaW11bCh2LHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwodixtdCl8MCkrTWF0aC5pbXVsKGIscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoYixtdCl8MCkrKHI+Pj4xMyl8MCkrKEN0Pj4+MjYpfDAsQ3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosRykscj0ocj1NYXRoLmltdWwoeixKKSkrTWF0aC5pbXVsKE4sRyl8MCxvPU1hdGguaW11bChOLEopLGk9aStNYXRoLmltdWwoQixRKXwwLHI9KHI9citNYXRoLmltdWwoQix0dCl8MCkrTWF0aC5pbXVsKEQsUSl8MCxvPW8rTWF0aC5pbXVsKEQsdHQpfDAsaT1pK01hdGguaW11bChqLG50KXwwLHI9KHI9citNYXRoLmltdWwoaixpdCl8MCkrTWF0aC5pbXVsKEksbnQpfDAsbz1vK01hdGguaW11bChJLGl0KXwwLGk9aStNYXRoLmltdWwoTyxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKE8sc3QpfDApK01hdGguaW11bChQLG90KXwwLG89bytNYXRoLmltdWwoUCxzdCl8MCxpPWkrTWF0aC5pbXVsKEEsdXQpfDAscj0ocj1yK01hdGguaW11bChBLGN0KXwwKStNYXRoLmltdWwoQyx1dCl8MCxvPW8rTWF0aC5pbXVsKEMsY3QpfDAsaT1pK01hdGguaW11bChNLGx0KXwwLHI9KHI9citNYXRoLmltdWwoTSxkdCl8MCkrTWF0aC5pbXVsKFMsbHQpfDAsbz1vK01hdGguaW11bChTLGR0KXwwO3ZhciBrdD0oYysoaT1pK01hdGguaW11bChfLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoXyxtdCl8MCkrTWF0aC5pbXVsKHcscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwodyxtdCl8MCkrKHI+Pj4xMyl8MCkrKGt0Pj4+MjYpfDAsa3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosUSkscj0ocj1NYXRoLmltdWwoeix0dCkpK01hdGguaW11bChOLFEpfDAsbz1NYXRoLmltdWwoTix0dCksaT1pK01hdGguaW11bChCLG50KXwwLHI9KHI9citNYXRoLmltdWwoQixpdCl8MCkrTWF0aC5pbXVsKEQsbnQpfDAsbz1vK01hdGguaW11bChELGl0KXwwLGk9aStNYXRoLmltdWwoaixvdCl8MCxyPShyPXIrTWF0aC5pbXVsKGosc3QpfDApK01hdGguaW11bChJLG90KXwwLG89bytNYXRoLmltdWwoSSxzdCl8MCxpPWkrTWF0aC5pbXVsKE8sdXQpfDAscj0ocj1yK01hdGguaW11bChPLGN0KXwwKStNYXRoLmltdWwoUCx1dCl8MCxvPW8rTWF0aC5pbXVsKFAsY3QpfDAsaT1pK01hdGguaW11bChBLGx0KXwwLHI9KHI9citNYXRoLmltdWwoQSxkdCl8MCkrTWF0aC5pbXVsKEMsbHQpfDAsbz1vK01hdGguaW11bChDLGR0KXwwO3ZhciBPdD0oYysoaT1pK01hdGguaW11bChNLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoTSxtdCl8MCkrTWF0aC5pbXVsKFMscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoUyxtdCl8MCkrKHI+Pj4xMyl8MCkrKE90Pj4+MjYpfDAsT3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosbnQpLHI9KHI9TWF0aC5pbXVsKHosaXQpKStNYXRoLmltdWwoTixudCl8MCxvPU1hdGguaW11bChOLGl0KSxpPWkrTWF0aC5pbXVsKEIsb3QpfDAscj0ocj1yK01hdGguaW11bChCLHN0KXwwKStNYXRoLmltdWwoRCxvdCl8MCxvPW8rTWF0aC5pbXVsKEQsc3QpfDAsaT1pK01hdGguaW11bChqLHV0KXwwLHI9KHI9citNYXRoLmltdWwoaixjdCl8MCkrTWF0aC5pbXVsKEksdXQpfDAsbz1vK01hdGguaW11bChJLGN0KXwwLGk9aStNYXRoLmltdWwoTyxsdCl8MCxyPShyPXIrTWF0aC5pbXVsKE8sZHQpfDApK01hdGguaW11bChQLGx0KXwwLG89bytNYXRoLmltdWwoUCxkdCl8MDt2YXIgUHQ9KGMrKGk9aStNYXRoLmltdWwoQSxwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKEEsbXQpfDApK01hdGguaW11bChDLHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKEMsbXQpfDApKyhyPj4+MTMpfDApKyhQdD4+PjI2KXwwLFB0Jj02NzEwODg2MyxpPU1hdGguaW11bCh6LG90KSxyPShyPU1hdGguaW11bCh6LHN0KSkrTWF0aC5pbXVsKE4sb3QpfDAsbz1NYXRoLmltdWwoTixzdCksaT1pK01hdGguaW11bChCLHV0KXwwLHI9KHI9citNYXRoLmltdWwoQixjdCl8MCkrTWF0aC5pbXVsKEQsdXQpfDAsbz1vK01hdGguaW11bChELGN0KXwwLGk9aStNYXRoLmltdWwoaixsdCl8MCxyPShyPXIrTWF0aC5pbXVsKGosZHQpfDApK01hdGguaW11bChJLGx0KXwwLG89bytNYXRoLmltdWwoSSxkdCl8MDt2YXIgVHQ9KGMrKGk9aStNYXRoLmltdWwoTyxwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKE8sbXQpfDApK01hdGguaW11bChQLHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKFAsbXQpfDApKyhyPj4+MTMpfDApKyhUdD4+PjI2KXwwLFR0Jj02NzEwODg2MyxpPU1hdGguaW11bCh6LHV0KSxyPShyPU1hdGguaW11bCh6LGN0KSkrTWF0aC5pbXVsKE4sdXQpfDAsbz1NYXRoLmltdWwoTixjdCksaT1pK01hdGguaW11bChCLGx0KXwwLHI9KHI9citNYXRoLmltdWwoQixkdCl8MCkrTWF0aC5pbXVsKEQsbHQpfDAsbz1vK01hdGguaW11bChELGR0KXwwO3ZhciBqdD0oYysoaT1pK01hdGguaW11bChqLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoaixtdCl8MCkrTWF0aC5pbXVsKEkscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoSSxtdCl8MCkrKHI+Pj4xMyl8MCkrKGp0Pj4+MjYpfDAsanQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosbHQpLHI9KHI9TWF0aC5pbXVsKHosZHQpKStNYXRoLmltdWwoTixsdCl8MCxvPU1hdGguaW11bChOLGR0KTt2YXIgSXQ9KGMrKGk9aStNYXRoLmltdWwoQixwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKEIsbXQpfDApK01hdGguaW11bChELHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKEQsbXQpfDApKyhyPj4+MTMpfDApKyhJdD4+PjI2KXwwLEl0Jj02NzEwODg2Mzt2YXIgTHQ9KGMrKGk9TWF0aC5pbXVsKHoscHQpKXwwKSsoKDgxOTEmKHI9KHI9TWF0aC5pbXVsKHosbXQpKStNYXRoLmltdWwoTixwdCl8MCkpPDwxMyl8MDtyZXR1cm4gYz0oKG89TWF0aC5pbXVsKE4sbXQpKSsocj4+PjEzKXwwKSsoTHQ+Pj4yNil8MCxMdCY9NjcxMDg4NjMsdVswXT1ndCx1WzFdPXZ0LHVbMl09YnQsdVszXT15dCx1WzRdPV90LHVbNV09d3QsdVs2XT14dCx1WzddPU10LHVbOF09U3QsdVs5XT1FdCx1WzEwXT1BdCx1WzExXT1DdCx1WzEyXT1rdCx1WzEzXT1PdCx1WzE0XT1QdCx1WzE1XT1UdCx1WzE2XT1qdCx1WzE3XT1JdCx1WzE4XT1MdCwwIT09YyYmKHVbMTldPWMsbi5sZW5ndGgrKyksbn07ZnVuY3Rpb24gcCh0LGUsbil7cmV0dXJuKG5ldyBtKS5tdWxwKHQsZSxuKX1mdW5jdGlvbiBtKHQsZSl7dGhpcy54PXQsdGhpcy55PWV9TWF0aC5pbXVsfHwoZj1kKSxvLnByb3RvdHlwZS5tdWxUbz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubGVuZ3RoK3QubGVuZ3RoO3JldHVybiAxMD09PXRoaXMubGVuZ3RoJiYxMD09PXQubGVuZ3RoP2YodGhpcyx0LGUpOm48NjM/ZCh0aGlzLHQsZSk6bjwxMDI0P2Z1bmN0aW9uKHQsZSxuKXtuLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZSxuLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aDtmb3IodmFyIGk9MCxyPTAsbz0wO288bi5sZW5ndGgtMTtvKyspe3ZhciBzPXI7cj0wO2Zvcih2YXIgYT02NzEwODg2MyZpLHU9TWF0aC5taW4obyxlLmxlbmd0aC0xKSxjPU1hdGgubWF4KDAsby10Lmxlbmd0aCsxKTtjPD11O2MrKyl7dmFyIGg9by1jLGw9KDB8dC53b3Jkc1toXSkqKDB8ZS53b3Jkc1tjXSksZD02NzEwODg2MyZsO2E9NjcxMDg4NjMmKGQ9ZCthfDApLHIrPShzPShzPXMrKGwvNjcxMDg4NjR8MCl8MCkrKGQ+Pj4yNil8MCk+Pj4yNixzJj02NzEwODg2M31uLndvcmRzW29dPWEsaT1zLHM9cn1yZXR1cm4gMCE9PWk/bi53b3Jkc1tvXT1pOm4ubGVuZ3RoLS0sbi5zdHJpcCgpfSh0aGlzLHQsZSk6cCh0aGlzLHQsZSl9LG0ucHJvdG90eXBlLm1ha2VSQlQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxuPW8ucHJvdG90eXBlLl9jb3VudEJpdHModCktMSxpPTA7aTx0O2krKyllW2ldPXRoaXMucmV2QmluKGksbix0KTtyZXR1cm4gZX0sbS5wcm90b3R5cGUucmV2QmluPWZ1bmN0aW9uKHQsZSxuKXtpZigwPT09dHx8dD09PW4tMSlyZXR1cm4gdDtmb3IodmFyIGk9MCxyPTA7cjxlO3IrKylpfD0oMSZ0KTw8ZS1yLTEsdD4+PTE7cmV0dXJuIGl9LG0ucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLG4saSxyLG8pe2Zvcih2YXIgcz0wO3M8bztzKyspaVtzXT1lW3Rbc11dLHJbc109blt0W3NdXX0sbS5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLnBlcm11dGUobyx0LGUsbixpLHIpO2Zvcih2YXIgcz0xO3M8cjtzPDw9MSlmb3IodmFyIGE9czw8MSx1PU1hdGguY29zKDIqTWF0aC5QSS9hKSxjPU1hdGguc2luKDIqTWF0aC5QSS9hKSxoPTA7aDxyO2grPWEpZm9yKHZhciBsPXUsZD1jLGY9MDtmPHM7ZisrKXt2YXIgcD1uW2grZl0sbT1pW2grZl0sZz1uW2grZitzXSx2PWlbaCtmK3NdLGI9bCpnLWQqdjt2PWwqditkKmcsZz1iLG5baCtmXT1wK2csaVtoK2ZdPW0rdixuW2grZitzXT1wLWcsaVtoK2Yrc109bS12LGYhPT1hJiYoYj11KmwtYypkLGQ9dSpkK2MqbCxsPWIpfX0sbS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2I9ZnVuY3Rpb24odCxlKXt2YXIgbj0xfE1hdGgubWF4KGUsdCksaT0xJm4scj0wO2ZvcihuPW4vMnwwO247bj4+Pj0xKXIrKztyZXR1cm4gMTw8cisxK2l9LG0ucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbih0LGUsbil7aWYoIShuPD0xKSlmb3IodmFyIGk9MDtpPG4vMjtpKyspe3ZhciByPXRbaV07dFtpXT10W24taS0xXSx0W24taS0xXT1yLHI9ZVtpXSxlW2ldPS1lW24taS0xXSxlW24taS0xXT0tcn19LG0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9MDtpPGUvMjtpKyspe3ZhciByPTgxOTIqTWF0aC5yb3VuZCh0WzIqaSsxXS9lKStNYXRoLnJvdW5kKHRbMippXS9lKStuO3RbaV09NjcxMDg4NjMmcixuPXI8NjcxMDg4NjQ/MDpyLzY3MTA4ODY0fDB9cmV0dXJuIHR9LG0ucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBvPTAscz0wO3M8ZTtzKyspbys9MHx0W3NdLG5bMipzXT04MTkxJm8sbz4+Pj0xMyxuWzIqcysxXT04MTkxJm8sbz4+Pj0xMztmb3Iocz0yKmU7czxyOysrcyluW3NdPTA7aSgwPT09byksaSgwPT0oLTgxOTImbykpfSxtLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT0wO3JldHVybiBlfSxtLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0yKnRoaXMuZ3Vlc3NMZW4xM2IodC5sZW5ndGgsZS5sZW5ndGgpLHI9dGhpcy5tYWtlUkJUKGkpLG89dGhpcy5zdHViKGkpLHM9bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGM9bmV3IEFycmF5KGkpLGg9bmV3IEFycmF5KGkpLGw9bmV3IEFycmF5KGkpLGQ9bi53b3JkcztkLmxlbmd0aD1pLHRoaXMuY29udmVydDEzYih0LndvcmRzLHQubGVuZ3RoLHMsaSksdGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsYyxpKSx0aGlzLnRyYW5zZm9ybShzLG8sYSx1LGksciksdGhpcy50cmFuc2Zvcm0oYyxvLGgsbCxpLHIpO2Zvcih2YXIgZj0wO2Y8aTtmKyspe3ZhciBwPWFbZl0qaFtmXS11W2ZdKmxbZl07dVtmXT1hW2ZdKmxbZl0rdVtmXSpoW2ZdLGFbZl09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUoYSx1LGkpLHRoaXMudHJhbnNmb3JtKGEsdSxkLG8saSxyKSx0aGlzLmNvbmp1Z2F0ZShkLG8saSksdGhpcy5ub3JtYWxpemUxM2IoZCxpKSxuLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxuLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxuLnN0cmlwKCl9LG8ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sby5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHAodGhpcyx0LGUpfSxvLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sby5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCk7Zm9yKHZhciBlPTAsbj0wO248dGhpcy5sZW5ndGg7bisrKXt2YXIgcj0oMHx0aGlzLndvcmRzW25dKSp0LG89KDY3MTA4ODYzJnIpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9ci82NzEwODg2NHwwLGUrPW8+Pj4yNix0aGlzLndvcmRzW25dPTY3MTA4ODYzJm99cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tuXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LG8ucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0sby5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxvLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpfSxvLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LmJpdExlbmd0aCgpKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPW4vMjZ8MCxyPW4lMjY7ZVtuXT0odC53b3Jkc1tpXSYxPDxyKT4+PnJ9cmV0dXJuIGV9KHQpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbmV3IG8oMSk7Zm9yKHZhciBuPXRoaXMsaT0wO2k8ZS5sZW5ndGgmJjA9PT1lW2ldO2krKyxuPW4uc3FyKCkpO2lmKCsraTxlLmxlbmd0aClmb3IodmFyIHI9bi5zcXIoKTtpPGUubGVuZ3RoO2krKyxyPXIuc3FyKCkpMCE9PWVbaV0mJihuPW4ubXVsKHIpKTtyZXR1cm4gbn0sby5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uKHQpe2koIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZSxuPXQlMjYscj0odC1uKS8yNixvPTY3MTA4ODYzPj4+MjYtbjw8MjYtbjtpZigwIT09bil7dmFyIHM9MDtmb3IoZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgYT10aGlzLndvcmRzW2VdJm8sdT0oMHx0aGlzLndvcmRzW2VdKS1hPDxuO3RoaXMud29yZHNbZV09dXxzLHM9YT4+PjI2LW59cyYmKHRoaXMud29yZHNbZV09cyx0aGlzLmxlbmd0aCsrKX1pZigwIT09cil7Zm9yKGU9dGhpcy5sZW5ndGgtMTtlPj0wO2UtLSl0aGlzLndvcmRzW2Urcl09dGhpcy53b3Jkc1tlXTtmb3IoZT0wO2U8cjtlKyspdGhpcy53b3Jkc1tlXT0wO3RoaXMubGVuZ3RoKz1yfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlzaGxuPWZ1bmN0aW9uKHQpe3JldHVybiBpKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hsbih0KX0sby5wcm90b3R5cGUuaXVzaHJuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCkscj1lPyhlLWUlMjYpLzI2OjA7dmFyIG89dCUyNixzPU1hdGgubWluKCh0LW8pLzI2LHRoaXMubGVuZ3RoKSxhPTY3MTA4ODYzXjY3MTA4ODYzPj4+bzw8byx1PW47aWYoci09cyxyPU1hdGgubWF4KDAsciksdSl7Zm9yKHZhciBjPTA7YzxzO2MrKyl1LndvcmRzW2NdPXRoaXMud29yZHNbY107dS5sZW5ndGg9c31pZigwPT09cyk7ZWxzZSBpZih0aGlzLmxlbmd0aD5zKWZvcih0aGlzLmxlbmd0aC09cyxjPTA7Yzx0aGlzLmxlbmd0aDtjKyspdGhpcy53b3Jkc1tjXT10aGlzLndvcmRzW2Mrc107ZWxzZSB0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MTt2YXIgaD0wO2ZvcihjPXRoaXMubGVuZ3RoLTE7Yz49MCYmKDAhPT1ofHxjPj1yKTtjLS0pe3ZhciBsPTB8dGhpcy53b3Jkc1tjXTt0aGlzLndvcmRzW2NdPWg8PDI2LW98bD4+Pm8saD1sJmF9cmV0dXJuIHUmJjAhPT1oJiYodS53b3Jkc1t1Lmxlbmd0aCsrXT1oKSwwPT09dGhpcy5sZW5ndGgmJih0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pc2hybj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkoMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaHJuKHQsZSxuKX0sby5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKHQpfSxvLnByb3RvdHlwZS51c2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbih0KX0sby5wcm90b3R5cGUuc2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKHQpfSxvLnByb3RvdHlwZS51c2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybih0KX0sby5wcm90b3R5cGUudGVzdG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYsbj0odC1lKS8yNixyPTE8PGU7cmV0dXJuISh0aGlzLmxlbmd0aDw9bikmJiEhKHRoaXMud29yZHNbbl0mcil9LG8ucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbih0KXtpKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2O2lmKGkoMD09PXRoaXMubmVnYXRpdmUsImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycyIpLHRoaXMubGVuZ3RoPD1uKXJldHVybiB0aGlzO2lmKDAhPT1lJiZuKyssdGhpcy5sZW5ndGg9TWF0aC5taW4obix0aGlzLmxlbmd0aCksMCE9PWUpe3ZhciByPTY3MTA4ODYzXjY3MTA4ODYzPj4+ZTw8ZTt0aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdJj1yfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm1hc2tuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKHQpfSxvLnByb3RvdHlwZS5pYWRkbj1mdW5jdGlvbih0KXtyZXR1cm4gaSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCksdDwwP3RoaXMuaXN1Ym4oLXQpOjAhPT10aGlzLm5lZ2F0aXZlPzE9PT10aGlzLmxlbmd0aCYmKDB8dGhpcy53b3Jkc1swXSk8dD8odGhpcy53b3Jkc1swXT10LSgwfHRoaXMud29yZHNbMF0pLHRoaXMubmVnYXRpdmU9MCx0aGlzKToodGhpcy5uZWdhdGl2ZT0wLHRoaXMuaXN1Ym4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXMpOnRoaXMuX2lhZGRuKHQpfSxvLnByb3RvdHlwZS5faWFkZG49ZnVuY3Rpb24odCl7dGhpcy53b3Jkc1swXSs9dDtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2VdPj02NzEwODg2NDtlKyspdGhpcy53b3Jkc1tlXS09NjcxMDg4NjQsZT09PXRoaXMubGVuZ3RoLTE/dGhpcy53b3Jkc1tlKzFdPTE6dGhpcy53b3Jkc1tlKzFdKys7cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLGUrMSksdGhpc30sby5wcm90b3R5cGUuaXN1Ym49ZnVuY3Rpb24odCl7aWYoaSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXM7aWYodGhpcy53b3Jkc1swXS09dCwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV08MDtlKyspdGhpcy53b3Jkc1tlXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tlKzFdLT0xO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbih0KX0sby5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHQpfSxvLnByb3RvdHlwZS5pYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKX0sby5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLHM9dC5sZW5ndGgrbjt0aGlzLl9leHBhbmQocyk7dmFyIGE9MDtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtvPSgwfHRoaXMud29yZHNbcituXSkrYTt2YXIgdT0oMHx0LndvcmRzW3JdKSplO2E9KChvLT02NzEwODg2MyZ1KT4+MjYpLSh1LzY3MTA4ODY0fDApLHRoaXMud29yZHNbcituXT02NzEwODg2MyZvfWZvcig7cjx0aGlzLmxlbmd0aC1uO3IrKylhPShvPSgwfHRoaXMud29yZHNbcituXSkrYSk+PjI2LHRoaXMud29yZHNbcituXT02NzEwODg2MyZvO2lmKDA9PT1hKXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKGkoLTE9PT1hKSxhPTAscj0wO3I8dGhpcy5sZW5ndGg7cisrKWE9KG89LSgwfHRoaXMud29yZHNbcl0pK2EpPj4yNix0aGlzLndvcmRzW3JdPTY3MTA4ODYzJm87cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uKHQsZSl7dmFyIG49KHRoaXMubGVuZ3RoLHQubGVuZ3RoKSxpPXRoaXMuY2xvbmUoKSxyPXQscz0wfHIud29yZHNbci5sZW5ndGgtMV07MCE9PShuPTI2LXRoaXMuX2NvdW50Qml0cyhzKSkmJihyPXIudXNobG4obiksaS5pdXNobG4obikscz0wfHIud29yZHNbci5sZW5ndGgtMV0pO3ZhciBhLHU9aS5sZW5ndGgtci5sZW5ndGg7aWYoIm1vZCIhPT1lKXsoYT1uZXcgbyhudWxsKSkubGVuZ3RoPXUrMSxhLndvcmRzPW5ldyBBcnJheShhLmxlbmd0aCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYS53b3Jkc1tjXT0wfXZhciBoPWkuY2xvbmUoKS5faXNobG5zdWJtdWwociwxLHUpOzA9PT1oLm5lZ2F0aXZlJiYoaT1oLGEmJihhLndvcmRzW3VdPTEpKTtmb3IodmFyIGw9dS0xO2w+PTA7bC0tKXt2YXIgZD02NzEwODg2NCooMHxpLndvcmRzW3IubGVuZ3RoK2xdKSsoMHxpLndvcmRzW3IubGVuZ3RoK2wtMV0pO2ZvcihkPU1hdGgubWluKGQvc3wwLDY3MTA4ODYzKSxpLl9pc2hsbnN1Ym11bChyLGQsbCk7MCE9PWkubmVnYXRpdmU7KWQtLSxpLm5lZ2F0aXZlPTAsaS5faXNobG5zdWJtdWwociwxLGwpLGkuaXNaZXJvKCl8fChpLm5lZ2F0aXZlXj0xKTthJiYoYS53b3Jkc1tsXT1kKX1yZXR1cm4gYSYmYS5zdHJpcCgpLGkuc3RyaXAoKSwiZGl2IiE9PWUmJjAhPT1uJiZpLml1c2hybihuKSx7ZGl2OmF8fG51bGwsbW9kOml9fSxvLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpKCF0LmlzWmVybygpKSx0aGlzLmlzWmVybygpP3tkaXY6bmV3IG8oMCksbW9kOm5ldyBvKDApfTowIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmU/KGE9dGhpcy5uZWcoKS5kaXZtb2QodCxlKSwibW9kIiE9PWUmJihyPWEuZGl2Lm5lZygpKSwiZGl2IiE9PWUmJihzPWEubW9kLm5lZygpLG4mJjAhPT1zLm5lZ2F0aXZlJiZzLmlhZGQodCkpLHtkaXY6cixtb2Q6c30pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZT8oYT10aGlzLmRpdm1vZCh0Lm5lZygpLGUpLCJtb2QiIT09ZSYmKHI9YS5kaXYubmVnKCkpLHtkaXY6cixtb2Q6YS5tb2R9KTowIT0odGhpcy5uZWdhdGl2ZSZ0Lm5lZ2F0aXZlKT8oYT10aGlzLm5lZygpLmRpdm1vZCh0Lm5lZygpLGUpLCJkaXYiIT09ZSYmKHM9YS5tb2QubmVnKCksbiYmMCE9PXMubmVnYXRpdmUmJnMuaXN1Yih0KSkse2RpdjphLmRpdixtb2Q6c30pOnQubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcCh0KTwwP3tkaXY6bmV3IG8oMCksbW9kOnRoaXN9OjE9PT10Lmxlbmd0aD8iZGl2Ij09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OiJtb2QiPT09ZT97ZGl2Om51bGwsbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpuZXcgbyh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp0aGlzLl93b3JkRGl2KHQsZSk7dmFyIHIscyxhfSxvLnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsImRpdiIsITEpLmRpdn0sby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LCJtb2QiLCExKS5tb2R9LG8ucHJvdG90eXBlLnVtb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsIm1vZCIsITApLm1vZH0sby5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kaXZtb2QodCk7aWYoZS5tb2QuaXNaZXJvKCkpcmV0dXJuIGUuZGl2O3ZhciBuPTAhPT1lLmRpdi5uZWdhdGl2ZT9lLm1vZC5pc3ViKHQpOmUubW9kLGk9dC51c2hybigxKSxyPXQuYW5kbG4oMSksbz1uLmNtcChpKTtyZXR1cm4gbzwwfHwxPT09ciYmMD09PW8/ZS5kaXY6MCE9PWUuZGl2Lm5lZ2F0aXZlP2UuZGl2LmlzdWJuKDEpOmUuZGl2LmlhZGRuKDEpfSxvLnByb3RvdHlwZS5tb2RuPWZ1bmN0aW9uKHQpe2kodDw9NjcxMDg4NjMpO2Zvcih2YXIgZT0oMTw8MjYpJXQsbj0wLHI9dGhpcy5sZW5ndGgtMTtyPj0wO3ItLSluPShlKm4rKDB8dGhpcy53b3Jkc1tyXSkpJXQ7cmV0dXJuIG59LG8ucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uKHQpe2kodDw9NjcxMDg4NjMpO2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIHI9KDB8dGhpcy53b3Jkc1tuXSkrNjcxMDg4NjQqZTt0aGlzLndvcmRzW25dPXIvdHwwLGU9ciV0fXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bih0KX0sby5wcm90b3R5cGUuZWdjZD1mdW5jdGlvbih0KXtpKDA9PT10Lm5lZ2F0aXZlKSxpKCF0LmlzWmVybygpKTt2YXIgZT10aGlzLG49dC5jbG9uZSgpO2U9MCE9PWUubmVnYXRpdmU/ZS51bW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIHI9bmV3IG8oMSkscz1uZXcgbygwKSxhPW5ldyBvKDApLHU9bmV3IG8oMSksYz0wO2UuaXNFdmVuKCkmJm4uaXNFdmVuKCk7KWUuaXVzaHJuKDEpLG4uaXVzaHJuKDEpLCsrYztmb3IodmFyIGg9bi5jbG9uZSgpLGw9ZS5jbG9uZSgpOyFlLmlzWmVybygpOyl7Zm9yKHZhciBkPTAsZj0xOzA9PShlLndvcmRzWzBdJmYpJiZkPDI2OysrZCxmPDw9MSk7aWYoZD4wKWZvcihlLml1c2hybihkKTtkLS0gPjA7KShyLmlzT2RkKCl8fHMuaXNPZGQoKSkmJihyLmlhZGQoaCkscy5pc3ViKGwpKSxyLml1c2hybigxKSxzLml1c2hybigxKTtmb3IodmFyIHA9MCxtPTE7MD09KG4ud29yZHNbMF0mbSkmJnA8MjY7KytwLG08PD0xKTtpZihwPjApZm9yKG4uaXVzaHJuKHApO3AtLSA+MDspKGEuaXNPZGQoKXx8dS5pc09kZCgpKSYmKGEuaWFkZChoKSx1LmlzdWIobCkpLGEuaXVzaHJuKDEpLHUuaXVzaHJuKDEpO2UuY21wKG4pPj0wPyhlLmlzdWIobiksci5pc3ViKGEpLHMuaXN1Yih1KSk6KG4uaXN1YihlKSxhLmlzdWIociksdS5pc3ViKHMpKX1yZXR1cm57YTphLGI6dSxnY2Q6bi5pdXNobG4oYyl9fSxvLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7aSgwPT09dC5uZWdhdGl2ZSksaSghdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxuPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciByLHM9bmV3IG8oMSksYT1uZXcgbygwKSx1PW4uY2xvbmUoKTtlLmNtcG4oMSk+MCYmbi5jbXBuKDEpPjA7KXtmb3IodmFyIGM9MCxoPTE7MD09KGUud29yZHNbMF0maCkmJmM8MjY7KytjLGg8PD0xKTtpZihjPjApZm9yKGUuaXVzaHJuKGMpO2MtLSA+MDspcy5pc09kZCgpJiZzLmlhZGQodSkscy5pdXNocm4oMSk7Zm9yKHZhciBsPTAsZD0xOzA9PShuLndvcmRzWzBdJmQpJiZsPDI2OysrbCxkPDw9MSk7aWYobD4wKWZvcihuLml1c2hybihsKTtsLS0gPjA7KWEuaXNPZGQoKSYmYS5pYWRkKHUpLGEuaXVzaHJuKDEpO2UuY21wKG4pPj0wPyhlLmlzdWIobikscy5pc3ViKGEpKToobi5pc3ViKGUpLGEuaXN1YihzKSl9cmV0dXJuKHI9MD09PWUuY21wbigxKT9zOmEpLmNtcG4oMCk8MCYmci5pYWRkKHQpLHJ9LG8ucHJvdG90eXBlLmdjZD1mdW5jdGlvbih0KXtpZih0aGlzLmlzWmVybygpKXJldHVybiB0LmFicygpO2lmKHQuaXNaZXJvKCkpcmV0dXJuIHRoaXMuYWJzKCk7dmFyIGU9dGhpcy5jbG9uZSgpLG49dC5jbG9uZSgpO2UubmVnYXRpdmU9MCxuLm5lZ2F0aXZlPTA7Zm9yKHZhciBpPTA7ZS5pc0V2ZW4oKSYmbi5pc0V2ZW4oKTtpKyspZS5pdXNocm4oMSksbi5pdXNocm4oMSk7Zm9yKDs7KXtmb3IoO2UuaXNFdmVuKCk7KWUuaXVzaHJuKDEpO2Zvcig7bi5pc0V2ZW4oKTspbi5pdXNocm4oMSk7dmFyIHI9ZS5jbXAobik7aWYocjwwKXt2YXIgbz1lO2U9bixuPW99ZWxzZSBpZigwPT09cnx8MD09PW4uY21wbigxKSlicmVhaztlLmlzdWIobil9cmV0dXJuIG4uaXVzaGxuKGkpfSxvLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVnY2QodCkuYS51bW9kKHQpfSxvLnByb3RvdHlwZS5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09KDEmdGhpcy53b3Jkc1swXSl9LG8ucHJvdG90eXBlLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PSgxJnRoaXMud29yZHNbMF0pfSxvLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53b3Jkc1swXSZ0fSxvLnByb3RvdHlwZS5iaW5jbj1mdW5jdGlvbih0KXtpKCJudW1iZXIiPT10eXBlb2YgdCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LHI9MTw8ZTtpZih0aGlzLmxlbmd0aDw9bilyZXR1cm4gdGhpcy5fZXhwYW5kKG4rMSksdGhpcy53b3Jkc1tuXXw9cix0aGlzO2Zvcih2YXIgbz1yLHM9bjswIT09byYmczx0aGlzLmxlbmd0aDtzKyspe3ZhciBhPTB8dGhpcy53b3Jkc1tzXTtvPShhKz1vKT4+PjI2LGEmPTY3MTA4ODYzLHRoaXMud29yZHNbc109YX1yZXR1cm4gMCE9PW8mJih0aGlzLndvcmRzW3NdPW8sdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF19LG8ucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24odCl7dmFyIGUsbj10PDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFuKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZuKXJldHVybiAxO2lmKHRoaXMuc3RyaXAoKSx0aGlzLmxlbmd0aD4xKWU9MTtlbHNle24mJih0PS10KSxpKHQ8PTY3MTA4ODYzLCJOdW1iZXIgaXMgdG9vIGJpZyIpO3ZhciByPTB8dGhpcy53b3Jkc1swXTtlPXI9PT10PzA6cjx0Py0xOjF9cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sby5wcm90b3R5cGUuY21wPWZ1bmN0aW9uKHQpe2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIDE7dmFyIGU9dGhpcy51Y21wKHQpO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT8wfC1lOmV9LG8ucHJvdG90eXBlLnVjbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg+dC5sZW5ndGgpcmV0dXJuIDE7aWYodGhpcy5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLTE7Zm9yKHZhciBlPTAsbj10aGlzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgaT0wfHRoaXMud29yZHNbbl0scj0wfHQud29yZHNbbl07aWYoaSE9PXIpe2k8cj9lPS0xOmk+ciYmKGU9MSk7YnJlYWt9fXJldHVybiBlfSxvLnByb3RvdHlwZS5ndG49ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmd0PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dGhpcy5jbXAodCl9LG8ucHJvdG90eXBlLmd0ZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT49MH0sby5wcm90b3R5cGUuZ3RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KT49MH0sby5wcm90b3R5cGUubHRuPWZ1bmN0aW9uKHQpe3JldHVybi0xPT09dGhpcy5jbXBuKHQpfSxvLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4tMT09PXRoaXMuY21wKHQpfSxvLnByb3RvdHlwZS5sdGVuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcG4odCk8PTB9LG8ucHJvdG90eXBlLmx0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8PTB9LG8ucHJvdG90eXBlLmVxbj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wbih0KX0sby5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcCh0KX0sby5yZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHQpfSxvLnByb3RvdHlwZS50b1JlZD1mdW5jdGlvbih0KXtyZXR1cm4gaSghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSxpKDA9PT10aGlzLm5lZ2F0aXZlLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLHQuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5yZWQuY29udmVydEZyb20odGhpcyl9LG8ucHJvdG90eXBlLl9mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZWQ9dCx0aGlzfSxvLnByb3RvdHlwZS5mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gaSghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkLCJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuYWRkKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZElBZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaWFkZCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pc3ViKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNobD1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnNobCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRNdWw9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkLCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5pbXVsKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FyKHRoaXMpfSxvLnByb3RvdHlwZS5yZWRJU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcnQodGhpcyl9LG8ucHJvdG90eXBlLnJlZEludm09ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pbnZtKHRoaXMpfSxvLnByb3RvdHlwZS5yZWROZWc9ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0sby5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkJiYhdC5yZWQsInJlZFBvdyhub3JtYWxOdW0pIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsdCl9O3ZhciBnPXtrMjU2Om51bGwscDIyNDpudWxsLHAxOTI6bnVsbCxwMjU1MTk6bnVsbH07ZnVuY3Rpb24gdih0LGUpe3RoaXMubmFtZT10LHRoaXMucD1uZXcgbyhlLDE2KSx0aGlzLm49dGhpcy5wLmJpdExlbmd0aCgpLHRoaXMuaz1uZXcgbygxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksdGhpcy50bXA9dGhpcy5fdG1wKCl9ZnVuY3Rpb24gYigpe3YuY2FsbCh0aGlzLCJrMjU2IiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYiKX1mdW5jdGlvbiB5KCl7di5jYWxsKHRoaXMsInAyMjQiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpfWZ1bmN0aW9uIF8oKXt2LmNhbGwodGhpcywicDE5MiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIil9ZnVuY3Rpb24gdygpe3YuY2FsbCh0aGlzLCIyNTUxOSIsIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKX1mdW5jdGlvbiB4KHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9by5fcHJpbWUodCk7dGhpcy5tPWUucCx0aGlzLnByaW1lPWV9ZWxzZSBpKHQuZ3RuKDEpLCJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSx0aGlzLm09dCx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gTSh0KXt4LmNhbGwodGhpcyx0KSx0aGlzLnNoaWZ0PXRoaXMubS5iaXRMZW5ndGgoKSx0aGlzLnNoaWZ0JTI2IT0wJiYodGhpcy5zaGlmdCs9MjYtdGhpcy5zaGlmdCUyNiksdGhpcy5yPW5ldyBvKDEpLml1c2hsbih0aGlzLnNoaWZ0KSx0aGlzLnIyPXRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLHRoaXMucmludj10aGlzLnIuX2ludm1wKHRoaXMubSksdGhpcy5taW52PXRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5taW52LnVtb2QodGhpcy5yKSx0aGlzLm1pbnY9dGhpcy5yLnN1Yih0aGlzLm1pbnYpfXYucHJvdG90eXBlLl90bXA9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbyhudWxsKTtyZXR1cm4gdC53b3Jkcz1uZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubi8xMykpLHR9LHYucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIGUsbj10O2Rve3RoaXMuc3BsaXQobix0aGlzLnRtcCksZT0obj0obj10aGlzLmltdWxLKG4pKS5pYWRkKHRoaXMudG1wKSkuYml0TGVuZ3RoKCl9d2hpbGUoZT50aGlzLm4pO3ZhciBpPWU8dGhpcy5uPy0xOm4udWNtcCh0aGlzLnApO3JldHVybiAwPT09aT8obi53b3Jkc1swXT0wLG4ubGVuZ3RoPTEpOmk+MD9uLmlzdWIodGhpcy5wKTpuLnN0cmlwKCksbn0sdi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXt0Lml1c2hybih0aGlzLm4sMCxlKX0sdi5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW11bCh0aGlzLmspfSxyKGIsdiksYi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC5taW4odC5sZW5ndGgsOSksaT0wO2k8bjtpKyspZS53b3Jkc1tpXT10LndvcmRzW2ldO2lmKGUubGVuZ3RoPW4sdC5sZW5ndGg8PTkpcmV0dXJuIHQud29yZHNbMF09MCx2b2lkKHQubGVuZ3RoPTEpO3ZhciByPXQud29yZHNbOV07Zm9yKGUud29yZHNbZS5sZW5ndGgrK109NDE5NDMwMyZyLGk9MTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPTB8dC53b3Jkc1tpXTt0LndvcmRzW2ktMTBdPSg0MTk0MzAzJm8pPDw0fHI+Pj4yMixyPW99cj4+Pj0yMix0LndvcmRzW2ktMTBdPXIsMD09PXImJnQubGVuZ3RoPjEwP3QubGVuZ3RoLT0xMDp0Lmxlbmd0aC09OX0sYi5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7dC53b3Jkc1t0Lmxlbmd0aF09MCx0LndvcmRzW3QubGVuZ3RoKzFdPTAsdC5sZW5ndGgrPTI7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT0wfHQud29yZHNbbl07ZSs9OTc3KmksdC53b3Jkc1tuXT02NzEwODg2MyZlLGU9NjQqaSsoZS82NzEwODg2NHwwKX1yZXR1cm4gMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJih0Lmxlbmd0aC0tLDA9PT10LndvcmRzW3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aC0tKSx0fSxyKHksdikscihfLHYpLHIodyx2KSx3LnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPTE5KigwfHQud29yZHNbbl0pK2Uscj02NzEwODg2MyZpO2k+Pj49MjYsdC53b3Jkc1tuXT1yLGU9aX1yZXR1cm4gMCE9PWUmJih0LndvcmRzW3QubGVuZ3RoKytdPWUpLHR9LG8uX3ByaW1lPWZ1bmN0aW9uKHQpe2lmKGdbdF0pcmV0dXJuIGdbdF07dmFyIGU7aWYoImsyNTYiPT09dCllPW5ldyBiO2Vsc2UgaWYoInAyMjQiPT09dCllPW5ldyB5O2Vsc2UgaWYoInAxOTIiPT09dCllPW5ldyBfO2Vsc2V7aWYoInAyNTUxOSIhPT10KXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK3QpO2U9bmV3IHd9cmV0dXJuIGdbdF09ZSxlfSx4LnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbih0KXtpKDA9PT10Lm5lZ2F0aXZlLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGkodC5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0seC5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24odCxlKXtpKDA9PSh0Lm5lZ2F0aXZlfGUubmVnYXRpdmUpLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGkodC5yZWQmJnQucmVkPT09ZS5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0seC5wcm90b3R5cGUuaW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UodCkuX2ZvcmNlUmVkKHRoaXMpOnQudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzWmVybygpP3QuY2xvbmUoKTp0aGlzLm0uc3ViKHQpLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciBuPXQuYWRkKGUpO3JldHVybiBuLmNtcCh0aGlzLm0pPj0wJiZuLmlzdWIodGhpcy5tKSxuLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgbj10LmlhZGQoZSk7cmV0dXJuIG4uY21wKHRoaXMubSk+PTAmJm4uaXN1Yih0aGlzLm0pLG59LHgucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgbj10LnN1YihlKTtyZXR1cm4gbi5jbXBuKDApPDAmJm4uaWFkZCh0aGlzLm0pLG4uX2ZvcmNlUmVkKHRoaXMpfSx4LnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciBuPXQuaXN1YihlKTtyZXR1cm4gbi5jbXBuKDApPDAmJm4uaWFkZCh0aGlzLm0pLG59LHgucHJvdG90eXBlLnNobD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkxKHQpLHRoaXMuaW1vZCh0LnVzaGxuKGUpKX0seC5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQuaW11bChlKSl9LHgucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQubXVsKGUpKX0seC5wcm90b3R5cGUuaXNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbXVsKHQsdC5jbG9uZSgpKX0seC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm11bCh0LHQpfSx4LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKHQpe2lmKHQuaXNaZXJvKCkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT10aGlzLm0uYW5kbG4oMyk7aWYoaShlJTI9PTEpLDM9PT1lKXt2YXIgbj10aGlzLm0uYWRkKG5ldyBvKDEpKS5pdXNocm4oMik7cmV0dXJuIHRoaXMucG93KHQsbil9Zm9yKHZhciByPXRoaXMubS5zdWJuKDEpLHM9MDshci5pc1plcm8oKSYmMD09PXIuYW5kbG4oMSk7KXMrKyxyLml1c2hybigxKTtpKCFyLmlzWmVybygpKTt2YXIgYT1uZXcgbygxKS50b1JlZCh0aGlzKSx1PWEucmVkTmVnKCksYz10aGlzLm0uc3VibigxKS5pdXNocm4oMSksaD10aGlzLm0uYml0TGVuZ3RoKCk7Zm9yKGg9bmV3IG8oMipoKmgpLnRvUmVkKHRoaXMpOzAhPT10aGlzLnBvdyhoLGMpLmNtcCh1KTspaC5yZWRJQWRkKHUpO2Zvcih2YXIgbD10aGlzLnBvdyhoLHIpLGQ9dGhpcy5wb3codCxyLmFkZG4oMSkuaXVzaHJuKDEpKSxmPXRoaXMucG93KHQscikscD1zOzAhPT1mLmNtcChhKTspe2Zvcih2YXIgbT1mLGc9MDswIT09bS5jbXAoYSk7ZysrKW09bS5yZWRTcXIoKTtpKGc8cCk7dmFyIHY9dGhpcy5wb3cobCxuZXcgbygxKS5pdXNobG4ocC1nLTEpKTtkPWQucmVkTXVsKHYpLGw9di5yZWRTcXIoKSxmPWYucmVkTXVsKGwpLHA9Z31yZXR1cm4gZH0seC5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiAwIT09ZS5uZWdhdGl2ZT8oZS5uZWdhdGl2ZT0wLHRoaXMuaW1vZChlKS5yZWROZWcoKSk6dGhpcy5pbW9kKGUpfSx4LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCxlKXtpZihlLmlzWmVybygpKXJldHVybiBuZXcgbygxKS50b1JlZCh0aGlzKTtpZigwPT09ZS5jbXBuKDEpKXJldHVybiB0LmNsb25lKCk7dmFyIG49bmV3IEFycmF5KDE2KTtuWzBdPW5ldyBvKDEpLnRvUmVkKHRoaXMpLG5bMV09dDtmb3IodmFyIGk9MjtpPG4ubGVuZ3RoO2krKyluW2ldPXRoaXMubXVsKG5baS0xXSx0KTt2YXIgcj1uWzBdLHM9MCxhPTAsdT1lLmJpdExlbmd0aCgpJTI2O2ZvcigwPT09dSYmKHU9MjYpLGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciBjPWUud29yZHNbaV0saD11LTE7aD49MDtoLS0pe3ZhciBsPWM+PmgmMTtyIT09blswXSYmKHI9dGhpcy5zcXIocikpLDAhPT1sfHwwIT09cz8oczw8PTEsc3w9bCwoND09PSsrYXx8MD09PWkmJjA9PT1oKSYmKHI9dGhpcy5tdWwocixuW3NdKSxhPTAscz0wKSk6YT0wfXU9MjZ9cmV0dXJuIHJ9LHgucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXt2YXIgZT10LnVtb2QodGhpcy5tKTtyZXR1cm4gZT09PXQ/ZS5jbG9uZSgpOmV9LHgucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmUoKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxvLm1vbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNKHQpfSxyKE0seCksTS5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltb2QodC51c2hsbih0aGlzLnNoaWZ0KSl9LE0ucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Lm11bCh0aGlzLnJpbnYpKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxNLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gdC53b3Jkc1swXT0wLHQubGVuZ3RoPTEsdDt2YXIgbj10LmltdWwoZSksaT1uLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxyPW4uaXN1YihpKS5pdXNocm4odGhpcy5zaGlmdCksbz1yO3JldHVybiByLmNtcCh0aGlzLm0pPj0wP289ci5pc3ViKHRoaXMubSk6ci5jbXBuKDApPDAmJihvPXIuaWFkZCh0aGlzLm0pKSxvLl9mb3JjZVJlZCh0aGlzKX0sTS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciBuPXQubXVsKGUpLGk9bi5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSkscj1uLmlzdWIoaSkuaXVzaHJuKHRoaXMuc2hpZnQpLHM9cjtyZXR1cm4gci5jbXAodGhpcy5tKT49MD9zPXIuaXN1Yih0aGlzLm0pOnIuY21wbigwKTwwJiYocz1yLmlhZGQodGhpcy5tKSkscy5fZm9yY2VSZWQodGhpcyl9LE0ucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0Ll9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSkuX2ZvcmNlUmVkKHRoaXMpfX0odCx0aGlzKX0pLmNhbGwodGhpcyxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpewovKiEKICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAqCiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPgogKiBAbGljZW5zZSAgTUlUCiAqLwp2YXIgaT1uKDgxKSxyPW4oMTQ2KSxvPW4oODMpO2Z1bmN0aW9uIHMoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBhKHQsZSl7aWYocygpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gbCh0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4saSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4saSl7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisoaXx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PWk/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09aT9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixpKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9ZCh0LGUpO3JldHVybiB0fSh0LGUsbixpKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIGk9MHxwKGUsbikscj0odD1hKHQsaSkpLndyaXRlKGUsbik7ciE9PWkmJih0PXQuc2xpY2UoMCxyKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8ZihlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1hKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChpPWUubGVuZ3RoKSE9aT9hKHQsMCk6ZCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZvKGUuZGF0YSkpcmV0dXJuIGQodCxlLmRhdGEpfXZhciBpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBoKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gbCh0LGUpe2lmKGgoZSksdD1hKHQsZTwwPzA6MHxmKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIGQodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxmKGUubGVuZ3RoKTt0PWEodCxuKTtmb3IodmFyIGk9MDtpPG47aSs9MSl0W2ldPTI1NSZlW2ldO3JldHVybiB0fWZ1bmN0aW9uIGYodCl7aWYodD49cygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitzKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIHAodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIGk9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBXKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcSh0KS5sZW5ndGg7ZGVmYXVsdDppZihpKXJldHVybiBXKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLGk9ITB9fWZ1bmN0aW9uIG0odCxlLG4pe3ZhciBpPXRbZV07dFtlXT10W25dLHRbbl09aX1mdW5jdGlvbiBnKHQsZSxuLGkscil7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49cj8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKHIpcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighcilyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxpKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOnYodCxlLG4saSxyKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP3I/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTp2KHQsW2VdLG4saSxyKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiB2KHQsZSxuLGkscil7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1pJiYoInVjczIiPT09KGk9U3RyaW5nKGkpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09aXx8InV0ZjE2bGUiPT09aXx8InV0Zi0xNmxlIj09PWkpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihyKXt2YXIgaD0tMTtmb3Iobz1uO288YTtvKyspaWYoYyh0LG8pPT09YyhlLC0xPT09aD8wOm8taCkpe2lmKC0xPT09aCYmKGg9byksby1oKzE9PT11KXJldHVybiBoKnN9ZWxzZS0xIT09aCYmKG8tPW8taCksaD0tMX1lbHNlIGZvcihuK3U+YSYmKG49YS11KSxvPW47bz49MDtvLS0pe2Zvcih2YXIgbD0hMCxkPTA7ZDx1O2QrKylpZihjKHQsbytkKSE9PWMoZSxkKSl7bD0hMTticmVha31pZihsKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4saSl7bj1OdW1iZXIobil8fDA7dmFyIHI9dC5sZW5ndGgtbjtpPyhpPU51bWJlcihpKSk+ciYmKGk9cik6aT1yO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtpPm8vMiYmKGk9by8yKTtmb3IodmFyIHM9MDtzPGk7KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIHkodCxlLG4saSl7cmV0dXJuIEgoVyhlLHQubGVuZ3RoLW4pLHQsbixpKX1mdW5jdGlvbiBfKHQsZSxuLGkpe3JldHVybiBIKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4saSl9ZnVuY3Rpb24gdyh0LGUsbixpKXtyZXR1cm4gXyh0LGUsbixpKX1mdW5jdGlvbiB4KHQsZSxuLGkpe3JldHVybiBIKHEoZSksdCxuLGkpfWZ1bmN0aW9uIE0odCxlLG4saSl7cmV0dXJuIEgoZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPXQuY2hhckNvZGVBdChzKSxpPW4+Pjgscj1uJTI1NixvLnB1c2gociksby5wdXNoKGkpO3JldHVybiBvfShlLHQubGVuZ3RoLW4pLHQsbixpKX1mdW5jdGlvbiBTKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9pLmZyb21CeXRlQXJyYXkodCk6aS5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gRSh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIGk9W10scj1lO3I8bjspe3ZhciBvLHMsYSx1LGM9dFtyXSxoPW51bGwsbD1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKHIrbDw9bilzd2l0Y2gobCl7Y2FzZSAxOmM8MTI4JiYoaD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbcisxXSkpJiYodT0oMzEmYyk8PDZ8NjMmbyk+MTI3JiYoaD11KTticmVhaztjYXNlIDM6bz10W3IrMV0scz10W3IrMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGg9dSk7YnJlYWs7Y2FzZSA0Om89dFtyKzFdLHM9dFtyKzJdLGE9dFtyKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGg9dSl9bnVsbD09PWg/KGg9NjU1MzMsbD0xKTpoPjY1NTM1JiYoaC09NjU1MzYsaS5wdXNoKGg+Pj4xMCYxMDIzfDU1Mjk2KSxoPTU2MzIwfDEwMjMmaCksaS5wdXNoKGgpLHIrPWx9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PUEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLGk9MDtmb3IoO2k8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShpLGkrPUEpKTtyZXR1cm4gbn0oaSl9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1zKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBoKGUpLGU8PTA/YSh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiBpP2EodCxlKS5maWxsKG4saSk6YSh0LGUpLmZpbGwobik6YSh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gbChudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gbChudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgsaT1lLmxlbmd0aCxyPTAsbz1NYXRoLm1pbihuLGkpO3I8bzsrK3IpaWYodFtyXSE9PWVbcl0pe249dFtyXSxpPWVbcl07YnJlYWt9cmV0dXJuIG48aT8tMTppPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIW8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciBpPXUuYWxsb2NVbnNhZmUoZSkscj0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBzPXRbbl07aWYoIXUuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShpLHIpLHIrPXMubGVuZ3RofXJldHVybiBpfSx1LmJ5dGVMZW5ndGg9cCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKW0odGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCltKHRoaXMsZSxlKzMpLG0odGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KW0odGhpcyxlLGUrNyksbSh0aGlzLGUrMSxlKzYpLG0odGhpcyxlKzIsZSs1KSxtKHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/RSh0aGlzLDAsdCk6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTyh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gRSh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBQKHRoaXMsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGk9ITB9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8aTwwfHxyPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihpPj1yJiZlPj1uKXJldHVybiAwO2lmKGk+PXIpcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KHI+Pj49MCktKGk+Pj49MCkscz0obj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksYz10aGlzLnNsaWNlKGksciksaD10LnNsaWNlKGUsbiksbD0wO2w8YTsrK2wpaWYoY1tsXSE9PWhbbF0pe289Y1tsXSxzPWhbbF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZyh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBnKHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixpKXtpZih2b2lkIDA9PT1lKWk9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKWk9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1pJiYoaT0idXRmOCIpKTooaT1uLG49dm9pZCAwKX12YXIgcj10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPnIpJiYobj1yKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO2l8fChpPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKGkpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB5KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBfKHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHcodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gTSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitpKTtpPSgiIitpKS50b0xvd2VyQ2FzZSgpLG89ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBBPTQwOTY7ZnVuY3Rpb24gQyh0LGUsbil7dmFyIGk9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9ZTtyPG47KytyKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbcl0pO3JldHVybiBpfWZ1bmN0aW9uIGsodCxlLG4pe3ZhciBpPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPWU7cjxuOysrcilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbcl0pO3JldHVybiBpfWZ1bmN0aW9uIE8odCxlLG4pe3ZhciBpPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+aSkmJihuPWkpO2Zvcih2YXIgcj0iIixvPWU7bzxuOysrbylyKz1OKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIFAodCxlLG4pe2Zvcih2YXIgaT10LnNsaWNlKGUsbikscj0iIixvPTA7bzxpLmxlbmd0aDtvKz0yKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoaVtvXSsyNTYqaVtvKzFdKTtyZXR1cm4gcn1mdW5jdGlvbiBUKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBqKHQsZSxuLGkscixvKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5yfHxlPG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4raT50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixpKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciByPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO3I8bzsrK3IpdFtuK3JdPShlJjI1NTw8OCooaT9yOjEtcikpPj4+OCooaT9yOjEtcil9ZnVuY3Rpb24gTCh0LGUsbixpKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIHI9MCxvPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7cjxvOysrcil0W24rcl09ZT4+PjgqKGk/cjozLXIpJjI1NX1mdW5jdGlvbiBCKHQsZSxuLGkscixvKXtpZihuK2k+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gRCh0LGUsbixpLG8pe3JldHVybiBvfHxCKHQsMCxuLDQpLHIud3JpdGUodCxlLG4saSwyMyw0KSxuKzR9ZnVuY3Rpb24gUih0LGUsbixpLG8pe3JldHVybiBvfHxCKHQsMCxuLDgpLHIud3JpdGUodCxlLG4saSw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9aSk8MCYmKHQ9MCk6dD5pJiYodD1pKSwoZT12b2lkIDA9PT1lP2k6fn5lKTwwPyhlKz1pKTwwJiYoZT0wKTplPmkmJihlPWkpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIHI9ZS10O249bmV3IHUocix2b2lkIDApO2Zvcih2YXIgbz0wO288cjsrK28pbltvXT10aGlzW28rdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxUKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPXRoaXNbdF0scj0xLG89MDsrK288ZSYmKHIqPTI1Nik7KWkrPXRoaXNbdCtvXSpyO3JldHVybiBpfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8VCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgaT10aGlzW3QrLS1lXSxyPTE7ZT4wJiYocio9MjU2KTspaSs9dGhpc1t0Ky0tZV0qcjtyZXR1cm4gaX0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8VCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgaT10aGlzW3RdLHI9MSxvPTA7KytvPGUmJihyKj0yNTYpOylpKz10aGlzW3Qrb10qcjtyZXR1cm4gaT49KHIqPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9ZSxyPTEsbz10aGlzW3QrLS1pXTtpPjAmJihyKj0yNTYpOylvKz10aGlzW3QrLS1pXSpyO3JldHVybiBvPj0ocio9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFQodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxUKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSxyLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksci5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw4LHRoaXMubGVuZ3RoKSxyLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDgsdGhpcy5sZW5ndGgpLHIucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLGkpeyh0PSt0LGV8PTAsbnw9MCxpKXx8aih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciByPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxuJiYocio9MjU2KTspdGhpc1tlK29dPXQvciYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4saSl7KHQ9K3QsZXw9MCxufD0wLGkpfHxqKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIHI9bi0xLG89MTtmb3IodGhpc1tlK3JdPTI1NSZ0Oy0tcj49MCYmKG8qPTI1Nik7KXRoaXNbZStyXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6TCh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpMKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4saSl7aWYodD0rdCxlfD0wLCFpKXt2YXIgcj1NYXRoLnBvdygyLDgqbi0xKTtqKHRoaXMsdCxlLG4sci0xLC1yKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPG4mJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQ9K3QsZXw9MCwhaSl7dmFyIHI9TWF0aC5wb3coMiw4Km4tMSk7aih0aGlzLHQsZSxuLHItMSwtcil9dmFyIG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28rMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOkwodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6TCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBEKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBEKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUih0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFIodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4saSl7aWYobnx8KG49MCksaXx8MD09PWl8fChpPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLGk+MCYmaTxuJiYoaT1uKSxpPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPGktbiYmKGk9dC5sZW5ndGgtZStuKTt2YXIgcixvPWktbjtpZih0aGlzPT09dCYmbjxlJiZlPGkpZm9yKHI9by0xO3I+PTA7LS1yKXRbcitlXT10aGlzW3Irbl07ZWxzZSBpZihvPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iocj0wO3I8bzsrK3IpdFtyK2VdPXRoaXNbcituXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4rbyksZSk7cmV0dXJuIG99LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4saSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KGk9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYoaT1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIHI9dC5jaGFyQ29kZUF0KDApO3I8MjU2JiYodD1yKX1pZih2b2lkIDAhPT1pJiYic3RyaW5nIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgaSYmIXUuaXNFbmNvZGluZyhpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2kpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288bjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9dS5pc0J1ZmZlcih0KT90OlcobmV3IHUodCxpKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxuLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciB6PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIE4odCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFcodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIGk9dC5sZW5ndGgscj1udWxsLG89W10scz0wO3M8aTsrK3Mpe2lmKChuPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFyKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09aSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfXI9bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSkscj1uO2NvbnRpbnVlfW49NjU1MzYrKHItNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgciYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKHI9bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHEodCl7cmV0dXJuIGkudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZSh6LCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBIKHQsZSxuLGkpe2Zvcih2YXIgcj0wO3I8aSYmIShyK24+PWUubGVuZ3RofHxyPj10Lmxlbmd0aCk7KytyKWVbcituXT10W3JdO3JldHVybiByfX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQsaSl7dmFyIHIsbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMiksYT1uKDMyMCksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy50eXBlPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNDb25mbGF0YWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiExfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvbmZsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiExfSx0fSgpO2UuTWVzc2FnZT11O3ZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBvKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpc0NvbmZsYXRhYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuY29uZmxhdGU9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGV9KHUpO2UuQ29uZmxhdGFibGVNZXNzYWdlPWMsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBuPW8uZ2V0KHQpO24mJjAhPT1uLmxlbmd0aD9zLmV2ZXJ5KHMucmV0cm8obiksZnVuY3Rpb24obil7cmV0dXJuIW58fGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0hMDt0cnl7aT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGUsbik6dC5tZXNzYWdlSG9vayhlLG4pfWNhdGNoKHQpe2ModCl9cmV0dXJuIGl9KG4sdCxlKX0pJiZwKHQsZSk6cCh0LGUpfWUuc2VuZE1lc3NhZ2U9bixlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7ZS5pc0NvbmZsYXRhYmxlJiZzLnNvbWUocixmdW5jdGlvbihuKXtyZXR1cm4gbi5oYW5kbGVyPT09dCYmISFuLm1zZyYmbi5tc2cudHlwZT09PWUudHlwZSYmISFuLm1zZy5pc0NvbmZsYXRhYmxlJiZuLm1zZy5jb25mbGF0ZShlKX0pfHxtKHQsZSl9LGUuaW5zdGFsbE1lc3NhZ2VIb29rPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5nZXQodCk7biYmLTEhPT1uLmluZGV4T2YoZSl8fChuP24ucHVzaChlKTpvLnNldCh0LFtlXSkpfSxlLnJlbW92ZU1lc3NhZ2VIb29rPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5nZXQodCk7aWYobil7dmFyIGk9bi5pbmRleE9mKGUpOy0xIT09aSYmKG5baV09bnVsbCx2KG4pKX19LGUuY2xlYXJEYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0KHQpO2UmJmUubGVuZ3RoPjAmJihzLkFycmF5RXh0LmZpbGwoZSxudWxsKSx2KGUpKSxzLmVhY2gocixmdW5jdGlvbihlKXtlLmhhbmRsZXI9PT10JiYoZS5oYW5kbGVyPW51bGwsZS5tc2c9bnVsbCl9KX0sZS5mbHVzaD1mdW5jdGlvbigpe2x8fDA9PT1ofHwoZihoKSxsPSEwLGcoKSxsPSExKX0sZS5nZXRFeGNlcHRpb25IYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGN9LGUuc2V0RXhjZXB0aW9uSGFuZGxlcj1mdW5jdGlvbih0KXt2YXIgZT1jO3JldHVybiBjPXQsZX07dmFyIHI9bmV3IGEuTGlua2VkTGlzdCxvPW5ldyBXZWFrTWFwLHU9bmV3IFNldCxjPWZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IodCl9LGg9MCxsPSExLGQ9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWU6dCxmPSJmdW5jdGlvbiI9PXR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZT9jYW5jZWxBbmltYXRpb25GcmFtZTppO2Z1bmN0aW9uIHAodCxlKXt0cnl7dC5wcm9jZXNzTWVzc2FnZShlKX1jYXRjaCh0KXtjKHQpfX1mdW5jdGlvbiBtKHQsZSl7ci5hZGRMYXN0KHtoYW5kbGVyOnQsbXNnOmV9KSwwPT09aCYmKGg9ZChnKSl9ZnVuY3Rpb24gZygpe2lmKGg9MCwhci5pc0VtcHR5KXt2YXIgdD17aGFuZGxlcjpudWxsLG1zZzpudWxsfTtmb3Ioci5hZGRMYXN0KHQpOzspe3ZhciBlPXIucmVtb3ZlRmlyc3QoKTtpZihlPT09dClyZXR1cm47ZS5oYW5kbGVyJiZlLm1zZyYmbihlLmhhbmRsZXIsZS5tc2cpfX19ZnVuY3Rpb24gdih0KXswPT09dS5zaXplJiZkKGIpLHUuYWRkKHQpfWZ1bmN0aW9uIGIoKXt1LmZvckVhY2goeSksdS5jbGVhcigpfWZ1bmN0aW9uIHkodCl7cy5BcnJheUV4dC5yZW1vdmVBbGxXaGVyZSh0LF8pfWZ1bmN0aW9uIF8odCl7cmV0dXJuIG51bGw9PT10fX0oZS5NZXNzYWdlTG9vcHx8KGUuTWVzc2FnZUxvb3A9e30pKX0pLmNhbGwodGhpcyxuKDQ0KS5zZXRJbW1lZGlhdGUsbig0NCkuY2xlYXJJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsbil7dmFyIGk7IWZ1bmN0aW9uKCl7dmFyIHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PT1zZWxmJiZzZWxmfHwib2JqZWN0Ij09dHlwZW9mIHQmJnQuZ2xvYmFsPT09dCYmdHx8dGhpc3x8e30sbz1yLl8scz1BcnJheS5wcm90b3R5cGUsYT1PYmplY3QucHJvdG90eXBlLHU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2w/U3ltYm9sLnByb3RvdHlwZTpudWxsLGM9cy5wdXNoLGg9cy5zbGljZSxsPWEudG9TdHJpbmcsZD1hLmhhc093blByb3BlcnR5LGY9QXJyYXkuaXNBcnJheSxwPU9iamVjdC5rZXlzLG09T2JqZWN0LmNyZWF0ZSxnPWZ1bmN0aW9uKCl7fSx2PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygdj90OnRoaXMgaW5zdGFuY2VvZiB2P3ZvaWQodGhpcy5fd3JhcHBlZD10KTpuZXcgdih0KX07ZS5ub2RlVHlwZT9yLl89djooIW4ubm9kZVR5cGUmJm4uZXhwb3J0cyYmKGU9bi5leHBvcnRzPXYpLGUuXz12KSx2LlZFUlNJT049IjEuOS4xIjt2YXIgYix5PWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChudWxsPT1uPzM6bil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixpLHIpe3JldHVybiB0LmNhbGwoZSxuLGkscil9O2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24obixpLHIsbyl7cmV0dXJuIHQuY2FsbChlLG4saSxyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fSxfPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdi5pdGVyYXRlZSE9PWI/di5pdGVyYXRlZSh0LGUpOm51bGw9PXQ/di5pZGVudGl0eTp2LmlzRnVuY3Rpb24odCk/eSh0LGUsbik6di5pc09iamVjdCh0KSYmIXYuaXNBcnJheSh0KT92Lm1hdGNoZXIodCk6di5wcm9wZXJ0eSh0KX07di5pdGVyYXRlZT1iPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF8odCxlLDEvMCl9O3ZhciB3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bnVsbD09ZT90Lmxlbmd0aC0xOitlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPU1hdGgubWF4KGFyZ3VtZW50cy5sZW5ndGgtZSwwKSxpPUFycmF5KG4pLHI9MDtyPG47cisrKWlbcl09YXJndW1lbnRzW3IrZV07c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKHRoaXMsaSk7Y2FzZSAxOnJldHVybiB0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0saSk7Y2FzZSAyOnJldHVybiB0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGkpfXZhciBvPUFycmF5KGUrMSk7Zm9yKHI9MDtyPGU7cisrKW9bcl09YXJndW1lbnRzW3JdO3JldHVybiBvW2VdPWksdC5hcHBseSh0aGlzLG8pfX0seD1mdW5jdGlvbih0KXtpZighdi5pc09iamVjdCh0KSlyZXR1cm57fTtpZihtKXJldHVybiBtKHQpO2cucHJvdG90eXBlPXQ7dmFyIGU9bmV3IGc7cmV0dXJuIGcucHJvdG90eXBlPW51bGwsZX0sTT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmQuY2FsbCh0LGUpfSxFPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXtpZihudWxsPT10KXJldHVybjt0PXRbZVtpXV19cmV0dXJuIG4/dDp2b2lkIDB9LEE9TWF0aC5wb3coMiw1MyktMSxDPU0oImxlbmd0aCIpLGs9ZnVuY3Rpb24odCl7dmFyIGU9Qyh0KTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJmU+PTAmJmU8PUF9O3YuZWFjaD12LmZvckVhY2g9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7aWYoZT15KGUsbiksayh0KSlmb3IoaT0wLHI9dC5sZW5ndGg7aTxyO2krKyllKHRbaV0saSx0KTtlbHNle3ZhciBvPXYua2V5cyh0KTtmb3IoaT0wLHI9by5sZW5ndGg7aTxyO2krKyllKHRbb1tpXV0sb1tpXSx0KX1yZXR1cm4gdH0sdi5tYXA9di5jb2xsZWN0PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz1BcnJheShyKSxzPTA7czxyO3MrKyl7dmFyIGE9aT9pW3NdOnM7b1tzXT1lKHRbYV0sYSx0KX1yZXR1cm4gb307dmFyIE89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+PTM7cmV0dXJuIGZ1bmN0aW9uKGUsbixpLHIpe3ZhciBvPSFrKGUpJiZ2LmtleXMoZSkscz0ob3x8ZSkubGVuZ3RoLGE9dD4wPzA6cy0xO2ZvcihyfHwoaT1lW28/b1thXTphXSxhKz10KTthPj0wJiZhPHM7YSs9dCl7dmFyIHU9bz9vW2FdOmE7aT1uKGksZVt1XSx1LGUpfXJldHVybiBpfShlLHkobixyLDQpLGksbyl9fTt2LnJlZHVjZT12LmZvbGRsPXYuaW5qZWN0PU8oMSksdi5yZWR1Y2VSaWdodD12LmZvbGRyPU8oLTEpLHYuZmluZD12LmRldGVjdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9KGsodCk/di5maW5kSW5kZXg6di5maW5kS2V5KSh0LGUsbik7aWYodm9pZCAwIT09aSYmLTEhPT1pKXJldHVybiB0W2ldfSx2LmZpbHRlcj12LnNlbGVjdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9W107cmV0dXJuIGU9XyhlLG4pLHYuZWFjaCh0LGZ1bmN0aW9uKHQsbixyKXtlKHQsbixyKSYmaS5wdXNoKHQpfSksaX0sdi5yZWplY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2LmZpbHRlcih0LHYubmVnYXRlKF8oZSkpLG4pfSx2LmV2ZXJ5PXYuYWxsPWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz0wO288cjtvKyspe3ZhciBzPWk/aVtvXTpvO2lmKCFlKHRbc10scyx0KSlyZXR1cm4hMX1yZXR1cm4hMH0sdi5zb21lPXYuYW55PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz0wO288cjtvKyspe3ZhciBzPWk/aVtvXTpvO2lmKGUodFtzXSxzLHQpKXJldHVybiEwfXJldHVybiExfSx2LmNvbnRhaW5zPXYuaW5jbHVkZXM9di5pbmNsdWRlPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBrKHQpfHwodD12LnZhbHVlcyh0KSksKCJudW1iZXIiIT10eXBlb2Ygbnx8aSkmJihuPTApLHYuaW5kZXhPZih0LGUsbik+PTB9LHYuaW52b2tlPXcoZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT9yPWU6di5pc0FycmF5KGUpJiYoaT1lLnNsaWNlKDAsLTEpLGU9ZVtlLmxlbmd0aC0xXSksdi5tYXAodCxmdW5jdGlvbih0KXt2YXIgbz1yO2lmKCFvKXtpZihpJiZpLmxlbmd0aCYmKHQ9RSh0LGkpKSxudWxsPT10KXJldHVybjtvPXRbZV19cmV0dXJuIG51bGw9PW8/bzpvLmFwcGx5KHQsbil9KX0pLHYucGx1Y2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdi5tYXAodCx2LnByb3BlcnR5KGUpKX0sdi53aGVyZT1mdW5jdGlvbih0LGUpe3JldHVybiB2LmZpbHRlcih0LHYubWF0Y2hlcihlKSl9LHYuZmluZFdoZXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHYuZmluZCh0LHYubWF0Y2hlcihlKSl9LHYubWF4PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89LTEvMCxzPS0xLzA7aWYobnVsbD09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiYib2JqZWN0IiE9dHlwZW9mIHRbMF0mJm51bGwhPXQpZm9yKHZhciBhPTAsdT0odD1rKHQpP3Q6di52YWx1ZXModCkpLmxlbmd0aDthPHU7YSsrKW51bGwhPShpPXRbYV0pJiZpPm8mJihvPWkpO2Vsc2UgZT1fKGUsbiksdi5lYWNoKHQsZnVuY3Rpb24odCxuLGkpeygocj1lKHQsbixpKSk+c3x8cj09PS0xLzAmJm89PT0tMS8wKSYmKG89dCxzPXIpfSk7cmV0dXJuIG99LHYubWluPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89MS8wLHM9MS8wO2lmKG51bGw9PWV8fCJudW1iZXIiPT10eXBlb2YgZSYmIm9iamVjdCIhPXR5cGVvZiB0WzBdJiZudWxsIT10KWZvcih2YXIgYT0wLHU9KHQ9ayh0KT90OnYudmFsdWVzKHQpKS5sZW5ndGg7YTx1O2ErKyludWxsIT0oaT10W2FdKSYmaTxvJiYobz1pKTtlbHNlIGU9XyhlLG4pLHYuZWFjaCh0LGZ1bmN0aW9uKHQsbixpKXsoKHI9ZSh0LG4saSkpPHN8fHI9PT0xLzAmJm89PT0xLzApJiYobz10LHM9cil9KTtyZXR1cm4gb30sdi5zaHVmZmxlPWZ1bmN0aW9uKHQpe3JldHVybiB2LnNhbXBsZSh0LDEvMCl9LHYuc2FtcGxlPWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT1lfHxuKXJldHVybiBrKHQpfHwodD12LnZhbHVlcyh0KSksdFt2LnJhbmRvbSh0Lmxlbmd0aC0xKV07dmFyIGk9ayh0KT92LmNsb25lKHQpOnYudmFsdWVzKHQpLHI9QyhpKTtlPU1hdGgubWF4KE1hdGgubWluKGUsciksMCk7Zm9yKHZhciBvPXItMSxzPTA7czxlO3MrKyl7dmFyIGE9di5yYW5kb20ocyxvKSx1PWlbc107aVtzXT1pW2FdLGlbYV09dX1yZXR1cm4gaS5zbGljZSgwLGUpfSx2LnNvcnRCeT1mdW5jdGlvbih0LGUsbil7dmFyIGk9MDtyZXR1cm4gZT1fKGUsbiksdi5wbHVjayh2Lm1hcCh0LGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57dmFsdWU6dCxpbmRleDppKyssY3JpdGVyaWE6ZSh0LG4scil9fSkuc29ydChmdW5jdGlvbih0LGUpe3ZhciBuPXQuY3JpdGVyaWEsaT1lLmNyaXRlcmlhO2lmKG4hPT1pKXtpZihuPml8fHZvaWQgMD09PW4pcmV0dXJuIDE7aWYobjxpfHx2b2lkIDA9PT1pKXJldHVybi0xfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KSwidmFsdWUiKX07dmFyIFA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe3ZhciBvPWU/W1tdLFtdXTp7fTtyZXR1cm4gaT1fKGksciksdi5lYWNoKG4sZnVuY3Rpb24oZSxyKXt2YXIgcz1pKGUscixuKTt0KG8sZSxzKX0pLG99fTt2Lmdyb3VwQnk9UChmdW5jdGlvbih0LGUsbil7Uyh0LG4pP3Rbbl0ucHVzaChlKTp0W25dPVtlXX0pLHYuaW5kZXhCeT1QKGZ1bmN0aW9uKHQsZSxuKXt0W25dPWV9KSx2LmNvdW50Qnk9UChmdW5jdGlvbih0LGUsbil7Uyh0LG4pP3Rbbl0rKzp0W25dPTF9KTt2YXIgVD0vW15cdWQ4MDAtXHVkZmZmXXxbXHVkODAwLVx1ZGJmZl1bXHVkYzAwLVx1ZGZmZl18W1x1ZDgwMC1cdWRmZmZdL2c7di50b0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0P3YuaXNBcnJheSh0KT9oLmNhbGwodCk6di5pc1N0cmluZyh0KT90Lm1hdGNoKFQpOmsodCk/di5tYXAodCx2LmlkZW50aXR5KTp2LnZhbHVlcyh0KTpbXX0sdi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PzA6ayh0KT90Lmxlbmd0aDp2LmtleXModCkubGVuZ3RofSx2LnBhcnRpdGlvbj1QKGZ1bmN0aW9uKHQsZSxuKXt0W24/MDoxXS5wdXNoKGUpfSwhMCksdi5maXJzdD12LmhlYWQ9di50YWtlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dHx8dC5sZW5ndGg8MT9udWxsPT1lP3ZvaWQgMDpbXTpudWxsPT1lfHxuP3RbMF06di5pbml0aWFsKHQsdC5sZW5ndGgtZSl9LHYuaW5pdGlhbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguY2FsbCh0LDAsTWF0aC5tYXgoMCx0Lmxlbmd0aC0obnVsbD09ZXx8bj8xOmUpKSl9LHYubGFzdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXR8fHQubGVuZ3RoPDE/bnVsbD09ZT92b2lkIDA6W106bnVsbD09ZXx8bj90W3QubGVuZ3RoLTFdOnYucmVzdCh0LE1hdGgubWF4KDAsdC5sZW5ndGgtZSkpfSx2LnJlc3Q9di50YWlsPXYuZHJvcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguY2FsbCh0LG51bGw9PWV8fG4/MTplKX0sdi5jb21wYWN0PWZ1bmN0aW9uKHQpe3JldHVybiB2LmZpbHRlcih0LEJvb2xlYW4pfTt2YXIgaj1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9KGk9aXx8W10pLmxlbmd0aCxvPTAscz1DKHQpO288cztvKyspe3ZhciBhPXRbb107aWYoayhhKSYmKHYuaXNBcnJheShhKXx8di5pc0FyZ3VtZW50cyhhKSkpaWYoZSlmb3IodmFyIHU9MCxjPWEubGVuZ3RoO3U8YzspaVtyKytdPWFbdSsrXTtlbHNlIGooYSxlLG4saSkscj1pLmxlbmd0aDtlbHNlIG58fChpW3IrK109YSl9cmV0dXJuIGl9O3YuZmxhdHRlbj1mdW5jdGlvbih0LGUpe3JldHVybiBqKHQsZSwhMSl9LHYud2l0aG91dD13KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHYuZGlmZmVyZW5jZSh0LGUpfSksdi51bmlxPXYudW5pcXVlPWZ1bmN0aW9uKHQsZSxuLGkpe3YuaXNCb29sZWFuKGUpfHwoaT1uLG49ZSxlPSExKSxudWxsIT1uJiYobj1fKG4saSkpO2Zvcih2YXIgcj1bXSxvPVtdLHM9MCxhPUModCk7czxhO3MrKyl7dmFyIHU9dFtzXSxjPW4/bih1LHMsdCk6dTtlJiYhbj8ocyYmbz09PWN8fHIucHVzaCh1KSxvPWMpOm4/di5jb250YWlucyhvLGMpfHwoby5wdXNoKGMpLHIucHVzaCh1KSk6di5jb250YWlucyhyLHUpfHxyLnB1c2godSl9cmV0dXJuIHJ9LHYudW5pb249dyhmdW5jdGlvbih0KXtyZXR1cm4gdi51bmlxKGoodCwhMCwhMCkpfSksdi5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49YXJndW1lbnRzLmxlbmd0aCxpPTAscj1DKHQpO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoIXYuY29udGFpbnMoZSxvKSl7dmFyIHM7Zm9yKHM9MTtzPG4mJnYuY29udGFpbnMoYXJndW1lbnRzW3NdLG8pO3MrKyk7cz09PW4mJmUucHVzaChvKX19cmV0dXJuIGV9LHYuZGlmZmVyZW5jZT13KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9aihlLCEwLCEwKSx2LmZpbHRlcih0LGZ1bmN0aW9uKHQpe3JldHVybiF2LmNvbnRhaW5zKGUsdCl9KX0pLHYudW56aXA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQmJnYubWF4KHQsQykubGVuZ3RofHwwLG49QXJyYXkoZSksaT0wO2k8ZTtpKyspbltpXT12LnBsdWNrKHQsaSk7cmV0dXJuIG59LHYuemlwPXcodi51bnppcCksdi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49e30saT0wLHI9Qyh0KTtpPHI7aSsrKWU/blt0W2ldXT1lW2ldOm5bdFtpXVswXV09dFtpXVsxXTtyZXR1cm4gbn07dmFyIEk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtuPV8obixpKTtmb3IodmFyIHI9QyhlKSxvPXQ+MD8wOnItMTtvPj0wJiZvPHI7bys9dClpZihuKGVbb10sbyxlKSlyZXR1cm4gbztyZXR1cm4tMX19O3YuZmluZEluZGV4PUkoMSksdi5maW5kTGFzdEluZGV4PUkoLTEpLHYuc29ydGVkSW5kZXg9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPShuPV8obixpLDEpKShlKSxvPTAscz1DKHQpO288czspe3ZhciBhPU1hdGguZmxvb3IoKG8rcykvMik7bih0W2FdKTxyP289YSsxOnM9YX1yZXR1cm4gb307dmFyIEw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihpLHIsbyl7dmFyIHM9MCxhPUMoaSk7aWYoIm51bWJlciI9PXR5cGVvZiBvKXQ+MD9zPW8+PTA/bzpNYXRoLm1heChvK2Escyk6YT1vPj0wP01hdGgubWluKG8rMSxhKTpvK2ErMTtlbHNlIGlmKG4mJm8mJmEpcmV0dXJuIGlbbz1uKGkscildPT09cj9vOi0xO2lmKHIhPXIpcmV0dXJuKG89ZShoLmNhbGwoaSxzLGEpLHYuaXNOYU4pKT49MD9vK3M6LTE7Zm9yKG89dD4wP3M6YS0xO28+PTAmJm88YTtvKz10KWlmKGlbb109PT1yKXJldHVybiBvO3JldHVybi0xfX07di5pbmRleE9mPUwoMSx2LmZpbmRJbmRleCx2LnNvcnRlZEluZGV4KSx2Lmxhc3RJbmRleE9mPUwoLTEsdi5maW5kTGFzdEluZGV4KSx2LnJhbmdlPWZ1bmN0aW9uKHQsZSxuKXtudWxsPT1lJiYoZT10fHwwLHQ9MCksbnx8KG49ZTx0Py0xOjEpO2Zvcih2YXIgaT1NYXRoLm1heChNYXRoLmNlaWwoKGUtdCkvbiksMCkscj1BcnJheShpKSxvPTA7bzxpO28rKyx0Kz1uKXJbb109dDtyZXR1cm4gcn0sdi5jaHVuaz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PWV8fGU8MSlyZXR1cm5bXTtmb3IodmFyIG49W10saT0wLHI9dC5sZW5ndGg7aTxyOyluLnB1c2goaC5jYWxsKHQsaSxpKz1lKSk7cmV0dXJuIG59O3ZhciBCPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYoIShpIGluc3RhbmNlb2YgZSkpcmV0dXJuIHQuYXBwbHkobixyKTt2YXIgbz14KHQucHJvdG90eXBlKSxzPXQuYXBwbHkobyxyKTtyZXR1cm4gdi5pc09iamVjdChzKT9zOm99O3YuYmluZD13KGZ1bmN0aW9uKHQsZSxuKXtpZighdi5pc0Z1bmN0aW9uKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkJpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbiIpO3ZhciBpPXcoZnVuY3Rpb24ocil7cmV0dXJuIEIodCxpLGUsdGhpcyxuLmNvbmNhdChyKSl9KTtyZXR1cm4gaX0pLHYucGFydGlhbD13KGZ1bmN0aW9uKHQsZSl7dmFyIG49di5wYXJ0aWFsLnBsYWNlaG9sZGVyLGk9ZnVuY3Rpb24oKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoLHM9QXJyYXkobyksYT0wO2E8bzthKyspc1thXT1lW2FdPT09bj9hcmd1bWVudHNbcisrXTplW2FdO2Zvcig7cjxhcmd1bWVudHMubGVuZ3RoOylzLnB1c2goYXJndW1lbnRzW3IrK10pO3JldHVybiBCKHQsaSx0aGlzLHRoaXMscyl9O3JldHVybiBpfSksdi5wYXJ0aWFsLnBsYWNlaG9sZGVyPXYsdi5iaW5kQWxsPXcoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT1qKGUsITEsITEpKS5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiYmluZEFsbCBtdXN0IGJlIHBhc3NlZCBmdW5jdGlvbiBuYW1lcyIpO2Zvcig7bi0tOyl7dmFyIGk9ZVtuXTt0W2ldPXYuYmluZCh0W2ldLHQpfX0pLHYubWVtb2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKGkpe3ZhciByPW4uY2FjaGUsbz0iIisoZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKTtyZXR1cm4gUyhyLG8pfHwocltvXT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscltvXX07cmV0dXJuIG4uY2FjaGU9e30sbn0sdi5kZWxheT13KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KG51bGwsbil9LGUpfSksdi5kZWZlcj12LnBhcnRpYWwodi5kZWxheSx2LDEpLHYudGhyb3R0bGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzLGE9MDtufHwobj17fSk7dmFyIHU9ZnVuY3Rpb24oKXthPSExPT09bi5sZWFkaW5nPzA6di5ub3coKSxpPW51bGwscz10LmFwcGx5KHIsbyksaXx8KHI9bz1udWxsKX0sYz1mdW5jdGlvbigpe3ZhciBjPXYubm93KCk7YXx8ITEhPT1uLmxlYWRpbmd8fChhPWMpO3ZhciBoPWUtKGMtYSk7cmV0dXJuIHI9dGhpcyxvPWFyZ3VtZW50cyxoPD0wfHxoPmU/KGkmJihjbGVhclRpbWVvdXQoaSksaT1udWxsKSxhPWMscz10LmFwcGx5KHIsbyksaXx8KHI9bz1udWxsKSk6aXx8ITE9PT1uLnRyYWlsaW5nfHwoaT1zZXRUaW1lb3V0KHUsaCkpLHN9O3JldHVybiBjLmNhbmNlbD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChpKSxhPTAsaT1yPW89bnVsbH0sY30sdi5kZWJvdW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPWZ1bmN0aW9uKGUsbil7aT1udWxsLG4mJihyPXQuYXBwbHkoZSxuKSl9LHM9dyhmdW5jdGlvbihzKXtpZihpJiZjbGVhclRpbWVvdXQoaSksbil7dmFyIGE9IWk7aT1zZXRUaW1lb3V0KG8sZSksYSYmKHI9dC5hcHBseSh0aGlzLHMpKX1lbHNlIGk9di5kZWxheShvLGUsdGhpcyxzKTtyZXR1cm4gcn0pO3JldHVybiBzLmNhbmNlbD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChpKSxpPW51bGx9LHN9LHYud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB2LnBhcnRpYWwoZSx0KX0sdi5uZWdhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sdi5jb21wb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49ZSxpPXRbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpO24tLTspaT10W25dLmNhbGwodGhpcyxpKTtyZXR1cm4gaX19LHYuYWZ0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtpZigtLXQ8MSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx2LmJlZm9yZT1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiBmdW5jdGlvbigpe3JldHVybi0tdD4wJiYobj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdDw9MSYmKGU9bnVsbCksbn19LHYub25jZT12LnBhcnRpYWwodi5iZWZvcmUsMiksdi5yZXN0QXJndW1lbnRzPXc7dmFyIEQ9IXt0b1N0cmluZzpudWxsfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgidG9TdHJpbmciKSxSPVsidmFsdWVPZiIsImlzUHJvdG90eXBlT2YiLCJ0b1N0cmluZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiaGFzT3duUHJvcGVydHkiLCJ0b0xvY2FsZVN0cmluZyJdLHo9ZnVuY3Rpb24odCxlKXt2YXIgbj1SLmxlbmd0aCxpPXQuY29uc3RydWN0b3Iscj12LmlzRnVuY3Rpb24oaSkmJmkucHJvdG90eXBlfHxhLG89ImNvbnN0cnVjdG9yIjtmb3IoUyh0LG8pJiYhdi5jb250YWlucyhlLG8pJiZlLnB1c2gobyk7bi0tOykobz1SW25dKWluIHQmJnRbb10hPT1yW29dJiYhdi5jb250YWlucyhlLG8pJiZlLnB1c2gobyl9O3Yua2V5cz1mdW5jdGlvbih0KXtpZighdi5pc09iamVjdCh0KSlyZXR1cm5bXTtpZihwKXJldHVybiBwKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KVModCxuKSYmZS5wdXNoKG4pO3JldHVybiBEJiZ6KHQsZSksZX0sdi5hbGxLZXlzPWZ1bmN0aW9uKHQpe2lmKCF2LmlzT2JqZWN0KHQpKXJldHVybltdO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gRCYmeih0LGUpLGV9LHYudmFsdWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT12LmtleXModCksbj1lLmxlbmd0aCxpPUFycmF5KG4pLHI9MDtyPG47cisrKWlbcl09dFtlW3JdXTtyZXR1cm4gaX0sdi5tYXBPYmplY3Q9ZnVuY3Rpb24odCxlLG4pe2U9XyhlLG4pO2Zvcih2YXIgaT12LmtleXModCkscj1pLmxlbmd0aCxvPXt9LHM9MDtzPHI7cysrKXt2YXIgYT1pW3NdO29bYV09ZSh0W2FdLGEsdCl9cmV0dXJuIG99LHYucGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXYua2V5cyh0KSxuPWUubGVuZ3RoLGk9QXJyYXkobikscj0wO3I8bjtyKyspaVtyXT1bZVtyXSx0W2Vbcl1dXTtyZXR1cm4gaX0sdi5pbnZlcnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LG49di5rZXlzKHQpLGk9MCxyPW4ubGVuZ3RoO2k8cjtpKyspZVt0W25baV1dXT1uW2ldO3JldHVybiBlfSx2LmZ1bmN0aW9ucz12Lm1ldGhvZHM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpdi5pc0Z1bmN0aW9uKHRbbl0pJiZlLnB1c2gobik7cmV0dXJuIGUuc29ydCgpfTt2YXIgTj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGUmJihuPU9iamVjdChuKSksaTwyfHxudWxsPT1uKXJldHVybiBuO2Zvcih2YXIgcj0xO3I8aTtyKyspZm9yKHZhciBvPWFyZ3VtZW50c1tyXSxzPXQobyksYT1zLmxlbmd0aCx1PTA7dTxhO3UrKyl7dmFyIGM9c1t1XTtlJiZ2b2lkIDAhPT1uW2NdfHwobltjXT1vW2NdKX1yZXR1cm4gbn19O3YuZXh0ZW5kPU4odi5hbGxLZXlzKSx2LmV4dGVuZE93bj12LmFzc2lnbj1OKHYua2V5cyksdi5maW5kS2V5PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGkscj12LmtleXModCksbz0wLHM9ci5sZW5ndGg7bzxzO28rKylpZihlKHRbaT1yW29dXSxpLHQpKXJldHVybiBpfTt2YXIgVyxxLEg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluIG59O3YucGljaz13KGZ1bmN0aW9uKHQsZSl7dmFyIG49e30saT1lWzBdO2lmKG51bGw9PXQpcmV0dXJuIG47di5pc0Z1bmN0aW9uKGkpPyhlLmxlbmd0aD4xJiYoaT15KGksZVsxXSkpLGU9di5hbGxLZXlzKHQpKTooaT1ILGU9aihlLCExLCExKSx0PU9iamVjdCh0KSk7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXt2YXIgcz1lW3JdLGE9dFtzXTtpKGEscyx0KSYmKG5bc109YSl9cmV0dXJuIG59KSx2Lm9taXQ9dyhmdW5jdGlvbih0LGUpe3ZhciBuLGk9ZVswXTtyZXR1cm4gdi5pc0Z1bmN0aW9uKGkpPyhpPXYubmVnYXRlKGkpLGUubGVuZ3RoPjEmJihuPWVbMV0pKTooZT12Lm1hcChqKGUsITEsITEpLFN0cmluZyksaT1mdW5jdGlvbih0LG4pe3JldHVybiF2LmNvbnRhaW5zKGUsbil9KSx2LnBpY2sodCxpLG4pfSksdi5kZWZhdWx0cz1OKHYuYWxsS2V5cywhMCksdi5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj14KHQpO3JldHVybiBlJiZ2LmV4dGVuZE93bihuLGUpLG59LHYuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHYuaXNPYmplY3QodCk/di5pc0FycmF5KHQpP3Quc2xpY2UoKTp2LmV4dGVuZCh7fSx0KTp0fSx2LnRhcD1mdW5jdGlvbih0LGUpe3JldHVybiBlKHQpLHR9LHYuaXNNYXRjaD1mdW5jdGlvbih0LGUpe3ZhciBuPXYua2V5cyhlKSxpPW4ubGVuZ3RoO2lmKG51bGw9PXQpcmV0dXJuIWk7Zm9yKHZhciByPU9iamVjdCh0KSxvPTA7bzxpO28rKyl7dmFyIHM9bltvXTtpZihlW3NdIT09cltzXXx8IShzIGluIHIpKXJldHVybiExfXJldHVybiEwfSxXPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQ9PT1lKXJldHVybiAwIT09dHx8MS90PT0xL2U7aWYobnVsbD09dHx8bnVsbD09ZSlyZXR1cm4hMTtpZih0IT10KXJldHVybiBlIT1lO3ZhciByPXR5cGVvZiB0O3JldHVybigiZnVuY3Rpb24iPT09cnx8Im9iamVjdCI9PT1yfHwib2JqZWN0Ij09dHlwZW9mIGUpJiZxKHQsZSxuLGkpfSxxPWZ1bmN0aW9uKHQsZSxuLGkpe3QgaW5zdGFuY2VvZiB2JiYodD10Ll93cmFwcGVkKSxlIGluc3RhbmNlb2YgdiYmKGU9ZS5fd3JhcHBlZCk7dmFyIHI9bC5jYWxsKHQpO2lmKHIhPT1sLmNhbGwoZSkpcmV0dXJuITE7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIiIrdD09IiIrZTtjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuK3QhPSt0PytlIT0rZTowPT0rdD8xLyt0PT0xL2U6K3Q9PStlO2Nhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpyZXR1cm4rdD09K2U7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOnJldHVybiB1LnZhbHVlT2YuY2FsbCh0KT09PXUudmFsdWVPZi5jYWxsKGUpfXZhciBvPSJbb2JqZWN0IEFycmF5XSI9PT1yO2lmKCFvKXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgcz10LmNvbnN0cnVjdG9yLGE9ZS5jb25zdHJ1Y3RvcjtpZihzIT09YSYmISh2LmlzRnVuY3Rpb24ocykmJnMgaW5zdGFuY2VvZiBzJiZ2LmlzRnVuY3Rpb24oYSkmJmEgaW5zdGFuY2VvZiBhKSYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBlKXJldHVybiExfWk9aXx8W107Zm9yKHZhciBjPShuPW58fFtdKS5sZW5ndGg7Yy0tOylpZihuW2NdPT09dClyZXR1cm4gaVtjXT09PWU7aWYobi5wdXNoKHQpLGkucHVzaChlKSxvKXtpZigoYz10Lmxlbmd0aCkhPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IoO2MtLTspaWYoIVcodFtjXSxlW2NdLG4saSkpcmV0dXJuITF9ZWxzZXt2YXIgaCxkPXYua2V5cyh0KTtpZihjPWQubGVuZ3RoLHYua2V5cyhlKS5sZW5ndGghPT1jKXJldHVybiExO2Zvcig7Yy0tOylpZihoPWRbY10sIVMoZSxoKXx8IVcodFtoXSxlW2hdLG4saSkpcmV0dXJuITF9cmV0dXJuIG4ucG9wKCksaS5wb3AoKSwhMH0sdi5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFcodCxlKX0sdi5pc0VtcHR5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwoayh0KSYmKHYuaXNBcnJheSh0KXx8di5pc1N0cmluZyh0KXx8di5pc0FyZ3VtZW50cyh0KSk/MD09PXQubGVuZ3RoOjA9PT12LmtleXModCkubGVuZ3RoKX0sdi5pc0VsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8MSE9PXQubm9kZVR5cGUpfSx2LmlzQXJyYXk9Znx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PWwuY2FsbCh0KX0sdi5pc09iamVjdD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4iZnVuY3Rpb24iPT09ZXx8Im9iamVjdCI9PT1lJiYhIXR9LHYuZWFjaChbIkFyZ3VtZW50cyIsIkZ1bmN0aW9uIiwiU3RyaW5nIiwiTnVtYmVyIiwiRGF0ZSIsIlJlZ0V4cCIsIkVycm9yIiwiU3ltYm9sIiwiTWFwIiwiV2Vha01hcCIsIlNldCIsIldlYWtTZXQiXSxmdW5jdGlvbih0KXt2WyJpcyIrdF09ZnVuY3Rpb24oZSl7cmV0dXJuIGwuY2FsbChlKT09PSJbb2JqZWN0ICIrdCsiXSJ9fSksdi5pc0FyZ3VtZW50cyhhcmd1bWVudHMpfHwodi5pc0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gUyh0LCJjYWxsZWUiKX0pO3ZhciBGPXIuZG9jdW1lbnQmJnIuZG9jdW1lbnQuY2hpbGROb2Rlczsib2JqZWN0IiE9dHlwZW9mIEludDhBcnJheSYmImZ1bmN0aW9uIiE9dHlwZW9mIEYmJih2LmlzRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR8fCExfSksdi5pc0Zpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hdi5pc1N5bWJvbCh0KSYmaXNGaW5pdGUodCkmJiFpc05hTihwYXJzZUZsb2F0KHQpKX0sdi5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gdi5pc051bWJlcih0KSYmaXNOYU4odCl9LHYuaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHwiW29iamVjdCBCb29sZWFuXSI9PT1sLmNhbGwodCl9LHYuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0sdi5pc1VuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH0sdi5oYXM9ZnVuY3Rpb24odCxlKXtpZighdi5pc0FycmF5KGUpKXJldHVybiBTKHQsZSk7Zm9yKHZhciBuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXt2YXIgcj1lW2ldO2lmKG51bGw9PXR8fCFkLmNhbGwodCxyKSlyZXR1cm4hMTt0PXRbcl19cmV0dXJuISFufSx2Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gci5fPW8sdGhpc30sdi5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdi5jb25zdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHYubm9vcD1mdW5jdGlvbigpe30sdi5wcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4gdi5pc0FycmF5KHQpP2Z1bmN0aW9uKGUpe3JldHVybiBFKGUsdCl9Ok0odCl9LHYucHJvcGVydHlPZj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9mdW5jdGlvbigpe306ZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNBcnJheShlKT9FKHQsZSk6dFtlXX19LHYubWF0Y2hlcj12Lm1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9di5leHRlbmRPd24oe30sdCksZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNNYXRjaChlLHQpfX0sdi50aW1lcz1mdW5jdGlvbih0LGUsbil7dmFyIGk9QXJyYXkoTWF0aC5tYXgoMCx0KSk7ZT15KGUsbiwxKTtmb3IodmFyIHI9MDtyPHQ7cisrKWlbcl09ZShyKTtyZXR1cm4gaX0sdi5yYW5kb209ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLXQrMSkpfSx2Lm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFY9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCJgIjoiJiN4NjA7In0sVT12LmludmVydChWKSxLPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSxuPSIoPzoiK3Yua2V5cyh0KS5qb2luKCJ8IikrIikiLGk9UmVnRXhwKG4pLHI9UmVnRXhwKG4sImciKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8iIjoiIit0LGkudGVzdCh0KT90LnJlcGxhY2UocixlKTp0fX07di5lc2NhcGU9SyhWKSx2LnVuZXNjYXBlPUsoVSksdi5yZXN1bHQ9ZnVuY3Rpb24odCxlLG4pe3YuaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgaT1lLmxlbmd0aDtpZighaSlyZXR1cm4gdi5pc0Z1bmN0aW9uKG4pP24uY2FsbCh0KTpuO2Zvcih2YXIgcj0wO3I8aTtyKyspe3ZhciBvPW51bGw9PXQ/dm9pZCAwOnRbZVtyXV07dm9pZCAwPT09byYmKG89bixyPWkpLHQ9di5pc0Z1bmN0aW9uKG8pP28uY2FsbCh0KTpvfXJldHVybiB0fTt2YXIgWT0wO3YudW5pcXVlSWQ9ZnVuY3Rpb24odCl7dmFyIGU9KytZKyIiO3JldHVybiB0P3QrZTplfSx2LnRlbXBsYXRlU2V0dGluZ3M9e2V2YWx1YXRlOi88JShbXHNcU10rPyklPi9nLGludGVycG9sYXRlOi88JT0oW1xzXFNdKz8pJT4vZyxlc2NhcGU6LzwlLShbXHNcU10rPyklPi9nfTt2YXIgWD0vKC4pXi8sJD17IiciOiInIiwiXFwiOiJcXCIsIlxyIjoiciIsIlxuIjoibiIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxHPS9cXHwnfFxyfFxufFx1MjAyOHxcdTIwMjkvZyxKPWZ1bmN0aW9uKHQpe3JldHVybiJcXCIrJFt0XX07di50ZW1wbGF0ZT1mdW5jdGlvbih0LGUsbil7IWUmJm4mJihlPW4pLGU9di5kZWZhdWx0cyh7fSxlLHYudGVtcGxhdGVTZXR0aW5ncyk7dmFyIGkscj1SZWdFeHAoWyhlLmVzY2FwZXx8WCkuc291cmNlLChlLmludGVycG9sYXRlfHxYKS5zb3VyY2UsKGUuZXZhbHVhdGV8fFgpLnNvdXJjZV0uam9pbigifCIpKyJ8JCIsImciKSxvPTAscz0iX19wKz0nIjt0LnJlcGxhY2UocixmdW5jdGlvbihlLG4saSxyLGEpe3JldHVybiBzKz10LnNsaWNlKG8sYSkucmVwbGFjZShHLEopLG89YStlLmxlbmd0aCxuP3MrPSInK1xuKChfX3Q9KCIrbisiKSk9PW51bGw/Jyc6Xy5lc2NhcGUoX190KSkrXG4nIjppP3MrPSInK1xuKChfX3Q9KCIraSsiKSk9PW51bGw/Jyc6X190KStcbiciOnImJihzKz0iJztcbiIrcisiXG5fX3ArPSciKSxlfSkscys9Iic7XG4iLGUudmFyaWFibGV8fChzPSJ3aXRoKG9ianx8e30pe1xuIitzKyJ9XG4iKSxzPSJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4scHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcbiIrcysicmV0dXJuIF9fcDtcbiI7dHJ5e2k9bmV3IEZ1bmN0aW9uKGUudmFyaWFibGV8fCJvYmoiLCJfIixzKX1jYXRjaCh0KXt0aHJvdyB0LnNvdXJjZT1zLHR9dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGkuY2FsbCh0aGlzLHQsdil9LHU9ZS52YXJpYWJsZXx8Im9iaiI7cmV0dXJuIGEuc291cmNlPSJmdW5jdGlvbigiK3UrIil7XG4iK3MrIn0iLGF9LHYuY2hhaW49ZnVuY3Rpb24odCl7dmFyIGU9dih0KTtyZXR1cm4gZS5fY2hhaW49ITAsZX07dmFyIFo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2hhaW4/dihlKS5jaGFpbigpOmV9O3YubWl4aW49ZnVuY3Rpb24odCl7cmV0dXJuIHYuZWFjaCh2LmZ1bmN0aW9ucyh0KSxmdW5jdGlvbihlKXt2YXIgbj12W2VdPXRbZV07di5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5fd3JhcHBlZF07cmV0dXJuIGMuYXBwbHkodCxhcmd1bWVudHMpLFoodGhpcyxuLmFwcGx5KHYsdCkpfX0pLHZ9LHYubWl4aW4odiksdi5lYWNoKFsicG9wIiwicHVzaCIsInJldmVyc2UiLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sZnVuY3Rpb24odCl7dmFyIGU9c1t0XTt2LnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX3dyYXBwZWQ7cmV0dXJuIGUuYXBwbHkobixhcmd1bWVudHMpLCJzaGlmdCIhPT10JiYic3BsaWNlIiE9PXR8fDAhPT1uLmxlbmd0aHx8ZGVsZXRlIG5bMF0sWih0aGlzLG4pfX0pLHYuZWFjaChbImNvbmNhdCIsImpvaW4iLCJzbGljZSJdLGZ1bmN0aW9uKHQpe3ZhciBlPXNbdF07di5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gWih0aGlzLGUuYXBwbHkodGhpcy5fd3JhcHBlZCxhcmd1bWVudHMpKX19KSx2LnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93cmFwcGVkfSx2LnByb3RvdHlwZS52YWx1ZU9mPXYucHJvdG90eXBlLnRvSlNPTj12LnByb3RvdHlwZS52YWx1ZSx2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCl9LHZvaWQgMD09PShpPWZ1bmN0aW9uKCl7cmV0dXJuIHZ9LmFwcGx5KGUsW10pKXx8KG4uZXhwb3J0cz1pKX0oKX0pLmNhbGwodGhpcyxuKDEzKSxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oNSksdT1uKDMwKSxjPW4oMTEpLGg9big3NyksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuX2ZsYWdzPTAsdGhpcy5fbGF5b3V0PW51bGwsdGhpcy5fcGFyZW50PW51bGwsdGhpcy5fZGlzcG9zZWQ9bmV3IGMuU2lnbmFsKHRoaXMpLHRoaXMubm9kZT1vLmNyZWF0ZU5vZGUodCksdGhpcy5hZGRDbGFzcygicC1XaWRnZXQiKX1yZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuaXNEaXNwb3NlZHx8KHRoaXMuc2V0RmxhZyh0LkZsYWcuSXNEaXNwb3NlZCksdGhpcy5fZGlzcG9zZWQuZW1pdCh2b2lkIDApLHRoaXMucGFyZW50P3RoaXMucGFyZW50PW51bGw6dGhpcy5pc0F0dGFjaGVkJiZ0LmRldGFjaCh0aGlzKSx0aGlzLl9sYXlvdXQmJih0aGlzLl9sYXlvdXQuZGlzcG9zZSgpLHRoaXMuX2xheW91dD1udWxsKSxjLlNpZ25hbC5jbGVhckRhdGEodGhpcyksYS5NZXNzYWdlTG9vcC5jbGVhckRhdGEodGhpcyksdS5BdHRhY2hlZFByb3BlcnR5LmNsZWFyRGF0YSh0aGlzKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGVzdEZsYWcodC5GbGFnLklzRGlzcG9zZWQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBdHRhY2hlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc0F0dGFjaGVkKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzSGlkZGVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGVzdEZsYWcodC5GbGFnLklzSGlkZGVuKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVmlzaWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc1Zpc2libGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidGl0bGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby50aXRsZVByb3BlcnR5LmdldCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5pZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubm9kZS5pZD10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGF0YXNldCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZGF0YXNldH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBhcmVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJlbnR9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzLl9wYXJlbnQhPT1lKXtpZihlJiZ0aGlzLmNvbnRhaW5zKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJlbnQgd2lkZ2V0LiIpO2lmKHRoaXMuX3BhcmVudCYmIXRoaXMuX3BhcmVudC5pc0Rpc3Bvc2VkKXt2YXIgbj1uZXcgdC5DaGlsZE1lc3NhZ2UoImNoaWxkLXJlbW92ZWQiLHRoaXMpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5fcGFyZW50LG4pfWlmKHRoaXMuX3BhcmVudD1lLHRoaXMuX3BhcmVudCYmIXRoaXMuX3BhcmVudC5pc0Rpc3Bvc2VkKXtuPW5ldyB0LkNoaWxkTWVzc2FnZSgiY2hpbGQtYWRkZWQiLHRoaXMpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5fcGFyZW50LG4pfXRoaXMuaXNEaXNwb3NlZHx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLlBhcmVudENoYW5nZWQpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxheW91dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXlvdXR9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzLl9sYXlvdXQhPT1lKXtpZih0aGlzLnRlc3RGbGFnKHQuRmxhZy5EaXNhbGxvd0xheW91dCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHdpZGdldCBsYXlvdXQuIik7aWYodGhpcy5fbGF5b3V0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNoYW5nZSB3aWRnZXQgbGF5b3V0LiIpO2lmKGUucGFyZW50KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNoYW5nZSBsYXlvdXQgcGFyZW50LiIpO3RoaXMuX2xheW91dD1lLGUucGFyZW50PXRoaXN9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheW91dD90aGlzLl9sYXlvdXQuaXRlcigpOnMuZW1wdHkoKX0sdC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ7ZTtlPWUuX3BhcmVudClpZihlPT09dGhpcylyZXR1cm4hMDtyZXR1cm4hMX0sdC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZS5jbGFzc0xpc3QuY29udGFpbnModCl9LHQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQpe3RoaXMubm9kZS5jbGFzc0xpc3QuYWRkKHQpfSx0LnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbih0KXt0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSh0KX0sdC5wcm90b3R5cGUudG9nZ2xlQ2xhc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4hMD09PWU/KHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKHQpLCEwKTohMT09PWU/KHRoaXMubm9kZS5jbGFzc0xpc3QucmVtb3ZlKHQpLCExKTp0aGlzLm5vZGUuY2xhc3NMaXN0LnRvZ2dsZSh0KX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLHQuTXNnLlVwZGF0ZVJlcXVlc3QpfSx0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24oKXthLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKHRoaXMsdC5Nc2cuRml0UmVxdWVzdCl9LHQucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLHQuTXNnLkFjdGl2YXRlUmVxdWVzdCl9LHQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkNsb3NlUmVxdWVzdCl9LHQucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtpZih0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc0hpZGRlbikmJighdGhpcy5pc0F0dGFjaGVkfHx0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmlzVmlzaWJsZXx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkJlZm9yZVNob3cpLHRoaXMuY2xlYXJGbGFnKHQuRmxhZy5Jc0hpZGRlbiksdGhpcy5yZW1vdmVDbGFzcygicC1tb2QtaGlkZGVuIiksIXRoaXMuaXNBdHRhY2hlZHx8dGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5pc1Zpc2libGV8fGEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyx0Lk1zZy5BZnRlclNob3cpLHRoaXMucGFyZW50KSl7dmFyIGU9bmV3IHQuQ2hpbGRNZXNzYWdlKCJjaGlsZC1zaG93biIsdGhpcyk7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudCxlKX19LHQucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZighdGhpcy50ZXN0RmxhZyh0LkZsYWcuSXNIaWRkZW4pJiYoIXRoaXMuaXNBdHRhY2hlZHx8dGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5pc1Zpc2libGV8fGEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyx0Lk1zZy5CZWZvcmVIaWRlKSx0aGlzLnNldEZsYWcodC5GbGFnLklzSGlkZGVuKSx0aGlzLmFkZENsYXNzKCJwLW1vZC1oaWRkZW4iKSwhdGhpcy5pc0F0dGFjaGVkfHx0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmlzVmlzaWJsZXx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkFmdGVySGlkZSksdGhpcy5wYXJlbnQpKXt2YXIgZT1uZXcgdC5DaGlsZE1lc3NhZ2UoImNoaWxkLWhpZGRlbiIsdGhpcyk7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudCxlKX19LHQucHJvdG90eXBlLnNldEhpZGRlbj1mdW5jdGlvbih0KXt0P3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfSx0LnByb3RvdHlwZS50ZXN0RmxhZz1mdW5jdGlvbih0KXtyZXR1cm4gMCE9KHRoaXMuX2ZsYWdzJnQpfSx0LnByb3RvdHlwZS5zZXRGbGFnPWZ1bmN0aW9uKHQpe3RoaXMuX2ZsYWdzfD10fSx0LnByb3RvdHlwZS5jbGVhckZsYWc9ZnVuY3Rpb24odCl7dGhpcy5fZmxhZ3MmPX50fSx0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXtzd2l0Y2goZS50eXBlKXtjYXNlInJlc2l6ZSI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vblJlc2l6ZShlKTticmVhaztjYXNlInVwZGF0ZS1yZXF1ZXN0Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uVXBkYXRlUmVxdWVzdChlKTticmVhaztjYXNlImZpdC1yZXF1ZXN0Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uRml0UmVxdWVzdChlKTticmVhaztjYXNlImJlZm9yZS1zaG93Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQmVmb3JlU2hvdyhlKTticmVhaztjYXNlImFmdGVyLXNob3ciOnRoaXMuc2V0RmxhZyh0LkZsYWcuSXNWaXNpYmxlKSx0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQWZ0ZXJTaG93KGUpO2JyZWFrO2Nhc2UiYmVmb3JlLWhpZGUiOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25CZWZvcmVIaWRlKGUpO2JyZWFrO2Nhc2UiYWZ0ZXItaGlkZSI6dGhpcy5jbGVhckZsYWcodC5GbGFnLklzVmlzaWJsZSksdGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFmdGVySGlkZShlKTticmVhaztjYXNlImJlZm9yZS1hdHRhY2giOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25CZWZvcmVBdHRhY2goZSk7YnJlYWs7Y2FzZSJhZnRlci1hdHRhY2giOnRoaXMuaXNIaWRkZW58fHRoaXMucGFyZW50JiYhdGhpcy5wYXJlbnQuaXNWaXNpYmxlfHx0aGlzLnNldEZsYWcodC5GbGFnLklzVmlzaWJsZSksdGhpcy5zZXRGbGFnKHQuRmxhZy5Jc0F0dGFjaGVkKSx0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQWZ0ZXJBdHRhY2goZSk7YnJlYWs7Y2FzZSJiZWZvcmUtZGV0YWNoIjp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQmVmb3JlRGV0YWNoKGUpO2JyZWFrO2Nhc2UiYWZ0ZXItZGV0YWNoIjp0aGlzLmNsZWFyRmxhZyh0LkZsYWcuSXNWaXNpYmxlKSx0aGlzLmNsZWFyRmxhZyh0LkZsYWcuSXNBdHRhY2hlZCksdGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFmdGVyRGV0YWNoKGUpO2JyZWFrO2Nhc2UiYWN0aXZhdGUtcmVxdWVzdCI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFjdGl2YXRlUmVxdWVzdChlKTticmVhaztjYXNlImNsb3NlLXJlcXVlc3QiOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25DbG9zZVJlcXVlc3QoZSk7YnJlYWs7Y2FzZSJjaGlsZC1hZGRlZCI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkNoaWxkQWRkZWQoZSk7YnJlYWs7Y2FzZSJjaGlsZC1yZW1vdmVkIjp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQ2hpbGRSZW1vdmVkKGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub3RpZnlMYXlvdXQoZSl9fSx0LnByb3RvdHlwZS5ub3RpZnlMYXlvdXQ9ZnVuY3Rpb24odCl7dGhpcy5fbGF5b3V0JiZ0aGlzLl9sYXlvdXQucHJvY2Vzc1BhcmVudE1lc3NhZ2UodCl9LHQucHJvdG90eXBlLm9uQ2xvc2VSZXF1ZXN0PWZ1bmN0aW9uKGUpe3RoaXMucGFyZW50P3RoaXMucGFyZW50PW51bGw6dGhpcy5pc0F0dGFjaGVkJiZ0LmRldGFjaCh0aGlzKX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkZpdFJlcXVlc3Q9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJTaG93PWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25CZWZvcmVIaWRlPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25BZnRlckhpZGU9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJBdHRhY2g9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkJlZm9yZURldGFjaD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkNoaWxkQWRkZWQ9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt9LHR9KCk7ZS5XaWRnZXQ9bCxmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7dFt0LklzRGlzcG9zZWQ9MV09IklzRGlzcG9zZWQiLHRbdC5Jc0F0dGFjaGVkPTJdPSJJc0F0dGFjaGVkIix0W3QuSXNIaWRkZW49NF09IklzSGlkZGVuIix0W3QuSXNWaXNpYmxlPThdPSJJc1Zpc2libGUiLHRbdC5EaXNhbGxvd0xheW91dD0xNl09IkRpc2FsbG93TGF5b3V0In0odC5GbGFnfHwodC5GbGFnPXt9KSksZnVuY3Rpb24odCl7dC5CZWZvcmVTaG93PW5ldyBhLk1lc3NhZ2UoImJlZm9yZS1zaG93IiksdC5BZnRlclNob3c9bmV3IGEuTWVzc2FnZSgiYWZ0ZXItc2hvdyIpLHQuQmVmb3JlSGlkZT1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtaGlkZSIpLHQuQWZ0ZXJIaWRlPW5ldyBhLk1lc3NhZ2UoImFmdGVyLWhpZGUiKSx0LkJlZm9yZUF0dGFjaD1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtYXR0YWNoIiksdC5BZnRlckF0dGFjaD1uZXcgYS5NZXNzYWdlKCJhZnRlci1hdHRhY2giKSx0LkJlZm9yZURldGFjaD1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtZGV0YWNoIiksdC5BZnRlckRldGFjaD1uZXcgYS5NZXNzYWdlKCJhZnRlci1kZXRhY2giKSx0LlBhcmVudENoYW5nZWQ9bmV3IGEuTWVzc2FnZSgicGFyZW50LWNoYW5nZWQiKSx0LlVwZGF0ZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJ1cGRhdGUtcmVxdWVzdCIpLHQuRml0UmVxdWVzdD1uZXcgYS5Db25mbGF0YWJsZU1lc3NhZ2UoImZpdC1yZXF1ZXN0IiksdC5BY3RpdmF0ZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJhY3RpdmF0ZS1yZXF1ZXN0IiksdC5DbG9zZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJjbG9zZS1yZXF1ZXN0Iil9KHQuTXNnfHwodC5Nc2c9e30pKTt2YXIgZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIGkuY2hpbGQ9bixpfXJldHVybiByKGUsdCksZX0oYS5NZXNzYWdlKTt0LkNoaWxkTWVzc2FnZT1lO3ZhciBuPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcywicmVzaXplIil8fHRoaXM7cmV0dXJuIGkud2lkdGg9ZSxpLmhlaWdodD1uLGl9cmV0dXJuIHIoZSx0KSxlfShhLk1lc3NhZ2UpO3QuUmVzaXplTWVzc2FnZT1uLGZ1bmN0aW9uKHQpe3QuVW5rbm93blNpemU9bmV3IHQoLTEsLTEpfShuPXQuUmVzaXplTWVzc2FnZXx8KHQuUmVzaXplTWVzc2FnZT17fSkpLHQuYXR0YWNoPWZ1bmN0aW9uKGUsbixpKXtpZih2b2lkIDA9PT1pJiYoaT1udWxsKSxlLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBhdHRhY2ggYSBjaGlsZCB3aWRnZXQuIik7aWYoZS5pc0F0dGFjaGVkfHxkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGUubm9kZSkpdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgaXMgYWxyZWFkeSBhdHRhY2hlZC4iKTtpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhuKSl0aHJvdyBuZXcgRXJyb3IoIkhvc3QgaXMgbm90IGF0dGFjaGVkLiIpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0Lk1zZy5CZWZvcmVBdHRhY2gpLG4uaW5zZXJ0QmVmb3JlKGUubm9kZSxpKSxhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdC5Nc2cuQWZ0ZXJBdHRhY2gpfSx0LmRldGFjaD1mdW5jdGlvbihlKXtpZihlLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBkZXRhY2ggYSBjaGlsZCB3aWRnZXQuIik7aWYoIWUuaXNBdHRhY2hlZHx8IWRvY3VtZW50LmJvZHkuY29udGFpbnMoZS5ub2RlKSl0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBpcyBub3QgYXR0YWNoZWQuIik7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQuTXNnLkJlZm9yZURldGFjaCksZS5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5ub2RlKSxhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdC5Nc2cuQWZ0ZXJEZXRhY2gpfX0obD1lLldpZGdldHx8KGUuV2lkZ2V0PXt9KSksZS5XaWRnZXQ9bCxmdW5jdGlvbih0KXt0LnRpdGxlUHJvcGVydHk9bmV3IHUuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToidGl0bGUiLGNyZWF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGguVGl0bGUoe293bmVyOnR9KX19KSx0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigxNDEpKSxpKG4oNzUpKSxpKG4oMzMzKSksaShuKDMzNCkpLGkobigzMzUpKSxpKG4oMzM2KSksaShuKDc0KSksaShuKDI1KSksaShuKDMzNykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigzMTcpKSxpKG4oMzE4KSksaShuKDMxOSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPWU7aS52ZXJzaW9uPW4oMTg4KS52ZXJzaW9uLGkudXRpbHM9bigxODkpLGkucmFuZD1uKDEwNSksaS5jdXJ2ZT1uKDQ4KSxpLmN1cnZlcz1uKDE5NCksaS5lYz1uKDIwMiksaS5lZGRzYT1uKDIwNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaSxyPW4oMiksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5zZW5kZXI9dH1yZXR1cm4gdC5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiBpLmNvbm5lY3QodGhpcyx0LGUpfSx0LnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuZGlzY29ubmVjdCh0aGlzLHQsZSl9LHQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7aS5lbWl0KHRoaXMsdCl9LHR9KCk7ZS5TaWduYWw9byxmdW5jdGlvbih0KXt0LmRpc2Nvbm5lY3RCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7aS5kaXNjb25uZWN0QmV0d2Vlbih0LGUpfSx0LmRpc2Nvbm5lY3RTZW5kZXI9ZnVuY3Rpb24odCl7aS5kaXNjb25uZWN0U2VuZGVyKHQpfSx0LmRpc2Nvbm5lY3RSZWNlaXZlcj1mdW5jdGlvbih0KXtpLmRpc2Nvbm5lY3RSZWNlaXZlcih0KX0sdC5kaXNjb25uZWN0QWxsPWZ1bmN0aW9uKHQpe2kuZGlzY29ubmVjdEFsbCh0KX0sdC5jbGVhckRhdGE9ZnVuY3Rpb24odCl7aS5kaXNjb25uZWN0QWxsKHQpfSx0LmdldEV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5leGNlcHRpb25IYW5kbGVyfSx0LnNldEV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9aS5leGNlcHRpb25IYW5kbGVyO3JldHVybiBpLmV4Y2VwdGlvbkhhbmRsZXI9dCxlfX0obz1lLlNpZ25hbHx8KGUuU2lnbmFsPXt9KSksZS5TaWduYWw9byxmdW5jdGlvbihlKXtlLmV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc29sZS5lcnJvcih0KX0sZS5jb25uZWN0PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fHZvaWQgMDt2YXIgbz1uLmdldCh0LnNlbmRlcik7aWYob3x8KG89W10sbi5zZXQodC5zZW5kZXIsbykpLGEobyx0LGUscikpcmV0dXJuITE7dmFyIHM9cnx8ZSx1PWkuZ2V0KHMpO3V8fCh1PVtdLGkuc2V0KHMsdSkpO3ZhciBjPXtzaWduYWw6dCxzbG90OmUsdGhpc0FyZzpyfTtyZXR1cm4gby5wdXNoKGMpLHUucHVzaChjKSwhMH0sZS5kaXNjb25uZWN0PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fHZvaWQgMDt2YXIgbz1uLmdldCh0LnNlbmRlcik7aWYoIW98fDA9PT1vLmxlbmd0aClyZXR1cm4hMTt2YXIgcz1hKG8sdCxlLHIpO2lmKCFzKXJldHVybiExO3ZhciB1PXJ8fGUsaD1pLmdldCh1KTtyZXR1cm4gcy5zaWduYWw9bnVsbCxjKG8pLGMoaCksITB9LGUuZGlzY29ubmVjdEJldHdlZW49ZnVuY3Rpb24odCxlKXt2YXIgbz1uLmdldCh0KTtpZihvJiYwIT09by5sZW5ndGgpe3ZhciBzPWkuZ2V0KGUpO3MmJjAhPT1zLmxlbmd0aCYmKHIuZWFjaChzLGZ1bmN0aW9uKGUpe2Uuc2lnbmFsJiZlLnNpZ25hbC5zZW5kZXI9PT10JiYoZS5zaWduYWw9bnVsbCl9KSxjKG8pLGMocykpfX0sZS5kaXNjb25uZWN0U2VuZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4uZ2V0KHQpO2UmJjAhPT1lLmxlbmd0aCYmKHIuZWFjaChlLGZ1bmN0aW9uKHQpe2lmKHQuc2lnbmFsKXt2YXIgZT10LnRoaXNBcmd8fHQuc2xvdDt0LnNpZ25hbD1udWxsLGMoaS5nZXQoZSkpfX0pLGMoZSkpfSxlLmRpc2Nvbm5lY3RSZWNlaXZlcj1mdW5jdGlvbih0KXt2YXIgZT1pLmdldCh0KTtlJiYwIT09ZS5sZW5ndGgmJihyLmVhY2goZSxmdW5jdGlvbih0KXtpZih0LnNpZ25hbCl7dmFyIGU9dC5zaWduYWwuc2VuZGVyO3Quc2lnbmFsPW51bGwsYyhuLmdldChlKSl9fSksYyhlKSl9LGUuZGlzY29ubmVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZT1uLmdldCh0KTtlJiZlLmxlbmd0aD4wJiYoci5lYWNoKGUsZnVuY3Rpb24odCl7dC5zaWduYWw9bnVsbH0pLGMoZSkpO3ZhciBvPWkuZ2V0KHQpO28mJm8ubGVuZ3RoPjAmJihyLmVhY2gobyxmdW5jdGlvbih0KXt0LnNpZ25hbD1udWxsfSksYyhvKSl9LGUuZW1pdD1mdW5jdGlvbih0LGUpe3ZhciBpPW4uZ2V0KHQuc2VuZGVyKTtpZihpJiYwIT09aS5sZW5ndGgpZm9yKHZhciByPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgcz1pW3JdO3Muc2lnbmFsPT09dCYmdShzLGUpfX07dmFyIG49bmV3IFdlYWtNYXAsaT1uZXcgV2Vha01hcCxvPW5ldyBTZXQscz0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZTp0O2Z1bmN0aW9uIGEodCxlLG4saSl7cmV0dXJuIHIuZmluZCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0LnNpZ25hbD09PWUmJnQuc2xvdD09PW4mJnQudGhpc0FyZz09PWl9KX1mdW5jdGlvbiB1KHQsbil7dmFyIGk9dC5zaWduYWwscj10LnNsb3Qsbz10LnRoaXNBcmc7dHJ5e3IuY2FsbChvLGkuc2VuZGVyLG4pfWNhdGNoKHQpe2UuZXhjZXB0aW9uSGFuZGxlcih0KX19ZnVuY3Rpb24gYyh0KXswPT09by5zaXplJiZzKGgpLG8uYWRkKHQpfWZ1bmN0aW9uIGgoKXtvLmZvckVhY2gobCksby5jbGVhcigpfWZ1bmN0aW9uIGwodCl7ci5BcnJheUV4dC5yZW1vdmVBbGxXaGVyZSh0LGQpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIG51bGw9PT10LnNpZ25hbH19KGl8fChpPXt9KSl9KS5jYWxsKHRoaXMsbig0NCkuc2V0SW1tZWRpYXRlKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big4KSxzPW4oMjMpLGE9big1NyksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQ29yZVdpZGdldE1vZGVsIixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF9tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF92aWV3X21vZHVsZV92ZXJzaW9uOmEuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTn0pfSxlfShvLldpZGdldE1vZGVsKTtlLkNvcmVXaWRnZXRNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkNvcmVET01XaWRnZXRNb2RlbCIsX3ZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfdmlld19tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixfbW9kZWxfbW9kdWxlX3ZlcnNpb246YS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZX0oby5ET01XaWRnZXRNb2RlbCk7ZS5Db3JlRE9NV2lkZ2V0TW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJDb3JlRGVzY3JpcHRpb25Nb2RlbCIsX3ZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfdmlld19tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixfbW9kZWxfbW9kdWxlX3ZlcnNpb246YS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZX0ocy5EZXNjcmlwdGlvbk1vZGVsKTtlLkNvcmVEZXNjcmlwdGlvbk1vZGVsPWx9LGZ1bmN0aW9uKHQsZSl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZXx8IkFzc2VydGlvbiBmYWlsZWQiKX10LmV4cG9ydHM9bixuLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtpZih0IT1lKXRocm93IG5ldyBFcnJvcihufHwiQXNzZXJ0aW9uIGZhaWxlZDogIit0KyIgIT0gIitlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4scil7InVzZSBzdHJpY3QiO3ZhciBvPVtdLHM9bi5kb2N1bWVudCxhPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PW8uc2xpY2UsYz1vLmNvbmNhdCxoPW8ucHVzaCxsPW8uaW5kZXhPZixkPXt9LGY9ZC50b1N0cmluZyxwPWQuaGFzT3duUHJvcGVydHksbT1wLnRvU3RyaW5nLGc9bS5jYWxsKE9iamVjdCksdj17fSxiPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LHk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sXz17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciBpLHI9KGU9ZXx8cykuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoci50ZXh0PXQsbilmb3IoaSBpbiBfKW5baV0mJihyW2ldPW5baV0pO2UuaGVhZC5hcHBlbmRDaGlsZChyKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfWZ1bmN0aW9uIHgodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P2RbZi5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IE0uZm4uaW5pdCh0LGUpfSxTPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBFKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPXgodCk7cmV0dXJuIWIodCkmJiF5KHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfU0uZm49TS5wcm90b3R5cGU9e2pxdWVyeToiMy4zLjEiLGNvbnN0cnVjdG9yOk0sbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPU0ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBNLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhNLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0Om8uc29ydCxzcGxpY2U6by5zcGxpY2V9LE0uZXh0ZW5kPU0uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscixvLHM9YXJndW1lbnRzWzBdfHx7fSxhPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIHMmJihjPXMscz1hcmd1bWVudHNbYV18fHt9LGErKyksIm9iamVjdCI9PXR5cGVvZiBzfHxiKHMpfHwocz17fSksYT09PXUmJihzPXRoaXMsYS0tKTthPHU7YSsrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1thXSkpZm9yKGUgaW4gdCluPXNbZV0scyE9PShpPXRbZV0pJiYoYyYmaSYmKE0uaXNQbGFpbk9iamVjdChpKXx8KHI9QXJyYXkuaXNBcnJheShpKSkpPyhyPyhyPSExLG89biYmQXJyYXkuaXNBcnJheShuKT9uOltdKTpvPW4mJk0uaXNQbGFpbk9iamVjdChuKT9uOnt9LHNbZV09TS5leHRlbmQoYyxvLGkpKTp2b2lkIDAhPT1pJiYoc1tlXT1pKSk7cmV0dXJuIHN9LE0uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy4zLjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKHQpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuISghdHx8IltvYmplY3QgT2JqZWN0XSIhPT1mLmNhbGwodCkpJiYoIShlPWEodCkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1wLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcikmJm0uY2FsbChuKT09PWcpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCl7dyh0KX0sZWFjaDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9MDtpZihFKHQpKWZvcihuPXQubGVuZ3RoO2k8biYmITEhPT1lLmNhbGwodFtpXSxpLHRbaV0pO2krKyk7ZWxzZSBmb3IoaSBpbiB0KWlmKCExPT09ZS5jYWxsKHRbaV0saSx0W2ldKSlicmVhaztyZXR1cm4gdH0sdHJpbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShTLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49ZXx8W107cmV0dXJuIG51bGwhPXQmJihFKE9iamVjdCh0KSk/TS5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgdD9bdF06dCk6aC5jYWxsKG4sdCkpLG59LGluQXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lPy0xOmwuY2FsbChlLHQsbil9LG1lcmdlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPStlLmxlbmd0aCxpPTAscj10Lmxlbmd0aDtpPG47aSsrKXRbcisrXT1lW2ldO3JldHVybiB0Lmxlbmd0aD1yLHR9LGdyZXA6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1bXSxyPTAsbz10Lmxlbmd0aCxzPSFuO3I8bztyKyspIWUodFtyXSxyKSE9PXMmJmkucHVzaCh0W3JdKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89MCxzPVtdO2lmKEUodCkpZm9yKGk9dC5sZW5ndGg7bzxpO28rKyludWxsIT0ocj1lKHRbb10sbyxuKSkmJnMucHVzaChyKTtlbHNlIGZvcihvIGluIHQpbnVsbCE9KHI9ZSh0W29dLG8sbikpJiZzLnB1c2gocik7cmV0dXJuIGMuYXBwbHkoW10scyl9LGd1aWQ6MSxzdXBwb3J0OnZ9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoTS5mbltTeW1ib2wuaXRlcmF0b3JdPW9bU3ltYm9sLml0ZXJhdG9yXSksTS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe2RbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2FzZSgpfSk7dmFyIEE9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTYtMDgtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnLHYsYix5LF89InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQseD0wLE09MCxTPXN0KCksRT1zdCgpLEE9c3QoKSxDPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lJiYobD0hMCksMH0saz17fS5oYXNPd25Qcm9wZXJ0eSxPPVtdLFA9Ty5wb3AsVD1PLnB1c2gsaj1PLnB1c2gsST1PLnNsaWNlLEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LEI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixEPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixSPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsej0iXFxbIitEKyIqKCIrUisiKSg/OiIrRCsiKihbKl4kfCF+XT89KSIrRCsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1IrIikpfCkiK0QrIipcXF0iLE49IjooIitSKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18Iit6KyIpKil8LiopXFwpfCkiLFc9bmV3IFJlZ0V4cChEKyIrIiwiZyIpLHE9bmV3IFJlZ0V4cCgiXiIrRCsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitEKyIrJCIsImciKSxIPW5ldyBSZWdFeHAoIl4iK0QrIiosIitEKyIqIiksRj1uZXcgUmVnRXhwKCJeIitEKyIqKFs+K35dfCIrRCsiKSIrRCsiKiIpLFY9bmV3IFJlZ0V4cCgiPSIrRCsiKihbXlxcXSdcIl0qPykiK0QrIipcXF0iLCJnIiksVT1uZXcgUmVnRXhwKE4pLEs9bmV3IFJlZ0V4cCgiXiIrUisiJCIpLFk9e0lEOm5ldyBSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitSKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitSKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIreiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK04pLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrRCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrRCsiKig/OihbKy1dfCkiK0QrIiooXFxkKyl8KSkiK0QrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitEKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0QrIiooKD86LVxcZCk/XFxkKikiK0QrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwkPS9eaFxkJC9pLEc9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLEo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxaPS9bK35dLyxRPW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrRCsiP3woIitEKyIpfC4pIiwiaWciKSx0dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9IjB4IitlLTY1NTM2O3JldHVybiBpIT1pfHxuP2U6aTwwP1N0cmluZy5mcm9tQ2hhckNvZGUoaSs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShpPj4xMHw1NTI5NiwxMDIzJml8NTYzMjApfSxldD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxudD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7ZCgpfSxydD1idChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJigiZm9ybSJpbiB0fHwibGFiZWwiaW4gdCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7ai5hcHBseShPPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksT1t3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtqPXthcHBseTpPLmxlbmd0aD9mdW5jdGlvbih0LGUpe1QuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPTA7dFtuKytdPWVbaSsrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIG90KHQsZSxpLHIpe3ZhciBvLGEsYyxoLGwscCx2LGI9ZSYmZS5vd25lckRvY3VtZW50LHg9ZT9lLm5vZGVUeXBlOjk7aWYoaT1pfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09eCYmOSE9PXgmJjExIT09eClyZXR1cm4gaTtpZighciYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWYmJmQoZSksZT1lfHxmLG0pKXtpZigxMSE9PXgmJihsPUouZXhlYyh0KSkpaWYobz1sWzFdKXtpZig5PT09eCl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQobykpKXJldHVybiBpO2lmKGMuaWQ9PT1vKXJldHVybiBpLnB1c2goYyksaX1lbHNlIGlmKGImJihjPWIuZ2V0RWxlbWVudEJ5SWQobykpJiZ5KGUsYykmJmMuaWQ9PT1vKXJldHVybiBpLnB1c2goYyksaX1lbHNle2lmKGxbMl0pcmV0dXJuIGouYXBwbHkoaSxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxpO2lmKChvPWxbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gai5hcHBseShpLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShvKSksaX1pZihuLnFzYSYmIUFbdCsiICJdJiYoIWd8fCFnLnRlc3QodCkpKXtpZigxIT09eCliPWUsdj10O2Vsc2UgaWYoIm9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2ZvcigoaD1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/aD1oLnJlcGxhY2UoZXQsbnQpOmUuc2V0QXR0cmlidXRlKCJpZCIsaD1fKSxhPShwPXModCkpLmxlbmd0aDthLS07KXBbYV09IiMiK2grIiAiK3Z0KHBbYV0pO3Y9cC5qb2luKCIsIiksYj1aLnRlc3QodCkmJm10KGUucGFyZW50Tm9kZSl8fGV9aWYodil0cnl7cmV0dXJuIGouYXBwbHkoaSxiLnF1ZXJ5U2VsZWN0b3JBbGwodikpLGl9Y2F0Y2godCl7fWZpbmFsbHl7aD09PV8mJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUodC5yZXBsYWNlKHEsIiQxIiksZSxpLHIpfWZ1bmN0aW9uIHN0KCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGUobixyKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT5pLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPXJ9fWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0W19dPSEwLHR9ZnVuY3Rpb24gdXQodCl7dmFyIGU9Zi5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIXQoZSl9Y2F0Y2godCl7cmV0dXJuITF9ZmluYWxseXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGx9fWZ1bmN0aW9uIGN0KHQsZSl7Zm9yKHZhciBuPXQuc3BsaXQoInwiKSxyPW4ubGVuZ3RoO3ItLTspaS5hdHRySGFuZGxlW25bcl1dPWV9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj1lJiZ0LGk9biYmMT09PXQubm9kZVR5cGUmJjE9PT1lLm5vZGVUeXBlJiZ0LnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYoaSlyZXR1cm4gaTtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09ZSlyZXR1cm4tMTtyZXR1cm4gdD8xOi0xfWZ1bmN0aW9uIGx0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZnQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZydChlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gYXQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsYXQoZnVuY3Rpb24obixpKXtmb3IodmFyIHIsbz10KFtdLG4ubGVuZ3RoLGUpLHM9by5sZW5ndGg7cy0tOyluW3I9b1tzXV0mJihuW3JdPSEoaVtyXT1uW3JdKSl9KX0pfWZ1bmN0aW9uIG10KHQpe3JldHVybiB0JiZ2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0fWZvcihlIGluIG49b3Quc3VwcG9ydD17fSxvPW90LmlzWE1MPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJih0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hIWUmJiJIVE1MIiE9PWUubm9kZU5hbWV9LGQ9b3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUscixzPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIHMhPT1mJiY5PT09cy5ub2RlVHlwZSYmcy5kb2N1bWVudEVsZW1lbnQ/KHA9KGY9cykuZG9jdW1lbnRFbGVtZW50LG09IW8oZiksdyE9PWYmJihyPWYuZGVmYXVsdFZpZXcpJiZyLnRvcCE9PXImJihyLmFkZEV2ZW50TGlzdGVuZXI/ci5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpyLmF0dGFjaEV2ZW50JiZyLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChmLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1HLnRlc3QoZi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9dXQoZnVuY3Rpb24odCl7cmV0dXJuIHAuYXBwZW5kQ2hpbGQodCkuaWQ9XywhZi5nZXRFbGVtZW50c0J5TmFtZXx8IWYuZ2V0RWxlbWVudHNCeU5hbWUoXykubGVuZ3RofSksbi5nZXRCeUlkPyhpLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoUSx0dCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fSxpLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZtKXt2YXIgbj1lLmdldEVsZW1lbnRCeUlkKHQpO3JldHVybiBuP1tuXTpbXX19KTooaS5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKFEsdHQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxpLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZtKXt2YXIgbixpLHIsbz1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKG8pe2lmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltvXTtmb3Iocj1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLGk9MDtvPXJbaSsrXTspaWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW29dfXJldHVybltdfX0pLGkuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixpPVtdLHI9MCxvPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPW9bcisrXTspMT09PW4ubm9kZVR5cGUmJmkucHVzaChuKTtyZXR1cm4gaX1yZXR1cm4gb30saS5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJm0pcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0sdj1bXSxnPVtdLChuLnFzYT1HLnRlc3QoZi5xdWVyeVNlbGVjdG9yQWxsKSkmJih1dChmdW5jdGlvbih0KXtwLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIrXysiJz48L2E+PHNlbGVjdCBpZD0nIitfKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJmcucHVzaCgiWypeJF09IitEKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGcucHVzaCgiXFxbIitEKyIqKD86dmFsdWV8IitCKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrXysiLV0iKS5sZW5ndGh8fGcucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxnLnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrXysiKyoiKS5sZW5ndGh8fGcucHVzaCgiLiMuK1srfl0iKX0pLHV0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJmcucHVzaCgibmFtZSIrRCsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmZy5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLHAuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZnLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IiksZy5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPUcudGVzdChiPXAubWF0Y2hlc3x8cC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHAubW96TWF0Y2hlc1NlbGVjdG9yfHxwLm9NYXRjaGVzU2VsZWN0b3J8fHAubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1iLmNhbGwodCwiKiIpLGIuY2FsbCh0LCJbcyE9JyddOngiKSx2LnB1c2goIiE9IixOKX0pLGc9Zy5sZW5ndGgmJm5ldyBSZWdFeHAoZy5qb2luKCJ8IikpLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLGU9Ry50ZXN0KHAuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9ZXx8Ry50ZXN0KHAuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxpPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PWl8fCEoIWl8fDEhPT1pLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhpKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQz1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGw9ITAsMDt2YXIgaT0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gaXx8KDEmKGk9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1pP3Q9PT1mfHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZ5KHcsdCk/LTE6ZT09PWZ8fGUub3duZXJEb2N1bWVudD09PXcmJnkodyxlKT8xOmg/TChoLHQpLUwoaCxlKTowOjQmaT8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gbD0hMCwwO3ZhciBuLGk9MCxyPXQucGFyZW50Tm9kZSxvPWUucGFyZW50Tm9kZSxzPVt0XSxhPVtlXTtpZighcnx8IW8pcmV0dXJuIHQ9PT1mPy0xOmU9PT1mPzE6cj8tMTpvPzE6aD9MKGgsdCktTChoLGUpOjA7aWYocj09PW8pcmV0dXJuIGh0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KWEudW5zaGlmdChuKTtmb3IoO3NbaV09PT1hW2ldOylpKys7cmV0dXJuIGk/aHQoc1tpXSxhW2ldKTpzW2ldPT09dz8tMTphW2ldPT09dz8xOjB9LGYpOmZ9LG90Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gb3QodCxudWxsLG51bGwsZSl9LG90Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09ZiYmZCh0KSxlPWUucmVwbGFjZShWLCI9JyQxJ10iKSxuLm1hdGNoZXNTZWxlY3RvciYmbSYmIUFbZSsiICJdJiYoIXZ8fCF2LnRlc3QoZSkpJiYoIWd8fCFnLnRlc3QoZSkpKXRyeXt2YXIgaT1iLmNhbGwodCxlKTtpZihpfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGl9Y2F0Y2godCl7fXJldHVybiBvdChlLGYsbnVsbCxbdF0pLmxlbmd0aD4wfSxvdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09ZiYmZCh0KSx5KHQsZSl9LG90LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWYmJmQodCk7dmFyIHI9aS5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0sbz1yJiZrLmNhbGwoaS5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/cih0LGUsIW0pOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09bz9vOm4uYXR0cmlidXRlc3x8IW0/dC5nZXRBdHRyaWJ1dGUoZSk6KG89dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmby5zcGVjaWZpZWQ/by52YWx1ZTpudWxsfSxvdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UoZXQsbnQpfSxvdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LG90LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUsaT1bXSxyPTAsbz0wO2lmKGw9IW4uZGV0ZWN0RHVwbGljYXRlcyxoPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KEMpLGwpe2Zvcig7ZT10W28rK107KWU9PT10W29dJiYocj1pLnB1c2gobykpO2Zvcig7ci0tOyl0LnNwbGljZShpW3JdLDEpfXJldHVybiBoPW51bGwsdH0scj1vdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIsaT0wLG89dC5ub2RlVHlwZTtpZihvKXtpZigxPT09b3x8OT09PW98fDExPT09byl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1yKHQpfWVsc2UgaWYoMz09PW98fDQ9PT1vKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W2krK107KW4rPXIoZSk7cmV0dXJuIG59LChpPW90LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmF0LG1hdGNoOlksYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShRLHR0KSx0WzNdPSh0WzNdfHx0WzRdfHx0WzVdfHwiIikucmVwbGFjZShRLHR0KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8b3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmb3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIFkuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmVS50ZXN0KG4pJiYoZT1zKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShRLHR0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1TW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitEKyIpIit0KyIoIitEKyJ8JCkiKSkmJlModCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9b3QuYXR0cihpLHQpO3JldHVybiBudWxsPT1yPyIhPSI9PT1lOiFlfHwocis9IiIsIj0iPT09ZT9yPT09bjoiIT0iPT09ZT9yIT09bjoiXj0iPT09ZT9uJiYwPT09ci5pbmRleE9mKG4pOiIqPSI9PT1lP24mJnIuaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZyLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrci5yZXBsYWNlKFcsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihyPT09bnx8ci5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89Im50aCIhPT10LnNsaWNlKDAsMykscz0ibGFzdCIhPT10LnNsaWNlKC00KSxhPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1pJiYwPT09cj9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGgsbCxkLGYscCxtPW8hPT1zPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsZz1lLnBhcmVudE5vZGUsdj1hJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYj0hdSYmIWEseT0hMTtpZihnKXtpZihvKXtmb3IoO207KXtmb3IoZD1lO2Q9ZFttXTspaWYoYT9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT12OjE9PT1kLm5vZGVUeXBlKXJldHVybiExO3A9bT0ib25seSI9PT10JiYhcCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihwPVtzP2cuZmlyc3RDaGlsZDpnLmxhc3RDaGlsZF0scyYmYil7Zm9yKHk9KGY9KGM9KGg9KGw9KGQ9ZylbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChsW2QudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PXgmJmNbMV0pJiZjWzJdLGQ9ZiYmZy5jaGlsZE5vZGVzW2ZdO2Q9KytmJiZkJiZkW21dfHwoeT1mPTApfHxwLnBvcCgpOylpZigxPT09ZC5ub2RlVHlwZSYmKyt5JiZkPT09ZSl7aFt0XT1beCxmLHldO2JyZWFrfX1lbHNlIGlmKGImJih5PWY9KGM9KGg9KGw9KGQ9ZSlbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChsW2QudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PXgmJmNbMV0pLCExPT09eSlmb3IoOyhkPSsrZiYmZCYmZFttXXx8KHk9Zj0wKXx8cC5wb3AoKSkmJigoYT9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT12OjEhPT1kLm5vZGVUeXBlKXx8ISsreXx8KGImJigoaD0obD1kW19dfHwoZFtfXT17fSkpW2QudW5pcXVlSURdfHwobFtkLnVuaXF1ZUlEXT17fSkpW3RdPVt4LHldKSxkIT09ZSkpOyk7cmV0dXJuKHktPXIpPT09aXx8eSVpPT0wJiZ5L2k+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj1pLnBzZXVkb3NbdF18fGkuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxvdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiByW19dP3IoZSk6ci5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLGkuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2F0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciBpLG89cih0LGUpLHM9by5sZW5ndGg7cy0tOyl0W2k9TCh0LG9bc10pXT0hKG5baV09b1tzXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gcih0LDAsbil9KTpyfX0scHNldWRvczp7bm90OmF0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10saT1hKHQucmVwbGFjZShxLCIkMSIpKTtyZXR1cm4gaVtfXT9hdChmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIG8scz1pKHQsbnVsbCxyLFtdKSxhPXQubGVuZ3RoO2EtLTspKG89c1thXSkmJih0W2FdPSEoZVthXT1vKSl9KTpmdW5jdGlvbih0LHIsbyl7cmV0dXJuIGVbMF09dCxpKGUsbnVsbCxvLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6YXQoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBvdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmF0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShRLHR0KSxmdW5jdGlvbihlKXtyZXR1cm4oZS50ZXh0Q29udGVudHx8ZS5pbm5lclRleHR8fHIoZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzphdChmdW5jdGlvbih0KXtyZXR1cm4gSy50ZXN0KHR8fCIiKXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoUSx0dCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgbjtkb3tpZihuPW0/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT10fHwwPT09bi5pbmRleE9mKHQrIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24mJnQubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1wfSxmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWYuYWN0aXZlRWxlbWVudCYmKCFmLmhhc0ZvY3VzfHxmLmhhc0ZvY3VzKCkpJiYhISh0LnR5cGV8fHQuaHJlZnx8fnQudGFiSW5kZXgpfSxlbmFibGVkOmZ0KCExKSxkaXNhYmxlZDpmdCghMCksY2hlY2tlZDpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiEhdC5jaGVja2VkfHwib3B0aW9uIj09PWUmJiEhdC5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT10LnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbih0KXtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIWkucHNldWRvcy5lbXB0eSh0KX0saGVhZGVyOmZ1bmN0aW9uKHQpe3JldHVybiAkLnRlc3QodC5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBYLnRlc3QodC5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiJidXR0b24iPT09dC50eXBlfHwiYnV0dG9uIj09PWV9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09dC50eXBlJiYobnVsbD09KGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWUudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnB0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpwdChmdW5jdGlvbih0LGUpe3JldHVybltlLTFdfSksZXE6cHQoZnVuY3Rpb24odCxlLG4pe3JldHVybltuPDA/bitlOm5dfSksZXZlbjpwdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLG9kZDpwdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLGx0OnB0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bjwwP24rZTpuOy0taT49MDspdC5wdXNoKGkpO3JldHVybiB0fSksZ3Q6cHQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1uPDA/bitlOm47KytpPGU7KXQucHVzaChpKTtyZXR1cm4gdH0pfX0pLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0paS5wc2V1ZG9zW2VdPWx0KGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0paS5wc2V1ZG9zW2VdPWR0KGUpO2Z1bmN0aW9uIGd0KCl7fWZ1bmN0aW9uIHZ0KHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgsaT0iIjtlPG47ZSsrKWkrPXRbZV0udmFsdWU7cmV0dXJuIGl9ZnVuY3Rpb24gYnQodCxlLG4pe3ZhciBpPWUuZGlyLHI9ZS5uZXh0LG89cnx8aSxzPW4mJiJwYXJlbnROb2RlIj09PW8sYT1NKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSxuLHIpe2Zvcig7ZT1lW2ldOylpZigxPT09ZS5ub2RlVHlwZXx8cylyZXR1cm4gdChlLG4scik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxoLGwsZD1beCxhXTtpZih1KXtmb3IoO2U9ZVtpXTspaWYoKDE9PT1lLm5vZGVUeXBlfHxzKSYmdChlLG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO2U9ZVtpXTspaWYoMT09PWUubm9kZVR5cGV8fHMpaWYoaD0obD1lW19dfHwoZVtfXT17fSkpW2UudW5pcXVlSURdfHwobFtlLnVuaXF1ZUlEXT17fSksciYmcj09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbaV18fGU7ZWxzZXtpZigoYz1oW29dKSYmY1swXT09PXgmJmNbMV09PT1hKXJldHVybiBkWzJdPWNbMl07aWYoaFtvXT1kLGRbMl09dChlLG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0Lmxlbmd0aD4xP2Z1bmN0aW9uKGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZighdFtyXShlLG4saSkpcmV0dXJuITE7cmV0dXJuITB9OnRbMF19ZnVuY3Rpb24gX3QodCxlLG4saSxyKXtmb3IodmFyIG8scz1bXSxhPTAsdT10Lmxlbmd0aCxjPW51bGwhPWU7YTx1O2ErKykobz10W2FdKSYmKG4mJiFuKG8saSxyKXx8KHMucHVzaChvKSxjJiZlLnB1c2goYSkpKTtyZXR1cm4gc31mdW5jdGlvbiB3dCh0LGUsbixpLHIsbyl7cmV0dXJuIGkmJiFpW19dJiYoaT13dChpKSksciYmIXJbX10mJihyPXd0KHIsbykpLGF0KGZ1bmN0aW9uKG8scyxhLHUpe3ZhciBjLGgsbCxkPVtdLGY9W10scD1zLmxlbmd0aCxtPW98fGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjtpKyspb3QodCxlW2ldLG4pO3JldHVybiBufShlfHwiKiIsYS5ub2RlVHlwZT9bYV06YSxbXSksZz0hdHx8IW8mJmU/bTpfdChtLGQsdCxhLHUpLHY9bj9yfHwobz90OnB8fGkpP1tdOnM6ZztpZihuJiZuKGcsdixhLHUpLGkpZm9yKGM9X3QodixmKSxpKGMsW10sYSx1KSxoPWMubGVuZ3RoO2gtLTspKGw9Y1toXSkmJih2W2ZbaF1dPSEoZ1tmW2hdXT1sKSk7aWYobyl7aWYocnx8dCl7aWYocil7Zm9yKGM9W10saD12Lmxlbmd0aDtoLS07KShsPXZbaF0pJiZjLnB1c2goZ1toXT1sKTtyKG51bGwsdj1bXSxjLHUpfWZvcihoPXYubGVuZ3RoO2gtLTspKGw9dltoXSkmJihjPXI/TChvLGwpOmRbaF0pPi0xJiYob1tjXT0hKHNbY109bCkpfX1lbHNlIHY9X3Qodj09PXM/di5zcGxpY2UocCx2Lmxlbmd0aCk6dikscj9yKG51bGwscyx2LHUpOmouYXBwbHkocyx2KX0pfWZ1bmN0aW9uIHh0KHQpe2Zvcih2YXIgZSxuLHIsbz10Lmxlbmd0aCxzPWkucmVsYXRpdmVbdFswXS50eXBlXSxhPXN8fGkucmVsYXRpdmVbIiAiXSx1PXM/MTowLGg9YnQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lfSxhLCEwKSxsPWJ0KGZ1bmN0aW9uKHQpe3JldHVybiBMKGUsdCk+LTF9LGEsITApLGQ9W2Z1bmN0aW9uKHQsbixpKXt2YXIgcj0hcyYmKGl8fG4hPT1jKXx8KChlPW4pLm5vZGVUeXBlP2godCxuLGkpOmwodCxuLGkpKTtyZXR1cm4gZT1udWxsLHJ9XTt1PG87dSsrKWlmKG49aS5yZWxhdGl2ZVt0W3VdLnR5cGVdKWQ9W2J0KHl0KGQpLG4pXTtlbHNle2lmKChuPWkuZmlsdGVyW3RbdV0udHlwZV0uYXBwbHkobnVsbCx0W3VdLm1hdGNoZXMpKVtfXSl7Zm9yKHI9Kyt1O3I8byYmIWkucmVsYXRpdmVbdFtyXS50eXBlXTtyKyspO3JldHVybiB3dCh1PjEmJnl0KGQpLHU+MSYmdnQodC5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT10W3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShxLCIkMSIpLG4sdTxyJiZ4dCh0LnNsaWNlKHUscikpLHI8byYmeHQodD10LnNsaWNlKHIpKSxyPG8mJnZ0KHQpKX1kLnB1c2gobil9cmV0dXJuIHl0KGQpfXJldHVybiBndC5wcm90b3R5cGU9aS5maWx0ZXJzPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IGd0LHM9b3QudG9rZW5pemU9ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8scyxhLHUsYyxoPUVbdCsiICJdO2lmKGgpcmV0dXJuIGU/MDpoLnNsaWNlKDApO2ZvcihhPXQsdT1bXSxjPWkucHJlRmlsdGVyO2E7KXtmb3IocyBpbiBuJiYhKHI9SC5leGVjKGEpKXx8KHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSx1LnB1c2gobz1bXSkpLG49ITEsKHI9Ri5leGVjKGEpKSYmKG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZShxLCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKSxpLmZpbHRlcikhKHI9WVtzXS5leGVjKGEpKXx8Y1tzXSYmIShyPWNbc10ocikpfHwobj1yLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6cyxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gZT9hLmxlbmd0aDphP290LmVycm9yKHQpOkUodCx1KS5zbGljZSgwKX0sYT1vdC5jb21waWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPVtdLGE9QVt0KyIgIl07aWYoIWEpe2ZvcihlfHwoZT1zKHQpKSxuPWUubGVuZ3RoO24tLTspKGE9eHQoZVtuXSkpW19dP3IucHVzaChhKTpvLnB1c2goYSk7KGE9QSh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg+MCxyPXQubGVuZ3RoPjAsbz1mdW5jdGlvbihvLHMsYSx1LGgpe3ZhciBsLHAsZyx2PTAsYj0iMCIseT1vJiZbXSxfPVtdLHc9YyxNPW98fHImJmkuZmluZC5UQUcoIioiLGgpLFM9eCs9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLEU9TS5sZW5ndGg7Zm9yKGgmJihjPXM9PT1mfHxzfHxoKTtiIT09RSYmbnVsbCE9KGw9TVtiXSk7YisrKXtpZihyJiZsKXtmb3IocD0wLHN8fGwub3duZXJEb2N1bWVudD09PWZ8fChkKGwpLGE9IW0pO2c9dFtwKytdOylpZihnKGwsc3x8ZixhKSl7dS5wdXNoKGwpO2JyZWFrfWgmJih4PVMpfW4mJigobD0hZyYmbCkmJnYtLSxvJiZ5LnB1c2gobCkpfWlmKHYrPWIsbiYmYiE9PXYpe2ZvcihwPTA7Zz1lW3ArK107KWcoeSxfLHMsYSk7aWYobyl7aWYodj4wKWZvcig7Yi0tOyl5W2JdfHxfW2JdfHwoX1tiXT1QLmNhbGwodSkpO189X3QoXyl9ai5hcHBseSh1LF8pLGgmJiFvJiZfLmxlbmd0aD4wJiZ2K2UubGVuZ3RoPjEmJm90LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGgmJih4PVMsYz13KSx5fTtyZXR1cm4gbj9hdChvKTpvfShvLHIpKSkuc2VsZWN0b3I9dH1yZXR1cm4gYX0sdT1vdC5zZWxlY3Q9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8sdSxjLGgsbCxkPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LGY9IXImJnModD1kLnNlbGVjdG9yfHx0KTtpZihuPW58fFtdLDE9PT1mLmxlbmd0aCl7aWYoKHU9ZlswXT1mWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShjPXVbMF0pLnR5cGUmJjk9PT1lLm5vZGVUeXBlJiZtJiZpLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEoZT0oaS5maW5kLklEKGMubWF0Y2hlc1swXS5yZXBsYWNlKFEsdHQpLGUpfHxbXSlbMF0pKXJldHVybiBuO2QmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihvPVkubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtvLS0mJihjPXVbb10sIWkucmVsYXRpdmVbaD1jLnR5cGVdKTspaWYoKGw9aS5maW5kW2hdKSYmKHI9bChjLm1hdGNoZXNbMF0ucmVwbGFjZShRLHR0KSxaLnRlc3QodVswXS50eXBlKSYmbXQoZS5wYXJlbnROb2RlKXx8ZSkpKXtpZih1LnNwbGljZShvLDEpLCEodD1yLmxlbmd0aCYmdnQodSkpKXJldHVybiBqLmFwcGx5KG4sciksbjticmVha319cmV0dXJuKGR8fGEodCxmKSkocixlLCFtLG4sIWV8fFoudGVzdCh0KSYmbXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPV8uc3BsaXQoIiIpLnNvcnQoQykuam9pbigiIik9PT1fLG4uZGV0ZWN0RHVwbGljYXRlcz0hIWwsZCgpLG4uc29ydERldGFjaGVkPXV0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZi5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLHV0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGN0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGN0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLHV0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxjdChCLGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0pLG90fShuKTtNLmZpbmQ9QSxNLmV4cHI9QS5zZWxlY3RvcnMsTS5leHByWyI6Il09TS5leHByLnBzZXVkb3MsTS51bmlxdWVTb3J0PU0udW5pcXVlPUEudW5pcXVlU29ydCxNLnRleHQ9QS5nZXRUZXh0LE0uaXNYTUxEb2M9QS5pc1hNTCxNLmNvbnRhaW5zPUEuY29udGFpbnMsTS5lc2NhcGVTZWxlY3Rvcj1BLmVzY2FwZTt2YXIgQz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPVtdLHI9dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihyJiZNKHQpLmlzKG4pKWJyZWFrO2kucHVzaCh0KX1yZXR1cm4gaX0saz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sTz1NLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIFAodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBUPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGoodCxlLG4pe3JldHVybiBiKGUpP00uZ3JlcCh0LGZ1bmN0aW9uKHQsaSl7cmV0dXJuISFlLmNhbGwodCxpLHQpIT09bn0pOmUubm9kZVR5cGU/TS5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9NLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKGUsdCk+LTEhPT1ufSk6TS5maWx0ZXIoZSx0LG4pfU0uZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1pLm5vZGVUeXBlP00uZmluZC5tYXRjaGVzU2VsZWN0b3IoaSx0KT9baV06W106TS5maW5kLm1hdGNoZXModCxNLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LE0uZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLmxlbmd0aCxyPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhNKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxpO2UrKylpZihNLmNvbnRhaW5zKHJbZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPGk7ZSsrKU0uZmluZCh0LHJbZV0sbik7cmV0dXJuIGk+MT9NLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZPLnRlc3QodCk/TSh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBJLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoTS5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8SSwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEoaT0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkwuZXhlYyh0KSl8fCFpWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoaVsxXSl7aWYoZT1lIGluc3RhbmNlb2YgTT9lWzBdOmUsTS5tZXJnZSh0aGlzLE0ucGFyc2VIVE1MKGlbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6cywhMCkpLFQudGVzdChpWzFdKSYmTS5pc1BsYWluT2JqZWN0KGUpKWZvcihpIGluIGUpYih0aGlzW2ldKT90aGlzW2ldKGVbaV0pOnRoaXMuYXR0cihpLGVbaV0pO3JldHVybiB0aGlzfXJldHVybihyPXMuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1yLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOmIodCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoTSk6TS5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1NLmZuLEk9TShzKTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIFIodCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fU0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9TSh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihNLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9MCxyPXRoaXMubGVuZ3RoLG89W10scz0ic3RyaW5nIiE9dHlwZW9mIHQmJk0odCk7aWYoIU8udGVzdCh0KSlmb3IoO2k8cjtpKyspZm9yKG49dGhpc1tpXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYocz9zLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZNLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/TS51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/bC5jYWxsKE0odCksdGhpc1swXSk6bC5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhNLnVuaXF1ZVNvcnQoTS5tZXJnZSh0aGlzLmdldCgpLE0odCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksTS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBDKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gUih0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBSKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBDKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEModCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEModCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBDKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBrKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gayh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gUCh0LCJpZnJhbWUiKT90LmNvbnRlbnREb2N1bWVudDooUCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLE0ubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe00uZm5bdF09ZnVuY3Rpb24obixpKXt2YXIgcj1NLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYoaT1uKSxpJiYic3RyaW5nIj09dHlwZW9mIGkmJihyPU0uZmlsdGVyKGkscikpLHRoaXMubGVuZ3RoPjEmJihEW3RdfHxNLnVuaXF1ZVNvcnQociksQi50ZXN0KHQpJiZyLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIHo9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBOKHQpe3JldHVybiB0fWZ1bmN0aW9uIFcodCl7dGhyb3cgdH1mdW5jdGlvbiBxKHQsZSxuLGkpe3ZhciByO3RyeXt0JiZiKHI9dC5wcm9taXNlKT9yLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJmIocj10LnRoZW4pP3IuY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKGkpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1NLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gTS5lYWNoKHQubWF0Y2goeil8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOk0uZXh0ZW5kKHt9LHQpO3ZhciBlLG4saSxyLG89W10scz1bXSxhPS0xLHU9ZnVuY3Rpb24oKXtmb3Iocj1yfHx0Lm9uY2UsaT1lPSEwO3MubGVuZ3RoO2E9LTEpZm9yKG49cy5zaGlmdCgpOysrYTxvLmxlbmd0aDspITE9PT1vW2FdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihhPW8ubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxyJiYobz1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIG8mJihuJiYhZSYmKGE9by5sZW5ndGgtMSxzLnB1c2gobikpLGZ1bmN0aW9uIGUobil7TS5lYWNoKG4sZnVuY3Rpb24obixpKXtiKGkpP3QudW5pcXVlJiZjLmhhcyhpKXx8by5wdXNoKGkpOmkmJmkubGVuZ3RoJiYic3RyaW5nIiE9PXgoaSkmJmUoaSl9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gTS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1NLmluQXJyYXkoZSxvLG4pKT4tMTspby5zcGxpY2UobiwxKSxuPD1hJiZhLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/TS5pbkFycmF5KHQsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gcj1zPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHI9cz1bXSxufHxlfHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHJ8fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0scy5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBjfSxNLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLE0uQ2FsbGJhY2tzKCJtZW1vcnkiKSxNLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsTS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksTS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLE0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLE0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLGk9InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHIudGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBNLkRlZmVycmVkKGZ1bmN0aW9uKG4pe00uZWFjaChlLGZ1bmN0aW9uKGUsaSl7dmFyIHI9Yih0W2lbNF1dKSYmdFtpWzRdXTtvW2lbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9ciYmci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmYih0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltpWzBdKyJXaXRoIl0odGhpcyxyP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxpLHIpe3ZhciBvPTA7ZnVuY3Rpb24gcyh0LGUsaSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxvKSl7aWYoKG49aS5hcHBseShhLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sYihjKT9yP2MuY2FsbChuLHMobyxlLE4scikscyhvLGUsVyxyKSk6KG8rKyxjLmNhbGwobixzKG8sZSxOLHIpLHMobyxlLFcscikscyhvLGUsTixlLm5vdGlmeVdpdGgpKSk6KGkhPT1OJiYoYT12b2lkIDAsdT1bbl0pLChyfHxlLnJlc29sdmVXaXRoKShhLHUpKX19LGg9cj9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtNLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJk0uRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGguc3RhY2tUcmFjZSksdCsxPj1vJiYoaSE9PVcmJihhPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKGEsdSkpfX07dD9oKCk6KE0uRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoaC5zdGFja1RyYWNlPU0uRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChoKSl9fXJldHVybiBNLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKHMoMCxuLGIocik/cjpOLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKHMoMCxuLGIodCk/dDpOKSksZVsyXVszXS5hZGQocygwLG4sYihpKT9pOlcpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9NLmV4dGVuZCh0LHIpOnJ9fSxvPXt9O3JldHVybiBNLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBzPW5bMl0sYT1uWzVdO3JbblsxXV09cy5hZGQsYSYmcy5hZGQoZnVuY3Rpb24oKXtpPWF9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLHMuYWRkKG5bM10uZmlyZSksb1tuWzBdXT1mdW5jdGlvbigpe3JldHVybiBvW25bMF0rIldpdGgiXSh0aGlzPT09bz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LG9bblswXSsiV2l0aCJdPXMuZmlyZVdpdGh9KSxyLnByb21pc2UobyksdCYmdC5jYWxsKG8sbyksb30sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxpPUFycmF5KG4pLHI9dS5jYWxsKGFyZ3VtZW50cyksbz1NLkRlZmVycmVkKCkscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7aVt0XT10aGlzLHJbdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxvLnJlc29sdmVXaXRoKGkscil9fTtpZihlPD0xJiYocSh0LG8uZG9uZShzKG4pKS5yZXNvbHZlLG8ucmVqZWN0LCFlKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fGIocltuXSYmcltuXS50aGVuKSkpcmV0dXJuIG8udGhlbigpO2Zvcig7bi0tOylxKHJbbl0scyhuKSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO00uRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sTS5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciBGPU0uRGVmZXJyZWQoKTtmdW5jdGlvbiBWKCl7cy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixWKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFYpLE0ucmVhZHkoKX1NLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiBGLnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7TS5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LE0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1NLnJlYWR5V2FpdDpNLmlzUmVhZHkpfHwoTS5pc1JlYWR5PSEwLCEwIT09dCYmLS1NLnJlYWR5V2FpdD4wfHxGLnJlc29sdmVXaXRoKHMsW01dKSl9fSksTS5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09cy5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1zLnJlYWR5U3RhdGUmJiFzLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoTS5yZWFkeSk6KHMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsViksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixWKSk7dmFyIFU9ZnVuY3Rpb24odCxlLG4saSxyLG8scyl7dmFyIGE9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PXgobikpZm9yKGEgaW4gcj0hMCxuKVUodCxlLGEsblthXSwhMCxvLHMpO2Vsc2UgaWYodm9pZCAwIT09aSYmKHI9ITAsYihpKXx8KHM9ITApLGMmJihzPyhlLmNhbGwodCxpKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChNKHQpLG4pfSkpLGUpKWZvcig7YTx1O2ErKyllKHRbYV0sbixzP2k6aS5jYWxsKHRbYV0sYSxlKHRbYV0sbikpKTtyZXR1cm4gcj90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOm99LEs9L14tbXMtLyxZPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFgodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQucmVwbGFjZShLLCJtcy0iKS5yZXBsYWNlKFksWCl9dmFyIEc9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPU0uZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sRyh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJbJChlKV09bjtlbHNlIGZvcihpIGluIGUpclskKGkpXT1lW2ldO3JldHVybiByfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dWyQoZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09aSl7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKCQpOihlPSQoZSkpaW4gaT9bZV06ZS5tYXRjaCh6KXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIGlbZVtuXV19KHZvaWQgMD09PWV8fE0uaXNFbXB0eU9iamVjdChpKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIU0uaXNFbXB0eU9iamVjdChlKX19O3ZhciBaPW5ldyBKLFE9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIGk7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYoaT0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUoaSkpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9US5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59TS5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFEuaGFzRGF0YSh0KXx8Wi5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBaLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX19KSxNLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvPXRoaXNbMF0scz1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihyPVEuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhWi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1zLmxlbmd0aDtuLS07KXNbbl0mJjA9PT0oaT1zW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihpPSQoaS5zbGljZSg1KSksbnQobyxpLHJbaV0pKTtaLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gcn1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyx0KX0pOlUodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1RLmdldChvLHQpKT9uOnZvaWQgMCE9PShuPW50KG8sdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLHQpfSl9fSksTS5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLGk9Wi5nZXQodCxlKSxuJiYoIWl8fEFycmF5LmlzQXJyYXkobik/aT1aLmFjY2Vzcyh0LGUsTS5tYWtlQXJyYXkobikpOmkucHVzaChuKSksaXx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49TS5xdWV1ZSh0LGUpLGk9bi5sZW5ndGgscj1uLnNoaWZ0KCksbz1NLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09ciYmKHI9bi5zaGlmdCgpLGktLSksciYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLHIuY2FsbCh0LGZ1bmN0aW9uKCl7TS5kZXF1ZXVlKHQsZSl9LG8pKSwhaSYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFouZ2V0KHQsbil8fFouYWNjZXNzKHQsbix7ZW1wdHk6TS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksTS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP00ucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49TS5xdWV1ZSh0aGlzLHQsZSk7TS5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZNLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtNLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT0xLHI9TS5EZWZlcnJlZCgpLG89dGhpcyxzPXRoaXMubGVuZ3RoLGE9ZnVuY3Rpb24oKXstLWl8fHIucmVzb2x2ZVdpdGgobyxbb10pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7cy0tOykobj1aLmdldChvW3NdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihpKyssbi5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCksci5wcm9taXNlKGUpfX0pO3ZhciBpdD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxydD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIraXQrIikoW2EteiVdKikkIiwiaSIpLG90PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmTS5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJiJub25lIj09PU0uY3NzKHQsImRpc3BsYXkiKX0sYXQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbyxzPXt9O2ZvcihvIGluIGUpc1tvXT10LnN0eWxlW29dLHQuc3R5bGVbb109ZVtvXTtmb3IobyBpbiByPW4uYXBwbHkodCxpfHxbXSksZSl0LnN0eWxlW29dPXNbb107cmV0dXJuIHJ9O2Z1bmN0aW9uIHV0KHQsZSxuLGkpe3ZhciByLG8scz0yMCxhPWk/ZnVuY3Rpb24oKXtyZXR1cm4gaS5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gTS5jc3ModCxlLCIiKX0sdT1hKCksYz1uJiZuWzNdfHwoTS5jc3NOdW1iZXJbZV0/IiI6InB4IiksaD0oTS5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJnJ0LmV4ZWMoTS5jc3ModCxlKSk7aWYoaCYmaFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8aFszXSxoPSt1fHwxO3MtLTspTS5zdHlsZSh0LGUsaCtjKSwoMS1vKSooMS0obz1hKCkvdXx8LjUpKTw9MCYmKHM9MCksaC89bztoKj0yLE0uc3R5bGUodCxlLGgrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGg9K2h8fCt1fHwwLHI9blsxXT9oKyhuWzFdKzEpKm5bMl06K25bMl0saSYmKGkudW5pdD1jLGkuc3RhcnQ9aCxpLmVuZD1yKSkscn12YXIgY3Q9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQsaT10Lm5vZGVOYW1lLHI9Y3RbaV07cmV0dXJuIHJ8fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQoaSkpLHI9TS5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1yJiYocj0iYmxvY2siKSxjdFtpXT1yLHIpfWZ1bmN0aW9uIGx0KHQsZSl7Zm9yKHZhciBuLGkscj1bXSxvPTAscz10Lmxlbmd0aDtvPHM7bysrKShpPXRbb10pLnN0eWxlJiYobj1pLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKHJbb109Wi5nZXQoaSwiZGlzcGxheSIpfHxudWxsLHJbb118fChpLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWkuc3R5bGUuZGlzcGxheSYmc3QoaSkmJihyW29dPWh0KGkpKSk6Im5vbmUiIT09biYmKHJbb109Im5vbmUiLFouc2V0KGksImRpc3BsYXkiLG4pKSk7Zm9yKG89MDtvPHM7bysrKW51bGwhPXJbb10mJih0W29dLnN0eWxlLmRpc3BsYXk9cltvXSk7cmV0dXJuIHR9TS5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7c3QodGhpcyk/TSh0aGlzKS5zaG93KCk6TSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZHQ9L14oPzpjaGVja2JveHxyYWRpbykkL2ksZnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2kscHQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gZ3QodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmUCh0LGUpP00ubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24gdnQodCxlKXtmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspWi5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFouZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIGJ0LHl0LF90PS88fCYjP1x3KzsvO2Z1bmN0aW9uIHd0KHQsZSxuLGkscil7Zm9yKHZhciBvLHMsYSx1LGMsaCxsPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGQ9W10sZj0wLHA9dC5sZW5ndGg7ZjxwO2YrKylpZigobz10W2ZdKXx8MD09PW8paWYoIm9iamVjdCI9PT14KG8pKU0ubWVyZ2UoZCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKF90LnRlc3Qobykpe2ZvcihzPXN8fGwuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSksYT0oZnQuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W2FdfHxtdC5fZGVmYXVsdCxzLmlubmVySFRNTD11WzFdK00uaHRtbFByZWZpbHRlcihvKSt1WzJdLGg9dVswXTtoLS07KXM9cy5sYXN0Q2hpbGQ7TS5tZXJnZShkLHMuY2hpbGROb2RlcyksKHM9bC5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIGQucHVzaChlLmNyZWF0ZVRleHROb2RlKG8pKTtmb3IobC50ZXh0Q29udGVudD0iIixmPTA7bz1kW2YrK107KWlmKGkmJk0uaW5BcnJheShvLGkpPi0xKXImJnIucHVzaChvKTtlbHNlIGlmKGM9TS5jb250YWlucyhvLm93bmVyRG9jdW1lbnQsbykscz1ndChsLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxjJiZ2dChzKSxuKWZvcihoPTA7bz1zW2grK107KXB0LnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKTtyZXR1cm4gbH1idD1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoeXQ9cy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHl0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSx5dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYnQuYXBwZW5kQ2hpbGQoeXQpLHYuY2hlY2tDbG9uZT1idC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYnQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix2Lm5vQ2xvbmVDaGVja2VkPSEhYnQuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciB4dD1zLmRvY3VtZW50RWxlbWVudCxNdD0vXmtleS8sU3Q9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLEV0PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24ga3QoKXt0cnl7cmV0dXJuIHMuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fWZ1bmN0aW9uIE90KHQsZSxuLGkscixvKXt2YXIgcyxhO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGEgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihpPWl8fG4sbj12b2lkIDApLGUpT3QodCxhLG4saSxlW2FdLG8pO3JldHVybiB0fWlmKG51bGw9PWkmJm51bGw9PXI/KHI9bixpPW49dm9pZCAwKTpudWxsPT1yJiYoInN0cmluZyI9PXR5cGVvZiBuPyhyPWksaT12b2lkIDApOihyPWksaT1uLG49dm9pZCAwKSksITE9PT1yKXI9Q3Q7ZWxzZSBpZighcilyZXR1cm4gdDtyZXR1cm4gMT09PW8mJihzPXIsKHI9ZnVuY3Rpb24odCl7cmV0dXJuIE0oKS5vZmYodCkscy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD1NLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe00uZXZlbnQuYWRkKHRoaXMsZSxyLGksbil9KX1NLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnPVouZ2V0KHQpO2lmKGcpZm9yKG4uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixyPW8uc2VsZWN0b3IpLHImJk0uZmluZC5tYXRjaGVzU2VsZWN0b3IoeHQsciksbi5ndWlkfHwobi5ndWlkPU0uZ3VpZCsrKSwodT1nLmV2ZW50cyl8fCh1PWcuZXZlbnRzPXt9KSwocz1nLmhhbmRsZSl8fChzPWcuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1NJiZNLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9NLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goeil8fFsiIl0pLmxlbmd0aDtjLS07KWY9bT0oYT1FdC5leGVjKGVbY10pfHxbXSlbMV0scD0oYVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGYmJihsPU0uZXZlbnQuc3BlY2lhbFtmXXx8e30sZj0ocj9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8ZixsPU0uZXZlbnQuc3BlY2lhbFtmXXx8e30saD1NLmV4dGVuZCh7dHlwZTpmLG9yaWdUeXBlOm0sZGF0YTppLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpyLG5lZWRzQ29udGV4dDpyJiZNLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QociksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxvKSwoZD11W2ZdKXx8KChkPXVbZl09W10pLmRlbGVnYXRlQ291bnQ9MCxsLnNldHVwJiYhMSE9PWwuc2V0dXAuY2FsbCh0LGkscCxzKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZixzKSksbC5hZGQmJihsLmFkZC5jYWxsKHQsaCksaC5oYW5kbGVyLmd1aWR8fChoLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxyP2Quc3BsaWNlKGQuZGVsZWdhdGVDb3VudCsrLDAsaCk6ZC5wdXNoKGgpLE0uZXZlbnQuZ2xvYmFsW2ZdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnPVouaGFzRGF0YSh0KSYmWi5nZXQodCk7aWYoZyYmKHU9Zy5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKHopfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihmPW09KGE9RXQuZXhlYyhlW2NdKXx8W10pWzFdLHA9KGFbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxmKXtmb3IobD1NLmV2ZW50LnNwZWNpYWxbZl18fHt9LGQ9dVtmPShpP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxmXXx8W10sYT1hWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLHM9bz1kLmxlbmd0aDtvLS07KWg9ZFtvXSwhciYmbSE9PWgub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWguZ3VpZHx8YSYmIWEudGVzdChoLm5hbWVzcGFjZSl8fGkmJmkhPT1oLnNlbGVjdG9yJiYoIioqIiE9PWl8fCFoLnNlbGVjdG9yKXx8KGQuc3BsaWNlKG8sMSksaC5zZWxlY3RvciYmZC5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwodCxoKSk7cyYmIWQubGVuZ3RoJiYobC50ZWFyZG93biYmITEhPT1sLnRlYXJkb3duLmNhbGwodCxwLGcuaGFuZGxlKXx8TS5yZW1vdmVFdmVudCh0LGYsZy5oYW5kbGUpLGRlbGV0ZSB1W2ZdKX1lbHNlIGZvcihmIGluIHUpTS5ldmVudC5yZW1vdmUodCxmK2VbY10sbixpLCEwKTtNLmlzRW1wdHlPYmplY3QodSkmJloucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhPU0uZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFouZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saD1NLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307Zm9yKHVbMF09YSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWgucHJlRGlzcGF0Y2h8fCExIT09aC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkpe2ZvcihzPU0uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsYyksZT0wOyhyPXNbZSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihhLmN1cnJlbnRUYXJnZXQ9ci5lbGVtLG49MDsobz1yLmhhbmRsZXJzW24rK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylhLnJuYW1lc3BhY2UmJiFhLnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fChhLmhhbmRsZU9iaj1vLGEuZGF0YT1vLmRhdGEsdm9pZCAwIT09KGk9KChNLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoci5lbGVtLHUpKSYmITE9PT0oYS5yZXN1bHQ9aSkmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBoLnBvc3REaXNwYXRjaCYmaC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbyxzLGE9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKG89W10scz17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1zW3I9KGk9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKHNbcl09aS5uZWVkc0NvbnRleHQ/TShyLHRoaXMpLmluZGV4KGMpPi0xOk0uZmluZChyLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksc1tyXSYmby5wdXNoKGkpO28ubGVuZ3RoJiZhLnB1c2goe2VsZW06YyxoYW5kbGVyczpvfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZhLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksYX0sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShNLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6YihlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbTS5leHBhbmRvXT90Om5ldyBNLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09a3QoKSYmdGhpcy5mb2N1cylyZXR1cm4gdGhpcy5mb2N1cygpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcz09PWt0KCkmJnRoaXMuYmx1cilyZXR1cm4gdGhpcy5ibHVyKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKCJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJlAodGhpcywiaW5wdXQiKSlyZXR1cm4gdGhpcy5jbGljaygpLCExfSxfZGVmYXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gUCh0LnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LE0ucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LE0uRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBNLkV2ZW50KSlyZXR1cm4gbmV3IE0uRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZNLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbTS5leHBhbmRvXT0hMH0sTS5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk0uRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sTS5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24odCl7dmFyIGU9dC5idXR0b247cmV0dXJuIG51bGw9PXQud2hpY2gmJk10LnRlc3QodC50eXBlKT9udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlOiF0LndoaWNoJiZ2b2lkIDAhPT1lJiZTdC50ZXN0KHQudHlwZSk/MSZlPzE6MiZlPzM6NCZlPzI6MDp0LndoaWNofX0sTS5ldmVudC5hZGRQcm9wKSxNLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7TS5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixpPXQucmVsYXRlZFRhcmdldCxyPXQuaGFuZGxlT2JqO3JldHVybiBpJiYoaT09PXRoaXN8fE0uY29udGFpbnModGhpcyxpKSl8fCh0LnR5cGU9ci5vcmlnVHlwZSxuPXIuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC50eXBlPWUpLG59fX0pLE0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gT3QodGhpcyx0LGUsbixpKX0sb25lOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBPdCh0aGlzLHQsZSxuLGksMSl9LG9mZjpmdW5jdGlvbih0LGUsbil7dmFyIGkscjtpZih0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LmhhbmRsZU9iailyZXR1cm4gaT10LmhhbmRsZU9iaixNKHQuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHIgaW4gdCl0aGlzLm9mZihyLGUsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZXx8KG49ZSxlPXZvaWQgMCksITE9PT1uJiYobj1DdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TS5ldmVudC5yZW1vdmUodGhpcyx0LG4sZSl9KX19KTt2YXIgUHQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopW14+XSopXC8+L2dpLFR0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLGp0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLEl0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBMdCh0LGUpe3JldHVybiBQKHQsInRhYmxlIikmJlAoMTEhPT1lLm5vZGVUeXBlP2U6ZS5maXJzdENoaWxkLCJ0ciIpJiZNKHQpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiB0LnR5cGU9KG51bGwhPT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrdC50eXBlLHR9ZnVuY3Rpb24gRHQodCl7cmV0dXJuInRydWUvIj09PSh0LnR5cGV8fCIiKS5zbGljZSgwLDUpP3QudHlwZT10LnR5cGUuc2xpY2UoNSk6dC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0fWZ1bmN0aW9uIFJ0KHQsZSl7dmFyIG4saSxyLG8scyxhLHUsYztpZigxPT09ZS5ub2RlVHlwZSl7aWYoWi5oYXNEYXRhKHQpJiYobz1aLmFjY2Vzcyh0KSxzPVouc2V0KGUsbyksYz1vLmV2ZW50cykpZm9yKHIgaW4gZGVsZXRlIHMuaGFuZGxlLHMuZXZlbnRzPXt9LGMpZm9yKG49MCxpPWNbcl0ubGVuZ3RoO248aTtuKyspTS5ldmVudC5hZGQoZSxyLGNbcl1bbl0pO1EuaGFzRGF0YSh0KSYmKGE9US5hY2Nlc3ModCksdT1NLmV4dGVuZCh7fSxhKSxRLnNldChlLHUpKX19ZnVuY3Rpb24genQodCxlLG4saSl7ZT1jLmFwcGx5KFtdLGUpO3ZhciByLG8scyxhLHUsaCxsPTAsZD10Lmxlbmd0aCxmPWQtMSxwPWVbMF0sbT1iKHApO2lmKG18fGQ+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhdi5jaGVja0Nsb25lJiZqdC50ZXN0KHApKXJldHVybiB0LmVhY2goZnVuY3Rpb24ocil7dmFyIG89dC5lcShyKTttJiYoZVswXT1wLmNhbGwodGhpcyxyLG8uaHRtbCgpKSksenQobyxlLG4saSl9KTtpZihkJiYobz0ocj13dChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LGkpKS5maXJzdENoaWxkLDE9PT1yLmNoaWxkTm9kZXMubGVuZ3RoJiYocj1vKSxvfHxpKSl7Zm9yKGE9KHM9TS5tYXAoZ3Qociwic2NyaXB0IiksQnQpKS5sZW5ndGg7bDxkO2wrKyl1PXIsbCE9PWYmJih1PU0uY2xvbmUodSwhMCwhMCksYSYmTS5tZXJnZShzLGd0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbbF0sdSxsKTtpZihhKWZvcihoPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxNLm1hcChzLER0KSxsPTA7bDxhO2wrKyl1PXNbbF0scHQudGVzdCh1LnR5cGV8fCIiKSYmIVouYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmTS5jb250YWlucyhoLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/TS5fZXZhbFVybCYmTS5fZXZhbFVybCh1LnNyYyk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoSXQsIiIpLGgsdSkpfXJldHVybiB0fWZ1bmN0aW9uIE50KHQsZSxuKXtmb3IodmFyIGkscj1lP00uZmlsdGVyKGUsdCk6dCxvPTA7bnVsbCE9KGk9cltvXSk7bysrKW58fDEhPT1pLm5vZGVUeXBlfHxNLmNsZWFuRGF0YShndChpKSksaS5wYXJlbnROb2RlJiYobiYmTS5jb250YWlucyhpLm93bmVyRG9jdW1lbnQsaSkmJnZ0KGd0KGksInNjcmlwdCIpKSxpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSkpO3JldHVybiB0fU0uZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoUHQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHMsYSx1LGMsaD10LmNsb25lTm9kZSghMCksbD1NLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KTtpZighKHYubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fE0uaXNYTUxEb2ModCkpKWZvcihzPWd0KGgpLGk9MCxyPShvPWd0KHQpKS5sZW5ndGg7aTxyO2krKylhPW9baV0sdT1zW2ldLGM9dm9pZCAwLCJpbnB1dCI9PT0oYz11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZkdC50ZXN0KGEudHlwZSk/dS5jaGVja2VkPWEuY2hlY2tlZDoiaW5wdXQiIT09YyYmInRleHRhcmVhIiE9PWN8fCh1LmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSk7aWYoZSlpZihuKWZvcihvPW98fGd0KHQpLHM9c3x8Z3QoaCksaT0wLHI9by5sZW5ndGg7aTxyO2krKylSdChvW2ldLHNbaV0pO2Vsc2UgUnQodCxoKTtyZXR1cm4ocz1ndChoLCJzY3JpcHQiKSkubGVuZ3RoPjAmJnZ0KHMsIWwmJmd0KHQsInNjcmlwdCIpKSxofSxjbGVhbkRhdGE6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4saSxyPU0uZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49dFtvXSk7bysrKWlmKEcobikpe2lmKGU9bltaLmV4cGFuZG9dKXtpZihlLmV2ZW50cylmb3IoaSBpbiBlLmV2ZW50cylyW2ldP00uZXZlbnQucmVtb3ZlKG4saSk6TS5yZW1vdmVFdmVudChuLGksZS5oYW5kbGUpO25bWi5leHBhbmRvXT12b2lkIDB9bltRLmV4cGFuZG9dJiYobltRLmV4cGFuZG9dPXZvaWQgMCl9fX0pLE0uZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIE50KHRoaXMsdCwhMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gTnQodGhpcyx0KX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gVSh0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P00udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD10KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB6dCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8THQodGhpcyx0KS5hcHBlbmRDaGlsZCh0KX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgZT1MdCh0aGlzLHQpO2UuaW5zZXJ0QmVmb3JlKHQsZS5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtudWxsIT0odD10aGlzW2VdKTtlKyspMT09PXQubm9kZVR5cGUmJihNLmNsZWFuRGF0YShndCh0LCExKSksdC50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bnVsbCE9dCYmdCxlPW51bGw9PWU/dDplLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIE0uY2xvbmUodGhpcyx0LGUpfSl9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIFUodGhpcyxmdW5jdGlvbih0KXt2YXIgZT10aGlzWzBdfHx7fSxuPTAsaT10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT10JiYxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZS5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYhVHQudGVzdCh0KSYmIW10WyhmdC5leGVjKHQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7dD1NLmh0bWxQcmVmaWx0ZXIodCk7dHJ5e2Zvcig7bjxpO24rKykxPT09KGU9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoTS5jbGVhbkRhdGEoZ3QoZSwhMSkpLGUuaW5uZXJIVE1MPXQpO2U9MH1jYXRjaCh0KXt9fWUmJnRoaXMuZW1wdHkoKS5hcHBlbmQodCl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4genQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5wYXJlbnROb2RlO00uaW5BcnJheSh0aGlzLHQpPDAmJihNLmNsZWFuRGF0YShndCh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LHQpfX0pLE0uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKHQsZSl7TS5mblt0XT1mdW5jdGlvbih0KXtmb3IodmFyIG4saT1bXSxyPU0odCksbz1yLmxlbmd0aC0xLHM9MDtzPD1vO3MrKyluPXM9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCksTShyW3NdKVtlXShuKSxoLmFwcGx5KGksbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkpfX0pO3ZhciBXdD1uZXcgUmVnRXhwKCJeKCIraXQrIikoPyFweClbYS16JV0rJCIsImkiKSxxdD1mdW5jdGlvbih0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGUmJmUub3BlbmVyfHwoZT1uKSxlLmdldENvbXB1dGVkU3R5bGUodCl9LEh0PW5ldyBSZWdFeHAob3Quam9pbigifCIpLCJpIik7ZnVuY3Rpb24gRnQodCxlLG4pe3ZhciBpLHIsbyxzLGE9dC5zdHlsZTtyZXR1cm4obj1ufHxxdCh0KSkmJigiIiE9PShzPW4uZ2V0UHJvcGVydHlWYWx1ZShlKXx8bltlXSl8fE0uY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHwocz1NLnN0eWxlKHQsZSkpLCF2LnBpeGVsQm94U3R5bGVzKCkmJld0LnRlc3QocykmJkh0LnRlc3QoZSkmJihpPWEud2lkdGgscj1hLm1pbldpZHRoLG89YS5tYXhXaWR0aCxhLm1pbldpZHRoPWEubWF4V2lkdGg9YS53aWR0aD1zLHM9bi53aWR0aCxhLndpZHRoPWksYS5taW5XaWR0aD1yLGEubWF4V2lkdGg9bykpLHZvaWQgMCE9PXM/cysiIjpzfWZ1bmN0aW9uIFZ0KHQsZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCF0KCkpcmV0dXJuKHRoaXMuZ2V0PWUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYoaCl7Yy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixoLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHh0LmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGgpO3ZhciB0PW4uZ2V0Q29tcHV0ZWRTdHlsZShoKTtpPSIxJSIhPT10LnRvcCx1PTEyPT09ZSh0Lm1hcmdpbkxlZnQpLGguc3R5bGUucmlnaHQ9IjYwJSIsYT0zNj09PWUodC5yaWdodCkscj0zNj09PWUodC53aWR0aCksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLG89MzY9PT1oLm9mZnNldFdpZHRofHwiYWJzb2x1dGUiLHh0LnJlbW92ZUNoaWxkKGMpLGg9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgaSxyLG8sYSx1LGM9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxoPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZSYmKGguc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixoLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdi5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWguc3R5bGUuYmFja2dyb3VuZENsaXAsTS5leHRlbmQodix7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxhfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99fSkpfSgpO3ZhciBVdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sS3Q9L14tLS8sWXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFh0PXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSwkdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sR3Q9cy5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBKdCh0KXt2YXIgZT1NLmNzc1Byb3BzW3RdO3JldHVybiBlfHwoZT1NLmNzc1Byb3BzW3RdPWZ1bmN0aW9uKHQpe2lmKHQgaW4gR3QpcmV0dXJuIHQ7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49JHQubGVuZ3RoO24tLTspaWYoKHQ9JHRbbl0rZSlpbiBHdClyZXR1cm4gdH0odCl8fHQpLGV9ZnVuY3Rpb24gWnQodCxlLG4pe3ZhciBpPXJ0LmV4ZWMoZSk7cmV0dXJuIGk/TWF0aC5tYXgoMCxpWzJdLShufHwwKSkrKGlbM118fCJweCIpOmV9ZnVuY3Rpb24gUXQodCxlLG4saSxyLG8pe3ZhciBzPSJ3aWR0aCI9PT1lPzE6MCxhPTAsdT0wO2lmKG49PT0oaT8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7czw0O3MrPTIpIm1hcmdpbiI9PT1uJiYodSs9TS5jc3ModCxuK290W3NdLCEwLHIpKSxpPygiY29udGVudCI9PT1uJiYodS09TS5jc3ModCwicGFkZGluZyIrb3Rbc10sITAscikpLCJtYXJnaW4iIT09biYmKHUtPU0uY3NzKHQsImJvcmRlciIrb3Rbc10rIldpZHRoIiwhMCxyKSkpOih1Kz1NLmNzcyh0LCJwYWRkaW5nIitvdFtzXSwhMCxyKSwicGFkZGluZyIhPT1uP3UrPU0uY3NzKHQsImJvcmRlciIrb3Rbc10rIldpZHRoIiwhMCxyKTphKz1NLmNzcyh0LCJib3JkZXIiK290W3NdKyJXaWR0aCIsITAscikpO3JldHVybiFpJiZvPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tby11LWEtLjUpKSksdX1mdW5jdGlvbiB0ZSh0LGUsbil7dmFyIGk9cXQodCkscj1GdCh0LGUsaSksbz0iYm9yZGVyLWJveCI9PT1NLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHM9bztpZihXdC50ZXN0KHIpKXtpZighbilyZXR1cm4gcjtyPSJhdXRvIn1yZXR1cm4gcz1zJiYodi5ib3hTaXppbmdSZWxpYWJsZSgpfHxyPT09dC5zdHlsZVtlXSksKCJhdXRvIj09PXJ8fCFwYXJzZUZsb2F0KHIpJiYiaW5saW5lIj09PU0uY3NzKHQsImRpc3BsYXkiLCExLGkpKSYmKHI9dFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0scz0hMCksKHI9cGFyc2VGbG9hdChyKXx8MCkrUXQodCxlLG58fChvPyJib3JkZXIiOiJjb250ZW50IikscyxpLHIpKyJweCJ9ZnVuY3Rpb24gZWUodCxlLG4saSxyKXtyZXR1cm4gbmV3IGVlLnByb3RvdHlwZS5pbml0KHQsZSxuLGkscil9TS5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1GdCh0LCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIHIsbyxzLGE9JChlKSx1PUt0LnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPUp0KGEpKSxzPU0uY3NzSG9va3NbZV18fE0uY3NzSG9va3NbYV0sdm9pZCAwPT09bilyZXR1cm4gcyYmImdldCJpbiBzJiZ2b2lkIDAhPT0ocj1zLmdldCh0LCExLGkpKT9yOmNbZV07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihyPXJ0LmV4ZWMobikpJiZyWzFdJiYobj11dCh0LGUsciksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiPT09byYmKG4rPXImJnJbM118fChNLmNzc051bWJlclthXT8iIjoicHgiKSksdi5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLHMmJiJzZXQiaW4gcyYmdm9pZCAwPT09KG49cy5zZXQodCxuLGkpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByLG8scyxhPSQoZSk7cmV0dXJuIEt0LnRlc3QoZSl8fChlPUp0KGEpKSwocz1NLmNzc0hvb2tzW2VdfHxNLmNzc0hvb2tzW2FdKSYmImdldCJpbiBzJiYocj1zLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1yJiYocj1GdCh0LGUsaSkpLCJub3JtYWwiPT09ciYmZSBpbiBYdCYmKHI9WHRbZV0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KHIpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDpyKTpyfX0pLE0uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtNLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLGkpe2lmKG4pcmV0dXJuIVV0LnRlc3QoTS5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD90ZSh0LGUsaSk6YXQodCxZdCxmdW5jdGlvbigpe3JldHVybiB0ZSh0LGUsaSl9KX0sc2V0OmZ1bmN0aW9uKHQsbixpKXt2YXIgcixvPXF0KHQpLHM9ImJvcmRlci1ib3giPT09TS5jc3ModCwiYm94U2l6aW5nIiwhMSxvKSxhPWkmJlF0KHQsZSxpLHMsbyk7cmV0dXJuIHMmJnYuc2Nyb2xsYm94U2l6ZSgpPT09by5wb3NpdGlvbiYmKGEtPU1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1wYXJzZUZsb2F0KG9bZV0pLVF0KHQsZSwiYm9yZGVyIiwhMSxvKS0uNSkpLGEmJihyPXJ0LmV4ZWMobikpJiYicHgiIT09KHJbM118fCJweCIpJiYodC5zdHlsZVtlXT1uLG49TS5jc3ModCxlKSksWnQoMCxuLGEpfX19KSxNLmNzc0hvb2tzLm1hcmdpbkxlZnQ9VnQodi5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24odCxlKXtpZihlKXJldHVybihwYXJzZUZsb2F0KEZ0KHQsIm1hcmdpbkxlZnQiKSl8fHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1hdCh0LHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksTS5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24odCxlKXtNLmNzc0hvb2tzW3QrZV09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIGk9MCxyPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07aTw0O2krKylyW3Qrb3RbaV0rZV09b1tpXXx8b1tpLTJdfHxvWzBdO3JldHVybiByfX0sIm1hcmdpbiIhPT10JiYoTS5jc3NIb29rc1t0K2VdLnNldD1adCl9KSxNLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXt9LHM9MDtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IoaT1xdCh0KSxyPWUubGVuZ3RoO3M8cjtzKyspb1tlW3NdXT1NLmNzcyh0LGVbc10sITEsaSk7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/TS5zdHlsZSh0LGUsbik6TS5jc3ModCxlKX0sdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9fSksTS5Ud2Vlbj1lZSxlZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmVlLGluaXQ6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuZWxlbT10LHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPXJ8fE0uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1lLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1pLHRoaXMudW5pdD1vfHwoTS5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciB0PWVlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0JiZ0LmdldD90LmdldCh0aGlzKTplZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24odCl7dmFyIGUsbj1lZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWU9TS5lYXNpbmdbdGhpcy5lYXNpbmddKHQsdGhpcy5vcHRpb25zLmR1cmF0aW9uKnQsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZT10LHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSplK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmVlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGVlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1lZS5wcm90b3R5cGUsZWUucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAxIT09dC5lbGVtLm5vZGVUeXBlfHxudWxsIT10LmVsZW1bdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW3QucHJvcF0/dC5lbGVtW3QucHJvcF06KGU9TS5jc3ModC5lbGVtLHQucHJvcCwiIikpJiYiYXV0byIhPT1lP2U6MH0sc2V0OmZ1bmN0aW9uKHQpe00uZnguc3RlcFt0LnByb3BdP00uZnguc3RlcFt0LnByb3BdKHQpOjEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGw9PXQuZWxlbS5zdHlsZVtNLmNzc1Byb3BzW3QucHJvcF1dJiYhTS5jc3NIb29rc1t0LnByb3BdP3QuZWxlbVt0LnByb3BdPXQubm93Ok0uc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGVlLnByb3BIb29rcy5zY3JvbGxUb3A9ZWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sTS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxNLmZ4PWVlLnByb3RvdHlwZS5pbml0LE0uZnguc3RlcD17fTt2YXIgbmUsaWUscmU9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLG9lPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gc2UoKXtpZSYmKCExPT09cy5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNlKTpuLnNldFRpbWVvdXQoc2UsTS5meC5pbnRlcnZhbCksTS5meC50aWNrKCkpfWZ1bmN0aW9uIGFlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe25lPXZvaWQgMH0pLG5lPURhdGUubm93KCl9ZnVuY3Rpb24gdWUodCxlKXt2YXIgbixpPTAscj17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO2k8NDtpKz0yLWUpclsibWFyZ2luIisobj1vdFtpXSldPXJbInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihyLm9wYWNpdHk9ci53aWR0aD10KSxyfWZ1bmN0aW9uIGNlKHQsZSxuKXtmb3IodmFyIGkscj0oaGUudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoaGUudHdlZW5lcnNbIioiXSksbz0wLHM9ci5sZW5ndGg7bzxzO28rKylpZihpPXJbb10uY2FsbChuLGUsdCkpcmV0dXJuIGl9ZnVuY3Rpb24gaGUodCxlLG4pe3ZhciBpLHIsbz0wLHM9aGUucHJlZmlsdGVycy5sZW5ndGgsYT1NLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihyKXJldHVybiExO2Zvcih2YXIgZT1uZXx8YWUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxpPTEtKG4vYy5kdXJhdGlvbnx8MCksbz0wLHM9Yy50d2VlbnMubGVuZ3RoO288cztvKyspYy50d2VlbnNbb10ucnVuKGkpO3JldHVybiBhLm5vdGlmeVdpdGgodCxbYyxpLG5dKSxpPDEmJnM/bjooc3x8YS5ub3RpZnlXaXRoKHQsW2MsMSwwXSksYS5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPWEucHJvbWlzZSh7ZWxlbTp0LHByb3BzOk0uZXh0ZW5kKHt9LGUpLG9wdHM6TS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOk0uZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6bmV8fGFlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgaT1NLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2goaSksaX0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLGk9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihyKXJldHVybiB0aGlzO2ZvcihyPSEwO248aTtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhhLm5vdGlmeVdpdGgodCxbYywxLDBdKSxhLnJlc29sdmVXaXRoKHQsW2MsZV0pKTphLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxoPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM7Zm9yKG4gaW4gdClpZihyPWVbaT0kKG4pXSxvPXRbbl0sQXJyYXkuaXNBcnJheShvKSYmKHI9b1sxXSxvPXRbbl09b1swXSksbiE9PWkmJih0W2ldPW8sZGVsZXRlIHRbbl0pLChzPU0uY3NzSG9va3NbaV0pJiYiZXhwYW5kImluIHMpZm9yKG4gaW4gbz1zLmV4cGFuZChvKSxkZWxldGUgdFtpXSxvKW4gaW4gdHx8KHRbbl09b1tuXSxlW25dPXIpO2Vsc2UgZVtpXT1yfShoLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtvPHM7bysrKWlmKGk9aGUucHJlZmlsdGVyc1tvXS5jYWxsKGMsdCxoLGMub3B0cykpcmV0dXJuIGIoaS5zdG9wKSYmKE0uX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1pLnN0b3AuYmluZChpKSksaTtyZXR1cm4gTS5tYXAoaCxjZSxjKSxiKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksTS5meC50aW1lcihNLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfU0uQW5pbWF0aW9uPU0uZXh0ZW5kKGhlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gdXQobi5lbGVtLHQscnQuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXtiKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKHopO2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7aSsrKW49dFtpXSxoZS50d2VlbmVyc1tuXT1oZS50d2VlbmVyc1tuXXx8W10saGUudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzLGEsdSxjLGgsbD0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLGQ9dGhpcyxmPXt9LHA9dC5zdHlsZSxtPXQubm9kZVR5cGUmJnN0KHQpLGc9Wi5nZXQodCwiZnhzaG93Iik7Zm9yKGkgaW4gbi5xdWV1ZXx8KG51bGw9PShzPU0uX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihzLnVucXVldWVkPTAsYT1zLmVtcHR5LmZpcmUscy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7cy51bnF1ZXVlZHx8YSgpfSkscy51bnF1ZXVlZCsrLGQuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5hbHdheXMoZnVuY3Rpb24oKXtzLnVucXVldWVkLS0sTS5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8cy5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKHI9ZVtpXSxyZS50ZXN0KHIpKXtpZihkZWxldGUgZVtpXSxvPW98fCJ0b2dnbGUiPT09cixyPT09KG0/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PXJ8fCFnfHx2b2lkIDA9PT1nW2ldKWNvbnRpbnVlO209ITB9ZltpXT1nJiZnW2ldfHxNLnN0eWxlKHQsaSl9aWYoKHU9IU0uaXNFbXB0eU9iamVjdChlKSl8fCFNLmlzRW1wdHlPYmplY3QoZikpZm9yKGkgaW4gbCYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxudWxsPT0oYz1nJiZnLmRpc3BsYXkpJiYoYz1aLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShoPU0uY3NzKHQsImRpc3BsYXkiKSkmJihjP2g9YzoobHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxoPU0uY3NzKHQsImRpc3BsYXkiKSxsdChbdF0pKSksKCJpbmxpbmUiPT09aHx8ImlubGluZS1ibG9jayI9PT1oJiZudWxsIT1jKSYmIm5vbmUiPT09TS5jc3ModCwiZmxvYXQiKSYmKHV8fChkLmRvbmUoZnVuY3Rpb24oKXtwLmRpc3BsYXk9Y30pLG51bGw9PWMmJihoPXAuZGlzcGxheSxjPSJub25lIj09PWg/IiI6aCkpLHAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGQuYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGYpdXx8KGc/ImhpZGRlbiJpbiBnJiYobT1nLmhpZGRlbik6Zz1aLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxvJiYoZy5oaWRkZW49IW0pLG0mJmx0KFt0XSwhMCksZC5kb25lKGZ1bmN0aW9uKCl7Zm9yKGkgaW4gbXx8bHQoW3RdKSxaLnJlbW92ZSh0LCJmeHNob3ciKSxmKU0uc3R5bGUodCxpLGZbaV0pfSkpLHU9Y2UobT9nW2ldOjAsaSxkKSxpIGluIGd8fChnW2ldPXUuc3RhcnQsbSYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2hlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpoZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksTS5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dCYmIm9iamVjdCI9PXR5cGVvZiB0P00uZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8Yih0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhYihlKSYmZX07cmV0dXJuIE0uZngub2ZmP2kuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGkuZHVyYXRpb24mJihpLmR1cmF0aW9uIGluIE0uZnguc3BlZWRzP2kuZHVyYXRpb249TS5meC5zcGVlZHNbaS5kdXJhdGlvbl06aS5kdXJhdGlvbj1NLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9aS5xdWV1ZSYmITAhPT1pLnF1ZXVlfHwoaS5xdWV1ZT0iZngiKSxpLm9sZD1pLmNvbXBsZXRlLGkuY29tcGxldGU9ZnVuY3Rpb24oKXtiKGkub2xkKSYmaS5vbGQuY2FsbCh0aGlzKSxpLnF1ZXVlJiZNLmRlcXVldWUodGhpcyxpLnF1ZXVlKX0saX0sTS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5maWx0ZXIoc3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLGkpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPU0uaXNFbXB0eU9iamVjdCh0KSxvPU0uc3BlZWQoZSxuLGkpLHM9ZnVuY3Rpb24oKXt2YXIgZT1oZSh0aGlzLE0uZXh0ZW5kKHt9LHQpLG8pOyhyfHxaLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBzLmZpbmlzaD1zLHJ8fCExPT09by5xdWV1ZT90aGlzLmVhY2gocyk6dGhpcy5xdWV1ZShvLnF1ZXVlLHMpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAscj1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixvPU0udGltZXJzLHM9Wi5nZXQodGhpcyk7aWYocilzW3JdJiZzW3JdLnN0b3AmJmkoc1tyXSk7ZWxzZSBmb3IociBpbiBzKXNbcl0mJnNbcl0uc3RvcCYmb2UudGVzdChyKSYmaShzW3JdKTtmb3Iocj1vLmxlbmd0aDtyLS07KW9bcl0uZWxlbSE9PXRoaXN8fG51bGwhPXQmJm9bcl0ucXVldWUhPT10fHwob1tyXS5hbmltLnN0b3AobiksZT0hMSxvLnNwbGljZShyLDEpKTshZSYmbnx8TS5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1aLmdldCh0aGlzKSxpPW5bdCsicXVldWUiXSxyPW5bdCsicXVldWVIb29rcyJdLG89TS50aW1lcnMscz1pP2kubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLE0ucXVldWUodGhpcyx0LFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9by5sZW5ndGg7ZS0tOylvW2VdLmVsZW09PT10aGlzJiZvW2VdLnF1ZXVlPT09dCYmKG9bZV0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8cztlKyspaVtlXSYmaVtlXS5maW5pc2gmJmlbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksTS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPU0uZm5bZV07TS5mbltlXT1mdW5jdGlvbih0LGkscil7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHVlKGUsITApLHQsaSxyKX19KSxNLmVhY2goe3NsaWRlRG93bjp1ZSgic2hvdyIpLHNsaWRlVXA6dWUoImhpZGUiKSxzbGlkZVRvZ2dsZTp1ZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe00uZm5bdF09ZnVuY3Rpb24odCxuLGkpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4saSl9fSksTS50aW1lcnM9W10sTS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49TS50aW1lcnM7Zm9yKG5lPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8TS5meC5zdG9wKCksbmU9dm9pZCAwfSxNLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe00udGltZXJzLnB1c2godCksTS5meC5zdGFydCgpfSxNLmZ4LmludGVydmFsPTEzLE0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpZXx8KGllPSEwLHNlKCkpfSxNLmZ4LnN0b3A9ZnVuY3Rpb24oKXtpZT1udWxsfSxNLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxNLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9TS5meCYmTS5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLGkpe3ZhciByPW4uc2V0VGltZW91dChlLHQpO2kuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KHIpfX0pfSxmdW5jdGlvbigpe3ZhciB0PXMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPXMuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQocy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIsdi5jaGVja09uPSIiIT09dC52YWx1ZSx2Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9cy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIsdi5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIGxlLGRlPU0uZXhwci5hdHRySGFuZGxlO00uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxNLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00ucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksTS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbz10Lm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP00ucHJvcCh0LGUsbik6KDE9PT1vJiZNLmlzWE1MRG9jKHQpfHwocj1NLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoTS5leHByLm1hdGNoLmJvb2wudGVzdChlKT9sZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgTS5yZW1vdmVBdHRyKHQsZSk6ciYmInNldCJpbiByJiZ2b2lkIDAhPT0oaT1yLnNldCh0LG4sZSkpP2k6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6ciYmImdldCJpbiByJiZudWxsIT09KGk9ci5nZXQodCxlKSk/aTpudWxsPT0oaT1NLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6aSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXYucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJlAodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixpPTAscj1lJiZlLm1hdGNoKHopO2lmKHImJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1yW2krK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGxlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9NLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxNLmVhY2goTS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj1kZVtlXXx8TS5maW5kLmF0dHI7ZGVbZV09ZnVuY3Rpb24odCxlLGkpe3ZhciByLG8scz1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGl8fChvPWRlW3NdLGRlW3NdPXIscj1udWxsIT1uKHQsZSxpKT9zOm51bGwsZGVbc109bykscn19KTt2YXIgZmU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxwZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gbWUodCl7cmV0dXJuKHQubWF0Y2goeil8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goeil8fFtdfU0uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxNLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW00ucHJvcEZpeFt0XXx8dF19KX19KSxNLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXQubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJk0uaXNYTUxEb2ModCl8fChlPU0ucHJvcEZpeFtlXXx8ZSxyPU0ucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP3ImJiJzZXQiaW4gciYmdm9pZCAwIT09KGk9ci5zZXQodCxuLGUpKT9pOnRbZV09bjpyJiYiZ2V0ImluIHImJm51bGwhPT0oaT1yLmdldCh0LGUpKT9pOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1NLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOmZlLnRlc3QodC5ub2RlTmFtZSl8fHBlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSksdi5vcHRTZWxlY3RlZHx8KE0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxNLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe00ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxNLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIsbyxzLGEsdT0wO2lmKGIodCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtNKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsZ2UodGhpcykpKX0pO2lmKChlPXZlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYocj1nZShuKSxpPTE9PT1uLm5vZGVUeXBlJiYiICIrbWUocikrIiAiKXtmb3Iocz0wO289ZVtzKytdOylpLmluZGV4T2YoIiAiK28rIiAiKTwwJiYoaSs9bysiICIpO3IhPT0oYT1tZShpKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhLHU9MDtpZihiKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7TSh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLGdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPXZlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYocj1nZShuKSxpPTE9PT1uLm5vZGVUeXBlJiYiICIrbWUocikrIiAiKXtmb3Iocz0wO289ZVtzKytdOylmb3IoO2kuaW5kZXhPZigiICIrbysiICIpPi0xOylpPWkucmVwbGFjZSgiICIrbysiICIsIiAiKTtyIT09KGE9bWUoaSkpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LGk9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJmk/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6Yih0KT90aGlzLmVhY2goZnVuY3Rpb24obil7TSh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLGdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUscixvLHM7aWYoaSlmb3Iocj0wLG89TSh0aGlzKSxzPXZlKHQpO2U9c1tyKytdOylvLmhhc0NsYXNzKGUpP28ucmVtb3ZlQ2xhc3MoZSk6by5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT1nZSh0aGlzKSkmJlouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpaLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tpKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIittZShnZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBiZT0vXHIvZztNLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9Yih0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIHI7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0ocj1pP3QuY2FsbCh0aGlzLG4sTSh0aGlzKS52YWwoKSk6dCk/cj0iIjoibnVtYmVyIj09dHlwZW9mIHI/cis9IiI6QXJyYXkuaXNBcnJheShyKSYmKHI9TS5tYXAocixmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPU0udmFsSG9va3NbdGhpcy50eXBlXXx8TS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLHIsInZhbHVlIil8fCh0aGlzLnZhbHVlPXIpKX0pKTpyPyhlPU0udmFsSG9va3Nbci50eXBlXXx8TS52YWxIb29rc1tyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChyLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1yLnZhbHVlKT9uLnJlcGxhY2UoYmUsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksTS5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1NLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6bWUoTS50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyPXQub3B0aW9ucyxvPXQuc2VsZWN0ZWRJbmRleCxzPSJzZWxlY3Qtb25lIj09PXQudHlwZSxhPXM/bnVsbDpbXSx1PXM/bysxOnIubGVuZ3RoO2ZvcihpPW88MD91OnM/bzowO2k8dTtpKyspaWYoKChuPXJbaV0pLnNlbGVjdGVkfHxpPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IVAobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1NKG4pLnZhbCgpLHMpcmV0dXJuIGU7YS5wdXNoKGUpfXJldHVybiBhfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyPXQub3B0aW9ucyxvPU0ubWFrZUFycmF5KGUpLHM9ci5sZW5ndGg7cy0tOykoKGk9cltzXSkuc2VsZWN0ZWQ9TS5pbkFycmF5KE0udmFsSG9va3Mub3B0aW9uLmdldChpKSxvKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLE0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe00udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1NLmluQXJyYXkoTSh0KS52YWwoKSxlKT4tMX19LHYuY2hlY2tPbnx8KE0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx2LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciB5ZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sX2U9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07TS5leHRlbmQoTS5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbyxhLHUsYyxoLGwsZCxmLG09W2l8fHNdLGc9cC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx2PXAuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9Zj11PWk9aXx8cywzIT09aS5ub2RlVHlwZSYmOCE9PWkubm9kZVR5cGUmJiF5ZS50ZXN0KGcrTS5ldmVudC50cmlnZ2VyZWQpJiYoZy5pbmRleE9mKCIuIik+LTEmJih2PWcuc3BsaXQoIi4iKSxnPXYuc2hpZnQoKSx2LnNvcnQoKSksaD1nLmluZGV4T2YoIjoiKTwwJiYib24iK2csKHQ9dFtNLmV4cGFuZG9dP3Q6bmV3IE0uRXZlbnQoZywib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9cj8yOjMsdC5uYW1lc3BhY2U9di5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Yuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1pKSxlPW51bGw9PWU/W3RdOk0ubWFrZUFycmF5KGUsW3RdKSxkPU0uZXZlbnQuc3BlY2lhbFtnXXx8e30scnx8IWQudHJpZ2dlcnx8ITEhPT1kLnRyaWdnZXIuYXBwbHkoaSxlKSkpe2lmKCFyJiYhZC5ub0J1YmJsZSYmIXkoaSkpe2ZvcihjPWQuZGVsZWdhdGVUeXBlfHxnLHllLnRlc3QoYytnKXx8KGE9YS5wYXJlbnROb2RlKTthO2E9YS5wYXJlbnROb2RlKW0ucHVzaChhKSx1PWE7dT09PShpLm93bmVyRG9jdW1lbnR8fHMpJiZtLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihvPTA7KGE9bVtvKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZj1hLHQudHlwZT1vPjE/YzpkLmJpbmRUeXBlfHxnLChsPShaLmdldChhLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlouZ2V0KGEsImhhbmRsZSIpKSYmbC5hcHBseShhLGUpLChsPWgmJmFbaF0pJiZsLmFwcGx5JiZHKGEpJiYodC5yZXN1bHQ9bC5hcHBseShhLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT1nLHJ8fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGQuX2RlZmF1bHQmJiExIT09ZC5fZGVmYXVsdC5hcHBseShtLnBvcCgpLGUpfHwhRyhpKXx8aCYmYihpW2ddKSYmIXkoaSkmJigodT1pW2hdKSYmKGlbaF09bnVsbCksTS5ldmVudC50cmlnZ2VyZWQ9Zyx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihnLF9lKSxpW2ddKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZyxfZSksTS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihpW2hdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1NLmV4dGVuZChuZXcgTS5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtNLmV2ZW50LnRyaWdnZXIoaSxudWxsLGUpfX0pLE0uZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00uZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIE0uZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSksdi5mb2N1c2lufHxNLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7TS5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LE0uZXZlbnQuZml4KHQpKX07TS5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBpPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxyPVouYWNjZXNzKGksZSk7cnx8aS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksWi5hY2Nlc3MoaSxlLChyfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMscj1aLmFjY2VzcyhpLGUpLTE7cj9aLmFjY2VzcyhpLGUscik6KGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFoucmVtb3ZlKGksZSkpfX19KTt2YXIgd2U9bi5sb2NhdGlvbix4ZT1EYXRlLm5vdygpLE1lPS9cPy87TS5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fE0uZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBTZT0vXFtcXSQvLEVlPS9ccj9cbi9nLEFlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxDZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24ga2UodCxlLG4saSl7dmFyIHI7aWYoQXJyYXkuaXNBcnJheShlKSlNLmVhY2goZSxmdW5jdGlvbihlLHIpe258fFNlLnRlc3QodCk/aSh0LHIpOmtlKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIHImJm51bGwhPXI/ZToiIikrIl0iLHIsbixpKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14KGUpKWkodCxlKTtlbHNlIGZvcihyIGluIGUpa2UodCsiWyIrcisiXSIsZVtyXSxuLGkpfU0ucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixpPVtdLHI9ZnVuY3Rpb24odCxlKXt2YXIgbj1iKGUpP2UoKTplO2lbaS5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKEFycmF5LmlzQXJyYXkodCl8fHQuanF1ZXJ5JiYhTS5pc1BsYWluT2JqZWN0KHQpKU0uZWFjaCh0LGZ1bmN0aW9uKCl7cih0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIHQpa2Uobix0W25dLGUscik7cmV0dXJuIGkuam9pbigiJiIpfSxNLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIE0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgdD1NLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gdD9NLm1ha2VBcnJheSh0KTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFNKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmQ2UudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUFlLnRlc3QodCkmJih0aGlzLmNoZWNrZWR8fCFkdC50ZXN0KHQpKX0pLm1hcChmdW5jdGlvbih0LGUpe3ZhciBuPU0odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP00ubWFwKG4sZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZS5uYW1lLHZhbHVlOnQucmVwbGFjZShFZSwiXHJcbiIpfX0pOntuYW1lOmUubmFtZSx2YWx1ZTpuLnJlcGxhY2UoRWUsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgT2U9LyUyMC9nLFBlPS8jLiokLyxUZT0vKFs/Jl0pXz1bXiZdKi8samU9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxJZT0vXig/OkdFVHxIRUFEKSQvLExlPS9eXC9cLy8sQmU9e30sRGU9e30sUmU9IiovIi5jb25jYXQoIioiKSx6ZT1zLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBOZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iKiIpO3ZhciBpLHI9MCxvPWUudG9Mb3dlckNhc2UoKS5tYXRjaCh6KXx8W107aWYoYihuKSlmb3IoO2k9b1tyKytdOykiKyI9PT1pWzBdPyhpPWkuc2xpY2UoMSl8fCIqIiwodFtpXT10W2ldfHxbXSkudW5zaGlmdChuKSk6KHRbaV09dFtpXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIFdlKHQsZSxuLGkpe3ZhciByPXt9LG89dD09PURlO2Z1bmN0aW9uIHMoYSl7dmFyIHU7cmV0dXJuIHJbYV09ITAsTS5lYWNoKHRbYV18fFtdLGZ1bmN0aW9uKHQsYSl7dmFyIGM9YShlLG4saSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxvfHxyW2NdP28/ISh1PWMpOnZvaWQgMDooZS5kYXRhVHlwZXMudW5zaGlmdChjKSxzKGMpLCExKX0pLHV9cmV0dXJuIHMoZS5kYXRhVHlwZXNbMF0pfHwhclsiKiJdJiZzKCIqIil9ZnVuY3Rpb24gcWUodCxlKXt2YXIgbixpLHI9TS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIGUpdm9pZCAwIT09ZVtuXSYmKChyW25dP3Q6aXx8KGk9e30pKVtuXT1lW25dKTtyZXR1cm4gaSYmTS5leHRlbmQoITAsdCxpKSx0fXplLmhyZWY9d2UuaHJlZixNLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6d2UuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdCh3ZS5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpSZSx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6TS5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/cWUocWUodCxNLmFqYXhTZXR0aW5ncyksZSk6cWUoTS5hamF4U2V0dGluZ3MsdCl9LGFqYXhQcmVmaWx0ZXI6TmUoQmUpLGFqYXhUcmFuc3BvcnQ6TmUoRGUpLGFqYXg6ZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLGU9ZXx8e307dmFyIGkscixvLGEsdSxjLGgsbCxkLGYscD1NLmFqYXhTZXR1cCh7fSxlKSxtPXAuY29udGV4dHx8cCxnPXAuY29udGV4dCYmKG0ubm9kZVR5cGV8fG0uanF1ZXJ5KT9NKG0pOk0uZXZlbnQsdj1NLkRlZmVycmVkKCksYj1NLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx5PXAuc3RhdHVzQ29kZXx8e30sXz17fSx3PXt9LHg9ImNhbmNlbGVkIixTPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCl7dmFyIGU7aWYoaCl7aWYoIWEpZm9yKGE9e307ZT1qZS5leGVjKG8pOylhW2VbMV0udG9Mb3dlckNhc2UoKV09ZVsyXTtlPWFbdC50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09ZT9udWxsOmV9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBoP286bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1oJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LF9bdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09aCYmKHAubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGgpUy5hbHdheXModFtTLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCl5W2VdPVt5W2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHx4O3JldHVybiBpJiZpLmFib3J0KGUpLEUoMCxlKSx0aGlzfX07aWYodi5wcm9taXNlKFMpLHAudXJsPSgodHx8cC51cmx8fHdlLmhyZWYpKyIiKS5yZXBsYWNlKExlLHdlLnByb3RvY29sKyIvLyIpLHAudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxwLm1ldGhvZHx8cC50eXBlLHAuZGF0YVR5cGVzPShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goeil8fFsiIl0sbnVsbD09cC5jcm9zc0RvbWFpbil7Yz1zLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPXAudXJsLGMuaHJlZj1jLmhyZWYscC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7cC5jcm9zc0RvbWFpbj0hMH19aWYocC5kYXRhJiZwLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHAuZGF0YSYmKHAuZGF0YT1NLnBhcmFtKHAuZGF0YSxwLnRyYWRpdGlvbmFsKSksV2UoQmUscCxlLFMpLGgpcmV0dXJuIFM7Zm9yKGQgaW4obD1NLmV2ZW50JiZwLmdsb2JhbCkmJjA9PU0uYWN0aXZlKysmJk0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IikscC50eXBlPXAudHlwZS50b1VwcGVyQ2FzZSgpLHAuaGFzQ29udGVudD0hSWUudGVzdChwLnR5cGUpLHI9cC51cmwucmVwbGFjZShQZSwiIikscC5oYXNDb250ZW50P3AuZGF0YSYmcC5wcm9jZXNzRGF0YSYmMD09PShwLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihwLmRhdGE9cC5kYXRhLnJlcGxhY2UoT2UsIisiKSk6KGY9cC51cmwuc2xpY2Uoci5sZW5ndGgpLHAuZGF0YSYmKHAucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgcC5kYXRhKSYmKHIrPShNZS50ZXN0KHIpPyImIjoiPyIpK3AuZGF0YSxkZWxldGUgcC5kYXRhKSwhMT09PXAuY2FjaGUmJihyPXIucmVwbGFjZShUZSwiJDEiKSxmPShNZS50ZXN0KHIpPyImIjoiPyIpKyJfPSIreGUrKytmKSxwLnVybD1yK2YpLHAuaWZNb2RpZmllZCYmKE0ubGFzdE1vZGlmaWVkW3JdJiZTLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixNLmxhc3RNb2RpZmllZFtyXSksTS5ldGFnW3JdJiZTLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLE0uZXRhZ1tyXSkpLChwLmRhdGEmJnAuaGFzQ29udGVudCYmITEhPT1wLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmUy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHAuY29udGVudFR5cGUpLFMuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixwLmRhdGFUeXBlc1swXSYmcC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXT9wLmFjY2VwdHNbcC5kYXRhVHlwZXNbMF1dKygiKiIhPT1wLmRhdGFUeXBlc1swXT8iLCAiK1JlKyI7IHE9MC4wMSI6IiIpOnAuYWNjZXB0c1siKiJdKSxwLmhlYWRlcnMpUy5zZXRSZXF1ZXN0SGVhZGVyKGQscC5oZWFkZXJzW2RdKTtpZihwLmJlZm9yZVNlbmQmJighMT09PXAuYmVmb3JlU2VuZC5jYWxsKG0sUyxwKXx8aCkpcmV0dXJuIFMuYWJvcnQoKTtpZih4PSJhYm9ydCIsYi5hZGQocC5jb21wbGV0ZSksUy5kb25lKHAuc3VjY2VzcyksUy5mYWlsKHAuZXJyb3IpLGk9V2UoRGUscCxlLFMpKXtpZihTLnJlYWR5U3RhdGU9MSxsJiZnLnRyaWdnZXIoImFqYXhTZW5kIixbUyxwXSksaClyZXR1cm4gUztwLmFzeW5jJiZwLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Uy5hYm9ydCgidGltZW91dCIpfSxwLnRpbWVvdXQpKTt0cnl7aD0hMSxpLnNlbmQoXyxFKX1jYXRjaCh0KXtpZihoKXRocm93IHQ7RSgtMSx0KX19ZWxzZSBFKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBFKHQsZSxzLGEpe3ZhciBjLGQsZixfLHcseD1lO2h8fChoPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLGk9dm9pZCAwLG89YXx8IiIsUy5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LHMmJihfPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscixvLHMsYT10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PWkmJihpPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihpKWZvcihyIGluIGEpaWYoYVtyXSYmYVtyXS50ZXN0KGkpKXt1LnVuc2hpZnQocik7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKHIgaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tyKyIgIit1WzBdXSl7bz1yO2JyZWFrfXN8fChzPXIpfW89b3x8c31pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119KHAsUyxzKSksXz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcixvLHMsYSx1LGM9e30saD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGhbMV0pZm9yKHMgaW4gdC5jb252ZXJ0ZXJzKWNbcy50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbc107Zm9yKG89aC5zaGlmdCgpO287KWlmKHQucmVzcG9uc2VGaWVsZHNbb10mJihuW3QucmVzcG9uc2VGaWVsZHNbb11dPWUpLCF1JiZpJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PW8sbz1oLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShzPWNbdSsiICIrb118fGNbIiogIitvXSkpZm9yKHIgaW4gYylpZigoYT1yLnNwbGl0KCIgIikpWzFdPT09byYmKHM9Y1t1KyIgIithWzBdXXx8Y1siKiAiK2FbMF1dKSl7ITA9PT1zP3M9Y1tyXTohMCE9PWNbcl0mJihvPWFbMF0saC51bnNoaWZ0KGFbMV0pKTticmVha31pZighMCE9PXMpaWYocyYmdC50aHJvd3MpZT1zKGUpO2Vsc2UgdHJ5e2U9cyhlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpzP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KHAsXyxTLGMpLGM/KHAuaWZNb2RpZmllZCYmKCh3PVMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihNLmxhc3RNb2RpZmllZFtyXT13KSwodz1TLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoTS5ldGFnW3JdPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1wLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT10P3g9Im5vdG1vZGlmaWVkIjooeD1fLnN0YXRlLGQ9Xy5kYXRhLGM9IShmPV8uZXJyb3IpKSk6KGY9eCwhdCYmeHx8KHg9ImVycm9yIix0PDAmJih0PTApKSksUy5zdGF0dXM9dCxTLnN0YXR1c1RleHQ9KGV8fHgpKyIiLGM/di5yZXNvbHZlV2l0aChtLFtkLHgsU10pOnYucmVqZWN0V2l0aChtLFtTLHgsZl0pLFMuc3RhdHVzQ29kZSh5KSx5PXZvaWQgMCxsJiZnLnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtTLHAsYz9kOmZdKSxiLmZpcmVXaXRoKG0sW1MseF0pLGwmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW1MscF0pLC0tTS5hY3RpdmV8fE0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBTfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTS5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE0uZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLE0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe01bZV09ZnVuY3Rpb24odCxuLGkscil7cmV0dXJuIGIobikmJihyPXJ8fGksaT1uLG49dm9pZCAwKSxNLmFqYXgoTS5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpyLGRhdGE6bixzdWNjZXNzOml9LE0uaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLE0uX2V2YWxVcmw9ZnVuY3Rpb24odCl7cmV0dXJuIE0uYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsdGhyb3dzOiEwfSl9LE0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYoYih0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPU0odCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGIodCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe00odGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPU0odGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9Yih0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe00odGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe00odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksTS5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFNLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxNLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sTS5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgSGU9ezA6MjAwLDEyMjM6MjA0fSxGZT1NLmFqYXhTZXR0aW5ncy54aHIoKTt2LmNvcnM9ISFGZSYmIndpdGhDcmVkZW50aWFscyJpbiBGZSx2LmFqYXg9RmU9ISFGZSxNLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUsaTtpZih2LmNvcnN8fEZlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe3ZhciBzLGE9dC54aHIoKTtpZihhLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IocyBpbiB0LnhockZpZWxkcylhW3NdPXQueGhyRmllbGRzW3NdO2ZvcihzIGluIHQubWltZVR5cGUmJmEub3ZlcnJpZGVNaW1lVHlwZSYmYS5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fHJbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KHJbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxyKWEuc2V0UmVxdWVzdEhlYWRlcihzLHJbc10pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9aT1hLm9ubG9hZD1hLm9uZXJyb3I9YS5vbmFib3J0PWEub250aW1lb3V0PWEub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/YS5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2YgYS5zdGF0dXM/bygwLCJlcnJvciIpOm8oYS5zdGF0dXMsYS5zdGF0dXNUZXh0KTpvKEhlW2Euc3RhdHVzXXx8YS5zdGF0dXMsYS5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShhLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBhLnJlc3BvbnNlVGV4dD97YmluYXJ5OmEucmVzcG9uc2V9Ont0ZXh0OmEucmVzcG9uc2VUZXh0fSxhLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxhLm9ubG9hZD1lKCksaT1hLm9uZXJyb3I9YS5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1hLm9uYWJvcnQ/YS5vbmFib3J0PWk6YS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09YS5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZpKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXthLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxNLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLE0uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBNLmdsb2JhbEV2YWwodCksdH19fSksTS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLE0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxyKXtlPU0oIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmcigiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLHMuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBWZSxVZT1bXSxLZT0vKD0pXD8oPz0mfCQpfFw/XD8vO00uYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1VZS5wb3AoKXx8TS5leHBhbmRvKyJfIit4ZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksTS5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUsaSl7dmFyIHIsbyxzLGE9ITEhPT10Lmpzb25wJiYoS2UudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZLZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiByPXQuanNvbnBDYWxsYmFjaz1iKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLGE/dFthXT10W2FdLnJlcGxhY2UoS2UsIiQxIityKTohMSE9PXQuanNvbnAmJih0LnVybCs9KE1lLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK3IpLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHxNLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixvPW5bcl0sbltyXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PW8/TShuKS5yZW1vdmVQcm9wKHIpOm5bcl09byx0W3JdJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxVZS5wdXNoKHIpKSxzJiZiKG8pJiZvKHNbMF0pLHM9bz12b2lkIDB9KSwic2NyaXB0In0pLHYuY3JlYXRlSFRNTERvY3VtZW50PSgoVmU9cy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1WZS5jaGlsZE5vZGVzLmxlbmd0aCksTS5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwodi5jcmVhdGVIVE1MRG9jdW1lbnQ/KChpPShlPXMuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPXMubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQoaSkpOmU9cyksbz0hbiYmW10sKHI9VC5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KHJbMV0pXToocj13dChbdF0sZSxvKSxvJiZvLmxlbmd0aCYmTShvKS5yZW1vdmUoKSxNLm1lcmdlKFtdLHIuY2hpbGROb2RlcykpKTt2YXIgaSxyLG99LE0uZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHM9dGhpcyxhPXQuaW5kZXhPZigiICIpO3JldHVybiBhPi0xJiYoaT1tZSh0LnNsaWNlKGEpKSx0PXQuc2xpY2UoMCxhKSksYihlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihyPSJQT1NUIikscy5sZW5ndGg+MCYmTS5hamF4KHt1cmw6dCx0eXBlOnJ8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe289YXJndW1lbnRzLHMuaHRtbChpP00oIjxkaXY+IikuYXBwZW5kKE0ucGFyc2VIVE1MKHQpKS5maW5kKGkpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7cy5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sTS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtNLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksTS5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIE0uZ3JlcChNLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sTS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHMsYSx1LGM9TS5jc3ModCwicG9zaXRpb24iKSxoPU0odCksbD17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLGE9aC5vZmZzZXQoKSxvPU0uY3NzKHQsInRvcCIpLHU9TS5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTE/KHM9KGk9aC5wb3NpdGlvbigpKS50b3Ascj1pLmxlZnQpOihzPXBhcnNlRmxvYXQobyl8fDAscj1wYXJzZUZsb2F0KHUpfHwwKSxiKGUpJiYoZT1lLmNhbGwodCxuLE0uZXh0ZW5kKHt9LGEpKSksbnVsbCE9ZS50b3AmJihsLnRvcD1lLnRvcC1hLnRvcCtzKSxudWxsIT1lLmxlZnQmJihsLmxlZnQ9ZS5sZWZ0LWEubGVmdCtyKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxsKTpoLmNzcyhsKX19LE0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtNLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixpPXRoaXNbMF07cmV0dXJuIGk/aS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49aS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixpPXRoaXNbMF0scj17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09TS5jc3MoaSwicG9zaXRpb24iKSllPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49aS5vd25lckRvY3VtZW50LHQ9aS5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PU0uY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1pJiYxPT09dC5ub2RlVHlwZSYmKChyPU0odCkub2Zmc2V0KCkpLnRvcCs9TS5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPU0uY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLXIudG9wLU0uY3NzKGksIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LXIubGVmdC1NLmNzcyhpLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09TS5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8eHR9KX19KSxNLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtNLmZuW3RdPWZ1bmN0aW9uKGkpe3JldHVybiBVKHRoaXMsZnVuY3Rpb24odCxpLHIpe3ZhciBvO2lmKHkodCk/bz10Ojk9PT10Lm5vZGVUeXBlJiYobz10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1yKXJldHVybiBvP29bZV06dFtpXTtvP28uc2Nyb2xsVG8obj9vLnBhZ2VYT2Zmc2V0OnIsbj9yOm8ucGFnZVlPZmZzZXQpOnRbaV09cn0sdCxpLGFyZ3VtZW50cy5sZW5ndGgpfX0pLE0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe00uY3NzSG9va3NbZV09VnQodi5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1GdCh0LGUpLFd0LnRlc3Qobik/TSh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksTS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtNLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4saSl7TS5mbltpXT1mdW5jdGlvbihyLG8pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiByKSxhPW58fCghMD09PXJ8fCEwPT09bz8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFUodGhpcyxmdW5jdGlvbihlLG4scil7dmFyIG87cmV0dXJuIHkoZSk/MD09PWkuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KG89ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLG9bInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLG9bIm9mZnNldCIrdF0sb1siY2xpZW50Iit0XSkpOnZvaWQgMD09PXI/TS5jc3MoZSxuLGEpOk0uc3R5bGUoZSxuLHIsYSl9LGUscz9yOnZvaWQgMCxzKX19KX0pLE0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe00uZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLE0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxNLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0aGlzLm9uKGUsdCxuLGkpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksTS5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLGkscjtpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksYih0KSlyZXR1cm4gaT11LmNhbGwoYXJndW1lbnRzLDIpLChyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxNLmd1aWQrKyxyfSxNLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P00ucmVhZHlXYWl0Kys6TS5yZWFkeSghMCl9LE0uaXNBcnJheT1BcnJheS5pc0FycmF5LE0ucGFyc2VKU09OPUpTT04ucGFyc2UsTS5ub2RlTmFtZT1QLE0uaXNGdW5jdGlvbj1iLE0uaXNXaW5kb3c9eSxNLmNhbWVsQ2FzZT0kLE0udHlwZT14LE0ubm93PURhdGUubm93LE0uaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPU0udHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KGk9ZnVuY3Rpb24oKXtyZXR1cm4gTX0uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPWkpO3ZhciBZZT1uLmpRdWVyeSxYZT1uLiQ7cmV0dXJuIE0ubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09TSYmKG4uJD1YZSksdCYmbi5qUXVlcnk9PT1NJiYobi5qUXVlcnk9WWUpLE19LHJ8fChuLmpRdWVyeT1uLiQ9TSksTX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1uKDgpO2UudXVpZD1pLnV1aWQsZS5XcmFwcGVkRXJyb3I9aS5XcmFwcGVkRXJyb3IsZS5yZXNvbHZlUHJvbWlzZXNEaWN0PWkucmVzb2x2ZVByb21pc2VzRGljdDt2YXIgcj1uKDgpO2UucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW5ldyByLldyYXBwZWRFcnJvcih0LG4pO3JldHVybiBlJiZjb25zb2xlLmVycm9yKGkpLFByb21pc2UucmVqZWN0KGkpfX0sZS50eXBlc2V0PWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZSYmKHQudGV4dENvbnRlbnQ9ZSksdm9pZCAwIT09d2luZG93Lk1hdGhKYXgmJk1hdGhKYXguSHViLlF1ZXVlKFsiVHlwZXNldCIsTWF0aEpheC5IdWIsdF0pfSxlLmVzY2FwZV9odG1sPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLnRleHRDb250ZW50PXQsZS5pbm5lckhUTUx9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTQpLHI9bigwKTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIDU1Mjk2PT0oNjQ1MTImdC5jaGFyQ29kZUF0KGUpKSYmKCEoZTwwfHxlKzE+PXQubGVuZ3RoKSYmNTYzMjA9PSg2NDUxMiZ0LmNoYXJDb2RlQXQoZSsxKSkpfWZ1bmN0aW9uIHModCl7cmV0dXJuKHQ+Pj4yNHx0Pj4+OCY2NTI4MHx0PDw4JjE2NzExNjgwfCgyNTUmdCk8PDI0KT4+PjB9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoPyIwIit0OnR9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gNz09PXQubGVuZ3RoPyIwIit0OjY9PT10Lmxlbmd0aD8iMDAiK3Q6NT09PXQubGVuZ3RoPyIwMDAiK3Q6ND09PXQubGVuZ3RoPyIwMDAwIit0OjM9PT10Lmxlbmd0aD8iMDAwMDAiK3Q6Mj09PXQubGVuZ3RoPyIwMDAwMDAiK3Q6MT09PXQubGVuZ3RoPyIwMDAwMDAwIit0OnR9ZS5pbmhlcml0cz1yLGUudG9BcnJheT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuc2xpY2UoKTtpZighdClyZXR1cm5bXTt2YXIgbj1bXTtpZigic3RyaW5nIj09dHlwZW9mIHQpaWYoZSl7aWYoImhleCI9PT1lKWZvcigodD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksIiIpKS5sZW5ndGglMiE9MCYmKHQ9IjAiK3QpLHI9MDtyPHQubGVuZ3RoO3IrPTIpbi5wdXNoKHBhcnNlSW50KHRbcl0rdFtyKzFdLDE2KSl9ZWxzZSBmb3IodmFyIGk9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBzPXQuY2hhckNvZGVBdChyKTtzPDEyOD9uW2krK109czpzPDIwNDg/KG5baSsrXT1zPj42fDE5MixuW2krK109NjMmc3wxMjgpOm8odCxyKT8ocz02NTUzNisoKDEwMjMmcyk8PDEwKSsoMTAyMyZ0LmNoYXJDb2RlQXQoKytyKSksbltpKytdPXM+PjE4fDI0MCxuW2krK109cz4+MTImNjN8MTI4LG5baSsrXT1zPj42JjYzfDEyOCxuW2krK109NjMmc3wxMjgpOihuW2krK109cz4+MTJ8MjI0LG5baSsrXT1zPj42JjYzfDEyOCxuW2krK109NjMmc3wxMjgpfWVsc2UgZm9yKHI9MDtyPHQubGVuZ3RoO3IrKyluW3JdPTB8dFtyXTtyZXR1cm4gbn0sZS50b0hleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9IiIsbj0wO248dC5sZW5ndGg7bisrKWUrPWEodFtuXS50b1N0cmluZygxNikpO3JldHVybiBlfSxlLmh0b25sPXMsZS50b0hleDMyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPSIiLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dFtpXTsibGl0dGxlIj09PWUmJihyPXMocikpLG4rPXUoci50b1N0cmluZygxNikpfXJldHVybiBufSxlLnplcm8yPWEsZS56ZXJvOD11LGUuam9pbjMyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPW4tZTtpKG8lND09MCk7Zm9yKHZhciBzPW5ldyBBcnJheShvLzQpLGE9MCx1PWU7YTxzLmxlbmd0aDthKyssdSs9NCl7dmFyIGM7Yz0iYmlnIj09PXI/dFt1XTw8MjR8dFt1KzFdPDwxNnx0W3UrMl08PDh8dFt1KzNdOnRbdSszXTw8MjR8dFt1KzJdPDwxNnx0W3UrMV08PDh8dFt1XSxzW2FdPWM+Pj4wfXJldHVybiBzfSxlLnNwbGl0MzI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFycmF5KDQqdC5sZW5ndGgpLGk9MCxyPTA7aTx0Lmxlbmd0aDtpKysscis9NCl7dmFyIG89dFtpXTsiYmlnIj09PWU/KG5bcl09bz4+PjI0LG5bcisxXT1vPj4+MTYmMjU1LG5bcisyXT1vPj4+OCYyNTUsbltyKzNdPTI1NSZvKToobltyKzNdPW8+Pj4yNCxuW3IrMl09bz4+PjE2JjI1NSxuW3IrMV09bz4+PjgmMjU1LG5bcl09MjU1Jm8pfXJldHVybiBufSxlLnJvdHIzMj1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+ZXx0PDwzMi1lfSxlLnJvdGwzMj1mdW5jdGlvbih0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfSxlLnN1bTMyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZT4+PjB9LGUuc3VtMzJfMz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrZStuPj4+MH0sZS5zdW0zMl80PWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0K2UrbitpPj4+MH0sZS5zdW0zMl81PWZ1bmN0aW9uKHQsZSxuLGkscil7cmV0dXJuIHQrZStuK2krcj4+PjB9LGUuc3VtNjQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dFtlXSxvPWkrdFtlKzFdPj4+MCxzPShvPGk/MTowKStuK3I7dFtlXT1zPj4+MCx0W2UrMV09b30sZS5zdW02NF9oaT1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4oZStpPj4+MDxlPzE6MCkrdCtuPj4+MH0sZS5zdW02NF9sbz1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gZStpPj4+MH0sZS5zdW02NF80X2hpPWZ1bmN0aW9uKHQsZSxuLGkscixvLHMsYSl7dmFyIHU9MCxjPWU7cmV0dXJuIHUrPShjPWMraT4+PjApPGU/MTowLHUrPShjPWMrbz4+PjApPG8/MTowLHQrbityK3MrKHUrPShjPWMrYT4+PjApPGE/MTowKT4+PjB9LGUuc3VtNjRfNF9sbz1mdW5jdGlvbih0LGUsbixpLHIsbyxzLGEpe3JldHVybiBlK2krbythPj4+MH0sZS5zdW02NF81X2hpPWZ1bmN0aW9uKHQsZSxuLGkscixvLHMsYSx1LGMpe3ZhciBoPTAsbD1lO3JldHVybiBoKz0obD1sK2k+Pj4wKTxlPzE6MCxoKz0obD1sK28+Pj4wKTxvPzE6MCxoKz0obD1sK2E+Pj4wKTxhPzE6MCx0K24rcitzK3UrKGgrPShsPWwrYz4+PjApPGM/MTowKT4+PjB9LGUuc3VtNjRfNV9sbz1mdW5jdGlvbih0LGUsbixpLHIsbyxzLGEsdSxjKXtyZXR1cm4gZStpK28rYStjPj4+MH0sZS5yb3RyNjRfaGk9ZnVuY3Rpb24odCxlLG4pe3JldHVybihlPDwzMi1ufHQ+Pj5uKT4+PjB9LGUucm90cjY0X2xvPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4odDw8MzItbnxlPj4+bik+Pj4wfSxlLnNocjY0X2hpPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD4+Pm59LGUuc2hyNjRfbG89ZnVuY3Rpb24odCxlLG4pe3JldHVybih0PDwzMi1ufGU+Pj5uKT4+PjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuaXRlcj90Lml0ZXIoKTpuZXcgcih0KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5pdGVyPWksZS5lYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9MCxvPWkodCk7dm9pZCAwIT09KG49by5uZXh0KCkpOylpZighMT09PWUobixyKyspKXJldHVybn0sZS5ldmVyeT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPTAsbz1pKHQpO3ZvaWQgMCE9PShuPW8ubmV4dCgpKTspaWYoIWUobixyKyspKXJldHVybiExO3JldHVybiEwfSxlLnNvbWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0wLG89aSh0KTt2b2lkIDAhPT0obj1vLm5leHQoKSk7KWlmKGUobixyKyspKXJldHVybiEwO3JldHVybiExfSxlLnRvQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MCxyPVtdLG89aSh0KTt2b2lkIDAhPT0oZT1vLm5leHQoKSk7KXJbbisrXT1lO3JldHVybiByfTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPW5ldyB0KHRoaXMuX3NvdXJjZSk7cmV0dXJuIGUuX2luZGV4PXRoaXMuX2luZGV4LGV9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2luZGV4Pj10aGlzLl9zb3VyY2UubGVuZ3RoKSlyZXR1cm4gdGhpcy5fc291cmNlW3RoaXMuX2luZGV4KytdfSx0fSgpO2UuQXJyYXlJdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMjApLHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixvPWl8fHJ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyPXQuZXhwb3J0cz17fTtmdW5jdGlvbiBvKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gYSh0KXtpZihuPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChuPT09b3x8IW4pJiZzZXRUaW1lb3V0KXJldHVybiBuPXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gbih0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCwwKX19fSFmdW5jdGlvbigpe3RyeXtuPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6b31jYXRjaCh0KXtuPW99dHJ5e2k9ImZ1bmN0aW9uIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6c31jYXRjaCh0KXtpPXN9fSgpO3ZhciB1LGM9W10saD0hMSxsPS0xO2Z1bmN0aW9uIGQoKXtoJiZ1JiYoaD0hMSx1Lmxlbmd0aD9jPXUuY29uY2F0KGMpOmw9LTEsYy5sZW5ndGgmJmYoKSl9ZnVuY3Rpb24gZigpe2lmKCFoKXt2YXIgdD1hKGQpO2g9ITA7Zm9yKHZhciBlPWMubGVuZ3RoO2U7KXtmb3IodT1jLGM9W107KytsPGU7KXUmJnVbbF0ucnVuKCk7bD0tMSxlPWMubGVuZ3RofXU9bnVsbCxoPSExLGZ1bmN0aW9uKHQpe2lmKGk9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigoaT09PXN8fCFpKSYmY2xlYXJUaW1lb3V0KXJldHVybiBpPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e2kodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBpLmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gaS5jYWxsKHRoaXMsdCl9fX0odCl9fWZ1bmN0aW9uIHAodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1mdW5jdGlvbiBtKCl7fXIubmV4dFRpY2s9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtjLnB1c2gobmV3IHAodCxlKSksMSE9PWMubGVuZ3RofHxofHxhKGYpfSxwLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxyLnRpdGxlPSJicm93c2VyIixyLmJyb3dzZXI9ITAsci5lbnY9e30sci5hcmd2PVtdLHIudmVyc2lvbj0iIixyLnZlcnNpb25zPXt9LHIub249bSxyLmFkZExpc3RlbmVyPW0sci5vbmNlPW0sci5vZmY9bSxyLnJlbW92ZUxpc3RlbmVyPW0sci5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxyLmVtaXQ9bSxyLnByZXBlbmRMaXN0ZW5lcj1tLHIucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLHIubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybltdfSxyLmJpbmRpbmc9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxyLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0sci5jaGRpcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxyLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU5KS5UcmFuc2Zvcm0sbz1uKDYzKS5TdHJpbmdEZWNvZGVyO2Z1bmN0aW9uIHModCl7ci5jYWxsKHRoaXMpLHRoaXMuaGFzaE1vZGU9InN0cmluZyI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9maW5hbCYmKHRoaXMuX19maW5hbD10aGlzLl9maW5hbCx0aGlzLl9maW5hbD1udWxsKSx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH1uKDApKHMscikscy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuZnJvbSh0LGUpKTt2YXIgcj10aGlzLl91cGRhdGUodCk7cmV0dXJuIHRoaXMuaGFzaE1vZGU/dGhpczoobiYmKHI9dGhpcy5fdG9TdHJpbmcocixuKSkscil9LHMucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKCl7fSxzLnByb3RvdHlwZS5nZXRBdXRoVGFnPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIil9LHMucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInRyeWluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKX0scy5wcm90b3R5cGUuc2V0QUFEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpfSxzLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaTt0cnl7dGhpcy5oYXNoTW9kZT90aGlzLl91cGRhdGUodCk6dGhpcy5wdXNoKHRoaXMuX3VwZGF0ZSh0KSl9Y2F0Y2godCl7aT10fWZpbmFsbHl7bihpKX19LHMucHJvdG90eXBlLl9mbHVzaD1mdW5jdGlvbih0KXt2YXIgZTt0cnl7dGhpcy5wdXNoKHRoaXMuX19maW5hbCgpKX1jYXRjaCh0KXtlPXR9dChlKX0scy5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2ZpbmFsKCl8fGkuYWxsb2MoMCk7cmV0dXJuIHQmJihlPXRoaXMuX3RvU3RyaW5nKGUsdCwhMCkpLGV9LHMucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IG8oZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcigiY2FuJ3Qgc3dpdGNoIGVuY29kaW5ncyIpO3ZhciBpPXRoaXMuX2RlY29kZXIud3JpdGUodCk7cmV0dXJuIG4mJihpKz10aGlzLl9kZWNvZGVyLmVuZCgpKSxpfSx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPW4oOSksbz1uKDUpLHM9bigzMCksYT1uKDExKSx1PW4oNyksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuX2Rpc3Bvc2VkPSExLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2ZpdFBvbGljeT10LmZpdFBvbGljeXx8InNldC1taW4tc2l6ZSJ9cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9kaXNwb3NlZD0hMCxhLlNpZ25hbC5jbGVhckRhdGEodGhpcykscy5BdHRhY2hlZFByb3BlcnR5LmNsZWFyRGF0YSh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuX3BhcmVudCE9PXQpe2lmKHRoaXMuX3BhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjaGFuZ2UgcGFyZW50IHdpZGdldC4iKTtpZih0LmxheW91dCE9PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmVudCB3aWRnZXQuIik7dGhpcy5fcGFyZW50PXQsdGhpcy5pbml0KCl9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZml0UG9saWN5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpdFBvbGljeX0sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuX2ZpdFBvbGljeSE9PXQmJih0aGlzLl9maXRQb2xpY3k9dCx0aGlzLl9wYXJlbnQpKXt2YXIgZT10aGlzLl9wYXJlbnQubm9kZS5zdHlsZTtlLm1pbldpZHRoPSIiLGUubWluSGVpZ2h0PSIiLGUubWF4V2lkdGg9IiIsZS5tYXhIZWlnaHQ9IiIsdGhpcy5fcGFyZW50LmZpdCgpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5wcm9jZXNzUGFyZW50TWVzc2FnZT1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlInJlc2l6ZSI6dGhpcy5vblJlc2l6ZSh0KTticmVhaztjYXNlInVwZGF0ZS1yZXF1ZXN0Ijp0aGlzLm9uVXBkYXRlUmVxdWVzdCh0KTticmVhaztjYXNlImZpdC1yZXF1ZXN0Ijp0aGlzLm9uRml0UmVxdWVzdCh0KTticmVhaztjYXNlImJlZm9yZS1zaG93Ijp0aGlzLm9uQmVmb3JlU2hvdyh0KTticmVhaztjYXNlImFmdGVyLXNob3ciOnRoaXMub25BZnRlclNob3codCk7YnJlYWs7Y2FzZSJiZWZvcmUtaGlkZSI6dGhpcy5vbkJlZm9yZUhpZGUodCk7YnJlYWs7Y2FzZSJhZnRlci1oaWRlIjp0aGlzLm9uQWZ0ZXJIaWRlKHQpO2JyZWFrO2Nhc2UiYmVmb3JlLWF0dGFjaCI6dGhpcy5vbkJlZm9yZUF0dGFjaCh0KTticmVhaztjYXNlImFmdGVyLWF0dGFjaCI6dGhpcy5vbkFmdGVyQXR0YWNoKHQpO2JyZWFrO2Nhc2UiYmVmb3JlLWRldGFjaCI6dGhpcy5vbkJlZm9yZURldGFjaCh0KTticmVhaztjYXNlImFmdGVyLWRldGFjaCI6dGhpcy5vbkFmdGVyRGV0YWNoKHQpO2JyZWFrO2Nhc2UiY2hpbGQtcmVtb3ZlZCI6dGhpcy5vbkNoaWxkUmVtb3ZlZCh0KTticmVhaztjYXNlImNoaWxkLXNob3duIjp0aGlzLm9uQ2hpbGRTaG93bih0KTticmVhaztjYXNlImNoaWxkLWhpZGRlbiI6dGhpcy5vbkNoaWxkSGlkZGVuKHQpfX0sdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5wYXJlbnQ9dC5wYXJlbnR9KX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24odCl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LHUuV2lkZ2V0LlJlc2l6ZU1lc3NhZ2UuVW5rbm93blNpemUpfSl9LHQucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXtpLmVhY2godGhpcyxmdW5jdGlvbih0KXtvLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuUmVzaXplTWVzc2FnZS5Vbmtub3duU2l6ZSl9KX0sdC5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJBdHRhY2g9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQmVmb3JlRGV0YWNoPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe28uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkFmdGVyRGV0YWNoPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe28uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkJlZm9yZVNob3c9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5pc0hpZGRlbnx8by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJTaG93PWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe2UuaXNIaWRkZW58fG8uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkJlZm9yZUhpZGU9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5pc0hpZGRlbnx8by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJIaWRlPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe2UuaXNIaWRkZW58fG8uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZVdpZGdldCh0LmNoaWxkKX0sdC5wcm90b3R5cGUub25GaXRSZXF1ZXN0PWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25DaGlsZFNob3duPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt9LHR9KCk7ZS5MYXlvdXQ9YyxmdW5jdGlvbih0KXt0LmdldEhvcml6b250YWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGguaG9yaXpvbnRhbEFsaWdubWVudFByb3BlcnR5LmdldCh0KX0sdC5zZXRIb3Jpem9udGFsQWxpZ25tZW50PWZ1bmN0aW9uKHQsZSl7aC5ob3Jpem9udGFsQWxpZ25tZW50UHJvcGVydHkuc2V0KHQsZSl9LHQuZ2V0VmVydGljYWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudmVydGljYWxBbGlnbm1lbnRQcm9wZXJ0eS5nZXQodCl9LHQuc2V0VmVydGljYWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCxlKXtoLnZlcnRpY2FsQWxpZ25tZW50UHJvcGVydHkuc2V0KHQsZSl9fShjPWUuTGF5b3V0fHwoZS5MYXlvdXQ9e30pKSxlLkxheW91dD1jO3ZhciBoLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3RvcD1OYU4sdGhpcy5fbGVmdD1OYU4sdGhpcy5fd2lkdGg9TmFOLHRoaXMuX2hlaWdodD1OYU4sdGhpcy5fbWluV2lkdGg9MCx0aGlzLl9taW5IZWlnaHQ9MCx0aGlzLl9tYXhXaWR0aD0xLzAsdGhpcy5fbWF4SGVpZ2h0PTEvMCx0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLndpZGdldD10LHRoaXMud2lkZ2V0Lm5vZGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIn1yZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9kaXNwb3NlZCl7dGhpcy5fZGlzcG9zZWQ9ITA7dmFyIHQ9dGhpcy53aWRnZXQubm9kZS5zdHlsZTt0LnBvc2l0aW9uPSIiLHQudG9wPSIiLHQubGVmdD0iIix0LndpZHRoPSIiLHQuaGVpZ2h0PSIifX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJtaW5XaWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5XaWR0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1pbkhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5IZWlnaHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJtYXhXaWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhXaWR0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1heEhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhIZWlnaHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNIaWRkZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWRnZXQuaXNIaWRkZW59LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc1Zpc2libGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWRnZXQuaXNWaXNpYmxlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBdHRhY2hlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndpZGdldC5pc0F0dGFjaGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZpdD1mdW5jdGlvbigpe3ZhciB0PXIuRWxlbWVudEV4dC5zaXplTGltaXRzKHRoaXMud2lkZ2V0Lm5vZGUpO3RoaXMuX21pbldpZHRoPXQubWluV2lkdGgsdGhpcy5fbWluSGVpZ2h0PXQubWluSGVpZ2h0LHRoaXMuX21heFdpZHRoPXQubWF4V2lkdGgsdGhpcy5fbWF4SGVpZ2h0PXQubWF4SGVpZ2h0fSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9TWF0aC5tYXgodGhpcy5fbWluV2lkdGgsTWF0aC5taW4obix0aGlzLl9tYXhXaWR0aCkpLHM9TWF0aC5tYXgodGhpcy5fbWluSGVpZ2h0LE1hdGgubWluKGksdGhpcy5fbWF4SGVpZ2h0KSk7aWYocjxuKXN3aXRjaChjLmdldEhvcml6b250YWxBbGlnbm1lbnQodGhpcy53aWRnZXQpKXtjYXNlImxlZnQiOmJyZWFrO2Nhc2UiY2VudGVyIjp0Kz0obi1yKS8yO2JyZWFrO2Nhc2UicmlnaHQiOnQrPW4tcjticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn1pZihzPGkpc3dpdGNoKGMuZ2V0VmVydGljYWxBbGlnbm1lbnQodGhpcy53aWRnZXQpKXtjYXNlInRvcCI6YnJlYWs7Y2FzZSJjZW50ZXIiOmUrPShpLXMpLzI7YnJlYWs7Y2FzZSJib3R0b20iOmUrPWktczticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn12YXIgYT0hMSxoPXRoaXMud2lkZ2V0Lm5vZGUuc3R5bGU7aWYodGhpcy5fdG9wIT09ZSYmKHRoaXMuX3RvcD1lLGgudG9wPWUrInB4IiksdGhpcy5fbGVmdCE9PXQmJih0aGlzLl9sZWZ0PXQsaC5sZWZ0PXQrInB4IiksdGhpcy5fd2lkdGghPT1yJiYoYT0hMCx0aGlzLl93aWR0aD1yLGgud2lkdGg9cisicHgiKSx0aGlzLl9oZWlnaHQhPT1zJiYoYT0hMCx0aGlzLl9oZWlnaHQ9cyxoLmhlaWdodD1zKyJweCIpLGEpe3ZhciBsPW5ldyB1LldpZGdldC5SZXNpemVNZXNzYWdlKHIscyk7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLndpZGdldCxsKX19LHR9KCk7ZS5MYXlvdXRJdGVtPWwsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt0LnBhcmVudCYmdC5wYXJlbnQubGF5b3V0JiZ0LnBhcmVudC51cGRhdGUoKX10Lmhvcml6b250YWxBbGlnbm1lbnRQcm9wZXJ0eT1uZXcgcy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJob3Jpem9udGFsQWxpZ25tZW50IixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4iY2VudGVyIn0sY2hhbmdlZDplfSksdC52ZXJ0aWNhbEFsaWdubWVudFByb3BlcnR5PW5ldyBzLkF0dGFjaGVkUHJvcGVydHkoe25hbWU6InZlcnRpY2FsQWxpZ25tZW50IixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4idG9wIn0sY2hhbmdlZDplfSl9KGh8fChoPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDgpLGE9bigxNiksdT1uKDU3KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRGVzY3JpcHRpb25TdHlsZU1vZGVsIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlX3ZlcnNpb246dS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZS5zdHlsZVByb3BlcnRpZXM9e2Rlc2NyaXB0aW9uX3dpZHRoOntzZWxlY3RvcjoiLndpZGdldC1sYWJlbCIsYXR0cmlidXRlOiJ3aWR0aCIsZGVmYXVsdDpudWxsfX0sZX0ocy5TdHlsZU1vZGVsKTtlLkRlc2NyaXB0aW9uU3R5bGVNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRGVzY3JpcHRpb25Nb2RlbCIsX3ZpZXdfbmFtZToiRGVzY3JpcHRpb25WaWV3Iixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF9tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF92aWV3X21vZHVsZV92ZXJzaW9uOnUuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjp1LkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixkZXNjcmlwdGlvbjoiIixkZXNjcmlwdGlvbl90b29sdGlwOm51bGx9KX0sZX0ocy5ET01XaWRnZXRNb2RlbCk7ZS5EZXNjcmlwdGlvbk1vZGVsPWg7dmFyIGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsKSx0aGlzLmxhYmVsLmNsYXNzTmFtZT0id2lkZ2V0LWxhYmVsIix0aGlzLmxhYmVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmRlc2NyaXB0aW9uIix0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpkZXNjcmlwdGlvbl90b29sdGlwIix0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKSx0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKCl9LGUucHJvdG90eXBlLnR5cGVzZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEudHlwZXNldCh0LGUpfSl9LGUucHJvdG90eXBlLnVwZGF0ZURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbC5nZXQoImRlc2NyaXB0aW9uIiksZT10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb25fdG9vbHRpcCIpO251bGw9PT1lJiYoZT10KSwwPT09dC5sZW5ndGg/dGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PSJub25lIjoodGhpcy5sYWJlbC5pbm5lckhUTUw9dCx0aGlzLnR5cGVzZXQodGhpcy5sYWJlbCksdGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PSIiKSx0aGlzLmxhYmVsLnRpdGxlPWV9LGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5EZXNjcmlwdGlvblZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGV9KGgpO2UuTGFiZWxlZERPTVdpZGdldE1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShsKTtlLkxhYmVsZWRET01XaWRnZXRWaWV3PWZ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0Mykscj1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlfTt0LmV4cG9ydHM9bDt2YXIgbz1uKDMyKTtvLmluaGVyaXRzPW4oMCk7dmFyIHM9big4NSksYT1uKDYyKTtvLmluaGVyaXRzKGwscyk7Zm9yKHZhciB1PXIoYS5wcm90b3R5cGUpLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIGg9dVtjXTtsLnByb3RvdHlwZVtoXXx8KGwucHJvdG90eXBlW2hdPWEucHJvdG90eXBlW2hdKX1mdW5jdGlvbiBsKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0KTtzLmNhbGwodGhpcyx0KSxhLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixkKX1mdW5jdGlvbiBkKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxpLm5leHRUaWNrKGYsdGhpcyl9ZnVuY3Rpb24gZih0KXt0LmVuZCgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQpfSxzZXQ6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXQsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksbC5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksdGhpcy5lbmQoKSxpLm5leHRUaWNrKGUsdCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4MSksYT1uKDI2KSx1PW4oMjMxKSxjPW4oMjk4KTtlLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1lLmluZGV4T2YodCl9KX0sZS5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxlKX0sZS5hc3NpZ249T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgaSBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpJiYodFtpXT1uW2ldKX1yZXR1cm4gdH0sZS51dWlkPWZ1bmN0aW9uKCl7cmV0dXJuIGEuVVVJRC51dWlkNCgpfTt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4saSl7dmFyIHI9dC5jYWxsKHRoaXMsbil8fHRoaXM7cmV0dXJuIGNvbnNvbGUud2FybigiV3JhcHBlZEVycm9yIGhhcyBiZWVuIGRlcHJlY2F0ZWQhIiksci5lcnJvcl9zdGFjaz1pIGluc3RhbmNlb2YgZT9pLmVycm9yX3N0YWNrOltpXSxyLmVycm9yX3N0YWNrLnB1c2gocikscn1yZXR1cm4gcihlLHQpLGV9KEVycm9yKTtlLldyYXBwZWRFcnJvcj1oLGUucmVzb2x2ZVByb21pc2VzRGljdD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qua2V5cyh0KSxuPVtdO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5wdXNoKHRbZV0pfSksUHJvbWlzZS5hbGwobikudGhlbihmdW5jdGlvbihuKXt0PXt9O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRbZVtpXV09bltpXTtyZXR1cm4gdH0pfSxlLnJlamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aHJvdyBlJiZjb25zb2xlLmVycm9yKG5ldyBFcnJvcih0KSksbn19LGUucHV0X2J1ZmZlcnM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXtmb3IodmFyIHI9ZVtpXSxvPXQscz0wO3M8ci5sZW5ndGgtMTtzKyspbz1vW3Jbc11dO29bcltyLmxlbmd0aC0xXV09bltpXX19LGUucmVtb3ZlX2J1ZmZlcnM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1bXTtyZXR1cm57c3RhdGU6ZnVuY3Rpb24gdChpLHIpe2lmKGkudG9KU09OJiYoaT1pLnRvSlNPTigpKSxBcnJheS5pc0FycmF5KGkpKWZvcih2YXIgcz0hMSxhPTA7YTxpLmxlbmd0aDthKyspKGg9aVthXSkmJihoIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyhoKT8oc3x8KGk9aS5zbGljZSgpLHM9ITApLGUucHVzaChBcnJheUJ1ZmZlci5pc1ZpZXcoaCk/aC5idWZmZXI6aCksbi5wdXNoKHIuY29uY2F0KFthXSkpLGlbYV09bnVsbCk6KGw9dChoLHIuY29uY2F0KFthXSkpKSE9PWgmJihzfHwoaT1pLnNsaWNlKCkscz0hMCksaVthXT1sKSk7ZWxzZSBpZihjKGkpKWZvcih2YXIgdSBpbiBpKXt2YXIgaCxsO3M9ITEsaS5oYXNPd25Qcm9wZXJ0eSh1KSYmKGg9aVt1XSkmJihoIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyhoKT8oc3x8KGk9byh7fSxpKSxzPSEwKSxlLnB1c2goQXJyYXlCdWZmZXIuaXNWaWV3KGgpP2guYnVmZmVyOmgpLG4ucHVzaChyLmNvbmNhdChbdV0pKSxkZWxldGUgaVt1XSk6KGw9dChoLHIuY29uY2F0KFt1XSkpKSE9PWgmJihzfHwoaT1vKHt9LGkpLHM9ITApLGlbdV09bCkpfXJldHVybiBpfSh0LFtdKSxidWZmZXJzOmUsYnVmZmVyX3BhdGhzOm59fTt2YXIgbD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMEEiLCIwQiIsIjBDIiwiMEQiLCIwRSIsIjBGIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxQSIsIjFCIiwiMUMiLCIxRCIsIjFFIiwiMUYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJBIiwiMkIiLCIyQyIsIjJEIiwiMkUiLCIyRiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM0EiLCIzQiIsIjNDIiwiM0QiLCIzRSIsIjNGIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0QSIsIjRCIiwiNEMiLCI0RCIsIjRFIiwiNEYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVBIiwiNUIiLCI1QyIsIjVEIiwiNUUiLCI1RiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNkEiLCI2QiIsIjZDIiwiNkQiLCI2RSIsIjZGIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3QSIsIjdCIiwiN0MiLCI3RCIsIjdFIiwiN0YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhBIiwiOEIiLCI4QyIsIjhEIiwiOEUiLCI4RiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOUEiLCI5QiIsIjlDIiwiOUQiLCI5RSIsIjlGIiwiQTAiLCJBMSIsIkEyIiwiQTMiLCJBNCIsIkE1IiwiQTYiLCJBNyIsIkE4IiwiQTkiLCJBQSIsIkFCIiwiQUMiLCJBRCIsIkFFIiwiQUYiLCJCMCIsIkIxIiwiQjIiLCJCMyIsIkI0IiwiQjUiLCJCNiIsIkI3IiwiQjgiLCJCOSIsIkJBIiwiQkIiLCJCQyIsIkJEIiwiQkUiLCJCRiIsIkMwIiwiQzEiLCJDMiIsIkMzIiwiQzQiLCJDNSIsIkM2IiwiQzciLCJDOCIsIkM5IiwiQ0EiLCJDQiIsIkNDIiwiQ0QiLCJDRSIsIkNGIiwiRDAiLCJEMSIsIkQyIiwiRDMiLCJENCIsIkQ1IiwiRDYiLCJENyIsIkQ4IiwiRDkiLCJEQSIsIkRCIiwiREMiLCJERCIsIkRFIiwiREYiLCJFMCIsIkUxIiwiRTIiLCJFMyIsIkU0IiwiRTUiLCJFNiIsIkU3IiwiRTgiLCJFOSIsIkVBIiwiRUIiLCJFQyIsIkVEIiwiRUUiLCJFRiIsIkYwIiwiRjEiLCJGMiIsIkYzIiwiRjQiLCJGNSIsIkY2IiwiRjciLCJGOCIsIkY5IiwiRkEiLCJGQiIsIkZDIiwiRkQiLCJGRSIsIkZGIl07ZS5idWZmZXJUb0hleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFVpbnQ4QXJyYXkodCksbj1bXSxpPTA7aTxlLmxlbmd0aDtpKyspbi5wdXNoKGxbZVtpXV0pO3JldHVybiBuLmpvaW4oIiIpfSxlLmhleFRvQnVmZmVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0Lmxlbmd0aC8yKSxuPTA7bjx0Lmxlbmd0aDtuKz0yKWVbbi8yXT1wYXJzZUludCh0LnNsaWNlKG4sbisyKSwxNik7cmV0dXJuIGUuYnVmZmVyfSxlLmJ1ZmZlclRvQmFzZTY0PWZ1bmN0aW9uKHQpe3JldHVybiBzLmZyb21CeXRlQXJyYXkobmV3IFVpbnQ4QXJyYXkodCkpfSxlLmJhc2U2NFRvQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBzLnRvQnl0ZUFycmF5KHQpLmJ1ZmZlcn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDE0MikpLGkobigxNDMpKSxpKG4oMTQ0KSksaShuKDgyKSksaShuKDIyOSkpLGkobigyMzApKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxpKXt2YXIgcj1uKDEpLkJ1ZmZlcixvPWUuY3J5cHRvfHxlLm1zQ3J5cHRvO28mJm8uZ2V0UmFuZG9tVmFsdWVzP3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe2lmKHQ+NjU1MzYpdGhyb3cgbmV3IEVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHM9bmV3IGUuVWludDhBcnJheSh0KTt0PjAmJm8uZ2V0UmFuZG9tVmFsdWVzKHMpO3ZhciBhPXIuZnJvbShzLmJ1ZmZlcik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIGkubmV4dFRpY2soZnVuY3Rpb24oKXtuKG51bGwsYSl9KTtyZXR1cm4gYX06dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSl7dGhpcy5fYmxvY2s9aS5hbGxvYyh0KSx0aGlzLl9maW5hbFNpemU9ZSx0aGlzLl9ibG9ja1NpemU9dCx0aGlzLl9sZW49MH1yLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXsic3RyaW5nIj09dHlwZW9mIHQmJihlPWV8fCJ1dGY4Iix0PWkuZnJvbSh0LGUpKTtmb3IodmFyIG49dGhpcy5fYmxvY2sscj10aGlzLl9ibG9ja1NpemUsbz10Lmxlbmd0aCxzPXRoaXMuX2xlbixhPTA7YTxvOyl7Zm9yKHZhciB1PXMlcixjPU1hdGgubWluKG8tYSxyLXUpLGg9MDtoPGM7aCsrKW5bdStoXT10W2EraF07YSs9Yywocys9Yyklcj09MCYmdGhpcy5fdXBkYXRlKG4pfXJldHVybiB0aGlzLl9sZW4rPW8sdGhpc30sci5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xlbiV0aGlzLl9ibG9ja1NpemU7dGhpcy5fYmxvY2tbZV09MTI4LHRoaXMuX2Jsb2NrLmZpbGwoMCxlKzEpLGU+PXRoaXMuX2ZpbmFsU2l6ZSYmKHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayksdGhpcy5fYmxvY2suZmlsbCgwKSk7dmFyIG49OCp0aGlzLl9sZW47aWYobjw9NDI5NDk2NzI5NSl0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKG4sdGhpcy5fYmxvY2tTaXplLTQpO2Vsc2V7dmFyIGk9KDQyOTQ5NjcyOTUmbik+Pj4wLHI9KG4taSkvNDI5NDk2NzI5Njt0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHIsdGhpcy5fYmxvY2tTaXplLTgpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyQkUoaSx0aGlzLl9ibG9ja1NpemUtNCl9dGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKTt2YXIgbz10aGlzLl9oYXNoKCk7cmV0dXJuIHQ/by50b1N0cmluZyh0KTpvfSxyLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MiKX0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI0NSkscj1uKDI1MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49cih0LGUpO3JldHVybiBpKG4pP246dm9pZCAwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGkscj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcGlkPWkubmV4dFBJRCgpLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5fY3JlYXRlPXQuY3JlYXRlLHRoaXMuX2NvZXJjZT10LmNvZXJjZXx8bnVsbCx0aGlzLl9jb21wYXJlPXQuY29tcGFyZXx8bnVsbCx0aGlzLl9jaGFuZ2VkPXQuY2hhbmdlZHx8bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPWkuZW5zdXJlTWFwKHQpO3JldHVybiB0aGlzLl9waWQgaW4gZT9lW3RoaXMuX3BpZF06ZVt0aGlzLl9waWRdPXRoaXMuX2NyZWF0ZVZhbHVlKHQpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWkuZW5zdXJlTWFwKHQpO249dGhpcy5fcGlkIGluIHI/clt0aGlzLl9waWRdOnJbdGhpcy5fcGlkXT10aGlzLl9jcmVhdGVWYWx1ZSh0KTt2YXIgbz10aGlzLl9jb2VyY2VWYWx1ZSh0LGUpO3RoaXMuX21heWJlTm90aWZ5KHQsbixyW3RoaXMuX3BpZF09byl9LHQucHJvdG90eXBlLmNvZXJjZT1mdW5jdGlvbih0KXt2YXIgZSxuPWkuZW5zdXJlTWFwKHQpO2U9dGhpcy5fcGlkIGluIG4/blt0aGlzLl9waWRdOm5bdGhpcy5fcGlkXT10aGlzLl9jcmVhdGVWYWx1ZSh0KTt2YXIgcj10aGlzLl9jb2VyY2VWYWx1ZSh0LGUpO3RoaXMuX21heWJlTm90aWZ5KHQsZSxuW3RoaXMuX3BpZF09cil9LHQucHJvdG90eXBlLl9jcmVhdGVWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4oMCx0aGlzLl9jcmVhdGUpKHQpfSx0LnByb3RvdHlwZS5fY29lcmNlVmFsdWU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb2VyY2U7cmV0dXJuIG4/bih0LGUpOmV9LHQucHJvdG90eXBlLl9jb21wYXJlVmFsdWU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb21wYXJlO3JldHVybiBuP24odCxlKTp0PT09ZX0sdC5wcm90b3R5cGUuX21heWJlTm90aWZ5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9jaGFuZ2VkO2kmJiF0aGlzLl9jb21wYXJlVmFsdWUoZSxuKSYmaSh0LGUsbil9LHR9KCk7ZS5BdHRhY2hlZFByb3BlcnR5PXIsZnVuY3Rpb24odCl7dC5jbGVhckRhdGE9ZnVuY3Rpb24odCl7aS5vd25lckRhdGEuZGVsZXRlKHQpfX0ocj1lLkF0dGFjaGVkUHJvcGVydHl8fChlLkF0dGFjaGVkUHJvcGVydHk9e30pKSxlLkF0dGFjaGVkUHJvcGVydHk9cixmdW5jdGlvbih0KXt2YXIgZTt0Lm93bmVyRGF0YT1uZXcgV2Vha01hcCx0Lm5leHRQSUQ9KGU9MCxmdW5jdGlvbigpe3JldHVybiJwaWQtIisoIiIrTWF0aC5yYW5kb20oKSkuc2xpY2UoMikrIi0iK2UrK30pLHQuZW5zdXJlTWFwPWZ1bmN0aW9uKGUpe3ZhciBuPXQub3duZXJEYXRhLmdldChlKTtyZXR1cm4gbnx8KG49T2JqZWN0LmNyZWF0ZShudWxsKSx0Lm93bmVyRGF0YS5zZXQoZSxuKSxuKX19KGl8fChpPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigwKSxyPW4oNTgpLG89big2NCkscz1uKDY1KSxhPW4oMjEpO2Z1bmN0aW9uIHUodCl7YS5jYWxsKHRoaXMsImRpZ2VzdCIpLHRoaXMuX2hhc2g9dH1pKHUsYSksdS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9oYXNoLnVwZGF0ZSh0KX0sdS5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2guZGlnZXN0KCl9LHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ibWQ1Ij09PSh0PXQudG9Mb3dlckNhc2UoKSk/bmV3IHI6InJtZDE2MCI9PT10fHwicmlwZW1kMTYwIj09PXQ/bmV3IG86bmV3IHUocyh0KSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1lLmlzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheSh0KToiW29iamVjdCBBcnJheV0iPT09bih0KX0sZS5pc0Jvb2xlYW49ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH0sZS5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fSxlLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxlLmlzTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH0sZS5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9LGUuaXNTeW1ib2w9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fSxlLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fSxlLmlzUmVnRXhwPWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09bih0KX0sZS5pc09iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fSxlLmlzRGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1uKHQpfSxlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PW4odCl8fHQgaW5zdGFuY2VvZiBFcnJvcn0sZS5pc0Z1bmN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxlLmlzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHwic3RyaW5nIj09dHlwZW9mIHR8fCJzeW1ib2wiPT10eXBlb2YgdHx8dm9pZCAwPT09dH0sZS5pc0J1ZmZlcj10LmlzQnVmZmVyfSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGk9TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLHI9bmV3IGUoaSksbz0wO288aTsrK28pcltvXT10W29dXm5bb107cmV0dXJuIHJ9fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTQpO2Z1bmN0aW9uIG8oKXt0aGlzLnBlbmRpbmc9bnVsbCx0aGlzLnBlbmRpbmdUb3RhbD0wLHRoaXMuYmxvY2tTaXplPXRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplLHRoaXMub3V0U2l6ZT10aGlzLmNvbnN0cnVjdG9yLm91dFNpemUsdGhpcy5obWFjU3RyZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGgsdGhpcy5wYWRMZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGgvOCx0aGlzLmVuZGlhbj0iYmlnIix0aGlzLl9kZWx0YTg9dGhpcy5ibG9ja1NpemUvOCx0aGlzLl9kZWx0YTMyPXRoaXMuYmxvY2tTaXplLzMyfWUuQmxvY2tIYXNoPW8sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7aWYodD1pLnRvQXJyYXkodCxlKSx0aGlzLnBlbmRpbmc/dGhpcy5wZW5kaW5nPXRoaXMucGVuZGluZy5jb25jYXQodCk6dGhpcy5wZW5kaW5nPXQsdGhpcy5wZW5kaW5nVG90YWwrPXQubGVuZ3RoLHRoaXMucGVuZGluZy5sZW5ndGg+PXRoaXMuX2RlbHRhOCl7dmFyIG49KHQ9dGhpcy5wZW5kaW5nKS5sZW5ndGgldGhpcy5fZGVsdGE4O3RoaXMucGVuZGluZz10LnNsaWNlKHQubGVuZ3RoLW4sdC5sZW5ndGgpLDA9PT10aGlzLnBlbmRpbmcubGVuZ3RoJiYodGhpcy5wZW5kaW5nPW51bGwpLHQ9aS5qb2luMzIodCwwLHQubGVuZ3RoLW4sdGhpcy5lbmRpYW4pO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cis9dGhpcy5fZGVsdGEzMil0aGlzLl91cGRhdGUodCxyLHIrdGhpcy5fZGVsdGEzMil9cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpLHIobnVsbD09PXRoaXMucGVuZGluZyksdGhpcy5fZGlnZXN0KHQpfSxvLnByb3RvdHlwZS5fcGFkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wZW5kaW5nVG90YWwsZT10aGlzLl9kZWx0YTgsbj1lLSh0K3RoaXMucGFkTGVuZ3RoKSVlLGk9bmV3IEFycmF5KG4rdGhpcy5wYWRMZW5ndGgpO2lbMF09MTI4O2Zvcih2YXIgcj0xO3I8bjtyKyspaVtyXT0wO2lmKHQ8PD0zLCJiaWciPT09dGhpcy5lbmRpYW4pe2Zvcih2YXIgbz04O288dGhpcy5wYWRMZW5ndGg7bysrKWlbcisrXT0wO2lbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT10Pj4+MjQmMjU1LGlbcisrXT10Pj4+MTYmMjU1LGlbcisrXT10Pj4+OCYyNTUsaVtyKytdPTI1NSZ0fWVsc2UgZm9yKGlbcisrXT0yNTUmdCxpW3IrK109dD4+PjgmMjU1LGlbcisrXT10Pj4+MTYmMjU1LGlbcisrXT10Pj4+MjQmMjU1LGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLG89ODtvPHRoaXMucGFkTGVuZ3RoO28rKylpW3IrK109MDtyZXR1cm4gaX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lO2kuYmlnbnVtPW4oMyksaS5kZWZpbmU9bigyMTApLmRlZmluZSxpLmJhc2U9bigzNiksaS5jb25zdGFudHM9bigxMTEpLGkuZGVjb2RlcnM9bigyMTYpLGkuZW5jb2RlcnM9bigyMTgpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9ZTtpLlJlcG9ydGVyPW4oMjEzKS5SZXBvcnRlcixpLkRlY29kZXJCdWZmZXI9bigxMTApLkRlY29kZXJCdWZmZXIsaS5FbmNvZGVyQnVmZmVyPW4oMTEwKS5FbmNvZGVyQnVmZmVyLGkuTm9kZT1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDcyKSxyPW4oMjQ2KSxvPW4oMjQ3KSxzPSJbb2JqZWN0IE51bGxdIixhPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHU9aT9pLnRvU3RyaW5nVGFnOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD9hOnM6dSYmdSBpbiBPYmplY3QodCk/cih0KTpvKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDQwKSksaShuKDc2KSksaShuKDMyMikpLGkobigzMjMpKSxpKG4oMzI0KSksaShuKDEzMikpLGkobigzMjUpKSxpKG4oMzI2KSksaShuKDMyNykpLGkobigyMikpLGkobigxMzEpKSxpKG4oMzI4KSksaShuKDU0KSksaShuKDQxKSksaShuKDMyOSkpLGkobigzMzApKSxpKG4oMTMzKSksaShuKDMzMSkpLGkobigxMzQpKSxpKG4oMTM1KSksaShuKDgwKSksaShuKDMzMikpLGkobig3NykpLGkobig3KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zaXplSGludD0wLHRoaXMubWluU2l6ZT0wLHRoaXMubWF4U2l6ZT0xLzAsdGhpcy5zdHJldGNoPTEsdGhpcy5zaXplPTAsdGhpcy5kb25lPSExfX0oKTtlLkJveFNpemVyPWksZnVuY3Rpb24odCl7dC5jYWxjPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIGU7Zm9yKHZhciBpPTAscj0wLG89MCxzPTAsYT0wLHU9MDt1PG47Kyt1KXt2YXIgYz0odj10W3VdKS5taW5TaXplLGg9di5tYXhTaXplLGw9di5zaXplSGludDt2LmRvbmU9ITEsdi5zaXplPU1hdGgubWF4KGMsTWF0aC5taW4obCxoKSksbys9di5zaXplLGkrPWMscis9aCx2LnN0cmV0Y2g+MCYmKHMrPXYuc3RyZXRjaCxhKyspfWlmKGU9PT1vKXJldHVybiAwO2lmKGU8PWkpe2Zvcih1PTA7dTxuOysrdSkodj10W3VdKS5zaXplPXYubWluU2l6ZTtyZXR1cm4gZS1pfWlmKGU+PXIpe2Zvcih1PTA7dTxuOysrdSkodj10W3VdKS5zaXplPXYubWF4U2l6ZTtyZXR1cm4gZS1yfXZhciBkPW47aWYoZTxvKXtmb3IodmFyIGY9by1lO2E+MCYmZj4uMDE7KXt2YXIgcD1mLG09cztmb3IodT0wO3U8bjsrK3UpaWYoISh2PXRbdV0pLmRvbmUmJjAhPT12LnN0cmV0Y2gpe3ZhciBnPXYuc3RyZXRjaCpwL207di5zaXplLWc8PXYubWluU2l6ZT8oZi09di5zaXplLXYubWluU2l6ZSxzLT12LnN0cmV0Y2gsdi5zaXplPXYubWluU2l6ZSx2LmRvbmU9ITAsZC0tLGEtLSk6KGYtPWcsdi5zaXplLT1nKX19Zm9yKDtkPjAmJmY+LjAxOylmb3IoZz1mL2QsdT0wO3U8bjsrK3UpKHY9dFt1XSkuZG9uZXx8KHYuc2l6ZS1nPD12Lm1pblNpemU/KGYtPXYuc2l6ZS12Lm1pblNpemUsdi5zaXplPXYubWluU2l6ZSx2LmRvbmU9ITAsZC0tKTooZi09Zyx2LnNpemUtPWcpKX1lbHNle2ZvcihmPWUtbzthPjAmJmY+LjAxOylmb3IocD1mLG09cyx1PTA7dTxuOysrdSkodj10W3VdKS5kb25lfHwwPT09di5zdHJldGNofHwoZz12LnN0cmV0Y2gqcC9tLHYuc2l6ZStnPj12Lm1heFNpemU/KGYtPXYubWF4U2l6ZS12LnNpemUscy09di5zdHJldGNoLHYuc2l6ZT12Lm1heFNpemUsdi5kb25lPSEwLGQtLSxhLS0pOihmLT1nLHYuc2l6ZSs9ZykpO2Zvcig7ZD4wJiZmPi4wMTspZm9yKGc9Zi9kLHU9MDt1PG47Kyt1KXt2YXIgdjsodj10W3VdKS5kb25lfHwodi5zaXplK2c+PXYubWF4U2l6ZT8oZi09di5tYXhTaXplLXYuc2l6ZSx2LnNpemU9di5tYXhTaXplLHYuZG9uZT0hMCxkLS0pOihmLT1nLHYuc2l6ZSs9ZykpfX1yZXR1cm4gMH0sdC5hZGp1c3Q9ZnVuY3Rpb24odCxlLG4pezAhPT10Lmxlbmd0aCYmMCE9PW4mJihuPjA/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wLHI9MDtyPD1lOysrcil7dmFyIG89dFtyXTtpKz1vLm1heFNpemUtby5zaXplfWZvcih2YXIgcz0wLHI9ZSsxLGE9dC5sZW5ndGg7cjxhOysrcil7dmFyIG89dFtyXTtzKz1vLnNpemUtby5taW5TaXplfWZvcih2YXIgdT1uPU1hdGgubWluKG4saSxzKSxyPWU7cj49MCYmdT4wOy0tcil7dmFyIG89dFtyXSxjPW8ubWF4U2l6ZS1vLnNpemU7Yz49dT8oby5zaXplSGludD1vLnNpemUrdSx1PTApOihvLnNpemVIaW50PW8uc2l6ZStjLHUtPWMpfWZvcih2YXIgaD1uLHI9ZSsxLGE9dC5sZW5ndGg7cjxhJiZoPjA7KytyKXt2YXIgbz10W3JdLGM9by5zaXplLW8ubWluU2l6ZTtjPj1oPyhvLnNpemVIaW50PW8uc2l6ZS1oLGg9MCk6KG8uc2l6ZUhpbnQ9by5zaXplLWMsaC09Yyl9fSh0LGUsbik6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wLHI9ZSsxLG89dC5sZW5ndGg7cjxvOysrcil7dmFyIHM9dFtyXTtpKz1zLm1heFNpemUtcy5zaXplfWZvcih2YXIgYT0wLHI9MDtyPD1lOysrcil7dmFyIHM9dFtyXTthKz1zLnNpemUtcy5taW5TaXplfWZvcih2YXIgdT1uPU1hdGgubWluKG4saSxhKSxyPWUrMSxvPXQubGVuZ3RoO3I8byYmdT4wOysrcil7dmFyIHM9dFtyXSxjPXMubWF4U2l6ZS1zLnNpemU7Yz49dT8ocy5zaXplSGludD1zLnNpemUrdSx1PTApOihzLnNpemVIaW50PXMuc2l6ZStjLHUtPWMpfWZvcih2YXIgaD1uLHI9ZTtyPj0wJiZoPjA7LS1yKXt2YXIgcz10W3JdLGM9cy5zaXplLXMubWluU2l6ZTtjPj1oPyhzLnNpemVIaW50PXMuc2l6ZS1oLGg9MCk6KHMuc2l6ZUhpbnQ9cy5zaXplLWMsaC09Yyl9fSh0LGUsLW4pKX19KGUuQm94RW5naW5lfHwoZS5Cb3hFbmdpbmU9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyKSxzPW4oNSksYT1uKDIyKSx1PW4oNyksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl93aWRnZXRzPVtdLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl93aWRnZXRzLmxlbmd0aD4wOyl0aGlzLl93aWRnZXRzLnBvcCgpLmRpc3Bvc2UoKTt0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gby5pdGVyKHRoaXMuX3dpZGdldHMpfSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRXaWRnZXQodGhpcy5fd2lkZ2V0cy5sZW5ndGgsdCl9LGUucHJvdG90eXBlLmluc2VydFdpZGdldD1mdW5jdGlvbih0LGUpe2UucGFyZW50PXRoaXMucGFyZW50O3ZhciBuPXRoaXMuX3dpZGdldHMuaW5kZXhPZihlKSxpPU1hdGgubWF4KDAsTWF0aC5taW4odCx0aGlzLl93aWRnZXRzLmxlbmd0aCkpO2lmKC0xPT09bilyZXR1cm4gby5BcnJheUV4dC5pbnNlcnQodGhpcy5fd2lkZ2V0cyxpLGUpLHZvaWQodGhpcy5wYXJlbnQmJnRoaXMuYXR0YWNoV2lkZ2V0KGksZSkpO2k9PT10aGlzLl93aWRnZXRzLmxlbmd0aCYmaS0tLG4hPT1pJiYoby5BcnJheUV4dC5tb3ZlKHRoaXMuX3dpZGdldHMsbixpKSx0aGlzLnBhcmVudCYmdGhpcy5tb3ZlV2lkZ2V0KG4saSxlKSl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZVdpZGdldEF0KHRoaXMuX3dpZGdldHMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldEF0PWZ1bmN0aW9uKHQpe3ZhciBlPW8uQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fd2lkZ2V0cyx0KTtlJiZ0aGlzLnBhcmVudCYmdGhpcy5kZXRhY2hXaWRnZXQodCxlKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpLG8uZWFjaCh0aGlzLGZ1bmN0aW9uKHQsbil7ZS5hdHRhY2hXaWRnZXQobix0KX0pfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnBhcmVudC5ub2RlLmNoaWxkcmVuW3RdO3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx1LldpZGdldC5Nc2cuQmVmb3JlQXR0YWNoKSx0aGlzLnBhcmVudC5ub2RlLmluc2VydEJlZm9yZShlLm5vZGUsbiksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHUuV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2Uobix1LldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKG4ubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShuLHUuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCk7dmFyIGk9dGhpcy5wYXJlbnQubm9kZS5jaGlsZHJlbltlXTt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKG4sdS5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5pbnNlcnRCZWZvcmUobi5ub2RlLGkpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2Uobix1LldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdS5XaWRnZXQuTXNnLkJlZm9yZURldGFjaCksdGhpcy5wYXJlbnQubm9kZS5yZW1vdmVDaGlsZChlLm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx1LldpZGdldC5Nc2cuQWZ0ZXJEZXRhY2gpfSxlfShhLkxheW91dCk7ZS5QYW5lbExheW91dD1jfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvO3I9W24oMTUpXSx2b2lkIDA9PT0obz0iZnVuY3Rpb24iPT10eXBlb2YoaT1mdW5jdGlvbih0KXtyZXR1cm4gdC51aT10LnVpfHx7fSx0LnVpLnZlcnNpb249IjEuMTIuMSJ9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUpeyFlLnZlcnNpb258fDA9PT1lLnZlcnNpb24uaW5kZXhPZigidjAuIil8fDA9PT1lLnZlcnNpb24uaW5kZXhPZigidjEuIikmJjAhPT1lLnZlcnNpb24uaW5kZXhPZigidjEuOC4iKT90LmV4cG9ydHM9e25leHRUaWNrOmZ1bmN0aW9uKHQsbixpLHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJjYWxsYmFjayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7dmFyIG8scyxhPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGEpe2Nhc2UgMDpjYXNlIDE6cmV0dXJuIGUubmV4dFRpY2sodCk7Y2FzZSAyOnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsbil9KTtjYXNlIDM6cmV0dXJuIGUubmV4dFRpY2soZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxuLGkpfSk7Y2FzZSA0OnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsbixpLHIpfSk7ZGVmYXVsdDpmb3Iobz1uZXcgQXJyYXkoYS0xKSxzPTA7czxvLmxlbmd0aDspb1tzKytdPWFyZ3VtZW50c1tzXTtyZXR1cm4gZS5uZXh0VGljayhmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxvKX0pfX19OnQuZXhwb3J0cz1lfSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXt2YXIgaT12b2lkIDAhPT10JiZ0fHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fHdpbmRvdyxyPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faWQ9dCx0aGlzLl9jbGVhckZuPWV9ZS5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHIuY2FsbChzZXRUaW1lb3V0LGksYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxlLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHIuY2FsbChzZXRJbnRlcnZhbCxpLGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LGUuY2xlYXJUaW1lb3V0PWUuY2xlYXJJbnRlcnZhbD1mdW5jdGlvbih0KXt0JiZ0LmNsb3NlKCl9LG8ucHJvdG90eXBlLnVucmVmPW8ucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sby5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwoaSx0aGlzLl9pZCl9LGUuZW5yb2xsPWZ1bmN0aW9uKHQsZSl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PWV9LGUudW5lbnJvbGw9ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PS0xfSxlLl91bnJlZkFjdGl2ZT1lLmFjdGl2ZT1mdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCk7dmFyIGU9dC5faWRsZVRpbWVvdXQ7ZT49MCYmKHQuX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuX29uVGltZW91dCYmdC5fb25UaW1lb3V0KCl9LGUpKX0sbigxNTApLGUuc2V0SW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5zZXRJbW1lZGlhdGV8fHZvaWQgMCE9PXQmJnQuc2V0SW1tZWRpYXRlfHx0aGlzJiZ0aGlzLnNldEltbWVkaWF0ZSxlLmNsZWFySW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jbGVhckltbWVkaWF0ZXx8dm9pZCAwIT09dCYmdC5jbGVhckltbWVkaWF0ZXx8dGhpcyYmdGhpcy5jbGVhckltbWVkaWF0ZX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQpe2kuaXNCdWZmZXIodCl8fCh0PWkuZnJvbSh0KSk7Zm9yKHZhciBlPXQubGVuZ3RoLzR8MCxuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQucmVhZFVJbnQzMkJFKDQqcik7cmV0dXJuIG59ZnVuY3Rpb24gbyh0KXtmb3IoOzA8dC5sZW5ndGg7dCsrKXRbMF09MH1mdW5jdGlvbiBzKHQsZSxuLGkscil7Zm9yKHZhciBvLHMsYSx1LGM9blswXSxoPW5bMV0sbD1uWzJdLGQ9blszXSxmPXRbMF1eZVswXSxwPXRbMV1eZVsxXSxtPXRbMl1eZVsyXSxnPXRbM11eZVszXSx2PTQsYj0xO2I8cjtiKyspbz1jW2Y+Pj4yNF1eaFtwPj4+MTYmMjU1XV5sW20+Pj44JjI1NV1eZFsyNTUmZ11eZVt2KytdLHM9Y1twPj4+MjRdXmhbbT4+PjE2JjI1NV1ebFtnPj4+OCYyNTVdXmRbMjU1JmZdXmVbdisrXSxhPWNbbT4+PjI0XV5oW2c+Pj4xNiYyNTVdXmxbZj4+PjgmMjU1XV5kWzI1NSZwXV5lW3YrK10sdT1jW2c+Pj4yNF1eaFtmPj4+MTYmMjU1XV5sW3A+Pj44JjI1NV1eZFsyNTUmbV1eZVt2KytdLGY9byxwPXMsbT1hLGc9dTtyZXR1cm4gbz0oaVtmPj4+MjRdPDwyNHxpW3A+Pj4xNiYyNTVdPDwxNnxpW20+Pj44JjI1NV08PDh8aVsyNTUmZ10pXmVbdisrXSxzPShpW3A+Pj4yNF08PDI0fGlbbT4+PjE2JjI1NV08PDE2fGlbZz4+PjgmMjU1XTw8OHxpWzI1NSZmXSleZVt2KytdLGE9KGlbbT4+PjI0XTw8MjR8aVtnPj4+MTYmMjU1XTw8MTZ8aVtmPj4+OCYyNTVdPDw4fGlbMjU1JnBdKV5lW3YrK10sdT0oaVtnPj4+MjRdPDwyNHxpW2Y+Pj4xNiYyNTVdPDwxNnxpW3A+Pj44JjI1NV08PDh8aVsyNTUmbV0pXmVbdisrXSxbbz4+Pj0wLHM+Pj49MCxhPj4+PTAsdT4+Pj0wXX12YXIgYT1bMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NF0sdT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkoMjU2KSxlPTA7ZTwyNTY7ZSsrKXRbZV09ZTwxMjg/ZTw8MTplPDwxXjI4Mztmb3IodmFyIG49W10saT1bXSxyPVtbXSxbXSxbXSxbXV0sbz1bW10sW10sW10sW11dLHM9MCxhPTAsdT0wO3U8MjU2OysrdSl7dmFyIGM9YV5hPDwxXmE8PDJeYTw8M15hPDw0O2M9Yz4+PjheMjU1JmNeOTksbltzXT1jLGlbY109czt2YXIgaD10W3NdLGw9dFtoXSxkPXRbbF0sZj0yNTcqdFtjXV4xNjg0MzAwOCpjO3JbMF1bc109Zjw8MjR8Zj4+PjgsclsxXVtzXT1mPDwxNnxmPj4+MTYsclsyXVtzXT1mPDw4fGY+Pj4yNCxyWzNdW3NdPWYsZj0xNjg0MzAwOSpkXjY1NTM3KmxeMjU3KmheMTY4NDMwMDgqcyxvWzBdW2NdPWY8PDI0fGY+Pj44LG9bMV1bY109Zjw8MTZ8Zj4+PjE2LG9bMl1bY109Zjw8OHxmPj4+MjQsb1szXVtjXT1mLDA9PT1zP3M9YT0xOihzPWhedFt0W3RbZF5oXV1dLGFePXRbdFthXV0pfXJldHVybntTQk9YOm4sSU5WX1NCT1g6aSxTVUJfTUlYOnIsSU5WX1NVQl9NSVg6b319KCk7ZnVuY3Rpb24gYyh0KXt0aGlzLl9rZXk9cih0KSx0aGlzLl9yZXNldCgpfWMuYmxvY2tTaXplPTE2LGMua2V5U2l6ZT0zMixjLnByb3RvdHlwZS5ibG9ja1NpemU9Yy5ibG9ja1NpemUsYy5wcm90b3R5cGUua2V5U2l6ZT1jLmtleVNpemUsYy5wcm90b3R5cGUuX3Jlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2tleSxlPXQubGVuZ3RoLG49ZSs2LGk9NCoobisxKSxyPVtdLG89MDtvPGU7bysrKXJbb109dFtvXTtmb3Iobz1lO288aTtvKyspe3ZhciBzPXJbby0xXTtvJWU9PTA/KHM9czw8OHxzPj4+MjQscz11LlNCT1hbcz4+PjI0XTw8MjR8dS5TQk9YW3M+Pj4xNiYyNTVdPDwxNnx1LlNCT1hbcz4+PjgmMjU1XTw8OHx1LlNCT1hbMjU1JnNdLHNePWFbby9lfDBdPDwyNCk6ZT42JiZvJWU9PTQmJihzPXUuU0JPWFtzPj4+MjRdPDwyNHx1LlNCT1hbcz4+PjE2JjI1NV08PDE2fHUuU0JPWFtzPj4+OCYyNTVdPDw4fHUuU0JPWFsyNTUmc10pLHJbb109cltvLWVdXnN9Zm9yKHZhciBjPVtdLGg9MDtoPGk7aCsrKXt2YXIgbD1pLWgsZD1yW2wtKGglND8wOjQpXTtjW2hdPWg8NHx8bDw9ND9kOnUuSU5WX1NVQl9NSVhbMF1bdS5TQk9YW2Q+Pj4yNF1dXnUuSU5WX1NVQl9NSVhbMV1bdS5TQk9YW2Q+Pj4xNiYyNTVdXV51LklOVl9TVUJfTUlYWzJdW3UuU0JPWFtkPj4+OCYyNTVdXV51LklOVl9TVUJfTUlYWzNdW3UuU0JPWFsyNTUmZF1dfXRoaXMuX25Sb3VuZHM9bix0aGlzLl9rZXlTY2hlZHVsZT1yLHRoaXMuX2ludktleVNjaGVkdWxlPWN9LGMucHJvdG90eXBlLmVuY3J5cHRCbG9ja1Jhdz1mdW5jdGlvbih0KXtyZXR1cm4gcyh0PXIodCksdGhpcy5fa2V5U2NoZWR1bGUsdS5TVUJfTUlYLHUuU0JPWCx0aGlzLl9uUm91bmRzKX0sYy5wcm90b3R5cGUuZW5jcnlwdEJsb2NrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW5jcnlwdEJsb2NrUmF3KHQpLG49aS5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIG4ud3JpdGVVSW50MzJCRShlWzBdLDApLG4ud3JpdGVVSW50MzJCRShlWzFdLDQpLG4ud3JpdGVVSW50MzJCRShlWzJdLDgpLG4ud3JpdGVVSW50MzJCRShlWzNdLDEyKSxufSxjLnByb3RvdHlwZS5kZWNyeXB0QmxvY2s9ZnVuY3Rpb24odCl7dmFyIGU9KHQ9cih0KSlbMV07dFsxXT10WzNdLHRbM109ZTt2YXIgbj1zKHQsdGhpcy5faW52S2V5U2NoZWR1bGUsdS5JTlZfU1VCX01JWCx1LklOVl9TQk9YLHRoaXMuX25Sb3VuZHMpLG89aS5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIG8ud3JpdGVVSW50MzJCRShuWzBdLDApLG8ud3JpdGVVSW50MzJCRShuWzNdLDQpLG8ud3JpdGVVSW50MzJCRShuWzJdLDgpLG8ud3JpdGVVSW50MzJCRShuWzFdLDEyKSxvfSxjLnByb3RvdHlwZS5zY3J1Yj1mdW5jdGlvbigpe28odGhpcy5fa2V5U2NoZWR1bGUpLG8odGhpcy5faW52S2V5U2NoZWR1bGUpLG8odGhpcy5fa2V5KX0sdC5leHBvcnRzLkFFUz1jfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7aWYoaS5pc0J1ZmZlcih0KXx8KHQ9aS5mcm9tKHQsImJpbmFyeSIpKSxlJiYoaS5pc0J1ZmZlcihlKXx8KGU9aS5mcm9tKGUsImJpbmFyeSIpKSw4IT09ZS5sZW5ndGgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJzYWx0IHNob3VsZCBiZSBCdWZmZXIgd2l0aCA4IGJ5dGUgbGVuZ3RoIik7Zm9yKHZhciBzPW4vOCxhPWkuYWxsb2MocyksdT1pLmFsbG9jKG98fDApLGM9aS5hbGxvYygwKTtzPjB8fG8+MDspe3ZhciBoPW5ldyByO2gudXBkYXRlKGMpLGgudXBkYXRlKHQpLGUmJmgudXBkYXRlKGUpLGM9aC5kaWdlc3QoKTt2YXIgbD0wO2lmKHM+MCl7dmFyIGQ9YS5sZW5ndGgtcztsPU1hdGgubWluKHMsYy5sZW5ndGgpLGMuY29weShhLGQsMCxsKSxzLT1sfWlmKGw8Yy5sZW5ndGgmJm8+MCl7dmFyIGY9dS5sZW5ndGgtbyxwPU1hdGgubWluKG8sYy5sZW5ndGgtbCk7Yy5jb3B5KHUsZixsLGwrcCksby09cH19cmV0dXJuIGMuZmlsbCgwKSx7a2V5OmEsaXY6dX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC53ZWJwYWNrUG9seWZpbGx8fCh0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sdC5wYXRocz1bXSx0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQubH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiaWQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0Lml9fSksdC53ZWJwYWNrUG9seWZpbGw9MSksdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9ZTtpLmJhc2U9bigxOTApLGkuc2hvcnQ9bigxOTEpLGkubW9udD1uKDE5MiksaS5lZHdhcmRzPW4oMTkzKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDIwOSkscj1uKDIyMSksbz1uKDIyMikscz1uKDY3KSxhPW4oOTQpO2Z1bmN0aW9uIHUodCl7dmFyIG47Im9iamVjdCIhPXR5cGVvZiB0fHxlLmlzQnVmZmVyKHQpfHwobj10LnBhc3NwaHJhc2UsdD10LmtleSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgZSh0KSk7dmFyIHUsYyxoPW8odCxuKSxsPWgudGFnLGQ9aC5kYXRhO3N3aXRjaChsKXtjYXNlIkNFUlRJRklDQVRFIjpjPWkuY2VydGlmaWNhdGUuZGVjb2RlKGQsImRlciIpLnRic0NlcnRpZmljYXRlLnN1YmplY3RQdWJsaWNLZXlJbmZvO2Nhc2UiUFVCTElDIEtFWSI6c3dpdGNoKGN8fChjPWkuUHVibGljS2V5LmRlY29kZShkLCJkZXIiKSksdT1jLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbigiLiIpKXtjYXNlIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjpyZXR1cm4gaS5SU0FQdWJsaWNLZXkuZGVjb2RlKGMuc3ViamVjdFB1YmxpY0tleS5kYXRhLCJkZXIiKTtjYXNlIjEuMi44NDAuMTAwNDUuMi4xIjpyZXR1cm4gYy5zdWJqZWN0UHJpdmF0ZUtleT1jLnN1YmplY3RQdWJsaWNLZXkse3R5cGU6ImVjIixkYXRhOmN9O2Nhc2UiMS4yLjg0MC4xMDA0MC40LjEiOnJldHVybiBjLmFsZ29yaXRobS5wYXJhbXMucHViX2tleT1pLkRTQXBhcmFtLmRlY29kZShjLnN1YmplY3RQdWJsaWNLZXkuZGF0YSwiZGVyIikse3R5cGU6ImRzYSIsZGF0YTpjLmFsZ29yaXRobS5wYXJhbXN9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSBpZCAiK3UpfXRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgdHlwZSAiK2wpO2Nhc2UiRU5DUllQVEVEIFBSSVZBVEUgS0VZIjpkPWZ1bmN0aW9uKHQsbil7dmFyIGk9dC5hbGdvcml0aG0uZGVjcnlwdC5rZGUua2RlcGFyYW1zLnNhbHQsbz1wYXJzZUludCh0LmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwxMCksdT1yW3QuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLmFsZ28uam9pbigiLiIpXSxjPXQuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2LGg9dC5zdWJqZWN0UHJpdmF0ZUtleSxsPXBhcnNlSW50KHUuc3BsaXQoIi0iKVsxXSwxMCkvOCxkPWEucGJrZGYyU3luYyhuLGksbyxsKSxmPXMuY3JlYXRlRGVjaXBoZXJpdih1LGQsYykscD1bXTtyZXR1cm4gcC5wdXNoKGYudXBkYXRlKGgpKSxwLnB1c2goZi5maW5hbCgpKSxlLmNvbmNhdChwKX0oZD1pLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGQsImRlciIpLG4pO2Nhc2UiUFJJVkFURSBLRVkiOnN3aXRjaCh1PShjPWkuUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIikpLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbigiLiIpKXtjYXNlIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjpyZXR1cm4gaS5SU0FQcml2YXRlS2V5LmRlY29kZShjLnN1YmplY3RQcml2YXRlS2V5LCJkZXIiKTtjYXNlIjEuMi44NDAuMTAwNDUuMi4xIjpyZXR1cm57Y3VydmU6Yy5hbGdvcml0aG0uY3VydmUscHJpdmF0ZUtleTppLkVDUHJpdmF0ZUtleS5kZWNvZGUoYy5zdWJqZWN0UHJpdmF0ZUtleSwiZGVyIikucHJpdmF0ZUtleX07Y2FzZSIxLjIuODQwLjEwMDQwLjQuMSI6cmV0dXJuIGMuYWxnb3JpdGhtLnBhcmFtcy5wcml2X2tleT1pLkRTQXBhcmFtLmRlY29kZShjLnN1YmplY3RQcml2YXRlS2V5LCJkZXIiKSx7dHlwZToiZHNhIixwYXJhbXM6Yy5hbGdvcml0aG0ucGFyYW1zfTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgaWQgIit1KX10aHJvdyBuZXcgRXJyb3IoInVua25vd24ga2V5IHR5cGUgIitsKTtjYXNlIlJTQSBQVUJMSUMgS0VZIjpyZXR1cm4gaS5SU0FQdWJsaWNLZXkuZGVjb2RlKGQsImRlciIpO2Nhc2UiUlNBIFBSSVZBVEUgS0VZIjpyZXR1cm4gaS5SU0FQcml2YXRlS2V5LmRlY29kZShkLCJkZXIiKTtjYXNlIkRTQSBQUklWQVRFIEtFWSI6cmV0dXJue3R5cGU6ImRzYSIscGFyYW1zOmkuRFNBUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIil9O2Nhc2UiRUMgUFJJVkFURSBLRVkiOnJldHVybntjdXJ2ZTooZD1pLkVDUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIikpLnBhcmFtZXRlcnMudmFsdWUscHJpdmF0ZUtleTpkLnByaXZhdGVLZXl9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSB0eXBlICIrbCl9fXQuZXhwb3J0cz11LHUuc2lnbmF0dXJlPWkuc2lnbmF0dXJlfSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjM1KSxyPW4oMjM2KSxvPW4oMjM3KSxzPW4oMjM4KSxhPW4oMjM5KTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fXUucHJvdG90eXBlLmNsZWFyPWksdS5wcm90b3R5cGUuZGVsZXRlPXIsdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPXMsdS5wcm90b3R5cGUuc2V0PWEsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDExOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYoaSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjkpKE9iamVjdCwiY3JlYXRlIik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gaShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDQxKSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5hZGRDbGFzcygicC1QYW5lbCIpLG4ubGF5b3V0PW8uY3JlYXRlTGF5b3V0KGUpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIndpZGdldHMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXQuYWRkV2lkZ2V0KHQpfSxlLnByb3RvdHlwZS5pbnNlcnRXaWRnZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmxheW91dC5pbnNlcnRXaWRnZXQodCxlKX0sZX0obig3KS5XaWRnZXQpO2UuUGFuZWw9YSxmdW5jdGlvbih0KXt0LmNyZWF0ZUxheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5sYXlvdXR8fG5ldyBzLlBhbmVsTGF5b3V0fX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMudHlwZT0idGV4dCIsdGhpcy5jb250ZW50PXR9fSgpO2UuVmlydHVhbFRleHQ9cjt2YXIgbyxzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt0aGlzLnR5cGU9ImVsZW1lbnQiLHRoaXMudGFnPXQsdGhpcy5hdHRycz1lLHRoaXMuY2hpbGRyZW49bn19KCk7ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9e30sbj1bXSxpPTEsbz1hcmd1bWVudHMubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPWFyZ3VtZW50c1tpXTsic3RyaW5nIj09dHlwZW9mIGE/bi5wdXNoKG5ldyByKGEpKTphIGluc3RhbmNlb2Ygcj9uLnB1c2goYSk6YSBpbnN0YW5jZW9mIHM/bi5wdXNoKGEpOmEgaW5zdGFuY2VvZiBBcnJheT91KG4sYSk6MT09PWkmJmEmJiJvYmplY3QiPT10eXBlb2YgYSYmKGU9YSl9cmV0dXJuIG5ldyBzKHQsZSxuKTtmdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuPTAsaT1lO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dOyJzdHJpbmciPT10eXBlb2Ygbz90LnB1c2gobmV3IHIobykpOm8gaW5zdGFuY2VvZiByP3QucHVzaChvKTpvIGluc3RhbmNlb2YgcyYmdC5wdXNoKG8pfX19ZS5WaXJ0dWFsRWxlbWVudD1zLGUuaD1hLGZ1bmN0aW9uKHQpe3QuYT10LmJpbmQodm9pZCAwLCJhIiksdC5hYmJyPXQuYmluZCh2b2lkIDAsImFiYnIiKSx0LmFkZHJlc3M9dC5iaW5kKHZvaWQgMCwiYWRkcmVzcyIpLHQuYXJlYT10LmJpbmQodm9pZCAwLCJhcmVhIiksdC5hcnRpY2xlPXQuYmluZCh2b2lkIDAsImFydGljbGUiKSx0LmFzaWRlPXQuYmluZCh2b2lkIDAsImFzaWRlIiksdC5hdWRpbz10LmJpbmQodm9pZCAwLCJhdWRpbyIpLHQuYj10LmJpbmQodm9pZCAwLCJiIiksdC5iZGk9dC5iaW5kKHZvaWQgMCwiYmRpIiksdC5iZG89dC5iaW5kKHZvaWQgMCwiYmRvIiksdC5ibG9ja3F1b3RlPXQuYmluZCh2b2lkIDAsImJsb2NrcXVvdGUiKSx0LmJyPXQuYmluZCh2b2lkIDAsImJyIiksdC5idXR0b249dC5iaW5kKHZvaWQgMCwiYnV0dG9uIiksdC5jYW52YXM9dC5iaW5kKHZvaWQgMCwiY2FudmFzIiksdC5jYXB0aW9uPXQuYmluZCh2b2lkIDAsImNhcHRpb24iKSx0LmNpdGU9dC5iaW5kKHZvaWQgMCwiY2l0ZSIpLHQuY29kZT10LmJpbmQodm9pZCAwLCJjb2RlIiksdC5jb2w9dC5iaW5kKHZvaWQgMCwiY29sIiksdC5jb2xncm91cD10LmJpbmQodm9pZCAwLCJjb2xncm91cCIpLHQuZGF0YT10LmJpbmQodm9pZCAwLCJkYXRhIiksdC5kYXRhbGlzdD10LmJpbmQodm9pZCAwLCJkYXRhbGlzdCIpLHQuZGQ9dC5iaW5kKHZvaWQgMCwiZGQiKSx0LmRlbD10LmJpbmQodm9pZCAwLCJkZWwiKSx0LmRmbj10LmJpbmQodm9pZCAwLCJkZm4iKSx0LmRpdj10LmJpbmQodm9pZCAwLCJkaXYiKSx0LmRsPXQuYmluZCh2b2lkIDAsImRsIiksdC5kdD10LmJpbmQodm9pZCAwLCJkdCIpLHQuZW09dC5iaW5kKHZvaWQgMCwiZW0iKSx0LmVtYmVkPXQuYmluZCh2b2lkIDAsImVtYmVkIiksdC5maWVsZHNldD10LmJpbmQodm9pZCAwLCJmaWVsZHNldCIpLHQuZmlnY2FwdGlvbj10LmJpbmQodm9pZCAwLCJmaWdjYXB0aW9uIiksdC5maWd1cmU9dC5iaW5kKHZvaWQgMCwiZmlndXJlIiksdC5mb290ZXI9dC5iaW5kKHZvaWQgMCwiZm9vdGVyIiksdC5mb3JtPXQuYmluZCh2b2lkIDAsImZvcm0iKSx0LmgxPXQuYmluZCh2b2lkIDAsImgxIiksdC5oMj10LmJpbmQodm9pZCAwLCJoMiIpLHQuaDM9dC5iaW5kKHZvaWQgMCwiaDMiKSx0Lmg0PXQuYmluZCh2b2lkIDAsImg0IiksdC5oNT10LmJpbmQodm9pZCAwLCJoNSIpLHQuaDY9dC5iaW5kKHZvaWQgMCwiaDYiKSx0LmhlYWRlcj10LmJpbmQodm9pZCAwLCJoZWFkZXIiKSx0LmhyPXQuYmluZCh2b2lkIDAsImhyIiksdC5pPXQuYmluZCh2b2lkIDAsImkiKSx0LmlmcmFtZT10LmJpbmQodm9pZCAwLCJpZnJhbWUiKSx0LmltZz10LmJpbmQodm9pZCAwLCJpbWciKSx0LmlucHV0PXQuYmluZCh2b2lkIDAsImlucHV0IiksdC5pbnM9dC5iaW5kKHZvaWQgMCwiaW5zIiksdC5rYmQ9dC5iaW5kKHZvaWQgMCwia2JkIiksdC5sYWJlbD10LmJpbmQodm9pZCAwLCJsYWJlbCIpLHQubGVnZW5kPXQuYmluZCh2b2lkIDAsImxlZ2VuZCIpLHQubGk9dC5iaW5kKHZvaWQgMCwibGkiKSx0Lm1haW49dC5iaW5kKHZvaWQgMCwibWFpbiIpLHQubWFwPXQuYmluZCh2b2lkIDAsIm1hcCIpLHQubWFyaz10LmJpbmQodm9pZCAwLCJtYXJrIiksdC5tZXRlcj10LmJpbmQodm9pZCAwLCJtZXRlciIpLHQubmF2PXQuYmluZCh2b2lkIDAsIm5hdiIpLHQubm9zY3JpcHQ9dC5iaW5kKHZvaWQgMCwibm9zY3JpcHQiKSx0Lm9iamVjdD10LmJpbmQodm9pZCAwLCJvYmplY3QiKSx0Lm9sPXQuYmluZCh2b2lkIDAsIm9sIiksdC5vcHRncm91cD10LmJpbmQodm9pZCAwLCJvcHRncm91cCIpLHQub3B0aW9uPXQuYmluZCh2b2lkIDAsIm9wdGlvbiIpLHQub3V0cHV0PXQuYmluZCh2b2lkIDAsIm91dHB1dCIpLHQucD10LmJpbmQodm9pZCAwLCJwIiksdC5wYXJhbT10LmJpbmQodm9pZCAwLCJwYXJhbSIpLHQucHJlPXQuYmluZCh2b2lkIDAsInByZSIpLHQucHJvZ3Jlc3M9dC5iaW5kKHZvaWQgMCwicHJvZ3Jlc3MiKSx0LnE9dC5iaW5kKHZvaWQgMCwicSIpLHQucnA9dC5iaW5kKHZvaWQgMCwicnAiKSx0LnJ0PXQuYmluZCh2b2lkIDAsInJ0IiksdC5ydWJ5PXQuYmluZCh2b2lkIDAsInJ1YnkiKSx0LnM9dC5iaW5kKHZvaWQgMCwicyIpLHQuc2FtcD10LmJpbmQodm9pZCAwLCJzYW1wIiksdC5zZWN0aW9uPXQuYmluZCh2b2lkIDAsInNlY3Rpb24iKSx0LnNlbGVjdD10LmJpbmQodm9pZCAwLCJzZWxlY3QiKSx0LnNtYWxsPXQuYmluZCh2b2lkIDAsInNtYWxsIiksdC5zb3VyY2U9dC5iaW5kKHZvaWQgMCwic291cmNlIiksdC5zcGFuPXQuYmluZCh2b2lkIDAsInNwYW4iKSx0LnN0cm9uZz10LmJpbmQodm9pZCAwLCJzdHJvbmciKSx0LnN1Yj10LmJpbmQodm9pZCAwLCJzdWIiKSx0LnN1bW1hcnk9dC5iaW5kKHZvaWQgMCwic3VtbWFyeSIpLHQuc3VwPXQuYmluZCh2b2lkIDAsInN1cCIpLHQudGFibGU9dC5iaW5kKHZvaWQgMCwidGFibGUiKSx0LnRib2R5PXQuYmluZCh2b2lkIDAsInRib2R5IiksdC50ZD10LmJpbmQodm9pZCAwLCJ0ZCIpLHQudGV4dGFyZWE9dC5iaW5kKHZvaWQgMCwidGV4dGFyZWEiKSx0LnRmb290PXQuYmluZCh2b2lkIDAsInRmb290IiksdC50aD10LmJpbmQodm9pZCAwLCJ0aCIpLHQudGhlYWQ9dC5iaW5kKHZvaWQgMCwidGhlYWQiKSx0LnRpbWU9dC5iaW5kKHZvaWQgMCwidGltZSIpLHQudGl0bGU9dC5iaW5kKHZvaWQgMCwidGl0bGUiKSx0LnRyPXQuYmluZCh2b2lkIDAsInRyIiksdC50cmFjaz10LmJpbmQodm9pZCAwLCJ0cmFjayIpLHQudT10LmJpbmQodm9pZCAwLCJ1IiksdC51bD10LmJpbmQodm9pZCAwLCJ1bCIpLHQudmFyXz10LmJpbmQodm9pZCAwLCJ2YXIiKSx0LnZpZGVvPXQuYmluZCh2b2lkIDAsInZpZGVvIiksdC53YnI9dC5iaW5kKHZvaWQgMCwid2JyIil9KGE9ZS5ofHwoZS5oPXt9KSksZnVuY3Rpb24odCl7dC5yZWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNyZWF0ZURPTU5vZGUodCl9LHQucmVuZGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5ob3N0TWFwLmdldChlKXx8W10saT1vLmFzQ29udGVudEFycmF5KHQpO28uaG9zdE1hcC5zZXQoZSxpKSxvLnVwZGF0ZUNvbnRlbnQoZSxuLGkpfX0oZS5WaXJ0dWFsRE9NfHwoZS5WaXJ0dWFsRE9NPXt9KSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtpZigidGV4dCI9PT10LnR5cGUpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQuY29udGVudCk7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0LnRhZyk7IWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIGUpaSBpbiBufHwoIm9uIj09PWkuc3Vic3RyKDAsMik/dFtpXT1lW2ldOnQuc2V0QXR0cmlidXRlKGksZVtpXSkpO3ZvaWQgMCE9PWUuY2xhc3NOYW1lJiZ0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUuY2xhc3NOYW1lKTt2b2lkIDAhPT1lLmh0bWxGb3ImJnQuc2V0QXR0cmlidXRlKCJmb3IiLGUuaHRtbEZvcik7ZS5kYXRhc2V0JiZmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKXQuc2V0QXR0cmlidXRlKCJkYXRhLSIrbixlW25dKX0odCxlLmRhdGFzZXQpO2Uuc3R5bGUmJmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10LnN0eWxlO2ZvcihuIGluIGUpaVtuXT1lW25dfSh0LGUuc3R5bGUpfShpLHQuYXR0cnMpO2Zvcih2YXIgcj0wLG89dC5jaGlsZHJlbi5sZW5ndGg7cjxvOysrcilpLmFwcGVuZENoaWxkKGUodC5jaGlsZHJlbltyXSkpO3JldHVybiBpfXQuaG9zdE1hcD1uZXcgV2Vha01hcCx0LmFzQ29udGVudEFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0P3QgaW5zdGFuY2VvZiBBcnJheT90Olt0XTpbXX0sdC5jcmVhdGVET01Ob2RlPWUsdC51cGRhdGVDb250ZW50PWZ1bmN0aW9uIHQobixvLHMpe2lmKG8hPT1zKXtmb3IodmFyIGE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5maXJzdENoaWxkLGk9T2JqZWN0LmNyZWF0ZShudWxsKSxyPTAsbz1lO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdOyJlbGVtZW50Ij09PXMudHlwZSYmcy5hdHRycy5rZXkmJihpW3MuYXR0cnMua2V5XT17dk5vZGU6cyxlbGVtZW50Om59KSxuPW4ubmV4dFNpYmxpbmd9cmV0dXJuIGl9KG4sbyksdT1vLnNsaWNlKCksYz1uLmZpcnN0Q2hpbGQsaD1zLmxlbmd0aCxsPTA7bDxoOysrbClpZihsPj11Lmxlbmd0aCluLmFwcGVuZENoaWxkKGUoc1tsXSkpO2Vsc2V7dmFyIGQ9dVtsXSxmPXNbbF07aWYoZCE9PWYpaWYoInRleHQiIT09ZC50eXBlfHwidGV4dCIhPT1mLnR5cGUpaWYoInRleHQiIT09ZC50eXBlJiYidGV4dCIhPT1mLnR5cGUpe3ZhciBwPWYuYXR0cnMua2V5O2lmKHAmJnAgaW4gYSl7dmFyIG09YVtwXTttLnZOb2RlIT09ZCYmKGkuQXJyYXlFeHQubW92ZSh1LHUuaW5kZXhPZihtLnZOb2RlLGwrMSksbCksbi5pbnNlcnRCZWZvcmUobS5lbGVtZW50LGMpLGQ9bS52Tm9kZSxjPW0uZWxlbWVudCl9aWYoZCE9PWYpe3ZhciBnPWQuYXR0cnMua2V5O2cmJmchPT1wPyhpLkFycmF5RXh0Lmluc2VydCh1LGwsZiksbi5pbnNlcnRCZWZvcmUoZShmKSxjKSk6ZC50YWc9PT1mLnRhZz8ocihjLGQuYXR0cnMsZi5hdHRycyksdChjLGQuY2hpbGRyZW4sZi5jaGlsZHJlbiksYz1jLm5leHRTaWJsaW5nKTooaS5BcnJheUV4dC5pbnNlcnQodSxsLGYpLG4uaW5zZXJ0QmVmb3JlKGUoZiksYykpfWVsc2UgYz1jLm5leHRTaWJsaW5nfWVsc2UgaS5BcnJheUV4dC5pbnNlcnQodSxsLGYpLG4uaW5zZXJ0QmVmb3JlKGUoZiksYyk7ZWxzZSBjLnRleHRDb250ZW50PWYuY29udGVudCxjPWMubmV4dFNpYmxpbmc7ZWxzZSBjPWMubmV4dFNpYmxpbmd9Zm9yKGw9dS5sZW5ndGgtaDtsPjA7LS1sKW4ucmVtb3ZlQ2hpbGQobi5sYXN0Q2hpbGQpfX07dmFyIG49e2tleTohMCxjbGFzc05hbWU6ITAsaHRtbEZvcjohMCxkYXRhc2V0OiEwLHN0eWxlOiEwfTtmdW5jdGlvbiByKHQsZSxpKXtpZihlIT09aSl7dmFyIHI7Zm9yKHIgaW4gZSlyIGluIG58fHIgaW4gaXx8KCJvbiI9PT1yLnN1YnN0cigwLDIpP3Rbcl09bnVsbDp0LnJlbW92ZUF0dHJpYnV0ZShyKSk7Zm9yKHIgaW4gaSlyIGluIG58fGVbcl09PT1pW3JdfHwoIm9uIj09PXIuc3Vic3RyKDAsMik/dFtyXT1pW3JdOnQuc2V0QXR0cmlidXRlKHIsaVtyXSkpO2UuY2xhc3NOYW1lIT09aS5jbGFzc05hbWUmJih2b2lkIDAhPT1pLmNsYXNzTmFtZT90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGkuY2xhc3NOYW1lKTp0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSksZS5odG1sRm9yIT09aS5odG1sRm9yJiYodm9pZCAwIT09aS5odG1sRm9yP3Quc2V0QXR0cmlidXRlKCJmb3IiLGkuaHRtbEZvcik6dC5yZW1vdmVBdHRyaWJ1dGUoImZvciIpKSxlLmRhdGFzZXQhPT1pLmRhdGFzZXQmJmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkgaW4gZSlpIGluIG58fHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLSIraSk7Zm9yKHZhciByIGluIG4pZVtyXSE9PW5bcl0mJnQuc2V0QXR0cmlidXRlKCJkYXRhLSIrcixuW3JdKX0odCxlLmRhdGFzZXR8fHt9LGkuZGF0YXNldHx8e30pLGUuc3R5bGUhPT1pLnN0eWxlJiZmdW5jdGlvbih0LGUsbil7dmFyIGkscj10LnN0eWxlO2ZvcihpIGluIGUpaSBpbiBufHwocltpXT0iIik7Zm9yKGkgaW4gbillW2ldIT09bltpXSYmKHJbaV09bltpXSl9KHQsZS5zdHlsZXx8e30saS5zdHlsZXx8e30pfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpLHI9big3OCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpczt0aGlzLl9vblNjcm9sbEZyYW1lPWZ1bmN0aW9uKCl7aWYoZS5fc2Nyb2xsVGFyZ2V0KXt2YXIgdD1lLl9zY3JvbGxUYXJnZXQsbj10LmVsZW1lbnQscj10LmVkZ2Usbz10LmRpc3RhbmNlLHM9aS5TQ1JPTExfRURHRV9TSVpFLW8sYT1NYXRoLnBvdyhzL2kuU0NST0xMX0VER0VfU0laRSwyKSx1PU1hdGgubWF4KDEsTWF0aC5yb3VuZChhKmkuU0NST0xMX0VER0VfU0laRSkpO3N3aXRjaChyKXtjYXNlInRvcCI6bi5zY3JvbGxUb3AtPXU7YnJlYWs7Y2FzZSJsZWZ0IjpuLnNjcm9sbExlZnQtPXU7YnJlYWs7Y2FzZSJyaWdodCI6bi5zY3JvbGxMZWZ0Kz11O2JyZWFrO2Nhc2UiYm90dG9tIjpuLnNjcm9sbFRvcCs9dX1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZS5fb25TY3JvbGxGcmFtZSl9fSx0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLl9kcm9wQWN0aW9uPSJub25lIix0aGlzLl9vdmVycmlkZT1udWxsLHRoaXMuX2N1cnJlbnRUYXJnZXQ9bnVsbCx0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX3Byb21pc2U9bnVsbCx0aGlzLl9zY3JvbGxUYXJnZXQ9bnVsbCx0aGlzLl9yZXNvbHZlPW51bGwsdGhpcy5taW1lRGF0YT10Lm1pbWVEYXRhLHRoaXMuZHJhZ0ltYWdlPXQuZHJhZ0ltYWdlfHxudWxsLHRoaXMucHJvcG9zZWRBY3Rpb249dC5wcm9wb3NlZEFjdGlvbnx8ImNvcHkiLHRoaXMuc3VwcG9ydGVkQWN0aW9ucz10LnN1cHBvcnRlZEFjdGlvbnN8fCJhbGwiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsfXJldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXtpZih0aGlzLl9kaXNwb3NlZD0hMCx0aGlzLl9jdXJyZW50VGFyZ2V0KXt2YXIgdD1pLmNyZWF0ZU1vdXNlRXZlbnQoIm1vdXNldXAiLC0xLC0xKTtpLmRpc3BhdGNoRHJhZ0xlYXZlKHRoaXMsdGhpcy5fY3VycmVudFRhcmdldCxudWxsLHQpfXRoaXMuX2ZpbmFsaXplKCJub25lIil9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKHRoaXMuX2Rpc3Bvc2VkKXJldHVybiBQcm9taXNlLnJlc29sdmUoIm5vbmUiKTtpZih0aGlzLl9wcm9taXNlKXJldHVybiB0aGlzLl9wcm9taXNlO3RoaXMuX2FkZExpc3RlbmVycygpLHRoaXMuX2F0dGFjaERyYWdJbWFnZSh0LGUpLHRoaXMuX3Byb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24odCxlKXtuLl9yZXNvbHZlPXR9KTt2YXIgcj1pLmNyZWF0ZU1vdXNlRXZlbnQoIm1vdXNlbW92ZSIsdCxlKTtyZXR1cm4gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChyKSx0aGlzLl9wcm9taXNlfSx0LnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlIm1vdXNlbW92ZSI6dGhpcy5fZXZ0TW91c2VNb3ZlKHQpO2JyZWFrO2Nhc2UibW91c2V1cCI6dGhpcy5fZXZ0TW91c2VVcCh0KTticmVhaztjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7ZGVmYXVsdDp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19LHQucHJvdG90eXBlLl9ldnRNb3VzZU1vdmU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fdXBkYXRlQ3VycmVudFRhcmdldCh0KSx0aGlzLl91cGRhdGVEcmFnU2Nyb2xsKHQpLHRoaXMuX21vdmVEcmFnSW1hZ2UodC5jbGllbnRYLHQuY2xpZW50WSl9LHQucHJvdG90eXBlLl9ldnRNb3VzZVVwPWZ1bmN0aW9uKHQpe2lmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDA9PT10LmJ1dHRvbilpZih0aGlzLl91cGRhdGVDdXJyZW50VGFyZ2V0KHQpLHRoaXMuX2N1cnJlbnRUYXJnZXQpe2lmKCJub25lIj09PXRoaXMuX2Ryb3BBY3Rpb24pcmV0dXJuIGkuZGlzcGF0Y2hEcmFnTGVhdmUodGhpcyx0aGlzLl9jdXJyZW50VGFyZ2V0LG51bGwsdCksdm9pZCB0aGlzLl9maW5hbGl6ZSgibm9uZSIpO3ZhciBlPWkuZGlzcGF0Y2hEcm9wKHRoaXMsdGhpcy5fY3VycmVudFRhcmdldCx0KTt0aGlzLl9maW5hbGl6ZShlKX1lbHNlIHRoaXMuX2ZpbmFsaXplKCJub25lIil9LHQucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiZ0aGlzLmRpc3Bvc2UoKX0sdC5wcm90b3R5cGUuX2FkZExpc3RlbmVycz1mdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKX0sdC5wcm90b3R5cGUuX3JlbW92ZUxpc3RlbmVycz1mdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKX0sdC5wcm90b3R5cGUuX3VwZGF0ZURyYWdTY3JvbGw9ZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kU2Nyb2xsVGFyZ2V0KHQpOyh0aGlzLl9zY3JvbGxUYXJnZXR8fGUpJiYodGhpcy5fc2Nyb2xsVGFyZ2V0fHxzZXRUaW1lb3V0KHRoaXMuX29uU2Nyb2xsRnJhbWUsNTAwKSx0aGlzLl9zY3JvbGxUYXJnZXQ9ZSl9LHQucHJvdG90eXBlLl91cGRhdGVDdXJyZW50VGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2N1cnJlbnRUYXJnZXQsbj10aGlzLl9jdXJyZW50VGFyZ2V0LHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHQuY2xpZW50WCx0LmNsaWVudFkpO3RoaXMuX2N1cnJlbnRFbGVtZW50PW8sbyE9PXImJm8hPT1uJiZpLmRpc3BhdGNoRHJhZ0V4aXQodGhpcyxuLG8sdCksbyE9PXImJm8hPT1uJiYobj1pLmRpc3BhdGNoRHJhZ0VudGVyKHRoaXMsbyxuLHQpKSxuIT09ZSYmKHRoaXMuX2N1cnJlbnRUYXJnZXQ9bixpLmRpc3BhdGNoRHJhZ0xlYXZlKHRoaXMsZSxuLHQpKTt2YXIgcz1pLmRpc3BhdGNoRHJhZ092ZXIodGhpcyxuLHQpO3RoaXMuX3NldERyb3BBY3Rpb24ocyl9LHQucHJvdG90eXBlLl9hdHRhY2hEcmFnSW1hZ2U9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmRyYWdJbWFnZSl7dGhpcy5kcmFnSW1hZ2UuY2xhc3NMaXN0LmFkZCgicC1tb2QtZHJhZy1pbWFnZSIpO3ZhciBuPXRoaXMuZHJhZ0ltYWdlLnN0eWxlO24ucG9pbnRlckV2ZW50cz0ibm9uZSIsbi5wb3NpdGlvbj0iZml4ZWQiLG4udG9wPWUrInB4IixuLmxlZnQ9dCsicHgiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnSW1hZ2UpfX0sdC5wcm90b3R5cGUuX21vdmVEcmFnSW1hZ2U9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmRyYWdJbWFnZSl7dmFyIG49dGhpcy5kcmFnSW1hZ2Uuc3R5bGU7bi50b3A9ZSsicHgiLG4ubGVmdD10KyJweCJ9fSx0LnByb3RvdHlwZS5fZGV0YWNoRHJhZ0ltYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5kcmFnSW1hZ2Upe3ZhciB0PXRoaXMuZHJhZ0ltYWdlLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdJbWFnZSl9fSx0LnByb3RvdHlwZS5fc2V0RHJvcEFjdGlvbj1mdW5jdGlvbihlKXtpZihlPWkudmFsaWRhdGVBY3Rpb24oZSx0aGlzLnN1cHBvcnRlZEFjdGlvbnMpLCF0aGlzLl9vdmVycmlkZXx8dGhpcy5fZHJvcEFjdGlvbiE9PWUpc3dpdGNoKGUpe2Nhc2Uibm9uZSI6dGhpcy5fZHJvcEFjdGlvbj1lLHRoaXMuX292ZXJyaWRlPXQub3ZlcnJpZGVDdXJzb3IoIm5vLWRyb3AiKTticmVhaztjYXNlImNvcHkiOnRoaXMuX2Ryb3BBY3Rpb249ZSx0aGlzLl9vdmVycmlkZT10Lm92ZXJyaWRlQ3Vyc29yKCJjb3B5Iik7YnJlYWs7Y2FzZSJsaW5rIjp0aGlzLl9kcm9wQWN0aW9uPWUsdGhpcy5fb3ZlcnJpZGU9dC5vdmVycmlkZUN1cnNvcigiYWxpYXMiKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX2Ryb3BBY3Rpb249ZSx0aGlzLl9vdmVycmlkZT10Lm92ZXJyaWRlQ3Vyc29yKCJtb3ZlIil9fSx0LnByb3RvdHlwZS5fZmluYWxpemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVzb2x2ZTt0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKSx0aGlzLl9kZXRhY2hEcmFnSW1hZ2UoKSx0aGlzLl9vdmVycmlkZSYmKHRoaXMuX292ZXJyaWRlLmRpc3Bvc2UoKSx0aGlzLl9vdmVycmlkZT1udWxsKSx0aGlzLm1pbWVEYXRhLmNsZWFyKCksdGhpcy5fZGlzcG9zZWQ9ITAsdGhpcy5fZHJvcEFjdGlvbj0ibm9uZSIsdGhpcy5fY3VycmVudFRhcmdldD1udWxsLHRoaXMuX2N1cnJlbnRFbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsVGFyZ2V0PW51bGwsdGhpcy5fcHJvbWlzZT1udWxsLHRoaXMuX3Jlc29sdmU9bnVsbCxlJiZlKHQpfSx0fSgpO2UuRHJhZz1vLGZ1bmN0aW9uKHQpe3Qub3ZlcnJpZGVDdXJzb3I9ZnVuY3Rpb24odCl7dmFyIG49KytlO3JldHVybiBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj10LGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicC1tb2Qtb3ZlcnJpZGUtY3Vyc29yIiksbmV3IHIuRGlzcG9zYWJsZURlbGVnYXRlKGZ1bmN0aW9uKCl7bj09PWUmJihkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0iIixkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLW92ZXJyaWRlLWN1cnNvciIpKX0pfTt2YXIgZT0wfShvPWUuRHJhZ3x8KGUuRHJhZz17fSkpLGUuRHJhZz1vLGZ1bmN0aW9uKHQpe3QuU0NST0xMX0VER0VfU0laRT0yMCx0LnZhbGlkYXRlQWN0aW9uPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIGVbdF0mbltpXT90OiJub25lIn0sdC5jcmVhdGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO3JldHVybiBpLmluaXRNb3VzZUV2ZW50KHQsITAsITAsd2luZG93LDAsMCwwLGUsbiwhMSwhMSwhMSwhMSwwLG51bGwpLGl9LHQuZmluZFNjcm9sbFRhcmdldD1mdW5jdGlvbihlKXtmb3IodmFyIG49ZS5jbGllbnRYLGk9ZS5jbGllbnRZLHI9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChuLGkpO3I7cj1yLnBhcmVudEVsZW1lbnQpaWYoci5oYXNBdHRyaWJ1dGUoImRhdGEtcC1kcmFnc2Nyb2xsIikpe3ZhciBvPTAscz0wO3I9PT1kb2N1bWVudC5ib2R5JiYobz13aW5kb3cucGFnZVhPZmZzZXQscz13aW5kb3cucGFnZVlPZmZzZXQpO3ZhciBhPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdT1hLnRvcCtzLGM9YS5sZWZ0K28saD1jK2Eud2lkdGgsbD11K2EuaGVpZ2h0O2lmKCEobjxjfHxuPj1ofHxpPHV8fGk+PWwpKXt2YXIgZD1uLWMrMSxmPWktdSsxLHA9aC1uLG09bC1pLGc9TWF0aC5taW4oZCxmLHAsbSk7aWYoIShnPnQuU0NST0xMX0VER0VfU0laRSkpe3ZhciB2PXZvaWQgMDtzd2l0Y2goZyl7Y2FzZSBtOnY9ImJvdHRvbSI7YnJlYWs7Y2FzZSBmOnY9InRvcCI7YnJlYWs7Y2FzZSBwOnY9InJpZ2h0IjticmVhaztjYXNlIGQ6dj0ibGVmdCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9dmFyIGI9ci5zY3JvbGxXaWR0aC1yLmNsaWVudFdpZHRoLHk9ci5zY3JvbGxIZWlnaHQtci5jbGllbnRIZWlnaHQsXz12b2lkIDA7c3dpdGNoKHYpe2Nhc2UidG9wIjpfPXk+MCYmci5zY3JvbGxUb3A+MDticmVhaztjYXNlImxlZnQiOl89Yj4wJiZyLnNjcm9sbExlZnQ+MDticmVhaztjYXNlInJpZ2h0IjpfPWI+MCYmci5zY3JvbGxMZWZ0PGI7YnJlYWs7Y2FzZSJib3R0b20iOl89eT4wJiZyLnNjcm9sbFRvcDx5O2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifWlmKF8pcmV0dXJue2VsZW1lbnQ6cixlZGdlOnYsZGlzdGFuY2U6Z319fX1yZXR1cm4gbnVsbH0sdC5kaXNwYXRjaERyYWdFbnRlcj1mdW5jdGlvbih0LGUsbixyKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgbz1pKCJwLWRyYWdlbnRlciIsdCxyLG4pO3JldHVybiBlLmRpc3BhdGNoRXZlbnQobyk/ZT09PWRvY3VtZW50LmJvZHk/bjoobz1pKCJwLWRyYWdlbnRlciIsdCxyLG4pLGRvY3VtZW50LmJvZHkuZGlzcGF0Y2hFdmVudChvKSxkb2N1bWVudC5ib2R5KTplfSx0LmRpc3BhdGNoRHJhZ0V4aXQ9ZnVuY3Rpb24odCxlLG4scil7aWYoZSl7dmFyIG89aSgicC1kcmFnZXhpdCIsdCxyLG4pO2UuZGlzcGF0Y2hFdmVudChvKX19LHQuZGlzcGF0Y2hEcmFnTGVhdmU9ZnVuY3Rpb24odCxlLG4scil7aWYoZSl7dmFyIG89aSgicC1kcmFnbGVhdmUiLHQscixuKTtlLmRpc3BhdGNoRXZlbnQobyl9fSx0LmRpc3BhdGNoRHJhZ092ZXI9ZnVuY3Rpb24odCxlLG4pe2lmKCFlKXJldHVybiJub25lIjt2YXIgcj1pKCJwLWRyYWdvdmVyIix0LG4sbnVsbCk7cmV0dXJuIGUuZGlzcGF0Y2hFdmVudChyKT8ibm9uZSI6ci5kcm9wQWN0aW9ufSx0LmRpc3BhdGNoRHJvcD1mdW5jdGlvbih0LGUsbil7aWYoIWUpcmV0dXJuIm5vbmUiO3ZhciByPWkoInAtZHJvcCIsdCxuLG51bGwpO3JldHVybiBlLmRpc3BhdGNoRXZlbnQocik/Im5vbmUiOnIuZHJvcEFjdGlvbn07dmFyIGU9e25vbmU6MCxjb3B5OjEsbGluazoyLG1vdmU6NH0sbj17bm9uZTplLm5vbmUsY29weTplLmNvcHksbGluazplLmxpbmssbW92ZTplLm1vdmUsImNvcHktbGluayI6ZS5jb3B5fGUubGluaywiY29weS1tb3ZlIjplLmNvcHl8ZS5tb3ZlLCJsaW5rLW1vdmUiOmUubGlua3xlLm1vdmUsYWxsOmUuY29weXxlLmxpbmt8ZS5tb3ZlfTtmdW5jdGlvbiBpKHQsZSxuLGkpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7cmV0dXJuIHIuaW5pdE1vdXNlRXZlbnQodCwhMCwhMCx3aW5kb3csMCxuLnNjcmVlblgsbi5zY3JlZW5ZLG4uY2xpZW50WCxuLmNsaWVudFksbi5jdHJsS2V5LG4uYWx0S2V5LG4uc2hpZnRLZXksbi5tZXRhS2V5LG4uYnV0dG9uLGkpLHIuZHJvcEFjdGlvbj0ibm9uZSIsci5taW1lRGF0YT1lLm1pbWVEYXRhLHIucHJvcG9zZWRBY3Rpb249ZS5wcm9wb3NlZEFjdGlvbixyLnN1cHBvcnRlZEFjdGlvbnM9ZS5zdXBwb3J0ZWRBY3Rpb25zLHIuc291cmNlPWUuc291cmNlLHJ9fShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTj0iMS40LjAifSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMCkscj1uKDg0KSxvPW4oMSkuQnVmZmVyLHM9bmV3IEFycmF5KDE2KTtmdW5jdGlvbiBhKCl7ci5jYWxsKHRoaXMsNjQpLHRoaXMuX2E9MTczMjU4NDE5Myx0aGlzLl9iPTQwMjMyMzM0MTcsdGhpcy5fYz0yNTYyMzgzMTAyLHRoaXMuX2Q9MjcxNzMzODc4fWZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gdDw8ZXx0Pj4+MzItZX1mdW5jdGlvbiBjKHQsZSxuLGkscixvLHMpe3JldHVybiB1KHQrKGUmbnx+ZSZpKStyK298MCxzKStlfDB9ZnVuY3Rpb24gaCh0LGUsbixpLHIsbyxzKXtyZXR1cm4gdSh0KyhlJml8biZ+aSkrcitvfDAscykrZXwwfWZ1bmN0aW9uIGwodCxlLG4saSxyLG8scyl7cmV0dXJuIHUodCsoZV5uXmkpK3Irb3wwLHMpK2V8MH1mdW5jdGlvbiBkKHQsZSxuLGkscixvLHMpe3JldHVybiB1KHQrKG5eKGV8fmkpKStyK298MCxzKStlfDB9aShhLHIpLGEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9cyxlPTA7ZTwxNjsrK2UpdFtlXT10aGlzLl9ibG9jay5yZWFkSW50MzJMRSg0KmUpO3ZhciBuPXRoaXMuX2EsaT10aGlzLl9iLHI9dGhpcy5fYyxvPXRoaXMuX2Q7bj1jKG4saSxyLG8sdFswXSwzNjE0MDkwMzYwLDcpLG89YyhvLG4saSxyLHRbMV0sMzkwNTQwMjcxMCwxMikscj1jKHIsbyxuLGksdFsyXSw2MDYxMDU4MTksMTcpLGk9YyhpLHIsbyxuLHRbM10sMzI1MDQ0MTk2NiwyMiksbj1jKG4saSxyLG8sdFs0XSw0MTE4NTQ4Mzk5LDcpLG89YyhvLG4saSxyLHRbNV0sMTIwMDA4MDQyNiwxMikscj1jKHIsbyxuLGksdFs2XSwyODIxNzM1OTU1LDE3KSxpPWMoaSxyLG8sbix0WzddLDQyNDkyNjEzMTMsMjIpLG49YyhuLGkscixvLHRbOF0sMTc3MDAzNTQxNiw3KSxvPWMobyxuLGkscix0WzldLDIzMzY1NTI4NzksMTIpLHI9YyhyLG8sbixpLHRbMTBdLDQyOTQ5MjUyMzMsMTcpLGk9YyhpLHIsbyxuLHRbMTFdLDIzMDQ1NjMxMzQsMjIpLG49YyhuLGkscixvLHRbMTJdLDE4MDQ2MDM2ODIsNyksbz1jKG8sbixpLHIsdFsxM10sNDI1NDYyNjE5NSwxMikscj1jKHIsbyxuLGksdFsxNF0sMjc5Mjk2NTAwNiwxNyksbj1oKG4saT1jKGkscixvLG4sdFsxNV0sMTIzNjUzNTMyOSwyMikscixvLHRbMV0sNDEyOTE3MDc4Niw1KSxvPWgobyxuLGkscix0WzZdLDMyMjU0NjU2NjQsOSkscj1oKHIsbyxuLGksdFsxMV0sNjQzNzE3NzEzLDE0KSxpPWgoaSxyLG8sbix0WzBdLDM5MjEwNjk5OTQsMjApLG49aChuLGkscixvLHRbNV0sMzU5MzQwODYwNSw1KSxvPWgobyxuLGkscix0WzEwXSwzODAxNjA4Myw5KSxyPWgocixvLG4saSx0WzE1XSwzNjM0NDg4OTYxLDE0KSxpPWgoaSxyLG8sbix0WzRdLDM4ODk0Mjk0NDgsMjApLG49aChuLGkscixvLHRbOV0sNTY4NDQ2NDM4LDUpLG89aChvLG4saSxyLHRbMTRdLDMyNzUxNjM2MDYsOSkscj1oKHIsbyxuLGksdFszXSw0MTA3NjAzMzM1LDE0KSxpPWgoaSxyLG8sbix0WzhdLDExNjM1MzE1MDEsMjApLG49aChuLGkscixvLHRbMTNdLDI4NTAyODU4MjksNSksbz1oKG8sbixpLHIsdFsyXSw0MjQzNTYzNTEyLDkpLHI9aChyLG8sbixpLHRbN10sMTczNTMyODQ3MywxNCksbj1sKG4saT1oKGkscixvLG4sdFsxMl0sMjM2ODM1OTU2MiwyMCkscixvLHRbNV0sNDI5NDU4ODczOCw0KSxvPWwobyxuLGkscix0WzhdLDIyNzIzOTI4MzMsMTEpLHI9bChyLG8sbixpLHRbMTFdLDE4MzkwMzA1NjIsMTYpLGk9bChpLHIsbyxuLHRbMTRdLDQyNTk2NTc3NDAsMjMpLG49bChuLGkscixvLHRbMV0sMjc2Mzk3NTIzNiw0KSxvPWwobyxuLGkscix0WzRdLDEyNzI4OTMzNTMsMTEpLHI9bChyLG8sbixpLHRbN10sNDEzOTQ2OTY2NCwxNiksaT1sKGkscixvLG4sdFsxMF0sMzIwMDIzNjY1NiwyMyksbj1sKG4saSxyLG8sdFsxM10sNjgxMjc5MTc0LDQpLG89bChvLG4saSxyLHRbMF0sMzkzNjQzMDA3NCwxMSkscj1sKHIsbyxuLGksdFszXSwzNTcyNDQ1MzE3LDE2KSxpPWwoaSxyLG8sbix0WzZdLDc2MDI5MTg5LDIzKSxuPWwobixpLHIsbyx0WzldLDM2NTQ2MDI4MDksNCksbz1sKG8sbixpLHIsdFsxMl0sMzg3MzE1MTQ2MSwxMSkscj1sKHIsbyxuLGksdFsxNV0sNTMwNzQyNTIwLDE2KSxuPWQobixpPWwoaSxyLG8sbix0WzJdLDMyOTk2Mjg2NDUsMjMpLHIsbyx0WzBdLDQwOTYzMzY0NTIsNiksbz1kKG8sbixpLHIsdFs3XSwxMTI2ODkxNDE1LDEwKSxyPWQocixvLG4saSx0WzE0XSwyODc4NjEyMzkxLDE1KSxpPWQoaSxyLG8sbix0WzVdLDQyMzc1MzMyNDEsMjEpLG49ZChuLGkscixvLHRbMTJdLDE3MDA0ODU1NzEsNiksbz1kKG8sbixpLHIsdFszXSwyMzk5OTgwNjkwLDEwKSxyPWQocixvLG4saSx0WzEwXSw0MjkzOTE1NzczLDE1KSxpPWQoaSxyLG8sbix0WzFdLDIyNDAwNDQ0OTcsMjEpLG49ZChuLGkscixvLHRbOF0sMTg3MzMxMzM1OSw2KSxvPWQobyxuLGkscix0WzE1XSw0MjY0MzU1NTUyLDEwKSxyPWQocixvLG4saSx0WzZdLDI3MzQ3Njg5MTYsMTUpLGk9ZChpLHIsbyxuLHRbMTNdLDEzMDkxNTE2NDksMjEpLG49ZChuLGkscixvLHRbNF0sNDE0OTQ0NDIyNiw2KSxvPWQobyxuLGkscix0WzExXSwzMTc0NzU2OTE3LDEwKSxyPWQocixvLG4saSx0WzJdLDcxODc4NzI1OSwxNSksaT1kKGkscixvLG4sdFs5XSwzOTUxNDgxNzQ1LDIxKSx0aGlzLl9hPXRoaXMuX2ErbnwwLHRoaXMuX2I9dGhpcy5fYitpfDAsdGhpcy5fYz10aGlzLl9jK3J8MCx0aGlzLl9kPXRoaXMuX2Qrb3wwfSxhLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKCl7dGhpcy5fYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK109MTI4LHRoaXMuX2Jsb2NrT2Zmc2V0PjU2JiYodGhpcy5fYmxvY2suZmlsbCgwLHRoaXMuX2Jsb2NrT2Zmc2V0LDY0KSx0aGlzLl91cGRhdGUoKSx0aGlzLl9ibG9ja09mZnNldD0wKSx0aGlzLl9ibG9jay5maWxsKDAsdGhpcy5fYmxvY2tPZmZzZXQsNTYpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyTEUodGhpcy5fbGVuZ3RoWzBdLDU2KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFsxXSw2MCksdGhpcy5fdXBkYXRlKCk7dmFyIHQ9by5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIHQud3JpdGVJbnQzMkxFKHRoaXMuX2EsMCksdC53cml0ZUludDMyTEUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJMRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkxFKHRoaXMuX2QsMTIpLHR9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPXI7dmFyIGk9big2MCkuRXZlbnRFbWl0dGVyO2Z1bmN0aW9uIHIoKXtpLmNhbGwodGhpcyl9bigwKShyLGkpLHIuUmVhZGFibGU9big2MSksci5Xcml0YWJsZT1uKDE1Myksci5EdXBsZXg9bigxNTQpLHIuVHJhbnNmb3JtPW4oMTU1KSxyLlBhc3NUaHJvdWdoPW4oMTU2KSxyLlN0cmVhbT1yLHIucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLHIpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxlJiYhMT09PWUuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGModCl7aWYoaCgpLDA9PT1pLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGgoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixyKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixjKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGgpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixoKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsaCl9cmV0dXJuIG4ub24oImVycm9yIixjKSx0Lm9uKCJlcnJvciIsYyksbi5vbigiZW5kIixoKSxuLm9uKCJjbG9zZSIsaCksdC5vbigiY2xvc2UiLGgpLHQuZW1pdCgicGlwZSIsbiksdH19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHIodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBvKHQpe3JldHVybiB2b2lkIDA9PT10fXQuZXhwb3J0cz1uLG4uRXZlbnRFbWl0dGVyPW4sbi5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsbi5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsbi5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLG4ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgVHlwZUVycm9yKCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sbi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxuLHMsYSx1LGM7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSwiZXJyb3IiPT09dCYmKCF0aGlzLl9ldmVudHMuZXJyb3J8fHIodGhpcy5fZXZlbnRzLmVycm9yKSYmIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKXtpZigoZT1hcmd1bWVudHNbMV0paW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBoPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBoLmNvbnRleHQ9ZSxofWlmKG8obj10aGlzLl9ldmVudHNbdF0pKXJldHVybiExO2lmKGkobikpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbi5hcHBseSh0aGlzLGEpfWVsc2UgaWYocihuKSlmb3IoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkscz0oYz1uLnNsaWNlKCkpLmxlbmd0aCx1PTA7dTxzO3UrKyljW3VdLmFwcGx5KHRoaXMsYSk7cmV0dXJuITB9LG4ucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHM7aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gdGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSx0aGlzLl9ldmVudHMubmV3TGlzdGVuZXImJnRoaXMuZW1pdCgibmV3TGlzdGVuZXIiLHQsaShlLmxpc3RlbmVyKT9lLmxpc3RlbmVyOmUpLHRoaXMuX2V2ZW50c1t0XT9yKHRoaXMuX2V2ZW50c1t0XSk/dGhpcy5fZXZlbnRzW3RdLnB1c2goZSk6dGhpcy5fZXZlbnRzW3RdPVt0aGlzLl9ldmVudHNbdF0sZV06dGhpcy5fZXZlbnRzW3RdPWUscih0aGlzLl9ldmVudHNbdF0pJiYhdGhpcy5fZXZlbnRzW3RdLndhcm5lZCYmKHM9byh0aGlzLl9tYXhMaXN0ZW5lcnMpP24uZGVmYXVsdE1heExpc3RlbmVyczp0aGlzLl9tYXhMaXN0ZW5lcnMpJiZzPjAmJnRoaXMuX2V2ZW50c1t0XS5sZW5ndGg+cyYmKHRoaXMuX2V2ZW50c1t0XS53YXJuZWQ9ITAsY29uc29sZS5lcnJvcigiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4iLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGgpLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpLHRoaXN9LG4ucHJvdG90eXBlLm9uPW4ucHJvdG90eXBlLmFkZExpc3RlbmVyLG4ucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBuPSExO2Z1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUxpc3RlbmVyKHQsciksbnx8KG49ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiByLmxpc3RlbmVyPWUsdGhpcy5vbih0LHIpLHRoaXN9LG4ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxzLGE7aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW3RdKXJldHVybiB0aGlzO2lmKHM9KG49dGhpcy5fZXZlbnRzW3RdKS5sZW5ndGgsbz0tMSxuPT09ZXx8aShuLmxpc3RlbmVyKSYmbi5saXN0ZW5lcj09PWUpZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsZSk7ZWxzZSBpZihyKG4pKXtmb3IoYT1zO2EtLSA+MDspaWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXImJm5bYV0ubGlzdGVuZXI9PT1lKXtvPWE7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzOzE9PT1uLmxlbmd0aD8obi5sZW5ndGg9MCxkZWxldGUgdGhpcy5fZXZlbnRzW3RdKTpuLnNwbGljZShvLDEpLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxlKX1yZXR1cm4gdGhpc30sbi5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLG47aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW3RdJiZkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihlIGluIHRoaXMuX2V2ZW50cykicmVtb3ZlTGlzdGVuZXIiIT09ZSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz17fSx0aGlzfWlmKGkobj10aGlzLl9ldmVudHNbdF0pKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxuKTtlbHNlIGlmKG4pZm9yKDtuLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcih0LG5bbi5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXN9LG4ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbdF0/aSh0aGlzLl9ldmVudHNbdF0pP1t0aGlzLl9ldmVudHNbdF1dOnRoaXMuX2V2ZW50c1t0XS5zbGljZSgpOltdfSxuLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2V2ZW50cyl7dmFyIGU9dGhpcy5fZXZlbnRzW3RdO2lmKGkoZSkpcmV0dXJuIDE7aWYoZSlyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9LG4ubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiB0Lmxpc3RlbmVyQ291bnQoZSl9fSxmdW5jdGlvbih0LGUsbil7KGU9dC5leHBvcnRzPW4oODUpKS5TdHJlYW09ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1uKDYyKSxlLkR1cGxleD1uKDI0KSxlLlRyYW5zZm9ybT1uKDg4KSxlLlBhc3NUaHJvdWdoPW4oMTUyKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxpLHIpe3ZhciBvPW4oNDMpO2Z1bmN0aW9uIHModCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZW50cnk7dC5lbnRyeT1udWxsO2Zvcig7aTspe3ZhciByPWkuY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxyKG4pLGk9aS5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlP2UuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9dDplLmNvcmtlZFJlcXVlc3RzRnJlZT10fShlLHQpfX10LmV4cG9ydHM9Yjt2YXIgYSx1PSFlLmJyb3dzZXImJlsidjAuMTAiLCJ2MC45LiJdLmluZGV4T2YoZS52ZXJzaW9uLnNsaWNlKDAsNSkpPi0xP2k6by5uZXh0VGljaztiLldyaXRhYmxlU3RhdGU9djt2YXIgYz1uKDMyKTtjLmluaGVyaXRzPW4oMCk7dmFyIGg9e2RlcHJlY2F0ZTpuKDE1MSl9LGw9big4NiksZD1uKDEpLkJ1ZmZlcixmPXIuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBwLG09big4Nyk7ZnVuY3Rpb24gZygpe31mdW5jdGlvbiB2KHQsZSl7YT1hfHxuKDI0KSx0PXR8fHt9O3ZhciBpPWUgaW5zdGFuY2VvZiBhO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLGM9dC53cml0YWJsZUhpZ2hXYXRlck1hcmssaD10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6aSYmKGN8fDA9PT1jKT9jOmgsdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbD0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWwsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciBuPXQuX3dyaXRhYmxlU3RhdGUsaT1uLnN5bmMscj1uLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0obiksZSkhZnVuY3Rpb24odCxlLG4saSxyKXstLWUucGVuZGluZ2NiLG4/KG8ubmV4dFRpY2socixpKSxvLm5leHRUaWNrKFMsdCxlKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixpKSk6KHIoaSksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsaSksUyh0LGUpKX0odCxuLGksZSxyKTtlbHNle3ZhciBzPXgobik7c3x8bi5jb3JrZWR8fG4uYnVmZmVyUHJvY2Vzc2luZ3x8IW4uYnVmZmVyZWRSZXF1ZXN0fHx3KHQsbiksaT91KF8sdCxuLHMscik6Xyh0LG4scyxyKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHModGhpcyl9ZnVuY3Rpb24gYih0KXtpZihhPWF8fG4oMjQpLCEocC5jYWxsKGIsdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBhKSlyZXR1cm4gbmV3IGIodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgdih0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZpbmFsJiYodGhpcy5fZmluYWw9dC5maW5hbCkpLGwuY2FsbCh0aGlzKX1mdW5jdGlvbiB5KHQsZSxuLGkscixvLHMpe2Uud3JpdGVsZW49aSxlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLG4/dC5fd3JpdGV2KHIsZS5vbndyaXRlKTp0Ll93cml0ZShyLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gXyh0LGUsbixpKXtufHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0saSgpLFModCxlKX1mdW5jdGlvbiB3KHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmbiYmbi5uZXh0KXt2YXIgaT1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LHI9bmV3IEFycmF5KGkpLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1uO2Zvcih2YXIgYT0wLHU9ITA7bjspclthXT1uLG4uaXNCdWZ8fCh1PSExKSxuPW4ubmV4dCxhKz0xO3IuYWxsQnVmZmVycz11LHkodCxlLCEwLGUubGVuZ3RoLHIsIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBzKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7bjspe3ZhciBjPW4uY2h1bmssaD1uLmVuY29kaW5nLGw9bi5jYWxsYmFjaztpZih5KHQsZSwhMSxlLm9iamVjdE1vZGU/MTpjLmxlbmd0aCxjLGgsbCksbj1uLm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha31udWxsPT09biYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD1uLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiB4KHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIE0odCxlKXt0Ll9maW5hbChmdW5jdGlvbihuKXtlLnBlbmRpbmdjYi0tLG4mJnQuZW1pdCgiZXJyb3IiLG4pLGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSxTKHQsZSl9KX1mdW5jdGlvbiBTKHQsZSl7dmFyIG49eChlKTtyZXR1cm4gbiYmKCFmdW5jdGlvbih0LGUpe2UucHJlZmluaXNoZWR8fGUuZmluYWxDYWxsZWR8fCgiZnVuY3Rpb24iPT10eXBlb2YgdC5fZmluYWw/KGUucGVuZGluZ2NiKyssZS5maW5hbENhbGxlZD0hMCxvLm5leHRUaWNrKE0sdCxlKSk6KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSkpfSh0LGUpLDA9PT1lLnBlbmRpbmdjYiYmKGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSkpLG59Yy5pbmhlcml0cyhiLGwpLHYucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6aC5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0sIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIiwiREVQMDAwMyIpfSl9Y2F0Y2godCl7fX0oKSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaGFzSW5zdGFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT8ocD1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYixTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEhcC5jYWxsKHRoaXMsdCl8fHRoaXM9PT1iJiYodCYmdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIHYpfX0pKTpwPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpc30sYi5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0sYi5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9dGhpcy5fd3JpdGFibGVTdGF0ZSxzPSExLGE9IXIub2JqZWN0TW9kZSYmKGk9dCxkLmlzQnVmZmVyKGkpfHxpIGluc3RhbmNlb2YgZik7cmV0dXJuIGEmJiFkLmlzQnVmZmVyKHQpJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZC5mcm9tKHQpfSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT1udWxsKSxhP2U9ImJ1ZmZlciI6ZXx8KGU9ci5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1nKSxyLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIG49bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixuKSxvLm5leHRUaWNrKGUsbil9KHRoaXMsbik6KGF8fGZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPSEwLHM9ITE7cmV0dXJuIG51bGw9PT1uP3M9bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKToic3RyaW5nIj09dHlwZW9mIG58fHZvaWQgMD09PW58fGUub2JqZWN0TW9kZXx8KHM9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxzJiYodC5lbWl0KCJlcnJvciIscyksby5uZXh0VGljayhpLHMpLHI9ITEpLHJ9KHRoaXMscix0LG4pKSYmKHIucGVuZGluZ2NiKysscz1mdW5jdGlvbih0LGUsbixpLHIsbyl7aWYoIW4pe3ZhciBzPWZ1bmN0aW9uKHQsZSxuKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPWQuZnJvbShlLG4pKTtyZXR1cm4gZX0oZSxpLHIpO2khPT1zJiYobj0hMCxyPSJidWZmZXIiLGk9cyl9dmFyIGE9ZS5vYmplY3RNb2RlPzE6aS5sZW5ndGg7ZS5sZW5ndGgrPWE7dmFyIHU9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3V8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGM9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bms6aSxlbmNvZGluZzpyLGlzQnVmOm4sY2FsbGJhY2s6byxuZXh0Om51bGx9LGM/Yy5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIHkodCxlLCExLGEsaSxyLG8pO3JldHVybiB1fSh0aGlzLHIsYSx0LGUsbikpLHN9LGIucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxiLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8dyh0aGlzLHQpKX0sYi5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxiLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLG4pe24obmV3IEVycm9yKCJfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LGIucHJvdG90eXBlLl93cml0ZXY9bnVsbCxiLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KG49dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxpLmNvcmtlZCYmKGkuY29ya2VkPTEsdGhpcy51bmNvcmsoKSksaS5lbmRpbmd8fGkuZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxuKXtlLmVuZGluZz0hMCxTKHQsZSksbiYmKGUuZmluaXNoZWQ/by5uZXh0VGljayhuKTp0Lm9uY2UoImZpbmlzaCIsbikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxpLG4pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxiLnByb3RvdHlwZS5kZXN0cm95PW0uZGVzdHJveSxiLnByb3RvdHlwZS5fdW5kZXN0cm95PW0udW5kZXN0cm95LGIucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmQoKSxlKHQpfX0pLmNhbGwodGhpcyxuKDIwKSxuKDQ0KS5zZXRJbW1lZGlhdGUsbigxMykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMSkuQnVmZmVyLHI9aS5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2goKHQ9IiIrdCkmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBvKHQpe3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiJ1dGY4Ijtmb3IodmFyIGU7Oylzd2l0Y2godCl7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4idXRmOCI7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiJ1dGYxNmxlIjtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiJsYXRpbjEiO2Nhc2UiYmFzZTY0IjpjYXNlImFzY2lpIjpjYXNlImhleCI6cmV0dXJuIHQ7ZGVmYXVsdDppZihlKXJldHVybjt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLGU9ITB9fSh0KTtpZigic3RyaW5nIiE9dHlwZW9mIGUmJihpLmlzRW5jb2Rpbmc9PT1yfHwhcih0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiBlfHx0fSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjE2bGUiOnRoaXMudGV4dD11LHRoaXMuZW5kPWMsZT00O2JyZWFrO2Nhc2UidXRmOCI6dGhpcy5maWxsTGFzdD1hLGU9NDticmVhaztjYXNlImJhc2U2NCI6dGhpcy50ZXh0PWgsdGhpcy5lbmQ9bCxlPTM7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy53cml0ZT1kLHZvaWQodGhpcy5lbmQ9Zil9dGhpcy5sYXN0TmVlZD0wLHRoaXMubGFzdFRvdGFsPTAsdGhpcy5sYXN0Q2hhcj1pLmFsbG9jVW5zYWZlKGUpfWZ1bmN0aW9uIHModCl7cmV0dXJuIHQ8PTEyNz8wOnQ+PjU9PTY/Mjp0Pj40PT0xND8zOnQ+PjM9PTMwPzQ6dD4+Nj09Mj8tMTotMn1mdW5jdGlvbiBhKHQpe3ZhciBlPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsbj1mdW5jdGlvbih0LGUsbil7aWYoMTI4IT0oMTkyJmVbMF0pKXJldHVybiB0Lmxhc3ROZWVkPTAsIu+/vSI7aWYodC5sYXN0TmVlZD4xJiZlLmxlbmd0aD4xKXtpZigxMjghPSgxOTImZVsxXSkpcmV0dXJuIHQubGFzdE5lZWQ9MSwi77+9IjtpZih0Lmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJjEyOCE9KDE5MiZlWzJdKSlyZXR1cm4gdC5sYXN0TmVlZD0yLCLvv70ifX0odGhpcyx0KTtyZXR1cm4gdm9pZCAwIT09bj9uOnRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoPyh0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpKToodC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHQubGVuZ3RoKSx2b2lkKHRoaXMubGFzdE5lZWQtPXQubGVuZ3RoKSl9ZnVuY3Rpb24gdSh0LGUpe2lmKCh0Lmxlbmd0aC1lKSUyPT0wKXt2YXIgbj10LnRvU3RyaW5nKCJ1dGYxNmxlIixlKTtpZihuKXt2YXIgaT1uLmNoYXJDb2RlQXQobi5sZW5ndGgtMSk7aWYoaT49NTUyOTYmJmk8PTU2MzE5KXJldHVybiB0aGlzLmxhc3ROZWVkPTIsdGhpcy5sYXN0VG90YWw9NCx0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT10W3QubGVuZ3RoLTFdLG4uc2xpY2UoMCwtMSl9cmV0dXJuIG59cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXSx0LnRvU3RyaW5nKCJ1dGYxNmxlIixlLHQubGVuZ3RoLTEpfWZ1bmN0aW9uIGModCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtpZih0aGlzLmxhc3ROZWVkKXt2YXIgbj10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkO3JldHVybiBlK3RoaXMubGFzdENoYXIudG9TdHJpbmcoInV0ZjE2bGUiLDAsbil9cmV0dXJuIGV9ZnVuY3Rpb24gaCh0LGUpe3ZhciBuPSh0Lmxlbmd0aC1lKSUzO3JldHVybiAwPT09bj90LnRvU3RyaW5nKCJiYXNlNjQiLGUpOih0aGlzLmxhc3ROZWVkPTMtbix0aGlzLmxhc3RUb3RhbD0zLDE9PT1uP3RoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSksdC50b1N0cmluZygiYmFzZTY0IixlLHQubGVuZ3RoLW4pKX1mdW5jdGlvbiBsKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJiYXNlNjQiLDAsMy10aGlzLmxhc3ROZWVkKTplfWZ1bmN0aW9uIGQodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIn1lLlN0cmluZ0RlY29kZXI9byxvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIiI7dmFyIGUsbjtpZih0aGlzLmxhc3ROZWVkKXtpZih2b2lkIDA9PT0oZT10aGlzLmZpbGxMYXN0KHQpKSlyZXR1cm4iIjtuPXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2Ugbj0wO3JldHVybiBuPHQubGVuZ3RoP2U/ZSt0aGlzLnRleHQodCxuKTp0aGlzLnRleHQodCxuKTplfHwiIn0sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSsi77+9IjplfSxvLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUubGVuZ3RoLTE7aWYoaTxuKXJldHVybiAwO3ZhciByPXMoZVtpXSk7aWYocj49MClyZXR1cm4gcj4wJiYodC5sYXN0TmVlZD1yLTEpLHI7aWYoLS1pPG58fC0yPT09cilyZXR1cm4gMDtpZigocj1zKGVbaV0pKT49MClyZXR1cm4gcj4wJiYodC5sYXN0TmVlZD1yLTIpLHI7aWYoLS1pPG58fC0yPT09cilyZXR1cm4gMDtpZigocj1zKGVbaV0pKT49MClyZXR1cm4gcj4wJiYoMj09PXI/cj0wOnQubGFzdE5lZWQ9ci0zKSxyO3JldHVybiAwfSh0aGlzLHQsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHQudG9TdHJpbmcoInV0ZjgiLGUpO3RoaXMubGFzdFRvdGFsPW47dmFyIGk9dC5sZW5ndGgtKG4tdGhpcy5sYXN0TmVlZCk7cmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLDAsaSksdC50b1N0cmluZygidXRmOCIsZSxpKX0sby5wcm90b3R5cGUuZmlsbExhc3Q9ZnVuY3Rpb24odCl7aWYodGhpcy5sYXN0TmVlZDw9dC5sZW5ndGgpcmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7dC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHQubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT10Lmxlbmd0aH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0KS5CdWZmZXIscj1uKDApLG89big4NCkscz1uZXcgQXJyYXkoMTYpLGE9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10sdT1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxjPVsxMSwxNCwxNSwxMiw1LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSxoPVs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXSxsPVswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdLGQ9WzEzNTI4Mjk5MjYsMTU0ODYwMzY4NCwxODM2MDcyNjkxLDIwNTM5OTQyMTcsMF07ZnVuY3Rpb24gZigpe28uY2FsbCh0aGlzLDY0KSx0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjB9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfWZ1bmN0aW9uIG0odCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlXm5eaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIGcodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlJm58fmUmaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIHYodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KygoZXx+bileaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIGIodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlJml8biZ+aSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIHkodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlXihufH5pKSkrbytzfDAsYSkrcnwwfXIoZixvKSxmLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXMsZT0wO2U8MTY7KytlKXRbZV09dGhpcy5fYmxvY2sucmVhZEludDMyTEUoNCplKTtmb3IodmFyIG49MHx0aGlzLl9hLGk9MHx0aGlzLl9iLHI9MHx0aGlzLl9jLG89MHx0aGlzLl9kLGY9MHx0aGlzLl9lLF89MHx0aGlzLl9hLHc9MHx0aGlzLl9iLHg9MHx0aGlzLl9jLE09MHx0aGlzLl9kLFM9MHx0aGlzLl9lLEU9MDtFPDgwO0UrPTEpe3ZhciBBLEM7RTwxNj8oQT1tKG4saSxyLG8sZix0W2FbRV1dLGxbMF0sY1tFXSksQz15KF8sdyx4LE0sUyx0W3VbRV1dLGRbMF0saFtFXSkpOkU8MzI/KEE9ZyhuLGkscixvLGYsdFthW0VdXSxsWzFdLGNbRV0pLEM9YihfLHcseCxNLFMsdFt1W0VdXSxkWzFdLGhbRV0pKTpFPDQ4PyhBPXYobixpLHIsbyxmLHRbYVtFXV0sbFsyXSxjW0VdKSxDPXYoXyx3LHgsTSxTLHRbdVtFXV0sZFsyXSxoW0VdKSk6RTw2ND8oQT1iKG4saSxyLG8sZix0W2FbRV1dLGxbM10sY1tFXSksQz1nKF8sdyx4LE0sUyx0W3VbRV1dLGRbM10saFtFXSkpOihBPXkobixpLHIsbyxmLHRbYVtFXV0sbFs0XSxjW0VdKSxDPW0oXyx3LHgsTSxTLHRbdVtFXV0sZFs0XSxoW0VdKSksbj1mLGY9byxvPXAociwxMCkscj1pLGk9QSxfPVMsUz1NLE09cCh4LDEwKSx4PXcsdz1DfXZhciBrPXRoaXMuX2IrcitNfDA7dGhpcy5fYj10aGlzLl9jK28rU3wwLHRoaXMuX2M9dGhpcy5fZCtmK198MCx0aGlzLl9kPXRoaXMuX2Urbit3fDAsdGhpcy5fZT10aGlzLl9hK2kreHwwLHRoaXMuX2E9a30sZi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3RoaXMuX2Jsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0KytdPTEyOCx0aGlzLl9ibG9ja09mZnNldD41NiYmKHRoaXMuX2Jsb2NrLmZpbGwoMCx0aGlzLl9ibG9ja09mZnNldCw2NCksdGhpcy5fdXBkYXRlKCksdGhpcy5fYmxvY2tPZmZzZXQ9MCksdGhpcy5fYmxvY2suZmlsbCgwLHRoaXMuX2Jsb2NrT2Zmc2V0LDU2KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFswXSw1NiksdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMV0sNjApLHRoaXMuX3VwZGF0ZSgpO3ZhciB0PWkuYWxsb2M/aS5hbGxvYygyMCk6bmV3IGkoMjApO3JldHVybiB0LndyaXRlSW50MzJMRSh0aGlzLl9hLDApLHQud3JpdGVJbnQzMkxFKHRoaXMuX2IsNCksdC53cml0ZUludDMyTEUodGhpcy5fYyw4KSx0LndyaXRlSW50MzJMRSh0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJMRSh0aGlzLl9lLDE2KSx0fSx0LmV4cG9ydHM9Zn0sZnVuY3Rpb24odCxlLG4peyhlPXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKTt2YXIgbj1lW3RdO2lmKCFuKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IHN1cHBvcnRlZCAod2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMpIik7cmV0dXJuIG5ldyBufSkuc2hhPW4oMTU3KSxlLnNoYTE9bigxNTgpLGUuc2hhMjI0PW4oMTU5KSxlLnNoYTI1Nj1uKDg5KSxlLnNoYTM4ND1uKDE2MCksZS5zaGE1MTI9big5MCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS51dGlscz1uKDE2NiksZS5DaXBoZXI9bigxNjcpLGUuREVTPW4oMTY4KSxlLkNCQz1uKDE2OSksZS5FREU9bigxNzApfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxNzEpLHI9bigxNzkpLG89bigxMDApO2UuY3JlYXRlQ2lwaGVyPWUuQ2lwaGVyPWkuY3JlYXRlQ2lwaGVyLGUuY3JlYXRlQ2lwaGVyaXY9ZS5DaXBoZXJpdj1pLmNyZWF0ZUNpcGhlcml2LGUuY3JlYXRlRGVjaXBoZXI9ZS5EZWNpcGhlcj1yLmNyZWF0ZURlY2lwaGVyLGUuY3JlYXRlRGVjaXBoZXJpdj1lLkRlY2lwaGVyaXY9ci5jcmVhdGVEZWNpcGhlcml2LGUubGlzdENpcGhlcnM9ZS5nZXRDaXBoZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPXtFQ0I6bigxNzIpLENCQzpuKDE3MyksQ0ZCOm4oMTc0KSxDRkI4Om4oMTc1KSxDRkIxOm4oMTc2KSxPRkI6bigxNzcpLENUUjpuKDk4KSxHQ006big5OCl9LHI9bigxMDApO2Zvcih2YXIgbyBpbiByKXJbb10ubW9kdWxlPWlbcltvXS5tb2RlXTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDMpLHI9bigyNyk7ZnVuY3Rpb24gbyh0LG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXModCk7cmV0dXJue2JsaW5kZXI6ZS50b1JlZChpLm1vbnQodC5tb2R1bHVzKSkucmVkUG93KG5ldyBpKHQucHVibGljRXhwb25lbnQpKS5mcm9tUmVkKCksdW5ibGluZGVyOmUuaW52bSh0Lm1vZHVsdXMpfX0obiksbz1uLm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGE9KGkubW9udChuLm1vZHVsdXMpLG5ldyBpKHQpLm11bChyLmJsaW5kZXIpLnVtb2Qobi5tb2R1bHVzKSksdT1hLnRvUmVkKGkubW9udChuLnByaW1lMSkpLGM9YS50b1JlZChpLm1vbnQobi5wcmltZTIpKSxoPW4uY29lZmZpY2llbnQsbD1uLnByaW1lMSxkPW4ucHJpbWUyLGY9dS5yZWRQb3cobi5leHBvbmVudDEpLHA9Yy5yZWRQb3cobi5leHBvbmVudDIpO2Y9Zi5mcm9tUmVkKCkscD1wLmZyb21SZWQoKTt2YXIgbT1mLmlzdWIocCkuaW11bChoKS51bW9kKGwpO3JldHVybiBtLmltdWwoZCkscC5pYWRkKG0pLG5ldyBlKHAuaW11bChyLnVuYmxpbmRlcikudW1vZChuLm1vZHVsdXMpLnRvQXJyYXkoITEsbykpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCksbj1uZXcgaShyKGUpKTtuLmNtcCh0Lm1vZHVsdXMpPj0wfHwhbi51bW9kKHQucHJpbWUxKXx8IW4udW1vZCh0LnByaW1lMik7KW49bmV3IGkocihlKSk7cmV0dXJuIG59dC5leHBvcnRzPW8sby5nZXRyPXN9KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9ZTtpLnV0aWxzPW4oMTcpLGkuY29tbW9uPW4oMzQpLGkuc2hhPW4oMTk1KSxpLnJpcGVtZD1uKDE5OSksaS5obWFjPW4oMjAwKSxpLnNoYTE9aS5zaGEuc2hhMSxpLnNoYTI1Nj1pLnNoYS5zaGEyNTYsaS5zaGEyMjQ9aS5zaGEuc2hhMjI0LGkuc2hhMzg0PWkuc2hhLnNoYTM4NCxpLnNoYTUxMj1pLnNoYS5zaGE1MTIsaS5yaXBlbWQxNjA9aS5yaXBlbWQucmlwZW1kMTYwfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIk1hcCIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxOSkuU3ltYm9sO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe3ZhciBuPUFycmF5LmlzQXJyYXk7dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuSlVQWVRFUl9XSURHRVRTX1ZFUlNJT049IjEuMS4wIixlLlBST1RPQ09MX1ZFUlNJT049IjIuMC4wIn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMjUpLGE9bigzMDApLHU9bigxMjkpLGM9bigxNSksaD1uKDMwMSksbD1uKDM5KSxkPW4oNSksZj1uKDc0KTtmdW5jdGlvbiBwKHQsZSl7dmFyIG47cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/KG49W10sdC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7bi5wdXNoKHAodCxlKSl9KSxQcm9taXNlLmFsbChuKSk6dCBpbnN0YW5jZW9mIE9iamVjdD8obj17fSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe25baV09cCh0W2ldLGUpfSkscy5yZXNvbHZlUHJvbWlzZXNEaWN0KG4pKToic3RyaW5nIj09dHlwZW9mIHQmJiJJUFlfTU9ERUxfIj09PXQuc2xpY2UoMCwxMCk/ZS5nZXRfbW9kZWwodC5zbGljZSgxMCx0Lmxlbmd0aCkpOlByb21pc2UucmVzb2x2ZSh0KX1lLnVucGFja19tb2RlbHM9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJue19tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvYmFzZSIsX21vZGVsX25hbWU6IldpZGdldE1vZGVsIixfbW9kZWxfbW9kdWxlX3ZlcnNpb246Zi5KVVBZVEVSX1dJREdFVFNfVkVSU0lPTixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvYmFzZSIsX3ZpZXdfbmFtZTpudWxsLF92aWV3X21vZHVsZV92ZXJzaW9uOmYuSlVQWVRFUl9XSURHRVRTX1ZFUlNJT04sX3ZpZXdfY291bnQ6bnVsbH19LGUucHJvdG90eXBlLmlzTmV3PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlLG4pLHRoaXMud2lkZ2V0X21hbmFnZXI9bi53aWRnZXRfbWFuYWdlcix0aGlzLm1vZGVsX2lkPW4ubW9kZWxfaWQ7dmFyIGk9bi5jb21tO3RoaXMudmlld3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnN0YXRlX2NoYW5nZT1Qcm9taXNlLnJlc29sdmUoKSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5fc3RhdGVfbG9jaz1udWxsLHRoaXMuX21zZ19idWZmZXI9bnVsbCx0aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdfbXNncz0wLHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmY9e30saT8odGhpcy5jb21tPWksaS5vbl9jbG9zZSh0aGlzLl9oYW5kbGVfY29tbV9jbG9zZWQuYmluZCh0aGlzKSksaS5vbl9tc2codGhpcy5faGFuZGxlX2NvbW1fbXNnLmJpbmQodGhpcykpLHRoaXMuY29tbV9saXZlPSEwKTp0aGlzLmNvbW1fbGl2ZT0hMX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb21tX2xpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbV9saXZlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY29tbV9saXZlPXQsdGhpcy50cmlnZ2VyKCJjb21tX2xpdmVfdXBkYXRlIil9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbih0LGUsbil7aWYodm9pZCAwIT09dGhpcy5jb21tKXt2YXIgaT17bWV0aG9kOiJjdXN0b20iLGNvbnRlbnQ6dH07dGhpcy5jb21tLnNlbmQoaSxlLHt9LG4pfX0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD0hMSksIXRoaXMuX2Nsb3NlZCl7dGhpcy5fY2xvc2VkPSEwLHRoaXMuY29tbSYmIXQmJnRoaXMuY29tbS5jbG9zZSgpLHRoaXMuc3RvcExpc3RlbmluZygpLHRoaXMudHJpZ2dlcigiZGVzdHJveSIsdGhpcyksdGhpcy5jb21tJiZkZWxldGUgdGhpcy5jb21tO3ZhciBuPU9iamVjdC5rZXlzKHRoaXMudmlld3MpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZS52aWV3c1t0XS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbW92ZSgpfSl9KTtyZXR1cm4gZGVsZXRlIHRoaXMudmlld3MsUHJvbWlzZS5hbGwobikudGhlbihmdW5jdGlvbigpe30pfX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jb21tX2Nsb3NlZD1mdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImNvbW06Y2xvc2UiKSx0aGlzLmNsb3NlKCEwKX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jb21tX21zZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3N3aXRjaCh0LmNvbnRlbnQuZGF0YS5tZXRob2Qpe2Nhc2UidXBkYXRlIjpyZXR1cm4gdGhpcy5zdGF0ZV9jaGFuZ2U9dGhpcy5zdGF0ZV9jaGFuZ2UudGhlbihmdW5jdGlvbigpe3ZhciBuPXQuY29udGVudC5kYXRhLnN0YXRlLGk9dC5jb250ZW50LmRhdGEuYnVmZmVyX3BhdGhzfHxbXSxyPSh0LmJ1ZmZlcnN8fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRhVmlldz90Om5ldyBEYXRhVmlldyh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/dDp0LmJ1ZmZlcil9KTtyZXR1cm4gcy5wdXRfYnVmZmVycyhuLGksciksZS5jb25zdHJ1Y3Rvci5fZGVzZXJpYWxpemVfc3RhdGUobixlLndpZGdldF9tYW5hZ2VyKX0pLnRoZW4oZnVuY3Rpb24odCl7ZS5zZXRfc3RhdGUodCl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IHByb2Nlc3MgdXBkYXRlIG1zZyBmb3IgbW9kZWwgaWQ6ICIrdGhpcy5tb2RlbF9pZCwhMCkpLHRoaXMuc3RhdGVfY2hhbmdlO2Nhc2UiY3VzdG9tIjpyZXR1cm4gdGhpcy50cmlnZ2VyKCJtc2c6Y3VzdG9tIix0LmNvbnRlbnQuZGF0YS5jb250ZW50LHQuYnVmZmVycyksUHJvbWlzZS5yZXNvbHZlKCl9fSxlLnByb3RvdHlwZS5zZXRfc3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5fc3RhdGVfbG9jaz10O3RyeXt0aGlzLnNldCh0KX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJFcnJvciBzZXR0aW5nIHN0YXRlOiAiK3QubWVzc2FnZSl9ZmluYWxseXt0aGlzLl9zdGF0ZV9sb2NrPW51bGx9fSxlLnByb3RvdHlwZS5nZXRfc3RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzO2lmKHQpe3ZhciBuPXRoaXMuZGVmYXVsdHMsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyk6bixyPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MuaXNFcXVhbChlW3RdLGlbdF0pfHwoclt0XT1lW3RdKX0pLHJ9cmV0dXJuIG8oe30sZSl9LGUucHJvdG90eXBlLl9oYW5kbGVfc3RhdHVzPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMuY29tbSYmImlkbGUiPT09dC5jb250ZW50LmV4ZWN1dGlvbl9zdGF0ZSYmKHRoaXMuX3BlbmRpbmdfbXNncy0tLG51bGwhPT10aGlzLl9tc2dfYnVmZmVyJiZ0aGlzLl9wZW5kaW5nX21zZ3M8MSYmKHRoaXMuc2VuZF9zeW5jX21lc3NhZ2UodGhpcy5fbXNnX2J1ZmZlcix0aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcyksdGhpcy5fbXNnX2J1ZmZlcj1udWxsLHRoaXMuX21zZ19idWZmZXJfY2FsbGJhY2tzPW51bGwpKX0sZS5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndpZGdldF9tYW5hZ2VyLmNhbGxiYWNrcyh0KX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1hLnNldC5jYWxsKHRoaXMsdCxlLG4pO2lmKHZvaWQgMCE9PXRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYpe3ZhciByPXRoaXMuY2hhbmdlZEF0dHJpYnV0ZXMoKXx8e307aWYodGhpcy5fc3RhdGVfbG9jaylmb3IodmFyIG89MCx1PU9iamVjdC5rZXlzKHRoaXMuX3N0YXRlX2xvY2spO288dS5sZW5ndGg7bysrKXt2YXIgYz11W29dO3JbY109PT10aGlzLl9zdGF0ZV9sb2NrW2NdJiZkZWxldGUgcltjXX10aGlzLl9idWZmZXJlZF9zdGF0ZV9kaWZmPXMuYXNzaWduKHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYscil9cmV0dXJuIGl9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSx2b2lkIDA9PT10aGlzLmNvbW0pdGhyb3ciU3luY2luZyBlcnJvcjogbm8gY29tbSBjaGFubmVsIGRlZmluZWQiO3ZhciBpPSJwYXRjaCI9PT10P24uYXR0cnM6ZS5nZXRfc3RhdGUobi5kcm9wX2RlZmF1bHRzKTtpZih0aGlzLl9zdGF0ZV9sb2NrKWZvcih2YXIgcj0wLG89T2JqZWN0LmtleXModGhpcy5fc3RhdGVfbG9jayk7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07aVthXT09PXRoaXMuX3N0YXRlX2xvY2tbYV0mJmRlbGV0ZSBpW2FdfXZhciB1PXRoaXMuc2VyaWFsaXplKGkpO2lmKE9iamVjdC5rZXlzKHUpLmxlbmd0aD4wKXt2YXIgYz1uLmNhbGxiYWNrc3x8dGhpcy5jYWxsYmFja3MoKTtpZih0aGlzLl9wZW5kaW5nX21zZ3M+PTEpe3N3aXRjaCh0KXtjYXNlInBhdGNoIjp0aGlzLl9tc2dfYnVmZmVyPXMuYXNzaWduKHRoaXMuX21zZ19idWZmZXJ8fHt9LHUpO2JyZWFrO2Nhc2UidXBkYXRlIjpjYXNlImNyZWF0ZSI6dGhpcy5fbXNnX2J1ZmZlcj11O2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWNvZ25pemVkIHN5bmNpbmcgbWV0aG9kIn10aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcz1jfWVsc2UgdGhpcy5zZW5kX3N5bmNfbWVzc2FnZShpLGMpfX0sZS5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNvbnN0cnVjdG9yLnNlcmlhbGl6ZXJzfHx7fSxuPTAsaT1PYmplY3Qua2V5cyh0KTtuPGkubGVuZ3RoO24rKyl7dmFyIHI9aVtuXTt0cnl7ZVtyXSYmZVtyXS5zZXJpYWxpemU/dFtyXT1lW3JdLnNlcmlhbGl6ZSh0W3JdLHRoaXMpOnRbcl09SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0W3JdKSksdFtyXSYmdFtyXS50b0pTT04mJih0W3JdPXRbcl0udG9KU09OKCkpfWNhdGNoKHQpe3Rocm93IGNvbnNvbGUuZXJyb3IoIkVycm9yIHNlcmlhbGl6aW5nIHdpZGdldCBzdGF0ZSBhdHRyaWJ1dGU6ICIsciksdH19cmV0dXJuIHR9LGUucHJvdG90eXBlLnNlbmRfc3luY19tZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dHJ5e2UuaW9wdWI9ZS5pb3B1Ynx8e307dmFyIGk9ZS5pb3B1Yi5zdGF0dXM7ZS5pb3B1Yi5zdGF0dXM9ZnVuY3Rpb24odCl7bi5faGFuZGxlX3N0YXR1cyh0KSxpJiZpKHQpfTt2YXIgcj1zLnJlbW92ZV9idWZmZXJzKHQpO3RoaXMuY29tbS5zZW5kKHttZXRob2Q6InVwZGF0ZSIsc3RhdGU6ci5zdGF0ZSxidWZmZXJfcGF0aHM6ci5idWZmZXJfcGF0aHN9LGUse30sci5idWZmZXJzKSx0aGlzLl9wZW5kaW5nX21zZ3MrK31jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3Qgc2VuZCB3aWRnZXQgc3luYyBtZXNzYWdlIix0KX19LGUucHJvdG90eXBlLnNhdmVfY2hhbmdlcz1mdW5jdGlvbih0KXtpZih0aGlzLmNvbW1fbGl2ZSl7dmFyIGU9e3BhdGNoOiEwfTt0JiYoZS5jYWxsYmFja3M9dCksdGhpcy5zYXZlKHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYsZSksdGhpcy5fYnVmZmVyZWRfc3RhdGVfZGlmZj17fX19LGUucHJvdG90eXBlLm9uX3NvbWVfY2hhbmdlPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dC5zb21lKHRoaXMuaGFzQ2hhbmdlZCx0aGlzKSYmZS5hcHBseShuLGFyZ3VtZW50cyl9LHRoaXMpfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24odCl7cmV0dXJuIklQWV9NT0RFTF8iK3RoaXMubW9kZWxfaWR9LGUuX2Rlc2VyaWFsaXplX3N0YXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLnNlcmlhbGl6ZXJzO2lmKGkpZm9yKHZhciByIGluIG49e30sdClpW3JdJiZpW3JdLmRlc2VyaWFsaXplP25bcl09aVtyXS5kZXNlcmlhbGl6ZSh0W3JdLGUpOm5bcl09dFtyXTtlbHNlIG49dDtyZXR1cm4gcy5yZXNvbHZlUHJvbWlzZXNEaWN0KG4pfSxlfSh1Lk1vZGVsKTtlLldpZGdldE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmFzc2lnbih0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfZG9tX2NsYXNzZXM6W119KX0sZS5zZXJpYWxpemVycz1vKHt9LG0uc2VyaWFsaXplcnMse2xheW91dDp7ZGVzZXJpYWxpemU6cH0sc3R5bGU6e2Rlc2VyaWFsaXplOnB9fSksZX0obSk7ZS5ET01XaWRnZXRNb2RlbD1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlIixmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5rZXlzKGUubW9kZWwuY2hhbmdlZEF0dHJpYnV0ZXMoKXx8e30pOyJfdmlld19jb3VudCI9PT10WzBdJiYxPT09dC5sZW5ndGh8fGUudXBkYXRlKCl9KSx0aGlzLm9wdGlvbnM9dC5vcHRpb25zLHRoaXMub25jZSgicmVtb3ZlIixmdW5jdGlvbigpeyJudW1iZXIiPT10eXBlb2YgZS5tb2RlbC5nZXQoIl92aWV3X2NvdW50IikmJihlLm1vZGVsLnNldCgiX3ZpZXdfY291bnQiLGUubW9kZWwuZ2V0KCJfdmlld19jb3VudCIpLTEpLGUubW9kZWwuc2F2ZV9jaGFuZ2VzKCkpfSksdGhpcy5vbmNlKCJkaXNwbGF5ZWQiLGZ1bmN0aW9uKCl7Im51bWJlciI9PXR5cGVvZiBlLm1vZGVsLmdldCgiX3ZpZXdfY291bnQiKSYmKGUubW9kZWwuc2V0KCJfdmlld19jb3VudCIsZS5tb2RlbC5nZXQoIl92aWV3X2NvdW50IikrMSksZS5tb2RlbC5zYXZlX2NoYW5nZXMoKSl9KSx0aGlzLmRpc3BsYXllZD1uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Uub25jZSgiZGlzcGxheWVkIix0KX0pfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmNyZWF0ZV9jaGlsZF92aWV3PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3JldHVybiBlPW8oe3BhcmVudDp0aGlzfSxlKSx0aGlzLm1vZGVsLndpZGdldF9tYW5hZ2VyLmNyZWF0ZV92aWV3KHQsZSkuY2F0Y2gocy5yZWplY3QoIkNvdWxkIG5vdCBjcmVhdGUgY2hpbGQgdmlldyIsITApKX0sZS5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kZWwuY2FsbGJhY2tzKHRoaXMpfSxlLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZW5kKHQsdGhpcy5jYWxsYmFja3MoKSxlKX0sZS5wcm90b3R5cGUudG91Y2g9ZnVuY3Rpb24oKXt0aGlzLm1vZGVsLnNhdmVfY2hhbmdlcyh0aGlzLmNhbGxiYWNrcygpKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpLHRoaXMudHJpZ2dlcigicmVtb3ZlIiksdGhpc30sZX0oaC5OYXRpdmVWaWV3KTtlLldpZGdldFZpZXc9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXRoaXMsaT1lLnZpZXc7cmV0dXJuIGRlbGV0ZSBlLnZpZXcsKG49dC5jYWxsKHRoaXMsZSl8fHRoaXMpLl92aWV3PWksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlLnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSksdGhpcy5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpfSxlfShsLldpZGdldCk7ZS5KdXB5dGVyUGhvc3Bob3JXaWRnZXQ9Yjt2YXIgeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfZG9tX2NsYXNzZXMiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5wcmV2aW91cygiX2RvbV9jbGFzc2VzIik7bi51cGRhdGVfY2xhc3NlcyhpLGUpfSksdGhpcy5sYXlvdXRQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmxheW91dCIsZnVuY3Rpb24odCxlKXtuLnNldExheW91dChlLHQucHJldmlvdXMoImxheW91dCIpKX0pLHRoaXMuc3R5bGVQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOnN0eWxlIixmdW5jdGlvbih0LGUpe24uc2V0U3R5bGUoZSx0LnByZXZpb3VzKCJzdHlsZSIpKX0pLHRoaXMuZGlzcGxheWVkLnRoZW4oZnVuY3Rpb24oKXtuLnVwZGF0ZV9jbGFzc2VzKFtdLG4ubW9kZWwuZ2V0KCJfZG9tX2NsYXNzZXMiKSksbi5zZXRMYXlvdXQobi5tb2RlbC5nZXQoImxheW91dCIpKSxuLnNldFN0eWxlKG4ubW9kZWwuZ2V0KCJzdHlsZSIpKX0pLHRoaXMuX2NvbW1fbGl2ZV91cGRhdGUoKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNvbW1fbGl2ZV91cGRhdGUiLGZ1bmN0aW9uKCl7bi5fY29tbV9saXZlX3VwZGF0ZSgpfSl9LGUucHJvdG90eXBlLnNldExheW91dD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dCYmKHRoaXMubGF5b3V0UHJvbWlzZT10aGlzLmxheW91dFByb21pc2UudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUudW5sYXlvdXQoKSxuLnN0b3BMaXN0ZW5pbmcoZS5tb2RlbCksZS5yZW1vdmUoKSksbi5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBuLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQudHJpZ2dlcigiZGlzcGxheWVkIiksbi5saXN0ZW5Ubyh0Lm1vZGVsLCJjaGFuZ2UiLGZ1bmN0aW9uKCl7ZC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZShuLnBXaWRnZXQsbC5XaWRnZXQuUmVzaXplTWVzc2FnZS5Vbmtub3duU2l6ZSl9KSxkLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKG4ucFdpZGdldCxsLldpZGdldC5SZXNpemVNZXNzYWdlLlVua25vd25TaXplKSx0fSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGFkZCBMYXlvdXRWaWV3IHRvIERPTVdpZGdldFZpZXciLCEwKSl9KSl9LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0JiYodGhpcy5zdHlsZVByb21pc2U9dGhpcy5zdHlsZVByb21pc2UudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUudW5zdHlsZSgpLG4uc3RvcExpc3RlbmluZyhlLm1vZGVsKSxlLnJlbW92ZSgpKSxuLmNyZWF0ZV9jaGlsZF92aWV3KHQpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIG4uZGlzcGxheWVkLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdC50cmlnZ2VyKCJkaXNwbGF5ZWQiKSx0fSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGFkZCBzdHlsZVZpZXcgdG8gRE9NV2lkZ2V0VmlldyIsITApKX0pKX0sZS5wcm90b3R5cGUudXBkYXRlX2NsYXNzZXM9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXRoaXMuZWwpLHMuZGlmZmVyZW5jZSh0LGUpLm1hcChmdW5jdGlvbih0KXtuLmNsYXNzTGlzdD9uLmNsYXNzTGlzdC5yZW1vdmUodCk6bi5zZXRBdHRyaWJ1dGUoImNsYXNzIixuLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5yZXBsYWNlKHQsIiIpKX0pLHMuZGlmZmVyZW5jZShlLHQpLm1hcChmdW5jdGlvbih0KXtuLmNsYXNzTGlzdD9uLmNsYXNzTGlzdC5hZGQodCk6bi5zZXRBdHRyaWJ1dGUoImNsYXNzIixuLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb25jYXQoIiAiLHQpKX0pfSxlLnByb3RvdHlwZS51cGRhdGVfbWFwcGVkX2NsYXNzZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMubW9kZWwucHJldmlvdXMoZSkscj10W2ldP3RbaV06W10sbz10W2k9dGhpcy5tb2RlbC5nZXQoZSldP3RbaV06W107dGhpcy51cGRhdGVfY2xhc3NlcyhyLG8sbnx8dGhpcy5lbCl9LGUucHJvdG90eXBlLnNldF9tYXBwZWRfY2xhc3Nlcz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5tb2RlbC5nZXQoZSkscj10W2ldP3RbaV06W107dGhpcy51cGRhdGVfY2xhc3NlcyhbXSxyLG58fHRoaXMuZWwpfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLnBXaWRnZXQmJnRoaXMucFdpZGdldC5kaXNwb3NlKCksdGhpcy4kZWw9dCBpbnN0YW5jZW9mIGM/dDpjKHQpLHRoaXMuZWw9dGhpcy4kZWxbMF0sdGhpcy5wV2lkZ2V0PW5ldyBiKHtub2RlOnQsdmlldzp0aGlzfSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBXaWRnZXQmJnRoaXMucFdpZGdldC5kaXNwb3NlKCksdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnByb2Nlc3NQaG9zcGhvck1lc3NhZ2U9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJhZnRlci1hdHRhY2giOnRoaXMudHJpZ2dlcigiZGlzcGxheWVkIil9fSxlLnByb3RvdHlwZS5fY29tbV9saXZlX3VwZGF0ZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuY29tbV9saXZlP3RoaXMucFdpZGdldC5yZW1vdmVDbGFzcygianVweXRlci13aWRnZXRzLWRpc2Nvbm5lY3RlZCIpOnRoaXMucFdpZGdldC5hZGRDbGFzcygianVweXRlci13aWRnZXRzLWRpc2Nvbm5lY3RlZCIpfSxlfSh2KTtlLkRPTVdpZGdldFZpZXc9eX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDIpLGE9big5KSx1PW4oNSksYz1uKDMwKSxoPW4oNDApLGw9bigyMiksZD1uKDQxKSxmPW4oNykscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2ZpeGVkPTAsbi5fc3BhY2luZz00LG4uX2RpcnR5PSExLG4uX3NpemVycz1bXSxuLl9pdGVtcz1bXSxuLl9ib3g9bnVsbCxuLl9hbGlnbm1lbnQ9InN0YXJ0IixuLl9kaXJlY3Rpb249InRvcC10by1ib3R0b20iLHZvaWQgMCE9PWUuZGlyZWN0aW9uJiYobi5fZGlyZWN0aW9uPWUuZGlyZWN0aW9uKSx2b2lkIDAhPT1lLmFsaWdubWVudCYmKG4uX2FsaWdubWVudD1lLmFsaWdubWVudCksdm9pZCAwIT09ZS5zcGFjaW5nJiYobi5fc3BhY2luZz1vLmNsYW1wU3BhY2luZyhlLnNwYWNpbmcpKSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3MuZWFjaCh0aGlzLl9pdGVtcyxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2JveD1udWxsLHRoaXMuX2l0ZW1zLmxlbmd0aD0wLHRoaXMuX3NpemVycy5sZW5ndGg9MCx0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZGlyZWN0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RpcmVjdGlvbiE9PXQmJih0aGlzLl9kaXJlY3Rpb249dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQuZGlyZWN0aW9uPXQsdGhpcy5wYXJlbnQuZml0KCkpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbGlnbm1lbnQhPT10JiYodGhpcy5fYWxpZ25tZW50PXQsdGhpcy5wYXJlbnQmJih0aGlzLnBhcmVudC5kYXRhc2V0LmFsaWdubWVudD10LHRoaXMucGFyZW50LnVwZGF0ZSgpKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBTcGFjaW5nKHQpLHRoaXMuX3NwYWNpbmchPT10JiYodGhpcy5fc3BhY2luZz10LHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMucGFyZW50LmRhdGFzZXQuZGlyZWN0aW9uPXRoaXMuZGlyZWN0aW9uLHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXRoaXMuYWxpZ25tZW50LHQucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuYXR0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7cy5BcnJheUV4dC5pbnNlcnQodGhpcy5faXRlbXMsdCxuZXcgbC5MYXlvdXRJdGVtKGUpKSxzLkFycmF5RXh0Lmluc2VydCh0aGlzLl9zaXplcnMsdCxuZXcgaC5Cb3hTaXplciksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5CZWZvcmVBdHRhY2gpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkFmdGVyQXR0YWNoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUubW92ZVdpZGdldD1mdW5jdGlvbih0LGUsbil7cy5BcnJheUV4dC5tb3ZlKHRoaXMuX2l0ZW1zLHQsZSkscy5BcnJheUV4dC5tb3ZlKHRoaXMuX3NpemVycyx0LGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpO3MuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fc2l6ZXJzLHQpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxmLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksbi5kaXNwb3NlKCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLG49MCxpPXRoaXMuX2l0ZW1zLmxlbmd0aDtuPGk7KytuKXQrPSshdGhpcy5faXRlbXNbbl0uaXNIaWRkZW47dGhpcy5fZml4ZWQ9dGhpcy5fc3BhY2luZypNYXRoLm1heCgwLHQtMSk7dmFyIHI9by5pc0hvcml6b250YWwodGhpcy5fZGlyZWN0aW9uKSxzPXI/dGhpcy5fZml4ZWQ6MCxjPXI/MDp0aGlzLl9maXhlZDtmb3Iobj0wLGk9dGhpcy5faXRlbXMubGVuZ3RoO248aTsrK24pe3ZhciBoPXRoaXMuX2l0ZW1zW25dLGw9dGhpcy5fc2l6ZXJzW25dO2guaXNIaWRkZW4/KGwubWluU2l6ZT0wLGwubWF4U2l6ZT0wKTooaC5maXQoKSxsLnNpemVIaW50PWUuZ2V0U2l6ZUJhc2lzKGgud2lkZ2V0KSxsLnN0cmV0Y2g9ZS5nZXRTdHJldGNoKGgud2lkZ2V0KSxyPyhsLm1pblNpemU9aC5taW5XaWR0aCxsLm1heFNpemU9aC5tYXhXaWR0aCxzKz1oLm1pbldpZHRoLGM9TWF0aC5tYXgoYyxoLm1pbkhlaWdodCkpOihsLm1pblNpemU9aC5taW5IZWlnaHQsbC5tYXhTaXplPWgubWF4SGVpZ2h0LGMrPWgubWluSGVpZ2h0LHM9TWF0aC5tYXgocyxoLm1pbldpZHRoKSkpfXZhciBkPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3MrPWQuaG9yaXpvbnRhbFN1bSxjKz1kLnZlcnRpY2FsU3VtO3ZhciBwPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7cC5taW5XaWR0aD1zKyJweCIscC5taW5IZWlnaHQ9YysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZi5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvLHM9dGhpcy5fYm94LnBhZGRpbmdUb3AsdT10aGlzLl9ib3gucGFkZGluZ0xlZnQsYz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLGw9ZS10aGlzLl9ib3gudmVydGljYWxTdW07c3dpdGNoKHRoaXMuX2RpcmVjdGlvbil7Y2FzZSJsZWZ0LXRvLXJpZ2h0IjpvPWguQm94RW5naW5lLmNhbGModGhpcy5fc2l6ZXJzLE1hdGgubWF4KDAsYy10aGlzLl9maXhlZCkpO2JyZWFrO2Nhc2UidG9wLXRvLWJvdHRvbSI6bz1oLkJveEVuZ2luZS5jYWxjKHRoaXMuX3NpemVycyxNYXRoLm1heCgwLGwtdGhpcy5fZml4ZWQpKTticmVhaztjYXNlInJpZ2h0LXRvLWxlZnQiOm89aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9zaXplcnMsTWF0aC5tYXgoMCxjLXRoaXMuX2ZpeGVkKSksdSs9YzticmVhaztjYXNlImJvdHRvbS10by10b3AiOm89aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9zaXplcnMsTWF0aC5tYXgoMCxsLXRoaXMuX2ZpeGVkKSkscys9bDticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn12YXIgZD0wLGY9MDtpZihvPjApc3dpdGNoKHRoaXMuX2FsaWdubWVudCl7Y2FzZSJzdGFydCI6YnJlYWs7Y2FzZSJjZW50ZXIiOmQ9MCxmPW8vMjticmVhaztjYXNlImVuZCI6ZD0wLGY9bzticmVhaztjYXNlImp1c3RpZnkiOmQ9by9uLGY9MDticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn1mb3IoaT0wLHI9dGhpcy5faXRlbXMubGVuZ3RoO2k8cjsrK2kpe3ZhciBwPXRoaXMuX2l0ZW1zW2ldO2lmKCFwLmlzSGlkZGVuKXt2YXIgbT10aGlzLl9zaXplcnNbaV0uc2l6ZTtzd2l0Y2godGhpcy5fZGlyZWN0aW9uKXtjYXNlImxlZnQtdG8tcmlnaHQiOnAudXBkYXRlKHUrZixzLG0rZCxsKSx1Kz1tK2QrdGhpcy5fc3BhY2luZzticmVhaztjYXNlInRvcC10by1ib3R0b20iOnAudXBkYXRlKHUscytmLGMsbStkKSxzKz1tK2QrdGhpcy5fc3BhY2luZzticmVhaztjYXNlInJpZ2h0LXRvLWxlZnQiOnAudXBkYXRlKHUtZi1tLWQscyxtK2QsbCksdS09bStkK3RoaXMuX3NwYWNpbmc7YnJlYWs7Y2FzZSJib3R0b20tdG8tdG9wIjpwLnVwZGF0ZSh1LHMtZi1tLWQsYyxtK2QpLHMtPW0rZCt0aGlzLl9zcGFjaW5nO2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifX19fX0sZX0oZC5QYW5lbExheW91dCk7ZS5Cb3hMYXlvdXQ9cCxmdW5jdGlvbih0KXt0LmdldFN0cmV0Y2g9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyZXRjaFByb3BlcnR5LmdldCh0KX0sdC5zZXRTdHJldGNoPWZ1bmN0aW9uKHQsZSl7by5zdHJldGNoUHJvcGVydHkuc2V0KHQsZSl9LHQuZ2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnNpemVCYXNpc1Byb3BlcnR5LmdldCh0KX0sdC5zZXRTaXplQmFzaXM9ZnVuY3Rpb24odCxlKXtvLnNpemVCYXNpc1Byb3BlcnR5LnNldCh0LGUpfX0ocD1lLkJveExheW91dHx8KGUuQm94TGF5b3V0PXt9KSksZS5Cb3hMYXlvdXQ9cCxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3QucGFyZW50JiZ0LnBhcmVudC5sYXlvdXQgaW5zdGFuY2VvZiBwJiZ0LnBhcmVudC5maXQoKX10LnN0cmV0Y2hQcm9wZXJ0eT1uZXcgYy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJzdHJldGNoIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZX0pLHQuc2l6ZUJhc2lzUHJvcGVydHk9bmV3IGMuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToic2l6ZUJhc2lzIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZX0pLHQuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKHQpe3JldHVybiJsZWZ0LXRvLXJpZ2h0Ij09PXR8fCJyaWdodC10by1sZWZ0Ij09PXR9LHQuY2xhbXBTcGFjaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGguZmxvb3IodCkpfX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxMSkscj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fbGFiZWw9IiIsdGhpcy5fY2FwdGlvbj0iIix0aGlzLl9tbmVtb25pYz0tMSx0aGlzLl9pY29uQ2xhc3M9IiIsdGhpcy5faWNvbkxhYmVsPSIiLHRoaXMuX2NsYXNzTmFtZT0iIix0aGlzLl9jbG9zYWJsZT0hMSx0aGlzLl9jaGFuZ2VkPW5ldyBpLlNpZ25hbCh0aGlzKSx0aGlzLm93bmVyPXQub3duZXIsdm9pZCAwIT09dC5sYWJlbCYmKHRoaXMuX2xhYmVsPXQubGFiZWwpLHZvaWQgMCE9PXQubW5lbW9uaWMmJih0aGlzLl9tbmVtb25pYz10Lm1uZW1vbmljKSx2b2lkIDAhPT10Lmljb24mJih0aGlzLl9pY29uQ2xhc3M9dC5pY29uKSx2b2lkIDAhPT10Lmljb25DbGFzcyYmKHRoaXMuX2ljb25DbGFzcz10Lmljb25DbGFzcyksdm9pZCAwIT09dC5pY29uTGFiZWwmJih0aGlzLl9pY29uTGFiZWw9dC5pY29uTGFiZWwpLHZvaWQgMCE9PXQuY2FwdGlvbiYmKHRoaXMuX2NhcHRpb249dC5jYXB0aW9uKSx2b2lkIDAhPT10LmNsYXNzTmFtZSYmKHRoaXMuX2NsYXNzTmFtZT10LmNsYXNzTmFtZSksdm9pZCAwIT09dC5jbG9zYWJsZSYmKHRoaXMuX2Nsb3NhYmxlPXQuY2xvc2FibGUpLHRoaXMuX2RhdGFzZXQ9dC5kYXRhc2V0fHx7fX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjaGFuZ2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJsYWJlbCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsIT09dCYmKHRoaXMuX2xhYmVsPXQsdGhpcy5fY2hhbmdlZC5lbWl0KHZvaWQgMCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibW5lbW9uaWMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW5lbW9uaWN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tbmVtb25pYyE9PXQmJih0aGlzLl9tbmVtb25pYz10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29uQ2xhc3N9LHNldDpmdW5jdGlvbih0KXt0aGlzLmljb25DbGFzcz10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaWNvbkNsYXNzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb25DbGFzc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ljb25DbGFzcyE9PXQmJih0aGlzLl9pY29uQ2xhc3M9dCx0aGlzLl9jaGFuZ2VkLmVtaXQodm9pZCAwKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uTGFiZWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbkxhYmVsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faWNvbkxhYmVsIT09dCYmKHRoaXMuX2ljb25MYWJlbD10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNhcHRpb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FwdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcHRpb24hPT10JiYodGhpcy5fY2FwdGlvbj10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNsYXNzTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGFzc05hbWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jbGFzc05hbWUhPT10JiYodGhpcy5fY2xhc3NOYW1lPXQsdGhpcy5fY2hhbmdlZC5lbWl0KHZvaWQgMCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY2xvc2FibGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xvc2FibGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jbG9zYWJsZSE9PXQmJih0aGlzLl9jbG9zYWJsZT10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImRhdGFzZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXNldH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGFzZXQhPT10JiYodGhpcy5fZGF0YXNldD10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpO2UuVGl0bGU9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9mbj10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fZm59LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lmKHRoaXMuX2ZuKXt2YXIgdD10aGlzLl9mbjt0aGlzLl9mbj1udWxsLHQoKX19LHR9KCk7ZS5EaXNwb3NhYmxlRGVsZWdhdGU9cjt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLl9pdGVtcz1uZXcgU2V0fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5fZGlzcG9zZWQ9ITAsdGhpcy5faXRlbXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2l0ZW1zLmNsZWFyKCkpfSx0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlbXMuaGFzKHQpfSx0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKHQpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuZGVsZXRlKHQpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX2l0ZW1zLmNsZWFyKCl9LHR9KCk7ZS5EaXNwb3NhYmxlU2V0PW8sZnVuY3Rpb24odCl7dC5mcm9tPWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0O3JldHVybiBpLmVhY2goZSxmdW5jdGlvbih0KXtuLmFkZCh0KX0pLG59fShvPWUuRGlzcG9zYWJsZVNldHx8KGUuRGlzcG9zYWJsZVNldD17fSkpLGUuRGlzcG9zYWJsZVNldD1vfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmdldEtleWJvYXJkTGF5b3V0PWZ1bmN0aW9uKCl7cmV0dXJuIGkua2V5Ym9hcmRMYXlvdXR9LGUuc2V0S2V5Ym9hcmRMYXlvdXQ9ZnVuY3Rpb24odCl7aS5rZXlib2FyZExheW91dD10fTt2YXIgaSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3RoaXMubmFtZT1lLHRoaXMuX2NvZGVzPW4sdGhpcy5fa2V5cz10LmV4dHJhY3RLZXlzKG4pfXJldHVybiB0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2tleXMpfSx0LnByb3RvdHlwZS5pc1ZhbGlkS2V5PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuX2tleXN9LHQucHJvdG90eXBlLmtleUZvcktleWRvd25FdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29kZXNbdC5rZXlDb2RlXXx8IiJ9LHR9KCk7ZS5LZXljb2RlTGF5b3V0PXIsZnVuY3Rpb24odCl7dC5leHRyYWN0S2V5cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgbiBpbiB0KWVbdFtuXV09ITA7cmV0dXJuIGV9fShyPWUuS2V5Y29kZUxheW91dHx8KGUuS2V5Y29kZUxheW91dD17fSkpLGUuS2V5Y29kZUxheW91dD1yLGUuRU5fVVM9bmV3IHIoImVuLXVzIix7ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEzOiJFbnRlciIsMTk6IlBhdXNlIiwyNzoiRXNjYXBlIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsNDg6IjAiLDQ5OiIxIiw1MDoiMiIsNTE6IjMiLDUyOiI0Iiw1MzoiNSIsNTQ6IjYiLDU1OiI3Iiw1NjoiOCIsNTc6IjkiLDU5OiI7Iiw2MToiPSIsNjU6IkEiLDY2OiJCIiw2NzoiQyIsNjg6IkQiLDY5OiJFIiw3MDoiRiIsNzE6IkciLDcyOiJIIiw3MzoiSSIsNzQ6IkoiLDc1OiJLIiw3NjoiTCIsNzc6Ik0iLDc4OiJOIiw3OToiTyIsODA6IlAiLDgxOiJRIiw4MjoiUiIsODM6IlMiLDg0OiJUIiw4NToiVSIsODY6IlYiLDg3OiJXIiw4ODoiWCIsODk6IlkiLDkwOiJaIiw5MzoiQ29udGV4dE1lbnUiLDk2OiIwIiw5NzoiMSIsOTg6IjIiLDk5OiIzIiwxMDA6IjQiLDEwMToiNSIsMTAyOiI2IiwxMDM6IjciLDEwNDoiOCIsMTA1OiI5IiwxMDY6IioiLDEwNzoiKyIsMTA5OiItIiwxMTA6Ii4iLDExMToiLyIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTczOiItIiwxODY6IjsiLDE4NzoiPSIsMTg4OiIsIiwxODk6Ii0iLDE5MDoiLiIsMTkxOiIvIiwxOTI6ImAiLDIxOToiWyIsMjIwOiJcXCIsMjIxOiJdIiwyMjI6IicifSksZnVuY3Rpb24odCl7dC5rZXlib2FyZExheW91dD1lLkVOX1VTfShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDkpLHU9big1NiksYz1uKDUpLGg9bigxMSksbD1uKDU1KSxkPW4oNzcpLGY9big3KSxwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dm9pZCAwPT09biYmKG49e30pO3ZhciBpPXQuY2FsbCh0aGlzLHtub2RlOm8uY3JlYXRlTm9kZSgpfSl8fHRoaXM7cmV0dXJuIGkuX2N1cnJlbnRJbmRleD0tMSxpLl90aXRsZXM9W10saS5fcHJldmlvdXNUaXRsZT1udWxsLGkuX2RyYWdEYXRhPW51bGwsaS5fdGFiTW92ZWQ9bmV3IGguU2lnbmFsKGkpLGkuX2N1cnJlbnRDaGFuZ2VkPW5ldyBoLlNpZ25hbChpKSxpLl90YWJDbG9zZVJlcXVlc3RlZD1uZXcgaC5TaWduYWwoaSksaS5fdGFiRGV0YWNoUmVxdWVzdGVkPW5ldyBoLlNpZ25hbChpKSxpLl90YWJBY3RpdmF0ZVJlcXVlc3RlZD1uZXcgaC5TaWduYWwoaSksaS5hZGRDbGFzcygicC1UYWJCYXIiKSxpLnNldEZsYWcoZi5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS50YWJzTW92YWJsZT1uLnRhYnNNb3ZhYmxlfHwhMSxpLmFsbG93RGVzZWxlY3Q9bi5hbGxvd0Rlc2VsZWN0fHwhMSxpLmluc2VydEJlaGF2aW9yPW4uaW5zZXJ0QmVoYXZpb3J8fCJzZWxlY3QtdGFiLWlmLW5lZWRlZCIsaS5yZW1vdmVCZWhhdmlvcj1uLnJlbW92ZUJlaGF2aW9yfHwic2VsZWN0LXRhYi1hZnRlciIsaS5yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpLl9vcmllbnRhdGlvbj1uLm9yaWVudGF0aW9ufHwiaG9yaXpvbnRhbCIsaS5kYXRhc2V0Lm9yaWVudGF0aW9uPWkuX29yaWVudGF0aW9uLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fdGl0bGVzLmxlbmd0aD0wLHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCx0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJNb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90YWJNb3ZlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYkFjdGl2YXRlUmVxdWVzdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RhYkFjdGl2YXRlUmVxdWVzdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFiQ2xvc2VSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFiQ2xvc2VSZXF1ZXN0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJEZXRhY2hSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFiRGV0YWNoUmVxdWVzdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudFRpdGxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpdGxlc1t0aGlzLl9jdXJyZW50SW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jdXJyZW50SW5kZXg9dD90aGlzLl90aXRsZXMuaW5kZXhPZih0KTotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImN1cnJlbnRJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50SW5kZXh9LHNldDpmdW5jdGlvbih0KXtpZigodDwwfHx0Pj10aGlzLl90aXRsZXMubGVuZ3RoKSYmKHQ9LTEpLHRoaXMuX2N1cnJlbnRJbmRleCE9PXQpe3ZhciBlPXRoaXMuX2N1cnJlbnRJbmRleCxuPXRoaXMuX3RpdGxlc1tlXXx8bnVsbCxpPXQscj10aGlzLl90aXRsZXNbaV18fG51bGw7dGhpcy5fY3VycmVudEluZGV4PWksdGhpcy5fcHJldmlvdXNUaXRsZT1uLHRoaXMudXBkYXRlKCksdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDplLHByZXZpb3VzVGl0bGU6bixjdXJyZW50SW5kZXg6aSxjdXJyZW50VGl0bGU6cn0pfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fb3JpZW50YXRpb249dCx0aGlzLmRhdGFzZXQub3JpZW50YXRpb249dCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0aXRsZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGl0bGVzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY29udGVudE5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInAtVGFiQmFyLWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRUYWI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5zZXJ0VGFiKHRoaXMuX3RpdGxlcy5sZW5ndGgsdCl9LGUucHJvdG90eXBlLmluc2VydFRhYj1mdW5jdGlvbih0LGUpe3RoaXMuX3JlbGVhc2VNb3VzZSgpO3ZhciBuPW8uYXNUaXRsZShlKSxpPXRoaXMuX3RpdGxlcy5pbmRleE9mKG4pLHI9TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX3RpdGxlcy5sZW5ndGgpKTtyZXR1cm4tMT09PWk/KHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX3RpdGxlcyxyLG4pLG4uY2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLHRoaXMudXBkYXRlKCksdGhpcy5fYWRqdXN0Q3VycmVudEZvckluc2VydChyLG4pLG4pOihyPT09dGhpcy5fdGl0bGVzLmxlbmd0aCYmci0tLGk9PT1yP246KHMuQXJyYXlFeHQubW92ZSh0aGlzLl90aXRsZXMsaSxyKSx0aGlzLnVwZGF0ZSgpLHRoaXMuX2FkanVzdEN1cnJlbnRGb3JNb3ZlKGksciksbikpfSxlLnByb3RvdHlwZS5yZW1vdmVUYWI9ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVUYWJBdCh0aGlzLl90aXRsZXMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZVRhYkF0PWZ1bmN0aW9uKHQpe3RoaXMuX3JlbGVhc2VNb3VzZSgpO3ZhciBlPXMuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fdGl0bGVzLHQpO2UmJihlLmNoYW5nZWQuZGlzY29ubmVjdCh0aGlzLl9vblRpdGxlQ2hhbmdlZCx0aGlzKSxlPT09dGhpcy5fcHJldmlvdXNUaXRsZSYmKHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCksdGhpcy51cGRhdGUoKSx0aGlzLl9hZGp1c3RDdXJyZW50Rm9yUmVtb3ZlKHQsZSkpfSxlLnByb3RvdHlwZS5jbGVhclRhYnM9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5fdGl0bGVzLmxlbmd0aCl7dGhpcy5fcmVsZWFzZU1vdXNlKCk7Zm9yKHZhciB0PTAsZT10aGlzLl90aXRsZXM7dDxlLmxlbmd0aDt0Kyspe2VbdF0uY2hhbmdlZC5kaXNjb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpfXZhciBuPXRoaXMuY3VycmVudEluZGV4LGk9dGhpcy5jdXJyZW50VGl0bGU7dGhpcy5fY3VycmVudEluZGV4PS0xLHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCx0aGlzLl90aXRsZXMubGVuZ3RoPTAsdGhpcy51cGRhdGUoKSwtMSE9PW4mJnRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6bixwcmV2aW91c1RpdGxlOmksY3VycmVudEluZGV4Oi0xLGN1cnJlbnRUaXRsZTpudWxsfSl9fSxlLnByb3RvdHlwZS5yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJtb3VzZWRvd24iOnRoaXMuX2V2dE1vdXNlRG93bih0KTticmVhaztjYXNlIm1vdXNlbW92ZSI6dGhpcy5fZXZ0TW91c2VNb3ZlKHQpO2JyZWFrO2Nhc2UibW91c2V1cCI6dGhpcy5fZXZ0TW91c2VVcCh0KTticmVhaztjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl90aXRsZXMsbj10aGlzLnJlbmRlcmVyLGk9dGhpcy5jdXJyZW50VGl0bGUscj1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MCxzPWUubGVuZ3RoO288czsrK28pe3ZhciBhPWVbb10sdT1hPT09aSxjPXU/czpzLW8tMTtyW29dPW4ucmVuZGVyVGFiKHt0aXRsZTphLGN1cnJlbnQ6dSx6SW5kZXg6Y30pfWwuVmlydHVhbERPTS5yZW5kZXIocix0aGlzLmNvbnRlbnROb2RlKX0sZS5wcm90b3R5cGUuX2V2dEtleURvd249ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksMjc9PT10LmtleUNvZGUmJnRoaXMuX3JlbGVhc2VNb3VzZSgpfSxlLnByb3RvdHlwZS5fZXZ0TW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKCgwPT09dC5idXR0b258fDE9PT10LmJ1dHRvbikmJiF0aGlzLl9kcmFnRGF0YSl7dmFyIGU9dGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixuPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgoZSxmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pO2lmKC0xIT09biYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2RyYWdEYXRhPXt0YWI6ZVtuXSxpbmRleDpuLHByZXNzWDp0LmNsaWVudFgscHJlc3NZOnQuY2xpZW50WSx0YWJQb3M6LTEsdGFiU2l6ZTotMSx0YWJQcmVzc1BvczotMSx0YXJnZXRJbmRleDotMSx0YWJMYXlvdXQ6bnVsbCxjb250ZW50UmVjdDpudWxsLG92ZXJyaWRlOm51bGwsZHJhZ0FjdGl2ZTohMSxkcmFnQWJvcnRlZDohMSxkZXRhY2hSZXF1ZXN0ZWQ6ITF9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLDEhPT10LmJ1dHRvbikpe3ZhciBpPWVbbl0ucXVlcnlTZWxlY3Rvcih0aGlzLnJlbmRlcmVyLmNsb3NlSWNvblNlbGVjdG9yKTtpJiZpLmNvbnRhaW5zKHQudGFyZ2V0KXx8KHRoaXMudGFic01vdmFibGUmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKSksdGhpcy5hbGxvd0Rlc2VsZWN0JiZ0aGlzLmN1cnJlbnRJbmRleD09PW4/dGhpcy5jdXJyZW50SW5kZXg9LTE6dGhpcy5jdXJyZW50SW5kZXg9biwtMSE9PXRoaXMuY3VycmVudEluZGV4JiZ0aGlzLl90YWJBY3RpdmF0ZVJlcXVlc3RlZC5lbWl0KHtpbmRleDp0aGlzLmN1cnJlbnRJbmRleCx0aXRsZTp0aGlzLmN1cnJlbnRUaXRsZX0pKX19fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RyYWdEYXRhO2lmKGUpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBuPXRoaXMuY29udGVudE5vZGUuY2hpbGRyZW47aWYoZS5kcmFnQWN0aXZlfHxvLmRyYWdFeGNlZWRlZChlLHQpKXtpZighZS5kcmFnQWN0aXZlKXt2YXIgaT1lLnRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsiaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbj8oZS50YWJQb3M9ZS50YWIub2Zmc2V0TGVmdCxlLnRhYlNpemU9aS53aWR0aCxlLnRhYlByZXNzUG9zPWUucHJlc3NYLWkubGVmdCk6KGUudGFiUG9zPWUudGFiLm9mZnNldFRvcCxlLnRhYlNpemU9aS5oZWlnaHQsZS50YWJQcmVzc1Bvcz1lLnByZXNzWS1pLnRvcCksZS50YWJMYXlvdXQ9by5zbmFwVGFiTGF5b3V0KG4sdGhpcy5fb3JpZW50YXRpb24pLGUuY29udGVudFJlY3Q9dGhpcy5jb250ZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlLm92ZXJyaWRlPXUuRHJhZy5vdmVycmlkZUN1cnNvcigiZGVmYXVsdCIpLGUudGFiLmNsYXNzTGlzdC5hZGQoInAtbW9kLWRyYWdnaW5nIiksdGhpcy5hZGRDbGFzcygicC1tb2QtZHJhZ2dpbmciKSxlLmRyYWdBY3RpdmU9ITB9aWYoIWUuZGV0YWNoUmVxdWVzdGVkJiZvLmRldGFjaEV4Y2VlZGVkKGUsdCkpe2UuZGV0YWNoUmVxdWVzdGVkPSEwO3ZhciByPWUuaW5kZXgscz10LmNsaWVudFgsYT10LmNsaWVudFksYz1uW3JdLGg9dGhpcy5fdGl0bGVzW3JdO2lmKHRoaXMuX3RhYkRldGFjaFJlcXVlc3RlZC5lbWl0KHtpbmRleDpyLHRpdGxlOmgsdGFiOmMsY2xpZW50WDpzLGNsaWVudFk6YX0pLGUuZHJhZ0Fib3J0ZWQpcmV0dXJufW8ubGF5b3V0VGFicyhuLGUsdCx0aGlzLl9vcmllbnRhdGlvbil9fX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZigwPT09dC5idXR0b258fDE9PT10LmJ1dHRvbil7dmFyIG49dGhpcy5fZHJhZ0RhdGE7aWYobil7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcywhMCksIW4uZHJhZ0FjdGl2ZSl7dGhpcy5fZHJhZ0RhdGE9bnVsbDt2YXIgaT10aGlzLmNvbnRlbnROb2RlLmNoaWxkcmVuLHI9cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleChpLGZ1bmN0aW9uKGUpe3JldHVybiBhLkVsZW1lbnRFeHQuaGl0VGVzdChlLHQuY2xpZW50WCx0LmNsaWVudFkpfSk7aWYociE9PW4uaW5kZXgpcmV0dXJuO3ZhciB1PXRoaXMuX3RpdGxlc1tyXTtpZighdS5jbG9zYWJsZSlyZXR1cm47aWYoMT09PXQuYnV0dG9uKXJldHVybiB2b2lkIHRoaXMuX3RhYkNsb3NlUmVxdWVzdGVkLmVtaXQoe2luZGV4OnIsdGl0bGU6dX0pO3ZhciBoPWlbcl0ucXVlcnlTZWxlY3Rvcih0aGlzLnJlbmRlcmVyLmNsb3NlSWNvblNlbGVjdG9yKTtyZXR1cm4gaCYmaC5jb250YWlucyh0LnRhcmdldCk/dm9pZCB0aGlzLl90YWJDbG9zZVJlcXVlc3RlZC5lbWl0KHtpbmRleDpyLHRpdGxlOnV9KTp2b2lkIDB9aWYoMD09PXQuYnV0dG9uKXtvLmZpbmFsaXplVGFiUG9zaXRpb24obix0aGlzLl9vcmllbnRhdGlvbiksbi50YWIuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtZHJhZ2dpbmciKTt2YXIgbD1vLnBhcnNlVHJhbnNpdGlvbkR1cmF0aW9uKG4udGFiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIW4uZHJhZ0Fib3J0ZWQpe2UuX2RyYWdEYXRhPW51bGwsby5yZXNldFRhYlBvc2l0aW9ucyhlLmNvbnRlbnROb2RlLmNoaWxkcmVuLGUuX29yaWVudGF0aW9uKSxuLm92ZXJyaWRlLmRpc3Bvc2UoKSxlLnJlbW92ZUNsYXNzKCJwLW1vZC1kcmFnZ2luZyIpO3ZhciB0PW4uaW5kZXgsaT1uLnRhcmdldEluZGV4Oy0xIT09aSYmdCE9PWkmJihzLkFycmF5RXh0Lm1vdmUoZS5fdGl0bGVzLHQsaSksZS5fYWRqdXN0Q3VycmVudEZvck1vdmUodCxpKSxlLl90YWJNb3ZlZC5lbWl0KHtmcm9tSW5kZXg6dCx0b0luZGV4OmksdGl0bGU6ZS5fdGl0bGVzW2ldfSksYy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KSl9fSxsKX19fX0sZS5wcm90b3R5cGUuX3JlbGVhc2VNb3VzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RyYWdEYXRhO3QmJih0aGlzLl9kcmFnRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLHQuZHJhZ0Fib3J0ZWQ9ITAsdC5kcmFnQWN0aXZlJiYoby5yZXNldFRhYlBvc2l0aW9ucyh0aGlzLmNvbnRlbnROb2RlLmNoaWxkcmVuLHRoaXMuX29yaWVudGF0aW9uKSx0Lm92ZXJyaWRlLmRpc3Bvc2UoKSx0LnRhYi5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1kcmFnZ2luZyIpLHRoaXMucmVtb3ZlQ2xhc3MoInAtbW9kLWRyYWdnaW5nIikpKX0sZS5wcm90b3R5cGUuX2FkanVzdEN1cnJlbnRGb3JJbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmN1cnJlbnRUaXRsZSxpPXRoaXMuX2N1cnJlbnRJbmRleCxyPXRoaXMuaW5zZXJ0QmVoYXZpb3I7aWYoInNlbGVjdC10YWIiPT09cnx8InNlbGVjdC10YWItaWYtbmVlZGVkIj09PXImJi0xPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PXQsdGhpcy5fcHJldmlvdXNUaXRsZT1uLHZvaWQgdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDppLHByZXZpb3VzVGl0bGU6bixjdXJyZW50SW5kZXg6dCxjdXJyZW50VGl0bGU6ZX0pO2k+PXQmJnRoaXMuX2N1cnJlbnRJbmRleCsrfSxlLnByb3RvdHlwZS5fYWRqdXN0Q3VycmVudEZvck1vdmU9ZnVuY3Rpb24odCxlKXt0aGlzLl9jdXJyZW50SW5kZXg9PT10P3RoaXMuX2N1cnJlbnRJbmRleD1lOnRoaXMuX2N1cnJlbnRJbmRleDx0JiZ0aGlzLl9jdXJyZW50SW5kZXg+PWU/dGhpcy5fY3VycmVudEluZGV4Kys6dGhpcy5fY3VycmVudEluZGV4PnQmJnRoaXMuX2N1cnJlbnRJbmRleDw9ZSYmdGhpcy5fY3VycmVudEluZGV4LS19LGUucHJvdG90eXBlLl9hZGp1c3RDdXJyZW50Rm9yUmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY3VycmVudEluZGV4LGk9dGhpcy5yZW1vdmVCZWhhdmlvcjtpZihuPT09dCl7aWYoMD09PXRoaXMuX3RpdGxlcy5sZW5ndGgpcmV0dXJuIHRoaXMuX2N1cnJlbnRJbmRleD0tMSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4Oi0xLGN1cnJlbnRUaXRsZTpudWxsfSk7aWYoInNlbGVjdC10YWItYWZ0ZXIiPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PU1hdGgubWluKHQsdGhpcy5fdGl0bGVzLmxlbmd0aC0xKSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4OnRoaXMuX2N1cnJlbnRJbmRleCxjdXJyZW50VGl0bGU6dGhpcy5jdXJyZW50VGl0bGV9KTtpZigic2VsZWN0LXRhYi1iZWZvcmUiPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PU1hdGgubWF4KDAsdC0xKSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4OnRoaXMuX2N1cnJlbnRJbmRleCxjdXJyZW50VGl0bGU6dGhpcy5jdXJyZW50VGl0bGV9KTtpZigic2VsZWN0LXByZXZpb3VzLXRhYiI9PT1pKXJldHVybiB0aGlzLl9wcmV2aW91c1RpdGxlPyh0aGlzLl9jdXJyZW50SW5kZXg9dGhpcy5fdGl0bGVzLmluZGV4T2YodGhpcy5fcHJldmlvdXNUaXRsZSksdGhpcy5fcHJldmlvdXNUaXRsZT1udWxsKTp0aGlzLl9jdXJyZW50SW5kZXg9TWF0aC5taW4odCx0aGlzLl90aXRsZXMubGVuZ3RoLTEpLHZvaWQgdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDp0LHByZXZpb3VzVGl0bGU6ZSxjdXJyZW50SW5kZXg6dGhpcy5fY3VycmVudEluZGV4LGN1cnJlbnRUaXRsZTp0aGlzLmN1cnJlbnRUaXRsZX0pO3RoaXMuX2N1cnJlbnRJbmRleD0tMSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNUaXRsZTplLGN1cnJlbnRJbmRleDotMSxjdXJyZW50VGl0bGU6bnVsbH0pfWVsc2Ugbj50JiZ0aGlzLl9jdXJyZW50SW5kZXgtLX0sZS5wcm90b3R5cGUuX29uVGl0bGVDaGFuZ2VkPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlKCl9LGV9KGYuV2lkZ2V0KTtlLlRhYkJhcj1wLGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuY2xvc2VJY29uU2VsZWN0b3I9Ii5wLVRhYkJhci10YWJDbG9zZUljb24iLHRoaXMuX3RhYklEPTAsdGhpcy5fdGFiS2V5cz1uZXcgV2Vha01hcH1yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyVGFiPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGl0bGUuY2FwdGlvbixuPXRoaXMuY3JlYXRlVGFiS2V5KHQpLGk9dGhpcy5jcmVhdGVUYWJTdHlsZSh0KSxyPXRoaXMuY3JlYXRlVGFiQ2xhc3ModCksbz10aGlzLmNyZWF0ZVRhYkRhdGFzZXQodCk7cmV0dXJuIGwuaC5saSh7a2V5Om4sY2xhc3NOYW1lOnIsdGl0bGU6ZSxzdHlsZTppLGRhdGFzZXQ6b30sdGhpcy5yZW5kZXJJY29uKHQpLHRoaXMucmVuZGVyTGFiZWwodCksdGhpcy5yZW5kZXJDbG9zZUljb24odCkpfSx0LnByb3RvdHlwZS5yZW5kZXJJY29uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3JlYXRlSWNvbkNsYXNzKHQpO3JldHVybiBsLmguZGl2KHtjbGFzc05hbWU6ZX0sdC50aXRsZS5pY29uTGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLVRhYkJhci10YWJMYWJlbCJ9LHQudGl0bGUubGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJDbG9zZUljb249ZnVuY3Rpb24odCl7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1UYWJCYXItdGFiQ2xvc2VJY29uIn0pfSx0LnByb3RvdHlwZS5jcmVhdGVUYWJLZXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGFiS2V5cy5nZXQodC50aXRsZSk7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0YWIta2V5LSIrdGhpcy5fdGFiSUQrKyx0aGlzLl90YWJLZXlzLnNldCh0LnRpdGxlLGUpKSxlfSx0LnByb3RvdHlwZS5jcmVhdGVUYWJTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm57ekluZGV4OiIiK3QuekluZGV4fX0sdC5wcm90b3R5cGUuY3JlYXRlVGFiQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtVGFiQmFyLXRhYiI7cmV0dXJuIHQudGl0bGUuY2xhc3NOYW1lJiYoZSs9IiAiK3QudGl0bGUuY2xhc3NOYW1lKSx0LnRpdGxlLmNsb3NhYmxlJiYoZSs9IiBwLW1vZC1jbG9zYWJsZSIpLHQuY3VycmVudCYmKGUrPSIgcC1tb2QtY3VycmVudCIpLGV9LHQucHJvdG90eXBlLmNyZWF0ZVRhYkRhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGl0bGUuZGF0YXNldH0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLVRhYkJhci10YWJJY29uIixuPXQudGl0bGUuaWNvbkNsYXNzO3JldHVybiBuP2UrIiAiK246ZX0sdH0oKTt0LlJlbmRlcmVyPWUsdC5kZWZhdWx0UmVuZGVyZXI9bmV3IGV9KHA9ZS5UYWJCYXJ8fChlLlRhYkJhcj17fSkpLGUuVGFiQmFyPXAsZnVuY3Rpb24odCl7dC5EUkFHX1RIUkVTSE9MRD01LHQuREVUQUNIX1RIUkVTSE9MRD0yMCx0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJwLVRhYkJhci1jb250ZW50Iix0LmFwcGVuZENoaWxkKGUpLHR9LHQuYXNUaXRsZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGQuVGl0bGU/dDpuZXcgZC5UaXRsZSh0KX0sdC5wYXJzZVRyYW5zaXRpb25EdXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gMWUzKihwYXJzZUZsb2F0KGUudHJhbnNpdGlvbkR1cmF0aW9uKXx8MCl9LHQuc25hcFRhYkxheW91dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgpLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpe3ZhciBvPXRbaV0scz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvKTtuW2ldPSJob3Jpem9udGFsIj09PWU/e3BvczpvLm9mZnNldExlZnQsc2l6ZTpvLm9mZnNldFdpZHRoLG1hcmdpbjpwYXJzZUZsb2F0KHMubWFyZ2luTGVmdCl8fDB9Ontwb3M6by5vZmZzZXRUb3Asc2l6ZTpvLm9mZnNldEhlaWdodCxtYXJnaW46cGFyc2VGbG9hdChzLm1hcmdpblRvcCl8fDB9fXJldHVybiBufSx0LmRyYWdFeGNlZWRlZD1mdW5jdGlvbihlLG4pe3ZhciBpPU1hdGguYWJzKG4uY2xpZW50WC1lLnByZXNzWCkscj1NYXRoLmFicyhuLmNsaWVudFktZS5wcmVzc1kpO3JldHVybiBpPj10LkRSQUdfVEhSRVNIT0xEfHxyPj10LkRSQUdfVEhSRVNIT0xEfSx0LmRldGFjaEV4Y2VlZGVkPWZ1bmN0aW9uKGUsbil7dmFyIGk9ZS5jb250ZW50UmVjdDtyZXR1cm4gbi5jbGllbnRYPGkubGVmdC10LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WD49aS5yaWdodCt0LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WTxpLnRvcC10LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WT49aS5ib3R0b20rdC5ERVRBQ0hfVEhSRVNIT0xEfSx0LmxheW91dFRhYnM9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbyxzLGE7Imhvcml6b250YWwiPT09aT8ocj1lLnByZXNzWCxvPW4uY2xpZW50WC1lLmNvbnRlbnRSZWN0LmxlZnQscz1uLmNsaWVudFgsYT1lLmNvbnRlbnRSZWN0LndpZHRoKToocj1lLnByZXNzWSxvPW4uY2xpZW50WS1lLmNvbnRlbnRSZWN0LnRvcCxzPW4uY2xpZW50WSxhPWUuY29udGVudFJlY3QuaGVpZ2h0KTtmb3IodmFyIHU9ZS5pbmRleCxjPW8tZS50YWJQcmVzc1BvcyxoPWMrZS50YWJTaXplLGw9MCxkPXQubGVuZ3RoO2w8ZDsrK2wpe3ZhciBmPXZvaWQgMCxwPWUudGFiTGF5b3V0W2xdLG09cC5wb3MrKHAuc2l6ZT4+MSk7aWYobDxlLmluZGV4JiZjPG0pZj1lLnRhYlNpemUrZS50YWJMYXlvdXRbbCsxXS5tYXJnaW4rInB4Iix1PU1hdGgubWluKHUsbCk7ZWxzZSBpZihsPmUuaW5kZXgmJmg+bSlmPS1lLnRhYlNpemUtcC5tYXJnaW4rInB4Iix1PU1hdGgubWF4KHUsbCk7ZWxzZSBpZihsPT09ZS5pbmRleCl7dmFyIGc9cy1yLHY9YS0oZS50YWJQb3MrZS50YWJTaXplKTtmPU1hdGgubWF4KC1lLnRhYlBvcyxNYXRoLm1pbihnLHYpKSsicHgifWVsc2UgZj0iIjsiaG9yaXpvbnRhbCI9PT1pP3RbbF0uc3R5bGUubGVmdD1mOnRbbF0uc3R5bGUudG9wPWZ9ZS50YXJnZXRJbmRleD11fSx0LmZpbmFsaXplVGFiUG9zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbixpO2lmKG49Imhvcml6b250YWwiPT09ZT90LmNvbnRlbnRSZWN0LndpZHRoOnQuY29udGVudFJlY3QuaGVpZ2h0LHQudGFyZ2V0SW5kZXg9PT10LmluZGV4KWk9MDtlbHNlIGlmKHQudGFyZ2V0SW5kZXg+dC5pbmRleClpPShyPXQudGFiTGF5b3V0W3QudGFyZ2V0SW5kZXhdKS5wb3Mrci5zaXplLXQudGFiU2l6ZS10LnRhYlBvcztlbHNle3ZhciByO2k9KHI9dC50YWJMYXlvdXRbdC50YXJnZXRJbmRleF0pLnBvcy10LnRhYlBvc312YXIgbz1uLSh0LnRhYlBvcyt0LnRhYlNpemUpLHM9TWF0aC5tYXgoLXQudGFiUG9zLE1hdGgubWluKGksbykpOyJob3Jpem9udGFsIj09PWU/dC50YWIuc3R5bGUubGVmdD1zKyJweCI6dC50YWIuc3R5bGUudG9wPXMrInB4In0sdC5yZXNldFRhYlBvc2l0aW9ucz1mdW5jdGlvbih0LGUpe3MuZWFjaCh0LGZ1bmN0aW9uKHQpeyJob3Jpem9udGFsIj09PWU/dC5zdHlsZS5sZWZ0PSIiOnQuc3R5bGUudG9wPSIifSl9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxpPWVbMV07cmV0dXJuIDMqKG4raSkvNC1pfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWModCksaT1uWzBdLHM9blsxXSxhPW5ldyBvKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsaSxzKSksdT0wLGg9cz4wP2ktNDppLGw9MDtsPGg7bCs9NCllPXJbdC5jaGFyQ29kZUF0KGwpXTw8MTh8clt0LmNoYXJDb2RlQXQobCsxKV08PDEyfHJbdC5jaGFyQ29kZUF0KGwrMildPDw2fHJbdC5jaGFyQ29kZUF0KGwrMyldLGFbdSsrXT1lPj4xNiYyNTUsYVt1KytdPWU+PjgmMjU1LGFbdSsrXT0yNTUmZTsyPT09cyYmKGU9clt0LmNoYXJDb2RlQXQobCldPDwyfHJbdC5jaGFyQ29kZUF0KGwrMSldPj40LGFbdSsrXT0yNTUmZSk7MT09PXMmJihlPXJbdC5jaGFyQ29kZUF0KGwpXTw8MTB8clt0LmNoYXJDb2RlQXQobCsxKV08PDR8clt0LmNoYXJDb2RlQXQobCsyKV0+PjIsYVt1KytdPWU+PjgmMjU1LGFbdSsrXT0yNTUmZSk7cmV0dXJuIGF9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aCxyPW4lMyxvPVtdLHM9MCxhPW4tcjtzPGE7cys9MTYzODMpby5wdXNoKGgodCxzLHMrMTYzODM+YT9hOnMrMTYzODMpKTsxPT09cj8oZT10W24tMV0sby5wdXNoKGlbZT4+Ml0raVtlPDw0JjYzXSsiPT0iKSk6Mj09PXImJihlPSh0W24tMl08PDgpK3Rbbi0xXSxvLnB1c2goaVtlPj4xMF0raVtlPj40JjYzXStpW2U8PDImNjNdKyI9IikpO3JldHVybiBvLmpvaW4oIiIpfTtmb3IodmFyIGk9W10scj1bXSxvPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LHM9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGE9MCx1PXMubGVuZ3RoO2E8dTsrK2EpaVthXT1zW2FdLHJbcy5jaGFyQ29kZUF0KGEpXT1hO2Z1bmN0aW9uIGModCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49dC5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj1lKSxbbixuPT09ZT8wOjQtbiU0XX1mdW5jdGlvbiBoKHQsZSxuKXtmb3IodmFyIHIsbyxzPVtdLGE9ZTthPG47YSs9MylyPSh0W2FdPDwxNiYxNjcxMTY4MCkrKHRbYSsxXTw8OCY2NTI4MCkrKDI1NSZ0W2ErMl0pLHMucHVzaChpWyhvPXIpPj4xOCY2M10raVtvPj4xMiY2M10raVtvPj42JjYzXStpWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1yWyItIi5jaGFyQ29kZUF0KDApXT02MixyWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7dmFyIGU7dC5nZXRSYW5kb21WYWx1ZXM9KGU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuY3J5cHRvfHx3aW5kb3cubXNDcnlwdG8pfHxuKDE0NSl8fG51bGwpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRSYW5kb21WYWx1ZXM/ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0UmFuZG9tVmFsdWVzKHQpfTplJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yYW5kb21GaWxsU3luYz9mdW5jdGlvbih0KXtyZXR1cm4gZS5yYW5kb21GaWxsU3luYyh0KX06ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmFuZG9tQnl0ZXM/ZnVuY3Rpb24odCl7Zm9yKHZhciBuPWUucmFuZG9tQnl0ZXModC5sZW5ndGgpLGk9MCxyPW4ubGVuZ3RoO2k8cjsrK2kpdFtpXT1uW2ldfTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTAsaT10Lmxlbmd0aDtuPGk7KytuKW4lND09MCYmKGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpPj4+MCksdFtuXT0yNTUmZSxlPj4+PTh9fShlLlJhbmRvbXx8KGUuUmFuZG9tPXt9KSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU5KS5UcmFuc2Zvcm07ZnVuY3Rpb24gbyh0KXtyLmNhbGwodGhpcyksdGhpcy5fYmxvY2s9aS5hbGxvY1Vuc2FmZSh0KSx0aGlzLl9ibG9ja1NpemU9dCx0aGlzLl9ibG9ja09mZnNldD0wLHRoaXMuX2xlbmd0aD1bMCwwLDAsMF0sdGhpcy5fZmluYWxpemVkPSExfW4oMCkobyxyKSxvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1udWxsO3RyeXt0aGlzLnVwZGF0ZSh0LGUpfWNhdGNoKHQpe2k9dH1uKGkpfSxvLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbDt0cnl7dGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpfWNhdGNoKHQpe2U9dH10KGUpfSxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtpZihmdW5jdGlvbih0LGUpe2lmKCFpLmlzQnVmZmVyKHQpJiYic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihlKyIgbXVzdCBiZSBhIHN0cmluZyBvciBhIGJ1ZmZlciIpfSh0LCJEYXRhIiksdGhpcy5fZmluYWxpemVkKXRocm93IG5ldyBFcnJvcigiRGlnZXN0IGFscmVhZHkgY2FsbGVkIik7aS5pc0J1ZmZlcih0KXx8KHQ9aS5mcm9tKHQsZSkpO2Zvcih2YXIgbj10aGlzLl9ibG9jayxyPTA7dGhpcy5fYmxvY2tPZmZzZXQrdC5sZW5ndGgtcj49dGhpcy5fYmxvY2tTaXplOyl7Zm9yKHZhciBvPXRoaXMuX2Jsb2NrT2Zmc2V0O288dGhpcy5fYmxvY2tTaXplOyluW28rK109dFtyKytdO3RoaXMuX3VwZGF0ZSgpLHRoaXMuX2Jsb2NrT2Zmc2V0PTB9Zm9yKDtyPHQubGVuZ3RoOyluW3RoaXMuX2Jsb2NrT2Zmc2V0KytdPXRbcisrXTtmb3IodmFyIHM9MCxhPTgqdC5sZW5ndGg7YT4wOysrcyl0aGlzLl9sZW5ndGhbc10rPWEsKGE9dGhpcy5fbGVuZ3RoW3NdLzQyOTQ5NjcyOTZ8MCk+MCYmKHRoaXMuX2xlbmd0aFtzXS09NDI5NDk2NzI5NiphKTtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sby5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2ZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBhbHJlYWR5IGNhbGxlZCIpO3RoaXMuX2ZpbmFsaXplZD0hMDt2YXIgZT10aGlzLl9kaWdlc3QoKTt2b2lkIDAhPT10JiYoZT1lLnRvU3RyaW5nKHQpKSx0aGlzLl9ibG9jay5maWxsKDApLHRoaXMuX2Jsb2NrT2Zmc2V0PTA7Zm9yKHZhciBuPTA7bjw0Oysrbil0aGlzLl9sZW5ndGhbbl09MDtyZXR1cm4gZX0sby5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX2RpZ2VzdCBpcyBub3QgaW1wbGVtZW50ZWQiKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUsaSl7dmFyIHI9big0Myk7dC5leHBvcnRzPXk7dmFyIG8scz1uKDgzKTt5LlJlYWRhYmxlU3RhdGU9YjtuKDYwKS5FdmVudEVtaXR0ZXI7dmFyIGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSx1PW4oODYpLGM9bigxKS5CdWZmZXIsaD1lLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgbD1uKDMyKTtsLmluaGVyaXRzPW4oMCk7dmFyIGQ9bigxNDcpLGY9dm9pZCAwO2Y9ZCYmZC5kZWJ1Z2xvZz9kLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbigpe307dmFyIHAsbT1uKDE0OCksZz1uKDg3KTtsLmluaGVyaXRzKHksdSk7dmFyIHY9WyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl07ZnVuY3Rpb24gYih0LGUpe3Q9dHx8e307dmFyIGk9ZSBpbnN0YW5jZW9mKG89b3x8bigyNCkpO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLHM9dC5yZWFkYWJsZUhpZ2hXYXRlck1hcmssYT10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6aSYmKHN8fDA9PT1zKT9zOmEsdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmJ1ZmZlcj1uZXcgbSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYocHx8KHA9big2MykuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBwKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24geSh0KXtpZihvPW98fG4oMjQpLCEodGhpcyBpbnN0YW5jZW9mIHkpKXJldHVybiBuZXcgeSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBiKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpKSx1LmNhbGwodGhpcyl9ZnVuY3Rpb24gXyh0LGUsbixpLHIpe3ZhciBvLHM9dC5fcmVhZGFibGVTdGF0ZTtudWxsPT09ZT8ocy5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgbj1lLmRlY29kZXIuZW5kKCk7biYmbi5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKG4pLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aCl9ZS5lbmRlZD0hMCxTKHQpfSh0LHMpKToocnx8KG89ZnVuY3Rpb24odCxlKXt2YXIgbjtpPWUsYy5pc0J1ZmZlcihpKXx8aSBpbnN0YW5jZW9mIGh8fCJzdHJpbmciPT10eXBlb2YgZXx8dm9pZCAwPT09ZXx8dC5vYmplY3RNb2RlfHwobj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3ZhciBpO3JldHVybiBufShzLGUpKSxvP3QuZW1pdCgiZXJyb3IiLG8pOnMub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MD8oInN0cmluZyI9PXR5cGVvZiBlfHxzLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PWMucHJvdG90eXBlfHwoZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5mcm9tKHQpfShlKSksaT9zLmVuZEVtaXR0ZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTp3KHQscyxlLCEwKTpzLmVuZGVkP3QuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSk6KHMucmVhZGluZz0hMSxzLmRlY29kZXImJiFuPyhlPXMuZGVjb2Rlci53cml0ZShlKSxzLm9iamVjdE1vZGV8fDAhPT1lLmxlbmd0aD93KHQscyxlLCExKTpBKHQscykpOncodCxzLGUsITEpKSk6aXx8KHMucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KHMpfWZ1bmN0aW9uIHcodCxlLG4saSl7ZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsbiksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChuKTplLmJ1ZmZlci5wdXNoKG4pLGUubmVlZFJlYWRhYmxlJiZTKHQpKSxBKHQsZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHkucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSkseS5wcm90b3R5cGUuZGVzdHJveT1nLmRlc3Ryb3kseS5wcm90b3R5cGUuX3VuZGVzdHJveT1nLnVuZGVzdHJveSx5LnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSxlKHQpfSx5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBpLm9iamVjdE1vZGU/bj0hMDoic3RyaW5nIj09dHlwZW9mIHQmJigoZT1lfHxpLmRlZmF1bHRFbmNvZGluZykhPT1pLmVuY29kaW5nJiYodD1jLmZyb20odCxlKSxlPSIiKSxuPSEwKSxfKHRoaXMsdCxlLCExLG4pfSx5LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBfKHRoaXMsdCxudWxsLCEwLCExKX0seS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30seS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHB8fChwPW4oNjMpLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgcCh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIHg9ODM4ODYwODtmdW5jdGlvbiBNKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49eD90PXg6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gUyh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoZigiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9yLm5leHRUaWNrKEUsdCk6RSh0KSl9ZnVuY3Rpb24gRSh0KXtmKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLFAodCl9ZnVuY3Rpb24gQSh0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLHIubmV4dFRpY2soQyx0LGUpKX1mdW5jdGlvbiBDKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihmKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxuIT09ZS5sZW5ndGgpOyluPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gayh0KXtmKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gTyh0LGUpe2UucmVhZGluZ3x8KGYoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksUCh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBQKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGYoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gVCh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP249ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KG49ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6bj1mdW5jdGlvbih0LGUsbil7dmFyIGk7dDxlLmhlYWQuZGF0YS5sZW5ndGg/KGk9ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6aT10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpuP2Z1bmN0aW9uKHQsZSl7dmFyIG49ZS5oZWFkLGk9MSxyPW4uZGF0YTt0LT1yLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHM9PT1vLmxlbmd0aD9yKz1vOnIrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIG49Yy5hbGxvY1Vuc2FmZSh0KSxpPWUuaGVhZCxyPTE7aS5kYXRhLmNvcHkobiksdC09aS5kYXRhLmxlbmd0aDtmb3IoO2k9aS5uZXh0Oyl7dmFyIG89aS5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShuLG4ubGVuZ3RoLXQsMCxzKSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsrcixpLm5leHQ/ZS5oZWFkPWkubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9aSxpLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytyfXJldHVybiBlLmxlbmd0aC09cixufSh0LGUpO3JldHVybiBpfSh0LGUuYnVmZmVyLGUuZGVjb2Rlciksbik7dmFyIG59ZnVuY3Rpb24gaih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHIubmV4dFRpY2soSSxlLHQpKX1mdW5jdGlvbiBJKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBMKHQsZSl7Zm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfXkucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7ZigicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLG49dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gZigicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/aih0aGlzKTpTKHRoaXMpLG51bGw7aWYoMD09PSh0PU0odCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmaih0aGlzKSxudWxsO3ZhciBpLHI9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGYoIm5lZWQgcmVhZGFibGUiLHIpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmZigibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLHI9ITApLGUuZW5kZWR8fGUucmVhZGluZz9mKCJyZWFkaW5nIG9yIGVuZGVkIixyPSExKTpyJiYoZigiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1NKG4sZSkpKSxudWxsPT09KGk9dD4wP1QodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLG4hPT10JiZlLmVuZGVkJiZqKHRoaXMpKSxudWxsIT09aSYmdGhpcy5lbWl0KCJkYXRhIixpKSxpfSx5LnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSx5LnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG8ucGlwZXNDb3VudCl7Y2FzZSAwOm8ucGlwZXM9dDticmVhaztjYXNlIDE6by5waXBlcz1bby5waXBlcyx0XTticmVhaztkZWZhdWx0Om8ucGlwZXMucHVzaCh0KX1vLnBpcGVzQ291bnQrPTEsZigicGlwZSBjb3VudD0lZCBvcHRzPSVqIixvLnBpcGVzQ291bnQsZSk7dmFyIHU9KCFlfHwhMSE9PWUuZW5kKSYmdCE9PWkuc3Rkb3V0JiZ0IT09aS5zdGRlcnI/aDp5O2Z1bmN0aW9uIGMoZSxpKXtmKCJvbnVucGlwZSIpLGU9PT1uJiZpJiYhMT09PWkuaGFzVW5waXBlZCYmKGkuaGFzVW5waXBlZD0hMCxmKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHYpLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsYiksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGwpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixnKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLGMpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsaCksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIix5KSxuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixtKSxkPSEwLCFvLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8bCgpKX1mdW5jdGlvbiBoKCl7Zigib25lbmQiKSx0LmVuZCgpfW8uZW5kRW1pdHRlZD9yLm5leHRUaWNrKHUpOm4ub25jZSgiZW5kIix1KSx0Lm9uKCJ1bnBpcGUiLGMpO3ZhciBsPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZigicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZhKHQsImRhdGEiKSYmKGUuZmxvd2luZz0hMCxQKHQpKX19KG4pO3Qub24oImRyYWluIixsKTt2YXIgZD0hMTt2YXIgcD0hMTtmdW5jdGlvbiBtKGUpe2YoIm9uZGF0YSIpLHA9ITEsITEhPT10LndyaXRlKGUpfHxwfHwoKDE9PT1vLnBpcGVzQ291bnQmJm8ucGlwZXM9PT10fHxvLnBpcGVzQ291bnQ+MSYmLTEhPT1MKG8ucGlwZXMsdCkpJiYhZCYmKGYoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsbi5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxuLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxwPSEwKSxuLnBhdXNlKCkpfWZ1bmN0aW9uIGcoZSl7Zigib25lcnJvciIsZSkseSgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixnKSwwPT09YSh0LCJlcnJvciIpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiB2KCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixiKSx5KCl9ZnVuY3Rpb24gYigpe2YoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHYpLHkoKX1mdW5jdGlvbiB5KCl7ZigidW5waXBlIiksbi51bnBpcGUodCl9cmV0dXJuIG4ub24oImRhdGEiLG0pLGZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUsbik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/cyh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KG4pOnQuX2V2ZW50c1tlXT1bbix0Ll9ldmVudHNbZV1dOnQub24oZSxuKX0odCwiZXJyb3IiLGcpLHQub25jZSgiY2xvc2UiLHYpLHQub25jZSgiZmluaXNoIixiKSx0LmVtaXQoInBpcGUiLG4pLG8uZmxvd2luZ3x8KGYoInBpcGUgcmVzdW1lIiksbi5yZXN1bWUoKSksdH0seS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsbj17aGFzVW5waXBlZDohMX07aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlcz90aGlzOih0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzLG4pLHRoaXMpO2lmKCF0KXt2YXIgaT1lLnBpcGVzLHI9ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBvPTA7bzxyO28rKylpW29dLmVtaXQoInVucGlwZSIsdGhpcyxuKTtyZXR1cm4gdGhpc312YXIgcz1MKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1zP3RoaXM6KGUucGlwZXMuc3BsaWNlKHMsMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzLG4pLHRoaXMpfSx5LnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciBuPXUucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLmVuZEVtaXR0ZWR8fGkucmVhZGFibGVMaXN0ZW5pbmd8fChpLnJlYWRhYmxlTGlzdGVuaW5nPWkubmVlZFJlYWRhYmxlPSEwLGkuZW1pdHRlZFJlYWRhYmxlPSExLGkucmVhZGluZz9pLmxlbmd0aCYmUyh0aGlzKTpyLm5leHRUaWNrKGssdGhpcykpfXJldHVybiBufSx5LnByb3RvdHlwZS5hZGRMaXN0ZW5lcj15LnByb3RvdHlwZS5vbix5LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChmKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHIubmV4dFRpY2soTyx0LGUpKX0odGhpcyx0KSksdGhpc30seS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gZigiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoZigicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSx5LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlLGk9ITE7Zm9yKHZhciByIGluIHQub24oImVuZCIsZnVuY3Rpb24oKXtpZihmKCJ3cmFwcGVkIGVuZCIpLG4uZGVjb2RlciYmIW4uZW5kZWQpe3ZhciB0PW4uZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmZS5wdXNoKHQpfWUucHVzaChudWxsKX0pLHQub24oImRhdGEiLGZ1bmN0aW9uKHIpeyhmKCJ3cmFwcGVkIGRhdGEiKSxuLmRlY29kZXImJihyPW4uZGVjb2Rlci53cml0ZShyKSksbi5vYmplY3RNb2RlJiZudWxsPT1yKXx8KG4ub2JqZWN0TW9kZXx8ciYmci5sZW5ndGgpJiYoZS5wdXNoKHIpfHwoaT0hMCx0LnBhdXNlKCkpKX0pLHQpdm9pZCAwPT09dGhpc1tyXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0mJih0aGlzW3JdPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KHIpKTtmb3IodmFyIG89MDtvPHYubGVuZ3RoO28rKyl0Lm9uKHZbb10sdGhpcy5lbWl0LmJpbmQodGhpcyx2W29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24oZSl7Zigid3JhcHBlZCBfcmVhZCIsZSksaSYmKGk9ITEsdC5yZXN1bWUoKSl9LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LnByb3RvdHlwZSwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLHkuX2Zyb21MaXN0PVR9KS5jYWxsKHRoaXMsbigxMyksbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjApLkV2ZW50RW1pdHRlcn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDQzKTtmdW5jdGlvbiByKHQsZSl7dC5lbWl0KCJlcnJvciIsZSl9dC5leHBvcnRzPXtkZXN0cm95OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLHM9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG98fHM/KGU/ZSh0KTohdHx8dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fGkubmV4dFRpY2socix0aGlzLHQpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveSh0fHxudWxsLGZ1bmN0aW9uKHQpeyFlJiZ0PyhpLm5leHRUaWNrKHIsbix0KSxuLl93cml0YWJsZVN0YXRlJiYobi5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITApKTplJiZlKHQpfSksdGhpcyl9LHVuZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPXM7dmFyIGk9bigyNCkscj1uKDMyKTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIndyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1lJiZ0aGlzLnB1c2goZSksaSh0KTt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3IucmVhZGluZz0hMSwoci5uZWVkUmVhZGFibGV8fHIubGVuZ3RoPHIuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoci5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBzKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHMpKXJldHVybiBuZXcgcyh0KTtpLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06by5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixhKX1mdW5jdGlvbiBhKCl7dmFyIHQ9dGhpczsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goZnVuY3Rpb24oZSxuKXt1KHQsZSxuKX0pOnUodGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIHUodCxlLG4pe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO2lmKG51bGwhPW4mJnQucHVzaChuKSx0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKHQuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfXIuaW5oZXJpdHM9bigwKSxyLmluaGVyaXRzKHMsaSkscy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLGkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LHMucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3Rocm93IG5ldyBFcnJvcigiX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxzLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKGkud3JpdGVjYj1uLGkud3JpdGVjaHVuaz10LGkud3JpdGVlbmNvZGluZz1lLCFpLnRyYW5zZm9ybWluZyl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTsoaS5uZWVkVHJhbnNmb3JtfHxyLm5lZWRSZWFkYWJsZXx8ci5sZW5ndGg8ci5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChyLmhpZ2hXYXRlck1hcmspfX0scy5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LHMucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsdCxmdW5jdGlvbih0KXtlKHQpLG4uZW1pdCgiY2xvc2UiKX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDI4KSxvPW4oMSkuQnVmZmVyLHM9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0sYT1uZXcgQXJyYXkoNjQpO2Z1bmN0aW9uIHUoKXt0aGlzLmluaXQoKSx0aGlzLl93PWEsci5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGModCxlLG4pe3JldHVybiBuXnQmKGVebil9ZnVuY3Rpb24gaCh0LGUsbil7cmV0dXJuIHQmZXxuJih0fGUpfWZ1bmN0aW9uIGwodCl7cmV0dXJuKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKX1mdW5jdGlvbiBkKHQpe3JldHVybih0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KX1mdW5jdGlvbiBmKHQpe3JldHVybih0Pj4+N3x0PDwyNSleKHQ+Pj4xOHx0PDwxNCledD4+PjN9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzc5MDMzNzAzLHRoaXMuX2I9MzE0NDEzNDI3Nyx0aGlzLl9jPTEwMTM5MDQyNDIsdGhpcy5fZD0yNzczNDgwNzYyLHRoaXMuX2U9MTM1OTg5MzExOSx0aGlzLl9mPTI2MDA4MjI5MjQsdGhpcy5fZz01Mjg3MzQ2MzUsdGhpcy5faD0xNTQxNDU5MjI1LHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxpPTB8dGhpcy5fYSxyPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxhPTB8dGhpcy5fZCx1PTB8dGhpcy5fZSxwPTB8dGhpcy5fZixtPTB8dGhpcy5fZyxnPTB8dGhpcy5faCx2PTA7djwxNjsrK3Ypblt2XT10LnJlYWRJbnQzMkJFKDQqdik7Zm9yKDt2PDY0OysrdiluW3ZdPTB8KCgoZT1uW3YtMl0pPj4+MTd8ZTw8MTUpXihlPj4+MTl8ZTw8MTMpXmU+Pj4xMCkrblt2LTddK2Yoblt2LTE1XSkrblt2LTE2XTtmb3IodmFyIGI9MDtiPDY0OysrYil7dmFyIHk9ZytkKHUpK2ModSxwLG0pK3NbYl0rbltiXXwwLF89bChpKStoKGkscixvKXwwO2c9bSxtPXAscD11LHU9YSt5fDAsYT1vLG89cixyPWksaT15K198MH10aGlzLl9hPWkrdGhpcy5fYXwwLHRoaXMuX2I9cit0aGlzLl9ifDAsdGhpcy5fYz1vK3RoaXMuX2N8MCx0aGlzLl9kPWErdGhpcy5fZHwwLHRoaXMuX2U9dSt0aGlzLl9lfDAsdGhpcy5fZj1wK3RoaXMuX2Z8MCx0aGlzLl9nPW0rdGhpcy5fZ3wwLHRoaXMuX2g9Zyt0aGlzLl9ofDB9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9by5hbGxvY1Vuc2FmZSgzMik7cmV0dXJuIHQud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCksdC53cml0ZUludDMyQkUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2gsMjgpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMjgpLG89bigxKS5CdWZmZXIscz1bMTExNjM1MjQwOCwzNjA5NzY3NDU4LDE4OTk0NDc0NDEsNjAyODkxNzI1LDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSwzOTIxMDA5NTczLDIxNzMyOTU1NDgsOTYxOTg3MTYzLDQwODE2Mjg0NzIsMTUwODk3MDk5MywzMDUzODM0MjY1LDI0NTM2MzU3NDgsMjkzNzY3MTU3OSwyODcwNzYzMjIxLDM2NjQ2MDk1NjAsMzYyNDM4MTA4MCwyNzM0ODgzMzk0LDMxMDU5ODQwMSwxMTY0OTk2NTQyLDYwNzIyNTI3OCwxMzIzNjEwNzY0LDE0MjY4ODE5ODcsMzU5MDMwNDk5NCwxOTI1MDc4Mzg4LDQwNjgxODIzODMsMjE2MjA3ODIwNiw5OTEzMzYxMTMsMjYxNDg4ODEwMyw2MzM4MDMzMTcsMzI0ODIyMjU4MCwzNDc5Nzc0ODY4LDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCw0MDIyMjI0Nzc0LDk0NDcxMTEzOSwyNjQzNDcwNzgsMjM0MTI2Mjc3Myw2MDQ4MDc2MjgsMjAwNzgwMDkzMyw3NzAyNTU5ODMsMTQ5NTk5MDkwMSwxMjQ5MTUwMTIyLDE4NTY0MzEyMzUsMTU1NTA4MTY5MiwzMTc1MjE4MTMyLDE5OTYwNjQ5ODYsMjE5ODk1MDgzNywyNTU0MjIwODgyLDM5OTk3MTkzMzksMjgyMTgzNDM0OSw3NjY3ODQwMTYsMjk1Mjk5NjgwOCwyNTY2NTk0ODc5LDMyMTAzMTM2NzEsMzIwMzMzNzk1NiwzMzM2NTcxODkxLDEwMzQ0NTcwMjYsMzU4NDUyODcxMSwyNDY2OTQ4OTAxLDExMzkyNjk5MywzNzU4MzI2MzgzLDMzODI0MTg5NSwxNjg3MTc5MzYsNjY2MzA3MjA1LDExODgxNzk5NjQsNzczNTI5OTEyLDE1NDYwNDU3MzQsMTI5NDc1NzM3MiwxNTIyODA1NDg1LDEzOTYxODIyOTEsMjY0MzgzMzgyMywxNjk1MTgzNzAwLDIzNDM1MjczOTAsMTk4NjY2MTA1MSwxMDE0NDc3NDgwLDIxNzcwMjYzNTAsMTIwNjc1OTE0MiwyNDU2OTU2MDM3LDM0NDA3NzYyNywyNzMwNDg1OTIxLDEyOTA4NjM0NjAsMjgyMDMwMjQxMSwzMTU4NDU0MjczLDMyNTk3MzA4MDAsMzUwNTk1MjY1NywzMzQ1NzY0NzcxLDEwNjIxNzAwOCwzNTE2MDY1ODE3LDM2MDYwMDgzNDQsMzYwMDM1MjgwNCwxNDMyNzI1Nzc2LDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCwyNzU0MjMzNDQsODUxMTY5NzIwLDQzMDIyNzczNCwzMTAwODIzNzUyLDUwNjk0ODYxNiwxMzYzMjU4MTk1LDY1OTA2MDU1NiwzNzUwNjg1NTkzLDg4Mzk5Nzg3NywzNzg1MDUwMjgwLDk1ODEzOTU3MSwzMzE4MzA3NDI3LDEzMjI4MjIyMTgsMzgxMjcyMzQwMywxNTM3MDAyMDYzLDIwMDMwMzQ5OTUsMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5LDE5NTU1NjIyMjIsMTU3NTk5MDAxMiwyMDI0MTA0ODE1LDExMjU1OTI5MjgsMjIyNzczMDQ1MiwyNzE2OTA0MzA2LDIzNjE4NTI0MjQsNDQyNzc2MDQ0LDI0Mjg0MzY0NzQsNTkzNjk4MzQ0LDI3NTY3MzQxODcsMzczMzExMDI0OSwzMjA0MDMxNDc5LDI5OTkzNTE1NzMsMzMyOTMyNTI5OCwzODE1OTIwNDI3LDMzOTE1Njk2MTQsMzkyODM4MzkwMCwzNTE1MjY3MjcxLDU2NjI4MDcxMSwzOTQwMTg3NjA2LDM0NTQwNjk1MzQsNDExODYzMDI3MSw0MDAwMjM5OTkyLDExNjQxODQ3NCwxOTE0MTM4NTU0LDE3NDI5MjQyMSwyNzMxMDU1MjcwLDI4OTM4MDM1NiwzMjAzOTkzMDA2LDQ2MDM5MzI2OSwzMjA2MjAzMTUsNjg1NDcxNzMzLDU4NzQ5NjgzNiw4NTIxNDI5NzEsMTA4Njc5Mjg1MSwxMDE3MDM2Mjk4LDM2NTU0MzEwMCwxMTI2MDAwNTgwLDI2MTgyOTc2NzYsMTI4ODAzMzQ3MCwzNDA5ODU1MTU4LDE1MDE1MDU5NDgsNDIzNDUwOTg2NiwxNjA3MTY3OTE1LDk4NzE2NzQ2OCwxODE2NDAyMzE2LDEyNDYxODk1OTFdLGE9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxyLmNhbGwodGhpcywxMjgsMTEyKX1mdW5jdGlvbiBjKHQsZSxuKXtyZXR1cm4gbl50JihlXm4pfWZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiB0JmV8biYodHxlKX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuKHQ+Pj4yOHxlPDw0KV4oZT4+PjJ8dDw8MzApXihlPj4+N3x0PDwyNSl9ZnVuY3Rpb24gZCh0LGUpe3JldHVybih0Pj4+MTR8ZTw8MTgpXih0Pj4+MTh8ZTw8MTQpXihlPj4+OXx0PDwyMyl9ZnVuY3Rpb24gZih0LGUpe3JldHVybih0Pj4+MXxlPDwzMSleKHQ+Pj44fGU8PDI0KV50Pj4+N31mdW5jdGlvbiBwKHQsZSl7cmV0dXJuKHQ+Pj4xfGU8PDMxKV4odD4+Pjh8ZTw8MjQpXih0Pj4+N3xlPDwyNSl9ZnVuY3Rpb24gbSh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyledD4+PjZ9ZnVuY3Rpb24gZyh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyleKHQ+Pj42fGU8PDI2KX1mdW5jdGlvbiB2KHQsZSl7cmV0dXJuIHQ+Pj4wPGU+Pj4wPzE6MH1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0xNzc5MDMzNzAzLHRoaXMuX2JoPTMxNDQxMzQyNzcsdGhpcy5fY2g9MTAxMzkwNDI0Mix0aGlzLl9kaD0yNzczNDgwNzYyLHRoaXMuX2VoPTEzNTk4OTMxMTksdGhpcy5fZmg9MjYwMDgyMjkyNCx0aGlzLl9naD01Mjg3MzQ2MzUsdGhpcy5faGg9MTU0MTQ1OTIyNSx0aGlzLl9hbD00MDg5MjM1NzIwLHRoaXMuX2JsPTIyMjc4NzM1OTUsdGhpcy5fY2w9NDI3MTE3NTcyMyx0aGlzLl9kbD0xNTk1NzUwMTI5LHRoaXMuX2VsPTI5MTc1NjUxMzcsdGhpcy5fZmw9NzI1NTExMTk5LHRoaXMuX2dsPTQyMTUzODk1NDcsdGhpcy5faGw9MzI3MDMzMjA5LHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3csbj0wfHRoaXMuX2FoLGk9MHx0aGlzLl9iaCxyPTB8dGhpcy5fY2gsbz0wfHRoaXMuX2RoLGE9MHx0aGlzLl9laCx1PTB8dGhpcy5fZmgsYj0wfHRoaXMuX2doLHk9MHx0aGlzLl9oaCxfPTB8dGhpcy5fYWwsdz0wfHRoaXMuX2JsLHg9MHx0aGlzLl9jbCxNPTB8dGhpcy5fZGwsUz0wfHRoaXMuX2VsLEU9MHx0aGlzLl9mbCxBPTB8dGhpcy5fZ2wsQz0wfHRoaXMuX2hsLGs9MDtrPDMyO2srPTIpZVtrXT10LnJlYWRJbnQzMkJFKDQqayksZVtrKzFdPXQucmVhZEludDMyQkUoNCprKzQpO2Zvcig7azwxNjA7ays9Mil7dmFyIE89ZVtrLTMwXSxQPWVbay0zMCsxXSxUPWYoTyxQKSxqPXAoUCxPKSxJPW0oTz1lW2stNF0sUD1lW2stNCsxXSksTD1nKFAsTyksQj1lW2stMTRdLEQ9ZVtrLTE0KzFdLFI9ZVtrLTMyXSx6PWVbay0zMisxXSxOPWorRHwwLFc9VCtCK3YoTixqKXwwO1c9KFc9VytJK3YoTj1OK0x8MCxMKXwwKStSK3YoTj1OK3p8MCx6KXwwLGVba109VyxlW2srMV09Tn1mb3IodmFyIHE9MDtxPDE2MDtxKz0yKXtXPWVbcV0sTj1lW3ErMV07dmFyIEg9aChuLGksciksRj1oKF8sdyx4KSxWPWwobixfKSxVPWwoXyxuKSxLPWQoYSxTKSxZPWQoUyxhKSxYPXNbcV0sJD1zW3ErMV0sRz1jKGEsdSxiKSxKPWMoUyxFLEEpLFo9QytZfDAsUT15K0srdihaLEMpfDA7UT0oUT0oUT1RK0crdihaPVorSnwwLEopfDApK1grdihaPVorJHwwLCQpfDApK1crdihaPVorTnwwLE4pfDA7dmFyIHR0PVUrRnwwLGV0PVYrSCt2KHR0LFUpfDA7eT1iLEM9QSxiPXUsQT1FLHU9YSxFPVMsYT1vK1ErdihTPU0rWnwwLE0pfDAsbz1yLE09eCxyPWkseD13LGk9bix3PV8sbj1RK2V0K3YoXz1aK3R0fDAsWil8MH10aGlzLl9hbD10aGlzLl9hbCtffDAsdGhpcy5fYmw9dGhpcy5fYmwrd3wwLHRoaXMuX2NsPXRoaXMuX2NsK3h8MCx0aGlzLl9kbD10aGlzLl9kbCtNfDAsdGhpcy5fZWw9dGhpcy5fZWwrU3wwLHRoaXMuX2ZsPXRoaXMuX2ZsK0V8MCx0aGlzLl9nbD10aGlzLl9nbCtBfDAsdGhpcy5faGw9dGhpcy5faGwrQ3wwLHRoaXMuX2FoPXRoaXMuX2FoK24rdih0aGlzLl9hbCxfKXwwLHRoaXMuX2JoPXRoaXMuX2JoK2krdih0aGlzLl9ibCx3KXwwLHRoaXMuX2NoPXRoaXMuX2NoK3Irdih0aGlzLl9jbCx4KXwwLHRoaXMuX2RoPXRoaXMuX2RoK28rdih0aGlzLl9kbCxNKXwwLHRoaXMuX2VoPXRoaXMuX2VoK2Erdih0aGlzLl9lbCxTKXwwLHRoaXMuX2ZoPXRoaXMuX2ZoK3Urdih0aGlzLl9mbCxFKXwwLHRoaXMuX2doPXRoaXMuX2doK2Irdih0aGlzLl9nbCxBKXwwLHRoaXMuX2hoPXRoaXMuX2hoK3krdih0aGlzLl9obCxDKXwwfSx1LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PW8uYWxsb2NVbnNhZmUoNjQpO2Z1bmN0aW9uIGUoZSxuLGkpe3Qud3JpdGVJbnQzMkJFKGUsaSksdC53cml0ZUludDMyQkUobixpKzQpfXJldHVybiBlKHRoaXMuX2FoLHRoaXMuX2FsLDApLGUodGhpcy5fYmgsdGhpcy5fYmwsOCksZSh0aGlzLl9jaCx0aGlzLl9jbCwxNiksZSh0aGlzLl9kaCx0aGlzLl9kbCwyNCksZSh0aGlzLl9laCx0aGlzLl9lbCwzMiksZSh0aGlzLl9maCx0aGlzLl9mbCw0MCksZSh0aGlzLl9naCx0aGlzLl9nbCw0OCksZSh0aGlzLl9oaCx0aGlzLl9obCw1NiksdH0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigwKSxyPW4oMTYxKSxvPW4oMjEpLHM9bigxKS5CdWZmZXIsYT1uKDkyKSx1PW4oNjQpLGM9big2NSksaD1zLmFsbG9jKDEyOCk7ZnVuY3Rpb24gbCh0LGUpe28uY2FsbCh0aGlzLCJkaWdlc3QiKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPXMuZnJvbShlKSk7dmFyIG49InNoYTUxMiI9PT10fHwic2hhMzg0Ij09PXQ/MTI4OjY0Oyh0aGlzLl9hbGc9dCx0aGlzLl9rZXk9ZSxlLmxlbmd0aD5uKT9lPSgicm1kMTYwIj09PXQ/bmV3IHU6Yyh0KSkudXBkYXRlKGUpLmRpZ2VzdCgpOmUubGVuZ3RoPG4mJihlPXMuY29uY2F0KFtlLGhdLG4pKTtmb3IodmFyIGk9dGhpcy5faXBhZD1zLmFsbG9jVW5zYWZlKG4pLHI9dGhpcy5fb3BhZD1zLmFsbG9jVW5zYWZlKG4pLGE9MDthPG47YSsrKWlbYV09NTReZVthXSxyW2FdPTkyXmVbYV07dGhpcy5faGFzaD0icm1kMTYwIj09PXQ/bmV3IHU6Yyh0KSx0aGlzLl9oYXNoLnVwZGF0ZShpKX1pKGwsbyksbC5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9oYXNoLnVwZGF0ZSh0KX0sbC5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faGFzaC5kaWdlc3QoKTtyZXR1cm4oInJtZDE2MCI9PT10aGlzLl9hbGc/bmV3IHU6Yyh0aGlzLl9hbGcpKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKHQpLmRpZ2VzdCgpfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4icm1kMTYwIj09PSh0PXQudG9Mb3dlckNhc2UoKSl8fCJyaXBlbWQxNjAiPT09dD9uZXcgbCgicm1kMTYwIixlKToibWQ1Ij09PXQ/bmV3IHIoYSxlKTpuZXcgbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4obmV3IGkpLnVwZGF0ZSh0KS5kaWdlc3QoKX19LGZ1bmN0aW9uKHQpe3QuZXhwb3J0cz17c2hhMjI0V2l0aFJTQUVuY3J5cHRpb246e3NpZ246InJzYSIsaGFzaDoic2hhMjI0IixpZDoiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMifSwiUlNBLVNIQTIyNCI6e3NpZ246ImVjZHNhL3JzYSIsaGFzaDoic2hhMjI0IixpZDoiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMifSxzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbjp7c2lnbjoicnNhIixoYXNoOiJzaGEyNTYiLGlkOiIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCJ9LCJSU0EtU0hBMjU2Ijp7c2lnbjoiZWNkc2EvcnNhIixoYXNoOiJzaGEyNTYiLGlkOiIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCJ9LHNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uOntzaWduOiJyc2EiLGhhc2g6InNoYTM4NCIsaWQ6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sIlJTQS1TSEEzODQiOntzaWduOiJlY2RzYS9yc2EiLGhhc2g6InNoYTM4NCIsaWQ6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sc2hhNTEyV2l0aFJTQUVuY3J5cHRpb246e3NpZ246InJzYSIsaGFzaDoic2hhNTEyIixpZDoiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAifSwiUlNBLVNIQTUxMiI6e3NpZ246ImVjZHNhL3JzYSIsaGFzaDoic2hhNTEyIixpZDoiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAifSwiUlNBLVNIQTEiOntzaWduOiJyc2EiLGhhc2g6InNoYTEiLGlkOiIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTQifSwiZWNkc2Etd2l0aC1TSEExIjp7c2lnbjoiZWNkc2EiLGhhc2g6InNoYTEiLGlkOiIifSxzaGEyNTY6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEyNTYiLGlkOiIifSxzaGEyMjQ6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEyMjQiLGlkOiIifSxzaGEzODQ6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEzODQiLGlkOiIifSxzaGE1MTI6e3NpZ246ImVjZHNhIixoYXNoOiJzaGE1MTIiLGlkOiIifSwiRFNBLVNIQSI6e3NpZ246ImRzYSIsaGFzaDoic2hhMSIsaWQ6IiJ9LCJEU0EtU0hBMSI6e3NpZ246ImRzYSIsaGFzaDoic2hhMSIsaWQ6IiJ9LERTQTp7c2lnbjoiZHNhIixoYXNoOiJzaGExIixpZDoiIn0sIkRTQS1XSVRILVNIQTIyNCI6e3NpZ246ImRzYSIsaGFzaDoic2hhMjI0IixpZDoiIn0sIkRTQS1TSEEyMjQiOntzaWduOiJkc2EiLGhhc2g6InNoYTIyNCIsaWQ6IiJ9LCJEU0EtV0lUSC1TSEEyNTYiOntzaWduOiJkc2EiLGhhc2g6InNoYTI1NiIsaWQ6IiJ9LCJEU0EtU0hBMjU2Ijp7c2lnbjoiZHNhIixoYXNoOiJzaGEyNTYiLGlkOiIifSwiRFNBLVdJVEgtU0hBMzg0Ijp7c2lnbjoiZHNhIixoYXNoOiJzaGEzODQiLGlkOiIifSwiRFNBLVNIQTM4NCI6e3NpZ246ImRzYSIsaGFzaDoic2hhMzg0IixpZDoiIn0sIkRTQS1XSVRILVNIQTUxMiI6e3NpZ246ImRzYSIsaGFzaDoic2hhNTEyIixpZDoiIn0sIkRTQS1TSEE1MTIiOntzaWduOiJkc2EiLGhhc2g6InNoYTUxMiIsaWQ6IiJ9LCJEU0EtUklQRU1EMTYwIjp7c2lnbjoiZHNhIixoYXNoOiJybWQxNjAiLGlkOiIifSxyaXBlbWQxNjBXaXRoUlNBOntzaWduOiJyc2EiLGhhc2g6InJtZDE2MCIsaWQ6IjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNCJ9LCJSU0EtUklQRU1EMTYwIjp7c2lnbjoicnNhIixoYXNoOiJybWQxNjAiLGlkOiIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTQifSxtZDVXaXRoUlNBRW5jcnlwdGlvbjp7c2lnbjoicnNhIixoYXNoOiJtZDUiLGlkOiIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjA1MDUwMDA0MTAifSwiUlNBLU1ENSI6e3NpZ246InJzYSIsaGFzaDoibWQ1IixpZDoiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwIn19fSxmdW5jdGlvbih0LGUsbil7ZS5wYmtkZjI9bigxNjMpLGUucGJrZGYyU3luYz1uKDk3KX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj1NYXRoLnBvdygyLDMwKS0xO2Z1bmN0aW9uIGkodCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIHQmJiFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IobisiIG11c3QgYmUgYSBidWZmZXIgb3Igc3RyaW5nIil9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyLG8pe2lmKGkodCwiUGFzc3dvcmQiKSxpKGUsIlNhbHQiKSwibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSXRlcmF0aW9ucyBub3QgYSBudW1iZXIiKTtpZihyPDApdGhyb3cgbmV3IFR5cGVFcnJvcigiQmFkIGl0ZXJhdGlvbnMiKTtpZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5IGxlbmd0aCBub3QgYSBudW1iZXIiKTtpZihvPDB8fG8+bnx8byE9byl0aHJvdyBuZXcgVHlwZUVycm9yKCJCYWQga2V5IGxlbmd0aCIpfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIG47ZS5icm93c2VyP249InV0Zi04IjpuPXBhcnNlSW50KGUudmVyc2lvbi5zcGxpdCgiLiIpWzBdLnNsaWNlKDEpLDEwKT49Nj8idXRmLTgiOiJiaW5hcnkiO3QuZXhwb3J0cz1ufSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oOTIpLHI9big2NCksbz1uKDY1KSxzPW4oOTUpLGE9big5NiksdT1uKDEpLkJ1ZmZlcixjPXUuYWxsb2MoMTI4KSxoPXttZDU6MTYsc2hhMToyMCxzaGEyMjQ6Mjgsc2hhMjU2OjMyLHNoYTM4NDo0OCxzaGE1MTI6NjQscm1kMTYwOjIwLHJpcGVtZDE2MDoyMH07ZnVuY3Rpb24gbCh0LGUsbil7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuInJtZDE2MCI9PT10fHwicmlwZW1kMTYwIj09PXQ/ZnVuY3Rpb24odCl7cmV0dXJuKG5ldyByKS51cGRhdGUodCkuZGlnZXN0KCl9OiJtZDUiPT09dD9pOmZ1bmN0aW9uKGUpe3JldHVybiBvKHQpLnVwZGF0ZShlKS5kaWdlc3QoKX19KHQpLGE9InNoYTUxMiI9PT10fHwic2hhMzg0Ij09PXQ/MTI4OjY0O2UubGVuZ3RoPmE/ZT1zKGUpOmUubGVuZ3RoPGEmJihlPXUuY29uY2F0KFtlLGNdLGEpKTtmb3IodmFyIGw9dS5hbGxvY1Vuc2FmZShhK2hbdF0pLGQ9dS5hbGxvY1Vuc2FmZShhK2hbdF0pLGY9MDtmPGE7ZisrKWxbZl09NTReZVtmXSxkW2ZdPTkyXmVbZl07dmFyIHA9dS5hbGxvY1Vuc2FmZShhK24rNCk7bC5jb3B5KHAsMCwwLGEpLHRoaXMuaXBhZDE9cCx0aGlzLmlwYWQyPWwsdGhpcy5vcGFkPWQsdGhpcy5hbGc9dCx0aGlzLmJsb2Nrc2l6ZT1hLHRoaXMuaGFzaD1zLHRoaXMuc2l6ZT1oW3RdfWwucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvcHkoZSx0aGlzLmJsb2Nrc2l6ZSksdGhpcy5oYXNoKGUpLmNvcHkodGhpcy5vcGFkLHRoaXMuYmxvY2tzaXplKSx0aGlzLmhhc2godGhpcy5vcGFkKX0sdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGkscil7cyh0LGUsbixpKSx1LmlzQnVmZmVyKHQpfHwodD11LmZyb20odCxhKSksdS5pc0J1ZmZlcihlKXx8KGU9dS5mcm9tKGUsYSkpO3ZhciBvPW5ldyBsKHI9cnx8InNoYTEiLHQsZS5sZW5ndGgpLGM9dS5hbGxvY1Vuc2FmZShpKSxkPXUuYWxsb2NVbnNhZmUoZS5sZW5ndGgrNCk7ZS5jb3B5KGQsMCwwLGUubGVuZ3RoKTtmb3IodmFyIGY9MCxwPWhbcl0sbT1NYXRoLmNlaWwoaS9wKSxnPTE7Zzw9bTtnKyspe2Qud3JpdGVVSW50MzJCRShnLGUubGVuZ3RoKTtmb3IodmFyIHY9by5ydW4oZCxvLmlwYWQxKSxiPXYseT0xO3k8bjt5Kyspe2I9by5ydW4oYixvLmlwYWQyKTtmb3IodmFyIF89MDtfPHA7XysrKXZbX11ePWJbX119di5jb3B5KGMsZiksZis9cH1yZXR1cm4gY319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDMzKSxyPW4oMSkuQnVmZmVyLG89big5OSk7ZnVuY3Rpb24gcyh0KXt2YXIgZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrUmF3KHQuX3ByZXYpO3JldHVybiBvKHQuX3ByZXYpLGV9ZS5lbmNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jZWlsKGUubGVuZ3RoLzE2KSxvPXQuX2NhY2hlLmxlbmd0aDt0Ll9jYWNoZT1yLmNvbmNhdChbdC5fY2FjaGUsci5hbGxvY1Vuc2FmZSgxNipuKV0pO2Zvcih2YXIgYT0wO2E8bjthKyspe3ZhciB1PXModCksYz1vKzE2KmE7dC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzBdLGMrMCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzFdLGMrNCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzJdLGMrOCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzNdLGMrMTIpfXZhciBoPXQuX2NhY2hlLnNsaWNlKDAsZS5sZW5ndGgpO3JldHVybiB0Ll9jYWNoZT10Ll9jYWNoZS5zbGljZShlLmxlbmd0aCksaShlLGgpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGg7bi0tOyl7aWYoMjU1IT09KGU9dC5yZWFkVUludDgobikpKXtlKyssdC53cml0ZVVJbnQ4KGUsbik7YnJlYWt9dC53cml0ZVVJbnQ4KDAsbil9fX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPXsiYWVzLTEyOC1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTE5Mi1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjE5MixpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTI1Ni1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTEyOC1jYmMiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDQkMiLHR5cGU6ImJsb2NrIn0sImFlcy0xOTItY2JjIjp7Y2lwaGVyOiJBRVMiLGtleToxOTIsaXY6MTYsbW9kZToiQ0JDIix0eXBlOiJibG9jayJ9LCJhZXMtMjU2LWNiYyI6e2NpcGhlcjoiQUVTIixrZXk6MjU2LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMxMjg6e2NpcGhlcjoiQUVTIixrZXk6MTI4LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMxOTI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMyNTY6e2NpcGhlcjoiQUVTIixrZXk6MjU2LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSwiYWVzLTEyOC1jZmIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDRkIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLWNmYiI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtY2ZiIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiQ0ZCIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jZmI4Ijp7Y2lwaGVyOiJBRVMiLGtleToxMjgsaXY6MTYsbW9kZToiQ0ZCOCIsdHlwZToic3RyZWFtIn0sImFlcy0xOTItY2ZiOCI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQjgiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjgiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxNixtb2RlOiJDRkI4Iix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jZmIxIjp7Y2lwaGVyOiJBRVMiLGtleToxMjgsaXY6MTYsbW9kZToiQ0ZCMSIsdHlwZToic3RyZWFtIn0sImFlcy0xOTItY2ZiMSI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQjEiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjEiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxNixtb2RlOiJDRkIxIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1vZmIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJPRkIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLW9mYiI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6Ik9GQiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtb2ZiIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiT0ZCIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jdHIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDVFIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLWN0ciI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNUUiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtY3RyIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiQ1RSIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifSwiYWVzLTE5Mi1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjE5MixpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifSwiYWVzLTI1Ni1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDQ1KSxyPW4oMSkuQnVmZmVyLG89bigyMSkscz1uKDApLGE9bigxNzgpLHU9bigzMyksYz1uKDk5KTtmdW5jdGlvbiBoKHQsZSxuLHMpe28uY2FsbCh0aGlzKTt2YXIgdT1yLmFsbG9jKDQsMCk7dGhpcy5fY2lwaGVyPW5ldyBpLkFFUyhlKTt2YXIgaD10aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHUpO3RoaXMuX2doYXNoPW5ldyBhKGgpLG49ZnVuY3Rpb24odCxlLG4pe2lmKDEyPT09ZS5sZW5ndGgpcmV0dXJuIHQuX2ZpbklEPXIuY29uY2F0KFtlLHIuZnJvbShbMCwwLDAsMV0pXSksci5jb25jYXQoW2Usci5mcm9tKFswLDAsMCwyXSldKTt2YXIgaT1uZXcgYShuKSxvPWUubGVuZ3RoLHM9byUxNjtpLnVwZGF0ZShlKSxzJiYocz0xNi1zLGkudXBkYXRlKHIuYWxsb2MocywwKSkpLGkudXBkYXRlKHIuYWxsb2MoOCwwKSk7dmFyIHU9OCpvLGg9ci5hbGxvYyg4KTtoLndyaXRlVUludEJFKHUsMCw4KSxpLnVwZGF0ZShoKSx0Ll9maW5JRD1pLnN0YXRlO3ZhciBsPXIuZnJvbSh0Ll9maW5JRCk7cmV0dXJuIGMobCksbH0odGhpcyxuLGgpLHRoaXMuX3ByZXY9ci5mcm9tKG4pLHRoaXMuX2NhY2hlPXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fc2VjQ2FjaGU9ci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PXMsdGhpcy5fYWxlbj0wLHRoaXMuX2xlbj0wLHRoaXMuX21vZGU9dCx0aGlzLl9hdXRoVGFnPW51bGwsdGhpcy5fY2FsbGVkPSExfXMoaCxvKSxoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9jYWxsZWQmJnRoaXMuX2FsZW4pe3ZhciBlPTE2LXRoaXMuX2FsZW4lMTY7ZTwxNiYmKGU9ci5hbGxvYyhlLDApLHRoaXMuX2doYXNoLnVwZGF0ZShlKSl9dGhpcy5fY2FsbGVkPSEwO3ZhciBuPXRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLHQpO3JldHVybiB0aGlzLl9kZWNyeXB0P3RoaXMuX2doYXNoLnVwZGF0ZSh0KTp0aGlzLl9naGFzaC51cGRhdGUobiksdGhpcy5fbGVuKz10Lmxlbmd0aCxufSxoLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXtpZih0aGlzLl9kZWNyeXB0JiYhdGhpcy5fYXV0aFRhZyl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSIpO3ZhciB0PXUodGhpcy5fZ2hhc2guZmluYWwoOCp0aGlzLl9hbGVuLDgqdGhpcy5fbGVuKSx0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHRoaXMuX2ZpbklEKSk7aWYodGhpcy5fZGVjcnlwdCYmZnVuY3Rpb24odCxlKXt2YXIgbj0wO3QubGVuZ3RoIT09ZS5sZW5ndGgmJm4rKztmb3IodmFyIGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLHI9MDtyPGk7KytyKW4rPXRbcl1eZVtyXTtyZXR1cm4gbn0odCx0aGlzLl9hdXRoVGFnKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSIpO3RoaXMuX2F1dGhUYWc9dCx0aGlzLl9jaXBoZXIuc2NydWIoKX0saC5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe2lmKHRoaXMuX2RlY3J5cHR8fCFyLmlzQnVmZmVyKHRoaXMuX2F1dGhUYWcpKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKTtyZXR1cm4gdGhpcy5fYXV0aFRhZ30saC5wcm90b3R5cGUuc2V0QXV0aFRhZz1mdW5jdGlvbih0KXtpZighdGhpcy5fZGVjcnlwdCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIik7dGhpcy5fYXV0aFRhZz10fSxoLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FsbGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGluZyB0byBzZXQgQUFEIGluIHVuc3VwcG9ydGVkIHN0YXRlIik7dGhpcy5fZ2hhc2gudXBkYXRlKHQpLHRoaXMuX2FsZW4rPXQubGVuZ3RofSx0LmV4cG9ydHM9aH0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNDUpLHI9bigxKS5CdWZmZXIsbz1uKDIxKTtmdW5jdGlvbiBzKHQsZSxuLHMpe28uY2FsbCh0aGlzKSx0aGlzLl9jaXBoZXI9bmV3IGkuQUVTKGUpLHRoaXMuX3ByZXY9ci5mcm9tKG4pLHRoaXMuX2NhY2hlPXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fc2VjQ2FjaGU9ci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PXMsdGhpcy5fbW9kZT10fW4oMCkocyxvKSxzLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0LHRoaXMuX2RlY3J5cHQpfSxzLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt0aGlzLl9jaXBoZXIuc2NydWIoKX0sdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3KTt0LmV4cG9ydHM9YixiLnNpbXBsZVNpZXZlPWcsYi5mZXJtYXRUZXN0PXY7dmFyIHI9bigzKSxvPW5ldyByKDI0KSxzPW5ldyhuKDEwNCkpLGE9bmV3IHIoMSksdT1uZXcgcigyKSxjPW5ldyByKDUpLGg9KG5ldyByKDE2KSxuZXcgcig4KSxuZXcgcigxMCkpLGw9bmV3IHIoMyksZD0obmV3IHIoNyksbmV3IHIoMTEpKSxmPW5ldyByKDQpLHA9KG5ldyByKDEyKSxudWxsKTtmdW5jdGlvbiBtKCl7aWYobnVsbCE9PXApcmV0dXJuIHA7dmFyIHQ9W107dFswXT0yO2Zvcih2YXIgZT0xLG49MztuPDEwNDg1NzY7bis9Mil7Zm9yKHZhciBpPU1hdGguY2VpbChNYXRoLnNxcnQobikpLHI9MDtyPGUmJnRbcl08PWkmJm4ldFtyXSE9MDtyKyspO2UhPT1yJiZ0W3JdPD1pfHwodFtlKytdPW4pfXJldHVybiBwPXQsdH1mdW5jdGlvbiBnKHQpe2Zvcih2YXIgZT1tKCksbj0wO248ZS5sZW5ndGg7bisrKWlmKDA9PT10Lm1vZG4oZVtuXSkpcmV0dXJuIDA9PT10LmNtcG4oZVtuXSk7cmV0dXJuITB9ZnVuY3Rpb24gdih0KXt2YXIgZT1yLm1vbnQodCk7cmV0dXJuIDA9PT11LnRvUmVkKGUpLnJlZFBvdyh0LnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpfWZ1bmN0aW9uIGIodCxlKXtpZih0PDE2KXJldHVybiBuZXcgcigyPT09ZXx8NT09PWU/WzE0MCwxMjNdOlsxNDAsMzldKTt2YXIgbixwO2ZvcihlPW5ldyByKGUpOzspe2ZvcihuPW5ldyByKGkoTWF0aC5jZWlsKHQvOCkpKTtuLmJpdExlbmd0aCgpPnQ7KW4uaXNocm4oMSk7aWYobi5pc0V2ZW4oKSYmbi5pYWRkKGEpLG4udGVzdG4oMSl8fG4uaWFkZCh1KSxlLmNtcCh1KSl7aWYoIWUuY21wKGMpKWZvcig7bi5tb2QoaCkuY21wKGwpOyluLmlhZGQoZil9ZWxzZSBmb3IoO24ubW9kKG8pLmNtcChkKTspbi5pYWRkKGYpO2lmKGcocD1uLnNocm4oMSkpJiZnKG4pJiZ2KHApJiZ2KG4pJiZzLnRlc3QocCkmJnMudGVzdChuKSlyZXR1cm4gbn19fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzKSxyPW4oMTA1KTtmdW5jdGlvbiBvKHQpe3RoaXMucmFuZD10fHxuZXcgci5SYW5kfXQuZXhwb3J0cz1vLG8uY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX0sby5wcm90b3R5cGUuX3JhbmRiZWxvdz1mdW5jdGlvbih0KXt2YXIgZT10LmJpdExlbmd0aCgpLG49TWF0aC5jZWlsKGUvOCk7ZG97dmFyIHI9bmV3IGkodGhpcy5yYW5kLmdlbmVyYXRlKG4pKX13aGlsZShyLmNtcCh0KT49MCk7cmV0dXJuIHJ9LG8ucHJvdG90eXBlLl9yYW5kcmFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN1Yih0KTtyZXR1cm4gdC5hZGQodGhpcy5fcmFuZGJlbG93KG4pKX0sby5wcm90b3R5cGUudGVzdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5iaXRMZW5ndGgoKSxvPWkubW9udCh0KSxzPW5ldyBpKDEpLnRvUmVkKG8pO2V8fChlPU1hdGgubWF4KDEsci80OHwwKSk7Zm9yKHZhciBhPXQuc3VibigxKSx1PTA7IWEudGVzdG4odSk7dSsrKTtmb3IodmFyIGM9dC5zaHJuKHUpLGg9YS50b1JlZChvKTtlPjA7ZS0tKXt2YXIgbD10aGlzLl9yYW5kcmFuZ2UobmV3IGkoMiksYSk7biYmbihsKTt2YXIgZD1sLnRvUmVkKG8pLnJlZFBvdyhjKTtpZigwIT09ZC5jbXAocykmJjAhPT1kLmNtcChoKSl7Zm9yKHZhciBmPTE7Zjx1O2YrKyl7aWYoMD09PShkPWQucmVkU3FyKCkpLmNtcChzKSlyZXR1cm4hMTtpZigwPT09ZC5jbXAoaCkpYnJlYWt9aWYoZj09PXUpcmV0dXJuITF9fXJldHVybiEwfSxvLnByb3RvdHlwZS5nZXREaXZpc29yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5iaXRMZW5ndGgoKSxyPWkubW9udCh0KSxvPW5ldyBpKDEpLnRvUmVkKHIpO2V8fChlPU1hdGgubWF4KDEsbi80OHwwKSk7Zm9yKHZhciBzPXQuc3VibigxKSxhPTA7IXMudGVzdG4oYSk7YSsrKTtmb3IodmFyIHU9dC5zaHJuKGEpLGM9cy50b1JlZChyKTtlPjA7ZS0tKXt2YXIgaD10aGlzLl9yYW5kcmFuZ2UobmV3IGkoMikscyksbD10LmdjZChoKTtpZigwIT09bC5jbXBuKDEpKXJldHVybiBsO3ZhciBkPWgudG9SZWQocikucmVkUG93KHUpO2lmKDAhPT1kLmNtcChvKSYmMCE9PWQuY21wKGMpKXtmb3IodmFyIGY9MTtmPGE7ZisrKXtpZigwPT09KGQ9ZC5yZWRTcXIoKSkuY21wKG8pKXJldHVybiBkLmZyb21SZWQoKS5zdWJuKDEpLmdjZCh0KTtpZigwPT09ZC5jbXAoYykpYnJlYWt9aWYoZj09PWEpcmV0dXJuKGQ9ZC5yZWRTcXIoKSkuZnJvbVJlZCgpLnN1Ym4oMSkuZ2NkKHQpfX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtmdW5jdGlvbiByKHQpe3RoaXMucmFuZD10fWlmKHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXx8KGk9bmV3IHIobnVsbCkpLGkuZ2VuZXJhdGUodCl9LHQuZXhwb3J0cy5SYW5kPXIsci5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhbmQodCl9LHIucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMucmFuZC5nZXRCeXRlcylyZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKHQpO2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0KSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10aGlzLnJhbmQuZ2V0Qnl0ZSgpO3JldHVybiBlfSwib2JqZWN0Ij09dHlwZW9mIHNlbGYpc2VsZi5jcnlwdG8mJnNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcz9yLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpLGV9OnNlbGYubXNDcnlwdG8mJnNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzP3IucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSxlfToib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKHIucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iil9KTtlbHNlIHRyeXt2YXIgbz1uKDE4Myk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8ucmFuZG9tQnl0ZXMpdGhyb3cgbmV3IEVycm9yKCJOb3Qgc3VwcG9ydGVkIik7ci5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8ucmFuZG9tQnl0ZXModCl9fWNhdGNoKHQpe319LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9ZTtmdW5jdGlvbiByKHQpe3JldHVybiAxPT09dC5sZW5ndGg/IjAiK3Q6dH1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT0iIixuPTA7bjx0Lmxlbmd0aDtuKyspZSs9cih0W25dLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGV9aS50b0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5zbGljZSgpO2lmKCF0KXJldHVybltdO3ZhciBuPVtdO2lmKCJzdHJpbmciIT10eXBlb2YgdCl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspbltpXT0wfHRbaV07cmV0dXJuIG59aWYoImhleCI9PT1lKWZvcigodD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksIiIpKS5sZW5ndGglMiE9MCYmKHQ9IjAiK3QpLGk9MDtpPHQubGVuZ3RoO2krPTIpbi5wdXNoKHBhcnNlSW50KHRbaV0rdFtpKzFdLDE2KSk7ZWxzZSBmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcj10LmNoYXJDb2RlQXQoaSksbz1yPj44LHM9MjU1JnI7bz9uLnB1c2gobyxzKTpuLnB1c2gocyl9cmV0dXJuIG59LGkuemVybzI9cixpLnRvSGV4PW8saS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4iaGV4Ij09PWU/byh0KTp0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KS5yb3RyMzI7ZnVuY3Rpb24gcih0LGUsbil7cmV0dXJuIHQmZV5+dCZufWZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiB0JmVedCZuXmUmbn1mdW5jdGlvbiBzKHQsZSxuKXtyZXR1cm4gdF5lXm59ZS5mdF8xPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiAwPT09dD9yKGUsbixpKToxPT09dHx8Mz09PXQ/cyhlLG4saSk6Mj09PXQ/byhlLG4saSk6dm9pZCAwfSxlLmNoMzI9cixlLm1hajMyPW8sZS5wMzI9cyxlLnMwXzI1Nj1mdW5jdGlvbih0KXtyZXR1cm4gaSh0LDIpXmkodCwxMyleaSh0LDIyKX0sZS5zMV8yNTY9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCw2KV5pKHQsMTEpXmkodCwyNSl9LGUuZzBfMjU2PWZ1bmN0aW9uKHQpe3JldHVybiBpKHQsNyleaSh0LDE4KV50Pj4+M30sZS5nMV8yNTY9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCwxNyleaSh0LDE5KV50Pj4+MTB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTcpLHI9bigzNCksbz1uKDEwNykscz1uKDE0KSxhPWkuc3VtMzIsdT1pLnN1bTMyXzQsYz1pLnN1bTMyXzUsaD1vLmNoMzIsbD1vLm1hajMyLGQ9by5zMF8yNTYsZj1vLnMxXzI1NixwPW8uZzBfMjU2LG09by5nMV8yNTYsZz1yLkJsb2NrSGFzaCx2PVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdO2Z1bmN0aW9uIGIoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBiKSlyZXR1cm4gbmV3IGI7Zy5jYWxsKHRoaXMpLHRoaXMuaD1bMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdLHRoaXMuaz12LHRoaXMuVz1uZXcgQXJyYXkoNjQpfWkuaW5oZXJpdHMoYixnKSx0LmV4cG9ydHM9YixiLmJsb2NrU2l6ZT01MTIsYi5vdXRTaXplPTI1NixiLmhtYWNTdHJlbmd0aD0xOTIsYi5wYWRMZW5ndGg9NjQsYi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLlcsaT0wO2k8MTY7aSsrKW5baV09dFtlK2ldO2Zvcig7aTxuLmxlbmd0aDtpKyspbltpXT11KG0obltpLTJdKSxuW2ktN10scChuW2ktMTVdKSxuW2ktMTZdKTt2YXIgcj10aGlzLmhbMF0sbz10aGlzLmhbMV0sZz10aGlzLmhbMl0sdj10aGlzLmhbM10sYj10aGlzLmhbNF0seT10aGlzLmhbNV0sXz10aGlzLmhbNl0sdz10aGlzLmhbN107Zm9yKHModGhpcy5rLmxlbmd0aD09PW4ubGVuZ3RoKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciB4PWModyxmKGIpLGgoYix5LF8pLHRoaXMua1tpXSxuW2ldKSxNPWEoZChyKSxsKHIsbyxnKSk7dz1fLF89eSx5PWIsYj1hKHYseCksdj1nLGc9byxvPXIscj1hKHgsTSl9dGhpcy5oWzBdPWEodGhpcy5oWzBdLHIpLHRoaXMuaFsxXT1hKHRoaXMuaFsxXSxvKSx0aGlzLmhbMl09YSh0aGlzLmhbMl0sZyksdGhpcy5oWzNdPWEodGhpcy5oWzNdLHYpLHRoaXMuaFs0XT1hKHRoaXMuaFs0XSxiKSx0aGlzLmhbNV09YSh0aGlzLmhbNV0seSksdGhpcy5oWzZdPWEodGhpcy5oWzZdLF8pLHRoaXMuaFs3XT1hKHRoaXMuaFs3XSx3KX0sYi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaCwiYmlnIik6aS5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTcpLHI9bigzNCksbz1uKDE0KSxzPWkucm90cjY0X2hpLGE9aS5yb3RyNjRfbG8sdT1pLnNocjY0X2hpLGM9aS5zaHI2NF9sbyxoPWkuc3VtNjQsbD1pLnN1bTY0X2hpLGQ9aS5zdW02NF9sbyxmPWkuc3VtNjRfNF9oaSxwPWkuc3VtNjRfNF9sbyxtPWkuc3VtNjRfNV9oaSxnPWkuc3VtNjRfNV9sbyx2PXIuQmxvY2tIYXNoLGI9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXTtmdW5jdGlvbiB5KCl7aWYoISh0aGlzIGluc3RhbmNlb2YgeSkpcmV0dXJuIG5ldyB5O3YuY2FsbCh0aGlzKSx0aGlzLmg9WzE3NzkwMzM3MDMsNDA4OTIzNTcyMCwzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUsMTAxMzkwNDI0Miw0MjcxMTc1NzIzLDI3NzM0ODA3NjIsMTU5NTc1MDEyOSwxMzU5ODkzMTE5LDI5MTc1NjUxMzcsMjYwMDgyMjkyNCw3MjU1MTExOTksNTI4NzM0NjM1LDQyMTUzODk1NDcsMTU0MTQ1OTIyNSwzMjcwMzMyMDldLHRoaXMuaz1iLHRoaXMuVz1uZXcgQXJyYXkoMTYwKX1mdW5jdGlvbiBfKHQsZSxuLGkscil7dmFyIG89dCZuXn50JnI7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24gdyh0LGUsbixpLHIsbyl7dmFyIHM9ZSZpXn5lJm87cmV0dXJuIHM8MCYmKHMrPTQyOTQ5NjcyOTYpLHN9ZnVuY3Rpb24geCh0LGUsbixpLHIpe3ZhciBvPXQmbl50JnJebiZyO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIE0odCxlLG4saSxyLG8pe3ZhciBzPWUmaV5lJm9eaSZvO3JldHVybiBzPDAmJihzKz00Mjk0OTY3Mjk2KSxzfWZ1bmN0aW9uIFModCxlKXt2YXIgbj1zKHQsZSwyOClecyhlLHQsMilecyhlLHQsNyk7cmV0dXJuIG48MCYmKG4rPTQyOTQ5NjcyOTYpLG59ZnVuY3Rpb24gRSh0LGUpe3ZhciBuPWEodCxlLDI4KV5hKGUsdCwyKV5hKGUsdCw3KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBBKHQsZSl7dmFyIG49cyh0LGUsMTQpXnModCxlLDE4KV5zKGUsdCw5KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBDKHQsZSl7dmFyIG49YSh0LGUsMTQpXmEodCxlLDE4KV5hKGUsdCw5KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBrKHQsZSl7dmFyIG49cyh0LGUsMSlecyh0LGUsOCledSh0LGUsNyk7cmV0dXJuIG48MCYmKG4rPTQyOTQ5NjcyOTYpLG59ZnVuY3Rpb24gTyh0LGUpe3ZhciBuPWEodCxlLDEpXmEodCxlLDgpXmModCxlLDcpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWZ1bmN0aW9uIFAodCxlKXt2YXIgbj1zKHQsZSwxOSlecyhlLHQsMjkpXnUodCxlLDYpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWZ1bmN0aW9uIFQodCxlKXt2YXIgbj1hKHQsZSwxOSleYShlLHQsMjkpXmModCxlLDYpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWkuaW5oZXJpdHMoeSx2KSx0LmV4cG9ydHM9eSx5LmJsb2NrU2l6ZT0xMDI0LHkub3V0U2l6ZT01MTIseS5obWFjU3RyZW5ndGg9MTkyLHkucGFkTGVuZ3RoPTEyOCx5LnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuVyxpPTA7aTwzMjtpKyspbltpXT10W2UraV07Zm9yKDtpPG4ubGVuZ3RoO2krPTIpe3ZhciByPVAobltpLTRdLG5baS0zXSksbz1UKG5baS00XSxuW2ktM10pLHM9bltpLTE0XSxhPW5baS0xM10sdT1rKG5baS0zMF0sbltpLTI5XSksYz1PKG5baS0zMF0sbltpLTI5XSksaD1uW2ktMzJdLGw9bltpLTMxXTtuW2ldPWYocixvLHMsYSx1LGMsaCxsKSxuW2krMV09cChyLG8scyxhLHUsYyxoLGwpfX0seS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3ByZXBhcmVCbG9jayh0LGUpO3ZhciBuPXRoaXMuVyxpPXRoaXMuaFswXSxyPXRoaXMuaFsxXSxzPXRoaXMuaFsyXSxhPXRoaXMuaFszXSx1PXRoaXMuaFs0XSxjPXRoaXMuaFs1XSxmPXRoaXMuaFs2XSxwPXRoaXMuaFs3XSx2PXRoaXMuaFs4XSxiPXRoaXMuaFs5XSx5PXRoaXMuaFsxMF0saz10aGlzLmhbMTFdLE89dGhpcy5oWzEyXSxQPXRoaXMuaFsxM10sVD10aGlzLmhbMTRdLGo9dGhpcy5oWzE1XTtvKHRoaXMuay5sZW5ndGg9PT1uLmxlbmd0aCk7Zm9yKHZhciBJPTA7STxuLmxlbmd0aDtJKz0yKXt2YXIgTD1ULEI9aixEPUEodixiKSxSPUModixiKSx6PV8odixiLHksayxPKSxOPXcodixiLHksayxPLFApLFc9dGhpcy5rW0ldLHE9dGhpcy5rW0krMV0sSD1uW0ldLEY9bltJKzFdLFY9bShMLEIsRCxSLHosTixXLHEsSCxGKSxVPWcoTCxCLEQsUix6LE4sVyxxLEgsRik7TD1TKGksciksQj1FKGksciksRD14KGkscixzLGEsdSksUj1NKGkscixzLGEsdSxjKTt2YXIgSz1sKEwsQixELFIpLFk9ZChMLEIsRCxSKTtUPU8saj1QLE89eSxQPWsseT12LGs9Yix2PWwoZixwLFYsVSksYj1kKHAscCxWLFUpLGY9dSxwPWMsdT1zLGM9YSxzPWksYT1yLGk9bChWLFUsSyxZKSxyPWQoVixVLEssWSl9aCh0aGlzLmgsMCxpLHIpLGgodGhpcy5oLDIscyxhKSxoKHRoaXMuaCw0LHUsYyksaCh0aGlzLmgsNixmLHApLGgodGhpcy5oLDgsdixiKSxoKHRoaXMuaCwxMCx5LGspLGgodGhpcy5oLDEyLE8sUCksaCh0aGlzLmgsMTQsVCxqKX0seS5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaCwiYmlnIik6aS5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMzYpLlJlcG9ydGVyLG89big0KS5CdWZmZXI7ZnVuY3Rpb24gcyh0LGUpe3IuY2FsbCh0aGlzLGUpLG8uaXNCdWZmZXIodCk/KHRoaXMuYmFzZT10LHRoaXMub2Zmc2V0PTAsdGhpcy5sZW5ndGg9dC5sZW5ndGgpOnRoaXMuZXJyb3IoIklucHV0IG5vdCBCdWZmZXIiKX1mdW5jdGlvbiBhKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmxlbmd0aD0wLHRoaXMudmFsdWU9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBhfHwodD1uZXcgYSh0LGUpKSx0aGlzLmxlbmd0aCs9dC5sZW5ndGgsdH0sdGhpcyk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCEoMDw9dCYmdDw9MjU1KSlyZXR1cm4gZS5lcnJvcigibm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZSIpO3RoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD0xfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KXRoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD1vLmJ5dGVMZW5ndGgodCk7ZWxzZXtpZighby5pc0J1ZmZlcih0KSlyZXR1cm4gZS5lcnJvcigiVW5zdXBwb3J0ZWQgdHlwZTogIit0eXBlb2YgdCk7dGhpcy52YWx1ZT10LHRoaXMubGVuZ3RoPXQubGVuZ3RofX1pKHMsciksZS5EZWNvZGVyQnVmZmVyPXMscy5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3JldHVybntvZmZzZXQ6dGhpcy5vZmZzZXQscmVwb3J0ZXI6ci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpfX0scy5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgcyh0aGlzLmJhc2UpO3JldHVybiBlLm9mZnNldD10Lm9mZnNldCxlLmxlbmd0aD10aGlzLm9mZnNldCx0aGlzLm9mZnNldD10Lm9mZnNldCxyLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcyx0LnJlcG9ydGVyKSxlfSxzLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0PT09dGhpcy5sZW5ndGh9LHMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXQrMTw9dGhpcy5sZW5ndGg/dGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCEwKTp0aGlzLmVycm9yKHR8fCJEZWNvZGVyQnVmZmVyIG92ZXJydW4iKX0scy5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcy5vZmZzZXQrdDw9dGhpcy5sZW5ndGgpKXJldHVybiB0aGlzLmVycm9yKGV8fCJEZWNvZGVyQnVmZmVyIG92ZXJydW4iKTt2YXIgbj1uZXcgcyh0aGlzLmJhc2UpO3JldHVybiBuLl9yZXBvcnRlclN0YXRlPXRoaXMuX3JlcG9ydGVyU3RhdGUsbi5vZmZzZXQ9dGhpcy5vZmZzZXQsbi5sZW5ndGg9dGhpcy5vZmZzZXQrdCx0aGlzLm9mZnNldCs9dCxufSxzLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYmFzZS5zbGljZSh0P3Qub2Zmc2V0OnRoaXMub2Zmc2V0LHRoaXMubGVuZ3RoKX0sZS5FbmNvZGVyQnVmZmVyPWEsYS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0LGUpe3JldHVybiB0fHwodD1uZXcgbyh0aGlzLmxlbmd0aCkpLGV8fChlPTApLDA9PT10aGlzLmxlbmd0aD90OihBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpP3RoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihuKXtuLmpvaW4odCxlKSxlKz1uLmxlbmd0aH0pOigibnVtYmVyIj09dHlwZW9mIHRoaXMudmFsdWU/dFtlXT10aGlzLnZhbHVlOiJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZT90LndyaXRlKHRoaXMudmFsdWUsZSk6by5pc0J1ZmZlcih0aGlzLnZhbHVlKSYmdGhpcy52YWx1ZS5jb3B5KHQsZSksZSs9dGhpcy5sZW5ndGgpLHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPWU7aS5fcmV2ZXJzZT1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXsoMHxuKT09biYmKG58PTApO3ZhciBpPXRbbl07ZVtpXT1ufSksZX0saS5kZXI9bigyMTUpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMzUpLG89ci5iYXNlLHM9ci5iaWdudW0sYT1yLmNvbnN0YW50cy5kZXI7ZnVuY3Rpb24gdSh0KXt0aGlzLmVuYz0iZGVyIix0aGlzLm5hbWU9dC5uYW1lLHRoaXMuZW50aXR5PXQsdGhpcy50cmVlPW5ldyBjLHRoaXMudHJlZS5faW5pdCh0LmJvZHkpfWZ1bmN0aW9uIGModCl7by5Ob2RlLmNhbGwodGhpcywiZGVyIix0KX1mdW5jdGlvbiBoKHQsZSl7dmFyIG49dC5yZWFkVUludDgoZSk7aWYodC5pc0Vycm9yKG4pKXJldHVybiBuO3ZhciBpPWEudGFnQ2xhc3Nbbj4+Nl0scj0wPT0oMzImbik7aWYoMzE9PSgzMSZuKSl7dmFyIG89bjtmb3Iobj0wOzEyOD09KDEyOCZvKTspe2lmKG89dC5yZWFkVUludDgoZSksdC5pc0Vycm9yKG8pKXJldHVybiBvO248PD03LG58PTEyNyZvfX1lbHNlIG4mPTMxO3JldHVybntjbHM6aSxwcmltaXRpdmU6cix0YWc6bix0YWdTdHI6YS50YWdbbl19fWZ1bmN0aW9uIGwodCxlLG4pe3ZhciBpPXQucmVhZFVJbnQ4KG4pO2lmKHQuaXNFcnJvcihpKSlyZXR1cm4gaTtpZighZSYmMTI4PT09aSlyZXR1cm4gbnVsbDtpZigwPT0oMTI4JmkpKXJldHVybiBpO3ZhciByPTEyNyZpO2lmKHI+NClyZXR1cm4gdC5lcnJvcigibGVuZ3RoIG9jdGVjdCBpcyB0b28gbG9uZyIpO2k9MDtmb3IodmFyIG89MDtvPHI7bysrKXtpPDw9ODt2YXIgcz10LnJlYWRVSW50OChuKTtpZih0LmlzRXJyb3IocykpcmV0dXJuIHM7aXw9c31yZXR1cm4gaX10LmV4cG9ydHM9dSx1LnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uRGVjb2RlckJ1ZmZlcnx8KHQ9bmV3IG8uRGVjb2RlckJ1ZmZlcih0LGUpKSx0aGlzLnRyZWUuX2RlY29kZSh0LGUpfSxpKGMsby5Ob2RlKSxjLnByb3RvdHlwZS5fcGVla1RhZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuITE7dmFyIGk9dC5zYXZlKCkscj1oKHQsJ0ZhaWxlZCB0byBwZWVrIHRhZzogIicrZSsnIicpO3JldHVybiB0LmlzRXJyb3Iocik/cjoodC5yZXN0b3JlKGkpLHIudGFnPT09ZXx8ci50YWdTdHI9PT1lfHxyLnRhZ1N0cisib2YiPT09ZXx8bil9LGMucHJvdG90eXBlLl9kZWNvZGVUYWc9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWgodCwnRmFpbGVkIHRvIGRlY29kZSB0YWcgb2YgIicrZSsnIicpO2lmKHQuaXNFcnJvcihpKSlyZXR1cm4gaTt2YXIgcj1sKHQsaS5wcmltaXRpdmUsJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mICInK2UrJyInKTtpZih0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYoIW4mJmkudGFnIT09ZSYmaS50YWdTdHIhPT1lJiZpLnRhZ1N0cisib2YiIT09ZSlyZXR1cm4gdC5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogIicrZSsnIicpO2lmKGkucHJpbWl0aXZlfHxudWxsIT09cilyZXR1cm4gdC5za2lwKHIsJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiAiJytlKyciJyk7dmFyIG89dC5zYXZlKCkscz10aGlzLl9za2lwVW50aWxFbmQodCwnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogIicrdGhpcy50YWcrJyInKTtyZXR1cm4gdC5pc0Vycm9yKHMpP3M6KHI9dC5vZmZzZXQtby5vZmZzZXQsdC5yZXN0b3JlKG8pLHQuc2tpcChyLCdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogIicrZSsnIicpKX0sYy5wcm90b3R5cGUuX3NraXBVbnRpbEVuZD1mdW5jdGlvbih0LGUpe2Zvcig7Oyl7dmFyIG49aCh0LGUpO2lmKHQuaXNFcnJvcihuKSlyZXR1cm4gbjt2YXIgaSxyPWwodCxuLnByaW1pdGl2ZSxlKTtpZih0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYoaT1uLnByaW1pdGl2ZXx8bnVsbCE9PXI/dC5za2lwKHIpOnRoaXMuX3NraXBVbnRpbEVuZCh0LGUpLHQuaXNFcnJvcihpKSlyZXR1cm4gaTtpZigiZW5kIj09PW4udGFnU3RyKWJyZWFrfX0sYy5wcm90b3R5cGUuX2RlY29kZUxpc3Q9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPVtdOyF0LmlzRW1wdHkoKTspe3ZhciBvPXRoaXMuX3BlZWtUYWcodCwiZW5kIik7aWYodC5pc0Vycm9yKG8pKXJldHVybiBvO3ZhciBzPW4uZGVjb2RlKHQsImRlciIsaSk7aWYodC5pc0Vycm9yKHMpJiZvKWJyZWFrO3IucHVzaChzKX1yZXR1cm4gcn0sYy5wcm90b3R5cGUuX2RlY29kZVN0cj1mdW5jdGlvbih0LGUpe2lmKCJiaXRzdHIiPT09ZSl7dmFyIG49dC5yZWFkVUludDgoKTtyZXR1cm4gdC5pc0Vycm9yKG4pP246e3VudXNlZDpuLGRhdGE6dC5yYXcoKX19aWYoImJtcHN0ciI9PT1lKXt2YXIgaT10LnJhdygpO2lmKGkubGVuZ3RoJTI9PTEpcmV0dXJuIHQuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKHZhciByPSIiLG89MDtvPGkubGVuZ3RoLzI7bysrKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoaS5yZWFkVUludDE2QkUoMipvKSk7cmV0dXJuIHJ9aWYoIm51bXN0ciI9PT1lKXt2YXIgcz10LnJhdygpLnRvU3RyaW5nKCJhc2NpaSIpO3JldHVybiB0aGlzLl9pc051bXN0cihzKT9zOnQuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyIpfWlmKCJvY3RzdHIiPT09ZSlyZXR1cm4gdC5yYXcoKTtpZigib2JqRGVzYyI9PT1lKXJldHVybiB0LnJhdygpO2lmKCJwcmludHN0ciI9PT1lKXt2YXIgYT10LnJhdygpLnRvU3RyaW5nKCJhc2NpaSIpO3JldHVybiB0aGlzLl9pc1ByaW50c3RyKGEpP2E6dC5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMiKX1yZXR1cm4vc3RyJC8udGVzdChlKT90LnJhdygpLnRvU3RyaW5nKCk6dC5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICIrZSsiIHVuc3VwcG9ydGVkIil9LGMucHJvdG90eXBlLl9kZWNvZGVPYmppZD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHI9W10sbz0wOyF0LmlzRW1wdHkoKTspe3ZhciBzPXQucmVhZFVJbnQ4KCk7bzw8PTcsb3w9MTI3JnMsMD09KDEyOCZzKSYmKHIucHVzaChvKSxvPTApfTEyOCZzJiZyLnB1c2gobyk7dmFyIGE9clswXS80MHwwLHU9clswXSU0MDtpZihpPW4/cjpbYSx1XS5jb25jYXQoci5zbGljZSgxKSksZSl7dmFyIGM9ZVtpLmpvaW4oIiAiKV07dm9pZCAwPT09YyYmKGM9ZVtpLmpvaW4oIi4iKV0pLHZvaWQgMCE9PWMmJihpPWMpfXJldHVybiBpfSxjLnByb3RvdHlwZS5fZGVjb2RlVGltZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQucmF3KCkudG9TdHJpbmcoKTtpZigiZ2VudGltZSI9PT1lKXZhciBpPTB8bi5zbGljZSgwLDQpLHI9MHxuLnNsaWNlKDQsNiksbz0wfG4uc2xpY2UoNiw4KSxzPTB8bi5zbGljZSg4LDEwKSxhPTB8bi5zbGljZSgxMCwxMiksdT0wfG4uc2xpY2UoMTIsMTQpO2Vsc2V7aWYoInV0Y3RpbWUiIT09ZSlyZXR1cm4gdC5lcnJvcigiRGVjb2RpbmcgIitlKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2k9MHxuLnNsaWNlKDAsMikscj0wfG4uc2xpY2UoMiw0KSxvPTB8bi5zbGljZSg0LDYpLHM9MHxuLnNsaWNlKDYsOCksYT0wfG4uc2xpY2UoOCwxMCksdT0wfG4uc2xpY2UoMTAsMTIpO2k9aTw3MD8yZTMraToxOTAwK2l9cmV0dXJuIERhdGUuVVRDKGksci0xLG8scyxhLHUsMCl9LGMucHJvdG90eXBlLl9kZWNvZGVOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxjLnByb3RvdHlwZS5fZGVjb2RlQm9vbD1mdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVSW50OCgpO3JldHVybiB0LmlzRXJyb3IoZSk/ZTowIT09ZX0sYy5wcm90b3R5cGUuX2RlY29kZUludD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucmF3KCksaT1uZXcgcyhuKTtyZXR1cm4gZSYmKGk9ZVtpLnRvU3RyaW5nKDEwKV18fGkpLGl9LGMucHJvdG90eXBlLl91c2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksdC5fZ2V0RGVjb2RlcigiZGVyIikudHJlZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big0KS5CdWZmZXIsbz1uKDM1KSxzPW8uYmFzZSxhPW8uY29uc3RhbnRzLmRlcjtmdW5jdGlvbiB1KHQpe3RoaXMuZW5jPSJkZXIiLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5lbnRpdHk9dCx0aGlzLnRyZWU9bmV3IGMsdGhpcy50cmVlLl9pbml0KHQuYm9keSl9ZnVuY3Rpb24gYyh0KXtzLk5vZGUuY2FsbCh0aGlzLCJkZXIiLHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ8MTA/IjAiK3Q6dH10LmV4cG9ydHM9dSx1LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUodCxlKS5qb2luKCl9LGkoYyxzLk5vZGUpLGMucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIG8scz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcjsic2Vxb2YiPT09dD90PSJzZXEiOiJzZXRvZiI9PT10JiYodD0ic2V0Iik7aWYoYS50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodCkpcj1hLnRhZ0J5TmFtZVt0XTtlbHNle2lmKCJudW1iZXIiIT10eXBlb2YgdHx8KDB8dCkhPT10KXJldHVybiBpLmVycm9yKCJVbmtub3duIHRhZzogIit0KTtyPXR9aWYocj49MzEpcmV0dXJuIGkuZXJyb3IoIk11bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCIpO2V8fChyfD0zMik7cmV0dXJuIHJ8PWEudGFnQ2xhc3NCeU5hbWVbbnx8InVuaXZlcnNhbCJdPDw2fSh0LGUsbix0aGlzLnJlcG9ydGVyKTtpZihpLmxlbmd0aDwxMjgpcmV0dXJuKG89bmV3IHIoMikpWzBdPXMsb1sxXT1pLmxlbmd0aCx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFtvLGldKTtmb3IodmFyIHU9MSxjPWkubGVuZ3RoO2M+PTI1NjtjPj49OCl1Kys7KG89bmV3IHIoMit1KSlbMF09cyxvWzFdPTEyOHx1O2M9MSt1O2Zvcih2YXIgaD1pLmxlbmd0aDtoPjA7Yy0tLGg+Pj04KW9bY109MjU1Jmg7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW28saV0pfSxjLnByb3RvdHlwZS5fZW5jb2RlU3RyPWZ1bmN0aW9uKHQsZSl7aWYoImJpdHN0ciI9PT1lKXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswfHQudW51c2VkLHQuZGF0YV0pO2lmKCJibXBzdHIiPT09ZSl7Zm9yKHZhciBuPW5ldyByKDIqdC5sZW5ndGgpLGk9MDtpPHQubGVuZ3RoO2krKyluLndyaXRlVUludDE2QkUodC5jaGFyQ29kZUF0KGkpLDIqaSk7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobil9cmV0dXJuIm51bXN0ciI9PT1lP3RoaXMuX2lzTnVtc3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyBvbmx5IGRpZ2l0cyBhbmQgc3BhY2UiKToicHJpbnRzdHIiPT09ZT90aGlzLl9pc1ByaW50c3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzIG9ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggcGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sIHF1ZXN0aW9uIG1hcmsiKTovc3RyJC8udGVzdChlKT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpOiJvYmpEZXNjIj09PWU/dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0KTp0aGlzLnJlcG9ydGVyLmVycm9yKCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogIitlKyIgdW5zdXBwb3J0ZWQiKX0sYy5wcm90b3R5cGUuX2VuY29kZU9iamlkPWZ1bmN0aW9uKHQsZSxuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCFlKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kIik7aWYoIWUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIm9iamlkIG5vdCBmb3VuZCBpbiB2YWx1ZXMgbWFwIik7dD1lW3RdLnNwbGl0KC9bXHNcLl0rL2cpO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV18PTB9ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt0PXQuc2xpY2UoKTtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV18PTB9aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIm9iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsIGdvdDogIitKU09OLnN0cmluZ2lmeSh0KSk7aWYoIW4pe2lmKHRbMV0+PTQwKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0IiKTt0LnNwbGljZSgwLDIsNDAqdFswXSt0WzFdKX12YXIgbz0wO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07Zm9yKG8rKztzPj0xMjg7cz4+PTcpbysrfXZhciBhPW5ldyByKG8pLHU9YS5sZW5ndGgtMTtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXtzPXRbaV07Zm9yKGFbdS0tXT0xMjcmczsocz4+PTcpPjA7KWFbdS0tXT0xMjh8MTI3JnN9cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYSl9LGMucHJvdG90eXBlLl9lbmNvZGVUaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT1uZXcgRGF0ZSh0KTtyZXR1cm4iZ2VudGltZSI9PT1lP249W2goaS5nZXRGdWxsWWVhcigpKSxoKGkuZ2V0VVRDTW9udGgoKSsxKSxoKGkuZ2V0VVRDRGF0ZSgpKSxoKGkuZ2V0VVRDSG91cnMoKSksaChpLmdldFVUQ01pbnV0ZXMoKSksaChpLmdldFVUQ1NlY29uZHMoKSksIloiXS5qb2luKCIiKToidXRjdGltZSI9PT1lP249W2goaS5nZXRGdWxsWWVhcigpJTEwMCksaChpLmdldFVUQ01vbnRoKCkrMSksaChpLmdldFVUQ0RhdGUoKSksaChpLmdldFVUQ0hvdXJzKCkpLGgoaS5nZXRVVENNaW51dGVzKCkpLGgoaS5nZXRVVENTZWNvbmRzKCkpLCJaIl0uam9pbigiIik6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2RpbmcgIitlKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpLHRoaXMuX2VuY29kZVN0cihuLCJvY3RzdHIiKX0sYy5wcm90b3R5cGUuX2VuY29kZU51bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcigiIil9LGMucHJvdG90eXBlLl9lbmNvZGVJbnQ9ZnVuY3Rpb24odCxlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCFlKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIik7aWYoIWUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIlZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluOiAiK0pTT04uc3RyaW5naWZ5KHQpKTt0PWVbdF19aWYoIm51bWJlciIhPXR5cGVvZiB0JiYhci5pc0J1ZmZlcih0KSl7dmFyIG49dC50b0FycmF5KCk7IXQuc2lnbiYmMTI4Jm5bMF0mJm4udW5zaGlmdCgwKSx0PW5ldyByKG4pfWlmKHIuaXNCdWZmZXIodCkpe3ZhciBpPXQubGVuZ3RoOzA9PT10Lmxlbmd0aCYmaSsrO3ZhciBvPW5ldyByKGkpO3JldHVybiB0LmNvcHkobyksMD09PXQubGVuZ3RoJiYob1swXT0wKSx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG8pfWlmKHQ8MTI4KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpO2lmKHQ8MjU2KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLHRdKTtpPTE7Zm9yKHZhciBzPXQ7cz49MjU2O3M+Pj04KWkrKztmb3Iocz0obz1uZXcgQXJyYXkoaSkpLmxlbmd0aC0xO3M+PTA7cy0tKW9bc109MjU1JnQsdD4+PTg7cmV0dXJuIDEyOCZvWzBdJiZvLnVuc2hpZnQoMCksdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihuZXcgcihvKSl9LGMucHJvdG90eXBlLl9lbmNvZGVCb29sPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQ/MjU1OjApfSxjLnByb3RvdHlwZS5fdXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLHQuX2dldEVuY29kZXIoImRlciIpLnRyZWV9LGMucHJvdG90eXBlLl9za2lwRGVmYXVsdD1mdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PXIuZGVmYXVsdClyZXR1cm4hMTt2YXIgbz10LmpvaW4oKTtpZih2b2lkIDA9PT1yLmRlZmF1bHRCdWZmZXImJihyLmRlZmF1bHRCdWZmZXI9dGhpcy5fZW5jb2RlVmFsdWUoci5kZWZhdWx0LGUsbikuam9pbigpKSxvLmxlbmd0aCE9PXIuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpcmV0dXJuITE7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylpZihvW2ldIT09ci5kZWZhdWx0QnVmZmVyW2ldKXJldHVybiExO3JldHVybiEwfX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPXsiMS4zLjEzMi4wLjEwIjoic2VjcDI1NmsxIiwiMS4zLjEzMi4wLjMzIjoicDIyNCIsIjEuMi44NDAuMTAwNDUuMy4xLjEiOiJwMTkyIiwiMS4yLjg0MC4xMDA0NS4zLjEuNyI6InAyNTYiLCIxLjMuMTMyLjAuMzQiOiJwMzg0IiwiMS4zLjEzMi4wLjM1IjoicDUyMSJ9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzMSkscj1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiBvKHQpe3ZhciBlPXIuYWxsb2NVbnNhZmUoNCk7cmV0dXJuIGUud3JpdGVVSW50MzJCRSh0LDApLGV9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHM9ci5hbGxvYygwKSxhPTA7cy5sZW5ndGg8ZTspbj1vKGErKykscz1yLmNvbmNhdChbcyxpKCJzaGExIikudXBkYXRlKHQpLnVwZGF0ZShuKS5kaWdlc3QoKV0pO3JldHVybiBzLnNsaWNlKDAsZSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPS0xOysraTxuOyl0W2ldXj1lW2ldO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMykscj1uKDEpLkJ1ZmZlcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5mcm9tKHQudG9SZWQoaS5tb250KGUubW9kdWx1cykpLnJlZFBvdyhuZXcgaShlLnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpLnRvQXJyYXkoKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDM3KSxyPW4oMTIxKSxvPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHU9IltvYmplY3QgUHJveHldIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkpcmV0dXJuITE7dmFyIGU9aSh0KTtyZXR1cm4gZT09c3x8ZT09YXx8ZT09b3x8ZT09dX19LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZTt0LmV4cG9ydHM9bn0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gbi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1MSkscj1uKDI1OCksbz1uKDI2MCkscz1uKDI2MSksYT1uKDI2Mik7ZnVuY3Rpb24gdSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX11LnByb3RvdHlwZS5jbGVhcj1pLHUucHJvdG90eXBlLmRlbGV0ZT1yLHUucHJvdG90eXBlLmdldD1vLHUucHJvdG90eXBlLmhhcz1zLHUucHJvdG90eXBlLnNldD1hLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyNjMpLHI9bigyNjYpLG89bigyNjcpLHM9MSxhPTI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHUsYyxoKXt2YXIgbD1uJnMsZD10Lmxlbmd0aCxmPWUubGVuZ3RoO2lmKGQhPWYmJiEobCYmZj5kKSlyZXR1cm4hMTt2YXIgcD1oLmdldCh0KTtpZihwJiZoLmdldChlKSlyZXR1cm4gcD09ZTt2YXIgbT0tMSxnPSEwLHY9biZhP25ldyBpOnZvaWQgMDtmb3IoaC5zZXQodCxlKSxoLnNldChlLHQpOysrbTxkOyl7dmFyIGI9dFttXSx5PWVbbV07aWYodSl2YXIgXz1sP3UoeSxiLG0sZSx0LGgpOnUoYix5LG0sdCxlLGgpO2lmKHZvaWQgMCE9PV8pe2lmKF8pY29udGludWU7Zz0hMTticmVha31pZih2KXtpZighcihlLGZ1bmN0aW9uKHQsZSl7aWYoIW8odixlKSYmKGI9PT10fHxjKGIsdCxuLHUsaCkpKXJldHVybiB2LnB1c2goZSl9KSl7Zz0hMTticmVha319ZWxzZSBpZihiIT09eSYmIWMoYix5LG4sdSxoKSl7Zz0hMTticmVha319cmV0dXJuIGguZGVsZXRlKHQpLGguZGVsZXRlKGUpLGd9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTkpLHI9bigyODQpLG89ZSYmIWUubm9kZVR5cGUmJmUscz1vJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJiF0Lm5vZGVUeXBlJiZ0LGE9cyYmcy5leHBvcnRzPT09bz9pLkJ1ZmZlcjp2b2lkIDAsdT0oYT9hLmlzQnVmZmVyOnZvaWQgMCl8fHI7dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsbig0NykodCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyODYpLHI9bigyODcpLG89bigyODgpLHM9byYmby5pc1R5cGVkQXJyYXksYT1zP3Iocyk6aTt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt2YXIgbj05MDA3MTk5MjU0NzQwOTkxO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9bn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX19LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oaSl7dmFyIHIsbyxzO3M9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PXNlbGYmJnNlbGZ8fCJvYmplY3QiPT10eXBlb2YgaSYmaS5nbG9iYWw9PWkmJmkscj1bbig2KSxuKDE1KSxlXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0LGUsbil7cy5CYWNrYm9uZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LkJhY2tib25lLG89QXJyYXkucHJvdG90eXBlLnNsaWNlO2UuVkVSU0lPTj0iMS4yLjMiLGUuJD1pLGUubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB0LkJhY2tib25lPXIsdGhpc30sZS5lbXVsYXRlSFRUUD0hMSxlLmVtdWxhdGVKU09OPSExO3ZhciBzPWZ1bmN0aW9uKHQsZSxpKXtuLmVhY2goZSxmdW5jdGlvbihlLHIpe25bcl0mJih0LnByb3RvdHlwZVtyXT1mdW5jdGlvbih0LGUsaSl7c3dpdGNoKHQpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbltlXSh0aGlzW2ldKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbltlXSh0aGlzW2ldLHQpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIG5bZV0odGhpc1tpXSxhKHQsdGhpcykscil9O2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCxyLG8pe3JldHVybiBuW2VdKHRoaXNbaV0sYSh0LHRoaXMpLHIsbyl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9by5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQudW5zaGlmdCh0aGlzW2ldKSxuW2VdLmFwcGx5KG4sdCl9fX0oZSxyLGkpKX0pfSxhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbih0KT90Om4uaXNPYmplY3QodCkmJiFlLl9pc01vZGVsKHQpP3UodCk6bi5pc1N0cmluZyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQodCl9OnR9LHU9ZnVuY3Rpb24odCl7dmFyIGU9bi5tYXRjaGVzKHQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0LmF0dHJpYnV0ZXMpfX0sYz1lLkV2ZW50cz17fSxoPS9ccysvLGw9ZnVuY3Rpb24odCxlLGkscixvKXt2YXIgcyxhPTA7aWYoaSYmIm9iamVjdCI9PXR5cGVvZiBpKXt2b2lkIDAhPT1yJiYiY29udGV4dCJpbiBvJiZ2b2lkIDA9PT1vLmNvbnRleHQmJihvLmNvbnRleHQ9cik7Zm9yKHM9bi5rZXlzKGkpO2E8cy5sZW5ndGg7YSsrKWU9bCh0LGUsc1thXSxpW3NbYV1dLG8pfWVsc2UgaWYoaSYmaC50ZXN0KGkpKWZvcihzPWkuc3BsaXQoaCk7YTxzLmxlbmd0aDthKyspZT10KGUsc1thXSxyLG8pO2Vsc2UgZT10KGUsaSxyLG8pO3JldHVybiBlfTtjLm9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZCh0aGlzLHQsZSxuKX07dmFyIGQ9ZnVuY3Rpb24odCxlLG4saSxyKXtpZih0Ll9ldmVudHM9bChmLHQuX2V2ZW50c3x8e30sZSxuLHtjb250ZXh0OmksY3R4OnQsbGlzdGVuaW5nOnJ9KSxyKXt2YXIgbz10Ll9saXN0ZW5lcnN8fCh0Ll9saXN0ZW5lcnM9e30pO29bci5pZF09cn1yZXR1cm4gdH07Yy5saXN0ZW5Ubz1mdW5jdGlvbih0LGUsaSl7aWYoIXQpcmV0dXJuIHRoaXM7dmFyIHI9dC5fbGlzdGVuSWR8fCh0Ll9saXN0ZW5JZD1uLnVuaXF1ZUlkKCJsIikpLG89dGhpcy5fbGlzdGVuaW5nVG98fCh0aGlzLl9saXN0ZW5pbmdUbz17fSkscz1vW3JdO2lmKCFzKXt2YXIgYT10aGlzLl9saXN0ZW5JZHx8KHRoaXMuX2xpc3RlbklkPW4udW5pcXVlSWQoImwiKSk7cz1vW3JdPXtvYmo6dCxvYmpJZDpyLGlkOmEsbGlzdGVuaW5nVG86byxjb3VudDowfX1yZXR1cm4gZCh0LGUsaSx0aGlzLHMpLHRoaXN9O3ZhciBmPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKG4pe3ZhciByPXRbZV18fCh0W2VdPVtdKSxvPWkuY29udGV4dCxzPWkuY3R4LGE9aS5saXN0ZW5pbmc7YSYmYS5jb3VudCsrLHIucHVzaCh7Y2FsbGJhY2s6bixjb250ZXh0Om8sY3R4Om98fHMsbGlzdGVuaW5nOmF9KX1yZXR1cm4gdH07Yy5vZmY9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9ldmVudHM/KHRoaXMuX2V2ZW50cz1sKHAsdGhpcy5fZXZlbnRzLHQsZSx7Y29udGV4dDpuLGxpc3RlbmVyczp0aGlzLl9saXN0ZW5lcnN9KSx0aGlzKTp0aGlzfSxjLnN0b3BMaXN0ZW5pbmc9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuX2xpc3RlbmluZ1RvO2lmKCFyKXJldHVybiB0aGlzO2Zvcih2YXIgbz10P1t0Ll9saXN0ZW5JZF06bi5rZXlzKHIpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGE9cltvW3NdXTtpZighYSlicmVhazthLm9iai5vZmYoZSxpLHRoaXMpfXJldHVybiBuLmlzRW1wdHkocikmJih0aGlzLl9saXN0ZW5pbmdUbz12b2lkIDApLHRoaXN9O3ZhciBwPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHQpe3ZhciBvLHM9MCxhPXIuY29udGV4dCx1PXIubGlzdGVuZXJzO2lmKGV8fGl8fGEpe2Zvcih2YXIgYz1lP1tlXTpuLmtleXModCk7czxjLmxlbmd0aDtzKyspe2U9Y1tzXTt2YXIgaD10W2VdO2lmKCFoKWJyZWFrO2Zvcih2YXIgbD1bXSxkPTA7ZDxoLmxlbmd0aDtkKyspe3ZhciBmPWhbZF07aSYmaSE9PWYuY2FsbGJhY2smJmkhPT1mLmNhbGxiYWNrLl9jYWxsYmFja3x8YSYmYSE9PWYuY29udGV4dD9sLnB1c2goZik6KG89Zi5saXN0ZW5pbmcpJiYwPT0tLW8uY291bnQmJihkZWxldGUgdVtvLmlkXSxkZWxldGUgby5saXN0ZW5pbmdUb1tvLm9iaklkXSl9bC5sZW5ndGg/dFtlXT1sOmRlbGV0ZSB0W2VdfXJldHVybiBuLnNpemUodCk/dDp2b2lkIDB9Zm9yKHZhciBwPW4ua2V5cyh1KTtzPHAubGVuZ3RoO3MrKylvPXVbcFtzXV0sZGVsZXRlIHVbby5pZF0sZGVsZXRlIG8ubGlzdGVuaW5nVG9bby5vYmpJZF19fTtjLm9uY2U9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWwobSx7fSx0LGUsbi5iaW5kKHRoaXMub2ZmLHRoaXMpKTtyZXR1cm4gdGhpcy5vbihyLHZvaWQgMCxpKX0sYy5saXN0ZW5Ub09uY2U9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWwobSx7fSxlLGksbi5iaW5kKHRoaXMuc3RvcExpc3RlbmluZyx0aGlzLHQpKTtyZXR1cm4gdGhpcy5saXN0ZW5Ubyh0LHIpfTt2YXIgbT1mdW5jdGlvbih0LGUsaSxyKXtpZihpKXt2YXIgbz10W2VdPW4ub25jZShmdW5jdGlvbigpe3IoZSxvKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pO28uX2NhbGxiYWNrPWl9cmV0dXJuIHR9O2MudHJpZ2dlcj1mdW5jdGlvbih0KXtpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2Zvcih2YXIgZT1NYXRoLm1heCgwLGFyZ3VtZW50cy5sZW5ndGgtMSksbj1BcnJheShlKSxpPTA7aTxlO2krKyluW2ldPWFyZ3VtZW50c1tpKzFdO3JldHVybiBsKGcsdGhpcy5fZXZlbnRzLHQsdm9pZCAwLG4pLHRoaXN9O3ZhciBnPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQpe3ZhciByPXRbZV0sbz10LmFsbDtyJiZvJiYobz1vLnNsaWNlKCkpLHImJnYocixpKSxvJiZ2KG8sW2VdLmNvbmNhdChpKSl9cmV0dXJuIHR9LHY9ZnVuY3Rpb24odCxlKXt2YXIgbixpPS0xLHI9dC5sZW5ndGgsbz1lWzBdLHM9ZVsxXSxhPWVbMl07c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCk7cmV0dXJuO2Nhc2UgMTpmb3IoOysraTxyOykobj10W2ldKS5jYWxsYmFjay5jYWxsKG4uY3R4LG8pO3JldHVybjtjYXNlIDI6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCxvLHMpO3JldHVybjtjYXNlIDM6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCxvLHMsYSk7cmV0dXJuO2RlZmF1bHQ6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suYXBwbHkobi5jdHgsZSk7cmV0dXJufX07Yy5iaW5kPWMub24sYy51bmJpbmQ9Yy5vZmYsbi5leHRlbmQoZSxjKTt2YXIgYj1lLk1vZGVsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dHx8e307ZXx8KGU9e30pLHRoaXMuY2lkPW4udW5pcXVlSWQodGhpcy5jaWRQcmVmaXgpLHRoaXMuYXR0cmlidXRlcz17fSxlLmNvbGxlY3Rpb24mJih0aGlzLmNvbGxlY3Rpb249ZS5jb2xsZWN0aW9uKSxlLnBhcnNlJiYoaT10aGlzLnBhcnNlKGksZSl8fHt9KSxpPW4uZGVmYXVsdHMoe30saSxuLnJlc3VsdCh0aGlzLCJkZWZhdWx0cyIpKSx0aGlzLnNldChpLGUpLHRoaXMuY2hhbmdlZD17fSx0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtuLmV4dGVuZChiLnByb3RvdHlwZSxjLHtjaGFuZ2VkOm51bGwsdmFsaWRhdGlvbkVycm9yOm51bGwsaWRBdHRyaWJ1dGU6ImlkIixjaWRQcmVmaXg6ImMiLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHRvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gbi5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfSxlc2NhcGU6ZnVuY3Rpb24odCl7cmV0dXJuIG4uZXNjYXBlKHRoaXMuZ2V0KHQpKX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10aGlzLmdldCh0KX0sbWF0Y2hlczpmdW5jdGlvbih0KXtyZXR1cm4hIW4uaXRlcmF0ZWUodCx0aGlzKSh0aGlzLmF0dHJpYnV0ZXMpfSxzZXQ6ZnVuY3Rpb24odCxlLGkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXM7dmFyIHI7aWYoIm9iamVjdCI9PXR5cGVvZiB0PyhyPXQsaT1lKToocj17fSlbdF09ZSxpfHwoaT17fSksIXRoaXMuX3ZhbGlkYXRlKHIsaSkpcmV0dXJuITE7dmFyIG89aS51bnNldCxzPWkuc2lsZW50LGE9W10sdT10aGlzLl9jaGFuZ2luZzt0aGlzLl9jaGFuZ2luZz0hMCx1fHwodGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzPW4uY2xvbmUodGhpcy5hdHRyaWJ1dGVzKSx0aGlzLmNoYW5nZWQ9e30pO3ZhciBjPXRoaXMuYXR0cmlidXRlcyxoPXRoaXMuY2hhbmdlZCxsPXRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcztmb3IodmFyIGQgaW4gcillPXJbZF0sbi5pc0VxdWFsKGNbZF0sZSl8fGEucHVzaChkKSxuLmlzRXF1YWwobFtkXSxlKT9kZWxldGUgaFtkXTpoW2RdPWUsbz9kZWxldGUgY1tkXTpjW2RdPWU7aWYodGhpcy5pZD10aGlzLmdldCh0aGlzLmlkQXR0cmlidXRlKSwhcyl7YS5sZW5ndGgmJih0aGlzLl9wZW5kaW5nPWkpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKXRoaXMudHJpZ2dlcigiY2hhbmdlOiIrYVtmXSx0aGlzLGNbYVtmXV0saSl9aWYodSlyZXR1cm4gdGhpcztpZighcylmb3IoO3RoaXMuX3BlbmRpbmc7KWk9dGhpcy5fcGVuZGluZyx0aGlzLl9wZW5kaW5nPSExLHRoaXMudHJpZ2dlcigiY2hhbmdlIix0aGlzLGkpO3JldHVybiB0aGlzLl9wZW5kaW5nPSExLHRoaXMuX2NoYW5naW5nPSExLHRoaXN9LHVuc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsdm9pZCAwLG4uZXh0ZW5kKHt9LGUse3Vuc2V0OiEwfSkpfSxjbGVhcjpmdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIGkgaW4gdGhpcy5hdHRyaWJ1dGVzKWVbaV09dm9pZCAwO3JldHVybiB0aGlzLnNldChlLG4uZXh0ZW5kKHt9LHQse3Vuc2V0OiEwfSkpfSxoYXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyFuLmlzRW1wdHkodGhpcy5jaGFuZ2VkKTpuLmhhcyh0aGlzLmNoYW5nZWQsdCl9LGNoYW5nZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiEhdGhpcy5oYXNDaGFuZ2VkKCkmJm4uY2xvbmUodGhpcy5jaGFuZ2VkKTt2YXIgZT10aGlzLl9jaGFuZ2luZz90aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM6dGhpcy5hdHRyaWJ1dGVzLGk9e307Zm9yKHZhciByIGluIHQpe3ZhciBvPXRbcl07bi5pc0VxdWFsKGVbcl0sbyl8fChpW3JdPW8pfXJldHVybiEhbi5zaXplKGkpJiZpfSxwcmV2aW91czpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzP3RoaXMuX3ByZXZpb3VzQXR0cmlidXRlc1t0XTpudWxsfSxwcmV2aW91c0F0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpfSxmZXRjaDpmdW5jdGlvbih0KXt0PW4uZXh0ZW5kKHtwYXJzZTohMH0sdCk7dmFyIGU9dGhpcyxpPXQuc3VjY2VzcztyZXR1cm4gdC5zdWNjZXNzPWZ1bmN0aW9uKG4pe3ZhciByPXQucGFyc2U/ZS5wYXJzZShuLHQpOm47aWYoIWUuc2V0KHIsdCkpcmV0dXJuITE7aSYmaS5jYWxsKHQuY29udGV4dCxlLG4sdCksZS50cmlnZ2VyKCJzeW5jIixlLG4sdCl9LFIodGhpcyx0KSx0aGlzLnN5bmMoInJlYWQiLHRoaXMsdCl9LHNhdmU6ZnVuY3Rpb24odCxlLGkpe3ZhciByO251bGw9PXR8fCJvYmplY3QiPT10eXBlb2YgdD8ocj10LGk9ZSk6KHI9e30pW3RdPWU7dmFyIG89KGk9bi5leHRlbmQoe3ZhbGlkYXRlOiEwLHBhcnNlOiEwfSxpKSkud2FpdDtpZihyJiYhbyl7aWYoIXRoaXMuc2V0KHIsaSkpcmV0dXJuITF9ZWxzZSBpZighdGhpcy5fdmFsaWRhdGUocixpKSlyZXR1cm4hMTt2YXIgcz10aGlzLGE9aS5zdWNjZXNzLHU9dGhpcy5hdHRyaWJ1dGVzO2kuc3VjY2Vzcz1mdW5jdGlvbih0KXtzLmF0dHJpYnV0ZXM9dTt2YXIgZT1pLnBhcnNlP3MucGFyc2UodCxpKTp0O2lmKG8mJihlPW4uZXh0ZW5kKHt9LHIsZSkpLGUmJiFzLnNldChlLGkpKXJldHVybiExO2EmJmEuY2FsbChpLmNvbnRleHQscyx0LGkpLHMudHJpZ2dlcigic3luYyIscyx0LGkpfSxSKHRoaXMsaSksciYmbyYmKHRoaXMuYXR0cmlidXRlcz1uLmV4dGVuZCh7fSx1LHIpKTt2YXIgYz10aGlzLmlzTmV3KCk/ImNyZWF0ZSI6aS5wYXRjaD8icGF0Y2giOiJ1cGRhdGUiOyJwYXRjaCIhPT1jfHxpLmF0dHJzfHwoaS5hdHRycz1yKTt2YXIgaD10aGlzLnN5bmMoYyx0aGlzLGkpO3JldHVybiB0aGlzLmF0dHJpYnV0ZXM9dSxofSxkZXN0cm95OmZ1bmN0aW9uKHQpe3Q9dD9uLmNsb25lKHQpOnt9O3ZhciBlPXRoaXMsaT10LnN1Y2Nlc3Mscj10LndhaXQsbz1mdW5jdGlvbigpe2Uuc3RvcExpc3RlbmluZygpLGUudHJpZ2dlcigiZGVzdHJveSIsZSxlLmNvbGxlY3Rpb24sdCl9O3Quc3VjY2Vzcz1mdW5jdGlvbihuKXtyJiZvKCksaSYmaS5jYWxsKHQuY29udGV4dCxlLG4sdCksZS5pc05ldygpfHxlLnRyaWdnZXIoInN5bmMiLGUsbix0KX07dmFyIHM9ITE7cmV0dXJuIHRoaXMuaXNOZXcoKT9uLmRlZmVyKHQuc3VjY2Vzcyk6KFIodGhpcyx0KSxzPXRoaXMuc3luYygiZGVsZXRlIix0aGlzLHQpKSxyfHxvKCksc30sdXJsOmZ1bmN0aW9uKCl7dmFyIHQ9bi5yZXN1bHQodGhpcywidXJsUm9vdCIpfHxuLnJlc3VsdCh0aGlzLmNvbGxlY3Rpb24sInVybCIpfHxEKCk7aWYodGhpcy5pc05ldygpKXJldHVybiB0O3ZhciBlPXRoaXMuZ2V0KHRoaXMuaWRBdHRyaWJ1dGUpO3JldHVybiB0LnJlcGxhY2UoL1teXC9dJC8sIiQmLyIpK2VuY29kZVVSSUNvbXBvbmVudChlKX0scGFyc2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hdHRyaWJ1dGVzKX0saXNOZXc6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5oYXModGhpcy5pZEF0dHJpYnV0ZSl9LGlzVmFsaWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlKHt9LG4uZGVmYXVsdHMoe3ZhbGlkYXRlOiEwfSx0KSl9LF92YWxpZGF0ZTpmdW5jdGlvbih0LGUpe2lmKCFlLnZhbGlkYXRlfHwhdGhpcy52YWxpZGF0ZSlyZXR1cm4hMDt0PW4uZXh0ZW5kKHt9LHRoaXMuYXR0cmlidXRlcyx0KTt2YXIgaT10aGlzLnZhbGlkYXRpb25FcnJvcj10aGlzLnZhbGlkYXRlKHQsZSl8fG51bGw7cmV0dXJuIWl8fCh0aGlzLnRyaWdnZXIoImludmFsaWQiLHRoaXMsaSxuLmV4dGVuZChlLHt2YWxpZGF0aW9uRXJyb3I6aX0pKSwhMSl9fSkscyhiLHtrZXlzOjEsdmFsdWVzOjEscGFpcnM6MSxpbnZlcnQ6MSxwaWNrOjAsb21pdDowLGNoYWluOjEsaXNFbXB0eToxfSwiYXR0cmlidXRlcyIpO3ZhciB5PWUuQ29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2V8fChlPXt9KSxlLm1vZGVsJiYodGhpcy5tb2RlbD1lLm1vZGVsKSx2b2lkIDAhPT1lLmNvbXBhcmF0b3ImJih0aGlzLmNvbXBhcmF0b3I9ZS5jb21wYXJhdG9yKSx0aGlzLl9yZXNldCgpLHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCYmdGhpcy5yZXNldCh0LG4uZXh0ZW5kKHtzaWxlbnQ6ITB9LGUpKX0sXz17YWRkOiEwLHJlbW92ZTohMCxtZXJnZTohMH0sdz17YWRkOiEwLHJlbW92ZTohMX0seD1mdW5jdGlvbih0LGUsbil7bj1NYXRoLm1pbihNYXRoLm1heChuLDApLHQubGVuZ3RoKTtmb3IodmFyIGk9QXJyYXkodC5sZW5ndGgtbikscj1lLmxlbmd0aCxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT10W28rbl07Zm9yKG89MDtvPHI7bysrKXRbbytuXT1lW29dO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspdFtvK3Irbl09aVtvXX07bi5leHRlbmQoeS5wcm90b3R5cGUsYyx7bW9kZWw6Yixpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSx0b0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTih0KX0pfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldCh0LG4uZXh0ZW5kKHttZXJnZTohMX0sZSx3KSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe2U9bi5leHRlbmQoe30sZSk7dmFyIGk9IW4uaXNBcnJheSh0KTt0PWk/W3RdOm4uY2xvbmUodCk7dmFyIHI9dGhpcy5fcmVtb3ZlTW9kZWxzKHQsZSk7cmV0dXJuIWUuc2lsZW50JiZyJiZ0aGlzLnRyaWdnZXIoInVwZGF0ZSIsdGhpcyxlKSxpP3JbMF06cn0sc2V0OmZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dCl7KGU9bi5kZWZhdWx0cyh7fSxlLF8pKS5wYXJzZSYmIXRoaXMuX2lzTW9kZWwodCkmJih0PXRoaXMucGFyc2UodCxlKSk7dmFyIGk9IW4uaXNBcnJheSh0KTt0PWk/W3RdOnQuc2xpY2UoKTt2YXIgcj1lLmF0O251bGwhPXImJihyPStyKSxyPDAmJihyKz10aGlzLmxlbmd0aCsxKTtmb3IodmFyIG8scz1bXSxhPVtdLHU9W10sYz17fSxoPWUuYWRkLGw9ZS5tZXJnZSxkPWUucmVtb3ZlLGY9ITEscD10aGlzLmNvbXBhcmF0b3ImJm51bGw9PXImJiExIT09ZS5zb3J0LG09bi5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpP3RoaXMuY29tcGFyYXRvcjpudWxsLGc9MDtnPHQubGVuZ3RoO2crKyl7bz10W2ddO3ZhciB2PXRoaXMuZ2V0KG8pO2lmKHYpe2lmKGwmJm8hPT12KXt2YXIgYj10aGlzLl9pc01vZGVsKG8pP28uYXR0cmlidXRlczpvO2UucGFyc2UmJihiPXYucGFyc2UoYixlKSksdi5zZXQoYixlKSxwJiYhZiYmKGY9di5oYXNDaGFuZ2VkKG0pKX1jW3YuY2lkXXx8KGNbdi5jaWRdPSEwLHMucHVzaCh2KSksdFtnXT12fWVsc2UgaCYmKG89dFtnXT10aGlzLl9wcmVwYXJlTW9kZWwobyxlKSkmJihhLnB1c2gobyksdGhpcy5fYWRkUmVmZXJlbmNlKG8sZSksY1tvLmNpZF09ITAscy5wdXNoKG8pKX1pZihkKXtmb3IoZz0wO2c8dGhpcy5sZW5ndGg7ZysrKW89dGhpcy5tb2RlbHNbZ10sY1tvLmNpZF18fHUucHVzaChvKTt1Lmxlbmd0aCYmdGhpcy5fcmVtb3ZlTW9kZWxzKHUsZSl9dmFyIHk9ITEsdz0hcCYmaCYmZDtpZihzLmxlbmd0aCYmdz8oeT10aGlzLmxlbmd0aCE9cy5sZW5ndGh8fG4uc29tZSh0aGlzLm1vZGVscyxmdW5jdGlvbih0LGUpe3JldHVybiB0IT09c1tlXX0pLHRoaXMubW9kZWxzLmxlbmd0aD0wLHgodGhpcy5tb2RlbHMscywwKSx0aGlzLmxlbmd0aD10aGlzLm1vZGVscy5sZW5ndGgpOmEubGVuZ3RoJiYocCYmKGY9ITApLHgodGhpcy5tb2RlbHMsYSxudWxsPT1yP3RoaXMubGVuZ3RoOnIpLHRoaXMubGVuZ3RoPXRoaXMubW9kZWxzLmxlbmd0aCksZiYmdGhpcy5zb3J0KHtzaWxlbnQ6ITB9KSwhZS5zaWxlbnQpe2ZvcihnPTA7ZzxhLmxlbmd0aDtnKyspbnVsbCE9ciYmKGUuaW5kZXg9citnKSwobz1hW2ddKS50cmlnZ2VyKCJhZGQiLG8sdGhpcyxlKTsoZnx8eSkmJnRoaXMudHJpZ2dlcigic29ydCIsdGhpcyxlKSwoYS5sZW5ndGh8fHUubGVuZ3RoKSYmdGhpcy50cmlnZ2VyKCJ1cGRhdGUiLHRoaXMsZSl9cmV0dXJuIGk/dFswXTp0fX0scmVzZXQ6ZnVuY3Rpb24odCxlKXtlPWU/bi5jbG9uZShlKTp7fTtmb3IodmFyIGk9MDtpPHRoaXMubW9kZWxzLmxlbmd0aDtpKyspdGhpcy5fcmVtb3ZlUmVmZXJlbmNlKHRoaXMubW9kZWxzW2ldLGUpO3JldHVybiBlLnByZXZpb3VzTW9kZWxzPXRoaXMubW9kZWxzLHRoaXMuX3Jlc2V0KCksdD10aGlzLmFkZCh0LG4uZXh0ZW5kKHtzaWxlbnQ6ITB9LGUpKSxlLnNpbGVudHx8dGhpcy50cmlnZ2VyKCJyZXNldCIsdGhpcyxlKSx0fSxwdXNoOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsbi5leHRlbmQoe2F0OnRoaXMubGVuZ3RofSxlKSl9LHBvcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0KHRoaXMubGVuZ3RoLTEpO3JldHVybiB0aGlzLnJlbW92ZShlLHQpfSx1bnNoaWZ0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsbi5leHRlbmQoe2F0OjB9LGUpKX0sc2hpZnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdCgwKTtyZXR1cm4gdGhpcy5yZW1vdmUoZSx0KX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gby5hcHBseSh0aGlzLm1vZGVscyxhcmd1bWVudHMpfSxnZXQ6ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dGhpcy5tb2RlbElkKHRoaXMuX2lzTW9kZWwodCk/dC5hdHRyaWJ1dGVzOnQpO3JldHVybiB0aGlzLl9ieUlkW3RdfHx0aGlzLl9ieUlkW2VdfHx0aGlzLl9ieUlkW3QuY2lkXX19LGF0OmZ1bmN0aW9uKHQpe3JldHVybiB0PDAmJih0Kz10aGlzLmxlbmd0aCksdGhpcy5tb2RlbHNbdF19LHdoZXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbZT8iZmluZCI6ImZpbHRlciJdKHQpfSxmaW5kV2hlcmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud2hlcmUodCwhMCl9LHNvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21wYXJhdG9yO2lmKCFlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNvcnQgYSBzZXQgd2l0aG91dCBhIGNvbXBhcmF0b3IiKTt0fHwodD17fSk7dmFyIGk9ZS5sZW5ndGg7cmV0dXJuIG4uaXNGdW5jdGlvbihlKSYmKGU9bi5iaW5kKGUsdGhpcykpLDE9PT1pfHxuLmlzU3RyaW5nKGUpP3RoaXMubW9kZWxzPXRoaXMuc29ydEJ5KGUpOnRoaXMubW9kZWxzLnNvcnQoZSksdC5zaWxlbnR8fHRoaXMudHJpZ2dlcigic29ydCIsdGhpcyx0KSx0aGlzfSxwbHVjazpmdW5jdGlvbih0KXtyZXR1cm4gbi5pbnZva2UodGhpcy5tb2RlbHMsImdldCIsdCl9LGZldGNoOmZ1bmN0aW9uKHQpe3ZhciBlPSh0PW4uZXh0ZW5kKHtwYXJzZTohMH0sdCkpLnN1Y2Nlc3MsaT10aGlzO3JldHVybiB0LnN1Y2Nlc3M9ZnVuY3Rpb24obil7dmFyIHI9dC5yZXNldD8icmVzZXQiOiJzZXQiO2lbcl0obix0KSxlJiZlLmNhbGwodC5jb250ZXh0LGksbix0KSxpLnRyaWdnZXIoInN5bmMiLGksbix0KX0sUih0aGlzLHQpLHRoaXMuc3luYygicmVhZCIsdGhpcyx0KX0sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9KGU9ZT9uLmNsb25lKGUpOnt9KS53YWl0O2lmKCEodD10aGlzLl9wcmVwYXJlTW9kZWwodCxlKSkpcmV0dXJuITE7aXx8dGhpcy5hZGQodCxlKTt2YXIgcj10aGlzLG89ZS5zdWNjZXNzO3JldHVybiBlLnN1Y2Nlc3M9ZnVuY3Rpb24odCxlLG4pe2kmJnIuYWRkKHQsbiksbyYmby5jYWxsKG4uY29udGV4dCx0LGUsbil9LHQuc2F2ZShudWxsLGUpLHR9LHBhcnNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubW9kZWxzLHttb2RlbDp0aGlzLm1vZGVsLGNvbXBhcmF0b3I6dGhpcy5jb21wYXJhdG9yfSl9LG1vZGVsSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbdGhpcy5tb2RlbC5wcm90b3R5cGUuaWRBdHRyaWJ1dGV8fCJpZCJdfSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmxlbmd0aD0wLHRoaXMubW9kZWxzPVtdLHRoaXMuX2J5SWQ9e319LF9wcmVwYXJlTW9kZWw6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9pc01vZGVsKHQpKXJldHVybiB0LmNvbGxlY3Rpb258fCh0LmNvbGxlY3Rpb249dGhpcyksdDsoZT1lP24uY2xvbmUoZSk6e30pLmNvbGxlY3Rpb249dGhpczt2YXIgaT1uZXcgdGhpcy5tb2RlbCh0LGUpO3JldHVybiBpLnZhbGlkYXRpb25FcnJvcj8odGhpcy50cmlnZ2VyKCJpbnZhbGlkIix0aGlzLGkudmFsaWRhdGlvbkVycm9yLGUpLCExKTppfSxfcmVtb3ZlTW9kZWxzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dGhpcy5nZXQodFtpXSk7aWYocil7dmFyIG89dGhpcy5pbmRleE9mKHIpO3RoaXMubW9kZWxzLnNwbGljZShvLDEpLHRoaXMubGVuZ3RoLS0sZS5zaWxlbnR8fChlLmluZGV4PW8sci50cmlnZ2VyKCJyZW1vdmUiLHIsdGhpcyxlKSksbi5wdXNoKHIpLHRoaXMuX3JlbW92ZVJlZmVyZW5jZShyLGUpfX1yZXR1cm4hIW4ubGVuZ3RoJiZufSxfaXNNb2RlbDpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGJ9LF9hZGRSZWZlcmVuY2U6ZnVuY3Rpb24odCxlKXt0aGlzLl9ieUlkW3QuY2lkXT10O3ZhciBuPXRoaXMubW9kZWxJZCh0LmF0dHJpYnV0ZXMpO251bGwhPW4mJih0aGlzLl9ieUlkW25dPXQpLHQub24oImFsbCIsdGhpcy5fb25Nb2RlbEV2ZW50LHRoaXMpfSxfcmVtb3ZlUmVmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7ZGVsZXRlIHRoaXMuX2J5SWRbdC5jaWRdO3ZhciBuPXRoaXMubW9kZWxJZCh0LmF0dHJpYnV0ZXMpO251bGwhPW4mJmRlbGV0ZSB0aGlzLl9ieUlkW25dLHRoaXM9PT10LmNvbGxlY3Rpb24mJmRlbGV0ZSB0LmNvbGxlY3Rpb24sdC5vZmYoImFsbCIsdGhpcy5fb25Nb2RlbEV2ZW50LHRoaXMpfSxfb25Nb2RlbEV2ZW50OmZ1bmN0aW9uKHQsZSxuLGkpe2lmKCJhZGQiIT09dCYmInJlbW92ZSIhPT10fHxuPT09dGhpcyl7aWYoImRlc3Ryb3kiPT09dCYmdGhpcy5yZW1vdmUoZSxpKSwiY2hhbmdlIj09PXQpe3ZhciByPXRoaXMubW9kZWxJZChlLnByZXZpb3VzQXR0cmlidXRlcygpKSxvPXRoaXMubW9kZWxJZChlLmF0dHJpYnV0ZXMpO3IhPT1vJiYobnVsbCE9ciYmZGVsZXRlIHRoaXMuX2J5SWRbcl0sbnVsbCE9byYmKHRoaXMuX2J5SWRbb109ZSkpfXRoaXMudHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0pLHMoeSx7Zm9yRWFjaDozLGVhY2g6MyxtYXA6Myxjb2xsZWN0OjMscmVkdWNlOjQsZm9sZGw6NCxpbmplY3Q6NCxyZWR1Y2VSaWdodDo0LGZvbGRyOjQsZmluZDozLGRldGVjdDozLGZpbHRlcjozLHNlbGVjdDozLHJlamVjdDozLGV2ZXJ5OjMsYWxsOjMsc29tZTozLGFueTozLGluY2x1ZGU6MyxpbmNsdWRlczozLGNvbnRhaW5zOjMsaW52b2tlOjAsbWF4OjMsbWluOjMsdG9BcnJheToxLHNpemU6MSxmaXJzdDozLGhlYWQ6Myx0YWtlOjMsaW5pdGlhbDozLHJlc3Q6Myx0YWlsOjMsZHJvcDozLGxhc3Q6Myx3aXRob3V0OjAsZGlmZmVyZW5jZTowLGluZGV4T2Y6MyxzaHVmZmxlOjEsbGFzdEluZGV4T2Y6Myxpc0VtcHR5OjEsY2hhaW46MSxzYW1wbGU6MyxwYXJ0aXRpb246Myxncm91cEJ5OjMsY291bnRCeTozLHNvcnRCeTozLGluZGV4Qnk6M30sIm1vZGVscyIpO3ZhciBNPWUuVmlldz1mdW5jdGlvbih0KXt0aGlzLmNpZD1uLnVuaXF1ZUlkKCJ2aWV3Iiksbi5leHRlbmQodGhpcyxuLnBpY2sodCxFKSksdGhpcy5fZW5zdXJlRWxlbWVudCgpLHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFM9L14oXFMrKVxzKiguKikkLyxFPVsibW9kZWwiLCJjb2xsZWN0aW9uIiwiZWwiLCJpZCIsImF0dHJpYnV0ZXMiLCJjbGFzc05hbWUiLCJ0YWdOYW1lIiwiZXZlbnRzIl07bi5leHRlbmQoTS5wcm90b3R5cGUsYyx7dGFnTmFtZToiZGl2IiwkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLiRlbC5maW5kKHQpfSxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbW92ZUVsZW1lbnQoKSx0aGlzLnN0b3BMaXN0ZW5pbmcoKSx0aGlzfSxfcmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMuJGVsLnJlbW92ZSgpfSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnVuZGVsZWdhdGVFdmVudHMoKSx0aGlzLl9zZXRFbGVtZW50KHQpLHRoaXMuZGVsZWdhdGVFdmVudHMoKSx0aGlzfSxfc2V0RWxlbWVudDpmdW5jdGlvbih0KXt0aGlzLiRlbD10IGluc3RhbmNlb2YgZS4kP3Q6ZS4kKHQpLHRoaXMuZWw9dGhpcy4kZWxbMF19LGRlbGVnYXRlRXZlbnRzOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PW4ucmVzdWx0KHRoaXMsImV2ZW50cyIpKSwhdClyZXR1cm4gdGhpcztmb3IodmFyIGUgaW4gdGhpcy51bmRlbGVnYXRlRXZlbnRzKCksdCl7dmFyIGk9dFtlXTtpZihuLmlzRnVuY3Rpb24oaSl8fChpPXRoaXNbaV0pLGkpe3ZhciByPWUubWF0Y2goUyk7dGhpcy5kZWxlZ2F0ZShyWzFdLHJbMl0sbi5iaW5kKGksdGhpcykpfX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLiRlbC5vbih0KyIuZGVsZWdhdGVFdmVudHMiK3RoaXMuY2lkLGUsbiksdGhpc30sdW5kZWxlZ2F0ZUV2ZW50czpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbCYmdGhpcy4kZWwub2ZmKCIuZGVsZWdhdGVFdmVudHMiK3RoaXMuY2lkKSx0aGlzfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy4kZWwub2ZmKHQrIi5kZWxlZ2F0ZUV2ZW50cyIrdGhpcy5jaWQsZSxuKSx0aGlzfSxfY3JlYXRlRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KX0sX2Vuc3VyZUVsZW1lbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLmVsKXRoaXMuc2V0RWxlbWVudChuLnJlc3VsdCh0aGlzLCJlbCIpKTtlbHNle3ZhciB0PW4uZXh0ZW5kKHt9LG4ucmVzdWx0KHRoaXMsImF0dHJpYnV0ZXMiKSk7dGhpcy5pZCYmKHQuaWQ9bi5yZXN1bHQodGhpcywiaWQiKSksdGhpcy5jbGFzc05hbWUmJih0LmNsYXNzPW4ucmVzdWx0KHRoaXMsImNsYXNzTmFtZSIpKSx0aGlzLnNldEVsZW1lbnQodGhpcy5fY3JlYXRlRWxlbWVudChuLnJlc3VsdCh0aGlzLCJ0YWdOYW1lIikpKSx0aGlzLl9zZXRBdHRyaWJ1dGVzKHQpfX0sX3NldEF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7dGhpcy4kZWwuYXR0cih0KX19KSxlLnN5bmM9ZnVuY3Rpb24odCxpLHIpe3ZhciBvPUFbdF07bi5kZWZhdWx0cyhyfHwocj17fSkse2VtdWxhdGVIVFRQOmUuZW11bGF0ZUhUVFAsZW11bGF0ZUpTT046ZS5lbXVsYXRlSlNPTn0pO3ZhciBzPXt0eXBlOm8sZGF0YVR5cGU6Impzb24ifTtpZihyLnVybHx8KHMudXJsPW4ucmVzdWx0KGksInVybCIpfHxEKCkpLG51bGwhPXIuZGF0YXx8IWl8fCJjcmVhdGUiIT09dCYmInVwZGF0ZSIhPT10JiYicGF0Y2giIT09dHx8KHMuY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLHMuZGF0YT1KU09OLnN0cmluZ2lmeShyLmF0dHJzfHxpLnRvSlNPTihyKSkpLHIuZW11bGF0ZUpTT04mJihzLmNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHMuZGF0YT1zLmRhdGE/e21vZGVsOnMuZGF0YX06e30pLHIuZW11bGF0ZUhUVFAmJigiUFVUIj09PW98fCJERUxFVEUiPT09b3x8IlBBVENIIj09PW8pKXtzLnR5cGU9IlBPU1QiLHIuZW11bGF0ZUpTT04mJihzLmRhdGEuX21ldGhvZD1vKTt2YXIgYT1yLmJlZm9yZVNlbmQ7ci5iZWZvcmVTZW5kPWZ1bmN0aW9uKHQpe2lmKHQuc2V0UmVxdWVzdEhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsbyksYSlyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSJHRVQiPT09cy50eXBlfHxyLmVtdWxhdGVKU09OfHwocy5wcm9jZXNzRGF0YT0hMSk7dmFyIHU9ci5lcnJvcjtyLmVycm9yPWZ1bmN0aW9uKHQsZSxuKXtyLnRleHRTdGF0dXM9ZSxyLmVycm9yVGhyb3duPW4sdSYmdS5jYWxsKHIuY29udGV4dCx0LGUsbil9O3ZhciBjPXIueGhyPWUuYWpheChuLmV4dGVuZChzLHIpKTtyZXR1cm4gaS50cmlnZ2VyKCJyZXF1ZXN0IixpLGMsciksY307dmFyIEE9e2NyZWF0ZToiUE9TVCIsdXBkYXRlOiJQVVQiLHBhdGNoOiJQQVRDSCIsZGVsZXRlOiJERUxFVEUiLHJlYWQ6IkdFVCJ9O2UuYWpheD1mdW5jdGlvbigpe3JldHVybiBlLiQuYWpheC5hcHBseShlLiQsYXJndW1lbnRzKX07dmFyIEM9ZS5Sb3V0ZXI9ZnVuY3Rpb24odCl7dHx8KHQ9e30pLHQucm91dGVzJiYodGhpcy5yb3V0ZXM9dC5yb3V0ZXMpLHRoaXMuX2JpbmRSb3V0ZXMoKSx0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxrPS9cKCguKj8pXCkvZyxPPS8oXChcPyk/Olx3Ky9nLFA9L1wqXHcrL2csVD0vW1wte31cW1xdKz8uLFxcXF4kfCNcc10vZztuLmV4dGVuZChDLnByb3RvdHlwZSxjLHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyb3V0ZTpmdW5jdGlvbih0LGkscil7bi5pc1JlZ0V4cCh0KXx8KHQ9dGhpcy5fcm91dGVUb1JlZ0V4cCh0KSksbi5pc0Z1bmN0aW9uKGkpJiYocj1pLGk9IiIpLHJ8fChyPXRoaXNbaV0pO3ZhciBvPXRoaXM7cmV0dXJuIGUuaGlzdG9yeS5yb3V0ZSh0LGZ1bmN0aW9uKG4pe3ZhciBzPW8uX2V4dHJhY3RQYXJhbWV0ZXJzKHQsbik7ITEhPT1vLmV4ZWN1dGUocixzLGkpJiYoby50cmlnZ2VyLmFwcGx5KG8sWyJyb3V0ZToiK2ldLmNvbmNhdChzKSksby50cmlnZ2VyKCJyb3V0ZSIsaSxzKSxlLmhpc3RvcnkudHJpZ2dlcigicm91dGUiLG8saSxzKSl9KSx0aGlzfSxleGVjdXRlOmZ1bmN0aW9uKHQsZSxuKXt0JiZ0LmFwcGx5KHRoaXMsZSl9LG5hdmlnYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuaGlzdG9yeS5uYXZpZ2F0ZSh0LG4pLHRoaXN9LF9iaW5kUm91dGVzOmZ1bmN0aW9uKCl7aWYodGhpcy5yb3V0ZXMpe3RoaXMucm91dGVzPW4ucmVzdWx0KHRoaXMsInJvdXRlcyIpO2Zvcih2YXIgdCxlPW4ua2V5cyh0aGlzLnJvdXRlcyk7bnVsbCE9KHQ9ZS5wb3AoKSk7KXRoaXMucm91dGUodCx0aGlzLnJvdXRlc1t0XSl9fSxfcm91dGVUb1JlZ0V4cDpmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoVCwiXFwkJiIpLnJlcGxhY2UoaywiKD86JDEpPyIpLnJlcGxhY2UoTyxmdW5jdGlvbih0LGUpe3JldHVybiBlP3Q6IihbXi8/XSspIn0pLnJlcGxhY2UoUCwiKFteP10qPykiKSxuZXcgUmVnRXhwKCJeIit0KyIoPzpcXD8oW1xcc1xcU10qKSk/JCIpfSxfZXh0cmFjdFBhcmFtZXRlcnM6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4ZWMoZSkuc2xpY2UoMSk7cmV0dXJuIG4ubWFwKGksZnVuY3Rpb24odCxlKXtyZXR1cm4gZT09PWkubGVuZ3RoLTE/dHx8bnVsbDp0P2RlY29kZVVSSUNvbXBvbmVudCh0KTpudWxsfSl9fSk7dmFyIGo9ZS5IaXN0b3J5PWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVycz1bXSx0aGlzLmNoZWNrVXJsPW4uYmluZCh0aGlzLmNoZWNrVXJsLHRoaXMpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYodGhpcy5sb2NhdGlvbj13aW5kb3cubG9jYXRpb24sdGhpcy5oaXN0b3J5PXdpbmRvdy5oaXN0b3J5KX0sST0vXlsjXC9dfFxzKyQvZyxMPS9eXC8rfFwvKyQvZyxCPS8jLiokLztqLnN0YXJ0ZWQ9ITEsbi5leHRlbmQoai5wcm90b3R5cGUsYyx7aW50ZXJ2YWw6NTAsYXRSb290OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9bXlwvXSQvLCIkJi8iKTtyZXR1cm4gdD09PXRoaXMucm9vdCYmIXRoaXMuZ2V0U2VhcmNoKCl9LG1hdGNoUm9vdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGVjb2RlRnJhZ21lbnQodGhpcy5sb2NhdGlvbi5wYXRobmFtZSksZT10LnNsaWNlKDAsdGhpcy5yb290Lmxlbmd0aC0xKSsiLyI7cmV0dXJuIGU9PT10aGlzLnJvb3R9LGRlY29kZUZyYWdtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBkZWNvZGVVUkkodC5yZXBsYWNlKC8lMjUvZywiJTI1MjUiKSl9LGdldFNlYXJjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiovLCIiKS5tYXRjaCgvXD8uKy8pO3JldHVybiB0P3RbMF06IiJ9LGdldEhhc2g6ZnVuY3Rpb24odCl7dmFyIGU9KHR8fHRoaXMpLmxvY2F0aW9uLmhyZWYubWF0Y2goLyMoLiopJC8pO3JldHVybiBlP2VbMV06IiJ9LGdldFBhdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRlY29kZUZyYWdtZW50KHRoaXMubG9jYXRpb24ucGF0aG5hbWUrdGhpcy5nZXRTZWFyY2goKSkuc2xpY2UodGhpcy5yb290Lmxlbmd0aC0xKTtyZXR1cm4iLyI9PT10LmNoYXJBdCgwKT90LnNsaWNlKDEpOnR9LGdldEZyYWdtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10JiYodD10aGlzLl91c2VQdXNoU3RhdGV8fCF0aGlzLl93YW50c0hhc2hDaGFuZ2U/dGhpcy5nZXRQYXRoKCk6dGhpcy5nZXRIYXNoKCkpLHQucmVwbGFjZShJLCIiKX0sc3RhcnQ6ZnVuY3Rpb24odCl7aWYoai5zdGFydGVkKXRocm93IG5ldyBFcnJvcigiQmFja2JvbmUuaGlzdG9yeSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQiKTtpZihqLnN0YXJ0ZWQ9ITAsdGhpcy5vcHRpb25zPW4uZXh0ZW5kKHtyb290OiIvIn0sdGhpcy5vcHRpb25zLHQpLHRoaXMucm9vdD10aGlzLm9wdGlvbnMucm9vdCx0aGlzLl93YW50c0hhc2hDaGFuZ2U9ITEhPT10aGlzLm9wdGlvbnMuaGFzaENoYW5nZSx0aGlzLl9oYXNIYXNoQ2hhbmdlPSJvbmhhc2hjaGFuZ2UiaW4gd2luZG93JiYodm9pZCAwPT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+NyksdGhpcy5fdXNlSGFzaENoYW5nZT10aGlzLl93YW50c0hhc2hDaGFuZ2UmJnRoaXMuX2hhc0hhc2hDaGFuZ2UsdGhpcy5fd2FudHNQdXNoU3RhdGU9ISF0aGlzLm9wdGlvbnMucHVzaFN0YXRlLHRoaXMuX2hhc1B1c2hTdGF0ZT0hKCF0aGlzLmhpc3Rvcnl8fCF0aGlzLmhpc3RvcnkucHVzaFN0YXRlKSx0aGlzLl91c2VQdXNoU3RhdGU9dGhpcy5fd2FudHNQdXNoU3RhdGUmJnRoaXMuX2hhc1B1c2hTdGF0ZSx0aGlzLmZyYWdtZW50PXRoaXMuZ2V0RnJhZ21lbnQoKSx0aGlzLnJvb3Q9KCIvIit0aGlzLnJvb3QrIi8iKS5yZXBsYWNlKEwsIi8iKSx0aGlzLl93YW50c0hhc2hDaGFuZ2UmJnRoaXMuX3dhbnRzUHVzaFN0YXRlKXtpZighdGhpcy5faGFzUHVzaFN0YXRlJiYhdGhpcy5hdFJvb3QoKSl7dmFyIGU9dGhpcy5yb290LnNsaWNlKDAsLTEpfHwiLyI7cmV0dXJuIHRoaXMubG9jYXRpb24ucmVwbGFjZShlKyIjIit0aGlzLmdldFBhdGgoKSksITB9dGhpcy5faGFzUHVzaFN0YXRlJiZ0aGlzLmF0Um9vdCgpJiZ0aGlzLm5hdmlnYXRlKHRoaXMuZ2V0SGFzaCgpLHtyZXBsYWNlOiEwfSl9aWYoIXRoaXMuX2hhc0hhc2hDaGFuZ2UmJnRoaXMuX3dhbnRzSGFzaENoYW5nZSYmIXRoaXMuX3VzZVB1c2hTdGF0ZSl7dGhpcy5pZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksdGhpcy5pZnJhbWUuc3JjPSJqYXZhc2NyaXB0OjAiLHRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuaWZyYW1lLnRhYkluZGV4PS0xO3ZhciBpPWRvY3VtZW50LmJvZHkscj1pLmluc2VydEJlZm9yZSh0aGlzLmlmcmFtZSxpLmZpcnN0Q2hpbGQpLmNvbnRlbnRXaW5kb3c7ci5kb2N1bWVudC5vcGVuKCksci5kb2N1bWVudC5jbG9zZSgpLHIubG9jYXRpb24uaGFzaD0iIyIrdGhpcy5mcmFnbWVudH12YXIgbz13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXR0YWNoRXZlbnQoIm9uIit0LGUpfTtpZih0aGlzLl91c2VQdXNoU3RhdGU/bygicG9wc3RhdGUiLHRoaXMuY2hlY2tVcmwsITEpOnRoaXMuX3VzZUhhc2hDaGFuZ2UmJiF0aGlzLmlmcmFtZT9vKCJoYXNoY2hhbmdlIix0aGlzLmNoZWNrVXJsLCExKTp0aGlzLl93YW50c0hhc2hDaGFuZ2UmJih0aGlzLl9jaGVja1VybEludGVydmFsPXNldEludGVydmFsKHRoaXMuY2hlY2tVcmwsdGhpcy5pbnRlcnZhbCkpLCF0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiB0aGlzLmxvYWRVcmwoKX0sc3RvcDpmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyfHxmdW5jdGlvbih0LGUpe3JldHVybiBkZXRhY2hFdmVudCgib24iK3QsZSl9O3RoaXMuX3VzZVB1c2hTdGF0ZT90KCJwb3BzdGF0ZSIsdGhpcy5jaGVja1VybCwhMSk6dGhpcy5fdXNlSGFzaENoYW5nZSYmIXRoaXMuaWZyYW1lJiZ0KCJoYXNoY2hhbmdlIix0aGlzLmNoZWNrVXJsLCExKSx0aGlzLmlmcmFtZSYmKGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5pZnJhbWUpLHRoaXMuaWZyYW1lPW51bGwpLHRoaXMuX2NoZWNrVXJsSW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tVcmxJbnRlcnZhbCksai5zdGFydGVkPSExfSxyb3V0ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlcnMudW5zaGlmdCh7cm91dGU6dCxjYWxsYmFjazplfSl9LGNoZWNrVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RnJhZ21lbnQoKTtpZihlPT09dGhpcy5mcmFnbWVudCYmdGhpcy5pZnJhbWUmJihlPXRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSksZT09PXRoaXMuZnJhZ21lbnQpcmV0dXJuITE7dGhpcy5pZnJhbWUmJnRoaXMubmF2aWdhdGUoZSksdGhpcy5sb2FkVXJsKCl9LGxvYWRVcmw6ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLm1hdGNoUm9vdCgpJiYodD10aGlzLmZyYWdtZW50PXRoaXMuZ2V0RnJhZ21lbnQodCksbi5zb21lKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oZSl7aWYoZS5yb3V0ZS50ZXN0KHQpKXJldHVybiBlLmNhbGxiYWNrKHQpLCEwfSkpfSxuYXZpZ2F0ZTpmdW5jdGlvbih0LGUpe2lmKCFqLnN0YXJ0ZWQpcmV0dXJuITE7ZSYmITAhPT1lfHwoZT17dHJpZ2dlcjohIWV9KSx0PXRoaXMuZ2V0RnJhZ21lbnQodHx8IiIpO3ZhciBuPXRoaXMucm9vdDsiIiE9PXQmJiI/IiE9PXQuY2hhckF0KDApfHwobj1uLnNsaWNlKDAsLTEpfHwiLyIpO3ZhciBpPW4rdDtpZih0PXRoaXMuZGVjb2RlRnJhZ21lbnQodC5yZXBsYWNlKEIsIiIpKSx0aGlzLmZyYWdtZW50IT09dCl7aWYodGhpcy5mcmFnbWVudD10LHRoaXMuX3VzZVB1c2hTdGF0ZSl0aGlzLmhpc3RvcnlbZS5yZXBsYWNlPyJyZXBsYWNlU3RhdGUiOiJwdXNoU3RhdGUiXSh7fSxkb2N1bWVudC50aXRsZSxpKTtlbHNle2lmKCF0aGlzLl93YW50c0hhc2hDaGFuZ2UpcmV0dXJuIHRoaXMubG9jYXRpb24uYXNzaWduKGkpO2lmKHRoaXMuX3VwZGF0ZUhhc2godGhpcy5sb2NhdGlvbix0LGUucmVwbGFjZSksdGhpcy5pZnJhbWUmJnQhPT10aGlzLmdldEhhc2godGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykpe3ZhciByPXRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3c7ZS5yZXBsYWNlfHwoci5kb2N1bWVudC5vcGVuKCksci5kb2N1bWVudC5jbG9zZSgpKSx0aGlzLl91cGRhdGVIYXNoKHIubG9jYXRpb24sdCxlLnJlcGxhY2UpfX1yZXR1cm4gZS50cmlnZ2VyP3RoaXMubG9hZFVybCh0KTp2b2lkIDB9fSxfdXBkYXRlSGFzaDpmdW5jdGlvbih0LGUsbil7aWYobil7dmFyIGk9dC5ocmVmLnJlcGxhY2UoLyhqYXZhc2NyaXB0OnwjKS4qJC8sIiIpO3QucmVwbGFjZShpKyIjIitlKX1lbHNlIHQuaGFzaD0iIyIrZX19KSxlLmhpc3Rvcnk9bmV3IGosYi5leHRlbmQ9eS5leHRlbmQ9Qy5leHRlbmQ9TS5leHRlbmQ9ai5leHRlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyPXRoaXM7aT10JiZuLmhhcyh0LCJjb25zdHJ1Y3RvciIpP3QuY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4uZXh0ZW5kKGkscixlKTt2YXIgbz1mdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3I9aX07cmV0dXJuIG8ucHJvdG90eXBlPXIucHJvdG90eXBlLGkucHJvdG90eXBlPW5ldyBvLHQmJm4uZXh0ZW5kKGkucHJvdG90eXBlLHQpLGkuX19zdXBlcl9fPXIucHJvdG90eXBlLGl9O3ZhciBEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCdBICJ1cmwiIHByb3BlcnR5IG9yIGZ1bmN0aW9uIG11c3QgYmUgc3BlY2lmaWVkJyl9LFI9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVycm9yO2UuZXJyb3I9ZnVuY3Rpb24oaSl7biYmbi5jYWxsKGUuY29udGV4dCx0LGksZSksdC50cmlnZ2VyKCJlcnJvciIsdCxpLGUpfX07cmV0dXJuIGV9KHMsbix0LGUpfS5hcHBseShlLHIpKXx8KHQuZXhwb3J0cz1vKX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpLHI9bigyKSxvPW4oMjYpLHM9big3OCksYT1uKDkpLHU9big3OSksYz1uKDExKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX3RpbWVySUQ9MCx0aGlzLl9yZXBsYXlpbmc9ITEsdGhpcy5fa2V5c3Ryb2tlcz1bXSx0aGlzLl9rZXlkb3duRXZlbnRzPVtdLHRoaXMuX2tleUJpbmRpbmdzPVtdLHRoaXMuX2V4YWN0S2V5TWF0Y2g9bnVsbCx0aGlzLl9jb21tYW5kcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2NvbW1hbmRDaGFuZ2VkPW5ldyBjLlNpZ25hbCh0aGlzKSx0aGlzLl9jb21tYW5kRXhlY3V0ZWQ9bmV3IGMuU2lnbmFsKHRoaXMpLHRoaXMuX2tleUJpbmRpbmdDaGFuZ2VkPW5ldyBjLlNpZ25hbCh0aGlzKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjb21tYW5kQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNvbW1hbmRFeGVjdXRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kRXhlY3V0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJrZXlCaW5kaW5nQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9rZXlCaW5kaW5nQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImtleUJpbmRpbmdzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2tleUJpbmRpbmdzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmxpc3RDb21tYW5kcz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9jb21tYW5kcyl9LHQucHJvdG90eXBlLmhhc0NvbW1hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5fY29tbWFuZHN9LHQucHJvdG90eXBlLmFkZENvbW1hbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKHQgaW4gdGhpcy5fY29tbWFuZHMpdGhyb3cgbmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgYWxyZWFkeSByZWdpc3RlcmVkLiIpO3JldHVybiB0aGlzLl9jb21tYW5kc1t0XT1pLmNyZWF0ZUNvbW1hbmQoZSksdGhpcy5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOiJhZGRlZCJ9KSxuZXcgcy5EaXNwb3NhYmxlRGVsZWdhdGUoZnVuY3Rpb24oKXtkZWxldGUgbi5fY29tbWFuZHNbdF0sbi5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOiJyZW1vdmVkIn0pfSl9LHQucHJvdG90eXBlLm5vdGlmeUNvbW1hbmRDaGFuZ2VkPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQmJiEodCBpbiB0aGlzLl9jb21tYW5kcykpdGhyb3cgbmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgaXMgbm90IHJlZ2lzdGVyZWQuIik7dGhpcy5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOnQ/ImNoYW5nZWQiOiJtYW55LWNoYW5nZWQifSl9LHQucHJvdG90eXBlLmxhYmVsPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9by5KU09ORXh0LmVtcHR5T2JqZWN0KTt2YXIgbj10aGlzLl9jb21tYW5kc1t0XTtyZXR1cm4gbj9uLmxhYmVsLmNhbGwodm9pZCAwLGUpOiIifSx0LnByb3RvdHlwZS5tbmVtb25pYz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5tbmVtb25pYy5jYWxsKHZvaWQgMCxlKTotMX0sdC5wcm90b3R5cGUuaWNvbj1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpLHRoaXMuaWNvbkNsYXNzKHQsZSl9LHQucHJvdG90eXBlLmljb25DbGFzcz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5pY29uQ2xhc3MuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmljb25MYWJlbD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5pY29uTGFiZWwuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmNhcHRpb249ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24uY2FwdGlvbi5jYWxsKHZvaWQgMCxlKToiIn0sdC5wcm90b3R5cGUudXNhZ2U9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24udXNhZ2UuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmNsYXNzTmFtZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5jbGFzc05hbWUuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmRhdGFzZXQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24uZGF0YXNldC5jYWxsKHZvaWQgMCxlKTp7fX0sdC5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9by5KU09ORXh0LmVtcHR5T2JqZWN0KTt2YXIgbj10aGlzLl9jb21tYW5kc1t0XTtyZXR1cm4hIW4mJm4uaXNFbmFibGVkLmNhbGwodm9pZCAwLGUpfSx0LnByb3RvdHlwZS5pc1RvZ2dsZWQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiEhbiYmbi5pc1RvZ2dsZWQuY2FsbCh2b2lkIDAsZSl9LHQucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuISFuJiZuLmlzVmlzaWJsZS5jYWxsKHZvaWQgMCxlKX0sdC5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG4saT10aGlzLl9jb21tYW5kc1t0XTtpZighaSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgbm90IHJlZ2lzdGVyZWQuIikpO3RyeXtuPWkuZXhlY3V0ZS5jYWxsKHZvaWQgMCxlKX1jYXRjaCh0KXtuPVByb21pc2UucmVqZWN0KHQpfXZhciByPVByb21pc2UucmVzb2x2ZShuKTtyZXR1cm4gdGhpcy5fY29tbWFuZEV4ZWN1dGVkLmVtaXQoe2lkOnQsYXJnczplLHJlc3VsdDpyfSkscn0sdC5wcm90b3R5cGUuYWRkS2V5QmluZGluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49aS5jcmVhdGVLZXlCaW5kaW5nKHQpO3JldHVybiB0aGlzLl9rZXlCaW5kaW5ncy5wdXNoKG4pLHRoaXMuX2tleUJpbmRpbmdDaGFuZ2VkLmVtaXQoe2JpbmRpbmc6bix0eXBlOiJhZGRlZCJ9KSxuZXcgcy5EaXNwb3NhYmxlRGVsZWdhdGUoZnVuY3Rpb24oKXtyLkFycmF5RXh0LnJlbW92ZUZpcnN0T2YoZS5fa2V5QmluZGluZ3MsbiksZS5fa2V5QmluZGluZ0NoYW5nZWQuZW1pdCh7YmluZGluZzpuLHR5cGU6InJlbW92ZWQifSl9KX0sdC5wcm90b3R5cGUucHJvY2Vzc0tleWRvd25FdmVudD1mdW5jdGlvbihlKXtpZighdGhpcy5fcmVwbGF5aW5nKXt2YXIgbj10LmtleXN0cm9rZUZvcktleWRvd25FdmVudChlKTtpZighbilyZXR1cm4gdGhpcy5fcmVwbGF5S2V5ZG93bkV2ZW50cygpLHZvaWQgdGhpcy5fY2xlYXJQZW5kaW5nU3RhdGUoKTt0aGlzLl9rZXlzdHJva2VzLnB1c2gobik7dmFyIHI9aS5tYXRjaEtleUJpbmRpbmcodGhpcy5fa2V5QmluZGluZ3MsdGhpcy5fa2V5c3Ryb2tlcyxlKSxvPXIuZXhhY3Qscz1yLnBhcnRpYWw7aWYoIW8mJiFzKXJldHVybiB0aGlzLl9yZXBsYXlLZXlkb3duRXZlbnRzKCksdm9pZCB0aGlzLl9jbGVhclBlbmRpbmdTdGF0ZSgpO2lmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLG8mJiFzKXJldHVybiB0aGlzLl9leGVjdXRlS2V5QmluZGluZyhvKSx2b2lkIHRoaXMuX2NsZWFyUGVuZGluZ1N0YXRlKCk7byYmKHRoaXMuX2V4YWN0S2V5TWF0Y2g9byksdGhpcy5fa2V5ZG93bkV2ZW50cy5wdXNoKGUpLHRoaXMuX3N0YXJ0VGltZXIoKX19LHQucHJvdG90eXBlLl9zdGFydFRpbWVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fdGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb25QZW5kaW5nVGltZW91dCgpfSxpLkNIT1JEX1RJTUVPVVQpfSx0LnByb3RvdHlwZS5fY2xlYXJUaW1lcj1mdW5jdGlvbigpezAhPT10aGlzLl90aW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySUQpLHRoaXMuX3RpbWVySUQ9MCl9LHQucHJvdG90eXBlLl9yZXBsYXlLZXlkb3duRXZlbnRzPWZ1bmN0aW9uKCl7MCE9PXRoaXMuX2tleWRvd25FdmVudHMubGVuZ3RoJiYodGhpcy5fcmVwbGF5aW5nPSEwLHRoaXMuX2tleWRvd25FdmVudHMuZm9yRWFjaChpLnJlcGxheUtleUV2ZW50KSx0aGlzLl9yZXBsYXlpbmc9ITEpfSx0LnByb3RvdHlwZS5fZXhlY3V0ZUtleUJpbmRpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb21tYW5kLG49dC5hcmdzO2lmKHRoaXMuaGFzQ29tbWFuZChlKSYmdGhpcy5pc0VuYWJsZWQoZSxuKSl0aGlzLmV4ZWN1dGUoZSxuKTtlbHNle3ZhciBpPXRoaXMuaGFzQ29tbWFuZChlKT8iZW5hYmxlZCI6InJlZ2lzdGVyZWQiLHI9IkNhbm5vdCBleGVjdXRlIGtleSBiaW5kaW5nICciK3Qua2V5cy5qb2luKCIsICIpKyInOiIsbz0iY29tbWFuZCAnIitlKyInIGlzIG5vdCAiK2krIi4iO2NvbnNvbGUud2FybihyKyIgIitvKX19LHQucHJvdG90eXBlLl9jbGVhclBlbmRpbmdTdGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyVGltZXIoKSx0aGlzLl9leGFjdEtleU1hdGNoPW51bGwsdGhpcy5fa2V5c3Ryb2tlcy5sZW5ndGg9MCx0aGlzLl9rZXlkb3duRXZlbnRzLmxlbmd0aD0wfSx0LnByb3RvdHlwZS5fb25QZW5kaW5nVGltZW91dD1mdW5jdGlvbigpe3RoaXMuX3RpbWVySUQ9MCx0aGlzLl9leGFjdEtleU1hdGNoP3RoaXMuX2V4ZWN1dGVLZXlCaW5kaW5nKHRoaXMuX2V4YWN0S2V5TWF0Y2gpOnRoaXMuX3JlcGxheUtleWRvd25FdmVudHMoKSx0aGlzLl9jbGVhclBlbmRpbmdTdGF0ZSgpfSx0fSgpO2UuQ29tbWFuZFJlZ2lzdHJ5PWgsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtmb3IodmFyIGU9IiIsbj0hMSxpPSExLHI9ITEsbz0hMSxzPTAsdT10LnNwbGl0KC9ccysvKTtzPHUubGVuZ3RoO3MrKyl7dmFyIGM9dVtzXTsiQWNjZWwiPT09Yz9hLlBsYXRmb3JtLklTX01BQz9pPSEwOnI9ITA6IkFsdCI9PT1jP249ITA6IkNtZCI9PT1jP2k9ITA6IkN0cmwiPT09Yz9yPSEwOiJTaGlmdCI9PT1jP289ITA6Yy5sZW5ndGg+MCYmKGU9Yyl9cmV0dXJue2NtZDppLGN0cmw6cixhbHQ6bixzaGlmdDpvLGtleTplfX10LnBhcnNlS2V5c3Ryb2tlPWUsdC5ub3JtYWxpemVLZXlzdHJva2U9ZnVuY3Rpb24odCl7dmFyIG49IiIsaT1lKHQpO3JldHVybiBpLmN0cmwmJihuKz0iQ3RybCAiKSxpLmFsdCYmKG4rPSJBbHQgIiksaS5zaGlmdCYmKG4rPSJTaGlmdCAiKSxpLmNtZCYmYS5QbGF0Zm9ybS5JU19NQUMmJihuKz0iQ21kICIpLG4raS5rZXl9LHQuZm9ybWF0S2V5c3Ryb2tlPWZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9ZSh0KTtyZXR1cm4gYS5QbGF0Zm9ybS5JU19NQUM/KGkuY3RybCYmKG4rPSLijIMgIiksaS5hbHQmJihuKz0i4oylICIpLGkuc2hpZnQmJihuKz0i4oenICIpLGkuY21kJiYobis9IuKMmCAiKSk6KGkuY3RybCYmKG4rPSJDdHJsKyIpLGkuYWx0JiYobis9IkFsdCsiKSxpLnNoaWZ0JiYobis9IlNoaWZ0KyIpKSxuK2kua2V5fSx0LmtleXN0cm9rZUZvcktleWRvd25FdmVudD1mdW5jdGlvbih0KXt2YXIgZT11LmdldEtleWJvYXJkTGF5b3V0KCkua2V5Rm9yS2V5ZG93bkV2ZW50KHQpO2lmKCFlKXJldHVybiIiO3ZhciBuPSIiO3JldHVybiB0LmN0cmxLZXkmJihuKz0iQ3RybCAiKSx0LmFsdEtleSYmKG4rPSJBbHQgIiksdC5zaGlmdEtleSYmKG4rPSJTaGlmdCAiKSx0Lm1ldGFLZXkmJmEuUGxhdGZvcm0uSVNfTUFDJiYobis9IkNtZCAiKSxuK2V9fShoPWUuQ29tbWFuZFJlZ2lzdHJ5fHwoZS5Db21tYW5kUmVnaXN0cnk9e30pKSxlLkNvbW1hbmRSZWdpc3RyeT1oLGZ1bmN0aW9uKHQpe3QuQ0hPUkRfVElNRU9VVD0xZTMsdC5jcmVhdGVDb21tYW5kPWZ1bmN0aW9uKHQpe3JldHVybntleGVjdXRlOnQuZXhlY3V0ZSxsYWJlbDp1KHQubGFiZWwsZSksbW5lbW9uaWM6dSh0Lm1uZW1vbmljLG4pLGljb25DbGFzczp1KHQuaWNvbkNsYXNzfHx0Lmljb24sZSksaWNvbkxhYmVsOnUodC5pY29uTGFiZWwsZSksY2FwdGlvbjp1KHQuY2FwdGlvbixlKSx1c2FnZTp1KHQudXNhZ2UsZSksY2xhc3NOYW1lOnUodC5jbGFzc05hbWUsZSksZGF0YXNldDp1KHQuZGF0YXNldCxzKSxpc0VuYWJsZWQ6dC5pc0VuYWJsZWR8fGksaXNUb2dnbGVkOnQuaXNUb2dnbGVkfHxyLGlzVmlzaWJsZTp0LmlzVmlzaWJsZXx8aX19LHQuY3JlYXRlS2V5QmluZGluZz1mdW5jdGlvbih0KXtyZXR1cm57a2V5czpjKHQpLHNlbGVjdG9yOmwodCksY29tbWFuZDp0LmNvbW1hbmQsYXJnczp0LmFyZ3N8fG8uSlNPTkV4dC5lbXB0eU9iamVjdH19LHQubWF0Y2hLZXlCaW5kaW5nPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bnVsbCxyPSExLG89MS8wLHM9MCx1PTAsYz10Lmxlbmd0aDt1PGM7Kyt1KXt2YXIgaD10W3VdLGw9ZChoLmtleXMsZSk7aWYoMCE9PWwpaWYoMiE9PWwpe3ZhciBwPWYoaC5zZWxlY3RvcixuKTtpZighKC0xPT09cHx8cD5vKSl7dmFyIG09YS5TZWxlY3Rvci5jYWxjdWxhdGVTcGVjaWZpY2l0eShoLnNlbGVjdG9yKTsoIWl8fHA8b3x8bT49cykmJihpPWgsbz1wLHM9bSl9fWVsc2Ugcnx8LTE9PT1mKGguc2VsZWN0b3Isbil8fChyPSEwKX1yZXR1cm57ZXhhY3Q6aSxwYXJ0aWFsOnJ9fSx0LnJlcGxheUtleUV2ZW50PWZ1bmN0aW9uKHQpe3QudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj10LmJ1YmJsZXN8fCEwLGk9dC5jYW5jZWxhYmxlfHwhMDtyZXR1cm4gZS5pbml0RXZlbnQodC50eXBlfHwia2V5ZG93biIsbixpKSxlLmtleT10LmtleXx8IiIsZS5rZXlDb2RlPXQua2V5Q29kZXx8MCxlLndoaWNoPXQua2V5Q29kZXx8MCxlLmN0cmxLZXk9dC5jdHJsS2V5fHwhMSxlLmFsdEtleT10LmFsdEtleXx8ITEsZS5zaGlmdEtleT10LnNoaWZ0S2V5fHwhMSxlLm1ldGFLZXk9dC5tZXRhS2V5fHwhMSxlLnZpZXc9dC52aWV3fHx3aW5kb3csZX0odCkpfTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiIifSxuPWZ1bmN0aW9uKCl7cmV0dXJuLTF9LGk9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scj1mdW5jdGlvbigpe3JldHVybiExfSxzPWZ1bmN0aW9uKCl7cmV0dXJue319O2Z1bmN0aW9uIHUodCxlKXtyZXR1cm4gdm9pZCAwPT09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gYyh0KXtyZXR1cm4oYS5QbGF0Zm9ybS5JU19XSU4/dC53aW5LZXlzfHx0LmtleXM6YS5QbGF0Zm9ybS5JU19NQUM/dC5tYWNLZXlzfHx0LmtleXM6dC5saW51eEtleXN8fHQua2V5cykubWFwKGgubm9ybWFsaXplS2V5c3Ryb2tlKX1mdW5jdGlvbiBsKHQpe2lmKC0xIT09dC5zZWxlY3Rvci5pbmRleE9mKCIsIikpdGhyb3cgbmV3IEVycm9yKCJTZWxlY3RvciBjYW5ub3QgY29udGFpbiBjb21tYXM6ICIrdC5zZWxlY3Rvcik7aWYoIWEuU2VsZWN0b3IuaXNWYWxpZCh0LnNlbGVjdG9yKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2VsZWN0b3I6ICIrdC5zZWxlY3Rvcik7cmV0dXJuIHQuc2VsZWN0b3J9ZnVuY3Rpb24gZCh0LGUpe2lmKHQubGVuZ3RoPGUubGVuZ3RoKXJldHVybiAwO2Zvcih2YXIgbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilpZih0W25dIT09ZVtuXSlyZXR1cm4gMDtyZXR1cm4gdC5sZW5ndGg+ZS5sZW5ndGg/MjoxfWZ1bmN0aW9uIGYodCxlKXtmb3IodmFyIG49ZS50YXJnZXQsaT1lLmN1cnJlbnRUYXJnZXQscj0wO251bGwhPT1uO249bi5wYXJlbnRFbGVtZW50LCsrcil7aWYoYS5TZWxlY3Rvci5tYXRjaGVzKG4sdCkpcmV0dXJuIHI7aWYobj09PWkpcmV0dXJuLTF9cmV0dXJuLTF9fShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHMsYT1uKDIpLHU9bigxMzApLGM9bigyNiksaD1uKDkpLGw9big3OSksZD1uKDUpLGY9bigxMSkscD1uKDU1KSxtPW4oNyksZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLHtub2RlOnMuY3JlYXRlTm9kZSgpfSl8fHRoaXM7cmV0dXJuIGkuX2NoaWxkSW5kZXg9LTEsaS5fYWN0aXZlSW5kZXg9LTEsaS5fb3BlblRpbWVySUQ9MCxpLl9jbG9zZVRpbWVySUQ9MCxpLl9pdGVtcz1bXSxpLl9jaGlsZE1lbnU9bnVsbCxpLl9wYXJlbnRNZW51PW51bGwsaS5fYWJvdXRUb0Nsb3NlPW5ldyBmLlNpZ25hbChpKSxpLl9tZW51UmVxdWVzdGVkPW5ldyBmLlNpZ25hbChpKSxpLmFkZENsYXNzKCJwLU1lbnUiKSxpLnNldEZsYWcobS5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5jb21tYW5kcz1uLmNvbW1hbmRzLGkucmVuZGVyZXI9bi5yZW5kZXJlcnx8ZS5kZWZhdWx0UmVuZGVyZXIsaX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCksdGhpcy5faXRlbXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFib3V0VG9DbG9zZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hYm91dFRvQ2xvc2V9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtZW51UmVxdWVzdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lbnVSZXF1ZXN0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwYXJlbnRNZW51Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudE1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjaGlsZE1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRNZW51fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicm9vdE1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0Ll9wYXJlbnRNZW51Oyl0PXQuX3BhcmVudE1lbnU7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZWFmTWVudSIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QuX2NoaWxkTWVudTspdD10Ll9jaGlsZE1lbnU7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1NZW51LWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFjdGl2ZUl0ZW0iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbXNbdGhpcy5fYWN0aXZlSW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmVJbmRleD10P3RoaXMuX2l0ZW1zLmluZGV4T2YodCk6LTF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhY3RpdmVJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVJbmRleH0sc2V0OmZ1bmN0aW9uKHQpeyh0PDB8fHQ+PXRoaXMuX2l0ZW1zLmxlbmd0aCkmJih0PS0xKSwtMT09PXR8fHMuY2FuQWN0aXZhdGUodGhpcy5faXRlbXNbdF0pfHwodD0tMSksdGhpcy5fYWN0aXZlSW5kZXghPT10JiYodGhpcy5fYWN0aXZlSW5kZXg9dCx0aGlzLnVwZGF0ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIml0ZW1zIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmFjdGl2YXRlTmV4dEl0ZW09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pdGVtcy5sZW5ndGgsZT10aGlzLl9hY3RpdmVJbmRleCxuPWU8dC0xP2UrMTowLGk9MD09PW4/dC0xOm4tMTt0aGlzLmFjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5faXRlbXMscy5jYW5BY3RpdmF0ZSxuLGkpfSxlLnByb3RvdHlwZS5hY3RpdmF0ZVByZXZpb3VzSXRlbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2l0ZW1zLmxlbmd0aCxlPXRoaXMuX2FjdGl2ZUluZGV4LG49ZTw9MD90LTE6ZS0xLGk9bj09PXQtMT8wOm4rMTt0aGlzLmFjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZExhc3RJbmRleCh0aGlzLl9pdGVtcyxzLmNhbkFjdGl2YXRlLG4saSl9LGUucHJvdG90eXBlLnRyaWdnZXJBY3RpdmVJdGVtPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKXt2YXIgdD10aGlzLmFjdGl2ZUl0ZW07aWYodClpZih0aGlzLl9jYW5jZWxPcGVuVGltZXIoKSx0aGlzLl9jYW5jZWxDbG9zZVRpbWVyKCksInN1Ym1lbnUiIT09dC50eXBlKXt0aGlzLnJvb3RNZW51LmNsb3NlKCk7dmFyIGU9dC5jb21tYW5kLG49dC5hcmdzO3RoaXMuY29tbWFuZHMuaXNFbmFibGVkKGUsbik/dGhpcy5jb21tYW5kcy5leGVjdXRlKGUsbik6Y29uc29sZS5sb2coIkNvbW1hbmQgJyIrZSsiJyBpcyBkaXNhYmxlZC4iKX1lbHNlIHRoaXMuX29wZW5DaGlsZE1lbnUoITApfX0sZS5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnNlcnRJdGVtKHRoaXMuX2l0ZW1zLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0SXRlbT1mdW5jdGlvbih0LGUpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5jbG9zZSgpLHRoaXMuYWN0aXZlSW5kZXg9LTE7dmFyIG49TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX2l0ZW1zLmxlbmd0aCkpLGk9cy5jcmVhdGVJdGVtKHRoaXMsZSk7cmV0dXJuIGEuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX2l0ZW1zLG4saSksdGhpcy51cGRhdGUoKSxpfSxlLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlSXRlbUF0KHRoaXMuX2l0ZW1zLmluZGV4T2YodCkpfSxlLnByb3RvdHlwZS5yZW1vdmVJdGVtQXQ9ZnVuY3Rpb24odCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsb3NlKCksdGhpcy5hY3RpdmVJbmRleD0tMSxhLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpJiZ0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5jbGVhckl0ZW1zPWZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsb3NlKCksdGhpcy5hY3RpdmVJbmRleD0tMSwwIT09dGhpcy5faXRlbXMubGVuZ3RoJiYodGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy51cGRhdGUoKSl9LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdGhpcy5pc0F0dGFjaGVkKXt2YXIgaT1uLmZvcmNlWHx8ITEscj1uLmZvcmNlWXx8ITE7cy5vcGVuUm9vdE1lbnUodGhpcyx0LGUsaSxyKSx0aGlzLmFjdGl2YXRlKCl9fSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZXVwIjp0aGlzLl9ldnRNb3VzZVVwKHQpO2JyZWFrO2Nhc2UibW91c2Vtb3ZlIjp0aGlzLl9ldnRNb3VzZU1vdmUodCk7YnJlYWs7Y2FzZSJtb3VzZWVudGVyIjp0aGlzLl9ldnRNb3VzZUVudGVyKHQpO2JyZWFrO2Nhc2UibW91c2VsZWF2ZSI6dGhpcy5fZXZ0TW91c2VMZWF2ZSh0KTticmVhaztjYXNlIm1vdXNlZG93biI6dGhpcy5fZXZ0TW91c2VEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLCEwKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdGhpcyksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApfSxlLnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm9kZS5mb2N1cygpfSxlLnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2l0ZW1zLG49dGhpcy5yZW5kZXJlcixpPXRoaXMuX2FjdGl2ZUluZGV4LHI9cy5jb21wdXRlQ29sbGFwc2VkKGUpLG89bmV3IEFycmF5KGUubGVuZ3RoKSxhPTAsdT1lLmxlbmd0aDthPHU7KythKXt2YXIgYz1lW2FdLGg9YT09PWksbD1yW2FdO29bYV09bi5yZW5kZXJJdGVtKHtpdGVtOmMsYWN0aXZlOmgsY29sbGFwc2VkOmx9KX1wLlZpcnR1YWxET00ucmVuZGVyKG8sdGhpcy5jb250ZW50Tm9kZSl9LGUucHJvdG90eXBlLm9uQ2xvc2VSZXF1ZXN0PWZ1bmN0aW9uKGUpe3RoaXMuX2NhbmNlbE9wZW5UaW1lcigpLHRoaXMuX2NhbmNlbENsb3NlVGltZXIoKSx0aGlzLmFjdGl2ZUluZGV4PS0xO3ZhciBuPXRoaXMuX2NoaWxkTWVudTtuJiYodGhpcy5fY2hpbGRJbmRleD0tMSx0aGlzLl9jaGlsZE1lbnU9bnVsbCxuLl9wYXJlbnRNZW51PW51bGwsbi5jbG9zZSgpKTt2YXIgaT10aGlzLl9wYXJlbnRNZW51O2kmJih0aGlzLl9wYXJlbnRNZW51PW51bGwsaS5fY2hpbGRJbmRleD0tMSxpLl9jaGlsZE1lbnU9bnVsbCxpLmFjdGl2YXRlKCkpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fYWJvdXRUb0Nsb3NlLmVtaXQodm9pZCAwKSx0LnByb3RvdHlwZS5vbkNsb3NlUmVxdWVzdC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXQua2V5Q29kZTtpZigxMyE9PWUpaWYoMjchPT1lKWlmKDM3IT09ZSlpZigzOCE9PWUpaWYoMzkhPT1lKWlmKDQwIT09ZSl7dmFyIG49bC5nZXRLZXlib2FyZExheW91dCgpLmtleUZvcktleWRvd25FdmVudCh0KTtpZihuKXt2YXIgaT10aGlzLl9hY3RpdmVJbmRleCsxLHI9cy5maW5kTW5lbW9uaWModGhpcy5faXRlbXMsbixpKTstMT09PXIuaW5kZXh8fHIubXVsdGlwbGU/LTEhPT1yLmluZGV4P3RoaXMuYWN0aXZlSW5kZXg9ci5pbmRleDotMSE9PXIuYXV0byYmKHRoaXMuYWN0aXZlSW5kZXg9ci5hdXRvKToodGhpcy5hY3RpdmVJbmRleD1yLmluZGV4LHRoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKSl9fWVsc2UgdGhpcy5hY3RpdmF0ZU5leHRJdGVtKCk7ZWxzZXt2YXIgbz10aGlzLmFjdGl2ZUl0ZW07byYmInN1Ym1lbnUiPT09by50eXBlP3RoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKTp0aGlzLnJvb3RNZW51Ll9tZW51UmVxdWVzdGVkLmVtaXQoIm5leHQiKX1lbHNlIHRoaXMuYWN0aXZhdGVQcmV2aW91c0l0ZW0oKTtlbHNlIHRoaXMuX3BhcmVudE1lbnU/dGhpcy5jbG9zZSgpOnRoaXMuX21lbnVSZXF1ZXN0ZWQuZW1pdCgicHJldmlvdXMiKTtlbHNlIHRoaXMuY2xvc2UoKTtlbHNlIHRoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7MD09PXQuYnV0dG9uJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy50cmlnZ2VyQWN0aXZlSXRlbSgpKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTW92ZT1mdW5jdGlvbih0KXt2YXIgZT1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuY29udGVudE5vZGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7cmV0dXJuIGguRWxlbWVudEV4dC5oaXRUZXN0KGUsdC5jbGllbnRYLHQuY2xpZW50WSl9KTtpZihlIT09dGhpcy5fYWN0aXZlSW5kZXgpe2lmKHRoaXMuYWN0aXZlSW5kZXg9ZSwoZT10aGlzLmFjdGl2ZUluZGV4KT09PXRoaXMuX2NoaWxkSW5kZXgpcmV0dXJuIHRoaXMuX2NhbmNlbE9wZW5UaW1lcigpLHZvaWQgdGhpcy5fY2FuY2VsQ2xvc2VUaW1lcigpOy0xIT09dGhpcy5fY2hpbGRJbmRleCYmdGhpcy5fc3RhcnRDbG9zZVRpbWVyKCksdGhpcy5fY2FuY2VsT3BlblRpbWVyKCk7dmFyIG49dGhpcy5hY3RpdmVJdGVtO24mJiJzdWJtZW51Ij09PW4udHlwZSYmbi5zdWJtZW51JiZ0aGlzLl9zdGFydE9wZW5UaW1lcigpfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRW50ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3BhcmVudE1lbnU7ZTtlPWUuX3BhcmVudE1lbnUpZS5fY2FuY2VsT3BlblRpbWVyKCksZS5fY2FuY2VsQ2xvc2VUaW1lcigpLGUuYWN0aXZlSW5kZXg9ZS5fY2hpbGRJbmRleH0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTGVhdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FuY2VsT3BlblRpbWVyKCksdGhpcy5fY2hpbGRNZW51KXt2YXIgZT10LmNsaWVudFgsbj10LmNsaWVudFk7aC5FbGVtZW50RXh0LmhpdFRlc3QodGhpcy5fY2hpbGRNZW51Lm5vZGUsZSxuKT90aGlzLl9jYW5jZWxDbG9zZVRpbWVyKCk6KHRoaXMuYWN0aXZlSW5kZXg9LTEsdGhpcy5fc3RhcnRDbG9zZVRpbWVyKCkpfWVsc2UgdGhpcy5hY3RpdmVJbmRleD0tMX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXt0aGlzLl9wYXJlbnRNZW51fHwocy5oaXRUZXN0TWVudXModGhpcyx0LmNsaWVudFgsdC5jbGllbnRZKT8odC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpOnRoaXMuY2xvc2UoKSl9LGUucHJvdG90eXBlLl9vcGVuQ2hpbGRNZW51PWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgZT10aGlzLmFjdGl2ZUl0ZW07aWYoZSYmInN1Ym1lbnUiPT09ZS50eXBlJiZlLnN1Ym1lbnUpe3ZhciBuPWUuc3VibWVudTtpZihuIT09dGhpcy5fY2hpbGRNZW51KXt0aGlzLl9jbG9zZUNoaWxkTWVudSgpLHRoaXMuX2NoaWxkTWVudT1uLHRoaXMuX2NoaWxkSW5kZXg9dGhpcy5fYWN0aXZlSW5kZXgsbi5fcGFyZW50TWVudT10aGlzLGQuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyxtLldpZGdldC5Nc2cuVXBkYXRlUmVxdWVzdCk7dmFyIGk9dGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlblt0aGlzLl9hY3RpdmVJbmRleF07cy5vcGVuU3VibWVudShuLGkpLHQmJihuLmFjdGl2ZUluZGV4PS0xLG4uYWN0aXZhdGVOZXh0SXRlbSgpKSxuLmFjdGl2YXRlKCl9fWVsc2UgdGhpcy5fY2xvc2VDaGlsZE1lbnUoKX0sZS5wcm90b3R5cGUuX2Nsb3NlQ2hpbGRNZW51PWZ1bmN0aW9uKCl7dGhpcy5fY2hpbGRNZW51JiZ0aGlzLl9jaGlsZE1lbnUuY2xvc2UoKX0sZS5wcm90b3R5cGUuX3N0YXJ0T3BlblRpbWVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczswPT09dGhpcy5fb3BlblRpbWVySUQmJih0aGlzLl9vcGVuVGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb3BlblRpbWVySUQ9MCx0Ll9vcGVuQ2hpbGRNZW51KCl9LHMuVElNRVJfREVMQVkpKX0sZS5wcm90b3R5cGUuX3N0YXJ0Q2xvc2VUaW1lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7MD09PXRoaXMuX2Nsb3NlVGltZXJJRCYmKHRoaXMuX2Nsb3NlVGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fY2xvc2VUaW1lcklEPTAsdC5fY2xvc2VDaGlsZE1lbnUoKX0scy5USU1FUl9ERUxBWSkpfSxlLnByb3RvdHlwZS5fY2FuY2VsT3BlblRpbWVyPWZ1bmN0aW9uKCl7MCE9PXRoaXMuX29wZW5UaW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lcklEKSx0aGlzLl9vcGVuVGltZXJJRD0wKX0sZS5wcm90b3R5cGUuX2NhbmNlbENsb3NlVGltZXI9ZnVuY3Rpb24oKXswIT09dGhpcy5fY2xvc2VUaW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2Nsb3NlVGltZXJJRCksdGhpcy5fY2xvc2VUaW1lcklEPTApfSxlfShtLldpZGdldCk7ZS5NZW51PWcsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXJJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3JlYXRlSXRlbUNsYXNzKHQpLG49dGhpcy5jcmVhdGVJdGVtRGF0YXNldCh0KTtyZXR1cm4gcC5oLmxpKHtjbGFzc05hbWU6ZSxkYXRhc2V0Om59LHRoaXMucmVuZGVySWNvbih0KSx0aGlzLnJlbmRlckxhYmVsKHQpLHRoaXMucmVuZGVyU2hvcnRjdXQodCksdGhpcy5yZW5kZXJTdWJtZW51KHQpKX0sdC5wcm90b3R5cGUucmVuZGVySWNvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNyZWF0ZUljb25DbGFzcyh0KTtyZXR1cm4gcC5oLmRpdih7Y2xhc3NOYW1lOmV9LHQuaXRlbS5pY29uTGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdExhYmVsKHQpO3JldHVybiBwLmguZGl2KHtjbGFzc05hbWU6InAtTWVudS1pdGVtTGFiZWwifSxlKX0sdC5wcm90b3R5cGUucmVuZGVyU2hvcnRjdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRTaG9ydGN1dCh0KTtyZXR1cm4gcC5oLmRpdih7Y2xhc3NOYW1lOiJwLU1lbnUtaXRlbVNob3J0Y3V0In0sZSl9LHQucHJvdG90eXBlLnJlbmRlclN1Ym1lbnU9ZnVuY3Rpb24odCl7cmV0dXJuIHAuaC5kaXYoe2NsYXNzTmFtZToicC1NZW51LWl0ZW1TdWJtZW51SWNvbiJ9KX0sdC5wcm90b3R5cGUuY3JlYXRlSXRlbUNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLU1lbnUtaXRlbSI7dC5pdGVtLmlzRW5hYmxlZHx8KGUrPSIgcC1tb2QtZGlzYWJsZWQiKSx0Lml0ZW0uaXNUb2dnbGVkJiYoZSs9IiBwLW1vZC10b2dnbGVkIiksdC5pdGVtLmlzVmlzaWJsZXx8KGUrPSIgcC1tb2QtaGlkZGVuIiksdC5hY3RpdmUmJihlKz0iIHAtbW9kLWFjdGl2ZSIpLHQuY29sbGFwc2VkJiYoZSs9IiBwLW1vZC1jb2xsYXBzZWQiKTt2YXIgbj10Lml0ZW0uY2xhc3NOYW1lO3JldHVybiBuJiYoZSs9IiAiK24pLGV9LHQucHJvdG90eXBlLmNyZWF0ZUl0ZW1EYXRhc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPWUudHlwZSxpPWUuY29tbWFuZCxyPWUuZGF0YXNldDtyZXR1cm4gbyh7fSxyLCJjb21tYW5kIj09PW4/e3R5cGU6bixjb21tYW5kOml9Ont0eXBlOm59KX0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLU1lbnUtaXRlbUljb24iLG49dC5pdGVtLmljb25DbGFzcztyZXR1cm4gbj9lKyIgIituOmV9LHQucHJvdG90eXBlLmZvcm1hdExhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPWUubGFiZWwsaT1lLm1uZW1vbmljO2lmKGk8MHx8aT49bi5sZW5ndGgpcmV0dXJuIG47dmFyIHI9bi5zbGljZSgwLGkpLG89bi5zbGljZShpKzEpLHM9bltpXTtyZXR1cm5bcixwLmguc3Bhbih7Y2xhc3NOYW1lOiJwLU1lbnUtaXRlbU1uZW1vbmljIn0scyksb119LHQucHJvdG90eXBlLmZvcm1hdFNob3J0Y3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbS5rZXlCaW5kaW5nO3JldHVybiBlP2Uua2V5cy5tYXAocy5mb3JtYXRLZXlzdHJva2UpLmpvaW4oIiwgIik6bnVsbH0sdH0oKTt0LlJlbmRlcmVyPWUsdC5kZWZhdWx0UmVuZGVyZXI9bmV3IGV9KGc9ZS5NZW51fHwoZS5NZW51PXt9KSksZS5NZW51PWcsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ic2VwYXJhdG9yIiE9PXQudHlwZSYmdC5pc0VuYWJsZWQmJnQuaXNWaXNpYmxlfXQuVElNRVJfREVMQVk9MzAwLHQuU1VCTUVOVV9PVkVSTEFQPTMsdC5jcmVhdGVOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpO3JldHVybiBlLmNsYXNzTmFtZT0icC1NZW51LWNvbnRlbnQiLHQuYXBwZW5kQ2hpbGQoZSksdC50YWJJbmRleD0tMSx0fSx0LmNhbkFjdGl2YXRlPWUsdC5jcmVhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQuY29tbWFuZHMsZSl9LHQuZm9ybWF0S2V5c3Ryb2tlPWZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dS5Db21tYW5kUmVnaXN0cnkucGFyc2VLZXlzdHJva2UodCk7cmV0dXJuIGguUGxhdGZvcm0uSVNfTUFDPyhuLmN0cmwmJihlKz0i4oyDICIpLG4uYWx0JiYoZSs9IuKMpSAiKSxuLnNoaWZ0JiYoZSs9IuKHpyAiKSxuLmNtZCYmKGUrPSLijJggIikpOihuLmN0cmwmJihlKz0iQ3RybCsiKSxuLmFsdCYmKGUrPSJBbHQrIiksbi5zaGlmdCYmKGUrPSJTaGlmdCsiKSksZStuLmtleX0sdC5oaXRUZXN0TWVudXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10O2k7aT1pLmNoaWxkTWVudSlpZihoLkVsZW1lbnRFeHQuaGl0VGVzdChpLm5vZGUsZSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sdC5jb21wdXRlQ29sbGFwc2VkPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7YS5BcnJheUV4dC5maWxsKGUsITEpO2Zvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbilpZigocz10W25dKS5pc1Zpc2libGUpe2lmKCJzZXBhcmF0b3IiIT09cy50eXBlKWJyZWFrO2Vbbl09ITB9Zm9yKHZhciByPWktMTtyPj0wOy0tcilpZigocz10W3JdKS5pc1Zpc2libGUpe2lmKCJzZXBhcmF0b3IiIT09cy50eXBlKWJyZWFrO2Vbcl09ITB9Zm9yKHZhciBvPSExOysrbjxyOyl7dmFyIHM7KHM9dFtuXSkuaXNWaXNpYmxlJiYoInNlcGFyYXRvciIhPT1zLnR5cGU/bz0hMTpvP2Vbbl09ITA6bz0hMCl9cmV0dXJuIGV9LHQub3BlblJvb3RNZW51PWZ1bmN0aW9uKHQsZSxuLGkscil7ZC5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LG0uV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KTt2YXIgbz13aW5kb3cucGFnZVhPZmZzZXQscz13aW5kb3cucGFnZVlPZmZzZXQsYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGM9dS0ocj9uOjApLGg9dC5ub2RlLGw9aC5zdHlsZTtsLnRvcD0iIixsLmxlZnQ9IiIsbC53aWR0aD0iIixsLmhlaWdodD0iIixsLnZpc2liaWxpdHk9ImhpZGRlbiIsbC5tYXhIZWlnaHQ9YysicHgiLG0uV2lkZ2V0LmF0dGFjaCh0LGRvY3VtZW50LmJvZHkpO3ZhciBmPWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1mLndpZHRoLGc9Zi5oZWlnaHQ7IWkmJmUrcD5vK2EmJihlPW8rYS1wKSwhciYmbitnPnMrdSYmKG4+cyt1P249cyt1LWc6bi09ZyksbC50b3A9TWF0aC5tYXgoMCxuKSsicHgiLGwubGVmdD1NYXRoLm1heCgwLGUpKyJweCIsbC52aXNpYmlsaXR5PSIifSx0Lm9wZW5TdWJtZW51PWZ1bmN0aW9uKGUsbil7ZC5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLG0uV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KTt2YXIgaT13aW5kb3cucGFnZVhPZmZzZXQscj13aW5kb3cucGFnZVlPZmZzZXQsbz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGE9cyx1PWUubm9kZSxjPXUuc3R5bGU7Yy50b3A9IiIsYy5sZWZ0PSIiLGMud2lkdGg9IiIsYy5oZWlnaHQ9IiIsYy52aXNpYmlsaXR5PSJoaWRkZW4iLGMubWF4SGVpZ2h0PWErInB4IixtLldpZGdldC5hdHRhY2goZSxkb2N1bWVudC5ib2R5KTt2YXIgbD11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9bC53aWR0aCxwPWwuaGVpZ2h0LGc9aC5FbGVtZW50RXh0LmJveFNpemluZyhlLm5vZGUpLHY9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxiPXYucmlnaHQtdC5TVUJNRU5VX09WRVJMQVA7YitmPmkrbyYmKGI9di5sZWZ0K3QuU1VCTUVOVV9PVkVSTEFQLWYpO3ZhciB5PXYudG9wLWcuYm9yZGVyVG9wLWcucGFkZGluZ1RvcDt5K3A+citzJiYoeT12LmJvdHRvbStnLmJvcmRlckJvdHRvbStnLnBhZGRpbmdCb3R0b20tcCksYy50b3A9TWF0aC5tYXgoMCx5KSsicHgiLGMubGVmdD1NYXRoLm1heCgwLGIpKyJweCIsYy52aXNpYmlsaXR5PSIifSx0LmZpbmRNbmVtb25pYz1mdW5jdGlvbih0LG4saSl7Zm9yKHZhciByPS0xLG89LTEscz0hMSxhPW4udG9VcHBlckNhc2UoKSx1PTAsYz10Lmxlbmd0aDt1PGM7Kyt1KXt2YXIgaD0odStpKSVjLGw9dFtoXTtpZihlKGwpKXt2YXIgZD1sLmxhYmVsO2lmKDAhPT1kLmxlbmd0aCl7dmFyIGY9bC5tbmVtb25pYztmPj0wJiZmPGQubGVuZ3RoP2RbZl0udG9VcHBlckNhc2UoKT09PWEmJigtMT09PXI/cj1oOnM9ITApOi0xPT09byYmZFswXS50b1VwcGVyQ2FzZSgpPT09YSYmKG89aCl9fX1yZXR1cm57aW5kZXg6cixtdWx0aXBsZTpzLGF1dG86b319O3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2NvbW1hbmRzPXQsdGhpcy50eXBlPWUudHlwZXx8ImNvbW1hbmQiLHRoaXMuY29tbWFuZD1lLmNvbW1hbmR8fCIiLHRoaXMuYXJncz1lLmFyZ3N8fGMuSlNPTkV4dC5lbXB0eU9iamVjdCx0aGlzLnN1Ym1lbnU9ZS5zdWJtZW51fHxudWxsfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhYmVsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5sYWJlbDoiIn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1uZW1vbmljIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLm1uZW1vbmljKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5tbmVtb25pYzotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29uQ2xhc3N9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uQ2xhc3MiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaWNvbkNsYXNzKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5pY29uQ2xhc3M6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uTGFiZWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaWNvbkxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5pY29uTGFiZWw6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjYXB0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmNhcHRpb24odGhpcy5jb21tYW5kLHRoaXMuYXJncyk6InN1Ym1lbnUiPT09dGhpcy50eXBlJiZ0aGlzLnN1Ym1lbnU/dGhpcy5zdWJtZW51LnRpdGxlLmNhcHRpb246IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjbGFzc05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuY2xhc3NOYW1lKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5jbGFzc05hbWU6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJkYXRhc2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmRhdGFzZXQodGhpcy5jb21tYW5kLHRoaXMuYXJncyk6InN1Ym1lbnUiPT09dGhpcy50eXBlJiZ0aGlzLnN1Ym1lbnU/dGhpcy5zdWJtZW51LnRpdGxlLmRhdGFzZXQ6e319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0VuYWJsZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaXNFbmFibGVkKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51IiE9PXRoaXMudHlwZXx8bnVsbCE9PXRoaXMuc3VibWVudX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVG9nZ2xlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiJjb21tYW5kIj09PXRoaXMudHlwZSYmdGhpcy5fY29tbWFuZHMuaXNUb2dnbGVkKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNWaXNpYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmlzVmlzaWJsZSh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKToic3VibWVudSIhPT10aGlzLnR5cGV8fG51bGwhPT10aGlzLnN1Ym1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJrZXlCaW5kaW5nIix7Z2V0OmZ1bmN0aW9uKCl7aWYoImNvbW1hbmQiPT09dGhpcy50eXBlKXt2YXIgdD10aGlzLmNvbW1hbmQsZT10aGlzLmFyZ3M7cmV0dXJuIGEuQXJyYXlFeHQuZmluZExhc3RWYWx1ZSh0aGlzLl9jb21tYW5kcy5rZXlCaW5kaW5ncyxmdW5jdGlvbihuKXtyZXR1cm4gbi5jb21tYW5kPT09dCYmYy5KU09ORXh0LmRlZXBFcXVhbChuLmFyZ3MsZSl9KXx8bnVsbH1yZXR1cm4gbnVsbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpfShzfHwocz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDkpLHU9big1KSxjPW4oNDApLGg9bigyMiksbD1uKDcpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3NwYWNpbmc9NCxuLl9kaXJ0eT0hMSxuLl9yb290PW51bGwsbi5fYm94PW51bGwsbi5faXRlbXM9bmV3IE1hcCxuLnJlbmRlcmVyPWUucmVuZGVyZXIsdm9pZCAwIT09ZS5zcGFjaW5nJiYobi5fc3BhY2luZz1vLmNsYW1wU3BhY2luZyhlLnNwYWNpbmcpKSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaXRlcigpO3RoaXMuX2l0ZW1zLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9ib3g9bnVsbCx0aGlzLl9yb290PW51bGwsdGhpcy5faXRlbXMuY2xlYXIoKSxzLmVhY2goZSxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBTcGFjaW5nKHQpLHRoaXMuX3NwYWNpbmchPT10JiYodGhpcy5fc3BhY2luZz10LHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpc0VtcHR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9yb290fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290Lml0ZXJBbGxXaWRnZXRzKCk6cy5lbXB0eSgpfSxlLnByb3RvdHlwZS53aWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC5pdGVyVXNlcldpZGdldHMoKTpzLmVtcHR5KCl9LGUucHJvdG90eXBlLnNlbGVjdGVkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMuX3Jvb3QuaXRlclNlbGVjdGVkV2lkZ2V0cygpOnMuZW1wdHkoKX0sZS5wcm90b3R5cGUudGFiQmFycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMuX3Jvb3QuaXRlclRhYkJhcnMoKTpzLmVtcHR5KCl9LGUucHJvdG90eXBlLmhhbmRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290Lml0ZXJIYW5kbGVzKCk6cy5lbXB0eSgpfSxlLnByb3RvdHlwZS5tb3ZlSGFuZGxlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9yb290JiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInAtbW9kLWhpZGRlbiIpKXt2YXIgaSxyPXRoaXMuX3Jvb3QuZmluZFNwbGl0Tm9kZSh0KTtpZihyKTAhPT0oaT0iaG9yaXpvbnRhbCI9PT1yLm5vZGUub3JpZW50YXRpb24/ZS10Lm9mZnNldExlZnQ6bi10Lm9mZnNldFRvcCkmJihyLm5vZGUuaG9sZFNpemVzKCksYy5Cb3hFbmdpbmUuYWRqdXN0KHIubm9kZS5zaXplcnMsci5pbmRleCxpKSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCkpfX0sZS5wcm90b3R5cGUuc2F2ZUxheW91dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290Pyh0aGlzLl9yb290LmhvbGRBbGxTaXplcygpLHttYWluOnRoaXMuX3Jvb3QuY3JlYXRlQ29uZmlnKCl9KTp7bWFpbjpudWxsfX0sZS5wcm90b3R5cGUucmVzdG9yZUxheW91dD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMsaT1uZXcgU2V0O2U9dC5tYWluP28ubm9ybWFsaXplQXJlYUNvbmZpZyh0Lm1haW4saSk6bnVsbDt2YXIgcj10aGlzLndpZGdldHMoKSxhPXRoaXMudGFiQmFycygpLHU9dGhpcy5oYW5kbGVzKCk7dGhpcy5fcm9vdD1udWxsLHMuZWFjaChyLGZ1bmN0aW9uKHQpe2kuaGFzKHQpfHwodC5wYXJlbnQ9bnVsbCl9KSxzLmVhY2goYSxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHMuZWFjaCh1LGZ1bmN0aW9uKHQpe3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucGFyZW50PW4ucGFyZW50fSksdGhpcy5fcm9vdD1lP28ucmVhbGl6ZUFyZWFDb25maWcoZSx7Y3JlYXRlVGFiQmFyOmZ1bmN0aW9uKCl7cmV0dXJuIG4uX2NyZWF0ZVRhYkJhcigpfSxjcmVhdGVIYW5kbGU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5fY3JlYXRlSGFuZGxlKCl9fSk6bnVsbCx0aGlzLnBhcmVudCYmKGkuZm9yRWFjaChmdW5jdGlvbih0KXtuLmF0dGFjaFdpZGdldCh0KX0pLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUuYWRkV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVmfHxudWxsLGk9ZS5tb2RlfHwidGFiLWFmdGVyIixyPW51bGw7aWYodGhpcy5fcm9vdCYmbiYmKHI9dGhpcy5fcm9vdC5maW5kVGFiTm9kZShuKSksbiYmIXIpdGhyb3cgbmV3IEVycm9yKCJSZWZlcmVuY2Ugd2lkZ2V0IGlzIG5vdCBpbiB0aGUgbGF5b3V0LiIpO3N3aXRjaCh0LnBhcmVudD10aGlzLnBhcmVudCxpKXtjYXNlInRhYi1hZnRlciI6dGhpcy5faW5zZXJ0VGFiKHQsbixyLCEwKTticmVhaztjYXNlInRhYi1iZWZvcmUiOnRoaXMuX2luc2VydFRhYih0LG4sciwhMSk7YnJlYWs7Y2FzZSJzcGxpdC10b3AiOnRoaXMuX2luc2VydFNwbGl0KHQsbixyLCJ2ZXJ0aWNhbCIsITEpO2JyZWFrO2Nhc2Uic3BsaXQtbGVmdCI6dGhpcy5faW5zZXJ0U3BsaXQodCxuLHIsImhvcml6b250YWwiLCExKTticmVhaztjYXNlInNwbGl0LXJpZ2h0Ijp0aGlzLl9pbnNlcnRTcGxpdCh0LG4sciwiaG9yaXpvbnRhbCIsITApO2JyZWFrO2Nhc2Uic3BsaXQtYm90dG9tIjp0aGlzLl9pbnNlcnRTcGxpdCh0LG4sciwidmVydGljYWwiLCEwKX10aGlzLnBhcmVudCYmKHRoaXMuYXR0YWNoV2lkZ2V0KHQpLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0PWZ1bmN0aW9uKHQpe3RoaXMuX3JlbW92ZVdpZGdldCh0KSx0aGlzLnBhcmVudCYmKHRoaXMuZGV0YWNoV2lkZ2V0KHQpLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUuaGl0VGVzdFRhYkFyZWFzPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX3Jvb3R8fCF0aGlzLnBhcmVudHx8IXRoaXMucGFyZW50LmlzVmlzaWJsZSlyZXR1cm4gbnVsbDt0aGlzLl9ib3h8fCh0aGlzLl9ib3g9YS5FbGVtZW50RXh0LmJveFNpemluZyh0aGlzLnBhcmVudC5ub2RlKSk7dmFyIG49dGhpcy5wYXJlbnQubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQtbi5sZWZ0LXRoaXMuX2JveC5ib3JkZXJMZWZ0LHI9ZS1uLnRvcC10aGlzLl9ib3guYm9yZGVyVG9wLG89dGhpcy5fcm9vdC5oaXRUZXN0VGFiTm9kZXMoaSxyKTtpZighbylyZXR1cm4gbnVsbDt2YXIgcz1vLnRhYkJhcix1PW8udG9wLGM9by5sZWZ0LGg9by53aWR0aCxsPW8uaGVpZ2h0LGQ9dGhpcy5fYm94LmJvcmRlckxlZnQrdGhpcy5fYm94LmJvcmRlclJpZ2h0LGY9dGhpcy5fYm94LmJvcmRlclRvcCt0aGlzLl9ib3guYm9yZGVyQm90dG9tO3JldHVybnt0YWJCYXI6cyx4OmkseTpyLHRvcDp1LGxlZnQ6YyxyaWdodDpuLndpZHRoLWQtKGMraCksYm90dG9tOm4uaGVpZ2h0LWYtKHUrbCksd2lkdGg6aCxoZWlnaHQ6bH19LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKSxzLmVhY2godGhpcyxmdW5jdGlvbih0KXtlLmF0dGFjaFdpZGdldCh0KX0pLHMuZWFjaCh0aGlzLmhhbmRsZXMoKSxmdW5jdGlvbih0KXtlLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKHQpfSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLmF0dGFjaFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5ub2RlIT09dC5ub2RlLnBhcmVudE5vZGUmJih0aGlzLl9pdGVtcy5zZXQodCxuZXcgaC5MYXlvdXRJdGVtKHQpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsbC5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0Lm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCxsLldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpKX0sZS5wcm90b3R5cGUuZGV0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQpe2lmKHRoaXMucGFyZW50Lm5vZGU9PT10Lm5vZGUucGFyZW50Tm9kZSl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGwuV2lkZ2V0Lk1zZy5CZWZvcmVEZXRhY2gpLHRoaXMucGFyZW50Lm5vZGUucmVtb3ZlQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsbC5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKTt2YXIgZT10aGlzLl9pdGVtcy5nZXQodCk7ZSYmKHRoaXMuX2l0ZW1zLmRlbGV0ZSh0KSxlLmRpc3Bvc2UoKSl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZVNob3c9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUub25CZWZvcmVTaG93LmNhbGwodGhpcyxlKSx0aGlzLnBhcmVudC51cGRhdGUoKX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUub25CZWZvcmVBdHRhY2guY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vbkNoaWxkU2hvd249ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRIaWRkZW49ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzVmlzaWJsZSYmdGhpcy5fdXBkYXRlKHQud2lkdGgsdC5oZWlnaHQpfSxlLnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUoLTEsLTEpfSxlLnByb3RvdHlwZS5vbkZpdFJlcXVlc3Q9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdGhpcy5fZml0KCl9LGUucHJvdG90eXBlLl9yZW1vdmVXaWRnZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fcm9vdCl7dmFyIGU9dGhpcy5fcm9vdC5maW5kVGFiTm9kZSh0KTtpZihlKWlmKGUudGFiQmFyLnRpdGxlcy5sZW5ndGg+MSllLnRhYkJhci5yZW1vdmVUYWIodC50aXRsZSk7ZWxzZSBpZihlLnRhYkJhci5kaXNwb3NlKCksdGhpcy5fcm9vdCE9PWUpe3RoaXMuX3Jvb3QuaG9sZEFsbFNpemVzKCk7dmFyIG49ZS5wYXJlbnQ7ZS5wYXJlbnQ9bnVsbDt2YXIgaT1zLkFycmF5RXh0LnJlbW92ZUZpcnN0T2Yobi5jaGlsZHJlbixlKSxyPXMuQXJyYXlFeHQucmVtb3ZlQXQobi5oYW5kbGVzLGkpO2lmKHMuQXJyYXlFeHQucmVtb3ZlQXQobi5zaXplcnMsaSksci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksbi5jaGlsZHJlbi5sZW5ndGg+MSluLnN5bmNIYW5kbGVzKCk7ZWxzZXt2YXIgYT1uLnBhcmVudDtuLnBhcmVudD1udWxsO3ZhciB1PW4uY2hpbGRyZW5bMF0sYz1uLmhhbmRsZXNbMF07aWYobi5jaGlsZHJlbi5sZW5ndGg9MCxuLmhhbmRsZXMubGVuZ3RoPTAsbi5zaXplcnMubGVuZ3RoPTAsYy5wYXJlbnROb2RlJiZjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyksdGhpcy5fcm9vdD09PW4pcmV0dXJuIHUucGFyZW50PW51bGwsdm9pZCh0aGlzLl9yb290PXUpO3ZhciBoPWEsbD1oLmNoaWxkcmVuLmluZGV4T2Yobik7aWYodSBpbnN0YW5jZW9mIG8uVGFiTGF5b3V0Tm9kZSlyZXR1cm4gdS5wYXJlbnQ9aCx2b2lkKGguY2hpbGRyZW5bbF09dSk7dmFyIGQ9cy5BcnJheUV4dC5yZW1vdmVBdChoLmhhbmRsZXMsbCk7cy5BcnJheUV4dC5yZW1vdmVBdChoLmNoaWxkcmVuLGwpLHMuQXJyYXlFeHQucmVtb3ZlQXQoaC5zaXplcnMsbCksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zm9yKHZhciBmPTAscD11LmNoaWxkcmVuLmxlbmd0aDtmPHA7KytmKXt2YXIgbT11LmNoaWxkcmVuW2ZdLGc9dS5oYW5kbGVzW2ZdLHY9dS5zaXplcnNbZl07cy5BcnJheUV4dC5pbnNlcnQoaC5jaGlsZHJlbixsK2YsbSkscy5BcnJheUV4dC5pbnNlcnQoaC5oYW5kbGVzLGwrZixnKSxzLkFycmF5RXh0Lmluc2VydChoLnNpemVycyxsK2YsdiksbS5wYXJlbnQ9aH11LmNoaWxkcmVuLmxlbmd0aD0wLHUuaGFuZGxlcy5sZW5ndGg9MCx1LnNpemVycy5sZW5ndGg9MCx1LnBhcmVudD1udWxsLGguc3luY0hhbmRsZXMoKX19ZWxzZSB0aGlzLl9yb290PW51bGx9fSxlLnByb3RvdHlwZS5faW5zZXJ0VGFiPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQhPT1lKXtpZighdGhpcy5fcm9vdCl7dmFyIHI9bmV3IG8uVGFiTGF5b3V0Tm9kZSh0aGlzLl9jcmVhdGVUYWJCYXIoKSk7cmV0dXJuIHIudGFiQmFyLmFkZFRhYih0LnRpdGxlKSx2b2lkKHRoaXMuX3Jvb3Q9cil9dmFyIHM7bnx8KG49dGhpcy5fcm9vdC5maW5kRmlyc3RUYWJOb2RlKCkpLC0xPT09bi50YWJCYXIudGl0bGVzLmluZGV4T2YodC50aXRsZSkmJih0aGlzLl9yZW1vdmVXaWRnZXQodCksdC5oaWRlKCkpLHM9ZT9uLnRhYkJhci50aXRsZXMuaW5kZXhPZihlLnRpdGxlKTpuLnRhYkJhci5jdXJyZW50SW5kZXgsbi50YWJCYXIuaW5zZXJ0VGFiKHMrKGk/MTowKSx0LnRpdGxlKX19LGUucHJvdG90eXBlLl9pbnNlcnRTcGxpdD1mdW5jdGlvbih0LGUsbixpLHIpe2lmKHQhPT1lfHwhbnx8MSE9PW4udGFiQmFyLnRpdGxlcy5sZW5ndGgpe3RoaXMuX3JlbW92ZVdpZGdldCh0KTt2YXIgYT1uZXcgby5UYWJMYXlvdXROb2RlKHRoaXMuX2NyZWF0ZVRhYkJhcigpKTtpZihhLnRhYkJhci5hZGRUYWIodC50aXRsZSksdGhpcy5fcm9vdCl7aWYoIW58fCFuLnBhcmVudCl7dmFyIHU9dGhpcy5fc3BsaXRSb290KGkpLGM9cj91LmNoaWxkcmVuLmxlbmd0aDowO3Uubm9ybWFsaXplU2l6ZXMoKTt2YXIgaD1vLmNyZWF0ZVNpemVyKG4/MTpvLkdPTERFTl9SQVRJTyk7cmV0dXJuIHMuQXJyYXlFeHQuaW5zZXJ0KHUuY2hpbGRyZW4sYyxhKSxzLkFycmF5RXh0Lmluc2VydCh1LnNpemVycyxjLGgpLHMuQXJyYXlFeHQuaW5zZXJ0KHUuaGFuZGxlcyxjLHRoaXMuX2NyZWF0ZUhhbmRsZSgpKSxhLnBhcmVudD11LHUubm9ybWFsaXplU2l6ZXMoKSx2b2lkIHUuc3luY0hhbmRsZXMoKX12YXIgbD1uLnBhcmVudDtpZihsLm9yaWVudGF0aW9uPT09aSl7dmFyIGQ9bC5jaGlsZHJlbi5pbmRleE9mKG4pO2wubm9ybWFsaXplU2l6ZXMoKTt2YXIgZj1sLnNpemVyc1tkXS5zaXplSGludC89MixwPWQrKHI/MTowKTtyZXR1cm4gcy5BcnJheUV4dC5pbnNlcnQobC5jaGlsZHJlbixwLGEpLHMuQXJyYXlFeHQuaW5zZXJ0KGwuc2l6ZXJzLHAsby5jcmVhdGVTaXplcihmKSkscy5BcnJheUV4dC5pbnNlcnQobC5oYW5kbGVzLHAsdGhpcy5fY3JlYXRlSGFuZGxlKCkpLGEucGFyZW50PWwsdm9pZCBsLnN5bmNIYW5kbGVzKCl9dmFyIG09cy5BcnJheUV4dC5yZW1vdmVGaXJzdE9mKGwuY2hpbGRyZW4sbiksZz1uZXcgby5TcGxpdExheW91dE5vZGUoaSk7Zy5ub3JtYWxpemVkPSEwLGcuY2hpbGRyZW4ucHVzaChuKSxnLnNpemVycy5wdXNoKG8uY3JlYXRlU2l6ZXIoLjUpKSxnLmhhbmRsZXMucHVzaCh0aGlzLl9jcmVhdGVIYW5kbGUoKSksbi5wYXJlbnQ9Zzt2YXIgdj1yPzE6MDtzLkFycmF5RXh0Lmluc2VydChnLmNoaWxkcmVuLHYsYSkscy5BcnJheUV4dC5pbnNlcnQoZy5zaXplcnMsdixvLmNyZWF0ZVNpemVyKC41KSkscy5BcnJheUV4dC5pbnNlcnQoZy5oYW5kbGVzLHYsdGhpcy5fY3JlYXRlSGFuZGxlKCkpLGEucGFyZW50PWcsZy5zeW5jSGFuZGxlcygpLHMuQXJyYXlFeHQuaW5zZXJ0KGwuY2hpbGRyZW4sbSxnKSxnLnBhcmVudD1sfWVsc2UgdGhpcy5fcm9vdD1hfX0sZS5wcm90b3R5cGUuX3NwbGl0Um9vdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yb290O2lmKGUgaW5zdGFuY2VvZiBvLlNwbGl0TGF5b3V0Tm9kZSYmZS5vcmllbnRhdGlvbj09PXQpcmV0dXJuIGU7dmFyIG49dGhpcy5fcm9vdD1uZXcgby5TcGxpdExheW91dE5vZGUodCk7cmV0dXJuIGUmJihuLmNoaWxkcmVuLnB1c2goZSksbi5zaXplcnMucHVzaChvLmNyZWF0ZVNpemVyKDApKSxuLmhhbmRsZXMucHVzaCh0aGlzLl9jcmVhdGVIYW5kbGUoKSksZS5wYXJlbnQ9biksbn0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe3ZhciB0PTAsZT0wO2lmKHRoaXMuX3Jvb3Qpe3ZhciBuPXRoaXMuX3Jvb3QuZml0KHRoaXMuX3NwYWNpbmcsdGhpcy5faXRlbXMpO3Q9bi5taW5XaWR0aCxlPW4ubWluSGVpZ2h0fXZhciBpPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3QrPWkuaG9yaXpvbnRhbFN1bSxlKz1pLnZlcnRpY2FsU3VtO3ZhciByPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7ci5taW5XaWR0aD10KyJweCIsci5taW5IZWlnaHQ9ZSsicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsbC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGwuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2RpcnR5PSExLHRoaXMuX3Jvb3Qpe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBuPXRoaXMuX2JveC5wYWRkaW5nVG9wLGk9dGhpcy5fYm94LnBhZGRpbmdMZWZ0LHI9dC10aGlzLl9ib3guaG9yaXpvbnRhbFN1bSxvPWUtdGhpcy5fYm94LnZlcnRpY2FsU3VtO3RoaXMuX3Jvb3QudXBkYXRlKG4saSxyLG8sdGhpcy5fc3BhY2luZyx0aGlzLl9pdGVtcyl9fSxlLnByb3RvdHlwZS5fY3JlYXRlVGFiQmFyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZW5kZXJlci5jcmVhdGVUYWJCYXIoKTtyZXR1cm4gdC5vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsdGhpcy5wYXJlbnQmJih0LnBhcmVudD10aGlzLnBhcmVudCx0aGlzLmF0dGFjaFdpZGdldCh0KSksdH0sZS5wcm90b3R5cGUuX2NyZWF0ZUhhbmRsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmVuZGVyZXIuY3JlYXRlSGFuZGxlKCksZT10LnN0eWxlO3JldHVybiBlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS50b3A9IjAiLGUubGVmdD0iMCIsZS53aWR0aD0iMCIsZS5oZWlnaHQ9IjAiLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKHQpLHR9LGV9KGguTGF5b3V0KTtlLkRvY2tMYXlvdXQ9ZCxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBlPW5ldyBjLkJveFNpemVyO3JldHVybiBlLnNpemVIaW50PXQsZS5zaXplPXQsZX1mdW5jdGlvbiBuKHQsZSl7cmV0dXJuInRhYi1hcmVhIj09PXQudHlwZT9mdW5jdGlvbih0LGUpe2lmKDA9PT10LndpZGdldHMubGVuZ3RoKXJldHVybiBudWxsO3ZhciBuPVtdO2lmKHMuZWFjaCh0LndpZGdldHMsZnVuY3Rpb24odCl7ZS5oYXModCl8fChlLmFkZCh0KSxuLnB1c2godCkpfSksMD09PW4ubGVuZ3RoKXJldHVybiBudWxsO3ZhciBpPXQuY3VycmVudEluZGV4Oy0xIT09aSYmKGk8MHx8aT49bi5sZW5ndGgpJiYoaT0wKTtyZXR1cm57dHlwZToidGFiLWFyZWEiLHdpZGdldHM6bixjdXJyZW50SW5kZXg6aX19KHQsZSk6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5vcmllbnRhdGlvbixyPVtdLG89W10scz0wLGE9dC5jaGlsZHJlbi5sZW5ndGg7czxhOysrcyl7dmFyIHU9bih0LmNoaWxkcmVuW3NdLGUpO3UmJigidGFiLWFyZWEiPT09dS50eXBlfHx1Lm9yaWVudGF0aW9uIT09aT8oci5wdXNoKHUpLG8ucHVzaChNYXRoLmFicyh0LnNpemVzW3NdfHwwKSkpOihyLnB1c2guYXBwbHkocix1LmNoaWxkcmVuKSxvLnB1c2guYXBwbHkobyx1LnNpemVzKSkpfWlmKDA9PT1yLmxlbmd0aClyZXR1cm4gbnVsbDtpZigxPT09ci5sZW5ndGgpcmV0dXJuIHJbMF07cmV0dXJue3R5cGU6InNwbGl0LWFyZWEiLG9yaWVudGF0aW9uOmksY2hpbGRyZW46cixzaXplczpvfX0odCxlKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuInRhYi1hcmVhIj09PXQudHlwZT9mdW5jdGlvbih0LGUpe3ZhciBuPWUuY3JlYXRlVGFiQmFyKCk7cmV0dXJuIHMuZWFjaCh0LndpZGdldHMsZnVuY3Rpb24odCl7dC5oaWRlKCksbi5hZGRUYWIodC50aXRsZSl9KSxuLmN1cnJlbnRJbmRleD10LmN1cnJlbnRJbmRleCxuZXcgcihuKX0odCxuKTpmdW5jdGlvbih0LG4pe3ZhciByPW5ldyBvKHQub3JpZW50YXRpb24pO3JldHVybiBzLmVhY2godC5jaGlsZHJlbixmdW5jdGlvbihvLHMpe3ZhciBhPWkobyxuKSx1PWUodC5zaXplc1tzXSksYz1uLmNyZWF0ZUhhbmRsZSgpO3IuY2hpbGRyZW4ucHVzaChhKSxyLmhhbmRsZXMucHVzaChjKSxyLnNpemVycy5wdXNoKHUpLGEucGFyZW50PXJ9KSxyLnN5bmNIYW5kbGVzKCksci5ub3JtYWxpemVTaXplcygpLHJ9KHQsbil9dC5HT0xERU5fUkFUSU89LjYxOCx0LmNsYW1wU3BhY2luZz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKHQpKX0sdC5jcmVhdGVTaXplcj1lLHQubm9ybWFsaXplQXJlYUNvbmZpZz1uLHQucmVhbGl6ZUFyZWFDb25maWc9aTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wYXJlbnQ9bnVsbCx0aGlzLl90b3A9MCx0aGlzLl9sZWZ0PTAsdGhpcy5fd2lkdGg9MCx0aGlzLl9oZWlnaHQ9MDt2YXIgZT1uZXcgYy5Cb3hTaXplcixuPW5ldyBjLkJveFNpemVyO2Uuc3RyZXRjaD0wLG4uc3RyZXRjaD0xLHRoaXMudGFiQmFyPXQsdGhpcy5zaXplcnM9W2Usbl19cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidG9wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RvcH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxlZnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVmdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIndpZHRoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaGVpZ2h0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pdGVyQWxsV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiBzLmNoYWluKHMub25jZSh0aGlzLnRhYkJhciksdGhpcy5pdGVyVXNlcldpZGdldHMoKSl9LHQucHJvdG90eXBlLml0ZXJVc2VyV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiBzLm1hcCh0aGlzLnRhYkJhci50aXRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQub3duZXJ9KX0sdC5wcm90b3R5cGUuaXRlclNlbGVjdGVkV2lkZ2V0cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMudGFiQmFyLmN1cnJlbnRUaXRsZTtyZXR1cm4gdD9zLm9uY2UodC5vd25lcik6cy5lbXB0eSgpfSx0LnByb3RvdHlwZS5pdGVyVGFiQmFycz1mdW5jdGlvbigpe3JldHVybiBzLm9uY2UodGhpcy50YWJCYXIpfSx0LnByb3RvdHlwZS5pdGVySGFuZGxlcz1mdW5jdGlvbigpe3JldHVybiBzLmVtcHR5KCl9LHQucHJvdG90eXBlLmZpbmRUYWJOb2RlPWZ1bmN0aW9uKHQpe3JldHVybi0xIT09dGhpcy50YWJCYXIudGl0bGVzLmluZGV4T2YodC50aXRsZSk/dGhpczpudWxsfSx0LnByb3RvdHlwZS5maW5kU3BsaXROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kRmlyc3RUYWJOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmhpdFRlc3RUYWJOb2Rlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0PHRoaXMuX2xlZnR8fHQ+PXRoaXMuX2xlZnQrdGhpcy5fd2lkdGg/bnVsbDplPHRoaXMuX3RvcHx8ZT49dGhpcy5fdG9wK3RoaXMuX2hlaWdodD9udWxsOnRoaXN9LHQucHJvdG90eXBlLmNyZWF0ZUNvbmZpZz1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJ0YWItYXJlYSIsd2lkZ2V0czp0aGlzLnRhYkJhci50aXRsZXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm93bmVyfSksY3VycmVudEluZGV4OnRoaXMudGFiQmFyLmN1cnJlbnRJbmRleH19LHQucHJvdG90eXBlLmhvbGRBbGxTaXplcz1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZml0PWZ1bmN0aW9uKHQsZSl7dmFyIG49MCxpPTAscj1lLmdldCh0aGlzLnRhYkJhciksbz10aGlzLnRhYkJhci5jdXJyZW50VGl0bGUscz1vP2UuZ2V0KG8ub3duZXIpOnZvaWQgMCxhPXRoaXMuc2l6ZXJzLHU9YVswXSxjPWFbMV07cmV0dXJuIHImJnIuZml0KCkscyYmcy5maXQoKSxyJiYhci5pc0hpZGRlbj8obj1NYXRoLm1heChuLHIubWluV2lkdGgpLGkrPXIubWluSGVpZ2h0LHUubWluU2l6ZT1yLm1pbkhlaWdodCx1Lm1heFNpemU9ci5tYXhIZWlnaHQpOih1Lm1pblNpemU9MCx1Lm1heFNpemU9MCkscyYmIXMuaXNIaWRkZW4/KG49TWF0aC5tYXgobixzLm1pbldpZHRoKSxpKz1zLm1pbkhlaWdodCxjLm1pblNpemU9cy5taW5IZWlnaHQsYy5tYXhTaXplPTEvMCk6KGMubWluU2l6ZT0wLGMubWF4U2l6ZT0xLzApLHttaW5XaWR0aDpuLG1pbkhlaWdodDppLG1heFdpZHRoOjEvMCxtYXhIZWlnaHQ6MS8wfX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl90b3A9ZSx0aGlzLl9sZWZ0PXQsdGhpcy5fd2lkdGg9bix0aGlzLl9oZWlnaHQ9aTt2YXIgcz1vLmdldCh0aGlzLnRhYkJhciksYT10aGlzLnRhYkJhci5jdXJyZW50VGl0bGUsdT1hP28uZ2V0KGEub3duZXIpOnZvaWQgMDtpZihjLkJveEVuZ2luZS5jYWxjKHRoaXMuc2l6ZXJzLGkpLHMmJiFzLmlzSGlkZGVuKXt2YXIgaD10aGlzLnNpemVyc1swXS5zaXplO3MudXBkYXRlKHQsZSxuLGgpLGUrPWh9aWYodSYmIXUuaXNIaWRkZW4pe2g9dGhpcy5zaXplcnNbMV0uc2l6ZTt1LnVwZGF0ZSh0LGUsbixoKX19LHR9KCk7dC5UYWJMYXlvdXROb2RlPXI7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucGFyZW50PW51bGwsdGhpcy5ub3JtYWxpemVkPSExLHRoaXMuY2hpbGRyZW49W10sdGhpcy5zaXplcnM9W10sdGhpcy5oYW5kbGVzPVtdLHRoaXMub3JpZW50YXRpb249dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlckFsbFdpZGdldHM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJBbGxXaWRnZXRzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlclVzZXJXaWRnZXRzPWZ1bmN0aW9uKCl7dmFyIHQ9cy5tYXAodGhpcy5jaGlsZHJlbixmdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVyVXNlcldpZGdldHMoKX0pO3JldHVybiBuZXcgcy5DaGFpbkl0ZXJhdG9yKHQpfSx0LnByb3RvdHlwZS5pdGVyU2VsZWN0ZWRXaWRnZXRzPWZ1bmN0aW9uKCl7dmFyIHQ9cy5tYXAodGhpcy5jaGlsZHJlbixmdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVyU2VsZWN0ZWRXaWRnZXRzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlclRhYkJhcnM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJUYWJCYXJzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlckhhbmRsZXM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJIYW5kbGVzKCl9KTtyZXR1cm4gcy5jaGFpbih0aGlzLmhhbmRsZXMsbmV3IHMuQ2hhaW5JdGVyYXRvcih0KSl9LHQucHJvdG90eXBlLmZpbmRUYWJOb2RlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxuOysrZSl7dmFyIGk9dGhpcy5jaGlsZHJlbltlXS5maW5kVGFiTm9kZSh0KTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kU3BsaXROb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFuZGxlcy5pbmRleE9mKHQpO2lmKC0xIT09ZSlyZXR1cm57aW5kZXg6ZSxub2RlOnRoaXN9O2Zvcih2YXIgbj0wLGk9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5jaGlsZHJlbltuXS5maW5kU3BsaXROb2RlKHQpO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLmZpbmRGaXJzdFRhYk5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuY2hpbGRyZW4ubGVuZ3RoP251bGw6dGhpcy5jaGlsZHJlblswXS5maW5kRmlyc3RUYWJOb2RlKCl9LHQucHJvdG90eXBlLmhpdFRlc3RUYWJOb2Rlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5jaGlsZHJlbltuXS5oaXRUZXN0VGFiTm9kZXModCxlKTtpZihyKXJldHVybiByfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5jcmVhdGVDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWVudGF0aW9uLGU9dGhpcy5jcmVhdGVOb3JtYWxpemVkU2l6ZXMoKTtyZXR1cm57dHlwZToic3BsaXQtYXJlYSIsb3JpZW50YXRpb246dCxjaGlsZHJlbjp0aGlzLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVDb25maWcoKX0pLHNpemVzOmV9fSx0LnByb3RvdHlwZS5zeW5jSGFuZGxlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cy5lYWNoKHRoaXMuaGFuZGxlcyxmdW5jdGlvbihlLG4pe2Uuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWVudGF0aW9uIix0Lm9yaWVudGF0aW9uKSxuPT09dC5oYW5kbGVzLmxlbmd0aC0xP2UuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIik6ZS5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1oaWRkZW4iKX0pfSx0LnByb3RvdHlwZS5ob2xkU2l6ZXM9ZnVuY3Rpb24oKXtzLmVhY2godGhpcy5zaXplcnMsZnVuY3Rpb24odCl7dC5zaXplSGludD10LnNpemV9KX0sdC5wcm90b3R5cGUuaG9sZEFsbFNpemVzPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuY2hpbGRyZW4sZnVuY3Rpb24odCl7cmV0dXJuIHQuaG9sZEFsbFNpemVzKCl9KSx0aGlzLmhvbGRTaXplcygpfSx0LnByb3RvdHlwZS5ub3JtYWxpemVTaXplcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2l6ZXJzLmxlbmd0aDtpZigwIT09dCl7dGhpcy5ob2xkU2l6ZXMoKTt2YXIgZT1zLnJlZHVjZSh0aGlzLnNpemVycyxmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uuc2l6ZUhpbnR9LDApOzA9PT1lP3MuZWFjaCh0aGlzLnNpemVycyxmdW5jdGlvbihlKXtlLnNpemU9ZS5zaXplSGludD0xL3R9KTpzLmVhY2godGhpcy5zaXplcnMsZnVuY3Rpb24odCl7dC5zaXplPXQuc2l6ZUhpbnQvPWV9KSx0aGlzLm5vcm1hbGl6ZWQ9ITB9fSx0LnByb3RvdHlwZS5jcmVhdGVOb3JtYWxpemVkU2l6ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNpemVycy5sZW5ndGg7aWYoMD09PXQpcmV0dXJuW107dmFyIGU9dGhpcy5zaXplcnMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNpemV9KSxuPXMucmVkdWNlKGUsZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSwwKTtyZXR1cm4gMD09PW4/cy5lYWNoKGUsZnVuY3Rpb24obixpKXtlW2ldPTEvdH0pOnMuZWFjaChlLGZ1bmN0aW9uKHQsaSl7ZVtpXT10L259KSxlfSx0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbixpPU1hdGgubWF4KDAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSkqdCxyPW4/aTowLG89bj8wOmkscz0wLGE9dGhpcy5jaGlsZHJlbi5sZW5ndGg7czxhOysrcyl7dmFyIHU9dGhpcy5jaGlsZHJlbltzXS5maXQodCxlKTtuPyhvPU1hdGgubWF4KG8sdS5taW5IZWlnaHQpLHIrPXUubWluV2lkdGgsdGhpcy5zaXplcnNbc10ubWluU2l6ZT11Lm1pbldpZHRoKToocj1NYXRoLm1heChyLHUubWluV2lkdGgpLG8rPXUubWluSGVpZ2h0LHRoaXMuc2l6ZXJzW3NdLm1pblNpemU9dS5taW5IZWlnaHQpfXJldHVybnttaW5XaWR0aDpyLG1pbkhlaWdodDpvLG1heFdpZHRoOjEvMCxtYXhIZWlnaHQ6MS8wfX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uLHU9TWF0aC5tYXgoMCx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKSpyLGg9TWF0aC5tYXgoMCwoYT9uOmkpLXUpO3RoaXMubm9ybWFsaXplZCYmKHMuZWFjaCh0aGlzLnNpemVycyxmdW5jdGlvbih0KXt0LnNpemVIaW50Kj1ofSksdGhpcy5ub3JtYWxpemVkPSExKSxjLkJveEVuZ2luZS5jYWxjKHRoaXMuc2l6ZXJzLGgpO2Zvcih2YXIgbD0wLGQ9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bDxkOysrbCl7dmFyIGY9dGhpcy5jaGlsZHJlbltsXSxwPXRoaXMuc2l6ZXJzW2xdLnNpemUsbT10aGlzLmhhbmRsZXNbbF0uc3R5bGU7YT8oZi51cGRhdGUodCxlLHAsaSxyLG8pLHQrPXAsbS50b3A9ZSsicHgiLG0ubGVmdD10KyJweCIsbS53aWR0aD1yKyJweCIsbS5oZWlnaHQ9aSsicHgiLHQrPXIpOihmLnVwZGF0ZSh0LGUsbixwLHIsbyksZSs9cCxtLnRvcD1lKyJweCIsbS5sZWZ0PXQrInB4IixtLndpZHRoPW4rInB4IixtLmhlaWdodD1yKyJweCIsZSs9cil9fSx0fSgpO3QuU3BsaXRMYXlvdXROb2RlPW99KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDUpLGM9bigzMCksaD1uKDQwKSxsPW4oMjIpLGQ9big0MSksZj1uKDcpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2ZpeGVkPTAsbi5fc3BhY2luZz00LG4uX2RpcnR5PSExLG4uX2hhc05vcm1lZFNpemVzPSExLG4uX3NpemVycz1bXSxuLl9pdGVtcz1bXSxuLl9oYW5kbGVzPVtdLG4uX2JveD1udWxsLG4uX2FsaWdubWVudD0ic3RhcnQiLG4uX29yaWVudGF0aW9uPSJob3Jpem9udGFsIixuLnJlbmRlcmVyPWUucmVuZGVyZXIsdm9pZCAwIT09ZS5vcmllbnRhdGlvbiYmKG4uX29yaWVudGF0aW9uPWUub3JpZW50YXRpb24pLHZvaWQgMCE9PWUuYWxpZ25tZW50JiYobi5fYWxpZ25tZW50PWUuYWxpZ25tZW50KSx2b2lkIDAhPT1lLnNwYWNpbmcmJihuLl9zcGFjaW5nPW8uY2xhbXBTcGFjaW5nKGUuc3BhY2luZykpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fc2l6ZXJzLmxlbmd0aD0wLHRoaXMuX2hhbmRsZXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fb3JpZW50YXRpb249dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQub3JpZW50YXRpb249dCx0aGlzLnBhcmVudC5maXQoKSkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25tZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsaWdubWVudH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2FsaWdubWVudCE9PXQmJih0aGlzLl9hbGlnbm1lbnQ9dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXQsdGhpcy5wYXJlbnQudXBkYXRlKCkpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3Q9by5jbGFtcFNwYWNpbmcodCksdGhpcy5fc3BhY2luZyE9PXQmJih0aGlzLl9zcGFjaW5nPXQsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpdCgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImhhbmRsZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFuZGxlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZWxhdGl2ZVNpemVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8ubm9ybWFsaXplKHRoaXMuX3NpemVycy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2l6ZX0pKX0sZS5wcm90b3R5cGUuc2V0UmVsYXRpdmVTaXplcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2l6ZXJzLmxlbmd0aCxuPXQuc2xpY2UoMCxlKTtuLmxlbmd0aDxlOyluLnB1c2goMCk7Zm9yKHZhciBpPW8ubm9ybWFsaXplKG4pLHI9MDtyPGU7KytyKXt2YXIgcz10aGlzLl9zaXplcnNbcl07cy5zaXplSGludD1pW3JdLHMuc2l6ZT1pW3JdfXRoaXMuX2hhc05vcm1lZFNpemVzPSEwLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC51cGRhdGUoKX0sZS5wcm90b3R5cGUubW92ZUhhbmRsZT1mdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5faGFuZGxlc1t0XTtpZihpJiYhaS5jbGFzc0xpc3QuY29udGFpbnMoInAtbW9kLWhpZGRlbiIpJiYwIT09KG49Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/ZS1pLm9mZnNldExlZnQ6ZS1pLm9mZnNldFRvcCkpe2Zvcih2YXIgcj0wLG89dGhpcy5fc2l6ZXJzO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdO3Muc2l6ZT4wJiYocy5zaXplSGludD1zLnNpemUpfWguQm94RW5naW5lLmFkanVzdCh0aGlzLl9zaXplcnMsdCxuKSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCl9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQuZGF0YXNldC5vcmllbnRhdGlvbj10aGlzLm9yaWVudGF0aW9uLHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXRoaXMuYWxpZ25tZW50LHQucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuYXR0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGwuTGF5b3V0SXRlbShlKSxpPW8uY3JlYXRlSGFuZGxlKHRoaXMucmVuZGVyZXIpLHI9by5hdmVyYWdlU2l6ZSh0aGlzLl9zaXplcnMpLGE9by5jcmVhdGVTaXplcihyKTtzLkFycmF5RXh0Lmluc2VydCh0aGlzLl9pdGVtcyx0LG4pLHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX3NpemVycyx0LGEpLHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX2hhbmRsZXMsdCxpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZChlLm5vZGUpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQoaSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe3MuQXJyYXlFeHQubW92ZSh0aGlzLl9pdGVtcyx0LGUpLHMuQXJyYXlFeHQubW92ZSh0aGlzLl9zaXplcnMsdCxlKSxzLkFycmF5RXh0Lm1vdmUodGhpcy5faGFuZGxlcyx0LGUpLHRoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpLGk9cy5BcnJheUV4dC5yZW1vdmVBdCh0aGlzLl9oYW5kbGVzLHQpO3MuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fc2l6ZXJzLHQpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxmLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQubm9kZS5yZW1vdmVDaGlsZChpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKSxuLmRpc3Bvc2UoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25CZWZvcmVTaG93PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm9uQmVmb3JlU2hvdy5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQudXBkYXRlKCl9LGUucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoLmNhbGwodGhpcyxlKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZFNob3duPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vbkNoaWxkSGlkZGVuPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSh0LndpZHRoLHQuaGVpZ2h0KX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzVmlzaWJsZSYmdGhpcy5fdXBkYXRlKC0xLC0xKX0sZS5wcm90b3R5cGUub25GaXRSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnRoaXMuX2ZpdCgpfSxlLnByb3RvdHlwZS5fZml0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsbj0tMSxpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl0aGlzLl9pdGVtc1tpXS5pc0hpZGRlbj90aGlzLl9oYW5kbGVzW2ldLmNsYXNzTGlzdC5hZGQoInAtbW9kLWhpZGRlbiIpOih0aGlzLl9oYW5kbGVzW2ldLmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLWhpZGRlbiIpLG49aSx0KyspOy0xIT09biYmdGhpcy5faGFuZGxlc1tuXS5jbGFzc0xpc3QuYWRkKCJwLW1vZC1oaWRkZW4iKSx0aGlzLl9maXhlZD10aGlzLl9zcGFjaW5nKk1hdGgubWF4KDAsdC0xKTt2YXIgbz0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbixzPW8/dGhpcy5fZml4ZWQ6MCxjPW8/MDp0aGlzLl9maXhlZDtmb3IoaT0wLHI9dGhpcy5faXRlbXMubGVuZ3RoO2k8cjsrK2kpe3ZhciBoPXRoaXMuX2l0ZW1zW2ldLGw9dGhpcy5fc2l6ZXJzW2ldO2wuc2l6ZT4wJiYobC5zaXplSGludD1sLnNpemUpLGguaXNIaWRkZW4/KGwubWluU2l6ZT0wLGwubWF4U2l6ZT0wKTooaC5maXQoKSxsLnN0cmV0Y2g9ZS5nZXRTdHJldGNoKGgud2lkZ2V0KSxvPyhsLm1pblNpemU9aC5taW5XaWR0aCxsLm1heFNpemU9aC5tYXhXaWR0aCxzKz1oLm1pbldpZHRoLGM9TWF0aC5tYXgoYyxoLm1pbkhlaWdodCkpOihsLm1pblNpemU9aC5taW5IZWlnaHQsbC5tYXhTaXplPWgubWF4SGVpZ2h0LGMrPWgubWluSGVpZ2h0LHM9TWF0aC5tYXgocyxoLm1pbldpZHRoKSkpfXZhciBkPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3MrPWQuaG9yaXpvbnRhbFN1bSxjKz1kLnZlcnRpY2FsU3VtO3ZhciBwPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7cC5taW5XaWR0aD1zKyJweCIscC5taW5IZWlnaHQ9YysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZi5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvLHM9dGhpcy5fYm94LnBhZGRpbmdUb3AsdT10aGlzLl9ib3gucGFkZGluZ0xlZnQsYz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLGw9ZS10aGlzLl9ib3gudmVydGljYWxTdW0sZD0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbjtpZihvPWQ/TWF0aC5tYXgoMCxjLXRoaXMuX2ZpeGVkKTpNYXRoLm1heCgwLGwtdGhpcy5fZml4ZWQpLHRoaXMuX2hhc05vcm1lZFNpemVzKXtmb3IodmFyIGY9MCxwPXRoaXMuX3NpemVycztmPHAubGVuZ3RoO2YrKyl7cFtmXS5zaXplSGludCo9b310aGlzLl9oYXNOb3JtZWRTaXplcz0hMX12YXIgbT1oLkJveEVuZ2luZS5jYWxjKHRoaXMuX3NpemVycyxvKSxnPTAsdj0wO2lmKG0+MClzd2l0Y2godGhpcy5fYWxpZ25tZW50KXtjYXNlInN0YXJ0IjpicmVhaztjYXNlImNlbnRlciI6Zz0wLHY9bS8yO2JyZWFrO2Nhc2UiZW5kIjpnPTAsdj1tO2JyZWFrO2Nhc2UianVzdGlmeSI6Zz1tL24sdj0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifWZvcihpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl7dmFyIGI9dGhpcy5faXRlbXNbaV07aWYoIWIuaXNIaWRkZW4pe3ZhciB5PXRoaXMuX3NpemVyc1tpXS5zaXplLF89dGhpcy5faGFuZGxlc1tpXS5zdHlsZTtkPyhiLnVwZGF0ZSh1K3Yscyx5K2csbCksdSs9eStnLF8udG9wPXMrInB4IixfLmxlZnQ9dSt2KyJweCIsXy53aWR0aD10aGlzLl9zcGFjaW5nKyJweCIsXy5oZWlnaHQ9bCsicHgiLHUrPXRoaXMuX3NwYWNpbmcpOihiLnVwZGF0ZSh1LHMrdixjLHkrZykscys9eStnLF8udG9wPXMrdisicHgiLF8ubGVmdD11KyJweCIsXy53aWR0aD1jKyJweCIsXy5oZWlnaHQ9dGhpcy5fc3BhY2luZysicHgiLHMrPXRoaXMuX3NwYWNpbmcpfX19fSxlfShkLlBhbmVsTGF5b3V0KTtlLlNwbGl0TGF5b3V0PXAsZnVuY3Rpb24odCl7dC5nZXRTdHJldGNoPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmV0Y2hQcm9wZXJ0eS5nZXQodCl9LHQuc2V0U3RyZXRjaD1mdW5jdGlvbih0LGUpe28uc3RyZXRjaFByb3BlcnR5LnNldCh0LGUpfX0ocD1lLlNwbGl0TGF5b3V0fHwoZS5TcGxpdExheW91dD17fSkpLGUuU3BsaXRMYXlvdXQ9cCxmdW5jdGlvbih0KXt0LnN0cmV0Y2hQcm9wZXJ0eT1uZXcgYy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJzdHJldGNoIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZnVuY3Rpb24odCl7dC5wYXJlbnQmJnQucGFyZW50LmxheW91dCBpbnN0YW5jZW9mIHAmJnQucGFyZW50LmZpdCgpfX0pLHQuY3JlYXRlU2l6ZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGguQm94U2l6ZXI7cmV0dXJuIGUuc2l6ZUhpbnQ9TWF0aC5mbG9vcih0KSxlfSx0LmNyZWF0ZUhhbmRsZT1mdW5jdGlvbih0KXt2YXIgZT10LmNyZWF0ZUhhbmRsZSgpO3JldHVybiBlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZX0sdC5jbGFtcFNwYWNpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcih0KSl9LHQuYXZlcmFnZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5zaXplfSwwKS90Lmxlbmd0aHx8MH0sdC5ub3JtYWxpemU9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107dmFyIG49dC5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtNYXRoLmFicyhlKX0sMCk7cmV0dXJuIDA9PT1uP3QubWFwKGZ1bmN0aW9uKHQpe3JldHVybiAxL2V9KTp0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC9ufSl9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDIpLHM9big5KSxhPW4oNSksdT1uKDIyKSxjPW4oNDEpLGg9big3KSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2RpcnR5PSExLGUuX2l0ZW1zPVtdLGUuX2JveD1udWxsLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7by5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXtvLkFycmF5RXh0Lmluc2VydCh0aGlzLl9pdGVtcyx0LG5ldyB1LkxheW91dEl0ZW0oZSkpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJmEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxoLldpZGdldC5Nc2cuQmVmb3JlQXR0YWNoKSx0aGlzLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGguV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe28uQXJyYXlFeHQubW92ZSh0aGlzLl9pdGVtcyx0LGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1vLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpO3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJmEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxoLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGguV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksbi53aWRnZXQubm9kZS5zdHlsZS56SW5kZXg9IiIsbi5kaXNwb3NlKCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxuPTAsaT10aGlzLl9pdGVtcy5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5faXRlbXNbbl07ci5pc0hpZGRlbnx8KHIuZml0KCksdD1NYXRoLm1heCh0LHIubWluV2lkdGgpLGU9TWF0aC5tYXgoZSxyLm1pbkhlaWdodCkpfXZhciBvPXRoaXMuX2JveD1zLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3QrPW8uaG9yaXpvbnRhbFN1bSxlKz1vLnZlcnRpY2FsU3VtO3ZhciB1PXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7dS5taW5XaWR0aD10KyJweCIsdS5taW5IZWlnaHQ9ZSsicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsaC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGguV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PXMuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvPXRoaXMuX2JveC5wYWRkaW5nVG9wLGE9dGhpcy5fYm94LnBhZGRpbmdMZWZ0LHU9dC10aGlzLl9ib3guaG9yaXpvbnRhbFN1bSxjPWUtdGhpcy5fYm94LnZlcnRpY2FsU3VtO2ZvcihpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl7dmFyIGg9dGhpcy5faXRlbXNbaV07aC5pc0hpZGRlbnx8KGgud2lkZ2V0Lm5vZGUuc3R5bGUuekluZGV4PSIiK2ksaC51cGRhdGUoYSxvLHUsYykpfX19LGV9KGMuUGFuZWxMYXlvdXQpO2UuU3RhY2tlZExheW91dD1sfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMTEpLGE9big1NCksdT1uKDEzNCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyx7bGF5b3V0Om8uY3JlYXRlTGF5b3V0KGUpfSl8fHRoaXM7cmV0dXJuIG4uX3dpZGdldFJlbW92ZWQ9bmV3IHMuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtU3RhY2tlZFBhbmVsIiksbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0UmVtb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRSZW1vdmVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm9uQ2hpbGRBZGRlZD1mdW5jdGlvbih0KXt0LmNoaWxkLmFkZENsYXNzKCJwLVN0YWNrZWRQYW5lbC1jaGlsZCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0LmNoaWxkLnJlbW92ZUNsYXNzKCJwLVN0YWNrZWRQYW5lbC1jaGlsZCIpLHRoaXMuX3dpZGdldFJlbW92ZWQuZW1pdCh0LmNoaWxkKX0sZX0oYS5QYW5lbCk7ZS5TdGFja2VkUGFuZWw9YyxmdW5jdGlvbih0KXt0LmNyZWF0ZUxheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5sYXlvdXR8fG5ldyB1LlN0YWNrZWRMYXlvdXR9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9bigxNiksYz1uKDIpLGg9big1KSxsPW4oMzkpLGQ9big2KSxmPW4oMTUpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10aGlzLGk9ZS52aWV3O3JldHVybiBkZWxldGUgZS52aWV3LChuPXQuY2FsbCh0aGlzLGUpfHx0aGlzKS5fdmlldz1pLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSksdGhpcy5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5pc0Rpc3Bvc2VkfHwodC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3ZpZXcmJnRoaXMuX3ZpZXcucmVtb3ZlKCksdGhpcy5fdmlldz1udWxsKX0sZX0obC5QYW5lbCk7ZS5KdXB5dGVyUGhvc3Bob3JQYW5lbFdpZGdldD1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiQm94VmlldyIsX21vZGVsX25hbWU6IkJveE1vZGVsIixjaGlsZHJlbjpbXSxib3hfc3R5bGU6IiJ9KX0sZS5zZXJpYWxpemVycz1vKHt9LGEuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHtjaGlsZHJlbjp7ZGVzZXJpYWxpemU6cy51bnBhY2tfbW9kZWxzfX0pLGV9KGEuQ29yZURPTVdpZGdldE1vZGVsKTtlLkJveE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJIQm94VmlldyIsX21vZGVsX25hbWU6IkhCb3hNb2RlbCJ9KX0sZX0obSk7ZS5IQm94TW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGQuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IlZCb3hWaWV3IixfbW9kZWxfbmFtZToiVkJveE1vZGVsIn0pfSxlfShtKTtlLlZCb3hNb2RlbD12O3ZhciBiPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuX2NyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucFdpZGdldD1uZXcgcCh7dmlldzp0aGlzfSksdGhpcy5wV2lkZ2V0Lm5vZGV9LGUucHJvdG90eXBlLl9zZXRFbGVtZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZWx8fHQhPT10aGlzLnBXaWRnZXQubm9kZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNldCB0aGUgRE9NIGVsZW1lbnQuIik7dGhpcy5lbD10aGlzLnBXaWRnZXQubm9kZSx0aGlzLiRlbD1mKHRoaXMucFdpZGdldC5ub2RlKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuX3ZpZXdzPW5ldyBzLlZpZXdMaXN0KHRoaXMuYWRkX2NoaWxkX21vZGVsLG51bGwsdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6Y2hpbGRyZW4iLHRoaXMudXBkYXRlX2NoaWxkcmVuKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpib3hfc3R5bGUiLHRoaXMudXBkYXRlX2JveF9zdHlsZSksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC1jb250YWluZXIiKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC1ib3giKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy51cGRhdGVfY2hpbGRyZW4oKSx0aGlzLnNldF9ib3hfc3R5bGUoKX0sZS5wcm90b3R5cGUudXBkYXRlX2NoaWxkcmVuPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbl92aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImNoaWxkcmVuIikpLnRoZW4oZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2guTWVzc2FnZUxvb3AucG9zdE1lc3NhZ2UodC5wV2lkZ2V0LGwuV2lkZ2V0LlJlc2l6ZU1lc3NhZ2UuVW5rbm93blNpemUpfSl9KX0sZS5wcm90b3R5cGUudXBkYXRlX2JveF9zdHlsZT1mdW5jdGlvbigpe3RoaXMudXBkYXRlX21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJib3hfc3R5bGUiKX0sZS5wcm90b3R5cGUuc2V0X2JveF9zdHlsZT1mdW5jdGlvbigpe3RoaXMuc2V0X21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJib3hfc3R5bGUiKX0sZS5wcm90b3R5cGUuYWRkX2NoaWxkX21vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgbC5XaWRnZXQ7cmV0dXJuIHRoaXMucFdpZGdldC5hZGRXaWRnZXQobiksdGhpcy5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3ZhciBpPWMuQXJyYXlFeHQuZmlyc3RJbmRleE9mKGUucFdpZGdldC53aWRnZXRzLG4pO3JldHVybiBlLnBXaWRnZXQuaW5zZXJ0V2lkZ2V0KGksdC5wV2lkZ2V0KSxuLmRpc3Bvc2UoKSx0fSkuY2F0Y2godS5yZWplY3QoIkNvdWxkIG5vdCBhZGQgY2hpbGQgdmlldyB0byBib3giLCEwKSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5fdmlld3M9bnVsbCx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sZS5jbGFzc19tYXA9e3N1Y2Nlc3M6WyJhbGVydCIsImFsZXJ0LXN1Y2Nlc3MiXSxpbmZvOlsiYWxlcnQiLCJhbGVydC1pbmZvIl0sd2FybmluZzpbImFsZXJ0IiwiYWxlcnQtd2FybmluZyJdLGRhbmdlcjpbImFsZXJ0IiwiYWxlcnQtZGFuZ2VyIl19LGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5Cb3hWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpLHRoaXMucFdpZGdldC5hZGRDbGFzcygid2lkZ2V0LWhib3giKX0sZX0oYik7ZS5IQm94Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC12Ym94Iil9LGV9KGIpO2UuVkJveFZpZXc9Xzt2YXIgdz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJ3aWRnZXQtZ3JpZGJveCIpLHRoaXMucFdpZGdldC5yZW1vdmVDbGFzcygid2lkZ2V0LWJveCIpfSxlfShiKTtlLkdyaWRCb3hWaWV3PXc7dmFyIHg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJHcmlkQm94VmlldyIsX21vZGVsX25hbWU6IkdyaWRCb3hNb2RlbCJ9KX0sZX0obSk7ZS5HcmlkQm94TW9kZWw9eH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9bigyMyksdT1uKDgpLGM9bigxNiksaD1uKDEzOSksbD1uKDYpLGQ9bigxNSk7bigzNDcpO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkludE1vZGVsIix2YWx1ZTowfSl9LGV9KHMuQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuSW50TW9kZWw9Zjt2YXIgcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGwuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJCb3VuZGVkSW50TW9kZWwiLG1heDoxMDAsbWluOjB9KX0sZX0oZik7ZS5Cb3VuZGVkSW50TW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNsaWRlclN0eWxlTW9kZWwifSl9LGUuc3R5bGVQcm9wZXJ0aWVzPW8oe30sYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwuc3R5bGVQcm9wZXJ0aWVzLHtoYW5kbGVfY29sb3I6e3NlbGVjdG9yOiIudWktc2xpZGVyLWhhbmRsZSIsYXR0cmlidXRlOiJiYWNrZ3JvdW5kLWNvbG9yIixkZWZhdWx0Om51bGx9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuU2xpZGVyU3R5bGVNb2RlbD1tO3ZhciBnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkludFNsaWRlck1vZGVsIixfdmlld19uYW1lOiJJbnRTbGlkZXJWaWV3IixzdGVwOjEsb3JpZW50YXRpb246Imhvcml6b250YWwiLHJlYWRvdXQ6ITAscmVhZG91dF9mb3JtYXQ6ImQiLGNvbnRpbnVvdXNfdXBkYXRlOiEwLHN0eWxlOm51bGwsZGlzYWJsZWQ6ITF9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPWguZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0ocCk7ZS5JbnRTbGlkZXJNb2RlbD1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZX0oZyk7ZS5JbnRSYW5nZVNsaWRlck1vZGVsPXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcGFyc2VfdmFsdWU9cGFyc2VJbnQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1zbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1oc2xpZGVyIiksKHRoaXMuJHNsaWRlcj1kKCI8ZGl2IC8+IikpLnNsaWRlcih7c2xpZGU6dGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UuYmluZCh0aGlzKSxzdG9wOnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZC5iaW5kKHRoaXMpfSkuYWRkQ2xhc3MoInNsaWRlciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWRlcl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgic2xpZGVyLWNvbnRhaW5lciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzbGlkZXJbMF0pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJfY29udGFpbmVyKSx0aGlzLnJlYWRvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtcmVhZG91dCIpLHRoaXMucmVhZG91dC5jb250ZW50RWRpdGFibGU9InRydWUiLHRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPT10aGlzKXt2YXIgbj10aGlzO24uJHNsaWRlci5zbGlkZXIoe30pLFsic3RlcCIsImRpc2FibGVkIl0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uLm1vZGVsLmdldCh0KTt2b2lkIDAhPT1lJiZuLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLHQsZSl9KSx0aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKT90aGlzLnJlYWRvdXQuY29udGVudEVkaXRhYmxlPSJmYWxzZSI6dGhpcy5yZWFkb3V0LmNvbnRlbnRFZGl0YWJsZT0idHJ1ZSI7dmFyIGk9dGhpcy5tb2RlbC5nZXQoIm1heCIpLHI9dGhpcy5tb2RlbC5nZXQoIm1pbiIpO3I8PWkmJih2b2lkIDAhPT1pJiZ0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJtYXgiLGkpLHZvaWQgMCE9PXImJnRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm1pbiIscikpO3ZhciBvPXRoaXMubW9kZWwuZ2V0KCJvcmllbnRhdGlvbiIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm9yaWVudGF0aW9uIixvKSwidmVydGljYWwiPT09bz8odGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXZzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS12Ym94IikpOih0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC12c2xpZGVyIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS12Ym94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSksdGhpcy5tb2RlbC5nZXQoInJlYWRvdXQiKT8odGhpcy5yZWFkb3V0LnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5kaXNwbGF5ZWQudGhlbihmdW5jdGlvbigpe24ucmVhZG91dF9vdmVyZmxvdygpP24ucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJvdmVyZmxvdyIpOm4ucmVhZG91dC5jbGFzc0xpc3QucmVtb3ZlKCJvdmVyZmxvdyIpfSkpOnRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIn1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJlYWRvdXRfb3ZlcmZsb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkb3V0LnNjcm9sbFdpZHRoPnRoaXMucmVhZG91dC5jbGllbnRXaWR0aH0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlOiJoYW5kbGVTbGlkZXJDaGFuZ2UiLHNsaWRlc3RvcDoiaGFuZGxlU2xpZGVyQ2hhbmdlZCIsImJsdXIgW2NvbnRlbnRFZGl0YWJsZT10cnVlXSI6ImhhbmRsZVRleHRDaGFuZ2UiLCJrZXlkb3duIFtjb250ZW50RWRpdGFibGU9dHJ1ZV0iOiJoYW5kbGVLZXlEb3duIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7MTM9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVUZXh0Q2hhbmdlKCkpfSxlLnByb3RvdHlwZS5fdmFsaWRhdGVfc2xpZGVfdmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodCl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLkJhc2VJbnRTbGlkZXJWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcmFuZ2VfcmVnZXg9L15ccyooWystXT9cZCspXHMqWy064oCTXVxzKihbKy1dP1xkKykvLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxlKSx0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJyYW5nZSIsITApO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlcyIsbi5zbGljZSgpKSx0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKG4pLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpIT09biYmKHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsbix7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpfSxlLnByb3RvdHlwZS52YWx1ZVRvU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWwucmVhZG91dF9mb3JtYXR0ZXI7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkuam9pbigiIOKAkyAiKX0sZS5wcm90b3R5cGUuc3RyaW5nVG9WYWx1ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yYW5nZV9yZWdleC5leGVjKHQpO3JldHVybiBlP1t0aGlzLl9wYXJzZV92YWx1ZShlWzFdKSx0aGlzLl9wYXJzZV92YWx1ZShlWzJdKV06bnVsbH0sZS5wcm90b3R5cGUuaGFuZGxlVGV4dENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RyaW5nVG9WYWx1ZSh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQpLGU9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpO251bGw9PT10fHxpc05hTih0WzBdKXx8aXNOYU4odFsxXSl8fHRbMF0+dFsxXT90aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKToodD1bTWF0aC5tYXgoTWF0aC5taW4odFswXSxuKSxlKSxNYXRoLm1heChNYXRoLm1pbih0WzFdLG4pLGUpXSlbMF0hPT10aGlzLm1vZGVsLmdldCgidmFsdWUiKVswXXx8dFsxXSE9PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpWzFdPyh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHQpLHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsdCx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpOnRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5tb2RlbC5nZXQoInZhbHVlIikpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnZhbHVlcy5tYXAodGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcobiksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS52YWx1ZXMubWFwKHRoaXMuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLG4se3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShiKTtlLkludFJhbmdlU2xpZGVyVmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMsZSk7dmFyIG49dGhpcy5tb2RlbC5nZXQoIm1pbiIpLGk9dGhpcy5tb2RlbC5nZXQoIm1heCIpLHI9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7cj5pP3I9aTpyPG4mJihyPW4pLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlIixyKSx0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHIpLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpIT09ciYmKHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIscix7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpfSxlLnByb3RvdHlwZS52YWx1ZVRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybigwLHRoaXMubW9kZWwucmVhZG91dF9mb3JtYXR0ZXIpKHQpfSxlLnByb3RvdHlwZS5zdHJpbmdUb1ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJzZV92YWx1ZSh0KX0sZS5wcm90b3R5cGUuaGFuZGxlVGV4dENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RyaW5nVG9WYWx1ZSh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQpLGU9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpO2lzTmFOKHQpP3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5tb2RlbC5nZXQoInZhbHVlIikpOih0PU1hdGgubWF4KE1hdGgubWluKHQsbiksZSkpIT09dGhpcy5tb2RlbC5nZXQoInZhbHVlIik/KHRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodCksdGhpcy5tb2RlbC5zZXQoInZhbHVlIix0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKSk6dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0aGlzLm1vZGVsLmdldCgidmFsdWUiKSl9LGUucHJvdG90eXBlLmhhbmRsZVNsaWRlckNoYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlKGUudmFsdWUpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcobiksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSk7dGhpcy5tb2RlbC5zZXQoInZhbHVlIixuLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0oYik7ZS5JbnRTbGlkZXJWaWV3PV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiSW50VGV4dE1vZGVsIixfdmlld19uYW1lOiJJbnRUZXh0VmlldyIsZGlzYWJsZWQ6ITEsY29udGludW91c191cGRhdGU6ITF9KX0sZX0oZik7ZS5JbnRUZXh0TW9kZWw9dzt2YXIgeD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGwuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJCb3VuZGVkSW50VGV4dE1vZGVsIixfdmlld19uYW1lOiJJbnRUZXh0VmlldyIsZGlzYWJsZWQ6ITEsY29udGludW91c191cGRhdGU6ITEsc3RlcDoxfSl9LGV9KHApO2UuQm91bmRlZEludFRleHRNb2RlbD14O3ZhciBNPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlSW50LGUuX2RlZmF1bHRfc3RlcD0iMSIsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0IiksdGhpcy50ZXh0Ym94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdGhpcy50ZXh0Ym94LnR5cGU9Im51bWJlciIsdGhpcy50ZXh0Ym94LnJlcXVpcmVkPSEwLHRoaXMudGV4dGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9Yy51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRib3gpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lfHxlLnVwZGF0ZWRfdmlldyE9PXRoaXMpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuX3BhcnNlX3ZhbHVlKHRoaXMudGV4dGJveC52YWx1ZSkhPT1uJiYodGhpcy50ZXh0Ym94LnZhbHVlPW4udG9TdHJpbmcoKSksdm9pZCAwIT09dGhpcy5tb2RlbC5nZXQoIm1pbiIpJiYodGhpcy50ZXh0Ym94Lm1pbj10aGlzLm1vZGVsLmdldCgibWluIikpLHZvaWQgMCE9PXRoaXMubW9kZWwuZ2V0KCJtYXgiKSYmKHRoaXMudGV4dGJveC5tYXg9dGhpcy5tb2RlbC5nZXQoIm1heCIpKSx2b2lkIDAhPT10aGlzLm1vZGVsLmdldCgic3RlcCIpJiZudWxsIT09dGhpcy5tb2RlbC5nZXQoInN0ZXAiKT90aGlzLnRleHRib3guc3RlcD10aGlzLm1vZGVsLmdldCgic3RlcCIpOnRoaXMudGV4dGJveC5zdGVwPXRoaXMuX2RlZmF1bHRfc3RlcCx0aGlzLnRleHRib3guZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIil9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImtleWRvd24gaW5wdXQiOiJoYW5kbGVLZXlEb3duIiwia2V5cHJlc3MgaW5wdXQiOiJoYW5kbGVLZXlwcmVzcyIsImlucHV0IGlucHV0IjoiaGFuZGxlQ2hhbmdpbmciLCJjaGFuZ2UgaW5wdXQiOiJoYW5kbGVDaGFuZ2VkIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5cHJlc3M9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQudmFsdWUudHJpbSgpOyIiPT09ZXx8WyItIiwiLS4iLCIuIiwiKy4iLCIrIl0uaW5kZXhPZihlKT49MHx8dGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlQ2hhbmdlZCh0KX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wYXJzZV92YWx1ZSh0LnRhcmdldC52YWx1ZSk7aWYoaXNOYU4oZSkpdC50YXJnZXQudmFsdWU9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7ZWxzZXt2YXIgbj1lO3ZvaWQgMCE9PXRoaXMubW9kZWwuZ2V0KCJtYXgiKSYmKG49TWF0aC5taW4odGhpcy5tb2RlbC5nZXQoIm1heCIpLG4pKSx2b2lkIDAhPT10aGlzLm1vZGVsLmdldCgibWluIikmJihuPU1hdGgubWF4KHRoaXMubW9kZWwuZ2V0KCJtaW4iKSxuKSksbiE9PWUmJih0LnRhcmdldC52YWx1ZT1uLGU9biksZSE9PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpJiYodGhpcy5tb2RlbC5zZXQoInZhbHVlIixlLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKSl9fSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5JbnRUZXh0Vmlldz1NO3ZhciBTPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiUHJvZ3Jlc3NTdHlsZU1vZGVsIn0pfSxlLnN0eWxlUHJvcGVydGllcz1vKHt9LGEuRGVzY3JpcHRpb25TdHlsZU1vZGVsLnN0eWxlUHJvcGVydGllcyx7YmFyX2NvbG9yOntzZWxlY3RvcjoiLnByb2dyZXNzLWJhciIsYXR0cmlidXRlOiJiYWNrZ3JvdW5kLWNvbG9yIixkZWZhdWx0Om51bGx9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuUHJvZ3Jlc3NTdHlsZU1vZGVsPVM7dmFyIEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiSW50UHJvZ3Jlc3NNb2RlbCIsX3ZpZXdfbmFtZToiUHJvZ3Jlc3NWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsYmFyX3N0eWxlOiIiLHN0eWxlOm51bGx9KX0sZX0ocCk7ZS5JbnRQcm9ncmVzc01vZGVsPUU7dmFyIEE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmJhcl9zdHlsZSIsdGhpcy51cGRhdGVfYmFyX3N0eWxlKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKTt2YXIgZT0iaG9yaXpvbnRhbCI9PT10aGlzLm1vZGVsLmdldCgib3JpZW50YXRpb24iKT8id2lkZ2V0LWhwcm9ncmVzcyI6IndpZGdldC12cHJvZ3Jlc3MiO3RoaXMuZWwuY2xhc3NMaXN0LmFkZChlKSx0aGlzLnByb2dyZXNzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMucHJvZ3Jlc3MuY2xhc3NMaXN0LmFkZCgicHJvZ3Jlc3MiKSx0aGlzLnByb2dyZXNzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnByb2dyZXNzKSx0aGlzLmJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmJhci5jbGFzc0xpc3QuYWRkKCJwcm9ncmVzcy1iYXIiKSx0aGlzLmJhci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuYmFyLnN0eWxlLmJvdHRvbT0iMHB4Iix0aGlzLmJhci5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMucHJvZ3Jlc3MuYXBwZW5kQ2hpbGQodGhpcy5iYXIpLHRoaXMudXBkYXRlKCksdGhpcy5zZXRfYmFyX3N0eWxlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpLGk9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLHI9MTAwKihlLWkpLyhuLWkpO3JldHVybiJob3Jpem9udGFsIj09PXRoaXMubW9kZWwuZ2V0KCJvcmllbnRhdGlvbiIpPyh0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtdmJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LXZwcm9ncmVzcyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHByb2dyZXNzIiksdGhpcy5iYXIuc3R5bGUud2lkdGg9cisiJSIsdGhpcy5iYXIuc3R5bGUuaGVpZ2h0PSIxMDAlIik6KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtaHByb2dyZXNzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLXZib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC12cHJvZ3Jlc3MiKSx0aGlzLmJhci5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5iYXIuc3R5bGUuaGVpZ2h0PXIrIiUiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUudXBkYXRlX2Jhcl9zdHlsZT1mdW5jdGlvbigpe3RoaXMudXBkYXRlX21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJiYXJfc3R5bGUiLHRoaXMuYmFyKX0sZS5wcm90b3R5cGUuc2V0X2Jhcl9zdHlsZT1mdW5jdGlvbigpe3RoaXMuc2V0X21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJiYXJfc3R5bGUiLHRoaXMuYmFyKX0sZS5jbGFzc19tYXA9e3N1Y2Nlc3M6WyJwcm9ncmVzcy1iYXItc3VjY2VzcyJdLGluZm86WyJwcm9ncmVzcy1iYXItaW5mbyJdLHdhcm5pbmc6WyJwcm9ncmVzcy1iYXItd2FybmluZyJdLGRhbmdlcjpbInByb2dyZXNzLWJhci1kYW5nZXIiXX0sZX0oYS5EZXNjcmlwdGlvblZpZXcpO2UuUHJvZ3Jlc3NWaWV3PUE7dmFyIEM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiUGxheU1vZGVsIixfdmlld19uYW1lOiJQbGF5VmlldyIsX3BsYXlpbmc6ITEsX3JlcGVhdDohMSxzaG93X3JlcGVhdDohMCxpbnRlcnZhbDoxMDAsc3RlcDoxLGRpc2FibGVkOiExfSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5sb29wPWZ1bmN0aW9uKCl7aWYodGhpcy5nZXQoIl9wbGF5aW5nIikpe3ZhciB0PXRoaXMuZ2V0KCJ2YWx1ZSIpK3RoaXMuZ2V0KCJzdGVwIik7dDw9dGhpcy5nZXQoIm1heCIpPyh0aGlzLnNldCgidmFsdWUiLHQpLHRoaXMuc2NoZWR1bGVfbmV4dCgpKTp0aGlzLmdldCgiX3JlcGVhdCIpPyh0aGlzLnNldCgidmFsdWUiLHRoaXMuZ2V0KCJtaW4iKSksdGhpcy5zY2hlZHVsZV9uZXh0KCkpOnRoaXMuc2V0KCJfcGxheWluZyIsITEpLHRoaXMuc2F2ZV9jaGFuZ2VzKCl9fSxlLnByb3RvdHlwZS5zY2hlZHVsZV9uZXh0PWZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sb29wLmJpbmQodGhpcyksdGhpcy5nZXQoImludGVydmFsIikpfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9wbGF5aW5nIiwhMSksdGhpcy5zZXQoInZhbHVlIix0aGlzLmdldCgibWluIikpLHRoaXMuc2F2ZV9jaGFuZ2VzKCl9LGUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9wbGF5aW5nIiwhMSksdGhpcy5zYXZlX2NoYW5nZXMoKX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuc2V0KCJfcGxheWluZyIsITApLHRoaXMuZ2V0KCJ2YWx1ZSIpPT10aGlzLmdldCgibWF4Iik/KHRoaXMuc2V0KCJ2YWx1ZSIsdGhpcy5nZXQoIm1pbiIpKSx0aGlzLnNjaGVkdWxlX25leHQoKSx0aGlzLnNhdmVfY2hhbmdlcygpKTp0aGlzLmxvb3AoKX0sZS5wcm90b3R5cGUucmVwZWF0PWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9yZXBlYXQiLCF0aGlzLmdldCgiX3JlcGVhdCIpKSx0aGlzLnNhdmVfY2hhbmdlcygpfSxlfShwKTtlLlBsYXlNb2RlbD1DO3ZhciBrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXBsYXkiKSx0aGlzLnBsYXlCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5wYXVzZUJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKSx0aGlzLnN0b3BCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5yZXBlYXRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5wbGF5QnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMucGF1c2VCdXR0b24uY2xhc3NOYW1lPSJqdXB5dGVyLWJ1dHRvbiIsdGhpcy5zdG9wQnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMucmVwZWF0QnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5wbGF5QnV0dG9uKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMucGF1c2VCdXR0b24pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zdG9wQnV0dG9uKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMucmVwZWF0QnV0dG9uKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7ZS5jbGFzc05hbWU9ImZhIGZhLXBsYXkiLHRoaXMucGxheUJ1dHRvbi5hcHBlbmRDaGlsZChlKTt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7bi5jbGFzc05hbWU9ImZhIGZhLXBhdXNlIix0aGlzLnBhdXNlQnV0dG9uLmFwcGVuZENoaWxkKG4pO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTtpLmNsYXNzTmFtZT0iZmEgZmEtc3RvcCIsdGhpcy5zdG9wQnV0dG9uLmFwcGVuZENoaWxkKGkpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTtyLmNsYXNzTmFtZT0iZmEgZmEtcmV0d2VldCIsdGhpcy5yZXBlYXRCdXR0b24uYXBwZW5kQ2hpbGQociksdGhpcy5wbGF5QnV0dG9uLm9uY2xpY2s9dGhpcy5tb2RlbC5wbGF5LmJpbmQodGhpcy5tb2RlbCksdGhpcy5wYXVzZUJ1dHRvbi5vbmNsaWNrPXRoaXMubW9kZWwucGF1c2UuYmluZCh0aGlzLm1vZGVsKSx0aGlzLnN0b3BCdXR0b24ub25jbGljaz10aGlzLm1vZGVsLnN0b3AuYmluZCh0aGlzLm1vZGVsKSx0aGlzLnJlcGVhdEJ1dHRvbi5vbmNsaWNrPXRoaXMubW9kZWwucmVwZWF0LmJpbmQodGhpcy5tb2RlbCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X3BsYXlpbmciLHRoaXMudXBkYXRlX3BsYXlpbmcpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOl9yZXBlYXQiLHRoaXMudXBkYXRlX3JlcGVhdCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6c2hvd19yZXBlYXQiLHRoaXMudXBkYXRlX3JlcGVhdCksdGhpcy51cGRhdGVfcGxheWluZygpLHRoaXMudXBkYXRlX3JlcGVhdCgpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMucGxheUJ1dHRvbi5kaXNhYmxlZD10LHRoaXMucGF1c2VCdXR0b24uZGlzYWJsZWQ9dCx0aGlzLnN0b3BCdXR0b24uZGlzYWJsZWQ9dCx0aGlzLnJlcGVhdEJ1dHRvbi5kaXNhYmxlZD10LHRoaXMudXBkYXRlX3BsYXlpbmcoKX0sZS5wcm90b3R5cGUudXBkYXRlX3BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiX3BsYXlpbmciKSxlPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3Q/KGV8fCh0aGlzLnBhdXNlQnV0dG9uLmRpc2FibGVkPSExKSx0aGlzLnBsYXlCdXR0b24uY2xhc3NMaXN0LmFkZCgibW9kLWFjdGl2ZSIpKTooZXx8KHRoaXMucGF1c2VCdXR0b24uZGlzYWJsZWQ9ITApLHRoaXMucGxheUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIikpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVwZWF0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbC5nZXQoIl9yZXBlYXQiKTt0aGlzLnJlcGVhdEJ1dHRvbi5zdHlsZS5kaXNwbGF5PXRoaXMubW9kZWwuZ2V0KCJzaG93X3JlcGVhdCIpP3RoaXMucGxheUJ1dHRvbi5zdHlsZS5kaXNwbGF5OiJub25lIix0P3RoaXMucmVwZWF0QnV0dG9uLmNsYXNzTGlzdC5hZGQoIm1vZC1hY3RpdmUiKTp0aGlzLnJlcGVhdEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIil9LGV9KHUuRE9NV2lkZ2V0Vmlldyk7ZS5QbGF5Vmlldz1rfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvOwovKiEKICogalF1ZXJ5IFVJIFdpZGdldCAxLjEyLjEKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovcj1bbigxNSksbig0MildLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3ZhciBlLG49MCxpPUFycmF5LnByb3RvdHlwZS5zbGljZTtyZXR1cm4gdC5jbGVhbkRhdGE9KGU9dC5jbGVhbkRhdGEsZnVuY3Rpb24obil7dmFyIGkscixvO2ZvcihvPTA7bnVsbCE9KHI9bltvXSk7bysrKXRyeXsoaT10Ll9kYXRhKHIsImV2ZW50cyIpKSYmaS5yZW1vdmUmJnQocikudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKHQpe31lKG4pfSksdC53aWRnZXQ9ZnVuY3Rpb24oZSxuLGkpe3ZhciByLG8scyxhPXt9LHU9ZS5zcGxpdCgiLiIpWzBdLGM9dSsiLSIrKGU9ZS5zcGxpdCgiLiIpWzFdKTtyZXR1cm4gaXx8KGk9bixuPXQuV2lkZ2V0KSx0LmlzQXJyYXkoaSkmJihpPXQuZXh0ZW5kLmFwcGx5KG51bGwsW3t9XS5jb25jYXQoaSkpKSx0LmV4cHJbIjoiXVtjLnRvTG93ZXJDYXNlKCldPWZ1bmN0aW9uKGUpe3JldHVybiEhdC5kYXRhKGUsYyl9LHRbdV09dFt1XXx8e30scj10W3VdW2VdLG89dFt1XVtlXT1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9jcmVhdGVXaWRnZXQpcmV0dXJuIG5ldyBvKHQsZSk7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KHQsZSl9LHQuZXh0ZW5kKG8scix7dmVyc2lvbjppLnZlcnNpb24sX3Byb3RvOnQuZXh0ZW5kKHt9LGkpLF9jaGlsZENvbnN0cnVjdG9yczpbXX0pLChzPW5ldyBuKS5vcHRpb25zPXQud2lkZ2V0LmV4dGVuZCh7fSxzLm9wdGlvbnMpLHQuZWFjaChpLGZ1bmN0aW9uKGUsaSl7dC5pc0Z1bmN0aW9uKGkpP2FbZV09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG4ucHJvdG90eXBlW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiByKHQpe3JldHVybiBuLnByb3RvdHlwZVtlXS5hcHBseSh0aGlzLHQpfXJldHVybiBmdW5jdGlvbigpe3ZhciBlLG49dGhpcy5fc3VwZXIsbz10aGlzLl9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9cixlPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPW4sdGhpcy5fc3VwZXJBcHBseT1vLGV9fSgpOmFbZV09aX0pLG8ucHJvdG90eXBlPXQud2lkZ2V0LmV4dGVuZChzLHt3aWRnZXRFdmVudFByZWZpeDpyJiZzLndpZGdldEV2ZW50UHJlZml4fHxlfSxhLHtjb25zdHJ1Y3RvcjpvLG5hbWVzcGFjZTp1LHdpZGdldE5hbWU6ZSx3aWRnZXRGdWxsTmFtZTpjfSkscj8odC5lYWNoKHIuX2NoaWxkQ29uc3RydWN0b3JzLGZ1bmN0aW9uKGUsbil7dmFyIGk9bi5wcm90b3R5cGU7dC53aWRnZXQoaS5uYW1lc3BhY2UrIi4iK2kud2lkZ2V0TmFtZSxvLG4uX3Byb3RvKX0pLGRlbGV0ZSByLl9jaGlsZENvbnN0cnVjdG9ycyk6bi5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaChvKSx0LndpZGdldC5icmlkZ2UoZSxvKSxvfSx0LndpZGdldC5leHRlbmQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHIsbz1pLmNhbGwoYXJndW1lbnRzLDEpLHM9MCxhPW8ubGVuZ3RoO3M8YTtzKyspZm9yKG4gaW4gb1tzXSlyPW9bc11bbl0sb1tzXS5oYXNPd25Qcm9wZXJ0eShuKSYmdm9pZCAwIT09ciYmKHQuaXNQbGFpbk9iamVjdChyKT9lW25dPXQuaXNQbGFpbk9iamVjdChlW25dKT90LndpZGdldC5leHRlbmQoe30sZVtuXSxyKTp0LndpZGdldC5leHRlbmQoe30scik6ZVtuXT1yKTtyZXR1cm4gZX0sdC53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGUsbil7dmFyIHI9bi5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWV8fGU7dC5mbltlXT1mdW5jdGlvbihvKXt2YXIgcz0ic3RyaW5nIj09dHlwZW9mIG8sYT1pLmNhbGwoYXJndW1lbnRzLDEpLHU9dGhpcztyZXR1cm4gcz90aGlzLmxlbmd0aHx8Imluc3RhbmNlIiE9PW8/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG4saT10LmRhdGEodGhpcyxyKTtyZXR1cm4iaW5zdGFuY2UiPT09bz8odT1pLCExKTppP3QuaXNGdW5jdGlvbihpW29dKSYmIl8iIT09by5jaGFyQXQoMCk/KG49aVtvXS5hcHBseShpLGEpKSE9PWkmJnZvaWQgMCE9PW4/KHU9biYmbi5qcXVlcnk/dS5wdXNoU3RhY2sobi5nZXQoKSk6biwhMSk6dm9pZCAwOnQuZXJyb3IoIm5vIHN1Y2ggbWV0aG9kICciK28rIicgZm9yICIrZSsiIHdpZGdldCBpbnN0YW5jZSIpOnQuZXJyb3IoImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIitlKyIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IGF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIitvKyInIil9KTp1PXZvaWQgMDooYS5sZW5ndGgmJihvPXQud2lkZ2V0LmV4dGVuZC5hcHBseShudWxsLFtvXS5jb25jYXQoYSkpKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10LmRhdGEodGhpcyxyKTtlPyhlLm9wdGlvbihvfHx7fSksZS5faW5pdCYmZS5faW5pdCgpKTp0LmRhdGEodGhpcyxyLG5ldyBuKG8sdGhpcykpfSkpLHV9fSx0LldpZGdldD1mdW5jdGlvbigpe30sdC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzPVtdLHQuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVudFByZWZpeDoiIixkZWZhdWx0RWxlbWVudDoiPGRpdj4iLG9wdGlvbnM6e2NsYXNzZXM6e30sZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oZSxpKXtpPXQoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PXQoaSksdGhpcy51dWlkPW4rKyx0aGlzLmV2ZW50TmFtZXNwYWNlPSIuIit0aGlzLndpZGdldE5hbWUrdGhpcy51dWlkLHRoaXMuYmluZGluZ3M9dCgpLHRoaXMuaG92ZXJhYmxlPXQoKSx0aGlzLmZvY3VzYWJsZT10KCksdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cD17fSxpIT09dGhpcyYmKHQuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24odCl7dC50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PXQoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9dCh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz10LndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSxlKSx0aGlzLl9jcmVhdGUoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7cmV0dXJue319LF9nZXRDcmVhdGVFdmVudERhdGE6dC5ub29wLF9jcmVhdGU6dC5ub29wLF9pbml0OnQubm9vcCxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9kZXN0cm95KCksdC5lYWNoKHRoaXMuY2xhc3Nlc0VsZW1lbnRMb29rdXAsZnVuY3Rpb24odCxuKXtlLl9yZW1vdmVDbGFzcyhuLHQpfSksdGhpcy5lbGVtZW50Lm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLHRoaXMud2lkZ2V0KCkub2ZmKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKSx0aGlzLmJpbmRpbmdzLm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKX0sX2Rlc3Ryb3k6dC5ub29wLHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihlLG4pe3ZhciBpLHIsbyxzPWU7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlpZihzPXt9LGk9ZS5zcGxpdCgiLiIpLGU9aS5zaGlmdCgpLGkubGVuZ3RoKXtmb3Iocj1zW2VdPXQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnNbZV0pLG89MDtvPGkubGVuZ3RoLTE7bysrKXJbaVtvXV09cltpW29dXXx8e30scj1yW2lbb11dO2lmKGU9aS5wb3AoKSwxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09cltlXT9udWxsOnJbZV07cltlXT1ufWVsc2V7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXRoaXMub3B0aW9uc1tlXT9udWxsOnRoaXMub3B0aW9uc1tlXTtzW2VdPW59cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMocyksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdCl0aGlzLl9zZXRPcHRpb24oZSx0W2VdKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiJjbGFzc2VzIj09PXQmJnRoaXMuX3NldE9wdGlvbkNsYXNzZXMoZSksdGhpcy5vcHRpb25zW3RdPWUsImRpc2FibGVkIj09PXQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKGUpLHRoaXN9LF9zZXRPcHRpb25DbGFzc2VzOmZ1bmN0aW9uKGUpe3ZhciBuLGkscjtmb3IobiBpbiBlKXI9dGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFtuXSxlW25dIT09dGhpcy5vcHRpb25zLmNsYXNzZXNbbl0mJnImJnIubGVuZ3RoJiYoaT10KHIuZ2V0KCkpLHRoaXMuX3JlbW92ZUNsYXNzKHIsbiksaS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzKHtlbGVtZW50Omksa2V5czpuLGNsYXNzZXM6ZSxhZGQ6ITB9KSkpfSxfc2V0T3B0aW9uRGlzYWJsZWQ6ZnVuY3Rpb24odCl7dGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy53aWRnZXQoKSx0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLG51bGwsISF0KSx0JiYodGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5ob3ZlcmFibGUsbnVsbCwidWktc3RhdGUtaG92ZXIiKSx0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmZvY3VzYWJsZSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpKX0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoe2Rpc2FibGVkOiExfSl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITB9KX0sX2NsYXNzZXM6ZnVuY3Rpb24oZSl7dmFyIG49W10saT10aGlzO2Z1bmN0aW9uIHIocixvKXt2YXIgcyxhO2ZvcihhPTA7YTxyLmxlbmd0aDthKyspcz1pLmNsYXNzZXNFbGVtZW50TG9va3VwW3JbYV1dfHx0KCkscz1lLmFkZD90KHQudW5pcXVlKHMuZ2V0KCkuY29uY2F0KGUuZWxlbWVudC5nZXQoKSkpKTp0KHMubm90KGUuZWxlbWVudCkuZ2V0KCkpLGkuY2xhc3Nlc0VsZW1lbnRMb29rdXBbclthXV09cyxuLnB1c2goclthXSksbyYmZS5jbGFzc2VzW3JbYV1dJiZuLnB1c2goZS5jbGFzc2VzW3JbYV1dKX1yZXR1cm4gZT10LmV4dGVuZCh7ZWxlbWVudDp0aGlzLmVsZW1lbnQsY2xhc3Nlczp0aGlzLm9wdGlvbnMuY2xhc3Nlc3x8e319LGUpLHRoaXMuX29uKGUuZWxlbWVudCx7cmVtb3ZlOiJfdW50cmFja0NsYXNzZXNFbGVtZW50In0pLGUua2V5cyYmcihlLmtleXMubWF0Y2goL1xTKy9nKXx8W10sITApLGUuZXh0cmEmJnIoZS5leHRyYS5tYXRjaCgvXFMrL2cpfHxbXSksbi5qb2luKCIgIil9LF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmVhY2gobi5jbGFzc2VzRWxlbWVudExvb2t1cCxmdW5jdGlvbihpLHIpey0xIT09dC5pbkFycmF5KGUudGFyZ2V0LHIpJiYobi5jbGFzc2VzRWxlbWVudExvb2t1cFtpXT10KHIubm90KGUudGFyZ2V0KS5nZXQoKSkpfSl9LF9yZW1vdmVDbGFzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKHQsZSxuLCExKX0sX2FkZENsYXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3ModCxlLG4sITApfSxfdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlLG4saSl7aT0iYm9vbGVhbiI9PXR5cGVvZiBpP2k6bjt2YXIgcj0ic3RyaW5nIj09dHlwZW9mIHR8fG51bGw9PT10LG89e2V4dHJhOnI/ZTpuLGtleXM6cj90OmUsZWxlbWVudDpyP3RoaXMuZWxlbWVudDp0LGFkZDppfTtyZXR1cm4gby5lbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuX2NsYXNzZXMobyksaSksdGhpc30sX29uOmZ1bmN0aW9uKGUsbixpKXt2YXIgcixvPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgZSYmKGk9bixuPWUsZT0hMSksaT8obj1yPXQobiksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChuKSk6KGk9bixuPXRoaXMuZWxlbWVudCxyPXRoaXMud2lkZ2V0KCkpLHQuZWFjaChpLGZ1bmN0aW9uKGkscyl7ZnVuY3Rpb24gYSgpe2lmKGV8fCEwIT09by5vcHRpb25zLmRpc2FibGVkJiYhdCh0aGlzKS5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSlyZXR1cm4oInN0cmluZyI9PXR5cGVvZiBzP29bc106cykuYXBwbHkobyxhcmd1bWVudHMpfSJzdHJpbmciIT10eXBlb2YgcyYmKGEuZ3VpZD1zLmd1aWQ9cy5ndWlkfHxhLmd1aWR8fHQuZ3VpZCsrKTt2YXIgdT1pLm1hdGNoKC9eKFtcdzotXSopXHMqKC4qKSQvKSxjPXVbMV0rby5ldmVudE5hbWVzcGFjZSxoPXVbMl07aD9yLm9uKGMsaCxhKTpuLm9uKGMsYSl9KX0sX29mZjpmdW5jdGlvbihlLG4pe249KG58fCIiKS5zcGxpdCgiICIpLmpvaW4odGhpcy5ldmVudE5hbWVzcGFjZSsiICIpK3RoaXMuZXZlbnROYW1lc3BhY2UsZS5vZmYobikub2ZmKG4pLHRoaXMuYmluZGluZ3M9dCh0aGlzLmJpbmRpbmdzLm5vdChlKS5nZXQoKSksdGhpcy5mb2N1c2FibGU9dCh0aGlzLmZvY3VzYWJsZS5ub3QoZSkuZ2V0KCkpLHRoaXMuaG92ZXJhYmxlPXQodGhpcy5ob3ZlcmFibGUubm90KGUpLmdldCgpKX0sX2RlbGF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybigic3RyaW5nIj09dHlwZW9mIHQ/blt0XTp0KS5hcHBseShuLGFyZ3VtZW50cyl9LGV8fDApfSxfaG92ZXJhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuaG92ZXJhYmxlPXRoaXMuaG92ZXJhYmxlLmFkZChlKSx0aGlzLl9vbihlLHttb3VzZWVudGVyOmZ1bmN0aW9uKGUpe3RoaXMuX2FkZENsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKGUpe3RoaXMuX3JlbW92ZUNsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1ob3ZlciIpfX0pfSxfZm9jdXNhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNhYmxlPXRoaXMuZm9jdXNhYmxlLmFkZChlKSx0aGlzLl9vbihlLHtmb2N1c2luOmZ1bmN0aW9uKGUpe3RoaXMuX2FkZENsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpfSxmb2N1c291dDpmdW5jdGlvbihlKXt0aGlzLl9yZW1vdmVDbGFzcyh0KGUuY3VycmVudFRhcmdldCksbnVsbCwidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLG8scz10aGlzLm9wdGlvbnNbZV07aWYoaT1pfHx7fSwobj10LkV2ZW50KG4pKS50eXBlPShlPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9lOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrZSkudG9Mb3dlckNhc2UoKSxuLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sbz1uLm9yaWdpbmFsRXZlbnQpZm9yKHIgaW4gbylyIGluIG58fChuW3JdPW9bcl0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihuLGkpLCEodC5pc0Z1bmN0aW9uKHMpJiYhMT09PXMuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtuXS5jb25jYXQoaSkpfHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19LHQuZWFjaCh7c2hvdzoiZmFkZUluIixoaWRlOiJmYWRlT3V0In0sZnVuY3Rpb24oZSxuKXt0LldpZGdldC5wcm90b3R5cGVbIl8iK2VdPWZ1bmN0aW9uKGkscixvKXt2YXIgczsic3RyaW5nIj09dHlwZW9mIHImJihyPXtlZmZlY3Q6cn0pO3ZhciBhPXI/ITA9PT1yfHwibnVtYmVyIj09dHlwZW9mIHI/bjpyLmVmZmVjdHx8bjplOyJudW1iZXIiPT10eXBlb2Yocj1yfHx7fSkmJihyPXtkdXJhdGlvbjpyfSkscz0hdC5pc0VtcHR5T2JqZWN0KHIpLHIuY29tcGxldGU9byxyLmRlbGF5JiZpLmRlbGF5KHIuZGVsYXkpLHMmJnQuZWZmZWN0cyYmdC5lZmZlY3RzLmVmZmVjdFthXT9pW2VdKHIpOmEhPT1lJiZpW2FdP2lbYV0oci5kdXJhdGlvbixyLmVhc2luZyxvKTppLnF1ZXVlKGZ1bmN0aW9uKG4pe3QodGhpcylbZV0oKSxvJiZvLmNhbGwoaVswXSksbigpfSl9fSksdC53aWRnZXR9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoKG49KHQ9ZT90LnRvRXhwb25lbnRpYWwoZS0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBuLGk9dC5zbGljZSgwLG4pO3JldHVybltpLmxlbmd0aD4xP2lbMF0raS5zbGljZSgyKTppLCt0LnNsaWNlKG4rMSldfSxyPWZ1bmN0aW9uKHQpe3JldHVybih0PWkoTWF0aC5hYnModCkpKT90WzFdOk5hTn0sbz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBzKHQpe3JldHVybiBuZXcgYSh0KX1mdW5jdGlvbiBhKHQpe2lmKCEoZT1vLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGU7dGhpcy5maWxsPWVbMV18fCIgIix0aGlzLmFsaWduPWVbMl18fCI+Iix0aGlzLnNpZ249ZVszXXx8Ii0iLHRoaXMuc3ltYm9sPWVbNF18fCIiLHRoaXMuemVybz0hIWVbNV0sdGhpcy53aWR0aD1lWzZdJiYrZVs2XSx0aGlzLmNvbW1hPSEhZVs3XSx0aGlzLnByZWNpc2lvbj1lWzhdJiYrZVs4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFlWzldLHRoaXMudHlwZT1lWzEwXXx8IiJ9cy5wcm90b3R5cGU9YS5wcm90b3R5cGUsYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTt2YXIgdSxjLGgsbCxkPWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBlLG49dC5sZW5ndGgsaT0xLHI9LTE7aTxuOysraSlzd2l0Y2godFtpXSl7Y2FzZSIuIjpyPWU9aTticmVhaztjYXNlIjAiOjA9PT1yJiYocj1pKSxlPWk7YnJlYWs7ZGVmYXVsdDppZihyPjApe2lmKCErdFtpXSlicmVhayB0O3I9MH19cmV0dXJuIHI+MD90LnNsaWNlKDAscikrdC5zbGljZShlKzEpOnR9LGY9ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIHI9blswXSxvPW5bMV07cmV0dXJuIG88MD8iMC4iK25ldyBBcnJheSgtbykuam9pbigiMCIpK3I6ci5sZW5ndGg+bysxP3Iuc2xpY2UoMCxvKzEpKyIuIityLnNsaWNlKG8rMSk6cituZXcgQXJyYXkoby1yLmxlbmd0aCsyKS5qb2luKCIwIil9LHA9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxMCl9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKGUpfSxmOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYoMTAwKnQsZSl9LHI6ZixzOmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciByPW5bMF0sbz1uWzFdLHM9by0odT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihvLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gcz09PWE/cjpzPmE/cituZXcgQXJyYXkocy1hKzEpLmpvaW4oIjAiKTpzPjA/ci5zbGljZSgwLHMpKyIuIityLnNsaWNlKHMpOiIwLiIrbmV3IEFycmF5KDEtcykuam9pbigiMCIpK2kodCxNYXRoLm1heCgwLGUrcy0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sbT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0sdj1mdW5jdGlvbih0KXt2YXIgZSxuLGk9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KGU9dC5ncm91cGluZyxuPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQsaSl7Zm9yKHZhciByPXQubGVuZ3RoLG89W10scz0wLGE9ZVswXSx1PTA7cj4wJiZhPjAmJih1K2ErMT5pJiYoYT1NYXRoLm1heCgxLGktdSkpLG8ucHVzaCh0LnN1YnN0cmluZyhyLT1hLHIrYSkpLCEoKHUrPWErMSk+aSkpOylhPWVbcz0ocysxKSVlLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4obil9KTptLG89dC5jdXJyZW5jeSxhPXQuZGVjaW1hbCxjPXQubnVtZXJhbHM/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24oZSl7cmV0dXJuIHRbK2VdfSl9fSh0Lm51bWVyYWxzKTptLGg9dC5wZXJjZW50fHwiJSI7ZnVuY3Rpb24gbCh0KXt2YXIgZT0odD1zKHQpKS5maWxsLG49dC5hbGlnbixyPXQuc2lnbixsPXQuc3ltYm9sLGY9dC56ZXJvLG09dC53aWR0aCx2PXQuY29tbWEsYj10LnByZWNpc2lvbix5PXQudHJpbSxfPXQudHlwZTsibiI9PT1fPyh2PSEwLF89ImciKTpwW19dfHwobnVsbD09YiYmKGI9MTIpLHk9ITAsXz0iZyIpLChmfHwiMCI9PT1lJiYiPSI9PT1uKSYmKGY9ITAsZT0iMCIsbj0iPSIpO3ZhciB3PSIkIj09PWw/b1swXToiIyI9PT1sJiYvW2JveFhdLy50ZXN0KF8pPyIwIitfLnRvTG93ZXJDYXNlKCk6IiIseD0iJCI9PT1sP29bMV06L1slcF0vLnRlc3QoXyk/aDoiIixNPXBbX10sUz0vW2RlZmdwcnMlXS8udGVzdChfKTtmdW5jdGlvbiBFKHQpe3ZhciBvLHMsaCxsPXcscD14O2lmKCJjIj09PV8pcD1NKHQpK3AsdD0iIjtlbHNle3ZhciBFPSh0PSt0KTwwO2lmKHQ9TShNYXRoLmFicyh0KSxiKSx5JiYodD1kKHQpKSxFJiYwPT0rdCYmKEU9ITEpLGw9KEU/IigiPT09cj9yOiItIjoiLSI9PT1yfHwiKCI9PT1yPyIiOnIpK2wscD0oInMiPT09Xz9nWzgrdS8zXToiIikrcCsoRSYmIigiPT09cj8iKSI6IiIpLFMpZm9yKG89LTEscz10Lmxlbmd0aDsrK288czspaWYoNDg+KGg9dC5jaGFyQ29kZUF0KG8pKXx8aD41Nyl7cD0oNDY9PT1oP2ErdC5zbGljZShvKzEpOnQuc2xpY2UobykpK3AsdD10LnNsaWNlKDAsbyk7YnJlYWt9fXYmJiFmJiYodD1pKHQsMS8wKSk7dmFyIEE9bC5sZW5ndGgrdC5sZW5ndGgrcC5sZW5ndGgsQz1BPG0/bmV3IEFycmF5KG0tQSsxKS5qb2luKGUpOiIiO3N3aXRjaCh2JiZmJiYodD1pKEMrdCxDLmxlbmd0aD9tLXAubGVuZ3RoOjEvMCksQz0iIiksbil7Y2FzZSI8Ijp0PWwrdCtwK0M7YnJlYWs7Y2FzZSI9Ijp0PWwrQyt0K3A7YnJlYWs7Y2FzZSJeIjp0PUMuc2xpY2UoMCxBPUMubGVuZ3RoPj4xKStsK3QrcCtDLnNsaWNlKEEpO2JyZWFrO2RlZmF1bHQ6dD1DK2wrdCtwfXJldHVybiBjKHQpfXJldHVybiBiPW51bGw9PWI/NjovW2dwcnNdLy50ZXN0KF8pP01hdGgubWF4KDEsTWF0aC5taW4oMjEsYikpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsYikpLEUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sRX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsZSl7dmFyIG49bCgoKHQ9cyh0KSkudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IocihlKS8zKSkpLG89TWF0aC5wb3coMTAsLWkpLGE9Z1s4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKG8qdCkrYX19fX07ZnVuY3Rpb24gYih0KXtyZXR1cm4gYz12KHQpLGg9Yy5mb3JtYXQsbD1jLmZvcm1hdFByZWZpeCxjfWIoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7dmFyIHk9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsLXIoTWF0aC5hYnModCkpKX0sXz1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHIoZSkvMykpKS1yKE1hdGguYWJzKHQpKSl9LHc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxlPU1hdGguYWJzKGUpLXQsTWF0aC5tYXgoMCxyKGUpLXIodCkpKzF9O24uZChlLCJmb3JtYXREZWZhdWx0TG9jYWxlIixmdW5jdGlvbigpe3JldHVybiBifSksbi5kKGUsImZvcm1hdCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLG4uZChlLCJmb3JtYXRQcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSxuLmQoZSwiZm9ybWF0TG9jYWxlIixmdW5jdGlvbigpe3JldHVybiB2fSksbi5kKGUsImZvcm1hdFNwZWNpZmllciIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJwcmVjaXNpb25GaXhlZCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLG4uZChlLCJwcmVjaXNpb25QcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIF99KSxuLmQoZSwicHJlY2lzaW9uUm91bmQiLGZ1bmN0aW9uKCl7cmV0dXJuIHd9KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Zm9yKHZhciBpPW4oOCkscj1uKDMzOCksbz1uKDM2MCkscz17fSxhPTAsdT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpKTthPHUubGVuZ3RoO2ErKyl7dmFyIGM9dVthXTsoYy5lbmRzV2l0aCgiTW9kZWwiKXx8Yy5lbmRzV2l0aCgiVmlldyIpKSYmKHNbY109aVtjXSl9Zm9yKHZhciBoPTAsbD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKTtoPGwubGVuZ3RoO2grKyl7dmFyIGQ9bFtoXTsoZC5lbmRzV2l0aCgiTW9kZWwiKXx8ZC5lbmRzV2l0aCgiVmlldyIpKSYmKHNbZF09cltkXSl9Zm9yKHZhciBmPTAscD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKTtmPHAubGVuZ3RoO2YrKyl7dmFyIG09cFtmXTsobS5lbmRzV2l0aCgiTW9kZWwiKXx8bS5lbmRzV2l0aCgiVmlldyIpKSYmKHNbbV09b1ttXSl9ZS5kZWZhdWx0PXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSxyPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKShmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHModCl7dHJ5e3UoaS5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBhKHQpe3RyeXt1KGkudGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHUodCl7dC5kb25lP3IodC52YWx1ZSk6bmV3IG4oZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pLnRoZW4ocyxhKX11KChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KX0sbz10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6YSgwKSx0aHJvdzphKDEpLHJldHVybjphKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIGEobyl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihvKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3M7KXRyeXtpZihuPTEsaSYmKHI9MiZvWzBdP2kucmV0dXJuOm9bMF0/aS50aHJvd3x8KChyPWkucmV0dXJuKSYmci5jYWxsKGkpLDApOmkubmV4dCkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVsyJm9bMF0sci52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6cj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKyssaT1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocj0ocj1zLnRyeXMpLmxlbmd0aD4wJiZyW3IubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFyfHxvWzFdPnJbMF0mJm9bMV08clszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxyWzFdKXtzLmxhYmVsPXJbMV0scj1vO2JyZWFrfWlmKHImJnMubGFiZWw8clsyXSl7cy5sYWJlbD1yWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9clsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89ZS5jYWxsKHQscyl9Y2F0Y2godCl7bz1bNix0XSxpPTB9ZmluYWxseXtuPXI9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28sYV0pfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDI1KSxhPW4oNzQpLHU9YS5QUk9UT0NPTF9WRVJTSU9OLnNwbGl0KCIuIiwxKVswXSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuY29tbV90YXJnZXRfbmFtZT0ianVweXRlci53aWRnZXQiLHRoaXMuX21vZGVscz1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiB0LnByb3RvdHlwZS5kaXNwbGF5X21vZGVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzO3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdGhpcy5jcmVhdGVfdmlldyhlLG4pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGkuZGlzcGxheV92aWV3KHQsZSxuKX0pLmNhdGNoKHMucmVqZWN0KCJDb3VsZCBub3QgY3JlYXRlIHZpZXciLCEwKSl9LHQucHJvdG90eXBlLnNldFZpZXdPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksdH0sdC5wcm90b3R5cGUuY3JlYXRlX3ZpZXc9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgaT10LnN0YXRlX2NoYW5nZT10LnN0YXRlX2NoYW5nZS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZENsYXNzKHQuZ2V0KCJfdmlld19uYW1lIiksdC5nZXQoIl92aWV3X21vZHVsZSIpLHQuZ2V0KCJfdmlld19tb2R1bGVfdmVyc2lvbiIpKS50aGVuKGZ1bmN0aW9uKGkpe3ZhciByPW5ldyBpKHttb2RlbDp0LG9wdGlvbnM6bi5zZXRWaWV3T3B0aW9ucyhlKX0pO3JldHVybiByLmxpc3RlblRvKHQsImRlc3Ryb3kiLHIucmVtb3ZlKSxQcm9taXNlLnJlc29sdmUoci5yZW5kZXIoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiByfSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGNyZWF0ZSBhIHZpZXcgZm9yIG1vZGVsIGlkICIrdC5tb2RlbF9pZCwhMCkpfSkscj1zLnV1aWQoKTtyZXR1cm4gdC52aWV3c1tyXT1pLGkudGhlbihmdW5jdGlvbih0KXt0Lm9uY2UoInJlbW92ZSIsZnVuY3Rpb24oKXtkZWxldGUgdC5tb2RlbC52aWV3c1tyXX0sbil9KSx0LnN0YXRlX2NoYW5nZX0sdC5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3JldHVybnt9fSx0LnByb3RvdHlwZS5nZXRfbW9kZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21vZGVsc1t0XX0sdC5wcm90b3R5cGUuaGFuZGxlX2NvbW1fb3Blbj1mdW5jdGlvbih0LGUpe3ZhciBuPShlLm1ldGFkYXRhfHx7fSkudmVyc2lvbnx8IiI7aWYobi5zcGxpdCgiLiIsMSlbMF0hPT11KXt2YXIgaT0iV3Jvbmcgd2lkZ2V0IHByb3RvY29sIHZlcnNpb246IHJlY2VpdmVkIHByb3RvY29sIHZlcnNpb24gJyIrbisiJywgYnV0IHdhcyBleHBlY3RpbmcgbWFqb3IgdmVyc2lvbiAnIit1KyInIjtyZXR1cm4gY29uc29sZS5lcnJvcihpKSxQcm9taXNlLnJlamVjdChpKX12YXIgcj1lLmNvbnRlbnQuZGF0YSxvPXIuYnVmZmVyX3BhdGhzfHxbXSxhPShlLmJ1ZmZlcnN8fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRhVmlldz90Om5ldyBEYXRhVmlldyh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/dDp0LmJ1ZmZlcil9KTtyZXR1cm4gcy5wdXRfYnVmZmVycyhyLnN0YXRlLG8sYSksdGhpcy5uZXdfbW9kZWwoe21vZGVsX25hbWU6ci5zdGF0ZS5fbW9kZWxfbmFtZSxtb2RlbF9tb2R1bGU6ci5zdGF0ZS5fbW9kZWxfbW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOnIuc3RhdGUuX21vZGVsX21vZHVsZV92ZXJzaW9uLGNvbW06dH0sci5zdGF0ZSkuY2F0Y2gocy5yZWplY3QoIkNvdWxkIG5vdCBjcmVhdGUgYSBtb2RlbC4iLCEwKSl9LHQucHJvdG90eXBlLm5ld193aWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXM7aWYodm9pZCAwPT09ZSYmKGU9e30pLHZvaWQgMD09PXQudmlld19uYW1lfHx2b2lkIDA9PT10LnZpZXdfbW9kdWxlfHx2b2lkIDA9PT10LnZpZXdfbW9kdWxlX3ZlcnNpb24pcmV0dXJuIFByb21pc2UucmVqZWN0KCJuZXdfd2lkZ2V0KC4uLikgbXVzdCBiZSBnaXZlbiB2aWV3IGluZm9ybWF0aW9uIGluIHRoZSBvcHRpb25zLiIpO249dC5jb21tP1Byb21pc2UucmVzb2x2ZSh0LmNvbW0pOnRoaXMuX2NyZWF0ZV9jb21tKHRoaXMuY29tbV90YXJnZXRfbmFtZSx0Lm1vZGVsX2lkLHtzdGF0ZTp7X21vZGVsX21vZHVsZTp0Lm1vZGVsX21vZHVsZSxfbW9kZWxfbW9kdWxlX3ZlcnNpb246dC5tb2RlbF9tb2R1bGVfdmVyc2lvbixfbW9kZWxfbmFtZTp0Lm1vZGVsX25hbWUsX3ZpZXdfbW9kdWxlOnQudmlld19tb2R1bGUsX3ZpZXdfbW9kdWxlX3ZlcnNpb246dC52aWV3X21vZHVsZV92ZXJzaW9uLF92aWV3X25hbWU6dC52aWV3X25hbWV9fSx7dmVyc2lvbjphLlBST1RPQ09MX1ZFUlNJT059KTt2YXIgbz1pKHt9LHQpO3JldHVybiBuLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIG8uY29tbT10LHIubmV3X21vZGVsKG8sZSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5zeW5jKCJjcmVhdGUiLHQpLHR9KX0sZnVuY3Rpb24oKXtyZXR1cm4gby5tb2RlbF9pZHx8KG8ubW9kZWxfaWQ9cy51dWlkKCkpLHIubmV3X21vZGVsKG8sZSl9KX0sdC5wcm90b3R5cGUucmVnaXN0ZXJfbW9kZWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuX21vZGVsc1t0XT1lLGUudGhlbihmdW5jdGlvbihlKXtlLm9uY2UoImNvbW06Y2xvc2UiLGZ1bmN0aW9uKCl7ZGVsZXRlIG4uX21vZGVsc1t0XX0pfSl9LHQucHJvdG90eXBlLm5ld19tb2RlbD1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSkscih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixpO3JldHVybiBvKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDppZih0Lm1vZGVsX2lkKW49dC5tb2RlbF9pZDtlbHNle2lmKCF0LmNvbW0pdGhyb3cgbmV3IEVycm9yKCJOZWl0aGVyIGNvbW0gbm9yIG1vZGVsX2lkIHByb3ZpZGVkIGluIG9wdGlvbnMgb2JqZWN0LiBBdCBsZWFzdCBvbmUgbXVzdCBleGlzdC4iKTtuPXQubW9kZWxfaWQ9dC5jb21tLmNvbW1faWR9cmV0dXJuIGk9dGhpcy5fbWFrZV9tb2RlbCh0LGUpLHRoaXMucmVnaXN0ZXJfbW9kZWwobixpKSxbNCxpXTtjYXNlIDE6cmV0dXJuWzIsci5zZW50KCldfX0pfSl9LHQucHJvdG90eXBlLl9tYWtlX21vZGVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLGkscixzLGEsdSxjO3JldHVybiBvKHRoaXMsZnVuY3Rpb24obyl7c3dpdGNoKG8ubGFiZWwpe2Nhc2UgMDpuPXQubW9kZWxfaWQsaT10aGlzLmxvYWRDbGFzcyh0Lm1vZGVsX25hbWUsdC5tb2RlbF9tb2R1bGUsdC5tb2RlbF9tb2R1bGVfdmVyc2lvbiksby5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gby50cnlzLnB1c2goWzEsMywsNF0pLFs0LGldO2Nhc2UgMjpyZXR1cm4gcj1vLnNlbnQoKSxbMyw0XTtjYXNlIDM6dGhyb3cgcz1vLnNlbnQoKSxjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgd2lkZ2V0IikscztjYXNlIDQ6aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2RlbCBtb2R1bGUgIit0Lm1vZGVsX21vZHVsZSsiQCIrdC5tb2RlbF9tb2R1bGVfdmVyc2lvbisiLCAiK3QubW9kZWxfbmFtZSk7cmV0dXJuWzQsci5fZGVzZXJpYWxpemVfc3RhdGUoZSx0aGlzKV07Y2FzZSA1OnJldHVybiBhPW8uc2VudCgpLHU9e3dpZGdldF9tYW5hZ2VyOnRoaXMsbW9kZWxfaWQ6bixjb21tOnQuY29tbX0sKGM9bmV3IHIoYSx1KSkubmFtZT10Lm1vZGVsX25hbWUsYy5tb2R1bGU9dC5tb2RlbF9tb2R1bGUsWzIsY119fSl9KX0sdC5wcm90b3R5cGUuY2xlYXJfc3RhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBzLnJlc29sdmVQcm9taXNlc0RpY3QodGhpcy5fbW9kZWxzKS50aGVuKGZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0uY2xvc2UoKX0pLHQuX21vZGVscz17fX0pfSx0LnByb3RvdHlwZS5nZXRfc3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxzLnJlc29sdmVQcm9taXNlc0RpY3QodGhpcy5fbW9kZWxzKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByPWVbaV0sbz1zLnJlbW92ZV9idWZmZXJzKHIuc2VyaWFsaXplKHIuZ2V0X3N0YXRlKHQuZHJvcF9kZWZhdWx0cykpKSxhPW8uYnVmZmVycy5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm57ZGF0YTpzLmJ1ZmZlclRvQmFzZTY0KHQpLHBhdGg6by5idWZmZXJfcGF0aHNbZV0sZW5jb2Rpbmc6ImJhc2U2NCJ9fSk7bltpXT17bW9kZWxfbmFtZTpyLm5hbWUsbW9kZWxfbW9kdWxlOnIubW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOnIuZ2V0KCJfbW9kZWxfbW9kdWxlX3ZlcnNpb24iKSxzdGF0ZTpvLnN0YXRlfSxhLmxlbmd0aD4wJiYobltpXS5idWZmZXJzPWEpfSkse3ZlcnNpb25fbWFqb3I6Mix2ZXJzaW9uX21pbm9yOjAsc3RhdGU6bn19KX0sdC5wcm90b3R5cGUuc2V0X3N0YXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoISh0LnZlcnNpb25fbWFqb3ImJnQudmVyc2lvbl9tYWpvcjw9MikpdGhyb3ciVW5zdXBwb3J0ZWQgd2lkZ2V0IHN0YXRlIGZvcm1hdCI7dmFyIG49dC5zdGF0ZTtyZXR1cm4gdGhpcy5fZ2V0X2NvbW1faW5mbygpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbihpKXt2YXIgcj17YmFzZTY0OnMuYmFzZTY0VG9CdWZmZXIsaGV4OnMuaGV4VG9CdWZmZXJ9LG89bltpXSxhPW8uc3RhdGU7aWYoby5idWZmZXJzKXt2YXIgdT1vLmJ1ZmZlcnMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBhdGh9KSxjPW8uYnVmZmVycy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRhVmlldyhyW3QuZW5jb2RpbmddKHQuZGF0YSkpfSk7cy5wdXRfYnVmZmVycyhvLnN0YXRlLHUsYyl9aWYoZS5fbW9kZWxzW2ldKXJldHVybiBlLl9tb2RlbHNbaV0udGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5fZGVzZXJpYWxpemVfc3RhdGUoYXx8e30sZSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRfc3RhdGUoZSksdH0pfSk7dmFyIGg9e21vZGVsX2lkOmksbW9kZWxfbmFtZTpvLm1vZGVsX25hbWUsbW9kZWxfbW9kdWxlOm8ubW9kZWxfbW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOm8ubW9kZWxfbW9kdWxlX3ZlcnNpb259O3JldHVybiB0Lmhhc093blByb3BlcnR5KGkpP2UuX2NyZWF0ZV9jb21tKGUuY29tbV90YXJnZXRfbmFtZSxpKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBoLmNvbW09dCxlLm5ld19tb2RlbChoKX0pOmUubmV3X21vZGVsKGgsYSl9KSl9KX0sdC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5fbW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX21vZGVsc1tlXS50aGVuKGZ1bmN0aW9uKHQpe3QuY29tbV9saXZlPSExfSl9KX0sdC5wcm90b3R5cGUucmVzb2x2ZVVybD1mdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfSx0fSgpO2UuTWFuYWdlckJhc2U9Y30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIG4odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gaSh0LHIpe2lmKHQ9PT1yKXJldHVybiEwO2lmKGUodCl8fGUocikpcmV0dXJuITE7dmFyIG89bih0KSxzPW4ocik7cmV0dXJuIG89PT1zJiYobyYmcz9mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiEwO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7KytuKWlmKCFpKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9KHQscik6ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4hMDtmb3IodmFyIG4gaW4gdClpZighKG4gaW4gZSkpcmV0dXJuITE7Zm9yKHZhciBuIGluIGUpaWYoIShuIGluIHQpKXJldHVybiExO2Zvcih2YXIgbiBpbiB0KWlmKCFpKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9KHQscikpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIGUodCk/dDpuKHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT1yKHRbbl0pO3JldHVybiBlfSh0KTpmdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdCllW25dPXIodFtuXSk7cmV0dXJuIGV9KHQpfXQuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZSh7fSksdC5lbXB0eUFycmF5PU9iamVjdC5mcmVlemUoW10pLHQuaXNQcmltaXRpdmU9ZSx0LmlzQXJyYXk9bix0LmlzT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiFlKHQpJiYhbih0KX0sdC5kZWVwRXF1YWw9aSx0LmRlZXBDb3B5PXJ9KGUuSlNPTkV4dHx8KGUuSlNPTkV4dD17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl90eXBlcz1bXSx0aGlzLl92YWx1ZXM9W119cmV0dXJuIHQucHJvdG90eXBlLnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGVzLnNsaWNlKCl9LHQucHJvdG90eXBlLmhhc0RhdGE9ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT10aGlzLl90eXBlcy5pbmRleE9mKHQpfSx0LnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3R5cGVzLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lP3RoaXMuX3ZhbHVlc1tlXTp2b2lkIDB9LHQucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCxlKXt0aGlzLmNsZWFyRGF0YSh0KSx0aGlzLl90eXBlcy5wdXNoKHQpLHRoaXMuX3ZhbHVlcy5wdXNoKGUpfSx0LnByb3RvdHlwZS5jbGVhckRhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHlwZXMuaW5kZXhPZih0KTstMSE9PWUmJih0aGlzLl90eXBlcy5zcGxpY2UoZSwxKSx0aGlzLl92YWx1ZXMuc3BsaWNlKGUsMSkpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX3R5cGVzLmxlbmd0aD0wLHRoaXMuX3ZhbHVlcy5sZW5ndGg9MH0sdH0oKTtlLk1pbWVEYXRhPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7dC5fcmVzb2x2ZT1lLHQuX3JlamVjdD1ufSl9cmV0dXJuIHQucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24odCl7KDAsdGhpcy5fcmVzb2x2ZSkodCl9LHQucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXsoMCx0aGlzLl9yZWplY3QpKHQpfSx0fSgpO2UuUHJvbWlzZURlbGVnYXRlPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5yYW5kb21CeXRlcz1lLnJuZz1lLnBzZXVkb1JhbmRvbUJ5dGVzPWUucHJuZz1uKDI3KSxlLmNyZWF0ZUhhc2g9ZS5IYXNoPW4oMzEpLGUuY3JlYXRlSG1hYz1lLkhtYWM9big5MSk7dmFyIGk9bigxNjIpLHI9T2JqZWN0LmtleXMoaSksbz1bInNoYTEiLCJzaGEyMjQiLCJzaGEyNTYiLCJzaGEzODQiLCJzaGE1MTIiLCJtZDUiLCJybWQxNjAiXS5jb25jYXQocik7ZS5nZXRIYXNoZXM9ZnVuY3Rpb24oKXtyZXR1cm4gb307dmFyIHM9big5NCk7ZS5wYmtkZjI9cy5wYmtkZjIsZS5wYmtkZjJTeW5jPXMucGJrZGYyU3luYzt2YXIgYT1uKDE2NCk7ZS5DaXBoZXI9YS5DaXBoZXIsZS5jcmVhdGVDaXBoZXI9YS5jcmVhdGVDaXBoZXIsZS5DaXBoZXJpdj1hLkNpcGhlcml2LGUuY3JlYXRlQ2lwaGVyaXY9YS5jcmVhdGVDaXBoZXJpdixlLkRlY2lwaGVyPWEuRGVjaXBoZXIsZS5jcmVhdGVEZWNpcGhlcj1hLmNyZWF0ZURlY2lwaGVyLGUuRGVjaXBoZXJpdj1hLkRlY2lwaGVyaXYsZS5jcmVhdGVEZWNpcGhlcml2PWEuY3JlYXRlRGVjaXBoZXJpdixlLmdldENpcGhlcnM9YS5nZXRDaXBoZXJzLGUubGlzdENpcGhlcnM9YS5saXN0Q2lwaGVyczt2YXIgdT1uKDE4MSk7ZS5EaWZmaWVIZWxsbWFuR3JvdXA9dS5EaWZmaWVIZWxsbWFuR3JvdXAsZS5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXA9dS5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXAsZS5nZXREaWZmaWVIZWxsbWFuPXUuZ2V0RGlmZmllSGVsbG1hbixlLmNyZWF0ZURpZmZpZUhlbGxtYW49dS5jcmVhdGVEaWZmaWVIZWxsbWFuLGUuRGlmZmllSGVsbG1hbj11LkRpZmZpZUhlbGxtYW47dmFyIGM9bigxODYpO2UuY3JlYXRlU2lnbj1jLmNyZWF0ZVNpZ24sZS5TaWduPWMuU2lnbixlLmNyZWF0ZVZlcmlmeT1jLmNyZWF0ZVZlcmlmeSxlLlZlcmlmeT1jLlZlcmlmeSxlLmNyZWF0ZUVDREg9bigyMjQpO3ZhciBoPW4oMjI1KTtlLnB1YmxpY0VuY3J5cHQ9aC5wdWJsaWNFbmNyeXB0LGUucHJpdmF0ZUVuY3J5cHQ9aC5wcml2YXRlRW5jcnlwdCxlLnB1YmxpY0RlY3J5cHQ9aC5wdWJsaWNEZWNyeXB0LGUucHJpdmF0ZURlY3J5cHQ9aC5wcml2YXRlRGVjcnlwdDt2YXIgbD1uKDIyOCk7ZS5yYW5kb21GaWxsPWwucmFuZG9tRmlsbCxlLnJhbmRvbUZpbGxTeW5jPWwucmFuZG9tRmlsbFN5bmMsZS5jcmVhdGVDcmVkZW50aWFscz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihbInNvcnJ5LCBjcmVhdGVDcmVkZW50aWFscyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iiwid2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMiLCJodHRwczovL2dpdGh1Yi5jb20vY3J5cHRvLWJyb3dzZXJpZnkvY3J5cHRvLWJyb3dzZXJpZnkiXS5qb2luKCJcbiIpKX0sZS5jb25zdGFudHM9e0RIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUU6MixESF9DSEVDS19QX05PVF9QUklNRToxLERIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1I6NCxESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SOjgsTlBOX0VOQUJMRUQ6MSxBTFBOX0VOQUJMRUQ6MSxSU0FfUEtDUzFfUEFERElORzoxLFJTQV9TU0xWMjNfUEFERElORzoyLFJTQV9OT19QQURESU5HOjMsUlNBX1BLQ1MxX09BRVBfUEFERElORzo0LFJTQV9YOTMxX1BBRERJTkc6NSxSU0FfUEtDUzFfUFNTX1BBRERJTkc6NixQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQ6MixQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDo0LFBPSU5UX0NPTlZFUlNJT05fSFlCUklEOjZ9fSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvLHMsYT04KnItaS0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1uP3ItMTowLGQ9bj8tMToxLGY9dFtlK2xdO2ZvcihsKz1kLG89ZiYoMTw8LWgpLTEsZj4+PS1oLGgrPWE7aD4wO289MjU2Km8rdFtlK2xdLGwrPWQsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPWk7aD4wO3M9MjU2KnMrdFtlK2xdLGwrPWQsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsaSksby09Y31yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1pKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIHMsYSx1LGM9OCpvLXItMSxoPSgxPDxjKS0xLGw9aD4+MSxkPTIzPT09cj9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1pPzA6by0xLHA9aT8xOi0xLG09ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrbD49MT9kL3U6ZCpNYXRoLnBvdygyLDEtbCkpKnU+PTImJihzKyssdS89MikscytsPj1oPyhhPTAscz1oKTpzK2w+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLHIpLHMrPWwpOihhPWUqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIscikscz0wKSk7cj49ODt0W24rZl09MjU1JmEsZis9cCxhLz0yNTYsci09OCk7Zm9yKHM9czw8cnxhLGMrPXI7Yz4wO3RbbitmXT0yNTUmcyxmKz1wLHMvPTI1NixjLT04KTt0W24rZi1wXXw9MTI4Km19fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEpLkJ1ZmZlcixyPW4oMTQ5KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxuPSIiK2UuZGF0YTtlPWUubmV4dDspbis9dCtlLmRhdGE7cmV0dXJuIG59LHQucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGkuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGUsbixyLG89aS5hbGxvY1Vuc2FmZSh0Pj4+MCkscz10aGlzLmhlYWQsYT0wO3M7KWU9cy5kYXRhLG49byxyPWEsZS5jb3B5KG4sciksYSs9cy5kYXRhLmxlbmd0aCxzPXMubmV4dDtyZXR1cm4gb30sdH0oKSxyJiZyLmluc3BlY3QmJnIuaW5zcGVjdC5jdXN0b20mJih0LmV4cG9ydHMucHJvdG90eXBlW3IuaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIHQ9ci5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIit0fSl9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsbil7InVzZSBzdHJpY3QiO2lmKCF0LnNldEltbWVkaWF0ZSl7dmFyIGkscixvLHMsYSx1PTEsYz17fSxoPSExLGw9dC5kb2N1bWVudCxkPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Q9ZCYmZC5zZXRUaW1lb3V0P2Q6dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/aT1mdW5jdGlvbih0KXtlLm5leHRUaWNrKGZ1bmN0aW9uKCl7cCh0KX0pfTohZnVuY3Rpb24oKXtpZih0LnBvc3RNZXNzYWdlJiYhdC5pbXBvcnRTY3JpcHRzKXt2YXIgZT0hMCxuPXQub25tZXNzYWdlO3JldHVybiB0Lm9ubWVzc2FnZT1mdW5jdGlvbigpe2U9ITF9LHQucG9zdE1lc3NhZ2UoIiIsIioiKSx0Lm9ubWVzc2FnZT1uLGV9fSgpP3QuTWVzc2FnZUNoYW5uZWw/KChvPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe3AodC5kYXRhKX0saT1mdW5jdGlvbih0KXtvLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6bCYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBsLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyhyPWwuZG9jdW1lbnRFbGVtZW50LGk9ZnVuY3Rpb24odCl7dmFyIGU9bC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3AodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxyLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0sci5hcHBlbmRDaGlsZChlKX0pOmk9ZnVuY3Rpb24odCl7c2V0VGltZW91dChwLDAsdCl9OihzPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixhPWZ1bmN0aW9uKGUpe2Uuc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT1lLmRhdGEuaW5kZXhPZihzKSYmcCgrZS5kYXRhLnNsaWNlKHMubGVuZ3RoKSl9LHQuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGEsITEpOnQuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsYSksaT1mdW5jdGlvbihlKXt0LnBvc3RNZXNzYWdlKHMrZSwiKiIpfSksZC5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIGNbdV09cixpKHUpLHUrK30sZC5jbGVhckltbWVkaWF0ZT1mfWZ1bmN0aW9uIGYodCl7ZGVsZXRlIGNbdF19ZnVuY3Rpb24gcCh0KXtpZihoKXNldFRpbWVvdXQocCwwLHQpO2Vsc2V7dmFyIGU9Y1t0XTtpZihlKXtoPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxpPXQuYXJncztzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoaVswXSk7YnJlYWs7Y2FzZSAyOmUoaVswXSxpWzFdKTticmVhaztjYXNlIDM6ZShpWzBdLGlbMV0saVsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KG4saSl9fShlKX1maW5hbGx5e2YodCksaD0hMX19fX19KCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT10P3RoaXM6dDpzZWxmKX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXt0cnl7aWYoIWUubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXZhciBuPWUubG9jYWxTdG9yYWdlW3RdO3JldHVybiBudWxsIT1uJiYidHJ1ZSI9PT1TdHJpbmcobikudG9Mb3dlckNhc2UoKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihuKCJub0RlcHJlY2F0aW9uIikpcmV0dXJuIHQ7dmFyIGk9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWkpe2lmKG4oInRocm93RGVwcmVjYXRpb24iKSl0aHJvdyBuZXcgRXJyb3IoZSk7bigidHJhY2VEZXByZWNhdGlvbiIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLGk9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19KS5jYWxsKHRoaXMsbigxMykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1vO3ZhciBpPW4oODgpLHI9bigzMik7ZnVuY3Rpb24gbyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8odCk7aS5jYWxsKHRoaXMsdCl9ci5pbmhlcml0cz1uKDApLHIuaW5oZXJpdHMobyxpKSxvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXtuKG51bGwsdCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjEpLlRyYW5zZm9ybX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDYxKS5QYXNzVGhyb3VnaH0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDI4KSxvPW4oMSkuQnVmZmVyLHM9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxhPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxyLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdDw8MzB8dD4+PjJ9ZnVuY3Rpb24gaCh0LGUsbixpKXtyZXR1cm4gMD09PXQ/ZSZufH5lJmk6Mj09PXQ/ZSZufGUmaXxuJmk6ZV5uXml9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxpPTB8dGhpcy5fYSxyPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxhPTB8dGhpcy5fZCx1PTB8dGhpcy5fZSxsPTA7bDwxNjsrK2wpbltsXT10LnJlYWRJbnQzMkJFKDQqbCk7Zm9yKDtsPDgwOysrbCluW2xdPW5bbC0zXV5uW2wtOF1ebltsLTE0XV5uW2wtMTZdO2Zvcih2YXIgZD0wO2Q8ODA7KytkKXt2YXIgZj1+fihkLzIwKSxwPTB8KChlPWkpPDw1fGU+Pj4yNykraChmLHIsbyxhKSt1K25bZF0rc1tmXTt1PWEsYT1vLG89YyhyKSxyPWksaT1wfXRoaXMuX2E9aSt0aGlzLl9hfDAsdGhpcy5fYj1yK3RoaXMuX2J8MCx0aGlzLl9jPW8rdGhpcy5fY3wwLHRoaXMuX2Q9YSt0aGlzLl9kfDAsdGhpcy5fZT11K3RoaXMuX2V8MH0sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1vLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMjgpLG89bigxKS5CdWZmZXIscz1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLGE9bmV3IEFycmF5KDgwKTtmdW5jdGlvbiB1KCl7dGhpcy5pbml0KCksdGhpcy5fdz1hLHIuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBjKHQpe3JldHVybiB0PDw1fHQ+Pj4yN31mdW5jdGlvbiBoKHQpe3JldHVybiB0PDwzMHx0Pj4+Mn1mdW5jdGlvbiBsKHQsZSxuLGkpe3JldHVybiAwPT09dD9lJm58fmUmaToyPT09dD9lJm58ZSZpfG4maTplXm5eaX1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sdS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10aGlzLl93LGk9MHx0aGlzLl9hLHI9MHx0aGlzLl9iLG89MHx0aGlzLl9jLGE9MHx0aGlzLl9kLHU9MHx0aGlzLl9lLGQ9MDtkPDE2OysrZCluW2RdPXQucmVhZEludDMyQkUoNCpkKTtmb3IoO2Q8ODA7KytkKW5bZF09KGU9bltkLTNdXm5bZC04XV5uW2QtMTRdXm5bZC0xNl0pPDwxfGU+Pj4zMTtmb3IodmFyIGY9MDtmPDgwOysrZil7dmFyIHA9fn4oZi8yMCksbT1jKGkpK2wocCxyLG8sYSkrdStuW2ZdK3NbcF18MDt1PWEsYT1vLG89aChyKSxyPWksaT1tfXRoaXMuX2E9aSt0aGlzLl9hfDAsdGhpcy5fYj1yK3RoaXMuX2J8MCx0aGlzLl9jPW8rdGhpcy5fY3wwLHRoaXMuX2Q9YSt0aGlzLl9kfDAsdGhpcy5fZT11K3RoaXMuX2V8MH0sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1vLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oODkpLG89bigyOCkscz1uKDEpLkJ1ZmZlcixhPW5ldyBBcnJheSg2NCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxvLmNhbGwodGhpcyw2NCw1Nil9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0zMjM4MzcxMDMyLHRoaXMuX2I9OTE0MTUwNjYzLHRoaXMuX2M9ODEyNzAyOTk5LHRoaXMuX2Q9NDE0NDkxMjY5Nyx0aGlzLl9lPTQyOTA3NzU4NTcsdGhpcy5fZj0xNzUwNjAzMDI1LHRoaXMuX2c9MTY5NDA3NjgzOSx0aGlzLl9oPTMyMDQwNzU0MjgsdGhpc30sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1zLmFsbG9jVW5zYWZlKDI4KTtyZXR1cm4gdC53cml0ZUludDMyQkUodGhpcy5fYSwwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9iLDQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUodGhpcy5fZCwxMiksdC53cml0ZUludDMyQkUodGhpcy5fZSwxNiksdC53cml0ZUludDMyQkUodGhpcy5fZiwyMCksdC53cml0ZUludDMyQkUodGhpcy5fZywyNCksdH0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big5MCksbz1uKDI4KSxzPW4oMSkuQnVmZmVyLGE9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxvLmNhbGwodGhpcywxMjgsMTEyKX1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0zNDE4MDcwMzY1LHRoaXMuX2JoPTE2NTQyNzAyNTAsdGhpcy5fY2g9MjQzODUyOTM3MCx0aGlzLl9kaD0zNTU0NjIzNjAsdGhpcy5fZWg9MTczMTQwNTQxNSx0aGlzLl9maD0yMzk0MTgwMjMxLHRoaXMuX2doPTM2NzUwMDg1MjUsdGhpcy5faGg9MTIwMzA2MjgxMyx0aGlzLl9hbD0zMjM4MzcxMDMyLHRoaXMuX2JsPTkxNDE1MDY2Myx0aGlzLl9jbD04MTI3MDI5OTksdGhpcy5fZGw9NDE0NDkxMjY5Nyx0aGlzLl9lbD00MjkwNzc1ODU3LHRoaXMuX2ZsPTE3NTA2MDMwMjUsdGhpcy5fZ2w9MTY5NDA3NjgzOSx0aGlzLl9obD0zMjA0MDc1NDI4LHRoaXN9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9cy5hbGxvY1Vuc2FmZSg0OCk7ZnVuY3Rpb24gZShlLG4saSl7dC53cml0ZUludDMyQkUoZSxpKSx0LndyaXRlSW50MzJCRShuLGkrNCl9cmV0dXJuIGUodGhpcy5fYWgsdGhpcy5fYWwsMCksZSh0aGlzLl9iaCx0aGlzLl9ibCw4KSxlKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSxlKHRoaXMuX2RoLHRoaXMuX2RsLDI0KSxlKHRoaXMuX2VoLHRoaXMuX2VsLDMyKSxlKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSx0fSx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDApLHI9bigxKS5CdWZmZXIsbz1uKDIxKSxzPXIuYWxsb2MoMTI4KSxhPTY0O2Z1bmN0aW9uIHUodCxlKXtvLmNhbGwodGhpcywiZGlnZXN0IiksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1yLmZyb20oZSkpLHRoaXMuX2FsZz10LHRoaXMuX2tleT1lLGUubGVuZ3RoPmE/ZT10KGUpOmUubGVuZ3RoPGEmJihlPXIuY29uY2F0KFtlLHNdLGEpKTtmb3IodmFyIG49dGhpcy5faXBhZD1yLmFsbG9jVW5zYWZlKGEpLGk9dGhpcy5fb3BhZD1yLmFsbG9jVW5zYWZlKGEpLHU9MDt1PGE7dSsrKW5bdV09NTReZVt1XSxpW3VdPTkyXmVbdV07dGhpcy5faGFzaD1bbl19aSh1LG8pLHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5faGFzaC5wdXNoKHQpfSx1LnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9hbGcoci5jb25jYXQodGhpcy5faGFzaCkpO3JldHVybiB0aGlzLl9hbGcoci5jb25jYXQoW3RoaXMuX29wYWQsdF0pKX0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big5Myl9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSxpKXt2YXIgcixvPW4oOTUpLHM9big5NiksYT1uKDk3KSx1PW4oMSkuQnVmZmVyLGM9ZS5jcnlwdG8mJmUuY3J5cHRvLnN1YnRsZSxoPXtzaGE6IlNIQS0xIiwic2hhLTEiOiJTSEEtMSIsc2hhMToiU0hBLTEiLHNoYTI1NjoiU0hBLTI1NiIsInNoYS0yNTYiOiJTSEEtMjU2IixzaGEzODQ6IlNIQS0zODQiLCJzaGEtMzg0IjoiU0hBLTM4NCIsInNoYS01MTIiOiJTSEEtNTEyIixzaGE1MTI6IlNIQS01MTIifSxsPVtdO2Z1bmN0aW9uIGQodCxlLG4saSxyKXtyZXR1cm4gYy5pbXBvcnRLZXkoInJhdyIsdCx7bmFtZToiUEJLREYyIn0sITEsWyJkZXJpdmVCaXRzIl0pLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGMuZGVyaXZlQml0cyh7bmFtZToiUEJLREYyIixzYWx0OmUsaXRlcmF0aW9uczpuLGhhc2g6e25hbWU6cn19LHQsaTw8Myl9KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB1LmZyb20odCl9KX10LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGYscCxtLGcpeyJmdW5jdGlvbiI9PXR5cGVvZiBtJiYoZz1tLG09dm9pZCAwKTt2YXIgdj1oWyhtPW18fCJzaGExIikudG9Mb3dlckNhc2UoKV07aWYoIXZ8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLlByb21pc2UpcmV0dXJuIGkubmV4dFRpY2soZnVuY3Rpb24oKXt2YXIgZTt0cnl7ZT1hKHQsbixmLHAsbSl9Y2F0Y2godCl7cmV0dXJuIGcodCl9ZyhudWxsLGUpfSk7aWYobyh0LG4sZixwKSwiZnVuY3Rpb24iIT10eXBlb2YgZyl0aHJvdyBuZXcgRXJyb3IoIk5vIGNhbGxiYWNrIHByb3ZpZGVkIHRvIHBia2RmMiIpO3UuaXNCdWZmZXIodCl8fCh0PXUuZnJvbSh0LHMpKSx1LmlzQnVmZmVyKG4pfHwobj11LmZyb20obixzKSksZnVuY3Rpb24odCxlKXt0LnRoZW4oZnVuY3Rpb24odCl7aS5uZXh0VGljayhmdW5jdGlvbigpe2UobnVsbCx0KX0pfSxmdW5jdGlvbih0KXtpLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZSh0KX0pfSl9KGZ1bmN0aW9uKHQpe2lmKGUucHJvY2VzcyYmIWUucHJvY2Vzcy5icm93c2VyKXJldHVybiBQcm9taXNlLnJlc29sdmUoITEpO2lmKCFjfHwhYy5pbXBvcnRLZXl8fCFjLmRlcml2ZUJpdHMpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMSk7aWYodm9pZCAwIT09bFt0XSlyZXR1cm4gbFt0XTt2YXIgbj1kKHI9cnx8dS5hbGxvYyg4KSxyLDEwLDEyOCx0KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuITB9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiExfSk7cmV0dXJuIGxbdF09bixufSh2KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlP2QodCxuLGYscCx2KTphKHQsbixmLHAsbSl9KSxnKX19KS5jYWxsKHRoaXMsbigxMyksbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxNjUpLHI9big2Nyksbz1uKDY4KSxzPW4oMTgwKSxhPW4oNDYpO2Z1bmN0aW9uIHUodCxlLG4pe2lmKHQ9dC50b0xvd2VyQ2FzZSgpLG9bdF0pcmV0dXJuIHIuY3JlYXRlQ2lwaGVyaXYodCxlLG4pO2lmKHNbdF0pcmV0dXJuIG5ldyBpKHtrZXk6ZSxpdjpuLG1vZGU6dH0pO3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpfWZ1bmN0aW9uIGModCxlLG4pe2lmKHQ9dC50b0xvd2VyQ2FzZSgpLG9bdF0pcmV0dXJuIHIuY3JlYXRlRGVjaXBoZXJpdih0LGUsbik7aWYoc1t0XSlyZXR1cm4gbmV3IGkoe2tleTplLGl2Om4sbW9kZTp0LGRlY3J5cHQ6ITB9KTt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKX1lLmNyZWF0ZUNpcGhlcj1lLkNpcGhlcj1mdW5jdGlvbih0LGUpe3ZhciBuLGk7aWYodD10LnRvTG93ZXJDYXNlKCksb1t0XSluPW9bdF0ua2V5LGk9b1t0XS5pdjtlbHNle2lmKCFzW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpO249OCpzW3RdLmtleSxpPXNbdF0uaXZ9dmFyIHI9YShlLCExLG4saSk7cmV0dXJuIHUodCxyLmtleSxyLml2KX0sZS5jcmVhdGVDaXBoZXJpdj1lLkNpcGhlcml2PXUsZS5jcmVhdGVEZWNpcGhlcj1lLkRlY2lwaGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG4saTtpZih0PXQudG9Mb3dlckNhc2UoKSxvW3RdKW49b1t0XS5rZXksaT1vW3RdLml2O2Vsc2V7aWYoIXNbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7bj04KnNbdF0ua2V5LGk9c1t0XS5pdn12YXIgcj1hKGUsITEsbixpKTtyZXR1cm4gYyh0LHIua2V5LHIuaXYpfSxlLmNyZWF0ZURlY2lwaGVyaXY9ZS5EZWNpcGhlcml2PWMsZS5saXN0Q2lwaGVycz1lLmdldENpcGhlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMocykuY29uY2F0KHIuZ2V0Q2lwaGVycygpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIxKSxyPW4oNjYpLG89bigwKSxzPW4oMSkuQnVmZmVyLGE9eyJkZXMtZWRlMy1jYmMiOnIuQ0JDLmluc3RhbnRpYXRlKHIuRURFKSwiZGVzLWVkZTMiOnIuRURFLCJkZXMtZWRlLWNiYyI6ci5DQkMuaW5zdGFudGlhdGUoci5FREUpLCJkZXMtZWRlIjpyLkVERSwiZGVzLWNiYyI6ci5DQkMuaW5zdGFudGlhdGUoci5ERVMpLCJkZXMtZWNiIjpyLkRFU307ZnVuY3Rpb24gdSh0KXtpLmNhbGwodGhpcyk7dmFyIGUsbj10Lm1vZGUudG9Mb3dlckNhc2UoKSxyPWFbbl07ZT10LmRlY3J5cHQ/ImRlY3J5cHQiOiJlbmNyeXB0Ijt2YXIgbz10LmtleTtzLmlzQnVmZmVyKG8pfHwobz1zLmZyb20obykpLCJkZXMtZWRlIiE9PW4mJiJkZXMtZWRlLWNiYyIhPT1ufHwobz1zLmNvbmNhdChbbyxvLnNsaWNlKDAsOCldKSk7dmFyIHU9dC5pdjtzLmlzQnVmZmVyKHUpfHwodT1zLmZyb20odSkpLHRoaXMuX2Rlcz1yLmNyZWF0ZSh7a2V5Om8saXY6dSx0eXBlOmV9KX1hLmRlcz1hWyJkZXMtY2JjIl0sYS5kZXMzPWFbImRlcy1lZGUzLWNiYyJdLHQuZXhwb3J0cz11LG8odSxpKSx1LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBzLmZyb20odGhpcy5fZGVzLnVwZGF0ZSh0KSl9LHUucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3JldHVybiBzLmZyb20odGhpcy5fZGVzLmZpbmFsKCkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybih0WzArZV08PDI0fHRbMStlXTw8MTZ8dFsyK2VdPDw4fHRbMytlXSk+Pj4wfSxlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3RbMCtuXT1lPj4+MjQsdFsxK25dPWU+Pj4xNiYyNTUsdFsyK25dPWU+Pj44JjI1NSx0WzMrbl09MjU1JmV9LGUuaXA9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPTAsbz0wLHM9NjtzPj0wO3MtPTIpe2Zvcih2YXIgYT0wO2E8PTI0O2ErPTgpcjw8PTEscnw9ZT4+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClyPDw9MSxyfD10Pj4+YStzJjF9Zm9yKHM9NjtzPj0wO3MtPTIpe2ZvcihhPTE7YTw9MjU7YSs9OClvPDw9MSxvfD1lPj4+YStzJjE7Zm9yKGE9MTthPD0yNTthKz04KW88PD0xLG98PXQ+Pj5hK3MmMX1uW2krMF09cj4+PjAsbltpKzFdPW8+Pj4wfSxlLnJpcD1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9MCxvPTAscz0wO3M8NDtzKyspZm9yKHZhciBhPTI0O2E+PTA7YS09OClyPDw9MSxyfD1lPj4+YStzJjEscjw8PTEscnw9dD4+PmErcyYxO2ZvcihzPTQ7czw4O3MrKylmb3IoYT0yNDthPj0wO2EtPTgpbzw8PTEsb3w9ZT4+PmErcyYxLG88PD0xLG98PXQ+Pj5hK3MmMTtuW2krMF09cj4+PjAsbltpKzFdPW8+Pj4wfSxlLnBjMT1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9MCxvPTAscz03O3M+PTU7cy0tKXtmb3IodmFyIGE9MDthPD0yNDthKz04KXI8PD0xLHJ8PWU+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClyPDw9MSxyfD10Pj5hK3MmMX1mb3IoYT0wO2E8PTI0O2ErPTgpcjw8PTEscnw9ZT4+YStzJjE7Zm9yKHM9MTtzPD0zO3MrKyl7Zm9yKGE9MDthPD0yNDthKz04KW88PD0xLG98PWU+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClvPDw9MSxvfD10Pj5hK3MmMX1mb3IoYT0wO2E8PTI0O2ErPTgpbzw8PTEsb3w9dD4+YStzJjE7bltpKzBdPXI+Pj4wLG5baSsxXT1vPj4+MH0sZS5yMjhzaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw8ZSYyNjg0MzU0NTV8dD4+PjI4LWV9O3ZhciBpPVsxNCwxMSwxNyw0LDI3LDIzLDI1LDAsMTMsMjIsNywxOCw1LDksMTYsMjQsMiwyMCwxMiwyMSwxLDgsMTUsMjYsMTUsNCwyNSwxOSw5LDEsMjYsMTYsNSwxMSwyMyw4LDEyLDcsMTcsMCwyMiwzLDEwLDE0LDYsMjAsMjcsMjRdO2UucGMyPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgbz0wLHM9MCxhPWkubGVuZ3RoPj4+MSx1PTA7dTxhO3UrKylvPDw9MSxvfD10Pj4+aVt1XSYxO2Zvcih1PWE7dTxpLmxlbmd0aDt1Kyspczw8PTEsc3w9ZT4+PmlbdV0mMTtuW3IrMF09bz4+PjAsbltyKzFdPXM+Pj4wfSxlLmV4cGFuZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9MCxyPTA7aT0oMSZ0KTw8NXx0Pj4+Mjc7Zm9yKHZhciBvPTIzO28+PTE1O28tPTQpaTw8PTYsaXw9dD4+Pm8mNjM7Zm9yKG89MTE7bz49MztvLT00KXJ8PXQ+Pj5vJjYzLHI8PD02O3J8PSgzMSZ0KTw8MXx0Pj4+MzEsZVtuKzBdPWk+Pj4wLGVbbisxXT1yPj4+MH07dmFyIHI9WzE0LDAsNCwxNSwxMyw3LDEsNCwyLDE0LDE1LDIsMTEsMTMsOCwxLDMsMTAsMTAsNiw2LDEyLDEyLDExLDUsOSw5LDUsMCwzLDcsOCw0LDE1LDEsMTIsMTQsOCw4LDIsMTMsNCw2LDksMiwxLDExLDcsMTUsNSwxMiwxMSw5LDMsNywxNCwzLDEwLDEwLDAsNSw2LDAsMTMsMTUsMywxLDEzLDgsNCwxNCw3LDYsMTUsMTEsMiwzLDgsNCwxNCw5LDEyLDcsMCwyLDEsMTMsMTAsMTIsNiwwLDksNSwxMSwxMCw1LDAsMTMsMTQsOCw3LDEwLDExLDEsMTAsMyw0LDE1LDEzLDQsMSwyLDUsMTEsOCw2LDEyLDcsNiwxMiw5LDAsMyw1LDIsMTQsMTUsOSwxMCwxMywwLDcsOSwwLDE0LDksNiwzLDMsNCwxNSw2LDUsMTAsMSwyLDEzLDgsMTIsNSw3LDE0LDExLDEyLDQsMTEsMiwxNSw4LDEsMTMsMSw2LDEwLDQsMTMsOSwwLDgsNiwxNSw5LDMsOCwwLDcsMTEsNCwxLDE1LDIsMTQsMTIsMyw1LDExLDEwLDUsMTQsMiw3LDEyLDcsMTMsMTMsOCwxNCwxMSwzLDUsMCw2LDYsMTUsOSwwLDEwLDMsMSw0LDIsNyw4LDIsNSwxMiwxMSwxLDEyLDEwLDQsMTQsMTUsOSwxMCwzLDYsMTUsOSwwLDAsNiwxMiwxMCwxMSwxLDcsMTMsMTMsOCwxNSw5LDEsNCwzLDUsMTQsMTEsNSwxMiwyLDcsOCwyLDQsMTQsMiwxNCwxMiwxMSw0LDIsMSwxMiw3LDQsMTAsNywxMSwxMyw2LDEsOCw1LDUsMCwzLDE1LDE1LDEwLDEzLDMsMCw5LDE0LDgsOSw2LDQsMTEsMiw4LDEsMTIsMTEsNywxMCwxLDEzLDE0LDcsMiw4LDEzLDE1LDYsOSwxNSwxMiwwLDUsOSw2LDEwLDMsNCwwLDUsMTQsMywxMiwxMCwxLDE1LDEwLDQsMTUsMiw5LDcsMiwxMiw2LDksOCw1LDAsNiwxMywxLDMsMTMsNCwxNCwxNCwwLDcsMTEsNSwzLDExLDgsOSw0LDE0LDMsMTUsMiw1LDEyLDIsOSw4LDUsMTIsMTUsMywxMCw3LDExLDAsMTQsNCwxLDEwLDcsMSw2LDEzLDAsMTEsOCw2LDEzLDQsMTMsMTEsMCwyLDExLDE0LDcsMTUsNCwwLDksOCwxLDEzLDEwLDMsMTQsMTIsMyw5LDUsNywxMiw1LDIsMTAsMTUsNiw4LDEsNiwxLDYsNCwxMSwxMSwxMywxMyw4LDEyLDEsMyw0LDcsMTAsMTQsNywxMCw5LDE1LDUsNiwwLDgsMTUsMCwxNCw1LDIsOSwzLDIsMTIsMTMsMSwyLDE1LDgsMTMsNCw4LDYsMTAsMTUsMywxMSw3LDEsNCwxMCwxMiw5LDUsMyw2LDE0LDExLDUsMCwwLDE0LDEyLDksNywyLDcsMiwxMSwxLDQsMTQsMSw3LDksNCwxMiwxMCwxNCw4LDIsMTMsMCwxNSw2LDEyLDEwLDksMTMsMCwxNSwzLDMsNSw1LDYsOCwxMV07ZS5zdWJzdGl0dXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAsaT0wO2k8NDtpKyspe248PD00LG58PXJbNjQqaSsodD4+PjE4LTYqaSY2MyldfWZvcihpPTA7aTw0O2krKyl7bjw8PTQsbnw9clsyNTYrNjQqaSsoZT4+PjE4LTYqaSY2MyldfXJldHVybiBuPj4+MH07dmFyIG89WzE2LDI1LDEyLDExLDMsMjAsNCwxNSwzMSwxNyw5LDYsMjcsMTQsMSwyMiwzMCwyNCw4LDE4LDAsNSwyOSwyMywxMywxOSwyLDI2LDEwLDIxLDI4LDddO2UucGVybXV0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjxvLmxlbmd0aDtuKyspZTw8PTEsZXw9dD4+Pm9bbl0mMTtyZXR1cm4gZT4+PjB9LGUucGFkU3BsaXQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10LnRvU3RyaW5nKDIpO2kubGVuZ3RoPGU7KWk9IjAiK2k7Zm9yKHZhciByPVtdLG89MDtvPGU7bys9bilyLnB1c2goaS5zbGljZShvLG8rbikpO3JldHVybiByLmpvaW4oIiAiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCk7ZnVuY3Rpb24gcih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLnR5cGU9dGhpcy5vcHRpb25zLnR5cGUsdGhpcy5ibG9ja1NpemU9OCx0aGlzLl9pbml0KCksdGhpcy5idWZmZXI9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKSx0aGlzLmJ1ZmZlck9mZj0wfXQuZXhwb3J0cz1yLHIucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7fSxyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aD9bXToiZGVjcnlwdCI9PT10aGlzLnR5cGU/dGhpcy5fdXBkYXRlRGVjcnlwdCh0KTp0aGlzLl91cGRhdGVFbmNyeXB0KHQpfSxyLnByb3RvdHlwZS5fYnVmZmVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPU1hdGgubWluKHRoaXMuYnVmZmVyLmxlbmd0aC10aGlzLmJ1ZmZlck9mZix0Lmxlbmd0aC1lKSxpPTA7aTxuO2krKyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZitpXT10W2UraV07cmV0dXJuIHRoaXMuYnVmZmVyT2ZmKz1uLG59LHIucHJvdG90eXBlLl9mbHVzaEJ1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsMCx0LGUpLHRoaXMuYnVmZmVyT2ZmPTAsdGhpcy5ibG9ja1NpemV9LHIucHJvdG90eXBlLl91cGRhdGVFbmNyeXB0PWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj0wLGk9KHRoaXMuYnVmZmVyT2ZmK3QubGVuZ3RoKS90aGlzLmJsb2NrU2l6ZXwwLHI9bmV3IEFycmF5KGkqdGhpcy5ibG9ja1NpemUpOzAhPT10aGlzLmJ1ZmZlck9mZiYmKGUrPXRoaXMuX2J1ZmZlcih0LGUpLHRoaXMuYnVmZmVyT2ZmPT09dGhpcy5idWZmZXIubGVuZ3RoJiYobis9dGhpcy5fZmx1c2hCdWZmZXIocixuKSkpO2Zvcih2YXIgbz10Lmxlbmd0aC0odC5sZW5ndGgtZSkldGhpcy5ibG9ja1NpemU7ZTxvO2UrPXRoaXMuYmxvY2tTaXplKXRoaXMuX3VwZGF0ZSh0LGUscixuKSxuKz10aGlzLmJsb2NrU2l6ZTtmb3IoO2U8dC5sZW5ndGg7ZSsrLHRoaXMuYnVmZmVyT2ZmKyspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZdPXRbZV07cmV0dXJuIHJ9LHIucHJvdG90eXBlLl91cGRhdGVEZWNyeXB0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MCxpPU1hdGguY2VpbCgodGhpcy5idWZmZXJPZmYrdC5sZW5ndGgpL3RoaXMuYmxvY2tTaXplKS0xLHI9bmV3IEFycmF5KGkqdGhpcy5ibG9ja1NpemUpO2k+MDtpLS0pZSs9dGhpcy5fYnVmZmVyKHQsZSksbis9dGhpcy5fZmx1c2hCdWZmZXIocixuKTtyZXR1cm4gZSs9dGhpcy5fYnVmZmVyKHQsZSkscn0sci5wcm90b3R5cGUuZmluYWw9ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4gdCYmKGU9dGhpcy51cGRhdGUodCkpLG49ImVuY3J5cHQiPT09dGhpcy50eXBlP3RoaXMuX2ZpbmFsRW5jcnlwdCgpOnRoaXMuX2ZpbmFsRGVjcnlwdCgpLGU/ZS5jb25jYXQobik6bn0sci5wcm90b3R5cGUuX3BhZD1mdW5jdGlvbih0LGUpe2lmKDA9PT1lKXJldHVybiExO2Zvcig7ZTx0Lmxlbmd0aDspdFtlKytdPTA7cmV0dXJuITB9LHIucHJvdG90eXBlLl9maW5hbEVuY3J5cHQ9ZnVuY3Rpb24oKXtpZighdGhpcy5fcGFkKHRoaXMuYnVmZmVyLHRoaXMuYnVmZmVyT2ZmKSlyZXR1cm5bXTt2YXIgdD1uZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpO3JldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsMCx0LDApLHR9LHIucHJvdG90eXBlLl91bnBhZD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sci5wcm90b3R5cGUuX2ZpbmFsRGVjcnlwdD1mdW5jdGlvbigpe2kuZXF1YWwodGhpcy5idWZmZXJPZmYsdGhpcy5ibG9ja1NpemUsIk5vdCBlbm91Z2ggZGF0YSB0byBkZWNyeXB0Iik7dmFyIHQ9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtyZXR1cm4gdGhpcy5fZmx1c2hCdWZmZXIodCwwKSx0aGlzLl91bnBhZCh0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCkscj1uKDApLG89big2Nikscz1vLnV0aWxzLGE9by5DaXBoZXI7ZnVuY3Rpb24gdSgpe3RoaXMudG1wPW5ldyBBcnJheSgyKSx0aGlzLmtleXM9bnVsbH1mdW5jdGlvbiBjKHQpe2EuY2FsbCh0aGlzLHQpO3ZhciBlPW5ldyB1O3RoaXMuX2Rlc1N0YXRlPWUsdGhpcy5kZXJpdmVLZXlzKGUsdC5rZXkpfXIoYyxhKSx0LmV4cG9ydHM9YyxjLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGModCl9O3ZhciBoPVsxLDEsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMiwxXTtjLnByb3RvdHlwZS5kZXJpdmVLZXlzPWZ1bmN0aW9uKHQsZSl7dC5rZXlzPW5ldyBBcnJheSgzMiksaS5lcXVhbChlLmxlbmd0aCx0aGlzLmJsb2NrU2l6ZSwiSW52YWxpZCBrZXkgbGVuZ3RoIik7dmFyIG49cy5yZWFkVUludDMyQkUoZSwwKSxyPXMucmVhZFVJbnQzMkJFKGUsNCk7cy5wYzEobixyLHQudG1wLDApLG49dC50bXBbMF0scj10LnRtcFsxXTtmb3IodmFyIG89MDtvPHQua2V5cy5sZW5ndGg7bys9Mil7dmFyIGE9aFtvPj4+MV07bj1zLnIyOHNobChuLGEpLHI9cy5yMjhzaGwocixhKSxzLnBjMihuLHIsdC5rZXlzLG8pfX0sYy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9kZXNTdGF0ZSxvPXMucmVhZFVJbnQzMkJFKHQsZSksYT1zLnJlYWRVSW50MzJCRSh0LGUrNCk7cy5pcChvLGEsci50bXAsMCksbz1yLnRtcFswXSxhPXIudG1wWzFdLCJlbmNyeXB0Ij09PXRoaXMudHlwZT90aGlzLl9lbmNyeXB0KHIsbyxhLHIudG1wLDApOnRoaXMuX2RlY3J5cHQocixvLGEsci50bXAsMCksbz1yLnRtcFswXSxhPXIudG1wWzFdLHMud3JpdGVVSW50MzJCRShuLG8saSkscy53cml0ZVVJbnQzMkJFKG4sYSxpKzQpfSxjLnByb3RvdHlwZS5fcGFkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLWUsaT1lO2k8dC5sZW5ndGg7aSsrKXRbaV09bjtyZXR1cm4hMH0sYy5wcm90b3R5cGUuX3VucGFkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10W3QubGVuZ3RoLTFdLG49dC5sZW5ndGgtZTtuPHQubGVuZ3RoO24rKylpLmVxdWFsKHRbbl0sZSk7cmV0dXJuIHQuc2xpY2UoMCx0Lmxlbmd0aC1lKX0sYy5wcm90b3R5cGUuX2VuY3J5cHQ9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89ZSxhPW4sdT0wO3U8dC5rZXlzLmxlbmd0aDt1Kz0yKXt2YXIgYz10LmtleXNbdV0saD10LmtleXNbdSsxXTtzLmV4cGFuZChhLHQudG1wLDApLGNePXQudG1wWzBdLGhePXQudG1wWzFdO3ZhciBsPXMuc3Vic3RpdHV0ZShjLGgpLGQ9YTthPShvXnMucGVybXV0ZShsKSk+Pj4wLG89ZH1zLnJpcChhLG8saSxyKX0sYy5wcm90b3R5cGUuX2RlY3J5cHQ9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89bixhPWUsdT10LmtleXMubGVuZ3RoLTI7dT49MDt1LT0yKXt2YXIgYz10LmtleXNbdV0saD10LmtleXNbdSsxXTtzLmV4cGFuZChvLHQudG1wLDApLGNePXQudG1wWzBdLGhePXQudG1wWzFdO3ZhciBsPXMuc3Vic3RpdHV0ZShjLGgpLGQ9bztvPShhXnMucGVybXV0ZShsKSk+Pj4wLGE9ZH1zLnJpcChvLGEsaSxyKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCkscj1uKDApLG89e307ZnVuY3Rpb24gcyh0KXtpLmVxdWFsKHQubGVuZ3RoLDgsIkludmFsaWQgSVYgbGVuZ3RoIiksdGhpcy5pdj1uZXcgQXJyYXkoOCk7Zm9yKHZhciBlPTA7ZTx0aGlzLml2Lmxlbmd0aDtlKyspdGhpcy5pdltlXT10W2VdfWUuaW5zdGFudGlhdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLl9jYmNJbml0KCl9cihlLHQpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhvKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBzPW5baV07ZS5wcm90b3R5cGVbc109b1tzXX1yZXR1cm4gZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlfSxvLl9jYmNJbml0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHModGhpcy5vcHRpb25zLml2KTt0aGlzLl9jYmNTdGF0ZT10fSxvLl91cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fY2JjU3RhdGUsbz10aGlzLmNvbnN0cnVjdG9yLnN1cGVyXy5wcm90b3R5cGUscz1yLml2O2lmKCJlbmNyeXB0Ij09PXRoaXMudHlwZSl7Zm9yKHZhciBhPTA7YTx0aGlzLmJsb2NrU2l6ZTthKyspc1thXV49dFtlK2FdO28uX3VwZGF0ZS5jYWxsKHRoaXMscywwLG4saSk7Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKylzW2FdPW5baSthXX1lbHNle28uX3VwZGF0ZS5jYWxsKHRoaXMsdCxlLG4saSk7Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKyluW2krYV1ePXNbYV07Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKylzW2FdPXRbZSthXX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTQpLHI9bigwKSxvPW4oNjYpLHM9by5DaXBoZXIsYT1vLkRFUztmdW5jdGlvbiB1KHQsZSl7aS5lcXVhbChlLmxlbmd0aCwyNCwiSW52YWxpZCBrZXkgbGVuZ3RoIik7dmFyIG49ZS5zbGljZSgwLDgpLHI9ZS5zbGljZSg4LDE2KSxvPWUuc2xpY2UoMTYsMjQpO3RoaXMuY2lwaGVycz0iZW5jcnlwdCI9PT10P1thLmNyZWF0ZSh7dHlwZToiZW5jcnlwdCIsa2V5Om59KSxhLmNyZWF0ZSh7dHlwZToiZGVjcnlwdCIsa2V5OnJ9KSxhLmNyZWF0ZSh7dHlwZToiZW5jcnlwdCIsa2V5Om99KV06W2EuY3JlYXRlKHt0eXBlOiJkZWNyeXB0IixrZXk6b30pLGEuY3JlYXRlKHt0eXBlOiJlbmNyeXB0IixrZXk6cn0pLGEuY3JlYXRlKHt0eXBlOiJkZWNyeXB0IixrZXk6bn0pXX1mdW5jdGlvbiBjKHQpe3MuY2FsbCh0aGlzLHQpO3ZhciBlPW5ldyB1KHRoaXMudHlwZSx0aGlzLm9wdGlvbnMua2V5KTt0aGlzLl9lZGVTdGF0ZT1lfXIoYyxzKSx0LmV4cG9ydHM9YyxjLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGModCl9LGMucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fZWRlU3RhdGU7ci5jaXBoZXJzWzBdLl91cGRhdGUodCxlLG4saSksci5jaXBoZXJzWzFdLl91cGRhdGUobixpLG4saSksci5jaXBoZXJzWzJdLl91cGRhdGUobixpLG4saSl9LGMucHJvdG90eXBlLl9wYWQ9YS5wcm90b3R5cGUuX3BhZCxjLnByb3RvdHlwZS5fdW5wYWQ9YS5wcm90b3R5cGUuX3VucGFkfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big2OCkscj1uKDEwMSksbz1uKDEpLkJ1ZmZlcixzPW4oMTAyKSxhPW4oMjEpLHU9big0NSksYz1uKDQ2KTtmdW5jdGlvbiBoKHQsZSxuKXthLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGQsdGhpcy5fY2lwaGVyPW5ldyB1LkFFUyhlKSx0aGlzLl9wcmV2PW8uZnJvbShuKSx0aGlzLl9tb2RlPXQsdGhpcy5fYXV0b3BhZGRpbmc9ITB9bigwKShoLGEpLGgucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGUsbjt0aGlzLl9jYWNoZS5hZGQodCk7Zm9yKHZhciBpPVtdO2U9dGhpcy5fY2FjaGUuZ2V0KCk7KW49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsZSksaS5wdXNoKG4pO3JldHVybiBvLmNvbmNhdChpKX07dmFyIGw9by5hbGxvYygxNiwxNik7ZnVuY3Rpb24gZCgpe3RoaXMuY2FjaGU9by5hbGxvY1Vuc2FmZSgwKX1mdW5jdGlvbiBmKHQsZSxuKXt2YXIgYT1pW3QudG9Mb3dlckNhc2UoKV07aWYoIWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1vLmZyb20oZSkpLGUubGVuZ3RoIT09YS5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGggIitlLmxlbmd0aCk7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1vLmZyb20obikpLCJHQ00iIT09YS5tb2RlJiZuLmxlbmd0aCE9PWEuaXYpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpdiBsZW5ndGggIituLmxlbmd0aCk7cmV0dXJuInN0cmVhbSI9PT1hLnR5cGU/bmV3IHMoYS5tb2R1bGUsZSxuKToiYXV0aCI9PT1hLnR5cGU/bmV3IHIoYS5tb2R1bGUsZSxuKTpuZXcgaChhLm1vZHVsZSxlLG4pfWgucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NhY2hlLmZsdXNoKCk7aWYodGhpcy5fYXV0b3BhZGRpbmcpcmV0dXJuIHQ9dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCksdGhpcy5fY2lwaGVyLnNjcnViKCksdDtpZighdC5lcXVhbHMobCkpdGhyb3cgdGhpcy5fY2lwaGVyLnNjcnViKCksbmV3IEVycm9yKCJkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgiKX0saC5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F1dG9wYWRkaW5nPSEhdCx0aGlzfSxkLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5jYWNoZT1vLmNvbmNhdChbdGhpcy5jYWNoZSx0XSl9LGQucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe2lmKHRoaXMuY2FjaGUubGVuZ3RoPjE1KXt2YXIgdD10aGlzLmNhY2hlLnNsaWNlKDAsMTYpO3JldHVybiB0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHR9cmV0dXJuIG51bGx9LGQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTE2LXRoaXMuY2FjaGUubGVuZ3RoLGU9by5hbGxvY1Vuc2FmZSh0KSxuPS0xOysrbjx0OyllLndyaXRlVUludDgodCxuKTtyZXR1cm4gby5jb25jYXQoW3RoaXMuY2FjaGUsZV0pfSxlLmNyZWF0ZUNpcGhlcml2PWYsZS5jcmVhdGVDaXBoZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1pW3QudG9Mb3dlckNhc2UoKV07aWYoIW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7dmFyIHI9YyhlLCExLG4ua2V5LG4uaXYpO3JldHVybiBmKHQsci5rZXksci5pdil9fSxmdW5jdGlvbih0LGUpe2UuZW5jcnlwdD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKGUpfSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDMzKTtlLmVuY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1pKGUsdC5fcHJldik7cmV0dXJuIHQuX3ByZXY9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayhuKSx0Ll9wcmV2fSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll9wcmV2O3QuX3ByZXY9ZTt2YXIgcj10Ll9jaXBoZXIuZGVjcnlwdEJsb2NrKGUpO3JldHVybiBpKHIsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDMzKTtmdW5jdGlvbiBvKHQsZSxuKXt2YXIgbz1lLmxlbmd0aCxzPXIoZSx0Ll9jYWNoZSk7cmV0dXJuIHQuX2NhY2hlPXQuX2NhY2hlLnNsaWNlKG8pLHQuX3ByZXY9aS5jb25jYXQoW3QuX3ByZXYsbj9lOnNdKSxzfWUuZW5jcnlwdD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLHM9aS5hbGxvY1Vuc2FmZSgwKTtlLmxlbmd0aDspe2lmKDA9PT10Ll9jYWNoZS5sZW5ndGgmJih0Ll9jYWNoZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXY9aS5hbGxvY1Vuc2FmZSgwKSksISh0Ll9jYWNoZS5sZW5ndGg8PWUubGVuZ3RoKSl7cz1pLmNvbmNhdChbcyxvKHQsZSxuKV0pO2JyZWFrfXI9dC5fY2FjaGUubGVuZ3RoLHM9aS5jb25jYXQoW3Msbyh0LGUuc2xpY2UoMCxyKSxuKV0pLGU9ZS5zbGljZShyKX1yZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSxuKXt2YXIgcj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpWzBdXmU7cmV0dXJuIHQuX3ByZXY9aS5jb25jYXQoW3QuX3ByZXYuc2xpY2UoMSksaS5mcm9tKFtuP2U6cl0pXSkscn1lLmVuY3J5cHQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbz1lLmxlbmd0aCxzPWkuYWxsb2NVbnNhZmUobyksYT0tMTsrK2E8bzspc1thXT1yKHQsZVthXSxuKTtyZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSxuKXtmb3IodmFyIGkscixzPS0xLGE9MDsrK3M8ODspaT1lJjE8PDctcz8xMjg6MCxhKz0oMTI4JihyPXQuX2NpcGhlci5lbmNyeXB0QmxvY2sodC5fcHJldilbMF1eaSkpPj5zJTgsdC5fcHJldj1vKHQuX3ByZXYsbj9pOnIpO3JldHVybiBhfWZ1bmN0aW9uIG8odCxlKXt2YXIgbj10Lmxlbmd0aCxyPS0xLG89aS5hbGxvY1Vuc2FmZSh0Lmxlbmd0aCk7Zm9yKHQ9aS5jb25jYXQoW3QsaS5mcm9tKFtlXSldKTsrK3I8bjspb1tyXT10W3JdPDwxfHRbcisxXT4+NztyZXR1cm4gb31lLmVuY3J5cHQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbz1lLmxlbmd0aCxzPWkuYWxsb2NVbnNhZmUobyksYT0tMTsrK2E8bzspc1thXT1yKHQsZVthXSxuKTtyZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24odCl7dmFyIGk9bigzMyk7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5fcHJldj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXZ9ZS5lbmNyeXB0PWZ1bmN0aW9uKGUsbil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8bi5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxyKGUpXSk7dmFyIG89ZS5fY2FjaGUuc2xpY2UoMCxuLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKG4ubGVuZ3RoKSxpKG4sbyl9fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMSkuQnVmZmVyLHI9aS5hbGxvYygxNiwwKTtmdW5jdGlvbiBvKHQpe3ZhciBlPWkuYWxsb2NVbnNhZmUoMTYpO3JldHVybiBlLndyaXRlVUludDMyQkUodFswXT4+PjAsMCksZS53cml0ZVVJbnQzMkJFKHRbMV0+Pj4wLDQpLGUud3JpdGVVSW50MzJCRSh0WzJdPj4+MCw4KSxlLndyaXRlVUludDMyQkUodFszXT4+PjAsMTIpLGV9ZnVuY3Rpb24gcyh0KXt0aGlzLmg9dCx0aGlzLnN0YXRlPWkuYWxsb2MoMTYsMCksdGhpcy5jYWNoZT1pLmFsbG9jVW5zYWZlKDApfXMucHJvdG90eXBlLmdoYXNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMTsrK2U8dC5sZW5ndGg7KXRoaXMuc3RhdGVbZV1ePXRbZV07dGhpcy5fbXVsdGlwbHkoKX0scy5wcm90b3R5cGUuX211bHRpcGx5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixpPVsodD10aGlzLmgpLnJlYWRVSW50MzJCRSgwKSx0LnJlYWRVSW50MzJCRSg0KSx0LnJlYWRVSW50MzJCRSg4KSx0LnJlYWRVSW50MzJCRSgxMildLHI9WzAsMCwwLDBdLHM9LTE7KytzPDEyODspe2ZvcigwIT0odGhpcy5zdGF0ZVt+fihzLzgpXSYxPDw3LXMlOCkmJihyWzBdXj1pWzBdLHJbMV1ePWlbMV0sclsyXV49aVsyXSxyWzNdXj1pWzNdKSxuPTAhPSgxJmlbM10pLGU9MztlPjA7ZS0tKWlbZV09aVtlXT4+PjF8KDEmaVtlLTFdKTw8MzE7aVswXT1pWzBdPj4+MSxuJiYoaVswXT1pWzBdXjIyNTw8MjQpfXRoaXMuc3RhdGU9byhyKX0scy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLmNhY2hlPWkuY29uY2F0KFt0aGlzLmNhY2hlLHRdKTt0aGlzLmNhY2hlLmxlbmd0aD49MTY7KWU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHRoaXMuZ2hhc2goZSl9LHMucHJvdG90eXBlLmZpbmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RoJiZ0aGlzLmdoYXNoKGkuY29uY2F0KFt0aGlzLmNhY2hlLHJdLDE2KSksdGhpcy5naGFzaChvKFswLHQsMCxlXSkpLHRoaXMuc3RhdGV9LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMDEpLHI9bigxKS5CdWZmZXIsbz1uKDY4KSxzPW4oMTAyKSxhPW4oMjEpLHU9big0NSksYz1uKDQ2KTtmdW5jdGlvbiBoKHQsZSxuKXthLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGwsdGhpcy5fbGFzdD12b2lkIDAsdGhpcy5fY2lwaGVyPW5ldyB1LkFFUyhlKSx0aGlzLl9wcmV2PXIuZnJvbShuKSx0aGlzLl9tb2RlPXQsdGhpcy5fYXV0b3BhZGRpbmc9ITB9ZnVuY3Rpb24gbCgpe3RoaXMuY2FjaGU9ci5hbGxvY1Vuc2FmZSgwKX1mdW5jdGlvbiBkKHQsZSxuKXt2YXIgYT1vW3QudG9Mb3dlckNhc2UoKV07aWYoIWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1yLmZyb20obikpLCJHQ00iIT09YS5tb2RlJiZuLmxlbmd0aCE9PWEuaXYpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpdiBsZW5ndGggIituLmxlbmd0aCk7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1yLmZyb20oZSkpLGUubGVuZ3RoIT09YS5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGggIitlLmxlbmd0aCk7cmV0dXJuInN0cmVhbSI9PT1hLnR5cGU/bmV3IHMoYS5tb2R1bGUsZSxuLCEwKToiYXV0aCI9PT1hLnR5cGU/bmV3IGkoYS5tb2R1bGUsZSxuLCEwKTpuZXcgaChhLm1vZHVsZSxlLG4pfW4oMCkoaCxhKSxoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5fY2FjaGUuYWRkKHQpO2Zvcih2YXIgaT1bXTtlPXRoaXMuX2NhY2hlLmdldCh0aGlzLl9hdXRvcGFkZGluZyk7KW49dGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsZSksaS5wdXNoKG4pO3JldHVybiByLmNvbmNhdChpKX0saC5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2FjaGUuZmx1c2goKTtpZih0aGlzLl9hdXRvcGFkZGluZylyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dFsxNV07aWYoZTwxfHxlPjE2KXRocm93IG5ldyBFcnJvcigidW5hYmxlIHRvIGRlY3J5cHQgZGF0YSIpO3ZhciBuPS0xO2Zvcig7KytuPGU7KWlmKHRbbisoMTYtZSldIT09ZSl0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBkZWNyeXB0IGRhdGEiKTtpZigxNj09PWUpcmV0dXJuO3JldHVybiB0LnNsaWNlKDAsMTYtZSl9KHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLHQpKTtpZih0KXRocm93IG5ldyBFcnJvcigiZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoIil9LGgucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hdXRvcGFkZGluZz0hIXQsdGhpc30sbC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGU9ci5jb25jYXQoW3RoaXMuY2FjaGUsdF0pfSxsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU7aWYodCl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGV9ZWxzZSBpZih0aGlzLmNhY2hlLmxlbmd0aD49MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGU7cmV0dXJuIG51bGx9LGwucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGV9LGUuY3JlYXRlRGVjaXBoZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1vW3QudG9Mb3dlckNhc2UoKV07aWYoIW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7dmFyIGk9YyhlLCExLG4ua2V5LG4uaXYpO3JldHVybiBkKHQsaS5rZXksaS5pdil9LGUuY3JlYXRlRGVjaXBoZXJpdj1kfSxmdW5jdGlvbih0LGUpe2VbImRlcy1lY2IiXT17a2V5OjgsaXY6MH0sZVsiZGVzLWNiYyJdPWUuZGVzPXtrZXk6OCxpdjo4fSxlWyJkZXMtZWRlMy1jYmMiXT1lLmRlczM9e2tleToyNCxpdjo4fSxlWyJkZXMtZWRlMyJdPXtrZXk6MjQsaXY6MH0sZVsiZGVzLWVkZS1jYmMiXT17a2V5OjE2LGl2Ojh9LGVbImRlcy1lZGUiXT17a2V5OjE2LGl2OjB9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTAzKSxyPW4oMTg0KSxvPW4oMTg1KTt2YXIgcz17YmluYXJ5OiEwLGhleDohMCxiYXNlNjQ6ITB9O2UuRGlmZmllSGVsbG1hbkdyb3VwPWUuY3JlYXRlRGlmZmllSGVsbG1hbkdyb3VwPWUuZ2V0RGlmZmllSGVsbG1hbj1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdChyW2VdLnByaW1lLCJoZXgiKSxpPW5ldyB0KHJbZV0uZ2VuLCJoZXgiKTtyZXR1cm4gbmV3IG8obixpKX0sZS5jcmVhdGVEaWZmaWVIZWxsbWFuPWUuRGlmZmllSGVsbG1hbj1mdW5jdGlvbiBlKG4scixhLHUpe3JldHVybiB0LmlzQnVmZmVyKHIpfHx2b2lkIDA9PT1zW3JdP2UobiwiYmluYXJ5IixyLGEpOihyPXJ8fCJiaW5hcnkiLHU9dXx8ImJpbmFyeSIsYT1hfHxuZXcgdChbMl0pLHQuaXNCdWZmZXIoYSl8fChhPW5ldyB0KGEsdSkpLCJudW1iZXIiPT10eXBlb2Ygbj9uZXcgbyhpKG4sYSksYSwhMCk6KHQuaXNCdWZmZXIobil8fChuPW5ldyB0KG4scikpLG5ldyBvKG4sYSwhMCkpKX19KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQpe3QuZXhwb3J0cz17bW9kcDE6e2dlbjoiMDIiLHByaW1lOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjNhMzYyMGZmZmZmZmZmZmZmZmZmZmYifSxtb2RwMjp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U2NTM4MWZmZmZmZmZmZmZmZmZmZmYifSxtb2RwNTp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMjM3MzI3ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxNDp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhY2FhNjhmZmZmZmZmZmZmZmZmZmZmIn0sbW9kcDE1OntnZW46IjAyIixwcmltZToiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkzYWQyY2FmZmZmZmZmZmZmZmZmZmZmIn0sbW9kcDE2OntnZW46IjAyIixwcmltZToiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDYzMTk5ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxNzp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkY2M0MDI0ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxODp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmIn19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBpPW4oMykscj1uZXcobigxMDQpKSxvPW5ldyBpKDI0KSxzPW5ldyBpKDExKSxhPW5ldyBpKDEwKSx1PW5ldyBpKDMpLGM9bmV3IGkoNyksaD1uKDEwMyksbD1uKDI3KTtmdW5jdGlvbiBkKHQsbil7cmV0dXJuIG49bnx8InV0ZjgiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQsbikpLHRoaXMuX3B1Yj1uZXcgaSh0KSx0aGlzfWZ1bmN0aW9uIGYodCxuKXtyZXR1cm4gbj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSksdGhpcy5fcHJpdj1uZXcgaSh0KSx0aGlzfXQuZXhwb3J0cz1tO3ZhciBwPXt9O2Z1bmN0aW9uIG0odCxlLG4pe3RoaXMuc2V0R2VuZXJhdG9yKGUpLHRoaXMuX19wcmltZT1uZXcgaSh0KSx0aGlzLl9wcmltZT1pLm1vbnQodGhpcy5fX3ByaW1lKSx0aGlzLl9wcmltZUxlbj10Lmxlbmd0aCx0aGlzLl9wdWI9dm9pZCAwLHRoaXMuX3ByaXY9dm9pZCAwLHRoaXMuX3ByaW1lQ29kZT12b2lkIDAsbj8odGhpcy5zZXRQdWJsaWNLZXk9ZCx0aGlzLnNldFByaXZhdGVLZXk9Zik6dGhpcy5fcHJpbWVDb2RlPTh9ZnVuY3Rpb24gZyh0LG4pe3ZhciBpPW5ldyBlKHQudG9BcnJheSgpKTtyZXR1cm4gbj9pLnRvU3RyaW5nKG4pOml9T2JqZWN0LmRlZmluZVByb3BlcnR5KG0ucHJvdG90eXBlLCJ2ZXJpZnlFcnJvciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0aGlzLl9wcmltZUNvZGUmJih0aGlzLl9wcmltZUNvZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnRvU3RyaW5nKCJoZXgiKSxpPVtuLHQudG9TdHJpbmcoMTYpXS5qb2luKCJfIik7aWYoaSBpbiBwKXJldHVybiBwW2ldO3ZhciBsLGQ9MDtpZih0LmlzRXZlbigpfHwhaC5zaW1wbGVTaWV2ZXx8IWguZmVybWF0VGVzdCh0KXx8IXIudGVzdCh0KSlyZXR1cm4gZCs9MSxkKz0iMDIiPT09bnx8IjA1Ij09PW4/ODo0LHBbaV09ZCxkO3N3aXRjaChyLnRlc3QodC5zaHJuKDEpKXx8KGQrPTIpLG4pe2Nhc2UiMDIiOnQubW9kKG8pLmNtcChzKSYmKGQrPTgpO2JyZWFrO2Nhc2UiMDUiOihsPXQubW9kKGEpKS5jbXAodSkmJmwuY21wKGMpJiYoZCs9OCk7YnJlYWs7ZGVmYXVsdDpkKz00fXJldHVybiBwW2ldPWQsZH0odGhpcy5fX3ByaW1lLHRoaXMuX19nZW4pKSx0aGlzLl9wcmltZUNvZGV9fSksbS5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByaXZ8fCh0aGlzLl9wcml2PW5ldyBpKGwodGhpcy5fcHJpbWVMZW4pKSksdGhpcy5fcHViPXRoaXMuX2dlbi50b1JlZCh0aGlzLl9wcmltZSkucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKSx0aGlzLmdldFB1YmxpY0tleSgpfSxtLnByb3RvdHlwZS5jb21wdXRlU2VjcmV0PWZ1bmN0aW9uKHQpe3ZhciBuPSh0PSh0PW5ldyBpKHQpKS50b1JlZCh0aGlzLl9wcmltZSkpLnJlZFBvdyh0aGlzLl9wcml2KS5mcm9tUmVkKCkscj1uZXcgZShuLnRvQXJyYXkoKSksbz10aGlzLmdldFByaW1lKCk7aWYoci5sZW5ndGg8by5sZW5ndGgpe3ZhciBzPW5ldyBlKG8ubGVuZ3RoLXIubGVuZ3RoKTtzLmZpbGwoMCkscj1lLmNvbmNhdChbcyxyXSl9cmV0dXJuIHJ9LG0ucHJvdG90eXBlLmdldFB1YmxpY0tleT1mdW5jdGlvbih0KXtyZXR1cm4gZyh0aGlzLl9wdWIsdCl9LG0ucHJvdG90eXBlLmdldFByaXZhdGVLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fcHJpdix0KX0sbS5wcm90b3R5cGUuZ2V0UHJpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fX3ByaW1lLHQpfSxtLnByb3RvdHlwZS5nZXRHZW5lcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fZ2VuLHQpfSxtLnByb3RvdHlwZS5zZXRHZW5lcmF0b3I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSksdGhpcy5fX2dlbj10LHRoaXMuX2dlbj1uZXcgaSh0KSx0aGlzfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9bigzMSkscj1uKDU5KSxvPW4oMCkscz1uKDE4NyksYT1uKDIyMyksdT1uKDkzKTtmdW5jdGlvbiBjKHQpe3IuV3JpdGFibGUuY2FsbCh0aGlzKTt2YXIgZT11W3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIGRpZ2VzdCIpO3RoaXMuX2hhc2hUeXBlPWUuaGFzaCx0aGlzLl9oYXNoPWkoZS5oYXNoKSx0aGlzLl90YWc9ZS5pZCx0aGlzLl9zaWduVHlwZT1lLnNpZ259ZnVuY3Rpb24gaCh0KXtyLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGU9dVt0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbWVzc2FnZSBkaWdlc3QiKTt0aGlzLl9oYXNoPWkoZS5oYXNoKSx0aGlzLl90YWc9ZS5pZCx0aGlzLl9zaWduVHlwZT1lLnNpZ259ZnVuY3Rpb24gbCh0KXtyZXR1cm4gbmV3IGModCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gbmV3IGgodCl9T2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbih0KXt1W3RdLmlkPW5ldyBlKHVbdF0uaWQsImhleCIpLHVbdC50b0xvd2VyQ2FzZSgpXT11W3RdfSksbyhjLHIuV3JpdGFibGUpLGMucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUsbil7dGhpcy5faGFzaC51cGRhdGUodCksbigpfSxjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBlKHQsbikpLHRoaXMuX2hhc2gudXBkYXRlKHQpLHRoaXN9LGMucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24odCxlKXt0aGlzLmVuZCgpO3ZhciBuPXRoaXMuX2hhc2guZGlnZXN0KCksaT1zKG4sdCx0aGlzLl9oYXNoVHlwZSx0aGlzLl9zaWduVHlwZSx0aGlzLl90YWcpO3JldHVybiBlP2kudG9TdHJpbmcoZSk6aX0sbyhoLHIuV3JpdGFibGUpLGgucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUsbil7dGhpcy5faGFzaC51cGRhdGUodCksbigpfSxoLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBlKHQsbikpLHRoaXMuX2hhc2gudXBkYXRlKHQpLHRoaXN9LGgucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LG4saSl7InN0cmluZyI9PXR5cGVvZiBuJiYobj1uZXcgZShuLGkpKSx0aGlzLmVuZCgpO3ZhciByPXRoaXMuX2hhc2guZGlnZXN0KCk7cmV0dXJuIGEobixyLHQsdGhpcy5fc2lnblR5cGUsdGhpcy5fdGFnKX0sdC5leHBvcnRzPXtTaWduOmwsVmVyaWZ5OmQsY3JlYXRlU2lnbjpsLGNyZWF0ZVZlcmlmeTpkfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9big5MSkscj1uKDY5KSxvPW4oMTApLmVjLHM9bigzKSxhPW4oNDkpLHU9bigxMTQpO2Z1bmN0aW9uIGModCxuLHIsbyl7aWYoKHQ9bmV3IGUodC50b0FycmF5KCkpKS5sZW5ndGg8bi5ieXRlTGVuZ3RoKCkpe3ZhciBzPW5ldyBlKG4uYnl0ZUxlbmd0aCgpLXQubGVuZ3RoKTtzLmZpbGwoMCksdD1lLmNvbmNhdChbcyx0XSl9dmFyIGE9ci5sZW5ndGgsdT1mdW5jdGlvbih0LG4pe3Q9KHQ9aCh0LG4pKS5tb2Qobik7dmFyIGk9bmV3IGUodC50b0FycmF5KCkpO2lmKGkubGVuZ3RoPG4uYnl0ZUxlbmd0aCgpKXt2YXIgcj1uZXcgZShuLmJ5dGVMZW5ndGgoKS1pLmxlbmd0aCk7ci5maWxsKDApLGk9ZS5jb25jYXQoW3IsaV0pfXJldHVybiBpfShyLG4pLGM9bmV3IGUoYSk7Yy5maWxsKDEpO3ZhciBsPW5ldyBlKGEpO3JldHVybiBsLmZpbGwoMCksbD1pKG8sbCkudXBkYXRlKGMpLnVwZGF0ZShuZXcgZShbMF0pKS51cGRhdGUodCkudXBkYXRlKHUpLmRpZ2VzdCgpLGM9aShvLGwpLnVwZGF0ZShjKS5kaWdlc3QoKSx7azpsPWkobyxsKS51cGRhdGUoYykudXBkYXRlKG5ldyBlKFsxXSkpLnVwZGF0ZSh0KS51cGRhdGUodSkuZGlnZXN0KCksdjpjPWkobyxsKS51cGRhdGUoYykuZGlnZXN0KCl9fWZ1bmN0aW9uIGgodCxlKXt2YXIgbj1uZXcgcyh0KSxpPSh0Lmxlbmd0aDw8MyktZS5iaXRMZW5ndGgoKTtyZXR1cm4gaT4wJiZuLmlzaHJuKGkpLG59ZnVuY3Rpb24gbCh0LG4scil7dmFyIG8scztkb3tmb3Iobz1uZXcgZSgwKTs4Km8ubGVuZ3RoPHQuYml0TGVuZ3RoKCk7KW4udj1pKHIsbi5rKS51cGRhdGUobi52KS5kaWdlc3QoKSxvPWUuY29uY2F0KFtvLG4udl0pO3M9aChvLHQpLG4uaz1pKHIsbi5rKS51cGRhdGUobi52KS51cGRhdGUobmV3IGUoWzBdKSkuZGlnZXN0KCksbi52PWkocixuLmspLnVwZGF0ZShuLnYpLmRpZ2VzdCgpfXdoaWxlKC0xIT09cy5jbXAodCkpO3JldHVybiBzfWZ1bmN0aW9uIGQodCxlLG4saSl7cmV0dXJuIHQudG9SZWQocy5tb250KG4pKS5yZWRQb3coZSkuZnJvbVJlZCgpLm1vZChpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGksZixwKXt2YXIgbT1hKG4pO2lmKG0uY3VydmUpe2lmKCJlY2RzYSIhPT1mJiYiZWNkc2EvcnNhIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIGk9dVtuLmN1cnZlLmpvaW4oIi4iKV07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGN1cnZlICIrbi5jdXJ2ZS5qb2luKCIuIikpO3ZhciByPW5ldyBvKGkpLmtleUZyb21Qcml2YXRlKG4ucHJpdmF0ZUtleSkuc2lnbih0KTtyZXR1cm4gbmV3IGUoci50b0RFUigpKX0odCxtKX1pZigiZHNhIj09PW0udHlwZSl7aWYoImRzYSIhPT1mKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHJpdmF0ZSBrZXkgdHlwZSIpO3JldHVybiBmdW5jdGlvbih0LG4saSl7Zm9yKHZhciByLG89bi5wYXJhbXMucHJpdl9rZXksYT1uLnBhcmFtcy5wLHU9bi5wYXJhbXMucSxmPW4ucGFyYW1zLmcscD1uZXcgcygwKSxtPWgodCx1KS5tb2QodSksZz0hMSx2PWMobyx1LHQsaSk7ITE9PT1nOylyPWwodSx2LGkpLHA9ZChmLHIsYSx1KSwwPT09KGc9ci5pbnZtKHUpLmltdWwobS5hZGQoby5tdWwocCkpKS5tb2QodSkpLmNtcG4oMCkmJihnPSExLHA9bmV3IHMoMCkpO3JldHVybiBmdW5jdGlvbih0LG4pe3Q9dC50b0FycmF5KCksbj1uLnRvQXJyYXkoKSwxMjgmdFswXSYmKHQ9WzBdLmNvbmNhdCh0KSksMTI4Jm5bMF0mJihuPVswXS5jb25jYXQobikpO3ZhciBpPVs0OCx0Lmxlbmd0aCtuLmxlbmd0aCs0LDIsdC5sZW5ndGhdO3JldHVybiBpPWkuY29uY2F0KHQsWzIsbi5sZW5ndGhdLG4pLG5ldyBlKGkpfShwLGcpfSh0LG0saSl9aWYoInJzYSIhPT1mJiYiZWNkc2EvcnNhIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7dD1lLmNvbmNhdChbcCx0XSk7Zm9yKHZhciBnPW0ubW9kdWx1cy5ieXRlTGVuZ3RoKCksdj1bMCwxXTt0Lmxlbmd0aCt2Lmxlbmd0aCsxPGc7KXYucHVzaCgyNTUpO3YucHVzaCgwKTtmb3IodmFyIGI9LTE7KytiPHQubGVuZ3RoOyl2LnB1c2godFtiXSk7cmV0dXJuIHIodixtKX0sdC5leHBvcnRzLmdldEtleT1jLHQuZXhwb3J0cy5tYWtlS2V5PWx9KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9e25hbWU6ImVsbGlwdGljIix2ZXJzaW9uOiI2LjQuMSIsZGVzY3JpcHRpb246IkVDIGNyeXB0b2dyYXBoeSIsbWFpbjoibGliL2VsbGlwdGljLmpzIixmaWxlczpbImxpYiJdLHNjcmlwdHM6e2pzY3M6ImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvaW5kZXguanMiLGpzaGludDoianNjcyBiZW5jaG1hcmtzLyouanMgbGliLyouanMgbGliLyoqLyouanMgbGliLyoqLyoqLyouanMgdGVzdC9pbmRleC5qcyIsbGludDoibnBtIHJ1biBqc2NzICYmIG5wbSBydW4ganNoaW50Iix1bml0OiJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qcyIsdGVzdDoibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gdW5pdCIsdmVyc2lvbjoiZ3J1bnQgZGlzdCAmJiBnaXQgYWRkIGRpc3QvIn0scmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6ImdpdEBnaXRodWIuY29tOmluZHV0bnkvZWxsaXB0aWMifSxrZXl3b3JkczpbIkVDIiwiRWxsaXB0aWMiLCJjdXJ2ZSIsIkNyeXB0b2dyYXBoeSJdLGF1dGhvcjoiRmVkb3IgSW5kdXRueSA8ZmVkb3JAaW5kdXRueS5jb20+IixsaWNlbnNlOiJNSVQiLGJ1Z3M6e3VybDoiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzIn0saG9tZXBhZ2U6Imh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljIixkZXZEZXBlbmRlbmNpZXM6e2JyZnM6Il4xLjQuMyIsY292ZXJhbGxzOiJeMi4xMS4zIixncnVudDoiXjAuNC41IiwiZ3J1bnQtYnJvd3NlcmlmeSI6Il41LjAuMCIsImdydW50LWNsaSI6Il4xLjIuMCIsImdydW50LWNvbnRyaWItY29ubmVjdCI6Il4xLjAuMCIsImdydW50LWNvbnRyaWItY29weSI6Il4xLjAuMCIsImdydW50LWNvbnRyaWItdWdsaWZ5IjoiXjEuMC4xIiwiZ3J1bnQtbW9jaGEtaXN0YW5idWwiOiJeMy4wLjEiLCJncnVudC1zYXVjZWxhYnMiOiJeOC42LjIiLGlzdGFuYnVsOiJeMC40LjIiLGpzY3M6Il4yLjkuMCIsanNoaW50OiJeMi42LjAiLG1vY2hhOiJeMi4xLjAifSxkZXBlbmRlbmNpZXM6eyJibi5qcyI6Il40LjQuMCIsYnJvcmFuZDoiXjEuMC4xIiwiaGFzaC5qcyI6Il4xLjAuMCIsImhtYWMtZHJiZyI6Il4xLjAuMCIsaW5oZXJpdHM6Il4yLjAuMSIsIm1pbmltYWxpc3RpYy1hc3NlcnQiOiJeMS4wLjAiLCJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjoiXjEuMC4wIn0sX3Jlc29sdmVkOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbGxpcHRpYy8tL2VsbGlwdGljLTYuNC4xLnRneiIsX2ludGVncml0eToic2hhNTEyLUJzWEx6NXNxWDhPSGNzaDdDcUJNenR5WEFSbUdRM0xXUHRHakppNkRpSkhxNUMvcXZpOVAzT3Fnc3dLU0RmdGJ1OCtJb0kvUURUQW0yZkZuUTlTWlNRPT0iLF9mcm9tOiJlbGxpcHRpY0A2LjQuMSJ9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPWUscj1uKDMpLG89bigxNCkscz1uKDEwNik7aS5hc3NlcnQ9byxpLnRvQXJyYXk9cy50b0FycmF5LGkuemVybzI9cy56ZXJvMixpLnRvSGV4PXMudG9IZXgsaS5lbmNvZGU9cy5lbmNvZGUsaS5nZXROQUY9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT0xPDxlKzEscj10LmNsb25lKCk7ci5jbXBuKDEpPj0wOyl7dmFyIG87aWYoci5pc09kZCgpKXt2YXIgcz1yLmFuZGxuKGktMSk7bz1zPihpPj4xKS0xPyhpPj4xKS1zOnMsci5pc3VibihvKX1lbHNlIG89MDtuLnB1c2gobyk7Zm9yKHZhciBhPTAhPT1yLmNtcG4oMCkmJjA9PT1yLmFuZGxuKGktMSk/ZSsxOjEsdT0xO3U8YTt1Kyspbi5wdXNoKDApO3IuaXVzaHJuKGEpfXJldHVybiBufSxpLmdldEpTRj1mdW5jdGlvbih0LGUpe3ZhciBuPVtbXSxbXV07dD10LmNsb25lKCksZT1lLmNsb25lKCk7Zm9yKHZhciBpPTAscj0wO3QuY21wbigtaSk+MHx8ZS5jbXBuKC1yKT4wOyl7dmFyIG8scyxhLHU9dC5hbmRsbigzKStpJjMsYz1lLmFuZGxuKDMpK3ImMzszPT09dSYmKHU9LTEpLDM9PT1jJiYoYz0tMSksbz0wPT0oMSZ1KT8wOjMhPShhPXQuYW5kbG4oNykraSY3KSYmNSE9PWF8fDIhPT1jP3U6LXUsblswXS5wdXNoKG8pLHM9MD09KDEmYyk/MDozIT0oYT1lLmFuZGxuKDcpK3ImNykmJjUhPT1hfHwyIT09dT9jOi1jLG5bMV0ucHVzaChzKSwyKmk9PT1vKzEmJihpPTEtaSksMipyPT09cysxJiYocj0xLXIpLHQuaXVzaHJuKDEpLGUuaXVzaHJuKDEpfXJldHVybiBufSxpLmNhY2hlZFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0iXyIrZTt0LnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzW2ldP3RoaXNbaV06dGhpc1tpXT1uLmNhbGwodGhpcyl9fSxpLnBhcnNlQnl0ZXM9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2kudG9BcnJheSh0LCJoZXgiKTp0fSxpLmludEZyb21MRT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodCwiaGV4IiwibGUiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMTApLnV0aWxzLG89ci5nZXROQUYscz1yLmdldEpTRixhPXIuYXNzZXJ0O2Z1bmN0aW9uIHUodCxlKXt0aGlzLnR5cGU9dCx0aGlzLnA9bmV3IGkoZS5wLDE2KSx0aGlzLnJlZD1lLnByaW1lP2kucmVkKGUucHJpbWUpOmkubW9udCh0aGlzLnApLHRoaXMuemVybz1uZXcgaSgwKS50b1JlZCh0aGlzLnJlZCksdGhpcy5vbmU9bmV3IGkoMSkudG9SZWQodGhpcy5yZWQpLHRoaXMudHdvPW5ldyBpKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLm49ZS5uJiZuZXcgaShlLm4sMTYpLHRoaXMuZz1lLmcmJnRoaXMucG9pbnRGcm9tSlNPTihlLmcsZS5nUmVkKSx0aGlzLl93bmFmVDE9bmV3IEFycmF5KDQpLHRoaXMuX3duYWZUMj1uZXcgQXJyYXkoNCksdGhpcy5fd25hZlQzPW5ldyBBcnJheSg0KSx0aGlzLl93bmFmVDQ9bmV3IEFycmF5KDQpO3ZhciBuPXRoaXMubiYmdGhpcy5wLmRpdih0aGlzLm4pOyFufHxuLmNtcG4oMTAwKT4wP3RoaXMucmVkTj1udWxsOih0aGlzLl9tYXh3ZWxsVHJpY2s9ITAsdGhpcy5yZWROPXRoaXMubi50b1JlZCh0aGlzLnJlZCkpfWZ1bmN0aW9uIGModCxlKXt0aGlzLmN1cnZlPXQsdGhpcy50eXBlPWUsdGhpcy5wcmVjb21wdXRlZD1udWxsfXQuZXhwb3J0cz11LHUucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sdS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSx1LnByb3RvdHlwZS5fZml4ZWROYWZNdWw9ZnVuY3Rpb24odCxlKXthKHQucHJlY29tcHV0ZWQpO3ZhciBuPXQuX2dldERvdWJsZXMoKSxpPW8oZSwxKSxyPSgxPDxuLnN0ZXArMSktKG4uc3RlcCUyPT0wPzI6MSk7ci89Mztmb3IodmFyIHM9W10sdT0wO3U8aS5sZW5ndGg7dSs9bi5zdGVwKXt2YXIgYz0wO2ZvcihlPXUrbi5zdGVwLTE7ZT49dTtlLS0pYz0oYzw8MSkraVtlXTtzLnB1c2goYyl9Zm9yKHZhciBoPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxsPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxkPXI7ZD4wO2QtLSl7Zm9yKHU9MDt1PHMubGVuZ3RoO3UrKyl7KGM9c1t1XSk9PT1kP2w9bC5taXhlZEFkZChuLnBvaW50c1t1XSk6Yz09PS1kJiYobD1sLm1peGVkQWRkKG4ucG9pbnRzW3VdLm5lZygpKSl9aD1oLmFkZChsKX1yZXR1cm4gaC50b1AoKX0sdS5wcm90b3R5cGUuX3duYWZNdWw9ZnVuY3Rpb24odCxlKXt2YXIgbj00LGk9dC5fZ2V0TkFGUG9pbnRzKG4pO249aS53bmQ7Zm9yKHZhciByPWkucG9pbnRzLHM9byhlLG4pLHU9dGhpcy5qcG9pbnQobnVsbCxudWxsLG51bGwpLGM9cy5sZW5ndGgtMTtjPj0wO2MtLSl7Zm9yKGU9MDtjPj0wJiYwPT09c1tjXTtjLS0pZSsrO2lmKGM+PTAmJmUrKyx1PXUuZGJscChlKSxjPDApYnJlYWs7dmFyIGg9c1tjXTthKDAhPT1oKSx1PSJhZmZpbmUiPT09dC50eXBlP2g+MD91Lm1peGVkQWRkKHJbaC0xPj4xXSk6dS5taXhlZEFkZChyWy1oLTE+PjFdLm5lZygpKTpoPjA/dS5hZGQocltoLTE+PjFdKTp1LmFkZChyWy1oLTE+PjFdLm5lZygpKX1yZXR1cm4iYWZmaW5lIj09PXQudHlwZT91LnRvUCgpOnV9LHUucHJvdG90eXBlLl93bmFmTXVsQWRkPWZ1bmN0aW9uKHQsZSxuLGkscil7Zm9yKHZhciBhPXRoaXMuX3duYWZUMSx1PXRoaXMuX3duYWZUMixjPXRoaXMuX3duYWZUMyxoPTAsbD0wO2w8aTtsKyspe3ZhciBkPShFPWVbbF0pLl9nZXROQUZQb2ludHModCk7YVtsXT1kLnduZCx1W2xdPWQucG9pbnRzfWZvcihsPWktMTtsPj0xO2wtPTIpe3ZhciBmPWwtMSxwPWw7aWYoMT09PWFbZl0mJjE9PT1hW3BdKXt2YXIgbT1bZVtmXSxudWxsLG51bGwsZVtwXV07MD09PWVbZl0ueS5jbXAoZVtwXS55KT8obVsxXT1lW2ZdLmFkZChlW3BdKSxtWzJdPWVbZl0udG9KKCkubWl4ZWRBZGQoZVtwXS5uZWcoKSkpOjA9PT1lW2ZdLnkuY21wKGVbcF0ueS5yZWROZWcoKSk/KG1bMV09ZVtmXS50b0ooKS5taXhlZEFkZChlW3BdKSxtWzJdPWVbZl0uYWRkKGVbcF0ubmVnKCkpKToobVsxXT1lW2ZdLnRvSigpLm1peGVkQWRkKGVbcF0pLG1bMl09ZVtmXS50b0ooKS5taXhlZEFkZChlW3BdLm5lZygpKSk7dmFyIGc9Wy0zLC0xLC01LC03LDAsNyw1LDEsM10sdj1zKG5bZl0sbltwXSk7aD1NYXRoLm1heCh2WzBdLmxlbmd0aCxoKSxjW2ZdPW5ldyBBcnJheShoKSxjW3BdPW5ldyBBcnJheShoKTtmb3IodmFyIGI9MDtiPGg7YisrKXt2YXIgeT0wfHZbMF1bYl0sXz0wfHZbMV1bYl07Y1tmXVtiXT1nWzMqKHkrMSkrKF8rMSldLGNbcF1bYl09MCx1W2ZdPW19fWVsc2UgY1tmXT1vKG5bZl0sYVtmXSksY1twXT1vKG5bcF0sYVtwXSksaD1NYXRoLm1heChjW2ZdLmxlbmd0aCxoKSxoPU1hdGgubWF4KGNbcF0ubGVuZ3RoLGgpfXZhciB3PXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSx4PXRoaXMuX3duYWZUNDtmb3IobD1oO2w+PTA7bC0tKXtmb3IodmFyIE09MDtsPj0wOyl7dmFyIFM9ITA7Zm9yKGI9MDtiPGk7YisrKXhbYl09MHxjW2JdW2xdLDAhPT14W2JdJiYoUz0hMSk7aWYoIVMpYnJlYWs7TSsrLGwtLX1pZihsPj0wJiZNKyssdz13LmRibHAoTSksbDwwKWJyZWFrO2ZvcihiPTA7YjxpO2IrKyl7dmFyIEUsQT14W2JdOzAhPT1BJiYoQT4wP0U9dVtiXVtBLTE+PjFdOkE8MCYmKEU9dVtiXVstQS0xPj4xXS5uZWcoKSksdz0iYWZmaW5lIj09PUUudHlwZT93Lm1peGVkQWRkKEUpOncuYWRkKEUpKX19Zm9yKGw9MDtsPGk7bCsrKXVbbF09bnVsbDtyZXR1cm4gcj93OncudG9QKCl9LHUuQmFzZVBvaW50PWMsYy5wcm90b3R5cGUuZXE9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpfSx1LnByb3RvdHlwZS5kZWNvZGVQb2ludD1mdW5jdGlvbih0LGUpe3Q9ci50b0FycmF5KHQsZSk7dmFyIG49dGhpcy5wLmJ5dGVMZW5ndGgoKTtpZigoND09PXRbMF18fDY9PT10WzBdfHw3PT09dFswXSkmJnQubGVuZ3RoLTE9PTIqbilyZXR1cm4gNj09PXRbMF0/YSh0W3QubGVuZ3RoLTFdJTI9PTApOjc9PT10WzBdJiZhKHRbdC5sZW5ndGgtMV0lMj09MSksdGhpcy5wb2ludCh0LnNsaWNlKDEsMStuKSx0LnNsaWNlKDErbiwxKzIqbikpO2lmKCgyPT09dFswXXx8Mz09PXRbMF0pJiZ0Lmxlbmd0aC0xPT09bilyZXR1cm4gdGhpcy5wb2ludEZyb21YKHQuc2xpY2UoMSwxK24pLDM9PT10WzBdKTt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcG9pbnQgZm9ybWF0Iil9LGMucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5jb2RlKHQsITApfSxjLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCksbj10aGlzLmdldFgoKS50b0FycmF5KCJiZSIsZSk7cmV0dXJuIHQ/W3RoaXMuZ2V0WSgpLmlzRXZlbigpPzI6M10uY29uY2F0KG4pOls0XS5jb25jYXQobix0aGlzLmdldFkoKS50b0FycmF5KCJiZSIsZSkpfSxjLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5lbmNvZGUodGhpcy5fZW5jb2RlKGUpLHQpfSxjLnByb3RvdHlwZS5wcmVjb21wdXRlPWZ1bmN0aW9uKHQpe2lmKHRoaXMucHJlY29tcHV0ZWQpcmV0dXJuIHRoaXM7dmFyIGU9e2RvdWJsZXM6bnVsbCxuYWY6bnVsbCxiZXRhOm51bGx9O3JldHVybiBlLm5hZj10aGlzLl9nZXROQUZQb2ludHMoOCksZS5kb3VibGVzPXRoaXMuX2dldERvdWJsZXMoNCx0KSxlLmJldGE9dGhpcy5fZ2V0QmV0YSgpLHRoaXMucHJlY29tcHV0ZWQ9ZSx0aGlzfSxjLnByb3RvdHlwZS5faGFzRG91Ymxlcz1mdW5jdGlvbih0KXtpZighdGhpcy5wcmVjb21wdXRlZClyZXR1cm4hMTt2YXIgZT10aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7cmV0dXJuISFlJiZlLnBvaW50cy5sZW5ndGg+PU1hdGguY2VpbCgodC5iaXRMZW5ndGgoKSsxKS9lLnN0ZXApfSxjLnByb3RvdHlwZS5fZ2V0RG91Ymxlcz1mdW5jdGlvbih0LGUpe2lmKHRoaXMucHJlY29tcHV0ZWQmJnRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylyZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO2Zvcih2YXIgbj1bdGhpc10saT10aGlzLHI9MDtyPGU7cis9dCl7Zm9yKHZhciBvPTA7bzx0O28rKylpPWkuZGJsKCk7bi5wdXNoKGkpfXJldHVybntzdGVwOnQscG9pbnRzOm59fSxjLnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzPWZ1bmN0aW9uKHQpe2lmKHRoaXMucHJlY29tcHV0ZWQmJnRoaXMucHJlY29tcHV0ZWQubmFmKXJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtmb3IodmFyIGU9W3RoaXNdLG49KDE8PHQpLTEsaT0xPT09bj9udWxsOnRoaXMuZGJsKCkscj0xO3I8bjtyKyspZVtyXT1lW3ItMV0uYWRkKGkpO3JldHVybnt3bmQ6dCxwb2ludHM6ZX19LGMucHJvdG90eXBlLl9nZXRCZXRhPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGMucHJvdG90eXBlLmRibHA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248dDtuKyspZT1lLmRibCgpO3JldHVybiBlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDQ4KSxyPW4oMTApLG89bigzKSxzPW4oMCksYT1pLmJhc2UsdT1yLnV0aWxzLmFzc2VydDtmdW5jdGlvbiBjKHQpe2EuY2FsbCh0aGlzLCJzaG9ydCIsdCksdGhpcy5hPW5ldyBvKHQuYSwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuYj1uZXcgbyh0LmIsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLnRpbnY9dGhpcy50d28ucmVkSW52bSgpLHRoaXMuemVyb0E9MD09PXRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSx0aGlzLnRocmVlQT0wPT09dGhpcy5hLmZyb21SZWQoKS5zdWIodGhpcy5wKS5jbXBuKC0zKSx0aGlzLmVuZG89dGhpcy5fZ2V0RW5kb21vcnBoaXNtKHQpLHRoaXMuX2VuZG9XbmFmVDE9bmV3IEFycmF5KDQpLHRoaXMuX2VuZG9XbmFmVDI9bmV3IEFycmF5KDQpfWZ1bmN0aW9uIGgodCxlLG4saSl7YS5CYXNlUG9pbnQuY2FsbCh0aGlzLHQsImFmZmluZSIpLG51bGw9PT1lJiZudWxsPT09bj8odGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy5pbmY9ITApOih0aGlzLng9bmV3IG8oZSwxNiksdGhpcy55PW5ldyBvKG4sMTYpLGkmJih0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpLHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLmluZj0hMSl9ZnVuY3Rpb24gbCh0LGUsbixpKXthLkJhc2VQb2ludC5jYWxsKHRoaXMsdCwiamFjb2JpYW4iKSxudWxsPT09ZSYmbnVsbD09PW4mJm51bGw9PT1pPyh0aGlzLng9dGhpcy5jdXJ2ZS5vbmUsdGhpcy55PXRoaXMuY3VydmUub25lLHRoaXMuej1uZXcgbygwKSk6KHRoaXMueD1uZXcgbyhlLDE2KSx0aGlzLnk9bmV3IG8obiwxNiksdGhpcy56PW5ldyBvKGksMTYpKSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueS5yZWR8fCh0aGlzLnk9dGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy56LnJlZHx8KHRoaXMuej10aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnpPbmU9dGhpcy56PT09dGhpcy5jdXJ2ZS5vbmV9cyhjLGEpLHQuZXhwb3J0cz1jLGMucHJvdG90eXBlLl9nZXRFbmRvbW9ycGhpc209ZnVuY3Rpb24odCl7aWYodGhpcy56ZXJvQSYmdGhpcy5nJiZ0aGlzLm4mJjE9PT10aGlzLnAubW9kbigzKSl7dmFyIGUsbjtpZih0LmJldGEpZT1uZXcgbyh0LmJldGEsMTYpLnRvUmVkKHRoaXMucmVkKTtlbHNle3ZhciBpPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO2U9KGU9aVswXS5jbXAoaVsxXSk8MD9pWzBdOmlbMV0pLnRvUmVkKHRoaXMucmVkKX1pZih0LmxhbWJkYSluPW5ldyBvKHQubGFtYmRhLDE2KTtlbHNle3ZhciByPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pOzA9PT10aGlzLmcubXVsKHJbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChlKSk/bj1yWzBdOihuPXJbMV0sdSgwPT09dGhpcy5nLm11bChuKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoZSkpKSl9cmV0dXJue2JldGE6ZSxsYW1iZGE6bixiYXNpczp0LmJhc2lzP3QuYmFzaXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybnthOm5ldyBvKHQuYSwxNiksYjpuZXcgbyh0LmIsMTYpfX0pOnRoaXMuX2dldEVuZG9CYXNpcyhuKX19fSxjLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ9PT10aGlzLnA/dGhpcy5yZWQ6by5tb250KHQpLG49bmV3IG8oMikudG9SZWQoZSkucmVkSW52bSgpLGk9bi5yZWROZWcoKSxyPW5ldyBvKDMpLnRvUmVkKGUpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwobik7cmV0dXJuW2kucmVkQWRkKHIpLmZyb21SZWQoKSxpLnJlZFN1YihyKS5mcm9tUmVkKCldfSxjLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLGkscixzLGEsdSxjLGgsbD10aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkvMikpLGQ9dCxmPXRoaXMubi5jbG9uZSgpLHA9bmV3IG8oMSksbT1uZXcgbygwKSxnPW5ldyBvKDApLHY9bmV3IG8oMSksYj0wOzAhPT1kLmNtcG4oMCk7KXt2YXIgeT1mLmRpdihkKTtjPWYuc3ViKHkubXVsKGQpKSxoPWcuc3ViKHkubXVsKHApKTt2YXIgXz12LnN1Yih5Lm11bChtKSk7aWYoIWkmJmMuY21wKGwpPDApZT11Lm5lZygpLG49cCxpPWMubmVnKCkscj1oO2Vsc2UgaWYoaSYmMj09KytiKWJyZWFrO3U9YyxmPWQsZD1jLGc9cCxwPWgsdj1tLG09X31zPWMubmVnKCksYT1oO3ZhciB3PWkuc3FyKCkuYWRkKHIuc3FyKCkpO3JldHVybiBzLnNxcigpLmFkZChhLnNxcigpKS5jbXAodyk+PTAmJihzPWUsYT1uKSxpLm5lZ2F0aXZlJiYoaT1pLm5lZygpLHI9ci5uZWcoKSkscy5uZWdhdGl2ZSYmKHM9cy5uZWcoKSxhPWEubmVnKCkpLFt7YTppLGI6cn0se2E6cyxiOmF9XX0sYy5wcm90b3R5cGUuX2VuZG9TcGxpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVuZG8uYmFzaXMsbj1lWzBdLGk9ZVsxXSxyPWkuYi5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxvPW4uYi5uZWcoKS5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxzPXIubXVsKG4uYSksYT1vLm11bChpLmEpLHU9ci5tdWwobi5iKSxjPW8ubXVsKGkuYik7cmV0dXJue2sxOnQuc3ViKHMpLnN1YihhKSxrMjp1LmFkZChjKS5uZWcoKX19LGMucHJvdG90eXBlLnBvaW50RnJvbVg9ZnVuY3Rpb24odCxlKXsodD1uZXcgbyh0LDE2KSkucmVkfHwodD10LnRvUmVkKHRoaXMucmVkKSk7dmFyIG49dC5yZWRTcXIoKS5yZWRNdWwodCkucmVkSUFkZCh0LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYiksaT1uLnJlZFNxcnQoKTtpZigwIT09aS5yZWRTcXIoKS5yZWRTdWIobikuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvaW50Iik7dmFyIHI9aS5mcm9tUmVkKCkuaXNPZGQoKTtyZXR1cm4oZSYmIXJ8fCFlJiZyKSYmKGk9aS5yZWROZWcoKSksdGhpcy5wb2ludCh0LGkpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtpZih0LmluZilyZXR1cm4hMDt2YXIgZT10Lngsbj10LnksaT10aGlzLmEucmVkTXVsKGUpLHI9ZS5yZWRTcXIoKS5yZWRNdWwoZSkucmVkSUFkZChpKS5yZWRJQWRkKHRoaXMuYik7cmV0dXJuIDA9PT1uLnJlZFNxcigpLnJlZElTdWIocikuY21wbigwKX0sYy5wcm90b3R5cGUuX2VuZG9XbmFmTXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcy5fZW5kb1duYWZUMSxyPXRoaXMuX2VuZG9XbmFmVDIsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcz10aGlzLl9lbmRvU3BsaXQoZVtvXSksYT10W29dLHU9YS5fZ2V0QmV0YSgpO3MuazEubmVnYXRpdmUmJihzLmsxLmluZWcoKSxhPWEubmVnKCEwKSkscy5rMi5uZWdhdGl2ZSYmKHMuazIuaW5lZygpLHU9dS5uZWcoITApKSxpWzIqb109YSxpWzIqbysxXT11LHJbMipvXT1zLmsxLHJbMipvKzFdPXMuazJ9Zm9yKHZhciBjPXRoaXMuX3duYWZNdWxBZGQoMSxpLHIsMipvLG4pLGg9MDtoPDIqbztoKyspaVtoXT1udWxsLHJbaF09bnVsbDtyZXR1cm4gY30scyhoLGEuQmFzZVBvaW50KSxjLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBoKHRoaXMsdCxlLG4pfSxjLnByb3RvdHlwZS5wb2ludEZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGguZnJvbUpTT04odGhpcyx0LGUpfSxoLnByb3RvdHlwZS5fZ2V0QmV0YT1mdW5jdGlvbigpe2lmKHRoaXMuY3VydmUuZW5kbyl7dmFyIHQ9dGhpcy5wcmVjb21wdXRlZDtpZih0JiZ0LmJldGEpcmV0dXJuIHQuYmV0YTt2YXIgZT10aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLHRoaXMueSk7aWYodCl7dmFyIG49dGhpcy5jdXJ2ZSxpPWZ1bmN0aW9uKHQpe3JldHVybiBuLnBvaW50KHQueC5yZWRNdWwobi5lbmRvLmJldGEpLHQueSl9O3QuYmV0YT1lLGUucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxuYWY6dC5uYWYmJnt3bmQ6dC5uYWYud25kLHBvaW50czp0Lm5hZi5wb2ludHMubWFwKGkpfSxkb3VibGVzOnQuZG91YmxlcyYme3N0ZXA6dC5kb3VibGVzLnN0ZXAscG9pbnRzOnQuZG91Ymxlcy5wb2ludHMubWFwKGkpfX19cmV0dXJuIGV9fSxoLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmVjb21wdXRlZD9bdGhpcy54LHRoaXMueSx0aGlzLnByZWNvbXB1dGVkJiZ7ZG91Ymxlczp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMmJntzdGVwOnRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpfSxuYWY6dGhpcy5wcmVjb21wdXRlZC5uYWYmJnt3bmQ6dGhpcy5wcmVjb21wdXRlZC5uYWYud25kLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSl9fV06W3RoaXMueCx0aGlzLnldfSxoLmZyb21KU09OPWZ1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpO3ZhciBpPXQucG9pbnQoZVswXSxlWzFdLG4pO2lmKCFlWzJdKXJldHVybiBpO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQucG9pbnQoZVswXSxlWzFdLG4pfXZhciBvPWVbMl07cmV0dXJuIGkucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxkb3VibGVzOm8uZG91YmxlcyYme3N0ZXA6by5kb3VibGVzLnN0ZXAscG9pbnRzOltpXS5jb25jYXQoby5kb3VibGVzLnBvaW50cy5tYXAocikpfSxuYWY6by5uYWYmJnt3bmQ6by5uYWYud25kLHBvaW50czpbaV0uY29uY2F0KG8ubmFmLnBvaW50cy5tYXAocikpfX0saX0saC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT8iPEVDIFBvaW50IEluZmluaXR5PiI6IjxFQyBQb2ludCB4OiAiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIiB5OiAiK3RoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIj4ifSxoLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5mfSxoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pbmYpcmV0dXJuIHQ7aWYodC5pbmYpcmV0dXJuIHRoaXM7aWYodGhpcy5lcSh0KSlyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLm5lZygpLmVxKHQpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7aWYoMD09PXRoaXMueC5jbXAodC54KSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciBlPXRoaXMueS5yZWRTdWIodC55KTswIT09ZS5jbXBuKDApJiYoZT1lLnJlZE11bCh0aGlzLngucmVkU3ViKHQueCkucmVkSW52bSgpKSk7dmFyIG49ZS5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1Yih0LngpLGk9ZS5yZWRNdWwodGhpcy54LnJlZFN1YihuKSkucmVkSVN1Yih0aGlzLnkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG4saSl9LGgucHJvdG90eXBlLmRibD1mdW5jdGlvbigpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzO3ZhciB0PXRoaXMueS5yZWRBZGQodGhpcy55KTtpZigwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIGU9dGhpcy5jdXJ2ZS5hLG49dGhpcy54LnJlZFNxcigpLGk9dC5yZWRJbnZtKCkscj1uLnJlZEFkZChuKS5yZWRJQWRkKG4pLnJlZElBZGQoZSkucmVkTXVsKGkpLG89ci5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSkscz1yLnJlZE11bCh0aGlzLngucmVkU3ViKG8pKS5yZWRJU3ViKHRoaXMueSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobyxzKX0saC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnguZnJvbVJlZCgpfSxoLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueS5mcm9tUmVkKCl9LGgucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgbyh0LDE2KSx0aGlzLl9oYXNEb3VibGVzKHQpP3RoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsdCk6dGhpcy5jdXJ2ZS5lbmRvP3RoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFt0aGlzXSxbdF0pOnRoaXMuY3VydmUuX3duYWZNdWwodGhpcyx0KX0saC5wcm90b3R5cGUubXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bdGhpcyxlXSxyPVt0LG5dO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoaSxyKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsaSxyLDIpfSxoLnByb3RvdHlwZS5qbXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bdGhpcyxlXSxyPVt0LG5dO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoaSxyLCEwKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsaSxyLDIsITApfSxoLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuaW5mPT09dC5pbmYmJih0aGlzLmluZnx8MD09PXRoaXMueC5jbXAodC54KSYmMD09PXRoaXMueS5jbXAodC55KSl9LGgucHJvdG90eXBlLm5lZz1mdW5jdGlvbih0KXtpZih0aGlzLmluZilyZXR1cm4gdGhpczt2YXIgZT10aGlzLmN1cnZlLnBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCkpO2lmKHQmJnRoaXMucHJlY29tcHV0ZWQpe3ZhciBuPXRoaXMucHJlY29tcHV0ZWQsaT1mdW5jdGlvbih0KXtyZXR1cm4gdC5uZWcoKX07ZS5wcmVjb21wdXRlZD17bmFmOm4ubmFmJiZ7d25kOm4ubmFmLnduZCxwb2ludHM6bi5uYWYucG9pbnRzLm1hcChpKX0sZG91YmxlczpuLmRvdWJsZXMmJntzdGVwOm4uZG91Ymxlcy5zdGVwLHBvaW50czpuLmRvdWJsZXMucG9pbnRzLm1hcChpKX19fXJldHVybiBlfSxoLnByb3RvdHlwZS50b0o9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmY/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnksdGhpcy5jdXJ2ZS5vbmUpfSxzKGwsYS5CYXNlUG9pbnQpLGMucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBsKHRoaXMsdCxlLG4pfSxsLnByb3RvdHlwZS50b1A9ZnVuY3Rpb24oKXtpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciB0PXRoaXMuei5yZWRJbnZtKCksZT10LnJlZFNxcigpLG49dGhpcy54LnJlZE11bChlKSxpPXRoaXMueS5yZWRNdWwoZSkucmVkTXVsKHQpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG4saSl9LGwucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsdGhpcy55LnJlZE5lZygpLHRoaXMueil9LGwucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdDtpZih0LmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpczt2YXIgZT10LnoucmVkU3FyKCksbj10aGlzLnoucmVkU3FyKCksaT10aGlzLngucmVkTXVsKGUpLHI9dC54LnJlZE11bChuKSxvPXRoaXMueS5yZWRNdWwoZS5yZWRNdWwodC56KSkscz10LnkucmVkTXVsKG4ucmVkTXVsKHRoaXMueikpLGE9aS5yZWRTdWIociksdT1vLnJlZFN1YihzKTtpZigwPT09YS5jbXBuKDApKXJldHVybiAwIT09dS5jbXBuKDApP3RoaXMuY3VydmUuanBvaW50KG51bGwsbnVsbCxudWxsKTp0aGlzLmRibCgpO3ZhciBjPWEucmVkU3FyKCksaD1jLnJlZE11bChhKSxsPWkucmVkTXVsKGMpLGQ9dS5yZWRTcXIoKS5yZWRJQWRkKGgpLnJlZElTdWIobCkucmVkSVN1YihsKSxmPXUucmVkTXVsKGwucmVkSVN1YihkKSkucmVkSVN1YihvLnJlZE11bChoKSkscD10aGlzLnoucmVkTXVsKHQueikucmVkTXVsKGEpO3JldHVybiB0aGlzLmN1cnZlLmpwb2ludChkLGYscCl9LGwucHJvdG90eXBlLm1peGVkQWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0LnRvSigpO2lmKHQuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXRoaXMueCxpPXQueC5yZWRNdWwoZSkscj10aGlzLnksbz10LnkucmVkTXVsKGUpLnJlZE11bCh0aGlzLnopLHM9bi5yZWRTdWIoaSksYT1yLnJlZFN1YihvKTtpZigwPT09cy5jbXBuKDApKXJldHVybiAwIT09YS5jbXBuKDApP3RoaXMuY3VydmUuanBvaW50KG51bGwsbnVsbCxudWxsKTp0aGlzLmRibCgpO3ZhciB1PXMucmVkU3FyKCksYz11LnJlZE11bChzKSxoPW4ucmVkTXVsKHUpLGw9YS5yZWRTcXIoKS5yZWRJQWRkKGMpLnJlZElTdWIoaCkucmVkSVN1YihoKSxkPWEucmVkTXVsKGgucmVkSVN1YihsKSkucmVkSVN1YihyLnJlZE11bChjKSksZj10aGlzLnoucmVkTXVsKHMpO3JldHVybiB0aGlzLmN1cnZlLmpwb2ludChsLGQsZil9LGwucHJvdG90eXBlLmRibHA9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIHRoaXM7aWYodGhpcy5pc0luZmluaXR5KCkpcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuZGJsKCk7aWYodGhpcy5jdXJ2ZS56ZXJvQXx8dGhpcy5jdXJ2ZS50aHJlZUEpe2Zvcih2YXIgZT10aGlzLG49MDtuPHQ7bisrKWU9ZS5kYmwoKTtyZXR1cm4gZX12YXIgaT10aGlzLmN1cnZlLmEscj10aGlzLmN1cnZlLnRpbnYsbz10aGlzLngscz10aGlzLnksYT10aGlzLnosdT1hLnJlZFNxcigpLnJlZFNxcigpLGM9cy5yZWRBZGQocyk7Zm9yKG49MDtuPHQ7bisrKXt2YXIgaD1vLnJlZFNxcigpLGw9Yy5yZWRTcXIoKSxkPWwucmVkU3FyKCksZj1oLnJlZEFkZChoKS5yZWRJQWRkKGgpLnJlZElBZGQoaS5yZWRNdWwodSkpLHA9by5yZWRNdWwobCksbT1mLnJlZFNxcigpLnJlZElTdWIocC5yZWRBZGQocCkpLGc9cC5yZWRJU3ViKG0pLHY9Zi5yZWRNdWwoZyk7dj12LnJlZElBZGQodikucmVkSVN1YihkKTt2YXIgYj1jLnJlZE11bChhKTtuKzE8dCYmKHU9dS5yZWRNdWwoZCkpLG89bSxhPWIsYz12fXJldHVybiB0aGlzLmN1cnZlLmpwb2ludChvLGMucmVkTXVsKHIpLGEpfSxsLnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLnplcm9BP3RoaXMuX3plcm9EYmwoKTp0aGlzLmN1cnZlLnRocmVlQT90aGlzLl90aHJlZURibCgpOnRoaXMuX2RibCgpfSxsLnByb3RvdHlwZS5femVyb0RibD1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZih0aGlzLnpPbmUpe3ZhciBpPXRoaXMueC5yZWRTcXIoKSxyPXRoaXMueS5yZWRTcXIoKSxvPXIucmVkU3FyKCkscz10aGlzLngucmVkQWRkKHIpLnJlZFNxcigpLnJlZElTdWIoaSkucmVkSVN1YihvKTtzPXMucmVkSUFkZChzKTt2YXIgYT1pLnJlZEFkZChpKS5yZWRJQWRkKGkpLHU9YS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyksYz1vLnJlZElBZGQobyk7Yz0oYz1jLnJlZElBZGQoYykpLnJlZElBZGQoYyksdD11LGU9YS5yZWRNdWwocy5yZWRJU3ViKHUpKS5yZWRJU3ViKGMpLG49dGhpcy55LnJlZEFkZCh0aGlzLnkpfWVsc2V7dmFyIGg9dGhpcy54LnJlZFNxcigpLGw9dGhpcy55LnJlZFNxcigpLGQ9bC5yZWRTcXIoKSxmPXRoaXMueC5yZWRBZGQobCkucmVkU3FyKCkucmVkSVN1YihoKS5yZWRJU3ViKGQpO2Y9Zi5yZWRJQWRkKGYpO3ZhciBwPWgucmVkQWRkKGgpLnJlZElBZGQoaCksbT1wLnJlZFNxcigpLGc9ZC5yZWRJQWRkKGQpO2c9KGc9Zy5yZWRJQWRkKGcpKS5yZWRJQWRkKGcpLHQ9bS5yZWRJU3ViKGYpLnJlZElTdWIoZiksZT1wLnJlZE11bChmLnJlZElTdWIodCkpLnJlZElTdWIoZyksbj0obj10aGlzLnkucmVkTXVsKHRoaXMueikpLnJlZElBZGQobil9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxuKX0sbC5wcm90b3R5cGUuX3RocmVlRGJsPWZ1bmN0aW9uKCl7dmFyIHQsZSxuO2lmKHRoaXMuek9uZSl7dmFyIGk9dGhpcy54LnJlZFNxcigpLHI9dGhpcy55LnJlZFNxcigpLG89ci5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQocikucmVkU3FyKCkucmVkSVN1YihpKS5yZWRJU3ViKG8pO3M9cy5yZWRJQWRkKHMpO3ZhciBhPWkucmVkQWRkKGkpLnJlZElBZGQoaSkucmVkSUFkZCh0aGlzLmN1cnZlLmEpLHU9YS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7dD11O3ZhciBjPW8ucmVkSUFkZChvKTtjPShjPWMucmVkSUFkZChjKSkucmVkSUFkZChjKSxlPWEucmVkTXVsKHMucmVkSVN1Yih1KSkucmVkSVN1YihjKSxuPXRoaXMueS5yZWRBZGQodGhpcy55KX1lbHNle3ZhciBoPXRoaXMuei5yZWRTcXIoKSxsPXRoaXMueS5yZWRTcXIoKSxkPXRoaXMueC5yZWRNdWwobCksZj10aGlzLngucmVkU3ViKGgpLnJlZE11bCh0aGlzLngucmVkQWRkKGgpKTtmPWYucmVkQWRkKGYpLnJlZElBZGQoZik7dmFyIHA9ZC5yZWRJQWRkKGQpLG09KHA9cC5yZWRJQWRkKHApKS5yZWRBZGQocCk7dD1mLnJlZFNxcigpLnJlZElTdWIobSksbj10aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihsKS5yZWRJU3ViKGgpO3ZhciBnPWwucmVkU3FyKCk7Zz0oZz0oZz1nLnJlZElBZGQoZykpLnJlZElBZGQoZykpLnJlZElBZGQoZyksZT1mLnJlZE11bChwLnJlZElTdWIodCkpLnJlZElTdWIoZyl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxuKX0sbC5wcm90b3R5cGUuX2RibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VydmUuYSxlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPWkucmVkU3FyKCkucmVkU3FyKCksbz1lLnJlZFNxcigpLHM9bi5yZWRTcXIoKSxhPW8ucmVkQWRkKG8pLnJlZElBZGQobykucmVkSUFkZCh0LnJlZE11bChyKSksdT1lLnJlZEFkZChlKSxjPSh1PXUucmVkSUFkZCh1KSkucmVkTXVsKHMpLGg9YS5yZWRTcXIoKS5yZWRJU3ViKGMucmVkQWRkKGMpKSxsPWMucmVkSVN1YihoKSxkPXMucmVkU3FyKCk7ZD0oZD0oZD1kLnJlZElBZGQoZCkpLnJlZElBZGQoZCkpLnJlZElBZGQoZCk7dmFyIGY9YS5yZWRNdWwobCkucmVkSVN1YihkKSxwPW4ucmVkQWRkKG4pLnJlZE11bChpKTtyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoaCxmLHApfSxsLnByb3RvdHlwZS50cnBsPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY3VydmUuemVyb0EpcmV0dXJuIHRoaXMuZGJsKCkuYWRkKHRoaXMpO3ZhciB0PXRoaXMueC5yZWRTcXIoKSxlPXRoaXMueS5yZWRTcXIoKSxuPXRoaXMuei5yZWRTcXIoKSxpPWUucmVkU3FyKCkscj10LnJlZEFkZCh0KS5yZWRJQWRkKHQpLG89ci5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQoZSkucmVkU3FyKCkucmVkSVN1Yih0KS5yZWRJU3ViKGkpLGE9KHM9KHM9KHM9cy5yZWRJQWRkKHMpKS5yZWRBZGQocykucmVkSUFkZChzKSkucmVkSVN1YihvKSkucmVkU3FyKCksdT1pLnJlZElBZGQoaSk7dT0odT0odT11LnJlZElBZGQodSkpLnJlZElBZGQodSkpLnJlZElBZGQodSk7dmFyIGM9ci5yZWRJQWRkKHMpLnJlZFNxcigpLnJlZElTdWIobykucmVkSVN1YihhKS5yZWRJU3ViKHUpLGg9ZS5yZWRNdWwoYyk7aD0oaD1oLnJlZElBZGQoaCkpLnJlZElBZGQoaCk7dmFyIGw9dGhpcy54LnJlZE11bChhKS5yZWRJU3ViKGgpO2w9KGw9bC5yZWRJQWRkKGwpKS5yZWRJQWRkKGwpO3ZhciBkPXRoaXMueS5yZWRNdWwoYy5yZWRNdWwodS5yZWRJU3ViKGMpKS5yZWRJU3ViKHMucmVkTXVsKGEpKSk7ZD0oZD0oZD1kLnJlZElBZGQoZCkpLnJlZElBZGQoZCkpLnJlZElBZGQoZCk7dmFyIGY9dGhpcy56LnJlZEFkZChzKS5yZWRTcXIoKS5yZWRJU3ViKG4pLnJlZElTdWIoYSk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGwsZCxmKX0sbC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bmV3IG8odCxlKSx0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsdCl9LGwucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe2lmKCJhZmZpbmUiPT09dC50eXBlKXJldHVybiB0aGlzLmVxKHQudG9KKCkpO2lmKHRoaXM9PT10KXJldHVybiEwO3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXQuei5yZWRTcXIoKTtpZigwIT09dGhpcy54LnJlZE11bChuKS5yZWRJU3ViKHQueC5yZWRNdWwoZSkpLmNtcG4oMCkpcmV0dXJuITE7dmFyIGk9ZS5yZWRNdWwodGhpcy56KSxyPW4ucmVkTXVsKHQueik7cmV0dXJuIDA9PT10aGlzLnkucmVkTXVsKHIpLnJlZElTdWIodC55LnJlZE11bChpKSkuY21wbigwKX0sbC5wcm90b3R5cGUuZXFYVG9QPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bChlKTtpZigwPT09dGhpcy54LmNtcChuKSlyZXR1cm4hMDtmb3IodmFyIGk9dC5jbG9uZSgpLHI9dGhpcy5jdXJ2ZS5yZWROLnJlZE11bChlKTs7KXtpZihpLmlhZGQodGhpcy5jdXJ2ZS5uKSxpLmNtcCh0aGlzLmN1cnZlLnApPj0wKXJldHVybiExO2lmKG4ucmVkSUFkZChyKSwwPT09dGhpcy54LmNtcChuKSlyZXR1cm4hMH19LGwucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/IjxFQyBKUG9pbnQgSW5maW5pdHk+IjoiPEVDIEpQb2ludCB4OiAiK3RoaXMueC50b1N0cmluZygxNiwyKSsiIHk6ICIrdGhpcy55LnRvU3RyaW5nKDE2LDIpKyIgejogIit0aGlzLnoudG9TdHJpbmcoMTYsMikrIj4ifSxsLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0OCkscj1uKDMpLG89bigwKSxzPWkuYmFzZSxhPW4oMTApLnV0aWxzO2Z1bmN0aW9uIHUodCl7cy5jYWxsKHRoaXMsIm1vbnQiLHQpLHRoaXMuYT1uZXcgcih0LmEsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmI9bmV3IHIodC5iLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5pND1uZXcgcig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpLHRoaXMudHdvPW5ldyByKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmEyND10aGlzLmk0LnJlZE11bCh0aGlzLmEucmVkQWRkKHRoaXMudHdvKSl9ZnVuY3Rpb24gYyh0LGUsbil7cy5CYXNlUG9pbnQuY2FsbCh0aGlzLHQsInByb2plY3RpdmUiKSxudWxsPT09ZSYmbnVsbD09PW4/KHRoaXMueD10aGlzLmN1cnZlLm9uZSx0aGlzLno9dGhpcy5jdXJ2ZS56ZXJvKToodGhpcy54PW5ldyByKGUsMTYpLHRoaXMuej1uZXcgcihuLDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSkpfW8odSxzKSx0LmV4cG9ydHM9dSx1LnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10Lm5vcm1hbGl6ZSgpLngsbj1lLnJlZFNxcigpLGk9bi5yZWRNdWwoZSkucmVkQWRkKG4ucmVkTXVsKHRoaXMuYSkpLnJlZEFkZChlKTtyZXR1cm4gMD09PWkucmVkU3FydCgpLnJlZFNxcigpLmNtcChpKX0sbyhjLHMuQmFzZVBvaW50KSx1LnByb3RvdHlwZS5kZWNvZGVQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBvaW50KGEudG9BcnJheSh0LGUpLDEpfSx1LnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgYyh0aGlzLHQsZSl9LHUucHJvdG90eXBlLnBvaW50RnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIGMuZnJvbUpTT04odGhpcyx0KX0sYy5wcm90b3R5cGUucHJlY29tcHV0ZT1mdW5jdGlvbigpe30sYy5wcm90b3R5cGUuX2VuY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFgoKS50b0FycmF5KCJiZSIsdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSl9LGMuZnJvbUpTT049ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGModCxlWzBdLGVbMV18fHQub25lKX0sYy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT8iPEVDIFBvaW50IEluZmluaXR5PiI6IjxFQyBQb2ludCB4OiAiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIiB6OiAiK3RoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIj4ifSxjLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX0sYy5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLGU9dGhpcy54LnJlZFN1Yih0aGlzLnopLnJlZFNxcigpLG49dC5yZWRTdWIoZSksaT10LnJlZE11bChlKSxyPW4ucmVkTXVsKGUucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChuKSkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KGkscil9LGMucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LGMucHJvdG90eXBlLmRpZmZBZGQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLngucmVkQWRkKHRoaXMueiksaT10aGlzLngucmVkU3ViKHRoaXMueikscj10LngucmVkQWRkKHQueiksbz10LngucmVkU3ViKHQueikucmVkTXVsKG4pLHM9ci5yZWRNdWwoaSksYT1lLnoucmVkTXVsKG8ucmVkQWRkKHMpLnJlZFNxcigpKSx1PWUueC5yZWRNdWwoby5yZWRJU3ViKHMpLnJlZFNxcigpKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChhLHUpfSxjLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuY2xvbmUoKSxuPXRoaXMsaT10aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCkscj1bXTswIT09ZS5jbXBuKDApO2UuaXVzaHJuKDEpKXIucHVzaChlLmFuZGxuKDEpKTtmb3IodmFyIG89ci5sZW5ndGgtMTtvPj0wO28tLSkwPT09cltvXT8obj1uLmRpZmZBZGQoaSx0aGlzKSxpPWkuZGJsKCkpOihpPW4uZGlmZkFkZChpLHRoaXMpLG49bi5kYmwoKSk7cmV0dXJuIGl9LGMucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LGMucHJvdG90eXBlLmp1bWxBZGQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZSIpfSxjLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuZ2V0WCgpLmNtcCh0LmdldFgoKSl9LGMucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLng9dGhpcy54LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpc30sYy5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLHRoaXMueC5mcm9tUmVkKCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oNDgpLHI9bigxMCksbz1uKDMpLHM9bigwKSxhPWkuYmFzZSx1PXIudXRpbHMuYXNzZXJ0O2Z1bmN0aW9uIGModCl7dGhpcy50d2lzdGVkPTEhPSgwfHQuYSksdGhpcy5tT25lQT10aGlzLnR3aXN0ZWQmJi0xPT0oMHx0LmEpLHRoaXMuZXh0ZW5kZWQ9dGhpcy5tT25lQSxhLmNhbGwodGhpcywiZWR3YXJkcyIsdCksdGhpcy5hPW5ldyBvKHQuYSwxNikudW1vZCh0aGlzLnJlZC5tKSx0aGlzLmE9dGhpcy5hLnRvUmVkKHRoaXMucmVkKSx0aGlzLmM9bmV3IG8odC5jLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5jMj10aGlzLmMucmVkU3FyKCksdGhpcy5kPW5ldyBvKHQuZCwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuZGQ9dGhpcy5kLnJlZEFkZCh0aGlzLmQpLHUoIXRoaXMudHdpc3RlZHx8MD09PXRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSksdGhpcy5vbmVDPTE9PSgwfHQuYyl9ZnVuY3Rpb24gaCh0LGUsbixpLHIpe2EuQmFzZVBvaW50LmNhbGwodGhpcyx0LCJwcm9qZWN0aXZlIiksbnVsbD09PWUmJm51bGw9PT1uJiZudWxsPT09aT8odGhpcy54PXRoaXMuY3VydmUuemVybyx0aGlzLnk9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXMudD10aGlzLmN1cnZlLnplcm8sdGhpcy56T25lPSEwKToodGhpcy54PW5ldyBvKGUsMTYpLHRoaXMueT1uZXcgbyhuLDE2KSx0aGlzLno9aT9uZXcgbyhpLDE2KTp0aGlzLmN1cnZlLm9uZSx0aGlzLnQ9ciYmbmV3IG8ociwxNiksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnkucmVkfHwodGhpcy55PXRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy50JiYhdGhpcy50LnJlZCYmKHRoaXMudD10aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnpPbmU9dGhpcy56PT09dGhpcy5jdXJ2ZS5vbmUsdGhpcy5jdXJ2ZS5leHRlbmRlZCYmIXRoaXMudCYmKHRoaXMudD10aGlzLngucmVkTXVsKHRoaXMueSksdGhpcy56T25lfHwodGhpcy50PXRoaXMudC5yZWRNdWwodGhpcy56LnJlZEludm0oKSkpKSl9cyhjLGEpLHQuZXhwb3J0cz1jLGMucHJvdG90eXBlLl9tdWxBPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1PbmVBP3QucmVkTmVnKCk6dGhpcy5hLnJlZE11bCh0KX0sYy5wcm90b3R5cGUuX211bEM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub25lQz90OnRoaXMuYy5yZWRNdWwodCl9LGMucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5wb2ludCh0LGUsbixpKX0sYy5wcm90b3R5cGUucG9pbnRGcm9tWD1mdW5jdGlvbih0LGUpeyh0PW5ldyBvKHQsMTYpKS5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgbj10LnJlZFNxcigpLGk9dGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bChuKSkscj10aGlzLm9uZS5yZWRTdWIodGhpcy5jMi5yZWRNdWwodGhpcy5kKS5yZWRNdWwobikpLHM9aS5yZWRNdWwoci5yZWRJbnZtKCkpLGE9cy5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKHMpLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpO3ZhciB1PWEuZnJvbVJlZCgpLmlzT2RkKCk7cmV0dXJuKGUmJiF1fHwhZSYmdSkmJihhPWEucmVkTmVnKCkpLHRoaXMucG9pbnQodCxhKX0sYy5wcm90b3R5cGUucG9pbnRGcm9tWT1mdW5jdGlvbih0LGUpeyh0PW5ldyBvKHQsMTYpKS5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgbj10LnJlZFNxcigpLGk9bi5yZWRTdWIodGhpcy5jMikscj1uLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKSxzPWkucmVkTXVsKHIucmVkSW52bSgpKTtpZigwPT09cy5jbXAodGhpcy56ZXJvKSl7aWYoZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9pbnQiKTtyZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sdCl9dmFyIGE9cy5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKHMpLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpO3JldHVybiBhLmZyb21SZWQoKS5pc09kZCgpIT09ZSYmKGE9YS5yZWROZWcoKSksdGhpcy5wb2ludChhLHQpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtpZih0LmlzSW5maW5pdHkoKSlyZXR1cm4hMDt0Lm5vcm1hbGl6ZSgpO3ZhciBlPXQueC5yZWRTcXIoKSxuPXQueS5yZWRTcXIoKSxpPWUucmVkTXVsKHRoaXMuYSkucmVkQWRkKG4pLHI9dGhpcy5jMi5yZWRNdWwodGhpcy5vbmUucmVkQWRkKHRoaXMuZC5yZWRNdWwoZSkucmVkTXVsKG4pKSk7cmV0dXJuIDA9PT1pLmNtcChyKX0scyhoLGEuQmFzZVBvaW50KSxjLnByb3RvdHlwZS5wb2ludEZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBoLmZyb21KU09OKHRoaXMsdCl9LGMucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBuZXcgaCh0aGlzLHQsZSxuLGkpfSxoLmZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBoKHQsZVswXSxlWzFdLGVbMl0pfSxoLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpPyI8RUMgUG9pbnQgSW5maW5pdHk+IjoiPEVDIFBvaW50IHg6ICIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHk6ICIrdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHo6ICIrdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiPiJ9LGgucHJvdG90eXBlLmlzSW5maW5pdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMueC5jbXBuKDApJiYoMD09PXRoaXMueS5jbXAodGhpcy56KXx8dGhpcy56T25lJiYwPT09dGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpKX0saC5wcm90b3R5cGUuX2V4dERibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC5yZWRTcXIoKSxlPXRoaXMueS5yZWRTcXIoKSxuPXRoaXMuei5yZWRTcXIoKTtuPW4ucmVkSUFkZChuKTt2YXIgaT10aGlzLmN1cnZlLl9tdWxBKHQpLHI9dGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIodCkucmVkSVN1YihlKSxvPWkucmVkQWRkKGUpLHM9by5yZWRTdWIobiksYT1pLnJlZFN1YihlKSx1PXIucmVkTXVsKHMpLGM9by5yZWRNdWwoYSksaD1yLnJlZE11bChhKSxsPXMucmVkTXVsKG8pO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHUsYyxsLGgpfSxoLnByb3RvdHlwZS5fcHJvakRibD1mdW5jdGlvbigpe3ZhciB0LGUsbixpPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKSxyPXRoaXMueC5yZWRTcXIoKSxvPXRoaXMueS5yZWRTcXIoKTtpZih0aGlzLmN1cnZlLnR3aXN0ZWQpe3ZhciBzPShjPXRoaXMuY3VydmUuX211bEEocikpLnJlZEFkZChvKTtpZih0aGlzLnpPbmUpdD1pLnJlZFN1YihyKS5yZWRTdWIobykucmVkTXVsKHMucmVkU3ViKHRoaXMuY3VydmUudHdvKSksZT1zLnJlZE11bChjLnJlZFN1YihvKSksbj1zLnJlZFNxcigpLnJlZFN1YihzKS5yZWRTdWIocyk7ZWxzZXt2YXIgYT10aGlzLnoucmVkU3FyKCksdT1zLnJlZFN1YihhKS5yZWRJU3ViKGEpO3Q9aS5yZWRTdWIocikucmVkSVN1YihvKS5yZWRNdWwodSksZT1zLnJlZE11bChjLnJlZFN1YihvKSksbj1zLnJlZE11bCh1KX19ZWxzZXt2YXIgYz1yLnJlZEFkZChvKTthPXRoaXMuY3VydmUuX211bEModGhpcy56KS5yZWRTcXIoKSx1PWMucmVkU3ViKGEpLnJlZFN1YihhKTt0PXRoaXMuY3VydmUuX211bEMoaS5yZWRJU3ViKGMpKS5yZWRNdWwodSksZT10aGlzLmN1cnZlLl9tdWxDKGMpLnJlZE11bChyLnJlZElTdWIobykpLG49Yy5yZWRNdWwodSl9cmV0dXJuIHRoaXMuY3VydmUucG9pbnQodCxlLG4pfSxoLnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dERibCgpOnRoaXMuX3Byb2pEYmwoKX0saC5wcm90b3R5cGUuX2V4dEFkZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHQueS5yZWRTdWIodC54KSksbj10aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHQueS5yZWRBZGQodC54KSksaT10aGlzLnQucmVkTXVsKHRoaXMuY3VydmUuZGQpLnJlZE11bCh0LnQpLHI9dGhpcy56LnJlZE11bCh0LnoucmVkQWRkKHQueikpLG89bi5yZWRTdWIoZSkscz1yLnJlZFN1YihpKSxhPXIucmVkQWRkKGkpLHU9bi5yZWRBZGQoZSksYz1vLnJlZE11bChzKSxoPWEucmVkTXVsKHUpLGw9by5yZWRNdWwodSksZD1zLnJlZE11bChhKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChjLGgsZCxsKX0saC5wcm90b3R5cGUuX3Byb2pBZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMuei5yZWRNdWwodC56KSxyPWkucmVkU3FyKCksbz10aGlzLngucmVkTXVsKHQueCkscz10aGlzLnkucmVkTXVsKHQueSksYT10aGlzLmN1cnZlLmQucmVkTXVsKG8pLnJlZE11bChzKSx1PXIucmVkU3ViKGEpLGM9ci5yZWRBZGQoYSksaD10aGlzLngucmVkQWRkKHRoaXMueSkucmVkTXVsKHQueC5yZWRBZGQodC55KSkucmVkSVN1YihvKS5yZWRJU3ViKHMpLGw9aS5yZWRNdWwodSkucmVkTXVsKGgpO3JldHVybiB0aGlzLmN1cnZlLnR3aXN0ZWQ/KGU9aS5yZWRNdWwoYykucmVkTXVsKHMucmVkU3ViKHRoaXMuY3VydmUuX211bEEobykpKSxuPXUucmVkTXVsKGMpKTooZT1pLnJlZE11bChjKS5yZWRNdWwocy5yZWRTdWIobykpLG49dGhpcy5jdXJ2ZS5fbXVsQyh1KS5yZWRNdWwoYykpLHRoaXMuY3VydmUucG9pbnQobCxlLG4pfSxoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP3Q6dC5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dEFkZCh0KTp0aGlzLl9wcm9qQWRkKHQpfSxoLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hhc0RvdWJsZXModCk/dGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcyx0KTp0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsdCl9LGgucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxuXSwyLCExKX0saC5wcm90b3R5cGUuam11bEFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxuXSwyLCEwKX0saC5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7aWYodGhpcy56T25lKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuei5yZWRJbnZtKCk7cmV0dXJuIHRoaXMueD10aGlzLngucmVkTXVsKHQpLHRoaXMueT10aGlzLnkucmVkTXVsKHQpLHRoaXMudCYmKHRoaXMudD10aGlzLnQucmVkTXVsKHQpKSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56T25lPSEwLHRoaXN9LGgucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSx0aGlzLnksdGhpcy56LHRoaXMudCYmdGhpcy50LnJlZE5lZygpKX0saC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLHRoaXMueC5mcm9tUmVkKCl9LGgucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnkuZnJvbVJlZCgpfSxoLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fDA9PT10aGlzLmdldFgoKS5jbXAodC5nZXRYKCkpJiYwPT09dGhpcy5nZXRZKCkuY21wKHQuZ2V0WSgpKX0saC5wcm90b3R5cGUuZXFYVG9QPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh0aGlzLnopO2lmKDA9PT10aGlzLnguY21wKGUpKXJldHVybiEwO2Zvcih2YXIgbj10LmNsb25lKCksaT10aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7Oyl7aWYobi5pYWRkKHRoaXMuY3VydmUubiksbi5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihlLnJlZElBZGQoaSksMD09PXRoaXMueC5jbXAoZSkpcmV0dXJuITB9fSxoLnByb3RvdHlwZS50b1A9aC5wcm90b3R5cGUubm9ybWFsaXplLGgucHJvdG90eXBlLm1peGVkQWRkPWgucHJvdG90eXBlLmFkZH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPWUsbz1uKDcwKSxzPW4oMTApLGE9cy51dGlscy5hc3NlcnQ7ZnVuY3Rpb24gdSh0KXsic2hvcnQiPT09dC50eXBlP3RoaXMuY3VydmU9bmV3IHMuY3VydmUuc2hvcnQodCk6ImVkd2FyZHMiPT09dC50eXBlP3RoaXMuY3VydmU9bmV3IHMuY3VydmUuZWR3YXJkcyh0KTp0aGlzLmN1cnZlPW5ldyBzLmN1cnZlLm1vbnQodCksdGhpcy5nPXRoaXMuY3VydmUuZyx0aGlzLm49dGhpcy5jdXJ2ZS5uLHRoaXMuaGFzaD10Lmhhc2gsYSh0aGlzLmcudmFsaWRhdGUoKSwiSW52YWxpZCBjdXJ2ZSIpLGEodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwiSW52YWxpZCBjdXJ2ZSwgRypOICE9IE8iKX1mdW5jdGlvbiBjKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsdCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIG49bmV3IHUoZSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59KSxufX0pfXIuUHJlc2V0Q3VydmU9dSxjKCJwMTkyIix7dHlwZToic2hvcnQiLHByaW1lOiJwMTkyIixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIsYToiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxIixuOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMSIsaGFzaDpvLnNoYTI1NixnUmVkOiExLGc6WyIxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMiIsIjA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExIl19KSxjKCJwMjI0Iix7dHlwZToic2hvcnQiLHByaW1lOiJwMjI0IixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIsYToiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUiLGI6ImI0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0IixuOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCIsaGFzaDpvLnNoYTI1NixnUmVkOiExLGc6WyJiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMSIsImJkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0Il19KSxjKCJwMjU2Iix7dHlwZToic2hvcnQiLHByaW1lOm51bGwscDoiZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYiLGE6ImZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjIixiOiI1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YiIsbjoiZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTEiLGhhc2g6by5zaGEyNTYsZ1JlZDohMSxnOlsiNmIxN2QxZjIgZTEyYzQyNDcgZjhiY2U2ZTUgNjNhNDQwZjIgNzcwMzdkODEgMmRlYjMzYTAgZjRhMTM5NDUgZDg5OGMyOTYiLCI0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNSJdfSksYygicDM4NCIse3R5cGU6InNob3J0IixwcmltZTpudWxsLHA6ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIixhOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYyIsYjoiYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYiLG46ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczIixoYXNoOm8uc2hhMzg0LGdSZWQ6ITEsZzpbImFhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4IDU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3IiwiMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYiXX0pLGMoInA1MjEiLHt0eXBlOiJzaG9ydCIscHJpbWU6bnVsbCxwOiIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiIsYToiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViIDk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkIDNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwIixuOiIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCBmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOSIsaGFzaDpvLnNoYTUxMixnUmVkOiExLGc6WyIwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyBhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NiIsIjAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5IDU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxIDNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwIl19KSxjKCJjdXJ2ZTI1NTE5Iix7dHlwZToibW9udCIscHJpbWU6InAyNTUxOSIscDoiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIsYToiNzZkMDYiLGI6IjEiLG46IjEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQiLGhhc2g6by5zaGEyNTYsZ1JlZDohMSxnOlsiOSJdfSksYygiZWQyNTUxOSIse3R5cGU6ImVkd2FyZHMiLHByaW1lOiJwMjU1MTkiLHA6IjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiLGE6Ii0xIixjOiIxIixkOiI1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzIixuOiIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkIixoYXNoOm8uc2hhMjU2LGdSZWQ6ITEsZzpbIjIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEiLCI2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4Il19KTt0cnl7aT1uKDIwMSl9Y2F0Y2godCl7aT12b2lkIDB9Yygic2VjcDI1NmsxIix7dHlwZToic2hvcnQiLHByaW1lOiJrMjU2IixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIsYToiMCIsYjoiNyIsbjoiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEiLGg6IjEiLGhhc2g6by5zaGEyNTYsYmV0YToiN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZSIsbGFtYmRhOiI1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyIixiYXNpczpbe2E6IjMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1IixiOiItZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMifSx7YToiMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4IixiOiIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSJ9XSxnUmVkOiExLGc6WyI3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4IiwiNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCIsaV19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLnNoYTE9bigxOTYpLGUuc2hhMjI0PW4oMTk3KSxlLnNoYTI1Nj1uKDEwOCksZS5zaGEzODQ9bigxOTgpLGUuc2hhNTEyPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMzQpLG89bigxMDcpLHM9aS5yb3RsMzIsYT1pLnN1bTMyLHU9aS5zdW0zMl81LGM9by5mdF8xLGg9ci5CbG9ja0hhc2gsbD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml07ZnVuY3Rpb24gZCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGQpKXJldHVybiBuZXcgZDtoLmNhbGwodGhpcyksdGhpcy5oPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0sdGhpcy5XPW5ldyBBcnJheSg4MCl9aS5pbmhlcml0cyhkLGgpLHQuZXhwb3J0cz1kLGQuYmxvY2tTaXplPTUxMixkLm91dFNpemU9MTYwLGQuaG1hY1N0cmVuZ3RoPTgwLGQucGFkTGVuZ3RoPTY0LGQucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5XLGk9MDtpPDE2O2krKyluW2ldPXRbZStpXTtmb3IoO2k8bi5sZW5ndGg7aSsrKW5baV09cyhuW2ktM11ebltpLThdXm5baS0xNF1ebltpLTE2XSwxKTt2YXIgcj10aGlzLmhbMF0sbz10aGlzLmhbMV0saD10aGlzLmhbMl0sZD10aGlzLmhbM10sZj10aGlzLmhbNF07Zm9yKGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHA9fn4oaS8yMCksbT11KHMociw1KSxjKHAsbyxoLGQpLGYsbltpXSxsW3BdKTtmPWQsZD1oLGg9cyhvLDMwKSxvPXIscj1tfXRoaXMuaFswXT1hKHRoaXMuaFswXSxyKSx0aGlzLmhbMV09YSh0aGlzLmhbMV0sbyksdGhpcy5oWzJdPWEodGhpcy5oWzJdLGgpLHRoaXMuaFszXT1hKHRoaXMuaFszXSxkKSx0aGlzLmhbNF09YSh0aGlzLmhbNF0sZil9LGQucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuImhleCI9PT10P2kudG9IZXgzMih0aGlzLmgsImJpZyIpOmkuc3BsaXQzMih0aGlzLmgsImJpZyIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTA4KTtmdW5jdGlvbiBvKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvO3IuY2FsbCh0aGlzKSx0aGlzLmg9WzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdfWkuaW5oZXJpdHMobyxyKSx0LmV4cG9ydHM9byxvLmJsb2NrU2l6ZT01MTIsby5vdXRTaXplPTIyNCxvLmhtYWNTdHJlbmd0aD0xOTIsby5wYWRMZW5ndGg9NjQsby5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaC5zbGljZSgwLDcpLCJiaWciKTppLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsNyksImJpZyIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTA5KTtmdW5jdGlvbiBvKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvO3IuY2FsbCh0aGlzKSx0aGlzLmg9WzM0MTgwNzAzNjUsMzIzODM3MTAzMiwxNjU0MjcwMjUwLDkxNDE1MDY2MywyNDM4NTI5MzcwLDgxMjcwMjk5OSwzNTU0NjIzNjAsNDE0NDkxMjY5NywxNzMxNDA1NDE1LDQyOTA3NzU4NTcsMjM5NDE4MDIzMSwxNzUwNjAzMDI1LDM2NzUwMDg1MjUsMTY5NDA3NjgzOSwxMjAzMDYyODEzLDMyMDQwNzU0MjhdfWkuaW5oZXJpdHMobyxyKSx0LmV4cG9ydHM9byxvLmJsb2NrU2l6ZT0xMDI0LG8ub3V0U2l6ZT0zODQsby5obWFjU3RyZW5ndGg9MTkyLG8ucGFkTGVuZ3RoPTEyOCxvLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVybiJoZXgiPT09dD9pLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsMTIpLCJiaWciKTppLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsMTIpLCJiaWciKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNykscj1uKDM0KSxvPWkucm90bDMyLHM9aS5zdW0zMixhPWkuc3VtMzJfMyx1PWkuc3VtMzJfNCxjPXIuQmxvY2tIYXNoO2Z1bmN0aW9uIGgoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBoKSlyZXR1cm4gbmV3IGg7Yy5jYWxsKHRoaXMpLHRoaXMuaD1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdLHRoaXMuZW5kaWFuPSJsaXR0bGUifWZ1bmN0aW9uIGwodCxlLG4saSl7cmV0dXJuIHQ8PTE1P2Vebl5pOnQ8PTMxP2Umbnx+ZSZpOnQ8PTQ3PyhlfH5uKV5pOnQ8PTYzP2UmaXxuJn5pOmVeKG58fmkpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIHQ8PTE1PzA6dDw9MzE/MTUxODUwMDI0OTp0PD00Nz8xODU5Nzc1MzkzOnQ8PTYzPzI0MDA5NTk3MDg6Mjg0MDg1MzgzOH1mdW5jdGlvbiBmKHQpe3JldHVybiB0PD0xNT8xMzUyODI5OTI2OnQ8PTMxPzE1NDg2MDM2ODQ6dDw9NDc/MTgzNjA3MjY5MTp0PD02Mz8yMDUzOTk0MjE3OjB9aS5pbmhlcml0cyhoLGMpLGUucmlwZW1kMTYwPWgsaC5ibG9ja1NpemU9NTEyLGgub3V0U2l6ZT0xNjAsaC5obWFjU3RyZW5ndGg9MTkyLGgucGFkTGVuZ3RoPTY0LGgucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5oWzBdLGk9dGhpcy5oWzFdLHI9dGhpcy5oWzJdLGM9dGhpcy5oWzNdLGg9dGhpcy5oWzRdLGI9bix5PWksXz1yLHc9Yyx4PWgsTT0wO008ODA7TSsrKXt2YXIgUz1zKG8odShuLGwoTSxpLHIsYyksdFtwW01dK2VdLGQoTSkpLGdbTV0pLGgpO249aCxoPWMsYz1vKHIsMTApLHI9aSxpPVMsUz1zKG8odShiLGwoNzktTSx5LF8sdyksdFttW01dK2VdLGYoTSkpLHZbTV0pLHgpLGI9eCx4PXcsdz1vKF8sMTApLF89eSx5PVN9Uz1hKHRoaXMuaFsxXSxyLHcpLHRoaXMuaFsxXT1hKHRoaXMuaFsyXSxjLHgpLHRoaXMuaFsyXT1hKHRoaXMuaFszXSxoLGIpLHRoaXMuaFszXT1hKHRoaXMuaFs0XSxuLHkpLHRoaXMuaFs0XT1hKHRoaXMuaFswXSxpLF8pLHRoaXMuaFswXT1TfSxoLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVybiJoZXgiPT09dD9pLnRvSGV4MzIodGhpcy5oLCJsaXR0bGUiKTppLnNwbGl0MzIodGhpcy5oLCJsaXR0bGUiKX07dmFyIHA9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10sbT1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxnPVsxMSwxNCwxNSwxMiw1LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSx2PVs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTQpO2Z1bmN0aW9uIG8odCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0LGUsbik7dGhpcy5IYXNoPXQsdGhpcy5ibG9ja1NpemU9dC5ibG9ja1NpemUvOCx0aGlzLm91dFNpemU9dC5vdXRTaXplLzgsdGhpcy5pbm5lcj1udWxsLHRoaXMub3V0ZXI9bnVsbCx0aGlzLl9pbml0KGkudG9BcnJheShlLG4pKX10LmV4cG9ydHM9byxvLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt0Lmxlbmd0aD50aGlzLmJsb2NrU2l6ZSYmKHQ9KG5ldyB0aGlzLkhhc2gpLnVwZGF0ZSh0KS5kaWdlc3QoKSkscih0Lmxlbmd0aDw9dGhpcy5ibG9ja1NpemUpO2Zvcih2YXIgZT10Lmxlbmd0aDtlPHRoaXMuYmxvY2tTaXplO2UrKyl0LnB1c2goMCk7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdXj01NDtmb3IodGhpcy5pbm5lcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpLGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdXj0xMDY7dGhpcy5vdXRlcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpfSxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUodCxlKSx0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2RvdWJsZXM6e3N0ZXA6NCxwb2ludHM6W1siZTYwZmNlOTNiNTllOWVjNTMwMTFhYWJjMjFjMjNlOTdiMmEzMTM2OWI4N2E1YWU5YzQ0ZWU4OWUyYTZkZWMwYSIsImY3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEiXSxbIjgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgiLCIxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmIl0sWyIxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5IiwiZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NSJdLFsiMzYzZDkwZDQ0N2IwMGM5Yzk5Y2VhYzA1YjYyNjJlZTA1MzQ0MWM3ZTU1NTUyZmZlNTI2YmFkOGY4M2ZmNDY0MCIsIjRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOSJdLFsiOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYyIsIjRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYiXSxbIjcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEiLCI5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmIl0sWyJlZWJmYTRkNDkzYmViZjk4YmE1ZmVlYzgxMmMyZDNiNTA5NDc5NjEyMzdhOTE5ODM5YTUzM2VjYTBlN2RkN2ZhIiwiNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OSJdLFsiMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCIsImNkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDkiXSxbImUxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQiLCI5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkIl0sWyJmZWVhNmNhZTQ2ZDU1YjUzMGFjMjgzOWYxNDNiZDdlYzVjZjhiMjY2YTQxZDZhZjUyZDVlNjg4ZDkwOTQ2OTZkIiwiZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCJdLFsiZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMSIsIjliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQiXSxbIjUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAiLCI1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4Il0sWyI4ZTdiY2QwYmQzNTk4M2E3NzE5Y2NhNzc2NGNhOTA2Nzc5YjUzYTA0M2E5YjhiY2FlZmY5NTlmNDNhZDg2MDQ3IiwiMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYSJdLFsiMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MiIsIjI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMiXSxbIjZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNyIsIjdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAiXSxbIjMzMjJkNDAxMjQzYzRlMjU4MmEyMTQ3YzEwNGQ2ZWNiZjc3NGQxNjNkYjBmNWU1MzEzYjdlMGU3NDJkMGU2YmQiLCI1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwIl0sWyI4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzIiwiN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNiJdLFsiOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhIiwiNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OSJdLFsiNjI2MGNlN2Y0NjE4MDFjMzRmMDY3Y2UwZjAyODczYThmMWIwZTQ0ZGZjNjk3NTJhY2NlY2Q4MTlmMzhmZDhlOCIsImJjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTciXSxbImU1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQiLCI0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhIl0sWyJlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1IiwiN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCJdLFsiMjEzYzdhNzE1Y2Q1ZDQ1MzU4ZDBiYmY5ZGMwY2UwMjIwNGIxMGJkZGUyYTNmNTg1NDBhZDY5MDhkMDU1OTc1NCIsIjRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjIiXSxbIjRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MiLCIxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2Il0sWyJmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2IiwiNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZiJdLFsiNzZlNjQxMTNmNjc3Y2YwZTEwYTI1NzBkNTk5OTY4ZDMxNTQ0ZTE3OWI3NjA0MzI5NTJjMDJhNDQxN2JkZGUzOSIsImM5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEiXSxbImM3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEiLCI4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzIl0sWyJkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiIiwiZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZiJdLFsiYjhkYTk0MDMyYTk1NzUxOGViMGY2NDMzNTcxZTg3NjFjZWZmYzczNjkzZTg0ZWRkNDkxNTBhNTY0ZjY3NmUwMyIsIjI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTciXSxbImU4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQiLCJlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4Il0sWyJhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwIiwiNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMSJdLFsiOTBhZDg1YjM4OWQ2YjkzNjQ2M2Y5ZDA1MTI2NzhkZTIwOGNjMzMwYjExMzA3ZmZmYWI3YWM2M2UzZmIwNGVkNCIsImU1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCJdLFsiOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYSIsIjY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODIiXSxbImU0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEiLCIxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjIl0sWyI4YzAwZmE5YjE4ZWJmMzMxZWI5NjE1MzdhNDVhNDI2NmM3MDM0ZjJmMGQ0ZTFkMDcxNmZiNmVhZTIwZWFlMjllIiwiZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YiJdLFsiZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MSIsIjJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEiXSxbImI2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYiLCI2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUiXSxbImQ2OGE4MGM4MjgwYmI4NDA3OTMyMzRhYTExOGYwNjIzMWQ2ZjFmYzY3ZTczYzVhNWRlZGEwZjViNDk2OTQzZTgiLCJkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwIl0sWyIzMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkIiwiNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCJdLFsiNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NiIsIjM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkIl0sWyI5YzM5MTlhODRhNDc0ODcwZmFlZDhhOWMxY2M2NjAyMTUyMzQ4OTA1NGQ3ZjAzMDhjYmZjOTljOGFjMWY5OGNkIiwiZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCJdLFsiNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNSIsIjlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgiXSxbImE1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYiLCI0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4Il0sWyI3Nzc4YTc4YzI4ZGVjM2UzMGEwNWZlOTYyOWRlOGMzOGJiMzBkMWY1Y2Y5YTNhMjA4Zjc2Mzg4OWJlNThhZDcxIiwiMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYyJdLFsiOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjIiwiYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZiJdLFsiODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MSIsIjFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjIiXSxbImZmMmIwZGNlOTdlZWNlOTdjMWM5YjYwNDE3OThiODVkZmRmYjZkODg4MmRhMjAzMDhmNTQwNDgyNDUyNjA4N2UiLCI0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3Il0sWyI4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxIiwiYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYyJdLFsiZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMyIsImJlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QiXSxbImU0YTQyZDQzYzVjZjE2OWQ5MzkxZGY2ZGVjZjQyZWU1NDFiNmQ4ZjBjOWExMzc0MDFlMjM2MzJkZGEzNGQyNGYiLCI0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0Il0sWyIxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5IiwiYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCJdLFsiMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZSIsImIzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAiXSxbImZhNTBjMGY2MWQyMmU1ZjA3ZTNhY2ViYjFhYTA3YjEyOGQwMDEyMjA5YTI4Yjk3NzZkNzZhODc5MzE4MGVlZjkiLCI2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExIl0sWyJkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyIiwiODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSJdLFsiYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMyIsIjdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMiXSxbIjE3NGE1M2I5YzlhMjg1ODcyZDM5ZTU2ZTY5MTNjYWIxNWQ1OWIxZmE1MTI1MDhjMDIyZjM4MmRlODMxOTQ5N2MiLCJjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczIl0sWyI5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhIiwiMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCJdLFsiZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MSIsImU4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUiXSxbIjY0NTg3ZTIzMzU0NzFlYjg5MGVlNzg5NmQ3Y2ZkYzg2NmJhY2JkYmQzODM5MzE3YjM0MzZmOWI0NTYxN2UwNzMiLCJkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5Il0sWyI4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4IiwiMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSJdLFsiMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YiIsIjY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjciXSxbImJjNGE5ZGY1YjcxM2ZlMmU5YWVmNDMwYmNjMWRjOTdhMGNkOWNjZWRlMmYyODU4OGNhZGEzYTBkMmQ4M2YzNjYiLCJkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEiXSxbIjhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEiLCI0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyIl0sWyI4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAiLCI2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1Il0sWyJkZDM2MjVmYWVmNWJhMDYwNzQ2Njk3MTZiYmQzNzg4ZDg5YmRkZTgxNTk1OTk2ODA5MmY3NmNjNGViOWE5Nzg3IiwiN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MyJdLFsiZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZSIsImVhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODIiXV19LG5hZjp7d25kOjcscG9pbnRzOltbImY5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjkiLCIzODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyIl0sWyIyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0IiwiZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNiJdLFsiNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYyIsIjZhZWJjYTQwYmEyNTU5NjBhMzE3OGQ2ZDg2MWE1NGRiYTgxM2QwYjgxM2ZkZTdiNWE1MDgyNjI4MDg3MjY0ZGEiXSxbImFjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUiLCJjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3Il0sWyI3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiIiwiZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYiJdLFsiZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCIsImFiMDkwMmU4ZDg4MGE4OTc1ODIxMmViNjVjZGFmNDczYTFhMDZkYTUyMWZhOTFmMjliNWNiNTJkYjAzZWQ4MSJdLFsiZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZSIsIjU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgiXSxbImRlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQiLCI0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3Il0sWyIyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjIiwiODVlODliYzAzNzk0NWQ5M2IzNDMwODNiNWExYzg2MTMxYTAxZjYwYzUwMjY5NzYzYjU3MGM4NTRlNWMwOWI3YSJdLFsiMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNSIsIjMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMiXSxbIjJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YiLCIyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjciXSxbIjkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQiLCI3MzAxNmY3YmYyMzRhYWRlNWQxYWE3MWJkZWEyYjFmZjNmYzBkZTJhODg3OTEyZmZlNTRhMzJjZTk3Y2IzNDAyIl0sWyJkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5IiwiYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NSJdLFsiYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYiIsIjIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODIiXSxbIjZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQiLCJlMDIyY2Y0MmMyYmQ0YTcwOGIzZjUxMjZmMTZhMjRhZDhiMzNiYTQ4ZDA0MjNiNmVmZDVlNjM0ODEwMGQ4YTgyIl0sWyIxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1IiwiYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NiJdLFsiNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OSIsIjI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OSJdLFsiNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCIsIjgwZmMwNmJkOGNjNWIwMTA5ODA4OGExOTUwZWVkMGRiMDFhYTEzMjk2N2FiNDcyMjM1ZjU2NDI0ODNiMjVlYWYiXSxbIjgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYiLCIxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhIl0sWyI3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiIiwiZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3Il0sWyJkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5IiwiZWVjZjQxMjUzMTM2ZTVmOTk5NjZmMjE4ODFmZDY1NmViYzQzNDU0MDVjNTIwZGJjMDYzNDY1YjUyMTQwOTkzMyJdLFsiNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzIiwiNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YSJdLFsiNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCIsIjk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYiXSxbImYyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAiLCJlMGRlZGM5YjNiMmY4ZGFkNGRhMWYzMmRlYzI1MzFkZjllYjVmYmViMDU5OGU0ZmQxYTExN2RiYTcwM2EzYzM3Il0sWyI0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViIiwiNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZSJdLFsiZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NyIsImNlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYiXSxbImNhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEiLCJjYjQ3NDY2MGVmMzVmNWYyYTQxYjY0M2ZhNWU0NjA1NzVmNGZhOWI3OTYyMjMyYTVjMzJmOTA4MzE4YTA0NDc2Il0sWyIyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwIiwiNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCJdLFsiNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNSIsIjkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MSJdLFsiNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCIsIjY3M2ZiODZlNWJkYTMwZmIzY2QwZWQzMDRlYTQ5YTAyM2VlMzNkMDE5N2E2OTVkMGM1ZDk4MDkzYzUzNjY4MyJdLFsiZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCIsIjU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUiXSxbIjE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWIiLCIzYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiIl0sWyJkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmIiwiNTVlYjJkYWZkODRkNmNjZDVmODYyYjc4NWRjMzlkNGFiMTU3MjIyNzIwZWY5ZGEyMTdiOGM0NWNmMmJhMjQxNyJdLFsiNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MyIsImVmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgiXSxbIjI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEiLCJlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhIl0sWyJhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1IiwiZjk4YTNmZDgzMWViMmI3NDlhOTNiMGU2ZjM1Y2ZiNDBjOGNkNWFhNjY3YTE1NTgxYmMyZmVkZWQ0OThmZDljNiJdLFsiNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YSIsIjc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYiXSxbIjU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UiLCJjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlIl0sWyJmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4IiwiZTEzODE3YjQ0ZWUxNGRlNjYzYmY0YmM4MDgzNDFmMzI2OTQ5ZTIxYTZhNzVjMjU3MDc3ODQxOWJkYWY1NzMzZCJdLFsiNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYyIsIjMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTIiXSxbIjk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTkiLCJlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlIl0sWyI3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiIiwiMTAwYjYxMGVjNGZmYjQ3NjBkNWMxZmMxMzNlZjZmNmIxMjUwN2EwNTFmMDRhYzU3NjBhZmE1YjI5ZGI4MzQzNyJdLFsiMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYSIsImVmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEiXSxbImQzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYiLCI4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0Il0sWyIxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwIiwiNjg2NTFjZjliNmRhOTAzZTA5MTQ0NDhjNmNkOWQ0Y2E4OTY4NzhmNTI4MmJlNGM4Y2MwNmUyYTQwNDA3ODU3NSJdLFsiNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCIsImY1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQiXSxbIjE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMiLCJkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkIl0sWyJhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwIiwiZWRkNzdmNTBiY2I1YTNjYWIyZTkwNzM3MzA5NjY3ZjI2NDE0NjJhNTQwNzBmM2Q1MTkyMTJkMzljMTk3YTYyOSJdLFsiZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCIsImE4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNiJdLFsiMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMyIsIjY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQiXSxbIjM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYiLCI5NDE0Njg1ZTk3YjFiNTk1NGJkNDZmNzMwMTc0MTM2ZDU3ZjFjZWViNDg3NDQzZGM1MzIxODU3YmE3M2FiZWUiXSxbImYyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMiLCI0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxIl0sWyJkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4IiwiZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYiJdLFsiMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZiIsIjVmMzAzMmY1ODkyMTU2ZTM5Y2NkM2Q3OTE1YjllMWRhMmU2ZGFjOWU2ZjI2ZTk2MTExOGQxNGI4NDYyZTE2NjEiXSxbIjc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUiLCI4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2Il0sWyJlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2IiwiOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZSJdLFsiMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNSIsIjVlNDYzMTE1MGU2MmZiNDBkMGU4YzJhN2NhNTgwNGEzOWQ1ODE4NmE1MGU0OTcxMzk2MjY3NzhlMjViMDY3NGQiXSxbImVhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTkiLCJmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjIl0sWyI3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEiLCJmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0Il0sWyI0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1IiwiNDIyNDJhOTY5MjgzYTVmMzM5YmE3ZjA3NWUzNmJhMmFmOTI1Y2UzMGQ3NjdlZDZlNTVmNGIwMzE4ODBkNTYyYyJdLFsiYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNSIsIjIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmIiXSxbImM0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTciLCI0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMiXSxbIjg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEiLCI3Mzg2N2Y1OWMwNjU5ZTgxOTA0ZjlhMWM3NTQzNjk4ZTYyNTYyZDY3NDRjMTY5Y2U3YTM2ZGUwMWE4ZDYxNTQiXSxbIjVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUiLCIzOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1Il0sWyIzNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2IiwiZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYyJdLFsiMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2IiwiZWFkMTIxNjg1OTVmZTFiZTk5MjUyMTI5YjZlNTZiMzM5MWY3YWIxNDEwY2QxZTBlZjNkY2RjYWJkMmZkYTIyNCJdLFsiOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZSIsIjZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUiXSxbIjFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQiLCI2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYiXSxbIjg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEiLCIzZDk4YTljZGQwMjZkZDQzZjM5MDQ4ZjI1YTg4NDdmNGZjYWZhZDE4OTVkN2E2MzNjNmZlZDNjMzVlOTk5NTExIl0sWyIyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxIiwiYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiIl0sWyJhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyIiwiYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMiJdLFsiNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1IiwiY2YyMTc0MTE4YzhiNmQ3YTRiNDhmNmQ1MzRjZTVjNzk0MjJjMDg2YTYzNDYwNTAyYjgyN2NlNjJhMzI2NjgzYyJdLFsiZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYiIsIjZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMiXSxbImVhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQiLCIzMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkIl0sWyJhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmIiwiNjc0OWU2N2MwMjliODVmNTJhMDM0ZWFmZDA5NjgzNmIyNTIwODE4NjgwZTI2YWM4ZjNkZmJjZGI3MTc0OTcwMCJdLFsiZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODkiLCIyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0Il0sWyI1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2IiwiYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NiJdLFsiMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCIsIjk5OGM3NGE4Y2Q0NWFjMDEyODlkNTgzM2E3YmViNDc0NGZmNTM2YjAxYjI1N2JlNGM1NzY3YmVhOTNlYTU3YTQiXSxbIjNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EiLCJiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3Il0sWyJjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwIiwiYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMyJdLFsiYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NyIsIjZmMGEyNTZiYzVlZmRmNDI5YTJmYjYyNDJmMWE0M2EyZDliOTI1YmI0YTRiM2EyNmJiOGUwZjQ1ZWI1OTYwOTYiXSxbImMxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MyIsImMzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgiXSxbImE2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYiLCIyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYiXSxbIjM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgiLCI2MGVhN2Y2MWEzNTM1MjRkMWM5ODdmNmVjZWM5MmYwODZkNTY1YWI2ODc4NzBjYjEyNjg5ZmYxZTMxYzc0NDQ4Il0sWyJkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhIiwiNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YSJdLFsiYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMSIsIjVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQiXSxbIjRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDIiLCI3NTcxZDc0ZWU1ZTBmYjkyYTdhOGIzM2EwNzc4MzM0MWE1NDkyMTQ0Y2M1NGJjYzQwYTk0NDczNjkzNjA2NDM3Il0sWyIzNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhIiwiYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNyJdLFsiY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNiIsIjhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQiXSxbImI0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYiLCIzOWU1Yzk5MjViNWE1NGIwNzQzM2E0ZjE4YzYxNzI2ZjhiYjEzMWMwMTJjYTU0MmViMjRhOGFjMDcyMDA2ODJhIl0sWyJkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlIiwiNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCJdLFsiNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCIsIjI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzciXSxbImRmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEiLCJlY2ZiNzA1NmNmMWRlMDQyZjk0MjBiYWIzOTY3OTNjMGMzOTBiZGU3NGI0YmJkZmYxNmE4M2FlMDlhOWE3NTE3Il0sWyI2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5IiwiY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCJdLFsiZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZiIsImY1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUiXSxbImViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMiLCI2Y2I5YTg4NzZkOWNiODUyMDYwOWFmM2FkZDI2Y2QyMGEwYTdjZDhhOTQxMTEzMWNlODVmNDQxMDAwOTkyMjNlIl0sWyIxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyIiwiZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMSJdLFsiZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YSIsIjFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjIiXSxbImIyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAiLCI1ZjMxMGQ0YjNjOTliOWViYjE5Zjc3ZDQxYzFkZWUwMThjZjBkMzRmZDQxOTE2MTQwMDNlOTQ1YTEyMTZlNDIzIl0sWyJmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkIiwiNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCJdLFsiOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMSIsImNkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgiXSxbIjUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMiLCJjM2I5OTdkMDUwZWU1ZDQyM2ViYWY2NmE2ZGI5ZjU3YjMxODBjOTAyODc1Njc5ZGU5MjRiNjlkODRhN2IzNzUiXSxbImU2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTIiLCI2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkIl0sWyI3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzIiwiY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYyJdLFsiNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCIsIjk3MzExNDFkODFmYzhmODA4NGQzN2M2ZTc1NDIwMDZiM2VlMWI0MGQ2MGRmZTUzNjJhNWIxMzJmZDE3ZGRjMCJdLFsiMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCIsImVlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MiXSxbImUyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjciLCJkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0Il0sWyI4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4IiwiYzRlMTAyMDkxNjk4MGE0ZGE1ZDAxYWM1ZTZhZDMzMDczNGVmMGQ3OTA2NjMxYzRmMjM5MDQyNmIyZWRkNzkxZiJdLFsiNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZSIsIjY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDkiXSxbIjNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QiLCJjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYiXSxbIjY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmIiLCIyOTlkMjFmOTQxM2YzM2IzZWRmNDNiMjU3MDA0NTgwYjcwZGI1N2RhMGIxODIyNTllMDllZWNjNjllMGQzOGE1Il0sWyJkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmIiwiZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NyJdLFsiMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNiIsIjQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2IiXSxbImJlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTciLCI2MjE4OGJjNDlkNjFlNTQyODU3M2Q0OGE3NGUxYzY1NWIxYzYxMDkwOTA1NjgyYTBkNTU1OGVkNzJkY2NiOWJjIl0sWyI5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhIiwiN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YyJdLFsiYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYyIsImFiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYiXSxbImQ1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTIiLCI0Y2IwNDQzN2YzOTFlZDczMTExYTEzY2MxZDRkZDBkYjE2OTM0NjVjMjI0MDQ4MGQ4OTU1ZTg1OTJmMjc0NDdhIl0sWyJkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiIiwiYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NiJdLFsiNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NSIsImJmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YiXSxbIjc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTciLCI2MDNjMTJkYWYzZDk4NjJlZjJiMjVmZTFkZTI4OWFlZDI0ZWQyOTFlMGVjNjcwODcwM2E1YmQ1NjdmMzJlZDAzIl0sWyI3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5IiwiY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCJdLFsiMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMyIsIjU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgiXSxbIjllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTciLCI3MTJmY2RkMWI5MDUzZjA5MDAzYTM0ODFmYTc3NjJlOWZmZDdjOGVmMzVhMzg1MDllMmZiZjI2MjkwMDgzNzMiXSxbIjE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYiLCJlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzIl0sWyI3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4IiwiOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCJdLFsiODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMSIsIjllOTk0OTgwZDk5MTdlMjJiNzZiMDYxOTI3ZmEwNDE0M2QwOTZjY2M1NDk2M2U2YTVlYmZhNWYzZjhlMjg2YzEiXSxbIjFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAiLCI0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5Il1dfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMjAzKSxvPW4oMTApLHM9by51dGlscy5hc3NlcnQsYT1uKDIwNCksdT1uKDIwNSk7ZnVuY3Rpb24gYyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBjKSlyZXR1cm4gbmV3IGModCk7InN0cmluZyI9PXR5cGVvZiB0JiYocyhvLmN1cnZlcy5oYXNPd25Qcm9wZXJ0eSh0KSwiVW5rbm93biBjdXJ2ZSAiK3QpLHQ9by5jdXJ2ZXNbdF0pLHQgaW5zdGFuY2VvZiBvLmN1cnZlcy5QcmVzZXRDdXJ2ZSYmKHQ9e2N1cnZlOnR9KSx0aGlzLmN1cnZlPXQuY3VydmUuY3VydmUsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLm5oPXRoaXMubi51c2hybigxKSx0aGlzLmc9dGhpcy5jdXJ2ZS5nLHRoaXMuZz10LmN1cnZlLmcsdGhpcy5nLnByZWNvbXB1dGUodC5jdXJ2ZS5uLmJpdExlbmd0aCgpKzEpLHRoaXMuaGFzaD10Lmhhc2h8fHQuY3VydmUuaGFzaH10LmV4cG9ydHM9YyxjLnByb3RvdHlwZS5rZXlQYWlyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYSh0aGlzLHQpfSxjLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBhLmZyb21Qcml2YXRlKHRoaXMsdCxlKX0sYy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0LGUpe3JldHVybiBhLmZyb21QdWJsaWModGhpcyx0LGUpfSxjLnByb3RvdHlwZS5nZW5LZXlQYWlyPWZ1bmN0aW9uKHQpe3R8fCh0PXt9KTtmb3IodmFyIGU9bmV3IHIoe2hhc2g6dGhpcy5oYXNoLHBlcnM6dC5wZXJzLHBlcnNFbmM6dC5wZXJzRW5jfHwidXRmOCIsZW50cm9weTp0LmVudHJvcHl8fG8ucmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxlbnRyb3B5RW5jOnQuZW50cm9weSYmdC5lbnRyb3B5RW5jfHwidXRmOCIsbm9uY2U6dGhpcy5uLnRvQXJyYXkoKX0pLG49dGhpcy5uLmJ5dGVMZW5ndGgoKSxzPXRoaXMubi5zdWIobmV3IGkoMikpOzspe3ZhciBhPW5ldyBpKGUuZ2VuZXJhdGUobikpO2lmKCEoYS5jbXAocyk+MCkpcmV0dXJuIGEuaWFkZG4oMSksdGhpcy5rZXlGcm9tUHJpdmF0ZShhKX19LGMucHJvdG90eXBlLl90cnVuY2F0ZVRvTj1mdW5jdGlvbih0LGUpe3ZhciBuPTgqdC5ieXRlTGVuZ3RoKCktdGhpcy5uLmJpdExlbmd0aCgpO3JldHVybiBuPjAmJih0PXQudXNocm4obikpLCFlJiZ0LmNtcCh0aGlzLm4pPj0wP3Quc3ViKHRoaXMubik6dH0sYy5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUsbixvKXsib2JqZWN0Ij09dHlwZW9mIG4mJihvPW4sbj1udWxsKSxvfHwobz17fSksZT10aGlzLmtleUZyb21Qcml2YXRlKGUsbiksdD10aGlzLl90cnVuY2F0ZVRvTihuZXcgaSh0LDE2KSk7Zm9yKHZhciBzPXRoaXMubi5ieXRlTGVuZ3RoKCksYT1lLmdldFByaXZhdGUoKS50b0FycmF5KCJiZSIscyksYz10LnRvQXJyYXkoImJlIixzKSxoPW5ldyByKHtoYXNoOnRoaXMuaGFzaCxlbnRyb3B5OmEsbm9uY2U6YyxwZXJzOm8ucGVycyxwZXJzRW5jOm8ucGVyc0VuY3x8InV0ZjgifSksbD10aGlzLm4uc3ViKG5ldyBpKDEpKSxkPTA7O2QrKyl7dmFyIGY9by5rP28uayhkKTpuZXcgaShoLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTtpZighKChmPXRoaXMuX3RydW5jYXRlVG9OKGYsITApKS5jbXBuKDEpPD0wfHxmLmNtcChsKT49MCkpe3ZhciBwPXRoaXMuZy5tdWwoZik7aWYoIXAuaXNJbmZpbml0eSgpKXt2YXIgbT1wLmdldFgoKSxnPW0udW1vZCh0aGlzLm4pO2lmKDAhPT1nLmNtcG4oMCkpe3ZhciB2PWYuaW52bSh0aGlzLm4pLm11bChnLm11bChlLmdldFByaXZhdGUoKSkuaWFkZCh0KSk7aWYoMCE9PSh2PXYudW1vZCh0aGlzLm4pKS5jbXBuKDApKXt2YXIgYj0ocC5nZXRZKCkuaXNPZGQoKT8xOjApfCgwIT09bS5jbXAoZyk/MjowKTtyZXR1cm4gby5jYW5vbmljYWwmJnYuY21wKHRoaXMubmgpPjAmJih2PXRoaXMubi5zdWIodiksYl49MSksbmV3IHUoe3I6ZyxzOnYscmVjb3ZlcnlQYXJhbTpifSl9fX19fX0sYy5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQsZSxuLHIpe3Q9dGhpcy5fdHJ1bmNhdGVUb04obmV3IGkodCwxNikpLG49dGhpcy5rZXlGcm9tUHVibGljKG4scik7dmFyIG89KGU9bmV3IHUoZSwiaGV4IikpLnIscz1lLnM7aWYoby5jbXBuKDEpPDB8fG8uY21wKHRoaXMubik+PTApcmV0dXJuITE7aWYocy5jbXBuKDEpPDB8fHMuY21wKHRoaXMubik+PTApcmV0dXJuITE7dmFyIGEsYz1zLmludm0odGhpcy5uKSxoPWMubXVsKHQpLnVtb2QodGhpcy5uKSxsPWMubXVsKG8pLnVtb2QodGhpcy5uKTtyZXR1cm4gdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrPyEoYT10aGlzLmcuam11bEFkZChoLG4uZ2V0UHVibGljKCksbCkpLmlzSW5maW5pdHkoKSYmYS5lcVhUb1Aobyk6IShhPXRoaXMuZy5tdWxBZGQoaCxuLmdldFB1YmxpYygpLGwpKS5pc0luZmluaXR5KCkmJjA9PT1hLmdldFgoKS51bW9kKHRoaXMubikuY21wKG8pfSxjLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5PWZ1bmN0aW9uKHQsZSxuLHIpe3MoKDMmbik9PT1uLCJUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzIiksZT1uZXcgdShlLHIpO3ZhciBvPXRoaXMubixhPW5ldyBpKHQpLGM9ZS5yLGg9ZS5zLGw9MSZuLGQ9bj4+MTtpZihjLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKT49MCYmZCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZSIpO2M9ZD90aGlzLmN1cnZlLnBvaW50RnJvbVgoYy5hZGQodGhpcy5jdXJ2ZS5uKSxsKTp0aGlzLmN1cnZlLnBvaW50RnJvbVgoYyxsKTt2YXIgZj1lLnIuaW52bShvKSxwPW8uc3ViKGEpLm11bChmKS51bW9kKG8pLG09aC5tdWwoZikudW1vZChvKTtyZXR1cm4gdGhpcy5nLm11bEFkZChwLGMsbSl9LGMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW09ZnVuY3Rpb24odCxlLG4saSl7aWYobnVsbCE9PShlPW5ldyB1KGUsaSkpLnJlY292ZXJ5UGFyYW0pcmV0dXJuIGUucmVjb3ZlcnlQYXJhbTtmb3IodmFyIHI9MDtyPDQ7cisrKXt2YXIgbzt0cnl7bz10aGlzLnJlY292ZXJQdWJLZXkodCxlLHIpfWNhdGNoKHQpe2NvbnRpbnVlfWlmKG8uZXEobikpcmV0dXJuIHJ9dGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3IiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big3MCkscj1uKDEwNiksbz1uKDE0KTtmdW5jdGlvbiBzKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHMpKXJldHVybiBuZXcgcyh0KTt0aGlzLmhhc2g9dC5oYXNoLHRoaXMucHJlZFJlc2lzdD0hIXQucHJlZFJlc2lzdCx0aGlzLm91dExlbj10aGlzLmhhc2gub3V0U2l6ZSx0aGlzLm1pbkVudHJvcHk9dC5taW5FbnRyb3B5fHx0aGlzLmhhc2guaG1hY1N0cmVuZ3RoLHRoaXMuX3Jlc2VlZD1udWxsLHRoaXMucmVzZWVkSW50ZXJ2YWw9bnVsbCx0aGlzLks9bnVsbCx0aGlzLlY9bnVsbDt2YXIgZT1yLnRvQXJyYXkodC5lbnRyb3B5LHQuZW50cm9weUVuY3x8ImhleCIpLG49ci50b0FycmF5KHQubm9uY2UsdC5ub25jZUVuY3x8ImhleCIpLGk9ci50b0FycmF5KHQucGVycyx0LnBlcnNFbmN8fCJoZXgiKTtvKGUubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCwiTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAiK3RoaXMubWluRW50cm9weSsiIGJpdHMiKSx0aGlzLl9pbml0KGUsbixpKX10LmV4cG9ydHM9cyxzLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5jb25jYXQoZSkuY29uY2F0KG4pO3RoaXMuSz1uZXcgQXJyYXkodGhpcy5vdXRMZW4vOCksdGhpcy5WPW5ldyBBcnJheSh0aGlzLm91dExlbi84KTtmb3IodmFyIHI9MDtyPHRoaXMuVi5sZW5ndGg7cisrKXRoaXMuS1tyXT0wLHRoaXMuVltyXT0xO3RoaXMuX3VwZGF0ZShpKSx0aGlzLl9yZXNlZWQ9MSx0aGlzLnJlc2VlZEludGVydmFsPTI4MTQ3NDk3NjcxMDY1Nn0scy5wcm90b3R5cGUuX2htYWM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkuaG1hYyh0aGlzLmhhc2gsdGhpcy5LKX0scy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFswXSk7dCYmKGU9ZS51cGRhdGUodCkpLHRoaXMuSz1lLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksdCYmKHRoaXMuSz10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFsxXSkudXBkYXRlKHQpLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCkpfSxzLnByb3RvdHlwZS5yZXNlZWQ9ZnVuY3Rpb24odCxlLG4saSl7InN0cmluZyIhPXR5cGVvZiBlJiYoaT1uLG49ZSxlPW51bGwpLHQ9ci50b0FycmF5KHQsZSksbj1yLnRvQXJyYXkobixpKSxvKHQubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCwiTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAiK3RoaXMubWluRW50cm9weSsiIGJpdHMiKSx0aGlzLl91cGRhdGUodC5jb25jYXQobnx8W10pKSx0aGlzLl9yZXNlZWQ9MX0scy5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5fcmVzZWVkPnRoaXMucmVzZWVkSW50ZXJ2YWwpdGhyb3cgbmV3IEVycm9yKCJSZXNlZWQgaXMgcmVxdWlyZWQiKTsic3RyaW5nIiE9dHlwZW9mIGUmJihpPW4sbj1lLGU9bnVsbCksbiYmKG49ci50b0FycmF5KG4saXx8ImhleCIpLHRoaXMuX3VwZGF0ZShuKSk7Zm9yKHZhciBvPVtdO28ubGVuZ3RoPHQ7KXRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksbz1vLmNvbmNhdCh0aGlzLlYpO3ZhciBzPW8uc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5fdXBkYXRlKG4pLHRoaXMuX3Jlc2VlZCsrLHIuZW5jb2RlKHMsZSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMykscj1uKDEwKS51dGlscy5hc3NlcnQ7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuZWM9dCx0aGlzLnByaXY9bnVsbCx0aGlzLnB1Yj1udWxsLGUucHJpdiYmdGhpcy5faW1wb3J0UHJpdmF0ZShlLnByaXYsZS5wcml2RW5jKSxlLnB1YiYmdGhpcy5faW1wb3J0UHVibGljKGUucHViLGUucHViRW5jKX10LmV4cG9ydHM9byxvLmZyb21QdWJsaWM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluc3RhbmNlb2Ygbz9lOm5ldyBvKHQse3B1YjplLHB1YkVuYzpufSl9LG8uZnJvbVByaXZhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluc3RhbmNlb2Ygbz9lOm5ldyBvKHQse3ByaXY6ZSxwcml2RW5jOm59KX0sby5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFB1YmxpYygpO3JldHVybiB0LmlzSW5maW5pdHkoKT97cmVzdWx0OiExLHJlYXNvbjoiSW52YWxpZCBwdWJsaWMga2V5In06dC52YWxpZGF0ZSgpP3QubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpP3tyZXN1bHQ6ITAscmVhc29uOm51bGx9OntyZXN1bHQ6ITEscmVhc29uOiJQdWJsaWMga2V5ICogTiAhPSBPIn06e3Jlc3VsdDohMSxyZWFzb246IlB1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQifX0sby5wcm90b3R5cGUuZ2V0UHVibGljPWZ1bmN0aW9uKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYoZT10LHQ9bnVsbCksdGhpcy5wdWJ8fCh0aGlzLnB1Yj10aGlzLmVjLmcubXVsKHRoaXMucHJpdikpLGU/dGhpcy5wdWIuZW5jb2RlKGUsdCk6dGhpcy5wdWJ9LG8ucHJvdG90eXBlLmdldFByaXZhdGU9ZnVuY3Rpb24odCl7cmV0dXJuImhleCI9PT10P3RoaXMucHJpdi50b1N0cmluZygxNiwyKTp0aGlzLnByaXZ9LG8ucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcml2PW5ldyBpKHQsZXx8MTYpLHRoaXMucHJpdj10aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pfSxvLnByb3RvdHlwZS5faW1wb3J0UHVibGljPWZ1bmN0aW9uKHQsZSl7aWYodC54fHx0LnkpcmV0dXJuIm1vbnQiPT09dGhpcy5lYy5jdXJ2ZS50eXBlP3IodC54LCJOZWVkIHggY29vcmRpbmF0ZSIpOiJzaG9ydCIhPT10aGlzLmVjLmN1cnZlLnR5cGUmJiJlZHdhcmRzIiE9PXRoaXMuZWMuY3VydmUudHlwZXx8cih0LngmJnQueSwiTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZSIpLHZvaWQodGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5wb2ludCh0LngsdC55KSk7dGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludCh0LGUpfSxvLnByb3RvdHlwZS5kZXJpdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubXVsKHRoaXMucHJpdikuZ2V0WCgpfSxvLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5lYy5zaWduKHQsdGhpcyxlLG4pfSxvLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYy52ZXJpZnkodCxlLHRoaXMpfSxvLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIjxLZXkgcHJpdjogIisodGhpcy5wcml2JiZ0aGlzLnByaXYudG9TdHJpbmcoMTYsMikpKyIgcHViOiAiKyh0aGlzLnB1YiYmdGhpcy5wdWIuaW5zcGVjdCgpKSsiID4ifX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDMpLHI9bigxMCkudXRpbHMsbz1yLmFzc2VydDtmdW5jdGlvbiBzKHQsZSl7aWYodCBpbnN0YW5jZW9mIHMpcmV0dXJuIHQ7dGhpcy5faW1wb3J0REVSKHQsZSl8fChvKHQuciYmdC5zLCJTaWduYXR1cmUgd2l0aG91dCByIG9yIHMiKSx0aGlzLnI9bmV3IGkodC5yLDE2KSx0aGlzLnM9bmV3IGkodC5zLDE2KSx2b2lkIDA9PT10LnJlY292ZXJ5UGFyYW0/dGhpcy5yZWNvdmVyeVBhcmFtPW51bGw6dGhpcy5yZWNvdmVyeVBhcmFtPXQucmVjb3ZlcnlQYXJhbSl9ZnVuY3Rpb24gYSgpe3RoaXMucGxhY2U9MH1mdW5jdGlvbiB1KHQsZSl7dmFyIG49dFtlLnBsYWNlKytdO2lmKCEoMTI4Jm4pKXJldHVybiBuO2Zvcih2YXIgaT0xNSZuLHI9MCxvPTAscz1lLnBsYWNlO288aTtvKysscysrKXI8PD04LHJ8PXRbc107cmV0dXJuIGUucGxhY2U9cyxyfWZ1bmN0aW9uIGModCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aC0xOyF0W2VdJiYhKDEyOCZ0W2UrMV0pJiZlPG47KWUrKztyZXR1cm4gMD09PWU/dDp0LnNsaWNlKGUpfWZ1bmN0aW9uIGgodCxlKXtpZihlPDEyOCl0LnB1c2goZSk7ZWxzZXt2YXIgbj0xKyhNYXRoLmxvZyhlKS9NYXRoLkxOMj4+PjMpO2Zvcih0LnB1c2goMTI4fG4pOy0tbjspdC5wdXNoKGU+Pj4objw8MykmMjU1KTt0LnB1c2goZSl9fXQuZXhwb3J0cz1zLHMucHJvdG90eXBlLl9pbXBvcnRERVI9ZnVuY3Rpb24odCxlKXt0PXIudG9BcnJheSh0LGUpO3ZhciBuPW5ldyBhO2lmKDQ4IT09dFtuLnBsYWNlKytdKXJldHVybiExO2lmKHUodCxuKStuLnBsYWNlIT09dC5sZW5ndGgpcmV0dXJuITE7aWYoMiE9PXRbbi5wbGFjZSsrXSlyZXR1cm4hMTt2YXIgbz11KHQsbikscz10LnNsaWNlKG4ucGxhY2UsbytuLnBsYWNlKTtpZihuLnBsYWNlKz1vLDIhPT10W24ucGxhY2UrK10pcmV0dXJuITE7dmFyIGM9dSh0LG4pO2lmKHQubGVuZ3RoIT09YytuLnBsYWNlKXJldHVybiExO3ZhciBoPXQuc2xpY2Uobi5wbGFjZSxjK24ucGxhY2UpO3JldHVybiAwPT09c1swXSYmMTI4JnNbMV0mJihzPXMuc2xpY2UoMSkpLDA9PT1oWzBdJiYxMjgmaFsxXSYmKGg9aC5zbGljZSgxKSksdGhpcy5yPW5ldyBpKHMpLHRoaXMucz1uZXcgaShoKSx0aGlzLnJlY292ZXJ5UGFyYW09bnVsbCwhMH0scy5wcm90b3R5cGUudG9ERVI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yLnRvQXJyYXkoKSxuPXRoaXMucy50b0FycmF5KCk7Zm9yKDEyOCZlWzBdJiYoZT1bMF0uY29uY2F0KGUpKSwxMjgmblswXSYmKG49WzBdLmNvbmNhdChuKSksZT1jKGUpLG49YyhuKTshKG5bMF18fDEyOCZuWzFdKTspbj1uLnNsaWNlKDEpO3ZhciBpPVsyXTtoKGksZS5sZW5ndGgpLChpPWkuY29uY2F0KGUpKS5wdXNoKDIpLGgoaSxuLmxlbmd0aCk7dmFyIG89aS5jb25jYXQobikscz1bNDhdO3JldHVybiBoKHMsby5sZW5ndGgpLHM9cy5jb25jYXQobyksci5lbmNvZGUocyx0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big3MCkscj1uKDEwKSxvPXIudXRpbHMscz1vLmFzc2VydCxhPW8ucGFyc2VCeXRlcyx1PW4oMjA3KSxjPW4oMjA4KTtmdW5jdGlvbiBoKHQpe2lmKHMoImVkMjU1MTkiPT09dCwib25seSB0ZXN0ZWQgd2l0aCBlZDI1NTE5IHNvIGZhciIpLCEodGhpcyBpbnN0YW5jZW9mIGgpKXJldHVybiBuZXcgaCh0KTt0PXIuY3VydmVzW3RdLmN1cnZlO3RoaXMuY3VydmU9dCx0aGlzLmc9dC5nLHRoaXMuZy5wcmVjb21wdXRlKHQubi5iaXRMZW5ndGgoKSsxKSx0aGlzLnBvaW50Q2xhc3M9dC5wb2ludCgpLmNvbnN0cnVjdG9yLHRoaXMuZW5jb2RpbmdMZW5ndGg9TWF0aC5jZWlsKHQubi5iaXRMZW5ndGgoKS84KSx0aGlzLmhhc2g9aS5zaGE1MTJ9dC5leHBvcnRzPWgsaC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUpe3Q9YSh0KTt2YXIgbj10aGlzLmtleUZyb21TZWNyZXQoZSksaT10aGlzLmhhc2hJbnQobi5tZXNzYWdlUHJlZml4KCksdCkscj10aGlzLmcubXVsKGkpLG89dGhpcy5lbmNvZGVQb2ludChyKSxzPXRoaXMuaGFzaEludChvLG4ucHViQnl0ZXMoKSx0KS5tdWwobi5wcml2KCkpLHU9aS5hZGQocykudW1vZCh0aGlzLmN1cnZlLm4pO3JldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoe1I6cixTOnUsUmVuY29kZWQ6b30pfSxoLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlLG4pe3Q9YSh0KSxlPXRoaXMubWFrZVNpZ25hdHVyZShlKTt2YXIgaT10aGlzLmtleUZyb21QdWJsaWMobikscj10aGlzLmhhc2hJbnQoZS5SZW5jb2RlZCgpLGkucHViQnl0ZXMoKSx0KSxvPXRoaXMuZy5tdWwoZS5TKCkpO3JldHVybiBlLlIoKS5hZGQoaS5wdWIoKS5tdWwocikpLmVxKG8pfSxoLnByb3RvdHlwZS5oYXNoSW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaGFzaCgpLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQudXBkYXRlKGFyZ3VtZW50c1tlXSk7cmV0dXJuIG8uaW50RnJvbUxFKHQuZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKX0saC5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0KXtyZXR1cm4gdS5mcm9tUHVibGljKHRoaXMsdCl9LGgucHJvdG90eXBlLmtleUZyb21TZWNyZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUuZnJvbVNlY3JldCh0aGlzLHQpfSxoLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgYz90Om5ldyBjKHRoaXMsdCl9LGgucHJvdG90eXBlLmVuY29kZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0WSgpLnRvQXJyYXkoImxlIix0aGlzLmVuY29kaW5nTGVuZ3RoKTtyZXR1cm4gZVt0aGlzLmVuY29kaW5nTGVuZ3RoLTFdfD10LmdldFgoKS5pc09kZCgpPzEyODowLGV9LGgucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPSh0PW8ucGFyc2VCeXRlcyh0KSkubGVuZ3RoLTEsbj10LnNsaWNlKDAsZSkuY29uY2F0KC0xMjkmdFtlXSksaT0wIT0oMTI4JnRbZV0pLHI9by5pbnRGcm9tTEUobik7cmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWShyLGkpfSxoLnByb3RvdHlwZS5lbmNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9BcnJheSgibGUiLHRoaXMuZW5jb2RpbmdMZW5ndGgpfSxoLnByb3RvdHlwZS5kZWNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uaW50RnJvbUxFKHQpfSxoLnByb3RvdHlwZS5pc1BvaW50PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEwKS51dGlscyxyPWkuYXNzZXJ0LG89aS5wYXJzZUJ5dGVzLHM9aS5jYWNoZWRQcm9wZXJ0eTtmdW5jdGlvbiBhKHQsZSl7dGhpcy5lZGRzYT10LHRoaXMuX3NlY3JldD1vKGUuc2VjcmV0KSx0LmlzUG9pbnQoZS5wdWIpP3RoaXMuX3B1Yj1lLnB1Yjp0aGlzLl9wdWJCeXRlcz1vKGUucHViKX1hLmZyb21QdWJsaWM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGE/ZTpuZXcgYSh0LHtwdWI6ZX0pfSxhLmZyb21TZWNyZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGE/ZTpuZXcgYSh0LHtzZWNyZXQ6ZX0pfSxhLnByb3RvdHlwZS5zZWNyZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VjcmV0fSxzKGEsInB1YkJ5dGVzIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpfSkscyhhLCJwdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B1YkJ5dGVzP3RoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5fcHViQnl0ZXMpOnRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpfSkscyhhLCJwcml2Qnl0ZXMiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGRzYSxlPXRoaXMuaGFzaCgpLG49dC5lbmNvZGluZ0xlbmd0aC0xLGk9ZS5zbGljZSgwLHQuZW5jb2RpbmdMZW5ndGgpO3JldHVybiBpWzBdJj0yNDgsaVtuXSY9MTI3LGlbbl18PTY0LGl9KSxzKGEsInByaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMucHJpdkJ5dGVzKCkpfSkscyhhLCJoYXNoIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCl9KSxzKGEsIm1lc3NhZ2VQcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpfSksYS5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLl9zZWNyZXQsIktleVBhaXIgY2FuIG9ubHkgdmVyaWZ5IiksdGhpcy5lZGRzYS5zaWduKHQsdGhpcyl9LGEucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVkZHNhLnZlcmlmeSh0LGUsdGhpcyl9LGEucHJvdG90eXBlLmdldFNlY3JldD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLl9zZWNyZXQsIktleVBhaXIgaXMgcHVibGljIG9ubHkiKSxpLmVuY29kZSh0aGlzLnNlY3JldCgpLHQpfSxhLnByb3RvdHlwZS5nZXRQdWJsaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGkuZW5jb2RlKHRoaXMucHViQnl0ZXMoKSx0KX0sdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMTApLnV0aWxzLG89ci5hc3NlcnQscz1yLmNhY2hlZFByb3BlcnR5LGE9ci5wYXJzZUJ5dGVzO2Z1bmN0aW9uIHUodCxlKXt0aGlzLmVkZHNhPXQsIm9iamVjdCIhPXR5cGVvZiBlJiYoZT1hKGUpKSxBcnJheS5pc0FycmF5KGUpJiYoZT17UjplLnNsaWNlKDAsdC5lbmNvZGluZ0xlbmd0aCksUzplLnNsaWNlKHQuZW5jb2RpbmdMZW5ndGgpfSksbyhlLlImJmUuUywiU2lnbmF0dXJlIHdpdGhvdXQgUiBvciBTIiksdC5pc1BvaW50KGUuUikmJih0aGlzLl9SPWUuUiksZS5TIGluc3RhbmNlb2YgaSYmKHRoaXMuX1M9ZS5TKSx0aGlzLl9SZW5jb2RlZD1BcnJheS5pc0FycmF5KGUuUik/ZS5SOmUuUmVuY29kZWQsdGhpcy5fU2VuY29kZWQ9QXJyYXkuaXNBcnJheShlLlMpP2UuUzplLlNlbmNvZGVkfXModSwiUyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKX0pLHModSwiUiIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpfSkscyh1LCJSZW5jb2RlZCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSl9KSxzKHUsIlNlbmNvZGVkIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmVuY29kZUludCh0aGlzLlMoKSl9KSx1LnByb3RvdHlwZS50b0J5dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmVuY29kZWQoKS5jb25jYXQodGhpcy5TZW5jb2RlZCgpKX0sdS5wcm90b3R5cGUudG9IZXg9ZnVuY3Rpb24oKXtyZXR1cm4gci5lbmNvZGUodGhpcy50b0J5dGVzKCksImhleCIpLnRvVXBwZXJDYXNlKCl9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMzUpO2UuY2VydGlmaWNhdGU9bigyMjApO3ZhciByPWkuZGVmaW5lKCJSU0FQcml2YXRlS2V5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksdGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSx0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSx0aGlzLmtleSgicHJpdmF0ZUV4cG9uZW50IikuaW50KCksdGhpcy5rZXkoInByaW1lMSIpLmludCgpLHRoaXMua2V5KCJwcmltZTIiKS5pbnQoKSx0aGlzLmtleSgiZXhwb25lbnQxIikuaW50KCksdGhpcy5rZXkoImV4cG9uZW50MiIpLmludCgpLHRoaXMua2V5KCJjb2VmZmljaWVudCIpLmludCgpKX0pO2UuUlNBUHJpdmF0ZUtleT1yO3ZhciBvPWkuZGVmaW5lKCJSU0FQdWJsaWNLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSx0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSl9KTtlLlJTQVB1YmxpY0tleT1vO3ZhciBzPWkuZGVmaW5lKCJTdWJqZWN0UHVibGljS2V5SW5mbyIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikudXNlKGEpLHRoaXMua2V5KCJzdWJqZWN0UHVibGljS2V5IikuYml0c3RyKCkpfSk7ZS5QdWJsaWNLZXk9czt2YXIgYT1pLmRlZmluZSgiQWxnb3JpdGhtSWRlbnRpZmllciIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikub2JqaWQoKSx0aGlzLmtleSgibm9uZSIpLm51bGxfKCkub3B0aW9uYWwoKSx0aGlzLmtleSgiY3VydmUiKS5vYmppZCgpLm9wdGlvbmFsKCksdGhpcy5rZXkoInBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgicCIpLmludCgpLHRoaXMua2V5KCJxIikuaW50KCksdGhpcy5rZXkoImciKS5pbnQoKSkub3B0aW9uYWwoKSl9KSx1PWkuZGVmaW5lKCJQcml2YXRlS2V5SW5mbyIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidmVyc2lvbiIpLmludCgpLHRoaXMua2V5KCJhbGdvcml0aG0iKS51c2UoYSksdGhpcy5rZXkoInN1YmplY3RQcml2YXRlS2V5Iikub2N0c3RyKCkpfSk7ZS5Qcml2YXRlS2V5PXU7dmFyIGM9aS5kZWZpbmUoIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS5zZXEoKS5vYmoodGhpcy5rZXkoImlkIikub2JqaWQoKSx0aGlzLmtleSgiZGVjcnlwdCIpLnNlcSgpLm9iaih0aGlzLmtleSgia2RlIikuc2VxKCkub2JqKHRoaXMua2V5KCJpZCIpLm9iamlkKCksdGhpcy5rZXkoImtkZXBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgic2FsdCIpLm9jdHN0cigpLHRoaXMua2V5KCJpdGVycyIpLmludCgpKSksdGhpcy5rZXkoImNpcGhlciIpLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnbyIpLm9iamlkKCksdGhpcy5rZXkoIml2Iikub2N0c3RyKCkpKSksdGhpcy5rZXkoInN1YmplY3RQcml2YXRlS2V5Iikub2N0c3RyKCkpfSk7ZS5FbmNyeXB0ZWRQcml2YXRlS2V5PWM7dmFyIGg9aS5kZWZpbmUoIkRTQVByaXZhdGVLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5pbnQoKSx0aGlzLmtleSgicCIpLmludCgpLHRoaXMua2V5KCJxIikuaW50KCksdGhpcy5rZXkoImciKS5pbnQoKSx0aGlzLmtleSgicHViX2tleSIpLmludCgpLHRoaXMua2V5KCJwcml2X2tleSIpLmludCgpKX0pO2UuRFNBUHJpdmF0ZUtleT1oLGUuRFNBcGFyYW09aS5kZWZpbmUoIkRTQXBhcmFtIixmdW5jdGlvbigpe3RoaXMuaW50KCl9KTt2YXIgbD1pLmRlZmluZSgiRUNQcml2YXRlS2V5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksdGhpcy5rZXkoInByaXZhdGVLZXkiKS5vY3RzdHIoKSx0aGlzLmtleSgicGFyYW1ldGVycyIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKGQpLHRoaXMua2V5KCJwdWJsaWNLZXkiKS5vcHRpb25hbCgpLmV4cGxpY2l0KDEpLmJpdHN0cigpKX0pO2UuRUNQcml2YXRlS2V5PWw7dmFyIGQ9aS5kZWZpbmUoIkVDUGFyYW1ldGVycyIsZnVuY3Rpb24oKXt0aGlzLmNob2ljZSh7bmFtZWRDdXJ2ZTp0aGlzLm9iamlkKCl9KX0pO2Uuc2lnbmF0dXJlPWkuZGVmaW5lKCJzaWduYXR1cmUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInIiKS5pbnQoKSx0aGlzLmtleSgicyIpLmludCgpKX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzNSkscj1uKDApO2Z1bmN0aW9uIG8odCxlKXt0aGlzLm5hbWU9dCx0aGlzLmJvZHk9ZSx0aGlzLmRlY29kZXJzPXt9LHRoaXMuZW5jb2RlcnM9e319ZS5kZWZpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8odCxlKX0sby5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPW4oMjExKS5ydW5JblRoaXNDb250ZXh0KCIoZnVuY3Rpb24gIit0aGlzLm5hbWUrIihlbnRpdHkpIHtcbiAgdGhpcy5faW5pdE5hbWVkKGVudGl0eSk7XG59KSIpfWNhdGNoKHQpe2U9ZnVuY3Rpb24odCl7dGhpcy5faW5pdE5hbWVkKHQpfX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9pbml0TmFtZWQ9ZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZSl9LG5ldyBlKHRoaXMpfSxvLnByb3RvdHlwZS5fZ2V0RGVjb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHwiZGVyIix0aGlzLmRlY29kZXJzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5kZWNvZGVyc1t0XT10aGlzLl9jcmVhdGVOYW1lZChpLmRlY29kZXJzW3RdKSksdGhpcy5kZWNvZGVyc1t0XX0sby5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlKS5kZWNvZGUodCxuKX0sby5wcm90b3R5cGUuX2dldEVuY29kZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dHx8ImRlciIsdGhpcy5lbmNvZGVycy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuZW5jb2RlcnNbdF09dGhpcy5fY3JlYXRlTmFtZWQoaS5lbmNvZGVyc1t0XSkpLHRoaXMuZW5jb2RlcnNbdF19LG8ucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZSkuZW5jb2RlKHQsbil9fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgaW5kZXhPZj1fX3dlYnBhY2tfcmVxdWlyZV9fKDIxMiksT2JqZWN0X2tleXM9ZnVuY3Rpb24odCl7aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0sZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKHQuZm9yRWFjaClyZXR1cm4gdC5mb3JFYWNoKGUpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUodFtuXSxuLHQpfSxkZWZpbmVQcm9wPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl8iLHt9KSxmdW5jdGlvbih0LGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7d3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsdmFsdWU6bn0pfX1jYXRjaCh0KXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3RbZV09bn19fSgpLGdsb2JhbHM9WyJBcnJheSIsIkJvb2xlYW4iLCJEYXRlIiwiRXJyb3IiLCJFdmFsRXJyb3IiLCJGdW5jdGlvbiIsIkluZmluaXR5IiwiSlNPTiIsIk1hdGgiLCJOYU4iLCJOdW1iZXIiLCJPYmplY3QiLCJSYW5nZUVycm9yIiwiUmVmZXJlbmNlRXJyb3IiLCJSZWdFeHAiLCJTdHJpbmciLCJTeW50YXhFcnJvciIsIlR5cGVFcnJvciIsIlVSSUVycm9yIiwiZGVjb2RlVVJJIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZW5jb2RlVVJJIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwiZXZhbCIsImlzRmluaXRlIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJ1bmRlZmluZWQiLCJ1bmVzY2FwZSJdO2Z1bmN0aW9uIENvbnRleHQoKXt9Q29udGV4dC5wcm90b3R5cGU9e307dmFyIFNjcmlwdD1leHBvcnRzLlNjcmlwdD1mdW5jdGlvbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBTY3JpcHQpKXJldHVybiBuZXcgU2NyaXB0KHQpO3RoaXMuY29kZT10fTtTY3JpcHQucHJvdG90eXBlLnJ1bkluQ29udGV4dD1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBDb250ZXh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuZWVkcyBhICdjb250ZXh0JyBhcmd1bWVudC4iKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlfHwoZS5zdHlsZT17fSksZS5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBuPWUuY29udGVudFdpbmRvdyxpPW4uZXZhbCxyPW4uZXhlY1NjcmlwdDshaSYmciYmKHIuY2FsbChuLCJudWxsIiksaT1uLmV2YWwpLGZvckVhY2goT2JqZWN0X2tleXModCksZnVuY3Rpb24oZSl7bltlXT10W2VdfSksZm9yRWFjaChnbG9iYWxzLGZ1bmN0aW9uKGUpe3RbZV0mJihuW2VdPXRbZV0pfSk7dmFyIG89T2JqZWN0X2tleXMobikscz1pLmNhbGwobix0aGlzLmNvZGUpO3JldHVybiBmb3JFYWNoKE9iamVjdF9rZXlzKG4pLGZ1bmN0aW9uKGUpeyhlIGluIHR8fC0xPT09aW5kZXhPZihvLGUpKSYmKHRbZV09bltlXSl9KSxmb3JFYWNoKGdsb2JhbHMsZnVuY3Rpb24oZSl7ZSBpbiB0fHxkZWZpbmVQcm9wKHQsZSxuW2VdKX0pLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksc30sU2NyaXB0LnByb3RvdHlwZS5ydW5JblRoaXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIGV2YWwodGhpcy5jb2RlKX0sU2NyaXB0LnByb3RvdHlwZS5ydW5Jbk5ld0NvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9U2NyaXB0LmNyZWF0ZUNvbnRleHQodCksbj10aGlzLnJ1bkluQ29udGV4dChlKTtyZXR1cm4gZm9yRWFjaChPYmplY3Rfa2V5cyhlKSxmdW5jdGlvbihuKXt0W25dPWVbbl19KSxufSxmb3JFYWNoKE9iamVjdF9rZXlzKFNjcmlwdC5wcm90b3R5cGUpLGZ1bmN0aW9uKHQpe2V4cG9ydHNbdF09U2NyaXB0W3RdPWZ1bmN0aW9uKGUpe3ZhciBuPVNjcmlwdChlKTtyZXR1cm4gblt0XS5hcHBseShuLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KSxleHBvcnRzLmNyZWF0ZVNjcmlwdD1mdW5jdGlvbih0KXtyZXR1cm4gZXhwb3J0cy5TY3JpcHQodCl9LGV4cG9ydHMuY3JlYXRlQ29udGV4dD1TY3JpcHQuY3JlYXRlQ29udGV4dD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQ29udGV4dDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJmZvckVhY2goT2JqZWN0X2tleXModCksZnVuY3Rpb24obil7ZVtuXT10W25dfSksZX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49W10uaW5kZXhPZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihuKXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpaWYodFtpXT09PWUpcmV0dXJuIGk7cmV0dXJuLTF9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKTtmdW5jdGlvbiByKHQpe3RoaXMuX3JlcG9ydGVyU3RhdGU9e29iajpudWxsLHBhdGg6W10sb3B0aW9uczp0fHx7fSxlcnJvcnM6W119fWZ1bmN0aW9uIG8odCxlKXt0aGlzLnBhdGg9dCx0aGlzLnJldGhyb3coZSl9ZS5SZXBvcnRlcj1yLHIucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvfSxyLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm57b2JqOnQub2JqLHBhdGhMZW46dC5wYXRoLmxlbmd0aH19LHIucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtlLm9iaj10Lm9iaixlLnBhdGg9ZS5wYXRoLnNsaWNlKDAsdC5wYXRoTGVuKX0sci5wcm90b3R5cGUuZW50ZXJLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKHQpfSxyLnByb3RvdHlwZS5leGl0S2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7ZS5wYXRoPWUucGF0aC5zbGljZSgwLHQtMSl9LHIucHJvdG90eXBlLmxlYXZlS2V5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9yZXBvcnRlclN0YXRlO3RoaXMuZXhpdEtleSh0KSxudWxsIT09aS5vYmomJihpLm9ialtlXT1uKX0sci5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbigiLyIpfSxyLnByb3RvdHlwZS5lbnRlck9iamVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlcG9ydGVyU3RhdGUsZT10Lm9iajtyZXR1cm4gdC5vYmo9e30sZX0sci5wcm90b3R5cGUubGVhdmVPYmplY3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxuPWUub2JqO3JldHVybiBlLm9iaj10LG59LHIucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5fcmVwb3J0ZXJTdGF0ZSxpPXQgaW5zdGFuY2VvZiBvO2lmKGU9aT90Om5ldyBvKG4ucGF0aC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIlsiK0pTT04uc3RyaW5naWZ5KHQpKyJdIn0pLmpvaW4oIiIpLHQubWVzc2FnZXx8dCx0LnN0YWNrKSwhbi5vcHRpb25zLnBhcnRpYWwpdGhyb3cgZTtyZXR1cm4gaXx8bi5lcnJvcnMucHVzaChlKSxlfSxyLnByb3RvdHlwZS53cmFwUmVzdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7cmV0dXJuIGUub3B0aW9ucy5wYXJ0aWFsP3tyZXN1bHQ6dGhpcy5pc0Vycm9yKHQpP251bGw6dCxlcnJvcnM6ZS5lcnJvcnN9OnR9LGkobyxFcnJvciksby5wcm90b3R5cGUucmV0aHJvdz1mdW5jdGlvbih0KXtpZih0aGlzLm1lc3NhZ2U9dCsiIGF0OiAiKyh0aGlzLnBhdGh8fCIoc2hhbGxvdykiKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxvKSwhdGhpcy5zdGFjayl0cnl7dGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSl9Y2F0Y2godCl7dGhpcy5zdGFjaz10LnN0YWNrfXJldHVybiB0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzYpLlJlcG9ydGVyLHI9bigzNikuRW5jb2RlckJ1ZmZlcixvPW4oMzYpLkRlY29kZXJCdWZmZXIscz1uKDE0KSxhPVsic2VxIiwic2Vxb2YiLCJzZXQiLCJzZXRvZiIsIm9iamlkIiwiYm9vbCIsImdlbnRpbWUiLCJ1dGN0aW1lIiwibnVsbF8iLCJlbnVtIiwiaW50Iiwib2JqRGVzYyIsImJpdHN0ciIsImJtcHN0ciIsImNoYXJzdHIiLCJnZW5zdHIiLCJncmFwaHN0ciIsImlhNXN0ciIsImlzbzY0NnN0ciIsIm51bXN0ciIsIm9jdHN0ciIsInByaW50c3RyIiwidDYxc3RyIiwidW5pc3RyIiwidXRmOHN0ciIsInZpZGVvc3RyIl0sdT1bImtleSIsIm9iaiIsInVzZSIsIm9wdGlvbmFsIiwiZXhwbGljaXQiLCJpbXBsaWNpdCIsImRlZiIsImNob2ljZSIsImFueSIsImNvbnRhaW5zIl0uY29uY2F0KGEpO2Z1bmN0aW9uIGModCxlKXt2YXIgbj17fTt0aGlzLl9iYXNlU3RhdGU9bixuLmVuYz10LG4ucGFyZW50PWV8fG51bGwsbi5jaGlsZHJlbj1udWxsLG4udGFnPW51bGwsbi5hcmdzPW51bGwsbi5yZXZlcnNlQXJncz1udWxsLG4uY2hvaWNlPW51bGwsbi5vcHRpb25hbD0hMSxuLmFueT0hMSxuLm9iaj0hMSxuLnVzZT1udWxsLG4udXNlRGVjb2Rlcj1udWxsLG4ua2V5PW51bGwsbi5kZWZhdWx0PW51bGwsbi5leHBsaWNpdD1udWxsLG4uaW1wbGljaXQ9bnVsbCxuLmNvbnRhaW5zPW51bGwsbi5wYXJlbnR8fChuLmNoaWxkcmVuPVtdLHRoaXMuX3dyYXAoKSl9dC5leHBvcnRzPWM7dmFyIGg9WyJlbmMiLCJwYXJlbnQiLCJjaGlsZHJlbiIsInRhZyIsImFyZ3MiLCJyZXZlcnNlQXJncyIsImNob2ljZSIsIm9wdGlvbmFsIiwiYW55Iiwib2JqIiwidXNlIiwiYWx0ZXJlZFVzZSIsImtleSIsImRlZmF1bHQiLCJleHBsaWNpdCIsImltcGxpY2l0IiwiY29udGFpbnMiXTtjLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPXt9O2guZm9yRWFjaChmdW5jdGlvbihuKXtlW25dPXRbbl19KTt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLnBhcmVudCk7cmV0dXJuIG4uX2Jhc2VTdGF0ZT1lLG59LGMucHJvdG90eXBlLl93cmFwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIG49bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuY2hpbGRyZW4ucHVzaChuKSxuW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19LHRoaXMpfSxjLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cyhudWxsPT09ZS5wYXJlbnQpLHQuY2FsbCh0aGlzKSxlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Ll9iYXNlU3RhdGUucGFyZW50PT09dGhpc30sdGhpcykscy5lcXVhbChlLmNoaWxkcmVuLmxlbmd0aCwxLCJSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQiKX0sYy5wcm90b3R5cGUuX3VzZUFyZ3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlLG49dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yfSx0aGlzKTt0PXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEodCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpfSx0aGlzKSwwIT09bi5sZW5ndGgmJihzKG51bGw9PT1lLmNoaWxkcmVuKSxlLmNoaWxkcmVuPW4sbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX2Jhc2VTdGF0ZS5wYXJlbnQ9dGhpc30sdGhpcykpLDAhPT10Lmxlbmd0aCYmKHMobnVsbD09PWUuYXJncyksZS5hcmdzPXQsZS5yZXZlcnNlQXJncz10Lm1hcChmdW5jdGlvbih0KXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fHQuY29uc3RydWN0b3IhPT1PYmplY3QpcmV0dXJuIHQ7dmFyIGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7bj09KDB8bikmJihufD0wKTt2YXIgaT10W25dO2VbaV09bn0pLGV9KSl9LFsiX3BlZWtUYWciLCJfZGVjb2RlVGFnIiwiX3VzZSIsIl9kZWNvZGVTdHIiLCJfZGVjb2RlT2JqaWQiLCJfZGVjb2RlVGltZSIsIl9kZWNvZGVOdWxsIiwiX2RlY29kZUludCIsIl9kZWNvZGVCb29sIiwiX2RlY29kZUxpc3QiLCJfZW5jb2RlQ29tcG9zaXRlIiwiX2VuY29kZVN0ciIsIl9lbmNvZGVPYmppZCIsIl9lbmNvZGVUaW1lIiwiX2VuY29kZU51bGwiLCJfZW5jb2RlSW50IiwiX2VuY29kZUJvb2wiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3Rocm93IG5ldyBFcnJvcih0KyIgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogIitlLmVuYyl9fSksYS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gcyhudWxsPT09ZS50YWcpLGUudGFnPXQsdGhpcy5fdXNlQXJncyhuKSx0aGlzfX0pLGMucHJvdG90eXBlLnVzZT1mdW5jdGlvbih0KXtzKHQpO3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gcyhudWxsPT09ZS51c2UpLGUudXNlPXQsdGhpc30sYy5wcm90b3R5cGUub3B0aW9uYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZVN0YXRlLm9wdGlvbmFsPSEwLHRoaXN9LGMucHJvdG90eXBlLmRlZj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUuZGVmYXVsdCksZS5kZWZhdWx0PXQsZS5vcHRpb25hbD0hMCx0aGlzfSxjLnByb3RvdHlwZS5leHBsaWNpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUuZXhwbGljaXQmJm51bGw9PT1lLmltcGxpY2l0KSxlLmV4cGxpY2l0PXQsdGhpc30sYy5wcm90b3R5cGUuaW1wbGljaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmV4cGxpY2l0JiZudWxsPT09ZS5pbXBsaWNpdCksZS5pbXBsaWNpdD10LHRoaXN9LGMucHJvdG90eXBlLm9iaj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQub2JqPSEwLDAhPT1lLmxlbmd0aCYmdGhpcy5fdXNlQXJncyhlKSx0aGlzfSxjLnByb3RvdHlwZS5rZXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmtleSksZS5rZXk9dCx0aGlzfSxjLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZVN0YXRlLmFueT0hMCx0aGlzfSxjLnByb3RvdHlwZS5jaG9pY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmNob2ljZSksZS5jaG9pY2U9dCx0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKSx0aGlzfSxjLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUudXNlKSxlLmNvbnRhaW5zPXQsdGhpc30sYy5wcm90b3R5cGUuX2RlY29kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09bi5wYXJlbnQpcmV0dXJuIHQud3JhcFJlc3VsdChuLmNoaWxkcmVuWzBdLl9kZWNvZGUodCxlKSk7dmFyIGkscj1uLmRlZmF1bHQscz0hMCxhPW51bGw7aWYobnVsbCE9PW4ua2V5JiYoYT10LmVudGVyS2V5KG4ua2V5KSksbi5vcHRpb25hbCl7dmFyIHU9bnVsbDtpZihudWxsIT09bi5leHBsaWNpdD91PW4uZXhwbGljaXQ6bnVsbCE9PW4uaW1wbGljaXQ/dT1uLmltcGxpY2l0Om51bGwhPT1uLnRhZyYmKHU9bi50YWcpLG51bGwhPT11fHxuLmFueSl7aWYocz10aGlzLl9wZWVrVGFnKHQsdSxuLmFueSksdC5pc0Vycm9yKHMpKXJldHVybiBzfWVsc2V7dmFyIGM9dC5zYXZlKCk7dHJ5e251bGw9PT1uLmNob2ljZT90aGlzLl9kZWNvZGVHZW5lcmljKG4udGFnLHQsZSk6dGhpcy5fZGVjb2RlQ2hvaWNlKHQsZSkscz0hMH1jYXRjaCh0KXtzPSExfXQucmVzdG9yZShjKX19aWYobi5vYmomJnMmJihpPXQuZW50ZXJPYmplY3QoKSkscyl7aWYobnVsbCE9PW4uZXhwbGljaXQpe3ZhciBoPXRoaXMuX2RlY29kZVRhZyh0LG4uZXhwbGljaXQpO2lmKHQuaXNFcnJvcihoKSlyZXR1cm4gaDt0PWh9dmFyIGw9dC5vZmZzZXQ7aWYobnVsbD09PW4udXNlJiZudWxsPT09bi5jaG9pY2Upe2lmKG4uYW55KWM9dC5zYXZlKCk7dmFyIGQ9dGhpcy5fZGVjb2RlVGFnKHQsbnVsbCE9PW4uaW1wbGljaXQ/bi5pbXBsaWNpdDpuLnRhZyxuLmFueSk7aWYodC5pc0Vycm9yKGQpKXJldHVybiBkO24uYW55P3I9dC5yYXcoYyk6dD1kfWlmKGUmJmUudHJhY2smJm51bGwhPT1uLnRhZyYmZS50cmFjayh0LnBhdGgoKSxsLHQubGVuZ3RoLCJ0YWdnZWQiKSxlJiZlLnRyYWNrJiZudWxsIT09bi50YWcmJmUudHJhY2sodC5wYXRoKCksdC5vZmZzZXQsdC5sZW5ndGgsImNvbnRlbnQiKSxyPW4uYW55P3I6bnVsbD09PW4uY2hvaWNlP3RoaXMuX2RlY29kZUdlbmVyaWMobi50YWcsdCxlKTp0aGlzLl9kZWNvZGVDaG9pY2UodCxlKSx0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYobi5hbnl8fG51bGwhPT1uLmNob2ljZXx8bnVsbD09PW4uY2hpbGRyZW58fG4uY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihuKXtuLl9kZWNvZGUodCxlKX0pLG4uY29udGFpbnMmJigib2N0c3RyIj09PW4udGFnfHwiYml0c3RyIj09PW4udGFnKSl7dmFyIGY9bmV3IG8ocik7cj10aGlzLl9nZXRVc2Uobi5jb250YWlucyx0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShmLGUpfX1yZXR1cm4gbi5vYmomJnMmJihyPXQubGVhdmVPYmplY3QoaSkpLG51bGw9PT1uLmtleXx8bnVsbD09PXImJiEwIT09cz9udWxsIT09YSYmdC5leGl0S2V5KGEpOnQubGVhdmVLZXkoYSxuLmtleSxyKSxyfSxjLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fYmFzZVN0YXRlO3JldHVybiJzZXEiPT09dHx8InNldCI9PT10P251bGw6InNlcW9mIj09PXR8fCJzZXRvZiI9PT10P3RoaXMuX2RlY29kZUxpc3QoZSx0LGkuYXJnc1swXSxuKTovc3RyJC8udGVzdCh0KT90aGlzLl9kZWNvZGVTdHIoZSx0LG4pOiJvYmppZCI9PT10JiZpLmFyZ3M/dGhpcy5fZGVjb2RlT2JqaWQoZSxpLmFyZ3NbMF0saS5hcmdzWzFdLG4pOiJvYmppZCI9PT10P3RoaXMuX2RlY29kZU9iamlkKGUsbnVsbCxudWxsLG4pOiJnZW50aW1lIj09PXR8fCJ1dGN0aW1lIj09PXQ/dGhpcy5fZGVjb2RlVGltZShlLHQsbik6Im51bGxfIj09PXQ/dGhpcy5fZGVjb2RlTnVsbChlLG4pOiJib29sIj09PXQ/dGhpcy5fZGVjb2RlQm9vbChlLG4pOiJvYmpEZXNjIj09PXQ/dGhpcy5fZGVjb2RlU3RyKGUsdCxuKToiaW50Ij09PXR8fCJlbnVtIj09PXQ/dGhpcy5fZGVjb2RlSW50KGUsaS5hcmdzJiZpLmFyZ3NbMF0sbik6bnVsbCE9PWkudXNlP3RoaXMuX2dldFVzZShpLnVzZSxlLl9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShlLG4pOmUuZXJyb3IoInVua25vd24gdGFnOiAiK3QpfSxjLnByb3RvdHlwZS5fZ2V0VXNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYmFzZVN0YXRlO3JldHVybiBuLnVzZURlY29kZXI9dGhpcy5fdXNlKHQsZSkscyhudWxsPT09bi51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50KSxuLnVzZURlY29kZXI9bi51c2VEZWNvZGVyLl9iYXNlU3RhdGUuY2hpbGRyZW5bMF0sbi5pbXBsaWNpdCE9PW4udXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0JiYobi51c2VEZWNvZGVyPW4udXNlRGVjb2Rlci5jbG9uZSgpLG4udXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0PW4uaW1wbGljaXQpLG4udXNlRGVjb2Rlcn0sYy5wcm90b3R5cGUuX2RlY29kZUNob2ljZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZSxpPW51bGwscj0hMTtyZXR1cm4gT2JqZWN0LmtleXMobi5jaG9pY2UpLnNvbWUoZnVuY3Rpb24obyl7dmFyIHM9dC5zYXZlKCksYT1uLmNob2ljZVtvXTt0cnl7dmFyIHU9YS5fZGVjb2RlKHQsZSk7aWYodC5pc0Vycm9yKHUpKXJldHVybiExO2k9e3R5cGU6byx2YWx1ZTp1fSxyPSEwfWNhdGNoKGUpe3JldHVybiB0LnJlc3RvcmUocyksITF9cmV0dXJuITB9LHRoaXMpLHI/aTp0LmVycm9yKCJDaG9pY2Ugbm90IG1hdGNoZWQiKX0sYy5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQsdGhpcy5yZXBvcnRlcil9LGMucHJvdG90eXBlLl9lbmNvZGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09aS5kZWZhdWx0fHxpLmRlZmF1bHQhPT10KXt2YXIgcj10aGlzLl9lbmNvZGVWYWx1ZSh0LGUsbik7aWYodm9pZCAwIT09ciYmIXRoaXMuX3NraXBEZWZhdWx0KHIsZSxuKSlyZXR1cm4gcn19LGMucHJvdG90eXBlLl9lbmNvZGVWYWx1ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fYmFzZVN0YXRlO2lmKG51bGw9PT1yLnBhcmVudClyZXR1cm4gci5jaGlsZHJlblswXS5fZW5jb2RlKHQsZXx8bmV3IGkpO3ZhciBvPW51bGw7aWYodGhpcy5yZXBvcnRlcj1lLHIub3B0aW9uYWwmJnZvaWQgMD09PXQpe2lmKG51bGw9PT1yLmRlZmF1bHQpcmV0dXJuO3Q9ci5kZWZhdWx0fXZhciBzPW51bGwsYT0hMTtpZihyLmFueSlvPXRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk7ZWxzZSBpZihyLmNob2ljZSlvPXRoaXMuX2VuY29kZUNob2ljZSh0LGUpO2Vsc2UgaWYoci5jb250YWlucylzPXRoaXMuX2dldFVzZShyLmNvbnRhaW5zLG4pLl9lbmNvZGUodCxlKSxhPSEwO2Vsc2UgaWYoci5jaGlsZHJlbilzPXIuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG4pe2lmKCJudWxsXyI9PT1uLl9iYXNlU3RhdGUudGFnKXJldHVybiBuLl9lbmNvZGUobnVsbCxlLHQpO2lmKG51bGw9PT1uLl9iYXNlU3RhdGUua2V5KXJldHVybiBlLmVycm9yKCJDaGlsZCBzaG91bGQgaGF2ZSBhIGtleSIpO3ZhciBpPWUuZW50ZXJLZXkobi5fYmFzZVN0YXRlLmtleSk7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXJldHVybiBlLmVycm9yKCJDaGlsZCBleHBlY3RlZCwgYnV0IGlucHV0IGlzIG5vdCBvYmplY3QiKTt2YXIgcj1uLl9lbmNvZGUodFtuLl9iYXNlU3RhdGUua2V5XSxlLHQpO3JldHVybiBlLmxlYXZlS2V5KGkpLHJ9LHRoaXMpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLHM9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzKTtlbHNlIGlmKCJzZXFvZiI9PT1yLnRhZ3x8InNldG9mIj09PXIudGFnKXtpZighci5hcmdzfHwxIT09ci5hcmdzLmxlbmd0aClyZXR1cm4gZS5lcnJvcigiVG9vIG1hbnkgYXJncyBmb3IgOiAiK3IudGFnKTtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5lcnJvcigic2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheSIpO3ZhciB1PXRoaXMuY2xvbmUoKTt1Ll9iYXNlU3RhdGUuaW1wbGljaXQ9bnVsbCxzPXRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodC5tYXAoZnVuY3Rpb24obil7dmFyIGk9dGhpcy5fYmFzZVN0YXRlO3JldHVybiB0aGlzLl9nZXRVc2UoaS5hcmdzWzBdLHQpLl9lbmNvZGUobixlKX0sdSkpfWVsc2UgbnVsbCE9PXIudXNlP289dGhpcy5fZ2V0VXNlKHIudXNlLG4pLl9lbmNvZGUodCxlKToocz10aGlzLl9lbmNvZGVQcmltaXRpdmUoci50YWcsdCksYT0hMCk7aWYoIXIuYW55JiZudWxsPT09ci5jaG9pY2Upe3ZhciBjPW51bGwhPT1yLmltcGxpY2l0P3IuaW1wbGljaXQ6ci50YWcsaD1udWxsPT09ci5pbXBsaWNpdD8idW5pdmVyc2FsIjoiY29udGV4dCI7bnVsbD09PWM/bnVsbD09PXIudXNlJiZlLmVycm9yKCJUYWcgY291bGQgYmUgb21pdHRlZCBvbmx5IGZvciAudXNlKCkiKTpudWxsPT09ci51c2UmJihvPXRoaXMuX2VuY29kZUNvbXBvc2l0ZShjLGEsaCxzKSl9cmV0dXJuIG51bGwhPT1yLmV4cGxpY2l0JiYobz10aGlzLl9lbmNvZGVDb21wb3NpdGUoci5leHBsaWNpdCwhMSwiY29udGV4dCIsbykpLG99LGMucHJvdG90eXBlLl9lbmNvZGVDaG9pY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9iYXNlU3RhdGUsaT1uLmNob2ljZVt0LnR5cGVdO3JldHVybiBpfHxzKCExLHQudHlwZSsiIG5vdCBmb3VuZCBpbiAiK0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKG4uY2hvaWNlKSkpLGkuX2VuY29kZSh0LnZhbHVlLGUpfSxjLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYmFzZVN0YXRlO2lmKC9zdHIkLy50ZXN0KHQpKXJldHVybiB0aGlzLl9lbmNvZGVTdHIoZSx0KTtpZigib2JqaWQiPT09dCYmbi5hcmdzKXJldHVybiB0aGlzLl9lbmNvZGVPYmppZChlLG4ucmV2ZXJzZUFyZ3NbMF0sbi5hcmdzWzFdKTtpZigib2JqaWQiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZSxudWxsLG51bGwpO2lmKCJnZW50aW1lIj09PXR8fCJ1dGN0aW1lIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZSx0KTtpZigibnVsbF8iPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO2lmKCJpbnQiPT09dHx8ImVudW0iPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlSW50KGUsbi5hcmdzJiZuLnJldmVyc2VBcmdzWzBdKTtpZigiYm9vbCI9PT10KXJldHVybiB0aGlzLl9lbmNvZGVCb29sKGUpO2lmKCJvYmpEZXNjIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZVN0cihlLHQpO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgdGFnOiAiK3QpfSxjLnByb3RvdHlwZS5faXNOdW1zdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bMC05IF0qJC8udGVzdCh0KX0sYy5wcm90b3R5cGUuX2lzUHJpbnRzdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bQS1aYS16MC05ICdcKFwpXCssXC1cLlwvOj1cP10qJC8udGVzdCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDExMSk7ZS50YWdDbGFzcz17MDoidW5pdmVyc2FsIiwxOiJhcHBsaWNhdGlvbiIsMjoiY29udGV4dCIsMzoicHJpdmF0ZSJ9LGUudGFnQ2xhc3NCeU5hbWU9aS5fcmV2ZXJzZShlLnRhZ0NsYXNzKSxlLnRhZz17MDoiZW5kIiwxOiJib29sIiwyOiJpbnQiLDM6ImJpdHN0ciIsNDoib2N0c3RyIiw1OiJudWxsXyIsNjoib2JqaWQiLDc6Im9iakRlc2MiLDg6ImV4dGVybmFsIiw5OiJyZWFsIiwxMDoiZW51bSIsMTE6ImVtYmVkIiwxMjoidXRmOHN0ciIsMTM6InJlbGF0aXZlT2lkIiwxNjoic2VxIiwxNzoic2V0IiwxODoibnVtc3RyIiwxOToicHJpbnRzdHIiLDIwOiJ0NjFzdHIiLDIxOiJ2aWRlb3N0ciIsMjI6ImlhNXN0ciIsMjM6InV0Y3RpbWUiLDI0OiJnZW50aW1lIiwyNToiZ3JhcGhzdHIiLDI2OiJpc282NDZzdHIiLDI3OiJnZW5zdHIiLDI4OiJ1bmlzdHIiLDI5OiJjaGFyc3RyIiwzMDoiYm1wc3RyIn0sZS50YWdCeU5hbWU9aS5fcmV2ZXJzZShlLnRhZyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lO2kuZGVyPW4oMTEyKSxpLnBlbT1uKDIxNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big0KS5CdWZmZXIsbz1uKDExMik7ZnVuY3Rpb24gcyh0KXtvLmNhbGwodGhpcyx0KSx0aGlzLmVuYz0icGVtIn1pKHMsbyksdC5leHBvcnRzPXMscy5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQudG9TdHJpbmcoKS5zcGxpdCgvW1xyXG5dKy9nKSxpPWUubGFiZWwudG9VcHBlckNhc2UoKSxzPS9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLyxhPS0xLHU9LTEsYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgaD1uW2NdLm1hdGNoKHMpO2lmKG51bGwhPT1oJiZoWzJdPT09aSl7aWYoLTEhPT1hKXtpZigiRU5EIiE9PWhbMV0pYnJlYWs7dT1jO2JyZWFrfWlmKCJCRUdJTiIhPT1oWzFdKWJyZWFrO2E9Y319aWYoLTE9PT1hfHwtMT09PXUpdGhyb3cgbmV3IEVycm9yKCJQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAiK2kpO3ZhciBsPW4uc2xpY2UoYSsxLHUpLmpvaW4oIiIpO2wucmVwbGFjZSgvW15hLXowLTlcK1wvPV0rL2dpLCIiKTt2YXIgZD1uZXcgcihsLCJiYXNlNjQiKTtyZXR1cm4gby5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcyxkLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPWU7aS5kZXI9bigxMTMpLGkucGVtPW4oMjE5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDExMyk7ZnVuY3Rpb24gbyh0KXtyLmNhbGwodGhpcyx0KSx0aGlzLmVuYz0icGVtIn1pKG8sciksdC5leHBvcnRzPW8sby5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsdCkudG9TdHJpbmcoImJhc2U2NCIpLGk9WyItLS0tLUJFR0lOICIrZS5sYWJlbCsiLS0tLS0iXSxvPTA7bzxuLmxlbmd0aDtvKz02NClpLnB1c2gobi5zbGljZShvLG8rNjQpKTtyZXR1cm4gaS5wdXNoKCItLS0tLUVORCAiK2UubGFiZWwrIi0tLS0tIiksaS5qb2luKCJcbiIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDM1KSxyPWkuZGVmaW5lKCJUaW1lIixmdW5jdGlvbigpe3RoaXMuY2hvaWNlKHt1dGNUaW1lOnRoaXMudXRjdGltZSgpLGdlbmVyYWxUaW1lOnRoaXMuZ2VudGltZSgpfSl9KSxvPWkuZGVmaW5lKCJBdHRyaWJ1dGVUeXBlVmFsdWUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInR5cGUiKS5vYmppZCgpLHRoaXMua2V5KCJ2YWx1ZSIpLmFueSgpKX0pLHM9aS5kZWZpbmUoIkFsZ29yaXRobUlkZW50aWZpZXIiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImFsZ29yaXRobSIpLm9iamlkKCksdGhpcy5rZXkoInBhcmFtZXRlcnMiKS5vcHRpb25hbCgpKX0pLGE9aS5kZWZpbmUoIlN1YmplY3RQdWJsaWNLZXlJbmZvIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS51c2UocyksdGhpcy5rZXkoInN1YmplY3RQdWJsaWNLZXkiKS5iaXRzdHIoKSl9KSx1PWkuZGVmaW5lKCJSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lIixmdW5jdGlvbigpe3RoaXMuc2V0b2Yobyl9KSxjPWkuZGVmaW5lKCJSRE5TZXF1ZW5jZSIsZnVuY3Rpb24oKXt0aGlzLnNlcW9mKHUpfSksaD1pLmRlZmluZSgiTmFtZSIsZnVuY3Rpb24oKXt0aGlzLmNob2ljZSh7cmRuU2VxdWVuY2U6dGhpcy51c2UoYyl9KX0pLGw9aS5kZWZpbmUoIlZhbGlkaXR5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJub3RCZWZvcmUiKS51c2UociksdGhpcy5rZXkoIm5vdEFmdGVyIikudXNlKHIpKX0pLGQ9aS5kZWZpbmUoIkV4dGVuc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiZXh0bklEIikub2JqaWQoKSx0aGlzLmtleSgiY3JpdGljYWwiKS5ib29sKCkuZGVmKCExKSx0aGlzLmtleSgiZXh0blZhbHVlIikub2N0c3RyKCkpfSksZj1pLmRlZmluZSgiVEJTQ2VydGlmaWNhdGUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5leHBsaWNpdCgwKS5pbnQoKSx0aGlzLmtleSgic2VyaWFsTnVtYmVyIikuaW50KCksdGhpcy5rZXkoInNpZ25hdHVyZSIpLnVzZShzKSx0aGlzLmtleSgiaXNzdWVyIikudXNlKGgpLHRoaXMua2V5KCJ2YWxpZGl0eSIpLnVzZShsKSx0aGlzLmtleSgic3ViamVjdCIpLnVzZShoKSx0aGlzLmtleSgic3ViamVjdFB1YmxpY0tleUluZm8iKS51c2UoYSksdGhpcy5rZXkoImlzc3VlclVuaXF1ZUlEIikuaW1wbGljaXQoMSkuYml0c3RyKCkub3B0aW9uYWwoKSx0aGlzLmtleSgic3ViamVjdFVuaXF1ZUlEIikuaW1wbGljaXQoMikuYml0c3RyKCkub3B0aW9uYWwoKSx0aGlzLmtleSgiZXh0ZW5zaW9ucyIpLmV4cGxpY2l0KDMpLnNlcW9mKGQpLm9wdGlvbmFsKCkpfSkscD1pLmRlZmluZSgiWDUwOUNlcnRpZmljYXRlIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ0YnNDZXJ0aWZpY2F0ZSIpLnVzZShmKSx0aGlzLmtleSgic2lnbmF0dXJlQWxnb3JpdGhtIikudXNlKHMpLHRoaXMua2V5KCJzaWduYXR1cmVWYWx1ZSIpLmJpdHN0cigpKX0pO3QuZXhwb3J0cz1wfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9eyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4xIjoiYWVzLTEyOC1lY2IiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yIjoiYWVzLTEyOC1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zIjoiYWVzLTEyOC1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40IjoiYWVzLTEyOC1jZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSI6ImFlcy0xOTItZWNiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjIiOiJhZXMtMTkyLWNiYyIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIzIjoiYWVzLTE5Mi1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCI6ImFlcy0xOTItY2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDEiOiJhZXMtMjU2LWVjYiIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQyIjoiYWVzLTI1Ni1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MyI6ImFlcy0yNTYtb2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDQiOiJhZXMtMjU2LWNmYiJ9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBpPS9Qcm9jLVR5cGU6IDQsRU5DUllQVEVEW1xuXHJdK0RFSy1JbmZvOiBBRVMtKCg/OjEyOCl8KD86MTkyKXwoPzoyNTYpKS1DQkMsKFswLTlBLUhdKylbXG5ccl0rKFswLTlBLXpcblxyXCtcL1w9XSspW1xuXHJdKy9tLHI9L14tLS0tLUJFR0lOICgoPzouKiBLRVkpfENFUlRJRklDQVRFKS0tLS0tL20sbz0vXi0tLS0tQkVHSU4gKCg/Oi4qIEtFWSl8Q0VSVElGSUNBVEUpLS0tLS0oWzAtOUEtelxuXHJcK1wvXD1dKyktLS0tLUVORCBcMS0tLS0tJC9tLHM9big0NiksYT1uKDY3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgdSxjPXQudG9TdHJpbmcoKSxoPWMubWF0Y2goaSk7aWYoaCl7dmFyIGw9ImFlcyIraFsxXSxkPW5ldyBlKGhbMl0sImhleCIpLGY9bmV3IGUoaFszXS5yZXBsYWNlKC9bXHJcbl0vZywiIiksImJhc2U2NCIpLHA9cyhuLGQuc2xpY2UoMCw4KSxwYXJzZUludChoWzFdLDEwKSkua2V5LG09W10sZz1hLmNyZWF0ZURlY2lwaGVyaXYobCxwLGQpO20ucHVzaChnLnVwZGF0ZShmKSksbS5wdXNoKGcuZmluYWwoKSksdT1lLmNvbmNhdChtKX1lbHNle3ZhciB2PWMubWF0Y2gobyk7dT1uZXcgZSh2WzJdLnJlcGxhY2UoL1tcclxuXS9nLCIiKSwiYmFzZTY0Iil9cmV0dXJue3RhZzpjLm1hdGNoKHIpWzFdLGRhdGE6dX19fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDMpLHI9bigxMCkuZWMsbz1uKDQ5KSxzPW4oMTE0KTtmdW5jdGlvbiBhKHQsZSl7aWYodC5jbXBuKDApPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaWciKTtpZih0LmNtcChlKT49ZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2lnIil9dC5leHBvcnRzPWZ1bmN0aW9uKHQsbix1LGMsaCl7dmFyIGw9byh1KTtpZigiZWMiPT09bC50eXBlKXtpZigiZWNkc2EiIT09YyYmImVjZHNhL3JzYSIhPT1jKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1zW24uZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbigiLiIpXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY3VydmUgIituLmRhdGEuYWxnb3JpdGhtLmN1cnZlLmpvaW4oIi4iKSk7dmFyIG89bmV3IHIoaSksYT1uLmRhdGEuc3ViamVjdFByaXZhdGVLZXkuZGF0YTtyZXR1cm4gby52ZXJpZnkoZSx0LGEpfSh0LG4sbCl9aWYoImRzYSI9PT1sLnR5cGUpe2lmKCJkc2EiIT09Yyl0aHJvdyBuZXcgRXJyb3IoIndyb25nIHB1YmxpYyBrZXkgdHlwZSIpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9bi5kYXRhLnAscz1uLmRhdGEucSx1PW4uZGF0YS5nLGM9bi5kYXRhLnB1Yl9rZXksaD1vLnNpZ25hdHVyZS5kZWNvZGUodCwiZGVyIiksbD1oLnMsZD1oLnI7YShsLHMpLGEoZCxzKTt2YXIgZj1pLm1vbnQocikscD1sLmludm0ocyk7cmV0dXJuIDA9PT11LnRvUmVkKGYpLnJlZFBvdyhuZXcgaShlKS5tdWwocCkubW9kKHMpKS5mcm9tUmVkKCkubXVsKGMudG9SZWQoZikucmVkUG93KGQubXVsKHApLm1vZChzKSkuZnJvbVJlZCgpKS5tb2QocikubW9kKHMpLmNtcChkKX0odCxuLGwpfWlmKCJyc2EiIT09YyYmImVjZHNhL3JzYSIhPT1jKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7bj1lLmNvbmNhdChbaCxuXSk7Zm9yKHZhciBkPWwubW9kdWx1cy5ieXRlTGVuZ3RoKCksZj1bMV0scD0wO24ubGVuZ3RoK2YubGVuZ3RoKzI8ZDspZi5wdXNoKDI1NSkscCsrO2YucHVzaCgwKTtmb3IodmFyIG09LTE7KyttPG4ubGVuZ3RoOylmLnB1c2goblttXSk7Zj1uZXcgZShmKTt2YXIgZz1pLm1vbnQobC5tb2R1bHVzKTt0PSh0PW5ldyBpKHQpLnRvUmVkKGcpKS5yZWRQb3cobmV3IGkobC5wdWJsaWNFeHBvbmVudCkpLHQ9bmV3IGUodC5mcm9tUmVkKCkudG9BcnJheSgpKTt2YXIgdj1wPDg/MTowO2ZvcihkPU1hdGgubWluKHQubGVuZ3RoLGYubGVuZ3RoKSx0Lmxlbmd0aCE9PWYubGVuZ3RoJiYodj0xKSxtPS0xOysrbTxkOyl2fD10W21dXmZbbV07cmV0dXJuIDA9PT12fX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9bigxMCkscj1uKDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHModCl9O3ZhciBvPXtzZWNwMjU2azE6e25hbWU6InNlY3AyNTZrMSIsYnl0ZUxlbmd0aDozMn0sc2VjcDIyNHIxOntuYW1lOiJwMjI0IixieXRlTGVuZ3RoOjI4fSxwcmltZTI1NnYxOntuYW1lOiJwMjU2IixieXRlTGVuZ3RoOjMyfSxwcmltZTE5MnYxOntuYW1lOiJwMTkyIixieXRlTGVuZ3RoOjI0fSxlZDI1NTE5OntuYW1lOiJlZDI1NTE5IixieXRlTGVuZ3RoOjMyfSxzZWNwMzg0cjE6e25hbWU6InAzODQiLGJ5dGVMZW5ndGg6NDh9LHNlY3A1MjFyMTp7bmFtZToicDUyMSIsYnl0ZUxlbmd0aDo2Nn19O2Z1bmN0aW9uIHModCl7dGhpcy5jdXJ2ZVR5cGU9b1t0XSx0aGlzLmN1cnZlVHlwZXx8KHRoaXMuY3VydmVUeXBlPXtuYW1lOnR9KSx0aGlzLmN1cnZlPW5ldyBpLmVjKHRoaXMuY3VydmVUeXBlLm5hbWUpLHRoaXMua2V5cz12b2lkIDB9ZnVuY3Rpb24gYSh0LG4saSl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9dC50b0FycmF5KCkpO3ZhciByPW5ldyBlKHQpO2lmKGkmJnIubGVuZ3RoPGkpe3ZhciBvPW5ldyBlKGktci5sZW5ndGgpO28uZmlsbCgwKSxyPWUuY29uY2F0KFtvLHJdKX1yZXR1cm4gbj9yLnRvU3RyaW5nKG4pOnJ9by5wMjI0PW8uc2VjcDIyNHIxLG8ucDI1Nj1vLnNlY3AyNTZyMT1vLnByaW1lMjU2djEsby5wMTkyPW8uc2VjcDE5MnIxPW8ucHJpbWUxOTJ2MSxvLnAzODQ9by5zZWNwMzg0cjEsby5wNTIxPW8uc2VjcDUyMXIxLHMucHJvdG90eXBlLmdlbmVyYXRlS2V5cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmtleXM9dGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCksdGhpcy5nZXRQdWJsaWNLZXkodCxlKX0scy5wcm90b3R5cGUuY29tcHV0ZVNlY3JldD1mdW5jdGlvbih0LG4saSl7cmV0dXJuIG49bnx8InV0ZjgiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQsbikpLGEodGhpcy5jdXJ2ZS5rZXlGcm9tUHVibGljKHQpLmdldFB1YmxpYygpLm11bCh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpKS5nZXRYKCksaSx0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKX0scy5wcm90b3R5cGUuZ2V0UHVibGljS2V5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5rZXlzLmdldFB1YmxpYygiY29tcHJlc3NlZCI9PT1lLCEwKTtyZXR1cm4iaHlicmlkIj09PWUmJihuW24ubGVuZ3RoLTFdJTI/blswXT03Om5bMF09NiksYShuLHQpfSxzLnByb3RvdHlwZS5nZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQpe3JldHVybiBhKHRoaXMua2V5cy5nZXRQcml2YXRlKCksdCl9LHMucHJvdG90eXBlLnNldFB1YmxpY0tleT1mdW5jdGlvbih0LG4pe3JldHVybiBuPW58fCJ1dGY4IixlLmlzQnVmZmVyKHQpfHwodD1uZXcgZSh0LG4pKSx0aGlzLmtleXMuX2ltcG9ydFB1YmxpYyh0KSx0aGlzfSxzLnByb3RvdHlwZS5zZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQsbil7bj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSk7dmFyIGk9bmV3IHIodCk7cmV0dXJuIGk9aS50b1N0cmluZygxNiksdGhpcy5rZXlzPXRoaXMuY3VydmUuZ2VuS2V5UGFpcigpLHRoaXMua2V5cy5faW1wb3J0UHJpdmF0ZShpKSx0aGlzfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXtlLnB1YmxpY0VuY3J5cHQ9bigyMjYpLGUucHJpdmF0ZURlY3J5cHQ9bigyMjcpLGUucHJpdmF0ZUVuY3J5cHQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5wdWJsaWNFbmNyeXB0KHQsbiwhMCl9LGUucHVibGljRGVjcnlwdD1mdW5jdGlvbih0LG4pe3JldHVybiBlLnByaXZhdGVEZWNyeXB0KHQsbiwhMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big0OSkscj1uKDI3KSxvPW4oMzEpLHM9bigxMTUpLGE9bigxMTYpLHU9bigzKSxjPW4oMTE3KSxoPW4oNjkpLGw9bigxKS5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgZDtkPXQucGFkZGluZz90LnBhZGRpbmc6bj8xOjQ7dmFyIGYscD1pKHQpO2lmKDQ9PT1kKWY9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGk9ZS5sZW5ndGgsYz1vKCJzaGExIikudXBkYXRlKGwuYWxsb2MoMCkpLmRpZ2VzdCgpLGg9Yy5sZW5ndGgsZD0yKmg7aWYoaT5uLWQtMil0aHJvdyBuZXcgRXJyb3IoIm1lc3NhZ2UgdG9vIGxvbmciKTt2YXIgZj1sLmFsbG9jKG4taS1kLTIpLHA9bi1oLTEsbT1yKGgpLGc9YShsLmNvbmNhdChbYyxmLGwuYWxsb2MoMSwxKSxlXSxwKSxzKG0scCkpLHY9YShtLHMoZyxoKSk7cmV0dXJuIG5ldyB1KGwuY29uY2F0KFtsLmFsbG9jKDEpLHYsZ10sbikpfShwLGUpO2Vsc2UgaWYoMT09PWQpZj1mdW5jdGlvbih0LGUsbil7dmFyIGksbz1lLmxlbmd0aCxzPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCk7aWYobz5zLTExKXRocm93IG5ldyBFcnJvcigibWVzc2FnZSB0b28gbG9uZyIpO2k9bj9sLmFsbG9jKHMtby0zLDI1NSk6ZnVuY3Rpb24odCl7dmFyIGUsbj1sLmFsbG9jVW5zYWZlKHQpLGk9MCxvPXIoMip0KSxzPTA7Zm9yKDtpPHQ7KXM9PT1vLmxlbmd0aCYmKG89cigyKnQpLHM9MCksKGU9b1tzKytdKSYmKG5baSsrXT1lKTtyZXR1cm4gbn0ocy1vLTMpO3JldHVybiBuZXcgdShsLmNvbmNhdChbbC5mcm9tKFswLG4/MToyXSksaSxsLmFsbG9jKDEpLGVdLHMpKX0ocCxlLG4pO2Vsc2V7aWYoMyE9PWQpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHBhZGRpbmciKTtpZigoZj1uZXcgdShlKSkuY21wKHAubW9kdWx1cyk+PTApdGhyb3cgbmV3IEVycm9yKCJkYXRhIHRvbyBsb25nIGZvciBtb2R1bHVzIil9cmV0dXJuIG4/aChmLHApOmMoZixwKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDQ5KSxyPW4oMTE1KSxvPW4oMTE2KSxzPW4oMyksYT1uKDY5KSx1PW4oMzEpLGM9bigxMTcpLGg9bigxKS5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbDtsPXQucGFkZGluZz90LnBhZGRpbmc6bj8xOjQ7dmFyIGQsZj1pKHQpLHA9Zi5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtpZihlLmxlbmd0aD5wfHxuZXcgcyhlKS5jbXAoZi5tb2R1bHVzKT49MCl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTtkPW4/YyhuZXcgcyhlKSxmKTphKGUsZik7dmFyIG09aC5hbGxvYyhwLWQubGVuZ3RoKTtpZihkPWguY29uY2F0KFttLGRdLHApLDQ9PT1sKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCksaT11KCJzaGExIikudXBkYXRlKGguYWxsb2MoMCkpLmRpZ2VzdCgpLHM9aS5sZW5ndGg7aWYoMCE9PWVbMF0pdGhyb3cgbmV3IEVycm9yKCJkZWNyeXB0aW9uIGVycm9yIik7dmFyIGE9ZS5zbGljZSgxLHMrMSksYz1lLnNsaWNlKHMrMSksbD1vKGEscihjLHMpKSxkPW8oYyxyKGwsbi1zLTEpKTtpZihmdW5jdGlvbih0LGUpe3Q9aC5mcm9tKHQpLGU9aC5mcm9tKGUpO3ZhciBuPTAsaT10Lmxlbmd0aDt0Lmxlbmd0aCE9PWUubGVuZ3RoJiYobisrLGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpKTt2YXIgcj0tMTtmb3IoOysrcjxpOyluKz10W3JdXmVbcl07cmV0dXJuIG59KGksZC5zbGljZSgwLHMpKSl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTt2YXIgZj1zO2Zvcig7MD09PWRbZl07KWYrKztpZigxIT09ZFtmKytdKXRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpO3JldHVybiBkLnNsaWNlKGYpfShmLGQpO2lmKDE9PT1sKXJldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5zbGljZSgwLDIpLHI9MixvPTA7Zm9yKDswIT09ZVtyKytdOylpZihyPj1lLmxlbmd0aCl7bysrO2JyZWFrfXZhciBzPWUuc2xpY2UoMixyLTEpOygiMDAwMiIhPT1pLnRvU3RyaW5nKCJoZXgiKSYmIW58fCIwMDAxIiE9PWkudG9TdHJpbmcoImhleCIpJiZuKSYmbysrO3MubGVuZ3RoPDgmJm8rKztpZihvKXRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpO3JldHVybiBlLnNsaWNlKHIpfSgwLGQsbik7aWYoMz09PWwpcmV0dXJuIGQ7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHBhZGRpbmciKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigic2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclxudXNlIGNocm9tZSwgRmlyZUZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfXZhciBvPW4oMSkscz1uKDI3KSxhPW8uQnVmZmVyLHU9by5rTWF4TGVuZ3RoLGM9dC5jcnlwdG98fHQubXNDcnlwdG8saD1NYXRoLnBvdygyLDMyKS0xO2Z1bmN0aW9uIGwodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQhPXQpdGhyb3cgbmV3IFR5cGVFcnJvcigib2Zmc2V0IG11c3QgYmUgYSBudW1iZXIiKTtpZih0Pmh8fHQ8MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvZmZzZXQgbXVzdCBiZSBhIHVpbnQzMiIpO2lmKHQ+dXx8dD5lKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZCh0LGUsbil7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0IT10KXRocm93IG5ldyBUeXBlRXJyb3IoInNpemUgbXVzdCBiZSBhIG51bWJlciIpO2lmKHQ+aHx8dDwwKXRocm93IG5ldyBUeXBlRXJyb3IoInNpemUgbXVzdCBiZSBhIHVpbnQzMiIpO2lmKHQrZT5ufHx0PnUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImJ1ZmZlciB0b28gc21hbGwiKX1mdW5jdGlvbiBmKHQsZSxuLHIpe2lmKGkuYnJvd3Nlcil7dmFyIG89dC5idWZmZXIsYT1uZXcgVWludDhBcnJheShvLGUsbik7cmV0dXJuIGMuZ2V0UmFuZG9tVmFsdWVzKGEpLHI/dm9pZCBpLm5leHRUaWNrKGZ1bmN0aW9uKCl7cihudWxsLHQpfSk6dH1pZighcilyZXR1cm4gcyhuKS5jb3B5KHQsZSksdDtzKG4sZnVuY3Rpb24obixpKXtpZihuKXJldHVybiByKG4pO2kuY29weSh0LGUpLHIobnVsbCx0KX0pfWMmJmMuZ2V0UmFuZG9tVmFsdWVzfHwhaS5icm93c2VyPyhlLnJhbmRvbUZpbGw9ZnVuY3Rpb24oZSxuLGkscil7aWYoIShhLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgdC5VaW50OEFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyPW4sbj0wLGk9ZS5sZW5ndGg7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgaSlyPWksaT1lLmxlbmd0aC1uO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignImNiIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gbChuLGUubGVuZ3RoKSxkKGksbixlLmxlbmd0aCksZihlLG4saSxyKX0sZS5yYW5kb21GaWxsU3luYz1mdW5jdGlvbihlLG4saSl7dm9pZCAwPT09biYmKG49MCk7aWYoIShhLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgdC5VaW50OEFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtsKG4sZS5sZW5ndGgpLHZvaWQgMD09PWkmJihpPWUubGVuZ3RoLW4pO3JldHVybiBkKGksbixlLmxlbmd0aCksZihlLG4saSl9KTooZS5yYW5kb21GaWxsPXIsZS5yYW5kb21GaWxsU3luYz1yKX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMubmFtZT10LHRoaXMuX3Rva2VuU3RydWN0dXJhbFByb3BlcnR5VD1udWxsfX0oKTtlLlRva2VuPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oODIpOyFmdW5jdGlvbih0KXt0LnV1aWQ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBVaW50OEFycmF5KDE2KSxlPW5ldyBBcnJheSgyNTYpLG49MDtuPDE2OysrbillW25dPSIwIituLnRvU3RyaW5nKDE2KTtmb3Iobj0xNjtuPDI1NjsrK24pZVtuXT1uLnRvU3RyaW5nKDE2KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5SYW5kb20uZ2V0UmFuZG9tVmFsdWVzKHQpLHRbNl09NjR8MTUmdFs2XSx0WzhdPTEyOHw2MyZ0WzhdLGVbdFswXV0rZVt0WzFdXStlW3RbMl1dK2VbdFszXV0rIi0iK2VbdFs0XV0rZVt0WzVdXSsiLSIrZVt0WzZdXStlW3RbN11dKyItIitlW3RbOF1dK2VbdFs5XV0rIi0iK2VbdFsxMF1dK2VbdFsxMV1dK2VbdFsxMl1dK2VbdFsxM11dK2VbdFsxNF1dK2VbdFsxNV1dfX0oKX0oZS5VVUlEfHwoZS5VVUlEPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzMykscj1uKDM4KTt0LmV4cG9ydHM9ZnVuY3Rpb24gdChlLG4sbyxzLGEpe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFyKGUpJiYhcihuKT9lIT1lJiZuIT1uOmkoZSxuLG8scyx0LGEpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzNCkscj1uKDEyNCksbz1uKDI2OCkscz1uKDI3MiksYT1uKDI5MyksdT1uKDczKSxjPW4oMTI1KSxoPW4oMTI2KSxsPTEsZD0iW29iamVjdCBBcmd1bWVudHNdIixmPSJbb2JqZWN0IEFycmF5XSIscD0iW29iamVjdCBPYmplY3RdIixtPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGcsdixiKXt2YXIgeT11KHQpLF89dShlKSx3PXk/ZjphKHQpLHg9Xz9mOmEoZSksTT0odz13PT1kP3A6dyk9PXAsUz0oeD14PT1kP3A6eCk9PXAsRT13PT14O2lmKEUmJmModCkpe2lmKCFjKGUpKXJldHVybiExO3k9ITAsTT0hMX1pZihFJiYhTSlyZXR1cm4gYnx8KGI9bmV3IGkpLHl8fGgodCk/cih0LGUsbixnLHYsYik6byh0LGUsdyxuLGcsdixiKTtpZighKG4mbCkpe3ZhciBBPU0mJm0uY2FsbCh0LCJfX3dyYXBwZWRfXyIpLEM9UyYmbS5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoQXx8Qyl7dmFyIGs9QT90LnZhbHVlKCk6dCxPPUM/ZS52YWx1ZSgpOmU7cmV0dXJuIGJ8fChiPW5ldyBpKSx2KGssTyxuLGcsYil9fXJldHVybiEhRSYmKGJ8fChiPW5ldyBpKSxzKHQsZSxuLGcsdixiKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1MCkscj1uKDI0MCksbz1uKDI0MSkscz1uKDI0MiksYT1uKDI0MyksdT1uKDI0NCk7ZnVuY3Rpb24gYyh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBpKHQpO3RoaXMuc2l6ZT1lLnNpemV9Yy5wcm90b3R5cGUuY2xlYXI9cixjLnByb3RvdHlwZS5kZWxldGU9byxjLnByb3RvdHlwZS5nZXQ9cyxjLnByb3RvdHlwZS5oYXM9YSxjLnByb3RvdHlwZS5zZXQ9dSx0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpLHI9QXJyYXkucHJvdG90eXBlLnNwbGljZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWkoZSx0KTtyZXR1cm4hKG48MHx8KG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpyLmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLDApKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWkoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLl9fZGF0YV9fLHQpPi0xfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1pKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1MCk7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgaSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTApLHI9big3MSksbz1uKDEyMykscz0yMDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgaSl7dmFyIGE9bi5fX2RhdGFfXztpZighcnx8YS5sZW5ndGg8cy0xKXJldHVybiBhLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgbyhhKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMTkpLHI9bigyNDgpLG89bigxMjEpLHM9bigxMjIpLGE9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sdT1GdW5jdGlvbi5wcm90b3R5cGUsYz1PYmplY3QucHJvdG90eXBlLGg9dS50b1N0cmluZyxsPWMuaGFzT3duUHJvcGVydHksZD1SZWdFeHAoIl4iK2guY2FsbChsKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISghbyh0KXx8cih0KSkmJihpKHQpP2Q6YSkudGVzdChzKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDcyKSxyPU9iamVjdC5wcm90b3R5cGUsbz1yLmhhc093blByb3BlcnR5LHM9ci50b1N0cmluZyxhPWk/aS50b1N0cmluZ1RhZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8uY2FsbCh0LGEpLG49dFthXTt0cnl7dFthXT12b2lkIDA7dmFyIGk9ITB9Y2F0Y2godCl7fXZhciByPXMuY2FsbCh0KTtyZXR1cm4gaSYmKGU/dFthXT1uOmRlbGV0ZSB0W2FdKSxyfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9bigyNDkpLG89KGk9L1teLl0rJC8uZXhlYyhyJiZyLmtleXMmJnIua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2k6IiI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiEhbyYmbyBpbiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTkpWyJfX2NvcmUtanNfc2hhcmVkX18iXTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1Mikscj1uKDUwKSxvPW4oNzEpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGksbWFwOm5ldyhvfHxyKSxzdHJpbmc6bmV3IGl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjUzKSxyPW4oMjU0KSxvPW4oMjU1KSxzPW4oMjU2KSxhPW4oMjU3KTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fXUucHJvdG90eXBlLmNsZWFyPWksdS5wcm90b3R5cGUuZGVsZXRlPXIsdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPXMsdS5wcm90b3R5cGUuc2V0PWEsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWk/aShudWxsKTp7fSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTIpLHI9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihpKXt2YXIgbj1lW3RdO3JldHVybiBuPT09cj92b2lkIDA6bn1yZXR1cm4gby5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Mikscj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBpP3ZvaWQgMCE9PWVbdF06ci5jYWxsKGUsdCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Mikscj0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsblt0XT1pJiZ2b2lkIDA9PT1lP3I6ZSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQpLmdldCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0KS5oYXModCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTIzKSxyPW4oMjY0KSxvPW4oMjY1KTtmdW5jdGlvbiBzKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBpOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1zLnByb3RvdHlwZS5hZGQ9cy5wcm90b3R5cGUucHVzaD1yLHMucHJvdG90eXBlLmhhcz1vLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUpe3ZhciBuPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsbiksdGhpc319LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNzIpLHI9bigyNjkpLG89bigxMTgpLHM9bigxMjQpLGE9bigyNzApLHU9bigyNzEpLGM9MSxoPTIsbD0iW29iamVjdCBCb29sZWFuXSIsZD0iW29iamVjdCBEYXRlXSIsZj0iW29iamVjdCBFcnJvcl0iLHA9IltvYmplY3QgTWFwXSIsbT0iW29iamVjdCBOdW1iZXJdIixnPSJbb2JqZWN0IFJlZ0V4cF0iLHY9IltvYmplY3QgU2V0XSIsYj0iW29iamVjdCBTdHJpbmddIix5PSJbb2JqZWN0IFN5bWJvbF0iLF89IltvYmplY3QgQXJyYXlCdWZmZXJdIix3PSJbb2JqZWN0IERhdGFWaWV3XSIseD1pP2kucHJvdG90eXBlOnZvaWQgMCxNPXg/eC52YWx1ZU9mOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4saSx4LFMsRSl7c3dpdGNoKG4pe2Nhc2UgdzppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgXzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhUyhuZXcgcih0KSxuZXcgcihlKSkpO2Nhc2UgbDpjYXNlIGQ6Y2FzZSBtOnJldHVybiBvKCt0LCtlKTtjYXNlIGY6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIGc6Y2FzZSBiOnJldHVybiB0PT1lKyIiO2Nhc2UgcDp2YXIgQT1hO2Nhc2Ugdjp2YXIgQz1pJmM7aWYoQXx8KEE9dSksdC5zaXplIT1lLnNpemUmJiFDKXJldHVybiExO3ZhciBrPUUuZ2V0KHQpO2lmKGspcmV0dXJuIGs9PWU7aXw9aCxFLnNldCh0LGUpO3ZhciBPPXMoQSh0KSxBKGUpLGkseCxTLEUpO3JldHVybiBFLmRlbGV0ZSh0KSxPO2Nhc2UgeTppZihNKXJldHVybiBNLmNhbGwodCk9PU0uY2FsbChlKX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDE5KS5VaW50OEFycmF5O3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0LGkpe25bKytlXT1baSx0XX0pLG59fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtuWysrZV09dH0pLG59fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyNzMpLHI9MSxvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHMsYSx1KXt2YXIgYz1uJnIsaD1pKHQpLGw9aC5sZW5ndGg7aWYobCE9aShlKS5sZW5ndGgmJiFjKXJldHVybiExO2Zvcih2YXIgZD1sO2QtLTspe3ZhciBmPWhbZF07aWYoIShjP2YgaW4gZTpvLmNhbGwoZSxmKSkpcmV0dXJuITF9dmFyIHA9dS5nZXQodCk7aWYocCYmdS5nZXQoZSkpcmV0dXJuIHA9PWU7dmFyIG09ITA7dS5zZXQodCxlKSx1LnNldChlLHQpO2Zvcih2YXIgZz1jOysrZDxsOyl7dmFyIHY9dFtmPWhbZF1dLGI9ZVtmXTtpZihzKXZhciB5PWM/cyhiLHYsZixlLHQsdSk6cyh2LGIsZix0LGUsdSk7aWYoISh2b2lkIDA9PT15P3Y9PT1ifHxhKHYsYixuLHMsdSk6eSkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09Zil9aWYobSYmIWcpe3ZhciBfPXQuY29uc3RydWN0b3Isdz1lLmNvbnN0cnVjdG9yO18hPXcmJiJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSYmISgiZnVuY3Rpb24iPT10eXBlb2YgXyYmXyBpbnN0YW5jZW9mIF8mJiJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdykmJihtPSExKX1yZXR1cm4gdS5kZWxldGUodCksdS5kZWxldGUoZSksbX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3NCkscj1uKDI3Niksbz1uKDI3OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQsbyxyKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3NSkscj1uKDczKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWUodCk7cmV0dXJuIHIodCk/bzppKG8sbih0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxpPWUubGVuZ3RoLHI9dC5sZW5ndGg7KytuPGk7KXRbcituXT1lW25dO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjc3KSxyPW4oMjc4KSxvPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUscz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGE9cz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksaShzKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBvLmNhbGwodCxlKX0pKX06cjt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEsaT1udWxsPT10PzA6dC5sZW5ndGgscj0wLG89W107KytuPGk7KXt2YXIgcz10W25dO2UocyxuLHQpJiYob1tyKytdPXMpfXJldHVybiBvfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI4MCkscj1uKDI4OSksbz1uKDI5Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpP2kodCk6cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI4MSkscj1uKDI4Miksbz1uKDczKSxzPW4oMTI1KSxhPW4oMjg1KSx1PW4oMTI2KSxjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49byh0KSxoPSFuJiZyKHQpLGw9IW4mJiFoJiZzKHQpLGQ9IW4mJiFoJiYhbCYmdSh0KSxmPW58fGh8fGx8fGQscD1mP2kodC5sZW5ndGgsU3RyaW5nKTpbXSxtPXAubGVuZ3RoO2Zvcih2YXIgZyBpbiB0KSFlJiYhYy5jYWxsKHQsZyl8fGYmJigibGVuZ3RoIj09Z3x8bCYmKCJvZmZzZXQiPT1nfHwicGFyZW50Ij09Zyl8fGQmJigiYnVmZmVyIj09Z3x8ImJ5dGVMZW5ndGgiPT1nfHwiYnl0ZU9mZnNldCI9PWcpfHxhKGcsbSkpfHxwLnB1c2goZyk7cmV0dXJuIHB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxpPUFycmF5KHQpOysrbjx0OylpW25dPWUobik7cmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyODMpLHI9bigzOCksbz1PYmplY3QucHJvdG90eXBlLHM9by5oYXNPd25Qcm9wZXJ0eSxhPW8ucHJvcGVydHlJc0VudW1lcmFibGUsdT1pKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/aTpmdW5jdGlvbih0KXtyZXR1cm4gcih0KSYmcy5jYWxsKHQsImNhbGxlZSIpJiYhYS5jYWxsKHQsImNhbGxlZSIpfTt0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzcpLHI9bigzOCksbz0iW29iamVjdCBBcmd1bWVudHNdIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkmJmkodCk9PW99fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiExfX0sZnVuY3Rpb24odCxlKXt2YXIgbj05MDA3MTk5MjU0NzQwOTkxLGk9L14oPzowfFsxLTldXGQqKSQvO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9uOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDM3KSxyPW4oMTI3KSxvPW4oMzgpLHM9e307c1siW29iamVjdCBGbG9hdDMyQXJyYXldIl09c1siW29iamVjdCBGbG9hdDY0QXJyYXldIl09c1siW29iamVjdCBJbnQ4QXJyYXldIl09c1siW29iamVjdCBJbnQxNkFycmF5XSJdPXNbIltvYmplY3QgSW50MzJBcnJheV0iXT1zWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09c1siW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1zWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPXNbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsc1siW29iamVjdCBBcmd1bWVudHNdIl09c1siW29iamVjdCBBcnJheV0iXT1zWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPXNbIltvYmplY3QgQm9vbGVhbl0iXT1zWyJbb2JqZWN0IERhdGFWaWV3XSJdPXNbIltvYmplY3QgRGF0ZV0iXT1zWyJbb2JqZWN0IEVycm9yXSJdPXNbIltvYmplY3QgRnVuY3Rpb25dIl09c1siW29iamVjdCBNYXBdIl09c1siW29iamVjdCBOdW1iZXJdIl09c1siW29iamVjdCBPYmplY3RdIl09c1siW29iamVjdCBSZWdFeHBdIl09c1siW29iamVjdCBTZXRdIl09c1siW29iamVjdCBTdHJpbmddIl09c1siW29iamVjdCBXZWFrTWFwXSJdPSExLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmcih0Lmxlbmd0aCkmJiEhc1tpKHQpXX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTIwKSxyPWUmJiFlLm5vZGVUeXBlJiZlLG89ciYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiYhdC5ub2RlVHlwZSYmdCxzPW8mJm8uZXhwb3J0cz09PXImJmkucHJvY2VzcyxhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fHMmJnMuYmluZGluZyYmcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9YX0pLmNhbGwodGhpcyxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5MCkscj1uKDI5MSksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighaSh0KSlyZXR1cm4gcih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKW8uY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEyOCkoT2JqZWN0LmtleXMsT2JqZWN0KTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTE5KSxyPW4oMTI3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnIodC5sZW5ndGgpJiYhaSh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5NCkscj1uKDcxKSxvPW4oMjk1KSxzPW4oMjk2KSxhPW4oMjk3KSx1PW4oMzcpLGM9bigxMjIpLGg9YyhpKSxsPWMociksZD1jKG8pLGY9YyhzKSxwPWMoYSksbT11OyhpJiYiW29iamVjdCBEYXRhVmlld10iIT1tKG5ldyBpKG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxyJiYiW29iamVjdCBNYXBdIiE9bShuZXcgcil8fG8mJiJbb2JqZWN0IFByb21pc2VdIiE9bShvLnJlc29sdmUoKSl8fHMmJiJbb2JqZWN0IFNldF0iIT1tKG5ldyBzKXx8YSYmIltvYmplY3QgV2Vha01hcF0iIT1tKG5ldyBhKSkmJihtPWZ1bmN0aW9uKHQpe3ZhciBlPXUodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxpPW4/YyhuKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIGg6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIGw6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSBkOnJldHVybiJbb2JqZWN0IFByb21pc2VdIjtjYXNlIGY6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBwOnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pLHQuZXhwb3J0cz1tfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIkRhdGFWaWV3Iik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5KShuKDE5KSwiUHJvbWlzZSIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIlNldCIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIldlYWtNYXAiKTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzcpLHI9bigyOTkpLG89bigzOCkscz0iW29iamVjdCBPYmplY3RdIixhPUZ1bmN0aW9uLnByb3RvdHlwZSx1PU9iamVjdC5wcm90b3R5cGUsYz1hLnRvU3RyaW5nLGg9dS5oYXNPd25Qcm9wZXJ0eSxsPWMuY2FsbChPYmplY3QpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbyh0KXx8aSh0KSE9cylyZXR1cm4hMTt2YXIgZT1yKHQpO2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciBuPWguY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmYy5jYWxsKG4pPT1sfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTI4KShPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDI1KTtlLnNldD1mdW5jdGlvbih0LGUsbil7aWYobnVsbD09dClyZXR1cm4gdGhpczt2YXIgbztpZigib2JqZWN0Ij09dHlwZW9mIHQ/KG89dCxuPWUpOihvPXt9KVt0XT1lLG58fChuPXt9KSwhdGhpcy5fdmFsaWRhdGUobyxuKSlyZXR1cm4hMTt2YXIgcz1uLnVuc2V0LGE9bi5zaWxlbnQsdT1bXSxjPXRoaXMuX2NoYW5naW5nO3RoaXMuX2NoYW5naW5nPSEwLGN8fCh0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM9aSh7fSx0aGlzLmF0dHJpYnV0ZXMpLHRoaXMuY2hhbmdlZD17fSk7dmFyIGg9dGhpcy5hdHRyaWJ1dGVzLGw9dGhpcy5jaGFuZ2VkLGQ9dGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzO2Zvcih2YXIgZiBpbiBvKWU9b1tmXSxyLmlzRXF1YWwoaFtmXSxlKXx8dS5wdXNoKGYpLHIuaXNFcXVhbChkW2ZdLGUpP2RlbGV0ZSBsW2ZdOmxbZl09ZSxzP2RlbGV0ZSBoW2ZdOmhbZl09ZTtpZih0aGlzLmlkPXRoaXMuZ2V0KHRoaXMuaWRBdHRyaWJ1dGUpLCFhKXt1Lmxlbmd0aCYmKHRoaXMuX3BlbmRpbmc9bik7Zm9yKHZhciBwPTA7cDx1Lmxlbmd0aDtwKyspdGhpcy50cmlnZ2VyKCJjaGFuZ2U6Iit1W3BdLHRoaXMsaFt1W3BdXSxuKX1pZihjKXJldHVybiB0aGlzO2lmKCFhKWZvcig7dGhpcy5fcGVuZGluZzspbj10aGlzLl9wZW5kaW5nLHRoaXMuX3BlbmRpbmc9ITEsdGhpcy50cmlnZ2VyKCJjaGFuZ2UiLHRoaXMsbik7cmV0dXJuIHRoaXMuX3BlbmRpbmc9ITEsdGhpcy5fY2hhbmdpbmc9ITEsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTI5KSxzPUVsZW1lbnQucHJvdG90eXBlLGE9cy5tYXRjaGVzfHxzLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cy5tb3pNYXRjaGVzU2VsZWN0b3J8fHMubXNNYXRjaGVzU2VsZWN0b3J8fHMub01hdGNoZXNTZWxlY3Rvcnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSh0aGlzLmRvY3VtZW50fHx0aGlzLm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwodCksbj1lLmxlbmd0aDstLW4+PTAmJmUuaXRlbShuKSE9PXRoaXM7KTtyZXR1cm4gbj4tMX0sdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKCl7dGhpcy51bmRlbGVnYXRlRXZlbnRzKCksdGhpcy5lbC5wYXJlbnROb2RlJiZ0aGlzLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbCl9LGUucHJvdG90eXBlLl9zZXRFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuZWw9dH0sZS5wcm90b3R5cGUuX3NldEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpZSBpbiB0aGlzLmVsP3RoaXMuZWxbZV09dFtlXTp0aGlzLmVsLnNldEF0dHJpYnV0ZShlLHRbZV0pfSxlLnByb3RvdHlwZS5kZWxlZ2F0ZT1mdW5jdGlvbih0LGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9bnVsbCksdm9pZCAwPT09dGhpcy5fZG9tRXZlbnRzJiYodGhpcy5fZG9tRXZlbnRzPVtdKTt2YXIgaT10aGlzLmVsLHI9ZT9mdW5jdGlvbih0KXtmb3IodmFyIHI9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtyJiZyIT09aTtyPXIucGFyZW50Tm9kZSlpZihhLmNhbGwocixlKSlyZXR1cm4gdC5kZWxlZ2F0ZVRhcmdldD1yLG4uaGFuZGxlRXZlbnQ/bi5oYW5kbGVFdmVudCh0KTpuKHQpfTpuO3JldHVybiB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIodCxyLCExKSx0aGlzLl9kb21FdmVudHMucHVzaCh7ZXZlbnROYW1lOnQsaGFuZGxlcjpyLGxpc3RlbmVyOm4sc2VsZWN0b3I6ZX0pLHJ9LGUucHJvdG90eXBlLnVuZGVsZWdhdGU9ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobj1lLGU9bnVsbCksdGhpcy5lbCYmdGhpcy5fZG9tRXZlbnRzKWZvcih2YXIgaT10aGlzLl9kb21FdmVudHMuc2xpY2UoKSxyPWkubGVuZ3RoO3ItLTspe3ZhciBvPWlbcl07IShvLmV2ZW50TmFtZSE9PXR8fG4mJm8ubGlzdGVuZXIhPT1ufHxlJiZvLnNlbGVjdG9yIT09ZSkmJih0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoby5ldmVudE5hbWUsby5oYW5kbGVyLCExKSx0aGlzLl9kb21FdmVudHMuc3BsaWNlKHIsMSkpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS51bmRlbGVnYXRlRXZlbnRzPWZ1bmN0aW9uKCl7aWYodGhpcy5lbCYmdGhpcy5fZG9tRXZlbnRzKXtmb3IodmFyIHQ9dGhpcy5fZG9tRXZlbnRzLmxlbmd0aCxlPTA7ZTx0O2UrKyl7dmFyIG49dGhpcy5fZG9tRXZlbnRzW2VdO3RoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLmV2ZW50TmFtZSxuLmhhbmRsZXIsITEpfXRoaXMuX2RvbUV2ZW50cy5sZW5ndGg9MH1yZXR1cm4gdGhpc30sZX0oby5WaWV3KTtlLk5hdGl2ZVZpZXc9dX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpLHI9KGk9aTwwP01hdGgubWF4KDAsaStvKTpNYXRoLm1pbihpLG8tMSkpPG4/aSsxKyhvLW4pOmktbisxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuK3MpJW87aWYodFthXT09PWUpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtyPShuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpKTwoaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk/bisxKyhvLWkpOm4taSsxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuLXMrbyklbztpZih0W2FdPT09ZSlyZXR1cm4gYX1yZXR1cm4tMX1mdW5jdGlvbiBpKHQsZSxuLGkpe3ZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPS0xKTt2YXIgcixvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybi0xO249bjwwP01hdGgubWF4KDAsbitvKTpNYXRoLm1pbihuLG8tMSkscj0oaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk8bj9pKzErKG8tbik6aS1uKzE7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9KG4rcyklbztpZihlKHRbYV0sYSkpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gcih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtyPShuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpKTwoaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk/bisxKyhvLWkpOm4taSsxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuLXMrbyklbztpZihlKHRbYV0sYSkpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gbyh0LGUsbil7dm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49LTEpO3ZhciBpPXQubGVuZ3RoO2lmKCEoaTw9MSkpZm9yKGU9ZTwwP01hdGgubWF4KDAsZStpKTpNYXRoLm1pbihlLGktMSksbj1uPDA/TWF0aC5tYXgoMCxuK2kpOk1hdGgubWluKG4saS0xKTtlPG47KXt2YXIgcj10W2VdLG89dFtuXTt0W2UrK109byx0W24tLV09cn19ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKGU8MCYmKGUrPW4pLCEoZTwwfHxlPj1uKSl7Zm9yKHZhciBpPXRbZV0scj1lKzE7cjxuOysrcil0W3ItMV09dFtyXTtyZXR1cm4gdC5sZW5ndGg9bi0xLGl9fXQuZmlyc3RJbmRleE9mPWUsdC5sYXN0SW5kZXhPZj1uLHQuZmluZEZpcnN0SW5kZXg9aSx0LmZpbmRMYXN0SW5kZXg9cix0LmZpbmRGaXJzdFZhbHVlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PXImJihyPS0xKTt2YXIgbz1pKHQsZSxuLHIpO3JldHVybi0xIT09bz90W29dOnZvaWQgMH0sdC5maW5kTGFzdFZhbHVlPWZ1bmN0aW9uKHQsZSxuLGkpe3ZvaWQgMD09PW4mJihuPS0xKSx2b2lkIDA9PT1pJiYoaT0wKTt2YXIgbz1yKHQsZSxuLGkpO3JldHVybi0xIT09bz90W29dOnZvaWQgMH0sdC5sb3dlckJvdW5kPWZ1bmN0aW9uKHQsZSxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybiAwO2Zvcih2YXIgcz1pPWk8MD9NYXRoLm1heCgwLGkrbyk6TWF0aC5taW4oaSxvLTEpLGE9KHI9cjwwP01hdGgubWF4KDAscitvKTpNYXRoLm1pbihyLG8tMSkpLWkrMTthPjA7KXt2YXIgdT1hPj4xLGM9cyt1O24odFtjXSxlKTwwPyhzPWMrMSxhLT11KzEpOmE9dX1yZXR1cm4gc30sdC51cHBlckJvdW5kPWZ1bmN0aW9uKHQsZSxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybiAwO2Zvcih2YXIgcz1pPWk8MD9NYXRoLm1heCgwLGkrbyk6TWF0aC5taW4oaSxvLTEpLGE9KHI9cjwwP01hdGgubWF4KDAscitvKTpNYXRoLm1pbihyLG8tMSkpLWkrMTthPjA7KXt2YXIgdT1hPj4xLGM9cyt1O24odFtjXSxlKT4wP2E9dToocz1jKzEsYS09dSsxKX1yZXR1cm4gc30sdC5tb3ZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10Lmxlbmd0aDtpZighKGk8PTEpJiYoZT1lPDA/TWF0aC5tYXgoMCxlK2kpOk1hdGgubWluKGUsaS0xKSkhPT0obj1uPDA/TWF0aC5tYXgoMCxuK2kpOk1hdGgubWluKG4saS0xKSkpe2Zvcih2YXIgcj10W2VdLG89ZTxuPzE6LTEscz1lO3MhPT1uO3MrPW8pdFtzXT10W3Mrb107dFtuXT1yfX0sdC5yZXZlcnNlPW8sdC5yb3RhdGU9ZnVuY3Rpb24odCxlLG4saSl7dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9LTEpO3ZhciByPXQubGVuZ3RoO2lmKCEocjw9MXx8KG49bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSkpPj0oaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKSkpKXt2YXIgcz1pLW4rMTtpZihlPjA/ZSU9czplPDAmJihlPShlJXMrcyklcyksMCE9PWUpe3ZhciBhPW4rZTtvKHQsbixhLTEpLG8odCxhLGkpLG8odCxuLGkpfX19LHQuZmlsbD1mdW5jdGlvbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHI9dC5sZW5ndGg7aWYoMCE9PXIpe3ZhciBvO249bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSksbz0oaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKSk8bj9pKzErKHItbik6aS1uKzE7Zm9yKHZhciBzPTA7czxvOysrcyl0WyhuK3MpJXJdPWV9fSx0Lmluc2VydD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5sZW5ndGg7ZT1lPDA/TWF0aC5tYXgoMCxlK2kpOk1hdGgubWluKGUsaSk7Zm9yKHZhciByPWk7cj5lOy0tcil0W3JdPXRbci0xXTt0W2VdPW59LHQucmVtb3ZlQXQ9cyx0LnJlbW92ZUZpcnN0T2Y9ZnVuY3Rpb24odCxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPWUodCxuLGkscik7cmV0dXJuLTEhPT1vJiZzKHQsbyksb30sdC5yZW1vdmVMYXN0T2Y9ZnVuY3Rpb24odCxlLGkscil7dm9pZCAwPT09aSYmKGk9LTEpLHZvaWQgMD09PXImJihyPTApO3ZhciBvPW4odCxlLGkscik7cmV0dXJuLTEhPT1vJiZzKHQsbyksb30sdC5yZW1vdmVBbGxPZj1mdW5jdGlvbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7bj1uPDA/TWF0aC5tYXgoMCxuK3IpOk1hdGgubWluKG4sci0xKSxpPWk8MD9NYXRoLm1heCgwLGkrcik6TWF0aC5taW4oaSxyLTEpO2Zvcih2YXIgbz0wLHM9MDtzPHI7KytzKW48PWkmJnM+PW4mJnM8PWkmJnRbc109PT1lP28rKzppPG4mJihzPD1pfHxzPj1uKSYmdFtzXT09PWU/bysrOm8+MCYmKHRbcy1vXT10W3NdKTtyZXR1cm4gbz4wJiYodC5sZW5ndGg9ci1vKSxvfSx0LnJlbW92ZUZpcnN0V2hlcmU9ZnVuY3Rpb24odCxlLG4scil7dmFyIG87dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBhPWkodCxlLG4scik7cmV0dXJuLTEhPT1hJiYobz1zKHQsYSkpLHtpbmRleDphLHZhbHVlOm99fSx0LnJlbW92ZUxhc3RXaGVyZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIGE9cih0LGUsbixpKTtyZXR1cm4tMSE9PWEmJihvPXModCxhKSkse2luZGV4OmEsdmFsdWU6b319LHQucmVtb3ZlQWxsV2hlcmU9ZnVuY3Rpb24odCxlLG4saSl7dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9LTEpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO249bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSksaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKTtmb3IodmFyIG89MCxzPTA7czxyOysrcyluPD1pJiZzPj1uJiZzPD1pJiZlKHRbc10scyk/bysrOmk8biYmKHM8PWl8fHM+PW4pJiZlKHRbc10scyk/bysrOm8+MCYmKHRbcy1vXT10W3NdKTtyZXR1cm4gbz4wJiYodC5sZW5ndGg9ci1vKSxvfX0oZS5BcnJheUV4dHx8KGUuQXJyYXlFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS5jaGFpbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gbmV3IHIoaS5pdGVyKHQubWFwKGkuaXRlcikpKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2Nsb25lZD0hMSx0aGlzLl9zb3VyY2U9dCx0aGlzLl9hY3RpdmU9dm9pZCAwfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCkpO3JldHVybiBlLl9hY3RpdmU9dGhpcy5fYWN0aXZlJiZ0aGlzLl9hY3RpdmUuY2xvbmUoKSxlLl9jbG9uZWQ9ITAsdGhpcy5fY2xvbmVkPSEwLGV9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLl9hY3RpdmUpe3ZhciB0PXRoaXMuX3NvdXJjZS5uZXh0KCk7aWYodm9pZCAwPT09dClyZXR1cm47dGhpcy5fYWN0aXZlPXRoaXMuX2Nsb25lZD90LmNsb25lKCk6dH12YXIgZT10aGlzLl9hY3RpdmUubmV4dCgpO3JldHVybiB2b2lkIDAhPT1lP2U6KHRoaXMuX2FjdGl2ZT12b2lkIDAsdGhpcy5uZXh0KCkpfSx0fSgpO2UuQ2hhaW5JdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpfTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHR9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt9LHR9KCk7ZS5FbXB0eUl0ZXJhdG9yPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dCx0aGlzLl9mbj1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCksdGhpcy5fZm4pO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcy5fZm4sbj10aGlzLl9zb3VyY2U7dm9pZCAwIT09KHQ9bi5uZXh0KCkpOylpZihlKHQsdGhpcy5faW5kZXgrKykpcmV0dXJuIHR9LHR9KCk7ZS5GaWx0ZXJJdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1uKDE4KTtlLmZpbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0wLG89aS5pdGVyKHQpO3ZvaWQgMCE9PShuPW8ubmV4dCgpKTspaWYoZShuLHIrKykpcmV0dXJuIG59LGUubWluPWZ1bmN0aW9uKHQsZSl7dmFyIG49aS5pdGVyKHQpLHI9bi5uZXh0KCk7aWYodm9pZCAwIT09cil7Zm9yKHZhciBvPXI7dm9pZCAwIT09KHI9bi5uZXh0KCkpOyllKHIsbyk8MCYmKG89cik7cmV0dXJuIG99fSxlLm1heD1mdW5jdGlvbih0LGUpe3ZhciBuPWkuaXRlcih0KSxyPW4ubmV4dCgpO2lmKHZvaWQgMCE9PXIpe2Zvcih2YXIgbz1yO3ZvaWQgMCE9PShyPW4ubmV4dCgpKTspZShyLG8pPjAmJihvPXIpO3JldHVybiBvfX0sZS5taW5tYXg9ZnVuY3Rpb24odCxlKXt2YXIgbj1pLml0ZXIodCkscj1uLm5leHQoKTtpZih2b2lkIDAhPT1yKXtmb3IodmFyIG89cixzPXI7dm9pZCAwIT09KHI9bi5uZXh0KCkpOyllKHIsbyk8MD9vPXI6ZShyLHMpPjAmJihzPXIpO3JldHVybltvLHNdfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dCx0aGlzLl9mbj1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCksdGhpcy5fZm4pO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc291cmNlLm5leHQoKTtpZih2b2lkIDAhPT10KXJldHVybiB0aGlzLl9mbi5jYWxsKHZvaWQgMCx0LHRoaXMuX2luZGV4KyspfSx0fSgpO2UuTWFwSXRlcmF0b3I9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5yYW5nZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWU/bmV3IHIoMCx0LDEpOm5ldyByKHQsZSx2b2lkIDA9PT1uPzE6bil9O3ZhciBpLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLl9pbmRleD0wLHRoaXMuX3N0YXJ0PXQsdGhpcy5fc3RvcD1lLHRoaXMuX3N0ZXA9bix0aGlzLl9sZW5ndGg9aS5yYW5nZUxlbmd0aCh0LGUsbil9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdCh0aGlzLl9zdGFydCx0aGlzLl9zdG9wLHRoaXMuX3N0ZXApO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYoISh0aGlzLl9pbmRleD49dGhpcy5fbGVuZ3RoKSlyZXR1cm4gdGhpcy5fc3RhcnQrdGhpcy5fc3RlcCp0aGlzLl9pbmRleCsrfSx0fSgpO2UuUmFuZ2VJdGVyYXRvcj1yLGZ1bmN0aW9uKHQpe3QucmFuZ2VMZW5ndGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09bj8xLzA6dD5lJiZuPjA/MDp0PGUmJm48MD8wOk1hdGguY2VpbCgoZS10KS9uKX19KGl8fChpPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UucmVkdWNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0wLG89aS5pdGVyKHQpLHM9by5uZXh0KCk7aWYodm9pZCAwPT09cyYmdm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgaXRlcmFibGUgd2l0aCBubyBpbml0aWFsIHZhbHVlLiIpO2lmKHZvaWQgMD09PXMpcmV0dXJuIG47dmFyIGEsdSxjPW8ubmV4dCgpO2lmKHZvaWQgMD09PWMmJnZvaWQgMD09PW4pcmV0dXJuIHM7aWYodm9pZCAwPT09YylyZXR1cm4gZShuLHMscisrKTtmb3IoYT1lKHZvaWQgMD09PW4/czplKG4scyxyKyspLGMscisrKTt2b2lkIDAhPT0odT1vLm5leHQoKSk7KWE9ZShhLHUscisrKTtyZXR1cm4gYX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUucmVwZWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LGUub25jZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGkodCwxKX07dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fdmFsdWU9dCx0aGlzLl9jb3VudD1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3ZhbHVlLHRoaXMuX2NvdW50KX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcy5fY291bnQ8PTApKXJldHVybiB0aGlzLl9jb3VudC0tLHRoaXMuX3ZhbHVlfSx0fSgpO2UuUmVwZWF0SXRlcmF0b3I9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5yZXRybz1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZXRybz90LnJldHJvKCk6bmV3IGkodCl9O3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9zb3VyY2U9dCx0aGlzLl9pbmRleD10Lmxlbmd0aC0xfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlKTtyZXR1cm4gZS5faW5kZXg9dGhpcy5faW5kZXgsZX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcy5faW5kZXg8MHx8dGhpcy5faW5kZXg+PXRoaXMuX3NvdXJjZS5sZW5ndGgpKXJldHVybiB0aGlzLl9zb3VyY2VbdGhpcy5faW5kZXgtLV19LHR9KCk7ZS5SZXRyb0FycmF5SXRlcmF0b3I9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS50b3BvbG9naWNTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49bmV3IFNldCxyPW5ldyBNYXA7cmV0dXJuIGkuZWFjaCh0LGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLGk9ci5nZXQobik7aT9pLnB1c2goZSk6ci5zZXQobixbZV0pfSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7byhlKX0pLGU7ZnVuY3Rpb24gbyh0KXtpZighbi5oYXModCkpe24uYWRkKHQpO3ZhciBpPXIuZ2V0KHQpO2kmJmkuZm9yRWFjaChvKSxlLnB1c2godCl9fX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2Uuc3RyaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc291cmNlPXQsdGhpcy5fc3RlcD1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3NvdXJjZS5jbG9uZSgpLHRoaXMuX3N0ZXApfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NvdXJjZS5uZXh0KCksZT10aGlzLl9zdGVwLTE7ZT4wOy0tZSl0aGlzLl9zb3VyY2UubmV4dCgpO3JldHVybiB0fSx0fSgpO2UuU3RyaWRlSXRlcmF0b3I9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7Zm9yKHZhciBpPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLG89bixzPWUubGVuZ3RoO3I8czsrK3IsKytvKXtpZigtMT09PShvPXQuaW5kZXhPZihlW3JdLG8pKSlyZXR1cm4gbnVsbDtpW3JdPW99cmV0dXJuIGl9dC5maW5kSW5kaWNlcz1lLHQubWF0Y2hTdW1PZlNxdWFyZXM9ZnVuY3Rpb24odCxuLGkpe3ZvaWQgMD09PWkmJihpPTApO3ZhciByPWUodCxuLGkpO2lmKCFyKXJldHVybiBudWxsO2Zvcih2YXIgbz0wLHM9MCxhPXIubGVuZ3RoO3M8YTsrK3Mpe3ZhciB1PXJbc10taTtvKz11KnV9cmV0dXJue3Njb3JlOm8saW5kaWNlczpyfX0sdC5tYXRjaFN1bU9mRGVsdGFzPWZ1bmN0aW9uKHQsbixpKXt2b2lkIDA9PT1pJiYoaT0wKTt2YXIgcj1lKHQsbixpKTtpZighcilyZXR1cm4gbnVsbDtmb3IodmFyIG89MCxzPWktMSxhPTAsdT1yLmxlbmd0aDthPHU7KythKXt2YXIgYz1yW2FdO28rPWMtcy0xLHM9Y31yZXR1cm57c2NvcmU6byxpbmRpY2VzOnJ9fSx0LmhpZ2hsaWdodD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPVtdLHI9MCxvPTAscz1lLmxlbmd0aDtyPHM7KXtmb3IodmFyIGE9ZVtyXSx1PWVbcl07KytyPHMmJmVbcl09PT11KzE7KXUrKztvPGEmJmkucHVzaCh0LnNsaWNlKG8sYSkpLGE8dSsxJiZpLnB1c2gobih0LnNsaWNlKGEsdSsxKSkpLG89dSsxfXJldHVybiBvPHQubGVuZ3RoJiZpLnB1c2godC5zbGljZShvKSksaX19KGUuU3RyaW5nRXh0fHwoZS5TdHJpbmdFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS50YWtlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc291cmNlPXQsdGhpcy5fY291bnQ9ZX1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9zb3VyY2UuY2xvbmUoKSx0aGlzLl9jb3VudCl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2NvdW50PD0wKSl7dmFyIHQ9dGhpcy5fc291cmNlLm5leHQoKTtpZih2b2lkIDAhPT10KXJldHVybiB0aGlzLl9jb3VudC0tLHR9fSx0fSgpO2UuVGFrZUl0ZXJhdG9yPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UuemlwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBuZXcgcih0Lm1hcChpLml0ZXIpKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3NvdXJjZT10fXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3NvdXJjZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvbmUoKX0pKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fc291cmNlLmxlbmd0aCksZT0wLG49dGhpcy5fc291cmNlLmxlbmd0aDtlPG47KytlKXt2YXIgaT10aGlzLl9zb3VyY2VbZV0ubmV4dCgpO2lmKHZvaWQgMD09PWkpcmV0dXJuO3RbZV09aX1yZXR1cm4gdH0sdH0oKTtlLlppcEl0ZXJhdG9yPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGZ1bmN0aW9uKHQpe3QuYm94U2l6aW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLG49cGFyc2VGbG9hdChlLmJvcmRlclRvcFdpZHRoKXx8MCxpPXBhcnNlRmxvYXQoZS5ib3JkZXJMZWZ0V2lkdGgpfHwwLHI9cGFyc2VGbG9hdChlLmJvcmRlclJpZ2h0V2lkdGgpfHwwLG89cGFyc2VGbG9hdChlLmJvcmRlckJvdHRvbVdpZHRoKXx8MCxzPXBhcnNlRmxvYXQoZS5wYWRkaW5nVG9wKXx8MCxhPXBhcnNlRmxvYXQoZS5wYWRkaW5nTGVmdCl8fDAsdT1wYXJzZUZsb2F0KGUucGFkZGluZ1JpZ2h0KXx8MCxjPXBhcnNlRmxvYXQoZS5wYWRkaW5nQm90dG9tKXx8MDtyZXR1cm57Ym9yZGVyVG9wOm4sYm9yZGVyTGVmdDppLGJvcmRlclJpZ2h0OnIsYm9yZGVyQm90dG9tOm8scGFkZGluZ1RvcDpzLHBhZGRpbmdMZWZ0OmEscGFkZGluZ1JpZ2h0OnUscGFkZGluZ0JvdHRvbTpjLGhvcml6b250YWxTdW06aSthK3Urcix2ZXJ0aWNhbFN1bTpuK3MrYytvfX0sdC5zaXplTGltaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLG49cGFyc2VGbG9hdChlLm1pbldpZHRoKXx8MCxpPXBhcnNlRmxvYXQoZS5taW5IZWlnaHQpfHwwLHI9cGFyc2VGbG9hdChlLm1heFdpZHRoKXx8MS8wLG89cGFyc2VGbG9hdChlLm1heEhlaWdodCl8fDEvMDtyZXR1cm57bWluV2lkdGg6bixtaW5IZWlnaHQ6aSxtYXhXaWR0aDpyPU1hdGgubWF4KG4sciksbWF4SGVpZ2h0Om89TWF0aC5tYXgoaSxvKX19LHQuaGl0VGVzdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZT49aS5sZWZ0JiZlPGkucmlnaHQmJm4+PWkudG9wJiZuPGkuYm90dG9tfSx0LnNjcm9sbEludG9WaWV3SWZOZWVkZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpLnRvcDw9bi50b3AmJmkuYm90dG9tPj1uLmJvdHRvbXx8KGkudG9wPG4udG9wJiZpLmhlaWdodDw9bi5oZWlnaHQ/dC5zY3JvbGxUb3AtPW4udG9wLWkudG9wOmkuYm90dG9tPm4uYm90dG9tJiZpLmhlaWdodD49bi5oZWlnaHQ/dC5zY3JvbGxUb3AtPW4udG9wLWkudG9wOmkudG9wPG4udG9wJiZpLmhlaWdodD5uLmhlaWdodD90LnNjcm9sbFRvcC09bi5ib3R0b20taS5ib3R0b206aS5ib3R0b20+bi5ib3R0b20mJmkuaGVpZ2h0PG4uaGVpZ2h0JiYodC5zY3JvbGxUb3AtPW4uYm90dG9tLWkuYm90dG9tKSl9fShlLkVsZW1lbnRFeHR8fChlLkVsZW1lbnRFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7dC5JU19NQUM9ISFuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL01hYy9pKSx0LklTX1dJTj0hIW5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvV2luL2kpLHQuSVNfSUU9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdC5JU19FREdFPS9FZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfShlLlBsYXRmb3JtfHwoZS5QbGF0Zm9ybT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXt0LmNhbGN1bGF0ZVNwZWNpZmljaXR5PWZ1bmN0aW9uKHQpe2lmKHQgaW4gaS5zcGVjaWZpY2l0eUNhY2hlKXJldHVybiBpLnNwZWNpZmljaXR5Q2FjaGVbdF07dmFyIGU9aS5jYWxjdWxhdGVTaW5nbGUodCk7cmV0dXJuIGkuc3BlY2lmaWNpdHlDYWNoZVt0XT1lfSx0LmlzVmFsaWQ9ZnVuY3Rpb24odCl7aWYodCBpbiBpLnZhbGlkaXR5Q2FjaGUpcmV0dXJuIGkudmFsaWRpdHlDYWNoZVt0XTt2YXIgZT0hMDt0cnl7aS50ZXN0RWxlbS5xdWVyeVNlbGVjdG9yKHQpfWNhdGNoKHQpe2U9ITF9cmV0dXJuIGkudmFsaWRpdHlDYWNoZVt0XT1lfSx0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5wcm90b01hdGNoRnVuYy5jYWxsKHQsZSl9fShlLlNlbGVjdG9yfHwoZS5TZWxlY3Rvcj17fSkpLGZ1bmN0aW9uKHQpe3ZhciBlO3Quc3BlY2lmaWNpdHlDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHQudmFsaWRpdHlDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHQudGVzdEVsZW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5wcm90b01hdGNoRnVuYz0oZT1FbGVtZW50LnByb3RvdHlwZSkubWF0Y2hlc3x8ZS5tYXRjaGVzU2VsZWN0b3J8fGUubW96TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yfHxlLm9NYXRjaGVzU2VsZWN0b3J8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxmdW5jdGlvbih0KXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KTtyZXR1cm4tMSE9PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0aGlzKX0sdC5jYWxjdWxhdGVTaW5nbGU9ZnVuY3Rpb24odCl7dmFyIGU9MCxoPTAsbD0wO2Z1bmN0aW9uIGQoZSl7dmFyIG49dC5tYXRjaChlKTtyZXR1cm4gbnVsbCE9PW4mJih0PXQuc2xpY2UoblswXS5sZW5ndGgpLCEwKX1mb3IodD0odD10LnNwbGl0KCIsIiwxKVswXSkucmVwbGFjZShjLCIgJDEgIik7dC5sZW5ndGg+MDspaWYoZChuKSllKys7ZWxzZSBpZihkKGkpKWgrKztlbHNlIGlmKGQocikpaCsrO2Vsc2UgaWYoZChzKSlsKys7ZWxzZSBpZihkKGEpKWgrKztlbHNlIGlmKGQobykpbCsrO2Vsc2UgaWYoIWQodSkpcmV0dXJuIDA7cmV0dXJuKGU9TWF0aC5taW4oZSwyNTUpKTw8MTZ8KGg9TWF0aC5taW4oaCwyNTUpKTw8OHwobD1NYXRoLm1pbihsLDI1NSkpfTt2YXIgbj0vXiNbXlxzXCs+fiNcLlxbOl0rLyxpPS9eXC5bXlxzXCs+fiNcLlxbOl0rLyxyPS9eXFtbXlxdXStcXS8sbz0vXlteXHNcKz5+I1wuXFs6XSsvLHM9L14oOjpbXlxzXCs+fiNcLlxbOl0rfDpmaXJzdC1saW5lfDpmaXJzdC1sZXR0ZXJ8OmJlZm9yZXw6YWZ0ZXIpLyxhPS9eOlteXHNcKz5+I1wuXFs6XSsvLHU9L15bXHNcKz5+XCpdKy8sYz0vOm5vdFwoKFteXCldKylcKS9nfShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX0obigzMjEpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGkscj1uKDIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZmlyc3Q9bnVsbCx0aGlzLl9sYXN0PW51bGwsdGhpcy5fbGVuZ3RoPTB9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNFbXB0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fbGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpcnN0P3RoaXMuX2ZpcnN0LnZhbHVlOnZvaWQgMH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhc3QiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFzdD90aGlzLl9sYXN0LnZhbHVlOnZvaWQgMH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXJzdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhc3ROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3R9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Gb3J3YXJkVmFsdWVJdGVyYXRvcih0aGlzLl9maXJzdCl9LHQucHJvdG90eXBlLnJldHJvPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LlJldHJvVmFsdWVJdGVyYXRvcih0aGlzLl9sYXN0KX0sdC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRm9yd2FyZE5vZGVJdGVyYXRvcih0aGlzLl9maXJzdCl9LHQucHJvdG90eXBlLnJldHJvTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuUmV0cm9Ob2RlSXRlcmF0b3IodGhpcy5fbGFzdCl9LHQucHJvdG90eXBlLmFkZEZpcnN0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpLkxpbmtlZExpc3ROb2RlKHRoaXMsdCk7cmV0dXJuIHRoaXMuX2ZpcnN0PyhlLm5leHQ9dGhpcy5fZmlyc3QsdGhpcy5fZmlyc3QucHJldj1lLHRoaXMuX2ZpcnN0PWUpOih0aGlzLl9maXJzdD1lLHRoaXMuX2xhc3Q9ZSksdGhpcy5fbGVuZ3RoKyssZX0sdC5wcm90b3R5cGUuYWRkTGFzdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpO3JldHVybiB0aGlzLl9sYXN0PyhlLnByZXY9dGhpcy5fbGFzdCx0aGlzLl9sYXN0Lm5leHQ9ZSx0aGlzLl9sYXN0PWUpOih0aGlzLl9maXJzdD1lLHRoaXMuX2xhc3Q9ZSksdGhpcy5fbGVuZ3RoKyssZX0sdC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKHQsZSl7aWYoIWV8fGU9PT10aGlzLl9maXJzdClyZXR1cm4gdGhpcy5hZGRGaXJzdCh0KTtpZighKGUgaW5zdGFuY2VvZiBpLkxpbmtlZExpc3ROb2RlKXx8ZS5saXN0IT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIlJlZmVyZW5jZSBub2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgbj1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpLHI9ZSxvPXIucHJldjtyZXR1cm4gbi5uZXh0PXIsbi5wcmV2PW8sci5wcmV2PW4sby5uZXh0PW4sdGhpcy5fbGVuZ3RoKyssbn0sdC5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCxlKXtpZighZXx8ZT09PXRoaXMuX2xhc3QpcmV0dXJuIHRoaXMuYWRkTGFzdCh0KTtpZighKGUgaW5zdGFuY2VvZiBpLkxpbmtlZExpc3ROb2RlKXx8ZS5saXN0IT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIlJlZmVyZW5jZSBub2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgbj1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpLHI9ZSxvPXIubmV4dDtyZXR1cm4gbi5uZXh0PW8sbi5wcmV2PXIsci5uZXh0PW4sby5wcmV2PW4sdGhpcy5fbGVuZ3RoKyssbn0sdC5wcm90b3R5cGUucmVtb3ZlRmlyc3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9maXJzdDtpZih0KXJldHVybiB0PT09dGhpcy5fbGFzdD8odGhpcy5fZmlyc3Q9bnVsbCx0aGlzLl9sYXN0PW51bGwpOih0aGlzLl9maXJzdD10Lm5leHQsdGhpcy5fZmlyc3QucHJldj1udWxsKSx0Lmxpc3Q9bnVsbCx0Lm5leHQ9bnVsbCx0LnByZXY9bnVsbCx0aGlzLl9sZW5ndGgtLSx0LnZhbHVlfSx0LnByb3RvdHlwZS5yZW1vdmVMYXN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGFzdDtpZih0KXJldHVybiB0PT09dGhpcy5fZmlyc3Q/KHRoaXMuX2ZpcnN0PW51bGwsdGhpcy5fbGFzdD1udWxsKToodGhpcy5fbGFzdD10LnByZXYsdGhpcy5fbGFzdC5uZXh0PW51bGwpLHQubGlzdD1udWxsLHQubmV4dD1udWxsLHQucHJldj1udWxsLHRoaXMuX2xlbmd0aC0tLHQudmFsdWV9LHQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgaS5MaW5rZWRMaXN0Tm9kZSl8fHQubGlzdCE9PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJOb2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgZT10O2U9PT10aGlzLl9maXJzdCYmZT09PXRoaXMuX2xhc3Q/KHRoaXMuX2ZpcnN0PW51bGwsdGhpcy5fbGFzdD1udWxsKTplPT09dGhpcy5fZmlyc3Q/KHRoaXMuX2ZpcnN0PWUubmV4dCx0aGlzLl9maXJzdC5wcmV2PW51bGwpOmU9PT10aGlzLl9sYXN0Pyh0aGlzLl9sYXN0PWUucHJldix0aGlzLl9sYXN0Lm5leHQ9bnVsbCk6KGUubmV4dC5wcmV2PWUucHJldixlLnByZXYubmV4dD1lLm5leHQpLGUubGlzdD1udWxsLGUubmV4dD1udWxsLGUucHJldj1udWxsLHRoaXMuX2xlbmd0aC0tfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9maXJzdDt0Oyl7dmFyIGU9dC5uZXh0O3QubGlzdD1udWxsLHQucHJldj1udWxsLHQubmV4dD1udWxsLHQ9ZX10aGlzLl9maXJzdD1udWxsLHRoaXMuX2xhc3Q9bnVsbCx0aGlzLl9sZW5ndGg9MH0sdH0oKTtlLkxpbmtlZExpc3Q9byxmdW5jdGlvbih0KXt0LmZyb209ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHQ7cmV0dXJuIHIuZWFjaChlLGZ1bmN0aW9uKHQpe24uYWRkTGFzdCh0KX0pLG59O3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9ub2RlPXR9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy5fbm9kZSl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2RlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0aGlzLl9ub2RlPXQubmV4dCx0LnZhbHVlfX0sdH0oKTt0LkZvcndhcmRWYWx1ZUl0ZXJhdG9yPWU7dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX25vZGU9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9ub2RlKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHRoaXMuX25vZGU9dC5wcmV2LHQudmFsdWV9fSx0fSgpO3QuUmV0cm9WYWx1ZUl0ZXJhdG9yPW47dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX25vZGU9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9ub2RlKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHRoaXMuX25vZGU9dC5uZXh0LHR9fSx0fSgpO3QuRm9yd2FyZE5vZGVJdGVyYXRvcj1pO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9ub2RlPXR9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy5fbm9kZSl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2RlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0aGlzLl9ub2RlPXQucHJldix0fX0sdH0oKTt0LlJldHJvTm9kZUl0ZXJhdG9yPW99KG89ZS5MaW5rZWRMaXN0fHwoZS5MaW5rZWRMaXN0PXt9KSksZS5MaW5rZWRMaXN0PW8sZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt0aGlzLmxpc3Q9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbCx0aGlzLmxpc3Q9dCx0aGlzLnZhbHVlPWV9fSgpO3QuTGlua2VkTGlzdE5vZGU9ZX0oaXx8KGk9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDc2KSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzLHtsYXlvdXQ6by5jcmVhdGVMYXlvdXQoZSl9KXx8dGhpcztyZXR1cm4gbi5hZGRDbGFzcygicC1Cb3hQYW5lbCIpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImRpcmVjdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5kaXJlY3Rpb259LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5kaXJlY3Rpb249dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5hbGlnbm1lbnQ9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNwYWNpbmc9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5vbkNoaWxkQWRkZWQ9ZnVuY3Rpb24odCl7dC5jaGlsZC5hZGRDbGFzcygicC1Cb3hQYW5lbC1jaGlsZCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0LmNoaWxkLnJlbW92ZUNsYXNzKCJwLUJveFBhbmVsLWNoaWxkIil9LGV9KG4oNTQpLlBhbmVsKTtlLkJveFBhbmVsPWEsZnVuY3Rpb24odCl7dC5nZXRTdHJldGNoPWZ1bmN0aW9uKHQpe3JldHVybiBzLkJveExheW91dC5nZXRTdHJldGNoKHQpfSx0LnNldFN0cmV0Y2g9ZnVuY3Rpb24odCxlKXtzLkJveExheW91dC5zZXRTdHJldGNoKHQsZSl9LHQuZ2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBzLkJveExheW91dC5nZXRTaXplQmFzaXModCl9LHQuc2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQsZSl7cy5Cb3hMYXlvdXQuc2V0U2l6ZUJhc2lzKHQsZSl9fShhPWUuQm94UGFuZWx8fChlLkJveFBhbmVsPXt9KSksZS5Cb3hQYW5lbD1hLGZ1bmN0aW9uKHQpe3QuY3JlYXRlTGF5b3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmxheW91dHx8bmV3IHMuQm94TGF5b3V0KHQpfX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzLGE9bigyKSx1PW4oMjYpLGM9bigxMzApLGg9big5KSxsPW4oNTUpLGQ9big3KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMse25vZGU6cy5jcmVhdGVOb2RlKCl9KXx8dGhpcztyZXR1cm4gaS5fYWN0aXZlSW5kZXg9LTEsaS5faXRlbXM9W10saS5fcmVzdWx0cz1udWxsLGkuYWRkQ2xhc3MoInAtQ29tbWFuZFBhbGV0dGUiKSxpLnNldEZsYWcoZC5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5jb21tYW5kcz1uLmNvbW1hbmRzLGkucmVuZGVyZXI9bi5yZW5kZXJlcnx8ZS5kZWZhdWx0UmVuZGVyZXIsaS5jb21tYW5kcy5jb21tYW5kQ2hhbmdlZC5jb25uZWN0KGkuX29uR2VuZXJpY0NoYW5nZSxpKSxpLmNvbW1hbmRzLmtleUJpbmRpbmdDaGFuZ2VkLmNvbm5lY3QoaS5fb25HZW5lcmljQ2hhbmdlLGkpLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fcmVzdWx0cz1udWxsLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzZWFyY2hOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLUNvbW1hbmRQYWxldHRlLXNlYXJjaCIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaW5wdXROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLUNvbW1hbmRQYWxldHRlLWlucHV0IilbMF19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1Db21tYW5kUGFsZXR0ZS1jb250ZW50IilbMF19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpdGVtcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXMuY3JlYXRlSXRlbSh0aGlzLmNvbW1hbmRzLHQpO3JldHVybiB0aGlzLl9pdGVtcy5wdXNoKGUpLHRoaXMucmVmcmVzaCgpLGV9LGUucHJvdG90eXBlLnJlbW92ZUl0ZW09ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVJdGVtQXQodGhpcy5faXRlbXMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZUl0ZW1BdD1mdW5jdGlvbih0KXthLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpJiZ0aGlzLnJlZnJlc2goKX0sZS5wcm90b3R5cGUuY2xlYXJJdGVtcz1mdW5jdGlvbigpezAhPT10aGlzLl9pdGVtcy5sZW5ndGgmJih0aGlzLl9pdGVtcy5sZW5ndGg9MCx0aGlzLnJlZnJlc2goKSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHRzPW51bGwsdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJjbGljayI6dGhpcy5fZXZ0Q2xpY2sodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiaW5wdXQiOnRoaXMucmVmcmVzaCgpO2JyZWFrO2Nhc2UiZm9jdXMiOmNhc2UiYmx1ciI6dGhpcy5fdG9nZ2xlRm9jdXNlZCgpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMsITApLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLCEwKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcywhMCksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMsITApfSxlLnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXtpZih0aGlzLmlzQXR0YWNoZWQpe3ZhciBlPXRoaXMuaW5wdXROb2RlO2UuZm9jdXMoKSxlLnNlbGVjdCgpfX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5wdXROb2RlLnZhbHVlLG49dGhpcy5jb250ZW50Tm9kZSxpPXRoaXMuX3Jlc3VsdHM7aWYoaXx8KGk9dGhpcy5fcmVzdWx0cz1zLnNlYXJjaCh0aGlzLl9pdGVtcyxlKSx0aGlzLl9hY3RpdmVJbmRleD1lP2EuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgoaSxzLmNhbkFjdGl2YXRlKTotMSksZXx8MCE9PWkubGVuZ3RoKWlmKGUmJjA9PT1pLmxlbmd0aCl7dmFyIHI9dGhpcy5yZW5kZXJlci5yZW5kZXJFbXB0eU1lc3NhZ2Uoe3F1ZXJ5OmV9KTtsLlZpcnR1YWxET00ucmVuZGVyKHIsbil9ZWxzZXtmb3IodmFyIG89dGhpcy5yZW5kZXJlcix1PXRoaXMuX2FjdGl2ZUluZGV4LGM9bmV3IEFycmF5KGkubGVuZ3RoKSxkPTAsZj1pLmxlbmd0aDtkPGY7KytkKXt2YXIgcD1pW2RdO2lmKCJoZWFkZXIiPT09cC50eXBlKXt2YXIgbT1wLmluZGljZXMsZz1wLmNhdGVnb3J5O2NbZF09by5yZW5kZXJIZWFkZXIoe2NhdGVnb3J5OmcsaW5kaWNlczptfSl9ZWxzZXt2YXIgdj1wLml0ZW0sYj0obT1wLmluZGljZXMsZD09PXUpO2NbZF09by5yZW5kZXJJdGVtKHtpdGVtOnYsaW5kaWNlczptLGFjdGl2ZTpifSl9fWlmKGwuVmlydHVhbERPTS5yZW5kZXIoYyxuKSx1PDB8fHU+PWkubGVuZ3RoKW4uc2Nyb2xsVG9wPTA7ZWxzZXt2YXIgeT1uLmNoaWxkcmVuW3VdO2guRWxlbWVudEV4dC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKG4seSl9fWVsc2UgbC5WaXJ0dWFsRE9NLnJlbmRlcihudWxsLG4pfSxlLnByb3RvdHlwZS5fZXZ0Q2xpY2s9ZnVuY3Rpb24odCl7aWYoMD09PXQuYnV0dG9uKXt2YXIgZT1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuY29udGVudE5vZGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFpbnModC50YXJnZXQpfSk7LTEhPT1lJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fZXhlY3V0ZShlKSl9fSxlLnByb3RvdHlwZS5fZXZ0S2V5RG93bj1mdW5jdGlvbih0KXtpZighKHQuYWx0S2V5fHx0LmN0cmxLZXl8fHQubWV0YUtleXx8dC5zaGlmdEtleSkpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSAxMzp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9leGVjdXRlKHRoaXMuX2FjdGl2ZUluZGV4KTticmVhaztjYXNlIDM4OnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2FjdGl2YXRlUHJldmlvdXNJdGVtKCk7YnJlYWs7Y2FzZSA0MDp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hY3RpdmF0ZU5leHRJdGVtKCl9fSxlLnByb3RvdHlwZS5fYWN0aXZhdGVOZXh0SXRlbT1mdW5jdGlvbigpe2lmKHRoaXMuX3Jlc3VsdHMmJjAhPT10aGlzLl9yZXN1bHRzLmxlbmd0aCl7dmFyIHQ9dGhpcy5fYWN0aXZlSW5kZXgsZT10aGlzLl9yZXN1bHRzLmxlbmd0aCxuPXQ8ZS0xP3QrMTowLGk9MD09PW4/ZS0xOm4tMTt0aGlzLl9hY3RpdmVJbmRleD1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuX3Jlc3VsdHMscy5jYW5BY3RpdmF0ZSxuLGkpLHRoaXMudXBkYXRlKCl9fSxlLnByb3RvdHlwZS5fYWN0aXZhdGVQcmV2aW91c0l0ZW09ZnVuY3Rpb24oKXtpZih0aGlzLl9yZXN1bHRzJiYwIT09dGhpcy5fcmVzdWx0cy5sZW5ndGgpe3ZhciB0PXRoaXMuX2FjdGl2ZUluZGV4LGU9dGhpcy5fcmVzdWx0cy5sZW5ndGgsbj10PD0wP2UtMTp0LTEsaT1uPT09ZS0xPzA6bisxO3RoaXMuX2FjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZExhc3RJbmRleCh0aGlzLl9yZXN1bHRzLHMuY2FuQWN0aXZhdGUsbixpKSx0aGlzLnVwZGF0ZSgpfX0sZS5wcm90b3R5cGUuX2V4ZWN1dGU9ZnVuY3Rpb24odCl7aWYodGhpcy5fcmVzdWx0cyl7dmFyIGU9dGhpcy5fcmVzdWx0c1t0XTtpZihlKXtpZigiaGVhZGVyIj09PWUudHlwZSl7dmFyIG49dGhpcy5pbnB1dE5vZGU7cmV0dXJuIG4udmFsdWU9ZS5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpKyIgIixuLmZvY3VzKCksdm9pZCB0aGlzLnJlZnJlc2goKX1lLml0ZW0uaXNFbmFibGVkJiYodGhpcy5jb21tYW5kcy5leGVjdXRlKGUuaXRlbS5jb21tYW5kLGUuaXRlbS5hcmdzKSx0aGlzLmlucHV0Tm9kZS52YWx1ZT0iIix0aGlzLnJlZnJlc2goKSl9fX0sZS5wcm90b3R5cGUuX3RvZ2dsZUZvY3VzZWQ9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dGhpcy5pbnB1dE5vZGU7dGhpcy50b2dnbGVDbGFzcygicC1tb2QtZm9jdXNlZCIsdCl9LGUucHJvdG90eXBlLl9vbkdlbmVyaWNDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sZX0oZC5XaWRnZXQpO2UuQ29tbWFuZFBhbGV0dGU9ZixmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckhlYWRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdEhlYWRlcih0KTtyZXR1cm4gbC5oLmxpKHtjbGFzc05hbWU6InAtQ29tbWFuZFBhbGV0dGUtaGVhZGVyIn0sZSl9LHQucHJvdG90eXBlLnJlbmRlckl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJdGVtQ2xhc3ModCksbj10aGlzLmNyZWF0ZUl0ZW1EYXRhc2V0KHQpO3JldHVybiBsLmgubGkoe2NsYXNzTmFtZTplLGRhdGFzZXQ6bn0sdGhpcy5yZW5kZXJJdGVtSWNvbih0KSx0aGlzLnJlbmRlckl0ZW1Db250ZW50KHQpLHRoaXMucmVuZGVySXRlbVNob3J0Y3V0KHQpKX0sdC5wcm90b3R5cGUucmVuZGVyRW1wdHlNZXNzYWdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZm9ybWF0RW1wdHlNZXNzYWdlKHQpO3JldHVybiBsLmgubGkoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1lbXB0eU1lc3NhZ2UifSxlKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUljb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJY29uQ2xhc3ModCk7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZTplfSx0Lml0ZW0uaWNvbkxhYmVsKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUNvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1pdGVtQ29udGVudCJ9LHRoaXMucmVuZGVySXRlbUxhYmVsKHQpLHRoaXMucmVuZGVySXRlbUNhcHRpb24odCkpfSx0LnByb3RvdHlwZS5yZW5kZXJJdGVtTGFiZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRJdGVtTGFiZWwodCk7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1pdGVtTGFiZWwifSxlKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUNhcHRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRJdGVtQ2FwdGlvbih0KTtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLUNvbW1hbmRQYWxldHRlLWl0ZW1DYXB0aW9uIn0sZSl9LHQucHJvdG90eXBlLnJlbmRlckl0ZW1TaG9ydGN1dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdEl0ZW1TaG9ydGN1dCh0KTtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLUNvbW1hbmRQYWxldHRlLWl0ZW1TaG9ydGN1dCJ9LGUpfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtQ29tbWFuZFBhbGV0dGUtaXRlbSI7dC5pdGVtLmlzRW5hYmxlZHx8KGUrPSIgcC1tb2QtZGlzYWJsZWQiKSx0Lml0ZW0uaXNUb2dnbGVkJiYoZSs9IiBwLW1vZC10b2dnbGVkIiksdC5hY3RpdmUmJihlKz0iIHAtbW9kLWFjdGl2ZSIpO3ZhciBuPXQuaXRlbS5jbGFzc05hbWU7cmV0dXJuIG4mJihlKz0iICIrbiksZX0sdC5wcm90b3R5cGUuY3JlYXRlSXRlbURhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8oe30sdC5pdGVtLmRhdGFzZXQse2NvbW1hbmQ6dC5pdGVtLmNvbW1hbmR9KX0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLUNvbW1hbmRQYWxldHRlLWl0ZW1JY29uIixuPXQuaXRlbS5pY29uQ2xhc3M7cmV0dXJuIG4/ZSsiICIrbjplfSx0LnByb3RvdHlwZS5mb3JtYXRIZWFkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5kaWNlcyYmMCE9PXQuaW5kaWNlcy5sZW5ndGg/YS5TdHJpbmdFeHQuaGlnaGxpZ2h0KHQuY2F0ZWdvcnksdC5pbmRpY2VzLGwuaC5tYXJrKTp0LmNhdGVnb3J5fSx0LnByb3RvdHlwZS5mb3JtYXRFbXB0eU1lc3NhZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIk5vIGNvbW1hbmRzIGZvdW5kIHRoYXQgbWF0Y2ggJyIrdC5xdWVyeSsiJyJ9LHQucHJvdG90eXBlLmZvcm1hdEl0ZW1TaG9ydGN1dD1mdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0ua2V5QmluZGluZztyZXR1cm4gZT9lLmtleXMubWFwKHMuZm9ybWF0S2V5c3Ryb2tlKS5qb2luKCIsICIpOm51bGx9LHQucHJvdG90eXBlLmZvcm1hdEl0ZW1MYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbmRpY2VzJiYwIT09dC5pbmRpY2VzLmxlbmd0aD9hLlN0cmluZ0V4dC5oaWdobGlnaHQodC5pdGVtLmxhYmVsLHQuaW5kaWNlcyxsLmgubWFyayk6dC5pdGVtLmxhYmVsfSx0LnByb3RvdHlwZS5mb3JtYXRJdGVtQ2FwdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVtLmNhcHRpb259LHR9KCk7dC5SZW5kZXJlcj1lLHQuZGVmYXVsdFJlbmRlcmVyPW5ldyBlfShmPWUuQ29tbWFuZFBhbGV0dGV8fChlLkNvbW1hbmRQYWxldHRlPXt9KSksZS5Db21tYW5kUGFsZXR0ZT1mLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtmb3IodmFyIG49dC5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpLGk9bisiICIrdC5sYWJlbC50b0xvd2VyQ2FzZSgpLHI9MS8wLG89bnVsbCxzPS9cYlx3L2c7Oyl7dmFyIHU9cy5leGVjKGkpO2lmKCF1KWJyZWFrO3ZhciBjPWEuU3RyaW5nRXh0Lm1hdGNoU3VtT2ZEZWx0YXMoaSxlLHUuaW5kZXgpO2lmKCFjKWJyZWFrO2MmJmMuc2NvcmU8PXImJihyPWMuc2NvcmUsbz1jLmluZGljZXMpfWlmKCFvfHxyPT09MS8wKXJldHVybiBudWxsO2Zvcih2YXIgaD1uLmxlbmd0aCsxLGw9YS5BcnJheUV4dC5sb3dlckJvdW5kKG8saCxmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSxkPW8uc2xpY2UoMCxsKSxmPW8uc2xpY2UobCkscD0wLG09Zi5sZW5ndGg7cDxtOysrcClmW3BdLT1oO3JldHVybiAwPT09ZC5sZW5ndGg/e21hdGNoVHlwZTowLGNhdGVnb3J5SW5kaWNlczpudWxsLGxhYmVsSW5kaWNlczpmLHNjb3JlOnIsaXRlbTp0fTowPT09Zi5sZW5ndGg/e21hdGNoVHlwZToxLGNhdGVnb3J5SW5kaWNlczpkLGxhYmVsSW5kaWNlczpudWxsLHNjb3JlOnIsaXRlbTp0fTp7bWF0Y2hUeXBlOjIsY2F0ZWdvcnlJbmRpY2VzOmQsbGFiZWxJbmRpY2VzOmYsc2NvcmU6cixpdGVtOnR9fWZ1bmN0aW9uIG4odCxlKXt2YXIgbj10Lm1hdGNoVHlwZS1lLm1hdGNoVHlwZTtpZigwIT09bilyZXR1cm4gbjt2YXIgaT10LnNjb3JlLWUuc2NvcmU7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIHI9MCxvPTA7c3dpdGNoKHQubWF0Y2hUeXBlKXtjYXNlIDA6cj10LmxhYmVsSW5kaWNlc1swXSxvPWUubGFiZWxJbmRpY2VzWzBdO2JyZWFrO2Nhc2UgMTpjYXNlIDI6cj10LmNhdGVnb3J5SW5kaWNlc1swXSxvPWUuY2F0ZWdvcnlJbmRpY2VzWzBdfWlmKHIhPT1vKXJldHVybiByLW87dmFyIHM9dC5pdGVtLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoZS5pdGVtLmNhdGVnb3J5KTtpZigwIT09cylyZXR1cm4gczt2YXIgYT10Lml0ZW0ucmFuayx1PWUuaXRlbS5yYW5rO3JldHVybiBhIT09dT9hPHU/LTE6MTp0Lml0ZW0ubGFiZWwubG9jYWxlQ29tcGFyZShlLml0ZW0ubGFiZWwpfXQuY3JlYXRlTm9kZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpO3JldHVybiBlLmNsYXNzTmFtZT0icC1Db21tYW5kUGFsZXR0ZS1zZWFyY2giLG4uY2xhc3NOYW1lPSJwLUNvbW1hbmRQYWxldHRlLXdyYXBwZXIiLGkuY2xhc3NOYW1lPSJwLUNvbW1hbmRQYWxldHRlLWlucHV0IixyLmNsYXNzTmFtZT0icC1Db21tYW5kUGFsZXR0ZS1jb250ZW50IixpLnNwZWxsY2hlY2s9ITEsbi5hcHBlbmRDaGlsZChpKSxlLmFwcGVuZENoaWxkKG4pLHQuYXBwZW5kQ2hpbGQoZSksdC5hcHBlbmRDaGlsZChyKSx0fSx0LmNyZWF0ZUl0ZW09ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0sdC5mb3JtYXRLZXlzdHJva2U9ZnVuY3Rpb24odCl7dmFyIGU9IiIsbj1jLkNvbW1hbmRSZWdpc3RyeS5wYXJzZUtleXN0cm9rZSh0KTtyZXR1cm4gaC5QbGF0Zm9ybS5JU19NQUM/KG4uY3RybCYmKGUrPSLijIMgIiksbi5hbHQmJihlKz0i4oylICIpLG4uc2hpZnQmJihlKz0i4oenICIpLG4uY21kJiYoZSs9IuKMmCAiKSk6KG4uY3RybCYmKGUrPSJDdHJsKyIpLG4uYWx0JiYoZSs9IkFsdCsiKSxuLnNoaWZ0JiYoZSs9IlNoaWZ0KyIpKSxlK24ua2V5fSx0LnNlYXJjaD1mdW5jdGlvbih0LGkpe3ZhciByPWZ1bmN0aW9uKHQsbil7bj1uLnJlcGxhY2UoL1xzKy9nLCIiKS50b0xvd2VyQ2FzZSgpO2Zvcih2YXIgaT1bXSxyPTAsbz10Lmxlbmd0aDtyPG87KytyKXt2YXIgcz10W3JdO2lmKHMuaXNWaXNpYmxlKWlmKG4pe3ZhciBhPWUocyxuKTthJiYocy5pc0VuYWJsZWR8fChhLnNjb3JlKz0xZTMpLGkucHVzaChhKSl9ZWxzZSBpLnB1c2goe21hdGNoVHlwZTozLGNhdGVnb3J5SW5kaWNlczpudWxsLGxhYmVsSW5kaWNlczpudWxsLHNjb3JlOjAsaXRlbTpzfSl9cmV0dXJuIGl9KHQsaSk7cmV0dXJuIHIuc29ydChuKSxmdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpO2EuQXJyYXlFeHQuZmlsbChlLCExKTtmb3IodmFyIG49W10saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZighZVtpXSl7dmFyIG89dFtpXSxzPW8uaXRlbSx1PW8uY2F0ZWdvcnlJbmRpY2VzLGM9cy5jYXRlZ29yeTtuLnB1c2goe3R5cGU6ImhlYWRlciIsY2F0ZWdvcnk6YyxpbmRpY2VzOnV9KTtmb3IodmFyIGg9aTtoPHI7KytoKWlmKCFlW2hdKXt2YXIgbD10W2hdLGQ9bC5pdGVtLGY9bC5sYWJlbEluZGljZXM7ZC5jYXRlZ29yeT09PWMmJihuLnB1c2goe3R5cGU6Iml0ZW0iLGl0ZW06ZCxpbmRpY2VzOmZ9KSxlW2hdPSEwKX19cmV0dXJuIG59KHIpfSx0LmNhbkFjdGl2YXRlPWZ1bmN0aW9uKHQpe3JldHVybiJpdGVtIj09PXQudHlwZSYmdC5pdGVtLmlzRW5hYmxlZH07dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY29tbWFuZHM9dCx0aGlzLmNhdGVnb3J5PWUuY2F0ZWdvcnkudHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIiksdGhpcy5jb21tYW5kPWUuY29tbWFuZCx0aGlzLmFyZ3M9ZS5hcmdzfHx1LkpTT05FeHQuZW1wdHlPYmplY3QsdGhpcy5yYW5rPXZvaWQgMCE9PWUucmFuaz9lLnJhbms6MS8wfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhYmVsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaWNvbkNsYXNzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmljb25DbGFzcyh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb25MYWJlbCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5pY29uTGFiZWwodGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjYXB0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmNhcHRpb24odGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjbGFzc05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbWFuZHMuY2xhc3NOYW1lKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGF0YXNldCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5kYXRhc2V0KHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNFbmFibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmlzRW5hYmxlZCh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVG9nZ2xlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5pc1RvZ2dsZWQodGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc1Zpc2libGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbWFuZHMuaXNWaXNpYmxlKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwia2V5QmluZGluZyIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29tbWFuZCxlPXRoaXMuYXJncztyZXR1cm4gYS5BcnJheUV4dC5maW5kTGFzdFZhbHVlKHRoaXMuX2NvbW1hbmRzLmtleUJpbmRpbmdzLGZ1bmN0aW9uKG4pe3JldHVybiBuLmNvbW1hbmQ9PT10JiZ1LkpTT05FeHQuZGVlcEVxdWFsKG4uYXJncyxlKX0pfHxudWxsfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9KCl9KHN8fChzPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHIsbz1uKDIpLHM9big3OCksYT1uKDkpLHU9bigxMzEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2lkVGljaz0wLHRoaXMuX2l0ZW1zPVtdLHRoaXMubWVudT1uZXcgdS5NZW51KHQpfXJldHVybiB0LnByb3RvdHlwZS5hZGRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1yLmNyZWF0ZUl0ZW0odCx0aGlzLl9pZFRpY2srKyk7cmV0dXJuIHRoaXMuX2l0ZW1zLnB1c2gobiksbmV3IHMuRGlzcG9zYWJsZURlbGVnYXRlKGZ1bmN0aW9uKCl7by5BcnJheUV4dC5yZW1vdmVGaXJzdE9mKGUuX2l0ZW1zLG4pfSl9LHQucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLm1lbnUuY2xlYXJJdGVtcygpLDA9PT10aGlzLl9pdGVtcy5sZW5ndGgpcmV0dXJuITE7dmFyIG49ci5tYXRjaEl0ZW1zKHRoaXMuX2l0ZW1zLHQpO3JldHVybiEoIW58fDA9PT1uLmxlbmd0aCkmJihvLmVhY2gobixmdW5jdGlvbih0KXtlLm1lbnUuYWRkSXRlbSh0KX0pLHRoaXMubWVudS5vcGVuKHQuY2xpZW50WCx0LmNsaWVudFkpLCEwKX0sdH0oKTtlLkNvbnRleHRNZW51PWMsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciBuPWEuU2VsZWN0b3IuY2FsY3VsYXRlU3BlY2lmaWNpdHkodC5zZWxlY3RvciksaT1hLlNlbGVjdG9yLmNhbGN1bGF0ZVNwZWNpZmljaXR5KGUuc2VsZWN0b3IpO2lmKG4hPT1pKXJldHVybiBpLW47dmFyIHI9dC5yYW5rLG89ZS5yYW5rO3JldHVybiByIT09bz9yPG8/LTE6MTp0LmlkLWUuaWR9dC5jcmVhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoLTEhPT10LmluZGV4T2YoIiwiKSl0aHJvdyBuZXcgRXJyb3IoIlNlbGVjdG9yIGNhbm5vdCBjb250YWluIGNvbW1hczogIit0KTtpZighYS5TZWxlY3Rvci5pc1ZhbGlkKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZWxlY3RvcjogIit0KTtyZXR1cm4gdH0odC5zZWxlY3Rvcikscj12b2lkIDAhPT10LnJhbms/dC5yYW5rOjEvMDtyZXR1cm4gaSh7fSx0LHtzZWxlY3RvcjpuLHJhbms6cixpZDplfSl9LHQubWF0Y2hJdGVtcz1mdW5jdGlvbih0LG4pe3ZhciBpPW4udGFyZ2V0O2lmKCFpKXJldHVybiBudWxsO3ZhciByPW4uY3VycmVudFRhcmdldDtpZighcilyZXR1cm4gbnVsbDtpZighKHIuY29udGFpbnMoaSl8fChpPWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQobi5jbGllbnRYLG4uY2xpZW50WSkpJiZyLmNvbnRhaW5zKGkpKSlyZXR1cm4gbnVsbDtmb3IodmFyIG89W10scz10LnNsaWNlKCk7bnVsbCE9PWk7KXtmb3IodmFyIHU9W10sYz0wLGg9cy5sZW5ndGg7YzxoOysrYyl7dmFyIGw9c1tjXTtsJiZhLlNlbGVjdG9yLm1hdGNoZXMoaSxsLnNlbGVjdG9yKSYmKHUucHVzaChsKSxzW2NdPW51bGwpfWlmKDAhPT11Lmxlbmd0aCYmKHUuc29ydChlKSxvLnB1c2guYXBwbHkobyx1KSksaT09PXIpYnJlYWs7aT1pLnBhcmVudEVsZW1lbnR9cmV0dXJuIG99fShyfHwocj17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDI2KSx1PW4oOSksYz1uKDU2KSxoPW4oNSksbD1uKDMwKSxkPW4oMTEpLGY9bigxMzIpLHA9big4MCksbT1uKDcpLGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO2kuX2RyYWc9bnVsbCxpLl9wcmVzc0RhdGE9bnVsbCxpLl9sYXlvdXRNb2RpZmllZD1uZXcgZC5TaWduYWwoaSksaS5hZGRDbGFzcygicC1Eb2NrUGFuZWwiKSxpLl9tb2RlPW4ubW9kZXx8Im11bHRpcGxlLWRvY3VtZW50IixpLl9yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpLmRhdGFzZXQubW9kZT1pLl9tb2RlO3ZhciByPXtjcmVhdGVUYWJCYXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5fY3JlYXRlVGFiQmFyKCl9LGNyZWF0ZUhhbmRsZTpmdW5jdGlvbigpe3JldHVybiBpLl9jcmVhdGVIYW5kbGUoKX19O3JldHVybiBpLmxheW91dD1uZXcgZi5Eb2NrTGF5b3V0KHtyZW5kZXJlcjpyLHNwYWNpbmc6bi5zcGFjaW5nfSksaS5vdmVybGF5PW4ub3ZlcmxheXx8bmV3IGUuT3ZlcmxheSxpLm5vZGUuYXBwZW5kQ2hpbGQoaS5vdmVybGF5Lm5vZGUpLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5vdmVybGF5LmhpZGUoMCksdGhpcy5fZHJhZyYmdGhpcy5fZHJhZy5kaXNwb3NlKCksdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dE1vZGlmaWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheW91dE1vZGlmaWVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicmVuZGVyZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQucmVuZGVyZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnNwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5zcGFjaW5nPXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGV9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl9tb2RlIT09dCl7dGhpcy5fbW9kZT10LHRoaXMuZGF0YXNldC5tb2RlPXQ7dmFyIGU9dGhpcy5sYXlvdXQ7c3dpdGNoKHQpe2Nhc2UibXVsdGlwbGUtZG9jdW1lbnQiOnMuZWFjaChlLnRhYkJhcnMoKSxmdW5jdGlvbih0KXt0LnNob3coKX0pO2JyZWFrO2Nhc2Uic2luZ2xlLWRvY3VtZW50IjplLnJlc3RvcmVMYXlvdXQoby5jcmVhdGVTaW5nbGVEb2N1bWVudENvbmZpZyh0aGlzKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9aC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImlzRW1wdHkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuaXNFbXB0eX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS53aWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LndpZGdldHMoKX0sZS5wcm90b3R5cGUuc2VsZWN0ZWRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnNlbGVjdGVkV2lkZ2V0cygpfSxlLnByb3RvdHlwZS50YWJCYXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnRhYkJhcnMoKX0sZS5wcm90b3R5cGUuaGFuZGxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5oYW5kbGVzKCl9LGUucHJvdG90eXBlLnNlbGVjdFdpZGdldD1mdW5jdGlvbih0KXt2YXIgZT1zLmZpbmQodGhpcy50YWJCYXJzKCksZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1lLnRpdGxlcy5pbmRleE9mKHQudGl0bGUpfSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgZG9jayBwYW5lbC4iKTtlLmN1cnJlbnRUaXRsZT10LnRpdGxlfSxlLnByb3RvdHlwZS5hY3RpdmF0ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnNlbGVjdFdpZGdldCh0KSx0LmFjdGl2YXRlKCl9LGUucHJvdG90eXBlLnNhdmVMYXlvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc2F2ZUxheW91dCgpfSxlLnByb3RvdHlwZS5yZXN0b3JlTGF5b3V0PWZ1bmN0aW9uKHQpe3RoaXMuX21vZGU9Im11bHRpcGxlLWRvY3VtZW50Iix0aGlzLmxheW91dC5yZXN0b3JlTGF5b3V0KHQpLCh1LlBsYXRmb3JtLklTX0VER0V8fHUuUGxhdGZvcm0uSVNfSUUpJiZoLk1lc3NhZ2VMb29wLmZsdXNoKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSksInNpbmdsZS1kb2N1bWVudCI9PT10aGlzLl9tb2RlP3RoaXMubGF5b3V0LmFkZFdpZGdldCh0KTp0aGlzLmxheW91dC5hZGRXaWRnZXQodCxlKSxoLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKHRoaXMsby5MYXlvdXRNb2RpZmllZCl9LGUucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlPWZ1bmN0aW9uKGUpeyJsYXlvdXQtbW9kaWZpZWQiPT09ZS50eXBlP3RoaXMuX2xheW91dE1vZGlmaWVkLmVtaXQodm9pZCAwKTp0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UicC1kcmFnZW50ZXIiOnRoaXMuX2V2dERyYWdFbnRlcih0KTticmVhaztjYXNlInAtZHJhZ2xlYXZlIjp0aGlzLl9ldnREcmFnTGVhdmUodCk7YnJlYWs7Y2FzZSJwLWRyYWdvdmVyIjp0aGlzLl9ldnREcmFnT3Zlcih0KTticmVhaztjYXNlInAtZHJvcCI6dGhpcy5fZXZ0RHJvcCh0KTticmVhaztjYXNlIm1vdXNlZG93biI6dGhpcy5fZXZ0TW91c2VEb3duKHQpO2JyZWFrO2Nhc2UibW91c2Vtb3ZlIjp0aGlzLl9ldnRNb3VzZU1vdmUodCk7YnJlYWs7Y2FzZSJtb3VzZXVwIjp0aGlzLl9ldnRNb3VzZVVwKHQpO2JyZWFrO2Nhc2Uia2V5ZG93biI6dGhpcy5fZXZ0S2V5RG93bih0KTticmVhaztjYXNlImNvbnRleHRtZW51Ijp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19LGUucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoPWZ1bmN0aW9uKHQpe3RoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJwLWRyYWdlbnRlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoInAtZHJhZ2xlYXZlIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigicC1kcmFnb3ZlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoInAtZHJvcCIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInAtZHJhZ2VudGVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicC1kcmFnbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJwLWRyYWdvdmVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicC1kcm9wIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25DaGlsZEFkZGVkPWZ1bmN0aW9uKHQpe28uaXNHZW5lcmF0ZWRUYWJCYXJQcm9wZXJ0eS5nZXQodC5jaGlsZCl8fHQuY2hpbGQuYWRkQ2xhc3MoInAtRG9ja1BhbmVsLXdpZGdldCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXtvLmlzR2VuZXJhdGVkVGFiQmFyUHJvcGVydHkuZ2V0KHQuY2hpbGQpfHwodC5jaGlsZC5yZW1vdmVDbGFzcygicC1Eb2NrUGFuZWwtd2lkZ2V0IiksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpKX0sZS5wcm90b3R5cGUuX2V2dERyYWdFbnRlcj1mdW5jdGlvbih0KXt0Lm1pbWVEYXRhLmhhc0RhdGEoImFwcGxpY2F0aW9uL3ZuZC5waG9zcGhvci53aWRnZXQtZmFjdG9yeSIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxlLnByb3RvdHlwZS5fZXZ0RHJhZ0xlYXZlPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXQucmVsYXRlZFRhcmdldDtlJiZ0aGlzLm5vZGUuY29udGFpbnMoZSl8fHRoaXMub3ZlcmxheS5oaWRlKDApfSxlLnByb3RvdHlwZS5fZXZ0RHJhZ092ZXI9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksImludmFsaWQiPT09dGhpcy5fc2hvd092ZXJsYXkodC5jbGllbnRYLHQuY2xpZW50WSk/dC5kcm9wQWN0aW9uPSJub25lIjp0LmRyb3BBY3Rpb249dC5wcm9wb3NlZEFjdGlvbn0sZS5wcm90b3R5cGUuX2V2dERyb3A9ZnVuY3Rpb24odCl7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vdmVybGF5LmhpZGUoMCksIm5vbmUiIT09dC5wcm9wb3NlZEFjdGlvbil7dmFyIGU9dC5jbGllbnRYLG49dC5jbGllbnRZLGk9by5maW5kRHJvcFRhcmdldCh0aGlzLGUsbikscj1pLnpvbmUscz1pLnRhcmdldDtpZigiaW52YWxpZCIhPT1yKXt2YXIgYT10Lm1pbWVEYXRhLmdldERhdGEoImFwcGxpY2F0aW9uL3ZuZC5waG9zcGhvci53aWRnZXQtZmFjdG9yeSIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXt2YXIgdT1hKCk7aWYodSBpbnN0YW5jZW9mIG0uV2lkZ2V0KWlmKHUuY29udGFpbnModGhpcykpdC5kcm9wQWN0aW9uPSJub25lIjtlbHNle3ZhciBjPXM/by5nZXREcm9wUmVmKHMudGFiQmFyKTpudWxsO3N3aXRjaChyKXtjYXNlInJvb3QtYWxsIjp0aGlzLmFkZFdpZGdldCh1KTticmVhaztjYXNlInJvb3QtdG9wIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC10b3AifSk7YnJlYWs7Y2FzZSJyb290LWxlZnQiOnRoaXMuYWRkV2lkZ2V0KHUse21vZGU6InNwbGl0LWxlZnQifSk7YnJlYWs7Y2FzZSJyb290LXJpZ2h0Ijp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1yaWdodCJ9KTticmVhaztjYXNlInJvb3QtYm90dG9tIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1ib3R0b20ifSk7YnJlYWs7Y2FzZSJ3aWRnZXQtYWxsIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJ0YWItYWZ0ZXIiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtdG9wIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC10b3AiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtbGVmdCI6dGhpcy5hZGRXaWRnZXQodSx7bW9kZToic3BsaXQtbGVmdCIscmVmOmN9KTticmVhaztjYXNlIndpZGdldC1yaWdodCI6dGhpcy5hZGRXaWRnZXQodSx7bW9kZToic3BsaXQtcmlnaHQiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtYm90dG9tIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1ib3R0b20iLHJlZjpjfSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9dC5kcm9wQWN0aW9uPXQucHJvcG9zZWRBY3Rpb24sdGhpcy5hY3RpdmF0ZVdpZGdldCh1KX1lbHNlIHQuZHJvcEFjdGlvbj0ibm9uZSJ9ZWxzZSB0LmRyb3BBY3Rpb249Im5vbmUifWVsc2UgdC5kcm9wQWN0aW9uPSJub25lIn1lbHNlIHQuZHJvcEFjdGlvbj0ibm9uZSJ9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiYodGhpcy5fcmVsZWFzZU1vdXNlKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24pe3ZhciBlPXRoaXMubGF5b3V0LG49dC50YXJnZXQsaT1zLmZpbmQoZS5oYW5kbGVzKCksZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udGFpbnMobil9KTtpZihpKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKTt2YXIgcj1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dC5jbGllbnRYLXIubGVmdCxhPXQuY2xpZW50WS1yLnRvcCx1PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLGg9Yy5EcmFnLm92ZXJyaWRlQ3Vyc29yKHUuY3Vyc29yKTt0aGlzLl9wcmVzc0RhdGE9e2hhbmRsZTppLGRlbHRhWDpvLGRlbHRhWTphLG92ZXJyaWRlOmh9fX19LGUucHJvdG90eXBlLl9ldnRNb3VzZU1vdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5fcHJlc3NEYXRhKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj10LmNsaWVudFgtZS5sZWZ0LXRoaXMuX3ByZXNzRGF0YS5kZWx0YVgsaT10LmNsaWVudFktZS50b3AtdGhpcy5fcHJlc3NEYXRhLmRlbHRhWTt0aGlzLmxheW91dC5tb3ZlSGFuZGxlKHRoaXMuX3ByZXNzRGF0YS5oYW5kbGUsbixpKX19LGUucHJvdG90eXBlLl9ldnRNb3VzZVVwPWZ1bmN0aW9uKHQpezA9PT10LmJ1dHRvbiYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3JlbGVhc2VNb3VzZSgpLGguTWVzc2FnZUxvb3AucG9zdE1lc3NhZ2UodGhpcyxvLkxheW91dE1vZGlmaWVkKSl9LGUucHJvdG90eXBlLl9yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9wcmVzc0RhdGEmJih0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApKX0sZS5wcm90b3R5cGUuX3Nob3dPdmVybGF5PWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLHMsYT1vLmZpbmREcm9wVGFyZ2V0KHRoaXMsdCxlKSxjPWEuem9uZSxoPWEudGFyZ2V0O2lmKCJpbnZhbGlkIj09PWMpcmV0dXJuIHRoaXMub3ZlcmxheS5oaWRlKDEwMCksYzt2YXIgbD11LkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMubm9kZSksZD10aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7c3dpdGNoKGMpe2Nhc2Uicm9vdC1hbGwiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9bC5wYWRkaW5nQm90dG9tO2JyZWFrO2Nhc2Uicm9vdC10b3AiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9ZC5oZWlnaHQqby5HT0xERU5fUkFUSU87YnJlYWs7Y2FzZSJyb290LWxlZnQiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWQud2lkdGgqby5HT0xERU5fUkFUSU8scz1sLnBhZGRpbmdCb3R0b207YnJlYWs7Y2FzZSJyb290LXJpZ2h0IjpuPWwucGFkZGluZ1RvcCxpPWQud2lkdGgqby5HT0xERU5fUkFUSU8scj1sLnBhZGRpbmdSaWdodCxzPWwucGFkZGluZ0JvdHRvbTticmVhaztjYXNlInJvb3QtYm90dG9tIjpuPWQuaGVpZ2h0Km8uR09MREVOX1JBVElPLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9bC5wYWRkaW5nQm90dG9tO2JyZWFrO2Nhc2Uid2lkZ2V0LWFsbCI6bj1oLnRvcCxpPWgubGVmdCxyPWgucmlnaHQscz1oLmJvdHRvbTticmVhaztjYXNlIndpZGdldC10b3AiOm49aC50b3AsaT1oLmxlZnQscj1oLnJpZ2h0LHM9aC5ib3R0b20raC5oZWlnaHQvMjticmVhaztjYXNlIndpZGdldC1sZWZ0IjpuPWgudG9wLGk9aC5sZWZ0LHI9aC5yaWdodCtoLndpZHRoLzIscz1oLmJvdHRvbTticmVhaztjYXNlIndpZGdldC1yaWdodCI6bj1oLnRvcCxpPWgubGVmdCtoLndpZHRoLzIscj1oLnJpZ2h0LHM9aC5ib3R0b207YnJlYWs7Y2FzZSJ3aWRnZXQtYm90dG9tIjpuPWgudG9wK2guaGVpZ2h0LzIsaT1oLmxlZnQscj1oLnJpZ2h0LHM9aC5ib3R0b207YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJuIHRoaXMub3ZlcmxheS5zaG93KHt0b3A6bixsZWZ0OmkscmlnaHQ6cixib3R0b206c30pLGN9LGUucHJvdG90eXBlLl9jcmVhdGVUYWJCYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZW5kZXJlci5jcmVhdGVUYWJCYXIoKTtyZXR1cm4gby5pc0dlbmVyYXRlZFRhYkJhclByb3BlcnR5LnNldCh0LCEwKSwic2luZ2xlLWRvY3VtZW50Ij09PXRoaXMuX21vZGUmJnQuaGlkZSgpLHQudGFic01vdmFibGU9ITAsdC5hbGxvd0Rlc2VsZWN0PSExLHQucmVtb3ZlQmVoYXZpb3I9InNlbGVjdC1wcmV2aW91cy10YWIiLHQuaW5zZXJ0QmVoYXZpb3I9InNlbGVjdC10YWItaWYtbmVlZGVkIix0LnRhYk1vdmVkLmNvbm5lY3QodGhpcy5fb25UYWJNb3ZlZCx0aGlzKSx0LmN1cnJlbnRDaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25DdXJyZW50Q2hhbmdlZCx0aGlzKSx0LnRhYkNsb3NlUmVxdWVzdGVkLmNvbm5lY3QodGhpcy5fb25UYWJDbG9zZVJlcXVlc3RlZCx0aGlzKSx0LnRhYkRldGFjaFJlcXVlc3RlZC5jb25uZWN0KHRoaXMuX29uVGFiRGV0YWNoUmVxdWVzdGVkLHRoaXMpLHQudGFiQWN0aXZhdGVSZXF1ZXN0ZWQuY29ubmVjdCh0aGlzLl9vblRhYkFjdGl2YXRlUmVxdWVzdGVkLHRoaXMpLHR9LGUucHJvdG90eXBlLl9jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXIuY3JlYXRlSGFuZGxlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKCl7aC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5fb25DdXJyZW50Q2hhbmdlZD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldmlvdXNUaXRsZSxpPWUuY3VycmVudFRpdGxlO24mJm4ub3duZXIuaGlkZSgpLGkmJmkub3duZXIuc2hvdygpLCh1LlBsYXRmb3JtLklTX0VER0V8fHUuUGxhdGZvcm0uSVNfSUUpJiZoLk1lc3NhZ2VMb29wLmZsdXNoKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYkRldGFjaFJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIXRoaXMuX2RyYWcpe3QucmVsZWFzZU1vdXNlKCk7dmFyIGk9ZS50aXRsZSxyPWUudGFiLG89ZS5jbGllbnRYLHM9ZS5jbGllbnRZLHU9bmV3IGEuTWltZURhdGE7dS5zZXREYXRhKCJhcHBsaWNhdGlvbi92bmQucGhvc3Bob3Iud2lkZ2V0LWZhY3RvcnkiLGZ1bmN0aW9uKCl7cmV0dXJuIGkub3duZXJ9KTt2YXIgaD1yLmNsb25lTm9kZSghMCk7dGhpcy5fZHJhZz1uZXcgYy5EcmFnKHttaW1lRGF0YTp1LGRyYWdJbWFnZTpoLHByb3Bvc2VkQWN0aW9uOiJtb3ZlIixzdXBwb3J0ZWRBY3Rpb25zOiJtb3ZlIn0pLHIuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIik7dGhpcy5fZHJhZy5zdGFydChvLHMpLnRoZW4oZnVuY3Rpb24oKXtuLl9kcmFnPW51bGwsci5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1oaWRkZW4iKX0pfX0sZX0obS5XaWRnZXQpO2UuRG9ja1BhbmVsPWcsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fdGltZXI9LTEsdGhpcy5faGlkZGVuPSEwLHRoaXMubm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgicC1Eb2NrUGFuZWwtb3ZlcmxheSIpLHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCJwLW1vZC1oaWRkZW4iKSx0aGlzLm5vZGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIn1yZXR1cm4gdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm5vZGUuc3R5bGU7ZS50b3A9dC50b3ArInB4IixlLmxlZnQ9dC5sZWZ0KyJweCIsZS5yaWdodD10LnJpZ2h0KyJweCIsZS5ib3R0b209dC5ib3R0b20rInB4IixjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPS0xLHRoaXMuX2hpZGRlbiYmKHRoaXMuX2hpZGRlbj0hMSx0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtaGlkZGVuIikpfSx0LnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2hpZGRlbilyZXR1cm4gdDw9MD8oY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj0tMSx0aGlzLl9oaWRkZW49ITAsdm9pZCB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIikpOnZvaWQoLTE9PT10aGlzLl90aW1lciYmKHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl90aW1lcj0tMSxlLl9oaWRkZW49ITAsZS5ub2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWhpZGRlbiIpfSx0KSkpfSx0fSgpO3QuT3ZlcmxheT1lO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlVGFiQmFyPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHAuVGFiQmFyO3JldHVybiB0LmFkZENsYXNzKCJwLURvY2tQYW5lbC10YWJCYXIiKSx0fSx0LnByb3RvdHlwZS5jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9InAtRG9ja1BhbmVsLWhhbmRsZSIsdH0sdH0oKTt0LlJlbmRlcmVyPW4sdC5kZWZhdWx0UmVuZGVyZXI9bmV3IG59KGc9ZS5Eb2NrUGFuZWx8fChlLkRvY2tQYW5lbD17fSkpLGUuRG9ja1BhbmVsPWcsZnVuY3Rpb24odCl7dC5HT0xERU5fUkFUSU89LjYxOCx0LkVER0VfU0laRT00MCx0LkxheW91dE1vZGlmaWVkPW5ldyBoLkNvbmZsYXRhYmxlTWVzc2FnZSgibGF5b3V0LW1vZGlmaWVkIiksdC5pc0dlbmVyYXRlZFRhYkJhclByb3BlcnR5PW5ldyBsLkF0dGFjaGVkUHJvcGVydHkoe25hbWU6ImlzR2VuZXJhdGVkVGFiQmFyIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX19KSx0LmNyZWF0ZVNpbmdsZURvY3VtZW50Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKHQuaXNFbXB0eSlyZXR1cm57bWFpbjpudWxsfTt2YXIgZT1zLnRvQXJyYXkodC53aWRnZXRzKCkpLG49dC5zZWxlY3RlZFdpZGdldHMoKS5uZXh0KCksaT1uP2UuaW5kZXhPZihuKTotMTtyZXR1cm57bWFpbjp7dHlwZToidGFiLWFyZWEiLHdpZGdldHM6ZSxjdXJyZW50SW5kZXg6aX19fSx0LmZpbmREcm9wVGFyZ2V0PWZ1bmN0aW9uKGUsbixpKXtpZighdS5FbGVtZW50RXh0LmhpdFRlc3QoZS5ub2RlLG4saSkpcmV0dXJue3pvbmU6ImludmFsaWQiLHRhcmdldDpudWxsfTt2YXIgcj1lLmxheW91dDtpZihyLmlzRW1wdHkpcmV0dXJue3pvbmU6InJvb3QtYWxsIix0YXJnZXQ6bnVsbH07aWYoIm11bHRpcGxlLWRvY3VtZW50Ij09PWUubW9kZSl7dmFyIG89ZS5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9bi1vLmxlZnQrMSxhPWktby50b3ArMSxjPW8ucmlnaHQtbixoPW8uYm90dG9tLWksbD1NYXRoLm1pbihzLGEsYyxoKTtpZihsPD10LkVER0VfU0laRSl7dmFyIGQ7c3dpdGNoKGwpe2Nhc2UgczpkPSJyb290LWxlZnQiO2JyZWFrO2Nhc2UgYTpkPSJyb290LXRvcCI7YnJlYWs7Y2FzZSBjOmQ9InJvb3QtcmlnaHQiO2JyZWFrO2Nhc2UgaDpkPSJyb290LWJvdHRvbSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJue3pvbmU6ZCx0YXJnZXQ6bnVsbH19fXZhciBmPXIuaGl0VGVzdFRhYkFyZWFzKG4saSk7aWYoIWYpcmV0dXJue3pvbmU6ImludmFsaWQiLHRhcmdldDpudWxsfTtpZigic2luZ2xlLWRvY3VtZW50Ij09PWUubW9kZSlyZXR1cm57em9uZToid2lkZ2V0LWFsbCIsdGFyZ2V0OmZ9O3ZhciBwLG09Zi54LWYubGVmdCsxLGc9Zi55LWYudG9wKzEsdj1mLmxlZnQrZi53aWR0aC1mLngsYj1mLnRvcCtmLmhlaWdodC1mLnkseT1NYXRoLnJvdW5kKGYud2lkdGgvMyksXz1NYXRoLnJvdW5kKGYuaGVpZ2h0LzMpO2lmKG0+eSYmdj55JiZnPl8mJmI+XylyZXR1cm57em9uZToid2lkZ2V0LWFsbCIsdGFyZ2V0OmZ9O3N3aXRjaChtLz15LGcvPV8sdi89eSxiLz1fLE1hdGgubWluKG0sZyx2LGIpKXtjYXNlIG06cD0id2lkZ2V0LWxlZnQiO2JyZWFrO2Nhc2UgZzpwPSJ3aWRnZXQtdG9wIjticmVhaztjYXNlIHY6cD0id2lkZ2V0LXJpZ2h0IjticmVhaztjYXNlIGI6cD0id2lkZ2V0LWJvdHRvbSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJue3pvbmU6cCx0YXJnZXQ6Zn19LHQuZ2V0RHJvcFJlZj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQudGl0bGVzLmxlbmd0aD9udWxsOnQuY3VycmVudFRpdGxlP3QuY3VycmVudFRpdGxlLm93bmVyOnQudGl0bGVzW3QudGl0bGVzLmxlbmd0aC0xXS5vd25lcn19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMikscj1uKDExKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2NvdW50ZXI9MCx0aGlzLl93aWRnZXRzPVtdLHRoaXMuX2FjdGl2ZVdpZGdldD1udWxsLHRoaXMuX2N1cnJlbnRXaWRnZXQ9bnVsbCx0aGlzLl9udW1iZXJzPW5ldyBNYXAsdGhpcy5fbm9kZXM9bmV3IE1hcCx0aGlzLl9hY3RpdmVDaGFuZ2VkPW5ldyByLlNpZ25hbCh0aGlzKSx0aGlzLl9jdXJyZW50Q2hhbmdlZD1uZXcgci5TaWduYWwodGhpcyl9cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2NvdW50ZXI8MHx8KHRoaXMuX2NvdW50ZXI9LTEsci5TaWduYWwuY2xlYXJEYXRhKHRoaXMpLGkuZWFjaCh0aGlzLl93aWRnZXRzLGZ1bmN0aW9uKGUpe2Uubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdCwhMCksZS5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHQsITApfSksdGhpcy5fYWN0aXZlV2lkZ2V0PW51bGwsdGhpcy5fY3VycmVudFdpZGdldD1udWxsLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fbnVtYmVycy5jbGVhcigpLHRoaXMuX3dpZGdldHMubGVuZ3RoPTApfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImN1cnJlbnRDaGFuZ2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZlQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNEaXNwb3NlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb3VudGVyPDB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjdXJyZW50V2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRXaWRnZXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhY3RpdmVXaWRnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlV2lkZ2V0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZvY3VzTnVtYmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX251bWJlcnMuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1lPy0xOmV9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbnVtYmVycy5oYXModCl9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZighdGhpcy5fbnVtYmVycy5oYXModCkpe3ZhciBlPXQubm9kZS5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSxuPWU/dGhpcy5fY291bnRlcisrOi0xO3RoaXMuX3dpZGdldHMucHVzaCh0KSx0aGlzLl9udW1iZXJzLnNldCh0LG4pLHRoaXMuX25vZGVzLnNldCh0Lm5vZGUsdCksdC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLCEwKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcywhMCksdC5kaXNwb3NlZC5jb25uZWN0KHRoaXMuX29uV2lkZ2V0RGlzcG9zZWQsdGhpcyksZSYmdGhpcy5fc2V0V2lkZ2V0cyh0LHQpfX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodGhpcy5fbnVtYmVycy5oYXModCkmJih0LmRpc3Bvc2VkLmRpc2Nvbm5lY3QodGhpcy5fb25XaWRnZXREaXNwb3NlZCx0aGlzKSx0Lm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMsITApLHQubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLCEwKSxpLkFycmF5RXh0LnJlbW92ZUZpcnN0T2YodGhpcy5fd2lkZ2V0cyx0KSx0aGlzLl9ub2Rlcy5kZWxldGUodC5ub2RlKSx0aGlzLl9udW1iZXJzLmRlbGV0ZSh0KSx0aGlzLl9jdXJyZW50V2lkZ2V0PT09dCkpe3ZhciBuPWkuZmlsdGVyKHRoaXMuX3dpZGdldHMsZnVuY3Rpb24odCl7cmV0dXJuLTEhPT1lLl9udW1iZXJzLmdldCh0KX0pLHI9aS5tYXgobixmdW5jdGlvbih0LG4pe3JldHVybiBlLl9udW1iZXJzLmdldCh0KS1lLl9udW1iZXJzLmdldChuKX0pfHxudWxsO3RoaXMuX3NldFdpZGdldHMocixudWxsKX19LHQucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiZm9jdXMiOnRoaXMuX2V2dEZvY3VzKHQpO2JyZWFrO2Nhc2UiYmx1ciI6dGhpcy5fZXZ0Qmx1cih0KX19LHQucHJvdG90eXBlLl9zZXRXaWRnZXRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY3VycmVudFdpZGdldDt0aGlzLl9jdXJyZW50V2lkZ2V0PXQ7dmFyIGk9dGhpcy5fYWN0aXZlV2lkZ2V0O3RoaXMuX2FjdGl2ZVdpZGdldD1lLG4hPT10JiZ0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtvbGRWYWx1ZTpuLG5ld1ZhbHVlOnR9KSxpIT09ZSYmdGhpcy5fYWN0aXZlQ2hhbmdlZC5lbWl0KHtvbGRWYWx1ZTppLG5ld1ZhbHVlOmV9KX0sdC5wcm90b3R5cGUuX2V2dEZvY3VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVzLmdldCh0LmN1cnJlbnRUYXJnZXQpO2UhPT10aGlzLl9jdXJyZW50V2lkZ2V0JiZ0aGlzLl9udW1iZXJzLnNldChlLHRoaXMuX2NvdW50ZXIrKyksdGhpcy5fc2V0V2lkZ2V0cyhlLGUpfSx0LnByb3RvdHlwZS5fZXZ0Qmx1cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2Rlcy5nZXQodC5jdXJyZW50VGFyZ2V0KSxuPXQucmVsYXRlZFRhcmdldDtuJiYoZS5ub2RlLmNvbnRhaW5zKG4pfHxpLmZpbmQodGhpcy5fd2lkZ2V0cyxmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlLmNvbnRhaW5zKG4pfSkpfHx0aGlzLl9zZXRXaWRnZXRzKHRoaXMuX2N1cnJlbnRXaWRnZXQsbnVsbCl9LHQucHJvdG90eXBlLl9vbldpZGdldERpc3Bvc2VkPWZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlKHQpfSx0fSgpO2UuRm9jdXNUcmFja2VyPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDUpLGM9bigzMCksaD1uKDQwKSxsPW4oMjIpLGQ9big3KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9kaXJ0eT0hMSxuLl9yb3dTcGFjaW5nPTQsbi5fY29sdW1uU3BhY2luZz00LG4uX2l0ZW1zPVtdLG4uX3Jvd1N0YXJ0cz1bXSxuLl9jb2x1bW5TdGFydHM9W10sbi5fcm93U2l6ZXJzPVtuZXcgaC5Cb3hTaXplcl0sbi5fY29sdW1uU2l6ZXJzPVtuZXcgaC5Cb3hTaXplcl0sbi5fYm94PW51bGwsdm9pZCAwIT09ZS5yb3dDb3VudCYmby5yZWFsbG9jU2l6ZXJzKG4uX3Jvd1NpemVycyxlLnJvd0NvdW50KSx2b2lkIDAhPT1lLmNvbHVtbkNvdW50JiZvLnJlYWxsb2NTaXplcnMobi5fY29sdW1uU2l6ZXJzLGUuY29sdW1uQ291bnQpLHZvaWQgMCE9PWUucm93U3BhY2luZyYmKG4uX3Jvd1NwYWNpbmc9by5jbGFtcFZhbHVlKGUucm93U3BhY2luZykpLHZvaWQgMCE9PWUuY29sdW1uU3BhY2luZyYmKG4uX2NvbHVtblNwYWNpbmc9by5jbGFtcFZhbHVlKGUuY29sdW1uU3BhY2luZykpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3ZhciBlPXQud2lkZ2V0O3QuZGlzcG9zZSgpLGUuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fcm93U3RhcnRzLmxlbmd0aD0wLHRoaXMuX3Jvd1NpemVycy5sZW5ndGg9MCx0aGlzLl9jb2x1bW5TdGFydHMubGVuZ3RoPTAsdGhpcy5fY29sdW1uU2l6ZXJzLmxlbmd0aD0wLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJyb3dDb3VudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3dTaXplcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMucm93Q291bnQmJihvLnJlYWxsb2NTaXplcnModGhpcy5fcm93U2l6ZXJzLHQpLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2x1bW5Db3VudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2x1bW5TaXplcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMuY29sdW1uQ291bnQmJihvLnJlYWxsb2NTaXplcnModGhpcy5fY29sdW1uU2l6ZXJzLHQpLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJyb3dTcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvd1NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBWYWx1ZSh0KSx0aGlzLl9yb3dTcGFjaW5nIT09dCYmKHRoaXMuX3Jvd1NwYWNpbmc9dCx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZml0KCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY29sdW1uU3BhY2luZyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2x1bW5TcGFjaW5nfSxzZXQ6ZnVuY3Rpb24odCl7dD1vLmNsYW1wVmFsdWUodCksdGhpcy5fY29sdW1uU3BhY2luZyE9PXQmJih0aGlzLl9jb2x1bW5TcGFjaW5nPXQsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpdCgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yb3dTdHJldGNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Jvd1NpemVyc1t0XTtyZXR1cm4gZT9lLnN0cmV0Y2g6LTF9LGUucHJvdG90eXBlLnNldFJvd1N0cmV0Y2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9yb3dTaXplcnNbdF07biYmKGU9by5jbGFtcFZhbHVlKGUpLG4uc3RyZXRjaCE9PWUmJihuLnN0cmV0Y2g9ZSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCkpKX0sZS5wcm90b3R5cGUuY29sdW1uU3RyZXRjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb2x1bW5TaXplcnNbdF07cmV0dXJuIGU/ZS5zdHJldGNoOi0xfSxlLnByb3RvdHlwZS5zZXRDb2x1bW5TdHJldGNoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY29sdW1uU2l6ZXJzW3RdO24mJihlPW8uY2xhbXBWYWx1ZShlKSxuLnN0cmV0Y2ghPT1lJiYobi5zdHJldGNoPWUsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnVwZGF0ZSgpKSl9LGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcy5tYXAodGhpcy5faXRlbXMsZnVuY3Rpb24odCl7cmV0dXJuIHQud2lkZ2V0fSl9LGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbih0KXstMT09PXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5faXRlbXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUud2lkZ2V0PT09dH0pJiYodGhpcy5faXRlbXMucHVzaChuZXcgbC5MYXlvdXRJdGVtKHQpKSx0aGlzLnBhcmVudCYmdGhpcy5hdHRhY2hXaWRnZXQodCkpfSxlLnByb3RvdHlwZS5yZW1vdmVXaWRnZXQ9ZnVuY3Rpb24odCl7dmFyIGU9cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleCh0aGlzLl9pdGVtcyxmdW5jdGlvbihlKXtyZXR1cm4gZS53aWRnZXQ9PT10fSk7aWYoLTE9PT1lKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLGUpO3RoaXMucGFyZW50JiZ0aGlzLmRldGFjaFdpZGdldCh0KSxuLmRpc3Bvc2UoKX19LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKSxzLmVhY2godGhpcyxmdW5jdGlvbih0KXtlLmF0dGFjaFdpZGdldCh0KX0pfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGQuV2lkZ2V0Lk1zZy5CZWZvcmVBdHRhY2gpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsZC5XaWRnZXQuTXNnLkFmdGVyQXR0YWNoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUuZGV0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCxkLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKHQubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGQuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLG49dGhpcy5yb3dDb3VudDt0PG47Kyt0KXRoaXMuX3Jvd1NpemVyc1t0XS5taW5TaXplPTA7Zm9yKHQ9MCxuPXRoaXMuY29sdW1uQ291bnQ7dDxuOysrdCl0aGlzLl9jb2x1bW5TaXplcnNbdF0ubWluU2l6ZT0wO3ZhciBpPXRoaXMuX2l0ZW1zLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5pc0hpZGRlbn0pO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KWlbdF0uZml0KCk7dmFyIHI9dGhpcy5yb3dDb3VudC0xLHM9dGhpcy5jb2x1bW5Db3VudC0xO2kuc29ydChvLnJvd1NwYW5DbXApO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KXt2YXIgYz1pW3RdLGg9ZS5nZXRDZWxsQ29uZmlnKGMud2lkZ2V0KSxsPU1hdGgubWluKGgucm93LHIpLGY9TWF0aC5taW4oaC5yb3craC5yb3dTcGFuLTEscik7by5kaXN0cmlidXRlTWluKHRoaXMuX3Jvd1NpemVycyxsLGYsYy5taW5IZWlnaHQpfWkuc29ydChvLmNvbHVtblNwYW5DbXApO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KXtjPWlbdF0saD1lLmdldENlbGxDb25maWcoYy53aWRnZXQpO3ZhciBwPU1hdGgubWluKGguY29sdW1uLHMpLG09TWF0aC5taW4oaC5jb2x1bW4raC5jb2x1bW5TcGFuLTEscyk7by5kaXN0cmlidXRlTWluKHRoaXMuX2NvbHVtblNpemVycyxwLG0sYy5taW5XaWR0aCl9aWYoInNldC1uby1jb25zdHJhaW50IiE9PXRoaXMuZml0UG9saWN5KXt2YXIgZz1yKnRoaXMuX3Jvd1NwYWNpbmcsdj1zKnRoaXMuX2NvbHVtblNwYWNpbmc7Zm9yKHQ9MCxuPXRoaXMucm93Q291bnQ7dDxuOysrdClnKz10aGlzLl9yb3dTaXplcnNbdF0ubWluU2l6ZTtmb3IodD0wLG49dGhpcy5jb2x1bW5Db3VudDt0PG47Kyt0KXYrPXRoaXMuX2NvbHVtblNpemVyc1t0XS5taW5TaXplO3ZhciBiPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3YrPWIuaG9yaXpvbnRhbFN1bSxnKz1iLnZlcnRpY2FsU3VtO3ZhciB5PXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7eS5taW5XaWR0aD12KyJweCIseS5taW5IZWlnaHQ9ZysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGQuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX1lbHNlIHUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5wYXJlbnQsZC5XaWRnZXQuTXNnLlVwZGF0ZVJlcXVlc3QpfSxlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQsbil7dGhpcy5fZGlydHk9ITEsdDwwJiYodD10aGlzLnBhcmVudC5ub2RlLm9mZnNldFdpZHRoKSxuPDAmJihuPXRoaXMucGFyZW50Lm5vZGUub2Zmc2V0SGVpZ2h0KSx0aGlzLl9ib3h8fCh0aGlzLl9ib3g9YS5FbGVtZW50RXh0LmJveFNpemluZyh0aGlzLnBhcmVudC5ub2RlKSk7dmFyIGk9dGhpcy5fYm94LnBhZGRpbmdUb3Ascj10aGlzLl9ib3gucGFkZGluZ0xlZnQsbz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLHM9bi10aGlzLl9ib3gudmVydGljYWxTdW0sdT10aGlzLnJvd0NvdW50LTEsYz10aGlzLmNvbHVtbkNvdW50LTEsbD11KnRoaXMuX3Jvd1NwYWNpbmcsZD1jKnRoaXMuX2NvbHVtblNwYWNpbmc7aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9yb3dTaXplcnMsTWF0aC5tYXgoMCxzLWwpKSxoLkJveEVuZ2luZS5jYWxjKHRoaXMuX2NvbHVtblNpemVycyxNYXRoLm1heCgwLG8tZCkpO2Zvcih2YXIgZj0wLHA9aSxtPXRoaXMucm93Q291bnQ7ZjxtOysrZil0aGlzLl9yb3dTdGFydHNbZl09cCxwKz10aGlzLl9yb3dTaXplcnNbZl0uc2l6ZSt0aGlzLl9yb3dTcGFjaW5nO2ZvcihmPTAscD1yLG09dGhpcy5jb2x1bW5Db3VudDtmPG07KytmKXRoaXMuX2NvbHVtblN0YXJ0c1tmXT1wLHArPXRoaXMuX2NvbHVtblNpemVyc1tmXS5zaXplK3RoaXMuX2NvbHVtblNwYWNpbmc7Zm9yKGY9MCxtPXRoaXMuX2l0ZW1zLmxlbmd0aDtmPG07KytmKXt2YXIgZz10aGlzLl9pdGVtc1tmXTtpZighZy5pc0hpZGRlbil7dmFyIHY9ZS5nZXRDZWxsQ29uZmlnKGcud2lkZ2V0KSxiPU1hdGgubWluKHYucm93LHUpLHk9TWF0aC5taW4odi5jb2x1bW4sYyksXz1NYXRoLm1pbih2LnJvdyt2LnJvd1NwYW4tMSx1KSx3PU1hdGgubWluKHYuY29sdW1uK3YuY29sdW1uU3Bhbi0xLGMpLHg9dGhpcy5fY29sdW1uU3RhcnRzW3ldLE09dGhpcy5fcm93U3RhcnRzW2JdLFM9dGhpcy5fY29sdW1uU3RhcnRzW3ddK3RoaXMuX2NvbHVtblNpemVyc1t3XS5zaXplLXgsRT10aGlzLl9yb3dTdGFydHNbX10rdGhpcy5fcm93U2l6ZXJzW19dLnNpemUtTTtnLnVwZGF0ZSh4LE0sUyxFKX19fSxlfShsLkxheW91dCk7ZS5HcmlkTGF5b3V0PWYsZnVuY3Rpb24odCl7dC5nZXRDZWxsQ29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNlbGxDb25maWdQcm9wZXJ0eS5nZXQodCl9LHQuc2V0Q2VsbENvbmZpZz1mdW5jdGlvbih0LGUpe28uY2VsbENvbmZpZ1Byb3BlcnR5LnNldCh0LG8ubm9ybWFsaXplQ29uZmlnKGUpKX19KGY9ZS5HcmlkTGF5b3V0fHwoZS5HcmlkTGF5b3V0PXt9KSksZS5HcmlkTGF5b3V0PWYsZnVuY3Rpb24odCl7dC5jZWxsQ29uZmlnUHJvcGVydHk9bmV3IGMuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToiY2VsbENvbmZpZyIsY3JlYXRlOmZ1bmN0aW9uKCl7cmV0dXJue3JvdzowLGNvbHVtbjowLHJvd1NwYW46MSxjb2x1bW5TcGFuOjF9fSxjaGFuZ2VkOmZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5sYXlvdXQgaW5zdGFuY2VvZiBmJiZ0LnBhcmVudC5maXQoKX19KSx0Lm5vcm1hbGl6ZUNvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm57cm93Ok1hdGgubWF4KDAsTWF0aC5mbG9vcih0LnJvd3x8MCkpLGNvbHVtbjpNYXRoLm1heCgwLE1hdGguZmxvb3IodC5jb2x1bW58fDApKSxyb3dTcGFuOk1hdGgubWF4KDEsTWF0aC5mbG9vcih0LnJvd1NwYW58fDApKSxjb2x1bW5TcGFuOk1hdGgubWF4KDEsTWF0aC5mbG9vcih0LmNvbHVtblNwYW58fDApKX19LHQuY2xhbXBWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKHQpKX0sdC5yb3dTcGFuQ21wPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5jZWxsQ29uZmlnUHJvcGVydHkuZ2V0KGUud2lkZ2V0KSxyPXQuY2VsbENvbmZpZ1Byb3BlcnR5LmdldChuLndpZGdldCk7cmV0dXJuIGkucm93U3Bhbi1yLnJvd1NwYW59LHQuY29sdW1uU3BhbkNtcD1mdW5jdGlvbihlLG4pe3ZhciBpPXQuY2VsbENvbmZpZ1Byb3BlcnR5LmdldChlLndpZGdldCkscj10LmNlbGxDb25maWdQcm9wZXJ0eS5nZXQobi53aWRnZXQpO3JldHVybiBpLmNvbHVtblNwYW4tci5jb2x1bW5TcGFufSx0LnJlYWxsb2NTaXplcnM9ZnVuY3Rpb24odCxlKXtmb3IoZT1NYXRoLm1heCgxLE1hdGguZmxvb3IoZSkpO3QubGVuZ3RoPGU7KXQucHVzaChuZXcgaC5Cb3hTaXplcik7dC5sZW5ndGg8ZSYmKHQubGVuZ3RoPWUpfSx0LmRpc3RyaWJ1dGVNaW49ZnVuY3Rpb24odCxlLG4saSl7aWYoIShuPGUpKWlmKGUhPT1uKXtmb3IodmFyIHI9MCxvPWU7bzw9bjsrK28pcis9dFtvXS5taW5TaXplO2lmKCEocj49aSkpe3ZhciBzPShpLXIpLyhuLWUrMSk7Zm9yKG89ZTtvPD1uOysrbyl0W29dLm1pblNpemUrPXN9fWVsc2V7dmFyIGE9dFtlXTthLm1pblNpemU9TWF0aC5tYXgoYS5taW5TaXplLGkpfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDc5KSxjPW4oNSksaD1uKDU1KSxsPW4oNyksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgaT10LmNhbGwodGhpcyx7bm9kZTpvLmNyZWF0ZU5vZGUoKX0pfHx0aGlzO3JldHVybiBpLl9hY3RpdmVJbmRleD0tMSxpLl9tZW51cz1bXSxpLl9jaGlsZE1lbnU9bnVsbCxpLmFkZENsYXNzKCJwLU1lbnVCYXIiKSxpLnNldEZsYWcobC5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCksdGhpcy5fbWVudXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImNoaWxkTWVudSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZE1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1NZW51QmFyLWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFjdGl2ZU1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVudXNbdGhpcy5fYWN0aXZlSW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmVJbmRleD10P3RoaXMuX21lbnVzLmluZGV4T2YodCk6LTF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhY3RpdmVJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVJbmRleH0sc2V0OmZ1bmN0aW9uKHQpeyh0PDB8fHQ+PXRoaXMuX21lbnVzLmxlbmd0aCkmJih0PS0xKSx0aGlzLl9hY3RpdmVJbmRleCE9PXQmJih0aGlzLl9hY3RpdmVJbmRleD10LHRoaXMudXBkYXRlKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibWVudXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVudXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUub3BlbkFjdGl2ZU1lbnU9ZnVuY3Rpb24oKXstMSE9PXRoaXMuX2FjdGl2ZUluZGV4JiYodGhpcy5fb3BlbkNoaWxkTWVudSgpLHRoaXMuX2NoaWxkTWVudSYmKHRoaXMuX2NoaWxkTWVudS5hY3RpdmVJbmRleD0tMSx0aGlzLl9jaGlsZE1lbnUuYWN0aXZhdGVOZXh0SXRlbSgpKSl9LGUucHJvdG90eXBlLmFkZE1lbnU9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRNZW51KHRoaXMuX21lbnVzLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0TWVudT1mdW5jdGlvbih0LGUpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCk7dmFyIG49dGhpcy5fbWVudXMuaW5kZXhPZihlKSxpPU1hdGgubWF4KDAsTWF0aC5taW4odCx0aGlzLl9tZW51cy5sZW5ndGgpKTtpZigtMT09PW4pcmV0dXJuIHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX21lbnVzLGksZSksZS5hZGRDbGFzcygicC1NZW51QmFyLW1lbnUiKSxlLmFib3V0VG9DbG9zZS5jb25uZWN0KHRoaXMuX29uTWVudUFib3V0VG9DbG9zZSx0aGlzKSxlLm1lbnVSZXF1ZXN0ZWQuY29ubmVjdCh0aGlzLl9vbk1lbnVNZW51UmVxdWVzdGVkLHRoaXMpLGUudGl0bGUuY2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLHZvaWQgdGhpcy51cGRhdGUoKTtpPT09dGhpcy5fbWVudXMubGVuZ3RoJiZpLS0sbiE9PWkmJihzLkFycmF5RXh0Lm1vdmUodGhpcy5fbWVudXMsbixpKSx0aGlzLnVwZGF0ZSgpKX0sZS5wcm90b3R5cGUucmVtb3ZlTWVudT1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZU1lbnVBdCh0aGlzLl9tZW51cy5pbmRleE9mKHQpKX0sZS5wcm90b3R5cGUucmVtb3ZlTWVudUF0PWZ1bmN0aW9uKHQpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCk7dmFyIGU9cy5BcnJheUV4dC5yZW1vdmVBdCh0aGlzLl9tZW51cyx0KTtlJiYoZS5hYm91dFRvQ2xvc2UuZGlzY29ubmVjdCh0aGlzLl9vbk1lbnVBYm91dFRvQ2xvc2UsdGhpcyksZS5tZW51UmVxdWVzdGVkLmRpc2Nvbm5lY3QodGhpcy5fb25NZW51TWVudVJlcXVlc3RlZCx0aGlzKSxlLnRpdGxlLmNoYW5nZWQuZGlzY29ubmVjdCh0aGlzLl9vblRpdGxlQ2hhbmdlZCx0aGlzKSxlLnJlbW92ZUNsYXNzKCJwLU1lbnVCYXItbWVudSIpLHRoaXMudXBkYXRlKCkpfSxlLnByb3RvdHlwZS5jbGVhck1lbnVzPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuX21lbnVzLmxlbmd0aCl7dGhpcy5fY2xvc2VDaGlsZE1lbnUoKTtmb3IodmFyIHQ9MCxlPXRoaXMuX21lbnVzO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO24uYWJvdXRUb0Nsb3NlLmRpc2Nvbm5lY3QodGhpcy5fb25NZW51QWJvdXRUb0Nsb3NlLHRoaXMpLG4ubWVudVJlcXVlc3RlZC5kaXNjb25uZWN0KHRoaXMuX29uTWVudU1lbnVSZXF1ZXN0ZWQsdGhpcyksbi50aXRsZS5jaGFuZ2VkLmRpc2Nvbm5lY3QodGhpcy5fb25UaXRsZUNoYW5nZWQsdGhpcyksbi5yZW1vdmVDbGFzcygicC1NZW51QmFyLW1lbnUiKX10aGlzLl9tZW51cy5sZW5ndGg9MCx0aGlzLnVwZGF0ZSgpfX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNlbGVhdmUiOnRoaXMuX2V2dE1vdXNlTGVhdmUodCk7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMpLHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9LGUucHJvdG90eXBlLm9uQWN0aXZhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5ub2RlLmZvY3VzKCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fbWVudXMsbj10aGlzLnJlbmRlcmVyLGk9dGhpcy5fYWN0aXZlSW5kZXgscj1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MCxzPWUubGVuZ3RoO288czsrK28pe3ZhciBhPWVbb10udGl0bGUsdT1vPT09aTtyW29dPW4ucmVuZGVySXRlbSh7dGl0bGU6YSxhY3RpdmU6dX0pfWguVmlydHVhbERPTS5yZW5kZXIocix0aGlzLmNvbnRlbnROb2RlKX0sZS5wcm90b3R5cGUuX2V2dEtleURvd249ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dC5rZXlDb2RlO2lmKDEzIT09ZSYmMzghPT1lJiY0MCE9PWUpe2lmKDI3PT09ZSlyZXR1cm4gdGhpcy5fY2xvc2VDaGlsZE1lbnUoKSx0aGlzLmFjdGl2ZUluZGV4PS0xLHZvaWQgdGhpcy5ub2RlLmJsdXIoKTtpZigzNyE9PWUpaWYoMzkhPT1lKXt2YXIgbj11LmdldEtleWJvYXJkTGF5b3V0KCkua2V5Rm9yS2V5ZG93bkV2ZW50KHQpO2lmKG4pe3ZhciBpPXRoaXMuX2FjdGl2ZUluZGV4KzEscj1vLmZpbmRNbmVtb25pYyh0aGlzLl9tZW51cyxuLGkpOy0xPT09ci5pbmRleHx8ci5tdWx0aXBsZT8tMSE9PXIuaW5kZXg/dGhpcy5hY3RpdmVJbmRleD1yLmluZGV4Oi0xIT09ci5hdXRvJiYodGhpcy5hY3RpdmVJbmRleD1yLmF1dG8pOih0aGlzLmFjdGl2ZUluZGV4PXIuaW5kZXgsdGhpcy5vcGVuQWN0aXZlTWVudSgpKX19ZWxzZXtzPXRoaXMuX2FjdGl2ZUluZGV4LGE9dGhpcy5fbWVudXMubGVuZ3RoO3RoaXMuYWN0aXZlSW5kZXg9cz09PWEtMT8wOnMrMX1lbHNle3ZhciBzPXRoaXMuX2FjdGl2ZUluZGV4LGE9dGhpcy5fbWVudXMubGVuZ3RoO3RoaXMuYWN0aXZlSW5kZXg9MD09PXM/YS0xOnMtMX19ZWxzZSB0aGlzLm9wZW5BY3RpdmVNZW51KCl9LGUucHJvdG90eXBlLl9ldnRNb3VzZURvd249ZnVuY3Rpb24odCl7aWYoYS5FbGVtZW50RXh0LmhpdFRlc3QodGhpcy5ub2RlLHQuY2xpZW50WCx0LmNsaWVudFkpKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3ZhciBlPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pOy0xIT09ZT8wPT09dC5idXR0b24mJih0aGlzLl9jaGlsZE1lbnU/KHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCksdGhpcy5hY3RpdmVJbmRleD1lKToodGhpcy5hY3RpdmVJbmRleD1lLHRoaXMuX29wZW5DaGlsZE1lbnUoKSkpOnRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pO2UhPT10aGlzLl9hY3RpdmVJbmRleCYmKC0xPT09ZSYmdGhpcy5fY2hpbGRNZW51fHwodGhpcy5hY3RpdmVJbmRleD1lLHRoaXMuX2NoaWxkTWVudSYmdGhpcy5fb3BlbkNoaWxkTWVudSgpKSl9LGUucHJvdG90eXBlLl9ldnRNb3VzZUxlYXZlPWZ1bmN0aW9uKHQpe3RoaXMuX2NoaWxkTWVudXx8KHRoaXMuYWN0aXZlSW5kZXg9LTEpfSxlLnByb3RvdHlwZS5fb3BlbkNoaWxkTWVudT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWN0aXZlTWVudTtpZih0KXt2YXIgZT10aGlzLl9jaGlsZE1lbnU7aWYoZSE9PXQpe3RoaXMuX2NoaWxkTWVudT10LGU/ZS5jbG9zZSgpOih0aGlzLmFkZENsYXNzKCJwLW1vZC1hY3RpdmUiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApKSxjLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMsbC5XaWRnZXQuTXNnLlVwZGF0ZVJlcXVlc3QpO3ZhciBuPXRoaXMuY29udGVudE5vZGUuY2hpbGRyZW5bdGhpcy5fYWN0aXZlSW5kZXhdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bi5sZWZ0LHI9bi5ib3R0b207dC5vcGVuKGkscix7Zm9yY2VYOiEwLGZvcmNlWTohMH0pfX1lbHNlIHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9LGUucHJvdG90eXBlLl9jbG9zZUNoaWxkTWVudT1mdW5jdGlvbigpe2lmKHRoaXMuX2NoaWxkTWVudSl7dGhpcy5yZW1vdmVDbGFzcygicC1tb2QtYWN0aXZlIiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLCEwKTt2YXIgdD10aGlzLl9jaGlsZE1lbnU7dGhpcy5fY2hpbGRNZW51PW51bGwsdC5jbG9zZSgpLHRoaXMuYWN0aXZlSW5kZXg9LTF9fSxlLnByb3RvdHlwZS5fb25NZW51QWJvdXRUb0Nsb3NlPWZ1bmN0aW9uKHQpe3Q9PT10aGlzLl9jaGlsZE1lbnUmJih0aGlzLnJlbW92ZUNsYXNzKCJwLW1vZC1hY3RpdmUiKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApLHRoaXMuX2NoaWxkTWVudT1udWxsLHRoaXMuYWN0aXZlSW5kZXg9LTEpfSxlLnByb3RvdHlwZS5fb25NZW51TWVudVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2lmKHQ9PT10aGlzLl9jaGlsZE1lbnUpe3ZhciBuPXRoaXMuX2FjdGl2ZUluZGV4LGk9dGhpcy5fbWVudXMubGVuZ3RoO3N3aXRjaChlKXtjYXNlIm5leHQiOnRoaXMuYWN0aXZlSW5kZXg9bj09PWktMT8wOm4rMTticmVhaztjYXNlInByZXZpb3VzIjp0aGlzLmFjdGl2ZUluZGV4PTA9PT1uP2ktMTpuLTF9dGhpcy5vcGVuQWN0aXZlTWVudSgpfX0sZS5wcm90b3R5cGUuX29uVGl0bGVDaGFuZ2VkPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sZX0obC5XaWRnZXQpO2UuTWVudUJhcj1kLGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNyZWF0ZUl0ZW1DbGFzcyh0KSxuPXRoaXMuY3JlYXRlSXRlbURhdGFzZXQodCk7cmV0dXJuIGguaC5saSh7Y2xhc3NOYW1lOmUsZGF0YXNldDpufSx0aGlzLnJlbmRlckljb24odCksdGhpcy5yZW5kZXJMYWJlbCh0KSl9LHQucHJvdG90eXBlLnJlbmRlckljb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJY29uQ2xhc3ModCk7cmV0dXJuIGguaC5kaXYoe2NsYXNzTmFtZTplfSx0LnRpdGxlLmljb25MYWJlbCl9LHQucHJvdG90eXBlLnJlbmRlckxhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZm9ybWF0TGFiZWwodCk7cmV0dXJuIGguaC5kaXYoe2NsYXNzTmFtZToicC1NZW51QmFyLWl0ZW1MYWJlbCJ9LGUpfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtTWVudUJhci1pdGVtIjtyZXR1cm4gdC50aXRsZS5jbGFzc05hbWUmJihlKz0iICIrdC50aXRsZS5jbGFzc05hbWUpLHQuYWN0aXZlJiYoZSs9IiBwLW1vZC1hY3RpdmUiKSxlfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gdC50aXRsZS5kYXRhc2V0fSx0LnByb3RvdHlwZS5jcmVhdGVJY29uQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtTWVudUJhci1pdGVtSWNvbiIsbj10LnRpdGxlLmljb25DbGFzcztyZXR1cm4gbj9lKyIgIituOmV9LHQucHJvdG90eXBlLmZvcm1hdExhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGl0bGUsbj1lLmxhYmVsLGk9ZS5tbmVtb25pYztpZihpPDB8fGk+PW4ubGVuZ3RoKXJldHVybiBuO3ZhciByPW4uc2xpY2UoMCxpKSxvPW4uc2xpY2UoaSsxKSxzPW5baV07cmV0dXJuW3IsaC5oLnNwYW4oe2NsYXNzTmFtZToicC1NZW51QmFyLWl0ZW1NbmVtb25pYyJ9LHMpLG9dfSx0fSgpO3QuUmVuZGVyZXI9ZSx0LmRlZmF1bHRSZW5kZXJlcj1uZXcgZX0oZD1lLk1lbnVCYXJ8fChlLk1lbnVCYXI9e30pKSxlLk1lbnVCYXI9ZCxmdW5jdGlvbih0KXt0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJwLU1lbnVCYXItY29udGVudCIsdC5hcHBlbmRDaGlsZChlKSx0LnRhYkluZGV4PS0xLHR9LHQuZmluZE1uZW1vbmljPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9LTEscj0tMSxvPSExLHM9ZS50b1VwcGVyQ2FzZSgpLGE9MCx1PXQubGVuZ3RoO2E8dTsrK2Epe3ZhciBjPShhK24pJXUsaD10W2NdLnRpdGxlO2lmKDAhPT1oLmxhYmVsLmxlbmd0aCl7dmFyIGw9aC5tbmVtb25pYztsPj0wJiZsPGgubGFiZWwubGVuZ3RoP2gubGFiZWxbbF0udG9VcHBlckNhc2UoKT09PXMmJigtMT09PWk/aT1jOm89ITApOi0xPT09ciYmaC5sYWJlbFswXS50b1VwcGVyQ2FzZSgpPT09cyYmKHI9Yyl9fXJldHVybntpbmRleDppLG11bHRpcGxlOm8sYXV0bzpyfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9big5KSxhPW4oNTYpLHU9bigxMSksYz1uKDcpLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dC5jYWxsKHRoaXMse25vZGU6by5jcmVhdGVOb2RlKCl9KXx8dGhpcztyZXR1cm4gbi5fb25SZXBlYXQ9ZnVuY3Rpb24oKXtpZihuLl9yZXBlYXRUaW1lcj0tMSxuLl9wcmVzc0RhdGEpe3ZhciB0PW4uX3ByZXNzRGF0YS5wYXJ0O2lmKCJ0aHVtYiIhPT10KXtuLl9yZXBlYXRUaW1lcj1zZXRUaW1lb3V0KG4uX29uUmVwZWF0LDIwKTt2YXIgZT1uLl9wcmVzc0RhdGEubW91c2VYLGk9bi5fcHJlc3NEYXRhLm1vdXNlWTtpZigiZGVjcmVtZW50IiE9PXQpaWYoImluY3JlbWVudCIhPT10KXtpZigidHJhY2siPT09dCl7aWYoIXMuRWxlbWVudEV4dC5oaXRUZXN0KG4udHJhY2tOb2RlLGUsaSkpcmV0dXJuO3ZhciByPW4udGh1bWJOb2RlO2lmKHMuRWxlbWVudEV4dC5oaXRUZXN0KHIsZSxpKSlyZXR1cm47dmFyIG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXZvaWQgMDtyZXR1cm4gYT0iaG9yaXpvbnRhbCI9PT1uLl9vcmllbnRhdGlvbj9lPG8ubGVmdD8iZGVjcmVtZW50IjoiaW5jcmVtZW50IjppPG8udG9wPyJkZWNyZW1lbnQiOiJpbmNyZW1lbnQiLHZvaWQgbi5fcGFnZVJlcXVlc3RlZC5lbWl0KGEpfX1lbHNle2lmKCFzLkVsZW1lbnRFeHQuaGl0VGVzdChuLmluY3JlbWVudE5vZGUsZSxpKSlyZXR1cm47bi5fc3RlcFJlcXVlc3RlZC5lbWl0KCJpbmNyZW1lbnQiKX1lbHNle2lmKCFzLkVsZW1lbnRFeHQuaGl0VGVzdChuLmRlY3JlbWVudE5vZGUsZSxpKSlyZXR1cm47bi5fc3RlcFJlcXVlc3RlZC5lbWl0KCJkZWNyZW1lbnQiKX19fX0sbi5fdmFsdWU9MCxuLl9wYWdlPTEwLG4uX21heGltdW09MTAwLG4uX3JlcGVhdFRpbWVyPS0xLG4uX3ByZXNzRGF0YT1udWxsLG4uX3RodW1iTW92ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uX3N0ZXBSZXF1ZXN0ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uX3BhZ2VSZXF1ZXN0ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtU2Nyb2xsQmFyIiksbi5zZXRGbGFnKGMuV2lkZ2V0LkZsYWcuRGlzYWxsb3dMYXlvdXQpLG4uX29yaWVudGF0aW9uPWUub3JpZW50YXRpb258fCJ2ZXJ0aWNhbCIsbi5kYXRhc2V0Lm9yaWVudGF0aW9uPW4uX29yaWVudGF0aW9uLHZvaWQgMCE9PWUubWF4aW11bSYmKG4uX21heGltdW09TWF0aC5tYXgoMCxlLm1heGltdW0pKSx2b2lkIDAhPT1lLnBhZ2UmJihuLl9wYWdlPU1hdGgubWF4KDAsZS5wYWdlKSksdm9pZCAwIT09ZS52YWx1ZSYmKG4uX3ZhbHVlPU1hdGgubWF4KDAsTWF0aC5taW4oZS52YWx1ZSxuLl9tYXhpbXVtKSkpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRodW1iTW92ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGh1bWJNb3ZlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInN0ZXBSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcFJlcXVlc3RlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInBhZ2VSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZVJlcXVlc3RlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fb3JpZW50YXRpb249dCx0aGlzLmRhdGFzZXQub3JpZW50YXRpb249dCx0aGlzLnVwZGF0ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInZhbHVlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dD1NYXRoLm1heCgwLE1hdGgubWluKHQsdGhpcy5fbWF4aW11bSkpLHRoaXMuX3ZhbHVlIT09dCYmKHRoaXMuX3ZhbHVlPXQsdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2V9LHNldDpmdW5jdGlvbih0KXt0PU1hdGgubWF4KDAsdCksdGhpcy5fcGFnZSE9PXQmJih0aGlzLl9wYWdlPXQsdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtYXhpbXVtIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW19LHNldDpmdW5jdGlvbih0KXt0PU1hdGgubWF4KDAsdCksdGhpcy5fbWF4aW11bSE9PXQmJih0aGlzLl9tYXhpbXVtPXQsdGhpcy5fdmFsdWU9TWF0aC5taW4odGhpcy5fdmFsdWUsdCksdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJkZWNyZW1lbnROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci1idXR0b24iKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImluY3JlbWVudE5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInAtU2Nyb2xsQmFyLWJ1dHRvbiIpWzFdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidHJhY2tOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci10cmFjayIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGh1bWJOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci10aHVtYiIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNldXAiOnRoaXMuX2V2dE1vdXNlVXAodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPTEwMCp0aGlzLl92YWx1ZS90aGlzLl9tYXhpbXVtLG49MTAwKnRoaXMuX3BhZ2UvKHRoaXMuX3BhZ2UrdGhpcy5fbWF4aW11bSk7ZT1NYXRoLm1heCgwLE1hdGgubWluKGUsMTAwKSksbj1NYXRoLm1heCgwLE1hdGgubWluKG4sMTAwKSk7dmFyIGk9dGhpcy50aHVtYk5vZGUuc3R5bGU7Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/KGkudG9wPSIiLGkuaGVpZ2h0PSIiLGkubGVmdD1lKyIlIixpLndpZHRoPW4rIiUiLGkudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIistZSsiJSwgMCUpIik6KGkubGVmdD0iIixpLndpZHRoPSIiLGkudG9wPWUrIiUiLGkuaGVpZ2h0PW4rIiUiLGkudHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCUsICIrLWUrIiUpIil9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe2lmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlKXt2YXIgZT10aGlzLl9wcmVzc0RhdGE/dGhpcy5fcHJlc3NEYXRhLnZhbHVlOi0xO3RoaXMuX3JlbGVhc2VNb3VzZSgpLC0xIT09ZSYmdGhpcy5fbW92ZVRodW1iKGUpfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24mJiF0aGlzLl9wcmVzc0RhdGEpe3ZhciBlPW8uZmluZFBhcnQodGhpcyx0LnRhcmdldCk7aWYoZSl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIG49YS5EcmFnLm92ZXJyaWRlQ3Vyc29yKCJkZWZhdWx0Iik7aWYodGhpcy5fcHJlc3NEYXRhPXtwYXJ0OmUsb3ZlcnJpZGU6bixkZWx0YTotMSx2YWx1ZTotMSxtb3VzZVg6dC5jbGllbnRYLG1vdXNlWTp0LmNsaWVudFl9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLCJ0aHVtYiI9PT1lKXt2YXIgaT10aGlzLnRodW1iTm9kZSxyPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/dGhpcy5fcHJlc3NEYXRhLmRlbHRhPXQuY2xpZW50WC1yLmxlZnQ6dGhpcy5fcHJlc3NEYXRhLmRlbHRhPXQuY2xpZW50WS1yLnRvcCxpLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHZvaWQodGhpcy5fcHJlc3NEYXRhLnZhbHVlPXRoaXMuX3ZhbHVlKX1pZigidHJhY2siPT09ZSl7cj10aGlzLnRodW1iTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgcz12b2lkIDA7cmV0dXJuIHM9Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/dC5jbGllbnRYPHIubGVmdD8iZGVjcmVtZW50IjoiaW5jcmVtZW50Ijp0LmNsaWVudFk8ci50b3A/ImRlY3JlbWVudCI6ImluY3JlbWVudCIsdGhpcy5fcmVwZWF0VGltZXI9c2V0VGltZW91dCh0aGlzLl9vblJlcGVhdCwzNTApLHZvaWQgdGhpcy5fcGFnZVJlcXVlc3RlZC5lbWl0KHMpfXJldHVybiJkZWNyZW1lbnQiPT09ZT8odGhpcy5kZWNyZW1lbnROb2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHRoaXMuX3JlcGVhdFRpbWVyPXNldFRpbWVvdXQodGhpcy5fb25SZXBlYXQsMzUwKSx2b2lkIHRoaXMuX3N0ZXBSZXF1ZXN0ZWQuZW1pdCgiZGVjcmVtZW50IikpOiJpbmNyZW1lbnQiPT09ZT8odGhpcy5pbmNyZW1lbnROb2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHRoaXMuX3JlcGVhdFRpbWVyPXNldFRpbWVvdXQodGhpcy5fb25SZXBlYXQsMzUwKSx2b2lkIHRoaXMuX3N0ZXBSZXF1ZXN0ZWQuZW1pdCgiaW5jcmVtZW50IikpOnZvaWQgMH19fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3ByZXNzRGF0YSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3ByZXNzRGF0YS5tb3VzZVg9dC5jbGllbnRYLHRoaXMuX3ByZXNzRGF0YS5tb3VzZVk9dC5jbGllbnRZLCJ0aHVtYiI9PT10aGlzLl9wcmVzc0RhdGEucGFydCkpe3ZhciBlLG4saT10aGlzLnRodW1iTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXRoaXMudHJhY2tOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyJob3Jpem9udGFsIj09PXRoaXMuX29yaWVudGF0aW9uPyhlPXQuY2xpZW50WC1yLmxlZnQtdGhpcy5fcHJlc3NEYXRhLmRlbHRhLG49ci53aWR0aC1pLndpZHRoKTooZT10LmNsaWVudFktci50b3AtdGhpcy5fcHJlc3NEYXRhLmRlbHRhLG49ci5oZWlnaHQtaS5oZWlnaHQpO3ZhciBvPTA9PT1uPzA6ZSp0aGlzLl9tYXhpbXVtL247dGhpcy5fbW92ZVRodW1iKG8pfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7MD09PXQuYnV0dG9uJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fcmVsZWFzZU1vdXNlKCkpfSxlLnByb3RvdHlwZS5fcmVsZWFzZU1vdXNlPWZ1bmN0aW9uKCl7dGhpcy5fcHJlc3NEYXRhJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3JlcGVhdFRpbWVyKSx0aGlzLl9yZXBlYXRUaW1lcj0tMSx0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLHRoaXMudGh1bWJOb2RlLmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLWFjdGl2ZSIpLHRoaXMuZGVjcmVtZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1hY3RpdmUiKSx0aGlzLmluY3JlbWVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtYWN0aXZlIikpfSxlLnByb3RvdHlwZS5fbW92ZVRodW1iPWZ1bmN0aW9uKHQpe3Q9TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX21heGltdW0pKSx0aGlzLl92YWx1ZSE9PXQmJih0aGlzLl92YWx1ZT10LHRoaXMudXBkYXRlKCksdGhpcy5fdGh1bWJNb3ZlZC5lbWl0KHQpKX0sZX0oYy5XaWRnZXQpO2UuU2Nyb2xsQmFyPWgsZnVuY3Rpb24odCl7dC5jcmVhdGVOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLWJ1dHRvbiIsbi5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLWJ1dHRvbiIsZS5kYXRhc2V0LmFjdGlvbj0iZGVjcmVtZW50IixuLmRhdGFzZXQuYWN0aW9uPSJpbmNyZW1lbnQiLGkuY2xhc3NOYW1lPSJwLVNjcm9sbEJhci10cmFjayIsci5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLXRodW1iIixpLmFwcGVuZENoaWxkKHIpLHQuYXBwZW5kQ2hpbGQoZSksdC5hcHBlbmRDaGlsZChpKSx0LmFwcGVuZENoaWxkKG4pLHR9LHQuZmluZFBhcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aHVtYk5vZGUuY29udGFpbnMoZSk/InRodW1iIjp0LnRyYWNrTm9kZS5jb250YWlucyhlKT8idHJhY2siOnQuZGVjcmVtZW50Tm9kZS5jb250YWlucyhlKT8iZGVjcmVtZW50Ijp0LmluY3JlbWVudE5vZGUuY29udGFpbnMoZSk/ImluY3JlbWVudCI6bnVsbH19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMikscz1uKDUpLGE9bigyMiksdT1uKDcpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fd2lkZ2V0PW51bGwsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl93aWRnZXQpe3ZhciBlPXRoaXMuX3dpZGdldDt0aGlzLl93aWRnZXQ9bnVsbCxlLmRpc3Bvc2UoKX10LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZGdldH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3dpZGdldCE9PXQmJih0aGlzLl93aWRnZXQmJnRoaXMuX3dpZGdldC5kaXNwb3NlKCksdGhpcy5fd2lkZ2V0PXQsdGhpcy5wYXJlbnQmJnQmJnRoaXMuYXR0YWNoV2lkZ2V0KHQpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZGdldD9vLm9uY2UodGhpcy5fd2lkZ2V0KTpvLmVtcHR5KCl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLl93aWRnZXQ9PT10JiYodGhpcy5fd2lkZ2V0PW51bGwsdGhpcy5wYXJlbnQmJnRoaXMuZGV0YWNoV2lkZ2V0KHQpKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpLG8uZWFjaCh0aGlzLGZ1bmN0aW9uKHQpe2UuYXR0YWNoV2lkZ2V0KHQpfSl9LGUucHJvdG90eXBlLmF0dGFjaFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0Lm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCx1LldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LHUuV2lkZ2V0Lk1zZy5CZWZvcmVEZXRhY2gpLHRoaXMucGFyZW50Lm5vZGUucmVtb3ZlQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKX0sZX0oYS5MYXlvdXQpO2UuU2luZ2xldG9uTGF5b3V0PWN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oNTYpLHU9big1NCksYz1uKDEzMyksaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyx7bGF5b3V0Om8uY3JlYXRlTGF5b3V0KGUpfSl8fHRoaXM7cmV0dXJuIG4uX3ByZXNzRGF0YT1udWxsLG4uYWRkQ2xhc3MoInAtU3BsaXRQYW5lbCIpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0Lm9yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXQub3JpZW50YXRpb249dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5hbGlnbm1lbnQ9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNwYWNpbmc9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInJlbmRlcmVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnJlbmRlcmVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaGFuZGxlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5oYW5kbGVzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbGF0aXZlU2l6ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQucmVsYXRpdmVTaXplcygpfSxlLnByb3RvdHlwZS5zZXRSZWxhdGl2ZVNpemVzPWZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNldFJlbGF0aXZlU2l6ZXModCl9LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNldXAiOnRoaXMuX2V2dE1vdXNlVXAodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy5fcmVsZWFzZU1vdXNlKCl9LGUucHJvdG90eXBlLm9uQ2hpbGRBZGRlZD1mdW5jdGlvbih0KXt0LmNoaWxkLmFkZENsYXNzKCJwLVNwbGl0UGFuZWwtY2hpbGQiKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25DaGlsZFJlbW92ZWQ9ZnVuY3Rpb24odCl7dC5jaGlsZC5yZW1vdmVDbGFzcygicC1TcGxpdFBhbmVsLWNoaWxkIiksdGhpcy5fcmVsZWFzZU1vdXNlKCl9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiZ0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24pe3ZhciBlPXRoaXMubGF5b3V0LG49cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleChlLmhhbmRsZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFpbnModC50YXJnZXQpfSk7aWYoLTEhPT1uKXt2YXIgaTt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKTt2YXIgcj1lLmhhbmRsZXNbbl0sbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2k9Imhvcml6b250YWwiPT09ZS5vcmllbnRhdGlvbj90LmNsaWVudFgtby5sZWZ0OnQuY2xpZW50WS1vLnRvcDt2YXIgdT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKSxjPWEuRHJhZy5vdmVycmlkZUN1cnNvcih1LmN1cnNvcik7dGhpcy5fcHJlc3NEYXRhPXtpbmRleDpuLGRlbHRhOmksb3ZlcnJpZGU6Y319fX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTW92ZT1mdW5jdGlvbih0KXt2YXIgZTt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgbj10aGlzLmxheW91dCxpPXRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPSJob3Jpem9udGFsIj09PW4ub3JpZW50YXRpb24/dC5jbGllbnRYLWkubGVmdC10aGlzLl9wcmVzc0RhdGEuZGVsdGE6dC5jbGllbnRZLWkudG9wLXRoaXMuX3ByZXNzRGF0YS5kZWx0YSxuLm1vdmVIYW5kbGUodGhpcy5fcHJlc3NEYXRhLmluZGV4LGUpfSxlLnByb3RvdHlwZS5fZXZ0TW91c2VVcD1mdW5jdGlvbih0KXswPT09dC5idXR0b24mJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9yZWxlYXNlTW91c2UoKSl9LGUucHJvdG90eXBlLl9yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9wcmVzc0RhdGEmJih0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApKX0sZX0odS5QYW5lbCk7ZS5TcGxpdFBhbmVsPWgsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9InAtU3BsaXRQYW5lbC1oYW5kbGUiLHR9LHR9KCk7dC5SZW5kZXJlcj1lLHQuZGVmYXVsdFJlbmRlcmVyPW5ldyBlLHQuZ2V0U3RyZXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gYy5TcGxpdExheW91dC5nZXRTdHJldGNoKHQpfSx0LnNldFN0cmV0Y2g9ZnVuY3Rpb24odCxlKXtjLlNwbGl0TGF5b3V0LnNldFN0cmV0Y2godCxlKX19KGg9ZS5TcGxpdFBhbmVsfHwoZS5TcGxpdFBhbmVsPXt9KSksZS5TcGxpdFBhbmVsPWgsZnVuY3Rpb24odCl7dC5jcmVhdGVMYXlvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQubGF5b3V0fHxuZXcgYy5TcGxpdExheW91dCh7cmVuZGVyZXI6dC5yZW5kZXJlcnx8aC5kZWZhdWx0UmVuZGVyZXIsb3JpZW50YXRpb246dC5vcmllbnRhdGlvbixhbGlnbm1lbnQ6dC5hbGlnbm1lbnQsc3BhY2luZzp0LnNwYWNpbmd9KX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9big5KSxhPW4oNSksdT1uKDExKSxjPW4oNzYpLGg9bigxMzUpLGw9big4MCksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fY3VycmVudENoYW5nZWQ9bmV3IHUuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtVGFiUGFuZWwiKSxuLnRhYkJhcj1uZXcgbC5UYWJCYXIoZSksbi50YWJCYXIuYWRkQ2xhc3MoInAtVGFiUGFuZWwtdGFiQmFyIiksbi5zdGFja2VkUGFuZWw9bmV3IGguU3RhY2tlZFBhbmVsLG4uc3RhY2tlZFBhbmVsLmFkZENsYXNzKCJwLVRhYlBhbmVsLXN0YWNrZWRQYW5lbCIpLG4udGFiQmFyLnRhYk1vdmVkLmNvbm5lY3Qobi5fb25UYWJNb3ZlZCxuKSxuLnRhYkJhci5jdXJyZW50Q2hhbmdlZC5jb25uZWN0KG4uX29uQ3VycmVudENoYW5nZWQsbiksbi50YWJCYXIudGFiQ2xvc2VSZXF1ZXN0ZWQuY29ubmVjdChuLl9vblRhYkNsb3NlUmVxdWVzdGVkLG4pLG4udGFiQmFyLnRhYkFjdGl2YXRlUmVxdWVzdGVkLmNvbm5lY3Qobi5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZCxuKSxuLnN0YWNrZWRQYW5lbC53aWRnZXRSZW1vdmVkLmNvbm5lY3Qobi5fb25XaWRnZXRSZW1vdmVkLG4pLG4uX3RhYlBsYWNlbWVudD1lLnRhYlBsYWNlbWVudHx8InRvcCI7dmFyIGk9by5kaXJlY3Rpb25Gcm9tUGxhY2VtZW50KG4uX3RhYlBsYWNlbWVudCkscj1vLm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudChuLl90YWJQbGFjZW1lbnQpO24udGFiQmFyLm9yaWVudGF0aW9uPXIsbi50YWJCYXIuZGF0YXNldC5wbGFjZW1lbnQ9bi5fdGFiUGxhY2VtZW50O3ZhciBzPW5ldyBjLkJveExheW91dCh7ZGlyZWN0aW9uOmksc3BhY2luZzowfSk7cmV0dXJuIGMuQm94TGF5b3V0LnNldFN0cmV0Y2gobi50YWJCYXIsMCksYy5Cb3hMYXlvdXQuc2V0U3RyZXRjaChuLnN0YWNrZWRQYW5lbCwxKSxzLmFkZFdpZGdldChuLnRhYkJhcikscy5hZGRXaWRnZXQobi5zdGFja2VkUGFuZWwpLG4ubGF5b3V0PXMsbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJCYXIuY3VycmVudEluZGV4fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy50YWJCYXIuY3VycmVudEluZGV4PXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50V2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50YWJCYXIuY3VycmVudFRpdGxlO3JldHVybiB0P3Qub3duZXI6bnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLmN1cnJlbnRUaXRsZT10P3QudGl0bGU6bnVsbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYnNNb3ZhYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiQmFyLnRhYnNNb3ZhYmxlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy50YWJCYXIudGFic01vdmFibGU9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYlBsYWNlbWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90YWJQbGFjZW1lbnR9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl90YWJQbGFjZW1lbnQhPT10KXt0aGlzLl90YWJQbGFjZW1lbnQ9dDt2YXIgZT1vLmRpcmVjdGlvbkZyb21QbGFjZW1lbnQodCksbj1vLm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudCh0KTt0aGlzLnRhYkJhci5vcmllbnRhdGlvbj1uLHRoaXMudGFiQmFyLmRhdGFzZXQucGxhY2VtZW50PXQsdGhpcy5sYXlvdXQuZGlyZWN0aW9uPWV9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrZWRQYW5lbC53aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLmluc2VydFdpZGdldCh0aGlzLndpZGdldHMubGVuZ3RoLHQpfSxlLnByb3RvdHlwZS5pbnNlcnRXaWRnZXQ9ZnVuY3Rpb24odCxlKXtlIT09dGhpcy5jdXJyZW50V2lkZ2V0JiZlLmhpZGUoKSx0aGlzLnN0YWNrZWRQYW5lbC5pbnNlcnRXaWRnZXQodCxlKSx0aGlzLnRhYkJhci5pbnNlcnRUYWIodCxlLnRpdGxlKX0sZS5wcm90b3R5cGUuX29uQ3VycmVudENoYW5nZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnByZXZpb3VzSW5kZXgsaT1lLnByZXZpb3VzVGl0bGUscj1lLmN1cnJlbnRJbmRleCxvPWUuY3VycmVudFRpdGxlLHU9aT9pLm93bmVyOm51bGwsYz1vP28ub3duZXI6bnVsbDt1JiZ1LmhpZGUoKSxjJiZjLnNob3coKSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNXaWRnZXQ6dSxjdXJyZW50SW5kZXg6cixjdXJyZW50V2lkZ2V0OmN9KSwocy5QbGF0Zm9ybS5JU19FREdFfHxzLlBsYXRmb3JtLklTX0lFKSYmYS5NZXNzYWdlTG9vcC5mbHVzaCgpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdGFja2VkUGFuZWwuaW5zZXJ0V2lkZ2V0KGUudG9JbmRleCxlLnRpdGxlLm93bmVyKX0sZS5wcm90b3R5cGUuX29uV2lkZ2V0UmVtb3ZlZD1mdW5jdGlvbih0LGUpe3RoaXMudGFiQmFyLnJlbW92ZVRhYihlLnRpdGxlKX0sZX0obig3KS5XaWRnZXQpO2UuVGFiUGFuZWw9ZCxmdW5jdGlvbih0KXt0Lm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0sdC5kaXJlY3Rpb25Gcm9tUGxhY2VtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfTt2YXIgZT17dG9wOiJob3Jpem9udGFsIixsZWZ0OiJ2ZXJ0aWNhbCIscmlnaHQ6InZlcnRpY2FsIixib3R0b206Imhvcml6b250YWwifSxuPXt0b3A6InRvcC10by1ib3R0b20iLGxlZnQ6ImxlZnQtdG8tcmlnaHQiLHJpZ2h0OiJyaWdodC10by1sZWZ0Iixib3R0b206ImJvdHRvbS10by10b3AifX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyNSkscz1uKDc1KSxhPXthbGlnbl9jb250ZW50Om51bGwsYWxpZ25faXRlbXM6bnVsbCxhbGlnbl9zZWxmOm51bGwsYm9yZGVyOm51bGwsYm90dG9tOm51bGwsZGlzcGxheTpudWxsLGZsZXg6bnVsbCxmbGV4X2Zsb3c6bnVsbCxoZWlnaHQ6bnVsbCxqdXN0aWZ5X2NvbnRlbnQ6bnVsbCxsZWZ0Om51bGwsbWFyZ2luOm51bGwsbWF4X2hlaWdodDpudWxsLG1heF93aWR0aDpudWxsLG1pbl9oZWlnaHQ6bnVsbCxtaW5fd2lkdGg6bnVsbCxvdmVyZmxvdzpudWxsLG92ZXJmbG93X3g6bnVsbCxvdmVyZmxvd195Om51bGwsb3JkZXI6bnVsbCxwYWRkaW5nOm51bGwscmlnaHQ6bnVsbCx0b3A6bnVsbCx2aXNpYmlsaXR5Om51bGwsd2lkdGg6bnVsbCxncmlkX2F1dG9fY29sdW1uczpudWxsLGdyaWRfYXV0b19mbG93Om51bGwsZ3JpZF9hdXRvX3Jvd3M6bnVsbCxncmlkX2dhcDpudWxsLGdyaWRfdGVtcGxhdGVfcm93czpudWxsLGdyaWRfdGVtcGxhdGVfY29sdW1uczpudWxsLGdyaWRfdGVtcGxhdGVfYXJlYXM6bnVsbCxncmlkX3JvdzpudWxsLGdyaWRfY29sdW1uOm51bGwsZ3JpZF9hcmVhOm51bGx9LHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvLmFzc2lnbih0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiTGF5b3V0TW9kZWwiLF92aWV3X25hbWU6IkxheW91dFZpZXcifSxhKX0sZX0ocy5XaWRnZXRNb2RlbCk7ZS5MYXlvdXRNb2RlbD11O3ZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0aGlzLl90cmFpdE5hbWVzPVtdLHQucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpO2Zvcih2YXIgbj0wLGk9T2JqZWN0LmtleXMoYSk7bjxpLmxlbmd0aDtuKyspe3ZhciByPWlbbl07dGhpcy5yZWdpc3RlclRyYWl0KHIpfX0sZS5wcm90b3R5cGUucmVnaXN0ZXJUcmFpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3RyYWl0TmFtZXMucHVzaCh0KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZToiK3QsZnVuY3Rpb24obixpKXtlLmhhbmRsZUNoYW5nZSh0LGkpfSksdGhpcy5oYW5kbGVDaGFuZ2UodCx0aGlzLm1vZGVsLmdldCh0KSl9LGUucHJvdG90eXBlLmNzc19uYW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL18vZywiLSIpfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm9wdGlvbnMucGFyZW50O24/bnVsbD09PWU/bi5lbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0aGlzLmNzc19uYW1lKHQpKTpuLmVsLnN0eWxlW3RoaXMuY3NzX25hbWUodCldPWU6Y29uc29sZS53YXJuKCJTdHlsZSBub3QgYXBwbGllZCBiZWNhdXNlIGEgcGFyZW50IHZpZXcgZG9lcyBub3QgZXhpc3QiKX0sZS5wcm90b3R5cGUudW5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5vcHRpb25zLnBhcmVudDt0aGlzLl90cmFpdE5hbWVzLmZvckVhY2goZnVuY3Rpb24obil7ZT9lLmVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQuY3NzX25hbWUobikpOmNvbnNvbGUud2FybigiU3R5bGUgbm90IHJlbW92ZWQgYmVjYXVzZSBhIHBhcmVudCB2aWV3IGRvZXMgbm90IGV4aXN0Iil9LHRoaXMpfSxlfShzLldpZGdldFZpZXcpO2UuTGF5b3V0Vmlldz1jfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDI1KSxzPW4oNzUpLGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIG8uYXNzaWduKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJTdHlsZU1vZGVsIixfdmlld19uYW1lOiJTdHlsZVZpZXcifSxPYmplY3Qua2V5cyhlLnN0eWxlUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl09ZS5zdHlsZVByb3BlcnRpZXNbbl0uZGVmYXVsdCx0fSx7fSkpfSxlLnN0eWxlUHJvcGVydGllcz17fSxlfShzLldpZGdldE1vZGVsKTtlLlN0eWxlTW9kZWw9YTt2YXIgdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dGhpcy5fdHJhaXROYW1lcz1bXSx0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKTtmb3IodmFyIG49dGhpcy5tb2RlbC5jb25zdHJ1Y3RvcixpPTAscj1PYmplY3Qua2V5cyhuLnN0eWxlUHJvcGVydGllcyk7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07dGhpcy5yZWdpc3RlclRyYWl0KG8pfXRoaXMuc3R5bGUoKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJUcmFpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3RyYWl0TmFtZXMucHVzaCh0KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZToiK3QsZnVuY3Rpb24obixpKXtlLmhhbmRsZUNoYW5nZSh0LGkpfSl9LGUucHJvdG90eXBlLmhhbmRsZUNoYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9ucy5wYXJlbnQ7aWYobil7dmFyIGk9dGhpcy5tb2RlbC5jb25zdHJ1Y3Rvci5zdHlsZVByb3BlcnRpZXMscj1pW3RdLmF0dHJpYnV0ZSxvPWlbdF0uc2VsZWN0b3Iscz1vP24uZWwucXVlcnlTZWxlY3RvckFsbChvKTpbbi5lbF07aWYobnVsbD09PWUpZm9yKHZhciBhPTA7YSE9PXMubGVuZ3RoOysrYSlzW2FdLnN0eWxlLnJlbW92ZVByb3BlcnR5KHIpO2Vsc2UgZm9yKGE9MDthIT09cy5sZW5ndGg7KythKXNbYV0uc3R5bGVbcl09ZX1lbHNlIGNvbnNvbGUud2FybigiU3R5bGUgbm90IGFwcGxpZWQgYmVjYXVzZSBhIHBhcmVudCB2aWV3IGRvZXMgbm90IGV4aXN0Iil9LGUucHJvdG90eXBlLnN0eWxlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLl90cmFpdE5hbWVzO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO3RoaXMuaGFuZGxlQ2hhbmdlKG4sdGhpcy5tb2RlbC5nZXQobikpfX0sZS5wcm90b3R5cGUudW5zdHlsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5wYXJlbnQsZT10aGlzLm1vZGVsLmNvbnN0cnVjdG9yLnN0eWxlUHJvcGVydGllczt0aGlzLl90cmFpdE5hbWVzLmZvckVhY2goZnVuY3Rpb24obil7aWYodClmb3IodmFyIGk9ZVtuXS5hdHRyaWJ1dGUscj1lW25dLnNlbGVjdG9yLG89cj90LmVsLnF1ZXJ5U2VsZWN0b3JBbGwocik6W3QuZWxdLHM9MDtzIT09by5sZW5ndGg7KytzKW9bc10uc3R5bGUucmVtb3ZlUHJvcGVydHkoaSk7ZWxzZSBjb25zb2xlLndhcm4oIlN0eWxlIG5vdCByZW1vdmVkIGJlY2F1c2UgYSBwYXJlbnQgdmlldyBkb2VzIG5vdCBleGlzdCIpfSx0aGlzKX0sZX0ocy5XaWRnZXRWaWV3KTtlLlN0eWxlVmlldz11fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKShmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHModCl7dHJ5e3UoaS5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBhKHQpe3RyeXt1KGkudGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHUodCl7dC5kb25lP3IodC52YWx1ZSk6bmV3IG4oZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pLnRoZW4ocyxhKX11KChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KX0scj10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6YSgwKSx0aHJvdzphKDEpLHJldHVybjphKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIGEobyl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihvKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3M7KXRyeXtpZihuPTEsaSYmKHI9MiZvWzBdP2kucmV0dXJuOm9bMF0/aS50aHJvd3x8KChyPWkucmV0dXJuKSYmci5jYWxsKGkpLDApOmkubmV4dCkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVsyJm9bMF0sci52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6cj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKyssaT1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocj0ocj1zLnRyeXMpLmxlbmd0aD4wJiZyW3IubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFyfHxvWzFdPnJbMF0mJm9bMV08clszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxyWzFdKXtzLmxhYmVsPXJbMV0scj1vO2JyZWFrfWlmKHImJnMubGFiZWw8clsyXSl7cy5sYWJlbD1yWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9clsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89ZS5jYWxsKHQscyl9Y2F0Y2godCl7bz1bNix0XSxpPTB9ZmluYWxseXtuPXI9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28sYV0pfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudGFyZ2V0cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtlcm5lbD1udWxsLHRoaXMuanNTZXJ2aWNlc0tlcm5lbD1udWxsLHRoaXMuaW5pdF9rZXJuZWwodCl9cmV0dXJuIHQucHJvdG90eXBlLmluaXRfa2VybmVsPWZ1bmN0aW9uKHQpe3RoaXMua2VybmVsPXQsdGhpcy5qc1NlcnZpY2VzS2VybmVsPXR9LHQucHJvdG90eXBlLm5ld19jb21tPWZ1bmN0aW9uKHQsZSxvLHMsYSx1KXtyZXR1cm4gaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgaSxjO3JldHVybiByKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCxQcm9taXNlLnJlc29sdmUodGhpcy5qc1NlcnZpY2VzS2VybmVsLmNvbm5lY3RUb0NvbW0odCxhKSldO2Nhc2UgMTpyZXR1cm4gaT1yLnNlbnQoKSxjPW5ldyBuKGkpLHRoaXMucmVnaXN0ZXJfY29tbShjKSxjLm9wZW4oZSxvLHMsdSksWzIsY119fSl9KX0sdC5wcm90b3R5cGUucmVnaXN0ZXJfdGFyZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxyPXRoaXMuanNTZXJ2aWNlc0tlcm5lbC5yZWdpc3RlckNvbW1UYXJnZXQodCxmdW5jdGlvbih0LHIpe3ZhciBvPW5ldyBuKHQpO2kucmVnaXN0ZXJfY29tbShvKTt0cnl7cmV0dXJuIGUobyxyKX1jYXRjaCh0KXtvLmNsb3NlKCksY29uc29sZS5lcnJvcih0KSxjb25zb2xlLmVycm9yKG5ldyBFcnJvcigiRXhjZXB0aW9uIG9wZW5pbmcgbmV3IGNvbW0iKSl9fSk7dGhpcy50YXJnZXRzW3RdPXJ9LHQucHJvdG90eXBlLnVucmVnaXN0ZXJfdGFyZ2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy50YXJnZXRzW3RdLmRpc3Bvc2UoKSxkZWxldGUgdGhpcy50YXJnZXRzW3RdfSx0LnByb3RvdHlwZS5yZWdpc3Rlcl9jb21tPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbW1zW3QuY29tbV9pZF09UHJvbWlzZS5yZXNvbHZlKHQpLHQua2VybmVsPXRoaXMua2VybmVsLHQuY29tbV9pZH0sdH0oKTt0LkNvbW1NYW5hZ2VyPWU7dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuanNTZXJ2aWNlc0NvbW09bnVsbCx0aGlzLmpzU2VydmljZXNDb21tPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29tbV9pZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpzU2VydmljZXNDb21tLmNvbW1JZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInRhcmdldF9uYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanNTZXJ2aWNlc0NvbW0udGFyZ2V0TmFtZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMuanNTZXJ2aWNlc0NvbW0ub3Blbih0LG4saSk7cmV0dXJuIHRoaXMuX2hvb2t1cENhbGxiYWNrcyhyLGUpLHIubXNnLmhlYWRlci5tc2dfaWR9LHQucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5qc1NlcnZpY2VzQ29tbS5zZW5kKHQsbixpKTtyZXR1cm4gdGhpcy5faG9va3VwQ2FsbGJhY2tzKHIsZSksci5tc2cuaGVhZGVyLm1zZ19pZH0sdC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5qc1NlcnZpY2VzQ29tbS5jbG9zZSh0LG4saSk7cmV0dXJuIHRoaXMuX2hvb2t1cENhbGxiYWNrcyhyLGUpLHIubXNnLmhlYWRlci5tc2dfaWR9LHQucHJvdG90eXBlLm9uX21zZz1mdW5jdGlvbih0KXt0aGlzLmpzU2VydmljZXNDb21tLm9uTXNnPXQuYmluZCh0aGlzKX0sdC5wcm90b3R5cGUub25fY2xvc2U9ZnVuY3Rpb24odCl7dGhpcy5qc1NlcnZpY2VzQ29tbS5vbkNsb3NlPXQuYmluZCh0aGlzKX0sdC5wcm90b3R5cGUuX2hvb2t1cENhbGxiYWNrcz1mdW5jdGlvbih0LGUpe2UmJih0Lm9uUmVwbHk9ZnVuY3Rpb24odCl7ZS5zaGVsbCYmZS5zaGVsbC5yZXBseSYmZS5zaGVsbC5yZXBseSh0KX0sdC5vblN0ZGluPWZ1bmN0aW9uKHQpe2UuaW5wdXQmJmUuaW5wdXQodCl9LHQub25JT1B1Yj1mdW5jdGlvbih0KXtpZihlLmlvcHViKWlmKGUuaW9wdWIuc3RhdHVzJiYic3RhdHVzIj09PXQuaGVhZGVyLm1zZ190eXBlKWUuaW9wdWIuc3RhdHVzKHQpO2Vsc2UgaWYoZS5pb3B1Yi5jbGVhcl9vdXRwdXQmJiJjbGVhcl9vdXRwdXQiPT09dC5oZWFkZXIubXNnX3R5cGUpZS5pb3B1Yi5jbGVhcl9vdXRwdXQodCk7ZWxzZSBpZihlLmlvcHViLm91dHB1dClzd2l0Y2godC5oZWFkZXIubXNnX3R5cGUpe2Nhc2UiZGlzcGxheV9kYXRhIjpjYXNlImV4ZWN1dGVfcmVzdWx0IjplLmlvcHViLm91dHB1dCh0KX19KX0sdH0oKTt0LkNvbW09bn0odC5zZXJ2aWNlc3x8KHQuc2VydmljZXM9e30pKX0oZS5zaGltc3x8KGUuc2hpbXM9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmluaXRpYWxpemUodCxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9oYW5kbGVyX2NvbnRleHQ9bnx8dGhpcyx0aGlzLl9tb2RlbHM9W10sdGhpcy52aWV3cz1bXSx0aGlzLl9jcmVhdGVfdmlldz10LHRoaXMuX3JlbW92ZV92aWV3PWV8fGZ1bmN0aW9uKHQpe3QucmVtb3ZlKCl9fSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bnx8dGhpcy5fcmVtb3ZlX3ZpZXcsbz1lfHx0aGlzLl9jcmVhdGVfdmlldztpPWl8fHRoaXMuX2hhbmRsZXJfY29udGV4dDtmb3IodmFyIHM9MDtzPHQubGVuZ3RoJiYhKHM+PXRoaXMuX21vZGVscy5sZW5ndGh8fHRbc10hPT10aGlzLl9tb2RlbHNbc10pO3MrKyk7Zm9yKHZhciBhPXMsdT10aGlzLnZpZXdzLnNwbGljZShhLHRoaXMudmlld3MubGVuZ3RoLWEpLGM9MDtjPHUubGVuZ3RoO2MrKyl1W2NdLnRoZW4oZnVuY3Rpb24odCl7ci5jYWxsKGksdCl9KTtmb3IoO3M8dC5sZW5ndGg7cysrKXRoaXMudmlld3MucHVzaChQcm9taXNlLnJlc29sdmUoby5jYWxsKGksdFtzXSxzKSkpO3JldHVybiB0aGlzLl9tb2RlbHM9dC5zbGljZSgpLFByb21pc2UuYWxsKHRoaXMudmlld3MpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBQcm9taXNlLmFsbCh0aGlzLnZpZXdzKS50aGVuKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdC5fcmVtb3ZlX3ZpZXcuY2FsbCh0Ll9oYW5kbGVyX2NvbnRleHQsZSl9KSx0LnZpZXdzPVtdLHQuX21vZGVscz1bXX0pfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52aWV3cz1udWxsLHRoaXMuX21vZGVscz1udWxsfSx0fSgpO2UuVmlld0xpc3Q9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyNik7ZS5JSnVweXRlcldpZGdldFJlZ2lzdHJ5PW5ldyBpLlRva2VuKCJqdXB5dGVyLmV4dGVuc2lvbnMuanVweXRlcldpZGdldFJlZ2lzdHJ5Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDE2KSksaShuKDU3KSksaShuKDMzOSkpLGkobigzNDApKSxpKG4oMzQxKSksaShuKDEzNikpLGkobigzNDIpKSxpKG4oMzQzKSksaShuKDM0NCkpLGkobigzNDUpKSxpKG4oMzQ2KSksaShuKDEzNykpLGkobigzNTEpKSxpKG4oMzUyKSksaShuKDM1MykpLGkobigzNTQpKSxpKG4oMzU4KSksaShuKDIzKSksZS52ZXJzaW9uPW4oMzU5KS52ZXJzaW9ufSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9big2KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7dGFyZ2V0OnZvaWQgMCxzb3VyY2U6dm9pZCAwLF9tb2RlbF9uYW1lOiJEaXJlY3Rpb25hbExpbmtNb2RlbCJ9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlIix0aGlzLnVwZGF0ZUJpbmRpbmdzLHRoaXMpLHRoaXMudXBkYXRlQmluZGluZ3MoKX0sZS5wcm90b3R5cGUudXBkYXRlVmFsdWU9ZnVuY3Rpb24odCxlLG4saSl7aWYoIXRoaXMuX3VwZGF0aW5nKXt0aGlzLl91cGRhdGluZz0hMDt0cnl7biYmKG4uc2V0KGksdC5nZXQoZSkpLG4uc2F2ZV9jaGFuZ2VzKCkpfWZpbmFsbHl7dGhpcy5fdXBkYXRpbmc9ITF9fX0sZS5wcm90b3R5cGUudXBkYXRlQmluZGluZ3M9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpczt0aGlzLmNsZWFudXAoKSx0PXRoaXMuZ2V0KCJzb3VyY2UiKXx8W251bGwsbnVsbF0sdGhpcy5zb3VyY2VNb2RlbD10WzBdLHRoaXMuc291cmNlQXR0cj10WzFdLGU9dGhpcy5nZXQoInRhcmdldCIpfHxbbnVsbCxudWxsXSx0aGlzLnRhcmdldE1vZGVsPWVbMF0sdGhpcy50YXJnZXRBdHRyPWVbMV0sdGhpcy5zb3VyY2VNb2RlbCYmKHRoaXMubGlzdGVuVG8odGhpcy5zb3VyY2VNb2RlbCwiY2hhbmdlOiIrdGhpcy5zb3VyY2VBdHRyLGZ1bmN0aW9uKCl7bi51cGRhdGVWYWx1ZShuLnNvdXJjZU1vZGVsLG4uc291cmNlQXR0cixuLnRhcmdldE1vZGVsLG4udGFyZ2V0QXR0cil9KSx0aGlzLnVwZGF0ZVZhbHVlKHRoaXMuc291cmNlTW9kZWwsdGhpcy5zb3VyY2VBdHRyLHRoaXMudGFyZ2V0TW9kZWwsdGhpcy50YXJnZXRBdHRyKSx0aGlzLmxpc3RlblRvT25jZSh0aGlzLnNvdXJjZU1vZGVsLCJkZXN0cm95Iix0aGlzLmNsZWFudXApKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLmxpc3RlblRvT25jZSh0aGlzLnRhcmdldE1vZGVsLCJkZXN0cm95Iix0aGlzLmNsZWFudXApfSxlLnByb3RvdHlwZS5jbGVhbnVwPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2VNb2RlbCYmKHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLnNvdXJjZU1vZGVsLCJjaGFuZ2U6Iit0aGlzLnNvdXJjZUF0dHIsbnVsbCksdGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuc291cmNlTW9kZWwsImRlc3Ryb3kiLG51bGwpKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy50YXJnZXRNb2RlbCwiZGVzdHJveSIsbnVsbCl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVXaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dGFyZ2V0OntkZXNlcmlhbGl6ZTpzLnVucGFja19tb2RlbHN9LHNvdXJjZTp7ZGVzZXJpYWxpemU6cy51bnBhY2tfbW9kZWxzfX0pLGV9KGEuQ29yZVdpZGdldE1vZGVsKTtlLkRpcmVjdGlvbmFsTGlua01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiTGlua01vZGVsIn0pfSxlLnByb3RvdHlwZS51cGRhdGVCaW5kaW5ncz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUudXBkYXRlQmluZGluZ3MuY2FsbCh0aGlzKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLmxpc3RlblRvKHRoaXMudGFyZ2V0TW9kZWwsImNoYW5nZToiK3RoaXMudGFyZ2V0QXR0cixmdW5jdGlvbigpe2UudXBkYXRlVmFsdWUoZS50YXJnZXRNb2RlbCxlLnRhcmdldEF0dHIsZS5zb3VyY2VNb2RlbCxlLnNvdXJjZUF0dHIpfSl9LGUucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5jbGVhbnVwLmNhbGwodGhpcyksdGhpcy50YXJnZXRNb2RlbCYmdGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMudGFyZ2V0TW9kZWwsImNoYW5nZToiK3RoaXMudGFyZ2V0QXR0cixudWxsKX0sZX0oYyk7ZS5MaW5rTW9kZWw9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxMikscz1uKDIzKSxhPW4oOCksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZTohMSxkaXNhYmxlZDohMSxfbW9kZWxfbmFtZToiQm9vbE1vZGVsIn0pfSxlfShvLkNvcmVEZXNjcmlwdGlvbk1vZGVsKTtlLkJvb2xNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7aW5kZW50OiEwLF92aWV3X25hbWU6IkNoZWNrYm94VmlldyIsX21vZGVsX25hbWU6IkNoZWNrYm94TW9kZWwifSl9LGV9KG8uQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuQ2hlY2tib3hNb2RlbD1oO3ZhciBsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWNoZWNrYm94IiksdGhpcy5sYWJlbC5pbm5lckhUTUw9IiYjODIwMzsiLHRoaXMuY2hlY2tib3hMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLHRoaXMuY2hlY2tib3hMYWJlbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtbGFiZWwtYmFzaWMiKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuY2hlY2tib3hMYWJlbCksdGhpcy5jaGVja2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJ0eXBlIiwiY2hlY2tib3giKSx0aGlzLmNoZWNrYm94TGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5jaGVja2JveCksdGhpcy5kZXNjcmlwdGlvblNwYW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHRoaXMuY2hlY2tib3hMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLmRlc2NyaXB0aW9uU3BhbiksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6aW5kZW50Iix0aGlzLnVwZGF0ZUluZGVudCksdGhpcy51cGRhdGUoKSx0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKCksdGhpcy51cGRhdGVJbmRlbnQoKX0sZS5wcm90b3R5cGUudXBkYXRlRGVzY3JpcHRpb249ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLmNoZWNrYm94TGFiZWwpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJkZXNjcmlwdGlvbiIpO3RoaXMuZGVzY3JpcHRpb25TcGFuLmlubmVySFRNTD10LHRoaXMudHlwZXNldCh0aGlzLmRlc2NyaXB0aW9uU3BhbiksdGhpcy5kZXNjcmlwdGlvblNwYW4udGl0bGU9dCx0aGlzLmNoZWNrYm94LnRpdGxlPXR9fSxlLnByb3RvdHlwZS51cGRhdGVJbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiaW5kZW50Iik7dGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PXQ/IiI6Im5vbmUifSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NsaWNrIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nOiJfaGFuZGxlX2NsaWNrIn19LGUucHJvdG90eXBlLl9oYW5kbGVfY2xpY2s9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgidmFsdWUiKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLCF0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNoZWNrYm94LmNoZWNrZWQ9dGhpcy5tb2RlbC5nZXQoInZhbHVlIiksdm9pZCAwIT09ZSYmZS51cGRhdGVkX3ZpZXc9PXRoaXN8fCh0aGlzLmNoZWNrYm94LmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuQ2hlY2tib3hWaWV3PWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJUb2dnbGVCdXR0b25WaWV3IixfbW9kZWxfbmFtZToiVG9nZ2xlQnV0dG9uTW9kZWwiLHRvb2x0aXA6IiIsaWNvbjoiIixidXR0b25fc3R5bGU6IiJ9KX0sZX0oYyk7ZS5Ub2dnbGVCdXR0b25Nb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItYnV0dG9uIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtdG9nZ2xlLWJ1dHRvbiIpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmJ1dHRvbl9zdHlsZSIsdGhpcy51cGRhdGVfYnV0dG9uX3N0eWxlKSx0aGlzLnNldF9idXR0b25fc3R5bGUoKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGVfYnV0dG9uX3N0eWxlPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc19tYXAsImJ1dHRvbl9zdHlsZSIpfSxlLnByb3RvdHlwZS5zZXRfYnV0dG9uX3N0eWxlPWZ1bmN0aW9uKCl7dGhpcy5zZXRfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc19tYXAsImJ1dHRvbl9zdHlsZSIpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5tb2RlbC5nZXQoInZhbHVlIik/dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJtb2QtYWN0aXZlIik6dGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIiksdm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPT10aGlzKXt0aGlzLmVsLmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpLHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdGhpcy5tb2RlbC5nZXQoInRvb2x0aXAiKSk7dmFyIG49dGhpcy5tb2RlbC5nZXQoImRlc2NyaXB0aW9uIiksaT10aGlzLm1vZGVsLmdldCgiaWNvbiIpO2lmKDA9PT1uLnRyaW0oKS5sZW5ndGgmJjA9PT1pLnRyaW0oKS5sZW5ndGgpdGhpcy5lbC5pbm5lckhUTUw9IiZuYnNwOyI7ZWxzZXtpZih0aGlzLmVsLnRleHRDb250ZW50PSIiLGkudHJpbSgpLmxlbmd0aCl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaSIpO3RoaXMuZWwuYXBwZW5kQ2hpbGQociksci5jbGFzc0xpc3QuYWRkKCJmYSIpLHIuY2xhc3NMaXN0LmFkZCgiZmEtIitpKX10aGlzLmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57Y2xpY2s6Il9oYW5kbGVfY2xpY2sifX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jbGljaz1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7dGhpcy5tb2RlbC5zZXQoInZhbHVlIiwhZSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFnTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiJidXR0b24ifSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUuY2xhc3NfbWFwPXtwcmltYXJ5OlsibW9kLXByaW1hcnkiXSxzdWNjZXNzOlsibW9kLXN1Y2Nlc3MiXSxpbmZvOlsibW9kLWluZm8iXSx3YXJuaW5nOlsibW9kLXdhcm5pbmciXSxkYW5nZXI6WyJtb2QtZGFuZ2VyIl19LGV9KGEuRE9NV2lkZ2V0Vmlldyk7ZS5Ub2dnbGVCdXR0b25WaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtyZWFkb3V0OiJJbnZhbGlkIixfdmlld19uYW1lOiJWYWxpZFZpZXciLF9tb2RlbF9uYW1lOiJWYWxpZE1vZGVsIn0pfSxlfShjKTtlLlZhbGlkTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtdmFsaWQiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTt0aGlzLmVsLmFwcGVuZENoaWxkKGUpLHRoaXMucmVhZG91dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksdGhpcy5yZWFkb3V0LmNsYXNzTGlzdC5hZGQoIndpZGdldC12YWxpZC1yZWFkb3V0IiksdGhpcy5yZWFkb3V0LmNsYXNzTGlzdC5hZGQoIndpZGdldC1yZWFkb3V0IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgibW9kLXZhbGlkIiksdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtaW52YWxpZCIpLHRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgicmVhZG91dCIpLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpP3RoaXMuZWwuY2xhc3NMaXN0LmFkZCgibW9kLXZhbGlkIik6dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJtb2QtaW52YWxpZCIpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5WYWxpZFZpZXc9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big4KSxzPW4oMTIpLGE9big1NyksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQnV0dG9uU3R5bGVNb2RlbCIsX21vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9jb250cm9scyIsX21vZGVsX21vZHVsZV92ZXJzaW9uOmEuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OfSl9LGUuc3R5bGVQcm9wZXJ0aWVzPXtidXR0b25fY29sb3I6e3NlbGVjdG9yOiIiLGF0dHJpYnV0ZToiYmFja2dyb3VuZC1jb2xvciIsZGVmYXVsdDpudWxsfSxmb250X3dlaWdodDp7c2VsZWN0b3I6IiIsYXR0cmlidXRlOiJmb250LXdlaWdodCIsZGVmYXVsdDoiIn19LGV9KG8uU3R5bGVNb2RlbCk7ZS5CdXR0b25TdHlsZU1vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtkZXNjcmlwdGlvbjoiIix0b29sdGlwOiIiLGRpc2FibGVkOiExLGljb246IiIsYnV0dG9uX3N0eWxlOiIiLF92aWV3X25hbWU6IkJ1dHRvblZpZXciLF9tb2RlbF9uYW1lOiJCdXR0b25Nb2RlbCIsc3R5bGU6bnVsbH0pfSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5CdXR0b25Nb2RlbD1oO3ZhciBsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItYnV0dG9uIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtYnV0dG9uIiksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6YnV0dG9uX3N0eWxlIix0aGlzLnVwZGF0ZV9idXR0b25fc3R5bGUpLHRoaXMuc2V0X2J1dHRvbl9zdHlsZSgpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZWwuZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIiksdGhpcy5lbC5zZXRBdHRyaWJ1dGUoInRpdGxlIix0aGlzLm1vZGVsLmdldCgidG9vbHRpcCIpKTt2YXIgZT10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb24iKSxuPXRoaXMubW9kZWwuZ2V0KCJpY29uIik7aWYoZS5sZW5ndGh8fG4ubGVuZ3RoKXtpZih0aGlzLmVsLnRleHRDb250ZW50PSIiLG4ubGVuZ3RoKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7aS5jbGFzc0xpc3QuYWRkKCJmYSIpLGkuY2xhc3NMaXN0LmFkZCgiZmEtIituKSwwPT09ZS5sZW5ndGgmJmkuY2xhc3NMaXN0LmFkZCgiY2VudGVyIiksdGhpcy5lbC5hcHBlbmRDaGlsZChpKX10aGlzLmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnVwZGF0ZV9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZV9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzX21hcCwiYnV0dG9uX3N0eWxlIil9LGUucHJvdG90eXBlLnNldF9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXt0aGlzLnNldF9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzX21hcCwiYnV0dG9uX3N0eWxlIil9LGUucHJvdG90eXBlLmV2ZW50cz1mdW5jdGlvbigpe3JldHVybntjbGljazoiX2hhbmRsZV9jbGljayJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NsaWNrPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLnNlbmQoe2V2ZW50OiJjbGljayJ9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWdOYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImJ1dHRvbiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5jbGFzc19tYXA9e3ByaW1hcnk6WyJtb2QtcHJpbWFyeSJdLHN1Y2Nlc3M6WyJtb2Qtc3VjY2VzcyJdLGluZm86WyJtb2QtaW5mbyJdLHdhcm5pbmc6WyJtb2Qtd2FybmluZyJdLGRhbmdlcjpbIm1vZC1kYW5nZXIiXX0sZX0oby5ET01XaWRnZXRWaWV3KTtlLkJ1dHRvblZpZXc9bH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oOCksYT1uKDEyKSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJJbWFnZU1vZGVsIixfdmlld19uYW1lOiJJbWFnZVZpZXciLGZvcm1hdDoicG5nIix3aWR0aDoiIixoZWlnaHQ6IiIsdmFsdWU6bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigwKSl9KX0sZS5zZXJpYWxpemVycz1vKHt9LGEuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHt2YWx1ZTp7c2VyaWFsaXplOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBEYXRhVmlldyh0LmJ1ZmZlci5zbGljZSgwKSl9fX0pLGV9KGEuQ29yZURPTVdpZGdldE1vZGVsKTtlLkltYWdlTW9kZWw9Yzt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMucFdpZGdldC5hZGRDbGFzcygianVweXRlci13aWRnZXRzIiksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJ3aWRnZXQtaW1hZ2UiKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgZSxuPXRoaXMubW9kZWwuZ2V0KCJmb3JtYXQiKSxpPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO2lmKCJ1cmwiIT09bil7dmFyIHI9bmV3IEJsb2IoW2ldLHt0eXBlOiJpbWFnZS8iK3RoaXMubW9kZWwuZ2V0KCJmb3JtYXQiKX0pO2U9VVJMLmNyZWF0ZU9iamVjdFVSTChyKX1lbHNlIGU9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLmRlY29kZShpLmJ1ZmZlcik7dmFyIG89dGhpcy5lbC5zcmM7dGhpcy5lbC5zcmM9ZSxvJiYic3RyaW5nIiE9dHlwZW9mIG8mJlVSTC5yZXZva2VPYmplY3RVUkwobyk7dmFyIHM9dGhpcy5tb2RlbC5nZXQoIndpZHRoIik7dm9pZCAwIT09cyYmcy5sZW5ndGg+MD90aGlzLmVsLnNldEF0dHJpYnV0ZSgid2lkdGgiLHMpOnRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKCJ3aWR0aCIpO3ZhciBhPXRoaXMubW9kZWwuZ2V0KCJoZWlnaHQiKTtyZXR1cm4gdm9pZCAwIT09YSYmYS5sZW5ndGg+MD90aGlzLmVsLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixhKTp0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0IiksdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZWwuc3JjJiZVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuZWwuc3JjKSx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWdOYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImltZyJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZX0ocy5ET01XaWRnZXRWaWV3KTtlLkltYWdlVmlldz1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9big2KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlZpZGVvTW9kZWwiLF92aWV3X25hbWU6IlZpZGVvVmlldyIsZm9ybWF0OiJtcDQiLHdpZHRoOiIiLGhlaWdodDoiIixhdXRvcGxheTohMCxsb29wOiEwLGNvbnRyb2xzOiEwLHZhbHVlOm5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpfSl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVET01XaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgRGF0YVZpZXcodC5idWZmZXIuc2xpY2UoMCkpfX19KSxlfShhLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5WaWRlb01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMucFdpZGdldC5hZGRDbGFzcygid2lkZ2V0LWltYWdlIiksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGUsbj10aGlzLm1vZGVsLmdldCgiZm9ybWF0IiksaT10aGlzLm1vZGVsLmdldCgidmFsdWUiKTtpZigidXJsIiE9PW4pe3ZhciByPW5ldyBCbG9iKFtpXSx7dHlwZToidmlkZW8vIit0aGlzLm1vZGVsLmdldCgiZm9ybWF0Iil9KTtlPVVSTC5jcmVhdGVPYmplY3RVUkwocil9ZWxzZSBlPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKS5kZWNvZGUoaS5idWZmZXIpO3ZhciBvPXRoaXMuZWwuc3JjO3RoaXMuZWwuc3JjPWUsbyYmInN0cmluZyIhPXR5cGVvZiBvJiZVUkwucmV2b2tlT2JqZWN0VVJMKG8pO3ZhciBzPXRoaXMubW9kZWwuZ2V0KCJ3aWR0aCIpO3ZvaWQgMCE9PXMmJnMubGVuZ3RoPjA/dGhpcy5lbC5zZXRBdHRyaWJ1dGUoIndpZHRoIixzKTp0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKTt2YXIgYT10aGlzLm1vZGVsLmdldCgiaGVpZ2h0Iik7cmV0dXJuIHZvaWQgMCE9PWEmJmEubGVuZ3RoPjA/dGhpcy5lbC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsYSk6dGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoImhlaWdodCIpLHRoaXMuZWwubG9vcD10aGlzLm1vZGVsLmdldCgibG9vcCIpLHRoaXMuZWwuYXV0b3BsYXk9dGhpcy5tb2RlbC5nZXQoImF1dG9wbGF5IiksdGhpcy5lbC5jb250cm9scz10aGlzLm1vZGVsLmdldCgiY29udHJvbHMiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5lbC5zcmMmJlVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5lbC5zcmMpLHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhZ05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW8ifSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5WaWRlb1ZpZXc9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oOCksYT1uKDEyKSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJBdWRpb01vZGVsIixfdmlld19uYW1lOiJBdWRpb1ZpZXciLGZvcm1hdDoibXAzIixhdXRvcGxheTohMCxsb29wOiEwLGNvbnRyb2xzOiEwLHZhbHVlOm5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpfSl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVET01XaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgRGF0YVZpZXcodC5idWZmZXIuc2xpY2UoMCkpfX19KSxlfShhLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5BdWRpb01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBlLG49dGhpcy5tb2RlbC5nZXQoImZvcm1hdCIpLGk9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7aWYoInVybCIhPT1uKXt2YXIgcj1uZXcgQmxvYihbaV0se3R5cGU6ImF1ZGlvLyIrdGhpcy5tb2RlbC5nZXQoImZvcm1hdCIpfSk7ZT1VUkwuY3JlYXRlT2JqZWN0VVJMKHIpfWVsc2UgZT1uZXcgVGV4dERlY29kZXIoInV0Zi04IikuZGVjb2RlKGkuYnVmZmVyKTt2YXIgbz10aGlzLmVsLnNyYztyZXR1cm4gdGhpcy5lbC5zcmM9ZSxvJiYic3RyaW5nIiE9dHlwZW9mIG8mJlVSTC5yZXZva2VPYmplY3RVUkwobyksdGhpcy5lbC5sb29wPXRoaXMubW9kZWwuZ2V0KCJsb29wIiksdGhpcy5lbC5hdXRvcGxheT10aGlzLm1vZGVsLmdldCgiYXV0b3BsYXkiKSx0aGlzLmVsLmNvbnRyb2xzPXRoaXMubW9kZWwuZ2V0KCJjb250cm9scyIpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmVsLnNyYyYmVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmVsLnNyYyksdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFnTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiJhdWRpbyJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZX0ocy5ET01XaWRnZXRWaWV3KTtlLkF1ZGlvVmlldz1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEyKSxzPW4oMjMpLGE9bigxNiksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZToiYmxhY2siLGNvbmNpc2U6ITEsX21vZGVsX25hbWU6IkNvbG9yUGlja2VyTW9kZWwiLF92aWV3X25hbWU6IkNvbG9yUGlja2VyVmlldyJ9KX0sZX0oby5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5Db2xvclBpY2tlck1vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtY29sb3JwaWNrZXIiKSx0aGlzLl9jb2xvcl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY29sb3JfY29udGFpbmVyLmNsYXNzTmFtZT0id2lkZ2V0LWlubGluZS1oYm94IHdpZGdldC1jb2xvcnBpY2tlci1pbnB1dCIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLl9jb2xvcl9jb250YWluZXIpLHRoaXMuX3RleHRib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSx0aGlzLl90ZXh0Ym94LnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQiKSx0aGlzLl90ZXh0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj1hLnV1aWQoKSx0aGlzLl9jb2xvcl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdGV4dGJveCksdGhpcy5fdGV4dGJveC52YWx1ZT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0aGlzLl9jb2xvcnBpY2tlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuX2NvbG9ycGlja2VyLnNldEF0dHJpYnV0ZSgidHlwZSIsImNvbG9yIiksdGhpcy5fY29sb3JfY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbG9ycGlja2VyKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTp2YWx1ZSIsdGhpcy5fdXBkYXRlX3ZhbHVlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpjb25jaXNlIix0aGlzLl91cGRhdGVfY29uY2lzZSksdGhpcy5fdXBkYXRlX2NvbmNpc2UoKSx0aGlzLl91cGRhdGVfdmFsdWUoKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPXRoaXMpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMuX3RleHRib3guZGlzYWJsZWQ9bix0aGlzLl9jb2xvcnBpY2tlci5kaXNhYmxlZD1ufXJldHVybiB0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJueydjaGFuZ2UgW3R5cGU9ImNvbG9yIl0nOiJfcGlja2VyX2NoYW5nZSIsJ2NoYW5nZSBbdHlwZT0idGV4dCJdJzoiX3RleHRfY2hhbmdlIn19LGUucHJvdG90eXBlLl91cGRhdGVfdmFsdWU9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7dGhpcy5fY29sb3JwaWNrZXIudmFsdWU9bFsodD1uKS50b0xvd2VyQ2FzZSgpXXx8KDc9PT0oZT10KS5sZW5ndGg/ZToiIyIrZS5jaGFyQXQoMSkrZS5jaGFyQXQoMSkrZS5jaGFyQXQoMikrZS5jaGFyQXQoMikrZS5jaGFyQXQoMykrZS5jaGFyQXQoMykpLHRoaXMuX3RleHRib3gudmFsdWU9bn0sZS5wcm90b3R5cGUuX3VwZGF0ZV9jb25jaXNlPWZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5nZXQoImNvbmNpc2UiKT8odGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJjb25jaXNlIiksdGhpcy5fdGV4dGJveC5zdHlsZS5kaXNwbGF5PSJub25lIik6KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgiY29uY2lzZSIpLHRoaXMuX3RleHRib3guc3R5bGUuZGlzcGxheT0iIil9LGUucHJvdG90eXBlLl9waWNrZXJfY2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5zZXQoInZhbHVlIix0aGlzLl9jb2xvcnBpY2tlci52YWx1ZSksdGhpcy50b3VjaCgpfSxlLnByb3RvdHlwZS5fdGV4dF9jaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl92YWxpZGF0ZV9jb2xvcih0aGlzLl90ZXh0Ym94LnZhbHVlLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQpLHRoaXMudG91Y2goKX0sZS5wcm90b3R5cGUuX3ZhbGlkYXRlX2NvbG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubWF0Y2goLyNbYS1mQS1GMC05XXszfSg/OlthLWZBLUYwLTldezN9KT8kLyl8fGxbdC50b0xvd2VyQ2FzZSgpXT90OmV9LGV9KHMuRGVzY3JpcHRpb25WaWV3KTtlLkNvbG9yUGlja2VyVmlldz1oO3ZhciBsPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmVlbjoiIzkwZWU5MCIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9bigyMyksYT1uKDEyKSx1PW4oMTYpLGM9big2KTtmdW5jdGlvbiBoKHQpe3JldHVybiBudWxsPT09dD9udWxsOnt5ZWFyOnQuZ2V0VVRDRnVsbFllYXIoKSxtb250aDp0LmdldFVUQ01vbnRoKCksZGF0ZTp0LmdldFVUQ0RhdGUoKX19ZnVuY3Rpb24gbCh0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aCx0LmRhdGUpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCksZX1lLnNlcmlhbGl6ZV9kYXRlPWgsZS5kZXNlcmlhbGl6ZV9kYXRlPWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZTpudWxsLF9tb2RlbF9uYW1lOiJEYXRlUGlja2VyTW9kZWwiLF92aWV3X25hbWU6IkRhdGVQaWNrZXJWaWV3In0pfSxlLnNlcmlhbGl6ZXJzPW8oe30sYS5Db3JlRGVzY3JpcHRpb25Nb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpoLGRlc2VyaWFsaXplOmx9fSksZX0oYS5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5EYXRlUGlja2VyTW9kZWw9ZDt2YXIgZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1kYXRlcGlja2VyIiksdGhpcy5fZGF0ZXBpY2tlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuX2RhdGVwaWNrZXIuc2V0QXR0cmlidXRlKCJ0eXBlIiwiZGF0ZSIpLHRoaXMuX2RhdGVwaWNrZXIuaWQ9dGhpcy5sYWJlbC5odG1sRm9yPXUudXVpZCgpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5fZGF0ZXBpY2tlciksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6dmFsdWUiLHRoaXMuX3VwZGF0ZV92YWx1ZSksdGhpcy5fdXBkYXRlX3ZhbHVlKCksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiZlLnVwZGF0ZWRfdmlldz09dGhpc3x8KHRoaXMuX2RhdGVwaWNrZXIuZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIikpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NoYW5nZSBbdHlwZT0iZGF0ZSJdJzoiX3BpY2tlcl9jaGFuZ2UifX0sZS5wcm90b3R5cGUuX3VwZGF0ZV92YWx1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuX2RhdGVwaWNrZXIudmFsdWVBc0RhdGU9dH0sZS5wcm90b3R5cGUuX3BpY2tlcl9jaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9kYXRlcGlja2VyLnZhbGlkaXR5LmJhZElucHV0fHwodGhpcy5tb2RlbC5zZXQoInZhbHVlIix0aGlzLl9kYXRlcGlja2VyLnZhbHVlQXNEYXRlKSx0aGlzLnRvdWNoKCkpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5EYXRlUGlja2VyVmlldz1mfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvOwovKiEKICogalF1ZXJ5IFVJIFNsaWRlciAxLjEyLjEKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovcj1bbigxNSksbigzNDgpLG4oMzUwKSxuKDQyKSxuKDEzOCldLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3JldHVybiB0LndpZGdldCgidWkuc2xpZGVyIix0LnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjEyLjEiLHdpZGdldEV2ZW50UHJlZml4OiJzbGlkZSIsb3B0aW9uczp7YW5pbWF0ZTohMSxjbGFzc2VzOnsidWktc2xpZGVyIjoidWktY29ybmVyLWFsbCIsInVpLXNsaWRlci1oYW5kbGUiOiJ1aS1jb3JuZXItYWxsIiwidWktc2xpZGVyLXJhbmdlIjoidWktY29ybmVyLWFsbCB1aS13aWRnZXQtaGVhZGVyIn0sZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbCxjaGFuZ2U6bnVsbCxzbGlkZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxudW1QYWdlczo1LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9hZGRDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24sInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLHRoaXMuX3JlZnJlc2goKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJhbmdlKCksdGhpcy5fY3JlYXRlSGFuZGxlcygpLHRoaXMuX3NldHVwRXZlbnRzKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9jcmVhdGVIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIGUsbixpPXRoaXMub3B0aW9ucyxyPXRoaXMuZWxlbWVudC5maW5kKCIudWktc2xpZGVyLWhhbmRsZSIpLG89W107Zm9yKG49aS52YWx1ZXMmJmkudmFsdWVzLmxlbmd0aHx8MSxyLmxlbmd0aD5uJiYoci5zbGljZShuKS5yZW1vdmUoKSxyPXIuc2xpY2UoMCxuKSksZT1yLmxlbmd0aDtlPG47ZSsrKW8ucHVzaCgiPHNwYW4gdGFiaW5kZXg9JzAnPjwvc3Bhbj4iKTt0aGlzLmhhbmRsZXM9ci5hZGQodChvLmpvaW4oIiIpKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpKSx0aGlzLl9hZGRDbGFzcyh0aGlzLmhhbmRsZXMsInVpLXNsaWRlci1oYW5kbGUiLCJ1aS1zdGF0ZS1kZWZhdWx0IiksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGUpe3QodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsZSkuYXR0cigidGFiSW5kZXgiLDApfSl9LF9jcmVhdGVSYW5nZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztlLnJhbmdlPyghMD09PWUucmFuZ2UmJihlLnZhbHVlcz9lLnZhbHVlcy5sZW5ndGgmJjIhPT1lLnZhbHVlcy5sZW5ndGg/ZS52YWx1ZXM9W2UudmFsdWVzWzBdLGUudmFsdWVzWzBdXTp0LmlzQXJyYXkoZS52YWx1ZXMpJiYoZS52YWx1ZXM9ZS52YWx1ZXMuc2xpY2UoMCkpOmUudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSx0aGlzLnJhbmdlJiZ0aGlzLnJhbmdlLmxlbmd0aD8odGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5yYW5nZSwidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IiksdGhpcy5yYW5nZS5jc3Moe2xlZnQ6IiIsYm90dG9tOiIifSkpOih0aGlzLnJhbmdlPXQoIjxkaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLl9hZGRDbGFzcyh0aGlzLnJhbmdlLCJ1aS1zbGlkZXItcmFuZ2UiKSksIm1pbiIhPT1lLnJhbmdlJiYibWF4IiE9PWUucmFuZ2V8fHRoaXMuX2FkZENsYXNzKHRoaXMucmFuZ2UsInVpLXNsaWRlci1yYW5nZS0iK2UucmFuZ2UpKToodGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLnJhbmdlPW51bGwpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl9vZmYodGhpcy5oYW5kbGVzKSx0aGlzLl9vbih0aGlzLmhhbmRsZXMsdGhpcy5faGFuZGxlRXZlbnRzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oYW5kbGVzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oYW5kbGVzKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlKXt2YXIgbixpLHIsbyxzLGEsdSxjPXRoaXMsaD10aGlzLm9wdGlvbnM7cmV0dXJuIWguZGlzYWJsZWQmJih0aGlzLmVsZW1lbnRTaXplPXt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX0sdGhpcy5lbGVtZW50T2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSxuPXt4OmUucGFnZVgseTplLnBhZ2VZfSxpPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShuKSxyPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSsxLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPU1hdGguYWJzKGktYy52YWx1ZXMoZSkpOyhyPm58fHI9PT1uJiYoZT09PWMuX2xhc3RDaGFuZ2VkVmFsdWV8fGMudmFsdWVzKGUpPT09aC5taW4pKSYmKHI9bixvPXQodGhpcykscz1lKX0pLCExIT09dGhpcy5fc3RhcnQoZSxzKSYmKHRoaXMuX21vdXNlU2xpZGluZz0hMCx0aGlzLl9oYW5kbGVJbmRleD1zLHRoaXMuX2FkZENsYXNzKG8sbnVsbCwidWktc3RhdGUtYWN0aXZlIiksby50cmlnZ2VyKCJmb2N1cyIpLGE9by5vZmZzZXQoKSx1PSF0KGUudGFyZ2V0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmlzKCIudWktc2xpZGVyLWhhbmRsZSIpLHRoaXMuX2NsaWNrT2Zmc2V0PXU/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6ZS5wYWdlWC1hLmxlZnQtby53aWR0aCgpLzIsdG9wOmUucGFnZVktYS50b3Atby5oZWlnaHQoKS8yLShwYXJzZUludChvLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChvLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChvLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfHx0aGlzLl9zbGlkZShlLHMsaSksdGhpcy5fYW5pbWF0ZU9mZj0hMCwhMCkpfSxfbW91c2VTdGFydDpmdW5jdGlvbigpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe3ZhciBlPXt4OnQucGFnZVgseTp0LnBhZ2VZfSxuPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShlKTtyZXR1cm4gdGhpcy5fc2xpZGUodCx0aGlzLl9oYW5kbGVJbmRleCxuKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGVzLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKHQsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZSh0LHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj0idmVydGljYWwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG87cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj8oZT10aGlzLmVsZW1lbnRTaXplLndpZHRoLG49dC54LXRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC5sZWZ0OjApKTooZT10aGlzLmVsZW1lbnRTaXplLmhlaWdodCxuPXQueS10aGlzLmVsZW1lbnRPZmZzZXQudG9wLSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC50b3A6MCkpLChpPW4vZSk+MSYmKGk9MSksaTwwJiYoaT0wKSwidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmKGk9MS1pKSxyPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxvPXRoaXMuX3ZhbHVlTWluKCkraSpyLHRoaXMuX3RyaW1BbGlnblZhbHVlKG8pfSxfdWlIYXNoOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSxoYW5kbGVJbmRleDp0LHZhbHVlOnZvaWQgMCE9PWU/ZTp0aGlzLnZhbHVlKCl9O3JldHVybiB0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpJiYoaS52YWx1ZT12b2lkIDAhPT1lP2U6dGhpcy52YWx1ZXModCksaS52YWx1ZXM9bnx8dGhpcy52YWx1ZXMoKSksaX0sX2hhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RofSxfc3RhcnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQsdGhpcy5fdWlIYXNoKGUpKX0sX3NsaWRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyPXRoaXMudmFsdWUoKSxvPXRoaXMudmFsdWVzKCk7dGhpcy5faGFzTXVsdGlwbGVWYWx1ZXMoKSYmKGk9dGhpcy52YWx1ZXMoZT8wOjEpLHI9dGhpcy52YWx1ZXMoZSksMj09PXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYhMD09PXRoaXMub3B0aW9ucy5yYW5nZSYmKG49MD09PWU/TWF0aC5taW4oaSxuKTpNYXRoLm1heChpLG4pKSxvW2VdPW4pLG4hPT1yJiYhMSE9PXRoaXMuX3RyaWdnZXIoInNsaWRlIix0LHRoaXMuX3VpSGFzaChlLG4sbykpJiYodGhpcy5faGFzTXVsdGlwbGVWYWx1ZXMoKT90aGlzLnZhbHVlcyhlLG4pOnRoaXMudmFsdWUobikpfSxfc3RvcDpmdW5jdGlvbih0LGUpe3RoaXMuX3RyaWdnZXIoInN0b3AiLHQsdGhpcy5fdWlIYXNoKGUpKX0sX2NoYW5nZTpmdW5jdGlvbih0LGUpe3RoaXMuX2tleVNsaWRpbmd8fHRoaXMuX21vdXNlU2xpZGluZ3x8KHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9ZSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKGUpKSl9LHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdHJpbUFsaWduVmFsdWUodCksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCB0aGlzLl9jaGFuZ2UobnVsbCwwKSk6dGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGUsbil7dmFyIGkscixvO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc1tlXT10aGlzLl90cmltQWxpZ25WYWx1ZShuKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx2b2lkIHRoaXMuX2NoYW5nZShudWxsLGUpO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighdC5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy5fdmFsdWVzKGUpOnRoaXMudmFsdWUoKTtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLHI9YXJndW1lbnRzWzBdLG89MDtvPGkubGVuZ3RoO28rPTEpaVtvXT10aGlzLl90cmltQWxpZ25WYWx1ZShyW29dKSx0aGlzLl9jaGFuZ2UobnVsbCxvKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLG4pe3ZhciBpLHI9MDtzd2l0Y2goInJhbmdlIj09PWUmJiEwPT09dGhpcy5vcHRpb25zLnJhbmdlJiYoIm1pbiI9PT1uPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1uJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSx0LmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihyPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSx0aGlzLl9zdXBlcihlLG4pLGUpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fcmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLl9hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5vcHRpb25zLnJhbmdlJiZ0aGlzLl9yZWZyZXNoUmFuZ2UobiksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1uPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxpPXItMTtpPj0wO2ktLSl0aGlzLl9jaGFuZ2UobnVsbCxpKTt0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2Uic3RlcCI6Y2FzZSJtaW4iOmNhc2UibWF4Ijp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2NhbGN1bGF0ZU5ld01heCgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJyYW5nZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLl90b2dnbGVDbGFzcyhudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KX0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnZhbHVlO3JldHVybiB0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpfSxfdmFsdWVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saTtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPXRoaXMub3B0aW9ucy52YWx1ZXNbdF0sZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKTtpZih0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpKXtmb3Iobj10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCksaT0wO2k8bi5sZW5ndGg7aSs9MSluW2ldPXRoaXMuX3RyaW1BbGlnblZhbHVlKG5baV0pO3JldHVybiBufXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24odCl7aWYodDw9dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZih0Pj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBlPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxuPSh0LXRoaXMuX3ZhbHVlTWluKCkpJWUsaT10LW47cmV0dXJuIDIqTWF0aC5hYnMobik+PWUmJihpKz1uPjA/ZTotZSkscGFyc2VGbG9hdChpLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm1heCxlPXRoaXMuX3ZhbHVlTWluKCksbj10aGlzLm9wdGlvbnMuc3RlcCxpPU1hdGgucm91bmQoKHQtZSkvbikqbjsodD1pK2UpPnRoaXMub3B0aW9ucy5tYXgmJih0LT1uKSx0aGlzLm1heD1wYXJzZUZsb2F0KHQudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpfSxfcHJlY2lzaW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLnN0ZXApO3JldHVybiBudWxsIT09dGhpcy5vcHRpb25zLm1pbiYmKHQ9TWF0aC5tYXgodCx0aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMubWluKSkpLHR9LF9wcmVjaXNpb25PZjpmdW5jdGlvbih0KXt2YXIgZT10LnRvU3RyaW5nKCksbj1lLmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PW4/MDplLmxlbmd0aC1uLTF9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9LF9yZWZyZXNoUmFuZ2U6ZnVuY3Rpb24odCl7InZlcnRpY2FsIj09PXQmJnRoaXMucmFuZ2UuY3NzKHt3aWR0aDoiIixsZWZ0OiIifSksImhvcml6b250YWwiPT09dCYmdGhpcy5yYW5nZS5jc3Moe2hlaWdodDoiIixib3R0b206IiJ9KX0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBlLG4saSxyLG8scz10aGlzLm9wdGlvbnMucmFuZ2UsYT10aGlzLm9wdGlvbnMsdT10aGlzLGM9IXRoaXMuX2FuaW1hdGVPZmYmJmEuYW5pbWF0ZSxoPXt9O3RoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oaSl7bj0odS52YWx1ZXMoaSktdS5fdmFsdWVNaW4oKSkvKHUuX3ZhbHVlTWF4KCktdS5fdmFsdWVNaW4oKSkqMTAwLGhbImhvcml6b250YWwiPT09dS5vcmllbnRhdGlvbj8ibGVmdCI6ImJvdHRvbSJdPW4rIiUiLHQodGhpcykuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXShoLGEuYW5pbWF0ZSksITA9PT11Lm9wdGlvbnMucmFuZ2UmJigiaG9yaXpvbnRhbCI9PT11Lm9yaWVudGF0aW9uPygwPT09aSYmdS5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtsZWZ0Om4rIiUifSxhLmFuaW1hdGUpLDE9PT1pJiZ1LnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6bi1lKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmEuYW5pbWF0ZX0pKTooMD09PWkmJnUucmFuZ2Uuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXSh7Ym90dG9tOm4rIiUifSxhLmFuaW1hdGUpLDE9PT1pJiZ1LnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0Om4tZSsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjphLmFuaW1hdGV9KSkpLGU9bn0pOihpPXRoaXMudmFsdWUoKSxyPXRoaXMuX3ZhbHVlTWluKCksbz10aGlzLl92YWx1ZU1heCgpLG49byE9PXI/KGktcikvKG8tcikqMTAwOjAsaFsiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09bisiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXShoLGEuYW5pbWF0ZSksIm1pbiI9PT1zJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOm4rIiUifSxhLmFuaW1hdGUpLCJtYXgiPT09cyYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtbisiJSJ9LGEuYW5pbWF0ZSksIm1pbiI9PT1zJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6bisiJSJ9LGEuYW5pbWF0ZSksIm1heCI9PT1zJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLW4rIiUifSxhLmFuaW1hdGUpKX0sX2hhbmRsZUV2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgbixpLHIsbz10KGUudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTpjYXNlIHQudWkua2V5Q29kZS5FTkQ6Y2FzZSB0LnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSB0LnVpLmtleUNvZGUuVVA6Y2FzZSB0LnVpLmtleUNvZGUuUklHSFQ6Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpjYXNlIHQudWkua2V5Q29kZS5MRUZUOmlmKGUucHJldmVudERlZmF1bHQoKSwhdGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITAsdGhpcy5fYWRkQ2xhc3ModChlLnRhcmdldCksbnVsbCwidWktc3RhdGUtYWN0aXZlIiksITE9PT10aGlzLl9zdGFydChlLG8pKSlyZXR1cm59c3dpdGNoKHI9dGhpcy5vcHRpb25zLnN0ZXAsbj1pPXRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy52YWx1ZXMobyk6dGhpcy52YWx1ZSgpLGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTppPXRoaXMuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5EOmk9dGhpcy5fdmFsdWVNYXgoKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX1VQOmk9dGhpcy5fdHJpbUFsaWduVmFsdWUobisodGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046aT10aGlzLl90cmltQWxpZ25WYWx1ZShuLSh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL3RoaXMubnVtUGFnZXMpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLlVQOmNhc2UgdC51aS5rZXlDb2RlLlJJR0hUOmlmKG49PT10aGlzLl92YWx1ZU1heCgpKXJldHVybjtpPXRoaXMuX3RyaW1BbGlnblZhbHVlKG4rcik7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpjYXNlIHQudWkua2V5Q29kZS5MRUZUOmlmKG49PT10aGlzLl92YWx1ZU1pbigpKXJldHVybjtpPXRoaXMuX3RyaW1BbGlnblZhbHVlKG4tcil9dGhpcy5fc2xpZGUoZSxvLGkpfSxrZXl1cDpmdW5jdGlvbihlKXt2YXIgbj10KGUudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7dGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fc3RvcChlLG4pLHRoaXMuX2NoYW5nZShlLG4pLHRoaXMuX3JlbW92ZUNsYXNzKHQoZS50YXJnZXQpLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpKX19fSl9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG87Ci8qIQogKiBqUXVlcnkgVUkgTW91c2UgMS4xMi4xCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqL3I9W24oMTUpLG4oMzQ5KSxuKDQyKSxuKDEzOCldLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiB0KGRvY3VtZW50KS5vbigibW91c2V1cCIsZnVuY3Rpb24oKXtlPSExfSksdC53aWRnZXQoInVpLm1vdXNlIix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOntjYW5jZWw6ImlucHV0LCB0ZXh0YXJlYSwgYnV0dG9uLCBzZWxlY3QsIG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmVsZW1lbnQub24oIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbih0KXtyZXR1cm4gZS5fbW91c2VEb3duKHQpfSkub24oImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKG4pe2lmKCEwPT09dC5kYXRhKG4udGFyZ2V0LGUud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikpcmV0dXJuIHQucmVtb3ZlRGF0YShuLnRhcmdldCxlLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITF9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQub2ZmKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50Lm9mZigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vZmYoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbihuKXtpZighZSl7dGhpcy5fbW91c2VNb3ZlZD0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAobiksdGhpcy5fbW91c2VEb3duRXZlbnQ9bjt2YXIgaT10aGlzLHI9MT09PW4ud2hpY2gsbz0hKCJzdHJpbmciIT10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbHx8IW4udGFyZ2V0Lm5vZGVOYW1lKSYmdChuLnRhcmdldCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuY2FuY2VsKS5sZW5ndGg7cmV0dXJuIShyJiYhbyYmdGhpcy5fbW91c2VDYXB0dXJlKG4pJiYodGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXksdGhpcy5tb3VzZURlbGF5TWV0fHwodGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLm1vdXNlRGVsYXlNZXQ9ITB9LHRoaXMub3B0aW9ucy5kZWxheSkpLHRoaXMuX21vdXNlRGlzdGFuY2VNZXQobikmJnRoaXMuX21vdXNlRGVsYXlNZXQobikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEhPT10aGlzLl9tb3VzZVN0YXJ0KG4pLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpPyhuLnByZXZlbnREZWZhdWx0KCksMCk6KCEwPT09dC5kYXRhKG4udGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJnQucmVtb3ZlRGF0YShuLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tb3VzZU1vdmUodCl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbW91c2VVcCh0KX0sdGhpcy5kb2N1bWVudC5vbigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vbigibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLG4ucHJldmVudERlZmF1bHQoKSxlPSEwLDApKSl9fSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX21vdXNlTW92ZWQpe2lmKHQudWkuaWUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8OSkmJiFlLmJ1dHRvbilyZXR1cm4gdGhpcy5fbW91c2VVcChlKTtpZighZS53aGljaClpZihlLm9yaWdpbmFsRXZlbnQuYWx0S2V5fHxlLm9yaWdpbmFsRXZlbnQuY3RybEtleXx8ZS5vcmlnaW5hbEV2ZW50Lm1ldGFLZXl8fGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSl0aGlzLmlnbm9yZU1pc3NpbmdXaGljaD0hMDtlbHNlIGlmKCF0aGlzLmlnbm9yZU1pc3NpbmdXaGljaClyZXR1cm4gdGhpcy5fbW91c2VVcChlKX1yZXR1cm4oZS53aGljaHx8ZS5idXR0b24pJiYodGhpcy5fbW91c2VNb3ZlZD0hMCksdGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcoZSksZS5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldChlKSYmdGhpcy5fbW91c2VEZWxheU1ldChlKSYmKHRoaXMuX21vdXNlU3RhcnRlZD0hMSE9PXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsZSksdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyhlKTp0aGlzLl9tb3VzZVVwKGUpKSwhdGhpcy5fbW91c2VTdGFydGVkKX0sX21vdXNlVXA6ZnVuY3Rpb24obil7dGhpcy5kb2N1bWVudC5vZmYoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkub2ZmKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLG4udGFyZ2V0PT09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZ0LmRhdGEobi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AobikpLHRoaXMuX21vdXNlRGVsYXlUaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLl9tb3VzZURlbGF5VGltZXIpLGRlbGV0ZSB0aGlzLl9tb3VzZURlbGF5VGltZXIpLHRoaXMuaWdub3JlTWlzc2luZ1doaWNoPSExLGU9ITEsbi5wcmV2ZW50RGVmYXVsdCgpfSxfbW91c2VEaXN0YW5jZU1ldDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVgtdC5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktdC5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pP2kuYXBwbHkoZSxyKTppKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbztyPVtuKDE1KSxuKDQyKV0sdm9pZCAwPT09KG89ImZ1bmN0aW9uIj09dHlwZW9mKGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudWkuaWU9ISEvbXNpZSBbXHcuXSsvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKX0pP2kuYXBwbHkoZSxyKTppKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbzsKLyohCiAqIGpRdWVyeSBVSSBLZXljb2RlIDEuMTIuMQogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKi9yPVtuKDE1KSxuKDQyKV0sdm9pZCAwPT09KG89ImZ1bmN0aW9uIj09dHlwZW9mKGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudWkua2V5Q29kZT17QkFDS1NQQUNFOjgsQ09NTUE6MTg4LERFTEVURTo0NixET1dOOjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixMRUZUOjM3LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU1BBQ0U6MzIsVEFCOjksVVA6Mzh9fSk/aS5hcHBseShlLHIpOmkpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEyKSxzPW4oNiksYT1uKDEzNyksdT1uKDEzOSksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJGbG9hdE1vZGVsIix2YWx1ZTowfSl9LGV9KG8uQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuRmxvYXRNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkJvdW5kZWRGbG9hdE1vZGVsIixtYXg6MTAwLG1pbjowfSl9LGV9KGMpO2UuQm91bmRlZEZsb2F0TW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJGbG9hdFNsaWRlck1vZGVsIixfdmlld19uYW1lOiJGbG9hdFNsaWRlclZpZXciLHN0ZXA6MSxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsX3JhbmdlOiExLHJlYWRvdXQ6ITAscmVhZG91dF9mb3JtYXQ6Ii4yZiIsc2xpZGVyX2NvbG9yOm51bGwsY29udGludW91c191cGRhdGU6ITAsZGlzYWJsZWQ6ITF9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPXUuZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0oaCk7ZS5GbG9hdFNsaWRlck1vZGVsPWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRmxvYXRMb2dTbGlkZXJNb2RlbCIsX3ZpZXdfbmFtZToiRmxvYXRMb2dTbGlkZXJWaWV3IixzdGVwOi4xLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixfcmFuZ2U6ITEscmVhZG91dDohMCxyZWFkb3V0X2Zvcm1hdDoiLjNnIixzbGlkZXJfY29sb3I6bnVsbCxjb250aW51b3VzX3VwZGF0ZTohMCxkaXNhYmxlZDohMSxiYXNlOjEwLHZhbHVlOjEsbWluOjAsbWF4OjR9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPXUuZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0oaCk7ZS5GbG9hdExvZ1NsaWRlck1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShsKTtlLkZsb2F0UmFuZ2VTbGlkZXJNb2RlbD1mO3ZhciBwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlRmxvYXQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl92YWxpZGF0ZV9zbGlkZV92YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZX0oYS5JbnRTbGlkZXJWaWV3KTtlLkZsb2F0U2xpZGVyVmlldz1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlRmxvYXQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJtaW4iKSxpPXRoaXMubW9kZWwuZ2V0KCJtYXgiKSxyPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpLG89dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxzPU1hdGgubG9nKHIpL01hdGgubG9nKG8pO3M+aT9zPWk6czxuJiYocz1uKSx0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIscyksdGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyhyKSx0aGlzLm1vZGVsLmdldCgidmFsdWUiKSE9PXImJih0aGlzLm1vZGVsLnNldCgidmFsdWUiLHIse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpKX0sZS5wcm90b3R5cGUudmFsdWVUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4oMCx0aGlzLm1vZGVsLnJlYWRvdXRfZm9ybWF0dGVyKSh0KX0sZS5wcm90b3R5cGUuc3RyaW5nVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyc2VfdmFsdWUodCl9LGUucHJvdG90eXBlLmhhbmRsZVRleHRDaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0cmluZ1RvVmFsdWUodGhpcy5yZWFkb3V0LnRleHRDb250ZW50KSxlPXRoaXMubW9kZWwuZ2V0KCJtaW4iKSxuPXRoaXMubW9kZWwuZ2V0KCJtYXgiKSxpPXRoaXMubW9kZWwuZ2V0KCJiYXNlIik7aXNOYU4odCk/dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0aGlzLm1vZGVsLmdldCgidmFsdWUiKSk6KHQ9TWF0aC5tYXgoTWF0aC5taW4odCxNYXRoLnBvdyhpLG4pKSxNYXRoLnBvdyhpLGUpKSkhPT10aGlzLm1vZGVsLmdldCgidmFsdWUiKT8odGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0KSx0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpKTp0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxpPU1hdGgucG93KG4sdGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSkpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcoaSksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxpPU1hdGgucG93KG4sdGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSkpO3RoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsaSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCl9LGUucHJvdG90eXBlLl92YWxpZGF0ZV9zbGlkZV92YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZX0oYS5CYXNlSW50U2xpZGVyVmlldyk7ZS5GbG9hdExvZ1NsaWRlclZpZXc9bTt2YXIgZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl9wYXJzZV92YWx1ZT1wYXJzZUZsb2F0LGUuX3JhbmdlX3JlZ2V4PS9eXHMqKFsrLV0/KD86XGQqXC4/XGQrfFxkK1wuKSg/OltlRV1bLTpdP1xkKyk/KVxzKlstOuKAk11ccyooWystXT8oPzpcZCpcLj9cZCt8XGQrXC4pKD86W2VFXVsrLV0/XGQrKT8pLyxlfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlfShhLkludFJhbmdlU2xpZGVyVmlldyk7ZS5GbG9hdFJhbmdlU2xpZGVyVmlldz1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkZsb2F0VGV4dE1vZGVsIixfdmlld19uYW1lOiJGbG9hdFRleHRWaWV3IixkaXNhYmxlZDohMSxjb250aW51b3VzX3VwZGF0ZTohMX0pfSxlfShjKTtlLkZsb2F0VGV4dE1vZGVsPXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQm91bmRlZEZsb2F0VGV4dE1vZGVsIixfdmlld19uYW1lOiJGbG9hdFRleHRWaWV3IixkaXNhYmxlZDohMSxjb250aW51b3VzX3VwZGF0ZTohMSxzdGVwOi4xfSl9LGV9KGgpO2UuQm91bmRlZEZsb2F0VGV4dE1vZGVsPWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcGFyc2VfdmFsdWU9cGFyc2VGbG9hdCxlLl9kZWZhdWx0X3N0ZXA9ImFueSIsZX1yZXR1cm4gcihlLHQpLGV9KGEuSW50VGV4dFZpZXcpO2UuRmxvYXRUZXh0Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkZsb2F0UHJvZ3Jlc3NNb2RlbCIsX3ZpZXdfbmFtZToiUHJvZ3Jlc3NWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsYmFyX3N0eWxlOiIiLHN0eWxlOm51bGx9KX0sZX0oaCk7ZS5GbG9hdFByb2dyZXNzTW9kZWw9X30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9big4KSx1PW4oNiksYz1uKDE2KSxoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkNvbnRyb2xsZXJCdXR0b25Nb2RlbCIsX3ZpZXdfbmFtZToiQ29udHJvbGxlckJ1dHRvblZpZXciLHZhbHVlOjAscHJlc3NlZDohMX0pfSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5Db250cm9sbGVyQnV0dG9uTW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtY29udHJvbGxlci1idXR0b24iKSx0aGlzLnN1cHBvcnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5zdXBwb3J0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5zdXBwb3J0LnN0eWxlLm1hcmdpbj0iMXB4Iix0aGlzLnN1cHBvcnQuc3R5bGUud2lkdGg9IjE2cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5oZWlnaHQ9IjE2cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCBibGFjayIsdGhpcy5zdXBwb3J0LnN0eWxlLmJhY2tncm91bmQ9ImxpZ2h0Z3JheSIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnN1cHBvcnQpLHRoaXMuYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuYmFyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5iYXIuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuYmFyLnN0eWxlLmJvdHRvbT0iMHB4Iix0aGlzLmJhci5zdHlsZS5iYWNrZ3JvdW5kPSJncmF5Iix0aGlzLnN1cHBvcnQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpLHRoaXMudXBkYXRlKCksdGhpcy5sYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmxhYmVsLnRleHRDb250ZW50PXRoaXMubW9kZWwuZ2V0KCJkZXNjcmlwdGlvbiIpLHRoaXMubGFiZWwuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5sYWJlbCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYmFyLnN0eWxlLmhlaWdodD0xMDAqdGhpcy5tb2RlbC5nZXQoInZhbHVlIikrIiUifSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlckJ1dHRvblZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJDb250cm9sbGVyQXhpc01vZGVsIixfdmlld19uYW1lOiJDb250cm9sbGVyQXhpc1ZpZXciLHZhbHVlOjB9KX0sZX0ocy5Db3JlRE9NV2lkZ2V0TW9kZWwpO2UuQ29udHJvbGxlckF4aXNNb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1jb250cm9sbGVyLWF4aXMiKSx0aGlzLmVsLnN0eWxlLndpZHRoPSIxNnB4Iix0aGlzLmVsLnN0eWxlLnBhZGRpbmc9IjRweCIsdGhpcy5zdXBwb3J0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc3VwcG9ydC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3VwcG9ydC5zdHlsZS5tYXJnaW49IjFweCIsdGhpcy5zdXBwb3J0LnN0eWxlLndpZHRoPSI0cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5oZWlnaHQ9IjY0cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCBibGFjayIsdGhpcy5zdXBwb3J0LnN0eWxlLmJhY2tncm91bmQ9ImxpZ2h0Z3JheSIsdGhpcy5idWxsZXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5idWxsZXQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmJ1bGxldC5zdHlsZS5tYXJnaW49Ii00cHgiLHRoaXMuYnVsbGV0LnN0eWxlLndpZHRoPSIxMHB4Iix0aGlzLmJ1bGxldC5zdHlsZS5oZWlnaHQ9IjEwcHgiLHRoaXMuYnVsbGV0LnN0eWxlLmJhY2tncm91bmQ9ImdyYXkiLHRoaXMubGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5sYWJlbC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb24iKSx0aGlzLmxhYmVsLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIix0aGlzLnN1cHBvcnQuYXBwZW5kQ2hpbGQodGhpcy5idWxsZXQpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zdXBwb3J0KSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYnVsbGV0LnN0eWxlLnRvcD01MCoodGhpcy5tb2RlbC5nZXQoInZhbHVlIikrMSkrIiUifSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlckF4aXNWaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQ29udHJvbGxlck1vZGVsIixfdmlld19uYW1lOiJDb250cm9sbGVyVmlldyIsaW5kZXg6MCxuYW1lOiIiLG1hcHBpbmc6IiIsY29ubmVjdGVkOiExLHRpbWVzdGFtcDowLGJ1dHRvbnM6W10sYXhlczpbXX0pfSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUsbil7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSxuKSx2b2lkIDA9PT1uYXZpZ2F0b3IuZ2V0R2FtZXBhZHM/KHRoaXMucmVhZG91dD0iVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZ2FtZXBhZHMuIixjb25zb2xlLmVycm9yKHRoaXMucmVhZG91dCkpOih0aGlzLnJlYWRvdXQ9IkNvbm5lY3QgZ2FtZXBhZCBhbmQgcHJlc3MgYW55IGJ1dHRvbi4iLHRoaXMuZ2V0KCJjb25uZWN0ZWQiKT90aGlzLnVwZGF0ZV9sb29wKCk6dGhpcy53YWl0X2xvb3AoKSl9LGUucHJvdG90eXBlLndhaXRfbG9vcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KCJpbmRleCIpLGU9bmF2aWdhdG9yLmdldEdhbWVwYWRzKClbdF07aWYoZSl7dmFyIG49dGhpczt0aGlzLnNldHVwKGUpLnRoZW4oZnVuY3Rpb24odCl7bi5zZXQodCksbi5zYXZlX2NoYW5nZXMoKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4udXBkYXRlX2xvb3AuYmluZChuKSl9KX1lbHNlIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy53YWl0X2xvb3AuYmluZCh0aGlzKSl9LGUucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHtuYW1lOnQuaWQsbWFwcGluZzp0Lm1hcHBpbmcsY29ubmVjdGVkOnQuY29ubmVjdGVkLHRpbWVzdGFtcDp0LnRpbWVzdGFtcH0pO3ZhciBlPXRoaXM7cmV0dXJuIGMucmVzb2x2ZVByb21pc2VzRGljdCh7YnV0dG9uczpQcm9taXNlLmFsbCh0LmJ1dHRvbnMubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2NyZWF0ZV9idXR0b25fbW9kZWwobil9KSksYXhlczpQcm9taXNlLmFsbCh0LmF4ZXMubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2NyZWF0ZV9heGlzX21vZGVsKG4pfSkpfSl9LGUucHJvdG90eXBlLnVwZGF0ZV9sb29wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImluZGV4IiksZT10aGlzLmdldCgibmFtZSIpLG49bmF2aWdhdG9yLmdldEdhbWVwYWRzKClbdF07biYmdD09PW4uaW5kZXgmJmU9PT1uLmlkPyh0aGlzLnNldCh7dGltZXN0YW1wOm4udGltZXN0YW1wLGNvbm5lY3RlZDpuLmNvbm5lY3RlZH0pLHRoaXMuc2F2ZV9jaGFuZ2VzKCksdGhpcy5nZXQoImJ1dHRvbnMiKS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dC5zZXQoe3ZhbHVlOm4uYnV0dG9uc1tlXS52YWx1ZSxwcmVzc2VkOm4uYnV0dG9uc1tlXS5wcmVzc2VkfSksdC5zYXZlX2NoYW5nZXMoKX0pLHRoaXMuZ2V0KCJheGVzIikuZm9yRWFjaChmdW5jdGlvbih0LGUpe3Quc2V0KCJ2YWx1ZSIsbi5heGVzW2VdKSx0LnNhdmVfY2hhbmdlcygpfSksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZV9sb29wLmJpbmQodGhpcykpKTp0aGlzLnJlc2V0X2dhbWVwYWQoKX0sZS5wcm90b3R5cGUucmVzZXRfZ2FtZXBhZD1mdW5jdGlvbigpe3RoaXMuZ2V0KCJidXR0b25zIikuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNsb3NlKCl9KSx0aGlzLmdldCgiYXhlcyIpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jbG9zZSgpfSksdGhpcy5zZXQoe25hbWU6IiIsbWFwcGluZzoiIixjb25uZWN0ZWQ6ITEsdGltZXN0YW1wOjAsYnV0dG9uczpbXSxheGVzOltdfSksdGhpcy5zYXZlX2NoYW5nZXMoKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMud2FpdF9sb29wLmJpbmQodGhpcykpfSxlLnByb3RvdHlwZS5fY3JlYXRlX2J1dHRvbl9tb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWRnZXRfbWFuYWdlci5uZXdfd2lkZ2V0KHttb2RlbF9uYW1lOiJDb250cm9sbGVyQnV0dG9uTW9kZWwiLG1vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9jb250cm9scyIsbW9kZWxfbW9kdWxlX3ZlcnNpb246dGhpcy5nZXQoIl9tb2RlbF9tb2R1bGVfdmVyc2lvbiIpLHZpZXdfbmFtZToiQ29udHJvbGxlckJ1dHRvblZpZXciLHZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIix2aWV3X21vZHVsZV92ZXJzaW9uOnRoaXMuZ2V0KCJfdmlld19tb2R1bGVfdmVyc2lvbiIpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXQoImRlc2NyaXB0aW9uIix0KSxlfSl9LGUucHJvdG90eXBlLl9jcmVhdGVfYXhpc19tb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWRnZXRfbWFuYWdlci5uZXdfd2lkZ2V0KHttb2RlbF9uYW1lOiJDb250cm9sbGVyQXhpc01vZGVsIixtb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLG1vZGVsX21vZHVsZV92ZXJzaW9uOnRoaXMuZ2V0KCJfbW9kZWxfbW9kdWxlX3ZlcnNpb24iKSx2aWV3X25hbWU6IkNvbnRyb2xsZXJBeGlzVmlldyIsdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLHZpZXdfbW9kdWxlX3ZlcnNpb246dGhpcy5nZXQoIl92aWV3X21vZHVsZV92ZXJzaW9uIil9KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNldCgiZGVzY3JpcHRpb24iLHQpLGV9KX0sZS5zZXJpYWxpemVycz1vKHt9LHMuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHtidXR0b25zOntkZXNlcmlhbGl6ZTphLnVucGFja19tb2RlbHN9LGF4ZXM6e2Rlc2VyaWFsaXplOmEudW5wYWNrX21vZGVsc319KSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5Db250cm9sbGVyTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5idXR0b25fdmlld3M9bmV3IGEuVmlld0xpc3QodGhpcy5hZGRfYnV0dG9uLG51bGwsdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6YnV0dG9ucyIsZnVuY3Rpb24odCxlKXt0aGlzLmJ1dHRvbl92aWV3cy51cGRhdGUoZSl9KSx0aGlzLmF4aXNfdmlld3M9bmV3IGEuVmlld0xpc3QodGhpcy5hZGRfYXhpcyxudWxsLHRoaXMpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmF4ZXMiLGZ1bmN0aW9uKHQsZSl7dGhpcy5heGlzX3ZpZXdzLnVwZGF0ZShlKX0pLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOm5hbWUiLHRoaXMudXBkYXRlX2xhYmVsKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1jb250cm9sbGVyIiksdGhpcy5ib3g9dGhpcy5lbCx0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuYm94LmFwcGVuZENoaWxkKHRoaXMubGFiZWwpLHRoaXMuYXhpc19ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5heGlzX2JveC5zdHlsZS5kaXNwbGF5PSJmbGV4Iix0aGlzLmJveC5hcHBlbmRDaGlsZCh0aGlzLmF4aXNfYm94KSx0aGlzLmJ1dHRvbl9ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5idXR0b25fYm94LnN0eWxlLmRpc3BsYXk9ImZsZXgiLHRoaXMuYm94LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uX2JveCksdGhpcy5idXR0b25fdmlld3MudXBkYXRlKHRoaXMubW9kZWwuZ2V0KCJidXR0b25zIikpLHRoaXMuYXhpc192aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImF4ZXMiKSksdGhpcy51cGRhdGVfbGFiZWwoKX0sZS5wcm90b3R5cGUudXBkYXRlX2xhYmVsPWZ1bmN0aW9uKCl7dGhpcy5sYWJlbC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgibmFtZSIpfHx0aGlzLm1vZGVsLnJlYWRvdXR9LGUucHJvdG90eXBlLmFkZF9idXR0b249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmJ1dHRvbl9ib3guYXBwZW5kQ2hpbGQobiksdGhpcy5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBlLmJ1dHRvbl9ib3gucmVwbGFjZUNoaWxkKHQuZWwsbiksZS5kaXNwbGF5ZWQudGhlbihmdW5jdGlvbigpe3QudHJpZ2dlcigiZGlzcGxheWVkIixlKX0pLHR9KS5jYXRjaChjLnJlamVjdCgiQ291bGQgbm90IGFkZCBidXR0b24gdmlldyIsITApKX0sZS5wcm90b3R5cGUuYWRkX2F4aXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmF4aXNfYm94LmFwcGVuZENoaWxkKG4pLHRoaXMuY3JlYXRlX2NoaWxkX3ZpZXcodCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gZS5heGlzX2JveC5yZXBsYWNlQ2hpbGQodC5lbCxuKSxlLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7dC50cmlnZ2VyKCJkaXNwbGF5ZWQiLGUpfSksdH0pLmNhdGNoKGMucmVqZWN0KCJDb3VsZCBub3QgYWRkIGF4aXMgdmlldyIsITApKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyksdGhpcy5idXR0b25fdmlld3MucmVtb3ZlKCksdGhpcy5heGlzX3ZpZXdzLnJlbW92ZSgpfSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlclZpZXc9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9bigyMyksdT1uKDE2KSxjPW4oNiksaD1uKDE2KSxsPW4oMTUpO3ZhciBkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0aW9uTW9kZWwiLGluZGV4OiIiLF9vcHRpb25zX2xhYmVsczpbXSxkaXNhYmxlZDohMX0pfSxlfShzLkNvcmVEZXNjcmlwdGlvbk1vZGVsKTtlLlNlbGVjdGlvbk1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJEcm9wZG93bk1vZGVsIixfdmlld19uYW1lOiJEcm9wZG93blZpZXciLGJ1dHRvbl9zdHlsZToiIn0pfSxlfShkKTtlLkRyb3Bkb3duTW9kZWw9Zjt2YXIgcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfb3B0aW9uc19sYWJlbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uX3VwZGF0ZU9wdGlvbnMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtZHJvcGRvd24iKSx0aGlzLmxpc3Rib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksdGhpcy5saXN0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj11LnV1aWQoKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMubGlzdGJveCksdGhpcy5fdXBkYXRlT3B0aW9ucygpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlzdGJveC5kaXNhYmxlZD10aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKTt2YXIgZT10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTtyZXR1cm4gdGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXg9bnVsbD09PWU/LTE6ZSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuX3VwZGF0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmxpc3Rib3gudGV4dENvbnRlbnQ9IiI7Zm9yKHZhciB0PXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0saT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnRleHRDb250ZW50PW4ucmVwbGFjZSgvIC9nLCLCoCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIixlbmNvZGVVUklDb21wb25lbnQobikpLGkudmFsdWU9bix0aGlzLmxpc3Rib3guYXBwZW5kQ2hpbGQoaSl9fSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNoYW5nZSBzZWxlY3QiOiJfaGFuZGxlX2NoYW5nZSJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NoYW5nZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuc2V0KCJpbmRleCIsLTE9PT10aGlzLmxpc3Rib3guc2VsZWN0ZWRJbmRleD9udWxsOnRoaXMubGlzdGJveC5zZWxlY3RlZEluZGV4KSx0aGlzLnRvdWNoKCl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLkRyb3Bkb3duVmlldz1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0TW9kZWwiLF92aWV3X25hbWU6IlNlbGVjdFZpZXciLHJvd3M6NX0pfSxlfShkKTtlLlNlbGVjdE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X29wdGlvbnNfbGFiZWxzIixmdW5jdGlvbigpe3JldHVybiBuLl91cGRhdGVPcHRpb25zKCl9KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTppbmRleCIsZnVuY3Rpb24odCxlLGkpe3JldHVybiBuLnVwZGF0ZVNlbGVjdGlvbihpKX0pLHRoaXMubGlzdGJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXNlbGVjdCIpLHRoaXMubGlzdGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9dS51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmxpc3Rib3gpLHRoaXMuX3VwZGF0ZU9wdGlvbnMoKSx0aGlzLnVwZGF0ZSgpLHRoaXMudXBkYXRlU2VsZWN0aW9uKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpLHRoaXMubGlzdGJveC5kaXNhYmxlZD10aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKTt2YXIgZT10aGlzLm1vZGVsLmdldCgicm93cyIpO251bGw9PT1lJiYoZT0iIiksdGhpcy5saXN0Ym94LnNldEF0dHJpYnV0ZSgic2l6ZSIsZSl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10JiYodD17fSksdC51cGRhdGVkX3ZpZXchPT10aGlzKXt2YXIgZT10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTt0aGlzLmxpc3Rib3guc2VsZWN0ZWRJbmRleD1udWxsPT09ZT8tMTplfX0sZS5wcm90b3R5cGUuX3VwZGF0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmxpc3Rib3gudGV4dENvbnRlbnQ9IiI7Zm9yKHZhciB0PXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0saT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnRleHRDb250ZW50PW4ucmVwbGFjZSgvIC9nLCLCoCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIixlbmNvZGVVUklDb21wb25lbnQobikpLGkudmFsdWU9bix0aGlzLmxpc3Rib3guYXBwZW5kQ2hpbGQoaSl9fSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNoYW5nZSBzZWxlY3QiOiJfaGFuZGxlX2NoYW5nZSJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NoYW5nZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuc2V0KCJpbmRleCIsdGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXgse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5TZWxlY3RWaWV3PWc7dmFyIHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJSYWRpb0J1dHRvbnNNb2RlbCIsX3ZpZXdfbmFtZToiUmFkaW9CdXR0b25zVmlldyIsdG9vbHRpcHM6W10saWNvbnM6W10sYnV0dG9uX3N0eWxlOiIifSl9LGV9KGQpO2UuUmFkaW9CdXR0b25zTW9kZWw9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1yYWRpbyIpLHRoaXMuY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpLHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndpZGdldC1yYWRpby1ib3giKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxpPXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxyPWMucGx1Y2sodGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0icmFkaW8iXScpLCJ2YWx1ZSIpLG89aS5sZW5ndGghPXIubGVuZ3RoO2lmKCFvKWZvcih2YXIgcz0wLGE9aS5sZW5ndGg7czxhOysrcylpZihyW3NdIT09aVtzXSl7bz0hMDticmVha31yZXR1cm4hb3x8dm9pZCAwIT09ZSYmZS51cGRhdGVkX3ZpZXc9PT10aGlzfHwodGhpcy5jb250YWluZXIudGV4dENvbnRlbnQ9IiIsaS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtpLnRleHRDb250ZW50PXQsbi5jb250YWluZXIuYXBwZW5kQ2hpbGQoaSk7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksci52YWx1ZT1lLnRvU3RyaW5nKCksci5zZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiLGVuY29kZVVSSUNvbXBvbmVudCh0KSksaS5hcHBlbmRDaGlsZChyKX0pKSxpLmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgaT0naW5wdXRbZGF0YS12YWx1ZT0iJytlbmNvZGVVUklDb21wb25lbnQodCkrJyJdJyxyPW4uY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7aWYoci5sZW5ndGg+MCl7dmFyIG89clswXTtvLmNoZWNrZWQ9bi5tb2RlbC5nZXQoImluZGV4Iik9PT1lLG8uZGlzYWJsZWQ9bi5tb2RlbC5nZXQoImRpc2FibGVkIil9fSksc2V0VGltZW91dCh0aGlzLmFkanVzdFBhZGRpbmcsMCx0aGlzKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5hZGp1c3RQYWRkaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuZWwpLG49cGFyc2VJbnQoZS5tYXJnaW5Ub3ApK3BhcnNlSW50KGUubWFyZ2luQm90dG9tKSxpPXQubGFiZWwub2Zmc2V0SGVpZ2h0K24scj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmNvbnRhaW5lciksbz1wYXJzZUludChyLm1hcmdpbkJvdHRvbSkscz0odC5lbC5vZmZzZXRIZWlnaHQrbi1vKSVpLGE9MD09cz8wOmktczt0LmNvbnRhaW5lci5zdHlsZS5tYXJnaW5Cb3R0b209YSsicHgifSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NsaWNrIGlucHV0W3R5cGU9InJhZGlvIl0nOiJfaGFuZGxlX2NsaWNrIn19LGUucHJvdG90eXBlLl9oYW5kbGVfY2xpY2s9ZnVuY3Rpb24odCl7dGhpcy5tb2RlbC5zZXQoImluZGV4IixwYXJzZUludCh0LnRhcmdldC52YWx1ZSkse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5SYWRpb0J1dHRvbnNWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiVG9nZ2xlQnV0dG9uc1N0eWxlTW9kZWwifSl9LGUuc3R5bGVQcm9wZXJ0aWVzPW8oe30sYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwuc3R5bGVQcm9wZXJ0aWVzLHtidXR0b25fd2lkdGg6e3NlbGVjdG9yOiIud2lkZ2V0LXRvZ2dsZS1idXR0b24iLGF0dHJpYnV0ZToid2lkdGgiLGRlZmF1bHQ6bnVsbH0sZm9udF93ZWlnaHQ6e3NlbGVjdG9yOiIud2lkZ2V0LXRvZ2dsZS1idXR0b24iLGF0dHJpYnV0ZToiZm9udC13ZWlnaHQiLGRlZmF1bHQ6IiJ9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuVG9nZ2xlQnV0dG9uc1N0eWxlTW9kZWw9eTt2YXIgXz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlRvZ2dsZUJ1dHRvbnNNb2RlbCIsX3ZpZXdfbmFtZToiVG9nZ2xlQnV0dG9uc1ZpZXcifSl9LGV9KGQpO2UuVG9nZ2xlQnV0dG9uc01vZGVsPV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3RoaXMuX2Nzc19zdGF0ZT17fSx0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpidXR0b25fc3R5bGUiLHRoaXMudXBkYXRlX2J1dHRvbl9zdHlsZSl9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10b2dnbGUtYnV0dG9ucyIpLHRoaXMuYnV0dG9uZ3JvdXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvbmdyb3VwKSx0aGlzLnVwZGF0ZSgpLHRoaXMuc2V0X2J1dHRvbl9zdHlsZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24obil7Zm9yKHZhciBpPXRoaXMscj10aGlzLm1vZGVsLmdldCgiX29wdGlvbnNfbGFiZWxzIiksbz10aGlzLm1vZGVsLmdldCgiaWNvbnMiKXx8W10scz10aGlzLm1vZGVsLnByZXZpb3VzKCJpY29ucyIpfHxbXSxhPWUuY2xhc3NNYXBbdGhpcy5tb2RlbC5wcmV2aW91cygiYnV0dG9uX3N0eWxlIildfHwiIix1PWkubW9kZWwuZ2V0KCJ0b29sdGlwcyIpfHxbXSxsPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpLGQ9dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSxmPWMucGx1Y2soZCwidmFsdWUiKSxwPSExLG09MCxnPXIubGVuZ3RoO208ZzsrK20paWYoZlttXSE9PXJbbV18fG9bbV0hPT1zW21dKXtwPSEwO2JyZWFrfXJldHVybiFwfHx2b2lkIDAhPT1uJiZuLnVwZGF0ZWRfdmlldz09PXRoaXN8fCh0aGlzLmJ1dHRvbmdyb3VwLnRleHRDb250ZW50PSIiLHIuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuO249MD09PXQudHJpbSgpLmxlbmd0aCYmKCFvW2VdfHwwPT09b1tlXS50cmltKCkubGVuZ3RoKT8iJm5ic3A7IjpoLmVzY2FwZV9odG1sKHQpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO29bZV0mJihyLmNsYXNzTmFtZT0iZmEgZmEtIitvW2VdKSxzLnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpLHMuY2xhc3NOYW1lPSJ3aWRnZXQtdG9nZ2xlLWJ1dHRvbiBqdXB5dGVyLWJ1dHRvbiIsYSYmcy5jbGFzc0xpc3QuYWRkKGEpLHMuaW5uZXJIVE1MPW4scy5zZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiLGVuY29kZVVSSUNvbXBvbmVudCh0KSkscy5zZXRBdHRyaWJ1dGUoInZhbHVlIixlLnRvU3RyaW5nKCkpLHMuYXBwZW5kQ2hpbGQocikscy5kaXNhYmxlZD1sLHVbZV0mJnMuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdVtlXSksaS51cGRhdGVfc3R5bGVfdHJhaXRzKHMpLGkuYnV0dG9uZ3JvdXAuYXBwZW5kQ2hpbGQocyl9KSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49J1tkYXRhLXZhbHVlPSInK2VuY29kZVVSSUNvbXBvbmVudCh0KSsnIl0nLHI9aS5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yKG4pO2kubW9kZWwuZ2V0KCJpbmRleCIpPT09ZT9yLmNsYXNzTGlzdC5hZGQoIm1vZC1hY3RpdmUiKTpyLmNsYXNzTGlzdC5yZW1vdmUoIm1vZC1hY3RpdmUiKX0pLHRoaXMuc3R5bGVQcm9taXNlLnRoZW4oZnVuY3Rpb24odCl7dCYmdC5zdHlsZSgpfSksdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxuKX0sZS5wcm90b3R5cGUudXBkYXRlX3N0eWxlX3RyYWl0cz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fY3NzX3N0YXRlKWlmKHRoaXMuX2Nzc19zdGF0ZS5oYXNPd25Qcm9wZXJ0eShlKSlpZigibWFyZ2luIj09PWUpdGhpcy5idXR0b25ncm91cC5zdHlsZVtlXT10aGlzLl9jc3Nfc3RhdGVbZV07ZWxzZSBpZigid2lkdGgiIT09ZSlpZih0KXQuc3R5bGVbZV09dGhpcy5fY3NzX3N0YXRlW2VdO2Vsc2V7dmFyIG49dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKTtuLmxlbmd0aCYmKG5bMF0uc3R5bGVbZV09dGhpcy5fY3NzX3N0YXRlW2VdKX19LGUucHJvdG90eXBlLnVwZGF0ZV9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSxuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy51cGRhdGVfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc01hcCwiYnV0dG9uX3N0eWxlIix0W25dKX0sZS5wcm90b3R5cGUuc2V0X2J1dHRvbl9zdHlsZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1dHRvbmdyb3VwLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbiIpLG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLnNldF9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzTWFwLCJidXR0b25fc3R5bGUiLHRbbl0pfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNsaWNrIGJ1dHRvbiI6Il9oYW5kbGVfY2xpY2sifX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jbGljaz1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLnNldCgiaW5kZXgiLHBhcnNlSW50KHQudGFyZ2V0LnZhbHVlKSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCksdGhpcy5zZW5kKHtldmVudDoiY2xpY2sifSl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLlRvZ2dsZUJ1dHRvbnNWaWV3PXcsZnVuY3Rpb24odCl7dC5jbGFzc01hcD17cHJpbWFyeTpbIm1vZC1wcmltYXJ5Il0sc3VjY2VzczpbIm1vZC1zdWNjZXNzIl0saW5mbzpbIm1vZC1pbmZvIl0sd2FybmluZzpbIm1vZC13YXJuaW5nIl0sZGFuZ2VyOlsibW9kLWRhbmdlciJdfX0odz1lLlRvZ2dsZUJ1dHRvbnNWaWV3fHwoZS5Ub2dnbGVCdXR0b25zVmlldz17fSkpLGUuVG9nZ2xlQnV0dG9uc1ZpZXc9dzt2YXIgeD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdGlvblNsaWRlck1vZGVsIixfdmlld19uYW1lOiJTZWxlY3Rpb25TbGlkZXJWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmVhZG91dDohMCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShkKTtlLlNlbGVjdGlvblNsaWRlck1vZGVsPXg7dmFyIE09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1oc2xpZGVyIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtc2xpZGVyIiksKHRoaXMuJHNsaWRlcj1sKCI8ZGl2IC8+IikpLnNsaWRlcih7c2xpZGU6dGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UuYmluZCh0aGlzKSxzdG9wOnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZC5iaW5kKHRoaXMpfSkuYWRkQ2xhc3MoInNsaWRlciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWRlcl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgic2xpZGVyLWNvbnRhaW5lciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzbGlkZXJbMF0pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJfY29udGFpbmVyKSx0aGlzLnJlYWRvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtcmVhZG91dCIpLHRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpzbGlkZXJfY29sb3IiLGZ1bmN0aW9uKHQsbil7ZS4kc2xpZGVyLmZpbmQoImEiKS5jc3MoImJhY2tncm91bmQiLG4pfSksdGhpcy4kc2xpZGVyLmZpbmQoImEiKS5jc3MoImJhY2tncm91bmQiLHRoaXMubW9kZWwuZ2V0KCJzbGlkZXJfY29sb3IiKSksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWV8fGUudXBkYXRlZF92aWV3IT09dGhpcyl7dmFyIG49dGhpcy5tb2RlbC5nZXQoIl9vcHRpb25zX2xhYmVscyIpLmxlbmd0aC0xO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInN0ZXAiLDEpLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm1heCIsbiksdGhpcy4kc2xpZGVyLnNsaWRlcigib3B0aW9uIiwibWluIiwwKTt2YXIgaT10aGlzLm1vZGVsLmdldCgib3JpZW50YXRpb24iKTt0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIsMCksdGhpcy4kc2xpZGVyLnNsaWRlcigib3B0aW9uIiwib3JpZW50YXRpb24iLGkpO3ZhciByPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsImRpc2FibGVkIixyKSx0aGlzLnJlYWRvdXQuY29udGVudEVkaXRhYmxlPXI/ImZhbHNlIjoidHJ1ZSIsInZlcnRpY2FsIj09PWk/KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWhzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXZzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtdmJveCIpKToodGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtdnNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS12Ym94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IikpO3ZhciBvPXRoaXMubW9kZWwuZ2V0KCJyZWFkb3V0Iik7dGhpcy5yZWFkb3V0LnN0eWxlLmRpc3BsYXk9bz8iIjoibm9uZSIsdGhpcy51cGRhdGVTZWxlY3Rpb24oKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlOiJoYW5kbGVTbGlkZXJDaGFuZ2UiLHNsaWRlc3RvcDoiaGFuZGxlU2xpZGVyQ2hhbmdlZCJ9fSxlLnByb3RvdHlwZS51cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTt0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIsdCksdGhpcy51cGRhdGVSZWFkb3V0KHQpfSxlLnByb3RvdHlwZS51cGRhdGVSZWFkb3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKVt0XTt0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9ZX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlPWZ1bmN0aW9uKHQsZSl7dGhpcy51cGRhdGVSZWFkb3V0KGUudmFsdWUpLHRoaXMubW9kZWwuZ2V0KCJjb250aW51b3VzX3VwZGF0ZSIpJiZ0aGlzLmhhbmRsZVNsaWRlckNoYW5nZWQodCxlKX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlZD1mdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlUmVhZG91dChlLnZhbHVlKSx0aGlzLm1vZGVsLnNldCgiaW5kZXgiLGUudmFsdWUse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5TZWxlY3Rpb25TbGlkZXJWaWV3PU07dmFyIFM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJNdWx0aXBsZVNlbGVjdGlvbk1vZGVsIn0pfSxlfShkKTtlLk11bHRpcGxlU2VsZWN0aW9uTW9kZWw9Uzt2YXIgRT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdE11bHRpcGxlTW9kZWwiLF92aWV3X25hbWU6IlNlbGVjdE11bHRpcGxlVmlldyIscm93czpudWxsfSl9LGV9KFMpO2UuU2VsZWN0TXVsdGlwbGVNb2RlbD1FO3ZhciBBPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3Rib3gubXVsdGlwbGU9ITB9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXNlbGVjdC1tdWx0aXBsZSIpfSxlLnByb3RvdHlwZS51cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9e30pLHQudXBkYXRlZF92aWV3IT09dGhpcyl7dmFyIGU9dGhpcy5tb2RlbC5nZXQoImluZGV4Iil8fFtdLG49dGhpcy5saXN0Ym94Lm9wdGlvbnM7dGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXg9LTEsZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF0uc2VsZWN0ZWQ9ITB9KX19LGUucHJvdG90eXBlLl9oYW5kbGVfY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHRoaXMubGlzdGJveC5zZWxlY3RlZE9wdGlvbnN8fFtdLGZ1bmN0aW9uKHQpe3JldHVybiB0LmluZGV4fSk7dGhpcy5tb2RlbC5zZXQoImluZGV4Iix0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0oZyk7ZS5TZWxlY3RNdWx0aXBsZVZpZXc9QTt2YXIgQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdGlvblNsaWRlck1vZGVsIixfdmlld19uYW1lOiJTZWxlY3Rpb25TbGlkZXJWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmVhZG91dDohMCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShTKTtlLlNlbGVjdGlvblJhbmdlU2xpZGVyTW9kZWw9Qzt2YXIgaz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInJhbmdlIiwhMCl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJpbmRleCIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlcyIsdC5zbGljZSgpKSx0aGlzLnVwZGF0ZVJlYWRvdXQodCl9LGUucHJvdG90eXBlLnVwZGF0ZVJlYWRvdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbC5nZXQoIl9vcHRpb25zX2xhYmVscyIpLG49ZVt0WzBdXSxpPWVbdFsxXV07dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PW4rIi0iK2l9LGUucHJvdG90eXBlLmhhbmRsZVNsaWRlckNoYW5nZT1mdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlUmVhZG91dChlLnZhbHVlcyksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dGhpcy51cGRhdGVSZWFkb3V0KGUudmFsdWVzKSx0aGlzLm1vZGVsLnNldCgiaW5kZXgiLGUudmFsdWVzLnNsaWNlKCkse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShNKTtlLlNlbGVjdGlvblJhbmdlU2xpZGVyVmlldz1rfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDgpLHM9bigxMzYpLGE9bigzNTUpLHU9bigzNTYpLGM9bigzOSksaD1uKDIpLGw9big1KSxkPW4oNiksZj1uKDE2KSxwPW4oMTUpLG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0aW9uQ29udGFpbmVyTW9kZWwiLHNlbGVjdGVkX2luZGV4OjAsX3RpdGxlczp7fX0pfSxlfShzLkJveE1vZGVsKTtlLlNlbGVjdGlvbkNvbnRhaW5lck1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQWNjb3JkaW9uTW9kZWwiLF92aWV3X25hbWU6IkFjY29yZGlvblZpZXcifSl9LGV9KG0pO2UuQWNjb3JkaW9uTW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXRoaXMsaT1lLnZpZXc7cmV0dXJuIGRlbGV0ZSBlLnZpZXcsKG49dC5jYWxsKHRoaXMsZSl8fHRoaXMpLl92aWV3PWksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlLmNhbGwodGhpcyxlKSx0aGlzLl92aWV3LnByb2Nlc3NQaG9zcGhvck1lc3NhZ2UoZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlfSh1LkFjY29yZGlvbik7ZS5KdXB5dGVyUGhvc3Bob3JBY2NvcmRpb25XaWRnZXQ9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBXaWRnZXQ9bmV3IHYoe3ZpZXc6dGhpc30pLHRoaXMucFdpZGdldC5ub2RlfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLmVsfHx0IT09dGhpcy5wV2lkZ2V0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzZXQgdGhlIERPTSBlbGVtZW50LiIpO3RoaXMuZWw9dGhpcy5wV2lkZ2V0Lm5vZGUsdGhpcy4kZWw9cCh0aGlzLnBXaWRnZXQubm9kZSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuX3ZpZXdzPW5ldyBvLlZpZXdMaXN0KHRoaXMuYWRkX2NoaWxkX3ZpZXcsdGhpcy5yZW1vdmVfY2hpbGRfdmlldyx0aGlzKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpjaGlsZHJlbiIsZnVuY3Rpb24oKXtyZXR1cm4gbi51cGRhdGVDaGlsZHJlbigpfSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6c2VsZWN0ZWRfaW5kZXgiLGZ1bmN0aW9uKCl7cmV0dXJuIG4udXBkYXRlX3NlbGVjdGVkX2luZGV4KCl9KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfdGl0bGVzIixmdW5jdGlvbigpe3JldHVybiBuLnVwZGF0ZV90aXRsZXMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpO3ZhciBuPXRoaXMucFdpZGdldDtuLmFkZENsYXNzKCJqdXB5dGVyLXdpZGdldHMiKSxuLmFkZENsYXNzKCJ3aWRnZXQtYWNjb3JkaW9uIiksbi5hZGRDbGFzcygid2lkZ2V0LWNvbnRhaW5lciIpLG4uc2VsZWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQuY29ubmVjdChmdW5jdGlvbih0KXtlLnVwZGF0aW5nQ2hpbGRyZW58fChlLm1vZGVsLnNldCgic2VsZWN0ZWRfaW5kZXgiLG4uc2VsZWN0aW9uLmluZGV4KSxlLnRvdWNoKCkpfSksdGhpcy5jaGlsZHJlbl92aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImNoaWxkcmVuIikpLHRoaXMudXBkYXRlX3RpdGxlcygpLHRoaXMudXBkYXRlX3NlbGVjdGVkX2luZGV4KCl9LGUucHJvdG90eXBlLnVwZGF0ZUNoaWxkcmVuPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGluZ0NoaWxkcmVuPSEwLHRoaXMucFdpZGdldC5zZWxlY3Rpb24uaW5kZXg9bnVsbCx0aGlzLmNoaWxkcmVuX3ZpZXdzLnVwZGF0ZSh0aGlzLm1vZGVsLmdldCgiY2hpbGRyZW4iKSksdGhpcy51cGRhdGVfc2VsZWN0ZWRfaW5kZXgoKSx0aGlzLnVwZGF0aW5nQ2hpbGRyZW49ITF9LGUucHJvdG90eXBlLnVwZGF0ZV90aXRsZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5wV2lkZ2V0LmNvbGxhcHNlV2lkZ2V0cyxlPXRoaXMubW9kZWwuZ2V0KCJfdGl0bGVzIiksbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMCE9PWVbbl0mJih0W25dLndpZGdldC50aXRsZS5sYWJlbD1lW25dKX0sZS5wcm90b3R5cGUudXBkYXRlX3NlbGVjdGVkX2luZGV4PWZ1bmN0aW9uKCl7dGhpcy5wV2lkZ2V0LnNlbGVjdGlvbi5pbmRleD10aGlzLm1vZGVsLmdldCgic2VsZWN0ZWRfaW5kZXgiKX0sZS5wcm90b3R5cGUucmVtb3ZlX2NoaWxkX3ZpZXc9ZnVuY3Rpb24odCl7dGhpcy5wV2lkZ2V0LnJlbW92ZVdpZGdldCh0LnBXaWRnZXQpLHQucmVtb3ZlKCl9LGUucHJvdG90eXBlLmFkZF9jaGlsZF92aWV3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wV2lkZ2V0LGk9bmV3IGMuV2lkZ2V0O3JldHVybiBpLnRpdGxlLmxhYmVsPXRoaXMubW9kZWwuZ2V0KCJfdGl0bGVzIilbZV18fCIiLG4uYWRkV2lkZ2V0KGkpLHRoaXMuY3JlYXRlX2NoaWxkX3ZpZXcodCkudGhlbihmdW5jdGlvbih0KXt2YXIgZT10LnBXaWRnZXQ7cmV0dXJuIGUudGl0bGUubGFiZWw9aS50aXRsZS5sYWJlbCxuLmNvbGxhcHNlV2lkZ2V0c1tuLmluZGV4T2YoaSldLndpZGdldD1lLGkuZGlzcG9zZSgpLHR9KS5jYXRjaChmLnJlamVjdCgiQ291bGQgbm90IGFkZCBjaGlsZCB2aWV3IHRvIGJveCIsITApKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbl92aWV3cz1udWxsLHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpfSxlfShvLkRPTVdpZGdldFZpZXcpO2UuQWNjb3JkaW9uVmlldz1iO3ZhciB5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlRhYk1vZGVsIixfdmlld19uYW1lOiJUYWJWaWV3In0pfSxlfShtKTtlLlRhYk1vZGVsPXk7dmFyIF89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10aGlzLGk9ZS52aWV3O3JldHVybiBkZWxldGUgZS52aWV3LChuPXQuY2FsbCh0aGlzLGUpfHx0aGlzKS5fdmlldz1pLGwuTWVzc2FnZUxvb3AuaW5zdGFsbE1lc3NhZ2VIb29rKG4udGFiQ29udGVudHMsZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpLCEwfSksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlfShhLlRhYlBhbmVsKTtlLkp1cHl0ZXJQaG9zcGhvclRhYlBhbmVsV2lkZ2V0PV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS51cGRhdGluZ1RhYnM9ITEsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBXaWRnZXQ9bmV3IF8oe3ZpZXc6dGhpc30pLHRoaXMucFdpZGdldC5ub2RlfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLmVsfHx0IT09dGhpcy5wV2lkZ2V0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzZXQgdGhlIERPTSBlbGVtZW50LiIpO3RoaXMuZWw9dGhpcy5wV2lkZ2V0Lm5vZGUsdGhpcy4kZWw9cCh0aGlzLnBXaWRnZXQubm9kZSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuVmlld3M9bmV3IG8uVmlld0xpc3QodGhpcy5hZGRDaGlsZFZpZXcsZnVuY3Rpb24odCl7dC5yZW1vdmUoKX0sdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6Y2hpbGRyZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4udXBkYXRlVGFicygpfSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X3RpdGxlcyIsZnVuY3Rpb24oKXtyZXR1cm4gbi51cGRhdGVUaXRsZXMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKTt2YXIgZT10aGlzLnBXaWRnZXQ7ZS5hZGRDbGFzcygianVweXRlci13aWRnZXRzIiksZS5hZGRDbGFzcygid2lkZ2V0LWNvbnRhaW5lciIpLGUuYWRkQ2xhc3MoIndpZGdldC10YWIiKSxlLnRhYnNNb3ZhYmxlPSEwLGUudGFiQmFyLmluc2VydEJlaGF2aW9yPSJub25lIixlLnRhYkJhci5jdXJyZW50Q2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGFiQ2hhbmdlZCx0aGlzKSxlLnRhYkJhci50YWJNb3ZlZC5jb25uZWN0KHRoaXMuX29uVGFiTW92ZWQsdGhpcyksZS50YWJCYXIuYWRkQ2xhc3MoIndpZGdldC10YWItYmFyIiksZS50YWJDb250ZW50cy5hZGRDbGFzcygid2lkZ2V0LXRhYi1jb250ZW50cyIpLGUudGFiQmFyLnRhYnNNb3ZhYmxlPSExLHRoaXMudXBkYXRlVGFicygpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZVRhYnM9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0aW5nVGFicz0hMCx0aGlzLnBXaWRnZXQuY3VycmVudEluZGV4PW51bGwsdGhpcy5jaGlsZHJlblZpZXdzLnVwZGF0ZSh0aGlzLm1vZGVsLmdldCgiY2hpbGRyZW4iKSksdGhpcy5wV2lkZ2V0LmN1cnJlbnRJbmRleD10aGlzLm1vZGVsLmdldCgic2VsZWN0ZWRfaW5kZXgiKSx0aGlzLnVwZGF0aW5nVGFicz0hMX0sZS5wcm90b3R5cGUuYWRkQ2hpbGRWaWV3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoIl90aXRsZXMiKVtlXXx8IiIsaT10aGlzLnBXaWRnZXQscj1uZXcgYy5XaWRnZXQ7cmV0dXJuIHIudGl0bGUubGFiZWw9bixpLmFkZFdpZGdldChyKSx0aGlzLmNyZWF0ZV9jaGlsZF92aWV3KHQpLnRoZW4oZnVuY3Rpb24odCl7dmFyIGU9dC5wV2lkZ2V0O2UudGl0bGUubGFiZWw9ci50aXRsZS5sYWJlbCxlLnRpdGxlLmNsb3NhYmxlPSExO3ZhciBuPWguQXJyYXlFeHQuZmlyc3RJbmRleE9mKGkud2lkZ2V0cyxyKTtyZXR1cm4gaS5pbnNlcnRXaWRnZXQobisxLGUpLHIuZGlzcG9zZSgpLHR9KS5jYXRjaChmLnJlamVjdCgiQ291bGQgbm90IGFkZCBjaGlsZCB2aWV3IHRvIGJveCIsITApKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleCgpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS51cGRhdGVUaXRsZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiX3RpdGxlcyIpfHx7fTtoLmVhY2godGhpcy5wV2lkZ2V0LndpZGdldHMsZnVuY3Rpb24oZSxuKXtlLnRpdGxlLmxhYmVsPXRbbl18fCIifSl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24oKXt0aGlzLnBXaWRnZXQuY3VycmVudEluZGV4PXRoaXMubW9kZWwuZ2V0KCJzZWxlY3RlZF9pbmRleCIpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkcmVuVmlld3M9bnVsbCx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuX29uVGFiQ2hhbmdlZD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLnVwZGF0aW5nVGFicyl7dmFyIG49ZS5jdXJyZW50SW5kZXg7dGhpcy5tb2RlbC5zZXQoInNlbGVjdGVkX2luZGV4IiwtMT09PW4/bnVsbDpuKSx0aGlzLnRvdWNoKCl9fSxlLnByb3RvdHlwZS5fb25UYWJNb3ZlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJjaGlsZHJlbiIpLnNsaWNlKCk7aC5BcnJheUV4dC5tb3ZlKG4sZS5mcm9tSW5kZXgsZS50b0luZGV4KSx0aGlzLm1vZGVsLnNldCgiY2hpbGRyZW4iLG4pLHRoaXMudG91Y2goKX0sZX0oby5ET01XaWRnZXRWaWV3KTtlLlRhYlZpZXc9d30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big1KSxzPW4oMTEpLGE9big5KSx1PW4oMzkpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fd2lkZ2V0UmVtb3ZlZD1uZXcgcy5TaWduYWwoZSksZX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0UmVtb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRSZW1vdmVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm9uQ2hpbGRSZW1vdmVkPWZ1bmN0aW9uKHQpe3RoaXMuX3dpZGdldFJlbW92ZWQuZW1pdCh0LmNoaWxkKX0sZX0odS5QYW5lbCk7ZS5FdmVudGVkUGFuZWw9Yzt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fY3VycmVudENoYW5nZWQ9bmV3IHMuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtVGFiUGFuZWwiKSxuLnRhYkJhcj1uZXcgdS5UYWJCYXIoZSksbi50YWJCYXIuYWRkQ2xhc3MoInAtVGFiUGFuZWwtdGFiQmFyIiksbi50YWJDb250ZW50cz1uZXcgYyxuLnRhYkNvbnRlbnRzLmFkZENsYXNzKCJwLVRhYlBhbmVsLXRhYkNvbnRlbnRzIiksbi50YWJCYXIudGFiTW92ZWQuY29ubmVjdChuLl9vblRhYk1vdmVkLG4pLG4udGFiQmFyLmN1cnJlbnRDaGFuZ2VkLmNvbm5lY3Qobi5fb25DdXJyZW50Q2hhbmdlZCxuKSxuLnRhYkJhci50YWJDbG9zZVJlcXVlc3RlZC5jb25uZWN0KG4uX29uVGFiQ2xvc2VSZXF1ZXN0ZWQsbiksbi50YWJCYXIudGFiQWN0aXZhdGVSZXF1ZXN0ZWQuY29ubmVjdChuLl9vblRhYkFjdGl2YXRlUmVxdWVzdGVkLG4pLG4udGFiQ29udGVudHMud2lkZ2V0UmVtb3ZlZC5jb25uZWN0KG4uX29uV2lkZ2V0UmVtb3ZlZCxuKTt2YXIgaT1uZXcgdS5QYW5lbExheW91dDtyZXR1cm4gaS5hZGRXaWRnZXQobi50YWJCYXIpLGkuYWRkV2lkZ2V0KG4udGFiQ29udGVudHMpLG4ubGF5b3V0PWksbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRhYkJhci5jdXJyZW50SW5kZXg7cmV0dXJuLTE9PT10P251bGw6dH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLmN1cnJlbnRJbmRleD1udWxsPT09dD8tMTp0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudFdpZGdldCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudGFiQmFyLmN1cnJlbnRUaXRsZTtyZXR1cm4gdD90Lm93bmVyOm51bGx9LHNldDpmdW5jdGlvbih0KXt0aGlzLnRhYkJhci5jdXJyZW50VGl0bGU9dD90LnRpdGxlOm51bGx9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJzTW92YWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYkJhci50YWJzTW92YWJsZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLnRhYnNNb3ZhYmxlPXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ3aWRnZXRzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiQ29udGVudHMud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRXaWRnZXQodGhpcy53aWRnZXRzLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0V2lkZ2V0PWZ1bmN0aW9uKHQsZSl7ZSE9PXRoaXMuY3VycmVudFdpZGdldCYmZS5oaWRlKCksdGhpcy50YWJDb250ZW50cy5pbnNlcnRXaWRnZXQodCxlKSx0aGlzLnRhYkJhci5pbnNlcnRUYWIodCxlLnRpdGxlKX0sZS5wcm90b3R5cGUuX29uQ3VycmVudENoYW5nZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnByZXZpb3VzSW5kZXgsaT1lLnByZXZpb3VzVGl0bGUscj1lLmN1cnJlbnRJbmRleCxzPWUuY3VycmVudFRpdGxlLHU9aT9pLm93bmVyOm51bGwsYz1zP3Mub3duZXI6bnVsbDt1JiZ1LmhpZGUoKSxjJiZjLnNob3coKSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNXaWRnZXQ6dSxjdXJyZW50SW5kZXg6cixjdXJyZW50V2lkZ2V0OmN9KSwoYS5QbGF0Zm9ybS5JU19FREdFfHxhLlBsYXRmb3JtLklTX0lFKSYmby5NZXNzYWdlTG9vcC5mbHVzaCgpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy50YWJDb250ZW50cy5pbnNlcnRXaWRnZXQoZS50b0luZGV4LGUudGl0bGUub3duZXIpfSxlLnByb3RvdHlwZS5fb25XaWRnZXRSZW1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy50YWJCYXIucmVtb3ZlVGFiKGUudGl0bGUpfSxlfSh1LldpZGdldCk7ZS5UYWJQYW5lbD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDIpLHM9bigxMSksYT1uKDM5KSx1PW4oMzU3KSxjPSJwLUNvbGxhcHNlIixoPSJwLUNvbGxhcHNlLWhlYWRlciIsbD0icC1Db2xsYXBzZS1jb250ZW50cyIsZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24uX2NvbGxhcHNlQ2hhbmdlZD1uZXcgcy5TaWduYWwobiksbi5hZGRDbGFzcyhjKSxuLl9oZWFkZXI9bmV3IGEuV2lkZ2V0LG4uX2hlYWRlci5hZGRDbGFzcyhoKSxuLl9oZWFkZXIubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsbiksbi5fY29udGVudD1uZXcgYS5QYW5lbCxuLl9jb250ZW50LmFkZENsYXNzKGwpO3ZhciBpPW5ldyBhLlBhbmVsTGF5b3V0O3JldHVybiBuLmxheW91dD1pLGkuYWRkV2lkZ2V0KG4uX2hlYWRlciksaS5hZGRXaWRnZXQobi5fY29udGVudCksZS53aWRnZXQmJihuLndpZGdldD1lLndpZGdldCksbi5jb2xsYXBzZWQ9ITEsbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5faGVhZGVyPW51bGwsdGhpcy5fd2lkZ2V0PW51bGwsdGhpcy5fY29udGVudD1udWxsKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ3aWRnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkZ2V0fSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fd2lkZ2V0O2UmJihlLmRpc3Bvc2VkLmRpc2Nvbm5lY3QodGhpcy5fb25DaGlsZERpc3Bvc2VkLHRoaXMpLGUudGl0bGUuY2hhbmdlZC5kaXNjb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLGUucGFyZW50PW51bGwpLHRoaXMuX3dpZGdldD10LHQuZGlzcG9zZWQuY29ubmVjdCh0aGlzLl9vbkNoaWxkRGlzcG9zZWQsdGhpcyksdC50aXRsZS5jaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25UaXRsZUNoYW5nZWQsdGhpcyksdGhpcy5fb25UaXRsZUNoYW5nZWQodC50aXRsZSksdGhpcy5fY29udGVudC5hZGRXaWRnZXQodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sbGFwc2VkfSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMuX2NvbGxhcHNlZCYmKHQ/dGhpcy5fY29sbGFwc2UoKTp0aGlzLl91bmNvbGxhcHNlKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbigpe3RoaXMuY29sbGFwc2VkPSF0aGlzLmNvbGxhcHNlZH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZUNoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sbGFwc2VDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9jb2xsYXBzZT1mdW5jdGlvbigpe3RoaXMuX2NvbGxhcHNlZD0hMCx0aGlzLl9jb250ZW50JiZ0aGlzLl9jb250ZW50LmhpZGUoKSx0aGlzLnJlbW92ZUNsYXNzKCJwLUNvbGxhcHNlLW9wZW4iKSx0aGlzLl9jb2xsYXBzZUNoYW5nZWQuZW1pdCh2b2lkIDApfSxlLnByb3RvdHlwZS5fdW5jb2xsYXBzZT1mdW5jdGlvbigpe3RoaXMuX2NvbGxhcHNlZD0hMSx0aGlzLl9jb250ZW50JiZ0aGlzLl9jb250ZW50LnNob3coKSx0aGlzLmFkZENsYXNzKCJwLUNvbGxhcHNlLW9wZW4iKSx0aGlzLl9jb2xsYXBzZUNoYW5nZWQuZW1pdCh2b2lkIDApfSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlImNsaWNrIjp0aGlzLl9ldnRDbGljayh0KX19LGUucHJvdG90eXBlLl9ldnRDbGljaz1mdW5jdGlvbih0KXt0aGlzLnRvZ2dsZSgpfSxlLnByb3RvdHlwZS5fb25UaXRsZUNoYW5nZWQ9ZnVuY3Rpb24odCl7dGhpcy5faGVhZGVyLm5vZGUudGV4dENvbnRlbnQ9dGhpcy5fd2lkZ2V0LnRpdGxlLmxhYmVsfSxlLnByb3RvdHlwZS5fb25DaGlsZERpc3Bvc2VkPWZ1bmN0aW9uKHQpe3RoaXMuZGlzcG9zZSgpfSxlfShhLldpZGdldCk7ZS5Db2xsYXBzZT1kO3ZhciBmPSJwLUFjY29yZGlvbiIscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9zZWxlY3Rpb249bmV3IHUuU2VsZWN0aW9uKG4ud2lkZ2V0cyksbi5fc2VsZWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQuY29ubmVjdChuLl9vblNlbGVjdGlvbkNoYW5nZWQsbiksbi5hZGRDbGFzcyhmKSxufXJldHVybiByKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZVdpZGdldHMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNlbGVjdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb259LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gby5BcnJheUV4dC5maW5kRmlyc3RJbmRleCh0aGlzLmNvbGxhcHNlV2lkZ2V0cyxmdW5jdGlvbihlKXtyZXR1cm4gZS53aWRnZXQ9PT10fSl9LGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl93cmFwV2lkZ2V0KGUpO3JldHVybiBuLmNvbGxhcHNlZD0hMCx0LnByb3RvdHlwZS5hZGRXaWRnZXQuY2FsbCh0aGlzLG4pLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQodGhpcy53aWRnZXRzLmxlbmd0aC0xLG4pLG59LGUucHJvdG90eXBlLmluc2VydFdpZGdldD1mdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMuX3dyYXBXaWRnZXQobik7aS5jb2xsYXBzZWQ9ITAsdC5wcm90b3R5cGUuaW5zZXJ0V2lkZ2V0LmNhbGwodGhpcyxlLGkpLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQoZSxpKX0sZS5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5kZXhPZih0KTtpZihlPj0wKXt2YXIgbj10aGlzLmNvbGxhcHNlV2lkZ2V0c1tlXTt0LnBhcmVudD1udWxsLG4uZGlzcG9zZSgpLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JSZW1vdmUoZSxudWxsKX19LGUucHJvdG90eXBlLl93cmFwV2lkZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBkKHt3aWRnZXQ6dH0pO3JldHVybiBlLmFkZENsYXNzKCJwLUFjY29yZGlvbi1jaGlsZCIpLGUuY29sbGFwc2VDaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25Db2xsYXBzZUNoYW5nZSx0aGlzKSxlfSxlLnByb3RvdHlwZS5fb25Db2xsYXBzZUNoYW5nZT1mdW5jdGlvbih0KXt0LmNvbGxhcHNlZD90aGlzLl9zZWxlY3Rpb24udmFsdWU9PT10JiZ0LmNvbGxhcHNlZCYmKHRoaXMuX3NlbGVjdGlvbi52YWx1ZT1udWxsKTp0aGlzLl9zZWxlY3Rpb24udmFsdWU9dH0sZS5wcm90b3R5cGUuX29uU2VsZWN0aW9uQ2hhbmdlZD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldmlvdXNWYWx1ZSxpPWUuY3VycmVudFZhbHVlO24mJihuLmNvbGxhcHNlZD0hMCxuLnJlbW92ZUNsYXNzKCJwLUFjY29yZGlvbi1jaGlsZC1hY3RpdmUiKSksaSYmKGkuY29sbGFwc2VkPSExLGkuYWRkQ2xhc3MoInAtQWNjb3JkaW9uLWNoaWxkLWFjdGl2ZSIpKX0sZX0oYS5QYW5lbCk7ZS5BY2NvcmRpb249cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPW4oMTEpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pLHRoaXMuX2FycmF5PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZD1uZXcgci5TaWduYWwodGhpcyksdGhpcy5fYXJyYXk9dCx0aGlzLl9pbnNlcnRCZWhhdmlvcj1lLmluc2VydEJlaGF2aW9yfHwic2VsZWN0LWl0ZW0taWYtbmVlZGVkIix0aGlzLl9yZW1vdmVCZWhhdmlvcj1lLnJlbW92ZUJlaGF2aW9yfHwic2VsZWN0LWl0ZW0tYWZ0ZXIifXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInNlbGVjdGlvbkNoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JTZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbmRleCxuPXRoaXMudmFsdWU7aWYodD09PWUpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKTt2YXIgaT10aGlzLnZhbHVlO3RoaXMuX3ByZXZpb3VzVmFsdWU9bnVsbCxuIT09aSYmdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OmUscHJldmlvdXNWYWx1ZTpuLGN1cnJlbnRJbmRleDplLGN1cnJlbnRWYWx1ZTppfSl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInZhbHVlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pbmRleD1udWxsPT09dD9udWxsOmkuQXJyYXlFeHQuZmlyc3RJbmRleE9mKHRoaXMuX2FycmF5LHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kZXh9LHNldDpmdW5jdGlvbih0KXt2YXIgZTtpZihudWxsIT09dD8oKGU9TWF0aC5mbG9vcih0KSk8MHx8ZT49dGhpcy5fYXJyYXkubGVuZ3RoKSYmKGU9bnVsbCk6ZT1udWxsLHRoaXMuX2luZGV4IT09ZSl7dmFyIG49dGhpcy5faW5kZXgsaT10aGlzLl92YWx1ZTt0aGlzLl9pbmRleD1lLHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKSx0aGlzLl9wcmV2aW91c1ZhbHVlPWksdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNWYWx1ZTppLGN1cnJlbnRJbmRleDplLGN1cnJlbnRWYWx1ZTp0aGlzLl92YWx1ZX0pfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImluc2VydEJlaGF2aW9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luc2VydEJlaGF2aW9yfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5zZXJ0QmVoYXZpb3I9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJlbW92ZUJlaGF2aW9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbW92ZUJlaGF2aW9yfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlQmVoYXZpb3I9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl92YWx1ZSxpPXRoaXMuX2luZGV4LHI9dGhpcy5faW5zZXJ0QmVoYXZpb3I7aWYoInNlbGVjdC1pdGVtIj09PXJ8fCJzZWxlY3QtaXRlbS1pZi1uZWVkZWQiPT09ciYmbnVsbD09PWkpcmV0dXJuIHRoaXMuX2luZGV4PXQsdGhpcy5fdmFsdWU9ZSx0aGlzLl9wcmV2aW91c1ZhbHVlPW4sdm9pZCB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6aSxwcmV2aW91c1ZhbHVlOm4sY3VycmVudEluZGV4OnQsY3VycmVudFZhbHVlOmV9KTtpPj10JiZ0aGlzLl9pbmRleCsrfSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JNb3ZlPWZ1bmN0aW9uKHQsZSl7dGhpcy5faW5kZXg9PT10P3RoaXMuX2luZGV4PWU6dGhpcy5faW5kZXg8dCYmdGhpcy5faW5kZXg+PWU/dGhpcy5faW5kZXgrKzp0aGlzLl9pbmRleD50JiZ0aGlzLl9pbmRleDw9ZSYmdGhpcy5faW5kZXgtLX0sdC5wcm90b3R5cGUuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRleCxlPXRoaXMuX3ZhbHVlO3RoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsbnVsbCE9PXQmJnRoaXMuX3NlbGVjdGlvbkNoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDp0LHByZXZpb3VzVmFsdWU6ZSxjdXJyZW50SW5kZXg6dGhpcy5faW5kZXgsY3VycmVudFZhbHVlOnRoaXMuX3ZhbHVlfSl9LHQucHJvdG90eXBlLmFkanVzdFNlbGVjdGlvbkZvclJlbW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2luZGV4LGk9dGhpcy5fcmVtb3ZlQmVoYXZpb3I7aWYobj09PXQpe2lmKDA9PT10aGlzLl9hcnJheS5sZW5ndGgpcmV0dXJuIHRoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdm9pZCB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1ZhbHVlOmUsY3VycmVudEluZGV4OnRoaXMuX2luZGV4LGN1cnJlbnRWYWx1ZTp0aGlzLl92YWx1ZX0pO2lmKCJzZWxlY3QtaXRlbS1hZnRlciI9PT1pKXJldHVybiB0aGlzLl9pbmRleD1NYXRoLm1pbih0LHRoaXMuX2FycmF5Lmxlbmd0aC0xKSx0aGlzLl91cGRhdGVTZWxlY3RlZFZhbHVlKCksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KTtpZigic2VsZWN0LWl0ZW0tYmVmb3JlIj09PWkpcmV0dXJuIHRoaXMuX2luZGV4PU1hdGgubWF4KDAsdC0xKSx0aGlzLl91cGRhdGVTZWxlY3RlZFZhbHVlKCksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KTtpZigic2VsZWN0LXByZXZpb3VzLWl0ZW0iPT09aSlyZXR1cm4gdGhpcy5fcHJldmlvdXNWYWx1ZT90aGlzLnZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsdWU6KHRoaXMuX2luZGV4PU1hdGgubWluKHQsdGhpcy5fYXJyYXkubGVuZ3RoLTEpLHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKSksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy52YWx1ZX0pO3RoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KX1lbHNlIG4+dCYmdGhpcy5faW5kZXgtLX0sdC5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGVkVmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRleDt0aGlzLl92YWx1ZT1udWxsIT09dD90aGlzLl9hcnJheVt0XTpudWxsfSx0fSgpO2UuU2VsZWN0aW9uPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTIpLHM9bigyMyksYT1uKDE2KSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse3ZhbHVlOiIiLGRpc2FibGVkOiExLHBsYWNlaG9sZGVyOiLigIsiLF9tb2RlbF9uYW1lOiJTdHJpbmdNb2RlbCJ9KX0sZX0oby5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5TdHJpbmdNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiSFRNTFZpZXciLF9tb2RlbF9uYW1lOiJIVE1MTW9kZWwifSl9LGV9KGMpO2UuSFRNTE1vZGVsPWg7dmFyIGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHRtbCIpLHRoaXMuY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWh0bWwtY29udGVudCIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50LmlubmVySFRNTD10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuSFRNTFZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IkhUTUxNYXRoVmlldyIsX21vZGVsX25hbWU6IkhUTUxNYXRoTW9kZWwifSl9LGV9KGMpO2UuSFRNTE1hdGhNb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWh0bWxtYXRoIiksdGhpcy5jb250ZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29udGVudC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHRtbG1hdGgtY29udGVudCIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50LmlubmVySFRNTD10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0aGlzLnR5cGVzZXQodGhpcy5jb250ZW50KSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuSFRNTE1hdGhWaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJMYWJlbFZpZXciLF9tb2RlbF9uYW1lOiJMYWJlbE1vZGVsIn0pfSxlfShjKTtlLkxhYmVsTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtbGFiZWwiKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlc2V0KHRoaXMuZWwsdGhpcy5tb2RlbC5nZXQoInZhbHVlIikpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5MYWJlbFZpZXc9bTt2YXIgZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IlRleHRhcmVhVmlldyIsX21vZGVsX25hbWU6IlRleHRhcmVhTW9kZWwiLHJvd3M6bnVsbCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShjKTtlLlRleHRhcmVhTW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0YXJlYSIpLHRoaXMudGV4dGJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMudGV4dGJveC5zZXRBdHRyaWJ1dGUoInJvd3MiLCI1IiksdGhpcy50ZXh0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj1hLnV1aWQoKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMudGV4dGJveCksdGhpcy51cGRhdGUoKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpwbGFjZWhvbGRlciIsZnVuY3Rpb24odCxlLG4pe3RoaXMudXBkYXRlX3BsYWNlaG9sZGVyKGUpfSksdGhpcy51cGRhdGVfcGxhY2Vob2xkZXIoKX0sZS5wcm90b3R5cGUudXBkYXRlX3BsYWNlaG9sZGVyPWZ1bmN0aW9uKHQpe3Q9dHx8dGhpcy5tb2RlbC5nZXQoInBsYWNlaG9sZGVyIiksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiLHQudG9TdHJpbmcoKSl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lfHxlLnVwZGF0ZWRfdmlldyE9dGhpcyl7dGhpcy50ZXh0Ym94LnZhbHVlPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJyb3dzIik7bnVsbD09PW4mJihuPSIiKSx0aGlzLnRleHRib3guc2V0QXR0cmlidXRlKCJyb3dzIixuKSx0aGlzLnRleHRib3guZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIil9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImtleWRvd24gaW5wdXQiOiJoYW5kbGVLZXlEb3duIiwia2V5cHJlc3MgaW5wdXQiOiJoYW5kbGVLZXlwcmVzcyIsImlucHV0IHRleHRhcmVhIjoiaGFuZGxlQ2hhbmdpbmciLCJjaGFuZ2UgdGV4dGFyZWEiOiJoYW5kbGVDaGFuZ2VkIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5cHJlc3M9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdpbmc9ZnVuY3Rpb24odCl7dGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlQ2hhbmdlZCh0KX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdlZD1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQudGFyZ2V0LnZhbHVlLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuVGV4dGFyZWFWaWV3PXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJUZXh0VmlldyIsX21vZGVsX25hbWU6IlRleHRNb2RlbCIsY29udGludW91c191cGRhdGU6ITB9KX0sZX0oYyk7ZS5UZXh0TW9kZWw9Yjt2YXIgeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmlucHV0VHlwZT0idGV4dCIsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0IiksdGhpcy50ZXh0Ym94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgidHlwZSIsdGhpcy5pbnB1dFR5cGUpLHRoaXMudGV4dGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9YS51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRib3gpLHRoaXMudXBkYXRlKCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6cGxhY2Vob2xkZXIiLGZ1bmN0aW9uKHQsZSxuKXt0aGlzLnVwZGF0ZV9wbGFjZWhvbGRlcihlKX0pLHRoaXMudXBkYXRlX3BsYWNlaG9sZGVyKCl9LGUucHJvdG90eXBlLnVwZGF0ZV9wbGFjZWhvbGRlcj1mdW5jdGlvbih0KXt0fHwodD10aGlzLm1vZGVsLmdldCgicGxhY2Vob2xkZXIiKSksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiLHQpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJmUudXBkYXRlZF92aWV3PT10aGlzfHwodGhpcy50ZXh0Ym94LnZhbHVlIT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSYmKHRoaXMudGV4dGJveC52YWx1ZT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSksdGhpcy50ZXh0Ym94LmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJueyJrZXlkb3duIGlucHV0IjoiaGFuZGxlS2V5RG93biIsImtleXByZXNzIGlucHV0IjoiaGFuZGxlS2V5cHJlc3MiLCJpbnB1dCBpbnB1dCI6ImhhbmRsZUNoYW5naW5nIiwiY2hhbmdlIGlucHV0IjoiaGFuZGxlQ2hhbmdlZCJ9fSxlLnByb3RvdHlwZS5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleXByZXNzPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksMTM9PXQua2V5Q29kZSYmdGhpcy5zZW5kKHtldmVudDoic3VibWl0In0pfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2luZz1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLmdldCgiY29udGludW91c191cGRhdGUiKSYmdGhpcy5oYW5kbGVDaGFuZ2VkKHQpfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2VkPWZ1bmN0aW9uKHQpe3RoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsdC50YXJnZXQudmFsdWUse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5UZXh0Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiUGFzc3dvcmRWaWV3IixfbW9kZWxfbmFtZToiUGFzc3dvcmRNb2RlbCJ9KX0sZX0oYik7ZS5QYXNzd29yZE1vZGVsPV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5pbnB1dFR5cGU9InBhc3N3b3JkIixlfXJldHVybiByKGUsdCksZX0oeSk7ZS5QYXNzd29yZFZpZXc9d30sZnVuY3Rpb24odCl7dC5leHBvcnRzPXtuYW1lOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIix2ZXJzaW9uOiIxLjQuMiIsZGVzY3JpcHRpb246Ikp1cHl0ZXIgaW50ZXJhY3RpdmUgd2lkZ2V0cyIsYXV0aG9yOiJQcm9qZWN0IEp1cHl0ZXIiLGxpY2Vuc2U6IkJTRC0zLUNsYXVzZSIsbWFpbjoibGliL2luZGV4LmpzIix0eXBpbmdzOiJsaWIvaW5kZXguZC50cyIscmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6Imh0dHBzOi8vZ2l0aHViLmNvbS9qdXB5dGVyLXdpZGdldHMvaXB5d2lkZ2V0cy5naXQifSxmaWxlczpbImxpYi8qKi8qLmQudHMiLCJsaWIvKiovKi5qcyIsImNzcy8qLmNzcyIsImRpc3QvIl0sc2NyaXB0czp7ImNsZWFuOnNyYyI6InJpbXJhZiBsaWIiLGNsZWFuOiJucG0gcnVuIGNsZWFuOnNyYyIsImJ1aWxkOnRlc3QiOiJ0c2MgLS1wcm9qZWN0IHRlc3Qvc3JjICYmIHdlYnBhY2sgLS1jb25maWcgdGVzdC93ZWJwYWNrLmNvbmYuanMiLCJidWlsZDpzcmMiOiJ0c2MgLS1wcm9qZWN0IHNyYyIsImJ1aWxkOmNzcyI6InBvc3Rjc3MgLS11c2UgcG9zdGNzcy1pbXBvcnQgLS11c2UgcG9zdGNzcy1jc3NuZXh0IC1vIGNzcy93aWRnZXRzLmJ1aWx0LmNzcyBjc3Mvd2lkZ2V0cy5jc3MiLGJ1aWxkOiJucG0gcnVuIGJ1aWxkOnNyYyAmJiBucG0gcnVuIGJ1aWxkOmNzcyIsbGludDoidHNsaW50IC0tcHJvamVjdCB0c2xpbnQuanNvbiAtLWZvcm1hdCBzdHlsaXNoIix0ZXN0OiJucG0gcnVuIHRlc3Q6dW5pdCIsInRlc3Q6Y292ZXJhZ2UiOiJucG0gcnVuIGJ1aWxkOnRlc3QgJiYgd2VicGFjayAtLWNvbmZpZyB0ZXN0L3dlYnBhY2stY292LmNvbmYuanMgJiYga2FybWEgc3RhcnQgdGVzdC9rYXJtYS1jb3YuY29uZi5qcyIsInRlc3Q6dW5pdCI6Im5wbSBydW4gdGVzdDp1bml0OmZpcmVmb3ggJiYgbnBtIHJ1biB0ZXN0OnVuaXQ6Y2hyb21lIiwidGVzdDp1bml0OmRlZmF1bHQiOiJucG0gcnVuIGJ1aWxkOnRlc3QgJiYga2FybWEgc3RhcnQgdGVzdC9rYXJtYS5jb25mLmpzIC0tbG9nLWxldmVsIGRlYnVnIiwidGVzdDp1bml0OmZpcmVmb3giOiJucG0gcnVuIHRlc3Q6dW5pdDpkZWZhdWx0IC0tIC0tYnJvd3NlcnM9RmlyZWZveCIsInRlc3Q6dW5pdDpjaHJvbWUiOiJucG0gcnVuIHRlc3Q6dW5pdDpkZWZhdWx0IC0tIC0tYnJvd3NlcnM9Q2hyb21lIiwidGVzdDp1bml0OmllIjoibnBtIHJ1biB0ZXN0OnVuaXQ6ZGVmYXVsdCAtLSAtLWJyb3dzZXJzPUlFIixwcmVwdWJsaXNoOiJucG0gcnVuIGNsZWFuICYmIG5wbSBydW4gYnVpbGQifSxkZXZEZXBlbmRlbmNpZXM6eyJAanVweXRlcmxhYi9zZXJ2aWNlcyI6Il4yLjAuMCB8fCBeMy4wLjAiLCJAdHlwZXMvZXhwZWN0LmpzIjoiXjAuMy4yOSIsIkB0eXBlcy9tYXRoamF4IjoiMC4wLjMxIiwiQHR5cGVzL21vY2hhIjoiXjIuMi40MSIsIkB0eXBlcy9ub2RlIjoiXjguMC4xIixjaGFpOiJeNC4wLjAiLCJjc3MtbG9hZGVyIjoiXjAuMjguNCIsImV4cGVjdC5qcyI6Il4wLjMuMSIsImZpbGUtbG9hZGVyIjoiXjAuMTEuMiIsImlzdGFuYnVsLWluc3RydW1lbnRlci1sb2FkZXIiOiJeMi4wLjAiLCJqc29uLWxvYWRlciI6Il4wLjUuNCIsa2FybWE6Il4xLjYuMCIsImthcm1hLWNocm9tZS1sYXVuY2hlciI6Il4yLjAuMCIsImthcm1hLWNvdmVyYWdlIjoiXjEuMC4wIiwia2FybWEtZmlyZWZveC1sYXVuY2hlciI6Il4xLjAuMSIsImthcm1hLWllLWxhdW5jaGVyIjoiXjEuMC4wIiwia2FybWEtbW9jaGEiOiJeMS4zLjAiLCJrYXJtYS1tb2NoYS1yZXBvcnRlciI6Il4yLjIuMyIsImthcm1hLXdlYnBhY2siOiJeMi4wLjMiLG1vY2hhOiJeMy4zLjAiLCJucG0tcnVuLWFsbCI6Il4xLjUuMSIsInBvc3Rjc3MtY2xpIjoiXjQuMS4wIiwicG9zdGNzcy1jc3NuZXh0IjoiXjMuMC4yIiwicG9zdGNzcy1pbXBvcnQiOiJeMTAuMC4wIiwicG9zdGNzcy1sb2FkZXIiOiJeMi4wLjYiLHJpbXJhZjoiXjIuNi4xIixzaW5vbjoiXjIuMS4wIiwic2lub24tY2hhaSI6Il4yLjExLjAiLCJzdHlsZS1sb2FkZXIiOiJeMC4xOC4xIix0c2xpbnQ6Il41LjguMCIsdHlwZXNjcmlwdDoifjIuOS4yIiwidXJsLWxvYWRlciI6Il4wLjUuOSIsd2VicGFjazoiXjMuNS41In0sZGVwZW5kZW5jaWVzOnsiQGp1cHl0ZXItd2lkZ2V0cy9iYXNlIjoiXjEuMi4yIiwiQHBob3NwaG9yL2FsZ29yaXRobSI6Il4xLjEuMCIsIkBwaG9zcGhvci9kb211dGlscyI6Il4xLjEuMCIsIkBwaG9zcGhvci9tZXNzYWdpbmciOiJeMS4yLjEiLCJAcGhvc3Bob3Ivc2lnbmFsaW5nIjoiXjEuMi4wIiwiQHBob3NwaG9yL3dpZGdldHMiOiJeMS4zLjAiLCJkMy1mb3JtYXQiOiJeMS4zLjAiLGpxdWVyeToiXjMuMS4xIiwianF1ZXJ5LXVpIjoiXjEuMTIuMSIsdW5kZXJzY29yZToiXjEuOC4zIn0sZ2l0SGVhZDoiN2ZkMTVjMDZmMGE2MTEzOGVhYzQ0YWMzNGQwMTQ4YmU2N2IzYWQ2ZiIsX3Jlc29sdmVkOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AanVweXRlci13aWRnZXRzL2NvbnRyb2xzLy0vY29udHJvbHMtMS40LjIudGd6IixfaW50ZWdyaXR5OiJzaGE1MTItd2o5Nk5UMW1ONCs3enpMMzRoTkhNTFlkYkRzSG0yVVh4a1FKcjdVb2xlUytVMnp6Z3ZSU2tCNmlqRDl0aTI1ZjlDWCtQblhUZU9RN2lSSEdQOERCaHc9PSIsX2Zyb206IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHNAMS40LjIifX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9KG4oMzYxKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDgpO2UuT1VUUFVUX1dJREdFVF9WRVJTSU9OPSIxLjAuMCI7dmFyIGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIobix0KSxuLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJPdXRwdXRNb2RlbCIsX3ZpZXdfbmFtZToiT3V0cHV0VmlldyIsX21vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9vdXRwdXQiLF92aWV3X21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9vdXRwdXQiLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjplLk9VVFBVVF9XSURHRVRfVkVSU0lPTixfdmlld19tb2R1bGVfdmVyc2lvbjplLk9VVFBVVF9XSURHRVRfVkVSU0lPTn0pfSxufShzLkRPTVdpZGdldE1vZGVsKTtlLk91dHB1dE1vZGVsPWE7dmFyIHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShzLkRPTVdpZGdldFZpZXcpO2UuT3V0cHV0Vmlldz11fV0pLmRlZmF1bHQpOw==",
|
|
"ok": true,
|
|
"headers": [
|
|
[
|
|
"content-type",
|
|
"application/javascript"
|
|
]
|
|
],
|
|
"status": 200,
|
|
"status_text": ""
|
|
}
|
|
},
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 18125
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# CatBoost\n",
|
|
"\n",
|
|
"model = None\n",
|
|
"del model\n",
|
|
"\n",
|
|
"\n",
|
|
"model = CatBoostClassifier(\n",
|
|
"# task_type = \"GPU\",\n",
|
|
" custom_loss=['Accuracy'],\n",
|
|
" random_seed=42,\n",
|
|
" logging_level='Silent'\n",
|
|
")\n",
|
|
"\n",
|
|
"# https://tech.yandex.com/catboost/doc/dg/concepts/python-reference_catboostregressor_fit-docpage/\n",
|
|
"\n",
|
|
"start = time.time()\n",
|
|
"model.fit(X, y,\n",
|
|
" cat_features=categorical_features_indices,\n",
|
|
" eval_set=(X_validation, y_validation),\n",
|
|
" logging_level='Verbose', # you can uncomment this for text output)\n",
|
|
" plot=True)\n",
|
|
"\n",
|
|
"end = time.time()"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/html": [
|
|
"\n",
|
|
" <style>\n",
|
|
" .highcharts-tooltip {\n",
|
|
" display: none !important;\n",
|
|
"}\n",
|
|
".highcharts-halo {\n",
|
|
" display: none !important;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost {\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel {\n",
|
|
" position: absolute;\n",
|
|
" height: 100%;\n",
|
|
" width: 280px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls {\n",
|
|
" margin-left: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls_label {\n",
|
|
" padding: 5px 0 0 8px;\n",
|
|
" cursor: pointer;\n",
|
|
" width: 80px;\n",
|
|
" box-sizing: content-box;\n",
|
|
"}\n",
|
|
".catboost-panel__controls_label_time {\n",
|
|
" width: inherit;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls2 {\n",
|
|
" margin-top: 10px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls2_label {\n",
|
|
" padding: 5px 11px 0 8px;\n",
|
|
" cursor: pointer;\n",
|
|
" width: 90px;\n",
|
|
" box-sizing: content-box;\n",
|
|
"}\n",
|
|
".catboost-panel__controls2_label-long {\n",
|
|
" width: 170px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series {\n",
|
|
" height: 340px;\n",
|
|
" overflow-y: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph {\n",
|
|
" margin-left: 290px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tabs {\n",
|
|
" padding: 0 0 0 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab {\n",
|
|
" display: inline-block;\n",
|
|
" padding: 5px 10px 0 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab {\n",
|
|
" color: #999;\n",
|
|
" cursor: pointer;\n",
|
|
" transition: color 0.1s linear;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab:hover {\n",
|
|
" color: #333;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab_active {\n",
|
|
" color: #000;\n",
|
|
" cursor: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__charts {\n",
|
|
" padding-top: 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__chart {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__chart_active {\n",
|
|
" display: block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie {\n",
|
|
" padding-bottom: 5px;\n",
|
|
" border-bottom: 1px solid rgba(0, 0, 0, 0.3);\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_bottom,\n",
|
|
".catboost-panel__serie_middle,\n",
|
|
".catboost-panel__serie_top {\n",
|
|
" white-space: nowrap;\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#catboost-control-test {\n",
|
|
" margin-left: 11px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_label {\n",
|
|
" padding: 0 0 0 8px;\n",
|
|
" width: 200px;\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" box-sizing: border-box;\n",
|
|
" cursor: pointer;\n",
|
|
" margin-bottom: 0;\n",
|
|
" overflow: hidden;\n",
|
|
" position: relative;\n",
|
|
" top: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_hint {\n",
|
|
" position: absolute;\n",
|
|
" font-size: 9px;\n",
|
|
" left: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie__learn_hint {\n",
|
|
" top: 56px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie__test_hint {\n",
|
|
" top: 82px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_bottom {\n",
|
|
" padding-bottom: 6px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time {\n",
|
|
" position: absolute;\n",
|
|
" top: 5px;\n",
|
|
" right: 2px;\n",
|
|
" height: 20px;\n",
|
|
" padding: 0 0 0 20px;\n",
|
|
" margin-bottom: 3px;\n",
|
|
" overflow: hidden;\n",
|
|
"\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" box-sizing: border-box;\n",
|
|
" text-align: left;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__serie_test_pic {\n",
|
|
" width: 13px;\n",
|
|
" height: 1px;\n",
|
|
" border-top-width: 1px;\n",
|
|
" position: relative;\n",
|
|
" top: -3px;\n",
|
|
" margin-right: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic {\n",
|
|
" border-top-style: dashed;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_test_pic {\n",
|
|
" border-top-style: solid;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie-value {\n",
|
|
" display: inline-block;\n",
|
|
" min-width: 30px;\n",
|
|
" margin-right: 2px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls_label .catboost-panel__serie_learn_pic {\n",
|
|
" padding-left: 4px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_names {\n",
|
|
" white-space: nowrap;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_scroll {\n",
|
|
" width: 240px;\n",
|
|
" overflow-x: auto;\n",
|
|
" margin-left: 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__serie_best_learn_value,\n",
|
|
".catboost-panel__serie_best_test_value {\n",
|
|
" width: 85px;\n",
|
|
" position: relative;\n",
|
|
" padding: 0 8px 0 0;\n",
|
|
" box-sizing: content-box;\n",
|
|
" overflow: hidden;\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" top: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_iteration,\n",
|
|
".catboost-panel__serie_best_iteration {\n",
|
|
" display: inline-block;\n",
|
|
" position: absolute;\n",
|
|
" box-sizing: content-box;\n",
|
|
" overflow: hidden;\n",
|
|
" right: 2px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_iteration {\n",
|
|
" top: 55px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_best_iteration {\n",
|
|
" top: 80px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__control_slider {\n",
|
|
" width: 100px !important;\n",
|
|
" margin-left: 0;\n",
|
|
" position: relative;\n",
|
|
" display: inline-block !important;\n",
|
|
" top: 3px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__control_slidervalue {\n",
|
|
" width: 50px;\n",
|
|
" padding: 2px 3px;\n",
|
|
" margin-left: 4px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time_spend,\n",
|
|
".catboost-panel__serie_time_left {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time_left {\n",
|
|
" margin-left: 10px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__serie_best_learn_value {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
".catboost-panel__serie_test_pic,\n",
|
|
".catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__serie_best_test_value {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_best_learn_value {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_pic,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_test_value {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/*\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_best_test_value {\n",
|
|
" width: 216px;\n",
|
|
"}\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_learn_value {\n",
|
|
" width: 216px;\n",
|
|
"}\n",
|
|
"*/\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie__test_hint,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_iteration {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_test_disabled.catboost-panel__series_learn_disabled .catboost-panel__serie_middle {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_bottom {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
" </style>\n",
|
|
" <script>\n",
|
|
" window.__define = window.define;window.__require = window.require;window.define = undefined;window.require = undefined;/**\n",
|
|
"* plotly.js (basic - minified) v1.27.1\n",
|
|
"* Copyright 2012-2017, Plotly, Inc.\n",
|
|
"* All rights reserved.\n",
|
|
"* Licensed under the MIT license\n",
|
|
"*/\n",
|
|
"!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var e;e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,e.Plotly=t()}}(function(){var t;return function t(e,r,n){function a(i,l){if(!r[i]){if(!e[i]){var s=\"function\"==typeof require&&require;if(!l&&s)return s(i,!0);if(o)return o(i,!0);var c=new Error(\"Cannot find module '\"+i+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var u=r[i]={exports:{}};e[i][0].call(u.exports,function(t){var r=e[i][1][t];return a(r||t)},u,u.exports,t,e,r,n)}return r[i].exports}for(var o=\"function\"==typeof require&&require,i=0;i<n.length;i++)a(n[i]);return a}({1:[function(t,e,r){\"use strict\";var n=t(\"../src/lib\"),a={\"X,X div\":\"font-family:'Open Sans', verdana, arial, sans-serif;margin:0;padding:0;\",\"X input,X button\":\"font-family:'Open Sans', verdana, arial, sans-serif;\",\"X input:focus,X button:focus\":\"outline:none;\",\"X a\":\"text-decoration:none;\",\"X a:hover\":\"text-decoration:none;\",\"X .crisp\":\"shape-rendering:crispEdges;\",\"X .user-select-none\":\"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;\",\"X svg\":\"overflow:hidden;\",\"X svg a\":\"fill:#447adb;\",\"X svg a:hover\":\"fill:#3c6dc5;\",\"X .main-svg\":\"position:absolute;top:0;left:0;pointer-events:none;\",\"X .main-svg .draglayer\":\"pointer-events:all;\",\"X .cursor-default\":\"cursor:default;\",\"X .cursor-pointer\":\"cursor:pointer;\",\"X .cursor-crosshair\":\"cursor:crosshair;\",\"X .cursor-move\":\"cursor:move;\",\"X .cursor-col-resize\":\"cursor:col-resize;\",\"X .cursor-row-resize\":\"cursor:row-resize;\",\"X .cursor-ns-resize\":\"cursor:ns-resize;\",\"X .cursor-ew-resize\":\"cursor:ew-resize;\",\"X .cursor-sw-resize\":\"cursor:sw-resize;\",\"X .cursor-s-resize\":\"cursor:s-resize;\",\"X .cursor-se-resize\":\"cursor:se-resize;\",\"X .cursor-w-resize\":\"cursor:w-resize;\",\"X .cursor-e-resize\":\"cursor:e-resize;\",\"X .cursor-nw-resize\":\"cursor:nw-resize;\",\"X .cursor-n-resize\":\"cursor:n-resize;\",\"X .cursor-ne-resize\":\"cursor:ne-resize;\",\"X .modebar\":\"position:absolute;top:2px;right:2px;z-index:1001;background:rgba(255,255,255,0.7);\",\"X .modebar--hover\":\"opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;\",\"X:hover .modebar--hover\":\"opacity:1;\",\"X .modebar-group\":\"float:left;display:inline-block;box-sizing:border-box;margin-left:8px;position:relative;vertical-align:middle;white-space:nowrap;\",\"X .modebar-group:first-child\":\"margin-left:0px;\",\"X .modebar-btn\":\"position:relative;font-size:16px;padding:3px 4px;cursor:pointer;line-height:normal;box-sizing:border-box;\",\"X .modebar-btn svg\":\"position:relative;top:2px;\",\"X .modebar-btn path\":\"fill:rgba(0,31,95,0.3);\",\"X .modebar-btn.active path,X .modebar-btn:hover path\":\"fill:rgba(0,22,72,0.5);\",\"X .modebar-btn.modebar-btn--logo\":\"padding:3px 1px;\",\"X .modebar-btn.modebar-btn--logo path\":\"fill:#447adb !important;\",\"X [data-title]:before,X [data-title]:after\":\"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;\",\"X [data-title]:hover:before,X [data-title]:hover:after\":\"display:block;opacity:1;\",\"X [data-title]:before\":\"content:'';position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;\",\"X [data-title]:after\":\"content:attr(data-title);background:#69738a;color:white;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;\",\"X .select-outline\":\"fill:none;stroke-width:1;shape-rendering:crispEdges;\",\"X .select-outline-1\":\"stroke:white;\",\"X .select-outline-2\":\"stroke:black;stroke-dasharray:2px 2px;\",Y:\"font-family:'Open Sans';position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;\",\"Y p\":\"margin:0;\",\"Y .notifier-note\":\"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,0.9);color:#fff;padding:10px;\",\"Y .notifier-close\":\"color:#fff;opacity:0.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;\",\"Y .notifier-close:hover\":\"color:#444;text-decoration:none;cursor:pointer;\"};for(var o in a){var i=o.replace(/^,/,\" ,\").replace(/X/g,\".js-plotly-plot .plotly\").replace(/Y/g,\".plotly-notifier\");n.addStyleRule(i,a[o])}},{\"../src/lib\":136}],2:[function(t,e,r){\"use strict\";e.exports={undo:{width:857.1,path:\"m857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z\",ascent:850,descent:-150},home:{width:928.6,path:\"m786 296v-267q0-15-11-26t-25-10h-214v214h-143v-214h-214q-15 0-25 10t-11 26v267q0 1 0 2t0 2l321 264 321-264q1-1 1-4z m124 39l-34-41q-5-5-12-6h-2q-7 0-12 3l-386 322-386-322q-7-4-13-4-7 2-12 7l-35 41q-4 5-3 13t6 12l401 334q18 15 42 15t43-15l136-114v109q0 8 5 13t13 5h107q8 0 13-5t5-13v-227l122-102q5-5 6-12t-4-13z\",ascent:850,descent:-150},\"camera-retro\":{width:1e3,path:\"m518 386q0 8-5 13t-13 5q-37 0-63-27t-26-63q0-8 5-13t13-5 12 5 5 13q0 23 16 38t38 16q8 0 13 5t5 13z m125-73q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m-572-320h858v71h-858v-71z m643 320q0 89-62 152t-152 62-151-62-63-152 63-151 151-63 152 63 62 151z m-571 358h214v72h-214v-72z m-72-107h858v143h-462l-36-71h-360v-72z m929 143v-714q0-30-21-51t-50-21h-858q-29 0-50 21t-21 51v714q0 30 21 51t50 21h858q29 0 50-21t21-51z\",ascent:850,descent:-150},zoombox:{width:1e3,path:\"m1000-25l-250 251c40 63 63 138 63 218 0 224-182 406-407 406-224 0-406-182-406-406s183-406 407-406c80 0 155 22 218 62l250-250 125 125z m-812 250l0 438 437 0 0-438-437 0z m62 375l313 0 0-312-313 0 0 312z\",ascent:850,descent:-150},pan:{width:1e3,path:\"m1000 350l-187 188 0-125-250 0 0 250 125 0-188 187-187-187 125 0 0-250-250 0 0 125-188-188 186-187 0 125 252 0 0-250-125 0 187-188 188 188-125 0 0 250 250 0 0-126 187 188z\",ascent:850,descent:-150},zoom_plus:{width:1e3,path:\"m1 787l0-875 875 0 0 875-875 0z m687-500l-187 0 0-187-125 0 0 187-188 0 0 125 188 0 0 187 125 0 0-187 187 0 0-125z\",ascent:850,descent:-150},zoom_minus:{width:1e3,path:\"m0 788l0-876 875 0 0 876-875 0z m688-500l-500 0 0 125 500 0 0-125z\",ascent:850,descent:-150},autoscale:{width:1e3,path:\"m250 850l-187 0-63 0 0-62 0-188 63 0 0 188 187 0 0 62z m688 0l-188 0 0-62 188 0 0-188 62 0 0 188 0 62-62 0z m-875-938l0 188-63 0 0-188 0-62 63 0 187 0 0 62-187 0z m875 188l0-188-188 0 0-62 188 0 62 0 0 62 0 188-62 0z m-125 188l-1 0-93-94-156 156 156 156 92-93 2 0 0 250-250 0 0-2 93-92-156-156-156 156 94 92 0 2-250 0 0-250 0 0 93 93 157-156-157-156-93 94 0 0 0-250 250 0 0 0-94 93 156 157 156-157-93-93 0 0 250 0 0 250z\",ascent:850,descent:-150},tooltip_basic:{width:1500,path:\"m375 725l0 0-375-375 375-374 0-1 1125 0 0 750-1125 0z\",ascent:850,descent:-150},tooltip_compare:{width:1125,path:\"m187 786l0 2-187-188 188-187 0 0 937 0 0 373-938 0z m0-499l0 1-187-188 188-188 0 0 937 0 0 376-938-1z\",ascent:850,descent:-150},plotlylogo:{width:1542,path:\"m0-10h182v-140h-182v140z m228 146h183v-286h-183v286z m225 714h182v-1000h-182v1000z m225-285h182v-715h-182v715z m225 142h183v-857h-183v857z m231-428h182v-429h-182v429z m225-291h183v-138h-183v138z\",ascent:850,descent:-150},\"z-axis\":{width:1e3,path:\"m833 5l-17 108v41l-130-65 130-66c0 0 0 38 0 39 0-1 36-14 39-25 4-15-6-22-16-30-15-12-39-16-56-20-90-22-187-23-279-23-261 0-341 34-353 59 3 60 228 110 228 110-140-8-351-35-351-116 0-120 293-142 474-142 155 0 477 22 477 142 0 50-74 79-163 96z m-374 94c-58-5-99-21-99-40 0-24 65-43 144-43 79 0 143 19 143 43 0 19-42 34-98 40v216h87l-132 135-133-135h88v-216z m167 515h-136v1c16 16 31 34 46 52l84 109v54h-230v-71h124v-1c-16-17-28-32-44-51l-89-114v-51h245v72z\",ascent:850,descent:-150},\"3d_rotate\":{width:1e3,path:\"m922 660c-5 4-9 7-14 11-359 263-580-31-580-31l-102 28 58-400c0 1 1 1 2 2 118 108 351 249 351 249s-62 27-100 42c88 83 222 183 347 122 16-8 30-17 44-27-2 1-4 2-6 4z m36-329c0 0 64 229-88 296-62 27-124 14-175-11 157-78 225-208 249-266 8-19 11-31 11-31 2 5 6 15 11 32-5-13-8-20-8-20z m-775-239c70-31 117-50 198-32-121 80-199 346-199 346l-96-15-58-12c0 0 55-226 155-287z m603 133l-317-139c0 0 4-4 19-14 7-5 24-15 24-15s-177-147-389 4c235-287 536-112 536-112l31-22 100 299-4-1z m-298-153c6-4 14-9 24-15 0 0-17 10-24 15z\",ascent:850,descent:-150},camera:{width:1e3,path:\"m500 450c-83 0-150-67-150-150 0-83 67-150 150-150 83 0 150 67 150 150 0 83-67 150-150 150z m400 150h-120c-16 0-34 13-39 29l-31 93c-6 15-23 28-40 28h-340c-16 0-34-13-39-28l-31-94c-6-15-23-28-40-28h-120c-55 0-100-45-100-100v-450c0-55 45-100 100-100h800c55 0 100 45 100 100v450c0 55-45 100-100 100z m-400-550c-138 0-250 112-250 250 0 138 112 250 250 250 138 0 250-112 250-250 0-138-112-250-250-250z m365 380c-19 0-35 16-35 35 0 19 16 35 35 35 19 0 35-16 35-35 0-19-16-35-35-35z\",ascent:850,descent:-150},movie:{width:1e3,path:\"m938 413l-188-125c0 37-17 71-44 94 64 38 107 107 107 187 0 121-98 219-219 219-121 0-219-98-219-219 0-61 25-117 66-156h-115c30 33 49 76 49 125 0 103-84 187-187 187s-188-84-188-187c0-57 26-107 65-141-38-22-65-62-65-109v-250c0-70 56-126 125-126h500c69 0 125 56 125 126l188-126c34 0 62 28 62 63v375c0 35-28 63-62 63z m-750 0c-69 0-125 56-125 125s56 125 125 125 125-56 125-125-56-125-125-125z m406-1c-87 0-157 70-157 157 0 86 70 156 157 156s156-70 156-156-70-157-156-157z\",ascent:850,descent:-150},question:{width:857.1,path:\"m500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-14 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-16-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z\",ascent:850,descent:-150},disk:{width:857.1,path:\"m214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-8 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z\",ascent:850,descent:-150},lasso:{width:1031,path:\"m1018 538c-36 207-290 336-568 286-277-48-473-256-436-463 10-57 36-108 76-151-13-66 11-137 68-183 34-28 75-41 114-42l-55-70 0 0c-2-1-3-2-4-3-10-14-8-34 5-45 14-11 34-8 45 4 1 1 2 3 2 5l0 0 113 140c16 11 31 24 45 40 4 3 6 7 8 11 48-3 100 0 151 9 278 48 473 255 436 462z m-624-379c-80 14-149 48-197 96 42 42 109 47 156 9 33-26 47-66 41-105z m-187-74c-19 16-33 37-39 60 50-32 109-55 174-68-42-25-95-24-135 8z m360 75c-34-7-69-9-102-8 8 62-16 128-68 170-73 59-175 54-244-5-9 20-16 40-20 61-28 159 121 317 333 354s407-60 434-217c28-159-121-318-333-355z\",ascent:850,descent:-150},selectbox:{width:1e3,path:\"m0 850l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-285l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z\",ascent:850,descent:-150},spikeline:{width:1e3,path:\"M512 409c0-57-46-104-103-104-57 0-104 47-104 104 0 57 47 103 104 103 57 0 103-46 103-103z m-327-39l92 0 0 92-92 0z m-185 0l92 0 0 92-92 0z m370-186l92 0 0 93-92 0z m0-184l92 0 0 92-92 0z\",ascent:850,descent:-150}}},{}],3:[function(t,e,r){\"use strict\";e.exports=t(\"../src/traces/bar\")},{\"../src/traces/bar\":220}],4:[function(t,e,r){\"use strict\";e.exports=t(\"../src/core\")},{\"../src/core\":125}],5:[function(t,e,r){\"use strict\";var n=t(\"./core\");n.register([t(\"./bar\"),t(\"./pie\")]),e.exports=n},{\"./bar\":3,\"./core\":4,\"./pie\":6}],6:[function(t,e,r){\"use strict\";e.exports=t(\"../src/traces/pie\")},{\"../src/traces/pie\":233}],7:[function(e,r,n){!function(){function e(t){return t&&(t.ownerDocument||t.document||t).documentElement}function n(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}function a(t,e){return t<e?-1:t>e?1:t>=e?0:0/0}function o(t){return null===t?0/0:+t}function i(t){return!isNaN(t)}function l(t){return{left:function(e,r,n,a){for(arguments.length<3&&(n=0),arguments.length<4&&(a=e.length);n<a;){var o=n+a>>>1;t(e[o],r)<0?n=o+1:a=o}return n},right:function(e,r,n,a){for(arguments.length<3&&(n=0),arguments.length<4&&(a=e.length);n<a;){var o=n+a>>>1;t(e[o],r)>0?a=o:n=o+1}return n}}}function s(t){return t.length}function c(t){for(var e=1;t*e%1;)e*=10;return e}function u(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function f(){this._=Object.create(null)}function d(t){return(t+=\"\")===_i||t[0]===wi?wi+t:t}function h(t){return(t+=\"\")[0]===wi?t.slice(1):t}function p(t){return d(t)in this._}function g(t){return(t=d(t))in this._&&delete this._[t]}function v(){var t=[];for(var e in this._)t.push(h(e));return t}function m(){var t=0;for(var e in this._)++t;return t}function y(){for(var t in this._)return!1;return!0}function x(){this._=Object.create(null)}function b(t){return t}function _(t,e,r){return function(){var n=r.apply(e,arguments);return n===e?t:n}}function w(t,e){if(e in t)return e;e=e.charAt(0).toUpperCase()+e.slice(1);for(var r=0,n=ki.length;r<n;++r){var a=ki[r]+e;if(a in t)return a}}function k(){}function M(){}function A(t){function e(){for(var e,n=r,a=-1,o=n.length;++a<o;)(e=n[a].on)&&e.apply(this,arguments);return t}var r=[],n=new f;return e.on=function(e,a){var o,i=n.get(e);return arguments.length<2?i&&i.on:(i&&(i.on=null,r=r.slice(0,o=r.indexOf(i)).concat(r.slice(o+1)),n.remove(e)),a&&r.push(n.set(e,{on:a})),t)},e}function T(){ui.event.preventDefault()}function L(){for(var t,e=ui.event;t=e.sourceEvent;)e=t;return e}function C(t){for(var e=new M,r=0,n=arguments.length;++r<n;)e[arguments[r]]=A(e);return e.of=function(r,n){return function(a){try{var o=a.sourceEvent=ui.event;a.target=t,ui.event=a,e[a.type].apply(r,n)}finally{ui.event=o}}},e}function S(t){return Ai(t,Si),t}function z(t){return\"function\"==typeof t?t:function(){return Ti(t,this)}}function O(t){return\"function\"==typeof t?t:function(){return Li(t,this)}}function D(t,e){function r(){this.removeAttribute(t)}function n(){this.removeAttributeNS(t.space,t.local)}function a(){this.setAttribute(t,e)}function o(){this.setAttributeNS(t.space,t.local,e)}function i(){var r=e.apply(this,arguments);null==r?this.removeAttribute(t):this.setAttribute(t,r)}function l(){var r=e.apply(this,arguments);null==r?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}return t=ui.ns.qualify(t),null==e?t.local?n:r:\"function\"==typeof e?t.local?l:i:t.local?o:a}function P(t){return t.trim().replace(/\\s+/g,\" \")}function E(t){return new RegExp(\"(?:^|\\\\s+)\"+ui.requote(t)+\"(?:\\\\s+|$)\",\"g\")}function N(t){return(t+\"\").trim().split(/^|\\s+/)}function I(t,e){function r(){for(var r=-1;++r<a;)t[r](this,e)}function n(){for(var r=-1,n=e.apply(this,arguments);++r<a;)t[r](this,n)}t=N(t).map(R);var a=t.length;return\"function\"==typeof e?n:r}function R(t){var e=E(t);return function(r,n){if(a=r.classList)return n?a.add(t):a.remove(t);var a=r.getAttribute(\"class\")||\"\";n?(e.lastIndex=0,e.test(a)||r.setAttribute(\"class\",P(a+\" \"+t))):r.setAttribute(\"class\",P(a.replace(e,\" \")))}}function F(t,e,r){function n(){this.style.removeProperty(t)}function a(){this.style.setProperty(t,e,r)}function o(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,r)}return null==e?n:\"function\"==typeof e?o:a}function j(t,e){function r(){delete this[t]}function n(){this[t]=e}function a(){var r=e.apply(this,arguments);null==r?delete this[t]:this[t]=r}return null==e?r:\"function\"==typeof e?a:n}function B(t){function e(){var e=this.ownerDocument,r=this.namespaceURI;return r===zi&&e.documentElement.namespaceURI===zi?e.createElement(t):e.createElementNS(r,t)}function r(){return this.ownerDocument.createElementNS(t.space,t.local)}return\"function\"==typeof t?t:(t=ui.ns.qualify(t)).local?r:e}function q(){var t=this.parentNode;t&&t.removeChild(this)}function H(t){return{__data__:t}}function V(t){return function(){return Ci(this,t)}}function U(t){return arguments.length||(t=a),function(e,r){return e&&r?t(e.__data__,r.__data__):!e-!r}}function X(t,e){for(var r=0,n=t.length;r<n;r++)for(var a,o=t[r],i=0,l=o.length;i<l;i++)(a=o[i])&&e(a,i,r);return t}function G(t){return Ai(t,Di),t}function Y(t){var e,r;return function(n,a,o){var i,l=t[o].update,s=l.length;for(o!=r&&(r=o,e=0),a>=e&&(e=a+1);!(i=l[e])&&++e<s;);return i}}function Z(t,e,r){function n(){var e=this[i];e&&(this.removeEventListener(t,e,e.$),delete this[i])}function a(){var a=s(e,di(arguments));n.call(this),this.addEventListener(t,this[i]=a,a.$=r),a._=e}function o(){var e,r=new RegExp(\"^__on([^.]+)\"+ui.requote(t)+\"$\");for(var n in this)if(e=n.match(r)){var a=this[n];this.removeEventListener(e[1],a,a.$),delete this[n]}}var i=\"__on\"+t,l=t.indexOf(\".\"),s=W;l>0&&(t=t.slice(0,l));var c=Pi.get(t);return c&&(t=c,s=$),l?e?a:n:e?k:o}function W(t,e){return function(r){var n=ui.event;ui.event=r,e[0]=this.__data__;try{t.apply(this,e)}finally{ui.event=n}}}function $(t,e){var r=W(t,e);return function(t){var e=this,n=t.relatedTarget;n&&(n===e||8&n.compareDocumentPosition(e))||r.call(e,t)}}function Q(t){var r=\".dragsuppress-\"+ ++Ni,a=\"click\"+r,o=ui.select(n(t)).on(\"touchmove\"+r,T).on(\"dragstart\"+r,T).on(\"selectstart\"+r,T);if(null==Ei&&(Ei=!(\"onselectstart\"in t)&&w(t.style,\"userSelect\")),Ei){var i=e(t).style,l=i[Ei];i[Ei]=\"none\"}return function(t){if(o.on(r,null),Ei&&(i[Ei]=l),t){var e=function(){o.on(a,null)};o.on(a,function(){T(),e()},!0),setTimeout(e,0)}}}function J(t,e){e.changedTouches&&(e=e.changedTouches[0]);var r=t.ownerSVGElement||t;if(r.createSVGPoint){var a=r.createSVGPoint();if(Ii<0){var o=n(t);if(o.scrollX||o.scrollY){r=ui.select(\"body\").append(\"svg\").style({position:\"absolute\",top:0,left:0,margin:0,padding:0,border:\"none\"},\"important\");var i=r[0][0].getScreenCTM();Ii=!(i.f||i.e),r.remove()}}return Ii?(a.x=e.pageX,a.y=e.pageY):(a.x=e.clientX,a.y=e.clientY),a=a.matrixTransform(t.getScreenCTM().inverse()),[a.x,a.y]}var l=t.getBoundingClientRect();return[e.clientX-l.left-t.clientLeft,e.clientY-l.top-t.clientTop]}function K(){return ui.event.changedTouches[0].identifier}function tt(t){return t>0?1:t<0?-1:0}function et(t,e,r){return(e[0]-t[0])*(r[1]-t[1])-(e[1]-t[1])*(r[0]-t[0])}function rt(t){return t>1?0:t<-1?ji:Math.acos(t)}function nt(t){return t>1?Hi:t<-1?-Hi:Math.asin(t)}function at(t){return((t=Math.exp(t))-1/t)/2}function ot(t){return((t=Math.exp(t))+1/t)/2}function it(t){return((t=Math.exp(2*t))-1)/(t+1)}function lt(t){return(t=Math.sin(t/2))*t}function st(){}function ct(t,e,r){return this instanceof ct?(this.h=+t,this.s=+e,void(this.l=+r)):arguments.length<2?t instanceof ct?new ct(t.h,t.s,t.l):kt(\"\"+t,Mt,ct):new ct(t,e,r)}function ut(t,e,r){function n(t){return t>360?t-=360:t<0&&(t+=360),t<60?o+(i-o)*t/60:t<180?i:t<240?o+(i-o)*(240-t)/60:o}function a(t){return Math.round(255*n(t))}var o,i;return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)?0:e<0?0:e>1?1:e,r=r<0?0:r>1?1:r,i=r<=.5?r*(1+e):r+e-r*e,o=2*r-i,new xt(a(t+120),a(t),a(t-120))}function ft(t,e,r){return this instanceof ft?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof ft?new ft(t.h,t.c,t.l):t instanceof ht?gt(t.l,t.a,t.b):gt((t=At((t=ui.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new ft(t,e,r)}function dt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new ht(r,Math.cos(t*=Vi)*e,Math.sin(t)*e)}function ht(t,e,r){return this instanceof ht?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof ht?new ht(t.l,t.a,t.b):t instanceof ft?dt(t.h,t.c,t.l):At((t=xt(t)).r,t.g,t.b):new ht(t,e,r)}function pt(t,e,r){var n=(t+16)/116,a=n+e/500,o=n-r/200;return a=vt(a)*Ji,n=vt(n)*Ki,o=vt(o)*tl,new xt(yt(3.2404542*a-1.5371385*n-.4985314*o),yt(-.969266*a+1.8760108*n+.041556*o),yt(.0556434*a-.2040259*n+1.0572252*o))}function gt(t,e,r){return t>0?new ft(Math.atan2(r,e)*Ui,Math.sqrt(e*e+r*r),t):new ft(0/0,0/0,t)}function vt(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function mt(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function yt(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function xt(t,e,r){return this instanceof xt?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof xt?new xt(t.r,t.g,t.b):kt(\"\"+t,xt,ut):new xt(t,e,r)}function bt(t){return new xt(t>>16,t>>8&255,255&t)}function _t(t){return bt(t)+\"\"}function wt(t){return t<16?\"0\"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function kt(t,e,r){var n,a,o,i=0,l=0,s=0;if(n=/([a-z]+)\\((.*)\\)/.exec(t=t.toLowerCase()))switch(a=n[2].split(\",\"),n[1]){case\"hsl\":return r(parseFloat(a[0]),parseFloat(a[1])/100,parseFloat(a[2])/100);case\"rgb\":return e(Lt(a[0]),Lt(a[1]),Lt(a[2]))}return(o=nl.get(t))?e(o.r,o.g,o.b):(null==t||\"#\"!==t.charAt(0)||isNaN(o=parseInt(t.slice(1),16))||(4===t.length?(i=(3840&o)>>4,i|=i>>4,l=240&o,l|=l>>4,s=15&o,s|=s<<4):7===t.length&&(i=(16711680&o)>>16,l=(65280&o)>>8,s=255&o)),e(i,l,s))}function Mt(t,e,r){var n,a,o=Math.min(t/=255,e/=255,r/=255),i=Math.max(t,e,r),l=i-o,s=(i+o)/2;return l?(a=s<.5?l/(i+o):l/(2-i-o),n=t==i?(e-r)/l+(e<r?6:0):e==i?(r-t)/l+2:(t-e)/l+4,n*=60):(n=0/0,a=s>0&&s<1?0:n),new ct(n,a,s)}function At(t,e,r){t=Tt(t),e=Tt(e),r=Tt(r);var n=mt((.4124564*t+.3575761*e+.1804375*r)/Ji),a=mt((.2126729*t+.7151522*e+.072175*r)/Ki);return ht(116*a-16,500*(n-a),200*(a-mt((.0193339*t+.119192*e+.9503041*r)/tl)))}function Tt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Lt(t){var e=parseFloat(t);return\"%\"===t.charAt(t.length-1)?Math.round(2.55*e):e}function Ct(t){return\"function\"==typeof t?t:function(){return t}}function St(t){return function(e,r,n){return 2===arguments.length&&\"function\"==typeof r&&(n=r,r=null),zt(e,r,t,n)}}function zt(t,e,r,n){function a(){var t,e=s.status;if(!e&&Dt(s)||e>=200&&e<300||304===e){try{t=r.call(o,s)}catch(t){return void i.error.call(o,t)}i.load.call(o,t)}else i.error.call(o,s)}var o={},i=ui.dispatch(\"beforesend\",\"progress\",\"load\",\"error\"),l={},s=new XMLHttpRequest,c=null;return!this.XDomainRequest||\"withCredentials\"in s||!/^(http(s)?:)?\\/\\//.test(t)||(s=new XDomainRequest),\"onload\"in s?s.onload=s.onerror=a:s.onreadystatechange=function(){s.readyState>3&&a()},s.onprogress=function(t){var e=ui.event;ui.event=t;try{i.progress.call(o,s)}finally{ui.event=e}},o.header=function(t,e){return t=(t+\"\").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+\"\",o)},o.mimeType=function(t){return arguments.length?(e=null==t?null:t+\"\",o):e},o.responseType=function(t){return arguments.length?(c=t,o):c},o.response=function(t){return r=t,o},[\"get\",\"post\"].forEach(function(t){o[t]=function(){return o.send.apply(o,[t].concat(di(arguments)))}}),o.send=function(r,n,a){if(2===arguments.length&&\"function\"==typeof n&&(a=n,n=null),s.open(r,t,!0),null==e||\"accept\"in l||(l.accept=e+\",*/*\"),s.setRequestHeader)for(var u in l)s.setRequestHeader(u,l[u]);return null!=e&&s.overrideMimeType&&s.overrideMimeType(e),null!=c&&(s.responseType=c),null!=a&&o.on(\"error\",a).on(\"load\",function(t){a(null,t)}),i.beforesend.call(o,s),s.send(null==n?null:n),o},o.abort=function(){return s.abort(),o},ui.rebind(o,i,\"on\"),null==n?o:o.get(Ot(n))}function Ot(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}function Dt(t){var e=t.responseType;return e&&\"text\"!==e?t.response:t.responseText}function Pt(t,e,r){var n=arguments.length;n<2&&(e=0),n<3&&(r=Date.now());var a=r+e,o={c:t,t:a,n:null};return ol?ol.n=o:al=o,ol=o,il||(ll=clearTimeout(ll),il=1,sl(Et)),o}function Et(){var t=Nt(),e=It()-t;e>24?(isFinite(e)&&(clearTimeout(ll),ll=setTimeout(Et,e)),il=0):(il=1,sl(Et))}function Nt(){for(var t=Date.now(),e=al;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function It(){for(var t,e=al,r=1/0;e;)e.c?(e.t<r&&(r=e.t),e=(t=e).n):e=t?t.n=e.n:al=e.n;return ol=t,r}function Rt(t,e){return e-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function Ft(t,e){var r=Math.pow(10,3*bi(8-e));return{scale:e>8?function(t){return t/r}:function(t){return t*r},symbol:t}}function jt(t){var e=t.decimal,r=t.thousands,n=t.grouping,a=t.currency,o=n&&r?function(t,e){for(var a=t.length,o=[],i=0,l=n[0],s=0;a>0&&l>0&&(s+l+1>e&&(l=Math.max(1,e-s)),o.push(t.substring(a-=l,a+l)),!((s+=l+1)>e));)l=n[i=(i+1)%n.length];return o.reverse().join(r)}:b;return function(t){var r=ul.exec(t),n=r[1]||\" \",i=r[2]||\">\",l=r[3]||\"-\",s=r[4]||\"\",c=r[5],u=+r[6],f=r[7],d=r[8],h=r[9],p=1,g=\"\",v=\"\",m=!1,y=!0;switch(d&&(d=+d.substring(1)),(c||\"0\"===n&&\"=\"===i)&&(c=n=\"0\",i=\"=\"),h){case\"n\":f=!0,h=\"g\";break;case\"%\":p=100,v=\"%\",h=\"f\";break;case\"p\":p=100,v=\"%\",h=\"r\";break;case\"b\":case\"o\":case\"x\":case\"X\":\"#\"===s&&(g=\"0\"+h.toLowerCase());case\"c\":y=!1;case\"d\":m=!0,d=0;break;case\"s\":p=-1,h=\"r\"}\"$\"===s&&(g=a[0],v=a[1]),\"r\"!=h||d||(h=\"g\"),null!=d&&(\"g\"==h?d=Math.max(1,Math.min(21,d)):\"e\"!=h&&\"f\"!=h||(d=Math.max(0,Math.min(20,d)))),h=fl.get(h)||Bt;var x=c&&f;return function(t){var r=v;if(m&&t%1)return\"\";var a=t<0||0===t&&1/t<0?(t=-t,\"-\"):\"-\"===l?\"\":l;if(p<0){var s=ui.formatPrefix(t,d);t=s.scale(t),r=s.symbol+v}else t*=p;t=h(t,d);var b,_,w=t.lastIndexOf(\".\");if(w<0){var k=y?t.lastIndexOf(\"e\"):-1;k<0?(b=t,_=\"\"):(b=t.substring(0,k),_=t.substring(k))}else b=t.substring(0,w),_=e+t.substring(w+1);!c&&f&&(b=o(b,1/0));var M=g.length+b.length+_.length+(x?0:a.length),A=M<u?new Array(M=u-M+1).join(n):\"\";return x&&(b=o(A+b,A.length?u-_.length:1/0)),a+=g,t=b+_,(\"<\"===i?a+t+A:\">\"===i?A+a+t:\"^\"===i?A.substring(0,M>>=1)+a+t+A.substring(M):a+(x?t:A+t))+r}}}function Bt(t){return t+\"\"}function qt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ht(t,e,r){function n(e){var r=t(e),n=o(r,1);return e-r<n-e?r:n}function a(r){return e(r=t(new hl(r-1)),1),r}function o(t,r){return e(t=new hl(+t),r),t}function i(t,n,o){var i=a(t),l=[];if(o>1)for(;i<n;)r(i)%o||l.push(new Date(+i)),e(i,1);else for(;i<n;)l.push(new Date(+i)),e(i,1);return l}function l(t,e,r){try{hl=qt;var n=new qt;return n._=t,i(n,e,r)}finally{hl=Date}}t.floor=t,t.round=n,t.ceil=a,t.offset=o,t.range=i;var s=t.utc=Vt(t);return s.floor=s,s.round=Vt(n),s.ceil=Vt(a),s.offset=Vt(o),s.range=l,t}function Vt(t){return function(e,r){try{hl=qt;var n=new qt;return n._=e,t(n,r)._}finally{hl=Date}}}function Ut(t){function e(t){function e(e){for(var r,a,o,i=[],l=-1,s=0;++l<n;)37===t.charCodeAt(l)&&(i.push(t.slice(s,l)),null!=(a=gl[r=t.charAt(++l)])&&(r=t.charAt(++l)),(o=C[r])&&(r=o(e,null==a?\"e\"===r?\" \":\"0\":a)),i.push(r),s=l+1);return i.push(t.slice(s,l)),i.join(\"\")}var n=t.length;return e.parse=function(e){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null};if(r(n,t,e,0)!=e.length)return null;\"p\"in n&&(n.H=n.H%12+12*n.p);var a=null!=n.Z&&hl!==qt,o=new(a?qt:hl);return\"j\"in n?o.setFullYear(n.y,0,n.j):\"W\"in n||\"U\"in n?(\"w\"in n||(n.w=\"W\"in n?1:0),o.setFullYear(n.y,0,1),o.setFullYear(n.y,0,\"W\"in n?(n.w+6)%7+7*n.W-(o.getDay()+5)%7:n.w+7*n.U-(o.getDay()+6)%7)):o.setFullYear(n.y,n.m,n.d),o.setHours(n.H+(n.Z/100|0),n.M+n.Z%100,n.S,n.L),a?o._:o},e.toString=function(){return t},e}function r(t,e,r,n){for(var a,o,i,l=0,s=e.length,c=r.length;l<s;){if(n>=c)return-1;if(37===(a=e.charCodeAt(l++))){if(i=e.charAt(l++),!(o=S[i in gl?e.charAt(l++):i])||(n=o(t,r,n))<0)return-1}else if(a!=r.charCodeAt(n++))return-1}return n}function n(t,e,r){w.lastIndex=0;var n=w.exec(e.slice(r));return n?(t.w=k.get(n[0].toLowerCase()),r+n[0].length):-1}function a(t,e,r){b.lastIndex=0;var n=b.exec(e.slice(r));return n?(t.w=_.get(n[0].toLowerCase()),r+n[0].length):-1}function o(t,e,r){T.lastIndex=0;var n=T.exec(e.slice(r));return n?(t.m=L.get(n[0].toLowerCase()),r+n[0].length):-1}function i(t,e,r){M.lastIndex=0;var n=M.exec(e.slice(r));return n?(t.m=A.get(n[0].toLowerCase()),r+n[0].length):-1}function l(t,e,n){return r(t,C.c.toString(),e,n)}function s(t,e,n){return r(t,C.x.toString(),e,n)}function c(t,e,n){return r(t,C.X.toString(),e,n)}function u(t,e,r){var n=x.get(e.slice(r,r+=2).toLowerCase());return null==n?-1:(t.p=n,r)}var f=t.dateTime,d=t.date,h=t.time,p=t.periods,g=t.days,v=t.shortDays,m=t.months,y=t.shortMonths;e.utc=function(t){function r(t){try{hl=qt;var e=new hl;return e._=t,n(e)}finally{hl=Date}}var n=e(t);return r.parse=function(t){try{hl=qt;var e=n.parse(t);return e&&e._}finally{hl=Date}},r.toString=n.toString,r},e.multi=e.utc.multi=ue;var x=ui.map(),b=Gt(g),_=Yt(g),w=Gt(v),k=Yt(v),M=Gt(m),A=Yt(m),T=Gt(y),L=Yt(y);p.forEach(function(t,e){x.set(t.toLowerCase(),e)});var C={a:function(t){return v[t.getDay()]},A:function(t){return g[t.getDay()]},b:function(t){return y[t.getMonth()]},B:function(t){return m[t.getMonth()]},c:e(f),d:function(t,e){return Xt(t.getDate(),e,2)},e:function(t,e){return Xt(t.getDate(),e,2)},H:function(t,e){return Xt(t.getHours(),e,2)},I:function(t,e){return Xt(t.getHours()%12||12,e,2)},j:function(t,e){return Xt(1+dl.dayOfYear(t),e,3)},L:function(t,e){return Xt(t.getMilliseconds(),e,3)},m:function(t,e){return Xt(t.getMonth()+1,e,2)},M:function(t,e){return Xt(t.getMinutes(),e,2)},p:function(t){return p[+(t.getHours()>=12)]},S:function(t,e){return Xt(t.getSeconds(),e,2)},U:function(t,e){return Xt(dl.sundayOfYear(t),e,2)},w:function(t){return t.getDay()},W:function(t,e){return Xt(dl.mondayOfYear(t),e,2)},x:e(d),X:e(h),y:function(t,e){return Xt(t.getFullYear()%100,e,2)},Y:function(t,e){return Xt(t.getFullYear()%1e4,e,4)},Z:se,\"%\":function(){return\"%\"}},S={a:n,A:a,b:o,B:i,c:l,d:re,e:re,H:ae,I:ae,j:ne,L:le,m:ee,M:oe,p:u,S:ie,U:Wt,w:Zt,W:$t,x:s,X:c,y:Jt,Y:Qt,Z:Kt,\"%\":ce};return e}function Xt(t,e,r){var n=t<0?\"-\":\"\",a=(n?-t:t)+\"\",o=a.length;return n+(o<r?new Array(r-o+1).join(e)+a:a)}function Gt(t){return new RegExp(\"^(?:\"+t.map(ui.requote).join(\"|\")+\")\",\"i\")}function Yt(t){for(var e=new f,r=-1,n=t.length;++r<n;)e.set(t[r].toLowerCase(),r);return e}function Zt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function Wt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r));return n?(t.U=+n[0],r+n[0].length):-1}function $t(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r));return n?(t.W=+n[0],r+n[0].length):-1}function Qt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function Jt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.y=te(+n[0]),r+n[0].length):-1}function Kt(t,e,r){return/^[+-]\\d{4}$/.test(e=e.slice(r,r+5))?(t.Z=-e,r+5):-1}function te(t){return t+(t>68?1900:2e3)}function ee(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function re(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function ne(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+3));return n?(t.j=+n[0],r+n[0].length):-1}function ae(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function oe(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function ie(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function le(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function se(t){var e=t.getTimezoneOffset(),r=e>0?\"-\":\"+\",n=bi(e)/60|0,a=bi(e)%60;return r+Xt(n,\"0\",2)+Xt(a,\"0\",2)}function ce(t,e,r){ml.lastIndex=0;var n=ml.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function ue(t){\n",
|
|
"for(var e=t.length,r=-1;++r<e;)t[r][0]=this(t[r][0]);return function(e){for(var r=0,n=t[r];!n[1](e);)n=t[++r];return n[0](e)}}function fe(){}function de(t,e,r){var n=r.s=t+e,a=n-t,o=n-a;r.t=t-o+(e-a)}function he(t,e){t&&_l.hasOwnProperty(t.type)&&_l[t.type](t,e)}function pe(t,e,r){var n,a=-1,o=t.length-r;for(e.lineStart();++a<o;)n=t[a],e.point(n[0],n[1],n[2]);e.lineEnd()}function ge(t,e){var r=-1,n=t.length;for(e.polygonStart();++r<n;)pe(t[r],e,1);e.polygonEnd()}function ve(){function t(t,e){t*=Vi,e=e*Vi/2+ji/4;var r=t-n,i=r>=0?1:-1,l=i*r,s=Math.cos(e),c=Math.sin(e),u=o*c,f=a*s+u*Math.cos(l),d=u*i*Math.sin(l);kl.add(Math.atan2(d,f)),n=t,a=s,o=c}var e,r,n,a,o;Ml.point=function(i,l){Ml.point=t,n=(e=i)*Vi,a=Math.cos(l=(r=l)*Vi/2+ji/4),o=Math.sin(l)},Ml.lineEnd=function(){t(e,r)}}function me(t){var e=t[0],r=t[1],n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}function ye(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function xe(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function be(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function _e(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function we(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function ke(t){return[Math.atan2(t[1],t[0]),nt(t[2])]}function Me(t,e){return bi(t[0]-e[0])<Ri&&bi(t[1]-e[1])<Ri}function Ae(t,e){t*=Vi;var r=Math.cos(e*=Vi);Te(r*Math.cos(t),r*Math.sin(t),Math.sin(e))}function Te(t,e,r){++Al,Ll+=(t-Ll)/Al,Cl+=(e-Cl)/Al,Sl+=(r-Sl)/Al}function Le(){function t(t,a){t*=Vi;var o=Math.cos(a*=Vi),i=o*Math.cos(t),l=o*Math.sin(t),s=Math.sin(a),c=Math.atan2(Math.sqrt((c=r*s-n*l)*c+(c=n*i-e*s)*c+(c=e*l-r*i)*c),e*i+r*l+n*s);Tl+=c,zl+=c*(e+(e=i)),Ol+=c*(r+(r=l)),Dl+=c*(n+(n=s)),Te(e,r,n)}var e,r,n;Il.point=function(a,o){a*=Vi;var i=Math.cos(o*=Vi);e=i*Math.cos(a),r=i*Math.sin(a),n=Math.sin(o),Il.point=t,Te(e,r,n)}}function Ce(){Il.point=Ae}function Se(){function t(t,e){t*=Vi;var r=Math.cos(e*=Vi),i=r*Math.cos(t),l=r*Math.sin(t),s=Math.sin(e),c=a*s-o*l,u=o*i-n*s,f=n*l-a*i,d=Math.sqrt(c*c+u*u+f*f),h=n*i+a*l+o*s,p=d&&-rt(h)/d,g=Math.atan2(d,h);Pl+=p*c,El+=p*u,Nl+=p*f,Tl+=g,zl+=g*(n+(n=i)),Ol+=g*(a+(a=l)),Dl+=g*(o+(o=s)),Te(n,a,o)}var e,r,n,a,o;Il.point=function(i,l){e=i,r=l,Il.point=t,i*=Vi;var s=Math.cos(l*=Vi);n=s*Math.cos(i),a=s*Math.sin(i),o=Math.sin(l),Te(n,a,o)},Il.lineEnd=function(){t(e,r),Il.lineEnd=Ce,Il.point=Ae}}function ze(t,e){function r(r,n){return r=t(r,n),e(r[0],r[1])}return t.invert&&e.invert&&(r.invert=function(r,n){return(r=e.invert(r,n))&&t.invert(r[0],r[1])}),r}function Oe(){return!0}function De(t,e,r,n,a){var o=[],i=[];if(t.forEach(function(t){if(!((e=t.length-1)<=0)){var e,r=t[0],n=t[e];if(Me(r,n)){a.lineStart();for(var l=0;l<e;++l)a.point((r=t[l])[0],r[1]);return void a.lineEnd()}var s=new Ee(r,t,null,!0),c=new Ee(r,null,s,!1);s.o=c,o.push(s),i.push(c),s=new Ee(n,t,null,!1),c=new Ee(n,null,s,!0),s.o=c,o.push(s),i.push(c)}}),i.sort(e),Pe(o),Pe(i),o.length){for(var l=0,s=r,c=i.length;l<c;++l)i[l].e=s=!s;for(var u,f,d=o[0];;){for(var h=d,p=!0;h.v;)if((h=h.n)===d)return;u=h.z,a.lineStart();do{if(h.v=h.o.v=!0,h.e){if(p)for(var l=0,c=u.length;l<c;++l)a.point((f=u[l])[0],f[1]);else n(h.x,h.n.x,1,a);h=h.n}else{if(p){u=h.p.z;for(var l=u.length-1;l>=0;--l)a.point((f=u[l])[0],f[1])}else n(h.x,h.p.x,-1,a);h=h.p}h=h.o,u=h.z,p=!p}while(!h.v);a.lineEnd()}}}function Pe(t){if(e=t.length){for(var e,r,n=0,a=t[0];++n<e;)a.n=r=t[n],r.p=a,a=r;a.n=r=t[0],r.p=a}}function Ee(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function Ne(t,e,r,n){return function(a,o){function i(e,r){var n=a(e,r);t(e=n[0],r=n[1])&&o.point(e,r)}function l(t,e){var r=a(t,e);v.point(r[0],r[1])}function s(){y.point=l,v.lineStart()}function c(){y.point=i,v.lineEnd()}function u(t,e){g.push([t,e]);var r=a(t,e);b.point(r[0],r[1])}function f(){b.lineStart(),g=[]}function d(){u(g[0][0],g[0][1]),b.lineEnd();var t,e=b.clean(),r=x.buffer(),n=r.length;if(g.pop(),p.push(g),g=null,n)if(1&e){t=r[0];var a,n=t.length-1,i=-1;if(n>0){for(_||(o.polygonStart(),_=!0),o.lineStart();++i<n;)o.point((a=t[i])[0],a[1]);o.lineEnd()}}else n>1&&2&e&&r.push(r.pop().concat(r.shift())),h.push(r.filter(Ie))}var h,p,g,v=e(o),m=a.invert(n[0],n[1]),y={point:i,lineStart:s,lineEnd:c,polygonStart:function(){y.point=u,y.lineStart=f,y.lineEnd=d,h=[],p=[]},polygonEnd:function(){y.point=i,y.lineStart=s,y.lineEnd=c,h=ui.merge(h);var t=He(m,p);h.length?(_||(o.polygonStart(),_=!0),De(h,Fe,t,r,o)):t&&(_||(o.polygonStart(),_=!0),o.lineStart(),r(null,null,1,o),o.lineEnd()),_&&(o.polygonEnd(),_=!1),h=p=null},sphere:function(){o.polygonStart(),o.lineStart(),r(null,null,1,o),o.lineEnd(),o.polygonEnd()}},x=Re(),b=e(x),_=!1;return y}}function Ie(t){return t.length>1}function Re(){var t,e=[];return{lineStart:function(){e.push(t=[])},point:function(e,r){t.push([e,r])},lineEnd:k,buffer:function(){var r=e;return e=[],t=null,r},rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))}}}function Fe(t,e){return((t=t.x)[0]<0?t[1]-Hi-Ri:Hi-t[1])-((e=e.x)[0]<0?e[1]-Hi-Ri:Hi-e[1])}function je(t){var e,r=0/0,n=0/0,a=0/0;return{lineStart:function(){t.lineStart(),e=1},point:function(o,i){var l=o>0?ji:-ji,s=bi(o-r);bi(s-ji)<Ri?(t.point(r,n=(n+i)/2>0?Hi:-Hi),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),t.point(o,n),e=0):a!==l&&s>=ji&&(bi(r-a)<Ri&&(r-=a*Ri),bi(o-l)<Ri&&(o-=l*Ri),n=Be(r,n,o,i),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),e=0),t.point(r=o,n=i),a=l},lineEnd:function(){t.lineEnd(),r=n=0/0},clean:function(){return 2-e}}}function Be(t,e,r,n){var a,o,i=Math.sin(t-r);return bi(i)>Ri?Math.atan((Math.sin(e)*(o=Math.cos(n))*Math.sin(r)-Math.sin(n)*(a=Math.cos(e))*Math.sin(t))/(a*o*i)):(e+n)/2}function qe(t,e,r,n){var a;if(null==t)a=r*Hi,n.point(-ji,a),n.point(0,a),n.point(ji,a),n.point(ji,0),n.point(ji,-a),n.point(0,-a),n.point(-ji,-a),n.point(-ji,0),n.point(-ji,a);else if(bi(t[0]-e[0])>Ri){var o=t[0]<e[0]?ji:-ji;a=r*o/2,n.point(-o,a),n.point(0,a),n.point(o,a)}else n.point(e[0],e[1])}function He(t,e){var r=t[0],n=t[1],a=[Math.sin(r),-Math.cos(r),0],o=0,i=0;kl.reset();for(var l=0,s=e.length;l<s;++l){var c=e[l],u=c.length;if(u)for(var f=c[0],d=f[0],h=f[1]/2+ji/4,p=Math.sin(h),g=Math.cos(h),v=1;;){v===u&&(v=0),t=c[v];var m=t[0],y=t[1]/2+ji/4,x=Math.sin(y),b=Math.cos(y),_=m-d,w=_>=0?1:-1,k=w*_,M=k>ji,A=p*x;if(kl.add(Math.atan2(A*w*Math.sin(k),g*b+A*Math.cos(k))),o+=M?_+w*Bi:_,M^d>=r^m>=r){var T=xe(me(f),me(t));we(T);var L=xe(a,T);we(L);var C=(M^_>=0?-1:1)*nt(L[2]);(n>C||n===C&&(T[0]||T[1]))&&(i+=M^_>=0?1:-1)}if(!v++)break;d=m,p=x,g=b,f=t}}return(o<-Ri||o<Ri&&kl<-Ri)^1&i}function Ve(t){function e(t,e){return Math.cos(t)*Math.cos(e)>o}function r(t){var r,o,s,c,u;return{lineStart:function(){c=s=!1,u=1},point:function(f,d){var h,p=[f,d],g=e(f,d),v=i?g?0:a(f,d):g?a(f+(f<0?ji:-ji),d):0;if(!r&&(c=s=g)&&t.lineStart(),g!==s&&(h=n(r,p),(Me(r,h)||Me(p,h))&&(p[0]+=Ri,p[1]+=Ri,g=e(p[0],p[1]))),g!==s)u=0,g?(t.lineStart(),h=n(p,r),t.point(h[0],h[1])):(h=n(r,p),t.point(h[0],h[1]),t.lineEnd()),r=h;else if(l&&r&&i^g){var m;v&o||!(m=n(p,r,!0))||(u=0,i?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1])))}!g||r&&Me(r,p)||t.point(p[0],p[1]),r=p,s=g,o=v},lineEnd:function(){s&&t.lineEnd(),r=null},clean:function(){return u|(c&&s)<<1}}}function n(t,e,r){var n=me(t),a=me(e),i=[1,0,0],l=xe(n,a),s=ye(l,l),c=l[0],u=s-c*c;if(!u)return!r&&t;var f=o*s/u,d=-o*c/u,h=xe(i,l),p=_e(i,f);be(p,_e(l,d));var g=h,v=ye(p,g),m=ye(g,g),y=v*v-m*(ye(p,p)-1);if(!(y<0)){var x=Math.sqrt(y),b=_e(g,(-v-x)/m);if(be(b,p),b=ke(b),!r)return b;var _,w=t[0],k=e[0],M=t[1],A=e[1];k<w&&(_=w,w=k,k=_);var T=k-w,L=bi(T-ji)<Ri,C=L||T<Ri;if(!L&&A<M&&(_=M,M=A,A=_),C?L?M+A>0^b[1]<(bi(b[0]-w)<Ri?M:A):M<=b[1]&&b[1]<=A:T>ji^(w<=b[0]&&b[0]<=k)){var S=_e(g,(-v+x)/m);return be(S,p),[b,ke(S)]}}}function a(e,r){var n=i?t:ji-t,a=0;return e<-n?a|=1:e>n&&(a|=2),r<-n?a|=4:r>n&&(a|=8),a}var o=Math.cos(t),i=o>0,l=bi(o)>Ri;return Ne(e,r,vr(t,6*Vi),i?[0,-t]:[-ji,t-ji])}function Ue(t,e,r,n){return function(a){var o,i=a.a,l=a.b,s=i.x,c=i.y,u=l.x,f=l.y,d=0,h=1,p=u-s,g=f-c;if(o=t-s,p||!(o>0)){if(o/=p,p<0){if(o<d)return;o<h&&(h=o)}else if(p>0){if(o>h)return;o>d&&(d=o)}if(o=r-s,p||!(o<0)){if(o/=p,p<0){if(o>h)return;o>d&&(d=o)}else if(p>0){if(o<d)return;o<h&&(h=o)}if(o=e-c,g||!(o>0)){if(o/=g,g<0){if(o<d)return;o<h&&(h=o)}else if(g>0){if(o>h)return;o>d&&(d=o)}if(o=n-c,g||!(o<0)){if(o/=g,g<0){if(o>h)return;o>d&&(d=o)}else if(g>0){if(o<d)return;o<h&&(h=o)}return d>0&&(a.a={x:s+d*p,y:c+d*g}),h<1&&(a.b={x:s+h*p,y:c+h*g}),a}}}}}}function Xe(t,e,r,n){function a(n,a){return bi(n[0]-t)<Ri?a>0?0:3:bi(n[0]-r)<Ri?a>0?2:1:bi(n[1]-e)<Ri?a>0?1:0:a>0?3:2}function o(t,e){return i(t.x,e.x)}function i(t,e){var r=a(t,1),n=a(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}return function(l){function s(t){for(var e=0,r=v.length,n=t[1],a=0;a<r;++a)for(var o,i=1,l=v[a],s=l.length,c=l[0];i<s;++i)o=l[i],c[1]<=n?o[1]>n&&et(c,o,t)>0&&++e:o[1]<=n&&et(c,o,t)<0&&--e,c=o;return 0!==e}function c(o,l,s,c){var u=0,f=0;if(null==o||(u=a(o,s))!==(f=a(l,s))||i(o,l)<0^s>0)do{c.point(0===u||3===u?t:r,u>1?n:e)}while((u=(u+s+4)%4)!==f);else c.point(l[0],l[1])}function u(a,o){return t<=a&&a<=r&&e<=o&&o<=n}function f(t,e){u(t,e)&&l.point(t,e)}function d(){S.point=p,v&&v.push(m=[]),M=!0,k=!1,_=w=0/0}function h(){g&&(p(y,x),b&&k&&L.rejoin(),g.push(L.buffer())),S.point=f,k&&l.lineEnd()}function p(t,e){t=Math.max(-Fl,Math.min(Fl,t)),e=Math.max(-Fl,Math.min(Fl,e));var r=u(t,e);if(v&&m.push([t,e]),M)y=t,x=e,b=r,M=!1,r&&(l.lineStart(),l.point(t,e));else if(r&&k)l.point(t,e);else{var n={a:{x:_,y:w},b:{x:t,y:e}};C(n)?(k||(l.lineStart(),l.point(n.a.x,n.a.y)),l.point(n.b.x,n.b.y),r||l.lineEnd(),A=!1):r&&(l.lineStart(),l.point(t,e),A=!1)}_=t,w=e,k=r}var g,v,m,y,x,b,_,w,k,M,A,T=l,L=Re(),C=Ue(t,e,r,n),S={point:f,lineStart:d,lineEnd:h,polygonStart:function(){l=L,g=[],v=[],A=!0},polygonEnd:function(){l=T,g=ui.merge(g);var e=s([t,n]),r=A&&e,a=g.length;(r||a)&&(l.polygonStart(),r&&(l.lineStart(),c(null,null,1,l),l.lineEnd()),a&&De(g,o,e,c,l),l.polygonEnd()),g=v=m=null}};return S}}function Ge(t){var e=0,r=ji/3,n=sr(t),a=n(e,r);return a.parallels=function(t){return arguments.length?n(e=t[0]*ji/180,r=t[1]*ji/180):[e/ji*180,r/ji*180]},a}function Ye(t,e){function r(t,e){var r=Math.sqrt(o-2*a*Math.sin(e))/a;return[r*Math.sin(t*=a),i-r*Math.cos(t)]}var n=Math.sin(t),a=(n+Math.sin(e))/2,o=1+n*(2*a-n),i=Math.sqrt(o)/a;return r.invert=function(t,e){var r=i-e;return[Math.atan2(t,r)/a,nt((o-(t*t+r*r)*a*a)/(2*a))]},r}function Ze(){function t(t,e){Bl+=a*t-n*e,n=t,a=e}var e,r,n,a;Xl.point=function(o,i){Xl.point=t,e=n=o,r=a=i},Xl.lineEnd=function(){t(e,r)}}function We(t,e){t<ql&&(ql=t),t>Vl&&(Vl=t),e<Hl&&(Hl=e),e>Ul&&(Ul=e)}function $e(){function t(t,e){i.push(\"M\",t,\",\",e,o)}function e(t,e){i.push(\"M\",t,\",\",e),l.point=r}function r(t,e){i.push(\"L\",t,\",\",e)}function n(){l.point=t}function a(){i.push(\"Z\")}var o=Qe(4.5),i=[],l={point:t,lineStart:function(){l.point=e},lineEnd:n,polygonStart:function(){l.lineEnd=a},polygonEnd:function(){l.lineEnd=n,l.point=t},pointRadius:function(t){return o=Qe(t),l},result:function(){if(i.length){var t=i.join(\"\");return i=[],t}}};return l}function Qe(t){return\"m0,\"+t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+-2*t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+2*t+\"z\"}function Je(t,e){Ll+=t,Cl+=e,++Sl}function Ke(){function t(t,n){var a=t-e,o=n-r,i=Math.sqrt(a*a+o*o);zl+=i*(e+t)/2,Ol+=i*(r+n)/2,Dl+=i,Je(e=t,r=n)}var e,r;Yl.point=function(n,a){Yl.point=t,Je(e=n,r=a)}}function tr(){Yl.point=Je}function er(){function t(t,e){var r=t-n,o=e-a,i=Math.sqrt(r*r+o*o);zl+=i*(n+t)/2,Ol+=i*(a+e)/2,Dl+=i,i=a*t-n*e,Pl+=i*(n+t),El+=i*(a+e),Nl+=3*i,Je(n=t,a=e)}var e,r,n,a;Yl.point=function(o,i){Yl.point=t,Je(e=n=o,r=a=i)},Yl.lineEnd=function(){t(e,r)}}function rr(t){function e(e,r){t.moveTo(e+i,r),t.arc(e,r,i,0,Bi)}function r(e,r){t.moveTo(e,r),l.point=n}function n(e,r){t.lineTo(e,r)}function a(){l.point=e}function o(){t.closePath()}var i=4.5,l={point:e,lineStart:function(){l.point=r},lineEnd:a,polygonStart:function(){l.lineEnd=o},polygonEnd:function(){l.lineEnd=a,l.point=e},pointRadius:function(t){return i=t,l},result:k};return l}function nr(t){function e(t){return(l?n:r)(t)}function r(e){return ir(e,function(r,n){r=t(r,n),e.point(r[0],r[1])})}function n(e){function r(r,n){r=t(r,n),e.point(r[0],r[1])}function n(){x=0/0,M.point=o,e.lineStart()}function o(r,n){var o=me([r,n]),i=t(r,n);a(x,b,y,_,w,k,x=i[0],b=i[1],y=r,_=o[0],w=o[1],k=o[2],l,e),e.point(x,b)}function i(){M.point=r,e.lineEnd()}function s(){n(),M.point=c,M.lineEnd=u}function c(t,e){o(f=t,d=e),h=x,p=b,g=_,v=w,m=k,M.point=o}function u(){a(x,b,y,_,w,k,h,p,f,g,v,m,l,e),M.lineEnd=i,i()}var f,d,h,p,g,v,m,y,x,b,_,w,k,M={point:r,lineStart:n,lineEnd:i,polygonStart:function(){e.polygonStart(),M.lineStart=s},polygonEnd:function(){e.polygonEnd(),M.lineStart=n}};return M}function a(e,r,n,l,s,c,u,f,d,h,p,g,v,m){var y=u-e,x=f-r,b=y*y+x*x;if(b>4*o&&v--){var _=l+h,w=s+p,k=c+g,M=Math.sqrt(_*_+w*w+k*k),A=Math.asin(k/=M),T=bi(bi(k)-1)<Ri||bi(n-d)<Ri?(n+d)/2:Math.atan2(w,_),L=t(T,A),C=L[0],S=L[1],z=C-e,O=S-r,D=x*z-y*O;(D*D/b>o||bi((y*z+x*O)/b-.5)>.3||l*h+s*p+c*g<i)&&(a(e,r,n,l,s,c,C,S,T,_/=M,w/=M,k,v,m),m.point(C,S),a(C,S,T,_,w,k,u,f,d,h,p,g,v,m))}}var o=.5,i=Math.cos(30*Vi),l=16;return e.precision=function(t){return arguments.length?(l=(o=t*t)>0&&16,e):Math.sqrt(o)},e}function ar(t){var e=nr(function(e,r){return t([e*Ui,r*Ui])});return function(t){return cr(e(t))}}function or(t){this.stream=t}function ir(t,e){return{point:e,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function lr(t){return sr(function(){return t})()}function sr(t){function e(t){return t=l(t[0]*Vi,t[1]*Vi),[t[0]*d+s,c-t[1]*d]}function r(t){return(t=l.invert((t[0]-s)/d,(c-t[1])/d))&&[t[0]*Ui,t[1]*Ui]}function n(){l=ze(i=dr(m,y,x),o);var t=o(g,v);return s=h-t[0]*d,c=p+t[1]*d,a()}function a(){return u&&(u.valid=!1,u=null),e}var o,i,l,s,c,u,f=nr(function(t,e){return t=o(t,e),[t[0]*d+s,c-t[1]*d]}),d=150,h=480,p=250,g=0,v=0,m=0,y=0,x=0,_=Rl,w=b,k=null,M=null;return e.stream=function(t){return u&&(u.valid=!1),u=cr(_(i,f(w(t)))),u.valid=!0,u},e.clipAngle=function(t){return arguments.length?(_=null==t?(k=t,Rl):Ve((k=+t)*Vi),a()):k},e.clipExtent=function(t){return arguments.length?(M=t,w=t?Xe(t[0][0],t[0][1],t[1][0],t[1][1]):b,a()):M},e.scale=function(t){return arguments.length?(d=+t,n()):d},e.translate=function(t){return arguments.length?(h=+t[0],p=+t[1],n()):[h,p]},e.center=function(t){return arguments.length?(g=t[0]%360*Vi,v=t[1]%360*Vi,n()):[g*Ui,v*Ui]},e.rotate=function(t){return arguments.length?(m=t[0]%360*Vi,y=t[1]%360*Vi,x=t.length>2?t[2]%360*Vi:0,n()):[m*Ui,y*Ui,x*Ui]},ui.rebind(e,f,\"precision\"),function(){return o=t.apply(this,arguments),e.invert=o.invert&&r,n()}}function cr(t){return ir(t,function(e,r){t.point(e*Vi,r*Vi)})}function ur(t,e){return[t,e]}function fr(t,e){return[t>ji?t-Bi:t<-ji?t+Bi:t,e]}function dr(t,e,r){return t?e||r?ze(pr(t),gr(e,r)):pr(t):e||r?gr(e,r):fr}function hr(t){return function(e,r){return e+=t,[e>ji?e-Bi:e<-ji?e+Bi:e,r]}}function pr(t){var e=hr(t);return e.invert=hr(-t),e}function gr(t,e){function r(t,e){var r=Math.cos(e),l=Math.cos(t)*r,s=Math.sin(t)*r,c=Math.sin(e),u=c*n+l*a;return[Math.atan2(s*o-u*i,l*n-c*a),nt(u*o+s*i)]}var n=Math.cos(t),a=Math.sin(t),o=Math.cos(e),i=Math.sin(e);return r.invert=function(t,e){var r=Math.cos(e),l=Math.cos(t)*r,s=Math.sin(t)*r,c=Math.sin(e),u=c*o-s*i;return[Math.atan2(s*o+c*i,l*n+u*a),nt(u*n-l*a)]},r}function vr(t,e){var r=Math.cos(t),n=Math.sin(t);return function(a,o,i,l){var s=i*e;null!=a?(a=mr(r,a),o=mr(r,o),(i>0?a<o:a>o)&&(a+=i*Bi)):(a=t+i*Bi,o=t-.5*s);for(var c,u=a;i>0?u>o:u<o;u-=s)l.point((c=ke([r,-n*Math.cos(u),-n*Math.sin(u)]))[0],c[1])}}function mr(t,e){var r=me(e);r[0]-=t,we(r);var n=rt(-r[1]);return((-r[2]<0?-n:n)+2*Math.PI-Ri)%(2*Math.PI)}function yr(t,e,r){var n=ui.range(t,e-Ri,r).concat(e);return function(t){return n.map(function(e){return[t,e]})}}function xr(t,e,r){var n=ui.range(t,e-Ri,r).concat(e);return function(t){return n.map(function(e){return[e,t]})}}function br(t){return t.source}function _r(t){return t.target}function wr(t,e,r,n){var a=Math.cos(e),o=Math.sin(e),i=Math.cos(n),l=Math.sin(n),s=a*Math.cos(t),c=a*Math.sin(t),u=i*Math.cos(r),f=i*Math.sin(r),d=2*Math.asin(Math.sqrt(lt(n-e)+a*i*lt(r-t))),h=1/Math.sin(d),p=d?function(t){var e=Math.sin(t*=d)*h,r=Math.sin(d-t)*h,n=r*s+e*u,a=r*c+e*f,i=r*o+e*l;return[Math.atan2(a,n)*Ui,Math.atan2(i,Math.sqrt(n*n+a*a))*Ui]}:function(){return[t*Ui,e*Ui]};return p.distance=d,p}function kr(){function t(t,a){var o=Math.sin(a*=Vi),i=Math.cos(a),l=bi((t*=Vi)-e),s=Math.cos(l);Zl+=Math.atan2(Math.sqrt((l=i*Math.sin(l))*l+(l=n*o-r*i*s)*l),r*o+n*i*s),e=t,r=o,n=i}var e,r,n;Wl.point=function(a,o){e=a*Vi,r=Math.sin(o*=Vi),n=Math.cos(o),Wl.point=t},Wl.lineEnd=function(){Wl.point=Wl.lineEnd=k}}function Mr(t,e){function r(e,r){var n=Math.cos(e),a=Math.cos(r),o=t(n*a);return[o*a*Math.sin(e),o*Math.sin(r)]}return r.invert=function(t,r){var n=Math.sqrt(t*t+r*r),a=e(n),o=Math.sin(a),i=Math.cos(a);return[Math.atan2(t*o,n*i),Math.asin(n&&r*o/n)]},r}function Ar(t,e){function r(t,e){i>0?e<-Hi+Ri&&(e=-Hi+Ri):e>Hi-Ri&&(e=Hi-Ri);var r=i/Math.pow(a(e),o);return[r*Math.sin(o*t),i-r*Math.cos(o*t)]}var n=Math.cos(t),a=function(t){return Math.tan(ji/4+t/2)},o=t===e?Math.sin(t):Math.log(n/Math.cos(e))/Math.log(a(e)/a(t)),i=n*Math.pow(a(t),o)/o;return o?(r.invert=function(t,e){var r=i-e,n=tt(o)*Math.sqrt(t*t+r*r);return[Math.atan2(t,r)/o,2*Math.atan(Math.pow(i/n,1/o))-Hi]},r):Lr}function Tr(t,e){function r(t,e){var r=o-e;return[r*Math.sin(a*t),o-r*Math.cos(a*t)]}var n=Math.cos(t),a=t===e?Math.sin(t):(n-Math.cos(e))/(e-t),o=n/a+t;return bi(a)<Ri?ur:(r.invert=function(t,e){var r=o-e;return[Math.atan2(t,r)/a,o-tt(a)*Math.sqrt(t*t+r*r)]},r)}function Lr(t,e){return[t,Math.log(Math.tan(ji/4+e/2))]}function Cr(t){var e,r=lr(t),n=r.scale,a=r.translate,o=r.clipExtent;return r.scale=function(){var t=n.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.translate=function(){var t=a.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.clipExtent=function(t){var i=o.apply(r,arguments);if(i===r){if(e=null==t){var l=ji*n(),s=a();o([[s[0]-l,s[1]-l],[s[0]+l,s[1]+l]])}}else e&&(i=null);return i},r.clipExtent(null)}function Sr(t,e){return[Math.log(Math.tan(ji/4+e/2)),-t]}function zr(t){return t[0]}function Or(t){return t[1]}function Dr(t){for(var e=t.length,r=[0,1],n=2,a=2;a<e;a++){for(;n>1&&et(t[r[n-2]],t[r[n-1]],t[a])<=0;)--n;r[n++]=a}return r.slice(0,n)}function Pr(t,e){return t[0]-e[0]||t[1]-e[1]}function Er(t,e,r){return(r[0]-e[0])*(t[1]-e[1])<(r[1]-e[1])*(t[0]-e[0])}function Nr(t,e,r,n){var a=t[0],o=r[0],i=e[0]-a,l=n[0]-o,s=t[1],c=r[1],u=e[1]-s,f=n[1]-c,d=(l*(s-c)-f*(a-o))/(f*i-l*u);return[a+d*i,s+d*u]}function Ir(t){var e=t[0],r=t[t.length-1];return!(e[0]-r[0]||e[1]-r[1])}function Rr(){an(this),this.edge=this.site=this.circle=null}function Fr(t){var e=ls.pop()||new Rr;return e.site=t,e}function jr(t){Wr(t),as.remove(t),ls.push(t),an(t)}function Br(t){var e=t.circle,r=e.x,n=e.cy,a={x:r,y:n},o=t.P,i=t.N,l=[t];jr(t);for(var s=o;s.circle&&bi(r-s.circle.x)<Ri&&bi(n-s.circle.cy)<Ri;)o=s.P,l.unshift(s),jr(s),s=o;l.unshift(s),Wr(s);for(var c=i;c.circle&&bi(r-c.circle.x)<Ri&&bi(n-c.circle.cy)<Ri;)i=c.N,l.push(c),jr(c),c=i;l.push(c),Wr(c);var u,f=l.length;for(u=1;u<f;++u)c=l[u],s=l[u-1],en(c.edge,s.site,c.site,a);s=l[0],c=l[f-1],c.edge=Kr(s.site,c.site,null,a),Zr(s),Zr(c)}function qr(t){for(var e,r,n,a,o=t.x,i=t.y,l=as._;l;)if((n=Hr(l,i)-o)>Ri)l=l.L;else{if(!((a=o-Vr(l,i))>Ri)){n>-Ri?(e=l.P,r=l):a>-Ri?(e=l,r=l.N):e=r=l;break}if(!l.R){e=l;break}l=l.R}var s=Fr(t);if(as.insert(e,s),e||r){if(e===r)return Wr(e),r=Fr(e.site),as.insert(s,r),s.edge=r.edge=Kr(e.site,s.site),Zr(e),void Zr(r);if(!r)return void(s.edge=Kr(e.site,s.site));Wr(e),Wr(r);var c=e.site,u=c.x,f=c.y,d=t.x-u,h=t.y-f,p=r.site,g=p.x-u,v=p.y-f,m=2*(d*v-h*g),y=d*d+h*h,x=g*g+v*v,b={x:(v*y-h*x)/m+u,y:(d*x-g*y)/m+f};en(r.edge,c,p,b),s.edge=Kr(c,t,null,b),r.edge=Kr(t,p,null,b),Zr(e),Zr(r)}}function Hr(t,e){var r=t.site,n=r.x,a=r.y,o=a-e;if(!o)return n;var i=t.P;if(!i)return-1/0;r=i.site;var l=r.x,s=r.y,c=s-e;if(!c)return l;var u=l-n,f=1/o-1/c,d=u/c;return f?(-d+Math.sqrt(d*d-2*f*(u*u/(-2*c)-s+c/2+a-o/2)))/f+n:(n+l)/2}function Vr(t,e){var r=t.N;if(r)return Hr(r,e);var n=t.site;return n.y===e?n.x:1/0}function Ur(t){this.site=t,this.edges=[]}function Xr(t){for(var e,r,n,a,o,i,l,s,c,u,f=t[0][0],d=t[1][0],h=t[0][1],p=t[1][1],g=ns,v=g.length;v--;)if((o=g[v])&&o.prepare())for(l=o.edges,s=l.length,i=0;i<s;)u=l[i].end(),n=u.x,a=u.y,c=l[++i%s].start(),e=c.x,r=c.y,(bi(n-e)>Ri||bi(a-r)>Ri)&&(l.splice(i,0,new rn(tn(o.site,u,bi(n-f)<Ri&&p-a>Ri?{x:f,y:bi(e-f)<Ri?r:p}:bi(a-p)<Ri&&d-n>Ri?{x:bi(r-p)<Ri?e:d,y:p}:bi(n-d)<Ri&&a-h>Ri?{x:d,y:bi(e-d)<Ri?r:h}:bi(a-h)<Ri&&n-f>Ri?{x:bi(r-h)<Ri?e:f,y:h}:null),o.site,null)),++s)}function Gr(t,e){return e.angle-t.angle}function Yr(){an(this),this.x=this.y=this.arc=this.site=this.cy=null}function Zr(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,a=t.site,o=r.site;if(n!==o){var i=a.x,l=a.y,s=n.x-i,c=n.y-l,u=o.x-i,f=o.y-l,d=2*(s*f-c*u);if(!(d>=-Fi)){var h=s*s+c*c,p=u*u+f*f,g=(f*h-c*p)/d,v=(s*p-u*h)/d,f=v+l,m=ss.pop()||new Yr;m.arc=t,m.site=a,m.x=g+i,m.y=f+Math.sqrt(g*g+v*v),m.cy=f,t.circle=m;for(var y=null,x=is._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}is.insert(y,m),y||(os=m)}}}}function Wr(t){var e=t.circle;e&&(e.P||(os=e.N),is.remove(e),ss.push(e),an(e),t.circle=null)}function $r(t){for(var e,r=rs,n=Ue(t[0][0],t[0][1],t[1][0],t[1][1]),a=r.length;a--;)e=r[a],(!Qr(e,t)||!n(e)||bi(e.a.x-e.b.x)<Ri&&bi(e.a.y-e.b.y)<Ri)&&(e.a=e.b=null,r.splice(a,1))}function Qr(t,e){var r=t.b;if(r)return!0;var n,a,o=t.a,i=e[0][0],l=e[1][0],s=e[0][1],c=e[1][1],u=t.l,f=t.r,d=u.x,h=u.y,p=f.x,g=f.y,v=(d+p)/2,m=(h+g)/2;if(g===h){if(v<i||v>=l)return;if(d>p){if(o){if(o.y>=c)return}else o={x:v,y:s};r={x:v,y:c}}else{if(o){if(o.y<s)return}else o={x:v,y:c};r={x:v,y:s}}}else if(n=(d-p)/(g-h),a=m-n*v,n<-1||n>1)if(d>p){if(o){if(o.y>=c)return}else o={x:(s-a)/n,y:s};r={x:(c-a)/n,y:c}}else{if(o){if(o.y<s)return}else o={x:(c-a)/n,y:c};r={x:(s-a)/n,y:s}}else if(h<g){if(o){if(o.x>=l)return}else o={x:i,y:n*i+a};r={x:l,y:n*l+a}}else{if(o){if(o.x<i)return}else o={x:l,y:n*l+a};r={x:i,y:n*i+a}}return t.a=o,t.b=r,!0}function Jr(t,e){this.l=t,this.r=e,this.a=this.b=null}function Kr(t,e,r,n){var a=new Jr(t,e);return rs.push(a),r&&en(a,t,e,r),n&&en(a,e,t,n),ns[t.i].edges.push(new rn(a,t,e)),ns[e.i].edges.push(new rn(a,e,t)),a}function tn(t,e,r){var n=new Jr(t,null);return n.a=e,n.b=r,rs.push(n),n}function en(t,e,r,n){t.a||t.b?t.l===r?t.b=n:t.a=n:(t.a=n,t.l=e,t.r=r)}function rn(t,e,r){var n=t.a,a=t.b;this.edge=t,this.site=e,this.angle=r?Math.atan2(r.y-e.y,r.x-e.x):t.l===e?Math.atan2(a.x-n.x,n.y-a.y):Math.atan2(n.x-a.x,a.y-n.y)}function nn(){this._=null}function an(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function on(t,e){var r=e,n=e.R,a=r.U;a?a.L===r?a.L=n:a.R=n:t._=n,n.U=a,r.U=n,r.R=n.L,r.R&&(r.R.U=r),n.L=r}function ln(t,e){var r=e,n=e.L,a=r.U;a?a.L===r?a.L=n:a.R=n:t._=n,n.U=a,r.U=n,r.L=n.R,r.L&&(r.L.U=r),n.R=r}function sn(t){for(;t.L;)t=t.L;return t}function cn(t,e){var r,n,a,o=t.sort(un).pop();for(rs=[],ns=new Array(t.length),as=new nn,is=new nn;;)if(a=os,o&&(!a||o.y<a.y||o.y===a.y&&o.x<a.x))o.x===r&&o.y===n||(ns[o.i]=new Ur(o),qr(o),r=o.x,n=o.y),o=t.pop();else{if(!a)break;Br(a.arc)}e&&($r(e),Xr(e));var i={cells:ns,edges:rs};return as=is=rs=ns=null,i}function un(t,e){return e.y-t.y||e.x-t.x}function fn(t,e,r){return(t.x-r.x)*(e.y-t.y)-(t.x-e.x)*(r.y-t.y)}function dn(t){return t.x}function hn(t){return t.y}function pn(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function gn(t,e,r,n,a,o){if(!t(e,r,n,a,o)){var i=.5*(r+a),l=.5*(n+o),s=e.nodes;s[0]&&gn(t,s[0],r,n,i,l),s[1]&&gn(t,s[1],i,n,a,l),s[2]&&gn(t,s[2],r,l,i,o),s[3]&&gn(t,s[3],i,l,a,o)}}function vn(t,e,r,n,a,o,i){var l,s=1/0;return function t(c,u,f,d,h){if(!(u>o||f>i||d<n||h<a)){if(p=c.point){var p,g=e-c.x,v=r-c.y,m=g*g+v*v;if(m<s){var y=Math.sqrt(s=m);n=e-y,a=r-y,o=e+y,i=r+y,l=p}}for(var x=c.nodes,b=.5*(u+d),_=.5*(f+h),w=e>=b,k=r>=_,M=k<<1|w,A=M+4;M<A;++M)if(c=x[3&M])switch(3&M){case 0:t(c,u,f,b,_);break;case 1:t(c,b,f,d,_);break;case 2:t(c,u,_,b,h);break;case 3:t(c,b,_,d,h)}}}(t,n,a,o,i),l}function mn(t,e){t=ui.rgb(t),e=ui.rgb(e);var r=t.r,n=t.g,a=t.b,o=e.r-r,i=e.g-n,l=e.b-a;return function(t){return\"#\"+wt(Math.round(r+o*t))+wt(Math.round(n+i*t))+wt(Math.round(a+l*t))}}function yn(t,e){var r,n={},a={};for(r in t)r in e?n[r]=_n(t[r],e[r]):a[r]=t[r];for(r in e)r in t||(a[r]=e[r]);return function(t){for(r in n)a[r]=n[r](t);return a}}function xn(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}function bn(t,e){var r,n,a,o=us.lastIndex=fs.lastIndex=0,i=-1,l=[],s=[];for(t+=\"\",e+=\"\";(r=us.exec(t))&&(n=fs.exec(e));)(a=n.index)>o&&(a=e.slice(o,a),l[i]?l[i]+=a:l[++i]=a),(r=r[0])===(n=n[0])?l[i]?l[i]+=n:l[++i]=n:(l[++i]=null,s.push({i:i,x:xn(r,n)})),o=fs.lastIndex;return o<e.length&&(a=e.slice(o),l[i]?l[i]+=a:l[++i]=a),l.length<2?s[0]?(e=s[0].x,function(t){return e(t)+\"\"}):function(){return e}:(e=s.length,function(t){for(var r,n=0;n<e;++n)l[(r=s[n]).i]=r.x(t);return l.join(\"\")})}function _n(t,e){for(var r,n=ui.interpolators.length;--n>=0&&!(r=ui.interpolators[n](t,e)););return r}function wn(t,e){var r,n=[],a=[],o=t.length,i=e.length,l=Math.min(t.length,e.length);for(r=0;r<l;++r)n.push(_n(t[r],e[r]));for(;r<o;++r)a[r]=t[r];for(;r<i;++r)a[r]=e[r];return function(t){for(r=0;r<l;++r)a[r]=n[r](t);return a}}function kn(t){return function(e){return e<=0?0:e>=1?1:t(e)}}function Mn(t){return function(e){return 1-t(1-e)}}function An(t){return function(e){return.5*(e<.5?t(2*e):2-t(2-2*e))}}function Tn(t){return t*t}function Ln(t){return t*t*t}function Cn(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function Sn(t){return function(e){return Math.pow(e,t)}}function zn(t){return 1-Math.cos(t*Hi)}function On(t){return Math.pow(2,10*(t-1))}function Dn(t){return 1-Math.sqrt(1-t*t)}function Pn(t,e){var r;return arguments.length<2&&(e=.45),arguments.length?r=e/Bi*Math.asin(1/t):(t=1,r=e/4),function(n){return 1+t*Math.pow(2,-10*n)*Math.sin((n-r)*Bi/e)}}function En(t){return t||(t=1.70158),function(e){return e*e*((t+1)*e-t)}}function Nn(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function In(t,e){t=ui.hcl(t),e=ui.hcl(e);var r=t.h,n=t.c,a=t.l,o=e.h-r,i=e.c-n,l=e.l-a;return isNaN(i)&&(i=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return dt(r+o*t,n+i*t,a+l*t)+\"\"}}function Rn(t,e){t=ui.hsl(t),e=ui.hsl(e);var r=t.h,n=t.s,a=t.l,o=e.h-r,i=e.s-n,l=e.l-a;return isNaN(i)&&(i=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return ut(r+o*t,n+i*t,a+l*t)+\"\"}}function Fn(t,e){t=ui.lab(t),e=ui.lab(e);var r=t.l,n=t.a,a=t.b,o=e.l-r,i=e.a-n,l=e.b-a;return function(t){return pt(r+o*t,n+i*t,a+l*t)+\"\"}}function jn(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Bn(t){var e=[t.a,t.b],r=[t.c,t.d],n=Hn(e),a=qn(e,r),o=Hn(Vn(r,e,-a))||0;e[0]*r[1]<r[0]*e[1]&&(e[0]*=-1,e[1]*=-1,n*=-1,a*=-1),this.rotate=(n?Math.atan2(e[1],e[0]):Math.atan2(-r[0],r[1]))*Ui,this.translate=[t.e,t.f],this.scale=[n,o],this.skew=o?Math.atan2(a,o)*Ui:0}function qn(t,e){return t[0]*e[0]+t[1]*e[1]}function Hn(t){var e=Math.sqrt(qn(t,t));return e&&(t[0]/=e,t[1]/=e),e}function Vn(t,e,r){return t[0]+=r*e[0],t[1]+=r*e[1],t}function Un(t){return t.length?t.pop()+\",\":\"\"}function Xn(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var a=r.push(\"translate(\",null,\",\",null,\")\");n.push({i:a-4,x:xn(t[0],e[0])},{i:a-2,x:xn(t[1],e[1])})}else(e[0]||e[1])&&r.push(\"translate(\"+e+\")\")}function Gn(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Un(r)+\"rotate(\",null,\")\")-2,x:xn(t,e)})):e&&r.push(Un(r)+\"rotate(\"+e+\")\")}function Yn(t,e,r,n){t!==e?n.push({i:r.push(Un(r)+\"skewX(\",null,\")\")-2,x:xn(t,e)}):e&&r.push(Un(r)+\"skewX(\"+e+\")\")}function Zn(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var a=r.push(Un(r)+\"scale(\",null,\",\",null,\")\");n.push({i:a-4,x:xn(t[0],e[0])},{i:a-2,x:xn(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Un(r)+\"scale(\"+e+\")\")}function Wn(t,e){var r=[],n=[];return t=ui.transform(t),e=ui.transform(e),Xn(t.translate,e.translate,r,n),Gn(t.rotate,e.rotate,r,n),Yn(t.skew,e.skew,r,n),Zn(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,a=-1,o=n.length;++a<o;)r[(e=n[a]).i]=e.x(t);return r.join(\"\")}}function $n(t,e){return e=(e-=t=+t)||1/e,function(r){return(r-t)/e}}function Qn(t,e){return e=(e-=t=+t)||1/e,function(r){return Math.max(0,Math.min(1,(r-t)/e))}}function Jn(t){for(var e=t.source,r=t.target,n=ta(e,r),a=[e];e!==n;)e=e.parent,a.push(e);for(var o=a.length;r!==n;)a.splice(o,0,r),r=r.parent;return a}function Kn(t){for(var e=[],r=t.parent;null!=r;)e.push(t),t=r,r=r.parent;return e.push(t),e}function ta(t,e){if(t===e)return t;for(var r=Kn(t),n=Kn(e),a=r.pop(),o=n.pop(),i=null;a===o;)i=a,a=r.pop(),o=n.pop();return i}function ea(t){t.fixed|=2}function ra(t){t.fixed&=-7}function na(t){t.fixed|=4,t.px=t.x,t.py=t.y}function aa(t){t.fixed&=-5}function oa(t,e,r){var n=0,a=0;if(t.charge=0,!t.leaf)for(var o,i=t.nodes,l=i.length,s=-1;++s<l;)null!=(o=i[s])&&(oa(o,e,r),t.charge+=o.charge,n+=o.charge*o.cx,a+=o.charge*o.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var c=e*r[t.point.index];t.charge+=t.pointCharge=c,n+=c*t.point.x,a+=c*t.point.y}t.cx=n/t.charge,t.cy=a/t.charge}function ia(t,e){return ui.rebind(t,e,\"sort\",\"children\",\"value\"),t.nodes=t,t.links=da,t}function la(t,e){for(var r=[t];null!=(t=r.pop());)if(e(t),(a=t.children)&&(n=a.length))for(var n,a;--n>=0;)r.push(a[n])}function sa(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(o=t.children)&&(a=o.length))for(var a,o,i=-1;++i<a;)r.push(o[i]);for(;null!=(t=n.pop());)e(t)}function ca(t){return t.children}function ua(t){return t.value}function fa(t,e){return e.value-t.value}function da(t){return ui.merge(t.map(function(t){return(t.children||[]).map(function(e){return{source:t,target:e}})}))}function ha(t){return t.x}function pa(t){return t.y}function ga(t,e,r){t.y0=e,t.y=r}function va(t){return ui.range(t.length)}function ma(t){for(var e=-1,r=t[0].length,n=[];++e<r;)n[e]=0;return n}function ya(t){for(var e,r=1,n=0,a=t[0][1],o=t.length;r<o;++r)(e=t[r][1])>a&&(n=r,a=e);return n}function xa(t){return t.reduce(ba,0)}function ba(t,e){return t+e[1]}function _a(t,e){return wa(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function wa(t,e){for(var r=-1,n=+t[0],a=(t[1]-n)/e,o=[];++r<=e;)o[r]=a*r+n;return o}function ka(t){return[ui.min(t),ui.max(t)]}function Ma(t,e){return t.value-e.value}function Aa(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function Ta(t,e){t._pack_next=e,e._pack_prev=t}function La(t,e){var r=e.x-t.x,n=e.y-t.y,a=t.r+e.r;return.999*a*a>r*r+n*n}function Ca(t){function e(t){u=Math.min(t.x-t.r,u),f=Math.max(t.x+t.r,f),d=Math.min(t.y-t.r,d),h=Math.max(t.y+t.r,h)}if((r=t.children)&&(c=r.length)){var r,n,a,o,i,l,s,c,u=1/0,f=-1/0,d=1/0,h=-1/0;if(r.forEach(Sa),n=r[0],n.x=-n.r,n.y=0,e(n),c>1&&(a=r[1],a.x=a.r,a.y=0,e(a),c>2))for(o=r[2],Da(n,a,o),e(o),Aa(n,o),n._pack_prev=o,Aa(o,a),a=n._pack_next,i=3;i<c;i++){Da(n,a,o=r[i]);var p=0,g=1,v=1;for(l=a._pack_next;l!==a;l=l._pack_next,g++)if(La(l,o)){p=1;break}if(1==p)for(s=n._pack_prev;s!==l._pack_prev&&!La(s,o);s=s._pack_prev,v++);p?(g<v||g==v&&a.r<n.r?Ta(n,a=l):Ta(n=s,a),i--):(Aa(n,o),a=o,e(o))}var m=(u+f)/2,y=(d+h)/2,x=0;for(i=0;i<c;i++)o=r[i],o.x-=m,o.y-=y,x=Math.max(x,o.r+Math.sqrt(o.x*o.x+o.y*o.y));t.r=x,r.forEach(za)}}function Sa(t){t._pack_next=t._pack_prev=t}function za(t){delete t._pack_next,delete t._pack_prev}function Oa(t,e,r,n){var a=t.children;if(t.x=e+=n*t.x,t.y=r+=n*t.y,t.r*=n,\n",
|
|
"a)for(var o=-1,i=a.length;++o<i;)Oa(a[o],e,r,n)}function Da(t,e,r){var n=t.r+r.r,a=e.x-t.x,o=e.y-t.y;if(n&&(a||o)){var i=e.r+r.r,l=a*a+o*o;i*=i,n*=n;var s=.5+(n-i)/(2*l),c=Math.sqrt(Math.max(0,2*i*(n+l)-(n-=l)*n-i*i))/(2*l);r.x=t.x+s*a+c*o,r.y=t.y+s*o-c*a}else r.x=t.x+n,r.y=t.y}function Pa(t,e){return t.parent==e.parent?1:2}function Ea(t){var e=t.children;return e.length?e[0]:t.t}function Na(t){var e,r=t.children;return(e=r.length)?r[e-1]:t.t}function Ia(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function Ra(t){for(var e,r=0,n=0,a=t.children,o=a.length;--o>=0;)e=a[o],e.z+=r,e.m+=r,r+=e.s+(n+=e.c)}function Fa(t,e,r){return t.a.parent===e.parent?t.a:r}function ja(t){return 1+ui.max(t,function(t){return t.y})}function Ba(t){return t.reduce(function(t,e){return t+e.x},0)/t.length}function qa(t){var e=t.children;return e&&e.length?qa(e[0]):t}function Ha(t){var e,r=t.children;return r&&(e=r.length)?Ha(r[e-1]):t}function Va(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Ua(t,e){var r=t.x+e[3],n=t.y+e[0],a=t.dx-e[1]-e[3],o=t.dy-e[0]-e[2];return a<0&&(r+=a/2,a=0),o<0&&(n+=o/2,o=0),{x:r,y:n,dx:a,dy:o}}function Xa(t){var e=t[0],r=t[t.length-1];return e<r?[e,r]:[r,e]}function Ga(t){return t.rangeExtent?t.rangeExtent():Xa(t.range())}function Ya(t,e,r,n){var a=r(t[0],t[1]),o=n(e[0],e[1]);return function(t){return o(a(t))}}function Za(t,e){var r,n=0,a=t.length-1,o=t[n],i=t[a];return i<o&&(r=n,n=a,a=r,r=o,o=i,i=r),t[n]=e.floor(o),t[a]=e.ceil(i),t}function Wa(t){return t?{floor:function(e){return Math.floor(e/t)*t},ceil:function(e){return Math.ceil(e/t)*t}}:ws}function $a(t,e,r,n){var a=[],o=[],i=0,l=Math.min(t.length,e.length)-1;for(t[l]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++i<=l;)a.push(r(t[i-1],t[i])),o.push(n(e[i-1],e[i]));return function(e){var r=ui.bisect(t,e,1,l)-1;return o[r](a[r](e))}}function Qa(t,e,r,n){function a(){var a=Math.min(t.length,e.length)>2?$a:Ya,s=n?Qn:$n;return i=a(t,e,s,r),l=a(e,t,s,_n),o}function o(t){return i(t)}var i,l;return o.invert=function(t){return l(t)},o.domain=function(e){return arguments.length?(t=e.map(Number),a()):t},o.range=function(t){return arguments.length?(e=t,a()):e},o.rangeRound=function(t){return o.range(t).interpolate(jn)},o.clamp=function(t){return arguments.length?(n=t,a()):n},o.interpolate=function(t){return arguments.length?(r=t,a()):r},o.ticks=function(e){return eo(t,e)},o.tickFormat=function(e,r){return ro(t,e,r)},o.nice=function(e){return Ka(t,e),a()},o.copy=function(){return Qa(t,e,r,n)},a()}function Ja(t,e){return ui.rebind(t,e,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function Ka(t,e){return Za(t,Wa(to(t,e)[2])),Za(t,Wa(to(t,e)[2])),t}function to(t,e){null==e&&(e=10);var r=Xa(t),n=r[1]-r[0],a=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),o=e/n*a;return o<=.15?a*=10:o<=.35?a*=5:o<=.75&&(a*=2),r[0]=Math.ceil(r[0]/a)*a,r[1]=Math.floor(r[1]/a)*a+.5*a,r[2]=a,r}function eo(t,e){return ui.range.apply(ui,to(t,e))}function ro(t,e,r){var n=to(t,e);if(r){var a=ul.exec(r);if(a.shift(),\"s\"===a[8]){var o=ui.formatPrefix(Math.max(bi(n[0]),bi(n[1])));return a[7]||(a[7]=\".\"+no(o.scale(n[2]))),a[8]=\"f\",r=ui.format(a.join(\"\")),function(t){return r(o.scale(t))+o.symbol}}a[7]||(a[7]=\".\"+ao(a[8],n)),r=a.join(\"\")}else r=\",.\"+no(n[2])+\"f\";return ui.format(r)}function no(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}function ao(t,e){var r=no(e[2]);return t in ks?Math.abs(r-no(Math.max(bi(e[0]),bi(e[1]))))+ +(\"e\"!==t):r-2*(\"%\"===t)}function oo(t,e,r,n){function a(t){return(r?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function o(t){return r?Math.pow(e,t):-Math.pow(e,-t)}function i(e){return t(a(e))}return i.invert=function(e){return o(t.invert(e))},i.domain=function(e){return arguments.length?(r=e[0]>=0,t.domain((n=e.map(Number)).map(a)),i):n},i.base=function(r){return arguments.length?(e=+r,t.domain(n.map(a)),i):e},i.nice=function(){var e=Za(n.map(a),r?Math:As);return t.domain(e),n=e.map(o),i},i.ticks=function(){var t=Xa(n),i=[],l=t[0],s=t[1],c=Math.floor(a(l)),u=Math.ceil(a(s)),f=e%1?2:e;if(isFinite(u-c)){if(r){for(;c<u;c++)for(var d=1;d<f;d++)i.push(o(c)*d);i.push(o(c))}else for(i.push(o(c));c++<u;)for(var d=f-1;d>0;d--)i.push(o(c)*d);for(c=0;i[c]<l;c++);for(u=i.length;i[u-1]>s;u--);i=i.slice(c,u)}return i},i.tickFormat=function(t,r){if(!arguments.length)return Ms;arguments.length<2?r=Ms:\"function\"!=typeof r&&(r=ui.format(r));var n=Math.max(1,e*t/i.ticks().length);return function(t){var i=t/o(Math.round(a(t)));return i*e<e-.5&&(i*=e),i<=n?r(t):\"\"}},i.copy=function(){return oo(t.copy(),e,r,n)},Ja(i,t)}function io(t,e,r){function n(e){return t(a(e))}var a=lo(e),o=lo(1/e);return n.invert=function(e){return o(t.invert(e))},n.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(a)),n):r},n.ticks=function(t){return eo(r,t)},n.tickFormat=function(t,e){return ro(r,t,e)},n.nice=function(t){return n.domain(Ka(r,t))},n.exponent=function(i){return arguments.length?(a=lo(e=i),o=lo(1/e),t.domain(r.map(a)),n):e},n.copy=function(){return io(t.copy(),e,r)},Ja(n,t)}function lo(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function so(t,e){function r(r){return o[((a.get(r)||(\"range\"===e.t?a.set(r,t.push(r)):0/0))-1)%o.length]}function n(e,r){return ui.range(t.length).map(function(t){return e+r*t})}var a,o,i;return r.domain=function(n){if(!arguments.length)return t;t=[],a=new f;for(var o,i=-1,l=n.length;++i<l;)a.has(o=n[i])||a.set(o,t.push(o));return r[e.t].apply(r,e.a)},r.range=function(t){return arguments.length?(o=t,i=0,e={t:\"range\",a:arguments},r):o},r.rangePoints=function(a,l){arguments.length<2&&(l=0);var s=a[0],c=a[1],u=t.length<2?(s=(s+c)/2,0):(c-s)/(t.length-1+l);return o=n(s+u*l/2,u),i=0,e={t:\"rangePoints\",a:arguments},r},r.rangeRoundPoints=function(a,l){arguments.length<2&&(l=0);var s=a[0],c=a[1],u=t.length<2?(s=c=Math.round((s+c)/2),0):(c-s)/(t.length-1+l)|0;return o=n(s+Math.round(u*l/2+(c-s-(t.length-1+l)*u)/2),u),i=0,e={t:\"rangeRoundPoints\",a:arguments},r},r.rangeBands=function(a,l,s){arguments.length<2&&(l=0),arguments.length<3&&(s=l);var c=a[1]<a[0],u=a[c-0],f=a[1-c],d=(f-u)/(t.length-l+2*s);return o=n(u+d*s,d),c&&o.reverse(),i=d*(1-l),e={t:\"rangeBands\",a:arguments},r},r.rangeRoundBands=function(a,l,s){arguments.length<2&&(l=0),arguments.length<3&&(s=l);var c=a[1]<a[0],u=a[c-0],f=a[1-c],d=Math.floor((f-u)/(t.length-l+2*s));return o=n(u+Math.round((f-u-(t.length-l)*d)/2),d),c&&o.reverse(),i=Math.round(d*(1-l)),e={t:\"rangeRoundBands\",a:arguments},r},r.rangeBand=function(){return i},r.rangeExtent=function(){return Xa(e.a[0])},r.copy=function(){return so(t,e)},r.domain(t)}function co(t,e){function r(){var r=0,a=e.length;for(l=[];++r<a;)l[r-1]=ui.quantile(t,r/a);return n}function n(t){if(!isNaN(t=+t))return e[ui.bisect(l,t)]}var l;return n.domain=function(e){return arguments.length?(t=e.map(o).filter(i).sort(a),r()):t},n.range=function(t){return arguments.length?(e=t,r()):e},n.quantiles=function(){return l},n.invertExtent=function(r){return r=e.indexOf(r),r<0?[0/0,0/0]:[r>0?l[r-1]:t[0],r<l.length?l[r]:t[t.length-1]]},n.copy=function(){return co(t,e)},r()}function uo(t,e,r){function n(e){return r[Math.max(0,Math.min(i,Math.floor(o*(e-t))))]}function a(){return o=r.length/(e-t),i=r.length-1,n}var o,i;return n.domain=function(r){return arguments.length?(t=+r[0],e=+r[r.length-1],a()):[t,e]},n.range=function(t){return arguments.length?(r=t,a()):r},n.invertExtent=function(e){return e=r.indexOf(e),e=e<0?0/0:e/o+t,[e,e+1/o]},n.copy=function(){return uo(t,e,r)},a()}function fo(t,e){function r(r){if(r<=r)return e[ui.bisect(t,r)]}return r.domain=function(e){return arguments.length?(t=e,r):t},r.range=function(t){return arguments.length?(e=t,r):e},r.invertExtent=function(r){return r=e.indexOf(r),[t[r-1],t[r]]},r.copy=function(){return fo(t,e)},r}function ho(t){function e(t){return+t}return e.invert=e,e.domain=e.range=function(r){return arguments.length?(t=r.map(e),e):t},e.ticks=function(e){return eo(t,e)},e.tickFormat=function(e,r){return ro(t,e,r)},e.copy=function(){return ho(t)},e}function po(){return 0}function go(t){return t.innerRadius}function vo(t){return t.outerRadius}function mo(t){return t.startAngle}function yo(t){return t.endAngle}function xo(t){return t&&t.padAngle}function bo(t,e,r,n){return(t-r)*e-(e-n)*t>0?0:1}function _o(t,e,r,n,a){var o=t[0]-e[0],i=t[1]-e[1],l=(a?n:-n)/Math.sqrt(o*o+i*i),s=l*i,c=-l*o,u=t[0]+s,f=t[1]+c,d=e[0]+s,h=e[1]+c,p=(u+d)/2,g=(f+h)/2,v=d-u,m=h-f,y=v*v+m*m,x=r-n,b=u*h-d*f,_=(m<0?-1:1)*Math.sqrt(Math.max(0,x*x*y-b*b)),w=(b*m-v*_)/y,k=(-b*v-m*_)/y,M=(b*m+v*_)/y,A=(-b*v+m*_)/y,T=w-p,L=k-g,C=M-p,S=A-g;return T*T+L*L>C*C+S*S&&(w=M,k=A),[[w-s,k-c],[w*r/x,k*r/x]]}function wo(t){function e(e){function i(){c.push(\"M\",o(t(u),l))}for(var s,c=[],u=[],f=-1,d=e.length,h=Ct(r),p=Ct(n);++f<d;)a.call(this,s=e[f],f)?u.push([+h.call(this,s,f),+p.call(this,s,f)]):u.length&&(i(),u=[]);return u.length&&i(),c.length?c.join(\"\"):null}var r=zr,n=Or,a=Oe,o=ko,i=o.key,l=.7;return e.x=function(t){return arguments.length?(r=t,e):r},e.y=function(t){return arguments.length?(n=t,e):n},e.defined=function(t){return arguments.length?(a=t,e):a},e.interpolate=function(t){return arguments.length?(i=\"function\"==typeof t?o=t:(o=Os.get(t)||ko).key,e):i},e.tension=function(t){return arguments.length?(l=t,e):l},e}function ko(t){return t.length>1?t.join(\"L\"):t+\"Z\"}function Mo(t){return t.join(\"L\")+\"Z\"}function Ao(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"H\",(n[0]+(n=t[e])[0])/2,\"V\",n[1]);return r>1&&a.push(\"H\",n[0]),a.join(\"\")}function To(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"V\",(n=t[e])[1],\"H\",n[0]);return a.join(\"\")}function Lo(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"H\",(n=t[e])[0],\"V\",n[1]);return a.join(\"\")}function Co(t,e){return t.length<4?ko(t):t[1]+Oo(t.slice(1,-1),Do(t,e))}function So(t,e){return t.length<3?Mo(t):t[0]+Oo((t.push(t[0]),t),Do([t[t.length-2]].concat(t,[t[1]]),e))}function zo(t,e){return t.length<3?ko(t):t[0]+Oo(t,Do(t,e))}function Oo(t,e){if(e.length<1||t.length!=e.length&&t.length!=e.length+2)return ko(t);var r=t.length!=e.length,n=\"\",a=t[0],o=t[1],i=e[0],l=i,s=1;if(r&&(n+=\"Q\"+(o[0]-2*i[0]/3)+\",\"+(o[1]-2*i[1]/3)+\",\"+o[0]+\",\"+o[1],a=t[1],s=2),e.length>1){l=e[1],o=t[s],s++,n+=\"C\"+(a[0]+i[0])+\",\"+(a[1]+i[1])+\",\"+(o[0]-l[0])+\",\"+(o[1]-l[1])+\",\"+o[0]+\",\"+o[1];for(var c=2;c<e.length;c++,s++)o=t[s],l=e[c],n+=\"S\"+(o[0]-l[0])+\",\"+(o[1]-l[1])+\",\"+o[0]+\",\"+o[1]}if(r){var u=t[s];n+=\"Q\"+(o[0]+2*l[0]/3)+\",\"+(o[1]+2*l[1]/3)+\",\"+u[0]+\",\"+u[1]}return n}function Do(t,e){for(var r,n=[],a=(1-e)/2,o=t[0],i=t[1],l=1,s=t.length;++l<s;)r=o,o=i,i=t[l],n.push([a*(i[0]-r[0]),a*(i[1]-r[1])]);return n}function Po(t){if(t.length<3)return ko(t);var e=1,r=t.length,n=t[0],a=n[0],o=n[1],i=[a,a,a,(n=t[1])[0]],l=[o,o,o,n[1]],s=[a,\",\",o,\"L\",Ro(Es,i),\",\",Ro(Es,l)];for(t.push(t[r-1]);++e<=r;)n=t[e],i.shift(),i.push(n[0]),l.shift(),l.push(n[1]),Fo(s,i,l);return t.pop(),s.push(\"L\",n),s.join(\"\")}function Eo(t){if(t.length<4)return ko(t);for(var e,r=[],n=-1,a=t.length,o=[0],i=[0];++n<3;)e=t[n],o.push(e[0]),i.push(e[1]);for(r.push(Ro(Es,o)+\",\"+Ro(Es,i)),--n;++n<a;)e=t[n],o.shift(),o.push(e[0]),i.shift(),i.push(e[1]),Fo(r,o,i);return r.join(\"\")}function No(t){for(var e,r,n=-1,a=t.length,o=a+4,i=[],l=[];++n<4;)r=t[n%a],i.push(r[0]),l.push(r[1]);for(e=[Ro(Es,i),\",\",Ro(Es,l)],--n;++n<o;)r=t[n%a],i.shift(),i.push(r[0]),l.shift(),l.push(r[1]),Fo(e,i,l);return e.join(\"\")}function Io(t,e){var r=t.length-1;if(r)for(var n,a,o=t[0][0],i=t[0][1],l=t[r][0]-o,s=t[r][1]-i,c=-1;++c<=r;)n=t[c],a=c/r,n[0]=e*n[0]+(1-e)*(o+a*l),n[1]=e*n[1]+(1-e)*(i+a*s);return Po(t)}function Ro(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function Fo(t,e,r){t.push(\"C\",Ro(Ds,e),\",\",Ro(Ds,r),\",\",Ro(Ps,e),\",\",Ro(Ps,r),\",\",Ro(Es,e),\",\",Ro(Es,r))}function jo(t,e){return(e[1]-t[1])/(e[0]-t[0])}function Bo(t){for(var e=0,r=t.length-1,n=[],a=t[0],o=t[1],i=n[0]=jo(a,o);++e<r;)n[e]=(i+(i=jo(a=o,o=t[e+1])))/2;return n[e]=i,n}function qo(t){for(var e,r,n,a,o=[],i=Bo(t),l=-1,s=t.length-1;++l<s;)e=jo(t[l],t[l+1]),bi(e)<Ri?i[l]=i[l+1]=0:(r=i[l]/e,n=i[l+1]/e,(a=r*r+n*n)>9&&(a=3*e/Math.sqrt(a),i[l]=a*r,i[l+1]=a*n));for(l=-1;++l<=s;)a=(t[Math.min(s,l+1)][0]-t[Math.max(0,l-1)][0])/(6*(1+i[l]*i[l])),o.push([a||0,i[l]*a||0]);return o}function Ho(t){return t.length<3?ko(t):t[0]+Oo(t,qo(t))}function Vo(t){for(var e,r,n,a=-1,o=t.length;++a<o;)e=t[a],r=e[0],n=e[1]-Hi,e[0]=r*Math.cos(n),e[1]=r*Math.sin(n);return t}function Uo(t){function e(e){function s(){g.push(\"M\",l(t(m),f),u,c(t(v.reverse()),f),\"Z\")}for(var d,h,p,g=[],v=[],m=[],y=-1,x=e.length,b=Ct(r),_=Ct(a),w=r===n?function(){return h}:Ct(n),k=a===o?function(){return p}:Ct(o);++y<x;)i.call(this,d=e[y],y)?(v.push([h=+b.call(this,d,y),p=+_.call(this,d,y)]),m.push([+w.call(this,d,y),+k.call(this,d,y)])):v.length&&(s(),v=[],m=[]);return v.length&&s(),g.length?g.join(\"\"):null}var r=zr,n=zr,a=0,o=Or,i=Oe,l=ko,s=l.key,c=l,u=\"L\",f=.7;return e.x=function(t){return arguments.length?(r=n=t,e):n},e.x0=function(t){return arguments.length?(r=t,e):r},e.x1=function(t){return arguments.length?(n=t,e):n},e.y=function(t){return arguments.length?(a=o=t,e):o},e.y0=function(t){return arguments.length?(a=t,e):a},e.y1=function(t){return arguments.length?(o=t,e):o},e.defined=function(t){return arguments.length?(i=t,e):i},e.interpolate=function(t){return arguments.length?(s=\"function\"==typeof t?l=t:(l=Os.get(t)||ko).key,c=l.reverse||l,u=l.closed?\"M\":\"L\",e):s},e.tension=function(t){return arguments.length?(f=t,e):f},e}function Xo(t){return t.radius}function Go(t){return[t.x,t.y]}function Yo(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-Hi;return[r*Math.cos(n),r*Math.sin(n)]}}function Zo(){return 64}function Wo(){return\"circle\"}function $o(t){var e=Math.sqrt(t/ji);return\"M0,\"+e+\"A\"+e+\",\"+e+\" 0 1,1 0,\"+-e+\"A\"+e+\",\"+e+\" 0 1,1 0,\"+e+\"Z\"}function Qo(t){return function(){var e,r,n;(e=this[t])&&(n=e[r=e.active])&&(n.timer.c=null,n.timer.t=0/0,--e.count?delete e[r]:delete this[t],e.active+=.5,n.event&&n.event.interrupt.call(this,this.__data__,n.index))}}function Jo(t,e,r){return Ai(t,qs),t.namespace=e,t.id=r,t}function Ko(t,e,r,n){var a=t.id,o=t.namespace;return X(t,\"function\"==typeof r?function(t,i,l){t[o][a].tween.set(e,n(r.call(t,t.__data__,i,l)))}:(r=n(r),function(t){t[o][a].tween.set(e,r)}))}function ti(t){return null==t&&(t=\"\"),function(){this.textContent=t}}function ei(t){return null==t?\"__transition__\":\"__transition_\"+t+\"__\"}function ri(t,e,r,n,a){function o(t){var e=g.delay;if(c.t=e+s,e<=t)return i(t-e);c.c=i}function i(r){var a=p.active,o=p[a];o&&(o.timer.c=null,o.timer.t=0/0,--p.count,delete p[a],o.event&&o.event.interrupt.call(t,t.__data__,o.index));for(var i in p)if(+i<n){var f=p[i];f.timer.c=null,f.timer.t=0/0,--p.count,delete p[i]}c.c=l,Pt(function(){return c.c&&l(r||1)&&(c.c=null,c.t=0/0),1},0,s),p.active=n,g.event&&g.event.start.call(t,t.__data__,e),h=[],g.tween.forEach(function(r,n){(n=n.call(t,t.__data__,e))&&h.push(n)}),d=g.ease,u=g.duration}function l(a){for(var o=a/u,i=d(o),l=h.length;l>0;)h[--l].call(t,i);if(o>=1)return g.event&&g.event.end.call(t,t.__data__,e),--p.count?delete p[n]:delete t[r],1}var s,c,u,d,h,p=t[r]||(t[r]={active:0,count:0}),g=p[n];g||(s=a.time,c=Pt(o,0,s),g=p[n]={tween:new f,time:s,timer:c,delay:a.delay,duration:a.duration,ease:a.ease,index:e},a=null,++p.count)}function ni(t,e,r){t.attr(\"transform\",function(t){var n=e(t);return\"translate(\"+(isFinite(n)?n:r(t))+\",0)\"})}function ai(t,e,r){t.attr(\"transform\",function(t){var n=e(t);return\"translate(0,\"+(isFinite(n)?n:r(t))+\")\"})}function oi(t){return t.toISOString()}function ii(t,e,r){function n(e){return t(e)}function a(t,r){var n=t[1]-t[0],a=n/r,o=ui.bisect($s,a);return o==$s.length?[e.year,to(t.map(function(t){return t/31536e6}),r)[2]]:o?e[a/$s[o-1]<$s[o]/a?o-1:o]:[Ks,to(t,r)[2]]}return n.invert=function(e){return li(t.invert(e))},n.domain=function(e){return arguments.length?(t.domain(e),n):t.domain().map(li)},n.nice=function(t,e){function r(r){return!isNaN(r)&&!t.range(r,li(+r+1),e).length}var o=n.domain(),i=Xa(o),l=null==t?a(i,10):\"number\"==typeof t&&a(i,t);return l&&(t=l[0],e=l[1]),n.domain(Za(o,e>1?{floor:function(e){for(;r(e=t.floor(e));)e=li(e-1);return e},ceil:function(e){for(;r(e=t.ceil(e));)e=li(+e+1);return e}}:t))},n.ticks=function(t,e){var r=Xa(n.domain()),o=null==t?a(r,10):\"number\"==typeof t?a(r,t):!t.range&&[{range:t},e];return o&&(t=o[0],e=o[1]),t.range(r[0],li(+r[1]+1),e<1?1:e)},n.tickFormat=function(){return r},n.copy=function(){return ii(t.copy(),e,r)},Ja(n,t)}function li(t){return new Date(t)}function si(t){return JSON.parse(t.responseText)}function ci(t){var e=hi.createRange();return e.selectNode(hi.body),e.createContextualFragment(t.responseText)}var ui={version:\"3.5.17\"},fi=[].slice,di=function(t){return fi.call(t)},hi=this.document;if(hi)try{di(hi.documentElement.childNodes)[0].nodeType}catch(t){di=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),hi)try{hi.createElement(\"DIV\").style.setProperty(\"opacity\",0,\"\")}catch(t){var pi=this.Element.prototype,gi=pi.setAttribute,vi=pi.setAttributeNS,mi=this.CSSStyleDeclaration.prototype,yi=mi.setProperty;pi.setAttribute=function(t,e){gi.call(this,t,e+\"\")},pi.setAttributeNS=function(t,e,r){vi.call(this,t,e,r+\"\")},mi.setProperty=function(t,e,r){yi.call(this,t,e+\"\",r)}}ui.ascending=a,ui.descending=function(t,e){return e<t?-1:e>t?1:e>=t?0:0/0},ui.min=function(t,e){var r,n,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(n=t[a])&&n>=n){r=n;break}for(;++a<o;)null!=(n=t[a])&&r>n&&(r=n)}else{for(;++a<o;)if(null!=(n=e.call(t,t[a],a))&&n>=n){r=n;break}for(;++a<o;)null!=(n=e.call(t,t[a],a))&&r>n&&(r=n)}return r},ui.max=function(t,e){var r,n,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(n=t[a])&&n>=n){r=n;break}for(;++a<o;)null!=(n=t[a])&&n>r&&(r=n)}else{for(;++a<o;)if(null!=(n=e.call(t,t[a],a))&&n>=n){r=n;break}for(;++a<o;)null!=(n=e.call(t,t[a],a))&&n>r&&(r=n)}return r},ui.extent=function(t,e){var r,n,a,o=-1,i=t.length;if(1===arguments.length){for(;++o<i;)if(null!=(n=t[o])&&n>=n){r=a=n;break}for(;++o<i;)null!=(n=t[o])&&(r>n&&(r=n),a<n&&(a=n))}else{for(;++o<i;)if(null!=(n=e.call(t,t[o],o))&&n>=n){r=a=n;break}for(;++o<i;)null!=(n=e.call(t,t[o],o))&&(r>n&&(r=n),a<n&&(a=n))}return[r,a]},ui.sum=function(t,e){var r,n=0,a=t.length,o=-1;if(1===arguments.length)for(;++o<a;)i(r=+t[o])&&(n+=r);else for(;++o<a;)i(r=+e.call(t,t[o],o))&&(n+=r);return n},ui.mean=function(t,e){var r,n=0,a=t.length,l=-1,s=a;if(1===arguments.length)for(;++l<a;)i(r=o(t[l]))?n+=r:--s;else for(;++l<a;)i(r=o(e.call(t,t[l],l)))?n+=r:--s;if(s)return n/s},ui.quantile=function(t,e){var r=(t.length-1)*e+1,n=Math.floor(r),a=+t[n-1],o=r-n;return o?a+o*(t[n]-a):a},ui.median=function(t,e){var r,n=[],l=t.length,s=-1;if(1===arguments.length)for(;++s<l;)i(r=o(t[s]))&&n.push(r);else for(;++s<l;)i(r=o(e.call(t,t[s],s)))&&n.push(r);if(n.length)return ui.quantile(n.sort(a),.5)},ui.variance=function(t,e){var r,n,a=t.length,l=0,s=0,c=-1,u=0;if(1===arguments.length)for(;++c<a;)i(r=o(t[c]))&&(n=r-l,l+=n/++u,s+=n*(r-l));else for(;++c<a;)i(r=o(e.call(t,t[c],c)))&&(n=r-l,l+=n/++u,s+=n*(r-l));if(u>1)return s/(u-1)},ui.deviation=function(){var t=ui.variance.apply(this,arguments);return t?Math.sqrt(t):t};var xi=l(a);ui.bisectLeft=xi.left,ui.bisect=ui.bisectRight=xi.right,ui.bisector=function(t){return l(1===t.length?function(e,r){return a(t(e),r)}:t)},ui.shuffle=function(t,e,r){(o=arguments.length)<3&&(r=t.length,o<2&&(e=0));for(var n,a,o=r-e;o;)a=Math.random()*o--|0,n=t[o+e],t[o+e]=t[a+e],t[a+e]=n;return t},ui.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},ui.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],a=new Array(r<0?0:r);e<r;)a[e]=[n,n=t[++e]];return a},ui.transpose=function(t){if(!(a=t.length))return[];for(var e=-1,r=ui.min(t,s),n=new Array(r);++e<r;)for(var a,o=-1,i=n[e]=new Array(a);++o<a;)i[o]=t[o][e];return n},ui.zip=function(){return ui.transpose(arguments)},ui.keys=function(t){var e=[];for(var r in t)e.push(r);return e},ui.values=function(t){var e=[];for(var r in t)e.push(t[r]);return e},ui.entries=function(t){var e=[];for(var r in t)e.push({key:r,value:t[r]});return e},ui.merge=function(t){for(var e,r,n,a=t.length,o=-1,i=0;++o<a;)i+=t[o].length;for(r=new Array(i);--a>=0;)for(n=t[a],e=n.length;--e>=0;)r[--i]=n[e];return r};var bi=Math.abs;ui.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r===1/0)throw new Error(\"infinite range\");var n,a=[],o=c(bi(r)),i=-1;if(t*=o,e*=o,r*=o,r<0)for(;(n=t+r*++i)>e;)a.push(n/o);else for(;(n=t+r*++i)<e;)a.push(n/o);return a},ui.map=function(t,e){var r=new f;if(t instanceof f)t.forEach(function(t,e){r.set(t,e)});else if(Array.isArray(t)){var n,a=-1,o=t.length;if(1===arguments.length)for(;++a<o;)r.set(a,t[a]);else for(;++a<o;)r.set(e.call(t,n=t[a],a),n)}else for(var i in t)r.set(i,t[i]);return r};var _i=\"__proto__\",wi=\"\\0\";u(f,{has:p,get:function(t){return this._[d(t)]},set:function(t,e){return this._[d(t)]=e},remove:g,keys:v,values:function(){var t=[];for(var e in this._)t.push(this._[e]);return t},entries:function(){var t=[];for(var e in this._)t.push({key:h(e),value:this._[e]});return t},size:m,empty:y,forEach:function(t){for(var e in this._)t.call(this,h(e),this._[e])}}),ui.nest=function(){function t(e,i,l){if(l>=o.length)return n?n.call(a,i):r?i.sort(r):i;for(var s,c,u,d,h=-1,p=i.length,g=o[l++],v=new f;++h<p;)(d=v.get(s=g(c=i[h])))?d.push(c):v.set(s,[c]);return e?(c=e(),u=function(r,n){c.set(r,t(e,n,l))}):(c={},u=function(r,n){c[r]=t(e,n,l)}),v.forEach(u),c}function e(t,r){if(r>=o.length)return t;var n=[],a=i[r++];return t.forEach(function(t,a){n.push({key:t,values:e(a,r)})}),a?n.sort(function(t,e){return a(t.key,e.key)}):n}var r,n,a={},o=[],i=[];return a.map=function(e,r){return t(r,e,0)},a.entries=function(r){return e(t(ui.map,r,0),0)},a.key=function(t){return o.push(t),a},a.sortKeys=function(t){return i[o.length-1]=t,a},a.sortValues=function(t){return r=t,a},a.rollup=function(t){return n=t,a},a},ui.set=function(t){var e=new x;if(t)for(var r=0,n=t.length;r<n;++r)e.add(t[r]);return e},u(x,{has:p,add:function(t){return this._[d(t+=\"\")]=!0,t},remove:g,values:v,size:m,empty:y,forEach:function(t){for(var e in this._)t.call(this,h(e))}}),ui.behavior={},ui.rebind=function(t,e){for(var r,n=1,a=arguments.length;++n<a;)t[r=arguments[n]]=_(t,e,e[r]);return t};var ki=[\"webkit\",\"ms\",\"moz\",\"Moz\",\"o\",\"O\"];ui.dispatch=function(){for(var t=new M,e=-1,r=arguments.length;++e<r;)t[arguments[e]]=A(t);return t},M.prototype.on=function(t,e){var r=t.indexOf(\".\"),n=\"\";if(r>=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},ui.event=null,ui.requote=function(t){return t.replace(Mi,\"\\\\$&\")};var Mi=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,Ai={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]},Ti=function(t,e){return e.querySelector(t)},Li=function(t,e){return e.querySelectorAll(t)},Ci=function(t,e){var r=t.matches||t[w(t,\"matchesSelector\")];return(Ci=function(t,e){return r.call(t,e)})(t,e)};\"function\"==typeof Sizzle&&(Ti=function(t,e){return Sizzle(t,e)[0]||null},Li=Sizzle,Ci=Sizzle.matchesSelector),ui.selection=function(){return ui.select(hi.documentElement)};var Si=ui.selection.prototype=[];Si.select=function(t){var e,r,n,a,o=[];t=z(t);for(var i=-1,l=this.length;++i<l;){o.push(e=[]),e.parentNode=(n=this[i]).parentNode;for(var s=-1,c=n.length;++s<c;)(a=n[s])?(e.push(r=t.call(a,a.__data__,s,i)),r&&\"__data__\"in a&&(r.__data__=a.__data__)):e.push(null)}return S(o)},Si.selectAll=function(t){var e,r,n=[];t=O(t);for(var a=-1,o=this.length;++a<o;)for(var i=this[a],l=-1,s=i.length;++l<s;)(r=i[l])&&(n.push(e=di(t.call(r,r.__data__,l,a))),e.parentNode=r);return S(n)};var zi=\"http://www.w3.org/1999/xhtml\",Oi={svg:\"http://www.w3.org/2000/svg\",xhtml:zi,xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\"};ui.ns={prefix:Oi,qualify:function(t){var e=t.indexOf(\":\"),r=t;return e>=0&&\"xmlns\"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),Oi.hasOwnProperty(r)?{space:Oi[r],local:t}:t}},Si.attr=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node();return t=ui.ns.qualify(t),t.local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(D(e,t[e]));return this}return this.each(D(t,e))},Si.classed=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node(),n=(t=N(t)).length,a=-1;if(e=r.classList){for(;++a<n;)if(!e.contains(t[a]))return!1}else for(e=r.getAttribute(\"class\");++a<n;)if(!E(t[a]).test(e))return!1;return!0}for(e in t)this.each(I(e,t[e]));return this}return this.each(I(t,e))},Si.style=function(t,e,r){var a=arguments.length;if(a<3){if(\"string\"!=typeof t){a<2&&(e=\"\");for(r in t)this.each(F(r,t[r],e));return this}if(a<2){var o=this.node();return n(o).getComputedStyle(o,null).getPropertyValue(t)}r=\"\"}return this.each(F(t,e,r))},Si.property=function(t,e){if(arguments.length<2){if(\"string\"==typeof t)return this.node()[t];for(e in t)this.each(j(e,t[e]));return this}return this.each(j(t,e))},Si.text=function(t){return arguments.length?this.each(\"function\"==typeof t?function(){var e=t.apply(this,arguments);this.textContent=null==e?\"\":e}:null==t?function(){this.textContent=\"\"}:function(){this.textContent=t}):this.node().textContent},Si.html=function(t){return arguments.length?this.each(\"function\"==typeof t?function(){var e=t.apply(this,arguments);this.innerHTML=null==e?\"\":e}:null==t?function(){this.innerHTML=\"\"}:function(){this.innerHTML=t}):this.node().innerHTML},Si.append=function(t){return t=B(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Si.insert=function(t,e){return t=B(t),e=z(e),this.select(function(){return this.insertBefore(t.apply(this,arguments),e.apply(this,arguments)||null)})},Si.remove=function(){return this.each(q)},Si.data=function(t,e){function r(t,r){var n,a,o,i=t.length,u=r.length,d=Math.min(i,u),h=new Array(u),p=new Array(u),g=new Array(i);if(e){var v,m=new f,y=new Array(i);for(n=-1;++n<i;)(a=t[n])&&(m.has(v=e.call(a,a.__data__,n))?g[n]=a:m.set(v,a),y[n]=v);for(n=-1;++n<u;)(a=m.get(v=e.call(r,o=r[n],n)))?a!==!0&&(h[n]=a,a.__data__=o):p[n]=H(o),m.set(v,!0);for(n=-1;++n<i;)n in y&&m.get(y[n])!==!0&&(g[n]=t[n])}else{for(n=-1;++n<d;)a=t[n],o=r[n],a?(a.__data__=o,h[n]=a):p[n]=H(o);for(;n<u;++n)p[n]=H(r[n]);for(;n<i;++n)g[n]=t[n]}p.update=h,p.parentNode=h.parentNode=g.parentNode=t.parentNode,l.push(p),s.push(h),c.push(g)}var n,a,o=-1,i=this.length;if(!arguments.length){for(t=new Array(i=(n=this[0]).length);++o<i;)(a=n[o])&&(t[o]=a.__data__);return t}var l=G([]),s=S([]),c=S([]);if(\"function\"==typeof t)for(;++o<i;)r(n=this[o],t.call(n,n.parentNode.__data__,o));else for(;++o<i;)r(n=this[o],t);return s.enter=function(){return l},s.exit=function(){return c},s},Si.datum=function(t){return arguments.length?this.property(\"__data__\",t):this.property(\"__data__\")},Si.filter=function(t){var e,r,n,a=[];\"function\"!=typeof t&&(t=V(t));for(var o=0,i=this.length;o<i;o++){a.push(e=[]),e.parentNode=(r=this[o]).parentNode;for(var l=0,s=r.length;l<s;l++)(n=r[l])&&t.call(n,n.__data__,l,o)&&e.push(n)}return S(a)},Si.order=function(){for(var t=-1,e=this.length;++t<e;)for(var r,n=this[t],a=n.length-1,o=n[a];--a>=0;)(r=n[a])&&(o&&o!==r.nextSibling&&o.parentNode.insertBefore(r,o),o=r);return this},Si.sort=function(t){t=U.apply(this,arguments);for(var e=-1,r=this.length;++e<r;)this[e].sort(t);return this.order()},Si.each=function(t){return X(this,function(e,r,n){t.call(e,e.__data__,r,n)})},Si.call=function(t){var e=di(arguments);return t.apply(e[0]=this,e),this},Si.empty=function(){return!this.node()},Si.node=function(){for(var t=0,e=this.length;t<e;t++)for(var r=this[t],n=0,a=r.length;n<a;n++){var o=r[n];if(o)return o}return null},Si.size=function(){var t=0;return X(this,function(){++t}),t};var Di=[];ui.selection.enter=G,ui.selection.enter.prototype=Di,Di.append=Si.append,Di.empty=Si.empty,Di.node=Si.node,Di.call=Si.call,Di.size=Si.size,Di.select=function(t){for(var e,r,n,a,o,i=[],l=-1,s=this.length;++l<s;){n=(a=this[l]).update,i.push(e=[]),e.parentNode=a.parentNode;for(var c=-1,u=a.length;++c<u;)(o=a[c])?(e.push(n[c]=r=t.call(a.parentNode,o.__data__,c,l)),r.__data__=o.__data__):e.push(null)}return S(i)},Di.insert=function(t,e){return arguments.length<2&&(e=Y(this)),Si.insert.call(this,t,e)},ui.select=function(t){var r;return\"string\"==typeof t?(r=[Ti(t,hi)],r.parentNode=hi.documentElement):(r=[t],r.parentNode=e(t)),S([r])},ui.selectAll=function(t){var e;return\"string\"==typeof t?(e=di(Li(t,hi)),e.parentNode=hi.documentElement):(e=di(t),e.parentNode=null),S([e])},Si.on=function(t,e,r){var n=arguments.length;if(n<3){if(\"string\"!=typeof t){n<2&&(e=!1);for(r in t)this.each(Z(r,t[r],e));return this}if(n<2)return(n=this.node()[\"__on\"+t])&&n._;r=!1}return this.each(Z(t,e,r))};var Pi=ui.map({mouseenter:\"mouseover\",mouseleave:\"mouseout\"});hi&&Pi.forEach(function(t){\"on\"+t in hi&&Pi.remove(t)});var Ei,Ni=0;ui.mouse=function(t){return J(t,L())};var Ii=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ui.touch=function(t,e,r){if(arguments.length<3&&(r=e,e=L().changedTouches),e)for(var n,a=0,o=e.length;a<o;++a)if((n=e[a]).identifier===r)return J(t,n)},ui.behavior.drag=function(){function t(){this.on(\"mousedown.drag\",o).on(\"touchstart.drag\",i)}function e(t,e,n,o,i){return function(){function l(){var t,r,n=e(d,g);n&&(t=n[0]-x[0],r=n[1]-x[1],p|=t|r,x=n,h({type:\"drag\",x:n[0]+c[0],y:n[1]+c[1],dx:t,dy:r}))}function s(){e(d,g)&&(m.on(o+v,null).on(i+v,null),y(p),h({type:\"dragend\"}))}var c,u=this,f=ui.event.target.correspondingElement||ui.event.target,d=u.parentNode,h=r.of(u,arguments),p=0,g=t(),v=\".drag\"+(null==g?\"\":\"-\"+g),m=ui.select(n(f)).on(o+v,l).on(i+v,s),y=Q(f),x=e(d,g);a?(c=a.apply(u,arguments),c=[c.x-x[0],c.y-x[1]]):c=[0,0],h({type:\"dragstart\"})}}var r=C(t,\"drag\",\"dragstart\",\"dragend\"),a=null,o=e(k,ui.mouse,n,\"mousemove\",\"mouseup\"),i=e(K,ui.touch,b,\"touchmove\",\"touchend\");return t.origin=function(e){return arguments.length?(a=e,t):a},ui.rebind(t,r,\"on\")},ui.touches=function(t,e){return arguments.length<2&&(e=L().touches),e?di(e).map(function(e){var r=J(t,e);return r.identifier=e.identifier,r}):[]};var Ri=1e-6,Fi=Ri*Ri,ji=Math.PI,Bi=2*ji,qi=Bi-Ri,Hi=ji/2,Vi=ji/180,Ui=180/ji,Xi=Math.SQRT2;ui.interpolateZoom=function(t,e){var r,n,a=t[0],o=t[1],i=t[2],l=e[0],s=e[1],c=e[2],u=l-a,f=s-o,d=u*u+f*f;if(d<Fi)n=Math.log(c/i)/Xi,r=function(t){return[a+t*u,o+t*f,i*Math.exp(Xi*t*n)]};else{var h=Math.sqrt(d),p=(c*c-i*i+4*d)/(2*i*2*h),g=(c*c-i*i-4*d)/(2*c*2*h),v=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(g*g+1)-g);n=(m-v)/Xi,r=function(t){var e=t*n,r=ot(v),l=i/(2*h)*(r*it(Xi*e+v)-at(v));return[a+l*u,o+l*f,i*r/ot(Xi*e+v)]}}return r.duration=1e3*n,r},ui.behavior.zoom=function(){function t(t){t.on(O,f).on(Yi+\".zoom\",h).on(\"dblclick.zoom\",p).on(E,d)}function e(t){return[(t[0]-M.x)/M.k,(t[1]-M.y)/M.k]}function r(t){return[t[0]*M.k+M.x,t[1]*M.k+M.y]}function a(t){M.k=Math.max(L[0],Math.min(L[1],t))}function o(t,e){e=r(e),M.x+=t[0]-e[0],M.y+=t[1]-e[1]}function i(e,r,n,i){e.__chart__={x:M.x,y:M.y,k:M.k},a(Math.pow(2,i)),o(v=r,n),e=ui.select(e),S>0&&(e=e.transition().duration(S)),e.call(t.event)}function l(){_&&_.domain(b.range().map(function(t){return(t-M.x)/M.k}).map(b.invert)),k&&k.domain(w.range().map(function(t){return(t-M.y)/M.k}).map(w.invert))}function s(t){z++||t({type:\"zoomstart\"})}function c(t){l(),t({type:\"zoom\",scale:M.k,translate:[M.x,M.y]})}function u(t){--z||(t({type:\"zoomend\"}),v=null)}function f(){function t(){l=1,o(ui.mouse(a),d),c(i)}function r(){f.on(D,null).on(P,null),h(l),u(i)}var a=this,i=N.of(a,arguments),l=0,f=ui.select(n(a)).on(D,t).on(P,r),d=e(ui.mouse(a)),h=Q(a);Bs.call(a),s(i)}function d(){function t(){var t=ui.touches(p);return h=M.k,t.forEach(function(t){\n",
|
|
"t.identifier in v&&(v[t.identifier]=e(t))}),t}function r(){var e=ui.event.target;ui.select(e).on(b,n).on(_,l),w.push(e);for(var r=ui.event.changedTouches,a=0,o=r.length;a<o;++a)v[r[a].identifier]=null;var s=t(),c=Date.now();if(1===s.length){if(c-x<500){var u=s[0];i(p,u,v[u.identifier],Math.floor(Math.log(M.k)/Math.LN2)+1),T()}x=c}else if(s.length>1){var u=s[0],f=s[1],d=u[0]-f[0],h=u[1]-f[1];m=d*d+h*h}}function n(){var t,e,r,n,i=ui.touches(p);Bs.call(p);for(var l=0,s=i.length;l<s;++l,n=null)if(r=i[l],n=v[r.identifier]){if(e)break;t=r,e=n}if(n){var u=(u=r[0]-t[0])*u+(u=r[1]-t[1])*u,f=m&&Math.sqrt(u/m);t=[(t[0]+r[0])/2,(t[1]+r[1])/2],e=[(e[0]+n[0])/2,(e[1]+n[1])/2],a(f*h)}x=null,o(t,e),c(g)}function l(){if(ui.event.touches.length){for(var e=ui.event.changedTouches,r=0,n=e.length;r<n;++r)delete v[e[r].identifier];for(var a in v)return void t()}ui.selectAll(w).on(y,null),k.on(O,f).on(E,d),A(),u(g)}var h,p=this,g=N.of(p,arguments),v={},m=0,y=\".zoom-\"+ui.event.changedTouches[0].identifier,b=\"touchmove\"+y,_=\"touchend\"+y,w=[],k=ui.select(p),A=Q(p);r(),s(g),k.on(O,null).on(E,r)}function h(){var t=N.of(this,arguments);y?clearTimeout(y):(Bs.call(this),g=e(v=m||ui.mouse(this)),s(t)),y=setTimeout(function(){y=null,u(t)},50),T(),a(Math.pow(2,.002*Gi())*M.k),o(v,g),c(t)}function p(){var t=ui.mouse(this),r=Math.log(M.k)/Math.LN2;i(this,t,e(t),ui.event.shiftKey?Math.ceil(r)-1:Math.floor(r)+1)}var g,v,m,y,x,b,_,w,k,M={x:0,y:0,k:1},A=[960,500],L=Zi,S=250,z=0,O=\"mousedown.zoom\",D=\"mousemove.zoom\",P=\"mouseup.zoom\",E=\"touchstart.zoom\",N=C(t,\"zoomstart\",\"zoom\",\"zoomend\");return Yi||(Yi=\"onwheel\"in hi?(Gi=function(){return-ui.event.deltaY*(ui.event.deltaMode?120:1)},\"wheel\"):\"onmousewheel\"in hi?(Gi=function(){return ui.event.wheelDelta},\"mousewheel\"):(Gi=function(){return-ui.event.detail},\"MozMousePixelScroll\")),t.event=function(t){t.each(function(){var t=N.of(this,arguments),e=M;Fs?ui.select(this).transition().each(\"start.zoom\",function(){M=this.__chart__||{x:0,y:0,k:1},s(t)}).tween(\"zoom:zoom\",function(){var r=A[0],n=A[1],a=v?v[0]:r/2,o=v?v[1]:n/2,i=ui.interpolateZoom([(a-M.x)/M.k,(o-M.y)/M.k,r/M.k],[(a-e.x)/e.k,(o-e.y)/e.k,r/e.k]);return function(e){var n=i(e),l=r/n[2];this.__chart__=M={x:a-n[0]*l,y:o-n[1]*l,k:l},c(t)}}).each(\"interrupt.zoom\",function(){u(t)}).each(\"end.zoom\",function(){u(t)}):(this.__chart__=M,s(t),c(t),u(t))})},t.translate=function(e){return arguments.length?(M={x:+e[0],y:+e[1],k:M.k},l(),t):[M.x,M.y]},t.scale=function(e){return arguments.length?(M={x:M.x,y:M.y,k:null},a(+e),l(),t):M.k},t.scaleExtent=function(e){return arguments.length?(L=null==e?Zi:[+e[0],+e[1]],t):L},t.center=function(e){return arguments.length?(m=e&&[+e[0],+e[1]],t):m},t.size=function(e){return arguments.length?(A=e&&[+e[0],+e[1]],t):A},t.duration=function(e){return arguments.length?(S=+e,t):S},t.x=function(e){return arguments.length?(_=e,b=e.copy(),M={x:0,y:0,k:1},t):_},t.y=function(e){return arguments.length?(k=e,w=e.copy(),M={x:0,y:0,k:1},t):k},ui.rebind(t,N,\"on\")};var Gi,Yi,Zi=[0,1/0];ui.color=st,st.prototype.toString=function(){return this.rgb()+\"\"},ui.hsl=ct;var Wi=ct.prototype=new st;Wi.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new ct(this.h,this.s,this.l/t)},Wi.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new ct(this.h,this.s,t*this.l)},Wi.rgb=function(){return ut(this.h,this.s,this.l)},ui.hcl=ft;var $i=ft.prototype=new st;$i.brighter=function(t){return new ft(this.h,this.c,Math.min(100,this.l+Qi*(arguments.length?t:1)))},$i.darker=function(t){return new ft(this.h,this.c,Math.max(0,this.l-Qi*(arguments.length?t:1)))},$i.rgb=function(){return dt(this.h,this.c,this.l).rgb()},ui.lab=ht;var Qi=18,Ji=.95047,Ki=1,tl=1.08883,el=ht.prototype=new st;el.brighter=function(t){return new ht(Math.min(100,this.l+Qi*(arguments.length?t:1)),this.a,this.b)},el.darker=function(t){return new ht(Math.max(0,this.l-Qi*(arguments.length?t:1)),this.a,this.b)},el.rgb=function(){return pt(this.l,this.a,this.b)},ui.rgb=xt;var rl=xt.prototype=new st;rl.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,a=30;return e||r||n?(e&&e<a&&(e=a),r&&r<a&&(r=a),n&&n<a&&(n=a),new xt(Math.min(255,e/t),Math.min(255,r/t),Math.min(255,n/t))):new xt(a,a,a)},rl.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new xt(t*this.r,t*this.g,t*this.b)},rl.hsl=function(){return Mt(this.r,this.g,this.b)},rl.toString=function(){return\"#\"+wt(this.r)+wt(this.g)+wt(this.b)};var nl=ui.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});nl.forEach(function(t,e){nl.set(t,bt(e))}),ui.functor=Ct,ui.xhr=St(b),ui.dsv=function(t,e){function r(t,r,o){arguments.length<3&&(o=r,r=null);var i=zt(t,e,null==r?n:a(r),o);return i.row=function(t){return arguments.length?i.response(null==(r=t)?n:a(t)):r},i}function n(t){return r.parse(t.responseText)}function a(t){return function(e){return r.parse(e.responseText,t)}}function o(e){return e.map(i).join(t)}function i(t){return l.test(t)?'\"'+t.replace(/\\\"/g,'\"\"')+'\"':t}var l=new RegExp('[\"'+t+\"\\n]\"),s=t.charCodeAt(0);return r.parse=function(t,e){var n;return r.parseRows(t,function(t,r){if(n)return n(t,r-1);var a=new Function(\"d\",\"return {\"+t.map(function(t,e){return JSON.stringify(t)+\": d[\"+e+\"]\"}).join(\",\")+\"}\");n=e?function(t,r){return e(a(t),r)}:a})},r.parseRows=function(t,e){function r(){if(u>=c)return i;if(a)return a=!1,o;var e=u;if(34===t.charCodeAt(e)){for(var r=e;r++<c;)if(34===t.charCodeAt(r)){if(34!==t.charCodeAt(r+1))break;++r}u=r+2;var n=t.charCodeAt(r+1);return 13===n?(a=!0,10===t.charCodeAt(r+2)&&++u):10===n&&(a=!0),t.slice(e+1,r).replace(/\"\"/g,'\"')}for(;u<c;){var n=t.charCodeAt(u++),l=1;if(10===n)a=!0;else if(13===n)a=!0,10===t.charCodeAt(u)&&(++u,++l);else if(n!==s)continue;return t.slice(e,u-l)}return t.slice(e)}for(var n,a,o={},i={},l=[],c=t.length,u=0,f=0;(n=r())!==i;){for(var d=[];n!==o&&n!==i;)d.push(n),n=r();e&&null==(d=e(d,f++))||l.push(d)}return l},r.format=function(e){if(Array.isArray(e[0]))return r.formatRows(e);var n=new x,a=[];return e.forEach(function(t){for(var e in t)n.has(e)||a.push(n.add(e))}),[a.map(i).join(t)].concat(e.map(function(e){return a.map(function(t){return i(e[t])}).join(t)})).join(\"\\n\")},r.formatRows=function(t){return t.map(o).join(\"\\n\")},r},ui.csv=ui.dsv(\",\",\"text/csv\"),ui.tsv=ui.dsv(\"\\t\",\"text/tab-separated-values\");var al,ol,il,ll,sl=this[w(this,\"requestAnimationFrame\")]||function(t){setTimeout(t,17)};ui.timer=function(){Pt.apply(this,arguments)},ui.timer.flush=function(){Nt(),It()},ui.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)};var cl=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"\\xb5\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"].map(Ft);ui.formatPrefix=function(t,e){var r=0;return(t=+t)&&(t<0&&(t*=-1),e&&(t=ui.round(t,Rt(t,e))),r=1+Math.floor(1e-12+Math.log(t)/Math.LN10),r=Math.max(-24,Math.min(24,3*Math.floor((r-1)/3)))),cl[8+r/3]};var ul=/(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i,fl=ui.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,e){return t.toPrecision(e)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},r:function(t,e){return(t=ui.round(t,Rt(t,e))).toFixed(Math.max(0,Math.min(20,Rt(t*(1+1e-15),e))))}}),dl=ui.time={},hl=Date;qt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){pl.setUTCDate.apply(this._,arguments)},setDay:function(){pl.setUTCDay.apply(this._,arguments)},setFullYear:function(){pl.setUTCFullYear.apply(this._,arguments)},setHours:function(){pl.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){pl.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){pl.setUTCMinutes.apply(this._,arguments)},setMonth:function(){pl.setUTCMonth.apply(this._,arguments)},setSeconds:function(){pl.setUTCSeconds.apply(this._,arguments)},setTime:function(){pl.setTime.apply(this._,arguments)}};var pl=Date.prototype;dl.year=Ht(function(t){return t=dl.day(t),t.setMonth(0,1),t},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t){return t.getFullYear()}),dl.years=dl.year.range,dl.years.utc=dl.year.utc.range,dl.day=Ht(function(t){var e=new hl(2e3,0);return e.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),e},function(t,e){t.setDate(t.getDate()+e)},function(t){return t.getDate()-1}),dl.days=dl.day.range,dl.days.utc=dl.day.utc.range,dl.dayOfYear=function(t){var e=dl.year(t);return Math.floor((t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/864e5)},[\"sunday\",\"monday\",\"tuesday\",\"wednesday\",\"thursday\",\"friday\",\"saturday\"].forEach(function(t,e){e=7-e;var r=dl[t]=Ht(function(t){return(t=dl.day(t)).setDate(t.getDate()-(t.getDay()+e)%7),t},function(t,e){t.setDate(t.getDate()+7*Math.floor(e))},function(t){var r=dl.year(t).getDay();return Math.floor((dl.dayOfYear(t)+(r+e)%7)/7)-(r!==e)});dl[t+\"s\"]=r.range,dl[t+\"s\"].utc=r.utc.range,dl[t+\"OfYear\"]=function(t){var r=dl.year(t).getDay();return Math.floor((dl.dayOfYear(t)+(r+e)%7)/7)}}),dl.week=dl.sunday,dl.weeks=dl.sunday.range,dl.weeks.utc=dl.sunday.utc.range,dl.weekOfYear=dl.sundayOfYear;var gl={\"-\":\"\",_:\" \",0:\"0\"},vl=/^\\s*\\d+/,ml=/^%/;ui.locale=function(t){return{numberFormat:jt(t),timeFormat:Ut(t)}};var yl=ui.locale({decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],dateTime:\"%a %b %e %X %Y\",date:\"%m/%d/%Y\",time:\"%H:%M:%S\",periods:[\"AM\",\"PM\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]});ui.format=yl.numberFormat,ui.geo={},fe.prototype={s:0,t:0,add:function(t){de(t,this.t,xl),de(xl.s,this.s,this),this.s?this.t+=xl.t:this.s=xl.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xl=new fe;ui.geo.stream=function(t,e){t&&bl.hasOwnProperty(t.type)?bl[t.type](t,e):he(t,e)};var bl={Feature:function(t,e){he(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,n=-1,a=r.length;++n<a;)he(r[n].geometry,e)}},_l={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)t=r[n],e.point(t[0],t[1],t[2])},LineString:function(t,e){pe(t.coordinates,e,0)},MultiLineString:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)pe(r[n],e,0)},Polygon:function(t,e){ge(t.coordinates,e)},MultiPolygon:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)ge(r[n],e)},GeometryCollection:function(t,e){for(var r=t.geometries,n=-1,a=r.length;++n<a;)he(r[n],e)}};ui.geo.area=function(t){return wl=0,ui.geo.stream(t,Ml),wl};var wl,kl=new fe,Ml={sphere:function(){wl+=4*ji},point:k,lineStart:k,lineEnd:k,polygonStart:function(){kl.reset(),Ml.lineStart=ve},polygonEnd:function(){var t=2*kl;wl+=t<0?4*ji+t:t,Ml.lineStart=Ml.lineEnd=Ml.point=k}};ui.geo.bounds=function(){function t(t,e){x.push(b=[u=t,d=t]),e<f&&(f=e),e>h&&(h=e)}function e(e,r){var n=me([e*Vi,r*Vi]);if(m){var a=xe(m,n),o=[a[1],-a[0],0],i=xe(o,a);we(i),i=ke(i);var s=e-p,c=s>0?1:-1,g=i[0]*Ui*c,v=bi(s)>180;if(v^(c*p<g&&g<c*e)){var y=i[1]*Ui;y>h&&(h=y)}else if(g=(g+360)%360-180,v^(c*p<g&&g<c*e)){var y=-i[1]*Ui;y<f&&(f=y)}else r<f&&(f=r),r>h&&(h=r);v?e<p?l(u,e)>l(u,d)&&(d=e):l(e,d)>l(u,d)&&(u=e):d>=u?(e<u&&(u=e),e>d&&(d=e)):e>p?l(u,e)>l(u,d)&&(d=e):l(e,d)>l(u,d)&&(u=e)}else t(e,r);m=n,p=e}function r(){_.point=e}function n(){b[0]=u,b[1]=d,_.point=t,m=null}function a(t,r){if(m){var n=t-p;y+=bi(n)>180?n+(n>0?360:-360):n}else g=t,v=r;Ml.point(t,r),e(t,r)}function o(){Ml.lineStart()}function i(){a(g,v),Ml.lineEnd(),bi(y)>Ri&&(u=-(d=180)),b[0]=u,b[1]=d,m=null}function l(t,e){return(e-=t)<0?e+360:e}function s(t,e){return t[0]-e[0]}function c(t,e){return e[0]<=e[1]?e[0]<=t&&t<=e[1]:t<e[0]||e[1]<t}var u,f,d,h,p,g,v,m,y,x,b,_={point:t,lineStart:r,lineEnd:n,polygonStart:function(){_.point=a,_.lineStart=o,_.lineEnd=i,y=0,Ml.polygonStart()},polygonEnd:function(){Ml.polygonEnd(),_.point=t,_.lineStart=r,_.lineEnd=n,kl<0?(u=-(d=180),f=-(h=90)):y>Ri?h=90:y<-Ri&&(f=-90),b[0]=u,b[1]=d}};return function(t){h=d=-(u=f=1/0),x=[],ui.geo.stream(t,_);var e=x.length;if(e){x.sort(s);for(var r,n=1,a=x[0],o=[a];n<e;++n)r=x[n],c(r[0],a)||c(r[1],a)?(l(a[0],r[1])>l(a[0],a[1])&&(a[1]=r[1]),l(r[0],a[1])>l(a[0],a[1])&&(a[0]=r[0])):o.push(a=r);for(var i,r,p=-1/0,e=o.length-1,n=0,a=o[e];n<=e;a=r,++n)r=o[n],(i=l(a[1],r[0]))>p&&(p=i,u=r[0],d=a[1])}return x=b=null,1/0===u||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[u,f],[d,h]]}}(),ui.geo.centroid=function(t){Al=Tl=Ll=Cl=Sl=zl=Ol=Dl=Pl=El=Nl=0,ui.geo.stream(t,Il);var e=Pl,r=El,n=Nl,a=e*e+r*r+n*n;return a<Fi&&(e=zl,r=Ol,n=Dl,Tl<Ri&&(e=Ll,r=Cl,n=Sl),(a=e*e+r*r+n*n)<Fi)?[0/0,0/0]:[Math.atan2(r,e)*Ui,nt(n/Math.sqrt(a))*Ui]};var Al,Tl,Ll,Cl,Sl,zl,Ol,Dl,Pl,El,Nl,Il={sphere:k,point:Ae,lineStart:Le,lineEnd:Ce,polygonStart:function(){Il.lineStart=Se},polygonEnd:function(){Il.lineStart=Le}},Rl=Ne(Oe,je,qe,[-ji,-ji/2]),Fl=1e9;ui.geo.clipExtent=function(){var t,e,r,n,a,o,i={stream:function(t){return a&&(a.valid=!1),a=o(t),a.valid=!0,a},extent:function(l){return arguments.length?(o=Xe(t=+l[0][0],e=+l[0][1],r=+l[1][0],n=+l[1][1]),a&&(a.valid=!1,a=null),i):[[t,e],[r,n]]}};return i.extent([[0,0],[960,500]])},(ui.geo.conicEqualArea=function(){return Ge(Ye)}).raw=Ye,ui.geo.albers=function(){return ui.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ui.geo.albersUsa=function(){function t(t){var o=t[0],i=t[1];return e=null,r(o,i),e||(n(o,i),e)||a(o,i),e}var e,r,n,a,o=ui.geo.albers(),i=ui.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),l=ui.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),s={point:function(t,r){e=[t,r]}};return t.invert=function(t){var e=o.scale(),r=o.translate(),n=(t[0]-r[0])/e,a=(t[1]-r[1])/e;return(a>=.12&&a<.234&&n>=-.425&&n<-.214?i:a>=.166&&a<.234&&n>=-.214&&n<-.115?l:o).invert(t)},t.stream=function(t){var e=o.stream(t),r=i.stream(t),n=l.stream(t);return{point:function(t,a){e.point(t,a),r.point(t,a),n.point(t,a)},sphere:function(){e.sphere(),r.sphere(),n.sphere()},lineStart:function(){e.lineStart(),r.lineStart(),n.lineStart()},lineEnd:function(){e.lineEnd(),r.lineEnd(),n.lineEnd()},polygonStart:function(){e.polygonStart(),r.polygonStart(),n.polygonStart()},polygonEnd:function(){e.polygonEnd(),r.polygonEnd(),n.polygonEnd()}}},t.precision=function(e){return arguments.length?(o.precision(e),i.precision(e),l.precision(e),t):o.precision()},t.scale=function(e){return arguments.length?(o.scale(e),i.scale(.35*e),l.scale(e),t.translate(o.translate())):o.scale()},t.translate=function(e){if(!arguments.length)return o.translate();var c=o.scale(),u=+e[0],f=+e[1];return r=o.translate(e).clipExtent([[u-.455*c,f-.238*c],[u+.455*c,f+.238*c]]).stream(s).point,n=i.translate([u-.307*c,f+.201*c]).clipExtent([[u-.425*c+Ri,f+.12*c+Ri],[u-.214*c-Ri,f+.234*c-Ri]]).stream(s).point,a=l.translate([u-.205*c,f+.212*c]).clipExtent([[u-.214*c+Ri,f+.166*c+Ri],[u-.115*c-Ri,f+.234*c-Ri]]).stream(s).point,t},t.scale(1070)};var jl,Bl,ql,Hl,Vl,Ul,Xl={point:k,lineStart:k,lineEnd:k,polygonStart:function(){Bl=0,Xl.lineStart=Ze},polygonEnd:function(){Xl.lineStart=Xl.lineEnd=Xl.point=k,jl+=bi(Bl/2)}},Gl={point:We,lineStart:k,lineEnd:k,polygonStart:k,polygonEnd:k},Yl={point:Je,lineStart:Ke,lineEnd:tr,polygonStart:function(){Yl.lineStart=er},polygonEnd:function(){Yl.point=Je,Yl.lineStart=Ke,Yl.lineEnd=tr}};ui.geo.path=function(){function t(t){return t&&(\"function\"==typeof l&&o.pointRadius(+l.apply(this,arguments)),i&&i.valid||(i=a(o)),ui.geo.stream(t,i)),o.result()}function e(){return i=null,t}var r,n,a,o,i,l=4.5;return t.area=function(t){return jl=0,ui.geo.stream(t,a(Xl)),jl},t.centroid=function(t){return Ll=Cl=Sl=zl=Ol=Dl=Pl=El=Nl=0,ui.geo.stream(t,a(Yl)),Nl?[Pl/Nl,El/Nl]:Dl?[zl/Dl,Ol/Dl]:Sl?[Ll/Sl,Cl/Sl]:[0/0,0/0]},t.bounds=function(t){return Vl=Ul=-(ql=Hl=1/0),ui.geo.stream(t,a(Gl)),[[ql,Hl],[Vl,Ul]]},t.projection=function(t){return arguments.length?(a=(r=t)?t.stream||ar(t):b,e()):r},t.context=function(t){return arguments.length?(o=null==(n=t)?new $e:new rr(t),\"function\"!=typeof l&&o.pointRadius(l),e()):n},t.pointRadius=function(e){return arguments.length?(l=\"function\"==typeof e?e:(o.pointRadius(+e),+e),t):l},t.projection(ui.geo.albersUsa()).context(null)},ui.geo.transform=function(t){return{stream:function(e){var r=new or(e);for(var n in t)r[n]=t[n];return r}}},or.prototype={point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ui.geo.projection=lr,ui.geo.projectionMutator=sr,(ui.geo.equirectangular=function(){return lr(ur)}).raw=ur.invert=ur,ui.geo.rotation=function(t){function e(e){return e=t(e[0]*Vi,e[1]*Vi),e[0]*=Ui,e[1]*=Ui,e}return t=dr(t[0]%360*Vi,t[1]*Vi,t.length>2?t[2]*Vi:0),e.invert=function(e){return e=t.invert(e[0]*Vi,e[1]*Vi),e[0]*=Ui,e[1]*=Ui,e},e},fr.invert=ur,ui.geo.circle=function(){function t(){var t=\"function\"==typeof n?n.apply(this,arguments):n,e=dr(-t[0]*Vi,-t[1]*Vi,0).invert,a=[];return r(null,null,1,{point:function(t,r){a.push(t=e(t,r)),t[0]*=Ui,t[1]*=Ui}}),{type:\"Polygon\",coordinates:[a]}}var e,r,n=[0,0],a=6;return t.origin=function(e){return arguments.length?(n=e,t):n},t.angle=function(n){return arguments.length?(r=vr((e=+n)*Vi,a*Vi),t):e},t.precision=function(n){return arguments.length?(r=vr(e*Vi,(a=+n)*Vi),t):a},t.angle(90)},ui.geo.distance=function(t,e){var r,n=(e[0]-t[0])*Vi,a=t[1]*Vi,o=e[1]*Vi,i=Math.sin(n),l=Math.cos(n),s=Math.sin(a),c=Math.cos(a),u=Math.sin(o),f=Math.cos(o);return Math.atan2(Math.sqrt((r=f*i)*r+(r=c*u-s*f*l)*r),s*u+c*f*l)},ui.geo.graticule=function(){function t(){return{type:\"MultiLineString\",coordinates:e()}}function e(){return ui.range(Math.ceil(o/v)*v,a,v).map(d).concat(ui.range(Math.ceil(c/m)*m,s,m).map(h)).concat(ui.range(Math.ceil(n/p)*p,r,p).filter(function(t){return bi(t%v)>Ri}).map(u)).concat(ui.range(Math.ceil(l/g)*g,i,g).filter(function(t){return bi(t%m)>Ri}).map(f))}var r,n,a,o,i,l,s,c,u,f,d,h,p=10,g=p,v=90,m=360,y=2.5;return t.lines=function(){return e().map(function(t){return{type:\"LineString\",coordinates:t}})},t.outline=function(){return{type:\"Polygon\",coordinates:[d(o).concat(h(s).slice(1),d(a).reverse().slice(1),h(c).reverse().slice(1))]}},t.extent=function(e){return arguments.length?t.majorExtent(e).minorExtent(e):t.minorExtent()},t.majorExtent=function(e){return arguments.length?(o=+e[0][0],a=+e[1][0],c=+e[0][1],s=+e[1][1],o>a&&(e=o,o=a,a=e),c>s&&(e=c,c=s,s=e),t.precision(y)):[[o,c],[a,s]]},t.minorExtent=function(e){return arguments.length?(n=+e[0][0],r=+e[1][0],l=+e[0][1],i=+e[1][1],n>r&&(e=n,n=r,r=e),l>i&&(e=l,l=i,i=e),t.precision(y)):[[n,l],[r,i]]},t.step=function(e){return arguments.length?t.majorStep(e).minorStep(e):t.minorStep()},t.majorStep=function(e){return arguments.length?(v=+e[0],m=+e[1],t):[v,m]},t.minorStep=function(e){return arguments.length?(p=+e[0],g=+e[1],t):[p,g]},t.precision=function(e){return arguments.length?(y=+e,u=yr(l,i,90),f=xr(n,r,y),d=yr(c,s,90),h=xr(o,a,y),t):y},t.majorExtent([[-180,-90+Ri],[180,90-Ri]]).minorExtent([[-180,-80-Ri],[180,80+Ri]])},ui.geo.greatArc=function(){function t(){return{type:\"LineString\",coordinates:[e||n.apply(this,arguments),r||a.apply(this,arguments)]}}var e,r,n=br,a=_r;return t.distance=function(){return ui.geo.distance(e||n.apply(this,arguments),r||a.apply(this,arguments))},t.source=function(r){return arguments.length?(n=r,e=\"function\"==typeof r?null:r,t):n},t.target=function(e){return arguments.length?(a=e,r=\"function\"==typeof e?null:e,t):a},t.precision=function(){return arguments.length?t:0},t},ui.geo.interpolate=function(t,e){return wr(t[0]*Vi,t[1]*Vi,e[0]*Vi,e[1]*Vi)},ui.geo.length=function(t){return Zl=0,ui.geo.stream(t,Wl),Zl};var Zl,Wl={sphere:k,point:k,lineStart:kr,lineEnd:k,polygonStart:k,polygonEnd:k},$l=Mr(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(ui.geo.azimuthalEqualArea=function(){return lr($l)}).raw=$l;var Ql=Mr(function(t){var e=Math.acos(t);return e&&e/Math.sin(e)},b);(ui.geo.azimuthalEquidistant=function(){return lr(Ql)}).raw=Ql,(ui.geo.conicConformal=function(){return Ge(Ar)}).raw=Ar,(ui.geo.conicEquidistant=function(){return Ge(Tr)}).raw=Tr;var Jl=Mr(function(t){return 1/t},Math.atan);(ui.geo.gnomonic=function(){return lr(Jl)}).raw=Jl,Lr.invert=function(t,e){return[t,2*Math.atan(Math.exp(e))-Hi]},(ui.geo.mercator=function(){return Cr(Lr)}).raw=Lr;var Kl=Mr(function(){return 1},Math.asin);(ui.geo.orthographic=function(){return lr(Kl)}).raw=Kl;var ts=Mr(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(ui.geo.stereographic=function(){return lr(ts)}).raw=ts,Sr.invert=function(t,e){return[-e,2*Math.atan(Math.exp(t))-Hi]},(ui.geo.transverseMercator=function(){var t=Cr(Sr),e=t.center,r=t.rotate;return t.center=function(t){return t?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])},t.rotate=function(t){return t?r([t[0],t[1],t.length>2?t[2]+90:90]):(t=r(),[t[0],t[1],t[2]-90])},r([0,0,90])}).raw=Sr,ui.geom={},ui.geom.hull=function(t){function e(t){if(t.length<3)return[];var e,a=Ct(r),o=Ct(n),i=t.length,l=[],s=[];for(e=0;e<i;e++)l.push([+a.call(this,t[e],e),+o.call(this,t[e],e),e]);for(l.sort(Pr),e=0;e<i;e++)s.push([l[e][0],-l[e][1]]);var c=Dr(l),u=Dr(s),f=u[0]===c[0],d=u[u.length-1]===c[c.length-1],h=[];for(e=c.length-1;e>=0;--e)h.push(t[l[c[e]][2]]);for(e=+f;e<u.length-d;++e)h.push(t[l[u[e]][2]]);return h}var r=zr,n=Or;return arguments.length?e(t):(e.x=function(t){return arguments.length?(r=t,e):r},e.y=function(t){return arguments.length?(n=t,e):n},e)},ui.geom.polygon=function(t){return Ai(t,es),t};var es=ui.geom.polygon.prototype=[];es.area=function(){for(var t,e=-1,r=this.length,n=this[r-1],a=0;++e<r;)t=n,n=this[e],a+=t[1]*n[0]-t[0]*n[1];return.5*a},es.centroid=function(t){var e,r,n=-1,a=this.length,o=0,i=0,l=this[a-1];for(arguments.length||(t=-1/(6*this.area()));++n<a;)e=l,l=this[n],r=e[0]*l[1]-l[0]*e[1],o+=(e[0]+l[0])*r,i+=(e[1]+l[1])*r;return[o*t,i*t]},es.clip=function(t){for(var e,r,n,a,o,i,l=Ir(t),s=-1,c=this.length-Ir(this),u=this[c-1];++s<c;){for(e=t.slice(),t.length=0,a=this[s],o=e[(n=e.length-l)-1],r=-1;++r<n;)i=e[r],Er(i,u,a)?(Er(o,u,a)||t.push(Nr(o,i,u,a)),t.push(i)):Er(o,u,a)&&t.push(Nr(o,i,u,a)),o=i;l&&t.push(t[0]),u=a}return t};var rs,ns,as,os,is,ls=[],ss=[];Ur.prototype.prepare=function(){for(var t,e=this.edges,r=e.length;r--;)t=e[r].edge,t.b&&t.a||e.splice(r,1);return e.sort(Gr),e.length},rn.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nn.prototype={insert:function(t,e){var r,n,a;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;r=t}else this._?(t=sn(this._),e.P=null,e.N=t,t.P=t.L=e,r=t):(e.P=e.N=null,this._=e,r=null);for(e.L=e.R=null,e.U=r,e.C=!0,t=e;r&&r.C;)n=r.U,r===n.L?(a=n.R,a&&a.C?(r.C=a.C=!1,n.C=!0,t=n):(t===r.R&&(on(this,r),t=r,r=t.U),r.C=!1,n.C=!0,ln(this,n))):(a=n.L,a&&a.C?(r.C=a.C=!1,n.C=!0,t=n):(t===r.L&&(ln(this,r),t=r,r=t.U),r.C=!1,n.C=!0,on(this,n))),r=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,r,n,a=t.U,o=t.L,i=t.R;if(r=o?i?sn(i):o:i,a?a.L===t?a.L=r:a.R=r:this._=r,o&&i?(n=r.C,r.C=t.C,r.L=o,o.U=r,r!==i?(a=r.U,r.U=t.U,t=r.R,a.L=t,r.R=i,i.U=r):(r.U=a,a=r,t=r.R)):(n=t.C,t=r),t&&(t.U=a),!n){if(t&&t.C)return void(t.C=!1);do{if(t===this._)break;if(t===a.L){if(e=a.R,e.C&&(e.C=!1,a.C=!0,on(this,a),e=a.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,ln(this,e),e=a.R),e.C=a.C,a.C=e.R.C=!1,on(this,a),t=this._;break}}else if(e=a.L,e.C&&(e.C=!1,a.C=!0,ln(this,a),e=a.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,on(this,e),e=a.L),e.C=a.C,a.C=e.L.C=!1,ln(this,a),t=this._;break}e.C=!0,t=a,a=a.U}while(!t.C);t&&(t.C=!1)}}},ui.geom.voronoi=function(t){function e(t){var e=new Array(t.length),n=l[0][0],a=l[0][1],o=l[1][0],i=l[1][1];return cn(r(t),l).cells.forEach(function(r,l){var s=r.edges,c=r.site;(e[l]=s.length?s.map(function(t){var e=t.start();return[e.x,e.y]}):c.x>=n&&c.x<=o&&c.y>=a&&c.y<=i?[[n,i],[o,i],[o,a],[n,a]]:[]).point=t[l]}),e}function r(t){return t.map(function(t,e){return{x:Math.round(o(t,e)/Ri)*Ri,y:Math.round(i(t,e)/Ri)*Ri,i:e}})}var n=zr,a=Or,o=n,i=a,l=cs;return t?e(t):(e.links=function(t){return cn(r(t)).edges.filter(function(t){return t.l&&t.r}).map(function(e){return{source:t[e.l.i],target:t[e.r.i]}})},e.triangles=function(t){var e=[];return cn(r(t)).cells.forEach(function(r,n){for(var a,o=r.site,i=r.edges.sort(Gr),l=-1,s=i.length,c=i[s-1].edge,u=c.l===o?c.r:c.l;++l<s;)c,a=u,c=i[l].edge,u=c.l===o?c.r:c.l,n<a.i&&n<u.i&&fn(o,a,u)<0&&e.push([t[n],t[a.i],t[u.i]])}),e},e.x=function(t){return arguments.length?(o=Ct(n=t),e):n},e.y=function(t){return arguments.length?(i=Ct(a=t),e):a},e.clipExtent=function(t){return arguments.length?(l=null==t?cs:t,e):l===cs?null:l},e.size=function(t){return arguments.length?e.clipExtent(t&&[[0,0],t]):l===cs?null:l&&l[1]},e)};var cs=[[-1e6,-1e6],[1e6,1e6]];ui.geom.delaunay=function(t){return ui.geom.voronoi().triangles(t)},ui.geom.quadtree=function(t,e,r,n,a){function o(t){function o(t,e,r,n,a,o,i,l){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var s=t.x,u=t.y;if(null!=s)if(bi(s-r)+bi(u-n)<.01)c(t,e,r,n,a,o,i,l);else{var f=t.point;t.x=t.y=t.point=null,c(t,f,s,u,a,o,i,l),c(t,e,r,n,a,o,i,l)}else t.x=r,t.y=n,t.point=e}else c(t,e,r,n,a,o,i,l)}function c(t,e,r,n,a,i,l,s){var c=.5*(a+l),u=.5*(i+s),f=r>=c,d=n>=u,h=d<<1|f;t.leaf=!1,t=t.nodes[h]||(t.nodes[h]=pn()),f?a=c:l=c,d?i=u:s=u,o(t,e,r,n,a,i,l,s)}var u,f,d,h,p,g,v,m,y,x=Ct(l),b=Ct(s);if(null!=e)g=e,v=r,m=n,y=a;else if(m=y=-(g=v=1/0),f=[],d=[],p=t.length,i)for(h=0;h<p;++h)u=t[h],u.x<g&&(g=u.x),u.y<v&&(v=u.y),u.x>m&&(m=u.x),u.y>y&&(y=u.y),f.push(u.x),d.push(u.y);else for(h=0;h<p;++h){var _=+x(u=t[h],h),w=+b(u,h);_<g&&(g=_),w<v&&(v=w),_>m&&(m=_),w>y&&(y=w),f.push(_),d.push(w)}var k=m-g,M=y-v;k>M?y=v+k:m=g+M;var A=pn();if(A.add=function(t){o(A,t,+x(t,++h),+b(t,h),g,v,m,y)},A.visit=function(t){gn(t,A,g,v,m,y)},A.find=function(t){return vn(A,t[0],t[1],g,v,m,y)},h=-1,null==e){for(;++h<p;)o(A,t[h],f[h],d[h],g,v,m,y);--h}else t.forEach(A.add);return f=d=t=u=null,A}var i,l=zr,s=Or;return(i=arguments.length)?(l=dn,s=hn,3===i&&(a=r,n=e,r=e=0),o(t)):(o.x=function(t){return arguments.length?(l=t,o):l},o.y=function(t){return arguments.length?(s=t,o):s},o.extent=function(t){return arguments.length?(null==t?e=r=n=a=null:(e=+t[0][0],r=+t[0][1],n=+t[1][0],a=+t[1][1]),o):null==e?null:[[e,r],[n,a]]},o.size=function(t){return arguments.length?(null==t?e=r=n=a=null:(e=r=0,n=+t[0],a=+t[1]),o):null==e?null:[n-e,a-r]},o)},ui.interpolateRgb=mn,ui.interpolateObject=yn,ui.interpolateNumber=xn,ui.interpolateString=bn;var us=/[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,fs=new RegExp(us.source,\"g\");ui.interpolate=_n,ui.interpolators=[function(t,e){var r=typeof e;return(\"string\"===r?nl.has(e.toLowerCase())||/^(#|rgb\\(|hsl\\()/i.test(e)?mn:bn:e instanceof st?mn:Array.isArray(e)?wn:\"object\"===r&&isNaN(e)?yn:xn)(t,e)}],ui.interpolateArray=wn;var ds=function(){return b},hs=ui.map({linear:ds,poly:Sn,quad:function(){return Tn},cubic:function(){return Ln},sin:function(){return zn},exp:function(){return On},circle:function(){return Dn},elastic:Pn,back:En,bounce:function(){return Nn}}),ps=ui.map({in:b,out:Mn,\"in-out\":An,\"out-in\":function(t){return An(Mn(t))}});ui.ease=function(t){var e=t.indexOf(\"-\"),r=e>=0?t.slice(0,e):t,n=e>=0?t.slice(e+1):\"in\";return r=hs.get(r)||ds,n=ps.get(n)||b,kn(n(r.apply(null,fi.call(arguments,1))))},ui.interpolateHcl=In,ui.interpolateHsl=Rn,ui.interpolateLab=Fn,ui.interpolateRound=jn,ui.transform=function(t){var e=hi.createElementNS(ui.ns.prefix.svg,\"g\");return(ui.transform=function(t){if(null!=t){e.setAttribute(\"transform\",t);var r=e.transform.baseVal.consolidate()}return new Bn(r?r.matrix:gs)})(t)},Bn.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var gs={a:1,b:0,c:0,d:1,e:0,f:0};ui.interpolateTransform=Wn,ui.layout={},ui.layout.bundle=function(){return function(t){for(var e=[],r=-1,n=t.length;++r<n;)e.push(Jn(t[r]));return e}},ui.layout.chord=function(){function t(){var t,c,f,d,h,p={},g=[],v=ui.range(o),m=[];for(r=[],n=[],t=0,d=-1;++d<o;){for(c=0,h=-1;++h<o;)c+=a[d][h];g.push(c),m.push(ui.range(o)),t+=c}for(i&&v.sort(function(t,e){return i(g[t],g[e])}),l&&m.forEach(function(t,e){t.sort(function(t,r){return l(a[e][t],a[e][r])})}),t=(Bi-u*o)/t,c=0,d=-1;++d<o;){for(f=c,h=-1;++h<o;){\n",
|
|
"var y=v[d],x=m[y][h],b=a[y][x],_=c,w=c+=b*t;p[y+\"-\"+x]={index:y,subindex:x,startAngle:_,endAngle:w,value:b}}n[y]={index:y,startAngle:f,endAngle:c,value:g[y]},c+=u}for(d=-1;++d<o;)for(h=d-1;++h<o;){var k=p[d+\"-\"+h],M=p[h+\"-\"+d];(k.value||M.value)&&r.push(k.value<M.value?{source:M,target:k}:{source:k,target:M})}s&&e()}function e(){r.sort(function(t,e){return s((t.source.value+t.target.value)/2,(e.source.value+e.target.value)/2)})}var r,n,a,o,i,l,s,c={},u=0;return c.matrix=function(t){return arguments.length?(o=(a=t)&&a.length,r=n=null,c):a},c.padding=function(t){return arguments.length?(u=t,r=n=null,c):u},c.sortGroups=function(t){return arguments.length?(i=t,r=n=null,c):i},c.sortSubgroups=function(t){return arguments.length?(l=t,r=null,c):l},c.sortChords=function(t){return arguments.length?(s=t,r&&e(),c):s},c.chords=function(){return r||t(),r},c.groups=function(){return n||t(),n},c},ui.layout.force=function(){function t(t){return function(e,r,n,a){if(e.point!==t){var o=e.cx-t.x,i=e.cy-t.y,l=a-r,s=o*o+i*i;if(l*l/m<s){if(s<g){var c=e.charge/s;t.px-=o*c,t.py-=i*c}return!0}if(e.point&&s&&s<g){var c=e.pointCharge/s;t.px-=o*c,t.py-=i*c}}return!e.charge}}function e(t){t.px=ui.event.x,t.py=ui.event.y,s.resume()}var r,n,a,o,i,l,s={},c=ui.dispatch(\"start\",\"tick\",\"end\"),u=[1,1],f=.9,d=vs,h=ms,p=-30,g=ys,v=.1,m=.64,y=[],x=[];return s.tick=function(){if((a*=.99)<.005)return r=null,c.end({type:\"end\",alpha:a=0}),!0;var e,n,s,d,h,g,m,b,_,w=y.length,k=x.length;for(n=0;n<k;++n)s=x[n],d=s.source,h=s.target,b=h.x-d.x,_=h.y-d.y,(g=b*b+_*_)&&(g=a*i[n]*((g=Math.sqrt(g))-o[n])/g,b*=g,_*=g,h.x-=b*(m=d.weight+h.weight?d.weight/(d.weight+h.weight):.5),h.y-=_*m,d.x+=b*(m=1-m),d.y+=_*m);if((m=a*v)&&(b=u[0]/2,_=u[1]/2,n=-1,m))for(;++n<w;)s=y[n],s.x+=(b-s.x)*m,s.y+=(_-s.y)*m;if(p)for(oa(e=ui.geom.quadtree(y),a,l),n=-1;++n<w;)(s=y[n]).fixed||e.visit(t(s));for(n=-1;++n<w;)s=y[n],s.fixed?(s.x=s.px,s.y=s.py):(s.x-=(s.px-(s.px=s.x))*f,s.y-=(s.py-(s.py=s.y))*f);c.tick({type:\"tick\",alpha:a})},s.nodes=function(t){return arguments.length?(y=t,s):y},s.links=function(t){return arguments.length?(x=t,s):x},s.size=function(t){return arguments.length?(u=t,s):u},s.linkDistance=function(t){return arguments.length?(d=\"function\"==typeof t?t:+t,s):d},s.distance=s.linkDistance,s.linkStrength=function(t){return arguments.length?(h=\"function\"==typeof t?t:+t,s):h},s.friction=function(t){return arguments.length?(f=+t,s):f},s.charge=function(t){return arguments.length?(p=\"function\"==typeof t?t:+t,s):p},s.chargeDistance=function(t){return arguments.length?(g=t*t,s):Math.sqrt(g)},s.gravity=function(t){return arguments.length?(v=+t,s):v},s.theta=function(t){return arguments.length?(m=t*t,s):Math.sqrt(m)},s.alpha=function(t){return arguments.length?(t=+t,a?t>0?a=t:(r.c=null,r.t=0/0,r=null,c.end({type:\"end\",alpha:a=0})):t>0&&(c.start({type:\"start\",alpha:a=t}),r=Pt(s.tick)),s):a},s.start=function(){function t(t,n){if(!r){for(r=new Array(a),s=0;s<a;++s)r[s]=[];for(s=0;s<c;++s){var o=x[s];r[o.source.index].push(o.target),r[o.target.index].push(o.source)}}for(var i,l=r[e],s=-1,u=l.length;++s<u;)if(!isNaN(i=l[s][t]))return i;return Math.random()*n}var e,r,n,a=y.length,c=x.length,f=u[0],g=u[1];for(e=0;e<a;++e)(n=y[e]).index=e,n.weight=0;for(e=0;e<c;++e)n=x[e],\"number\"==typeof n.source&&(n.source=y[n.source]),\"number\"==typeof n.target&&(n.target=y[n.target]),++n.source.weight,++n.target.weight;for(e=0;e<a;++e)n=y[e],isNaN(n.x)&&(n.x=t(\"x\",f)),isNaN(n.y)&&(n.y=t(\"y\",g)),isNaN(n.px)&&(n.px=n.x),isNaN(n.py)&&(n.py=n.y);if(o=[],\"function\"==typeof d)for(e=0;e<c;++e)o[e]=+d.call(this,x[e],e);else for(e=0;e<c;++e)o[e]=d;if(i=[],\"function\"==typeof h)for(e=0;e<c;++e)i[e]=+h.call(this,x[e],e);else for(e=0;e<c;++e)i[e]=h;if(l=[],\"function\"==typeof p)for(e=0;e<a;++e)l[e]=+p.call(this,y[e],e);else for(e=0;e<a;++e)l[e]=p;return s.resume()},s.resume=function(){return s.alpha(.1)},s.stop=function(){return s.alpha(0)},s.drag=function(){if(n||(n=ui.behavior.drag().origin(b).on(\"dragstart.force\",ea).on(\"drag.force\",e).on(\"dragend.force\",ra)),!arguments.length)return n;this.on(\"mouseover.force\",na).on(\"mouseout.force\",aa).call(n)},ui.rebind(s,c,\"on\")};var vs=20,ms=1,ys=1/0;ui.layout.hierarchy=function(){function t(a){var o,i=[a],l=[];for(a.depth=0;null!=(o=i.pop());)if(l.push(o),(c=r.call(t,o,o.depth))&&(s=c.length)){for(var s,c,u;--s>=0;)i.push(u=c[s]),u.parent=o,u.depth=o.depth+1;n&&(o.value=0),o.children=c}else n&&(o.value=+n.call(t,o,o.depth)||0),delete o.children;return sa(a,function(t){var r,a;e&&(r=t.children)&&r.sort(e),n&&(a=t.parent)&&(a.value+=t.value)}),l}var e=fa,r=ca,n=ua;return t.sort=function(r){return arguments.length?(e=r,t):e},t.children=function(e){return arguments.length?(r=e,t):r},t.value=function(e){return arguments.length?(n=e,t):n},t.revalue=function(e){return n&&(la(e,function(t){t.children&&(t.value=0)}),sa(e,function(e){var r;e.children||(e.value=+n.call(t,e,e.depth)||0),(r=e.parent)&&(r.value+=e.value)})),e},t},ui.layout.partition=function(){function t(e,r,n,a){var o=e.children;if(e.x=r,e.y=e.depth*a,e.dx=n,e.dy=a,o&&(i=o.length)){var i,l,s,c=-1;for(n=e.value?n/e.value:0;++c<i;)t(l=o[c],r,s=l.value*n,a),r+=s}}function e(t){var r=t.children,n=0;if(r&&(a=r.length))for(var a,o=-1;++o<a;)n=Math.max(n,e(r[o]));return 1+n}function r(r,o){var i=n.call(this,r,o);return t(i[0],0,a[0],a[1]/e(i[0])),i}var n=ui.layout.hierarchy(),a=[1,1];return r.size=function(t){return arguments.length?(a=t,r):a},ia(r,n)},ui.layout.pie=function(){function t(i){var l,s=i.length,c=i.map(function(r,n){return+e.call(t,r,n)}),u=+(\"function\"==typeof n?n.apply(this,arguments):n),f=(\"function\"==typeof a?a.apply(this,arguments):a)-u,d=Math.min(Math.abs(f)/s,+(\"function\"==typeof o?o.apply(this,arguments):o)),h=d*(f<0?-1:1),p=ui.sum(c),g=p?(f-s*h)/p:0,v=ui.range(s),m=[];return null!=r&&v.sort(r===xs?function(t,e){return c[e]-c[t]}:function(t,e){return r(i[t],i[e])}),v.forEach(function(t){m[t]={data:i[t],value:l=c[t],startAngle:u,endAngle:u+=l*g+h,padAngle:d}}),m}var e=Number,r=xs,n=0,a=Bi,o=0;return t.value=function(r){return arguments.length?(e=r,t):e},t.sort=function(e){return arguments.length?(r=e,t):r},t.startAngle=function(e){return arguments.length?(n=e,t):n},t.endAngle=function(e){return arguments.length?(a=e,t):a},t.padAngle=function(e){return arguments.length?(o=e,t):o},t};var xs={};ui.layout.stack=function(){function t(l,s){if(!(d=l.length))return l;var c=l.map(function(r,n){return e.call(t,r,n)}),u=c.map(function(e){return e.map(function(e,r){return[o.call(t,e,r),i.call(t,e,r)]})}),f=r.call(t,u,s);c=ui.permute(c,f),u=ui.permute(u,f);var d,h,p,g,v=n.call(t,u,s),m=c[0].length;for(p=0;p<m;++p)for(a.call(t,c[0][p],g=v[p],u[0][p][1]),h=1;h<d;++h)a.call(t,c[h][p],g+=u[h-1][p][1],u[h][p][1]);return l}var e=b,r=va,n=ma,a=ga,o=ha,i=pa;return t.values=function(r){return arguments.length?(e=r,t):e},t.order=function(e){return arguments.length?(r=\"function\"==typeof e?e:bs.get(e)||va,t):r},t.offset=function(e){return arguments.length?(n=\"function\"==typeof e?e:_s.get(e)||ma,t):n},t.x=function(e){return arguments.length?(o=e,t):o},t.y=function(e){return arguments.length?(i=e,t):i},t.out=function(e){return arguments.length?(a=e,t):a},t};var bs=ui.map({\"inside-out\":function(t){var e,r,n=t.length,a=t.map(ya),o=t.map(xa),i=ui.range(n).sort(function(t,e){return a[t]-a[e]}),l=0,s=0,c=[],u=[];for(e=0;e<n;++e)r=i[e],l<s?(l+=o[r],c.push(r)):(s+=o[r],u.push(r));return u.reverse().concat(c)},reverse:function(t){return ui.range(t.length).reverse()},default:va}),_s=ui.map({silhouette:function(t){var e,r,n,a=t.length,o=t[0].length,i=[],l=0,s=[];for(r=0;r<o;++r){for(e=0,n=0;e<a;e++)n+=t[e][r][1];n>l&&(l=n),i.push(n)}for(r=0;r<o;++r)s[r]=(l-i[r])/2;return s},wiggle:function(t){var e,r,n,a,o,i,l,s,c,u=t.length,f=t[0],d=f.length,h=[];for(h[0]=s=c=0,r=1;r<d;++r){for(e=0,a=0;e<u;++e)a+=t[e][r][1];for(e=0,o=0,l=f[r][0]-f[r-1][0];e<u;++e){for(n=0,i=(t[e][r][1]-t[e][r-1][1])/(2*l);n<e;++n)i+=(t[n][r][1]-t[n][r-1][1])/l;o+=i*t[e][r][1]}h[r]=s-=a?o/a*l:0,s<c&&(c=s)}for(r=0;r<d;++r)h[r]-=c;return h},expand:function(t){var e,r,n,a=t.length,o=t[0].length,i=1/a,l=[];for(r=0;r<o;++r){for(e=0,n=0;e<a;e++)n+=t[e][r][1];if(n)for(e=0;e<a;e++)t[e][r][1]/=n;else for(e=0;e<a;e++)t[e][r][1]=i}for(r=0;r<o;++r)l[r]=0;return l},zero:ma});ui.layout.histogram=function(){function t(t,o){for(var i,l,s=[],c=t.map(r,this),u=n.call(this,c,o),f=a.call(this,u,c,o),o=-1,d=c.length,h=f.length-1,p=e?1:1/d;++o<h;)i=s[o]=[],i.dx=f[o+1]-(i.x=f[o]),i.y=0;if(h>0)for(o=-1;++o<d;)(l=c[o])>=u[0]&&l<=u[1]&&(i=s[ui.bisect(f,l,1,h)-1],i.y+=p,i.push(t[o]));return s}var e=!0,r=Number,n=ka,a=_a;return t.value=function(e){return arguments.length?(r=e,t):r},t.range=function(e){return arguments.length?(n=Ct(e),t):n},t.bins=function(e){return arguments.length?(a=\"number\"==typeof e?function(t){return wa(t,e)}:Ct(e),t):a},t.frequency=function(r){return arguments.length?(e=!!r,t):e},t},ui.layout.pack=function(){function t(t,o){var i=r.call(this,t,o),l=i[0],s=a[0],c=a[1],u=null==e?Math.sqrt:\"function\"==typeof e?e:function(){return e};if(l.x=l.y=0,sa(l,function(t){t.r=+u(t.value)}),sa(l,Ca),n){var f=n*(e?1:Math.max(2*l.r/s,2*l.r/c))/2;sa(l,function(t){t.r+=f}),sa(l,Ca),sa(l,function(t){t.r-=f})}return Oa(l,s/2,c/2,e?1:1/Math.max(2*l.r/s,2*l.r/c)),i}var e,r=ui.layout.hierarchy().sort(Ma),n=0,a=[1,1];return t.size=function(e){return arguments.length?(a=e,t):a},t.radius=function(r){return arguments.length?(e=null==r||\"function\"==typeof r?r:+r,t):e},t.padding=function(e){return arguments.length?(n=+e,t):n},ia(t,r)},ui.layout.tree=function(){function t(t,a){var u=i.call(this,t,a),f=u[0],d=e(f);if(sa(d,r),d.parent.m=-d.z,la(d,n),c)la(f,o);else{var h=f,p=f,g=f;la(f,function(t){t.x<h.x&&(h=t),t.x>p.x&&(p=t),t.depth>g.depth&&(g=t)});var v=l(h,p)/2-h.x,m=s[0]/(p.x+l(p,h)/2+v),y=s[1]/(g.depth||1);la(f,function(t){t.x=(t.x+v)*m,t.y=t.depth*y})}return u}function e(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var a,o=e.children,i=0,l=o.length;i<l;++i)n.push((o[i]=a={_:o[i],parent:e,children:(a=o[i].children)&&a.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:i}).a=a);return r.children[0]}function r(t){var e=t.children,r=t.parent.children,n=t.i?r[t.i-1]:null;if(e.length){Ra(t);var o=(e[0].z+e[e.length-1].z)/2;n?(t.z=n.z+l(t._,n._),t.m=t.z-o):t.z=o}else n&&(t.z=n.z+l(t._,n._));t.parent.A=a(t,n,t.parent.A||r[0])}function n(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function a(t,e,r){if(e){for(var n,a=t,o=t,i=e,s=a.parent.children[0],c=a.m,u=o.m,f=i.m,d=s.m;i=Na(i),a=Ea(a),i&&a;)s=Ea(s),o=Na(o),o.a=t,n=i.z+f-a.z-c+l(i._,a._),n>0&&(Ia(Fa(i,t,r),t,n),c+=n,u+=n),f+=i.m,c+=a.m,d+=s.m,u+=o.m;i&&!Na(o)&&(o.t=i,o.m+=f-u),a&&!Ea(s)&&(s.t=a,s.m+=c-d,r=t)}return r}function o(t){t.x*=s[0],t.y=t.depth*s[1]}var i=ui.layout.hierarchy().sort(null).value(null),l=Pa,s=[1,1],c=null;return t.separation=function(e){return arguments.length?(l=e,t):l},t.size=function(e){return arguments.length?(c=null==(s=e)?o:null,t):c?null:s},t.nodeSize=function(e){return arguments.length?(c=null==(s=e)?null:o,t):c?s:null},ia(t,i)},ui.layout.cluster=function(){function t(t,o){var i,l=e.call(this,t,o),s=l[0],c=0;sa(s,function(t){var e=t.children;e&&e.length?(t.x=Ba(e),t.y=ja(e)):(t.x=i?c+=r(t,i):0,t.y=0,i=t)});var u=qa(s),f=Ha(s),d=u.x-r(u,f)/2,h=f.x+r(f,u)/2;return sa(s,a?function(t){t.x=(t.x-s.x)*n[0],t.y=(s.y-t.y)*n[1]}:function(t){t.x=(t.x-d)/(h-d)*n[0],t.y=(1-(s.y?t.y/s.y:1))*n[1]}),l}var e=ui.layout.hierarchy().sort(null).value(null),r=Pa,n=[1,1],a=!1;return t.separation=function(e){return arguments.length?(r=e,t):r},t.size=function(e){return arguments.length?(a=null==(n=e),t):a?null:n},t.nodeSize=function(e){return arguments.length?(a=null!=(n=e),t):a?n:null},ia(t,e)},ui.layout.treemap=function(){function t(t,e){for(var r,n,a=-1,o=t.length;++a<o;)n=(r=t[a]).value*(e<0?0:e),r.area=isNaN(n)||n<=0?0:n}function e(r){var o=r.children;if(o&&o.length){var i,l,s,c=f(r),u=[],d=o.slice(),p=1/0,g=\"slice\"===h?c.dx:\"dice\"===h?c.dy:\"slice-dice\"===h?1&r.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(t(d,c.dx*c.dy/r.value),u.area=0;(s=d.length)>0;)u.push(i=d[s-1]),u.area+=i.area,\"squarify\"!==h||(l=n(u,g))<=p?(d.pop(),p=l):(u.area-=u.pop().area,a(u,g,c,!1),g=Math.min(c.dx,c.dy),u.length=u.area=0,p=1/0);u.length&&(a(u,g,c,!0),u.length=u.area=0),o.forEach(e)}}function r(e){var n=e.children;if(n&&n.length){var o,i=f(e),l=n.slice(),s=[];for(t(l,i.dx*i.dy/e.value),s.area=0;o=l.pop();)s.push(o),s.area+=o.area,null!=o.z&&(a(s,o.z?i.dx:i.dy,i,!l.length),s.length=s.area=0);n.forEach(r)}}function n(t,e){for(var r,n=t.area,a=0,o=1/0,i=-1,l=t.length;++i<l;)(r=t[i].area)&&(r<o&&(o=r),r>a&&(a=r));return n*=n,e*=e,n?Math.max(e*a*p/n,n/(e*o*p)):1/0}function a(t,e,r,n){var a,o=-1,i=t.length,l=r.x,c=r.y,u=e?s(t.area/e):0;if(e==r.dx){for((n||u>r.dy)&&(u=r.dy);++o<i;)a=t[o],a.x=l,a.y=c,a.dy=u,l+=a.dx=Math.min(r.x+r.dx-l,u?s(a.area/u):0);a.z=!0,a.dx+=r.x+r.dx-l,r.y+=u,r.dy-=u}else{for((n||u>r.dx)&&(u=r.dx);++o<i;)a=t[o],a.x=l,a.y=c,a.dx=u,c+=a.dy=Math.min(r.y+r.dy-c,u?s(a.area/u):0);a.z=!1,a.dy+=r.y+r.dy-c,r.x+=u,r.dx-=u}}function o(n){var a=i||l(n),o=a[0];return o.x=o.y=0,o.value?(o.dx=c[0],o.dy=c[1]):o.dx=o.dy=0,i&&l.revalue(o),t([o],o.dx*o.dy/o.value),(i?r:e)(o),d&&(i=a),a}var i,l=ui.layout.hierarchy(),s=Math.round,c=[1,1],u=null,f=Va,d=!1,h=\"squarify\",p=.5*(1+Math.sqrt(5));return o.size=function(t){return arguments.length?(c=t,o):c},o.padding=function(t){function e(e){var r=t.call(o,e,e.depth);return null==r?Va(e):Ua(e,\"number\"==typeof r?[r,r,r,r]:r)}function r(e){return Ua(e,t)}if(!arguments.length)return u;var n;return f=null==(u=t)?Va:\"function\"==(n=typeof t)?e:\"number\"===n?(t=[t,t,t,t],r):r,o},o.round=function(t){return arguments.length?(s=t?Math.round:Number,o):s!=Number},o.sticky=function(t){return arguments.length?(d=t,i=null,o):d},o.ratio=function(t){return arguments.length?(p=t,o):p},o.mode=function(t){return arguments.length?(h=t+\"\",o):h},ia(o,l)},ui.random={normal:function(t,e){var r=arguments.length;return r<2&&(e=1),r<1&&(t=0),function(){var r,n,a;do{r=2*Math.random()-1,n=2*Math.random()-1,a=r*r+n*n}while(!a||a>1);return t+e*r*Math.sqrt(-2*Math.log(a)/a)}},logNormal:function(){var t=ui.random.normal.apply(ui,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=ui.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;r<t;r++)e+=Math.random();return e}}},ui.scale={};var ws={floor:b,ceil:b};ui.scale.linear=function(){return Qa([0,1],[0,1],_n,!1)};var ks={s:1,g:1,p:1,r:1,e:1};ui.scale.log=function(){return oo(ui.scale.linear().domain([0,1]),10,!0,[1,10])};var Ms=ui.format(\".0e\"),As={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};ui.scale.pow=function(){return io(ui.scale.linear(),1,[0,1])},ui.scale.sqrt=function(){return ui.scale.pow().exponent(.5)},ui.scale.ordinal=function(){return so([],{t:\"range\",a:[[]]})},ui.scale.category10=function(){return ui.scale.ordinal().range(Ts)},ui.scale.category20=function(){return ui.scale.ordinal().range(Ls)},ui.scale.category20b=function(){return ui.scale.ordinal().range(Cs)},ui.scale.category20c=function(){return ui.scale.ordinal().range(Ss)};var Ts=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(_t),Ls=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(_t),Cs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(_t),Ss=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(_t);ui.scale.quantile=function(){return co([],[])},ui.scale.quantize=function(){return uo(0,1,[0,1])},ui.scale.threshold=function(){return fo([.5],[0,1])},ui.scale.identity=function(){return ho([0,1])},ui.svg={},ui.svg.arc=function(){function t(){var t=Math.max(0,+r.apply(this,arguments)),c=Math.max(0,+n.apply(this,arguments)),u=i.apply(this,arguments)-Hi,f=l.apply(this,arguments)-Hi,d=Math.abs(f-u),h=u>f?0:1;if(c<t&&(p=c,c=t,t=p),d>=qi)return e(c,h)+(t?e(t,1-h):\"\")+\"Z\";var p,g,v,m,y,x,b,_,w,k,M,A,T=0,L=0,C=[];if((m=(+s.apply(this,arguments)||0)/2)&&(v=o===zs?Math.sqrt(t*t+c*c):+o.apply(this,arguments),h||(L*=-1),c&&(L=nt(v/c*Math.sin(m))),t&&(T=nt(v/t*Math.sin(m)))),c){y=c*Math.cos(u+L),x=c*Math.sin(u+L),b=c*Math.cos(f-L),_=c*Math.sin(f-L);var S=Math.abs(f-u-2*L)<=ji?0:1;if(L&&bo(y,x,b,_)===h^S){var z=(u+f)/2;y=c*Math.cos(z),x=c*Math.sin(z),b=_=null}}else y=x=0;if(t){w=t*Math.cos(f-T),k=t*Math.sin(f-T),M=t*Math.cos(u+T),A=t*Math.sin(u+T);var O=Math.abs(u-f+2*T)<=ji?0:1;if(T&&bo(w,k,M,A)===1-h^O){var D=(u+f)/2;w=t*Math.cos(D),k=t*Math.sin(D),M=A=null}}else w=k=0;if(d>Ri&&(p=Math.min(Math.abs(c-t)/2,+a.apply(this,arguments)))>.001){g=t<c^h?0:1;var P=p,E=p;if(d<ji){var N=null==M?[w,k]:null==b?[y,x]:Nr([y,x],[M,A],[b,_],[w,k]),I=y-N[0],R=x-N[1],F=b-N[0],j=_-N[1],B=1/Math.sin(Math.acos((I*F+R*j)/(Math.sqrt(I*I+R*R)*Math.sqrt(F*F+j*j)))/2),q=Math.sqrt(N[0]*N[0]+N[1]*N[1]);E=Math.min(p,(t-q)/(B-1)),P=Math.min(p,(c-q)/(B+1))}if(null!=b){var H=_o(null==M?[w,k]:[M,A],[y,x],c,P,h),V=_o([b,_],[w,k],c,P,h);p===P?C.push(\"M\",H[0],\"A\",P,\",\",P,\" 0 0,\",g,\" \",H[1],\"A\",c,\",\",c,\" 0 \",1-h^bo(H[1][0],H[1][1],V[1][0],V[1][1]),\",\",h,\" \",V[1],\"A\",P,\",\",P,\" 0 0,\",g,\" \",V[0]):C.push(\"M\",H[0],\"A\",P,\",\",P,\" 0 1,\",g,\" \",V[0])}else C.push(\"M\",y,\",\",x);if(null!=M){var U=_o([y,x],[M,A],t,-E,h),X=_o([w,k],null==b?[y,x]:[b,_],t,-E,h);p===E?C.push(\"L\",X[0],\"A\",E,\",\",E,\" 0 0,\",g,\" \",X[1],\"A\",t,\",\",t,\" 0 \",h^bo(X[1][0],X[1][1],U[1][0],U[1][1]),\",\",1-h,\" \",U[1],\"A\",E,\",\",E,\" 0 0,\",g,\" \",U[0]):C.push(\"L\",X[0],\"A\",E,\",\",E,\" 0 0,\",g,\" \",U[0])}else C.push(\"L\",w,\",\",k)}else C.push(\"M\",y,\",\",x),null!=b&&C.push(\"A\",c,\",\",c,\" 0 \",S,\",\",h,\" \",b,\",\",_),C.push(\"L\",w,\",\",k),null!=M&&C.push(\"A\",t,\",\",t,\" 0 \",O,\",\",1-h,\" \",M,\",\",A);return C.push(\"Z\"),C.join(\"\")}function e(t,e){return\"M0,\"+t+\"A\"+t+\",\"+t+\" 0 1,\"+e+\" 0,\"+-t+\"A\"+t+\",\"+t+\" 0 1,\"+e+\" 0,\"+t}var r=go,n=vo,a=po,o=zs,i=mo,l=yo,s=xo;return t.innerRadius=function(e){return arguments.length?(r=Ct(e),t):r},t.outerRadius=function(e){return arguments.length?(n=Ct(e),t):n},t.cornerRadius=function(e){return arguments.length?(a=Ct(e),t):a},t.padRadius=function(e){return arguments.length?(o=e==zs?zs:Ct(e),t):o},t.startAngle=function(e){return arguments.length?(i=Ct(e),t):i},t.endAngle=function(e){return arguments.length?(l=Ct(e),t):l},t.padAngle=function(e){return arguments.length?(s=Ct(e),t):s},t.centroid=function(){var t=(+r.apply(this,arguments)+ +n.apply(this,arguments))/2,e=(+i.apply(this,arguments)+ +l.apply(this,arguments))/2-Hi;return[Math.cos(e)*t,Math.sin(e)*t]},t};var zs=\"auto\";ui.svg.line=function(){return wo(b)};var Os=ui.map({linear:ko,\"linear-closed\":Mo,step:Ao,\"step-before\":To,\"step-after\":Lo,basis:Po,\"basis-open\":Eo,\"basis-closed\":No,bundle:Io,cardinal:zo,\"cardinal-open\":Co,\"cardinal-closed\":So,monotone:Ho});Os.forEach(function(t,e){e.key=t,e.closed=/-closed$/.test(t)});var Ds=[0,2/3,1/3,0],Ps=[0,1/3,2/3,0],Es=[0,1/6,2/3,1/6];ui.svg.line.radial=function(){var t=wo(Vo);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},To.reverse=Lo,Lo.reverse=To,ui.svg.area=function(){return Uo(b)},ui.svg.area.radial=function(){var t=Uo(Vo);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},ui.svg.chord=function(){function t(t,l){var s=e(this,o,t,l),c=e(this,i,t,l);return\"M\"+s.p0+n(s.r,s.p1,s.a1-s.a0)+(r(s,c)?a(s.r,s.p1,s.r,s.p0):a(s.r,s.p1,c.r,c.p0)+n(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,s.r,s.p0))+\"Z\"}function e(t,e,r,n){var a=e.call(t,r,n),o=l.call(t,a,n),i=s.call(t,a,n)-Hi,u=c.call(t,a,n)-Hi;return{r:o,a0:i,a1:u,p0:[o*Math.cos(i),o*Math.sin(i)],p1:[o*Math.cos(u),o*Math.sin(u)]}}function r(t,e){return t.a0==e.a0&&t.a1==e.a1}function n(t,e,r){return\"A\"+t+\",\"+t+\" 0 \"+ +(r>ji)+\",1 \"+e}function a(t,e,r,n){return\"Q 0,0 \"+n}var o=br,i=_r,l=Xo,s=mo,c=yo;return t.radius=function(e){return arguments.length?(l=Ct(e),t):l},t.source=function(e){return arguments.length?(o=Ct(e),t):o},t.target=function(e){return arguments.length?(i=Ct(e),t):i},t.startAngle=function(e){return arguments.length?(s=Ct(e),t):s},t.endAngle=function(e){return arguments.length?(c=Ct(e),t):c},t},ui.svg.diagonal=function(){function t(t,a){var o=e.call(this,t,a),i=r.call(this,t,a),l=(o.y+i.y)/2,s=[o,{x:o.x,y:l},{x:i.x,y:l},i];return s=s.map(n),\"M\"+s[0]+\"C\"+s[1]+\" \"+s[2]+\" \"+s[3]}var e=br,r=_r,n=Go;return t.source=function(r){return arguments.length?(e=Ct(r),t):e},t.target=function(e){return arguments.length?(r=Ct(e),t):r},t.projection=function(e){return arguments.length?(n=e,t):n},t},ui.svg.diagonal.radial=function(){var t=ui.svg.diagonal(),e=Go,r=t.projection;return t.projection=function(t){return arguments.length?r(Yo(e=t)):e},t},ui.svg.symbol=function(){function t(t,n){return(Ns.get(e.call(this,t,n))||$o)(r.call(this,t,n))}var e=Wo,r=Zo;return t.type=function(r){return arguments.length?(e=Ct(r),t):e},t.size=function(e){return arguments.length?(r=Ct(e),t):r},t};var Ns=ui.map({circle:$o,cross:function(t){var e=Math.sqrt(t/5)/2;return\"M\"+-3*e+\",\"+-e+\"H\"+-e+\"V\"+-3*e+\"H\"+e+\"V\"+-e+\"H\"+3*e+\"V\"+e+\"H\"+e+\"V\"+3*e+\"H\"+-e+\"V\"+e+\"H\"+-3*e+\"Z\"},diamond:function(t){var e=Math.sqrt(t/(2*Rs)),r=e*Rs;return\"M0,\"+-e+\"L\"+r+\",0 0,\"+e+\" \"+-r+\",0Z\"},square:function(t){var e=Math.sqrt(t)/2;return\"M\"+-e+\",\"+-e+\"L\"+e+\",\"+-e+\" \"+e+\",\"+e+\" \"+-e+\",\"+e+\"Z\"},\"triangle-down\":function(t){var e=Math.sqrt(t/Is),r=e*Is/2;return\"M0,\"+r+\"L\"+e+\",\"+-r+\" \"+-e+\",\"+-r+\"Z\"},\"triangle-up\":function(t){var e=Math.sqrt(t/Is),r=e*Is/2;return\"M0,\"+-r+\"L\"+e+\",\"+r+\" \"+-e+\",\"+r+\"Z\"}});ui.svg.symbolTypes=Ns.keys();var Is=Math.sqrt(3),Rs=Math.tan(30*Vi);Si.transition=function(t){for(var e,r,n=Fs||++Hs,a=ei(t),o=[],i=js||{time:Date.now(),ease:Cn,delay:0,duration:250},l=-1,s=this.length;++l<s;){o.push(e=[]);for(var c=this[l],u=-1,f=c.length;++u<f;)(r=c[u])&&ri(r,u,a,n,i),e.push(r)}return Jo(o,a,n)},Si.interrupt=function(t){return this.each(null==t?Bs:Qo(ei(t)))};var Fs,js,Bs=Qo(ei()),qs=[],Hs=0;qs.call=Si.call,qs.empty=Si.empty,qs.node=Si.node,qs.size=Si.size,ui.transition=function(t,e){return t&&t.transition?Fs?t.transition(e):t:ui.selection().transition(t)},ui.transition.prototype=qs,qs.select=function(t){var e,r,n,a=this.id,o=this.namespace,i=[];t=z(t);for(var l=-1,s=this.length;++l<s;){i.push(e=[]);for(var c=this[l],u=-1,f=c.length;++u<f;)(n=c[u])&&(r=t.call(n,n.__data__,u,l))?(\"__data__\"in n&&(r.__data__=n.__data__),ri(r,u,o,a,n[o][a]),e.push(r)):e.push(null)}return Jo(i,o,a)},qs.selectAll=function(t){var e,r,n,a,o,i=this.id,l=this.namespace,s=[];t=O(t);for(var c=-1,u=this.length;++c<u;)for(var f=this[c],d=-1,h=f.length;++d<h;)if(n=f[d]){o=n[l][i],r=t.call(n,n.__data__,d,c),s.push(e=[]);for(var p=-1,g=r.length;++p<g;)(a=r[p])&&ri(a,p,l,i,o),e.push(a)}return Jo(s,l,i)},qs.filter=function(t){var e,r,n,a=[];\"function\"!=typeof t&&(t=V(t));for(var o=0,i=this.length;o<i;o++){a.push(e=[]);for(var r=this[o],l=0,s=r.length;l<s;l++)(n=r[l])&&t.call(n,n.__data__,l,o)&&e.push(n)}return Jo(a,this.namespace,this.id)},qs.tween=function(t,e){var r=this.id,n=this.namespace;return arguments.length<2?this.node()[n][r].tween.get(t):X(this,null==e?function(e){e[n][r].tween.remove(t)}:function(a){a[n][r].tween.set(t,e)})},qs.attr=function(t,e){function r(){this.removeAttribute(l)}function n(){this.removeAttributeNS(l.space,l.local)}function a(t){return null==t?r:(t+=\"\",function(){var e,r=this.getAttribute(l);return r!==t&&(e=i(r,t),function(t){this.setAttribute(l,e(t))})})}function o(t){return null==t?n:(t+=\"\",function(){var e,r=this.getAttributeNS(l.space,l.local);return r!==t&&(e=i(r,t),function(t){this.setAttributeNS(l.space,l.local,e(t))})})}if(arguments.length<2){for(e in t)this.attr(e,t[e]);return this}var i=\"transform\"==t?Wn:_n,l=ui.ns.qualify(t);return Ko(this,\"attr.\"+t,e,l.local?o:a)},qs.attrTween=function(t,e){function r(t,r){var n=e.call(this,t,r,this.getAttribute(a));return n&&function(t){this.setAttribute(a,n(t))}}function n(t,r){var n=e.call(this,t,r,this.getAttributeNS(a.space,a.local));return n&&function(t){this.setAttributeNS(a.space,a.local,n(t))}}var a=ui.ns.qualify(t);return this.tween(\"attr.\"+t,a.local?n:r)},qs.style=function(t,e,r){function a(){this.style.removeProperty(t)}function o(e){return null==e?a:(e+=\"\",function(){var a,o=n(this).getComputedStyle(this,null).getPropertyValue(t);return o!==e&&(a=_n(o,e),function(e){this.style.setProperty(t,a(e),r)})})}var i=arguments.length;if(i<3){if(\"string\"!=typeof t){i<2&&(e=\"\");for(r in t)this.style(r,t[r],e);return this}r=\"\"}return Ko(this,\"style.\"+t,e,o)},qs.styleTween=function(t,e,r){function a(a,o){var i=e.call(this,a,o,n(this).getComputedStyle(this,null).getPropertyValue(t));return i&&function(e){this.style.setProperty(t,i(e),r)}}return arguments.length<3&&(r=\"\"),this.tween(\"style.\"+t,a)},qs.text=function(t){return Ko(this,\"text\",t,ti)},qs.remove=function(){var t=this.namespace;return this.each(\"end.transition\",function(){var e;this[t].count<2&&(e=this.parentNode)&&e.removeChild(this)})},qs.ease=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].ease:(\"function\"!=typeof t&&(t=ui.ease.apply(ui,arguments)),X(this,function(n){n[r][e].ease=t}))},qs.delay=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].delay:X(this,\"function\"==typeof t?function(n,a,o){n[r][e].delay=+t.call(n,n.__data__,a,o)}:(t=+t,function(n){n[r][e].delay=t}))},qs.duration=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].duration:X(this,\"function\"==typeof t?function(n,a,o){n[r][e].duration=Math.max(1,t.call(n,n.__data__,a,o))}:(t=Math.max(1,t),function(n){n[r][e].duration=t}))},qs.each=function(t,e){var r=this.id,n=this.namespace;if(arguments.length<2){var a=js,o=Fs;try{Fs=r,X(this,function(e,a,o){js=e[n][r],t.call(e,e.__data__,a,o)})}finally{js=a,Fs=o}}else X(this,function(a){var o=a[n][r];(o.event||(o.event=ui.dispatch(\"start\",\"end\",\"interrupt\"))).on(t,e)});return this},qs.transition=function(){for(var t,e,r,n,a=this.id,o=++Hs,i=this.namespace,l=[],s=0,c=this.length;s<c;s++){l.push(t=[]);for(var e=this[s],u=0,f=e.length;u<f;u++)(r=e[u])&&(n=r[i][a],ri(r,u,i,o,{time:n.time,ease:n.ease,delay:n.delay+n.duration,duration:n.duration})),t.push(r)}return Jo(l,i,o)},ui.svg.axis=function(){function t(t){t.each(function(){var t,c=ui.select(this),u=this.__chart__||r,f=this.__chart__=r.copy(),d=null==s?f.ticks?f.ticks.apply(f,l):f.domain():s,h=null==e?f.tickFormat?f.tickFormat.apply(f,l):b:e,p=c.selectAll(\".tick\").data(d,f),g=p.enter().insert(\"g\",\".domain\").attr(\"class\",\"tick\").style(\"opacity\",Ri),v=ui.transition(p.exit()).style(\"opacity\",Ri).remove(),m=ui.transition(p.order()).style(\"opacity\",1),y=Math.max(a,0)+i,x=Ga(f),_=c.selectAll(\".domain\").data([0]),w=(_.enter().append(\"path\").attr(\"class\",\"domain\"),ui.transition(_));g.append(\"line\"),g.append(\"text\");var k,M,A,T,L=g.select(\"line\"),C=m.select(\"line\"),S=p.select(\"text\").text(h),z=g.select(\"text\"),O=m.select(\"text\"),D=\"top\"===n||\"left\"===n?-1:1;if(\"bottom\"===n||\"top\"===n?(t=ni,k=\"x\",A=\"y\",M=\"x2\",T=\"y2\",S.attr(\"dy\",D<0?\"0em\":\".71em\").style(\"text-anchor\",\"middle\"),w.attr(\"d\",\"M\"+x[0]+\",\"+D*o+\"V0H\"+x[1]+\"V\"+D*o)):(t=ai,k=\"y\",A=\"x\",M=\"y2\",T=\"x2\",S.attr(\"dy\",\".32em\").style(\"text-anchor\",D<0?\"end\":\"start\"),w.attr(\"d\",\"M\"+D*o+\",\"+x[0]+\"H0V\"+x[1]+\"H\"+D*o)),L.attr(T,D*a),z.attr(A,D*y),C.attr(M,0).attr(T,D*a),O.attr(k,0).attr(A,D*y),f.rangeBand){var P=f,E=P.rangeBand()/2;u=f=function(t){return P(t)+E}}else u.rangeBand?u=f:v.call(t,f,u);g.call(t,u,f),m.call(t,f,f)})}var e,r=ui.scale.linear(),n=Vs,a=6,o=6,i=3,l=[10],s=null;return t.scale=function(e){return arguments.length?(r=e,t):r},t.orient=function(e){return arguments.length?(n=e in Us?e+\"\":Vs,t):n},t.ticks=function(){return arguments.length?(l=di(arguments),t):l},t.tickValues=function(e){return arguments.length?(s=e,t):s},t.tickFormat=function(r){return arguments.length?(e=r,t):e},t.tickSize=function(e){var r=arguments.length;return r?(a=+e,o=+arguments[r-1],t):a},t.innerTickSize=function(e){return arguments.length?(a=+e,t):a},t.outerTickSize=function(e){return arguments.length?(o=+e,t):o},t.tickPadding=function(e){return arguments.length?(i=+e,t):i},t.tickSubdivide=function(){return arguments.length&&t},t};var Vs=\"bottom\",Us={top:1,right:1,bottom:1,left:1};ui.svg.brush=function(){function t(n){n.each(function(){var n=ui.select(this).style(\"pointer-events\",\"all\").style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\").on(\"mousedown.brush\",o).on(\"touchstart.brush\",o),i=n.selectAll(\".background\").data([0]);i.enter().append(\"rect\").attr(\"class\",\"background\").style(\"visibility\",\"hidden\").style(\"cursor\",\"crosshair\"),n.selectAll(\".extent\").data([0]).enter().append(\"rect\").attr(\"class\",\"extent\").style(\"cursor\",\"move\");var l=n.selectAll(\".resize\").data(g,b);l.exit().remove(),l.enter().append(\"g\").attr(\"class\",function(t){return\"resize \"+t}).style(\"cursor\",function(t){return Xs[t]}).append(\"rect\").attr(\"x\",function(t){return/[ew]$/.test(t)?-3:null}).attr(\"y\",function(t){return/^[ns]/.test(t)?-3:null}).attr(\"width\",6).attr(\"height\",6).style(\"visibility\",\"hidden\"),l.style(\"display\",t.empty()?\"none\":null);var s,f=ui.transition(n),d=ui.transition(i);c&&(s=Ga(c),d.attr(\"x\",s[0]).attr(\"width\",s[1]-s[0]),r(f)),u&&(s=Ga(u),d.attr(\"y\",s[0]).attr(\"height\",s[1]-s[0]),a(f)),e(f)})}function e(t){t.selectAll(\".resize\").attr(\"transform\",function(t){return\"translate(\"+f[+/e$/.test(t)]+\",\"+d[+/^s/.test(t)]+\")\"})}function r(t){t.select(\".extent\").attr(\"x\",f[0]),t.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\",f[1]-f[0])}function a(t){t.select(\".extent\").attr(\"y\",d[0]),t.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",d[1]-d[0])}function o(){function o(){32==ui.event.keyCode&&(S||(x=null,O[0]-=f[1],O[1]-=d[1],S=2),T())}function g(){32==ui.event.keyCode&&2==S&&(O[0]+=f[1],O[1]+=d[1],S=0,T())}function v(){var t=ui.mouse(_),n=!1;b&&(t[0]+=b[0],t[1]+=b[1]),S||(ui.event.altKey?(x||(x=[(f[0]+f[1])/2,(d[0]+d[1])/2]),O[0]=f[+(t[0]<x[0])],O[1]=d[+(t[1]<x[1])]):x=null),L&&m(t,c,0)&&(r(M),n=!0),C&&m(t,u,1)&&(a(M),n=!0),n&&(e(M),k({type:\"brush\",mode:S?\"move\":\"resize\"}))}function m(t,e,r){var n,a,o=Ga(e),s=o[0],c=o[1],u=O[r],g=r?d:f,v=g[1]-g[0];if(S&&(s-=u,c-=v+u),n=(r?p:h)?Math.max(s,Math.min(c,t[r])):t[r],S?a=(n+=u)+v:(x&&(u=Math.max(s,Math.min(c,2*x[r]-n))),u<n?(a=n,n=u):a=u),g[0]!=n||g[1]!=a)return r?l=null:i=null,g[0]=n,g[1]=a,!0}function y(){v(),M.style(\"pointer-events\",\"all\").selectAll(\".resize\").style(\"display\",t.empty()?\"none\":null),ui.select(\"body\").style(\"cursor\",null),D.on(\"mousemove.brush\",null).on(\"mouseup.brush\",null).on(\"touchmove.brush\",null).on(\"touchend.brush\",null).on(\"keydown.brush\",null).on(\"keyup.brush\",null),z(),k({type:\"brushend\"})}var x,b,_=this,w=ui.select(ui.event.target),k=s.of(_,arguments),M=ui.select(_),A=w.datum(),L=!/^(n|s)$/.test(A)&&c,C=!/^(e|w)$/.test(A)&&u,S=w.classed(\"extent\"),z=Q(_),O=ui.mouse(_),D=ui.select(n(_)).on(\"keydown.brush\",o).on(\"keyup.brush\",g);if(ui.event.changedTouches?D.on(\"touchmove.brush\",v).on(\"touchend.brush\",y):D.on(\"mousemove.brush\",v).on(\"mouseup.brush\",y),M.interrupt().selectAll(\"*\").interrupt(),S)O[0]=f[0]-O[0],O[1]=d[0]-O[1];else if(A){var P=+/w$/.test(A),E=+/^n/.test(A);b=[f[1-P]-O[0],d[1-E]-O[1]],O[0]=f[P],O[1]=d[E]}else ui.event.altKey&&(x=O.slice());M.style(\"pointer-events\",\"none\").selectAll(\".resize\").style(\"display\",null),ui.select(\"body\").style(\"cursor\",w.style(\"cursor\")),k({type:\"brushstart\"}),v()}var i,l,s=C(t,\"brushstart\",\"brush\",\"brushend\"),c=null,u=null,f=[0,0],d=[0,0],h=!0,p=!0,g=Gs[0];return t.event=function(t){t.each(function(){var t=s.of(this,arguments),e={x:f,y:d,i:i,j:l},r=this.__chart__||e;this.__chart__=e,Fs?ui.select(this).transition().each(\"start.brush\",function(){i=r.i,l=r.j,f=r.x,d=r.y,t({\n",
|
|
"type:\"brushstart\"})}).tween(\"brush:brush\",function(){var r=wn(f,e.x),n=wn(d,e.y);return i=l=null,function(a){f=e.x=r(a),d=e.y=n(a),t({type:\"brush\",mode:\"resize\"})}}).each(\"end.brush\",function(){i=e.i,l=e.j,t({type:\"brush\",mode:\"resize\"}),t({type:\"brushend\"})}):(t({type:\"brushstart\"}),t({type:\"brush\",mode:\"resize\"}),t({type:\"brushend\"}))})},t.x=function(e){return arguments.length?(c=e,g=Gs[!c<<1|!u],t):c},t.y=function(e){return arguments.length?(u=e,g=Gs[!c<<1|!u],t):u},t.clamp=function(e){return arguments.length?(c&&u?(h=!!e[0],p=!!e[1]):c?h=!!e:u&&(p=!!e),t):c&&u?[h,p]:c?h:u?p:null},t.extent=function(e){var r,n,a,o,s;return arguments.length?(c&&(r=e[0],n=e[1],u&&(r=r[0],n=n[0]),i=[r,n],c.invert&&(r=c(r),n=c(n)),n<r&&(s=r,r=n,n=s),r==f[0]&&n==f[1]||(f=[r,n])),u&&(a=e[0],o=e[1],c&&(a=a[1],o=o[1]),l=[a,o],u.invert&&(a=u(a),o=u(o)),o<a&&(s=a,a=o,o=s),a==d[0]&&o==d[1]||(d=[a,o])),t):(c&&(i?(r=i[0],n=i[1]):(r=f[0],n=f[1],c.invert&&(r=c.invert(r),n=c.invert(n)),n<r&&(s=r,r=n,n=s))),u&&(l?(a=l[0],o=l[1]):(a=d[0],o=d[1],u.invert&&(a=u.invert(a),o=u.invert(o)),o<a&&(s=a,a=o,o=s))),c&&u?[[r,a],[n,o]]:c?[r,n]:u&&[a,o])},t.clear=function(){return t.empty()||(f=[0,0],d=[0,0],i=l=null),t},t.empty=function(){return!!c&&f[0]==f[1]||!!u&&d[0]==d[1]},ui.rebind(t,s,\"on\")};var Xs={n:\"ns-resize\",e:\"ew-resize\",s:\"ns-resize\",w:\"ew-resize\",nw:\"nwse-resize\",ne:\"nesw-resize\",se:\"nwse-resize\",sw:\"nesw-resize\"},Gs=[[\"n\",\"e\",\"s\",\"w\",\"nw\",\"ne\",\"se\",\"sw\"],[\"e\",\"w\"],[\"n\",\"s\"],[]],Ys=dl.format=yl.timeFormat,Zs=Ys.utc,Ws=Zs(\"%Y-%m-%dT%H:%M:%S.%LZ\");Ys.iso=Date.prototype.toISOString&&+new Date(\"2000-01-01T00:00:00.000Z\")?oi:Ws,oi.parse=function(t){var e=new Date(t);return isNaN(e)?null:e},oi.toString=Ws.toString,dl.second=Ht(function(t){return new hl(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(t.getTime()+1e3*Math.floor(e))},function(t){return t.getSeconds()}),dl.seconds=dl.second.range,dl.seconds.utc=dl.second.utc.range,dl.minute=Ht(function(t){return new hl(6e4*Math.floor(t/6e4))},function(t,e){t.setTime(t.getTime()+6e4*Math.floor(e))},function(t){return t.getMinutes()}),dl.minutes=dl.minute.range,dl.minutes.utc=dl.minute.utc.range,dl.hour=Ht(function(t){var e=t.getTimezoneOffset()/60;return new hl(36e5*(Math.floor(t/36e5-e)+e))},function(t,e){t.setTime(t.getTime()+36e5*Math.floor(e))},function(t){return t.getHours()}),dl.hours=dl.hour.range,dl.hours.utc=dl.hour.utc.range,dl.month=Ht(function(t){return t=dl.day(t),t.setDate(1),t},function(t,e){t.setMonth(t.getMonth()+e)},function(t){return t.getMonth()}),dl.months=dl.month.range,dl.months.utc=dl.month.utc.range;var $s=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qs=[[dl.second,1],[dl.second,5],[dl.second,15],[dl.second,30],[dl.minute,1],[dl.minute,5],[dl.minute,15],[dl.minute,30],[dl.hour,1],[dl.hour,3],[dl.hour,6],[dl.hour,12],[dl.day,1],[dl.day,2],[dl.week,1],[dl.month,1],[dl.month,3],[dl.year,1]],Js=Ys.multi([[\".%L\",function(t){return t.getMilliseconds()}],[\":%S\",function(t){return t.getSeconds()}],[\"%I:%M\",function(t){return t.getMinutes()}],[\"%I %p\",function(t){return t.getHours()}],[\"%a %d\",function(t){return t.getDay()&&1!=t.getDate()}],[\"%b %d\",function(t){return 1!=t.getDate()}],[\"%B\",function(t){return t.getMonth()}],[\"%Y\",Oe]]),Ks={range:function(t,e,r){return ui.range(Math.ceil(t/r)*r,+e,r).map(li)},floor:b,ceil:b};Qs.year=dl.year,dl.scale=function(){return ii(ui.scale.linear(),Qs,Js)};var tc=Qs.map(function(t){return[t[0].utc,t[1]]}),ec=Zs.multi([[\".%L\",function(t){return t.getUTCMilliseconds()}],[\":%S\",function(t){return t.getUTCSeconds()}],[\"%I:%M\",function(t){return t.getUTCMinutes()}],[\"%I %p\",function(t){return t.getUTCHours()}],[\"%a %d\",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[\"%b %d\",function(t){return 1!=t.getUTCDate()}],[\"%B\",function(t){return t.getUTCMonth()}],[\"%Y\",Oe]]);tc.year=dl.year.utc,dl.scale.utc=function(){return ii(ui.scale.linear(),tc,ec)},ui.text=St(function(t){return t.responseText}),ui.json=function(t,e){return zt(t,\"application/json\",si,e)},ui.html=function(t,e){return zt(t,\"text/html\",ci,e)},ui.xml=St(function(t){return t.responseXML}),\"function\"==typeof t&&t.amd?(this.d3=ui,t(ui)):\"object\"==typeof r&&r.exports?r.exports=ui:this.d3=ui}()},{}],8:[function(e,r,n){(function(a,o){!function(e,a){\"object\"==typeof n&&void 0!==r?r.exports=a():\"function\"==typeof t&&t.amd?t(a):e.ES6Promise=a()}(this,function(){\"use strict\";function t(t){return\"function\"==typeof t||\"object\"==typeof t&&null!==t}function r(t){return\"function\"==typeof t}function n(t){X=t}function i(t){G=t}function l(){return function(){U(c)}}function s(){var t=setTimeout;return function(){return t(c,1)}}function c(){for(var t=0;t<V;t+=2){(0,J[t])(J[t+1]),J[t]=void 0,J[t+1]=void 0}V=0}function u(t,e){var r=arguments,n=this,a=new this.constructor(d);void 0===a[tt]&&O(a);var o=n._state;return o?function(){var t=r[o-1];G(function(){return C(o,a,t,n._result)})}():M(n,a,t,e),a}function f(t){var e=this;if(t&&\"object\"==typeof t&&t.constructor===e)return t;var r=new e(d);return b(r,t),r}function d(){}function h(){return new TypeError(\"You cannot resolve a promise with itself\")}function p(){return new TypeError(\"A promises callback cannot return that same promise.\")}function g(t){try{return t.then}catch(t){return at.error=t,at}}function v(t,e,r,n){try{t.call(e,r,n)}catch(t){return t}}function m(t,e,r){G(function(t){var n=!1,a=v(r,e,function(r){n||(n=!0,e!==r?b(t,r):w(t,r))},function(e){n||(n=!0,k(t,e))},\"Settle: \"+(t._label||\" unknown promise\"));!n&&a&&(n=!0,k(t,a))},t)}function y(t,e){e._state===rt?w(t,e._result):e._state===nt?k(t,e._result):M(e,void 0,function(e){return b(t,e)},function(e){return k(t,e)})}function x(t,e,n){e.constructor===t.constructor&&n===u&&e.constructor.resolve===f?y(t,e):n===at?k(t,at.error):void 0===n?w(t,e):r(n)?m(t,e,n):w(t,e)}function b(e,r){e===r?k(e,h()):t(r)?x(e,r,g(r)):w(e,r)}function _(t){t._onerror&&t._onerror(t._result),A(t)}function w(t,e){t._state===et&&(t._result=e,t._state=rt,0!==t._subscribers.length&&G(A,t))}function k(t,e){t._state===et&&(t._state=nt,t._result=e,G(_,t))}function M(t,e,r,n){var a=t._subscribers,o=a.length;t._onerror=null,a[o]=e,a[o+rt]=r,a[o+nt]=n,0===o&&t._state&&G(A,t)}function A(t){var e=t._subscribers,r=t._state;if(0!==e.length){for(var n=void 0,a=void 0,o=t._result,i=0;i<e.length;i+=3)n=e[i],a=e[i+r],n?C(r,n,a,o):a(o);t._subscribers.length=0}}function T(){this.error=null}function L(t,e){try{return t(e)}catch(t){return ot.error=t,ot}}function C(t,e,n,a){var o=r(n),i=void 0,l=void 0,s=void 0,c=void 0;if(o){if(i=L(n,a),i===ot?(c=!0,l=i.error,i=null):s=!0,e===i)return void k(e,p())}else i=a,s=!0;e._state!==et||(o&&s?b(e,i):c?k(e,l):t===rt?w(e,i):t===nt&&k(e,i))}function S(t,e){try{e(function(e){b(t,e)},function(e){k(t,e)})}catch(e){k(t,e)}}function z(){return it++}function O(t){t[tt]=it++,t._state=void 0,t._result=void 0,t._subscribers=[]}function D(t,e){this._instanceConstructor=t,this.promise=new t(d),this.promise[tt]||O(this.promise),H(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?w(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&w(this.promise,this._result))):k(this.promise,P())}function P(){return new Error(\"Array Methods must be provided an Array\")}function E(t){return new D(this,t).promise}function N(t){var e=this;return new e(H(t)?function(r,n){for(var a=t.length,o=0;o<a;o++)e.resolve(t[o]).then(r,n)}:function(t,e){return e(new TypeError(\"You must pass an array to race.\"))})}function I(t){var e=this,r=new e(d);return k(r,t),r}function R(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}function F(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}function j(t){this[tt]=z(),this._result=this._state=void 0,this._subscribers=[],d!==t&&(\"function\"!=typeof t&&R(),this instanceof j?S(this,t):F())}function B(){var t=void 0;if(void 0!==o)t=o;else if(\"undefined\"!=typeof self)t=self;else try{t=Function(\"return this\")()}catch(t){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var e=t.Promise;if(e){var r=null;try{r=Object.prototype.toString.call(e.resolve())}catch(t){}if(\"[object Promise]\"===r&&!e.cast)return}t.Promise=j}var q=void 0;q=Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)};var H=q,V=0,U=void 0,X=void 0,G=function(t,e){J[V]=t,J[V+1]=e,2===(V+=2)&&(X?X(c):K())},Y=\"undefined\"!=typeof window?window:void 0,Z=Y||{},W=Z.MutationObserver||Z.WebKitMutationObserver,$=\"undefined\"==typeof self&&void 0!==a&&\"[object process]\"==={}.toString.call(a),Q=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel,J=new Array(1e3),K=void 0;K=$?function(){return function(){return a.nextTick(c)}}():W?function(){var t=0,e=new W(c),r=document.createTextNode(\"\");return e.observe(r,{characterData:!0}),function(){r.data=t=++t%2}}():Q?function(){var t=new MessageChannel;return t.port1.onmessage=c,function(){return t.port2.postMessage(0)}}():void 0===Y&&\"function\"==typeof e?function(){try{var t=e,r=t(\"vertx\");return U=r.runOnLoop||r.runOnContext,l()}catch(t){return s()}}():s();var tt=Math.random().toString(36).substring(16),et=void 0,rt=1,nt=2,at=new T,ot=new T,it=0;return D.prototype._enumerate=function(){for(var t=this.length,e=this._input,r=0;this._state===et&&r<t;r++)this._eachEntry(e[r],r)},D.prototype._eachEntry=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===f){var a=g(t);if(a===u&&t._state!==et)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(r===j){var o=new r(d);x(o,t,a),this._willSettleAt(o,e)}else this._willSettleAt(new r(function(e){return e(t)}),e)}else this._willSettleAt(n(t),e)},D.prototype._settledAt=function(t,e,r){var n=this.promise;n._state===et&&(this._remaining--,t===nt?k(n,r):this._result[e]=r),0===this._remaining&&w(n,this._result)},D.prototype._willSettleAt=function(t,e){var r=this;M(t,void 0,function(t){return r._settledAt(rt,e,t)},function(t){return r._settledAt(nt,e,t)})},j.all=E,j.race=N,j.resolve=f,j.reject=I,j._setScheduler=n,j._setAsap=i,j._asap=G,j.prototype={constructor:j,then:u,catch:function(t){return this.then(null,t)}},B(),j.polyfill=B,j.Promise=j,j})}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{_process:12}],9:[function(t,e,r){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function a(t){return\"function\"==typeof t}function o(t){return\"number\"==typeof t}function i(t){return\"object\"==typeof t&&null!==t}function l(t){return void 0===t}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(t){if(!o(t)||t<0||isNaN(t))throw TypeError(\"n must be a positive number\");return this._maxListeners=t,this},n.prototype.emit=function(t){var e,r,n,o,s,c;if(this._events||(this._events={}),\"error\"===t&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var u=new Error('Uncaught, unspecified \"error\" event. ('+e+\")\");throw u.context=e,u}if(r=this._events[t],l(r))return!1;if(a(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),r.apply(this,o)}else if(i(r))for(o=Array.prototype.slice.call(arguments,1),c=r.slice(),n=c.length,s=0;s<n;s++)c[s].apply(this,o);return!0},n.prototype.addListener=function(t,e){var r;if(!a(e))throw TypeError(\"listener must be a function\");return this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",t,a(e.listener)?e.listener:e),this._events[t]?i(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,i(this._events[t])&&!this._events[t].warned&&(r=l(this._maxListeners)?n.defaultMaxListeners:this._maxListeners)&&r>0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[t].length),\"function\"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){function r(){this.removeListener(t,r),n||(n=!0,e.apply(this,arguments))}if(!a(e))throw TypeError(\"listener must be a function\");var n=!1;return r.listener=e,this.on(t,r),this},n.prototype.removeListener=function(t,e){var r,n,o,l;if(!a(e))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[t])return this;if(r=this._events[t],o=r.length,n=-1,r===e||a(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit(\"removeListener\",t,e);else if(i(r)){for(l=o;l-- >0;)if(r[l]===e||r[l].listener&&r[l].listener===e){n=l;break}if(n<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(n,1),this._events.removeListener&&this.emit(\"removeListener\",t,e)}return this},n.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)\"removeListener\"!==e&&this.removeAllListeners(e);return this.removeAllListeners(\"removeListener\"),this._events={},this}if(r=this._events[t],a(r))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},n.prototype.listeners=function(t){return this._events&&this._events[t]?a(this._events[t])?[this._events[t]]:this._events[t].slice():[]},n.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(a(e))return 1;if(e)return e.length}return 0},n.listenerCount=function(t,e){return t.listenerCount(e)}},{}],10:[function(t,e,r){\"use strict\";function n(t){for(var e,r=t.length,n=0;n<r;n++)if(((e=t.charCodeAt(n))<9||e>13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}e.exports=function(t){var e=typeof t;if(\"string\"===e){var r=t;if(0===(t=+t)&&n(r))return!1}else if(\"number\"!==e)return!1;return t-t<1}},{}],11:[function(t,e,r){function n(t,e){var r=e[0],n=e[1],a=e[2],o=e[3],i=r+r,l=n+n,s=a+a,c=r*i,u=n*i,f=n*l,d=a*i,h=a*l,p=a*s,g=o*i,v=o*l,m=o*s;return t[0]=1-f-p,t[1]=u+m,t[2]=d-v,t[3]=0,t[4]=u-m,t[5]=1-c-p,t[6]=h+g,t[7]=0,t[8]=d+v,t[9]=h-g,t[10]=1-c-f,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}e.exports=n},{}],12:[function(t,e,r){function n(){throw new Error(\"setTimeout has not been defined\")}function a(){throw new Error(\"clearTimeout has not been defined\")}function o(t){if(f===setTimeout)return setTimeout(t,0);if((f===n||!f)&&setTimeout)return f=setTimeout,setTimeout(t,0);try{return f(t,0)}catch(e){try{return f.call(null,t,0)}catch(e){return f.call(this,t,0)}}}function i(t){if(d===clearTimeout)return clearTimeout(t);if((d===a||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(t);try{return d(t)}catch(e){try{return d.call(null,t)}catch(e){return d.call(this,t)}}}function l(){v&&p&&(v=!1,p.length?g=p.concat(g):m=-1,g.length&&s())}function s(){if(!v){var t=o(l);v=!0;for(var e=g.length;e;){for(p=g,g=[];++m<e;)p&&p[m].run();m=-1,e=g.length}p=null,v=!1,i(t)}}function c(t,e){this.fun=t,this.array=e}function u(){}var f,d,h=e.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:n}catch(t){f=n}try{d=\"function\"==typeof clearTimeout?clearTimeout:a}catch(t){d=a}}();var p,g=[],v=!1,m=-1;h.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];g.push(new c(t,e)),1!==g.length||v||o(s)},c.prototype.run=function(){this.fun.apply(null,this.array)},h.title=\"browser\",h.browser=!0,h.env={},h.argv=[],h.version=\"\",h.versions={},h.on=u,h.addListener=u,h.once=u,h.off=u,h.removeListener=u,h.removeAllListeners=u,h.emit=u,h.binding=function(t){throw new Error(\"process.binding is not supported\")},h.cwd=function(){return\"/\"},h.chdir=function(t){throw new Error(\"process.chdir is not supported\")},h.umask=function(){return 0}},{}],13:[function(e,r,n){!function(e){function n(t,e){if(t=t||\"\",e=e||{},t instanceof n)return t;if(!(this instanceof n))return new n(t,e);var r=a(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=H(100*this._a)/100,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=H(this._r)),this._g<1&&(this._g=H(this._g)),this._b<1&&(this._b=H(this._b)),this._ok=r.ok,this._tc_id=q++}function a(t){var e={r:0,g:0,b:0},r=1,n=null,a=null,i=null,s=!1,u=!1;return\"string\"==typeof t&&(t=R(t)),\"object\"==typeof t&&(I(t.r)&&I(t.g)&&I(t.b)?(e=o(t.r,t.g,t.b),s=!0,u=\"%\"===String(t.r).substr(-1)?\"prgb\":\"rgb\"):I(t.h)&&I(t.s)&&I(t.v)?(n=P(t.s),a=P(t.v),e=c(t.h,n,a),s=!0,u=\"hsv\"):I(t.h)&&I(t.s)&&I(t.l)&&(n=P(t.s),i=P(t.l),e=l(t.h,n,i),s=!0,u=\"hsl\"),t.hasOwnProperty(\"a\")&&(r=t.a)),r=T(r),{ok:s,format:t.format||u,r:V(255,U(e.r,0)),g:V(255,U(e.g,0)),b:V(255,U(e.b,0)),a:r}}function o(t,e,r){return{r:255*L(t,255),g:255*L(e,255),b:255*L(r,255)}}function i(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,a,o=U(t,e,r),i=V(t,e,r),l=(o+i)/2;if(o==i)n=a=0;else{var s=o-i;switch(a=l>.5?s/(2-o-i):s/(o+i),o){case t:n=(e-r)/s+(e<r?6:0);break;case e:n=(r-t)/s+2;break;case r:n=(t-e)/s+4}n/=6}return{h:n,s:a,l:l}}function l(t,e,r){function n(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}var a,o,i;if(t=L(t,360),e=L(e,100),r=L(r,100),0===e)a=o=i=r;else{var l=r<.5?r*(1+e):r+e-r*e,s=2*r-l;a=n(s,l,t+1/3),o=n(s,l,t),i=n(s,l,t-1/3)}return{r:255*a,g:255*o,b:255*i}}function s(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,a,o=U(t,e,r),i=V(t,e,r),l=o,s=o-i;if(a=0===o?0:s/o,o==i)n=0;else{switch(o){case t:n=(e-r)/s+(e<r?6:0);break;case e:n=(r-t)/s+2;break;case r:n=(t-e)/s+4}n/=6}return{h:n,s:a,v:l}}function c(t,r,n){t=6*L(t,360),r=L(r,100),n=L(n,100);var a=e.floor(t),o=t-a,i=n*(1-r),l=n*(1-o*r),s=n*(1-(1-o)*r),c=a%6;return{r:255*[n,l,i,i,s,n][c],g:255*[s,n,n,l,i,i][c],b:255*[i,i,s,n,n,l][c]}}function u(t,e,r,n){var a=[D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16))];return n&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0):a.join(\"\")}function f(t,e,r,n,a){var o=[D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16)),D(E(n))];return a&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1)?o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0):o.join(\"\")}function d(t,e,r,n){return[D(E(n)),D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16))].join(\"\")}function h(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.s-=e/100,r.s=C(r.s),n(r)}function p(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.s+=e/100,r.s=C(r.s),n(r)}function g(t){return n(t).desaturate(100)}function v(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.l+=e/100,r.l=C(r.l),n(r)}function m(t,e){e=0===e?0:e||10;var r=n(t).toRgb();return r.r=U(0,V(255,r.r-H(-e/100*255))),r.g=U(0,V(255,r.g-H(-e/100*255))),r.b=U(0,V(255,r.b-H(-e/100*255))),n(r)}function y(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.l-=e/100,r.l=C(r.l),n(r)}function x(t,e){var r=n(t).toHsl(),a=(r.h+e)%360;return r.h=a<0?360+a:a,n(r)}function b(t){var e=n(t).toHsl();return e.h=(e.h+180)%360,n(e)}function _(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+120)%360,s:e.s,l:e.l}),n({h:(r+240)%360,s:e.s,l:e.l})]}function w(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+90)%360,s:e.s,l:e.l}),n({h:(r+180)%360,s:e.s,l:e.l}),n({h:(r+270)%360,s:e.s,l:e.l})]}function k(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+72)%360,s:e.s,l:e.l}),n({h:(r+216)%360,s:e.s,l:e.l})]}function M(t,e,r){e=e||6,r=r||30;var a=n(t).toHsl(),o=360/r,i=[n(t)];for(a.h=(a.h-(o*e>>1)+720)%360;--e;)a.h=(a.h+o)%360,i.push(n(a));return i}function A(t,e){e=e||6;for(var r=n(t).toHsv(),a=r.h,o=r.s,i=r.v,l=[],s=1/e;e--;)l.push(n({h:a,s:o,v:i})),i=(i+s)%1;return l}function T(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function L(t,r){z(t)&&(t=\"100%\");var n=O(t);return t=V(r,U(0,parseFloat(t))),n&&(t=parseInt(t*r,10)/100),e.abs(t-r)<1e-6?1:t%r/parseFloat(r)}function C(t){return V(1,U(0,t))}function S(t){return parseInt(t,16)}function z(t){return\"string\"==typeof t&&t.indexOf(\".\")!=-1&&1===parseFloat(t)}function O(t){return\"string\"==typeof t&&t.indexOf(\"%\")!=-1}function D(t){return 1==t.length?\"0\"+t:\"\"+t}function P(t){return t<=1&&(t=100*t+\"%\"),t}function E(t){return e.round(255*parseFloat(t)).toString(16)}function N(t){return S(t)/255}function I(t){return!!Z.CSS_UNIT.exec(t)}function R(t){t=t.replace(j,\"\").replace(B,\"\").toLowerCase();var e=!1;if(G[t])t=G[t],e=!0;else if(\"transparent\"==t)return{r:0,g:0,b:0,a:0,format:\"name\"};var r;return(r=Z.rgb.exec(t))?{r:r[1],g:r[2],b:r[3]}:(r=Z.rgba.exec(t))?{r:r[1],g:r[2],b:r[3],a:r[4]}:(r=Z.hsl.exec(t))?{h:r[1],s:r[2],l:r[3]}:(r=Z.hsla.exec(t))?{h:r[1],s:r[2],l:r[3],a:r[4]}:(r=Z.hsv.exec(t))?{h:r[1],s:r[2],v:r[3]}:(r=Z.hsva.exec(t))?{h:r[1],s:r[2],v:r[3],a:r[4]}:(r=Z.hex8.exec(t))?{r:S(r[1]),g:S(r[2]),b:S(r[3]),a:N(r[4]),format:e?\"name\":\"hex8\"}:(r=Z.hex6.exec(t))?{r:S(r[1]),g:S(r[2]),b:S(r[3]),format:e?\"name\":\"hex\"}:(r=Z.hex4.exec(t))?{r:S(r[1]+\"\"+r[1]),g:S(r[2]+\"\"+r[2]),b:S(r[3]+\"\"+r[3]),a:N(r[4]+\"\"+r[4]),format:e?\"name\":\"hex8\"}:!!(r=Z.hex3.exec(t))&&{r:S(r[1]+\"\"+r[1]),g:S(r[2]+\"\"+r[2]),b:S(r[3]+\"\"+r[3]),format:e?\"name\":\"hex\"}}function F(t){var e,r;return t=t||{level:\"AA\",size:\"small\"},e=(t.level||\"AA\").toUpperCase(),r=(t.size||\"small\").toLowerCase(),\"AA\"!==e&&\"AAA\"!==e&&(e=\"AA\"),\"small\"!==r&&\"large\"!==r&&(r=\"small\"),{level:e,size:r}}var j=/^\\s+/,B=/\\s+$/,q=0,H=e.round,V=e.min,U=e.max,X=e.random;n.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,r,n,a,o,i,l=this.toRgb();return t=l.r/255,r=l.g/255,n=l.b/255,a=t<=.03928?t/12.92:e.pow((t+.055)/1.055,2.4),o=r<=.03928?r/12.92:e.pow((r+.055)/1.055,2.4),i=n<=.03928?n/12.92:e.pow((n+.055)/1.055,2.4),.2126*a+.7152*o+.0722*i},setAlpha:function(t){return this._a=T(t),this._roundA=H(100*this._a)/100,this},toHsv:function(){var t=s(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=s(this._r,this._g,this._b),e=H(360*t.h),r=H(100*t.s),n=H(100*t.v);return 1==this._a?\"hsv(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsva(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHsl:function(){var t=i(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=i(this._r,this._g,this._b),e=H(360*t.h),r=H(100*t.s),n=H(100*t.l);return 1==this._a?\"hsl(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsla(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHex:function(t){return u(this._r,this._g,this._b,t)},toHexString:function(t){return\"#\"+this.toHex(t)},toHex8:function(t){return f(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return\"#\"+this.toHex8(t)},toRgb:function(){return{r:H(this._r),g:H(this._g),b:H(this._b),a:this._a}},toRgbString:function(){return 1==this._a?\"rgb(\"+H(this._r)+\", \"+H(this._g)+\", \"+H(this._b)+\")\":\"rgba(\"+H(this._r)+\", \"+H(this._g)+\", \"+H(this._b)+\", \"+this._roundA+\")\"},toPercentageRgb:function(){return{r:H(100*L(this._r,255))+\"%\",g:H(100*L(this._g,255))+\"%\",b:H(100*L(this._b,255))+\"%\",a:this._a}},toPercentageRgbString:function(){return 1==this._a?\"rgb(\"+H(100*L(this._r,255))+\"%, \"+H(100*L(this._g,255))+\"%, \"+H(100*L(this._b,255))+\"%)\":\"rgba(\"+H(100*L(this._r,255))+\"%, \"+H(100*L(this._g,255))+\"%, \"+H(100*L(this._b,255))+\"%, \"+this._roundA+\")\"},toName:function(){return 0===this._a?\"transparent\":!(this._a<1)&&(Y[u(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e=\"#\"+d(this._r,this._g,this._b,this._a),r=e,a=this._gradientType?\"GradientType = 1, \":\"\";if(t){var o=n(t);r=\"#\"+d(o._r,o._g,o._b,o._a)}return\"progid:DXImageTransform.Microsoft.gradient(\"+a+\"startColorstr=\"+e+\",endColorstr=\"+r+\")\"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||\"hex\"!==t&&\"hex6\"!==t&&\"hex3\"!==t&&\"hex4\"!==t&&\"hex8\"!==t&&\"name\"!==t?(\"rgb\"===t&&(r=this.toRgbString()),\"prgb\"===t&&(r=this.toPercentageRgbString()),\"hex\"!==t&&\"hex6\"!==t||(r=this.toHexString()),\"hex3\"===t&&(r=this.toHexString(!0)),\"hex4\"===t&&(r=this.toHex8String(!0)),\"hex8\"===t&&(r=this.toHex8String()),\"name\"===t&&(r=this.toName()),\"hsl\"===t&&(r=this.toHslString()),\"hsv\"===t&&(r=this.toHsvString()),r||this.toHexString()):\"name\"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return n(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(v,arguments)},brighten:function(){return this._applyModification(m,arguments)},darken:function(){return this._applyModification(y,arguments)},desaturate:function(){return this._applyModification(h,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(g,arguments)},spin:function(){return this._applyModification(x,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(M,arguments)},complement:function(){return this._applyCombination(b,arguments)},monochromatic:function(){return this._applyCombination(A,arguments)},splitcomplement:function(){return this._applyCombination(k,arguments)},triad:function(){return this._applyCombination(_,arguments)},tetrad:function(){return this._applyCombination(w,arguments)}},n.fromRatio=function(t,e){if(\"object\"==typeof t){var r={};for(var a in t)t.hasOwnProperty(a)&&(r[a]=\"a\"===a?t[a]:P(t[a]));t=r}return n(t,e)},n.equals=function(t,e){return!(!t||!e)&&n(t).toRgbString()==n(e).toRgbString()},n.random=function(){return n.fromRatio({r:X(),g:X(),b:X()})},n.mix=function(t,e,r){r=0===r?0:r||50;var a=n(t).toRgb(),o=n(e).toRgb(),i=r/100;return n({r:(o.r-a.r)*i+a.r,g:(o.g-a.g)*i+a.g,b:(o.b-a.b)*i+a.b,a:(o.a-a.a)*i+a.a})},n.readability=function(t,r){var a=n(t),o=n(r);return(e.max(a.getLuminance(),o.getLuminance())+.05)/(e.min(a.getLuminance(),o.getLuminance())+.05)},n.isReadable=function(t,e,r){var a,o,i=n.readability(t,e);switch(o=!1,a=F(r),a.level+a.size){case\"AAsmall\":case\"AAAlarge\":o=i>=4.5;break;case\"AAlarge\":o=i>=3;break;case\"AAAsmall\":o=i>=7}return o},n.mostReadable=function(t,e,r){var a,o,i,l,s=null,c=0;r=r||{},o=r.includeFallbackColors,i=r.level,l=r.size;for(var u=0;u<e.length;u++)(a=n.readability(t,e[u]))>c&&(c=a,s=n(e[u]));return n.isReadable(t,s,{level:i,size:l})||!o?s:(r.includeFallbackColors=!1,n.mostReadable(t,[\"#fff\",\"#000\"],r))};var G=n.names={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"0ff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000\",blanchedalmond:\"ffebcd\",blue:\"00f\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",burntsienna:\"ea7e5d\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"0ff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkgrey:\"a9a9a9\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkslategrey:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dimgrey:\"696969\",dodgerblue:\"1e90ff\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"f0f\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",grey:\"808080\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgray:\"d3d3d3\",lightgreen:\"90ee90\",lightgrey:\"d3d3d3\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslategray:\"789\",lightslategrey:\"789\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"0f0\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"f0f\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370db\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"db7093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"f00\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",slategrey:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",wheat:\"f5deb3\",white:\"fff\",whitesmoke:\"f5f5f5\",yellow:\"ff0\",yellowgreen:\"9acd32\"},Y=n.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(G),Z=function(){var t=\"(?:[-\\\\+]?\\\\d*\\\\.\\\\d+%?)|(?:[-\\\\+]?\\\\d+%?)\",e=\"[\\\\s|\\\\(]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")\\\\s*\\\\)?\",r=\"[\\\\s|\\\\(]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")\\\\s*\\\\)?\";return{CSS_UNIT:new RegExp(t),rgb:new RegExp(\"rgb\"+e),rgba:new RegExp(\"rgba\"+r),hsl:new RegExp(\"hsl\"+e),hsla:new RegExp(\"hsla\"+r),hsv:new RegExp(\"hsv\"+e),hsva:new RegExp(\"hsva\"+r),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();void 0!==r&&r.exports?r.exports=n:\"function\"==typeof t&&t.amd?t(function(){return n}):window.tinycolor=n}(Math)},{}],14:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../color\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./attributes\");e.exports=function(t,e,r,l,s){function c(r,a){return n.coerce(t,e,i,r,a)}l=l||{},s=s||{};var u=c(\"visible\",!s.itemIsNotPlainObject),f=c(\"clicktoshow\");if(!u&&!f)return e;c(\"opacity\");var d=c(\"bgcolor\"),h=c(\"bordercolor\"),p=a.opacity(h);c(\"borderpad\");var g=c(\"borderwidth\"),v=c(\"showarrow\");c(\"text\",v?\" \":\"new text\"),c(\"textangle\"),n.coerceFont(c,\"font\",r.font),c(\"width\"),c(\"align\"),c(\"height\")&&c(\"valign\");for(var m=[\"x\",\"y\"],y=[-10,-30],x={_fullLayout:r},b=0;b<2;b++){var _=m[b],w=o.coerceRef(t,e,x,_,\"\",\"paper\");if(o.coercePosition(e,x,c,w,_,.5),v){var k=\"a\"+_,M=o.coerceRef(t,e,x,k,\"pixel\");\"pixel\"!==M&&M!==w&&(M=e[k]=\"pixel\");var A=\"pixel\"===M?y[b]:.4;o.coercePosition(e,x,c,M,k,A)}c(_+\"anchor\"),c(_+\"shift\")}if(n.noneOrAll(t,e,[\"x\",\"y\"]),\n",
|
|
"v&&(c(\"arrowcolor\",p?e.bordercolor:a.defaultLine),c(\"arrowhead\"),c(\"arrowsize\"),c(\"arrowwidth\",2*(p&&g||1)),c(\"standoff\"),n.noneOrAll(t,e,[\"ax\",\"ay\"])),f){var T=c(\"xclick\"),L=c(\"yclick\");e._xclick=void 0===T?e.x:T,e._yclick=void 0===L?e.y:L}var C=c(\"hovertext\"),S=r.hoverlabel||{};if(C){var z=c(\"hoverlabel.bgcolor\",S.bgcolor||(a.opacity(d)?a.rgb(d):a.defaultLine)),O=c(\"hoverlabel.bordercolor\",S.bordercolor||a.contrast(z));n.coerceFont(c,\"hoverlabel.font\",{family:S.font.family,size:S.font.size,color:S.font.color||O})}return c(\"captureevents\",!!C),e}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"../color\":25,\"./attributes\":16}],15:[function(t,e,r){\"use strict\";e.exports=[{path:\"\",backoff:0},{path:\"M-2.4,-3V3L0.6,0Z\",backoff:.6},{path:\"M-3.7,-2.5V2.5L1.3,0Z\",backoff:1.3},{path:\"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z\",backoff:1.55},{path:\"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z\",backoff:1.6},{path:\"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z\",backoff:2},{path:\"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z\",backoff:0},{path:\"M2,2V-2H-2V2Z\",backoff:0}]},{}],16:[function(t,e,r){\"use strict\";var n=t(\"./arrow_paths\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../plots/cartesian/constants\"),i=t(\"../../lib/extend\").extendFlat;e.exports={_isLinkedToArray:\"annotation\",visible:{valType:\"boolean\",dflt:!0},text:{valType:\"string\"},textangle:{valType:\"angle\",dflt:0},font:i({},a,{}),width:{valType:\"number\",min:1,dflt:null},height:{valType:\"number\",min:1,dflt:null},opacity:{valType:\"number\",min:0,max:1,dflt:1},align:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"center\"},valign:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\"},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},bordercolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},borderpad:{valType:\"number\",min:0,dflt:1},borderwidth:{valType:\"number\",min:0,dflt:1},showarrow:{valType:\"boolean\",dflt:!0},arrowcolor:{valType:\"color\"},arrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1},arrowsize:{valType:\"number\",min:.3,dflt:1},arrowwidth:{valType:\"number\",min:.1},standoff:{valType:\"number\",min:0,dflt:0},ax:{valType:\"any\"},ay:{valType:\"any\"},axref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",o.idRegex.x.toString()]},ayref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",o.idRegex.y.toString()]},xref:{valType:\"enumerated\",values:[\"paper\",o.idRegex.x.toString()]},x:{valType:\"any\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\"},xshift:{valType:\"number\",dflt:0},yref:{valType:\"enumerated\",values:[\"paper\",o.idRegex.y.toString()]},y:{valType:\"any\"},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\"},yshift:{valType:\"number\",dflt:0},clicktoshow:{valType:\"enumerated\",values:[!1,\"onoff\",\"onout\"],dflt:!1},xclick:{valType:\"any\"},yclick:{valType:\"any\"},hovertext:{valType:\"string\"},hoverlabel:{bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\"},font:i({},a,{})},captureevents:{valType:\"boolean\"},_deprecated:{ref:{valType:\"string\"}}}},{\"../../lib/extend\":132,\"../../plots/cartesian/constants\":176,\"../../plots/font_attributes\":195,\"./arrow_paths\":15}],17:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;a.filterVisible(e.annotations).forEach(function(e){var r,n,a=o.getFromId(t,e.xref),i=o.getFromId(t,e.yref),l=3*e.arrowsize*e.arrowwidth||0;a&&a.autorange&&(r=l+e.xshift,n=l-e.xshift,e.axref===e.xref?(o.expand(a,[a.r2c(e.x)],{ppadplus:r,ppadminus:n}),o.expand(a,[a.r2c(e.ax)],{ppadplus:e._xpadplus,ppadminus:e._xpadminus})):o.expand(a,[a.r2c(e.x)],{ppadplus:Math.max(e._xpadplus,r),ppadminus:Math.max(e._xpadminus,n)})),i&&i.autorange&&(r=l-e.yshift,n=l+e.yshift,e.ayref===e.yref?(o.expand(i,[i.r2c(e.y)],{ppadplus:r,ppadminus:n}),o.expand(i,[i.r2c(e.ay)],{ppadplus:e._ypadplus,ppadminus:e._ypadminus})):o.expand(i,[i.r2c(e.y)],{ppadplus:Math.max(e._ypadplus,r),ppadminus:Math.max(e._ypadminus,n)}))})}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./draw\").draw;e.exports=function(t){var e=t._fullLayout,r=a.filterVisible(e.annotations);if(r.length&&t._fullData.length){var l={};r.forEach(function(t){l[t.xref]=!0,l[t.yref]=!0});if(o.list(t).filter(function(t){return t.autorange&&l[t._id]}).length)return a.syncOrAsync([i,n],t)}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./draw\":21}],18:[function(t,e,r){\"use strict\";function n(t,e){var r=o(t,e);return r.on.length>0||r.explicitOff.length>0}function a(t,e){var r,n=o(t,e),a=n.on,l=n.off.concat(n.explicitOff),s={};if(a.length||l.length){for(r=0;r<a.length;r++)s[\"annotations[\"+a[r]+\"].visible\"]=!0;for(r=0;r<l.length;r++)s[\"annotations[\"+l[r]+\"].visible\"]=!1;return i.update(t,{},s)}}function o(t,e){var r,n,a,o,i,l,s=t._fullLayout.annotations,c=[],u=[],f=[],d=(e||[]).length;for(r=0;r<s.length;r++)if(a=s[r],o=a.clicktoshow){for(n=0;n<d;n++)if(i=e[n],i.xaxis._id===a.xref&&i.yaxis._id===a.yref&&i.xaxis.d2r(i.x)===a._xclick&&i.yaxis.d2r(i.y)===a._yclick){l=a.visible?\"onout\"===o?u:f:c,l.push(r);break}n===d&&a.visible&&\"onout\"===o&&u.push(r)}return{on:c,off:u,explicitOff:f}}var i=t(\"../../plotly\");e.exports={hasClickToShow:n,onClick:a}},{\"../../plotly\":166}],19:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib/to_log_range\");e.exports=function(t,e,r,o){function i(t){var r=c[t],i=null;i=l?a(r,e.range):Math.pow(10,r),n(i)||(i=null),o(u+t,i)}e=e||{};var l=\"log\"===r&&\"linear\"===e.type,s=\"linear\"===r&&\"log\"===e.type;if(l||s)for(var c,u,f=t._fullLayout.annotations,d=e._id.charAt(0),h=0;h<f.length;h++)c=f[h],u=\"annotations[\"+h+\"].\",c[d+\"ref\"]===e._id&&i(d),c[\"a\"+d+\"ref\"]===e._id&&i(\"a\"+d)}},{\"../../lib/to_log_range\":154,\"fast-isnumeric\":10}],20:[function(t,e,r){\"use strict\";var n=t(\"../../plots/array_container_defaults\"),a=t(\"./annotation_defaults\");e.exports=function(t,e){n(t,e,{name:\"annotations\",handleItemDefaults:a})}},{\"../../plots/array_container_defaults\":168,\"./annotation_defaults\":14}],21:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;e._infolayer.selectAll(\".annotation\").remove();for(var r=0;r<e.annotations.length;r++)e.annotations[r].visible&&a(t,r);return s.previousPromises(t)}function a(t,e){function r(t){return t.call(d.font,N).attr({\"text-anchor\":{left:\"start\",right:\"end\"}[b.align]||\"middle\"}),p.convertToTspans(t,n),t}function n(){function r(t,e){return\"auto\"===e&&(e=t<1/3?\"left\":t>2/3?\"right\":\"center\"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}var n=I.selectAll(\"a\");if(1===n.size()&&n.text()===I.text()){C.insert(\"a\",\":first-child\").attr({\"xlink:xlink:href\":n.attr(\"xlink:href\"),\"xlink:xlink:show\":n.attr(\"xlink:show\")}).style({cursor:\"pointer\"}).node().appendChild(D.node())}I.selectAll(\"tspan.line\").attr({y:0,x:0});var a=C.select(\".annotation-math-group\"),h=!a.empty(),p=d.bBox((h?a:I).node()),x=p.width,z=p.height,N=b.width||x,R=b.height||z,F=Math.round(N+2*O),j=Math.round(R+2*O);b._w=N,b._h=R;var B=!1;if([\"x\",\"y\"].forEach(function(e){var n,a,o,i,l,f=b[e+\"ref\"]||e,d=b[\"a\"+e+\"ref\"],h=u.getFromId(t,f),p=(A+(\"x\"===e?0:-90))*Math.PI/180,g=F*Math.cos(p),v=j*Math.sin(p),m=Math.abs(g)+Math.abs(v),x=b[e+\"anchor\"],_=b[e+\"shift\"]*(\"x\"===e?1:-1),w=M[e];if(h){var k=h.r2fraction(b[e]);if((t._dragging||!h.autorange)&&(k<0||k>1)&&(d===f?((k=h.r2fraction(b[\"a\"+e]))<0||k>1)&&(B=!0):B=!0,B))return;n=h._offset+h.r2p(b[e]),i=.5}else\"x\"===e?(o=b[e],n=y.l+y.w*o):(o=1-b[e],n=y.t+y.h*o),i=b.showarrow?.5:o;if(b.showarrow){w.head=n;var T=b[\"a\"+e];l=g*r(.5,b.xanchor)-v*r(.5,b.yanchor),d===f?(w.tail=h._offset+h.r2p(T),a=l):(w.tail=n+T,a=l+T),w.text=w.tail+l;var L=s[\"x\"===e?\"width\":\"height\"];if(\"paper\"===f&&(w.head=c.constrain(w.head,1,L-1)),\"pixel\"===d){var C=-Math.max(w.tail-3,w.text),S=Math.min(w.tail+3,w.text)-L;C>0?(w.tail+=C,w.text+=C):S>0&&(w.tail-=S,w.text-=S)}w.tail+=_,w.head+=_}else l=m*r(i,x),a=l,w.text=n+l;w.text+=_,l+=_,a+=_,b[\"_\"+e+\"padplus\"]=m/2+a,b[\"_\"+e+\"padminus\"]=m/2-a,b[\"_\"+e+\"size\"]=m,b[\"_\"+e+\"shift\"]=l}),B)return void C.remove();var q=0,H=0;if(\"left\"!==b.align&&(q=(N-x)*(\"center\"===b.align?.5:1)),\"top\"!==b.valign&&(H=(R-z)*(\"middle\"===b.valign?.5:1)),h)a.select(\"svg\").attr({x:O+q-1,y:O+H}).call(d.setClipUrl,P?_:null);else{var V=O+H-p.top,U=O+q-p.left;I.attr({x:U,y:V}).call(d.setClipUrl,P?_:null),I.selectAll(\"tspan.line\").attr({y:V,x:U})}E.select(\"rect\").call(d.setRect,O,O,N,R),D.call(d.setRect,S/2,S/2,F-S,j-S),C.call(d.setTranslate,Math.round(M.x.text-F/2),Math.round(M.y.text-j/2)),L.attr({transform:\"rotate(\"+A+\",\"+M.x.text+\",\"+M.y.text+\")\"});var X=\"annotations[\"+e+\"]\",G=function(r,n){i.select(t).selectAll('.annotation-arrow-g[data-index=\"'+e+'\"]').remove();var a=M.x.head,s=M.y.head,u=M.x.tail+r,h=M.y.tail+n,p=M.x.text+r,g=M.y.text+n,x=c.rotationXYMatrix(A,p,g),_=c.apply2DTransform(x),S=c.apply2DTransform2(x),z=+D.attr(\"width\"),O=+D.attr(\"height\"),P=p-.5*z,E=P+z,N=g-.5*O,I=N+O,R=[[P,N,P,I],[P,I,E,I],[E,I,E,N],[E,N,P,N]].map(S);if(!R.reduce(function(t,e){return t^!!o(a,s,a+1e6,s+1e6,e[0],e[1],e[2],e[3])},!1)){R.forEach(function(t){var e=o(u,h,a,s,t[0],t[1],t[2],t[3]);e&&(u=e.x,h=e.y)});var F=b.arrowwidth,j=b.arrowcolor,B=T.append(\"g\").style({opacity:f.opacity(j)}).classed(\"annotation-arrow-g\",!0).attr(\"data-index\",String(e)),q=B.append(\"path\").attr(\"d\",\"M\"+u+\",\"+h+\"L\"+a+\",\"+s).style(\"stroke-width\",F+\"px\").call(f.stroke,f.rgb(j));if(m(q,b.arrowhead,\"end\",b.arrowsize,b.standoff),t._context.editable&&q.node().parentNode){var H=a,V=s;if(b.standoff){var U=Math.sqrt(Math.pow(a-u,2)+Math.pow(s-h,2));H+=b.standoff*(u-a)/U,V+=b.standoff*(h-s)/U}var G,Y,Z,W=B.append(\"path\").classed(\"annotation\",!0).classed(\"anndrag\",!0).attr({\"data-index\":String(e),d:\"M3,3H-3V-3H3ZM0,0L\"+(u-H)+\",\"+(h-V),transform:\"translate(\"+H+\",\"+V+\")\"}).style(\"stroke-width\",F+6+\"px\").call(f.stroke,\"rgba(0,0,0,0)\").call(f.fill,\"rgba(0,0,0,0)\");v.init({element:W.node(),prepFn:function(){var t=d.getTranslate(C);Y=t.x,Z=t.y,G={},w&&w.autorange&&(G[w._name+\".autorange\"]=!0),k&&k.autorange&&(G[k._name+\".autorange\"]=!0)},moveFn:function(t,e){var r=_(Y,Z),n=r[0]+t,a=r[1]+e;C.call(d.setTranslate,n,a),G[X+\".x\"]=w?w.p2r(w.r2p(b.x)+t):b.x+t/y.w,G[X+\".y\"]=k?k.p2r(k.r2p(b.y)+e):b.y-e/y.h,b.axref===b.xref&&(G[X+\".ax\"]=w.p2r(w.r2p(b.ax)+t)),b.ayref===b.yref&&(G[X+\".ay\"]=k.p2r(k.r2p(b.ay)+e)),B.attr(\"transform\",\"translate(\"+t+\",\"+e+\")\"),L.attr({transform:\"rotate(\"+A+\",\"+n+\",\"+a+\")\"})},doneFn:function(e){if(e){l.relayout(t,G);var r=document.querySelector(\".js-notes-box-panel\");r&&r.redraw(r.selectedObj)}}})}}};if(b.showarrow&&G(0,0),t._context.editable){var Y,Z;v.init({element:C.node(),prepFn:function(){Z=L.attr(\"transform\"),Y={}},moveFn:function(t,e){var r=\"pointer\";if(b.showarrow)b.axref===b.xref?Y[X+\".ax\"]=w.p2r(w.r2p(b.ax)+t):Y[X+\".ax\"]=b.ax+t,b.ayref===b.yref?Y[X+\".ay\"]=k.p2r(k.r2p(b.ay)+e):Y[X+\".ay\"]=b.ay+e,G(t,e);else{if(w)Y[X+\".x\"]=b.x+t/w._m;else{var n=b._xsize/y.w,a=b.x+(b._xshift-b.xshift)/y.w-n/2;Y[X+\".x\"]=v.align(a+t/y.w,n,0,1,b.xanchor)}if(k)Y[X+\".y\"]=b.y+e/k._m;else{var o=b._ysize/y.h,i=b.y-(b._yshift+b.yshift)/y.h-o/2;Y[X+\".y\"]=v.align(i-e/y.h,o,0,1,b.yanchor)}w&&k||(r=v.getCursor(w?.5:Y[X+\".x\"],k?.5:Y[X+\".y\"],b.xanchor,b.yanchor))}L.attr({transform:\"translate(\"+t+\",\"+e+\")\"+Z}),g(C,r)},doneFn:function(e){if(g(C),e){l.relayout(t,Y);var r=document.querySelector(\".js-notes-box-panel\");r&&r.redraw(r.selectedObj)}}})}}var a=t.layout,s=t._fullLayout,y=t._fullLayout._size;s._infolayer.selectAll('.annotation[data-index=\"'+e+'\"]').remove();var x=(a.annotations||[])[e],b=s.annotations[e],_=\"clip\"+s._uid+\"_ann\"+e;if(!x||b.visible===!1)return void i.selectAll(\"#\"+_).remove();var w=u.getFromId(t,b.xref),k=u.getFromId(t,b.yref),M={x:{},y:{}},A=+b.textangle||0,T=s._infolayer.append(\"g\").classed(\"annotation\",!0).attr(\"data-index\",String(e)).style(\"opacity\",b.opacity),L=T.append(\"g\").classed(\"annotation-text-g\",!0).attr(\"data-index\",String(e)),C=L.append(\"g\").style(\"pointer-events\",b.captureevents?\"all\":null).call(g,\"default\").on(\"click\",function(){t._dragging=!1,t.emit(\"plotly_clickannotation\",{index:e,annotation:x,fullAnnotation:b,event:i.event})});b.hovertext&&C.on(\"mouseover\",function(){var e=b.hoverlabel,r=e.font,n=this.getBoundingClientRect(),a=t.getBoundingClientRect();h.loneHover({x0:n.left-a.left,x1:n.right-a.left,y:(n.top+n.bottom)/2-a.top,text:b.hovertext,color:e.bgcolor,borderColor:e.bordercolor,fontFamily:r.family,fontSize:r.size,fontColor:r.color},{container:s._hoverlayer.node(),outerContainer:s._paper.node()})}).on(\"mouseout\",function(){h.loneUnhover(s._hoverlayer.node())});var S=b.borderwidth,z=b.borderpad,O=S+z,D=C.append(\"rect\").attr(\"class\",\"bg\").style(\"stroke-width\",S+\"px\").call(f.stroke,b.bordercolor).call(f.fill,b.bgcolor),P=b.width||b.height,E=s._defs.select(\".clips\").selectAll(\"#\"+_).data(P?[0]:[]);E.enter().append(\"clipPath\").classed(\"annclip\",!0).attr(\"id\",_).append(\"rect\"),E.exit().remove();var N=b.font,I=C.append(\"text\").classed(\"annotation\",!0).attr(\"data-unformatted\",b.text).text(b.text);t._context.editable?I.call(p.makeEditable,C).call(r).on(\"edit\",function(n){b.text=n,this.attr({\"data-unformatted\":b.text}),this.call(r);var a={};a[\"annotations[\"+e+\"].text\"]=b.text,w&&w.autorange&&(a[w._name+\".autorange\"]=!0),k&&k.autorange&&(a[k._name+\".autorange\"]=!0),l.relayout(t,a)}):I.call(r)}function o(t,e,r,n,a,o,i,l){var s=r-t,c=a-t,u=i-a,f=n-e,d=o-e,h=l-o,p=s*h-u*f;if(0===p)return null;var g=(c*h-u*d)/p,v=(c*f-s*d)/p;return v<0||v>1||g<0||g>1?null:{x:t+s*g,y:e+f*g}}var i=t(\"d3\"),l=t(\"../../plotly\"),s=t(\"../../plots/plots\"),c=t(\"../../lib\"),u=t(\"../../plots/cartesian/axes\"),f=t(\"../color\"),d=t(\"../drawing\"),h=t(\"../fx\"),p=t(\"../../lib/svg_text_utils\"),g=t(\"../../lib/setcursor\"),v=t(\"../dragelement\"),m=t(\"./draw_arrow_head\");e.exports={draw:n,drawOne:a}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"../fx\":66,\"./draw_arrow_head\":22,d3:7}],22:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=t(\"../color\"),i=t(\"../drawing\"),l=t(\"./arrow_paths\");e.exports=function(t,e,r,s,c){function u(){t.style(\"stroke-dasharray\",\"0px,100px\")}function f(r,a){h.path&&(e>5&&(a=0),n.select(d.parentElement).append(\"path\").attr({class:t.attr(\"class\"),d:h.path,transform:\"translate(\"+r.x+\",\"+r.y+\")rotate(\"+180*a/Math.PI+\")scale(\"+y+\")\"}).style({fill:x,opacity:b,\"stroke-width\":0}))}a(s)||(s=1);var d=t.node(),h=l[e||0];\"string\"==typeof r&&r||(r=\"end\");var p,g,v,m,y=(i.getPx(t,\"stroke-width\")||1)*s,x=t.style(\"stroke\")||o.defaultLine,b=t.style(\"stroke-opacity\")||1,_=r.indexOf(\"start\")>=0,w=r.indexOf(\"end\")>=0,k=h.backoff*y+c;if(\"line\"===d.nodeName){p={x:+t.attr(\"x1\"),y:+t.attr(\"y1\")},g={x:+t.attr(\"x2\"),y:+t.attr(\"y2\")};var M=p.x-g.x,A=p.y-g.y;if(v=Math.atan2(A,M),m=v+Math.PI,k){if(k*k>M*M+A*A)return void u();var T=k*Math.cos(v),L=k*Math.sin(v);_&&(p.x-=T,p.y-=L,t.attr({x1:p.x,y1:p.y})),w&&(g.x+=T,g.y+=L,t.attr({x2:g.x,y2:g.y}))}}else if(\"path\"===d.nodeName){var C=d.getTotalLength(),S=\"\";if(C<k)return void u();if(_){var z=d.getPointAtLength(0),O=d.getPointAtLength(.1);v=Math.atan2(z.y-O.y,z.x-O.x),p=d.getPointAtLength(Math.min(k,C)),k&&(S=\"0px,\"+k+\"px,\")}if(w){var D=d.getPointAtLength(C),P=d.getPointAtLength(C-.1);if(m=Math.atan2(D.y-P.y,D.x-P.x),g=d.getPointAtLength(Math.max(0,C-k)),k){var E=S?2*k:k;S+=C-E+\"px,\"+C+\"px\"}}else S&&(S+=C+\"px\");S&&t.style(\"stroke-dasharray\",S)}_&&f(p,v),w&&f(g,m)}},{\"../color\":25,\"../drawing\":49,\"./arrow_paths\":15,d3:7,\"fast-isnumeric\":10}],23:[function(t,e,r){\"use strict\";var n=t(\"./draw\"),a=t(\"./click\");e.exports={moduleType:\"component\",name:\"annotations\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:n.draw,drawOne:n.drawOne,hasClickToShow:a.hasClickToShow,onClick:a.onClick,convertCoords:t(\"./convert_coords\")}},{\"./attributes\":16,\"./calc_autorange\":17,\"./click\":18,\"./convert_coords\":19,\"./defaults\":20,\"./draw\":21}],24:[function(t,e,r){\"use strict\";r.defaults=[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\",\"#8c564b\",\"#e377c2\",\"#7f7f7f\",\"#bcbd22\",\"#17becf\"],r.defaultLine=\"#444\",r.lightLine=\"#eee\",r.background=\"#fff\",r.borderLine=\"#BEC8D9\",r.lightFraction=1e3/11},{}],25:[function(t,e,r){\"use strict\";function n(t){if(o(t)||\"string\"!=typeof t)return t;var e=t.trim();if(\"rgb\"!==e.substr(0,3))return t;var r=e.match(/^rgba?\\s*\\(([^()]*)\\)$/);if(!r)return t;var n=r[1].trim().split(/\\s*[\\s,]\\s*/),a=\"a\"===e.charAt(3)&&4===n.length;if(!a&&3!==n.length)return t;for(var i=0;i<n.length;i++){if(!n[i].length)return t;if(n[i]=Number(n[i]),!(n[i]>=0))return t;if(3===i)n[i]>1&&(n[i]=1);else if(n[i]>=1)return t}var l=Math.round(255*n[0])+\", \"+Math.round(255*n[1])+\", \"+Math.round(255*n[2]);return a?\"rgba(\"+l+\", \"+n[3]+\")\":\"rgb(\"+l+\")\"}var a=t(\"tinycolor2\"),o=t(\"fast-isnumeric\"),i=e.exports={},l=t(\"./attributes\");i.defaults=l.defaults;var s=i.defaultLine=l.defaultLine;i.lightLine=l.lightLine;var c=i.background=l.background;i.tinyRGB=function(t){var e=t.toRgb();return\"rgb(\"+Math.round(e.r)+\", \"+Math.round(e.g)+\", \"+Math.round(e.b)+\")\"},i.rgb=function(t){return i.tinyRGB(a(t))},i.opacity=function(t){return t?a(t).getAlpha():0},i.addOpacity=function(t,e){var r=a(t).toRgb();return\"rgba(\"+Math.round(r.r)+\", \"+Math.round(r.g)+\", \"+Math.round(r.b)+\", \"+e+\")\"},i.combine=function(t,e){var r=a(t).toRgb();if(1===r.a)return a(t).toRgbString();var n=a(e||c).toRgb(),o=1===n.a?n:{r:255*(1-n.a)+n.r*n.a,g:255*(1-n.a)+n.g*n.a,b:255*(1-n.a)+n.b*n.a},i={r:o.r*(1-r.a)+r.r*r.a,g:o.g*(1-r.a)+r.g*r.a,b:o.b*(1-r.a)+r.b*r.a};return a(i).toRgbString()},i.contrast=function(t,e,r){var n=a(t);return 1!==n.getAlpha()&&(n=a(i.combine(t,c))),(n.isDark()?e?n.lighten(e):c:r?n.darken(r):s).toString()},i.stroke=function(t,e){var r=a(e);t.style({stroke:i.tinyRGB(r),\"stroke-opacity\":r.getAlpha()})},i.fill=function(t,e){var r=a(e);t.style({fill:i.tinyRGB(r),\"fill-opacity\":r.getAlpha()})},i.clean=function(t){if(t&&\"object\"==typeof t){var e,r,a,o,l=Object.keys(t);for(e=0;e<l.length;e++)if(a=l[e],o=t[a],\"color\"===a.substr(a.length-5))if(Array.isArray(o))for(r=0;r<o.length;r++)o[r]=n(o[r]);else t[a]=n(o);else if(\"colorscale\"===a.substr(a.length-10)&&Array.isArray(o))for(r=0;r<o.length;r++)Array.isArray(o[r])&&(o[r][1]=n(o[r][1]));else if(Array.isArray(o)){var s=o[0];if(!Array.isArray(s)&&s&&\"object\"==typeof s)for(r=0;r<o.length;r++)i.clean(o[r])}else o&&\"object\"==typeof o&&i.clean(o)}}},{\"./attributes\":24,\"fast-isnumeric\":10,tinycolor2:13}],26:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/layout_attributes\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../lib/extend\").extendFlat;e.exports={thicknessmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"pixels\"},thickness:{valType:\"number\",min:0,dflt:30},lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",dflt:1.02,min:-2,max:3},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},xpad:{valType:\"number\",min:0,dflt:10},y:{valType:\"number\",dflt:.5,min:-2,max:3},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\"},ypad:{valType:\"number\",min:0,dflt:10},outlinecolor:n.linecolor,outlinewidth:n.linewidth,bordercolor:n.linecolor,borderwidth:{valType:\"number\",min:0,dflt:0},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},tickmode:n.tickmode,nticks:n.nticks,tick0:n.tick0,dtick:n.dtick,tickvals:n.tickvals,ticktext:n.ticktext,ticks:o({},n.ticks,{dflt:\"\"}),ticklen:n.ticklen,tickwidth:n.tickwidth,tickcolor:n.tickcolor,showticklabels:n.showticklabels,tickfont:n.tickfont,tickangle:n.tickangle,tickformat:n.tickformat,tickprefix:n.tickprefix,showtickprefix:n.showtickprefix,ticksuffix:n.ticksuffix,showticksuffix:n.showticksuffix,separatethousands:n.separatethousands,exponentformat:n.exponentformat,showexponent:n.showexponent,title:{valType:\"string\",dflt:\"Click to enter colorscale title\"},titlefont:o({},a,{}),titleside:{valType:\"enumerated\",values:[\"right\",\"top\",\"bottom\"],dflt:\"top\"}}},{\"../../lib/extend\":132,\"../../plots/cartesian/layout_attributes\":182,\"../../plots/font_attributes\":195}],27:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../plots/cartesian/tick_value_defaults\"),o=t(\"../../plots/cartesian/tick_mark_defaults\"),i=t(\"../../plots/cartesian/tick_label_defaults\"),l=t(\"./attributes\");e.exports=function(t,e,r){function s(t,e){return n.coerce(u,c,l,t,e)}var c=e.colorbar={},u=t.colorbar||{};s(\"thickness\",\"fraction\"===s(\"thicknessmode\")?30/(r.width-r.margin.l-r.margin.r):30),s(\"len\",\"fraction\"===s(\"lenmode\")?1:r.height-r.margin.t-r.margin.b),s(\"x\"),s(\"xanchor\"),s(\"xpad\"),s(\"y\"),s(\"yanchor\"),s(\"ypad\"),n.noneOrAll(u,c,[\"x\",\"y\"]),s(\"outlinecolor\"),s(\"outlinewidth\"),s(\"bordercolor\"),s(\"borderwidth\"),s(\"bgcolor\"),a(u,c,s,\"linear\"),i(u,c,s,\"linear\",{outerTicks:!1,font:r.font,noHover:!0}),o(u,c,s,\"linear\",{outerTicks:!1,font:r.font,noHover:!0}),s(\"title\"),n.coerceFont(s,\"titlefont\",r.font),s(\"titleside\")}},{\"../../lib\":136,\"../../plots/cartesian/tick_label_defaults\":189,\"../../plots/cartesian/tick_mark_defaults\":190,\"../../plots/cartesian/tick_value_defaults\":191,\"./attributes\":26}],28:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"tinycolor2\"),o=t(\"../../plotly\"),i=t(\"../../plots/plots\"),l=t(\"../../registry\"),s=t(\"../../plots/cartesian/axes\"),c=t(\"../dragelement\"),u=t(\"../../lib\"),f=t(\"../../lib/extend\").extendFlat,d=t(\"../../lib/setcursor\"),h=t(\"../drawing\"),p=t(\"../color\"),g=t(\"../titles\"),v=t(\"../../plots/cartesian/axis_defaults\"),m=t(\"../../plots/cartesian/position_defaults\"),y=t(\"../../plots/cartesian/layout_attributes\"),x=t(\"./attributes\");e.exports=function(t,e){function r(){function x(t,e){return u.coerce(J,K,y,t,e)}function w(){if([\"top\",\"bottom\"].indexOf(_.titleside)!==-1){var e=ot.select(\".cbtitle\"),r=e.select(\"text\"),o=[-_.outlinewidth/2,_.outlinewidth/2],i=e.select(\".h\"+K._id+\"title-math-group\").node(),l=15.6;if(r.node()&&(l=1.3*parseInt(r.style(\"font-size\"),10)),i?(lt=h.bBox(i).height)>l&&(o[1]-=(lt-l)/2):r.node()&&!r.classed(\"js-placeholder\")&&(lt=h.bBox(e.node()).height),lt){if(lt+=5,\"top\"===_.titleside)K.domain[1]-=lt/T.h,o[1]*=-1;else{K.domain[0]+=lt/T.h;var c=Math.max(1,r.selectAll(\"tspan.line\").size());o[1]+=(1-c)*l}e.attr(\"transform\",\"translate(\"+o+\")\"),K.setScale()}}ot.selectAll(\".cbfills,.cblines,.cbaxis\").attr(\"transform\",\"translate(0,\"+Math.round(T.h*(1-K.domain[1]))+\")\");var f=ot.select(\".cbfills\").selectAll(\"rect.cbfill\").data(z);f.enter().append(\"rect\").classed(\"cbfill\",!0).style(\"stroke\",\"none\"),f.exit().remove(),f.each(function(t,e){var r=[0===e?C[0]:(z[e]+z[e-1])/2,e===z.length-1?C[1]:(z[e]+z[e+1])/2].map(K.c2p).map(Math.round);e!==z.length-1&&(r[1]+=r[1]>r[0]?1:-1);var o=D(t).replace(\"e-\",\"\"),i=a(o).toHexString();n.select(this).attr({x:Y,width:Math.max(B,2),y:n.min(r),height:Math.max(n.max(r)-n.min(r),2),fill:i})});var d=ot.select(\".cblines\").selectAll(\"path.cbline\").data(_.line.color&&_.line.width?S:[]);return d.enter().append(\"path\").classed(\"cbline\",!0),d.exit().remove(),d.each(function(t){n.select(this).attr(\"d\",\"M\"+Y+\",\"+(Math.round(K.c2p(t))+_.line.width/2%1)+\"h\"+B).call(h.lineGroupStyle,_.line.width,O(t),_.line.dash)}),K._axislayer.selectAll(\"g.\"+K._id+\"tick,path\").remove(),K._pos=Y+B+(_.outlinewidth||0)/2-(\"outside\"===_.ticks?1:0),K.side=\"right\",u.syncOrAsync([function(){return s.doTicks(t,K,!0)},function(){if([\"top\",\"bottom\"].indexOf(_.titleside)===-1){var e=K.titlefont.size,r=K._offset+K._length/2,a=T.l+(K.position||0)*T.w+(\"right\"===K.side?10+e*(K.showticklabels?1:.5):-10-e*(K.showticklabels?.5:0));k(\"h\"+K._id+\"title\",{avoid:{selection:n.select(t).selectAll(\"g.\"+K._id+\"tick\"),side:_.titleside,offsetLeft:T.l,offsetTop:T.t,maxShift:A.width},attributes:{x:a,y:r,\"text-anchor\":\"middle\"},transform:{rotate:\"-90\",offset:0}})}}])}function k(e,r){var n,a=b();n=l.traceIs(a,\"markerColorscale\")?\"marker.colorbar.title\":\"colorbar.title\";var o={propContainer:K,propName:n,traceIndex:a.index,dfltName:\"colorscale\",containerGroup:ot.select(\".cbtitle\")},i=\"h\"===e.charAt(0)?e.substr(1):\"h\"+e;ot.selectAll(\".\"+i+\",.\"+i+\"-math-group\").remove(),g.draw(t,e,f(o,r||{}))}function M(){var r=B+_.outlinewidth/2+h.bBox(K._axislayer.node()).width;if(R=it.select(\"text\"),R.node()&&!R.classed(\"js-placeholder\")){var n,a=it.select(\".h\"+K._id+\"title-math-group\").node();n=a&&[\"top\",\"bottom\"].indexOf(_.titleside)!==-1?h.bBox(a).width:h.bBox(it.node()).right-Y-T.l,r=Math.max(r,n)}var o=2*_.xpad+r+_.borderwidth+_.outlinewidth/2,l=$-Q;ot.select(\".cbbg\").attr({x:Y-_.xpad-(_.borderwidth+_.outlinewidth)/2,y:Q-X,width:Math.max(o,2),height:Math.max(l+2*X,2)}).call(p.fill,_.bgcolor).call(p.stroke,_.bordercolor).style({\"stroke-width\":_.borderwidth}),ot.selectAll(\".cboutline\").attr({x:Y,y:Q+_.ypad+(\"top\"===_.titleside?lt:0),width:Math.max(B,2),height:Math.max(l-2*_.ypad-lt,2)}).call(p.stroke,_.outlinecolor).style({fill:\"None\",\"stroke-width\":_.outlinewidth});var s=({center:.5,right:1}[_.xanchor]||0)*o;ot.attr(\"transform\",\"translate(\"+(T.l-s)+\",\"+T.t+\")\"),i.autoMargin(t,e,{x:_.x,y:_.y,l:o*({right:1,center:.5}[_.xanchor]||0),r:o*({left:1,center:.5}[_.xanchor]||0),t:l*({bottom:1,middle:.5}[_.yanchor]||0),b:l*({top:1,middle:.5}[_.yanchor]||0)})}var A=t._fullLayout,T=A._size;if(\"function\"!=typeof _.fillcolor&&\"function\"!=typeof _.line.color)return void A._infolayer.selectAll(\"g.\"+e).remove();var L,C=n.extent((\"function\"==typeof _.fillcolor?_.fillcolor:_.line.color).domain()),S=[],z=[],O=\"function\"==typeof _.line.color?_.line.color:function(){return _.line.color},D=\"function\"==typeof _.fillcolor?_.fillcolor:function(){return _.fillcolor},P=_.levels.end+_.levels.size/100,E=_.levels.size,N=1.001*C[0]-.001*C[1],I=1.001*C[1]-.001*C[0];for(L=_.levels.start;(L-P)*E<0;L+=E)L>N&&L<I&&S.push(L);if(\"function\"==typeof _.fillcolor)if(_.filllevels)for(P=_.filllevels.end+_.filllevels.size/100,E=_.filllevels.size,L=_.filllevels.start;(L-P)*E<0;L+=E)L>C[0]&&L<C[1]&&z.push(L);else z=S.map(function(t){return t-_.levels.size/2}),z.push(z[z.length-1]+_.levels.size);else _.fillcolor&&\"string\"==typeof _.fillcolor&&(z=[0]);_.levels.size<0&&(S.reverse(),z.reverse());var R,F=A.height-A.margin.t-A.margin.b,j=A.width-A.margin.l-A.margin.r,B=Math.round(_.thickness*(\"fraction\"===_.thicknessmode?j:1)),q=B/T.w,H=Math.round(_.len*(\"fraction\"===_.lenmode?F:1)),V=H/T.h,U=_.xpad/T.w,X=(_.borderwidth+_.outlinewidth)/2,G=_.ypad/T.h,Y=Math.round(_.x*T.w+_.xpad),Z=_.x-q*({middle:.5,right:1}[_.xanchor]||0),W=_.y+V*(({top:-.5,bottom:.5}[_.yanchor]||0)-.5),$=Math.round(T.h*(1-W)),Q=$-H,J={type:\"linear\",range:C,tickmode:_.tickmode,nticks:_.nticks,tick0:_.tick0,dtick:_.dtick,tickvals:_.tickvals,ticktext:_.ticktext,ticks:_.ticks,ticklen:_.ticklen,tickwidth:_.tickwidth,tickcolor:_.tickcolor,showticklabels:_.showticklabels,tickfont:_.tickfont,tickangle:_.tickangle,tickformat:_.tickformat,exponentformat:_.exponentformat,separatethousands:_.separatethousands,showexponent:_.showexponent,showtickprefix:_.showtickprefix,tickprefix:_.tickprefix,showticksuffix:_.showticksuffix,ticksuffix:_.ticksuffix,title:_.title,titlefont:_.titlefont,anchor:\"free\",position:1},K={type:\"linear\",_id:\"y\"+e},tt={letter:\"y\",font:A.font,noHover:!0,calendar:A.calendar};if(v(J,K,x,tt,A),m(J,K,x,tt),K.position=_.x+U+q,r.axis=K,[\"top\",\"bottom\"].indexOf(_.titleside)!==-1&&(K.titleside=_.titleside,K.titlex=_.x+U,K.titley=W+(\"top\"===_.titleside?V-G:G)),_.line.color&&\"auto\"===_.tickmode){K.tickmode=\"linear\",K.tick0=_.levels.start;var et=_.levels.size,rt=u.constrain(($-Q)/50,4,15)+1,nt=(C[1]-C[0])/((_.nticks||rt)*et);if(nt>1){var at=Math.pow(10,Math.floor(Math.log(nt)/Math.LN10));et*=at*u.roundUp(nt/at,[2,5,10]),(Math.abs(_.levels.start)/_.levels.size+1e-6)%1<2e-6&&(K.tick0=0)}K.dtick=et}K.domain=[W+G,W+V-G],K.setScale();var ot=A._infolayer.selectAll(\"g.\"+e).data([0]);ot.enter().append(\"g\").classed(e,!0).each(function(){var t=n.select(this);t.append(\"rect\").classed(\"cbbg\",!0),t.append(\"g\").classed(\"cbfills\",!0),t.append(\"g\").classed(\"cblines\",!0),t.append(\"g\").classed(\"cbaxis\",!0).classed(\"crisp\",!0),t.append(\"g\").classed(\"cbtitleunshift\",!0).append(\"g\").classed(\"cbtitle\",!0),t.append(\"rect\").classed(\"cboutline\",!0),t.select(\".cbtitle\").datum(0)}),ot.attr(\"transform\",\"translate(\"+Math.round(T.l)+\",\"+Math.round(T.t)+\")\");var it=ot.select(\".cbtitleunshift\").attr(\"transform\",\"translate(-\"+Math.round(T.l)+\",-\"+Math.round(T.t)+\")\");K._axislayer=ot.select(\".cbaxis\");var lt=0;if([\"top\",\"bottom\"].indexOf(_.titleside)!==-1){var st,ct=T.l+(_.x+U)*T.w,ut=K.titlefont.size;st=\"top\"===_.titleside?(1-(W+V-G))*T.h+T.t+3+.75*ut:(1-(W+G))*T.h+T.t-3-.25*ut,k(K._id+\"title\",{attributes:{x:ct,y:st,\"text-anchor\":\"start\"}})}var ft=u.syncOrAsync([i.previousPromises,w,i.previousPromises,M],t);if(ft&&ft.then&&(t._promises||[]).push(ft),t._context.editable){var dt,ht,pt;c.init({element:ot.node(),prepFn:function(){dt=ot.attr(\"transform\"),d(ot)},moveFn:function(t,e){ot.attr(\"transform\",dt+\" translate(\"+t+\",\"+e+\")\"),ht=c.align(Z+t/T.w,q,0,1,_.xanchor),pt=c.align(W-e/T.h,V,0,1,_.yanchor);var r=c.getCursor(ht,pt,_.xanchor,_.yanchor);d(ot,r)},doneFn:function(e){d(ot),e&&void 0!==ht&&void 0!==pt&&o.restyle(t,{\"colorbar.x\":ht,\"colorbar.y\":pt},b().index)}})}return ft}function b(){var r,n,a=e.substr(2);for(r=0;r<t._fullData.length;r++)if(n=t._fullData[r],n.uid===a)return n}var _={};return Object.keys(x).forEach(function(t){_[t]=null}),_.fillcolor=null,_.line={color:null,width:null,dash:null},_.levels={start:null,end:null,size:null},_.filllevels=null,Object.keys(_).forEach(function(t){r[t]=function(e){return arguments.length?(_[t]=u.isPlainObject(_[t])?u.extendFlat(_[t],e):e,r):_[t]}}),r.options=function(t){return Object.keys(t).forEach(function(e){\"function\"==typeof r[e]&&r[e](t[e])}),r},r._opts=_,r}},{\"../../lib\":136,\"../../lib/extend\":132,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/cartesian/axis_defaults\":173,\"../../plots/cartesian/layout_attributes\":182,\"../../plots/cartesian/position_defaults\":185,\"../../plots/plots\":199,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"../titles\":114,\"./attributes\":26,d3:7,tinycolor2:13}],29:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t){return n.isPlainObject(t.colorbar)}},{\"../../lib\":136}],30:[function(t,e,r){\"use strict\";e.exports={zauto:{valType:\"boolean\",dflt:!0},zmin:{valType:\"number\",dflt:null},zmax:{valType:\"number\",dflt:null},colorscale:{valType:\"colorscale\"},autocolorscale:{valType:\"boolean\",dflt:!0},reversescale:{valType:\"boolean\",dflt:!1},showscale:{valType:\"boolean\",dflt:!0}}},{}],31:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./scales\"),o=t(\"./flip_scale\");e.exports=function(t,e,r,i){var l,s;r?(l=n.nestedProperty(t,r).get(),s=n.nestedProperty(t._input,r).get()):(l=t,s=t._input);var c=i+\"auto\",u=i+\"min\",f=i+\"max\",d=l[c],h=l[u],p=l[f],g=l.colorscale;d===!1&&void 0!==h||(h=n.aggNums(Math.min,null,e)),d===!1&&void 0!==p||(p=n.aggNums(Math.max,null,e)),h===p&&(h-=.5,p+=.5),l[u]=h,l[f]=p,s[u]=h,s[f]=p,s[c]=d!==!1||void 0===h&&void 0===p,l.autocolorscale&&(g=h*p<0?a.RdBu:h>=0?a.Reds:a.Blues,s.colorscale=g,l.reversescale&&(g=o(g)),l.colorscale=g)}},{\"../../lib\":136,\"./flip_scale\":36,\"./scales\":43}],32:[function(t,e,r){\"use strict\";var n=t(\"./attributes\"),a=t(\"../../lib/extend\").extendDeep;t(\"./scales.js\");e.exports=function(t){return{color:{valType:\"color\",arrayOk:!0},colorscale:a({},n.colorscale,{}),cauto:a({},n.zauto,{}),cmax:a({},n.zmax,{}),cmin:a({},n.zmin,{}),autocolorscale:a({},n.autocolorscale,{}),reversescale:a({},n.reversescale,{})}}},{\"../../lib/extend\":132,\"./attributes\":30,\"./scales.js\":43}],33:[function(t,e,r){\"use strict\";var n=t(\"./scales\");e.exports=n.RdBu},{\"./scales\":43}],34:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../colorbar/has_colorbar\"),i=t(\"../colorbar/defaults\"),l=t(\"./is_valid_scale\"),s=t(\"./flip_scale\");e.exports=function(t,e,r,c,u){var f=u.prefix,d=u.cLetter,h=f.slice(0,f.length-1),p=f?a.nestedProperty(t,h).get()||{}:t,g=f?a.nestedProperty(e,h).get()||{}:e,v=p[d+\"min\"],m=p[d+\"max\"],y=p.colorscale;c(f+d+\"auto\",!(n(v)&&n(m)&&v<m)),\n",
|
|
"c(f+d+\"min\"),c(f+d+\"max\");var x;void 0!==y&&(x=!l(y)),c(f+\"autocolorscale\",x);var b=c(f+\"colorscale\");if(c(f+\"reversescale\")&&(g.colorscale=s(b)),\"marker.line.\"!==f){var _;f&&(_=o(p)),c(f+\"showscale\",_)&&i(p,g,r)}}},{\"../../lib\":136,\"../colorbar/defaults\":27,\"../colorbar/has_colorbar\":29,\"./flip_scale\":36,\"./is_valid_scale\":40,\"fast-isnumeric\":10}],35:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){for(var n=t.length,a=new Array(n),o=new Array(n),i=0;i<n;i++){var l=t[i];a[i]=e+l[0]*(r-e),o[i]=l[1]}return{domain:a,range:o}}},{}],36:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e,r=t.length,n=new Array(r),a=r-1,o=0;a>=0;a--,o++)e=t[a],n[o]=[1-e[0],e[1]];return n}},{}],37:[function(t,e,r){\"use strict\";var n=t(\"./scales\"),a=t(\"./default_scale\"),o=t(\"./is_valid_scale_array\");e.exports=function(t,e){function r(){try{t=n[t]||JSON.parse(t)}catch(r){t=e}}return e||(e=a),t?(\"string\"==typeof t&&(r(),\"string\"==typeof t&&r()),o(t)?t:e):e}},{\"./default_scale\":33,\"./is_valid_scale_array\":41,\"./scales\":43}],38:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"./is_valid_scale\");e.exports=function(t,e){var r=e?a.nestedProperty(t,e).get()||{}:t,i=r.color,l=!1;if(Array.isArray(i))for(var s=0;s<i.length;s++)if(n(i[s])){l=!0;break}return a.isPlainObject(r)&&(l||r.showscale===!0||n(r.cmin)&&n(r.cmax)||o(r.colorscale)||a.isPlainObject(r.colorbar))}},{\"../../lib\":136,\"./is_valid_scale\":40,\"fast-isnumeric\":10}],39:[function(t,e,r){\"use strict\";r.scales=t(\"./scales\"),r.defaultScale=t(\"./default_scale\"),r.attributes=t(\"./attributes\"),r.handleDefaults=t(\"./defaults\"),r.calc=t(\"./calc\"),r.hasColorscale=t(\"./has_colorscale\"),r.isValidScale=t(\"./is_valid_scale\"),r.getScale=t(\"./get_scale\"),r.flipScale=t(\"./flip_scale\"),r.extractScale=t(\"./extract_scale\"),r.makeColorScaleFunc=t(\"./make_color_scale_func\")},{\"./attributes\":30,\"./calc\":31,\"./default_scale\":33,\"./defaults\":34,\"./extract_scale\":35,\"./flip_scale\":36,\"./get_scale\":37,\"./has_colorscale\":38,\"./is_valid_scale\":40,\"./make_color_scale_func\":42,\"./scales\":43}],40:[function(t,e,r){\"use strict\";var n=t(\"./scales\"),a=t(\"./is_valid_scale_array\");e.exports=function(t){return void 0!==n[t]||a(t)}},{\"./is_valid_scale_array\":41,\"./scales\":43}],41:[function(t,e,r){\"use strict\";var n=t(\"tinycolor2\");e.exports=function(t){var e=0;if(!Array.isArray(t)||t.length<2)return!1;if(!t[0]||!t[t.length-1])return!1;if(0!=+t[0][0]||1!=+t[t.length-1][0])return!1;for(var r=0;r<t.length;r++){var a=t[r];if(2!==a.length||+a[0]<e||!n(a[1]).isValid())return!1;e=+a[0]}return!0}},{tinycolor2:13}],42:[function(t,e,r){\"use strict\";function n(t){var e={r:t[0],g:t[1],b:t[2],a:t[3]};return o(e).toRgbString()}var a=t(\"d3\"),o=t(\"tinycolor2\"),i=t(\"fast-isnumeric\"),l=t(\"../color\");e.exports=function(t,e){e=e||{};for(var r=t.domain,s=t.range,c=s.length,u=new Array(c),f=0;f<c;f++){var d=o(s[f]).toRgb();u[f]=[d.r,d.g,d.b,d.a]}var h,p=a.scale.linear().domain(r).range(u).clamp(!0),g=e.noNumericCheck,v=e.returnArray;return h=g&&v?p:g?function(t){return n(p(t))}:v?function(t){return i(t)?p(t):o(t).isValid()?t:l.defaultLine}:function(t){return i(t)?n(p(t)):o(t).isValid()?t:l.defaultLine},h.domain=p.domain,h.range=function(){return s},h}},{\"../color\":25,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],43:[function(t,e,r){\"use strict\";e.exports={Greys:[[0,\"rgb(0,0,0)\"],[1,\"rgb(255,255,255)\"]],YlGnBu:[[0,\"rgb(8,29,88)\"],[.125,\"rgb(37,52,148)\"],[.25,\"rgb(34,94,168)\"],[.375,\"rgb(29,145,192)\"],[.5,\"rgb(65,182,196)\"],[.625,\"rgb(127,205,187)\"],[.75,\"rgb(199,233,180)\"],[.875,\"rgb(237,248,217)\"],[1,\"rgb(255,255,217)\"]],Greens:[[0,\"rgb(0,68,27)\"],[.125,\"rgb(0,109,44)\"],[.25,\"rgb(35,139,69)\"],[.375,\"rgb(65,171,93)\"],[.5,\"rgb(116,196,118)\"],[.625,\"rgb(161,217,155)\"],[.75,\"rgb(199,233,192)\"],[.875,\"rgb(229,245,224)\"],[1,\"rgb(247,252,245)\"]],YlOrRd:[[0,\"rgb(128,0,38)\"],[.125,\"rgb(189,0,38)\"],[.25,\"rgb(227,26,28)\"],[.375,\"rgb(252,78,42)\"],[.5,\"rgb(253,141,60)\"],[.625,\"rgb(254,178,76)\"],[.75,\"rgb(254,217,118)\"],[.875,\"rgb(255,237,160)\"],[1,\"rgb(255,255,204)\"]],Bluered:[[0,\"rgb(0,0,255)\"],[1,\"rgb(255,0,0)\"]],RdBu:[[0,\"rgb(5,10,172)\"],[.35,\"rgb(106,137,247)\"],[.5,\"rgb(190,190,190)\"],[.6,\"rgb(220,170,132)\"],[.7,\"rgb(230,145,90)\"],[1,\"rgb(178,10,28)\"]],Reds:[[0,\"rgb(220,220,220)\"],[.2,\"rgb(245,195,157)\"],[.4,\"rgb(245,160,105)\"],[1,\"rgb(178,10,28)\"]],Blues:[[0,\"rgb(5,10,172)\"],[.35,\"rgb(40,60,190)\"],[.5,\"rgb(70,100,245)\"],[.6,\"rgb(90,120,245)\"],[.7,\"rgb(106,137,247)\"],[1,\"rgb(220,220,220)\"]],Picnic:[[0,\"rgb(0,0,255)\"],[.1,\"rgb(51,153,255)\"],[.2,\"rgb(102,204,255)\"],[.3,\"rgb(153,204,255)\"],[.4,\"rgb(204,204,255)\"],[.5,\"rgb(255,255,255)\"],[.6,\"rgb(255,204,255)\"],[.7,\"rgb(255,153,255)\"],[.8,\"rgb(255,102,204)\"],[.9,\"rgb(255,102,102)\"],[1,\"rgb(255,0,0)\"]],Rainbow:[[0,\"rgb(150,0,90)\"],[.125,\"rgb(0,0,200)\"],[.25,\"rgb(0,25,255)\"],[.375,\"rgb(0,152,255)\"],[.5,\"rgb(44,255,150)\"],[.625,\"rgb(151,255,0)\"],[.75,\"rgb(255,234,0)\"],[.875,\"rgb(255,111,0)\"],[1,\"rgb(255,0,0)\"]],Portland:[[0,\"rgb(12,51,131)\"],[.25,\"rgb(10,136,186)\"],[.5,\"rgb(242,211,56)\"],[.75,\"rgb(242,143,56)\"],[1,\"rgb(217,30,30)\"]],Jet:[[0,\"rgb(0,0,131)\"],[.125,\"rgb(0,60,170)\"],[.375,\"rgb(5,255,255)\"],[.625,\"rgb(255,255,0)\"],[.875,\"rgb(250,0,0)\"],[1,\"rgb(128,0,0)\"]],Hot:[[0,\"rgb(0,0,0)\"],[.3,\"rgb(230,0,0)\"],[.6,\"rgb(255,210,0)\"],[1,\"rgb(255,255,255)\"]],Blackbody:[[0,\"rgb(0,0,0)\"],[.2,\"rgb(230,0,0)\"],[.4,\"rgb(230,210,0)\"],[.7,\"rgb(255,255,255)\"],[1,\"rgb(160,200,255)\"]],Earth:[[0,\"rgb(0,0,130)\"],[.1,\"rgb(0,180,180)\"],[.2,\"rgb(40,210,40)\"],[.4,\"rgb(230,230,50)\"],[.6,\"rgb(120,70,20)\"],[1,\"rgb(255,255,255)\"]],Electric:[[0,\"rgb(0,0,0)\"],[.15,\"rgb(30,0,100)\"],[.4,\"rgb(120,0,100)\"],[.6,\"rgb(160,90,0)\"],[.8,\"rgb(230,200,0)\"],[1,\"rgb(255,250,220)\"]],Viridis:[[0,\"#440154\"],[.06274509803921569,\"#48186a\"],[.12549019607843137,\"#472d7b\"],[.18823529411764706,\"#424086\"],[.25098039215686274,\"#3b528b\"],[.3137254901960784,\"#33638d\"],[.3764705882352941,\"#2c728e\"],[.4392156862745098,\"#26828e\"],[.5019607843137255,\"#21918c\"],[.5647058823529412,\"#1fa088\"],[.6274509803921569,\"#28ae80\"],[.6901960784313725,\"#3fbc73\"],[.7529411764705882,\"#5ec962\"],[.8156862745098039,\"#84d44b\"],[.8784313725490196,\"#addc30\"],[.9411764705882353,\"#d8e219\"],[1,\"#fde725\"]]}},{}],44:[function(t,e,r){\"use strict\";e.exports=function(t,e,r,n,a){var o=(t-r)/(n-r),i=o+e/(n-r),l=(o+i)/2;return\"left\"===a||\"bottom\"===a?o:\"center\"===a||\"middle\"===a?l:\"right\"===a||\"top\"===a?i:o<2/3-l?o:i>4/3-l?i:l}},{}],45:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=[[\"sw-resize\",\"s-resize\",\"se-resize\"],[\"w-resize\",\"move\",\"e-resize\"],[\"nw-resize\",\"n-resize\",\"ne-resize\"]];e.exports=function(t,e,r,o){return t=\"left\"===r?0:\"center\"===r?1:\"right\"===r?2:n.constrain(Math.floor(3*t),0,2),e=\"bottom\"===o?0:\"middle\"===o?1:\"top\"===o?2:n.constrain(Math.floor(3*e),0,2),a[e][t]}},{\"../../lib\":136}],46:[function(t,e,r){\"use strict\";function n(){var t=document.createElement(\"div\");t.className=\"dragcover\";var e=t.style;return e.position=\"fixed\",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background=\"none\",document.body.appendChild(t),t}function a(t){t._dragging=!1,t._replotPending&&o.plot(t)}var o=t(\"../../plotly\"),i=t(\"../../lib\"),l=t(\"../../plots/cartesian/constants\"),s=t(\"../../constants/interactions\"),c=e.exports={};c.align=t(\"./align\"),c.getCursor=t(\"./cursor\");var u=t(\"./unhover\");c.unhover=u.wrapped,c.unhoverRaw=u.raw,c.init=function(t){function e(e){return t.element.onmousemove=g,v._dragged=!1,v._dragging=!0,u=e.clientX,f=e.clientY,p=e.target,d=(new Date).getTime(),d-v._mouseDownTime<y?m+=1:(m=1,v._mouseDownTime=d),t.prepFn&&t.prepFn(e,u,f),h=n(),h.onmousemove=r,h.onmouseup=o,h.onmouseout=o,h.style.cursor=window.getComputedStyle(t.element).cursor,i.pauseEvent(e)}function r(e){var r=e.clientX-u,n=e.clientY-f,a=t.minDrag||l.MINDRAG;return Math.abs(r)<a&&(r=0),Math.abs(n)<a&&(n=0),(r||n)&&(v._dragged=!0,c.unhover(v)),t.moveFn&&t.moveFn(r,n,v._dragged),i.pauseEvent(e)}function o(e){if(g=t.element.onmousemove,t.setCursor&&(t.element.onmousemove=t.setCursor),h.onmousemove=null,h.onmouseup=null,h.onmouseout=null,i.removeElement(h),!v._dragging)return void(v._dragged=!1);if(v._dragging=!1,(new Date).getTime()-v._mouseDownTime>y&&(m=Math.max(m-1,1)),t.doneFn&&t.doneFn(v._dragged,m,e),!v._dragged){var r;try{r=new MouseEvent(\"click\",e)}catch(t){r=document.createEvent(\"MouseEvents\"),r.initMouseEvent(\"click\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}p.dispatchEvent(r)}return a(v),v._dragged=!1,i.pauseEvent(e)}var u,f,d,h,p,g,v=i.getPlotDiv(t.element)||{},m=1,y=s.DBLCLICKDELAY;v._mouseDownTime||(v._mouseDownTime=0),g=t.element.onmousemove,t.setCursor&&(t.element.onmousemove=t.setCursor),t.element.onmousedown=e,t.element.style.pointerEvents=\"all\"},c.coverSlip=n},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../plotly\":166,\"../../plots/cartesian/constants\":176,\"./align\":44,\"./cursor\":45,\"./unhover\":47}],47:[function(t,e,r){\"use strict\";var n=t(\"../../lib/events\"),a=e.exports={};a.wrapped=function(t,e,r){\"string\"==typeof t&&(t=document.getElementById(t)),t._hoverTimer&&(clearTimeout(t._hoverTimer),t._hoverTimer=void 0),a.raw(t,e,r)},a.raw=function(t,e){var r=t._fullLayout,a=t._hoverdata;e||(e={}),e.target&&n.triggerHandler(t,\"plotly_beforehover\",e)===!1||(r._hoverlayer.selectAll(\"g\").remove(),r._hoverlayer.selectAll(\"line\").remove(),r._hoverlayer.selectAll(\"circle\").remove(),t._hoverdata=void 0,e.target&&a&&t.emit(\"plotly_unhover\",{event:e,points:a}))}},{\"../../lib/events\":131}],48:[function(t,e,r){\"use strict\";r.dash={valType:\"string\",values:[\"solid\",\"dot\",\"dash\",\"longdash\",\"dashdot\",\"longdashdot\"],dflt:\"solid\"}},{}],49:[function(t,e,r){\"use strict\";function n(t,e,r,n,a,o,i,l){if(s.traceIs(r,\"symbols\")){var u=g(r);e.attr(\"d\",function(t){var e;e=\"various\"===t.ms||\"various\"===o.size?3:p.isBubble(r)?u(t.ms):(o.size||6)/2,t.mrc=e;var n=v.symbolNumber(t.mx||o.symbol)||0,a=n%100;return t.om=n%200>=100,v.symbolFuncs[a](e)+(n>=200?x:\"\")}).style(\"opacity\",function(t){return(t.mo+1||o.opacity+1)-1})}var f,d,h,m=!1;if(t.so?(h=i.outlierwidth,d=i.outliercolor,f=o.outliercolor):(h=(t.mlw+1||i.width+1||(t.trace?t.trace.marker.line.width:0)+1)-1,d=\"mlc\"in t?t.mlcc=a(t.mlc):Array.isArray(i.color)?c.defaultLine:i.color,Array.isArray(o.color)&&(f=c.defaultLine,m=!0),f=\"mc\"in t?t.mcc=n(t.mc):o.color||\"rgba(0,0,0,0)\"),t.om)e.call(c.stroke,f).style({\"stroke-width\":(h||1)+\"px\",fill:\"none\"});else{e.style(\"stroke-width\",h+\"px\");var y=o.gradient,b=t.mgt;if(b?m=!0:b=y&&y.type,b&&\"none\"!==b){var _=t.mgc;_?m=!0:_=y.color;var w=\"g\"+l._fullLayout._uid+\"-\"+r.uid;m&&(w+=\"-\"+t.i),e.call(v.gradient,l,w,b,f,_)}else e.call(c.fill,f);h&&e.call(c.stroke,d)}}function a(t,e,r,n){var a=t[0]-e[0],i=t[1]-e[1],l=r[0]-e[0],s=r[1]-e[1],c=Math.pow(a*a+i*i,k/2),u=Math.pow(l*l+s*s,k/2),f=(u*u*a-c*c*l)*n,d=(u*u*i-c*c*s)*n,h=3*u*(c+u),p=3*c*(c+u);return[[o.round(e[0]+(h&&f/h),2),o.round(e[1]+(h&&d/h),2)],[o.round(e[0]-(p&&f/p),2),o.round(e[1]-(p&&d/p),2)]]}var o=t(\"d3\"),i=t(\"fast-isnumeric\"),l=t(\"tinycolor2\"),s=t(\"../../registry\"),c=t(\"../color\"),u=t(\"../colorscale\"),f=t(\"../../lib\"),d=t(\"../../lib/svg_text_utils\"),h=t(\"../../constants/xmlns_namespaces\"),p=t(\"../../traces/scatter/subtypes\"),g=t(\"../../traces/scatter/make_bubble_size_func\"),v=e.exports={};v.font=function(t,e,r,n){e&&e.family&&(n=e.color,r=e.size,e=e.family),e&&t.style(\"font-family\",e),r+1&&t.style(\"font-size\",r+\"px\"),n&&t.call(c.fill,n)},v.setPosition=function(t,e,r){t.attr(\"x\",e).attr(\"y\",r)},v.setSize=function(t,e,r){t.attr(\"width\",e).attr(\"height\",r)},v.setRect=function(t,e,r,n,a){t.call(v.setPosition,e,r).call(v.setSize,n,a)},v.translatePoint=function(t,e,r,n){var a=t.xp||r.c2p(t.x),o=t.yp||n.c2p(t.y);return i(a)&&i(o)&&e.node()?(\"text\"===e.node().nodeName?e.attr(\"x\",a).attr(\"y\",o):e.attr(\"transform\",\"translate(\"+a+\",\"+o+\")\"),!0):(e.remove(),!1)},v.translatePoints=function(t,e,r,n){t.each(function(t){var a=o.select(this);v.translatePoint(t,a,e,r,n)})},v.getPx=function(t,e){return Number(t.style(e).replace(/px$/,\"\"))},v.crispRound=function(t,e,r){return e&&i(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},v.singleLineStyle=function(t,e,r,n,a){e.style(\"fill\",\"none\");var o=(((t||[])[0]||{}).trace||{}).line||{},i=r||o.width||0,l=a||o.dash||\"\";c.stroke(e,n||o.color),v.dashLine(e,l,i)},v.lineGroupStyle=function(t,e,r,n){t.style(\"fill\",\"none\").each(function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},i=e||a.width||0,l=n||a.dash||\"\";o.select(this).call(c.stroke,r||a.color).call(v.dashLine,l,i)})},v.dashLine=function(t,e,r){r=+r||0,e=v.dashStyle(e,r),t.style({\"stroke-dasharray\":e,\"stroke-width\":r+\"px\"})},v.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return\"solid\"===t?t=\"\":\"dot\"===t?t=r+\"px,\"+r+\"px\":\"dash\"===t?t=3*r+\"px,\"+3*r+\"px\":\"longdash\"===t?t=5*r+\"px,\"+5*r+\"px\":\"dashdot\"===t?t=3*r+\"px,\"+r+\"px,\"+r+\"px,\"+r+\"px\":\"longdashdot\"===t&&(t=5*r+\"px,\"+2*r+\"px,\"+r+\"px,\"+2*r+\"px\"),t},v.fillGroupStyle=function(t){t.style(\"stroke-width\",0).each(function(e){var r=o.select(this);try{r.call(c.fill,e[0].trace.fillcolor)}catch(e){f.error(e,t),r.remove()}})};var m=t(\"./symbol_defs\");v.symbolNames=[],v.symbolFuncs=[],v.symbolNeedLines={},v.symbolNoDot={},v.symbolList=[],Object.keys(m).forEach(function(t){var e=m[t];v.symbolList=v.symbolList.concat([e.n,t,e.n+100,t+\"-open\"]),v.symbolNames[e.n]=t,v.symbolFuncs[e.n]=e.f,e.needLine&&(v.symbolNeedLines[e.n]=!0),e.noDot?v.symbolNoDot[e.n]=!0:v.symbolList=v.symbolList.concat([e.n+200,t+\"-dot\",e.n+300,t+\"-open-dot\"])});var y=v.symbolNames.length,x=\"M0,0.5L0.5,0L0,-0.5L-0.5,0Z\";v.symbolNumber=function(t){if(\"string\"==typeof t){var e=0;t.indexOf(\"-open\")>0&&(e=100,t=t.replace(\"-open\",\"\")),t.indexOf(\"-dot\")>0&&(e+=200,t=t.replace(\"-dot\",\"\")),t=v.symbolNames.indexOf(t),t>=0&&(t+=e)}return t%100>=y||t>=400?0:Math.floor(Math.max(t,0))};var b={x1:1,x2:0,y1:0,y2:0},_={x1:0,x2:0,y1:1,y2:0};v.gradient=function(t,e,r,n,a,i){var s=e._fullLayout._defs.select(\".gradients\").selectAll(\"#\"+r).data([n+a+i],f.identity);s.exit().remove(),s.enter().append(\"radial\"===n?\"radialGradient\":\"linearGradient\").each(function(){var t=o.select(this);\"horizontal\"===n?t.attr(b):\"vertical\"===n&&t.attr(_),t.attr(\"id\",r);var e=l(a),s=l(i);t.append(\"stop\").attr({offset:\"0%\",\"stop-color\":c.tinyRGB(s),\"stop-opacity\":s.getAlpha()}),t.append(\"stop\").attr({offset:\"100%\",\"stop-color\":c.tinyRGB(e),\"stop-opacity\":e.getAlpha()})}),t.style({fill:\"url(#\"+r+\")\",\"fill-opacity\":null})},v.initGradients=function(t){var e=t._fullLayout._defs.selectAll(\".gradients\").data([0]);e.enter().append(\"g\").classed(\"gradients\",!0),e.selectAll(\"linearGradient,radialGradient\").remove()},v.singlePointStyle=function(t,e,r,a,o,i){var l=r.marker;n(t,e,r,a,o,l,l.line,i)},v.pointStyle=function(t,e){if(t.size()){var r=e.marker,n=v.tryColorscale(r,\"\"),a=v.tryColorscale(r,\"line\"),i=f.getPlotDiv(t.node());t.each(function(t){v.singlePointStyle(t,o.select(this),e,n,a,i)})}},v.tryColorscale=function(t,e){var r=e?f.nestedProperty(t,e).get():t,n=r.colorscale,a=r.color;return n&&Array.isArray(a)?u.makeColorScaleFunc(u.extractScale(n,r.cmin,r.cmax)):f.identity};var w={start:1,end:-1,middle:0,bottom:1,top:-1};v.textPointStyle=function(t,e){t.each(function(t){var r=o.select(this),n=t.tx||e.text;if(!n||Array.isArray(n))return void r.remove();var a=t.tp||e.textposition,l=a.indexOf(\"top\")!==-1?\"top\":a.indexOf(\"bottom\")!==-1?\"bottom\":\"middle\",s=a.indexOf(\"left\")!==-1?\"end\":a.indexOf(\"right\")!==-1?\"start\":\"middle\",c=t.ts||e.textfont.size,u=t.mrc?t.mrc/.8+1:0;c=i(c)&&c>0?c:0,r.call(v.font,t.tf||e.textfont.family,c,t.tc||e.textfont.color).attr(\"text-anchor\",s).text(n).call(d.convertToTspans);var f=o.select(this.parentNode),h=r.selectAll(\"tspan.line\"),p=1.3*((h[0].length||1)-1)+1,g=w[s]*u,m=.75*c+w[l]*u+(w[l]-1)*p*c/2;f.attr(\"transform\",\"translate(\"+g+\",\"+m+\")\"),p>1&&h.attr({x:r.attr(\"x\"),y:r.attr(\"y\")})})};var k=.5;v.smoothopen=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\");var r,n=\"M\"+t[0],o=[];for(r=1;r<t.length-1;r++)o.push(a(t[r-1],t[r],t[r+1],e));for(n+=\"Q\"+o[0][0]+\" \"+t[1],r=2;r<t.length-1;r++)n+=\"C\"+o[r-2][1]+\" \"+o[r-1][0]+\" \"+t[r];return n+=\"Q\"+o[t.length-3][1]+\" \"+t[t.length-1]},v.smoothclosed=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\")+\"Z\";var r,n=\"M\"+t[0],o=t.length-1,i=[a(t[o],t[0],t[1],e)];for(r=1;r<o;r++)i.push(a(t[r-1],t[r],t[r+1],e));for(i.push(a(t[o-1],t[o],t[0],e)),r=1;r<=o;r++)n+=\"C\"+i[r-1][1]+\" \"+i[r][0]+\" \"+t[r];return n+=\"C\"+i[o][1]+\" \"+i[0][0]+\" \"+t[0]+\"Z\"};var M={hv:function(t,e){return\"H\"+o.round(e[0],2)+\"V\"+o.round(e[1],2)},vh:function(t,e){return\"V\"+o.round(e[1],2)+\"H\"+o.round(e[0],2)},hvh:function(t,e){return\"H\"+o.round((t[0]+e[0])/2,2)+\"V\"+o.round(e[1],2)+\"H\"+o.round(e[0],2)},vhv:function(t,e){return\"V\"+o.round((t[1]+e[1])/2,2)+\"H\"+o.round(e[0],2)+\"V\"+o.round(e[1],2)}},A=function(t,e){return\"L\"+o.round(e[0],2)+\",\"+o.round(e[1],2)};v.steps=function(t){var e=M[t]||A;return function(t){for(var r=\"M\"+o.round(t[0][0],2)+\",\"+o.round(t[0][1],2),n=1;n<t.length;n++)r+=e(t[n-1],t[n]);return r}},v.makeTester=function(){var t=o.select(\"body\").selectAll(\"#js-plotly-tester\").data([0]);t.enter().append(\"svg\").attr(\"id\",\"js-plotly-tester\").attr(h.svgAttrs).style({position:\"absolute\",left:\"-10000px\",top:\"-10000px\",width:\"9000px\",height:\"9000px\",\"z-index\":\"1\"});var e=t.selectAll(\".js-reference-point\").data([0]);e.enter().append(\"path\").classed(\"js-reference-point\",!0).attr(\"d\",\"M0,0H1V1H0Z\").style({\"stroke-width\":0,fill:\"black\"}),t.node()._cache||(t.node()._cache={}),v.tester=t,v.testref=e};var T=[];v.bBox=function(t){var e=t.attributes[\"data-bb\"];if(e&&e.value)return f.extendFlat({},T[e.value]);var r=v.tester,n=r.node(),a=t.cloneNode(!0);n.appendChild(a),o.select(a).attr({x:0,y:0,transform:\"\"});var i=a.getBoundingClientRect(),l=v.testref.node().getBoundingClientRect();n.removeChild(a);var s={height:i.height,width:i.width,left:i.left-l.left,top:i.top-l.top,right:i.right-l.left,bottom:i.bottom-l.top};return T.length>=1e4&&(o.selectAll(\"[data-bb]\").attr(\"data-bb\",null),T=[]),t.setAttribute(\"data-bb\",T.length),T.push(s),f.extendFlat({},s)},v.setClipUrl=function(t,e){if(!e)return void t.attr(\"clip-path\",null);var r=\"#\"+e,n=o.select(\"base\");n.size()&&n.attr(\"href\")&&(r=window.location.href.split(\"#\")[0]+r),t.attr(\"clip-path\",\"url(\"+r+\")\")},v.getTranslate=function(t){var e=t.attr?\"attr\":\"getAttribute\",r=t[e](\"transform\")||\"\",n=r.replace(/.*\\btranslate\\((-?\\d*\\.?\\d*)[^-\\d]*(-?\\d*\\.?\\d*)[^\\d].*/,function(t,e,r){return[e,r].join(\" \")}).split(\" \");return{x:+n[0]||0,y:+n[1]||0}},v.setTranslate=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",a=t.attr?\"attr\":\"setAttribute\",o=t[n](\"transform\")||\"\";return e=e||0,r=r||0,o=o.replace(/(\\btranslate\\(.*?\\);?)/,\"\").trim(),o+=\" translate(\"+e+\", \"+r+\")\",o=o.trim(),t[a](\"transform\",o),o},v.getScale=function(t){var e=t.attr?\"attr\":\"getAttribute\",r=t[e](\"transform\")||\"\",n=r.replace(/.*\\bscale\\((\\d*\\.?\\d*)[^\\d]*(\\d*\\.?\\d*)[^\\d].*/,function(t,e,r){return[e,r].join(\" \")}).split(\" \");return{x:+n[0]||1,y:+n[1]||1}},v.setScale=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",a=t.attr?\"attr\":\"setAttribute\",o=t[n](\"transform\")||\"\";return e=e||1,r=r||1,o=o.replace(/(\\bscale\\(.*?\\);?)/,\"\").trim(),o+=\" scale(\"+e+\", \"+r+\")\",o=o.trim(),t[a](\"transform\",o),o},v.setPointGroupScale=function(t,e,r){var n,a,o;return e=e||1,r=r||1,a=1===e&&1===r?\"\":\" scale(\"+e+\",\"+r+\")\",o=/\\s*sc.*/,t.each(function(){n=(this.getAttribute(\"transform\")||\"\").replace(o,\"\"),n+=a,n=n.trim(),this.setAttribute(\"transform\",n)}),a};v.setTextPointsScale=function(t,e,r){t.each(function(){var t,n=o.select(this),a=n.select(\"text\"),i=parseFloat(a.attr(\"x\")||0),l=parseFloat(a.attr(\"y\")||0),s=(n.attr(\"transform\")||\"\").match(/translate\\([^)]*\\)\\s*$/);t=1===e&&1===r?[]:[\"translate(\"+i+\",\"+l+\")\",\"scale(\"+e+\",\"+r+\")\",\"translate(\"+-i+\",\"+-l+\")\"],s&&t.push(s),n.attr(\"transform\",t.join(\" \"))})},v.measureText=function(t,e,r){var n=t.append(\"text\").text(e).call(v.font,r),a=v.bBox(n.node());return n.remove(),a}},{\"../../constants/xmlns_namespaces\":124,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../registry\":206,\"../../traces/scatter/make_bubble_size_func\":255,\"../../traces/scatter/subtypes\":260,\"../color\":25,\"../colorscale\":39,\"./symbol_defs\":50,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],50:[function(t,e,r){\"use strict\";var n=t(\"d3\");e.exports={circle:{n:0,f:function(t){var e=n.round(t,2);return\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"}},square:{n:1,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"}},diamond:{n:2,f:function(t){var e=n.round(1.3*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"Z\"}},cross:{n:3,f:function(t){var e=n.round(.4*t,2),r=n.round(1.2*t,2);return\"M\"+r+\",\"+e+\"H\"+e+\"V\"+r+\"H-\"+e+\"V\"+e+\"H-\"+r+\"V-\"+e+\"H-\"+e+\"V-\"+r+\"H\"+e+\"V-\"+e+\"H\"+r+\"Z\"}},x:{n:4,f:function(t){var e=n.round(.8*t/Math.sqrt(2),2),r=\"l\"+e+\",\"+e,a=\"l\"+e+\",-\"+e,o=\"l-\"+e+\",-\"+e,i=\"l-\"+e+\",\"+e;return\"M0,\"+e+r+a+o+a+o+i+o+i+r+i+r+\"Z\"}},\"triangle-up\":{n:5,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+e+\",\"+n.round(t/2,2)+\"H\"+e+\"L0,-\"+n.round(t,2)+\"Z\"}},\"triangle-down\":{n:6,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+e+\",-\"+n.round(t/2,2)+\"H\"+e+\"L0,\"+n.round(t,2)+\"Z\"}},\"triangle-left\":{n:7,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M\"+n.round(t/2,2)+\",-\"+e+\"V\"+e+\"L-\"+n.round(t,2)+\",0Z\"}},\"triangle-right\":{n:8,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+n.round(t/2,2)+\",-\"+e+\"V\"+e+\"L\"+n.round(t,2)+\",0Z\"}},\"triangle-ne\":{n:9,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M-\"+r+\",-\"+e+\"H\"+e+\"V\"+r+\"Z\"}},\"triangle-se\":{n:10,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M\"+e+\",-\"+r+\"V\"+e+\"H-\"+r+\"Z\"}},\"triangle-sw\":{n:11,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M\"+r+\",\"+e+\"H-\"+e+\"V-\"+r+\"Z\"}},\"triangle-nw\":{n:12,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M-\"+e+\",\"+r+\"V-\"+e+\"H\"+r+\"Z\"}},pentagon:{n:13,f:function(t){var e=n.round(.951*t,2),r=n.round(.588*t,2),a=n.round(-t,2),o=n.round(t*-.309,2);return\"M\"+e+\",\"+o+\"L\"+r+\",\"+n.round(.809*t,2)+\"H-\"+r+\"L-\"+e+\",\"+o+\"L0,\"+a+\"Z\"}},hexagon:{n:14,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),a=n.round(t*Math.sqrt(3)/2,2);return\"M\"+a+\",-\"+r+\"V\"+r+\"L0,\"+e+\"L-\"+a+\",\"+r+\"V-\"+r+\"L0,-\"+e+\"Z\"}},hexagon2:{n:15,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),a=n.round(t*Math.sqrt(3)/2,2);return\"M-\"+r+\",\"+a+\"H\"+r+\"L\"+e+\",0L\"+r+\",-\"+a+\"H-\"+r+\"L-\"+e+\",0Z\"}},octagon:{n:16,f:function(t){var e=n.round(.924*t,2),r=n.round(.383*t,2);return\"M-\"+r+\",-\"+e+\"H\"+r+\"L\"+e+\",-\"+r+\"V\"+r+\"L\"+r+\",\"+e+\"H-\"+r+\"L-\"+e+\",\"+r+\"V-\"+r+\"Z\"}},star:{n:17,f:function(t){var e=1.4*t,r=n.round(.225*e,2),a=n.round(.951*e,2),o=n.round(.363*e,2),i=n.round(.588*e,2),l=n.round(-e,2),s=n.round(e*-.309,2),c=n.round(.118*e,2),u=n.round(.809*e,2);return\"M\"+r+\",\"+s+\"H\"+a+\"L\"+o+\",\"+c+\"L\"+i+\",\"+u+\"L0,\"+n.round(.382*e,2)+\"L-\"+i+\",\"+u+\"L-\"+o+\",\"+c+\"L-\"+a+\",\"+s+\"H-\"+r+\"L0,\"+l+\"Z\"}},hexagram:{n:18,f:function(t){var e=n.round(.66*t,2),r=n.round(.38*t,2),a=n.round(.76*t,2);return\"M-\"+a+\",0l-\"+r+\",-\"+e+\"h\"+a+\"l\"+r+\",-\"+e+\"l\"+r+\",\"+e+\"h\"+a+\"l-\"+r+\",\"+e+\"l\"+r+\",\"+e+\"h-\"+a+\"l-\"+r+\",\"+e+\"l-\"+r+\",-\"+e+\"h-\"+a+\"Z\"}},\"star-triangle-up\":{n:19,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),a=n.round(1.6*t,2),o=n.round(4*t,2),i=\"A \"+o+\",\"+o+\" 0 0 1 \";return\"M-\"+e+\",\"+r+i+e+\",\"+r+i+\"0,-\"+a+i+\"-\"+e+\",\"+r+\"Z\"}},\"star-triangle-down\":{n:20,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),a=n.round(1.6*t,2),o=n.round(4*t,2),i=\"A \"+o+\",\"+o+\" 0 0 1 \";return\"M\"+e+\",-\"+r+i+\"-\"+e+\",-\"+r+i+\"0,\"+a+i+e+\",-\"+r+\"Z\"}},\"star-square\":{n:21,f:function(t){var e=n.round(1.1*t,2),r=n.round(2*t,2),a=\"A \"+r+\",\"+r+\" 0 0 1 \";return\"M-\"+e+\",-\"+e+a+\"-\"+e+\",\"+e+a+e+\",\"+e+a+e+\",-\"+e+a+\"-\"+e+\",-\"+e+\"Z\"}},\"star-diamond\":{n:22,f:function(t){var e=n.round(1.4*t,2),r=n.round(1.9*t,2),a=\"A \"+r+\",\"+r+\" 0 0 1 \";return\"M-\"+e+\",0\"+a+\"0,\"+e+a+e+\",0\"+a+\"0,-\"+e+a+\"-\"+e+\",0Z\"}},\"diamond-tall\":{n:23,f:function(t){var e=n.round(.7*t,2),r=n.round(1.4*t,2);return\"M0,\"+r+\"L\"+e+\",0L0,-\"+r+\"L-\"+e+\",0Z\"}},\"diamond-wide\":{n:24,f:function(t){var e=n.round(1.4*t,2),r=n.round(.7*t,2);return\"M0,\"+r+\"L\"+e+\",0L0,-\"+r+\"L-\"+e+\",0Z\"}},hourglass:{n:25,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"H-\"+e+\"L\"+e+\",-\"+e+\"H-\"+e+\"Z\"},noDot:!0},bowtie:{n:26,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"V-\"+e+\"L-\"+e+\",\"+e+\"V-\"+e+\"Z\"},noDot:!0},\"circle-cross\":{n:27,f:function(t){var e=n.round(t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"},needLine:!0,noDot:!0},\"circle-x\":{n:28,f:function(t){var e=n.round(t,2),r=n.round(t/Math.sqrt(2),2);return\"M\"+r+\",\"+r+\"L-\"+r+\",-\"+r+\"M\"+r+\",-\"+r+\"L-\"+r+\",\"+r+\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"},needLine:!0,noDot:!0},\"square-cross\":{n:29,f:function(t){var e=n.round(t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"},needLine:!0,noDot:!0},\"square-x\":{n:30,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e+\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e+\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"},needLine:!0,noDot:!0},\"diamond-cross\":{n:31,f:function(t){var e=n.round(1.3*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"ZM0,-\"+e+\"V\"+e+\"M-\"+e+\",0H\"+e},needLine:!0,noDot:!0},\"diamond-x\":{n:32,f:function(t){var e=n.round(1.3*t,2),r=n.round(.65*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"ZM-\"+r+\",-\"+r+\"L\"+r+\",\"+r+\"M-\"+r+\",\"+r+\"L\"+r+\",-\"+r},needLine:!0,noDot:!0},\"cross-thin\":{n:33,f:function(t){var e=n.round(1.4*t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e},needLine:!0,noDot:!0},\"x-thin\":{n:34,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e+\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e},needLine:!0,noDot:!0},asterisk:{n:35,f:function(t){var e=n.round(1.2*t,2),r=n.round(.85*t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+r+\",\"+r+\"L-\"+r+\",-\"+r+\"M\"+r+\",-\"+r+\"L-\"+r+\",\"+r},needLine:!0,noDot:!0},hash:{n:36,f:function(t){var e=n.round(t/2,2),r=n.round(t,2);return\"M\"+e+\",\"+r+\"V-\"+r+\"m-\"+r+\",0V\"+r+\"M\"+r+\",\"+e+\"H-\"+r+\"m0,-\"+r+\"H\"+r},needLine:!0},\"y-up\":{n:37,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+e+\",\"+a+\"L0,0M\"+e+\",\"+a+\"L0,0M0,-\"+r+\"L0,0\"},needLine:!0,noDot:!0},\"y-down\":{n:38,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+e+\",-\"+a+\"L0,0M\"+e+\",-\"+a+\"L0,0M0,\"+r+\"L0,0\"},needLine:!0,noDot:!0},\"y-left\":{n:39,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M\"+a+\",\"+e+\"L0,0M\"+a+\",-\"+e+\"L0,0M-\"+r+\",0L0,0\"},needLine:!0,noDot:!0},\"y-right\":{n:40,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+a+\",\"+e+\"L0,0M-\"+a+\",-\"+e+\"L0,0M\"+r+\",0L0,0\"},needLine:!0,noDot:!0},\"line-ew\":{n:41,f:function(t){var e=n.round(1.4*t,2);return\"M\"+e+\",0H-\"+e},needLine:!0,noDot:!0},\"line-ns\":{n:42,f:function(t){var e=n.round(1.4*t,2);return\"M0,\"+e+\"V-\"+e},needLine:!0,noDot:!0},\"line-ne\":{n:43,f:function(t){var e=n.round(t,2);return\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e},needLine:!0,noDot:!0},\"line-nw\":{n:44,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e},needLine:!0,noDot:!0}}},{d3:7}],51:[function(t,e,r){\"use strict\";e.exports={visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"percent\",\"constant\",\"sqrt\",\"data\"]},symmetric:{valType:\"boolean\"},array:{valType:\"data_array\"},arrayminus:{valType:\"data_array\"},value:{valType:\"number\",min:0,dflt:10},valueminus:{valType:\"number\",min:0,dflt:10},traceref:{valType:\"integer\",min:0,dflt:0},tracerefminus:{valType:\"integer\",min:0,dflt:0},copy_ystyle:{valType:\"boolean\"},copy_zstyle:{valType:\"boolean\"},color:{valType:\"color\"},thickness:{valType:\"number\",min:0,dflt:2},width:{valType:\"number\",min:0},_deprecated:{opacity:{valType:\"number\"}}}},{}],52:[function(t,e,r){\"use strict\";function n(t,e,r,n){var o=e[\"error_\"+n]||{},s=o.visible&&[\"linear\",\"log\"].indexOf(r.type)!==-1,c=[];if(s){for(var u=l(o),f=0;f<t.length;f++){var d=t[f],h=d[n];if(a(r.c2l(h))){var p=u(h,f);if(a(p[0])&&a(p[1])){var g=d[n+\"s\"]=h-p[0],v=d[n+\"h\"]=h+p[1];c.push(g,v)}}}i.expand(r,c,{padded:!0})}}var a=t(\"fast-isnumeric\"),o=t(\"../../registry\"),i=t(\"../../plots/cartesian/axes\"),l=t(\"./compute_error\");e.exports=function(t){for(var e=t.calcdata,r=0;r<e.length;r++){var a=e[r],l=a[0].trace;if(o.traceIs(l,\"errorBarsOK\")){var s=i.getFromId(t,l.xaxis),c=i.getFromId(t,l.yaxis);n(a,l,s,\"x\"),n(a,l,c,\"y\")}}}},{\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./compute_error\":53,\"fast-isnumeric\":10}],53:[function(t,e,r){\"use strict\";function n(t,e){return\"percent\"===t?function(t){return Math.abs(t*e/100)}:\"constant\"===t?function(){return Math.abs(e)}:\"sqrt\"===t?function(t){return Math.sqrt(Math.abs(t))}:void 0}e.exports=function(t){var e=t.type,r=t.symmetric;if(\"data\"===e){var a=t.array,o=t.arrayminus;return r||void 0===o?function(t,e){var r=+a[e];return[r,r]}:function(t,e){return[+o[e],+a[e]]}}var i=n(e,t.value),l=n(e,t.valueminus);return r||void 0===t.valueminus?function(t){var e=i(t);return[e,e]}:function(t){return[l(t),i(t)]}}},{}],54:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../registry\"),o=t(\"../../lib\"),i=t(\"./attributes\");e.exports=function(t,e,r,l){function s(t,e){return o.coerce(f,u,i,t,e)}var c=\"error_\"+l.axis,u=e[c]={},f=t[c]||{};if(s(\"visible\",void 0!==f.array||void 0!==f.value||\"sqrt\"===f.type)!==!1){var d=s(\"type\",\"array\"in f?\"data\":\"percent\"),h=!0;\"sqrt\"!==d&&(h=s(\"symmetric\",!((\"data\"===d?\"arrayminus\":\"valueminus\")in f))),\"data\"===d?(s(\"array\")||(u.array=[]),s(\"traceref\"),h||(s(\"arrayminus\")||(u.arrayminus=[]),s(\"tracerefminus\"))):\"percent\"!==d&&\"constant\"!==d||(s(\"value\"),h||s(\"valueminus\"));var p=\"copy_\"+l.inherit+\"style\";l.inherit&&(e[\"error_\"+l.inherit]||{}).visible&&s(p,!(f.color||n(f.thickness)||n(f.width))),l.inherit&&u[p]||(s(\"color\",r),s(\"thickness\"),s(\"width\",a.traceIs(e,\"gl3d\")?0:4))}}},{\"../../lib\":136,\"../../registry\":206,\"./attributes\":51,\"fast-isnumeric\":10}],55:[function(t,e,r){\"use strict\";var n=e.exports={};n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.calc=t(\"./calc\"),n.calcFromTrace=function(t,e){for(var r=t.x||[],a=t.y||[],o=r.length||a.length,i=new Array(o),l=0;l<o;l++)i[l]={x:r[l],y:a[l]};return i[0].trace=t,n.calc({calcdata:[i],_fullLayout:e}),i},n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.hoverInfo=function(t,e,r){(e.error_y||{}).visible&&(r.yerr=t.yh-t.y,e.error_y.symmetric||(r.yerrneg=t.y-t.ys)),(e.error_x||{}).visible&&(r.xerr=t.xh-t.x,e.error_x.symmetric||(r.xerrneg=t.x-t.xs))}},{\"./attributes\":51,\"./calc\":52,\"./defaults\":54,\"./plot\":56,\"./style\":57}],56:[function(t,e,r){\"use strict\";function n(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),o(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),o(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}var a=t(\"d3\"),o=t(\"fast-isnumeric\"),i=t(\"../../traces/scatter/subtypes\");e.exports=function(t,e,r){var l,s=e.xaxis,c=e.yaxis,u=r&&r.duration>0;t.each(function(t){var e,f=t[0].trace,d=f.error_x||{},h=f.error_y||{};f.ids&&(e=function(t){return t.id});var p=i.hasMarkers(f)&&f.marker.maxdisplayed>0;if(h.visible||d.visible){var g=a.select(this).selectAll(\"g.errorbar\").data(t,e);g.exit().remove(),g.style(\"opacity\",1);var v=g.enter().append(\"g\").classed(\"errorbar\",!0);u&&v.style(\"opacity\",0).transition().duration(r.duration).style(\"opacity\",1),g.each(function(t){var e=a.select(this),i=n(t,s,c);if(!p||t.vis){var f;if(h.visible&&o(i.x)&&o(i.yh)&&o(i.ys)){var g=h.width;f=\"M\"+(i.x-g)+\",\"+i.yh+\"h\"+2*g+\"m-\"+g+\",0V\"+i.ys,i.noYS||(f+=\"m-\"+g+\",0h\"+2*g);var v=e.select(\"path.yerror\");l=!v.size(),l?v=e.append(\"path\").classed(\"yerror\",!0):u&&(v=v.transition().duration(r.duration).ease(r.easing)),v.attr(\"d\",f)}if(d.visible&&o(i.y)&&o(i.xh)&&o(i.xs)){var m=(d.copy_ystyle?h:d).width;f=\"M\"+i.xh+\",\"+(i.y-m)+\"v\"+2*m+\"m0,-\"+m+\"H\"+i.xs,i.noXS||(f+=\"m0,-\"+m+\"v\"+2*m);var y=e.select(\"path.xerror\");l=!y.size(),l?y=e.append(\"path\").classed(\"xerror\",!0):u&&(y=y.transition().duration(r.duration).ease(r.easing)),y.attr(\"d\",f)}}})}})}},{\"../../traces/scatter/subtypes\":260,d3:7,\n",
|
|
"\"fast-isnumeric\":10}],57:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../color\");e.exports=function(t){t.each(function(t){var e=t[0].trace,r=e.error_y||{},o=e.error_x||{},i=n.select(this);i.selectAll(\"path.yerror\").style(\"stroke-width\",r.thickness+\"px\").call(a.stroke,r.color),o.copy_ystyle&&(o=r),i.selectAll(\"path.xerror\").style(\"stroke-width\",o.thickness+\"px\").call(a.stroke,o.color)})}},{\"../color\":25,d3:7}],58:[function(t,e,r){\"use strict\";var n=t(\"../../lib/extend\").extendFlat,a=t(\"../../plots/font_attributes\");e.exports={hoverlabel:{bgcolor:{valType:\"color\",arrayOk:!0},bordercolor:{valType:\"color\",arrayOk:!0},font:{family:n({},a.family,{arrayOk:!0}),size:n({},a.size,{arrayOk:!0}),color:n({},a.color,{arrayOk:!0})}}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195}],59:[function(t,e,r){\"use strict\";function n(t,e,r){Array.isArray(t)&&(e[0][r]=t)}var a=t(\"../../lib\"),o=t(\"../../registry\");e.exports=function(t){for(var e=t.calcdata,r=0;r<e.length;r++){var i=e[r],l=i[0].trace;if(l.hoverlabel){var s=o.traceIs(l,\"2dMap\")?n:a.mergeArray;s(l.hoverlabel.bgcolor,i,\"hbg\"),s(l.hoverlabel.bordercolor,i,\"hbc\"),s(l.hoverlabel.font.size,i,\"hts\"),s(l.hoverlabel.font.color,i,\"htc\"),s(l.hoverlabel.font.family,i,\"htf\")}}}},{\"../../lib\":136,\"../../registry\":206}],60:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");e.exports=function(t,e){function r(){t.emit(\"plotly_click\",{points:t._hoverdata,event:e})}var a=n.getComponentMethod(\"annotations\",\"onClick\")(t,t._hoverdata);t._hoverdata&&e&&e.target&&(a&&a.then?a.then(r):r(),e.stopImmediatePropagation&&e.stopImmediatePropagation())}},{\"../../registry\":206}],61:[function(t,e,r){\"use strict\";e.exports={MAXDIST:20,YANGLE:60,HOVERARROWSIZE:6,HOVERTEXTPAD:3,HOVERFONTSIZE:13,HOVERFONT:\"Arial, sans-serif\",HOVERMINTIME:50}},{}],62:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\"),o=t(\"./hoverlabel_defaults\");e.exports=function(t,e,r,i){function l(r,o){return n.coerce(t,e,a,r,o)}o(t,e,l,i.hoverlabel)}},{\"../../lib\":136,\"./attributes\":58,\"./hoverlabel_defaults\":65}],63:[function(t,e,r){\"use strict\";function n(t,e){return function(r){var n=t(r),a=e(r);return Math.sqrt(n*n+a*a)}}var a=t(\"./constants\");r.getSubplot=function(t){return t.subplot||t.xaxis+t.yaxis||t.geo},r.flat=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=e;return r},r.p2c=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=t[n].p2c(e);return r},r.getDistanceFunction=function(t,e,r,a){return\"closest\"===t?a||n(e,r):\"x\"===t?e:r},r.getClosest=function(t,e,r){if(r.index!==!1)r.index>=0&&r.index<t.length?r.distance=0:r.index=!1;else for(var n=0;n<t.length;n++){var a=e(t[n]);a<=r.distance&&(r.index=n,r.distance=a)}return r},r.inbox=function(t,e){return t*e<0||0===t?a.MAXDIST*(.6-.3/Math.max(3,Math.abs(t-e))):1/0}},{\"./constants\":61}],64:[function(t,e,r){\"use strict\";function n(t,e,r){if(\"pie\"===r||\"sankey\"===r)return void t.emit(\"plotly_hover\",{event:e.originalEvent,points:[e]});r||(r=\"xy\");var n=Array.isArray(r)?r:[r],d=t._fullLayout,g=d._plots||[],m=g[r];if(m){var M=m.overlays.map(function(t){return t.id});n=n.concat(M)}for(var A=n.length,T=new Array(A),L=new Array(A),C=0;C<A;C++){var S=n[C],z=g[S];if(z)T[C]=b.getFromId(t,z.xaxis._id),L[C]=b.getFromId(t,z.yaxis._id);else{var O=d[S]._subplot;T[C]=O.xaxis,L[C]=O.yaxis}}var D=e.hovermode||d.hovermode;if([\"x\",\"y\",\"closest\"].indexOf(D)===-1||!t.calcdata||t.querySelector(\".zoombox\")||t._dragging)return x.unhoverRaw(t,e);var P,E,N,I,R,F,j,B,q,H,V,U,X,G=[],Y=[];if(Array.isArray(e))for(D=\"array\",N=0;N<e.length;N++)R=t.calcdata[e[N].curveNumber||0],\"skip\"!==R[0].trace.hoverinfo&&Y.push(R);else{for(I=0;I<t.calcdata.length;I++)R=t.calcdata[I],F=R[0].trace,\"skip\"!==F.hoverinfo&&n.indexOf(w.getSubplot(F))!==-1&&Y.push(R);var Z,W,$=!e.target;if($)Z=\"xpx\"in e?e.xpx:T[0]._length/2,W=\"ypx\"in e?e.ypx:L[0]._length/2;else{if(p.triggerHandler(t,\"plotly_beforehover\",e)===!1)return;var Q=e.target.getBoundingClientRect();if(Z=e.clientX-Q.left,W=e.clientY-Q.top,Z<0||Z>Q.width||W<0||W>Q.height)return x.unhoverRaw(t,e)}if(P=\"xval\"in e?w.flat(n,e.xval):w.p2c(T,Z),E=\"yval\"in e?w.flat(n,e.yval):w.p2c(L,W),!f(P[0])||!f(E[0]))return h.warn(\"Fx.hover failed\",e,t),x.unhoverRaw(t,e)}var J=1/0;for(I=0;I<Y.length;I++)if((R=Y[I])&&R[0]&&R[0].trace&&R[0].trace.visible===!0&&(F=R[0].trace,[\"carpet\",\"contourcarpet\"].indexOf(F._module.name)===-1)){if(j=w.getSubplot(F),B=n.indexOf(j),q=D,U={cd:R,trace:F,xa:T[B],ya:L[B],name:t.data.length>1||F.hoverinfo.indexOf(\"name\")!==-1?F.name:void 0,index:!1,distance:Math.min(J,k.MAXDIST),color:y.defaultLine,x0:void 0,x1:void 0,y0:void 0,y1:void 0,xLabelVal:void 0,yLabelVal:void 0,zLabelVal:void 0,text:void 0},d[j]&&(U.subplot=d[j]._subplot),X=G.length,\"array\"===q){var K=e[I];\"pointNumber\"in K?(U.index=K.pointNumber,q=\"closest\"):(q=\"\",\"xval\"in K&&(H=K.xval,q=\"x\"),\"yval\"in K&&(V=K.yval,q=q?\"closest\":\"y\"))}else H=P[B],V=E[B];if(F._module&&F._module.hoverPoints){var tt=F._module.hoverPoints(U,H,V,q);if(tt)for(var et,rt=0;rt<tt.length;rt++)et=tt[rt],f(et.x0)&&f(et.y0)&&G.push(l(et,D))}else h.log(\"Unrecognized trace type in hover:\",F);\"closest\"===D&&G.length>X&&(G.splice(0,X),J=G[0].distance)}if(0===G.length)return x.unhoverRaw(t,e);G.sort(function(t,e){return t.distance-e.distance});var nt=t._hoverdata,at=[];for(N=0;N<G.length;N++){var ot=G[N],it={data:ot.trace._input,fullData:ot.trace,curveNumber:ot.trace.index,pointNumber:ot.index};ot.trace._module.eventData?it=ot.trace._module.eventData(it,ot):(it.x=ot.xVal,it.y=ot.yVal,it.xaxis=ot.xa,it.yaxis=ot.ya,void 0!==ot.zLabelVal&&(it.z=ot.zLabelVal)),at.push(it)}if(t._hoverdata=at,c(t,e,nt)&&d._hasCartesian){s(G,{hovermode:D,fullLayout:d,container:d._hoverlayer,outerContainer:d._paperdiv})}var lt=\"y\"===D&&Y.length>1,st=y.combine(d.plot_bgcolor||y.background,d.paper_bgcolor),ct={hovermode:D,rotateLabels:lt,bgColor:st,container:d._hoverlayer,outerContainer:d._paperdiv,commonLabelOpts:d.hoverlabel},ut=a(G,ct);if(o(G,lt?\"xa\":\"ya\"),i(ut,lt),e.target&&e.target.tagName){var ft=_.getComponentMethod(\"annotations\",\"hasClickToShow\")(t,at);v(u.select(e.target),ft?\"pointer\":\"\")}e.target&&c(t,e,nt)&&(nt&&t.emit(\"plotly_unhover\",{event:e,points:nt}),t.emit(\"plotly_hover\",{event:e,points:t._hoverdata,xaxes:T,yaxes:L,xvals:P,yvals:E}))}function a(t,e){var r,n,a=e.hovermode,o=e.rotateLabels,i=e.bgColor,l=e.container,s=e.outerContainer,c=e.commonLabelOpts||{},f=e.fontFamily||k.HOVERFONT,d=e.fontSize||k.HOVERFONTSIZE,h=t[0],p=h.xa,v=h.ya,x=\"y\"===a?\"yLabel\":\"xLabel\",b=h[x],_=(String(b)||\"\").split(\" \")[0],w=s.node().getBoundingClientRect(),A=w.top,T=w.width,L=w.height,C=h.distance<=k.MAXDIST&&(\"x\"===a||\"y\"===a);for(r=0;r<t.length;r++){n=t[r].trace.hoverinfo;var O=n.split(\"+\");if(O.indexOf(\"all\")===-1&&O.indexOf(a)===-1){C=!1;break}}var D=l.selectAll(\"g.axistext\").data(C?[0]:[]);D.enter().append(\"g\").classed(\"axistext\",!0),D.exit().remove(),D.each(function(){var e=u.select(this),r=e.selectAll(\"path\").data([0]),n=e.selectAll(\"text\").data([0]);r.enter().append(\"path\").style({fill:c.bgcolor||y.defaultLine,stroke:c.bordercolor||y.background,\"stroke-width\":\"1px\"}),n.enter().append(\"text\").call(m.font,c.font.family||f,c.font.size||d,c.font.color||y.background).attr(\"data-notex\",1),n.text(b).call(g.convertToTspans).call(m.setPosition,0,0).selectAll(\"tspan.line\").call(m.setPosition,0,0),e.attr(\"transform\",\"\");var o=n.node().getBoundingClientRect();if(\"x\"===a){n.attr(\"text-anchor\",\"middle\").call(m.setPosition,0,\"top\"===p.side?A-o.bottom-S-z:A-o.top+S+z).selectAll(\"tspan.line\").attr({x:n.attr(\"x\"),y:n.attr(\"y\")});var i=\"top\"===p.side?\"-\":\"\";r.attr(\"d\",\"M0,0L\"+S+\",\"+i+S+\"H\"+(z+o.width/2)+\"v\"+i+(2*z+o.height)+\"H-\"+(z+o.width/2)+\"V\"+i+S+\"H-\"+S+\"Z\"),e.attr(\"transform\",\"translate(\"+(p._offset+(h.x0+h.x1)/2)+\",\"+(v._offset+(\"top\"===p.side?0:v._length))+\")\")}else{n.attr(\"text-anchor\",\"right\"===v.side?\"start\":\"end\").call(m.setPosition,(\"right\"===v.side?1:-1)*(z+S),A-o.top-o.height/2).selectAll(\"tspan.line\").attr({x:n.attr(\"x\"),y:n.attr(\"y\")});var l=\"right\"===v.side?\"\":\"-\";r.attr(\"d\",\"M0,0L\"+l+S+\",\"+S+\"V\"+(z+o.height/2)+\"h\"+l+(2*z+o.width)+\"V-\"+(z+o.height/2)+\"H\"+l+S+\"V-\"+S+\"Z\"),e.attr(\"transform\",\"translate(\"+(p._offset+(\"right\"===v.side?p._length:0))+\",\"+(v._offset+(h.y0+h.y1)/2)+\")\")}t=t.filter(function(t){return void 0!==t.zLabelVal||(t[x]||\"\").split(\" \")[0]===_})});var P=l.selectAll(\"g.hovertext\").data(t,function(t){return[t.trace.index,t.index,t.x0,t.y0,t.name,t.attr,t.xa,t.ya||\"\"].join(\",\")});return P.enter().append(\"g\").classed(\"hovertext\",!0).each(function(){var t=u.select(this);t.append(\"rect\").call(y.fill,y.addOpacity(i,.8)),t.append(\"text\").classed(\"name\",!0),t.append(\"path\").style(\"stroke-width\",\"1px\"),t.append(\"text\").classed(\"nums\",!0).call(m.font,f,d)}),P.exit().remove(),P.each(function(t){var e=u.select(this).attr(\"transform\",\"\"),r=\"\",n=\"\",l=y.opacity(t.color)?t.color:y.defaultLine,s=y.combine(l,i),c=t.borderColor||y.contrast(s);void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(r=g.plainText(t.name||\"\"),r.length>15&&(r=r.substr(0,12)+\"...\")),void 0!==t.extraText&&(n+=t.extraText),void 0!==t.zLabel?(void 0!==t.xLabel&&(n+=\"x: \"+t.xLabel+\"<br>\"),void 0!==t.yLabel&&(n+=\"y: \"+t.yLabel+\"<br>\"),n+=(n?\"z: \":\"\")+t.zLabel):C&&t[a+\"Label\"]===b?n=t[(\"x\"===a?\"y\":\"x\")+\"Label\"]||\"\":void 0===t.xLabel?void 0!==t.yLabel&&(n=t.yLabel):n=void 0===t.yLabel?t.xLabel:\"(\"+t.xLabel+\", \"+t.yLabel+\")\",t.text&&!Array.isArray(t.text)&&(n+=(n?\"<br>\":\"\")+t.text),\"\"===n&&(\"\"===r&&e.remove(),n=r);var h=e.select(\"text.nums\").call(m.font,t.fontFamily||f,t.fontSize||d,t.fontColor||c).call(m.setPosition,0,0).text(n).attr(\"data-notex\",1).call(g.convertToTspans);h.selectAll(\"tspan.line\").call(m.setPosition,0,0);var p=e.select(\"text.name\"),v=0;r&&r!==n?(p.call(m.font,t.fontFamily||f,t.fontSize||d,s).text(r).call(m.setPosition,0,0).attr(\"data-notex\",1).call(g.convertToTspans),p.selectAll(\"tspan.line\").call(m.setPosition,0,0),v=p.node().getBoundingClientRect().width+2*z):(p.remove(),e.select(\"rect\").remove()),e.select(\"path\").style({fill:s,stroke:c});var x,_,w=h.node().getBoundingClientRect(),k=t.xa._offset+(t.x0+t.x1)/2,O=t.ya._offset+(t.y0+t.y1)/2,D=Math.abs(t.x1-t.x0),P=Math.abs(t.y1-t.y0),E=w.width+S+z+v;t.ty0=A-w.top,t.bx=w.width+2*z,t.by=w.height+2*z,t.anchor=\"start\",t.txwidth=w.width,t.tx2width=v,t.offset=0,o?(t.pos=k,x=O+P/2+E<=L,_=O-P/2-E>=0,\"top\"!==t.idealAlign&&x||!_?x?(O+=P/2,t.anchor=\"start\"):t.anchor=\"middle\":(O-=P/2,t.anchor=\"end\")):(t.pos=O,x=k+D/2+E<=T,_=k-D/2-E>=0,\"left\"!==t.idealAlign&&x||!_?x?(k+=D/2,t.anchor=\"start\"):t.anchor=\"middle\":(k-=D/2,t.anchor=\"end\")),h.attr(\"text-anchor\",t.anchor),v&&p.attr(\"text-anchor\",t.anchor),e.attr(\"transform\",\"translate(\"+k+\",\"+O+\")\"+(o?\"rotate(\"+M+\")\":\"\"))}),P}function o(t,e){function r(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;n=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;n=!1}if(n){var c=0;for(i=0;i<t.length;i++)s=t[i],s.pos+s.dp+s.size>e.pmax&&c++;for(i=t.length-1;i>=0&&!(c<=0);i--)s=t[i],s.pos>e.pmax-1&&(s.del=!0,c--);for(i=0;i<t.length&&!(c<=0);i++)if(s=t[i],s.pos<e.pmin+1)for(s.del=!0,c--,o=2*s.size,l=t.length-1;l>=0;l--)t[l].dp-=o;for(i=t.length-1;i>=0&&!(c<=0);i--)s=t[i],s.pos+s.dp+s.size>e.pmax&&(s.del=!0,c--)}}}for(var n,a,o,i,l,s,c,u=0,f=t.map(function(t,r){var n=t[e];return[{i:r,dp:0,pos:t.pos,posref:t.posref,size:t.by*(\"x\"===n._id.charAt(0)?T:1)/2,pmin:n._offset,pmax:n._offset+n._length}]}).sort(function(t,e){return t[0].posref-e[0].posref});!n&&u<=t.length;){for(u++,n=!0,i=0;i<f.length-1;){var d=f[i],h=f[i+1],p=d[d.length-1],g=h[0];if((a=p.pos+p.dp+p.size-g.pos-g.dp+g.size)>.01&&p.pmin===g.pmin&&p.pmax===g.pmax){for(l=h.length-1;l>=0;l--)h[l].dp+=a;for(d.push.apply(d,h),f.splice(i+1,1),c=0,l=d.length-1;l>=0;l--)c+=d[l].dp;for(o=c/d.length,l=d.length-1;l>=0;l--)d[l].dp-=o;n=!1}else i++}f.forEach(r)}for(i=f.length-1;i>=0;i--){var v=f[i];for(l=v.length-1;l>=0;l--){var m=v[l],y=t[m.i];y.offset=m.dp,y.del=m.del}}}function i(t,e){t.each(function(t){var r=u.select(this);if(t.del)return void r.remove();var n=\"end\"===t.anchor?-1:1,a=r.select(\"text.nums\"),o={start:1,end:-1,middle:0}[t.anchor],i=o*(S+z),l=i+o*(t.txwidth+z),s=0,c=t.offset;\"middle\"===t.anchor&&(i-=t.tx2width/2,l-=t.tx2width/2),e&&(c*=-C,s=t.offset*L),r.select(\"path\").attr(\"d\",\"middle\"===t.anchor?\"M-\"+t.bx/2+\",-\"+t.by/2+\"h\"+t.bx+\"v\"+t.by+\"h-\"+t.bx+\"Z\":\"M0,0L\"+(n*S+s)+\",\"+(S+c)+\"v\"+(t.by/2-S)+\"h\"+n*t.bx+\"v-\"+t.by+\"H\"+(n*S+s)+\"V\"+(c-S)+\"Z\"),a.call(m.setPosition,i+s,c+t.ty0-t.by/2+z).selectAll(\"tspan.line\").attr({x:a.attr(\"x\"),y:a.attr(\"y\")}),t.tx2width&&(r.select(\"text.name, text.name tspan.line\").call(m.setPosition,l+o*z+s,c+t.ty0-t.by/2+z),r.select(\"rect\").call(m.setRect,l+(o-1)*t.tx2width/2+s,c-t.by/2-1,t.tx2width,t.by+2))})}function l(t,e){function r(e,r,i){var l;if(o[r])l=o[r];else if(a[r]){var s=a[r];Array.isArray(s)&&Array.isArray(s[t.index[0]])&&(l=s[t.index[0]][t.index[1]])}else l=h.nestedProperty(n,i).get();l&&(t[e]=l)}var n=t.trace||{},a=t.cd[0],o=t.cd[t.index]||{};t.posref=\"y\"===e?(t.x0+t.x1)/2:(t.y0+t.y1)/2,t.x0=h.constrain(t.x0,0,t.xa._length),t.x1=h.constrain(t.x1,0,t.xa._length),t.y0=h.constrain(t.y0,0,t.ya._length),t.y1=h.constrain(t.y1,0,t.ya._length);var i;if(void 0!==t.xLabelVal){i=\"log\"===t.xa.type&&t.xLabelVal<=0;var l=b.tickText(t.xa,t.xa.c2l(i?-t.xLabelVal:t.xLabelVal),\"hover\");i?0===t.xLabelVal?t.xLabel=\"0\":t.xLabel=\"-\"+l.text:t.xLabel=l.text,t.xVal=t.xa.c2d(t.xLabelVal)}if(void 0!==t.yLabelVal){i=\"log\"===t.ya.type&&t.yLabelVal<=0;var s=b.tickText(t.ya,t.ya.c2l(i?-t.yLabelVal:t.yLabelVal),\"hover\");i?0===t.yLabelVal?t.yLabel=\"0\":t.yLabel=\"-\"+s.text:t.yLabel=s.text,t.yVal=t.ya.c2d(t.yLabelVal)}if(void 0!==t.zLabelVal&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||\"log\"===t.xa.type&&t.xerr<=0)){var c=b.tickText(t.xa,t.xa.c2l(t.xerr),\"hover\").text;void 0!==t.xerrneg?t.xLabel+=\" +\"+c+\" / -\"+b.tickText(t.xa,t.xa.c2l(t.xerrneg),\"hover\").text:t.xLabel+=\" \\xb1 \"+c,\"x\"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||\"log\"===t.ya.type&&t.yerr<=0)){var u=b.tickText(t.ya,t.ya.c2l(t.yerr),\"hover\").text;void 0!==t.yerrneg?t.yLabel+=\" +\"+u+\" / -\"+b.tickText(t.ya,t.ya.c2l(t.yerrneg),\"hover\").text:t.yLabel+=\" \\xb1 \"+u,\"y\"===e&&(t.distance+=1)}var f=t.trace.hoverinfo;return\"all\"!==f&&(f=f.split(\"+\"),f.indexOf(\"x\")===-1&&(t.xLabel=void 0),f.indexOf(\"y\")===-1&&(t.yLabel=void 0),f.indexOf(\"z\")===-1&&(t.zLabel=void 0),f.indexOf(\"text\")===-1&&(t.text=void 0),f.indexOf(\"name\")===-1&&(t.name=void 0)),r(\"color\",\"hbg\",\"hoverlabel.bgcolor\"),r(\"borderColor\",\"hbc\",\"hoverlabel.bordercolor\"),r(\"fontFamily\",\"htf\",\"hoverlabel.font.family\"),r(\"fontSize\",\"hts\",\"hoverlabel.font.size\"),r(\"fontColor\",\"htc\",\"hoverlabel.font.color\"),t}function s(t,e){var r=e.hovermode,n=e.container,a=t[0],o=a.xa,i=a.ya,l=o.showspikes,s=i.showspikes;if(n.selectAll(\".spikeline\").remove(),\"closest\"===r&&(l||s)){var c=e.fullLayout,u=o._offset+(a.x0+a.x1)/2,f=i._offset+(a.y0+a.y1)/2,h=y.combine(c.plot_bgcolor,c.paper_bgcolor),p=d.readability(a.color,h)<1.5?y.contrast(h):a.color;if(s){var g=i.spikemode,v=i.spikethickness,x=i.spikecolor||p,b=i._boundingBox,_=(b.left+b.right)/2<u?b.right:b.left;if(g.indexOf(\"toaxis\")!==-1||g.indexOf(\"across\")!==-1){var w=_,k=u;g.indexOf(\"across\")!==-1&&(w=i._counterSpan[0],k=i._counterSpan[1]),n.append(\"line\").attr({x1:w,x2:k,y1:f,y2:f,\"stroke-width\":v+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0),n.append(\"line\").attr({x1:w,x2:k,y1:f,y2:f,\"stroke-width\":v,stroke:x,\"stroke-dasharray\":m.dashStyle(i.spikedash,v)}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}g.indexOf(\"marker\")!==-1&&n.append(\"circle\").attr({cx:_+(\"right\"!==i.side?v:-v),cy:f,r:v,fill:x}).classed(\"spikeline\",!0)}if(l){var M=o.spikemode,A=o.spikethickness,T=o.spikecolor||p,L=o._boundingBox,C=(L.top+L.bottom)/2<f?L.bottom:L.top;if(M.indexOf(\"toaxis\")!==-1||M.indexOf(\"across\")!==-1){var S=C,z=f;M.indexOf(\"across\")!==-1&&(S=o._counterSpan[0],z=o._counterSpan[1]),n.append(\"line\").attr({x1:u,x2:u,y1:S,y2:z,\"stroke-width\":A+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0),n.append(\"line\").attr({x1:u,x2:u,y1:S,y2:z,\"stroke-width\":A,stroke:T,\"stroke-dasharray\":m.dashStyle(o.spikedash,A)}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}M.indexOf(\"marker\")!==-1&&n.append(\"circle\").attr({cx:u,cy:C-(\"top\"!==o.side?A:-A),r:A,fill:T}).classed(\"spikeline\",!0)}}}function c(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var a=r[n],o=t._hoverdata[n];if(a.curveNumber!==o.curveNumber||String(a.pointNumber)!==String(o.pointNumber))return!0}return!1}var u=t(\"d3\"),f=t(\"fast-isnumeric\"),d=t(\"tinycolor2\"),h=t(\"../../lib\"),p=t(\"../../lib/events\"),g=t(\"../../lib/svg_text_utils\"),v=t(\"../../lib/override_cursor\"),m=t(\"../drawing\"),y=t(\"../color\"),x=t(\"../dragelement\"),b=t(\"../../plots/cartesian/axes\"),_=t(\"../../registry\"),w=t(\"./helpers\"),k=t(\"./constants\"),M=k.YANGLE,A=Math.PI*M/180,T=1/Math.sin(A),L=Math.cos(A),C=Math.sin(A),S=k.HOVERARROWSIZE,z=k.HOVERTEXTPAD;r.hover=function(t,e,r){if(\"string\"==typeof t&&(t=document.getElementById(t)),void 0===t._lastHoverTime&&(t._lastHoverTime=0),void 0!==t._hoverTimer&&(clearTimeout(t._hoverTimer),t._hoverTimer=void 0),Date.now()>t._lastHoverTime+k.HOVERMINTIME)return n(t,e,r),void(t._lastHoverTime=Date.now());t._hoverTimer=setTimeout(function(){n(t,e,r),t._lastHoverTime=Date.now(),t._hoverTimer=void 0},k.HOVERMINTIME)},r.loneHover=function(t,e){var r={color:t.color||y.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,trace:{index:0,hoverinfo:\"\"},xa:{_offset:0},ya:{_offset:0},index:0},n=u.select(e.container),o=e.outerContainer?u.select(e.outerContainer):n,l={hovermode:\"closest\",rotateLabels:!1,bgColor:e.bgColor||y.background,container:n,outerContainer:o},s=a([r],l);return i(s,l.rotateLabels),s.node()}},{\"../../lib\":136,\"../../lib/events\":131,\"../../lib/override_cursor\":145,\"../../lib/svg_text_utils\":153,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":61,\"./helpers\":63,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],65:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e,r,a){a=a||{},r(\"hoverlabel.bgcolor\",a.bgcolor),r(\"hoverlabel.bordercolor\",a.bordercolor),n.coerceFont(r,\"hoverlabel.font\",a.font)}},{\"../../lib\":136}],66:[function(t,e,r){\"use strict\";function n(t){var e=i.isD3Selection(t)?t:o.select(t);e.selectAll(\"g.hovertext\").remove(),e.selectAll(\".spikeline\").remove()}function a(t,e,r){var n=t.hoverlabel||{},a=i.nestedProperty(n,r).get();return Array.isArray(a)?Array.isArray(e)&&Array.isArray(a[e[0]])?a[e[0]][e[1]]:a[e]:a}var o=t(\"d3\"),i=t(\"../../lib\"),l=t(\"../dragelement\"),s=t(\"./helpers\"),c=t(\"./layout_attributes\");e.exports={moduleType:\"component\",name:\"fx\",constants:t(\"./constants\"),schema:{layout:c},attributes:t(\"./attributes\"),layoutAttributes:c,supplyLayoutGlobalDefaults:t(\"./layout_global_defaults\"),supplyDefaults:t(\"./defaults\"),supplyLayoutDefaults:t(\"./layout_defaults\"),calc:t(\"./calc\"),getDistanceFunction:s.getDistanceFunction,getClosest:s.getClosest,inbox:s.inbox,castHoverOption:a,hover:t(\"./hover\").hover,unhover:l.unhover,loneHover:t(\"./hover\").loneHover,loneUnhover:n,click:t(\"./click\")}},{\"../../lib\":136,\"../dragelement\":46,\"./attributes\":58,\"./calc\":59,\"./click\":60,\"./constants\":61,\"./defaults\":62,\"./helpers\":63,\"./hover\":64,\"./layout_attributes\":67,\"./layout_defaults\":68,\"./layout_global_defaults\":69,d3:7}],67:[function(t,e,r){\"use strict\";var n=t(\"../../lib/extend\").extendFlat,a=t(\"../../plots/font_attributes\"),o=t(\"./constants\");e.exports={dragmode:{valType:\"enumerated\",values:[\"zoom\",\"pan\",\"select\",\"lasso\",\"orbit\",\"turntable\"],dflt:\"zoom\"},hovermode:{valType:\"enumerated\",values:[\"x\",\"y\",\"closest\",!1]},hoverlabel:{bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\"},font:{family:n({},a.family,{dflt:o.HOVERFONT}),size:n({},a.size,{dflt:o.HOVERFONTSIZE}),color:n({},a.color)}}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"./constants\":61}],68:[function(t,e,r){\"use strict\";function n(t){for(var e=!0,r=0;r<t.length;r++){if(\"h\"!==t[r].orientation){e=!1;break}}return e}var a=t(\"../../lib\"),o=t(\"./layout_attributes\");e.exports=function(t,e,r){function i(r,n){return a.coerce(t,e,o,r,n)}i(\"dragmode\");var l;e._has(\"cartesian\")?(e._isHoriz=n(r),l=e._isHoriz?\"y\":\"x\"):l=\"closest\",i(\"hovermode\",l)}},{\"../../lib\":136,\"./layout_attributes\":67}],69:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./hoverlabel_defaults\"),o=t(\"./layout_attributes\");e.exports=function(t,e){function r(r,a){return n.coerce(t,e,o,r,a)}a(t,e,r)}},{\"../../lib\":136,\"./hoverlabel_defaults\":65,\"./layout_attributes\":67}],70:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/constants\");e.exports={_isLinkedToArray:\"image\",visible:{valType:\"boolean\",dflt:!0},source:{valType:\"string\"},layer:{valType:\"enumerated\",values:[\"below\",\"above\"],dflt:\"above\"},sizex:{valType:\"number\",dflt:0},sizey:{valType:\"number\",dflt:0},sizing:{valType:\"enumerated\",values:[\"fill\",\"contain\",\"stretch\"],dflt:\"contain\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},x:{valType:\"any\",dflt:0},y:{valType:\"any\",dflt:0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"top\"},xref:{valType:\"enumerated\",values:[\"paper\",n.idRegex.x.toString()],dflt:\"paper\"},yref:{valType:\"enumerated\",values:[\"paper\",n.idRegex.y.toString()],dflt:\"paper\"}}},{\"../../plots/cartesian/constants\":176}],71:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib/to_log_range\");e.exports=function(t,e,r,o){e=e||{};var i=\"log\"===r&&\"linear\"===e.type,l=\"linear\"===r&&\"log\"===e.type;if(i||l)for(var s,c,u=t._fullLayout.images,f=e._id.charAt(0),d=0;d<u.length;d++)if(s=u[d],c=\"images[\"+d+\"].\",s[f+\"ref\"]===e._id){var h=s[f],p=s[\"size\"+f],g=null,v=null;if(i){g=a(h,e.range);var m=p/Math.pow(10,g)/2;v=2*Math.log(m+Math.sqrt(1+m*m))/Math.LN10}else g=Math.pow(10,h),v=g*(Math.pow(10,p/2)-Math.pow(10,-p/2));n(g)?n(v)||(v=null):(g=null,v=null),o(c+f,g),o(c+\"size\"+f,v)}}},{\"../../lib/to_log_range\":154,\"fast-isnumeric\":10}],72:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return a.coerce(t,e,l,r,n)}if(!n(\"visible\",!!n(\"source\")))return e;n(\"layer\"),n(\"xanchor\"),n(\"yanchor\"),n(\"sizex\"),n(\"sizey\"),n(\"sizing\"),n(\"opacity\");for(var i={_fullLayout:r},s=[\"x\",\"y\"],c=0;c<2;c++){var u=s[c],f=o.coerceRef(t,e,i,u,\"paper\");o.coercePosition(e,i,n,f,u,0)}return e}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\");e.exports=function(t,e){i(t,e,{name:\"images\",handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"../../plots/cartesian/axes\":171,\"./attributes\":70}],73:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../drawing\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"../../constants/xmlns_namespaces\");e.exports=function(t){function e(e){var r=n.select(this);if(!this.img||this.img.src!==e.source){r.attr(\"xmlns\",i.svg);var a=new Promise(function(t){function n(){r.remove(),t()}var a=new Image;this.img=a,a.setAttribute(\"crossOrigin\",\"anonymous\"),a.onerror=n,a.onload=function(){var e=document.createElement(\"canvas\");e.width=this.width,e.height=this.height,e.getContext(\"2d\").drawImage(this,0,0);var n=e.toDataURL(\"image/png\");r.attr(\"xlink:href\",n),t()},r.on(\"error\",n),a.src=e.source}.bind(this));t._promises.push(a)}}function r(e){var r=n.select(this),i=o.getFromId(t,e.xref),l=o.getFromId(t,e.yref),s=c._size,u=i?Math.abs(i.l2p(e.sizex)-i.l2p(0)):e.sizex*s.w,f=l?Math.abs(l.l2p(e.sizey)-l.l2p(0)):e.sizey*s.h,d=u*g.x[e.xanchor].offset,h=f*g.y[e.yanchor].offset,p=g.x[e.xanchor].sizing+g.y[e.yanchor].sizing,v=(i?i.r2p(e.x)+i._offset:e.x*s.w+s.l)+d,m=(l?l.r2p(e.y)+l._offset:s.h-e.y*s.h+s.t)+h;switch(e.sizing){case\"fill\":p+=\" slice\";break;case\"stretch\":p=\"none\"}r.attr({x:v,y:m,width:u,height:f,preserveAspectRatio:p,opacity:e.opacity});var y=i?i._id:\"\",x=l?l._id:\"\",b=y+x;r.call(a.setClipUrl,b?\"clip\"+c._uid+b:null)}var l,s,c=t._fullLayout,u=[],f={},d=[];for(s=0;s<c.images.length;s++){var h=c.images[s];if(h.visible)if(\"below\"===h.layer&&\"paper\"!==h.xref&&\"paper\"!==h.yref){l=h.xref+h.yref;var p=c._plots[l];if(!p){d.push(h);continue}p.mainplot&&(l=p.mainplot.id),f[l]||(f[l]=[]),f[l].push(h)}else\"above\"===h.layer?u.push(h):d.push(h)}var g={x:{left:{sizing:\"xMin\",offset:0},center:{sizing:\"xMid\",offset:-.5},right:{sizing:\"xMax\",offset:-1}},y:{top:{sizing:\"YMin\",offset:0},middle:{sizing:\"YMid\",offset:-.5},bottom:{sizing:\"YMax\",offset:-1}}},v=c._imageLowerLayer.selectAll(\"image\").data(d),m=c._imageUpperLayer.selectAll(\"image\").data(u);v.enter().append(\"image\"),m.enter().append(\"image\"),v.exit().remove(),m.exit().remove(),v.each(function(t){e.bind(this)(t),r.bind(this)(t)}),m.each(function(t){e.bind(this)(t),r.bind(this)(t)});var y=Object.keys(c._plots);for(s=0;s<y.length;s++){l=y[s];var x=c._plots[l];if(x.imagelayer){var b=x.imagelayer.selectAll(\"image\").data(f[l]||[]);b.enter().append(\"image\"),b.exit().remove(),b.each(function(t){e.bind(this)(t),r.bind(this)(t)})}}}},{\"../../constants/xmlns_namespaces\":124,\"../../plots/cartesian/axes\":171,\"../drawing\":49,d3:7}],74:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"images\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\"),convertCoords:t(\"./convert_coords\")}},{\"./attributes\":70,\"./convert_coords\":71,\"./defaults\":72,\"./draw\":73}],75:[function(t,e,r){\"use strict\";r.isRightAnchor=function(t){return\"right\"===t.xanchor||\"auto\"===t.xanchor&&t.x>=2/3},r.isCenterAnchor=function(t){return\"center\"===t.xanchor||\"auto\"===t.xanchor&&t.x>1/3&&t.x<2/3},r.isBottomAnchor=function(t){return\"bottom\"===t.yanchor||\"auto\"===t.yanchor&&t.y<=1/3},r.isMiddleAnchor=function(t){return\"middle\"===t.yanchor||\"auto\"===t.yanchor&&t.y>1/3&&t.y<2/3}},{}],76:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat;e.exports={bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.defaultLine},borderwidth:{valType:\"number\",min:0,dflt:0},font:o({},n,{}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"v\"},traceorder:{valType:\"flaglist\",flags:[\"reversed\",\"grouped\"],extras:[\"normal\"]},tracegroupgap:{valType:\"number\",min:0,dflt:10},x:{valType:\"number\",min:-2,max:3,dflt:1.02},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\"}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../color/attributes\":24}],77:[function(t,e,r){\"use strict\";e.exports={scrollBarWidth:4,scrollBarHeight:20,scrollBarColor:\"#808BA4\",scrollBarMargin:4}},{}],78:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../lib\"),o=t(\"./attributes\"),i=t(\"../../plots/layout_attributes\"),l=t(\"./helpers\");e.exports=function(t,e,r){function s(t,e){return a.coerce(h,p,o,t,e)}for(var c,u,f,d,h=t.legend||{},p=e.legend={},g=0,v=\"normal\",m=0;m<r.length;m++){var y=r[m];l.legendGetsTrace(y)&&(g++,n.traceIs(y,\"pie\")&&g++),(n.traceIs(y,\"bar\")&&\"stack\"===e.barmode||[\"tonextx\",\"tonexty\"].indexOf(y.fill)!==-1)&&(v=l.isGrouped({traceorder:v})?\"grouped+reversed\":\"reversed\"),void 0!==y.legendgroup&&\"\"!==y.legendgroup&&(v=l.isReversed({traceorder:v})?\"reversed+grouped\":\"grouped\")}if(a.coerce(t,e,i,\"showlegend\",g>1)!==!1){if(s(\"bgcolor\",e.paper_bgcolor),s(\"bordercolor\"),s(\"borderwidth\"),a.coerceFont(s,\"font\",e.font),s(\"orientation\"),\"h\"===p.orientation){var x=t.xaxis;x&&x.rangeslider&&x.rangeslider.visible?(c=0,f=\"left\",u=1.1,d=\"bottom\"):(c=0,f=\"left\",u=-.1,d=\"top\")}s(\"traceorder\",v),l.isGrouped(e.legend)&&s(\"tracegroupgap\"),s(\"x\",c),s(\"xanchor\",f),s(\"y\",u),s(\"yanchor\",d),a.noneOrAll(h,p,[\"x\",\"y\"])}}},{\"../../lib\":136,\"../../plots/layout_attributes\":197,\"../../registry\":206,\"./attributes\":76,\"./helpers\":81}],79:[function(t,e,r){\"use strict\";function n(t,e){function r(r){y.convertToTspans(r,function(){r.selectAll(\"tspan.line\").attr({x:r.attr(\"x\")}),t.call(i,e)})}var n=t.data()[0][0],a=e._fullLayout,o=n.trace,l=p.traceIs(o,\"pie\"),s=o.index,c=l?n.label:o.name,u=t.selectAll(\"text.legendtext\").data([0]);u.enter().append(\"text\").classed(\"legendtext\",!0),u.attr({x:40,y:0,\"data-unformatted\":c}).style(\"text-anchor\",\"start\").classed(\"user-select-none\",!0).call(v.font,a.legend.font).text(c),e._context.editable&&!l?u.call(y.makeEditable).call(r).on(\"edit\",function(t){this.attr({\"data-unformatted\":t}),this.text(t).call(r),this.text()||(t=\" \");var a,o=n.trace._fullInput||{};if([\"ohlc\",\"candlestick\"].indexOf(o.type)!==-1){var i=n.trace.transforms;a=i[i.length-1].direction+\".name\"}else a=\"name\";f.restyle(e,a,t,s)}):u.call(r)}function a(t,e){var r,n=1,a=t.selectAll(\"rect\").data([0]);a.enter().append(\"rect\").classed(\"legendtoggle\",!0).style(\"cursor\",\"pointer\").attr(\"pointer-events\",\"all\").call(m.fill,\"rgba(0,0,0,0)\"),a.on(\"mousedown\",function(){r=(new Date).getTime(),r-e._legendMouseDownTime<T?n+=1:(n=1,e._legendMouseDownTime=r)}),a.on(\"mouseup\",function(){if(!e._dragged&&!e._editing){var r=e._fullLayout.legend;(new Date).getTime()-e._legendMouseDownTime>T&&(n=Math.max(n-1,1)),1===n?r._clickTimeout=setTimeout(function(){o(t,e,n)},T):2===n&&(r._clickTimeout&&clearTimeout(r._clickTimeout),e._legendMouseDownTime=0,o(t,e,n))}})}function o(t,e,r){if(!e._dragged&&!e._editing){var n,a,o=e._fullLayout.hiddenlabels?e._fullLayout.hiddenlabels.slice():[],i=t.data()[0][0],l=e._fullData,s=i.trace,c=s.legendgroup,u=[];if(1===r&&A&&e.data&&e._context.showTips?(d.notifier(\"Double click on legend to isolate individual trace\",\"long\"),A=!1):A=!1,p.traceIs(s,\"pie\")){var h=i.label,g=o.indexOf(h);1===r?g===-1?o.push(h):o.splice(g,1):2===r&&(o=[],e.calcdata[0].forEach(function(t){h!==t.label&&o.push(t.label)}),e._fullLayout.hiddenlabels&&e._fullLayout.hiddenlabels.length===o.length&&g===-1&&(o=[])),f.relayout(e,\"hiddenlabels\",o)}else{var v,m=[],y=[];for(v=0;v<l.length;v++)m.push(v),y.push(!!p.traceIs(l[v],\"notLegendIsolatable\")||\"legendonly\");if(\"\"===c)u=[s.index],y[s.index]=!0;else for(v=0;v<l.length;v++)n=l[v],n.legendgroup===c&&(u.push(n.index),y[m.indexOf(v)]=!0);if(1===r)a=s.visible!==!0||\"legendonly\",f.restyle(e,\"visible\",a,u);else if(2===r){var x=!0;for(v=0;v<l.length;v++)if(l[v].visible!==y[v]){x=!1;break}x&&(y=!0);var b=[];for(v=0;v<l.length;v++)b.push(m[v]);f.restyle(e,\"visible\",y,b)}}}}function i(t,e){var r,n,a=t.data()[0][0],o=t.select(\"g[class*=math-group]\"),i=e._fullLayout.legend,l=1.3*i.font.size;if(!a.trace.showlegend)return void t.remove();if(o.node()){var s=v.bBox(o.node());r=s.height,n=s.width,v.setTranslate(o,0,r/4)}else{var c=t.selectAll(\".legendtext\"),u=t.selectAll(\".legendtext>tspan\"),f=u[0].length||1;r=l*f,n=c.node()&&v.bBox(c.node()).width;var d=l*(.3+(1-f)/2);c.attr(\"y\",d),u.attr(\"y\",d)}r=Math.max(r,16)+3,a.height=r,a.width=n}function l(t,e,r){var n=t._fullLayout,a=n.legend,o=a.borderwidth,i=k.isGrouped(a);if(k.isVertical(a))i&&e.each(function(t,e){v.setTranslate(this,0,e*a.tracegroupgap)}),a.width=0,a.height=0,r.each(function(t){var e=t[0],r=e.height,n=e.width;v.setTranslate(this,o,5+o+a.height+r/2),a.height+=r,a.width=Math.max(a.width,n)}),a.width+=45+2*o,a.height+=10+2*o,i&&(a.height+=(a._lgroupsLength-1)*a.tracegroupgap),a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,(t._context.editable?0:a.width)+40,r.height)});else if(i){a.width=0,a.height=0;for(var l=[a.width],s=e.data(),c=0,f=s.length;c<f;c++){var d=s[c].map(function(t){return t[0].width}),h=40+Math.max.apply(null,d);a.width+=a.tracegroupgap+h,l.push(a.width)}e.each(function(t,e){v.setTranslate(this,l[e],0)}),e.each(function(){\n",
|
|
"var t=u.select(this),e=t.selectAll(\"g.traces\"),r=0;e.each(function(t){var e=t[0],n=e.height;v.setTranslate(this,0,5+o+r+n/2),r+=n}),a.height=Math.max(a.height,r)}),a.height+=10+2*o,a.width+=2*o,a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,t._context.editable?0:a.width,r.height)})}else{a.width=0,a.height=0;var p=0,g=0,m=0,y=0;r.each(function(t){m=Math.max(40+t[0].width,m)}),r.each(function(t){var e=t[0],r=m,i=a.tracegroupgap||5;o+y+i+r>n.width-(n.margin.r+n.margin.l)&&(y=0,p+=g,a.height=a.height+g,g=0),v.setTranslate(this,o+y,5+o+e.height/2+p),a.width+=i+r,a.height=Math.max(a.height,e.height),y+=i+r,g=Math.max(e.height,g)}),a.width+=2*o,a.height+=10+2*o,a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,t._context.editable?0:a.width,r.height)})}}function s(t){var e=t._fullLayout,r=e.legend,n=\"left\";M.isRightAnchor(r)?n=\"right\":M.isCenterAnchor(r)&&(n=\"center\");var a=\"top\";M.isBottomAnchor(r)?a=\"bottom\":M.isMiddleAnchor(r)&&(a=\"middle\"),h.autoMargin(t,\"legend\",{x:r.x,y:r.y,l:r.width*({right:1,center:.5}[n]||0),r:r.width*({left:1,center:.5}[n]||0),b:r.height*({top:1,middle:.5}[a]||0),t:r.height*({bottom:1,middle:.5}[a]||0)})}function c(t){var e=t._fullLayout,r=e.legend,n=\"left\";M.isRightAnchor(r)?n=\"right\":M.isCenterAnchor(r)&&(n=\"center\"),h.autoMargin(t,\"legend\",{x:r.x,y:.5,l:r.width*({right:1,center:.5}[n]||0),r:r.width*({left:1,center:.5}[n]||0),b:0,t:0})}var u=t(\"d3\"),f=t(\"../../plotly\"),d=t(\"../../lib\"),h=t(\"../../plots/plots\"),p=t(\"../../registry\"),g=t(\"../dragelement\"),v=t(\"../drawing\"),m=t(\"../color\"),y=t(\"../../lib/svg_text_utils\"),x=t(\"./constants\"),b=t(\"../../constants/interactions\"),_=t(\"./get_legend_data\"),w=t(\"./style\"),k=t(\"./helpers\"),M=t(\"./anchor_utils\"),A=!0,T=b.DBLCLICKDELAY;e.exports=function(t){function e(t,e){S.attr(\"data-scroll\",e).call(v.setTranslate,0,e),z.call(v.setRect,j,t,x.scrollBarWidth,x.scrollBarHeight),L.select(\"rect\").attr({y:y.borderwidth-e})}var r=t._fullLayout,i=\"legend\"+r._uid;if(r._infolayer&&t.calcdata){t._legendMouseDownTime||(t._legendMouseDownTime=0);var y=r.legend,b=r.showlegend&&_(t.calcdata,y),k=r.hiddenlabels||[];if(!r.showlegend||!b.length)return r._infolayer.selectAll(\".legend\").remove(),r._topdefs.select(\"#\"+i).remove(),void h.autoMargin(t,\"legend\");var A=r._infolayer.selectAll(\"g.legend\").data([0]);A.enter().append(\"g\").attr({class:\"legend\",\"pointer-events\":\"all\"});var L=r._topdefs.selectAll(\"#\"+i).data([0]);L.enter().append(\"clipPath\").attr(\"id\",i).append(\"rect\");var C=A.selectAll(\"rect.bg\").data([0]);C.enter().append(\"rect\").attr({class:\"bg\",\"shape-rendering\":\"crispEdges\"}),C.call(m.stroke,y.bordercolor),C.call(m.fill,y.bgcolor),C.style(\"stroke-width\",y.borderwidth+\"px\");var S=A.selectAll(\"g.scrollbox\").data([0]);S.enter().append(\"g\").attr(\"class\",\"scrollbox\");var z=A.selectAll(\"rect.scrollbar\").data([0]);z.enter().append(\"rect\").attr({class:\"scrollbar\",rx:20,ry:2,width:0,height:0}).call(m.fill,\"#808BA4\");var O=S.selectAll(\"g.groups\").data(b);O.enter().append(\"g\").attr(\"class\",\"groups\"),O.exit().remove();var D=O.selectAll(\"g.traces\").data(d.identity);D.enter().append(\"g\").attr(\"class\",\"traces\"),D.exit().remove(),D.call(w).style(\"opacity\",function(t){var e=t[0].trace;return p.traceIs(e,\"pie\")?k.indexOf(t[0].label)!==-1?.5:1:\"legendonly\"===e.visible?.5:1}).each(function(){u.select(this).call(n,t).call(a,t)});var P=0!==A.enter().size();P&&(l(t,O,D),s(t));var E=r.width,N=r.height;l(t,O,D),y.height>N?c(t):s(t);var I=r._size,R=I.l+I.w*y.x,F=I.t+I.h*(1-y.y);M.isRightAnchor(y)?R-=y.width:M.isCenterAnchor(y)&&(R-=y.width/2),M.isBottomAnchor(y)?F-=y.height:M.isMiddleAnchor(y)&&(F-=y.height/2);var j=y.width,B=I.w;j>B?(R=I.l,j=B):(R+j>E&&(R=E-j),R<0&&(R=0),j=Math.min(E-R,y.width));var q=y.height,H=I.h;q>H?(F=I.t,q=H):(F+q>N&&(F=N-q),F<0&&(F=0),q=Math.min(N-F,y.height)),v.setTranslate(A,R,F);var V,U,X=q-x.scrollBarHeight-2*x.scrollBarMargin,G=y.height-q;if(y.height<=q||t._context.staticPlot)C.attr({width:j-y.borderwidth,height:q-y.borderwidth,x:y.borderwidth/2,y:y.borderwidth/2}),v.setTranslate(S,0,0),L.select(\"rect\").attr({width:j-2*y.borderwidth,height:q-2*y.borderwidth,x:y.borderwidth,y:y.borderwidth}),S.call(v.setClipUrl,i);else{V=x.scrollBarMargin,U=S.attr(\"data-scroll\")||0,C.attr({width:j-2*y.borderwidth+x.scrollBarWidth+x.scrollBarMargin,height:q-y.borderwidth,x:y.borderwidth/2,y:y.borderwidth/2}),L.select(\"rect\").attr({width:j-2*y.borderwidth+x.scrollBarWidth+x.scrollBarMargin,height:q-2*y.borderwidth,x:y.borderwidth,y:y.borderwidth-U}),S.call(v.setClipUrl,i),P&&e(V,U),A.on(\"wheel\",null),A.on(\"wheel\",function(){U=d.constrain(S.attr(\"data-scroll\")-u.event.deltaY/X*G,-G,0),V=x.scrollBarMargin-U/G*X,e(V,U),0!==U&&U!==-G&&u.event.preventDefault()}),z.on(\".drag\",null),S.on(\".drag\",null);var Y=u.behavior.drag().on(\"drag\",function(){V=d.constrain(u.event.y-x.scrollBarHeight/2,x.scrollBarMargin,x.scrollBarMargin+X),U=-(V-x.scrollBarMargin)/X*G,e(V,U)});z.call(Y),S.call(Y)}if(t._context.editable){var Z,W,$,Q;A.classed(\"cursor-move\",!0),g.init({element:A.node(),prepFn:function(){var t=v.getTranslate(A);$=t.x,Q=t.y},moveFn:function(t,e){var r=$+t,n=Q+e;v.setTranslate(A,r,n),Z=g.align(r,0,I.l,I.l+I.w,y.xanchor),W=g.align(n,0,I.t+I.h,I.t,y.yanchor)},doneFn:function(e,n,a){if(e&&void 0!==Z&&void 0!==W)f.relayout(t,{\"legend.x\":Z,\"legend.y\":W});else{var i=r._infolayer.selectAll(\"g.traces\").filter(function(){var t=this.getBoundingClientRect();return a.clientX>=t.left&&a.clientX<=t.right&&a.clientY>=t.top&&a.clientY<=t.bottom});i.size()>0&&(1===n?A._clickTimeout=setTimeout(function(){o(i,t,n)},T):2===n&&(A._clickTimeout&&clearTimeout(A._clickTimeout),o(i,t,n)))}}})}}}},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/plots\":199,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./anchor_utils\":75,\"./constants\":77,\"./get_legend_data\":80,\"./helpers\":81,\"./style\":83,d3:7}],80:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"./helpers\");e.exports=function(t,e){function r(t,r){if(\"\"!==t&&a.isGrouped(e))s.indexOf(t)===-1?(s.push(t),c=!0,l[t]=[[r]]):l[t].push([r]);else{var n=\"~~i\"+f;s.push(n),l[n]=[[r]],f++}}var o,i,l={},s=[],c=!1,u={},f=0;for(o=0;o<t.length;o++){var d=t[o],h=d[0],p=h.trace,g=p.legendgroup;if(a.legendGetsTrace(p)&&p.showlegend)if(n.traceIs(p,\"pie\"))for(u[g]||(u[g]={}),i=0;i<d.length;i++){var v=d[i].label;u[g][v]||(r(g,{label:v,color:d[i].color,i:d[i].i,trace:p}),u[g][v]=!0)}else r(g,h)}if(!s.length)return[];var m,y,x=s.length;if(c&&a.isGrouped(e))for(y=new Array(x),o=0;o<x;o++)m=l[s[o]],y[o]=a.isReversed(e)?m.reverse():m;else{for(y=[new Array(x)],o=0;o<x;o++)m=l[s[o]][0],y[0][a.isReversed(e)?x-o-1:o]=m;x=1}return e._lgroupsLength=x,y}},{\"../../registry\":206,\"./helpers\":81}],81:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");r.legendGetsTrace=function(t){return t.visible&&n.traceIs(t,\"showLegend\")},r.isGrouped=function(t){return(t.traceorder||\"\").indexOf(\"grouped\")!==-1},r.isVertical=function(t){return\"h\"!==t.orientation},r.isReversed=function(t){return(t.traceorder||\"\").indexOf(\"reversed\")!==-1}},{\"../../registry\":206}],82:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"legend\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\"),style:t(\"./style\")}},{\"./attributes\":76,\"./defaults\":78,\"./draw\":79,\"./style\":83}],83:[function(t,e,r){\"use strict\";function n(t){var e=t[0].trace,r=e.visible&&e.fill&&\"none\"!==e.fill,n=h.hasLines(e);e&&e._module&&\"contourcarpet\"===e._module.name&&(n=e.contours.showlines,r=\"fill\"===e.contours.coloring);var a=s.select(this).select(\".legendfill\").selectAll(\"path\").data(r?[t]:[]);a.enter().append(\"path\").classed(\"js-fill\",!0),a.exit().remove(),a.attr(\"d\",\"M5,0h30v6h-30z\").call(f.fillGroupStyle);var o=s.select(this).select(\".legendlines\").selectAll(\"path\").data(n?[t]:[]);o.enter().append(\"path\").classed(\"js-line\",!0).attr(\"d\",\"M5,0h30\"),o.exit().remove(),o.call(f.lineGroupStyle)}function a(t){function e(t,e,r){var n=u.nestedProperty(i,t).get(),a=Array.isArray(n)&&e?e(n):n;if(r){if(a<r[0])return r[0];if(a>r[1])return r[1]}return a}function r(t){return t[0]}var n,a,o=t[0],i=o.trace,l=h.hasMarkers(i),c=h.hasText(i),d=h.hasLines(i);if(l||c||d){var p={},g={};l&&(p.mc=e(\"marker.color\",r),p.mo=e(\"marker.opacity\",u.mean,[.2,1]),p.ms=e(\"marker.size\",u.mean,[2,16]),p.mlc=e(\"marker.line.color\",r),p.mlw=e(\"marker.line.width\",u.mean,[0,5]),g.marker={sizeref:1,sizemin:1,sizemode:\"diameter\"}),d&&(g.line={width:e(\"line.width\",r,[0,10])}),c&&(p.tx=\"Aa\",p.tp=e(\"textposition\",r),p.ts=10,p.tc=e(\"textfont.color\",r),p.tf=e(\"textfont.family\",r)),n=[u.minExtend(o,p)],a=u.minExtend(i,g)}var v=s.select(this).select(\"g.legendpoints\"),m=v.selectAll(\"path.scatterpts\").data(l?n:[]);m.enter().append(\"path\").classed(\"scatterpts\",!0).attr(\"transform\",\"translate(20,0)\"),m.exit().remove(),m.call(f.pointStyle,a),l&&(n[0].mrc=3);var y=v.selectAll(\"g.pointtext\").data(c?n:[]);y.enter().append(\"g\").classed(\"pointtext\",!0).append(\"text\").attr(\"transform\",\"translate(20,0)\"),y.exit().remove(),y.selectAll(\"text\").call(f.textPointStyle,a)}function o(t){var e=t[0].trace,r=e.marker||{},n=r.line||{},a=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbar\").data(c.traceIs(e,\"bar\")?[t]:[]);a.enter().append(\"path\").classed(\"legendbar\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),a.exit().remove(),a.each(function(t){var e=s.select(this),a=t[0],o=(a.mlw+1||n.width+1)-1;e.style(\"stroke-width\",o+\"px\").call(d.fill,a.mc||r.color),o&&e.call(d.stroke,a.mlc||n.color)})}function i(t){var e=t[0].trace,r=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbox\").data(c.traceIs(e,\"box\")&&e.visible?[t]:[]);r.enter().append(\"path\").classed(\"legendbox\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),r.exit().remove(),r.each(function(){var t=e.line.width,r=s.select(this);r.style(\"stroke-width\",t+\"px\").call(d.fill,e.fillcolor),t&&r.call(d.stroke,e.line.color)})}function l(t){var e=t[0].trace,r=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendpie\").data(c.traceIs(e,\"pie\")&&e.visible?[t]:[]);r.enter().append(\"path\").classed(\"legendpie\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),r.exit().remove(),r.size()&&r.call(p,t[0],e)}var s=t(\"d3\"),c=t(\"../../registry\"),u=t(\"../../lib\"),f=t(\"../drawing\"),d=t(\"../color\"),h=t(\"../../traces/scatter/subtypes\"),p=t(\"../../traces/pie/style_one\");e.exports=function(t){t.each(function(t){var e=s.select(this),r=e.selectAll(\"g.layers\").data([0]);r.enter().append(\"g\").classed(\"layers\",!0),r.style(\"opacity\",t[0].trace.opacity),r.selectAll(\"g.legendfill\").data([t]).enter().append(\"g\").classed(\"legendfill\",!0),r.selectAll(\"g.legendlines\").data([t]).enter().append(\"g\").classed(\"legendlines\",!0);var n=r.selectAll(\"g.legendsymbols\").data([t]);n.enter().append(\"g\").classed(\"legendsymbols\",!0),n.selectAll(\"g.legendpoints\").data([t]).enter().append(\"g\").classed(\"legendpoints\",!0)}).each(o).each(i).each(l).each(n).each(a)}},{\"../../lib\":136,\"../../registry\":206,\"../../traces/pie/style_one\":238,\"../../traces/scatter/subtypes\":260,\"../color\":25,\"../drawing\":49,d3:7}],84:[function(t,e,r){\"use strict\";function n(t,e){var r,n,a=e.currentTarget,o=a.getAttribute(\"data-attr\"),i=a.getAttribute(\"data-val\")||!0,l=t._fullLayout,s={},c=d.list(t,null,!0),f=\"on\";if(\"zoom\"===o){var h,p=\"in\"===i?.5:2,g=(1+p)/2,v=(1-p)/2;for(n=0;n<c.length;n++)if(r=c[n],!r.fixedrange)if(h=r._name,\"auto\"===i)s[h+\".autorange\"]=!0;else if(\"reset\"===i){if(void 0===r._rangeInitial)s[h+\".autorange\"]=!0;else{var m=r._rangeInitial.slice();s[h+\".range[0]\"]=m[0],s[h+\".range[1]\"]=m[1]}void 0!==r._showSpikeInitial&&(s[h+\".showspikes\"]=r._showSpikeInitial,\"on\"!==f||r._showSpikeInitial||(f=\"off\"))}else{var y=[r.r2l(r.range[0]),r.r2l(r.range[1])],x=[g*y[0]+v*y[1],g*y[1]+v*y[0]];s[h+\".range[0]\"]=r.l2r(x[0]),s[h+\".range[1]\"]=r.l2r(x[1])}l._cartesianSpikesEnabled=f}else{if(\"hovermode\"!==o||\"x\"!==i&&\"y\"!==i){if(\"hovermode\"===o&&\"closest\"===i){for(n=0;n<c.length;n++)r=c[n],\"on\"!==f||r.showspikes||(f=\"off\");l._cartesianSpikesEnabled=f}}else i=l._isHoriz?\"y\":\"x\",a.setAttribute(\"data-val\",i),\"closest\"!==i&&(l._cartesianSpikesEnabled=\"off\");s[o]=i}u.relayout(t,s)}function a(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=r.getAttribute(\"data-val\")||!0,o=t._fullLayout,i=f.getSubplotIds(o,\"gl3d\"),l={},s=n.split(\".\"),c=0;c<i.length;c++)l[i[c]+\".\"+s[1]]=a;u.relayout(t,l)}function o(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=t._fullLayout,o=f.getSubplotIds(a,\"gl3d\"),i={},l=0;l<o.length;l++){var s=o[l],c=s+\".camera\",d=a[s]._scene;\"resetDefault\"===n?i[c]=null:\"resetLastSave\"===n&&(i[c]=h.extendDeep({},d.cameraInitial))}u.relayout(t,i)}function i(t,e){var r=e.currentTarget,n=r._previousVal||!1,a=t.layout,o=t._fullLayout,i=f.getSubplotIds(o,\"gl3d\"),l=[\"xaxis\",\"yaxis\",\"zaxis\"],s=[\"showspikes\",\"spikesides\",\"spikethickness\",\"spikecolor\"],c={},d={},p={};if(n)p=h.extendDeep(a,n),r._previousVal=null;else{p={\"allaxes.showspikes\":!1};for(var g=0;g<i.length;g++){var v=i[g],m=o[v],y=c[v]={};y.hovermode=m.hovermode,p[v+\".hovermode\"]=!1;for(var x=0;x<3;x++){var b=l[x];d=y[b]={};for(var _=0;_<s.length;_++){var w=s[_];d[w]=m[b][w]}}}r._previousVal=h.extendDeep({},c)}u.relayout(t,p)}function l(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=r.getAttribute(\"data-val\")||!0,o=t._fullLayout,i=f.getSubplotIds(o,\"geo\"),l=0;l<i.length;l++){var s=o[i[l]]._subplot;if(\"zoom\"===n){var c=s.projection.scale(),u=\"in\"===a?2*c:.5*c;s.projection.scale(u),s.zoom.scale(u),s.render()}else\"reset\"===n&&s.zoomReset()}}function s(t){var e,r=t._fullLayout;e=r._has(\"cartesian\")?r._isHoriz?\"y\":\"x\":\"closest\";var n=!t._fullLayout.hovermode&&e;u.relayout(t,\"hovermode\",n)}function c(t){for(var e,r,n=t._fullLayout,a=d.list(t,null,!0),o={},i=0;i<a.length;i++)e=a[i],r=e._name,o[r+\".showspikes\"]=\"on\"===n._cartesianSpikesEnabled;return o}var u=t(\"../../plotly\"),f=t(\"../../plots/plots\"),d=t(\"../../plots/cartesian/axes\"),h=t(\"../../lib\"),p=t(\"../../snapshot/download\"),g=t(\"../../../build/ploticon\"),v=e.exports={};v.toImage={name:\"toImage\",title:\"Download plot as a png\",icon:g.camera,click:function(t){var e=\"png\";h.notifier(\"Taking snapshot - this may take a few seconds\",\"long\"),h.isIE()&&(h.notifier(\"IE only supports svg. Changing format to svg.\",\"long\"),e=\"svg\"),p(t,{format:e}).then(function(t){h.notifier(\"Snapshot succeeded - \"+t,\"long\")}).catch(function(){h.notifier(\"Sorry there was a problem downloading your snapshot!\",\"long\")})}},v.sendDataToCloud={name:\"sendDataToCloud\",title:\"Save and edit plot in cloud\",icon:g.disk,click:function(t){f.sendDataToCloud(t)}},v.zoom2d={name:\"zoom2d\",title:\"Zoom\",attr:\"dragmode\",val:\"zoom\",icon:g.zoombox,click:n},v.pan2d={name:\"pan2d\",title:\"Pan\",attr:\"dragmode\",val:\"pan\",icon:g.pan,click:n},v.select2d={name:\"select2d\",title:\"Box Select\",attr:\"dragmode\",val:\"select\",icon:g.selectbox,click:n},v.lasso2d={name:\"lasso2d\",title:\"Lasso Select\",attr:\"dragmode\",val:\"lasso\",icon:g.lasso,click:n},v.zoomIn2d={name:\"zoomIn2d\",title:\"Zoom in\",attr:\"zoom\",val:\"in\",icon:g.zoom_plus,click:n},v.zoomOut2d={name:\"zoomOut2d\",title:\"Zoom out\",attr:\"zoom\",val:\"out\",icon:g.zoom_minus,click:n},v.autoScale2d={name:\"autoScale2d\",title:\"Autoscale\",attr:\"zoom\",val:\"auto\",icon:g.autoscale,click:n},v.resetScale2d={name:\"resetScale2d\",title:\"Reset axes\",attr:\"zoom\",val:\"reset\",icon:g.home,click:n},v.hoverClosestCartesian={name:\"hoverClosestCartesian\",title:\"Show closest data on hover\",attr:\"hovermode\",val:\"closest\",icon:g.tooltip_basic,gravity:\"ne\",click:n},v.hoverCompareCartesian={name:\"hoverCompareCartesian\",title:\"Compare data on hover\",attr:\"hovermode\",val:function(t){return t._fullLayout._isHoriz?\"y\":\"x\"},icon:g.tooltip_compare,gravity:\"ne\",click:n},v.zoom3d={name:\"zoom3d\",title:\"Zoom\",attr:\"scene.dragmode\",val:\"zoom\",icon:g.zoombox,click:a},v.pan3d={name:\"pan3d\",title:\"Pan\",attr:\"scene.dragmode\",val:\"pan\",icon:g.pan,click:a},v.orbitRotation={name:\"orbitRotation\",title:\"orbital rotation\",attr:\"scene.dragmode\",val:\"orbit\",icon:g[\"3d_rotate\"],click:a},v.tableRotation={name:\"tableRotation\",title:\"turntable rotation\",attr:\"scene.dragmode\",val:\"turntable\",icon:g[\"z-axis\"],click:a},v.resetCameraDefault3d={name:\"resetCameraDefault3d\",title:\"Reset camera to default\",attr:\"resetDefault\",icon:g.home,click:o},v.resetCameraLastSave3d={name:\"resetCameraLastSave3d\",title:\"Reset camera to last save\",attr:\"resetLastSave\",icon:g.movie,click:o},v.hoverClosest3d={name:\"hoverClosest3d\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:i},v.zoomInGeo={name:\"zoomInGeo\",title:\"Zoom in\",attr:\"zoom\",val:\"in\",icon:g.zoom_plus,click:l},v.zoomOutGeo={name:\"zoomOutGeo\",title:\"Zoom out\",attr:\"zoom\",val:\"out\",icon:g.zoom_minus,click:l},v.resetGeo={name:\"resetGeo\",title:\"Reset\",attr:\"reset\",val:null,icon:g.autoscale,click:l},v.hoverClosestGeo={name:\"hoverClosestGeo\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:s},v.hoverClosestGl2d={name:\"hoverClosestGl2d\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:s},v.hoverClosestPie={name:\"hoverClosestPie\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:\"closest\",icon:g.tooltip_basic,gravity:\"ne\",click:s},v.toggleHover={name:\"toggleHover\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:function(t,e){s(t),i(t,e)}},v.resetViews={name:\"resetViews\",title:\"Reset views\",icon:g.home,click:function(t,e){var r=e.currentTarget;r.setAttribute(\"data-attr\",\"zoom\"),r.setAttribute(\"data-val\",\"reset\"),n(t,e),r.setAttribute(\"data-attr\",\"resetLastSave\"),o(t,e)}},v.toggleSpikelines={name:\"toggleSpikelines\",title:\"Toggle Spike Lines\",icon:g.spikeline,attr:\"_cartesianSpikesEnabled\",val:\"on\",click:function(t){var e=t._fullLayout;e._cartesianSpikesEnabled=\"closest\"===e.hovermode&&\"on\"===e._cartesianSpikesEnabled?\"off\":\"on\";var r=c(t);r.hovermode=\"closest\",u.relayout(t,r)}}},{\"../../../build/ploticon\":2,\"../../lib\":136,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../../snapshot/download\":208}],85:[function(t,e,r){\"use strict\";r.manage=t(\"./manage\")},{\"./manage\":86}],86:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t){for(var r=[],n=0;n<t.length;n++){var a=t[n];e.indexOf(a)===-1&&r.push(f[a])}v.push(r)}var l=t._fullLayout,s=t._fullData,c=l._has(\"cartesian\"),u=l._has(\"gl3d\"),d=l._has(\"geo\"),h=l._has(\"pie\"),p=l._has(\"gl2d\"),g=l._has(\"ternary\"),v=[];if(n([\"toImage\",\"sendDataToCloud\"]),(c||p||h||g)+d+u>1)return n([\"resetViews\",\"toggleHover\"]),i(v,r);u&&(n([\"zoom3d\",\"pan3d\",\"orbitRotation\",\"tableRotation\"]),n([\"resetCameraDefault3d\",\"resetCameraLastSave3d\"]),n([\"hoverClosest3d\"])),d&&(n([\"zoomInGeo\",\"zoomOutGeo\",\"resetGeo\"]),n([\"hoverClosestGeo\"]));var m=a(l),y=[];return((c||p)&&!m||g)&&(y=[\"zoom2d\",\"pan2d\"]),(c||g)&&o(s)&&(y.push(\"select2d\"),y.push(\"lasso2d\")),y.length&&n(y),!c&&!p||m||g||n([\"zoomIn2d\",\"zoomOut2d\",\"autoScale2d\",\"resetScale2d\"]),c&&h?n([\"toggleHover\"]):p?n([\"hoverClosestGl2d\"]):c?n([\"toggleSpikelines\",\"hoverClosestCartesian\",\"hoverCompareCartesian\"]):h&&n([\"hoverClosestPie\"]),i(v,r)}function a(t){for(var e=s.list({_fullLayout:t},null,!0),r=!0,n=0;n<e.length;n++)if(!e[n].fixedrange){r=!1;break}return r}function o(t){for(var e=!1,r=0;r<t.length&&!e;r++){var n=t[r];n._module&&n._module.selectPoints&&(\"scatter\"===n.type||\"scatterternary\"===n.type?(c.hasMarkers(n)||c.hasText(n))&&(e=!0):e=!0)}return e}function i(t,e){if(e.length)if(Array.isArray(e[0]))for(var r=0;r<e.length;r++)t.push(e[r]);else t.push(e);return t}function l(t){for(var e=0;e<t.length;e++)for(var r=t[e],n=0;n<r.length;n++){var a=r[n];if(\"string\"==typeof a){if(void 0===f[a])throw new Error([\"*modeBarButtons* configuration options\",\"invalid button name\"].join(\" \"));t[e][n]=f[a]}}return t}var s=t(\"../../plots/cartesian/axes\"),c=t(\"../../traces/scatter/subtypes\"),u=t(\"./modebar\"),f=t(\"./buttons\");e.exports=function(t){var e=t._fullLayout,r=t._context,a=e._modeBar;if(!r.displayModeBar)return void(a&&(a.destroy(),delete e._modeBar));if(!Array.isArray(r.modeBarButtonsToRemove))throw new Error([\"*modeBarButtonsToRemove* configuration options\",\"must be an array.\"].join(\" \"));if(!Array.isArray(r.modeBarButtonsToAdd))throw new Error([\"*modeBarButtonsToAdd* configuration options\",\"must be an array.\"].join(\" \"));var o,i=r.modeBarButtons;o=Array.isArray(i)&&i.length?l(i):n(t,r.modeBarButtonsToRemove,r.modeBarButtonsToAdd),a?a.update(t,o):e._modeBar=u(t,o)}},{\"../../plots/cartesian/axes\":171,\"../../traces/scatter/subtypes\":260,\"./buttons\":84,\"./modebar\":87}],87:[function(t,e,r){\"use strict\";function n(t){this.container=t.container,this.element=document.createElement(\"div\"),this.update(t.graphInfo,t.buttons),this.container.appendChild(this.element)}function a(t,e){var r=t._fullLayout,a=new n({graphInfo:t,container:r._paperdiv.node(),buttons:e});return r._privateplot&&o.select(a.element).append(\"span\").classed(\"badge-private float--left\",!0).text(\"PRIVATE\"),a}var o=t(\"d3\"),i=t(\"../../lib\"),l=t(\"../../../build/ploticon\"),s=n.prototype;s.update=function(t,e){this.graphInfo=t;var r=this.graphInfo._context;\"hover\"===r.displayModeBar?this.element.className=\"modebar modebar--hover\":this.element.className=\"modebar\";var n=!this.hasButtons(e),a=this.hasLogo!==r.displaylogo;(n||a)&&(this.removeAllButtons(),this.updateButtons(e),r.displaylogo&&(this.element.appendChild(this.getLogo()),this.hasLogo=!0)),this.updateActiveButton()},s.updateButtons=function(t){var e=this;this.buttons=t,this.buttonElements=[],this.buttonsNames=[],this.buttons.forEach(function(t){var r=e.createGroup();t.forEach(function(t){var n=t.name;if(!n)throw new Error(\"must provide button 'name' in button config\");if(e.buttonsNames.indexOf(n)!==-1)throw new Error(\"button name '\"+n+\"' is taken\");e.buttonsNames.push(n);var a=e.createButton(t);e.buttonElements.push(a),r.appendChild(a)}),e.element.appendChild(r)})},s.createGroup=function(){var t=document.createElement(\"div\");return t.className=\"modebar-group\",t},s.createButton=function(t){var e=this,r=document.createElement(\"a\");r.setAttribute(\"rel\",\"tooltip\"),r.className=\"modebar-btn\";var n=t.title;void 0===n&&(n=t.name),(n||0===n)&&r.setAttribute(\"data-title\",n),void 0!==t.attr&&r.setAttribute(\"data-attr\",t.attr);var a=t.val;if(void 0!==a&&(\"function\"==typeof a&&(a=a(this.graphInfo)),r.setAttribute(\"data-val\",a)),\"function\"!=typeof t.click)throw new Error(\"must provide button 'click' function in button config\");return r.addEventListener(\"click\",function(r){t.click(e.graphInfo,r),e.updateActiveButton(r.currentTarget)}),r.setAttribute(\"data-toggle\",t.toggle||!1),t.toggle&&o.select(r).classed(\"active\",!0),r.appendChild(this.createIcon(t.icon||l.question,t.name)),r.setAttribute(\"data-gravity\",t.gravity||\"n\"),r},s.createIcon=function(t,e){var r=t.ascent-t.descent,n=\"http://www.w3.org/2000/svg\",a=document.createElementNS(n,\"svg\"),o=document.createElementNS(n,\"path\");a.setAttribute(\"height\",\"1em\"),a.setAttribute(\"width\",t.width/r+\"em\"),a.setAttribute(\"viewBox\",[0,0,t.width,r].join(\" \"));var i=\"toggleSpikelines\"===e?\"matrix(1.5 0 0 -1.5 0 \"+t.ascent+\")\":\"matrix(1 0 0 -1 0 \"+t.ascent+\")\";return o.setAttribute(\"d\",t.path),o.setAttribute(\"transform\",i),a.appendChild(o),a},s.updateActiveButton=function(t){var e=this.graphInfo._fullLayout,r=void 0!==t?t.getAttribute(\"data-attr\"):null;this.buttonElements.forEach(function(t){var n=t.getAttribute(\"data-val\")||!0,a=t.getAttribute(\"data-attr\"),l=\"true\"===t.getAttribute(\"data-toggle\"),s=o.select(t);if(l)a===r&&s.classed(\"active\",!s.classed(\"active\"));else{var c=null===a?a:i.nestedProperty(e,a).get();s.classed(\"active\",c===n)}})},s.hasButtons=function(t){var e=this.buttons;if(!e)return!1;if(t.length!==e.length)return!1;for(var r=0;r<t.length;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;n<t[r].length;n++)if(t[r][n].name!==e[r][n].name)return!1}return!0},s.getLogo=function(){var t=this.createGroup(),e=document.createElement(\"a\");return e.href=\"https://plot.ly/\",e.target=\"_blank\",e.setAttribute(\"data-title\",\"Produced with Plotly\"),e.className=\"modebar-btn plotlyjsicon modebar-btn--logo\",e.appendChild(this.createIcon(l.plotlylogo)),t.appendChild(e),t},s.removeAllButtons=function(){for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.hasLogo=!1},s.destroy=function(){i.removeElement(this.container.querySelector(\".modebar\"))},e.exports=a},{\"../../../build/ploticon\":2,\"../../lib\":136,d3:7}],88:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"./button_attributes\");i=o(i,{_isLinkedToArray:\"button\"}),e.exports={visible:{valType:\"boolean\"},buttons:i,x:{valType:\"number\",min:-2,max:3},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"bottom\"},font:o({},n,{}),bgcolor:{valType:\"color\",dflt:a.lightLine},activecolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.defaultLine},borderwidth:{valType:\"number\",min:0,dflt:0}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../color/attributes\":24,\"./button_attributes\":89}],89:[function(t,e,r){\"use strict\";e.exports={step:{valType:\"enumerated\",values:[\"month\",\"year\",\"day\",\"hour\",\"minute\",\"second\",\"all\"],dflt:\"month\"},stepmode:{valType:\"enumerated\",values:[\"backward\",\"todate\"],dflt:\"backward\"},count:{valType:\"number\",min:0,dflt:1},label:{valType:\"string\"}}},{}],90:[function(t,e,r){\"use strict\";e.exports={yPad:.02,minButtonWidth:30,rx:3,ry:3,lightAmount:25,darkAmount:10}},{}],91:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t,e){return o.coerce(a,i,s,t,e)}for(var a,i,l=t.buttons||[],c=e.buttons=[],u=0;u<l.length;u++)if(a=l[u],i={},o.isPlainObject(a)){var f=n(\"step\");\"all\"!==f&&(!r||\"gregorian\"===r||\"month\"!==f&&\"year\"!==f?n(\"stepmode\"):i.stepmode=\"backward\",n(\"count\")),n(\"label\"),i._index=u,c.push(i)}return c}function a(t,e,r){for(var n=r.filter(function(r){return e[r].anchor===t._id}),a=0,o=0;o<n.length;o++){var i=e[n[o]].domain;i&&(a=Math.max(i[1],a))}return[t.domain[0],a+c.yPad]}var o=t(\"../../lib\"),i=t(\"../color\"),l=t(\"./attributes\"),s=t(\"./button_attributes\"),c=t(\"./constants\");e.exports=function(t,e,r,s,u){function f(t,e){return o.coerce(d,h,l,t,e)}var d=t.rangeselector||{},h=e.rangeselector={};if(f(\"visible\",n(d,h,u).length>0)){var p=a(e,r,s);f(\"x\",p[0]),f(\"y\",p[1]),o.noneOrAll(t,e,[\"x\",\"y\"]),f(\"xanchor\"),f(\"yanchor\"),o.coerceFont(f,\"font\",r.font);var g=f(\"bgcolor\");f(\"activecolor\",i.contrast(g,c.lightAmount,c.darkAmount)),f(\"bordercolor\"),f(\"borderwidth\")}}},{\"../../lib\":136,\"../color\":25,\"./attributes\":88,\"./button_attributes\":89,\"./constants\":90}],92:[function(t,e,r){\"use strict\";function n(t){for(var e=m.list(t,\"x\",!0),r=[],n=0;n<e.length;n++){var a=e[n];a.rangeselector&&a.rangeselector.visible&&r.push(a)}return r}function a(t){return t._id}function o(t,e,r){if(\"all\"===e.step)return t.autorange===!0;var n=Object.keys(r);return t.range[0]===r[n[0]]&&t.range[1]===r[n[1]]}function i(t,e,r){var n=t.selectAll(\"rect\").data([0]);n.enter().append(\"rect\").classed(\"selector-rect\",!0),n.attr(\"shape-rendering\",\"crispEdges\"),n.attr({rx:x.rx,ry:x.ry}),n.call(p.stroke,e.bordercolor).call(p.fill,l(e,r)).style(\"stroke-width\",e.borderwidth+\"px\")}function l(t,e){return e.isActive||e.isHovered?t.activecolor:t.bgcolor}function s(t,e,r){function n(t){v.convertToTspans(t)}var a=t.selectAll(\"text\").data([0]);a.enter().append(\"text\").classed(\"selector-text\",!0).classed(\"user-select-none\",!0),a.attr(\"text-anchor\",\"middle\"),a.call(g.font,e.font).text(c(r)).call(n)}function c(t){return t.label?t.label:\"all\"===t.step?\"all\":t.count+t.step.charAt(0)}function u(t,e,r,n){r.width=0,r.height=0;var a=r.borderwidth;e.each(function(){var t=f.select(this),e=t.select(\".selector-text\"),n=e.selectAll(\"tspan\"),a=1.3*r.font.size,o=n[0].length||1,i=Math.max(a*o,16)+3;r.height=Math.max(r.height,i)}),e.each(function(){var t=f.select(this),e=t.select(\".selector-rect\"),n=t.select(\".selector-text\"),o=n.selectAll(\"tspan\"),i=n.node()&&g.bBox(n.node()).width,l=1.3*r.font.size,s=o[0].length||1,c=Math.max(i+10,x.minButtonWidth);t.attr(\"transform\",\"translate(\"+(a+r.width)+\",\"+a+\")\"),e.attr({x:0,y:0,width:c,height:r.height});var u={x:c/2,y:r.height/2-(s-1)*l/2+3};n.attr(u),o.attr(u),r.width+=c+5}),e.selectAll(\"rect\").attr(\"height\",r.height);var o=t._fullLayout._size;r.lx=o.l+o.w*r.x,r.ly=o.t+o.h*(1-r.y);var i=\"left\";y.isRightAnchor(r)&&(r.lx-=r.width,i=\"right\"),y.isCenterAnchor(r)&&(r.lx-=r.width/2,i=\"center\");var l=\"top\";y.isBottomAnchor(r)&&(r.ly-=r.height,l=\"bottom\"),y.isMiddleAnchor(r)&&(r.ly-=r.height/2,l=\"middle\"),r.width=Math.ceil(r.width),r.height=Math.ceil(r.height),r.lx=Math.round(r.lx),r.ly=Math.round(r.ly),h.autoMargin(t,n+\"-range-selector\",{x:r.x,y:r.y,l:r.width*({right:1,center:.5}[i]||0),r:r.width*({left:1,center:.5}[i]||0),b:r.height*({top:1,middle:.5}[l]||0),t:r.height*({bottom:1,middle:.5}[l]||0)})}var f=t(\"d3\"),d=t(\"../../plotly\"),h=t(\"../../plots/plots\"),p=t(\"../color\"),g=t(\"../drawing\"),v=t(\"../../lib/svg_text_utils\"),m=t(\"../../plots/cartesian/axis_ids\"),y=t(\"../legend/anchor_utils\"),x=t(\"./constants\"),b=t(\"./get_update_object\");e.exports=function(t){var e=t._fullLayout,r=e._infolayer.selectAll(\".rangeselector\").data(n(t),a);r.enter().append(\"g\").classed(\"rangeselector\",!0),r.exit().remove(),r.style({cursor:\"pointer\",\"pointer-events\":\"all\"}),r.each(function(e){var r=f.select(this),n=e,a=n.rangeselector,l=r.selectAll(\"g.button\").data(a.buttons);l.enter().append(\"g\").classed(\"button\",!0),l.exit().remove(),l.each(function(e){var r=f.select(this),l=b(n,e);e.isActive=o(n,e,l),r.call(i,a,e),r.call(s,a,e),r.on(\"click\",function(){t._dragged||d.relayout(t,l)}),r.on(\"mouseover\",function(){e.isHovered=!0,r.call(i,a,e)}),r.on(\"mouseout\",function(){e.isHovered=!1,r.call(i,a,e)})}),u(t,l,a,n._name),r.attr(\"transform\",\"translate(\"+a.lx+\",\"+a.ly+\")\")})}},{\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/cartesian/axis_ids\":174,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":90,\"./get_update_object\":93,d3:7}],93:[function(t,e,r){\"use strict\";function n(t,e){var r,n=t.range,o=new Date(t.r2l(n[1])),i=e.step,l=e.count;switch(e.stepmode){case\"backward\":r=t.l2r(+a.time[i].utc.offset(o,-l));break;case\"todate\":var s=a.time[i].utc.offset(o,-l);r=t.l2r(+a.time[i].utc.ceil(s))}return[r,n[1]]}var a=t(\"d3\");e.exports=function(t,e){var r=t._name,a={};if(\"all\"===e.step)a[r+\".autorange\"]=!0;else{var o=n(t,e);a[r+\".range[0]\"]=o[0],a[r+\".range[1]\"]=o[1]}return a}},{d3:7}],94:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"rangeselector\",schema:{layout:{\"xaxis.rangeselector\":t(\"./attributes\")}},layoutAttributes:t(\"./attributes\"),handleDefaults:t(\"./defaults\"),draw:t(\"./draw\")}},{\"./attributes\":88,\"./defaults\":91,\"./draw\":92}],95:[function(t,e,r){\"use strict\";var n=t(\"../color/attributes\");e.exports={bgcolor:{valType:\"color\",dflt:n.background},bordercolor:{valType:\"color\",dflt:n.defaultLine},borderwidth:{valType:\"integer\",dflt:0,min:0},autorange:{valType:\"boolean\",dflt:!0},range:{valType:\"info_array\",items:[{valType:\"any\"},{valType:\"any\"}]},thickness:{valType:\"number\",dflt:.15,min:0,max:1},visible:{valType:\"boolean\",dflt:!0}}},{\"../color/attributes\":24}],96:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/axes\"),a=t(\"./constants\");e.exports=function(t){for(var e=n.list(t,\"x\",!0),r=0;r<e.length;r++){var o=e[r],i=o[a.name];i&&i.visible&&i.autorange&&o._min.length&&o._max.length&&(i._input.autorange=!0,\n",
|
|
"i._input.range=i.range=n.getAutoRange(o))}}},{\"../../plots/cartesian/axes\":171,\"./constants\":97}],97:[function(t,e,r){\"use strict\";e.exports={name:\"rangeslider\",containerClassName:\"rangeslider-container\",bgClassName:\"rangeslider-bg\",rangePlotClassName:\"rangeslider-rangeplot\",maskMinClassName:\"rangeslider-mask-min\",maskMaxClassName:\"rangeslider-mask-max\",slideBoxClassName:\"rangeslider-slidebox\",grabberMinClassName:\"rangeslider-grabber-min\",grabAreaMinClassName:\"rangeslider-grabarea-min\",handleMinClassName:\"rangeslider-handle-min\",grabberMaxClassName:\"rangeslider-grabber-max\",grabAreaMaxClassName:\"rangeslider-grabarea-max\",handleMaxClassName:\"rangeslider-handle-max\",maskColor:\"rgba(0,0,0,0.4)\",slideBoxFill:\"transparent\",slideBoxCursor:\"ew-resize\",grabAreaFill:\"transparent\",grabAreaCursor:\"col-resize\",grabAreaWidth:10,handleWidth:4,handleRadius:1,handleStrokeWidth:1,extraPad:15}},{}],98:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\");e.exports=function(t,e,r){function o(t,e){return n.coerce(i,s,a,t,e)}if(t[r].rangeslider){n.isPlainObject(t[r].rangeslider)||(t[r].rangeslider={});var i=t[r].rangeslider,l=e[r],s=l.rangeslider={};if(o(\"visible\")){if(o(\"bgcolor\",e.plot_bgcolor),o(\"bordercolor\"),o(\"borderwidth\"),o(\"thickness\"),o(\"autorange\",!l.isValidRange(i.range)),o(\"range\"),s.range){var c=s.range,u=l.range;c[0]=l.l2r(Math.min(l.r2l(c[0]),l.r2l(u[0]))),c[1]=l.l2r(Math.max(l.r2l(c[1]),l.r2l(u[1])))}l.cleanRange(\"rangeslider.range\"),s._input=i}}}},{\"../../lib\":136,\"./attributes\":95}],99:[function(t,e,r){\"use strict\";function n(t){var e=w.list({_fullLayout:t},\"x\",!0),r=A.name,n=[];if(t._has(\"gl2d\"))return n;for(var a=0;a<e.length;a++){var o=e[a];o[r]&&o[r].visible&&n.push(o)}return n}function a(t,e,r,n){var a=t.select(\"rect.\"+A.slideBoxClassName).node(),i=t.select(\"rect.\"+A.grabAreaMinClassName).node(),l=t.select(\"rect.\"+A.grabAreaMaxClassName).node();t.on(\"mousedown\",function(){function s(s){var c,u,y,x=+s.clientX-d;switch(f){case a:y=\"ew-resize\",c=p+x,u=v+x;break;case i:y=\"col-resize\",c=p+x,u=v;break;case l:y=\"col-resize\",c=p,u=v+x;break;default:y=\"ew-resize\",c=h,u=h+x}if(u<c){var b=u;u=c,c=b}n._pixelMin=c,n._pixelMax=u,M(g.select(m),y),o(t,e,r,n)}function c(){m.removeEventListener(\"mousemove\",s),m.removeEventListener(\"mouseup\",c),y.removeElement(m)}var u=g.event,f=u.target,d=u.clientX,h=d-t.node().getBoundingClientRect().left,p=n.d2p(r._rl[0]),v=n.d2p(r._rl[1]),m=k.coverSlip();m.addEventListener(\"mousemove\",s),m.addEventListener(\"mouseup\",c)})}function o(t,e,r,n){function a(t){return r.l2r(y.constrain(t,n._rl[0],n._rl[1]))}var o=a(n.p2d(n._pixelMin)),i=a(n.p2d(n._pixelMax));window.requestAnimationFrame(function(){v.relayout(e,r._name+\".range\",[o,i])})}function i(t,e,r,n){function a(t){return y.constrain(t,0,n._width)}function o(t){return y.constrain(t,-i,n._width+i)}var i=A.handleWidth/2,l=a(n.d2p(r._rl[0])),s=a(n.d2p(r._rl[1]));t.select(\"rect.\"+A.slideBoxClassName).attr(\"x\",l).attr(\"width\",s-l),t.select(\"rect.\"+A.maskMinClassName).attr(\"width\",l),t.select(\"rect.\"+A.maskMaxClassName).attr(\"x\",s).attr(\"width\",n._width-s);var c=Math.round(o(l-i))-.5,u=Math.round(o(s-i))+.5;t.select(\"g.\"+A.grabberMinClassName).attr(\"transform\",\"translate(\"+c+\",0.5)\"),t.select(\"g.\"+A.grabberMaxClassName).attr(\"transform\",\"translate(\"+u+\",0.5)\")}function l(t,e,r,n){var a=t.selectAll(\"rect.\"+A.bgClassName).data([0]);a.enter().append(\"rect\").classed(A.bgClassName,!0).attr({x:0,y:0,\"shape-rendering\":\"crispEdges\"});var o=n.borderwidth%2==0?n.borderwidth:n.borderwidth-1,i=-n._offsetShift,l=x.crispRound(e,n.borderwidth);a.attr({width:n._width+o,height:n._height+o,transform:\"translate(\"+i+\",\"+i+\")\",fill:n.bgcolor,stroke:n.bordercolor,\"stroke-width\":l})}function s(t,e,r,n){var a=e._fullLayout,o=a._topdefs.selectAll(\"#\"+n._clipId).data([0]);o.enter().append(\"clipPath\").attr(\"id\",n._clipId).append(\"rect\").attr({x:0,y:0}),o.select(\"rect\").attr({width:n._width,height:n._height})}function c(t,e,r,n){var a=w.getSubplots(e,r),o=e.calcdata,i=t.selectAll(\"g.\"+A.rangePlotClassName).data(a,y.identity);i.enter().append(\"g\").attr(\"class\",function(t){return A.rangePlotClassName+\" \"+t}).call(x.setClipUrl,n._clipId),i.order(),i.exit().remove();var l;i.each(function(t,a){var i=g.select(this),s=0===a,c=w.getFromId(e,t,\"y\"),f=c._name,d={data:[],layout:{xaxis:{type:r.type,domain:[0,1],range:n.range.slice(),calendar:r.calendar},width:n._width,height:n._height,margin:{t:0,b:0,l:0,r:0}}};d.layout[f]={type:c.type,domain:[0,1],range:c.range.slice(),calendar:c.calendar},m.supplyDefaults(d);var h=d._fullLayout.xaxis,p=d._fullLayout[f],v={id:t,plotgroup:i,xaxis:h,yaxis:p};s?l=v:(v.mainplot=\"xy\",v.mainplotinfo=l),_.rangePlot(e,v,u(o,t))})}function u(t,e){for(var r=[],n=0;n<t.length;n++){var a=t[n],o=a[0].trace;o.xaxis+o.yaxis===e&&r.push(a)}return r}function f(t,e,r,n){var a=t.selectAll(\"rect.\"+A.maskMinClassName).data([0]);a.enter().append(\"rect\").classed(A.maskMinClassName,!0).attr({x:0,y:0}).attr(\"shape-rendering\",\"crispEdges\"),a.attr(\"height\",n._height).call(b.fill,A.maskColor);var o=t.selectAll(\"rect.\"+A.maskMaxClassName).data([0]);o.enter().append(\"rect\").classed(A.maskMaxClassName,!0).attr(\"y\",0).attr(\"shape-rendering\",\"crispEdges\"),o.attr(\"height\",n._height).call(b.fill,A.maskColor)}function d(t,e,r,n){if(!e._context.staticPlot){var a=t.selectAll(\"rect.\"+A.slideBoxClassName).data([0]);a.enter().append(\"rect\").classed(A.slideBoxClassName,!0).attr(\"y\",0).attr(\"cursor\",A.slideBoxCursor).attr(\"shape-rendering\",\"crispEdges\"),a.attr({height:n._height,fill:A.slideBoxFill})}}function h(t,e,r,n){var a=t.selectAll(\"g.\"+A.grabberMinClassName).data([0]);a.enter().append(\"g\").classed(A.grabberMinClassName,!0);var o=t.selectAll(\"g.\"+A.grabberMaxClassName).data([0]);o.enter().append(\"g\").classed(A.grabberMaxClassName,!0);var i={x:0,width:A.handleWidth,rx:A.handleRadius,fill:b.background,stroke:b.defaultLine,\"stroke-width\":A.handleStrokeWidth,\"shape-rendering\":\"crispEdges\"},l={y:Math.round(n._height/4),height:Math.round(n._height/2)},s=a.selectAll(\"rect.\"+A.handleMinClassName).data([0]);s.enter().append(\"rect\").classed(A.handleMinClassName,!0).attr(i),s.attr(l);var c=o.selectAll(\"rect.\"+A.handleMaxClassName).data([0]);if(c.enter().append(\"rect\").classed(A.handleMaxClassName,!0).attr(i),c.attr(l),!e._context.staticPlot){var u={width:A.grabAreaWidth,x:0,y:0,fill:A.grabAreaFill,cursor:A.grabAreaCursor},f=a.selectAll(\"rect.\"+A.grabAreaMinClassName).data([0]);f.enter().append(\"rect\").classed(A.grabAreaMinClassName,!0).attr(u),f.attr(\"height\",n._height);var d=o.selectAll(\"rect.\"+A.grabAreaMaxClassName).data([0]);d.enter().append(\"rect\").classed(A.grabAreaMaxClassName,!0).attr(u),d.attr(\"height\",n._height)}}function p(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(A.name)!==-1&&m.autoMargin(t,a)}}var g=t(\"d3\"),v=t(\"../../plotly\"),m=t(\"../../plots/plots\"),y=t(\"../../lib\"),x=t(\"../drawing\"),b=t(\"../color\"),_=t(\"../../plots/cartesian\"),w=t(\"../../plots/cartesian/axes\"),k=t(\"../dragelement\"),M=t(\"../../lib/setcursor\"),A=t(\"./constants\");e.exports=function(t){function e(t){return t._name}var r=t._fullLayout,o=n(r),u=r._infolayer.selectAll(\"g.\"+A.containerClassName).data(o,e);u.enter().append(\"g\").classed(A.containerClassName,!0).attr(\"pointer-events\",\"all\"),u.exit().each(function(t){var e=g.select(this),n=t[A.name];e.remove(),r._topdefs.select(\"#\"+n._clipId).remove()}),u.exit().size()&&p(t),0!==o.length&&u.each(function(e){var n=g.select(this),o=e[A.name],u=r[w.id2name(e.anchor)],p=r.margin,v=r._size,y=e.domain,x=u.domain,b=(e._boundingBox||{}).height||0;o._id=A.name+e._id,o._clipId=o._id+\"-\"+r._uid,o._width=v.w*(y[1]-y[0]),o._height=(r.height-p.b-p.t)*o.thickness,o._offsetShift=Math.floor(o.borderwidth/2);var _=Math.round(p.l+v.w*y[0]),k=Math.round(p.t+v.h*(1-x[0])+b+o._offsetShift+A.extraPad);n.attr(\"transform\",\"translate(\"+_+\",\"+k+\")\");var M=e.r2l(o.range[0]),T=e.r2l(o.range[1]),L=T-M;o.p2d=function(t){return t/o._width*L+M},o.d2p=function(t){return(t-M)/L*o._width},o._rl=[M,T],n.call(l,t,e,o).call(s,t,e,o).call(c,t,e,o).call(f,t,e,o).call(d,t,e,o).call(h,t,e,o),a(n,t,e,o),i(n,t,e,o),m.autoMargin(t,o._id,{x:y[0],y:x[0],l:0,r:0,t:0,b:o._height+p.b+b,pad:A.extraPad+2*o._offsetShift})})}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian\":181,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":97,d3:7}],100:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"rangeslider\",schema:{layout:{\"xaxis.rangeslider\":t(\"./attributes\")}},layoutAttributes:t(\"./attributes\"),handleDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:t(\"./draw\")}},{\"./attributes\":95,\"./calc_autorange\":96,\"./defaults\":98,\"./draw\":99}],101:[function(t,e,r){\"use strict\";var n=t(\"../annotations/attributes\"),a=t(\"../../traces/scatter/attributes\").line,o=t(\"../drawing/attributes\").dash,i=t(\"../../lib/extend\").extendFlat;e.exports={_isLinkedToArray:\"shape\",visible:{valType:\"boolean\",dflt:!0},type:{valType:\"enumerated\",values:[\"circle\",\"rect\",\"path\",\"line\"]},layer:{valType:\"enumerated\",values:[\"below\",\"above\"],dflt:\"above\"},xref:i({},n.xref,{}),x0:{valType:\"any\"},x1:{valType:\"any\"},yref:i({},n.yref,{}),y0:{valType:\"any\"},y1:{valType:\"any\"},path:{valType:\"string\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},line:{color:a.color,width:a.width,dash:o},fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"}}},{\"../../lib/extend\":132,\"../../traces/scatter/attributes\":240,\"../annotations/attributes\":16,\"../drawing/attributes\":48}],102:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){var o=\"category\"===t.type?Number:t.d2c;if(void 0!==e)return[o(e),o(r)];if(n){var s,c,u,f,d,h=1/0,p=-1/0,g=n.match(i.segmentRE);for(\"date\"===t.type&&(o=l.decodeDate(o)),s=0;s<g.length;s++)c=g[s],void 0!==(u=a[c.charAt(0)].drawn)&&(!(f=g[s].substr(1).match(i.paramRE))||f.length<u||(d=o(f[u]),d<h&&(h=d),d>p&&(p=d)));return p>=h?[h,p]:void 0}}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./constants\"),l=t(\"./helpers\");e.exports=function(t){var e=t._fullLayout,r=a.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var l=0;l<r.length;l++){var s,c,u=r[l],f=u.line.width/2;\"paper\"!==u.xref&&(s=o.getFromId(t,u.xref),(c=n(s,u.x0,u.x1,u.path,i.paramIsX))&&o.expand(s,c,{ppad:f})),\"paper\"!==u.yref&&(s=o.getFromId(t,u.yref),(c=n(s,u.y0,u.y1,u.path,i.paramIsY))&&o.expand(s,c,{ppad:f}))}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./constants\":103,\"./helpers\":106}],103:[function(t,e,r){\"use strict\";e.exports={segmentRE:/[MLHVQCTSZ][^MLHVQCTSZ]*/g,paramRE:/[^\\s,]+/g,paramIsX:{M:{0:!0,drawn:0},L:{0:!0,drawn:0},H:{0:!0,drawn:0},V:{},Q:{0:!0,2:!0,drawn:2},C:{0:!0,2:!0,4:!0,drawn:4},T:{0:!0,drawn:0},S:{0:!0,2:!0,drawn:2},Z:{}},paramIsY:{M:{1:!0,drawn:1},L:{1:!0,drawn:1},H:{},V:{0:!0,drawn:0},Q:{1:!0,3:!0,drawn:3},C:{1:!0,3:!0,5:!0,drawn:5},T:{1:!0,drawn:1},S:{1:!0,3:!0,drawn:5},Z:{}},numParams:{M:2,L:2,H:1,V:1,Q:4,C:6,T:2,S:4,Z:0}}},{}],104:[function(t,e,r){\"use strict\";var n=t(\"../../plots/array_container_defaults\"),a=t(\"./shape_defaults\");e.exports=function(t,e){n(t,e,{name:\"shapes\",handleItemDefaults:a})}},{\"../../plots/array_container_defaults\":168,\"./shape_defaults\":108}],105:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;e._shapeUpperLayer.selectAll(\"path\").remove(),e._shapeLowerLayer.selectAll(\"path\").remove(),e._shapeSubplotLayers.selectAll(\"path\").remove();for(var r=0;r<e.shapes.length;r++)e.shapes[r].visible&&a(t,r)}function a(t,e){function r(r){var n={\"data-index\":e,\"fill-rule\":\"evenodd\",d:i(t,a)},l=a.line.width?a.line.color:\"rgba(0,0,0,0)\",s=r.append(\"path\").attr(n).style(\"opacity\",a.opacity).call(d.stroke,l).call(d.fill,a.fillcolor).call(h.dashLine,a.line.dash,a.line.width),c=(a.xref+a.yref).replace(/paper/g,\"\");s.call(h.setClipUrl,c?\"clip\"+t._fullLayout._uid+c:null),t._context.editable&&o(t,s,a,e)}t._fullLayout._paper.selectAll('.shapelayer [data-index=\"'+e+'\"]').remove();var n=(t.layout.shapes||[])[e],a=t._fullLayout.shapes[e];if(n&&a.visible!==!1)if(\"below\"!==a.layer)r(t._fullLayout._shapeUpperLayer);else if(\"paper\"===a.xref||\"paper\"===a.yref)r(t._fullLayout._shapeLowerLayer);else{var l=t._fullLayout._plots[a.xref+a.yref];if(l){var s=l.mainplot||l;r(s.shapelayer)}else r(t._fullLayout._shapeLowerLayer)}}function o(t,e,r,n){function a(t){var r=W.right-W.left,n=W.bottom-W.top,a=t.clientX-W.left,o=t.clientY-W.top,i=r>G&&n>Y&&!t.shiftKey?p.getCursor(a/r,1-o/n):\"move\";g(e,i),X=i.split(\"-\")[0]}function o(e){j=f.getFromId(t,r.xref),B=f.getFromId(t,r.yref),q=m.getDataToPixel(t,j),H=m.getDataToPixel(t,B,!0),V=m.getPixelToData(t,j),U=m.getPixelToData(t,B,!0);var o=\"shapes[\"+n+\"]\";\"path\"===r.type?(R=r.path,F=o+\".path\"):(v=q(r.x0),y=H(r.y0),x=q(r.x1),b=H(r.y1),_=o+\".x0\",w=o+\".y0\",k=o+\".x1\",M=o+\".y1\"),v<x?(L=v,O=o+\".x0\",N=\"x0\",C=x,D=o+\".x1\",I=\"x1\"):(L=x,O=o+\".x1\",N=\"x1\",C=v,D=o+\".x0\",I=\"x0\"),y<b?(A=y,S=o+\".y0\",P=\"y0\",T=b,z=o+\".y1\",E=\"y1\"):(A=b,S=o+\".y1\",P=\"y1\",T=y,z=o+\".y0\",E=\"y0\"),h={},a(e),Z.moveFn=\"move\"===X?u:d}function l(r){g(e),r&&c.relayout(t,h)}function u(n,a){if(\"path\"===r.type){var o=function(t){return V(q(t)+n)};j&&\"date\"===j.type&&(o=m.encodeDate(o));var l=function(t){return U(H(t)+a)};B&&\"date\"===B.type&&(l=m.encodeDate(l)),r.path=s(R,o,l),h[F]=r.path}else h[_]=r.x0=V(v+n),h[w]=r.y0=U(y+a),h[k]=r.x1=V(x+n),h[M]=r.y1=U(b+a);e.attr(\"d\",i(t,r))}function d(n,a){if(\"path\"===r.type){var o=function(t){return V(q(t)+n)};j&&\"date\"===j.type&&(o=m.encodeDate(o));var l=function(t){return U(H(t)+a)};B&&\"date\"===B.type&&(l=m.encodeDate(l)),r.path=s(R,o,l),h[F]=r.path}else{var c=~X.indexOf(\"n\")?A+a:A,u=~X.indexOf(\"s\")?T+a:T,f=~X.indexOf(\"w\")?L+n:L,d=~X.indexOf(\"e\")?C+n:C;u-c>Y&&(h[S]=r[P]=U(c),h[z]=r[E]=U(u)),d-f>G&&(h[O]=r[N]=V(f),h[D]=r[I]=V(d))}e.attr(\"d\",i(t,r))}var h,v,y,x,b,_,w,k,M,A,T,L,C,S,z,O,D,P,E,N,I,R,F,j,B,q,H,V,U,X,G=10,Y=10,Z={setCursor:a,element:e.node(),prepFn:o,doneFn:l},W=Z.element.getBoundingClientRect();p.init(Z)}function i(t,e){var r,n,a,o,i=e.type,s=f.getFromId(t,e.xref),c=f.getFromId(t,e.yref),u=t._fullLayout._size;if(s?(r=m.shapePositionToRange(s),n=function(t){return s._offset+s.r2p(r(t,!0))}):n=function(t){return u.l+u.w*t},c?(a=m.shapePositionToRange(c),o=function(t){return c._offset+c.r2p(a(t,!0))}):o=function(t){return u.t+u.h*(1-t)},\"path\"===i)return s&&\"date\"===s.type&&(n=m.decodeDate(n)),c&&\"date\"===c.type&&(o=m.decodeDate(o)),l(e.path,n,o);var d=n(e.x0),h=n(e.x1),p=o(e.y0),g=o(e.y1);if(\"line\"===i)return\"M\"+d+\",\"+p+\"L\"+h+\",\"+g;if(\"rect\"===i)return\"M\"+d+\",\"+p+\"H\"+h+\"V\"+g+\"H\"+d+\"Z\";var v=(d+h)/2,y=(p+g)/2,x=Math.abs(v-d),b=Math.abs(y-p),_=\"A\"+x+\",\"+b,w=v+x+\",\"+y;return\"M\"+w+_+\" 0 1,1 \"+v+\",\"+(y-b)+_+\" 0 0,1 \"+w+\"Z\"}function l(t,e,r){return t.replace(v.segmentRE,function(t){var n=0,a=t.charAt(0),o=v.paramIsX[a],i=v.paramIsY[a],l=v.numParams[a],s=t.substr(1).replace(v.paramRE,function(t){return o[n]?t=e(t):i[n]&&(t=r(t)),n++,n>l&&(t=\"X\"),t});return n>l&&(s=s.replace(/[\\s,]*X.*/,\"\"),u.log(\"Ignoring extra params in segment \"+t)),a+s})}function s(t,e,r){return t.replace(v.segmentRE,function(t){var n=0,a=t.charAt(0),o=v.paramIsX[a],i=v.paramIsY[a],l=v.numParams[a];return a+t.substr(1).replace(v.paramRE,function(t){return n>=l?t:(o[n]?t=e(t):i[n]&&(t=r(t)),n++,t)})})}var c=t(\"../../plotly\"),u=t(\"../../lib\"),f=t(\"../../plots/cartesian/axes\"),d=t(\"../color\"),h=t(\"../drawing\"),p=t(\"../dragelement\"),g=t(\"../../lib/setcursor\"),v=t(\"./constants\"),m=t(\"./helpers\");e.exports={draw:n,drawOne:a}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":103,\"./helpers\":106}],106:[function(t,e,r){\"use strict\";r.rangeToShapePosition=function(t){return\"log\"===t.type?t.r2d:function(t){return t}},r.shapePositionToRange=function(t){return\"log\"===t.type?t.d2r:function(t){return t}},r.decodeDate=function(t){return function(e){return e.replace&&(e=e.replace(\"_\",\" \")),t(e)}},r.encodeDate=function(t){return function(e){return t(e).replace(\" \",\"_\")}},r.getDataToPixel=function(t,e,n){var a,o=t._fullLayout._size;if(e){var i=r.shapePositionToRange(e);a=function(t){return e._offset+e.r2p(i(t,!0))},\"date\"===e.type&&(a=r.decodeDate(a))}else a=n?function(t){return o.t+o.h*(1-t)}:function(t){return o.l+o.w*t};return a},r.getPixelToData=function(t,e,n){var a,o=t._fullLayout._size;if(e){var i=r.rangeToShapePosition(e);a=function(t){return i(e.p2r(t-e._offset))}}else a=n?function(t){return 1-(t-o.t)/o.h}:function(t){return(t-o.l)/o.w};return a}},{}],107:[function(t,e,r){\"use strict\";var n=t(\"./draw\");e.exports={moduleType:\"component\",name:\"shapes\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:n.draw,drawOne:n.drawOne}},{\"./attributes\":101,\"./calc_autorange\":102,\"./defaults\":104,\"./draw\":105}],108:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"./attributes\"),i=t(\"./helpers\");e.exports=function(t,e,r,l,s){function c(r,a){return n.coerce(t,e,o,r,a)}if(l=l||{},s=s||{},!c(\"visible\",!s.itemIsNotPlainObject))return e;c(\"layer\"),c(\"opacity\"),c(\"fillcolor\"),c(\"line.color\"),c(\"line.width\"),c(\"line.dash\");for(var u=t.path?\"path\":\"rect\",f=c(\"type\",u),d=[\"x\",\"y\"],h=0;h<2;h++){var p=d[h],g={_fullLayout:r},v=a.coerceRef(t,e,g,p,\"\",\"paper\");if(\"path\"!==f){var m,y,x;\"paper\"!==v?(m=a.getFromId(g,v),x=i.rangeToShapePosition(m),y=i.shapePositionToRange(m)):y=x=n.identity;var b=p+\"0\",_=p+\"1\",w=t[b],k=t[_];t[b]=y(t[b],!0),t[_]=y(t[_],!0),a.coercePosition(e,g,c,v,b,.25),a.coercePosition(e,g,c,v,_,.75),e[b]=x(e[b]),e[_]=x(e[_]),t[b]=w,t[_]=k}}return\"path\"===f?c(\"path\"):n.noneOrAll(t,e,[\"x0\",\"x1\",\"y0\",\"y1\"]),e}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./attributes\":101,\"./helpers\":106}],109:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../../plots/pad_attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"../../lib/extend\").extendDeep,l=t(\"../../plots/animation_attributes\"),s=t(\"./constants\"),c={_isLinkedToArray:\"step\",method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\"},value:{valType:\"string\"}};e.exports={_isLinkedToArray:\"slider\",visible:{valType:\"boolean\",dflt:!0},active:{valType:\"number\",min:0,dflt:0},steps:c,lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",min:-2,max:3,dflt:0},pad:i({},a,{},{t:{dflt:20}}),xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:0},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},transition:{duration:{valType:\"number\",min:0,dflt:150},easing:{valType:\"enumerated\",values:l.transition.easing.values,dflt:\"cubic-in-out\"}},currentvalue:{visible:{valType:\"boolean\",dflt:!0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},offset:{valType:\"number\",dflt:10},prefix:{valType:\"string\"},suffix:{valType:\"string\"},font:o({},n,{})},font:o({},n,{}),activebgcolor:{valType:\"color\",dflt:s.gripBgActiveColor},bgcolor:{valType:\"color\",dflt:s.railBgColor},bordercolor:{valType:\"color\",dflt:s.railBorderColor},borderwidth:{valType:\"number\",min:0,dflt:s.railBorderWidth},ticklen:{valType:\"number\",min:0,dflt:s.tickLength},tickcolor:{valType:\"color\",dflt:s.tickColor},tickwidth:{valType:\"number\",min:0,dflt:1},minorticklen:{valType:\"number\",min:0,dflt:s.minorTickLength}}},{\"../../lib/extend\":132,\"../../plots/animation_attributes\":167,\"../../plots/font_attributes\":195,\"../../plots/pad_attributes\":198,\"./constants\":110}],110:[function(t,e,r){\"use strict\";e.exports={name:\"sliders\",containerClassName:\"slider-container\",groupClassName:\"slider-group\",inputAreaClass:\"slider-input-area\",railRectClass:\"slider-rail-rect\",railTouchRectClass:\"slider-rail-touch-rect\",gripRectClass:\"slider-grip-rect\",tickRectClass:\"slider-tick-rect\",inputProxyClass:\"slider-input-proxy\",labelsClass:\"slider-labels\",labelGroupClass:\"slider-label-group\",labelClass:\"slider-label\",currentValueClass:\"slider-current-value\",railHeight:5,menuIndexAttrName:\"slider-active-index\",autoMarginIdRoot:\"slider-\",minWidth:30,minHeight:30,textPadX:40,fontSizeToHeight:1.3,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:\"#bec8d9\",railBgColor:\"#f8fafc\",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:\"#bec8d9\",gripBgColor:\"#f6f8fa\",gripBgActiveColor:\"#dbdde0\",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:\"#333\",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:\"#333\",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},{}],111:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return o.coerce(t,e,l,r,n)}n(\"visible\",a(t,e).length>0)&&(n(\"active\"),n(\"x\"),n(\"y\"),o.noneOrAll(t,e,[\"x\",\"y\"]),n(\"xanchor\"),n(\"yanchor\"),n(\"len\"),n(\"lenmode\"),n(\"pad.t\"),n(\"pad.r\"),n(\"pad.b\"),n(\"pad.l\"),o.coerceFont(n,\"font\",r.font),n(\"currentvalue.visible\")&&(n(\"currentvalue.xanchor\"),n(\"currentvalue.prefix\"),n(\"currentvalue.suffix\"),n(\"currentvalue.offset\"),o.coerceFont(n,\"currentvalue.font\",e.font)),n(\"transition.duration\"),n(\"transition.easing\"),n(\"bgcolor\"),n(\"activebgcolor\"),n(\"bordercolor\"),n(\"borderwidth\"),n(\"ticklen\"),n(\"tickwidth\"),n(\"tickcolor\"),n(\"minorticklen\"))}function a(t,e){function r(t,e){return o.coerce(n,a,u,t,e)}for(var n,a,i=t.steps||[],l=e.steps=[],s=0;s<i.length;s++)n=i[s],a={},o.isPlainObject(n)&&Array.isArray(n.args)&&(r(\"method\"),r(\"args\"),r(\"label\",\"step-\"+s),r(\"value\",a.label),l.push(a));return l}var o=t(\"../../lib\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\"),s=t(\"./constants\"),c=s.name,u=l.steps;e.exports=function(t,e){i(t,e,{name:c,handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"./attributes\":109,\"./constants\":110}],112:[function(t,e,r){\"use strict\";function n(t){for(var e=t[C.name],r=[],n=0;n<e.length;n++){var a=e[n];a.visible&&a.steps.length&&r.push(a)}return r}function a(t){return t._index}function o(t,e){var r=A.tester.selectAll(\"g.\"+C.labelGroupClass).data(e.steps);r.enter().append(\"g\").classed(C.labelGroupClass,!0);var n=0,a=0;if(r.each(function(t){var r=w.select(this),o=c(r,{step:t},e),i=o.node()&&A.bBox(o.node()).width||0;a=o.node()&&A.bBox(o.node()).height||0,n=Math.max(n,i)}),r.remove(),e.inputAreaWidth=Math.max(C.railWidth,C.gripHeight),e.currentValueMaxWidth=0,e.currentValueHeight=0,e.currentValueTotalHeight=0,e.currentvalue.visible){var o=A.tester.append(\"g\");r.each(function(t){var r=l(o,e,t.label),n=r.node()&&A.bBox(r.node())||{width:0,height:0};e.currentValueMaxWidth=Math.max(e.currentValueMaxWidth,Math.ceil(n.width)),e.currentValueHeight=Math.max(e.currentValueHeight,Math.ceil(n.height))}),e.currentValueTotalHeight=e.currentValueHeight+e.currentvalue.offset,o.remove()}var i=t._fullLayout._size;e.lx=i.l+i.w*e.x,e.ly=i.t+i.h*(1-e.y),\"fraction\"===e.lenmode?e.outerLength=Math.round(i.w*e.len):e.outerLength=e.len,e.lenPad=Math.round(.5*C.gripWidth),e.inputAreaStart=0,e.inputAreaLength=Math.round(e.outerLength-e.pad.l-e.pad.r);var s=e.inputAreaLength-2*C.stepInset,u=s/(e.steps.length-1),f=n+C.labelPadding;e.labelStride=Math.max(1,Math.ceil(f/u)),e.labelHeight=a,e.height=e.currentValueTotalHeight+C.tickOffset+e.ticklen+C.labelOffset+e.labelHeight+e.pad.t+e.pad.b;var d=\"left\";L.isRightAnchor(e)&&(e.lx-=e.outerLength,d=\"right\"),L.isCenterAnchor(e)&&(e.lx-=e.outerLength/2,d=\"center\");var h=\"top\";L.isBottomAnchor(e)&&(e.ly-=e.height,h=\"bottom\"),L.isMiddleAnchor(e)&&(e.ly-=e.height/2,h=\"middle\"),e.outerLength=Math.ceil(e.outerLength),e.height=Math.ceil(e.height),e.lx=Math.round(e.lx),e.ly=Math.round(e.ly),k.autoMargin(t,C.autoMarginIdRoot+e._index,{x:e.x,y:e.y,l:e.outerLength*({right:1,center:.5}[d]||0),r:e.outerLength*({left:1,center:.5}[d]||0),b:e.height*({top:1,middle:.5}[h]||0),t:e.height*({bottom:1,middle:.5}[h]||0)})}function i(t,e,r){r.active>=r.steps.length&&(r.active=0),e.call(l,r).call(b,r).call(u,r).call(p,r).call(x,t,r).call(s,t,r),A.setTranslate(e,r.lx+r.pad.l,r.ly+r.pad.t),e.call(v,r,r.active/(r.steps.length-1),!1),e.call(l,r)}function l(t,e,r){if(e.currentvalue.visible){var n,a,o=t.selectAll(\"text\").data([0]);switch(e.currentvalue.xanchor){case\"right\":n=e.inputAreaLength-C.currentValueInset-e.currentValueMaxWidth,a=\"left\";break;case\"center\":n=.5*e.inputAreaLength,a=\"middle\";break;default:n=C.currentValueInset,a=\"left\"}o.enter().append(\"text\").classed(C.labelClass,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",a);var i=e.currentvalue.prefix?e.currentvalue.prefix:\"\";if(\"string\"==typeof r)i+=r;else{i+=e.steps[e.active].label}return e.currentvalue.suffix&&(i+=e.currentvalue.suffix),o.call(A.font,e.currentvalue.font).text(i).call(T.convertToTspans),A.setTranslate(o,n,e.currentValueHeight),o}}function s(t,e,r){var n=t.selectAll(\"rect.\"+C.gripRectClass).data([0]);n.enter().append(\"rect\").classed(C.gripRectClass,!0).call(h,e,t,r).style(\"pointer-events\",\"all\"),n.attr({width:C.gripWidth,height:C.gripHeight,rx:C.gripRadius,ry:C.gripRadius}).call(M.stroke,r.bordercolor).call(M.fill,r.bgcolor).style(\"stroke-width\",r.borderwidth+\"px\")}function c(t,e,r){var n=t.selectAll(\"text\").data([0]);return n.enter().append(\"text\").classed(C.labelClass,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"middle\"),n.call(A.font,r.font).text(e.step.label).call(T.convertToTspans),n}function u(t,e){var r=t.selectAll(\"g.\"+C.labelsClass).data([0]);r.enter().append(\"g\").classed(C.labelsClass,!0);var n=r.selectAll(\"g.\"+C.labelGroupClass).data(e.labelSteps);n.enter().append(\"g\").classed(C.labelGroupClass,!0),n.exit().remove(),n.each(function(t){var r=w.select(this);r.call(c,t,e),A.setTranslate(r,m(e,t.fraction),C.tickOffset+e.ticklen+e.labelHeight+C.labelOffset+e.currentValueTotalHeight)})}function f(t,e,r,n,a){var o=Math.round(n*(r.steps.length-1));o!==r.active&&d(t,e,r,o,!0,a)}function d(t,e,r,n,a,o){var i=r.active;r._input.active=r.active=n;var s=r.steps[r.active];e.call(v,r,r.active/(r.steps.length-1),o),e.call(l,r),t.emit(\"plotly_sliderchange\",{slider:r,step:r.steps[r.active],interaction:a,previousActive:i}),s&&s.method&&a&&(e._nextMethod?(e._nextMethod.step=s,e._nextMethod.doCallback=a,e._nextMethod.doTransition=o):(e._nextMethod={step:s,doCallback:a,doTransition:o},e._nextMethodRaf=window.requestAnimationFrame(function(){var r=e._nextMethod.step;r.method&&(k.executeAPICommand(t,r.method,r.args),e._nextMethod=null,e._nextMethodRaf=null)})))}function h(t,e,r){function n(){return r.data()[0]}var a=r.node(),o=w.select(e);t.on(\"mousedown\",function(){var t=n();e.emit(\"plotly_sliderstart\",{slider:t});var i=r.select(\".\"+C.gripRectClass);w.event.stopPropagation(),w.event.preventDefault(),i.call(M.fill,t.activebgcolor);var l=y(t,w.mouse(a)[0]);f(e,r,t,l,!0),t._dragging=!0,o.on(\"mousemove\",function(){var t=n(),o=y(t,w.mouse(a)[0]);f(e,r,t,o,!1)}),o.on(\"mouseup\",function(){var t=n();t._dragging=!1,i.call(M.fill,t.bgcolor),o.on(\"mouseup\",null),o.on(\"mousemove\",null),e.emit(\"plotly_sliderend\",{slider:t,step:t.steps[t.active]})})})}function p(t,e){var r=t.selectAll(\"rect.\"+C.tickRectClass).data(e.steps);r.enter().append(\"rect\").classed(C.tickRectClass,!0),r.exit().remove(),r.attr({width:e.tickwidth+\"px\",\"shape-rendering\":\"crispEdges\"}),r.each(function(t,r){var n=r%e.labelStride==0,a=w.select(this);a.attr({height:n?e.ticklen:e.minorticklen}).call(M.fill,e.tickcolor),A.setTranslate(a,m(e,r/(e.steps.length-1))-.5*e.tickwidth,(n?C.tickOffset:C.minorTickOffset)+e.currentValueTotalHeight)})}function g(t){t.labelSteps=[];for(var e=t.steps.length,r=0;r<e;r+=t.labelStride)t.labelSteps.push({fraction:r/(e-1),step:t.steps[r]})}function v(t,e,r,n){var a=t.select(\"rect.\"+C.gripRectClass),o=m(e,r);if(!e._invokingCommand){var i=a;n&&e.transition.duration>0&&(i=i.transition().duration(e.transition.duration).ease(e.transition.easing)),i.attr(\"transform\",\"translate(\"+(o-.5*C.gripWidth)+\",\"+e.currentValueTotalHeight+\")\")}}function m(t,e){return t.inputAreaStart+C.stepInset+(t.inputAreaLength-2*C.stepInset)*Math.min(1,Math.max(0,e))}function y(t,e){return Math.min(1,Math.max(0,(e-C.stepInset-t.inputAreaStart)/(t.inputAreaLength-2*C.stepInset-2*t.inputAreaStart)))}function x(t,e,r){var n=t.selectAll(\"rect.\"+C.railTouchRectClass).data([0]);n.enter().append(\"rect\").classed(C.railTouchRectClass,!0).call(h,e,t,r).style(\"pointer-events\",\"all\"),n.attr({width:r.inputAreaLength,height:Math.max(r.inputAreaWidth,C.tickOffset+r.ticklen+r.labelHeight)}).call(M.fill,r.bgcolor).attr(\"opacity\",0),A.setTranslate(n,0,r.currentValueTotalHeight)}function b(t,e){var r=t.selectAll(\"rect.\"+C.railRectClass).data([0]);r.enter().append(\"rect\").classed(C.railRectClass,!0);var n=e.inputAreaLength-2*C.railInset;r.attr({width:n,height:C.railWidth,rx:C.railRadius,ry:C.railRadius,\"shape-rendering\":\"crispEdges\"}).call(M.stroke,e.bordercolor).call(M.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\"),A.setTranslate(r,C.railInset,.5*(e.inputAreaWidth-C.railWidth)+e.currentValueTotalHeight)}function _(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(C.autoMarginIdRoot)!==-1&&k.autoMargin(t,a)}}var w=t(\"d3\"),k=t(\"../../plots/plots\"),M=t(\"../color\"),A=t(\"../drawing\"),T=t(\"../../lib/svg_text_utils\"),L=t(\"../legend/anchor_utils\"),C=t(\"./constants\");e.exports=function(t){var e=t._fullLayout,r=n(e),l=e._infolayer.selectAll(\"g.\"+C.containerClassName).data(r.length>0?[0]:[]);if(l.enter().append(\"g\").classed(C.containerClassName,!0).style(\"cursor\",\"ew-resize\"),l.exit().remove(),l.exit().size()&&_(t),0!==r.length){var s=l.selectAll(\"g.\"+C.groupClassName).data(r,a);s.enter().append(\"g\").classed(C.groupClassName,!0),s.exit().each(function(e){w.select(this).remove(),e._commandObserver.remove(),delete e._commandObserver,k.autoMargin(t,C.autoMarginIdRoot+e._index)});for(var c=0;c<r.length;c++){var u=r[c];o(t,u)}s.each(function(e){if(!(e.steps.length<2)){var r=w.select(this);g(e),k.manageCommandObserver(t,e,e.steps,function(e){var n=r.data()[0];n.active!==e.index&&(n._dragging||d(t,r,n,e.index,!1,!0))}),i(t,w.select(this),e)}})}}},{\"../../lib/svg_text_utils\":153,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":110,d3:7}],113:[function(t,e,r){\"use strict\";var n=t(\"./constants\");e.exports={moduleType:\"component\",name:n.name,layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\")}},{\"./attributes\":109,\"./constants\":110,\"./defaults\":111,\"./draw\":112}],114:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=t(\"../../plotly\"),i=t(\"../../plots/plots\"),l=t(\"../../lib\"),s=t(\"../drawing\"),c=t(\"../color\"),u=t(\"../../lib/svg_text_utils\"),f=t(\"../../constants/interactions\");(e.exports={}).draw=function(t,e,r){function d(t){l.syncOrAsync([h,p],t)}function h(e){return e.attr(\"transform\",_?\"rotate(\"+[_.rotate,b.x,b.y]+\") translate(0, \"+_.offset+\")\":null),e.style({\"font-family\":M,\"font-size\":n.round(A,2)+\"px\",fill:c.rgb(T),opacity:L*c.opacity(T),\"font-weight\":i.fontWeight}).attr(b).call(u.convertToTspans).attr(b),e.selectAll(\"tspan.line\").attr(b),i.previousPromises(t)}function p(t){var e=n.select(t.node().parentNode);if(x&&x.selection&&x.side&&S){e.attr(\"transform\",null);var r=0,o={left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\"}[x.side],i=[\"left\",\"top\"].indexOf(x.side)!==-1?-1:1,c=a(x.pad)?x.pad:2,u=s.bBox(e.node()),f={left:0,top:0,right:k.width,bottom:k.height},d=x.maxShift||(f[x.side]-u[x.side])*(\"left\"===x.side||\"top\"===x.side?-1:1);if(d<0)r=d;else{var h=x.offsetLeft||0,p=x.offsetTop||0;u.left-=h,u.right-=h,u.top-=p,u.bottom-=p,x.selection.each(function(){var t=s.bBox(this);l.bBoxIntersect(u,t,c)&&(r=Math.max(r,i*(t[x.side]-u[o])+c))}),r=Math.min(d,r)}if(r>0||d<0){var g={left:[-r,0],right:[r,0],top:[0,-r],bottom:[0,r]\n",
|
|
"}[x.side];e.attr(\"transform\",\"translate(\"+g+\")\")}}}var g=r.propContainer,v=r.propName,m=r.traceIndex,y=r.dfltName,x=r.avoid||{},b=r.attributes,_=r.transform,w=r.containerGroup,k=t._fullLayout,M=g.titlefont.family,A=g.titlefont.size,T=g.titlefont.color,L=1,C=!1,S=g.title.trim();\"\"===S&&(L=0),S.match(/Click to enter .+ title/)&&(L=.2,C=!0),w||(w=k._infolayer.selectAll(\".g-\"+e).data([0]),w.enter().append(\"g\").classed(\"g-\"+e,!0));var z=w.selectAll(\"text\").data([0]);z.enter().append(\"text\"),z.text(S).attr(\"class\",e),z.attr({\"data-unformatted\":S}).call(d);var O=\"Click to enter \"+y+\" title\";t._context.editable?(S?z.on(\".opacity\",null):function(){L=0,C=!0,S=O,z.attr({\"data-unformatted\":S}).text(S).on(\"mouseover.opacity\",function(){n.select(this).transition().duration(f.SHOW_PLACEHOLDER).style(\"opacity\",1)}).on(\"mouseout.opacity\",function(){n.select(this).transition().duration(f.HIDE_PLACEHOLDER).style(\"opacity\",0)})}(),z.call(u.makeEditable).on(\"edit\",function(e){void 0!==m?o.restyle(t,v,e,m):o.relayout(t,v,e)}).on(\"cancel\",function(){this.text(this.attr(\"data-unformatted\")).call(d)}).on(\"input\",function(t){this.text(t||\" \").attr(b).selectAll(\"tspan.line\").attr(b)})):S&&!S.match(/Click to enter .+ title/)||z.remove(),z.classed(\"js-placeholder\",C)}},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,d3:7,\"fast-isnumeric\":10}],115:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"../../plots/pad_attributes\"),l={_isLinkedToArray:\"button\",method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\",dflt:\"\"}};e.exports={_isLinkedToArray:\"updatemenu\",_arrayAttrRegexps:[/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"dropdown\",\"buttons\"],dflt:\"dropdown\"},direction:{valType:\"enumerated\",values:[\"left\",\"right\",\"up\",\"down\"],dflt:\"down\"},active:{valType:\"integer\",min:-1,dflt:0},showactive:{valType:\"boolean\",dflt:!0},buttons:l,x:{valType:\"number\",min:-2,max:3,dflt:-.05},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"right\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},pad:o({},i,{}),font:o({},n,{}),bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.borderLine},borderwidth:{valType:\"number\",min:0,dflt:1}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../../plots/pad_attributes\":198,\"../color/attributes\":24}],116:[function(t,e,r){\"use strict\";e.exports={name:\"updatemenus\",containerClassName:\"updatemenu-container\",headerGroupClassName:\"updatemenu-header-group\",headerClassName:\"updatemenu-header\",headerArrowClassName:\"updatemenu-header-arrow\",dropdownButtonGroupClassName:\"updatemenu-dropdown-button-group\",dropdownButtonClassName:\"updatemenu-dropdown-button\",buttonClassName:\"updatemenu-button\",itemRectClassName:\"updatemenu-item-rect\",itemTextClassName:\"updatemenu-item-text\",menuIndexAttrName:\"updatemenu-active-index\",autoMarginIdRoot:\"updatemenu-\",blankHeaderOpts:{label:\" \"},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,fontSizeToHeight:1.3,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:\"#F4FAFF\",hoverColor:\"#F4FAFF\"}},{}],117:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return o.coerce(t,e,l,r,n)}n(\"visible\",a(t,e).length>0)&&(n(\"active\"),n(\"direction\"),n(\"type\"),n(\"showactive\"),n(\"x\"),n(\"y\"),o.noneOrAll(t,e,[\"x\",\"y\"]),n(\"xanchor\"),n(\"yanchor\"),n(\"pad.t\"),n(\"pad.r\"),n(\"pad.b\"),n(\"pad.l\"),o.coerceFont(n,\"font\",r.font),n(\"bgcolor\",r.paper_bgcolor),n(\"bordercolor\"),n(\"borderwidth\"))}function a(t,e){function r(t,e){return o.coerce(n,a,u,t,e)}for(var n,a,i=t.buttons||[],l=e.buttons=[],s=0;s<i.length;s++)n=i[s],a={},o.isPlainObject(n)&&Array.isArray(n.args)&&(r(\"method\"),r(\"args\"),r(\"label\"),a._index=s,l.push(a));return l}var o=t(\"../../lib\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\"),s=t(\"./constants\"),c=s.name,u=l.buttons;e.exports=function(t,e){i(t,e,{name:c,handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"./attributes\":115,\"./constants\":116}],118:[function(t,e,r){\"use strict\";function n(t){for(var e=t[C.name],r=[],n=0;n<e.length;n++){var a=e[n];a.visible&&r.push(a)}return r}function a(t){return t._index}function o(t){return+t.attr(C.menuIndexAttrName)==-1}function i(t,e){return+t.attr(C.menuIndexAttrName)===e._index}function l(t,e,r,n,a,o,i,l){e._input.active=e.active=i,\"buttons\"===e.type?c(t,n,null,null,e):\"dropdown\"===e.type&&(a.attr(C.menuIndexAttrName,\"-1\"),s(t,n,a,o,e),l||c(t,n,a,o,e))}function s(t,e,r,n,a){var o=e.selectAll(\"g.\"+C.headerClassName).data([0]);o.enter().append(\"g\").classed(C.headerClassName,!0).style(\"pointer-events\",\"all\");var l=a.active,s=a.buttons[l]||C.blankHeaderOpts,u={y:a.pad.t,yPad:0,x:a.pad.l,xPad:0,index:0},f={width:a.headerWidth,height:a.headerHeight};o.call(d,a,s).call(x,a,u,f);var h=e.selectAll(\"text.\"+C.headerArrowClassName).data([0]);h.enter().append(\"text\").classed(C.headerArrowClassName,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"end\").call(A.font,a.font).text(\"\\u25bc\"),h.attr({x:a.headerWidth-C.arrowOffsetX+a.pad.l,y:a.headerHeight/2+C.textOffsetY+a.pad.t}),o.on(\"click\",function(){r.call(b),r.attr(C.menuIndexAttrName,i(r,a)?-1:String(a._index)),c(t,e,r,n,a)}),o.on(\"mouseover\",function(){o.call(v)}),o.on(\"mouseout\",function(){o.call(m,a)}),A.setTranslate(e,a.lx,a.ly)}function c(t,e,r,n,a){r||(r=e,r.attr(\"pointer-events\",\"all\"));var i=o(r)&&\"buttons\"!==a.type?[]:a.buttons,s=\"dropdown\"===a.type?C.dropdownButtonClassName:C.buttonClassName,c=r.selectAll(\"g.\"+s).data(i),h=c.enter().append(\"g\").classed(s,!0),p=c.exit();\"dropdown\"===a.type?(h.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),p.transition().attr(\"opacity\",\"0\").remove()):p.remove();var y=0,b=0,_=[\"up\",\"down\"].indexOf(a.direction)!==-1;\"dropdown\"===a.type&&(_?b=a.headerHeight+C.gapButtonHeader:y=a.headerWidth+C.gapButtonHeader),\"dropdown\"===a.type&&\"up\"===a.direction&&(b=-C.gapButtonHeader+C.gapButton-a.openHeight),\"dropdown\"===a.type&&\"left\"===a.direction&&(y=-C.gapButtonHeader+C.gapButton-a.openWidth);var M={x:a.lx+y+a.pad.l,y:a.ly+b+a.pad.t,yPad:C.gapButton,xPad:C.gapButton,index:0},A={l:M.x+a.borderwidth,t:M.y+a.borderwidth};c.each(function(o,i){var s=w.select(this);s.call(d,a,o).call(x,a,M),s.on(\"click\",function(){w.event.defaultPrevented||(l(t,a,o,e,r,n,i),k.executeAPICommand(t,o.method,o.args),t.emit(\"plotly_buttonclicked\",{menu:a,button:o,active:a.active}))}),s.on(\"mouseover\",function(){s.call(v)}),s.on(\"mouseout\",function(){s.call(m,a),c.call(g,a)})}),c.call(g,a),_?(A.w=Math.max(a.openWidth,a.headerWidth),A.h=M.y-A.t):(A.w=M.x-A.l,A.h=Math.max(a.openHeight,a.headerHeight)),A.direction=a.direction,n&&(c.size()?u(t,e,r,n,a,A):f(n))}function u(t,e,r,n,a,o){var i,l,s,c=a.direction,u=\"up\"===c||\"down\"===c,f=a.active;if(u)for(l=0,s=0;s<f;s++)l+=a.heights[s]+C.gapButton;else for(i=0,s=0;s<f;s++)i+=a.widths[s]+C.gapButton;n.enable(o,i,l),n.hbar&&n.hbar.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),n.vbar&&n.vbar.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\")}function f(t){var e=!!t.hbar,r=!!t.vbar;e&&t.hbar.transition().attr(\"opacity\",\"0\").each(\"end\",function(){e=!1,r||t.disable()}),r&&t.vbar.transition().attr(\"opacity\",\"0\").each(\"end\",function(){r=!1,e||t.disable()})}function d(t,e,r){t.call(h,e).call(p,e,r)}function h(t,e){var r=t.selectAll(\"rect\").data([0]);r.enter().append(\"rect\").classed(C.itemRectClassName,!0).attr({rx:C.rx,ry:C.ry,\"shape-rendering\":\"crispEdges\"}),r.call(M.stroke,e.bordercolor).call(M.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\")}function p(t,e,r){var n=t.selectAll(\"text\").data([0]);n.enter().append(\"text\").classed(C.itemTextClassName,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"start\"),n.call(A.font,e.font).text(r.label).call(T.convertToTspans)}function g(t,e){var r=e.active;t.each(function(t,n){var a=w.select(this);n===r&&e.showactive&&a.select(\"rect.\"+C.itemRectClassName).call(M.fill,C.activeColor)})}function v(t){t.select(\"rect.\"+C.itemRectClassName).call(M.fill,C.hoverColor)}function m(t,e){t.select(\"rect.\"+C.itemRectClassName).call(M.fill,e.bgcolor)}function y(t,e){e.width1=0,e.height1=0,e.heights=[],e.widths=[],e.totalWidth=0,e.totalHeight=0,e.openWidth=0,e.openHeight=0,e.lx=0,e.ly=0;var r=A.tester.selectAll(\"g.\"+C.dropdownButtonClassName).data(e.buttons);r.enter().append(\"g\").classed(C.dropdownButtonClassName,!0);var n=[\"up\",\"down\"].indexOf(e.direction)!==-1;r.each(function(t,r){var a=w.select(this);a.call(d,e,t);var o=a.select(\".\"+C.itemTextClassName),i=o.selectAll(\"tspan\"),l=o.node()&&A.bBox(o.node()).width,s=Math.max(l+C.textPadX,C.minWidth),c=e.font.size*C.fontSizeToHeight,u=i[0].length||1,f=Math.max(c*u,C.minHeight)+C.textOffsetY;f=Math.ceil(f),s=Math.ceil(s),e.widths[r]=s,e.heights[r]=f,e.height1=Math.max(e.height1,f),e.width1=Math.max(e.width1,s),n?(e.totalWidth=Math.max(e.totalWidth,s),e.openWidth=e.totalWidth,e.totalHeight+=f+C.gapButton,e.openHeight+=f+C.gapButton):(e.totalWidth+=s+C.gapButton,e.openWidth+=s+C.gapButton,e.totalHeight=Math.max(e.totalHeight,f),e.openHeight=e.totalHeight)}),n?e.totalHeight-=C.gapButton:e.totalWidth-=C.gapButton,e.headerWidth=e.width1+C.arrowPadX,e.headerHeight=e.height1,\"dropdown\"===e.type&&(n?(e.width1+=C.arrowPadX,e.totalHeight=e.height1):e.totalWidth=e.width1,e.totalWidth+=C.arrowPadX),r.remove();var a=e.totalWidth+e.pad.l+e.pad.r,o=e.totalHeight+e.pad.t+e.pad.b,i=t._fullLayout._size;e.lx=i.l+i.w*e.x,e.ly=i.t+i.h*(1-e.y);var l=\"left\";L.isRightAnchor(e)&&(e.lx-=a,l=\"right\"),L.isCenterAnchor(e)&&(e.lx-=a/2,l=\"center\");var s=\"top\";L.isBottomAnchor(e)&&(e.ly-=o,s=\"bottom\"),L.isMiddleAnchor(e)&&(e.ly-=o/2,s=\"middle\"),e.totalWidth=Math.ceil(e.totalWidth),e.totalHeight=Math.ceil(e.totalHeight),e.lx=Math.round(e.lx),e.ly=Math.round(e.ly),k.autoMargin(t,C.autoMarginIdRoot+e._index,{x:e.x,y:e.y,l:a*({right:1,center:.5}[l]||0),r:a*({left:1,center:.5}[l]||0),b:o*({top:1,middle:.5}[s]||0),t:o*({bottom:1,middle:.5}[s]||0)})}function x(t,e,r,n){n=n||{};var a=t.select(\".\"+C.itemRectClassName),o=t.select(\".\"+C.itemTextClassName),i=o.selectAll(\"tspan\"),l=e.borderwidth,s=r.index;A.setTranslate(t,l+r.x,l+r.y);var c=[\"up\",\"down\"].indexOf(e.direction)!==-1;a.attr({x:0,y:0,width:n.width||(c?e.width1:e.widths[s]),height:n.height||(c?e.heights[s]:e.height1)});var u=e.font.size*C.fontSizeToHeight,f=i[0].length||1,d=(f-1)*u/4,h={x:C.textOffsetX,y:e.heights[s]/2-d+C.textOffsetY};o.attr(h),i.attr(h),c?r.y+=e.heights[s]+r.yPad:r.x+=e.widths[s]+r.xPad,r.index++}function b(t){t.selectAll(\"g.\"+C.dropdownButtonClassName).remove()}function _(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(C.autoMarginIdRoot)!==-1&&k.autoMargin(t,a)}}var w=t(\"d3\"),k=t(\"../../plots/plots\"),M=t(\"../color\"),A=t(\"../drawing\"),T=t(\"../../lib/svg_text_utils\"),L=t(\"../legend/anchor_utils\"),C=t(\"./constants\"),S=t(\"./scrollbox\");e.exports=function(t){var e=t._fullLayout,r=n(e),o=e._infolayer.selectAll(\"g.\"+C.containerClassName).data(r.length>0?[0]:[]);if(o.enter().append(\"g\").classed(C.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().remove(),o.exit().size()&&_(t),0!==r.length){var u=o.selectAll(\"g.\"+C.headerGroupClassName).data(r,a);u.enter().append(\"g\").classed(C.headerGroupClassName,!0);var f=o.selectAll(\"g.\"+C.dropdownButtonGroupClassName).data([0]);f.enter().append(\"g\").classed(C.dropdownButtonGroupClassName,!0).style(\"pointer-events\",\"all\");for(var d=0;d<r.length;d++){var h=r[d];y(t,h)}var p=\"updatemenus\"+e._uid,g=new S(t,f,p);u.enter().size()&&f.call(b).attr(C.menuIndexAttrName,\"-1\"),u.exit().each(function(e){w.select(this).remove(),f.call(b).attr(C.menuIndexAttrName,\"-1\"),k.autoMargin(t,C.autoMarginIdRoot+e._index)}),u.each(function(e){var r=w.select(this),n=\"dropdown\"===e.type?f:null;k.manageCommandObserver(t,e,e.buttons,function(a){l(t,e,e.buttons[a.index],r,n,g,a.index,!0)}),\"dropdown\"===e.type?(s(t,r,f,g,e),i(f,e)&&c(t,r,f,g,e)):c(t,r,null,null,e)})}}},{\"../../lib/svg_text_utils\":153,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":116,\"./scrollbox\":120,d3:7}],119:[function(t,e,r){arguments[4][113][0].apply(r,arguments)},{\"./attributes\":115,\"./constants\":116,\"./defaults\":117,\"./draw\":118,dup:113}],120:[function(t,e,r){\"use strict\";function n(t,e,r){this.gd=t,this.container=e,this.id=r,this.position=null,this.translateX=null,this.translateY=null,this.hbar=null,this.vbar=null,this.bg=this.container.selectAll(\"rect.scrollbox-bg\").data([0]),this.bg.exit().on(\".drag\",null).on(\"wheel\",null).remove(),this.bg.enter().append(\"rect\").classed(\"scrollbox-bg\",!0).style(\"pointer-events\",\"all\").attr({opacity:0,x:0,y:0,width:0,height:0})}e.exports=n;var a=t(\"d3\"),o=t(\"../color\"),i=t(\"../drawing\"),l=t(\"../../lib\");n.barWidth=2,n.barLength=20,n.barRadius=2,n.barPad=1,n.barColor=\"#808BA4\",n.prototype.enable=function(t,e,r){var l=this.gd._fullLayout,s=l.width,c=l.height;this.position=t;var u,f,d,h,p=this.position.l,g=this.position.w,v=this.position.t,m=this.position.h,y=this.position.direction,x=\"down\"===y,b=\"left\"===y,_=\"right\"===y,w=\"up\"===y,k=g,M=m;x||b||_||w||(this.position.direction=\"down\",x=!0),x||w?(u=p,f=u+k,x?(d=v,h=Math.min(d+M,c),M=h-d):(h=v+M,d=Math.max(h-M,0),M=h-d)):(d=v,h=d+M,b?(f=p+k,u=Math.max(f-k,0),k=f-u):(u=p,f=Math.min(u+k,s),k=f-u)),this._box={l:u,t:d,w:k,h:M};var A=g>k,T=n.barLength+2*n.barPad,L=n.barWidth+2*n.barPad,C=p,S=v+m;S+L>c&&(S=c-L);var z=this.container.selectAll(\"rect.scrollbar-horizontal\").data(A?[0]:[]);z.exit().on(\".drag\",null).remove(),z.enter().append(\"rect\").classed(\"scrollbar-horizontal\",!0).call(o.fill,n.barColor),A?(this.hbar=z.attr({rx:n.barRadius,ry:n.barRadius,x:C,y:S,width:T,height:L}),this._hbarXMin=C+T/2,this._hbarTranslateMax=k-T):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var O=m>M,D=n.barWidth+2*n.barPad,P=n.barLength+2*n.barPad,E=p+g,N=v;E+D>s&&(E=s-D);var I=this.container.selectAll(\"rect.scrollbar-vertical\").data(O?[0]:[]);I.exit().on(\".drag\",null).remove(),I.enter().append(\"rect\").classed(\"scrollbar-vertical\",!0).call(o.fill,n.barColor),O?(this.vbar=I.attr({rx:n.barRadius,ry:n.barRadius,x:E,y:N,width:D,height:P}),this._vbarYMin=N+P/2,this._vbarTranslateMax=M-P):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=u-.5,j=O?f+D+.5:f+.5,B=d-.5,q=A?h+L+.5:h+.5,H=l._topdefs.selectAll(\"#\"+R).data(A||O?[0]:[]);if(H.exit().remove(),H.enter().append(\"clipPath\").attr(\"id\",R).append(\"rect\"),A||O?(this._clipRect=H.select(\"rect\").attr({x:Math.floor(F),y:Math.floor(B),width:Math.ceil(j)-Math.floor(F),height:Math.ceil(q)-Math.floor(B)}),this.container.call(i.setClipUrl,R),this.bg.attr({x:p,y:v,width:g,height:m})):(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(i.setClipUrl,null),delete this._clipRect),A||O){var V=a.behavior.drag().on(\"dragstart\",function(){a.event.sourceEvent.preventDefault()}).on(\"drag\",this._onBoxDrag.bind(this));this.container.on(\"wheel\",null).on(\"wheel\",this._onBoxWheel.bind(this)).on(\".drag\",null).call(V);var U=a.behavior.drag().on(\"dragstart\",function(){a.event.sourceEvent.preventDefault(),a.event.sourceEvent.stopPropagation()}).on(\"drag\",this._onBarDrag.bind(this));A&&this.hbar.on(\".drag\",null).call(U),O&&this.vbar.on(\".drag\",null).call(U)}this.setTranslate(e,r)},n.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(i.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(\".drag\",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(\".drag\",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},n.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=a.event.dx),this.vbar&&(e-=a.event.dy),this.setTranslate(t,e)},n.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=a.event.deltaY),this.vbar&&(e+=a.event.deltaY),this.setTranslate(t,e)},n.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,n=r+this._hbarTranslateMax;t=(l.constrain(a.event.x,r,n)-r)/(n-r)*(this.position.w-this._box.w)}if(this.vbar){var o=e+this._vbarYMin,i=o+this._vbarTranslateMax;e=(l.constrain(a.event.y,o,i)-o)/(i-o)*(this.position.h-this._box.h)}this.setTranslate(t,e)},n.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=l.constrain(t||0,0,r),e=l.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(i.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var a=t/r;this.hbar.call(i.setTranslate,t+a*this._hbarTranslateMax,e)}if(this.vbar){var o=e/n;this.vbar.call(i.setTranslate,t,e+o*this._vbarTranslateMax)}}},{\"../../lib\":136,\"../color\":25,\"../drawing\":49,d3:7}],121:[function(t,e,r){\"use strict\";e.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DBLCLICKDELAY:300}},{}],122:[function(t,e,r){\"use strict\";e.exports={BADNUM:void 0,FP_SAFE:Number.MAX_VALUE/1e4,ONEAVGYEAR:315576e5,ONEAVGMONTH:26298e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:1-1e-6}},{}],123:[function(t,e,r){\"use strict\";e.exports={entityToUnicode:{mu:\"\\u03bc\",amp:\"&\",lt:\"<\",gt:\">\",nbsp:\"\\xa0\",times:\"\\xd7\",plusmn:\"\\xb1\",deg:\"\\xb0\"},unicodeToEntity:{\"&\":\"amp\",\"<\":\"lt\",\">\":\"gt\",'\"':\"quot\",\"'\":\"#x27\",\"/\":\"#x2F\"}}},{}],124:[function(t,e,r){\"use strict\";r.xmlns=\"http://www.w3.org/2000/xmlns/\",r.svg=\"http://www.w3.org/2000/svg\",r.xlink=\"http://www.w3.org/1999/xlink\",r.svgAttrs={xmlns:r.svg,\"xmlns:xlink\":r.xlink}},{}],125:[function(t,e,r){\"use strict\";var n=t(\"./plotly\");/*export for widget*/window.Plotly=n;r.version=\"1.27.1\",t(\"es6-promise\").polyfill(),t(\"../build/plotcss\"),t(\"./fonts/mathjax_config\"),r.plot=n.plot,r.newPlot=n.newPlot,r.restyle=n.restyle,r.relayout=n.relayout,r.redraw=n.redraw,r.update=n.update,r.extendTraces=n.extendTraces,r.prependTraces=n.prependTraces,r.addTraces=n.addTraces,r.deleteTraces=n.deleteTraces,r.moveTraces=n.moveTraces,r.purge=n.purge,r.setPlotConfig=t(\"./plot_api/set_plot_config\"),r.register=t(\"./plot_api/register\"),r.toImage=t(\"./plot_api/to_image\"),r.downloadImage=t(\"./snapshot/download\"),r.validate=t(\"./plot_api/validate\"),r.addFrames=n.addFrames,r.deleteFrames=n.deleteFrames,r.animate=n.animate,r.register(t(\"./traces/scatter\")),r.register([t(\"./components/fx\"),t(\"./components/legend\"),t(\"./components/annotations\"),t(\"./components/shapes\"),t(\"./components/images\"),t(\"./components/updatemenus\"),t(\"./components/sliders\"),t(\"./components/rangeslider\"),t(\"./components/rangeselector\")]),r.Icons=t(\"../build/ploticon\"),r.Plots=n.Plots,r.Fx=t(\"./components/fx\"),r.Snapshot=t(\"./snapshot\"),r.PlotSchema=t(\"./plot_api/plot_schema\"),r.Queue=t(\"./lib/queue\"),r.d3=t(\"d3\")},{\"../build/plotcss\":1,\"../build/ploticon\":2,\"./components/annotations\":23,\"./components/fx\":66,\"./components/images\":74,\"./components/legend\":82,\"./components/rangeselector\":94,\"./components/rangeslider\":100,\"./components/shapes\":107,\"./components/sliders\":113,\"./components/updatemenus\":119,\"./fonts/mathjax_config\":126,\"./lib/queue\":148,\"./plot_api/plot_schema\":160,\"./plot_api/register\":161,\"./plot_api/set_plot_config\":162,\"./plot_api/to_image\":164,\"./plot_api/validate\":165,\"./plotly\":166,\"./snapshot\":211,\"./snapshot/download\":208,\"./traces/scatter\":250,d3:7,\"es6-promise\":8}],126:[function(t,e,r){\"use strict\";\"undefined\"!=typeof MathJax?(r.MathJax=!0,MathJax.Hub.Config({messageStyle:\"none\",skipStartupTypeset:!0,displayAlign:\"left\",tex2jax:{inlineMath:[[\"$\",\"$\"],[\"\\\\(\",\"\\\\)\"]]}}),MathJax.Hub.Configured()):r.MathJax=!1},{}],127:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../constants/numerical\").BADNUM;e.exports=function(t){return\"string\"==typeof t&&(t=t.replace(/^['\"%,$#\\s']+|[, ]|['\"%,$#\\s']+$/g,\"\")),n(t)?Number(t):a}},{\"../constants/numerical\":122,\"fast-isnumeric\":10}],128:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"tinycolor2\"),o=t(\"../components/colorscale/get_scale\"),i=(Object.keys(t(\"../components/colorscale/scales\")),t(\"./nested_property\")),l=/^([2-9]|[1-9][0-9]+)$/;r.valObjects={data_array:{coerceFunction:function(t,e,r){Array.isArray(t)?e.set(t):void 0!==r&&e.set(r)}},enumerated:{coerceFunction:function(t,e,r,n){n.coerceNumber&&(t=+t),n.values.indexOf(t)===-1?e.set(r):e.set(t)}},boolean:{coerceFunction:function(t,e,r){t===!0||t===!1?e.set(t):e.set(r)}},number:{coerceFunction:function(t,e,r,a){!n(t)||void 0!==a.min&&t<a.min||void 0!==a.max&&t>a.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,a){t%1||!n(t)||void 0!==a.min&&t<a.min||void 0!==a.max&&t>a.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t){var a=\"number\"==typeof t;n.strict!==!0&&a?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){a(t).isValid()?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o(t,r))}},angle:{coerceFunction:function(t,e,r){\"auto\"===t?e.set(\"auto\"):n(t)?(Math.abs(t)>180&&(t-=360*Math.round(t/360)),e.set(+t)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r){var n=r.length;if(\"string\"==typeof t&&t.substr(0,n)===r&&l.test(t.substr(n)))return void e.set(t);e.set(r)},validateFunction:function(t,e){var r=e.dflt,n=r.length;return t===r||\"string\"==typeof t&&!(t.substr(0,n)!==r||!l.test(t.substr(n)))}},flaglist:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t)return void e.set(r);if((n.extras||[]).indexOf(t)!==-1)return void e.set(t);for(var a=t.split(\"+\"),o=0;o<a.length;){var i=a[o];n.flags.indexOf(i)===-1||a.indexOf(i)<o?a.splice(o,1):o++}a.length?e.set(a.join(\"+\")):e.set(r)}},any:{coerceFunction:function(t,e,r){void 0===t?e.set(r):e.set(t)}},info_array:{coerceFunction:function(t,e,n,a){if(!Array.isArray(t))return void e.set(n);var o=a.items,i=[];n=Array.isArray(n)?n:[];for(var l=0;l<o.length;l++)r.coerce(t,i,o,\"[\"+l+\"]\",n[l]);e.set(i)},validateFunction:function(t,e){if(!Array.isArray(t))return!1;var n=e.items;if(!e.freeLength&&t.length!==n.length)return!1;for(var a=0;a<t.length;a++){if(!r.validate(t[a],e.items[a]))return!1}return!0}}},r.coerce=function(t,e,n,a,o){var l=i(n,a).get(),s=i(t,a),c=i(e,a),u=s.get();return void 0===o&&(o=l.dflt),l.arrayOk&&Array.isArray(u)?(c.set(u),u):(r.valObjects[l.valType].coerceFunction(u,c,o,l),c.get())},r.coerce2=function(t,e,n,a,o){var l=i(t,a),s=r.coerce(t,e,n,a,o),c=l.get();return void 0!==c&&null!==c&&s},r.coerceFont=function(t,e,r){var n={};return r=r||{},n.family=t(e+\".family\",r.family),n.size=t(e+\".size\",r.size),n.color=t(e+\".color\",r.color),n},r.validate=function(t,e){var n=r.valObjects[e.valType];if(e.arrayOk&&Array.isArray(t))return!0;if(n.validateFunction)return n.validateFunction(t,e);var a={},o=a,i={set:function(t){o=t}};return n.coerceFunction(t,i,a,e),o!==a}},{\"../components/colorscale/get_scale\":37,\"../components/colorscale/scales\":43,\"./nested_property\":142,\"fast-isnumeric\":10,tinycolor2:13}],129:[function(t,e,r){\"use strict\";function n(t){return t&&k.componentsRegistry.calendars&&\"string\"==typeof t&&\"gregorian\"!==t}function a(t,e){return String(t+Math.pow(10,e)).substr(1)}function o(t,e,r,n,o){if((e||r||n||o)&&(t+=\" \"+a(e,2)+\":\"+a(r,2),(n||o)&&(t+=\":\"+a(n,2),o))){for(var i=4;o%10==0;)i-=1,o/=10;t+=\".\"+a(o,i)}return t}function i(t,e,r){t=t.replace(O,function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,\"\")||\"0\"});var a=new Date(Math.floor(e+.05));if(n(r))try{t=k.getComponentMethod(\"calendars\",\"worldCalFmt\")(t,e,r)}catch(t){return\"Invalid\"}return M(t)(a)}function l(t,e){var r=g(t+.05,y),n=a(Math.floor(r/x),2)+\":\"+a(g(Math.floor(r/b),60),2);if(\"M\"!==e){h(e)||(e=0);var o=Math.min(g(t/_,60),D[e]),i=(100+o).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,\"\").replace(/[\\.]$/,\"\")),n+=\":\"+i}return n}function s(t){return t.formatDate(\"yyyy\")}function c(t){return t.formatDate(\"M yyyy\")}function u(t){return t.formatDate(\"M d\")}function f(t){return t.formatDate(\"M d, yyyy\")}var d=t(\"d3\"),h=t(\"fast-isnumeric\"),p=t(\"./loggers\").error,g=t(\"./mod\"),v=t(\"../constants/numerical\"),m=v.BADNUM,y=v.ONEDAY,x=v.ONEHOUR,b=v.ONEMIN,_=v.ONESEC,w=v.EPOCHJD,k=t(\"../registry\"),M=d.time.format.utc,A=(new Date).getFullYear()-70;r.dateTick0=function(t,e){return n(t)?e?k.getComponentMethod(\"calendars\",\"CANONICAL_SUNDAY\")[t]:k.getComponentMethod(\"calendars\",\"CANONICAL_TICK\")[t]:e?\"2000-01-02\":\"2000-01-01\"},r.dfltRange=function(t){return n(t)?k.getComponentMethod(\"calendars\",\"DFLTRANGE\")[t]:[\"2000-01-01\",\"2001-01-01\"]},r.isJSDate=function(t){return\"object\"==typeof t&&null!==t&&\"function\"==typeof t.getTime};var T,L;r.dateTime2ms=function(t,e){if(r.isJSDate(t))return t=Number(t)-t.getTimezoneOffset()*b,t>=T&&t<=L?t:m;if(\"string\"!=typeof t&&\"number\"!=typeof t)return m;t=String(t);var a=n(e),o=t.charAt(0);!a||\"G\"!==o&&\"g\"!==o||(t=t.substr(1),e=\"\");var i=a&&\"chinese\"===e.substr(0,7),l=t.match(i?/^\\s*(-?\\d\\d\\d\\d|\\d\\d)(-(\\d?\\di?)(-(\\d?\\d)([ Tt]([01]?\\d|2[0-3])(:([0-5]\\d)(:([0-5]\\d(\\.\\d+)?))?(Z|z|[+\\-]\\d\\d:?\\d\\d)?)?)?)?)?\\s*$/m:/^\\s*(-?\\d\\d\\d\\d|\\d\\d)(-(\\d?\\d)(-(\\d?\\d)([ Tt]([01]?\\d|2[0-3])(:([0-5]\\d)(:([0-5]\\d(\\.\\d+)?))?(Z|z|[+\\-]\\d\\d:?\\d\\d)?)?)?)?)?\\s*$/m);if(!l)return m;var s=l[1],c=l[3]||\"1\",u=Number(l[5]||1),f=Number(l[7]||0),d=Number(l[9]||0),h=Number(l[11]||0);if(a){if(2===s.length)return m;s=Number(s);var p;try{var g=k.getComponentMethod(\"calendars\",\"getCal\")(e);if(i){var v=\"i\"===c.charAt(c.length-1);c=parseInt(c,10),p=g.newDate(s,g.toMonthIndex(s,c,v),u)}else p=g.newDate(s,Number(c),u)}catch(t){return m}return p?(p.toJD()-w)*y+f*x+d*b+h*_:m}s=2===s.length?(Number(s)+2e3-A)%100+A:Number(s),c-=1;var M=new Date(Date.UTC(2e3,c,u,f,d));return M.setUTCFullYear(s),M.getUTCMonth()!==c?m:M.getUTCDate()!==u?m:M.getTime()+h*_},T=r.MIN_MS=r.dateTime2ms(\"-9999\"),L=r.MAX_MS=r.dateTime2ms(\"9999-12-31 23:59:59.9999\"),r.isDateTime=function(t,e){return r.dateTime2ms(t,e)!==m};var C=90*y,S=3*x,z=5*b;r.ms2DateTime=function(t,e,r){if(\"number\"!=typeof t||!(t>=T&&t<=L))return m;e||(e=0);var a,i,l,s,c,u,f=Math.floor(10*g(t+.05,1)),d=Math.round(t-f/10);if(n(r)){var h=Math.floor(d/y)+w,p=Math.floor(g(t,y));try{a=k.getComponentMethod(\"calendars\",\"getCal\")(r).fromJD(h).formatDate(\"yyyy-mm-dd\")}catch(t){a=M(\"G%Y-%m-%d\")(new Date(d))}if(\"-\"===a.charAt(0))for(;a.length<11;)a=\"-0\"+a.substr(1);else for(;a.length<10;)a=\"0\"+a;i=e<C?Math.floor(p/x):0,l=e<C?Math.floor(p%x/b):0,s=e<S?Math.floor(p%b/_):0,c=e<z?p%_*10+f:0}else u=new Date(d),a=M(\"%Y-%m-%d\")(u),i=e<C?u.getUTCHours():0,l=e<C?u.getUTCMinutes():0,s=e<S?u.getUTCSeconds():0,c=e<z?10*u.getUTCMilliseconds()+f:0;return o(a,i,l,s,c)},r.ms2DateTimeLocal=function(t){if(!(t>=T+y&&t<=L-y))return m;var e=Math.floor(10*g(t+.05,1)),r=new Date(Math.round(t-e/10));return o(d.time.format(\"%Y-%m-%d\")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},r.cleanDate=function(t,e,a){if(r.isJSDate(t)||\"number\"==typeof t){if(n(a))return p(\"JS Dates and milliseconds are incompatible with world calendars\",t),e;if(!(t=r.ms2DateTimeLocal(+t))&&void 0!==e)return e}else if(!r.isDateTime(t,a))return p(\"unrecognized date\",t),e;return t};var O=/%\\d?f/g,D=[59,59.9,59.99,59.999,59.9999],P=M(\"%Y\"),E=M(\"%b %Y\"),N=M(\"%b %-d\"),I=M(\"%b %-d, %Y\");r.formatDate=function(t,e,r,a){var o,d;if(a=n(a)&&a,e)return i(e,t,a);if(a)try{var h=Math.floor((t+.05)/y)+w,p=k.getComponentMethod(\"calendars\",\"getCal\")(a).fromJD(h);\"y\"===r?d=s(p):\"m\"===r?d=c(p):\"d\"===r?(o=s(p),d=u(p)):(o=f(p),d=l(t,r))}catch(t){return\"Invalid\"}else{var g=new Date(Math.floor(t+.05));\"y\"===r?d=P(g):\"m\"===r?d=E(g):\"d\"===r?(o=P(g),d=N(g)):(o=I(g),d=l(t,r))}return d+(o?\"\\n\"+o:\"\")};var R=3*y;r.incrementMonth=function(t,e,r){r=n(r)&&r;var a=g(t,y);if(t=Math.round(t-a),r)try{var o=Math.round(t/y)+w,i=k.getComponentMethod(\"calendars\",\"getCal\")(r),l=i.fromJD(o);return e%12?i.add(l,e,\"m\"):i.add(l,e/12,\"y\"),(l.toJD()-w)*y+a}catch(e){p(\"invalid ms \"+t+\" in calendar \"+r)}var s=new Date(t+R);return s.setUTCMonth(s.getUTCMonth()+e)+a-R},r.findExactDates=function(t,e){for(var r,a,o=0,i=0,l=0,s=0,c=n(e)&&k.getComponentMethod(\"calendars\",\"getCal\")(e),u=0;u<t.length;u++)if(a=t[u],h(a)){if(!(a%y))if(c)try{r=c.fromJD(a/y+w),1===r.day()?1===r.month()?o++:i++:l++}catch(t){}else r=new Date(a),1===r.getUTCDate()?0===r.getUTCMonth()?o++:i++:l++}else s++;i+=o,l+=i;var f=t.length-s;return{exactYears:o/f,exactMonths:i/f,exactDays:l/f}}},{\"../constants/numerical\":122,\"../registry\":206,\"./loggers\":139,\"./mod\":141,d3:7,\"fast-isnumeric\":10}],130:[function(t,e,r){\"use strict\";e.exports=function(t,e){return Array.isArray(t)||(t=[]),t.length=e,t}},{}],131:[function(t,e,r){\"use strict\";var n=t(\"events\").EventEmitter,a={init:function(t){if(t._ev instanceof n)return t;var e=new n,r=new n;return t._ev=e,t._internalEv=r,t.on=e.on.bind(e),t.once=e.once.bind(e),t.removeListener=e.removeListener.bind(e),t.removeAllListeners=e.removeAllListeners.bind(e),t._internalOn=r.on.bind(r),t._internalOnce=r.once.bind(r),t._removeInternalListener=r.removeListener.bind(r),t._removeAllInternalListeners=r.removeAllListeners.bind(r),t.emit=function(n,a){\"undefined\"!=typeof jQuery&&jQuery(t).trigger(n,a),e.emit(n,a),r.emit(n,a)},t},triggerHandler:function(t,e,r){var n,a;\"undefined\"!=typeof jQuery&&(n=jQuery(t).triggerHandler(e,r));var o=t._ev;if(!o)return n;var i=o._events[e];if(!i)return n;\"function\"==typeof i&&(i=[i]);for(var l=i.pop(),s=0;s<i.length;s++)i[s](r);return a=l(r),void 0!==n?n:a},purge:function(t){return delete t._ev,delete t.on,delete t.once,delete t.removeListener,delete t.removeAllListeners,delete t.emit,delete t._ev,delete t._internalEv,delete t._internalOn,delete t._internalOnce,delete t._removeInternalListener,delete t._removeAllInternalListeners,t}};e.exports=a},{events:9}],132:[function(t,e,r){\"use strict\";function n(t,e){var r,n;for(r=0;r<t.length;r++){if(null!==(n=t[r])&&\"object\"==typeof n)return!1;void 0!==n&&(e[r]=n)}return!0}function a(t,e,r,l){var s,c,u,f,d,h,p=t[0],g=t.length;if(2===g&&i(p)&&i(t[1])&&0===p.length){if(n(t[1],p))return p;p.splice(0,p.length)}for(var v=1;v<g;v++){s=t[v];for(c in s)u=p[c],f=s[c],l&&i(f)?p[c]=f:e&&f&&(o(f)||(d=i(f)))?(d?(d=!1,h=u&&i(u)?u:[]):h=u&&o(u)?u:{},p[c]=a([h,f],e,r,l)):(void 0!==f||r)&&(p[c]=f)}return p}var o=t(\"./is_plain_object.js\"),i=Array.isArray;r.extendFlat=function(){return a(arguments,!1,!1,!1)},r.extendDeep=function(){return a(arguments,!0,!1,!1)},r.extendDeepAll=function(){return a(arguments,!0,!0,!1)},r.extendDeepNoArrays=function(){return a(arguments,!0,!1,!0)}},{\"./is_plain_object.js\":138}],133:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e={},r=[],n=0,a=0;a<t.length;a++){var o=t[a];1!==e[o]&&(e[o]=1,r[n++]=o)}return r}},{}],134:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];n.visible===!0&&e.push(n)}return e}},{}],135:[function(t,e,r){\"use strict\";e.exports=function(t){return t}},{}],136:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=e.exports={};a.nestedProperty=t(\"./nested_property\"),a.isPlainObject=t(\"./is_plain_object\"),a.isArray=t(\"./is_array\"),a.mod=t(\"./mod\"),a.toLogRange=t(\"./to_log_range\"),a.relinkPrivateKeys=t(\"./relink_private\"),a.ensureArray=t(\"./ensure_array\");var o=t(\"./coerce\");a.valObjects=o.valObjects,a.coerce=o.coerce,a.coerce2=o.coerce2,a.coerceFont=o.coerceFont,a.validate=o.validate;var i=t(\"./dates\");a.dateTime2ms=i.dateTime2ms,a.isDateTime=i.isDateTime,a.ms2DateTime=i.ms2DateTime,\n",
|
|
"a.ms2DateTimeLocal=i.ms2DateTimeLocal,a.cleanDate=i.cleanDate,a.isJSDate=i.isJSDate,a.formatDate=i.formatDate,a.incrementMonth=i.incrementMonth,a.dateTick0=i.dateTick0,a.dfltRange=i.dfltRange,a.findExactDates=i.findExactDates,a.MIN_MS=i.MIN_MS,a.MAX_MS=i.MAX_MS;var l=t(\"./search\");a.findBin=l.findBin,a.sorterAsc=l.sorterAsc,a.sorterDes=l.sorterDes,a.distinctVals=l.distinctVals,a.roundUp=l.roundUp;var s=t(\"./stats\");a.aggNums=s.aggNums,a.len=s.len,a.mean=s.mean,a.variance=s.variance,a.stdev=s.stdev,a.interp=s.interp;var c=t(\"./matrix\");a.init2dArray=c.init2dArray,a.transposeRagged=c.transposeRagged,a.dot=c.dot,a.translationMatrix=c.translationMatrix,a.rotationMatrix=c.rotationMatrix,a.rotationXYMatrix=c.rotationXYMatrix,a.apply2DTransform=c.apply2DTransform,a.apply2DTransform2=c.apply2DTransform2;var u=t(\"./extend\");a.extendFlat=u.extendFlat,a.extendDeep=u.extendDeep,a.extendDeepAll=u.extendDeepAll,a.extendDeepNoArrays=u.extendDeepNoArrays;var f=t(\"./loggers\");a.log=f.log,a.warn=f.warn,a.error=f.error,a.notifier=t(\"./notifier\"),a.filterUnique=t(\"./filter_unique\"),a.filterVisible=t(\"./filter_visible\"),a.pushUnique=t(\"./push_unique\"),a.cleanNumber=t(\"./clean_number\"),a.noop=t(\"./noop\"),a.identity=t(\"./identity\"),a.swapAttrs=function(t,e,r,n){r||(r=\"x\"),n||(n=\"y\");for(var o=0;o<e.length;o++){var i=e[o],l=a.nestedProperty(t,i.replace(\"?\",r)),s=a.nestedProperty(t,i.replace(\"?\",n)),c=l.get();l.set(s.get()),s.set(c)}},a.pauseEvent=function(t){return t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1},a.constrain=function(t,e,r){return e>r?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},a.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},a.simpleMap=function(t,e,r,n){for(var a=t.length,o=new Array(a),i=0;i<a;i++)o[i]=e(t[i],r,n);return o},a.randstr=function t(e,r,n){if(n||(n=16),void 0===r&&(r=24),r<=0)return\"0\";var a,o,i,l=Math.log(Math.pow(2,r))/Math.log(n),s=\"\";for(a=2;1/0===l;a*=2)l=Math.log(Math.pow(2,r/a))/Math.log(n)*a;var c=l-Math.floor(l);for(a=0;a<Math.floor(l);a++)i=Math.floor(Math.random()*n).toString(n),s=i+s;c&&(o=Math.pow(n,c),i=Math.floor(Math.random()*o).toString(n),s=i+s);var u=parseInt(s,n);return e&&e.indexOf(s)>-1||1/0!==u&&u>=Math.pow(2,r)?t(e,r,n):s},a.OptionControl=function(t,e){t||(t={}),e||(e=\"opt\");var r={};return r.optionList=[],r._newoption=function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)},r[\"_\"+e]=t,r},a.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,a,o,i=t.length,l=2*i,s=2*e-1,c=new Array(s),u=new Array(i);for(r=0;r<s;r++)c[r]=(1-Math.cos(Math.PI*(r+1)/e))/(2*e);for(r=0;r<i;r++){for(o=0,n=0;n<s;n++)a=r+n+1-e,a<-i?a-=l*Math.round(a/l):a>=l&&(a-=l*Math.floor(a/l)),a<0?a=-1-a:a>=i&&(a=l-1-a),o+=t[a]*c[n];u[r]=o}return u},a.syncOrAsync=function(t,e,r){function n(){return a.syncOrAsync(t,e,r)}for(var o,i;t.length;)if(i=t.splice(0,1)[0],(o=i(e))&&o.then)return o.then(n).then(void 0,a.promiseError);return r&&r(e)},a.stripTrailingSlash=function(t){return\"/\"===t.substr(-1)?t.substr(0,t.length-1):t},a.noneOrAll=function(t,e,r){if(t){var n,a,o=!1,i=!0;for(n=0;n<r.length;n++)a=t[r[n]],void 0!==a&&null!==a?o=!0:i=!1;if(o&&!i)for(n=0;n<r.length;n++)t[r[n]]=e[r[n]]}},a.mergeArray=function(t,e,r){if(Array.isArray(t))for(var n=Math.min(t.length,e.length),a=0;a<n;a++)e[a][r]=t[a]},a.getTargetArray=function(t,e){var r=e.target;if(\"string\"==typeof r&&r){var n=a.nestedProperty(t,r).get();return!!Array.isArray(n)&&n}return!!Array.isArray(r)&&r},a.minExtend=function(t,e){var r={};\"object\"!=typeof e&&(e={});var n,o,i,l=Object.keys(t);for(n=0;n<l.length;n++)o=l[n],i=t[o],\"_\"!==o.charAt(0)&&\"function\"!=typeof i&&(\"module\"===o?r[o]=i:Array.isArray(i)?r[o]=i.slice(0,3):r[o]=i&&\"object\"==typeof i?a.minExtend(t[o],e[o]):i);for(l=Object.keys(e),n=0;n<l.length;n++)o=l[n],\"object\"==typeof(i=e[o])&&o in r&&\"object\"==typeof r[o]||(r[o]=i);return r},a.titleCase=function(t){return t.charAt(0).toUpperCase()+t.substr(1)},a.containsAny=function(t,e){for(var r=0;r<e.length;r++)if(t.indexOf(e[r])!==-1)return!0;return!1},a.getPlotDiv=function(t){for(;t&&t.removeAttribute;t=t.parentNode)if(a.isPlotDiv(t))return t},a.isPlotDiv=function(t){var e=n.select(t);return e.node()instanceof HTMLElement&&e.size()&&e.classed(\"js-plotly-plot\")},a.removeElement=function(t){var e=t&&t.parentNode;e&&e.removeChild(t)},a.addStyleRule=function(t,e){if(!a.styleSheet){var r=document.createElement(\"style\");r.appendChild(document.createTextNode(\"\")),document.head.appendChild(r),a.styleSheet=r.sheet}var n=a.styleSheet;n.insertRule?n.insertRule(t+\"{\"+e+\"}\",0):n.addRule?n.addRule(t,e,0):a.warn(\"addStyleRule failed\")},a.isIE=function(){return void 0!==window.navigator.msSaveBlob},a.isD3Selection=function(t){return t&&\"function\"==typeof t.classed},a.objectFromPath=function(t,e){for(var r,n=t.split(\".\"),a=r={},o=0;o<n.length;o++){var i=n[o],l=null,s=n[o].match(/(.*)\\[([0-9]+)\\]/);s?(i=s[1],l=s[2],r=r[i]=[],o===n.length-1?r[l]=e:r[l]={},r=r[l]):(o===n.length-1?r[i]=e:r[i]={},r=r[i])}return a};a.expandObjectPaths=function(t){var e,r,n,o,i,l,s;if(\"object\"==typeof t&&!Array.isArray(t))for(r in t)t.hasOwnProperty(r)&&((e=r.match(/^([^\\[\\.]+)\\.(.+)?/))?(o=t[r],n=e[1],delete t[r],t[n]=a.extendDeepNoArrays(t[n]||{},a.objectFromPath(r,a.expandObjectPaths(o))[n])):(e=r.match(/^([^\\.]+)\\[([0-9]+)\\](\\.)?(.+)?/))?(o=t[r],n=e[1],i=parseInt(e[2]),delete t[r],t[n]=t[n]||[],\".\"===e[3]?(s=e[4],l=t[n][i]=t[n][i]||{},a.extendDeepNoArrays(l,a.objectFromPath(s,a.expandObjectPaths(o)))):t[n][i]=a.expandObjectPaths(o)):t[r]=a.expandObjectPaths(t[r]));return t},a.numSeparate=function(t,e,r){if(r||(r=!1),\"string\"!=typeof e||0===e.length)throw new Error(\"Separator string required for formatting!\");\"number\"==typeof t&&(t=String(t));var n=/(\\d+)(\\d{3})/,a=e.charAt(0),o=e.charAt(1),i=t.split(\".\"),l=i[0],s=i.length>1?a+i[1]:\"\";if(o&&(i.length>1||l.length>4||r))for(;n.test(l);)l=l.replace(n,\"$1\"+o+\"$2\");return l+s}},{\"./clean_number\":127,\"./coerce\":128,\"./dates\":129,\"./ensure_array\":130,\"./extend\":132,\"./filter_unique\":133,\"./filter_visible\":134,\"./identity\":135,\"./is_array\":137,\"./is_plain_object\":138,\"./loggers\":139,\"./matrix\":140,\"./mod\":141,\"./nested_property\":142,\"./noop\":143,\"./notifier\":144,\"./push_unique\":147,\"./relink_private\":149,\"./search\":150,\"./stats\":152,\"./to_log_range\":154,d3:7}],137:[function(t,e,r){\"use strict\";var n=\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer:{isView:function(){return!1}};e.exports=function(t){return Array.isArray(t)||n.isView(t)}},{}],138:[function(t,e,r){\"use strict\";e.exports=function(t){return window&&window.process&&window.process.versions?\"[object Object]\"===Object.prototype.toString.call(t):\"[object Object]\"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t)===Object.prototype}},{}],139:[function(t,e,r){\"use strict\";function n(t,e){if(t.apply)t.apply(t,e);else for(var r=0;r<e.length;r++)t(e[r])}var a=t(\"../plot_api/plot_config\"),o=e.exports={};o.log=function(){if(a.logging>1){for(var t=[\"LOG:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.trace||console.log,t)}},o.warn=function(){if(a.logging>0){for(var t=[\"WARN:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.trace||console.log,t)}},o.error=function(){if(a.logging>0){for(var t=[\"ERROR:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.error,t)}}},{\"../plot_api/plot_config\":159}],140:[function(t,e,r){\"use strict\";r.init2dArray=function(t,e){for(var r=new Array(t),n=0;n<t;n++)r[n]=new Array(e);return r},r.transposeRagged=function(t){var e,r,n=0,a=t.length;for(e=0;e<a;e++)n=Math.max(n,t[e].length);var o=new Array(n);for(e=0;e<n;e++)for(o[e]=new Array(a),r=0;r<a;r++)o[e][r]=t[r][e];return o},r.dot=function(t,e){if(!t.length||!e.length||t.length!==e.length)return null;var n,a,o=t.length;if(t[0].length)for(n=new Array(o),a=0;a<o;a++)n[a]=r.dot(t[a],e);else if(e[0].length){var i=r.transposeRagged(e);for(n=new Array(i.length),a=0;a<i.length;a++)n[a]=r.dot(t,i[a])}else for(n=0,a=0;a<o;a++)n+=t[a]*e[a];return n},r.translationMatrix=function(t,e){return[[1,0,t],[0,1,e],[0,0,1]]},r.rotationMatrix=function(t){var e=t*Math.PI/180;return[[Math.cos(e),-Math.sin(e),0],[Math.sin(e),Math.cos(e),0],[0,0,1]]},r.rotationXYMatrix=function(t,e,n){return r.dot(r.dot(r.translationMatrix(e,n),r.rotationMatrix(t)),r.translationMatrix(-e,-n))},r.apply2DTransform=function(t){return function(){var e=arguments;3===e.length&&(e=e[0]);var n=1===arguments.length?e[0]:[e[0],e[1]];return r.dot(t,[n[0],n[1],1]).slice(0,2)}},r.apply2DTransform2=function(t){var e=r.apply2DTransform(t);return function(t){return e(t.slice(0,2)).concat(e(t.slice(2,4)))}}},{}],141:[function(t,e,r){\"use strict\";e.exports=function(t,e){var r=t%e;return r<0?r+e:r}},{}],142:[function(t,e,r){\"use strict\";function n(t,e){return function(){var r,a,o,i,l,s=t;for(i=0;i<e.length-1;i++){if((r=e[i])===-1){for(a=!0,o=[],l=0;l<s.length;l++)o[l]=n(s[l],e.slice(i+1))(),o[l]!==o[0]&&(a=!1);return a?o[0]:o}if(\"number\"==typeof r&&!h(s))return;if(\"object\"!=typeof(s=s[r])||null===s)return}if(\"object\"==typeof s&&null!==s&&null!==(o=s[e[i]]))return o}}function a(t,e){if(!u(t)||p(t)&&\"]\"===e.charAt(e.length-1)||e.match(m)&&void 0!==t)return!1;if(!h(t))return!0;if(e.match(v))return!0;var r=g(e);return r&&\"\"===r.index}function o(t,e,r){return function(n){var o,u,f=t,d=\"\",p=[[t,d]],g=a(n,r);for(u=0;u<e.length-1;u++){if(\"number\"==typeof(o=e[u])&&!h(f))throw\"array index but container is not an array\";if(o===-1){if(g=!l(f,e.slice(u+1),n,r))break;return}if(!s(f,o,e[u+1],g))break;if(\"object\"!=typeof(f=f[o])||null===f)throw\"container is not an object\";d=i(d,o),p.push([f,d])}g?(u===e.length-1&&delete f[e[u]],c(p)):f[e[u]]=n}}function i(t,e){var r=e;return d(e)?r=\"[\"+e+\"]\":t&&(r=\".\"+e),t+r}function l(t,e,r,n){var i,l=h(r),c=!0,u=r,f=n.replace(\"-1\",0),d=!l&&a(r,f),p=e[0];for(i=0;i<t.length;i++)f=n.replace(\"-1\",i),l&&(u=r[i%r.length],d=a(u,f)),d&&(c=!1),s(t,i,p,d)&&o(t[i],e,n.replace(\"-1\",i))(u);return c}function s(t,e,r,n){if(void 0===t[e]){if(n)return!1;t[e]=\"number\"==typeof r?[]:{}}return!0}function c(t){var e,r,n,o,l,s;for(e=t.length-1;e>=0;e--){if(n=t[e][0],o=t[e][1],s=!1,h(n))for(r=n.length-1;r>=0;r--)a(n[r],i(o,r))?s?n[r]=void 0:n.pop():s=!0;else if(\"object\"==typeof n&&null!==n)for(l=Object.keys(n),s=!1,r=l.length-1;r>=0;r--)a(n[l[r]],i(o,l[r]))?delete n[l[r]]:s=!0;if(s)return}}function u(t){return void 0===t||null===t||\"object\"==typeof t&&(h(t)?!t.length:!Object.keys(t).length)}function f(t,e,r){return{set:function(){throw\"bad container\"},get:function(){},astr:e,parts:r,obj:t}}var d=t(\"fast-isnumeric\"),h=t(\"./is_array\"),p=t(\"./is_plain_object\"),g=t(\"../plot_api/container_array_match\");e.exports=function(t,e){if(d(e))e=String(e);else if(\"string\"!=typeof e||\"[-1]\"===e.substr(e.length-4))throw\"bad property string\";for(var r,a,i,l=0,s=e.split(\".\");l<s.length;){if(r=String(s[l]).match(/^([^\\[\\]]*)((\\[\\-?[0-9]*\\])+)$/)){if(r[1])s[l]=r[1];else{if(0!==l)throw\"bad property string\";s.splice(0,1)}for(a=r[2].substr(1,r[2].length-2).split(\"][\"),i=0;i<a.length;i++)l++,s.splice(l,0,Number(a[i]))}l++}return\"object\"!=typeof t?f(t,e,s):{set:o(t,s,e),get:n(t,s),astr:e,parts:s,obj:t}};var v=/(^|\\.)((domain|range)(\\.[xy])?|args|parallels)$/,m=/(^|\\.)args\\[/},{\"../plot_api/container_array_match\":155,\"./is_array\":137,\"./is_plain_object\":138,\"fast-isnumeric\":10}],143:[function(t,e,r){\"use strict\";e.exports=function(){}},{}],144:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=[];e.exports=function(t,e){function r(t){t.duration(700).style(\"opacity\",0).each(\"end\",function(t){var e=o.indexOf(t);e!==-1&&o.splice(e,1),n.select(this).remove()})}if(o.indexOf(t)===-1){o.push(t);var i=1e3;a(e)?i=e:\"long\"===e&&(i=3e3);var l=n.select(\"body\").selectAll(\".plotly-notifier\").data([0]);l.enter().append(\"div\").classed(\"plotly-notifier\",!0);l.selectAll(\".notifier-note\").data(o).enter().append(\"div\").classed(\"notifier-note\",!0).style(\"opacity\",0).each(function(t){var e=n.select(this);e.append(\"button\").classed(\"notifier-close\",!0).html(\"×\").on(\"click\",function(){e.transition().call(r)});for(var a=e.append(\"p\"),o=t.split(/<br\\s*\\/?>/g),l=0;l<o.length;l++)l&&a.append(\"br\"),a.append(\"span\").text(o[l]);e.transition().duration(700).style(\"opacity\",1).transition().delay(i).call(r)})}}},{d3:7,\"fast-isnumeric\":10}],145:[function(t,e,r){\"use strict\";var n=t(\"./setcursor\"),a=\"data-savedcursor\";e.exports=function(t,e){var r=t.attr(a);if(e){if(!r){for(var o=(t.attr(\"class\")||\"\").split(\" \"),i=0;i<o.length;i++){var l=o[i];0===l.indexOf(\"cursor-\")&&t.attr(a,l.substr(7)).classed(l,!1)}t.attr(a)||t.attr(a,\"!!\")}n(t,e)}else r&&(t.attr(a,null),\"!!\"===r?n(t):n(t,r))}},{\"./setcursor\":151}],146:[function(t,e,r){\"use strict\";var n=t(\"./matrix\").dot,a=t(\"../constants/numerical\").BADNUM,o=e.exports={};o.tester=function(t){function e(t,e){var r=t[0],n=t[1];return!(r===a||r<o||r>i||n===a||n<l||n>s)&&(!e||!u(t))}function r(t,e){var r=t[0],c=t[1];if(r===a||r<o||r>i||c===a||c<l||c>s)return!1;var u,f,d,h,p,g=n.length,v=n[0][0],m=n[0][1],y=0;for(u=1;u<g;u++)if(f=v,d=m,v=n[u][0],m=n[u][1],h=Math.min(f,v),!(r<h||r>Math.max(f,v)||c>Math.max(d,m)))if(c<Math.min(d,m))r!==h&&y++;else{if(p=v===f?c:d+(r-f)*(m-d)/(v-f),c===p)return 1!==u||!e;c<=p&&r!==h&&y++}return y%2==1}var n=t.slice(),o=n[0][0],i=o,l=n[0][1],s=l;n.push(n[0]);for(var c=1;c<n.length;c++)o=Math.min(o,n[c][0]),i=Math.max(i,n[c][0]),l=Math.min(l,n[c][1]),s=Math.max(s,n[c][1]);var u,f=!1;return 5===n.length&&(n[0][0]===n[1][0]?n[2][0]===n[3][0]&&n[0][1]===n[3][1]&&n[1][1]===n[2][1]&&(f=!0,u=function(t){return t[0]===n[0][0]}):n[0][1]===n[1][1]&&n[2][1]===n[3][1]&&n[0][0]===n[3][0]&&n[1][0]===n[2][0]&&(f=!0,u=function(t){return t[1]===n[0][1]})),{xmin:o,xmax:i,ymin:l,ymax:s,pts:n,contains:f?e:r,isRect:f}};var i=o.isSegmentBent=function(t,e,r,a){var o,i,l,s=t[e],c=[t[r][0]-s[0],t[r][1]-s[1]],u=n(c,c),f=Math.sqrt(u),d=[-c[1]/f,c[0]/f];for(o=e+1;o<r;o++)if(i=[t[o][0]-s[0],t[o][1]-s[1]],(l=n(i,c))<0||l>u||Math.abs(n(i,d))>a)return!0;return!1};o.filter=function(t,e){function r(r){t.push(r);var l=n.length,s=a;n.splice(o+1);for(var c=s+1;c<t.length;c++)(c===t.length-1||i(t,s,c+1,e))&&(n.push(t[c]),n.length<l-2&&(a=c,o=n.length-1),s=c)}var n=[t[0]],a=0,o=0;if(t.length>1){r(t.pop())}return{addPt:r,raw:t,filtered:n}}},{\"../constants/numerical\":122,\"./matrix\":140}],147:[function(t,e,r){\"use strict\";e.exports=function(t,e){if(e instanceof RegExp){var r,n=e.toString();for(r=0;r<t.length;r++)if(t[r]instanceof RegExp&&t[r].toString()===n)return t;t.push(e)}else e&&t.indexOf(e)===-1&&t.push(e);return t}},{}],148:[function(t,e,r){\"use strict\";function n(t,e){for(var r,n=[],o=0;o<e.length;o++)r=e[o],n[o]=r===t?r:\"object\"==typeof r?Array.isArray(r)?a.extendDeep([],r):a.extendDeepAll({},r):r;return n}var a=t(\"../lib\"),o=t(\"../plot_api/plot_config\"),i={};i.add=function(t,e,r,n,a){var i,l;if(t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},l=t.undoQueue.index,t.autoplay)return void(t.undoQueue.inSequence||(t.autoplay=!1));!t.undoQueue.sequence||t.undoQueue.beginSequence?(i={undo:{calls:[],args:[]},redo:{calls:[],args:[]}},t.undoQueue.queue.splice(l,t.undoQueue.queue.length-l,i),t.undoQueue.index+=1):i=t.undoQueue.queue[l-1],t.undoQueue.beginSequence=!1,i&&(i.undo.calls.unshift(e),i.undo.args.unshift(r),i.redo.calls.push(n),i.redo.args.push(a)),t.undoQueue.queue.length>o.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--)},i.startSequence=function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},i.stopSequence=function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},i.undo=function(t){var e,r;if(t.framework&&t.framework.isPolar)return void t.framework.undo();if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.undo.calls.length;r++)i.plotDo(t,e.undo.calls[r],e.undo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1}},i.redo=function(t){var e,r;if(t.framework&&t.framework.isPolar)return void t.framework.redo();if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index>=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.redo.calls.length;r++)i.plotDo(t,e.redo.calls[r],e.redo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1,t.undoQueue.index++}},i.plotDo=function(t,e,r){t.autoplay=!0,r=n(t,r),e.apply(null,r)},e.exports=i},{\"../lib\":136,\"../plot_api/plot_config\":159}],149:[function(t,e,r){\"use strict\";var n=t(\"./is_array\"),a=t(\"./is_plain_object\");e.exports=function t(e,r){for(var o=Object.keys(r||{}),i=0;i<o.length;i++){var l=o[i],s=r[l],c=e[l];if(\"_\"===l.charAt(0)||\"function\"==typeof s){if(l in e)continue;e[l]=s}else if(n(s)&&n(c)&&a(s[0]))for(var u=0;u<s.length;u++)a(s[u])&&a(c[u])&&t(c[u],s[u]);else a(s)&&a(c)&&(t(c,s),Object.keys(c).length||delete e[l])}}},{\"./is_array\":137,\"./is_plain_object\":138}],150:[function(t,e,r){\"use strict\";function n(t,e){return t<e}function a(t,e){return t<=e}function o(t,e){return t>e}function i(t,e){return t>=e}var l=t(\"fast-isnumeric\"),s=t(\"./loggers\");r.findBin=function(t,e,r){if(l(e.start))return r?Math.ceil((t-e.start)/e.size)-1:Math.floor((t-e.start)/e.size);var c,u,f=0,d=e.length,h=0;for(u=e[e.length-1]>=e[0]?r?n:a:r?i:o;f<d&&h++<100;)c=Math.floor((f+d)/2),u(e[c],t)?f=c+1:d=c;return h>90&&s.log(\"Long binary search...\"),f-1},r.sorterAsc=function(t,e){return t-e},r.sorterDes=function(t,e){return e-t},r.distinctVals=function(t){var e=t.slice();e.sort(r.sorterAsc);for(var n=e.length-1,a=e[n]-e[0]||1,o=a/(n||1)/1e4,i=[e[0]],l=0;l<n;l++)e[l+1]>e[l]+o&&(a=Math.min(a,e[l+1]-e[l]),i.push(e[l+1]));return{vals:i,minDiff:a}},r.roundUp=function(t,e,r){for(var n,a=0,o=e.length-1,i=0,l=r?0:1,s=r?1:0,c=r?Math.ceil:Math.floor;a<o&&i++<100;)n=c((a+o)/2),e[n]<=t?a=n+l:o=n-s;return e[a]}},{\"./loggers\":139,\"fast-isnumeric\":10}],151:[function(t,e,r){\"use strict\";e.exports=function(t,e){(t.attr(\"class\")||\"\").split(\" \").forEach(function(e){0===e.indexOf(\"cursor-\")&&t.classed(e,!1)}),e&&t.classed(\"cursor-\"+e,!0)}},{}],152:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");r.aggNums=function(t,e,a,o){var i,l;if(o||(o=a.length),n(e)||(e=!1),Array.isArray(a[0])){for(l=new Array(o),i=0;i<o;i++)l[i]=r.aggNums(t,e,a[i]);a=l}for(i=0;i<o;i++)n(e)?n(a[i])&&(e=t(+e,+a[i])):e=a[i];return e},r.len=function(t){return r.aggNums(function(t){return t+1},0,t)},r.mean=function(t,e){return e||(e=r.len(t)),r.aggNums(function(t,e){return t+e},0,t)/e},r.variance=function(t,e,a){return e||(e=r.len(t)),n(a)||(a=r.mean(t,e)),r.aggNums(function(t,e){return t+Math.pow(e-a,2)},0,t)/e},r.stdev=function(t,e,n){return Math.sqrt(r.variance(t,e,n))},r.interp=function(t,e){if(!n(e))throw\"n should be a finite number\";if((e=e*t.length-.5)<0)return t[0];if(e>t.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},{\"fast-isnumeric\":10}],153:[function(t,e,r){\"use strict\";function n(t,e){return t.node().getBoundingClientRect()[e]}function a(t){return t.replace(/(<|<|<)/g,\"\\\\lt \").replace(/(>|>|>)/g,\"\\\\gt \")}function o(t,e,r){var n=\"math-output-\"+h.randstr([],64),o=d.select(\"body\").append(\"div\").attr({id:n}).style({visibility:\"hidden\",position:\"absolute\"}).style({\"font-size\":e.fontSize+\"px\"}).text(a(t));MathJax.Hub.Queue([\"Typeset\",MathJax.Hub,o.node()],function(){var e=d.select(\"body\").select(\"#MathJax_SVG_glyphs\");if(o.select(\".MathJax_SVG\").empty()||!o.select(\"svg\").node())h.log(\"There was an error in the tex syntax.\",t),r();else{var n=o.select(\"svg\").node().getBoundingClientRect();r(o.select(\".MathJax_SVG\"),e,n)}o.remove()})}function i(t,e){for(var r=t||\"\",n=0;n<e.length;n++){var a=e[n];r=r.replace(a.regExp,a.sub)}return r}function l(t){return i(t,b)}function s(t){return i(t,_)}function c(t){t=l(t).replace(w,\" \");for(var e=t.split(k).map(function(t){var e=t.match(M),n=e&&e[2].toLowerCase(),a=v[n];if(void 0!==a){if(e[1])return(\"a\"===n?\"</a>\":\"</tspan>\")+(m[n]||\"\");if(\"br\"===n)return\"<br>\";var o,i=e[4];if(\"a\"===n){var l=i&&i.match(T),c=l&&(l[3]||l[4]);if(o=\"<a\",c){var u=document.createElement(\"a\");u.href=c,y.indexOf(u.protocol)!==-1&&(o+=' xlink:show=\"new\" xlink:href=\"'+s(c)+'\"')}}else o=\"<tspan\",\"sup\"!==n&&\"sub\"!==n||(o=\"​\"+o);var f=i&&i.match(A),d=f&&(f[3]||f[4]);return d?(d=s(d.replace(L,\"$1 fill:\")),a&&(d+=\";\"+a)):a&&(d=a),d?o+' style=\"'+d+'\">':o+\">\"}return r.xml_entity_encode(t).replace(/</g,\"<\")}),n=[],a=e.indexOf(\"<br>\");a>0;a=e.indexOf(\"<br>\",a+1))n.push(a);var o=0;n.forEach(function(t){for(var r=t+o,n=e.slice(0,r),a=\"\",i=n.length-1;i>=0;i--){var l=n[i].match(/<(\\/?).*>/i);if(l&&\"<br>\"!==n[i]){l[1]||(a=n[i]);break}}a&&(e.splice(r+1,0,a),e.splice(r,0,\"</tspan>\"),o+=2)});var i=e.join(\"\"),c=i.split(/<br>/gi);return c.length>1&&(e=c.map(function(t,e){return'<tspan class=\"line\" dy=\"'+1.3*e+'em\">'+t+\"</tspan>\"})),e.join(\"\")}function u(t,e,r){var n,a,o,i=r.horizontalAlign,l=r.verticalAlign||\"top\",s=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return a=\"bottom\"===l?function(){return s.bottom-n.height}:\"middle\"===l?function(){return s.top+(s.height-n.height)/2}:function(){return s.top},o=\"right\"===i?function(){return s.right-n.width}:\"center\"===i?function(){return s.left+(s.width-n.width)/2}:function(){return s.left},function(){return n=this.node().getBoundingClientRect(),this.style({top:a()-c.top+\"px\",left:o()-c.left+\"px\",\"z-index\":1e3}),this}}var f,d=t(\"d3\"),h=t(\"../lib\"),p=t(\"../constants/xmlns_namespaces\"),g=t(\"../constants/string_mappings\");r.getDOMParser=function(){if(f)return f;if(window.DOMParser)return f=new window.DOMParser;throw new Error(\"Cannot initialize DOMParser\")},d.selection.prototype.appendSVG=function(t){for(var e=['<svg xmlns=\"',p.svg,'\" ','xmlns:xlink=\"',p.xlink,'\">',t,\"</svg>\"].join(\"\"),n=r.getDOMParser(),a=n.parseFromString(e,\"application/xml\"),o=a.documentElement.firstChild;o;)this.node().appendChild(this.node().ownerDocument.importNode(o,!0)),o=o.nextSibling;return a.querySelector(\"parsererror\")?(h.log(a.querySelector(\"parsererror div\").textContent),null):d.select(this.node().lastChild)},r.html_entity_decode=function(t){var e=d.select(\"body\").append(\"div\").style({display:\"none\"}).html(\"\"),r=t.replace(/(&[^;]*;)/gi,function(t){return\"<\"===t?\"<\":\"&rt;\"===t?\">\":t.indexOf(\"<\")!==-1||t.indexOf(\">\")!==-1?\"\":e.html(t).text()});return e.remove(),r},r.xml_entity_encode=function(t){return t.replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g,\"&\")},r.convertToTspans=function(t,e){function r(){f.empty()||(p=l.attr(\"class\")+\"-math\",f.select(\"svg.\"+p).remove()),t.text(\"\").style({visibility:\"inherit\",\"white-space\":\"pre\"}),u=t.appendSVG(i),u||t.text(a),t.select(\"a\").size()&&t.style(\"pointer-events\",\"all\"),e&&e.call(l)}var a=t.text(),i=c(a),l=t,s=!l.attr(\"data-notex\")&&i.match(/([^$]*)([$]+[^$]*[$]+)([^$]*)/),u=a,f=d.select(l.node().parentNode);if(!f.empty()){var p=l.attr(\"class\")?l.attr(\"class\").split(\" \")[0]:\"text\";p+=\"-math\",f.selectAll(\"svg.\"+p).remove(),f.selectAll(\"g.\"+p+\"-group\").remove(),t.style({visibility:null});for(var g=t.node();g&&g.removeAttribute;g=g.parentNode)g.removeAttribute(\"data-bb\");if(s){var v=h.getPlotDiv(l.node());(v&&v._promises||[]).push(new Promise(function(t){l.style({visibility:\"hidden\"});var a={fontSize:parseInt(l.style(\"font-size\"),10)};o(s[2],a,function(a,o,i){f.selectAll(\"svg.\"+p).remove(),f.selectAll(\"g.\"+p+\"-group\").remove();var s=a&&a.select(\"svg\");if(!s||!s.node())return r(),void t();var c=f.append(\"g\").classed(p+\"-group\",!0).attr({\"pointer-events\":\"none\"});c.node().appendChild(s.node()),o&&o.node()&&s.node().insertBefore(o.node().cloneNode(!0),s.node().firstChild),s.attr({class:p,height:i.height,preserveAspectRatio:\"xMinYMin meet\"}).style({overflow:\"visible\",\"pointer-events\":\"none\"});var u=l.style(\"fill\")||\"black\";s.select(\"g\").attr({fill:u,stroke:u});var d=n(s,\"width\"),h=n(s,\"height\"),g=+l.attr(\"x\")-d*{start:0,middle:.5,end:1}[l.attr(\"text-anchor\")||\"start\"],v=parseInt(l.style(\"font-size\"),10)||n(l,\"height\"),m=-v/4;\"y\"===p[0]?(c.attr({transform:\"rotate(\"+[-90,+l.attr(\"x\"),+l.attr(\"y\")]+\") translate(\"+[-d/2,m-h/2]+\")\"}),s.attr({x:+l.attr(\"x\"),y:+l.attr(\"y\")})):\"l\"===p[0]?s.attr({x:l.attr(\"x\"),y:m-h/2}):\"a\"===p[0]?s.attr({x:0,y:m}):s.attr({x:g,y:+l.attr(\"y\")+m-h/2}),e&&e.call(l,c),t(c)})}))}else r();return t}};var v={sup:'font-size:70%\" dy=\"-0.6em',sub:'font-size:70%\" dy=\"0.3em',b:\"font-weight:bold\",i:\"font-style:italic\",a:\"cursor:pointer\",span:\"\",br:\"\",em:\"font-style:italic;font-weight:bold\"},m={sup:'<tspan dy=\"0.42em\">​</tspan>',sub:'<tspan dy=\"-0.21em\">​</tspan>'},y=[\"http:\",\"https:\",\"mailto:\"],x=new RegExp(\"</?(\"+Object.keys(v).join(\"|\")+\")( [^>]*)?/?>\",\"g\"),b=Object.keys(g.entityToUnicode).map(function(t){return{regExp:new RegExp(\"&\"+t+\";\",\"g\"),sub:g.entityToUnicode[t]}}),_=Object.keys(g.unicodeToEntity).map(function(t){return{regExp:new RegExp(t,\"g\"),sub:\"&\"+g.unicodeToEntity[t]+\";\"}}),w=/(\\r\\n?|\\n)/g,k=/(<[^<>]*>)/,M=/<(\\/?)([^ >]*)(\\s+(.*))?>/i,A=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,T=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,L=/(^|;)\\s*color:/;r.plainText=function(t){return(t||\"\").replace(x,\" \")},r.makeEditable=function(t,e,r){function n(){o(),i.style({opacity:0});var t,e=c.attr(\"class\");(t=e?\".\"+e.split(\" \")[0]+\"-math-group\":\"[class*=-math-group]\")&&d.select(i.node().parentNode).select(t).style({opacity:0})}function a(t){var e=t.node(),r=document.createRange();r.selectNodeContents(e);var n=window.getSelection();n.removeAllRanges(),n.addRange(r),e.focus()}function o(){var t=h.getPlotDiv(i.node()),e=d.select(t),n=e.select(\".svg-container\"),o=n.append(\"div\");o.classed(\"plugin-editable editable\",!0).style({position:\"absolute\",\"font-family\":i.style(\"font-family\")||\"Arial\",\"font-size\":i.style(\"font-size\")||12,color:r.fill||i.style(\"fill\")||\"black\",opacity:1,\"background-color\":r.background||\"transparent\",outline:\"#ffffff33 1px solid\",margin:[-parseFloat(i.style(\"font-size\"))/8+1,0,0,-1].join(\"px \")+\"px\",padding:\"0\",\"box-sizing\":\"border-box\"}).attr({contenteditable:!0}).text(r.text||i.attr(\"data-unformatted\")).call(u(i,n,r)).on(\"blur\",function(){t._editing=!1,i.text(this.textContent).style({opacity:1});var e,r=d.select(this).attr(\"class\");(e=r?\".\"+r.split(\" \")[0]+\"-math-group\":\"[class*=-math-group]\")&&d.select(i.node().parentNode).select(e).style({opacity:0});var n=this.textContent;d.select(this).transition().duration(0).remove(),d.select(document).on(\"mouseup\",null),l.edit.call(i,n)}).on(\"focus\",function(){var e=this;t._editing=!0,d.select(document).on(\"mouseup\",function(){if(d.event.target===e)return!1;document.activeElement===o.node()&&o.node().blur()})}).on(\"keyup\",function(){27===d.event.which?(t._editing=!1,i.style({opacity:1}),d.select(this).style({opacity:0}).on(\"blur\",function(){return!1}).transition().remove(),l.cancel.call(i,this.textContent)):(l.input.call(i,this.textContent),d.select(this).call(u(i,n,r)))}).on(\"keydown\",function(){13===d.event.which&&this.blur()}).call(a)}r||(r={});var i=this,l=d.dispatch(\"edit\",\"input\",\"cancel\"),s=d.select(this.node()).style({\"pointer-events\":\"all\"}),c=e||s;return e&&s.style({\"pointer-events\":\"none\"}),r.immediate?n():c.on(\"click\",n),d.rebind(this,l,\"on\")}},{\"../constants/string_mappings\":123,\"../constants/xmlns_namespaces\":124,\"../lib\":136,d3:7}],154:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");e.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},{\"fast-isnumeric\":10}],155:[function(t,e,r){\"use strict\";var n=t(\"../registry\");e.exports=function(t){for(var e,r,a=n.layoutArrayContainers,o=n.layoutArrayRegexes,i=t.split(\"[\")[0],l=0;l<o.length;l++)if((r=t.match(o[l]))&&0===r.index){e=r[0];break}if(e||(e=a[a.indexOf(i)]),!e)return!1;var s=t.substr(e.length);return s?!!(r=s.match(/^\\[(0|[1-9][0-9]*)\\](\\.(.+))?$/))&&{array:e,index:Number(r[1]),property:r[3]||\"\"}:{array:e,index:\"\",property:\"\"}}},{\"../registry\":206}],156:[function(t,e,r){\"use strict\";function n(t,e){var r=t[e],n=e.charAt(0);r&&\"paper\"!==r&&(t[e]=d.cleanId(r,n))}function a(t){var e=\"middle\",r=\"center\";return t.indexOf(\"top\")!==-1?e=\"top\":t.indexOf(\"bottom\")!==-1&&(e=\"bottom\"),t.indexOf(\"left\")!==-1?r=\"left\":t.indexOf(\"right\")!==-1&&(r=\"right\"),e+\" \"+r}function o(t,e){return e in t&&\"object\"==typeof t[e]&&0===Object.keys(t[e]).length}function i(t){var e=t.search(p);if(e>0)return t.substr(0,e)}var l=t(\"fast-isnumeric\"),s=t(\"gl-mat4/fromQuat\"),c=t(\"../registry\"),u=t(\"../lib\"),f=t(\"../plots/plots\"),d=t(\"../plots/cartesian/axes\"),h=t(\"../components/color\");r.getGraphDiv=function(t){var e;if(\"string\"==typeof t){if(null===(e=document.getElementById(t)))throw new Error(\"No DOM element with id '\"+t+\"' exists on the page.\");return e}if(null===t||void 0===t)throw new Error(\"DOM element provided is null or undefined\");return t},r.clearPromiseQueue=function(t){Array.isArray(t._promises)&&t._promises.length>0&&u.log(\"Clearing previous rejected promises from queue.\"),t._promises=[]},r.cleanLayout=function(t){var e,r;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1);var a=d.list({_fullLayout:t});for(e=0;e<a.length;e++){var i=a[e];i.anchor&&\"free\"!==i.anchor&&(i.anchor=d.cleanId(i.anchor)),i.overlaying&&(i.overlaying=d.cleanId(i.overlaying)),i.type||(i.isdate?i.type=\"date\":i.islog?i.type=\"log\":i.isdate===!1&&i.islog===!1&&(i.type=\"linear\")),\"withzero\"!==i.autorange&&\"tozero\"!==i.autorange||(i.autorange=!0,i.rangemode=\"tozero\"),delete i.islog,delete i.isdate,delete i.categories,o(i,\"domain\")&&delete i.domain,void 0!==i.autotick&&(void 0===i.tickmode&&(i.tickmode=i.autotick?\"auto\":\"linear\"),delete i.autotick)}var l=Array.isArray(t.annotations)?t.annotations.length:0;for(e=0;e<l;e++){var c=t.annotations[e];u.isPlainObject(c)&&(c.ref&&(\"paper\"===c.ref?(c.xref=\"paper\",c.yref=\"paper\"):\"data\"===c.ref&&(c.xref=\"x\",c.yref=\"y\"),delete c.ref),n(c,\"xref\"),n(c,\"yref\"))}var p=Array.isArray(t.shapes)?t.shapes.length:0;for(e=0;e<p;e++){var g=t.shapes[e];u.isPlainObject(g)&&(n(g,\"xref\"),n(g,\"yref\"))}var v=t.legend;v&&(v.x>3?(v.x=1.02,v.xanchor=\"left\"):v.x<-2&&(v.x=-.02,v.xanchor=\"right\"),v.y>3?(v.y=1.02,v.yanchor=\"bottom\"):v.y<-2&&(v.y=-.02,v.yanchor=\"top\")),\"rotate\"===t.dragmode&&(t.dragmode=\"orbit\"),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var m=f.getSubplotIds(t,\"gl3d\");for(e=0;e<m.length;e++){var y=t[m[e]],x=y.cameraposition;if(Array.isArray(x)&&4===x[0].length){var b=x[0],_=x[1],w=x[2],k=s([],b),M=[];for(r=0;r<3;++r)M[r]=_[e]+w*k[2+4*r];y.camera={eye:{x:M[0],y:M[1],z:M[2]},center:{x:_[0],y:_[1],z:_[2]},up:{x:k[1],y:k[5],z:k[9]}},delete y.cameraposition}}return h.clean(t),t},r.cleanData=function(t,e){for(var n=[],i=(t.concat(Array.isArray(e)?e:[]).filter(function(t){return\"uid\"in t}).map(function(t){return t.uid})),l=0;l<t.length;l++){var s,p=t[l];if(!(\"uid\"in p)||n.indexOf(p.uid)!==-1){var g;for(s=0;s<100&&(g=u.randstr(i),n.indexOf(g)!==-1);s++);p.uid=u.randstr(i),i.push(p.uid)}if(n.push(p.uid),\"histogramy\"===p.type&&\"xbins\"in p&&!(\"ybins\"in p)&&(p.ybins=p.xbins,delete p.xbins),p.error_y&&\"opacity\"in p.error_y){var v=h.defaults,m=p.error_y.color||(c.traceIs(p,\"bar\")?h.defaultLine:v[l%v.length]);p.error_y.color=h.addOpacity(h.rgb(m),h.opacity(m)*p.error_y.opacity),delete p.error_y.opacity}if(\"bardir\"in p&&(\"h\"!==p.bardir||!c.traceIs(p,\"bar\")&&\"histogram\"!==p.type.substr(0,9)||(p.orientation=\"h\",r.swapXYData(p)),delete p.bardir),\"histogramy\"===p.type&&r.swapXYData(p),\"histogramx\"!==p.type&&\"histogramy\"!==p.type||(p.type=\"histogram\"),\"scl\"in p&&(p.colorscale=p.scl,delete p.scl),\"reversescl\"in p&&(p.reversescale=p.reversescl,delete p.reversescl),p.xaxis&&(p.xaxis=d.cleanId(p.xaxis,\"x\")),p.yaxis&&(p.yaxis=d.cleanId(p.yaxis,\"y\")),c.traceIs(p,\"gl3d\")&&p.scene&&(p.scene=f.subplotsRegistry.gl3d.cleanId(p.scene)),\n",
|
|
"c.traceIs(p,\"pie\")||c.traceIs(p,\"bar\")||(Array.isArray(p.textposition)?p.textposition=p.textposition.map(a):p.textposition&&(p.textposition=a(p.textposition))),c.traceIs(p,\"2dMap\")&&(\"YIGnBu\"===p.colorscale&&(p.colorscale=\"YlGnBu\"),\"YIOrRd\"===p.colorscale&&(p.colorscale=\"YlOrRd\")),c.traceIs(p,\"markerColorscale\")&&p.marker){var y=p.marker;\"YIGnBu\"===y.colorscale&&(y.colorscale=\"YlGnBu\"),\"YIOrRd\"===y.colorscale&&(y.colorscale=\"YlOrRd\")}if(\"surface\"===p.type&&u.isPlainObject(p.contours)){var x=[\"x\",\"y\",\"z\"];for(s=0;s<x.length;s++){var b=p.contours[x[s]];u.isPlainObject(b)&&(b.highlightColor&&(b.highlightcolor=b.highlightColor,delete b.highlightColor),b.highlightWidth&&(b.highlightwidth=b.highlightWidth,delete b.highlightWidth))}}if(Array.isArray(p.transforms)){var _=p.transforms;for(s=0;s<_.length;s++){var w=_[s];u.isPlainObject(w)&&(\"filter\"===w.type&&(w.filtersrc&&(w.target=w.filtersrc,delete w.filtersrc),w.calendar&&(w.valuecalendar||(w.valuecalendar=w.calendar),delete w.calendar)))}}o(p,\"line\")&&delete p.line,\"marker\"in p&&(o(p.marker,\"line\")&&delete p.marker.line,o(p,\"marker\")&&delete p.marker),h.clean(p)}},r.swapXYData=function(t){var e;if(u.swapAttrs(t,[\"?\",\"?0\",\"d?\",\"?bins\",\"nbins?\",\"autobin?\",\"?src\",\"error_?\"]),Array.isArray(t.z)&&Array.isArray(t.z[0])&&(t.transpose?delete t.transpose:t.transpose=!0),t.error_x&&t.error_y){var r=t.error_y,n=\"copy_ystyle\"in r?r.copy_ystyle:!(r.color||r.thickness||r.width);u.swapAttrs(t,[\"error_?.copy_ystyle\"]),n&&u.swapAttrs(t,[\"error_?.color\",\"error_?.thickness\",\"error_?.width\"])}if(t.hoverinfo){var a=t.hoverinfo.split(\"+\");for(e=0;e<a.length;e++)\"x\"===a[e]?a[e]=\"y\":\"y\"===a[e]&&(a[e]=\"x\");t.hoverinfo=a.join(\"+\")}},r.coerceTraceIndices=function(t,e){return l(e)?[e]:Array.isArray(e)&&e.length?e:t.data.map(function(t,e){return e})},r.manageArrayContainers=function(t,e,r){var n=t.obj,a=t.parts,o=a.length,i=a[o-1],s=l(i);if(s&&null===e){var c=a.slice(0,o-1).join(\".\");u.nestedProperty(n,c).get().splice(i,1)}else s&&void 0===t.get()?(void 0===t.get()&&(r[t.astr]=null),t.set(e)):t.set(e)};var p=/(\\.[^\\[\\]\\.]+|\\[[^\\[\\]\\.]+\\])$/;r.hasParent=function(t,e){for(var r=i(e);r;){if(r in t)return!0;r=i(r)}return!1}},{\"../components/color\":25,\"../lib\":136,\"../plots/cartesian/axes\":171,\"../plots/plots\":199,\"../registry\":206,\"fast-isnumeric\":10,\"gl-mat4/fromQuat\":11}],157:[function(t,e,r){\"use strict\";var n=t(\"../lib/nested_property\"),a=t(\"../lib/is_plain_object\"),o=t(\"../lib/noop\"),i=t(\"../lib/loggers\"),l=t(\"../lib/search\").sorterAsc,s=t(\"../registry\");r.containerArrayMatch=t(\"./container_array_match\");var c=r.isAddVal=function(t){return\"add\"===t||a(t)},u=r.isRemoveVal=function(t){return null===t||\"remove\"===t};r.applyContainerArrayChanges=function(t,e,r,a){var f=e.astr,d=s.getComponentMethod(f,\"supplyLayoutDefaults\"),h=s.getComponentMethod(f,\"draw\"),p=s.getComponentMethod(f,\"drawOne\"),g=a.replot||a.recalc||d===o||h===o,v=t.layout,m=t._fullLayout;if(r[\"\"]){Object.keys(r).length>1&&i.warn(\"Full array edits are incompatible with other edits\",f);var y=r[\"\"][\"\"];if(u(y))e.set(null);else{if(!Array.isArray(y))return i.warn(\"Unrecognized full array edit value\",f,y),!0;e.set(y)}return!g&&(d(v,m),h(t),!0)}var x,b,_,w,k,M,A,T=Object.keys(r).map(Number).sort(l),L=e.get(),C=L||[],S=n(m,f).get(),z=[],O=-1,D=C.length;for(x=0;x<T.length;x++)if(_=T[x],w=r[_],k=Object.keys(w),M=w[\"\"],A=c(M),_<0||_>C.length-(A?0:1))i.warn(\"index out of range\",f,_);else if(void 0!==M)k.length>1&&i.warn(\"Insertion & removal are incompatible with edits to the same index.\",f,_),u(M)?z.push(_):A?(\"add\"===M&&(M={}),C.splice(_,0,M),S&&S.splice(_,0,{})):i.warn(\"Unrecognized full object edit value\",f,_,M),O===-1&&(O=_);else for(b=0;b<k.length;b++)n(C[_],k[b]).set(w[k[b]]);for(x=z.length-1;x>=0;x--)C.splice(z[x],1),S&&S.splice(z[x],1);if(C.length?L||e.set(C):e.set(null),g)return!1;if(d(v,m),p!==o){var P;if(O===-1)P=T;else{for(D=Math.max(C.length,D),P=[],x=0;x<T.length&&!((_=T[x])>=O);x++)P.push(_);for(x=O;x<D;x++)P.push(x)}for(x=0;x<P.length;x++)p(t,P[x])}else h(t);return!0}},{\"../lib/is_plain_object\":138,\"../lib/loggers\":139,\"../lib/nested_property\":142,\"../lib/noop\":143,\"../lib/search\":150,\"../registry\":206,\"./container_array_match\":155}],158:[function(t,e,r){\"use strict\";function n(t,e){t._fullLayout._paperdiv.style(\"background\",\"white\"),y.defaultConfig.setBackground(t,e)}function a(t,e){t._context||(t._context=x.extendFlat({},y.defaultConfig));var r=t._context;e&&(Object.keys(e).forEach(function(t){t in r&&(\"setBackground\"===t&&\"opaque\"===e[t]?r[t]=n:r[t]=e[t])}),e.plot3dPixelRatio&&!r.plotGlPixelRatio&&(r.plotGlPixelRatio=r.plot3dPixelRatio)),r.staticPlot&&(r.editable=!1,r.autosizable=!1,r.scrollZoom=!1,r.doubleClick=!1,r.showTips=!1,r.showLink=!1,r.displayModeBar=!1)}function o(t,e,r){var n=v.select(t).selectAll(\".plot-container\").data([0]);n.enter().insert(\"div\",\":first-child\").classed(\"plot-container plotly\",!0);var a=n.selectAll(\".svg-container\").data([0]);a.enter().append(\"div\").classed(\"svg-container\",!0).style(\"position\",\"relative\"),a.html(\"\"),e&&(t.data=e),r&&(t.layout=r),M.manager.fillLayout(t),a.style({width:t._fullLayout.width+\"px\",height:t._fullLayout.height+\"px\"}),t.framework=M.manager.framework(t),t.framework({data:t.data,layout:t.layout},a.node()),t.framework.setUndoPoint();var o=t.framework.svg(),i=1,l=t._fullLayout.title;\"\"!==l&&l||(i=0);var s=function(){this.call(S.convertToTspans)},c=o.select(\".title-group text\").call(s);if(t._context.editable){c.attr({\"data-unformatted\":l}),l&&\"Click to enter title\"!==l||(i=.2,c.attr({\"data-unformatted\":\"Click to enter title\"}).text(\"Click to enter title\").style({opacity:i}).on(\"mouseover.opacity\",function(){v.select(this).transition().duration(100).style(\"opacity\",1)}).on(\"mouseout.opacity\",function(){v.select(this).transition().duration(1e3).style(\"opacity\",0)}));var u=function(){this.call(S.makeEditable).on(\"edit\",function(e){t.framework({layout:{title:e}}),this.attr({\"data-unformatted\":e}).text(e).call(s),this.call(u)}).on(\"cancel\",function(){var t=this.attr(\"data-unformatted\");this.text(t).call(s)})};c.call(u)}return t._context.setBackground(t,t._fullLayout.paper_bgcolor),k.addLinks(t),Promise.resolve()}function i(t,e){var r,n,a=e+1,o=[];for(r=0;r<t.length;r++)n=t[r],n<0?o.push(a+n):o.push(n);return o}function l(t,e,r){var n,a;for(n=0;n<e.length;n++){if((a=e[n])!==parseInt(a,10))throw new Error(\"all values in \"+r+\" must be integers\");if(a>=t.data.length||a<-t.data.length)throw new Error(r+\" must be valid indices for gd.data.\");if(e.indexOf(a,n+1)>-1||a>=0&&e.indexOf(-t.data.length+a)>-1||a<0&&e.indexOf(t.data.length+a)>-1)throw new Error(\"each index in \"+r+\" must be unique.\")}}function s(t,e,r){if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"currentIndices is a required argument.\");if(Array.isArray(e)||(e=[e]),l(t,e,\"currentIndices\"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&l(t,r,\"newIndices\"),void 0!==r&&e.length!==r.length)throw new Error(\"current and new indices must be of equal length.\")}function c(t,e,r){var n,a;if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"traces must be defined.\");for(Array.isArray(e)||(e=[e]),n=0;n<e.length;n++)if(\"object\"!=typeof(a=e[n])||Array.isArray(a)||null===a)throw new Error(\"all values in traces array must be non-array objects\");if(void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&r.length!==e.length)throw new Error(\"if indices is specified, traces.length must equal indices.length\")}function u(t,e,r,n){var a=x.isPlainObject(n);if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array\");if(!x.isPlainObject(e))throw new Error(\"update must be a key:value object\");if(void 0===r)throw new Error(\"indices must be an integer or array of integers\");l(t,r,\"indices\");for(var o in e){if(!Array.isArray(e[o])||e[o].length!==r.length)throw new Error(\"attribute \"+o+\" must be an array of length equal to indices array length\");if(a&&(!(o in n)||!Array.isArray(n[o])||n[o].length!==e[o].length))throw new Error(\"when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object\")}}function f(t,e,r,n){var a,o,l,s,c,u=x.isPlainObject(n),f=[];Array.isArray(r)||(r=[r]),r=i(r,t.data.length-1);for(var d in e)for(var h=0;h<r.length;h++){if(a=t.data[r[h]],l=x.nestedProperty(a,d),o=l.get(),s=e[d][h],!Array.isArray(s))throw new Error(\"attribute: \"+d+\" index: \"+h+\" must be an array\");if(!Array.isArray(o))throw new Error(\"cannot extend missing or non-array attribute: \"+d);c=u?n[d][h]:n,m(c)||(c=-1),f.push({prop:l,target:o,insert:s,maxp:Math.floor(c)})}return f}function d(t,e,r,n,a,o){u(t,e,r,n);for(var i,l,s,c=f(t,e,r,n),d=[],h={},p={},g=0;g<c.length;g++)l=c[g].prop,s=c[g].maxp,i=a(c[g].target,c[g].insert),s>=0&&s<i.length&&(d=o(i,s)),s=c[g].target.length,l.set(i),Array.isArray(h[l.astr])||(h[l.astr]=[]),Array.isArray(p[l.astr])||(p[l.astr]=[]),h[l.astr].push(d),p[l.astr].push(s);return{update:h,maxPoints:p}}function h(t,e,r){function n(){return h.map(function(){})}function a(t){var e=y.Axes.id2name(t);c.indexOf(e)===-1&&c.push(e)}function o(t){return\"LAYOUT\"+t+\".autorange\"}function i(t){return\"LAYOUT\"+t+\".range\"}function l(r,a,o){if(Array.isArray(r))return void r.forEach(function(t){l(t,a,o)});if(!(r in e||O.hasParent(e,r))){var i;i=\"LAYOUT\"===r.substr(0,6)?x.nestedProperty(t.layout,r.replace(\"LAYOUT\",\"\")):x.nestedProperty(d[h[o]],r),r in v||(v[r]=n()),void 0===v[r][o]&&(v[r][o]=i.get()),void 0!==a&&i.set(a)}}var s,c,u=t._fullLayout,f=t._fullData,d=t.data,h=O.coerceTraceIndices(t,r),p={docalc:!1,docalcAutorange:!1,doplot:!1,dostyle:!1,docolorbars:!1,autorangeOn:!1,clearCalc:!1,fullReplot:!1},g={},v={},m={},b=[\"mode\",\"visible\",\"type\",\"orientation\",\"fill\",\"histfunc\",\"histnorm\",\"text\",\"x\",\"y\",\"z\",\"a\",\"b\",\"c\",\"open\",\"high\",\"low\",\"close\",\"base\",\"width\",\"offset\",\"xtype\",\"x0\",\"dx\",\"ytype\",\"y0\",\"dy\",\"xaxis\",\"yaxis\",\"line.width\",\"connectgaps\",\"transpose\",\"zsmooth\",\"showscale\",\"marker.showscale\",\"zauto\",\"marker.cauto\",\"autocolorscale\",\"marker.autocolorscale\",\"colorscale\",\"marker.colorscale\",\"reversescale\",\"marker.reversescale\",\"autobinx\",\"nbinsx\",\"xbins\",\"xbins.start\",\"xbins.end\",\"xbins.size\",\"autobiny\",\"nbinsy\",\"ybins\",\"ybins.start\",\"ybins.end\",\"ybins.size\",\"autocontour\",\"ncontours\",\"contours\",\"contours.coloring\",\"contours.operation\",\"contours.value\",\"contours.type\",\"contours.value[0]\",\"contours.value[1]\",\"error_y\",\"error_y.visible\",\"error_y.value\",\"error_y.type\",\"error_y.traceref\",\"error_y.array\",\"error_y.symmetric\",\"error_y.arrayminus\",\"error_y.valueminus\",\"error_y.tracerefminus\",\"error_x\",\"error_x.visible\",\"error_x.value\",\"error_x.type\",\"error_x.traceref\",\"error_x.array\",\"error_x.symmetric\",\"error_x.arrayminus\",\"error_x.valueminus\",\"error_x.tracerefminus\",\"swapxy\",\"swapxyaxes\",\"orientationaxes\",\"marker.colors\",\"values\",\"labels\",\"label0\",\"dlabel\",\"sort\",\"textinfo\",\"textposition\",\"textfont.size\",\"textfont.family\",\"textfont.color\",\"insidetextfont.size\",\"insidetextfont.family\",\"insidetextfont.color\",\"outsidetextfont.size\",\"outsidetextfont.family\",\"outsidetextfont.color\",\"hole\",\"scalegroup\",\"domain\",\"domain.x\",\"domain.y\",\"domain.x[0]\",\"domain.x[1]\",\"domain.y[0]\",\"domain.y[1]\",\"tilt\",\"tiltaxis\",\"depth\",\"direction\",\"rotation\",\"pull\",\"line.showscale\",\"line.cauto\",\"line.autocolorscale\",\"line.reversescale\",\"marker.line.showscale\",\"marker.line.cauto\",\"marker.line.autocolorscale\",\"marker.line.reversescale\",\"xcalendar\",\"ycalendar\",\"cumulative\",\"cumulative.enabled\",\"cumulative.direction\",\"cumulative.currentbin\",\"a0\",\"da\",\"b0\",\"db\",\"atype\",\"btype\",\"cheaterslope\",\"carpet\",\"sum\"],_=[\"color\",\"smoothing\",\"title\",\"titlefont\",\"titlefont.size\",\"titlefont.family\",\"titlefont.color\",\"titleoffset\",\"type\",\"autorange\",\"rangemode\",\"range\",\"fixedrange\",\"cheatertype\",\"tickmode\",\"nticks\",\"tickvals\",\"ticktext\",\"ticks\",\"mirror\",\"ticklen\",\"tickwidth\",\"tickcolor\",\"showticklabels\",\"tickfont\",\"tickfont.size\",\"tickfont.family\",\"tickfont.color\",\"tickprefix\",\"showtickprefix\",\"ticksuffix\",\"showticksuffix\",\"showexponent\",\"exponentformat\",\"separatethousands\",\"tickformat\",\"categoryorder\",\"categoryarray\",\"labelpadding\",\"labelprefix\",\"labelsuffix\",\"labelfont\",\"labelfont.family\",\"labelfont.size\",\"labelfont.color\",\"showline\",\"linecolor\",\"linewidth\",\"gridcolor\",\"gridwidth\",\"showgrid\",\"minorgridcount\",\"minorgridwidth\",\"minorgridcolor\",\"startline\",\"startlinecolor\",\"startlinewidth\",\"endline\",\"endlinewidth\",\"endlinecolor\",\"tick0\",\"dtick\",\"arraytick0\",\"arraydtick\",\"hoverformat\",\"tickangle\"];for(s=0;s<_.length;s++)b.push(\"aaxis.\"+_[s]),b.push(\"baxis.\"+_[s]);for(s=0;s<h.length;s++)if(w.traceIs(f[h[s]],\"box\")){b.push(\"name\");break}var M=[\"marker\",\"marker.size\",\"textfont\",\"boxpoints\",\"jitter\",\"pointpos\",\"whiskerwidth\",\"boxmean\",\"tickwidth\"],A=[\"zmin\",\"zmax\",\"zauto\",\"xgap\",\"ygap\",\"marker.cmin\",\"marker.cmax\",\"marker.cauto\",\"line.cmin\",\"line.cmax\",\"marker.line.cmin\",\"marker.line.cmax\",\"contours.start\",\"contours.end\",\"contours.size\",\"contours.showlines\",\"line\",\"line.smoothing\",\"line.shape\",\"error_y.width\",\"error_x.width\",\"error_x.copy_ystyle\",\"marker.maxdisplayed\"],T=[\"type\",\"x\",\"y\",\"x0\",\"y0\",\"orientation\",\"xaxis\",\"yaxis\"],L=[\"zmin\",\"zmax\"],C=[\"xbins.start\",\"xbins.end\",\"xbins.size\"],S=[\"ybins.start\",\"ybins.end\",\"ybins.size\"],z=[\"contours.start\",\"contours.end\",\"contours.size\"],D=[\"cartesian\",\"pie\",\"ternary\"];u._basePlotModules.forEach(function(t){D.indexOf(t.name)===-1&&(p.docalc=!0)});for(var P in e){if(O.hasParent(e,P))throw new Error(\"cannot set \"+P+\"and a parent attribute simultaneously\");var E,N,I,R,F,j=e[P];if(g[P]=j,\"LAYOUT\"!==P.substr(0,6)){for(v[P]=n(),s=0;s<h.length;s++)if(E=d[h[s]],N=f[h[s]],I=x.nestedProperty(E,P),R=I.get(),void 0!==(F=Array.isArray(j)?j[s%j.length]:j)){if(L.indexOf(P)!==-1)l(\"zauto\",!1,s);else if(\"colorscale\"===P)l(\"autocolorscale\",!1,s);else if(\"autocolorscale\"===P)l(\"colorscale\",void 0,s);else if(\"marker.colorscale\"===P)l(\"marker.autocolorscale\",!1,s);else if(\"marker.autocolorscale\"===P)l(\"marker.colorscale\",void 0,s);else if(\"zauto\"===P)l(L,void 0,s);else if(C.indexOf(P)!==-1)l(\"autobinx\",!1,s);else if(\"autobinx\"===P)l(C,void 0,s);else if(S.indexOf(P)!==-1)l(\"autobiny\",!1,s);else if(\"autobiny\"===P)l(S,void 0,s);else if(z.indexOf(P)!==-1)l(\"autocontour\",!1,s);else if(\"autocontour\"===P)l(z,void 0,s);else if([\"x0\",\"dx\"].indexOf(P)!==-1&&N.x&&\"scaled\"!==N.xtype)l(\"xtype\",\"scaled\",s);else if([\"y0\",\"dy\"].indexOf(P)!==-1&&N.y&&\"scaled\"!==N.ytype)l(\"ytype\",\"scaled\",s);else if(\"colorbar.thicknessmode\"===P&&I.get()!==F&&[\"fraction\",\"pixels\"].indexOf(F)!==-1&&N.colorbar){var B=[\"top\",\"bottom\"].indexOf(N.colorbar.orient)!==-1?u.height-u.margin.t-u.margin.b:u.width-u.margin.l-u.margin.r;l(\"colorbar.thickness\",N.colorbar.thickness*(\"fraction\"===F?1/B:B),s)}else if(\"colorbar.lenmode\"===P&&I.get()!==F&&[\"fraction\",\"pixels\"].indexOf(F)!==-1&&N.colorbar){var q=[\"top\",\"bottom\"].indexOf(N.colorbar.orient)!==-1?u.width-u.margin.l-u.margin.r:u.height-u.margin.t-u.margin.b;l(\"colorbar.len\",N.colorbar.len*(\"fraction\"===F?1/q:q),s)}else\"colorbar.tick0\"===P||\"colorbar.dtick\"===P?l(\"colorbar.tickmode\",\"linear\",s):\"colorbar.tickmode\"===P&&l([\"colorbar.tick0\",\"colorbar.dtick\"],void 0,s);if(\"type\"===P&&\"pie\"===F!=(\"pie\"===R)){var H=\"x\",V=\"y\";\"bar\"!==F&&\"bar\"!==R||\"h\"!==E.orientation||(H=\"y\",V=\"x\"),x.swapAttrs(E,[\"?\",\"?src\"],\"labels\",H),x.swapAttrs(E,[\"d?\",\"?0\"],\"label\",H),x.swapAttrs(E,[\"?\",\"?src\"],\"values\",V),\"pie\"===R?(x.nestedProperty(E,\"marker.color\").set(x.nestedProperty(E,\"marker.colors\").get()),u._pielayer.selectAll(\"g.trace\").remove()):w.traceIs(E,\"cartesian\")&&(x.nestedProperty(E,\"marker.colors\").set(x.nestedProperty(E,\"marker.color\").get()),m[E.xaxis||\"x\"]=!0,m[E.yaxis||\"y\"]=!0)}v[P][s]=R;var U=[\"swapxy\",\"swapxyaxes\",\"orientation\",\"orientationaxes\"];if(U.indexOf(P)!==-1){if(\"orientation\"===P){if(I.set(F),I.get()===v[P][s])continue}else\"orientationaxes\"===P&&(E.orientation={v:\"h\",h:\"v\"}[N.orientation]);O.swapXYData(E)}else if(k.dataArrayContainers.indexOf(I.parts[0])!==-1)O.manageArrayContainers(I,F,v),p.docalc=!0;else{var X=(N._module||{}).attributes||{},G=x.nestedProperty(X,P).get()||x.nestedProperty(k.attributes,P).get()||{};G.valType||(p.docalc=!0),G.arrayOk&&(Array.isArray(F)||Array.isArray(R))&&(p.docalc=!0),\"docalc\"===G.editType&&(p.docalc=!0),I.set(F)}}if([\"swapxyaxes\",\"orientationaxes\"].indexOf(P)!==-1&&y.Axes.swap(t,h),\"orientationaxes\"===P){var Y=x.nestedProperty(t.layout,\"hovermode\");\"x\"===Y.get()?Y.set(\"y\"):\"y\"===Y.get()&&Y.set(\"x\")}h.indexOf(0)!==-1&&T.indexOf(P)!==-1&&(y.Axes.clearTypes(t,h),p.docalc=!0),[\"autobinx\",\"autobiny\",\"zauto\"].indexOf(P)!==-1&&F===!1||(p.dostyle=!0),([\"colorbar\",\"line\"].indexOf(I.parts[0])!==-1||\"marker\"===I.parts[0]&&\"colorbar\"===I.parts[1])&&(p.docolorbars=!0);var Z=P.indexOf(\"[\"),W=Z===-1?P:P.substr(0,Z);if(b.indexOf(W)!==-1){if([\"orientation\",\"type\"].indexOf(P)!==-1){for(c=[],s=0;s<h.length;s++){var $=d[h[s]];w.traceIs($,\"cartesian\")&&(a($.xaxis||\"x\"),a($.yaxis||\"y\"),\"type\"===P&&l([\"autobinx\",\"autobiny\"],!0,s))}l(c.map(o),!0,0),l(c.map(i),[0,1],0)}p.docalc=!0}else A.indexOf(W)!==-1?p.doplot=!0:0===W.indexOf(\"aaxis\")||0===W.indexOf(\"baxis\")?p.doplot=!0:M.indexOf(W)!==-1&&(p.docalcAutorange=!0)}else I=x.nestedProperty(t.layout,P.replace(\"LAYOUT\",\"\")),v[P]=[I.get()],I.set(Array.isArray(j)?j[0]:j),p.docalc=!0}y.Axes.list(t).forEach(function(t){t.autorange&&(p.autorangeOn=!0)});var Q=Object.keys(m);t:for(s=0;s<Q.length;s++){for(var J=Q[s],K=J.charAt(0),tt=K+\"axis\",et=0;et<d.length;et++)if(w.traceIs(d[et],\"cartesian\")&&(d[et][tt]||K)===J)continue t;l(\"LAYOUT\"+y.Axes.id2name(J),null,0)}return(p.docalc||p.docalcAutorange&&p.autorangeOn)&&(p.clearCalc=!0),(p.docalc||p.doplot||p.docalcAutorange)&&(p.fullReplot=!0),{flags:p,undoit:v,redoit:g,traces:h,eventData:x.extendDeepNoArrays([],[g,h])}}function p(t,e){function r(t,n){if(Array.isArray(t))return void t.forEach(function(t){r(t,n)});if(!(t in e||O.hasParent(e,t))){var a=x.nestedProperty(s,t);t in b||(b[t]=a.get()),void 0!==n&&a.set(n)}}function n(e,r){if(!x.isPlainObject(e))return!1;var n=e[r+\"ref\"]||r,a=y.Axes.getFromId(t,n);return a||n.charAt(0)!==r||(a=y.Axes.getFromId(t,r)),(a||{}).autorange}function a(t){var e=N.name2id(t.split(\".\")[0]);_[e]=1}var o,i,l,s=t.layout,c=t._fullLayout,u=Object.keys(e),f=y.Axes.list(t),d={};for(i=0;i<u.length;i++)if(0===u[i].indexOf(\"allaxes\")){for(l=0;l<f.length;l++){var h=f[l]._id.substr(1),p=h.indexOf(\"scene\")!==-1?h+\".\":\"\",g=u[i].replace(\"allaxes\",p+f[l]._name);e[g]||(e[g]=e[u[i]])}delete e[u[i]]}var v={dolegend:!1,doticks:!1,dolayoutstyle:!1,doplot:!1,docalc:!1,domodebar:!1,docamera:!1,layoutReplot:!1},m={},b={},_={};for(var M in e){if(O.hasParent(e,M))throw new Error(\"cannot set \"+M+\"and a parent attribute simultaneously\");var A=x.nestedProperty(s,M),T=e[M],L=A.parts.length,C=\"string\"==typeof A.parts[L-1]?L-1:L-2,S=A.parts[0],D=A.parts[C],E=A.parts[C-1]+\".\"+D,I=A.parts.slice(0,C).join(\".\"),R=x.nestedProperty(t.layout,I).get(),F=x.nestedProperty(c,I).get();if(void 0!==T){if(m[M]=T,b[M]=\"reverse\"===D?T:A.get(),[\"width\",\"height\"].indexOf(M)!==-1&&null===T?c[M]=t._initialAutoSize[M]:E.match(/^[xyz]axis[0-9]*\\.range(\\[[0|1]\\])?$/)?(r(I+\".autorange\",!1),a(E)):E.match(/^[xyz]axis[0-9]*\\.autorange$/)?(r([I+\".range[0]\",I+\".range[1]\"],void 0),a(E)):E.match(/^aspectratio\\.[xyz]$/)?r(S+\".aspectmode\",\"manual\"):E.match(/^aspectmode$/)?r([I+\".x\",I+\".y\",I+\".z\"],void 0):\"tick0\"===D||\"dtick\"===D?r(I+\".tickmode\",\"linear\"):\"tickmode\"===D?r([I+\".tick0\",I+\".dtick\"],void 0):/[xy]axis[0-9]*?$/.test(D)&&!Object.keys(T||{}).length?v.docalc=!0:/[xy]axis[0-9]*\\.categoryorder$/.test(E)?v.docalc=!0:/[xy]axis[0-9]*\\.categoryarray/.test(E)&&(v.docalc=!0),E.indexOf(\"rangeslider\")!==-1&&(v.docalc=!0),\"type\"===D){var j=R,B=\"linear\"===F.type&&\"log\"===T,q=\"log\"===F.type&&\"linear\"===T;if(B||q){if(j&&j.range)if(F.autorange)B&&(j.range=j.range[1]>j.range[0]?[1,2]:[2,1]);else{var H=j.range[0],V=j.range[1];B?(H<=0&&V<=0&&r(I+\".autorange\",!0),H<=0?H=V/1e6:V<=0&&(V=H/1e6),r(I+\".range[0]\",Math.log(H)/Math.LN10),r(I+\".range[1]\",Math.log(V)/Math.LN10)):(r(I+\".range[0]\",Math.pow(10,H)),r(I+\".range[1]\",Math.pow(10,V)))}else r(I+\".autorange\",!0);w.getComponentMethod(\"annotations\",\"convertCoords\")(t,F,T,r),w.getComponentMethod(\"images\",\"convertCoords\")(t,F,T,r)}else r(I+\".autorange\",!0)}else if(D.match(P.AX_NAME_PATTERN)){var U=x.nestedProperty(c,M).get(),X=(T||{}).type;X&&\"-\"!==X||(X=\"linear\"),w.getComponentMethod(\"annotations\",\"convertCoords\")(t,U,X,r),w.getComponentMethod(\"images\",\"convertCoords\")(t,U,X,r)}var G=z.containerArrayMatch(M);if(G){o=G.array,i=G.index;var Y=G.property,Z=x.nestedProperty(s,o),W=(Z||[])[i]||{};if(\"\"===i)M.indexOf(\"updatemenus\")===-1&&(v.docalc=!0);else if(\"\"===Y){var $=T;z.isAddVal(T)?b[M]=null:z.isRemoveVal(T)?(b[M]=W,$=W):x.warn(\"unrecognized full object value\",e),(n($,\"x\")||n($,\"y\")&&M.indexOf(\"updatemenus\")===-1)&&(v.docalc=!0)}else!n(W,\"x\")&&!n(W,\"y\")||x.containsAny(M,[\"color\",\"opacity\",\"align\",\"dash\",\"updatemenus\"])||(v.docalc=!0);d[o]||(d[o]={});var Q=d[o][i];Q||(Q=d[o][i]={}),Q[Y]=T,delete e[M]}else if(\"reverse\"===D)R.range?R.range.reverse():(r(I+\".autorange\",!0),R.range=[1,0]),F.autorange?v.docalc=!0:v.doplot=!0;else{var J=String(A.parts[1]||\"\");0===S.indexOf(\"scene\")?\"camera\"===A.parts[1]?v.docamera=!0:v.doplot=!0:0===S.indexOf(\"geo\")?v.doplot=!0:0===S.indexOf(\"ternary\")?v.doplot=!0:\"paper_bgcolor\"===M?v.doplot=!0:\"margin\"===S||\"autorange\"===J||\"rangemode\"===J||\"type\"===J||\"domain\"===J||\"fixedrange\"===J||\"scaleanchor\"===J||\"scaleratio\"===J||M.indexOf(\"calendar\")!==-1||M.match(/^(bar|box|font)/)?v.docalc=!0:!c._has(\"gl2d\")||M.indexOf(\"axis\")===-1&&\"plot_bgcolor\"!==M?\"hiddenlabels\"===M?v.docalc=!0:S.indexOf(\"legend\")!==-1?v.dolegend=!0:M.indexOf(\"title\")!==-1?v.doticks=!0:S.indexOf(\"bgcolor\")!==-1?v.dolayoutstyle=!0:L>1&&x.containsAny(J,[\"tick\",\"exponent\",\"grid\",\"zeroline\"])?v.doticks=!0:M.indexOf(\".linewidth\")!==-1&&M.indexOf(\"axis\")!==-1?v.doticks=v.dolayoutstyle=!0:L>1&&J.indexOf(\"line\")!==-1?v.dolayoutstyle=!0:L>1&&\"mirror\"===J?v.doticks=v.dolayoutstyle=!0:\"margin.pad\"===M?v.doticks=v.dolayoutstyle=!0:[\"hovermode\",\"dragmode\"].indexOf(M)!==-1||M.indexOf(\"spike\")!==-1?v.domodebar=!0:[\"height\",\"width\",\"autosize\"].indexOf(M)===-1&&(v.doplot=!0):v.doplot=!0,A.set(T)}}}for(o in d){z.applyContainerArrayChanges(t,x.nestedProperty(s,o),d[o],v)||(v.doplot=!0)}var K=c._axisConstraintGroups;for(var tt in _)for(i=0;i<K.length;i++){var et=K[i];if(et[tt]){v.docalc=!0;for(var rt in et)_[rt]||(N.getFromId(t,rt)._constraintShrinkable=!0)}}var nt=c.width,at=c.height;return t.layout.autosize&&k.plotAutoSize(t,t.layout,c),(e.height||e.width||c.width!==nt||c.height!==at)&&(v.docalc=!0),(v.doplot||v.docalc)&&(v.layoutReplot=!0),{flags:v,undoit:b,redoit:m,eventData:x.extendDeep({},m)}}function g(t){var e=v.select(t),r=t._fullLayout;if(r._container=e.selectAll(\".plot-container\").data([0]),r._container.enter().insert(\"div\",\":first-child\").classed(\"plot-container\",!0).classed(\"plotly\",!0),r._paperdiv=r._container.selectAll(\".svg-container\").data([0]),r._paperdiv.enter().append(\"div\").classed(\"svg-container\",!0).style(\"position\",\"relative\"),r._glcontainer=r._paperdiv.selectAll(\".gl-container\").data([0]),r._glcontainer.enter().append(\"div\").classed(\"gl-container\",!0),r._paperdiv.selectAll(\".main-svg\").remove(),r._paper=r._paperdiv.insert(\"svg\",\":first-child\").classed(\"main-svg\",!0),r._toppaper=r._paperdiv.append(\"svg\").classed(\"main-svg\",!0),!r._uid){var n=[];v.selectAll(\"defs\").each(function(){this.id&&n.push(this.id.split(\"-\")[1])}),r._uid=x.randstr(n)}r._paperdiv.selectAll(\".main-svg\").attr(C.svgAttrs),r._defs=r._paper.append(\"defs\").attr(\"id\",\"defs-\"+r._uid),r._topdefs=r._toppaper.append(\"defs\").attr(\"id\",\"topdefs-\"+r._uid),r._bgLayer=r._paper.append(\"g\").classed(\"bglayer\",!0),r._draggers=r._paper.append(\"g\").classed(\"draglayer\",!0);var a=r._paper.append(\"g\").classed(\"layer-below\",!0);r._imageLowerLayer=a.append(\"g\").classed(\"imagelayer\",!0),r._shapeLowerLayer=a.append(\"g\").classed(\"shapelayer\",!0),r._cartesianlayer=r._paper.append(\"g\").classed(\"cartesianlayer\",!0),r._ternarylayer=r._paper.append(\"g\").classed(\"ternarylayer\",!0),r._geolayer=r._paper.append(\"g\").classed(\"geolayer\",!0);var o=r._paper.append(\"g\").classed(\"layer-above\",!0);r._imageUpperLayer=o.append(\"g\").classed(\"imagelayer\",!0),r._shapeUpperLayer=o.append(\"g\").classed(\"shapelayer\",!0),r._pielayer=r._paper.append(\"g\").classed(\"pielayer\",!0),r._glimages=r._paper.append(\"g\").classed(\"glimages\",!0),r._infolayer=r._toppaper.append(\"g\").classed(\"infolayer\",!0),r._zoomlayer=r._toppaper.append(\"g\").classed(\"zoomlayer\",!0),r._hoverlayer=r._toppaper.append(\"g\").classed(\"hoverlayer\",!0),t.emit(\"plotly_framework\")}var v=t(\"d3\"),m=t(\"fast-isnumeric\"),y=t(\"../plotly\"),x=t(\"../lib\"),b=t(\"../lib/events\"),_=t(\"../lib/queue\"),w=t(\"../registry\"),k=t(\"../plots/plots\"),M=t(\"../plots/polar\"),A=t(\"../plots/cartesian/graph_interact\"),T=t(\"../components/drawing\"),L=t(\"../components/errorbars\"),C=t(\"../constants/xmlns_namespaces\"),S=t(\"../lib/svg_text_utils\"),z=t(\"./manage_arrays\"),O=t(\"./helpers\"),D=t(\"./subroutines\"),P=t(\"../plots/cartesian/constants\"),E=t(\"../plots/cartesian/constraints\"),N=t(\"../plots/cartesian/axis_ids\");y.plot=function(t,e,r,n){function i(){if(m)return y.addFrames(t,m)}function l(){for(var e=C._basePlotModules,r=0;r<e.length;r++)e[r].drawFramework&&e[r].drawFramework(t);return x.syncOrAsync([D.layoutStyles,d,A],t)}function s(){var e,r,n,a=t.calcdata;for(w.getComponentMethod(\"legend\",\"draw\")(t),w.getComponentMethod(\"rangeselector\",\"draw\")(t),w.getComponentMethod(\"sliders\",\"draw\")(t),w.getComponentMethod(\"updatemenus\",\"draw\")(t),e=0;e<a.length;e++)r=a[e],n=r[0].trace,n.visible===!0&&n._module.colorbar?n._module.colorbar(t,r):k.autoMargin(t,\"cb\"+n.uid);return k.doAutoMargin(t),k.previousPromises(t)}function c(){var e=JSON.stringify(C._size)===P?[]:[s,D.layoutStyles];return e=e.concat(A),x.syncOrAsync(e,t)}function u(){if(S){for(var e,r,n=k.getSubplotIds(C,\"cartesian\"),a=C._modules,o=0;o<n.length;o++){e=C._plots[n[o]];for(var i=0;i<a.length;i++)r=a[i],r.setPositions&&r.setPositions(t,e)}return L.calc(t),x.syncOrAsync([w.getComponentMethod(\"shapes\",\"calcAutorange\"),w.getComponentMethod(\"annotations\",\"calcAutorange\"),f,w.getComponentMethod(\"rangeslider\",\"calcAutorange\")],t)}}function f(){if(!t._transitioning){for(var e=y.Axes.list(t,\"\",!0),r=0;r<e.length;r++)y.Axes.doAutoRange(e[r]);E(t),M&&y.Axes.saveRangeInitial(t)}}function d(){return y.Axes.doTicks(t,\"redraw\")}function h(){var e,r=t.calcdata,n=C._infolayer.selectAll(\"g.rangeslider-container\");for(e=0;e<r.length;e++){var a=r[e][0].trace,o=a.visible===!0,i=a.uid;if(!o||!w.traceIs(a,\"2dMap\")){var l=\".hm\"+i+\",.contour\"+i+\",#clip\"+i;C._paper.selectAll(l).remove(),n.selectAll(l).remove()}o&&a._module.colorbar||C._infolayer.selectAll(\".cb\"+i).remove()}var s=C._basePlotModules;for(e=0;e<s.length;e++)s[e].plot(t);var c=C._paper.selectAll(\".layer-subplot\");return C._shapeSubplotLayers=c.selectAll(\".shapelayer\"),k.style(t),w.getComponentMethod(\"shapes\",\"draw\")(t),w.getComponentMethod(\"annotations\",\"draw\")(t),k.addLinks(t),C._replotting=!1,k.previousPromises(t)}function p(){w.getComponentMethod(\"shapes\",\"draw\")(t),w.getComponentMethod(\"images\",\"draw\")(t),w.getComponentMethod(\"annotations\",\"draw\")(t),w.getComponentMethod(\"legend\",\"draw\")(t),w.getComponentMethod(\"rangeslider\",\"draw\")(t),w.getComponentMethod(\"rangeselector\",\"draw\")(t),w.getComponentMethod(\"sliders\",\"draw\")(t),w.getComponentMethod(\"updatemenus\",\"draw\")(t)}var m;if(t=O.getGraphDiv(t),b.init(t),x.isPlainObject(e)){var _=e;e=_.data,r=_.layout,n=_.config,m=_.frames}if(b.triggerHandler(t,\"plotly_beforeplot\",[e,r,n])===!1)return Promise.reject();e||r||x.isPlotDiv(t)||x.warn(\"Calling Plotly.plot as if redrawing but this container doesn't yet have a plot.\",t),a(t,n),r||(r={}),v.select(t).classed(\"js-plotly-plot\",!0),T.makeTester(),t._promises=[];var M=0===(t.data||[]).length&&Array.isArray(e);if(Array.isArray(e)&&(O.cleanData(e,t.data),M?t.data=e:t.data.push.apply(t.data,e),t.empty=!1),t.layout&&!M||(t.layout=O.cleanLayout(r)),t._dragging&&!t._transitioning)return t._replotPending=!0,Promise.reject();t._replotPending=!1,k.supplyDefaults(t);var C=t._fullLayout;if(e&&e[0]&&e[0].r)return o(t,e,r);C._replotting=!0,M&&g(t),t.framework!==g&&(t.framework=g,g(t)),T.initGradients(t),M&&y.Axes.saveShowSpikeInitial(t);var S=!t.calcdata||t.calcdata.length!==(t._fullData||[]).length;S&&k.doCalcdata(t);for(var z=0;z<t.calcdata.length;z++)t.calcdata[z][0].trace=t._fullData[z];var P=JSON.stringify(C._size),N=[k.previousPromises,i,l,s,c,u,D.layoutStyles,d,h,p,k.rehover];return x.syncOrAsync(N,t),Promise.all(t._promises).then(function(){return t.emit(\"plotly_afterplot\"),t})},y.redraw=function(t){if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t);return O.cleanData(t.data,t.data),O.cleanLayout(t.layout),t.calcdata=void 0,y.plot(t).then(function(){return t.emit(\"plotly_redraw\"),t})},y.newPlot=function(t,e,r,n){return t=O.getGraphDiv(t),k.cleanPlot([],{},t._fullData||{},t._fullLayout||{}),k.purge(t),y.plot(t,e,r,n)},y.extendTraces=function t(e,r,n,a){e=O.getGraphDiv(e);var o=d(e,r,n,a,function(t,e){return t.concat(e)},function(t,e){return t.splice(0,t.length-e)}),i=y.redraw(e),l=[e,o.update,n,o.maxPoints];return _.add(e,y.prependTraces,l,t,arguments),i},y.prependTraces=function t(e,r,n,a){e=O.getGraphDiv(e);var o=d(e,r,n,a,function(t,e){return e.concat(t)},function(t,e){return t.splice(e,t.length)}),i=y.redraw(e),l=[e,o.update,n,o.maxPoints];return _.add(e,y.extendTraces,l,t,arguments),i},y.addTraces=function t(e,r,n){e=O.getGraphDiv(e);var a,o,i=[],l=y.deleteTraces,u=t,f=[e,i],d=[e,r];for(c(e,r,n),Array.isArray(r)||(r=[r]),r=r.map(function(t){return x.extendFlat({},t)}),O.cleanData(r,e.data),a=0;a<r.length;a++)e.data.push(r[a]);for(a=0;a<r.length;a++)i.push(-r.length+a);if(void 0===n)return o=y.redraw(e),_.add(e,l,f,u,d),o;Array.isArray(n)||(n=[n]);try{s(e,i,n)}catch(t){throw e.data.splice(e.data.length-r.length,r.length),t}return _.startSequence(e),_.add(e,l,f,u,d),o=y.moveTraces(e,i,n),_.stopSequence(e),o},y.deleteTraces=function t(e,r){e=O.getGraphDiv(e);var n,a,o=[],s=y.addTraces,c=t,u=[e,o,r],f=[e,r];if(void 0===r)throw new Error(\"indices must be an integer or array of integers.\");for(Array.isArray(r)||(r=[r]),l(e,r,\"indices\"),r=i(r,e.data.length-1),r.sort(x.sorterDes),n=0;n<r.length;n+=1)a=e.data.splice(r[n],1)[0],o.push(a);var d=y.redraw(e);return _.add(e,s,u,c,f),d},y.moveTraces=function t(e,r,n){e=O.getGraphDiv(e);var a,o=[],l=[],c=t,u=t,f=[e,n,r],d=[e,r,n];if(s(e,r,n),r=Array.isArray(r)?r:[r],void 0===n)for(n=[],a=0;a<r.length;a++)n.push(-r.length+a);for(n=Array.isArray(n)?n:[n],r=i(r,e.data.length-1),n=i(n,e.data.length-1),a=0;a<e.data.length;a++)r.indexOf(a)===-1&&o.push(e.data[a]);for(a=0;a<r.length;a++)l.push({newIndex:n[a],trace:e.data[r[a]]});for(l.sort(function(t,e){return t.newIndex-e.newIndex}),a=0;a<l.length;a+=1)o.splice(l[a].newIndex,0,l[a].trace);e.data=o;var h=y.redraw(e);return _.add(e,c,f,u,d),h},y.restyle=function t(e,r,n,a){e=O.getGraphDiv(e),O.clearPromiseQueue(e);var o={};if(\"string\"==typeof r)o[r]=n;else{if(!x.isPlainObject(r))return x.warn(\"Restyle fail.\",r,n,a),Promise.reject();o=x.extendFlat({},r),void 0===a&&(a=n)}Object.keys(o).length&&(e.changed=!0);var i=h(e,o,a),l=i.flags;l.clearCalc&&(e.calcdata=void 0);var s=[];l.fullReplot?s.push(y.plot):(s.push(k.previousPromises),k.supplyDefaults(e),l.dostyle&&s.push(D.doTraceStyle),l.docolorbars&&s.push(D.doColorBars)),s.push(k.rehover),_.add(e,t,[e,i.undoit,i.traces],t,[e,i.redoit,i.traces]);var c=x.syncOrAsync(s,e);return c&&c.then||(c=Promise.resolve()),c.then(function(){return e.emit(\"plotly_restyle\",i.eventData),e})},y.relayout=function t(e,r,n){if(e=O.getGraphDiv(e),O.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);var a={};if(\"string\"==typeof r)a[r]=n;else{if(!x.isPlainObject(r))return x.warn(\"Relayout fail.\",r,n),Promise.reject();a=x.extendFlat({},r)}Object.keys(a).length&&(e.changed=!0);var o=p(e,a),i=o.flags\n",
|
|
";i.docalc&&(e.calcdata=void 0);var l=[k.previousPromises];i.layoutReplot?l.push(D.layoutReplot):Object.keys(a).length&&(k.supplyDefaults(e),i.dolegend&&l.push(D.doLegend),i.dolayoutstyle&&l.push(D.layoutStyles),i.doticks&&l.push(D.doTicksRelayout),i.domodebar&&l.push(D.doModeBar),i.docamera&&l.push(D.doCamera)),l.push(k.rehover),_.add(e,t,[e,o.undoit],t,[e,o.redoit]);var s=x.syncOrAsync(l,e);return s&&s.then||(s=Promise.resolve(e)),s.then(function(){return e.emit(\"plotly_relayout\",o.eventData),e})},y.update=function t(e,r,n,a){if(e=O.getGraphDiv(e),O.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);x.isPlainObject(r)||(r={}),x.isPlainObject(n)||(n={}),Object.keys(r).length&&(e.changed=!0),Object.keys(n).length&&(e.changed=!0);var o=h(e,x.extendFlat({},r),a),i=o.flags,l=p(e,x.extendFlat({},n)),s=l.flags;(i.clearCalc||s.docalc)&&(e.calcdata=void 0);var c=[];if(i.fullReplot&&s.layoutReplot){var u=e.data,f=e.layout;e.data=void 0,e.layout=void 0,c.push(function(){return y.plot(e,u,f)})}else i.fullReplot?c.push(y.plot):s.layoutReplot?c.push(D.layoutReplot):(c.push(k.previousPromises),k.supplyDefaults(e),i.dostyle&&c.push(D.doTraceStyle),i.docolorbars&&c.push(D.doColorBars),s.dolegend&&c.push(D.doLegend),s.dolayoutstyle&&c.push(D.layoutStyles),s.doticks&&c.push(D.doTicksRelayout),s.domodebar&&c.push(D.doModeBar),s.doCamera&&c.push(D.doCamera));c.push(k.rehover),_.add(e,t,[e,o.undoit,l.undoit,o.traces],t,[e,o.redoit,l.redoit,o.traces]);var d=x.syncOrAsync(c,e);return d&&d.then||(d=Promise.resolve(e)),d.then(function(){return e.emit(\"plotly_update\",{data:o.eventData,layout:l.eventData}),e})},y.animate=function(t,e,r){function n(t){return Array.isArray(l)?t>=l.length?l[0]:l[t]:l}function a(t){return Array.isArray(s)?t>=s.length?s[0]:s[t]:s}function o(t,e){var r=0;return function(){if(t&&++r===e)return t()}}if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t+\". It's likely that you've failed to create a plot before animating it. For more details, see https://plot.ly/javascript/animations/\");var i=t._transitionData;i._frameQueue||(i._frameQueue=[]),r=k.supplyAnimationDefaults(r);var l=r.transition,s=r.frame;return void 0===i._frameWaitingCnt&&(i._frameWaitingCnt=0),new Promise(function(s,c){function u(){t.emit(\"plotly_animated\"),window.cancelAnimationFrame(i._animationRaf),i._animationRaf=null}function f(){i._currentFrame&&i._currentFrame.onComplete&&i._currentFrame.onComplete();var e=i._currentFrame=i._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,i._lastFrameAt=Date.now(),i._timeToNext=e.frameOpts.duration,k.transition(t,e.frame.data,e.frame.layout,O.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then(function(){e.onComplete&&e.onComplete()}),t.emit(\"plotly_animatingframe\",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else u()}function d(){t.emit(\"plotly_animating\"),i._lastFrameAt=-1/0,i._timeToNext=0,i._runningTransitions=0,i._currentFrame=null;var e=function(){i._animationRaf=window.requestAnimationFrame(e),Date.now()-i._lastFrameAt>i._timeToNext&&f()};e()}function h(t){return Array.isArray(l)?v>=l.length?t.transitionOpts=l[v]:t.transitionOpts=l[0]:t.transitionOpts=l,v++,t}var p,g,v=0,m=[],y=void 0===e||null===e,b=Array.isArray(e);if(y||b||!x.isPlainObject(e)){if(y||[\"string\",\"number\"].indexOf(typeof e)!==-1)for(p=0;p<i._frames.length;p++)(g=i._frames[p])&&(y||String(g.group)===String(e))&&m.push({type:\"byname\",name:String(g.name),data:h({name:g.name})});else if(b)for(p=0;p<e.length;p++){var _=e[p];[\"number\",\"string\"].indexOf(typeof _)!==-1?(_=String(_),m.push({type:\"byname\",name:_,data:h({name:_})})):x.isPlainObject(_)&&m.push({type:\"object\",data:h(x.extendFlat({},_))})}}else m.push({type:\"object\",data:h(x.extendFlat({},e))});for(p=0;p<m.length;p++)if(g=m[p],\"byname\"===g.type&&!i._frameHash[g.data.name])return x.warn('animate failure: frame not found: \"'+g.data.name+'\"'),void c();[\"next\",\"immediate\"].indexOf(r.mode)!==-1&&function(){if(0!==i._frameQueue.length){for(;i._frameQueue.length;){var e=i._frameQueue.pop();e.onInterrupt&&e.onInterrupt()}t.emit(\"plotly_animationinterrupted\",[])}}(),\"reverse\"===r.direction&&m.reverse();var w=t._fullLayout._currentFrame;if(w&&r.fromcurrent){var M=-1;for(p=0;p<m.length;p++)if(g=m[p],\"byname\"===g.type&&g.name===w){M=p;break}if(M>0&&M<m.length-1){var A=[];for(p=0;p<m.length;p++)g=m[p],(\"byname\"!==m[p].type||p>M)&&A.push(g);m=A}}m.length>0?function(e){if(0!==e.length){for(var l=0;l<e.length;l++){var u;u=\"byname\"===e[l].type?k.computeFrame(t,e[l].name):e[l].data;var f=a(l),h=n(l);h.duration=Math.min(h.duration,f.duration);var p={frame:u,name:e[l].name,frameOpts:f,transitionOpts:h};l===e.length-1&&(p.onComplete=o(s,2),p.onInterrupt=c),i._frameQueue.push(p)}\"immediate\"===r.mode&&(i._lastFrameAt=-1/0),i._animationRaf||d()}}(m):(t.emit(\"plotly_animated\"),s())})},y.addFrames=function(t,e,r){t=O.getGraphDiv(t);var n=0;if(null===e||void 0===e)return Promise.resolve();if(!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t+\". It's likely that you've failed to create a plot before adding frames. For more details, see https://plot.ly/javascript/animations/\");var a,o,i,l,s=t._transitionData._frames,c=t._transitionData._frameHash;if(!Array.isArray(e))throw new Error(\"addFrames failure: frameList must be an Array of frame definitions\"+e);var u=s.length+2*e.length,f=[];for(a=e.length-1;a>=0;a--)if(x.isPlainObject(e[a])){var d=(c[e[a].name]||{}).name,h=e[a].name;d&&h&&\"number\"==typeof h&&c[d]&&(n++,x.warn('addFrames: overwriting frame \"'+c[d].name+'\" with a frame whose name of type \"number\" also equates to \"'+d+'\". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),n>5&&x.warn(\"addFrames: This API call has yielded too many warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.\")),f.push({frame:k.supplyFrameDefaults(e[a]),index:r&&void 0!==r[a]&&null!==r[a]?r[a]:u+a})}f.sort(function(t,e){return t.index>e.index?-1:t.index<e.index?1:0});var p=[],g=[],v=s.length;for(a=f.length-1;a>=0;a--){if(o=f[a].frame,\"number\"==typeof o.name&&x.warn(\"Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings\"),!o.name)for(;c[o.name=\"frame \"+t._transitionData._counter++];);if(c[o.name]){for(i=0;i<s.length&&(s[i]||{}).name!==o.name;i++);p.push({type:\"replace\",index:i,value:o}),g.unshift({type:\"replace\",index:i,value:s[i]})}else l=Math.max(0,Math.min(f[a].index,v)),p.push({type:\"insert\",index:l,value:o}),g.unshift({type:\"delete\",index:l}),v++}var m=k.modifyFrames,y=k.modifyFrames,b=[t,g],w=[t,p];return _&&_.add(t,m,b,y,w),k.modifyFrames(t,p)},y.deleteFrames=function(t,e){if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t);var r,n,a=t._transitionData._frames,o=[],i=[];if(!e)for(e=[],r=0;r<a.length;r++)e.push(r);for(e=e.slice(0),e.sort(),r=e.length-1;r>=0;r--)n=e[r],o.push({type:\"delete\",index:n}),i.unshift({type:\"insert\",index:n,value:a[n]});var l=k.modifyFrames,s=k.modifyFrames,c=[t,i],u=[t,o];return _&&_.add(t,l,c,s,u),k.modifyFrames(t,o)},y.purge=function(t){t=O.getGraphDiv(t);var e=t._fullLayout||{},r=t._fullData||[];return k.cleanPlot([],{},r,e),k.purge(t),b.purge(t),e._container&&e._container.remove(),delete t._context,delete t._replotPending,delete t._mouseDownTime,delete t._legendMouseDownTime,delete t._hmpixcount,delete t._hmlumcount,t}},{\"../components/drawing\":49,\"../components/errorbars\":55,\"../constants/xmlns_namespaces\":124,\"../lib\":136,\"../lib/events\":131,\"../lib/queue\":148,\"../lib/svg_text_utils\":153,\"../plotly\":166,\"../plots/cartesian/axis_ids\":174,\"../plots/cartesian/constants\":176,\"../plots/cartesian/constraints\":178,\"../plots/cartesian/graph_interact\":180,\"../plots/plots\":199,\"../plots/polar\":202,\"../registry\":206,\"./helpers\":156,\"./manage_arrays\":157,\"./subroutines\":163,d3:7,\"fast-isnumeric\":10}],159:[function(t,e,r){\"use strict\";function n(t,r){try{t._fullLayout._paper.style(\"background\",r)}catch(t){e.exports.logging>0&&console.error(t)}}e.exports={staticPlot:!1,editable:!1,autosizable:!1,queueLength:0,fillFrame:!1,frameMargins:0,scrollZoom:!1,doubleClick:\"reset+autosize\",showTips:!0,showAxisDragHandles:!0,showAxisRangeEntryBoxes:!0,showLink:!1,sendData:!0,linkText:\"Edit chart\",showSources:!1,displayModeBar:\"hover\",modeBarButtonsToRemove:[],modeBarButtonsToAdd:[],modeBarButtons:!1,displaylogo:!0,plotGlPixelRatio:2,setBackground:n,topojsonURL:\"https://cdn.plot.ly/\",mapboxAccessToken:null,logging:!1,globalTransforms:[]}},{}],160:[function(t,e,r){\"use strict\";function n(t){var e,r;\"area\"===t?(e={attributes:x},r={}):(e=h.modules[t]._module,r=e.basePlotModule);var n={};n.type=null,w(n,g),w(n,e.attributes),r.attributes&&w(n,r.attributes),Object.keys(h.componentsRegistry).forEach(function(e){var r=h.componentsRegistry[e];r.schema&&r.schema.traces&&r.schema.traces[t]&&Object.keys(r.schema.traces[t]).forEach(function(e){d(n,r.schema.traces[t][e],e)})}),n.type=t;var a={meta:e.meta||{},attributes:l(n)};if(e.layoutAttributes){var o={};w(o,e.layoutAttributes),a.layoutAttributes=l(o)}return a}function a(){var t={};return w(t,v),Object.keys(h.subplotsRegistry).forEach(function(e){var r=h.subplotsRegistry[e];if(r.layoutAttributes)if(\"cartesian\"===r.name)f(t,r,\"xaxis\"),f(t,r,\"yaxis\");else{var n=\"subplot\"===r.attr?r.name:r.attr;f(t,r,n)}}),t=u(t),Object.keys(h.componentsRegistry).forEach(function(e){var r=h.componentsRegistry[e];r.layoutAttributes&&(r.schema&&r.schema.layout?Object.keys(r.schema.layout).forEach(function(e){d(t,r.schema.layout[e],e)}):d(t,r.layoutAttributes,r.name))}),{layoutAttributes:l(t)}}function o(t){var e=h.transformsRegistry[t],r=w({},e.attributes);return Object.keys(h.componentsRegistry).forEach(function(e){var n=h.componentsRegistry[e];n.schema&&n.schema.transforms&&n.schema.transforms[t]&&Object.keys(n.schema.transforms[t]).forEach(function(e){d(r,n.schema.transforms[t][e],e)})}),{attributes:l(r)}}function i(){var t={frames:p.extendDeep({},m)};return l(t),t.frames}function l(t){return s(t),c(t),t}function s(t){function e(t){return{valType:\"string\"}}function n(t,n,a){r.isValObject(t)?\"data_array\"===t.valType?(t.role=\"data\",a[n+\"src\"]=e(n)):t.arrayOk===!0&&(a[n+\"src\"]=e(n)):p.isPlainObject(t)&&(t.role=\"object\")}r.crawl(t,n)}function c(t){function e(t,e,r){if(t){var n=t[M];n&&(delete t[M],r[e]={items:{}},r[e].items[n]=t,r[e].role=\"object\")}}r.crawl(t,e)}function u(t){return _(t,{radialaxis:b.radialaxis,angularaxis:b.angularaxis}),_(t,b.layout),t}function f(t,e,r){var n=p.nestedProperty(t,r),a=w({},e.layoutAttributes);a[k]=!0,n.set(a)}function d(t,e,r){var n=p.nestedProperty(t,r);n.set(w(n.get()||{},e))}var h=t(\"../registry\"),p=t(\"../lib\"),g=t(\"../plots/attributes\"),v=t(\"../plots/layout_attributes\"),m=t(\"../plots/frame_attributes\"),y=t(\"../plots/animation_attributes\"),x=t(\"../plots/polar/area_attributes\"),b=t(\"../plots/polar/axis_attributes\"),_=p.extendFlat,w=p.extendDeep,k=\"_isSubplotObj\",M=\"_isLinkedToArray\",A=[k,M,\"_arrayAttrRegexps\",\"_deprecated\"];r.IS_SUBPLOT_OBJ=k,r.IS_LINKED_TO_ARRAY=M,r.DEPRECATED=\"_deprecated\",r.UNDERSCORE_ATTRS=A,r.get=function(){var t={};h.allTypes.concat(\"area\").forEach(function(e){t[e]=n(e)});var e={};return Object.keys(h.transformsRegistry).forEach(function(t){e[t]=o(t)}),{defs:{valObjects:p.valObjects,metaKeys:A.concat([\"description\",\"role\"])},traces:t,layout:a(),transforms:e,frames:i(),animation:l(y)}},r.crawl=function(t,e,n){var a=n||0;Object.keys(t).forEach(function(n){var o=t[n];A.indexOf(n)===-1&&(e(o,n,t,a),r.isValObject(o)||p.isPlainObject(o)&&r.crawl(o,e,a+1))})},r.isValObject=function(t){return t&&void 0!==t.valType},r.findArrayAttributes=function(t){function e(e,r,i,l){if(o=o.slice(0,l).concat([r]),e&&(\"data_array\"===e.valType||e.arrayOk===!0)){var s=n(o),c=p.nestedProperty(t,s).get();Array.isArray(c)&&a.push(s)}}function n(t){return t.join(\".\")}var a=[],o=[];if(r.crawl(t._module.attributes,e),t.transforms)for(var i=t.transforms,l=0;l<i.length;l++){var s=i[l];o=[\"transforms[\"+l+\"]\"],r.crawl(s._module.attributes,e,1)}return t._fullInput&&(r.crawl(t._fullInput._module.attributes,e),a=p.filterUnique(a)),a}},{\"../lib\":136,\"../plots/animation_attributes\":167,\"../plots/attributes\":169,\"../plots/frame_attributes\":196,\"../plots/layout_attributes\":197,\"../plots/polar/area_attributes\":200,\"../plots/polar/axis_attributes\":201,\"../registry\":206}],161:[function(t,e,r){\"use strict\";function n(t){i.register(t,t.name,t.categories,t.meta),i.subplotsRegistry[t.basePlotModule.name]||i.registerSubplot(t.basePlotModule)}function a(t){if(\"string\"!=typeof t.name)throw new Error(\"Transform module *name* must be a string.\");var e=\"Transform module \"+t.name,r=\"function\"==typeof t.transform,n=\"function\"==typeof t.calcTransform;if(!r&&!n)throw new Error(e+\" is missing a *transform* or *calcTransform* method.\");r&&n&&l.log([e+\" has both a *transform* and *calcTransform* methods.\",\"Please note that all *transform* methods are executed\",\"before all *calcTransform* methods.\"].join(\" \")),l.isPlainObject(t.attributes)||l.log(e+\" registered without an *attributes* object.\"),\"function\"!=typeof t.supplyDefaults&&l.log(e+\" registered without a *supplyDefaults* method.\"),i.transformsRegistry[t.name]=t}function o(t){if(\"string\"!=typeof t.name)throw new Error(\"Component module *name* must be a string.\");i.registerComponent(t)}var i=t(\"../registry\"),l=t(\"../lib\");e.exports=function(t){if(!t)throw new Error(\"No argument passed to Plotly.register.\");t&&!Array.isArray(t)&&(t=[t]);for(var e=0;e<t.length;e++){var r=t[e];if(!r)throw new Error(\"Invalid module was attempted to be registered!\");switch(r.moduleType){case\"trace\":n(r);break;case\"transform\":a(r);break;case\"component\":o(r);break;default:throw new Error(\"Invalid module was attempted to be registered!\")}}}},{\"../lib\":136,\"../registry\":206}],162:[function(t,e,r){\"use strict\";var n=t(\"../plotly\"),a=t(\"../lib\");e.exports=function(t){return a.extendFlat(n.defaultConfig,t)}},{\"../lib\":136,\"../plotly\":166}],163:[function(t,e,r){\"use strict\";function n(t,e,r){for(var n=0;n<r.length;n++){var a=r[n][0],o=r[n][1];if(!(a[0]>=t[1]||a[1]<=t[0])&&(o[0]<e[1]&&o[1]>e[0]))return!0}return!1}var a=t(\"d3\"),o=t(\"../plotly\"),i=t(\"../registry\"),l=t(\"../plots/plots\"),s=t(\"../lib\"),c=t(\"../components/color\"),u=t(\"../components/drawing\"),f=t(\"../components/titles\"),d=t(\"../components/modebar\"),h=t(\"../plots/cartesian/graph_interact\");r.layoutStyles=function(t){return s.syncOrAsync([l.doAutoMargin,r.lsInner],t)},r.lsInner=function(t){var e,i=t._fullLayout,l=i._size,s=o.Axes.list(t);for(e=0;e<s.length;e++)s[e]._linepositions={};i._paperdiv.style({width:i.width+\"px\",height:i.height+\"px\"}).selectAll(\".main-svg\").call(u.setSize,i.width,i.height),t._context.setBackground(t,i.paper_bgcolor);var f=i._paper.selectAll(\"g.subplot\"),h=[],p=[];f.each(function(e){var r=i._plots[e];if(r.mainplot)return r.bg&&r.bg.remove(),void(r.bg=void 0);var a=o.Axes.getFromId(t,e,\"x\"),l=o.Axes.getFromId(t,e,\"y\"),s=a.domain,c=l.domain,u=[];n(s,c,p)?u=[0]:(h.push(e),p.push([s,c]));var f=r.plotgroup.selectAll(\".bg\").data(u);f.enter().append(\"rect\").classed(\"bg\",!0),f.exit().remove(),f.each(function(){r.bg=f;var t=r.plotgroup.node();t.insertBefore(this,t.childNodes[0])})});var g=i._bgLayer.selectAll(\".bg\").data(h);g.enter().append(\"rect\").classed(\"bg\",!0),g.exit().remove(),g.each(function(t){i._plots[t].bg=a.select(this)});var v=[];return f.each(function(e){var r=i._plots[e],n=o.Axes.getFromId(t,e,\"x\"),a=o.Axes.getFromId(t,e,\"y\");n.setScale(),a.setScale(),r.bg&&r.bg.call(u.setRect,n._offset-l.p,a._offset-l.p,n._length+2*l.p,a._length+2*l.p).call(c.fill,i.plot_bgcolor).style(\"stroke-width\",0),r.clipId=\"clip\"+i._uid+e+\"plot\";var s=i._defs.selectAll(\"g.clips\").selectAll(\"#\"+r.clipId).data([0]);s.enter().append(\"clipPath\").attr({class:\"plotclip\",id:r.clipId}).append(\"rect\"),s.selectAll(\"rect\").attr({width:n._length,height:a._length}),r.plot.call(u.setTranslate,n._offset,a._offset),r.plot.call(u.setClipUrl,r.clipId);var f=u.crispRound(t,n.linewidth,1),d=u.crispRound(t,a.linewidth,1),h=l.p+d,p=\"M\"+-h+\",\",g=\"h\"+(n._length+2*h),m=\"free\"===n.anchor&&v.indexOf(n._id)===-1,y=l.h*(1-(n.position||0))+f/2%1,x=n.anchor===a._id&&(n.mirror||\"top\"!==n.side)||\"all\"===n.mirror||\"allticks\"===n.mirror||n.mirrors&&n.mirrors[a._id+\"bottom\"],b=a._length+l.p+f/2,_=n.anchor===a._id&&(n.mirror||\"top\"===n.side)||\"all\"===n.mirror||\"allticks\"===n.mirror||n.mirrors&&n.mirrors[a._id+\"top\"],w=-l.p-f/2,k=l.p,M=x?0:f,A=_?0:f,T=\",\"+(-k-A)+\"v\"+(a._length+2*k+A+M),L=\"free\"===a.anchor&&v.indexOf(a._id)===-1,C=l.w*(a.position||0)+d/2%1,S=a.anchor===n._id&&(a.mirror||\"right\"!==a.side)||\"all\"===a.mirror||\"allticks\"===a.mirror||a.mirrors&&a.mirrors[n._id+\"left\"],z=-l.p-d/2,O=a.anchor===n._id&&(a.mirror||\"right\"===a.side)||\"all\"===a.mirror||\"allticks\"===a.mirror||a.mirrors&&a.mirrors[n._id+\"right\"],D=n._length+l.p+d/2;n._linepositions[e]=[x?b:void 0,_?w:void 0,m?y:void 0],n.anchor===a._id?n._linepositions[e][3]=\"top\"===n.side?w:b:m&&(n._linepositions[e][3]=y),a._linepositions[e]=[S?z:void 0,O?D:void 0,L?C:void 0],a.anchor===n._id?a._linepositions[e][3]=\"right\"===a.side?D:z:L&&(a._linepositions[e][3]=C);var P=\"translate(\"+n._offset+\",\"+a._offset+\")\",E=P,N=P;m&&(E=\"translate(\"+n._offset+\",\"+l.t+\")\",w+=a._offset-l.t,b+=a._offset-l.t),L&&(N=\"translate(\"+l.l+\",\"+a._offset+\")\",z+=n._offset-l.l,D+=n._offset-l.l),r.xlines.attr(\"transform\",E).attr(\"d\",(x?p+b+g:\"\")+(_?p+w+g:\"\")+(m?p+y+g:\"\")||\"M0,0\").style(\"stroke-width\",f+\"px\").call(c.stroke,n.showline?n.linecolor:\"rgba(0,0,0,0)\"),r.ylines.attr(\"transform\",N).attr(\"d\",(S?\"M\"+z+T:\"\")+(O?\"M\"+D+T:\"\")+(L?\"M\"+C+T:\"\")||\"M0,0\").attr(\"stroke-width\",d+\"px\").call(c.stroke,a.showline?a.linecolor:\"rgba(0,0,0,0)\"),r.xaxislayer.attr(\"transform\",E),r.yaxislayer.attr(\"transform\",N),r.gridlayer.attr(\"transform\",P),r.zerolinelayer.attr(\"transform\",P),r.draglayer.attr(\"transform\",P),m&&v.push(n._id),L&&v.push(a._id)}),o.Axes.makeClipPaths(t),r.drawMainTitle(t),d.manage(t),t._promises.length&&Promise.all(t._promises)},r.drawMainTitle=function(t){var e=t._fullLayout;f.draw(t,\"gtitle\",{propContainer:e,propName:\"title\",dfltName:\"Plot\",attributes:{x:e.width/2,y:e._size.t/2,\"text-anchor\":\"middle\"}})},r.doTraceStyle=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e],n=((r[0]||{}).trace||{})._module||{},a=n.arraysToCalcdata;a&&a(r,r[0].trace)}return l.style(t),i.getComponentMethod(\"legend\",\"draw\")(t),l.previousPromises(t)},r.doColorBars=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e][0];if((r.t||{}).cb){var n=r.trace,a=r.t.cb;i.traceIs(n,\"contour\")&&a.line({width:n.contours.showlines!==!1?n.line.width:0,dash:n.line.dash,color:\"line\"===n.contours.coloring?a._opts.line.color:n.line.color}),i.traceIs(n,\"markerColorscale\")?a.options(n.marker.colorbar)():a.options(n.colorbar)()}}return l.previousPromises(t)},r.layoutReplot=function(t){var e=t.layout;return t.layout=void 0,o.plot(t,\"\",e)},r.doLegend=function(t){return i.getComponentMethod(\"legend\",\"draw\")(t),l.previousPromises(t)},r.doTicksRelayout=function(t){return o.Axes.doTicks(t,\"redraw\"),r.drawMainTitle(t),l.previousPromises(t)},r.doModeBar=function(t){var e,r,n=t._fullLayout;for(d.manage(t),h(t),e=l.getSubplotIds(n,\"gl3d\"),r=0;r<e.length;r++){n[e[r]]._scene.updateFx(n.dragmode,n.hovermode)}return l.previousPromises(t)},r.doCamera=function(t){for(var e=t._fullLayout,r=l.getSubplotIds(e,\"gl3d\"),n=0;n<r.length;n++){var a=e[r[n]];a._scene.setCamera(a.camera)}}},{\"../components/color\":25,\"../components/drawing\":49,\"../components/modebar\":85,\"../components/titles\":114,\"../lib\":136,\"../plotly\":166,\"../plots/cartesian/graph_interact\":180,\"../plots/plots\":199,\"../registry\":206,d3:7}],164:[function(t,e,r){\"use strict\";function n(t,e){return new Promise(function(r,n){function f(){var t=l.getDelay(p._fullLayout);return new Promise(function(r,n){setTimeout(function(){var t=c(p),a=document.createElement(\"canvas\");a.id=i.randstr(),u({format:e.format,width:p._fullLayout.width,height:p._fullLayout.height,canvas:a,svg:t,promise:!0}).then(function(t){p&&document.body.removeChild(p),r(t)}).catch(function(t){n(t)})},t)})}e=e||{},e.format=e.format||\"png\";var d=function(t){return void 0===t||null===t||!!(a(t)&&t>1)};d(e.width)&&d(e.height)||n(new Error(\"Height and width should be pixel values.\"));var h=s(t,{format:\"png\",height:e.height,width:e.width}),p=h.gd;p.style.position=\"absolute\",p.style.left=\"-5000px\",document.body.appendChild(p);var g=l.getRedrawFunc(p);o.plot(p,h.data,h.layout,h.config).then(g).then(f).then(function(t){r(t)}).catch(function(t){n(t)})})}var a=t(\"fast-isnumeric\"),o=t(\"../plotly\"),i=t(\"../lib\"),l=t(\"../snapshot/helpers\"),s=t(\"../snapshot/cloneplot\"),c=t(\"../snapshot/tosvg\"),u=t(\"../snapshot/svgtoimg\");e.exports=n},{\"../lib\":136,\"../plotly\":166,\"../snapshot/cloneplot\":207,\"../snapshot/helpers\":210,\"../snapshot/svgtoimg\":212,\"../snapshot/tosvg\":214,\"fast-isnumeric\":10}],165:[function(t,e,r){\"use strict\";function n(t,e,r,a,o,c){c=c||[];for(var u=Object.keys(t),d=0;d<u.length;d++){var h=u[d];if(\"transforms\"!==h){var v=c.slice();v.push(h);var m=t[h],y=e[h],x=s(r,h),b=\"info_array\"===(x||{}).valType,_=\"colorscale\"===(x||{}).valType;if(l(r,h))if(p(m)&&p(y))n(m,y,x,a,o,v);else if(x.items&&!b&&g(m)){var w,k,M=x.items,A=M[Object.keys(M)[0]],T=[];for(w=0;w<y.length;w++){var L=y[w]._index||w;k=v.slice(),k.push(L),p(m[L])&&p(y[w])&&(T.push(L),n(m[L],y[w],A,a,o,k))}for(w=0;w<m.length;w++)k=v.slice(),k.push(w),p(m[w])?T.indexOf(w)===-1&&a.push(i(\"unused\",o,k)):a.push(i(\"object\",o,k,m[w]))}else!p(m)&&p(y)?a.push(i(\"object\",o,v,m)):g(m)||!g(y)||b||_?h in e?f.validate(m,x)||a.push(i(\"value\",o,v,m)):a.push(i(\"unused\",o,v,m)):a.push(i(\"array\",o,v,m));else a.push(i(\"schema\",o,v))}}return a}function a(t,e){for(var r=0;r<e.length;r++){var n=e[r].type,a=t.traces[n].layoutAttributes;a&&f.extendFlat(t.layout.layoutAttributes,a)}return t.layout.layoutAttributes}function o(t){return g(t)?\"In data trace \"+t[1]+\", \":\"In \"+t+\", \"}function i(t,e,r,n){r=r||\"\";var a,o;g(e)?(a=e[0],o=e[1]):(a=e,o=null);var i=u(r),l=v[t](e,i,n);return f.log(l),{code:t,container:a,trace:o,path:r,astr:i,msg:l}}function l(t,e){var r=c(e),n=r.keyMinusId,a=r.id;return!!(n in t&&t[n]._isSubplotObj&&a)||e in t}function s(t,e){return t[c(e).keyMinusId]}function c(t){var e=t.split(/([2-9]|[1-9][0-9]+)$/)[0];return{keyMinusId:e,id:t.substr(e.length,t.length)}}function u(t){if(!g(t))return String(t);for(var e=\"\",r=0;r<t.length;r++){var n=t[r];\"number\"==typeof n?e=e.substr(0,e.length-1)+\"[\"+n+\"]\":e+=n,r<t.length-1&&(e+=\".\")}return e}var f=t(\"../lib\"),d=t(\"../plots/plots\"),h=t(\"./plot_schema\"),p=f.isPlainObject,g=Array.isArray;e.exports=function(t,e){var r,o,l=h.get(),s=[],c={};g(t)?(c.data=f.extendDeep([],t),r=t):(c.data=[],r=[],s.push(i(\"array\",\"data\"))),p(e)?(c.layout=f.extendDeep({},e),o=e):(c.layout={},o={},arguments.length>1&&s.push(i(\"object\",\"layout\"))),d.supplyDefaults(c);for(var u=c._fullData,v=r.length,m=0;m<v;m++){var y=r[m],x=[\"data\",m];if(p(y)){var b=u[m],_=b.type,w=l.traces[_].attributes;w.type={valType:\"enumerated\",values:[_]},b.visible===!1&&y.visible!==!1&&s.push(i(\"invisible\",x)),n(y,b,w,s,x);var k=y.transforms,M=b.transforms;if(k){g(k)||s.push(i(\"array\",x,[\"transforms\"])),x.push(\"transforms\");for(var A=0;A<k.length;A++){var T=[\"transforms\",A],L=k[A].type;if(p(k[A])){var C=l.transforms[L]?l.transforms[L].attributes:{};C.type={valType:\"enumerated\",values:Object.keys(l.transforms)},n(k[A],M[A],C,s,x,T)}else s.push(i(\"object\",x,T))}}}else s.push(i(\"object\",x))}return n(o,c._fullLayout,a(l,u),s,\"layout\"),0===s.length?void 0:s};var v={object:function(t,e){return(\"layout\"===t&&\"\"===e?\"The layout argument\":\"data\"===t[0]&&\"\"===e?\"Trace \"+t[1]+\" in the data argument\":o(t)+\"key \"+e)+\" must be linked to an object container\"},array:function(t,e){return(\"data\"===t?\"The data argument\":o(t)+\"key \"+e)+\" must be linked to an array container\"},schema:function(t,e){return o(t)+\"key \"+e+\" is not part of the schema\"},unused:function(t,e,r){var n=p(r)?\"container\":\"key\";return o(t)+n+\" \"+e+\" did not get coerced\"},invisible:function(t){return\"Trace \"+t[1]+\" got defaulted to be not visible\"},value:function(t,e,r){return[o(t)+\"key \"+e,\"is set to an invalid value (\"+r+\")\"].join(\" \")}}},{\"../lib\":136,\"../plots/plots\":199,\"./plot_schema\":160}],166:[function(t,e,r){\"use strict\";r.defaultConfig=t(\"./plot_api/plot_config\"),r.Plots=t(\"./plots/plots\"),r.Axes=t(\"./plots/cartesian/axes\"),r.ModeBar=t(\"./components/modebar\"),t(\"./plot_api/plot_api\")},{\"./components/modebar\":85,\"./plot_api/plot_api\":158,\"./plot_api/plot_config\":159,\"./plots/cartesian/axes\":171,\"./plots/plots\":199}],167:[function(t,e,r){\"use strict\";e.exports={mode:{valType:\"enumerated\",dflt:\"afterall\",values:[\"immediate\",\"next\",\"afterall\"]},direction:{valType:\"enumerated\",values:[\"forward\",\"reverse\"],dflt:\"forward\"},fromcurrent:{valType:\"boolean\",dflt:!1},frame:{duration:{valType:\"number\",min:0,dflt:500},redraw:{valType:\"boolean\",dflt:!0}},transition:{duration:{valType:\"number\",min:0,dflt:500},easing:{valType:\"enumerated\",dflt:\"cubic-in-out\",values:[\"linear\",\"quad\",\"cubic\",\"sin\",\"exp\",\"circle\",\"elastic\",\"back\",\"bounce\",\"linear-in\",\"quad-in\",\"cubic-in\",\"sin-in\",\"exp-in\",\"circle-in\",\"elastic-in\",\"back-in\",\"bounce-in\",\"linear-out\",\"quad-out\",\"cubic-out\",\"sin-out\",\"exp-out\",\"circle-out\",\"elastic-out\",\"back-out\",\"bounce-out\",\"linear-in-out\",\"quad-in-out\",\"cubic-in-out\",\"sin-in-out\",\"exp-in-out\",\"circle-in-out\",\"elastic-in-out\",\"back-in-out\",\"bounce-in-out\"]}}}},{}],168:[function(t,e,r){\"use strict\";var n=t(\"../lib\");e.exports=function(t,e,r){var a,o=r.name,i=e[o],l=n.isArray(t[o])?t[o]:[],s=e[o]=[];for(a=0;a<l.length;a++){var c=l[a],u={},f={};n.isPlainObject(c)||(f.itemIsNotPlainObject=!0,c={}),r.handleItemDefaults(c,u,e,r,f),u._input=c,u._index=a,s.push(u)}if(n.isArray(i)){var d=Math.min(i.length,s.length);for(a=0;a<d;a++)n.relinkPrivateKeys(s[a],i[a])}}},{\"../lib\":136}],169:[function(t,e,r){\"use strict\";var n=t(\"../components/fx/attributes\");e.exports={type:{valType:\"enumerated\",values:[],dflt:\"scatter\"},visible:{valType:\"enumerated\",values:[!0,!1,\"legendonly\"],dflt:!0},showlegend:{valType:\"boolean\",dflt:!0},legendgroup:{valType:\"string\",dflt:\"\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},name:{valType:\"string\"},uid:{valType:\"string\",dflt:\"\"},hoverinfo:{valType:\"flaglist\",flags:[\"x\",\"y\",\"z\",\"text\",\"name\"],extras:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:n.hoverlabel,stream:{token:{valType:\"string\",noBlank:!0,strict:!0},maxpoints:{valType:\"number\",min:0,max:1e4,dflt:500}}}},{\"../components/fx/attributes\":58}],170:[function(t,e,r){\"use strict\";e.exports={xaxis:{valType:\"subplotid\",dflt:\"x\"},yaxis:{valType:\"subplotid\",dflt:\"y\"}}},{}],171:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){function o(e){return(1+100*(e-t)/r.dtick)%100<2}for(var i=0,l=0,s=0,c=0,u=0;u<e.length;u++)e[u]%1==0?s++:x(e[u])||c++,o(e[u])&&i++,o(e[u]+r.dtick/2)&&l++;var f=e.length-c;if(s===f&&\"date\"!==r.type)r.dtick<1?t=n-.5*r.dtick:(t-=.5)+r.dtick<n&&(t+=r.dtick);else if(l<.1*f&&(i>.3*f||o(n)||o(a))){var d=r.dtick/2;t+=t+d<n?d:-d}return t}function a(t,e,r,n,a){var o=_.findExactDates(e,a);if(o.exactDays>.8){var i=Number(r.substr(1));o.exactYears>.8&&i%12==0?t=N.tickIncrement(t,\"M6\",\"reverse\")+1.5*z:o.exactMonths>.8?t=N.tickIncrement(t,\"M1\",\"reverse\")+15.5*z:t-=z/2;var l=N.tickIncrement(t,r);if(l<=n)return l}return t}function o(t){var e,r,n=t.tickvals,a=t.ticktext,o=new Array(n.length),i=_.simpleMap(t.range,t.r2l),l=1.0001*i[0]-1e-4*i[1],c=1.0001*i[1]-1e-4*i[0],u=Math.min(l,c),f=Math.max(l,c),d=0;Array.isArray(a)||(a=[]);var h=\"category\"===t.type?t.d2l_noadd:t.d2l;for(\"log\"===t.type&&\"L\"!==String(t.dtick).charAt(0)&&(t.dtick=\"L\"+Math.pow(10,Math.floor(Math.min(t.range[0],t.range[1]))-1)),r=0;r<n.length;r++)(e=h(n[r]))>u&&e<f&&(void 0===a[r]?o[d]=N.tickText(t,e):o[d]=s(t,e,String(a[r])),d++);return d<n.length&&o.splice(d,n.length-d),o}function i(t,e,r){return e*_.roundUp(t/e,r)}function l(t){var e=t.dtick;if(t._tickexponent=0,x(e)||\"string\"==typeof e||(e=1),\"category\"===t.type&&(t._tickround=null),\"date\"===t.type){var r=t.r2l(t.tick0),n=t.l2r(r).replace(/(^-|i)/g,\"\"),a=n.length;if(\"M\"===String(e).charAt(0))a>10||\"01-01\"!==n.substr(5)?t._tickround=\"d\":t._tickround=+e.substr(1)%12==0?\"y\":\"m\";else if(e>=z&&a<=10||e>=15*z)t._tickround=\"d\";else if(e>=D&&a<=16||e>=O)t._tickround=\"M\";else if(e>=P&&a<=19||e>=D)t._tickround=\"S\";else{var o=t.l2r(r+e).replace(/^-/,\"\").length;t._tickround=Math.max(a,o)-20}}else if(x(e)||\"L\"===e.charAt(0)){var i=t.range.map(t.r2d||Number);x(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(i[0]),Math.abs(i[1])),s=Math.floor(Math.log(l)/Math.LN10+.01);Math.abs(s)>3&&(\"SI\"===t.exponentformat||\"B\"===t.exponentformat?t._tickexponent=3*Math.round((s-1)/3):t._tickexponent=s)}else t._tickround=null}function s(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||\"\",fontSize:n.size,font:n.family,fontColor:n.color}}function c(t,e,r,n){var a=t._tickround,o=r&&t.hoverformat||t.tickformat;n&&(a=x(a)?4:{y:\"m\",m:\"d\",d:\"M\",M:\"S\",S:4}[a]);var i,l=_.formatDate(e.x,o,a,t.calendar),s=l.indexOf(\"\\n\");s!==-1&&(i=l.substr(s+1),l=l.substr(0,s)),n&&(\"00:00:00\"===l||\"00:00\"===l?(l=i,i=\"\"):8===l.length&&(l=l.replace(/:00$/,\"\"))),i&&(r?\"d\"===a?l+=\", \"+i:l=i+(l?\", \"+l:\"\"):t._inCalcTicks&&i===t._prevDateHead||(l+=\"<br>\"+i,t._prevDateHead=i)),e.text=l}function u(t,e,r,n,a){var o=t.dtick,i=e.x;if(!n||\"string\"==typeof o&&\"L\"===o.charAt(0)||(o=\"L3\"),t.tickformat||\"string\"==typeof o&&\"L\"===o.charAt(0))e.text=h(Math.pow(10,i),t,a,n);else if(x(o)||\"D\"===o.charAt(0)&&_.mod(i+.01,1)<.1)if([\"e\",\"E\",\"power\"].indexOf(t.exponentformat)!==-1){var l=Math.round(i);e.text=0===l?1:1===l?\"10\":l>1?\"10<sup>\"+l+\"</sup>\":\"10<sup>\\u2212\"+-l+\"</sup>\",e.fontSize*=1.25}else e.text=h(Math.pow(10,i),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6);else{if(\"D\"!==o.charAt(0))throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,_.mod(i,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var s=String(e.text).charAt(0);\"0\"!==s&&\"1\"!==s||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(i<0?.5:.25)))}}function f(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}function d(t,e,r,n,a){\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(a=\"hide\"),e.text=h(e.x,t,a,n)}function h(t,e,r,n){var a=t<0,o=e._tickround,i=r||e.exponentformat||\"B\",s=e._tickexponent,c=e.tickformat,u=e.separatethousands;if(n){var f={exponentformat:e.exponentformat,dtick:\"none\"===e.showexponent?e.dtick:x(t)?Math.abs(t)||1:1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};l(f),o=(Number(f._tickround)||0)+4,s=f._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return y.format(c)(t).replace(/-/g,\"\\u2212\");var d=Math.pow(10,-o)/2;if(\"none\"===i&&(s=0),(t=Math.abs(t))<d)t=\"0\",a=!1;else{if(t+=d,s&&(t*=Math.pow(10,-s),o+=s),0===o)t=String(Math.floor(t));else if(o<0){t=String(Math.round(t)),t=t.substr(0,t.length+o);for(var h=o;h<0;h++)t+=\"0\"}else{t=String(t);var p=t.indexOf(\".\")+1;p&&(t=t.substr(0,p+o).replace(/\\.?0+$/,\"\"))}t=_.numSeparate(t,e._separators,u)}if(s&&\"hide\"!==i){var g;g=s<0?\"\\u2212\"+-s:\"power\"!==i?\"+\"+s:String(s),\"e\"===i||(\"SI\"===i||\"B\"===i)&&(s>12||s<-15)?t+=\"e\"+g:\"E\"===i?t+=\"E\"+g:\"power\"===i?t+=\"\\xd710<sup>\"+g+\"</sup>\":\"B\"===i&&9===s?t+=\"B\":\"SI\"!==i&&\"B\"!==i||(t+=U[s/3+5])}return a?\"\\u2212\"+t:t}function p(t,e){var r,n,a=[];for(r=0;r<e.length;r++){var o=[],i=t._fullData[e[r]].xaxis,l=t._fullData[e[r]].yaxis;if(i&&l){for(n=0;n<a.length;n++)a[n].x.indexOf(i)===-1&&a[n].y.indexOf(l)===-1||o.push(n);if(o.length){var s,c=a[o[0]];if(o.length>1)for(n=1;n<o.length;n++)s=a[o[n]],g(c.x,s.x),g(c.y,s.y);g(c.x,[i]),g(c.y,[l])}else a.push({x:[i],y:[l]})}}return a}function g(t,e){for(var r=0;r<e.length;r++)t.indexOf(e[r])===-1&&t.push(e[r])}function v(t,e,r){\n",
|
|
"var n,a,o=[],i=[],l=t.layout;for(n=0;n<e.length;n++)o.push(N.getFromId(t,e[n]));for(n=0;n<r.length;n++)i.push(N.getFromId(t,r[n]));var s=Object.keys(o[0]),c=[\"anchor\",\"domain\",\"overlaying\",\"position\",\"side\",\"tickangle\"],u=[\"linear\",\"log\"];for(n=0;n<s.length;n++){var f=s[n],d=o[0][f],h=i[0][f],p=!0,g=!1,v=!1;if(\"_\"!==f.charAt(0)&&\"function\"!=typeof d&&c.indexOf(f)===-1){for(a=1;a<o.length&&p;a++){var y=o[a][f];\"type\"===f&&u.indexOf(d)!==-1&&u.indexOf(y)!==-1&&d!==y?g=!0:y!==d&&(p=!1)}for(a=1;a<i.length&&p;a++){var x=i[a][f];\"type\"===f&&u.indexOf(h)!==-1&&u.indexOf(x)!==-1&&h!==x?v=!0:i[a][f]!==h&&(p=!1)}p&&(g&&(l[o[0]._name].type=\"linear\"),v&&(l[i[0]._name].type=\"linear\"),m(l,f,o,i))}}for(n=0;n<t._fullLayout.annotations.length;n++){var b=t._fullLayout.annotations[n];e.indexOf(b.xref)!==-1&&r.indexOf(b.yref)!==-1&&_.swapAttrs(l.annotations[n],[\"?\"])}}function m(t,e,r,n){var a,o=_.nestedProperty,i=o(t[r[0]._name],e).get(),l=o(t[n[0]._name],e).get();for(\"title\"===e&&(\"Click to enter X axis title\"===i&&(i=\"Click to enter Y axis title\"),\"Click to enter Y axis title\"===l&&(l=\"Click to enter X axis title\")),a=0;a<r.length;a++)o(t,r[a]._name+\".\"+e).set(l);for(a=0;a<n.length;a++)o(t,n[a]._name+\".\"+e).set(i)}var y=t(\"d3\"),x=t(\"fast-isnumeric\"),b=t(\"../../registry\"),_=t(\"../../lib\"),w=t(\"../../lib/svg_text_utils\"),k=t(\"../../components/titles\"),M=t(\"../../components/color\"),A=t(\"../../components/drawing\"),T=t(\"../../constants/numerical\"),L=T.FP_SAFE,C=T.ONEAVGYEAR,S=T.ONEAVGMONTH,z=T.ONEDAY,O=T.ONEHOUR,D=T.ONEMIN,P=T.ONESEC,E=T.BADNUM,N=e.exports={};N.layoutAttributes=t(\"./layout_attributes\"),N.supplyLayoutDefaults=t(\"./layout_defaults\"),N.setConvert=t(\"./set_convert\");var I=t(\"./axis_autotype\"),R=t(\"./axis_ids\");N.id2name=R.id2name,N.cleanId=R.cleanId,N.list=R.list,N.listIds=R.listIds,N.getFromId=R.getFromId,N.getFromTrace=R.getFromTrace,N.coerceRef=function(t,e,r,n,a,o){var i=n.charAt(n.length-1),l=N.listIds(r,i),s=n+\"ref\",c={};return a||(a=l[0]||o),o||(o=a),c[s]={valType:\"enumerated\",values:l.concat(o?[o]:[]),dflt:a},_.coerce(t,e,c,s)},N.coercePosition=function(t,e,r,n,a,o){var i,l;if(\"paper\"===n||\"pixel\"===n)i=r(a,o);else{var s=N.getFromId(e,n);if(o=s.fraction2r(o),i=r(a,o),\"category\"===s.type){if(\"string\"==typeof i&&(s._categories||[]).length)return l=s._categories.indexOf(i),void(t[a]=l===-1?o:l)}else if(\"date\"===s.type)return void(t[a]=_.cleanDate(i,E,s.calendar))}t[a]=x(i)?Number(i):o},N.getDataToCoordFunc=function(t,e,r,n){var a,o=\"x\"===r||\"y\"===r||\"z\"===r?r:n;if(Array.isArray(o)){if(a={type:I(n),_categories:[]},N.setConvert(a),\"category\"===a.type)for(var i=0;i<n.length;i++)a.d2c(n[i])}else a=N.getFromTrace(t,e,o);return a?a.d2c:\"ids\"===o?function(t){return String(t)}:function(t){return+t}},N.clearTypes=function(t,e){Array.isArray(e)&&e.length||(e=t._fullData.map(function(t,e){return e})),e.forEach(function(e){var r=t.data[e];delete(N.getFromId(t,r.xaxis)||{}).type,delete(N.getFromId(t,r.yaxis)||{}).type})},N.counterLetter=function(t){var e=t.charAt(0);return\"x\"===e?\"y\":\"y\"===e?\"x\":void 0},N.minDtick=function(t,e,r,n){[\"log\",\"category\"].indexOf(t.type)===-1&&n?void 0===t._minDtick?(t._minDtick=e,t._forceTick0=r):t._minDtick&&((t._minDtick/e+1e-6)%1<2e-6&&((r-t._forceTick0)/e%1+1.000001)%1<2e-6?(t._minDtick=e,t._forceTick0=r):((e/t._minDtick+1e-6)%1>2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},N.getAutoRange=function(t){var e,r=[],n=t._min[0].val,a=t._max[0].val;for(e=1;e<t._min.length&&n===a;e++)n=Math.min(n,t._min[e].val);for(e=1;e<t._max.length&&n===a;e++)a=Math.max(a,t._max[e].val);var o,i,l,s,c,u,f,d=0,h=!1;if(t.range){var p=_.simpleMap(t.range,t.r2l);h=p[1]<p[0]}for(\"reversed\"===t.autorange&&(h=!0,t.autorange=!0),e=0;e<t._min.length;e++)for(i=t._min[e],o=0;o<t._max.length;o++)l=t._max[o],f=l.val-i.val,u=t._length-i.pad-l.pad,f>0&&u>0&&f/u>d&&(s=i,c=l,d=f/u);if(n===a){var g=n-1,v=n+1;r=\"tozero\"===t.rangemode?n<0?[g,0]:[0,v]:\"nonnegative\"===t.rangemode?[Math.max(0,g),Math.max(0,v)]:[g,v]}else d&&(\"linear\"!==t.type&&\"-\"!==t.type||(\"tozero\"===t.rangemode?(s.val>=0&&(s={val:0,pad:0}),c.val<=0&&(c={val:0,pad:0})):\"nonnegative\"===t.rangemode&&(s.val-d*s.pad<0&&(s={val:0,pad:0}),c.val<0&&(c={val:1,pad:0})),d=(c.val-s.val)/(t._length-s.pad-c.pad)),r=[s.val-d*s.pad,c.val+d*c.pad]);return r[0]===r[1]&&(\"tozero\"===t.rangemode?r=r[0]<0?[r[0],0]:r[0]>0?[0,r[0]]:[0,1]:(r=[r[0]-1,r[0]+1],\"nonnegative\"===t.rangemode&&(r[0]=Math.max(0,r[0])))),h&&r.reverse(),_.simpleMap(r,t.l2r||Number)},N.doAutoRange=function(t){t._length||t.setScale();var e=t._min&&t._max&&t._min.length&&t._max.length;if(t.autorange&&e){t.range=N.getAutoRange(t);var r=t._input;r.range=t.range.slice(),r.autorange=t.autorange}},N.saveRangeInitial=function(t,e){for(var r=N.list(t,\"\",!0),n=!1,a=0;a<r.length;a++){var o=r[a],i=void 0===o._rangeInitial,l=i||!(o.range[0]===o._rangeInitial[0]&&o.range[1]===o._rangeInitial[1]);(i&&o.autorange===!1||e&&l)&&(o._rangeInitial=o.range.slice(),n=!0)}return n},N.saveShowSpikeInitial=function(t,e){for(var r=N.list(t,\"\",!0),n=!1,a=\"on\",o=0;o<r.length;o++){var i=r[o],l=void 0===i._showSpikeInitial,s=l||!(i.showspikes===i._showspikes);(l||e&&s)&&(i._showSpikeInitial=i.showspikes,n=!0),\"on\"!==a||i.showspikes||(a=\"off\")}return t._fullLayout._cartesianSpikesEnabled=a,n},N.expand=function(t,e,r){function n(t){if(Array.isArray(t))return function(e){return Math.max(Number(t[e]||0),0)};var e=Math.max(Number(t||0),0);return function(){return e}}function a(r){function n(t){return x(t)&&Math.abs(t)<L}if(s=e[r],x(s)){if(f=b(r)+m,d=w(r)+m,p=s-M(r),g=s+k(r),\"log\"===t.type&&p<g/10&&(p=g/10),c=t.c2l(p),u=t.c2l(g),y&&(c=Math.min(0,c),u=Math.max(0,u)),n(c)){for(h=!0,i=0;i<t._min.length&&h;i++)l=t._min[i],l.val<=c&&l.pad>=d?h=!1:l.val>=c&&l.pad<=d&&(t._min.splice(i,1),i--);h&&t._min.push({val:c,pad:y&&0===c?0:d})}if(n(u)){for(h=!0,i=0;i<t._max.length&&h;i++)l=t._max[i],l.val>=u&&l.pad>=f?h=!1:l.val<=u&&l.pad<=f&&(t._max.splice(i,1),i--);h&&t._max.push({val:u,pad:y&&0===u?0:f})}}}if((t.autorange||!!_.nestedProperty(t,\"rangeslider.autorange\").get())&&e){t._min||(t._min=[]),t._max||(t._max=[]),r||(r={}),t._m||t.setScale();var o,i,l,s,c,u,f,d,h,p,g,v=e.length,m=r.padded?.05*t._length:0,y=r.tozero&&(\"linear\"===t.type||\"-\"===t.type),b=n((t._m>0?r.ppadplus:r.ppadminus)||r.ppad||0),w=n((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),k=n(r.vpadplus||r.vpad),M=n(r.vpadminus||r.vpad);for(o=0;o<6;o++)a(o);for(o=v-1;o>5;o--)a(o)}},N.autoBin=function(t,e,r,o,i){var l=_.aggNums(Math.min,null,t),s=_.aggNums(Math.max,null,t);if(i||(i=e.calendar),\"category\"===e.type)return{start:l-.5,end:s+.5,size:1};var c;if(r)c=(s-l)/r;else{var u=_.distinctVals(t),f=Math.pow(10,Math.floor(Math.log(u.minDiff)/Math.LN10)),d=f*_.roundUp(u.minDiff/f,[.9,1.9,4.9,9.9],!0);c=Math.max(d,2*_.stdev(t)/Math.pow(t.length,o?.25:.4)),x(c)||(c=1)}var h;h=\"log\"===e.type?{type:\"linear\",range:[l,s]}:{type:e.type,range:_.simpleMap([l,s],e.c2r,0,i),calendar:i},N.setConvert(h),N.autoTicks(h,c);var p,g=N.tickIncrement(N.tickFirst(h),h.dtick,\"reverse\",i);if(\"number\"==typeof h.dtick){g=n(g,t,h,l,s);p=g+(1+Math.floor((s-g)/h.dtick))*h.dtick}else for(\"M\"===h.dtick.charAt(0)&&(g=a(g,t,h.dtick,l,i)),p=g;p<=s;)p=N.tickIncrement(p,h.dtick,!1,i);return{start:e.c2r(g,0,i),end:e.c2r(p,0,i),size:h.dtick}},N.calcTicks=function(t){var e=_.simpleMap(t.range,t.r2l);if(\"auto\"===t.tickmode||!t.dtick){var r,n=t.nticks;n||(\"category\"===t.type?(r=t.tickfont?1.2*(t.tickfont.size||12):15,n=t._length/r):(r=\"y\"===t._id.charAt(0)?40:80,n=_.constrain(t._length/r,4,9)+1)),\"array\"===t.tickmode&&(n*=100),N.autoTicks(t,Math.abs(e[1]-e[0])/n),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}if(t.tick0||(t.tick0=\"date\"===t.type?\"2000-01-01\":0),l(t),\"array\"===t.tickmode)return o(t);t._tmin=N.tickFirst(t);var a=e[1]<e[0],i=[],s=1.0001*e[1]-1e-4*e[0];\"category\"===t.type&&(s=a?Math.max(-.5,s):Math.min(t._categories.length-.5,s));for(var c=t._tmin;(a?c>=s:c<=s)&&(i.push(c),!(i.length>1e3));c=N.tickIncrement(c,t.dtick,a,t.calendar));t._tmax=i[i.length-1],t._prevDateHead=\"\",t._inCalcTicks=!0;for(var u=new Array(i.length),f=0;f<i.length;f++)u[f]=N.tickText(t,i[f]);return t._inCalcTicks=!1,u};var F=[2,5,10],j=[1,2,3,6,12],B=[1,2,5,10,15,30],q=[1,2,3,7,14],H=[-.046,0,.301,.477,.602,.699,.778,.845,.903,.954,1],V=[-.301,0,.301,.699,1];N.autoTicks=function(t,e){var r;if(\"date\"===t.type){t.tick0=_.dateTick0(t.calendar);var n=2*e;n>C?(e/=C,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=\"M\"+12*i(e,r,F)):n>S?(e/=S,t.dtick=\"M\"+i(e,1,j)):n>z?(t.dtick=i(e,z,q),t.tick0=_.dateTick0(t.calendar,!0)):n>O?t.dtick=i(e,O,j):n>D?t.dtick=i(e,D,B):n>P?t.dtick=i(e,P,B):(r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=i(e,r,F))}else if(\"log\"===t.type){t.tick0=0;var a=_.simpleMap(t.range,t.r2l);if(e>.7)t.dtick=Math.ceil(e);else if(Math.abs(a[1]-a[0])<1){var o=1.5*Math.abs((a[1]-a[0])/e);e=Math.abs(Math.pow(10,a[1])-Math.pow(10,a[0]))/o,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=\"L\"+i(e,r,F)}else t.dtick=e>.3?\"D2\":\"D1\"}else\"category\"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):(t.tick0=0,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=i(e,r,F));if(0===t.dtick&&(t.dtick=1),!x(t.dtick)&&\"string\"!=typeof t.dtick){var l=t.dtick;throw t.dtick=1,\"ax.dtick error: \"+String(l)}},N.tickIncrement=function(t,e,r,n){var a=r?-1:1;if(x(e))return t+a*e;var o=e.charAt(0),i=a*Number(e.substr(1));if(\"M\"===o)return _.incrementMonth(t,i,n);if(\"L\"===o)return Math.log(Math.pow(10,t)+i)/Math.LN10;if(\"D\"===o){var l=\"D2\"===e?V:H,s=t+.01*a,c=_.roundUp(_.mod(s,1),l,r);return Math.floor(s)+Math.log(y.round(Math.pow(10,c),1))/Math.LN10}throw\"unrecognized dtick \"+String(e)},N.tickFirst=function(t){var e=t.r2l||Number,r=_.simpleMap(t.range,e),n=r[1]<r[0],a=n?Math.floor:Math.ceil,o=1.0001*r[0]-1e-4*r[1],i=t.dtick,l=e(t.tick0);if(x(i)){var s=a((o-l)/i)*i+l;return\"category\"===t.type&&(s=_.constrain(s,0,t._categories.length-1)),s}var c=i.charAt(0),u=Number(i.substr(1));if(\"M\"===c){for(var f,d,h,p=0,g=l;p<10;){if(((f=N.tickIncrement(g,i,n,t.calendar))-o)*(g-o)<=0)return n?Math.min(g,f):Math.max(g,f);d=(o-(g+f)/2)/(f-g),h=c+(Math.abs(Math.round(d))||1)*u,g=N.tickIncrement(g,h,d<0?!n:n,t.calendar),p++}return _.error(\"tickFirst did not converge\",t),g}if(\"L\"===c)return Math.log(a((Math.pow(10,o)-l)/u)*u+l)/Math.LN10;if(\"D\"===c){var v=\"D2\"===i?V:H,m=_.roundUp(_.mod(o,1),v,n);return Math.floor(o)+Math.log(y.round(Math.pow(10,m),1))/Math.LN10}throw\"unrecognized dtick \"+String(i)},N.tickText=function(t,e,r){function n(n){var a;return void 0===n||(r?\"none\"===n:(a={first:t._tmin,last:t._tmax}[n],\"all\"!==n&&e!==a))}var a,o,i=s(t,e),l=\"array\"===t.tickmode,h=r||l,p=\"category\"===t.type?t.d2l_noadd:t.d2l;if(l&&Array.isArray(t.ticktext)){var g=_.simpleMap(t.range,t.r2l),v=Math.abs(g[1]-g[0])/1e4;for(o=0;o<t.ticktext.length&&!(Math.abs(e-p(t.tickvals[o]))<v);o++);if(o<t.ticktext.length)return i.text=String(t.ticktext[o]),i}return a=\"none\"!==t.exponentformat&&n(t.showexponent)?\"hide\":\"\",\"date\"===t.type?c(t,i,r,h):\"log\"===t.type?u(t,i,r,h,a):\"category\"===t.type?f(t,i):d(t,i,r,h,a),t.tickprefix&&!n(t.showtickprefix)&&(i.text=t.tickprefix+i.text),t.ticksuffix&&!n(t.showticksuffix)&&(i.text+=t.ticksuffix),i};var U=[\"f\",\"p\",\"n\",\"\\u03bc\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];N.subplotMatch=/^x([0-9]*)y([0-9]*)$/,N.getSubplots=function(t,e){var r,n,a,o=[],i=t._fullData||t.data||[];for(r=0;r<i.length;r++){var l=i[r];if(l.visible!==!1&&\"legendonly\"!==l.visible&&(b.traceIs(l,\"cartesian\")||b.traceIs(l,\"gl2d\"))){a=(l.xaxis||\"x\")+(l.yaxis||\"y\"),o.indexOf(a)===-1&&o.push(a)}}var s=N.list(t,\"\",!0);for(r=0;r<s.length;r++){var c=s[r],u=c._id.charAt(0),f=\"free\"===c.anchor?\"x\"===u?\"y\":\"x\":c.anchor,d=N.getFromId(t,f),h=!1;for(n=0;n<o.length;n++)if(function(t,e){return t.indexOf(e._id)!==-1}(o[n],c)){h=!0;break}\"free\"===c.anchor&&h||d&&(a=\"x\"===u?c._id+d._id:d._id+c._id,o.indexOf(a)===-1&&o.push(a))}var p=N.subplotMatch,g=[];for(r=0;r<o.length;r++)a=o[r],p.test(a)&&g.push(a);return g.sort(function(t,e){var r=t.match(p),n=e.match(p);return r[1]===n[1]?+(r[2]||1)-(n[2]||1):+(r[1]||0)-(n[1]||0)}),e?N.findSubplotsWithAxis(g,e):g},N.findSubplotsWithAxis=function(t,e){for(var r=new RegExp(\"x\"===e._id.charAt(0)?\"^\"+e._id+\"y\":e._id+\"$\"),n=[],a=0;a<t.length;a++){var o=t[a];r.test(o)&&n.push(o)}return n},N.makeClipPaths=function(t){var e,r,n=t._fullLayout,a=n._defs,o={_offset:0,_length:n.width,_id:\"\"},i={_offset:0,_length:n.height,_id:\"\"},l=N.list(t,\"x\",!0),s=N.list(t,\"y\",!0),c=[];for(e=0;e<l.length;e++)for(c.push({x:l[e],y:i}),r=0;r<s.length;r++)0===e&&c.push({x:o,y:s[r]}),c.push({x:l[e],y:s[r]});var u=a.selectAll(\"g.clips\").data([0]);u.enter().append(\"g\").classed(\"clips\",!0);var f=u.selectAll(\".axesclip\").data(c,function(t){return t.x._id+t.y._id});f.enter().append(\"clipPath\").classed(\"axesclip\",!0).attr(\"id\",function(t){return\"clip\"+n._uid+t.x._id+t.y._id}).append(\"rect\"),f.exit().remove(),f.each(function(t){y.select(this).select(\"rect\").attr({x:t.x._offset||0,y:t.y._offset||0,width:t.x._length||1,height:t.y._length||1})})},N.doTicks=function(t,e,r){function n(t){var e=c.l2p(t.x);return e>1&&e<c._length-1}function a(t,e){var r=t.selectAll(\"path.\"+S).data(\"inside\"===c.ticks?V:L,C);e&&c.ticks?(r.enter().append(\"path\").classed(S,1).classed(\"ticks\",1).classed(\"crisp\",1).call(M.stroke,c.tickcolor).style(\"stroke-width\",j+\"px\").attr(\"d\",e),r.attr(\"transform\",h),r.exit().remove()):r.remove()}function o(r,n){function a(t,e){t.each(function(t){var r=b(e),n=y.select(this),a=n.select(\".text-math-group\"),o=h(t)+(x(e)&&0!=+e?\" rotate(\"+e+\",\"+d(t)+\",\"+(p(t)-t.fontSize/2)+\")\":\"\");if(a.empty()){var i=n.select(\"text\").attr({transform:o,\"text-anchor\":r});i.empty()||i.selectAll(\"tspan.line\").attr({x:i.attr(\"x\"),y:i.attr(\"y\")})}else{var l=A.bBox(a.node()).width*{end:-.5,start:.5}[r];a.attr(\"transform\",o+(l?\"translate(\"+l+\",0)\":\"\"))}})}function o(){return O.length&&Promise.all(O)}function l(){if(a(f,c.tickangle),\"x\"===m&&!x(c.tickangle)&&(\"log\"!==c.type||\"D\"!==String(c.dtick).charAt(0))){var t=[];for(f.each(function(e){var r=y.select(this),n=r.select(\".text-math-group\"),a=c.l2p(e.x);n.empty()&&(n=r.select(\"text\"));var o=A.bBox(n.node());t.push({top:0,bottom:10,height:10,left:a-o.width/2,right:a+o.width/2+2,width:o.width+2})}),v=0;v<t.length-1;v++)if(_.bBoxIntersect(t[v],t[v+1])){z=30;break}if(z){Math.abs((L[L.length-1].x-L[0].x)*c._m)/(L.length-1)<2.5*T&&(z=90),a(f,z)}c._lastangle=z}return i(),e+\" done\"}function s(){function e(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.max(t[1],e[1])}var n=r.node().getBoundingClientRect(),a=t.getBoundingClientRect();if(c._boundingBox={width:n.width,height:n.height,left:n.left-a.left,right:n.right-a.left,top:n.top-a.top,bottom:n.bottom-a.top},g){var o=c._counterSpan=[1/0,-1/0];for(v=0;v<g.length;v++){var i=u._plots[g[v]],l=i[\"x\"===m?\"yaxis\":\"xaxis\"];e(o,[l._offset,l._offset+l._length])}\"free\"===c.anchor&&e(o,\"x\"===m?[c._boundingBox.bottom,c._boundingBox.top]:[c._boundingBox.right,c._boundingBox.left])}}var f=r.selectAll(\"g.\"+S).data(L,C);if(!c.showticklabels||!x(n))return f.remove(),void i();var d,p,b,k,M;\"x\"===m?(M=\"bottom\"===q?1:-1,d=function(t){return t.dx+E*M},k=n+(P+D)*M,p=function(t){return t.dy+k+t.fontSize*(\"bottom\"===q?1:-.5)},b=function(t){return x(t)&&0!==t&&180!==t?t*M<0?\"end\":\"start\":\"middle\"}):(M=\"right\"===q?1:-1,p=function(t){return t.dy+t.fontSize/2-E*M},d=function(t){return t.dx+n+(P+D+(90===Math.abs(c.tickangle)?t.fontSize/2:0))*M},b=function(t){return x(t)&&90===Math.abs(t)?\"middle\":\"right\"===q?\"start\":\"end\"});var T=0,z=0,O=[];f.enter().append(\"g\").classed(S,1).append(\"text\").attr(\"text-anchor\",\"middle\").each(function(e){var r=y.select(this),n=t._promises.length;r.call(A.setPosition,d(e),p(e)).call(A.font,e.font,e.fontSize,e.fontColor).text(e.text).call(w.convertToTspans),n=t._promises[n],n?O.push(t._promises.pop().then(function(){a(r,c.tickangle)})):a(r,c.tickangle)}),f.exit().remove(),f.each(function(t){T=Math.max(T,t.fontSize)}),a(f,c._lastangle||c.tickangle);var N=_.syncOrAsync([o,l,s]);return N&&N.then&&t._promises.push(N),N}function i(){if(!r){var n,a,o,i,l=R.getFromId(t,e),s=y.select(t).selectAll(\"g.\"+e+\"tick\"),c={selection:s,side:l.side},f=e.charAt(0),d=t._fullLayout._size,h=l.titlefont.size;if(s.size()){var p=A.getTranslate(s.node().parentNode);c.offsetLeft=p.x,c.offsetTop=p.y}\"x\"===f?(a=\"free\"===l.anchor?{_offset:d.t+(1-(l.position||0))*d.h,_length:0}:R.getFromId(t,l.anchor),o=l._offset+l._length/2,i=a._offset+(\"top\"===l.side?-10-h*(1.5+(l.showticklabels?1:0)):a._length+10+h*(1.5+(l.showticklabels?1.5:.5))),l.rangeslider&&l.rangeslider.visible&&l._boundingBox&&(i+=(u.height-u.margin.b-u.margin.t)*l.rangeslider.thickness+l._boundingBox.height),c.side||(c.side=\"bottom\")):(a=\"free\"===l.anchor?{_offset:d.l+(l.position||0)*d.w,_length:0}:R.getFromId(t,l.anchor),i=l._offset+l._length/2,o=a._offset+(\"right\"===l.side?a._length+10+h*(1.5+(l.showticklabels?1:.5)):-10-h*(1.5+(l.showticklabels?.5:0))),n={rotate:\"-90\",offset:0},c.side||(c.side=\"left\")),k.draw(t,e+\"title\",{propContainer:l,propName:l._name+\".title\",dfltName:f.toUpperCase()+\" axis\",avoid:c,transform:n,attributes:{x:o,y:i,\"text-anchor\":\"middle\"}})}}function l(t,e){return t.visible===!0&&t.xaxis+t.yaxis===e&&(!(!b.traceIs(t,\"bar\")||t.orientation!=={x:\"h\",y:\"v\"}[m])||t.fill&&t.fill.charAt(t.fill.length-1)===m)}function s(e,r,a){var o=e.gridlayer,i=e.zerolinelayer,s=e[\"hidegrid\"+m]?[]:V,u=c._gridpath||\"M0,0\"+(\"x\"===m?\"v\":\"h\")+r._length,f=o.selectAll(\"path.\"+z).data(c.showgrid===!1?[]:s,C);if(f.enter().append(\"path\").classed(z,1).classed(\"crisp\",1).attr(\"d\",u).each(function(t){c.zeroline&&(\"linear\"===c.type||\"-\"===c.type)&&Math.abs(t.x)<c.dtick/100&&y.select(this).remove()}),f.attr(\"transform\",h).call(M.stroke,c.gridcolor||\"#ddd\").style(\"stroke-width\",I+\"px\"),f.exit().remove(),i){for(var d=!1,p=0;p<t._fullData.length;p++)if(l(t._fullData[p],a)){d=!0;break}var g=_.simpleMap(c.range,c.r2l),v=g[0]*g[1]<=0&&c.zeroline&&(\"linear\"===c.type||\"-\"===c.type)&&s.length&&(d||n({x:0})||!c.showline),x=i.selectAll(\"path.\"+O).data(v?[{x:0}]:[]);x.enter().append(\"path\").classed(O,1).classed(\"zl\",1).classed(\"crisp\",1).attr(\"d\",u),x.attr(\"transform\",h).call(M.stroke,c.zerolinecolor||M.defaultLine).style(\"stroke-width\",F+\"px\"),x.exit().remove()}}var c,u=t._fullLayout,f=!1;if(\"object\"==typeof e)c=e,e=c._id,f=!0;else if(c=N.getFromId(t,e),\"redraw\"===e&&u._paper.selectAll(\"g.subplot\").each(function(t){var e=u._plots[t],r=e.xaxis,n=e.yaxis;e.xaxislayer.selectAll(\".\"+r._id+\"tick\").remove(),e.yaxislayer.selectAll(\".\"+n._id+\"tick\").remove(),e.gridlayer.selectAll(\"path\").remove(),e.zerolinelayer.selectAll(\"path\").remove()}),!e||\"redraw\"===e)return _.syncOrAsync(N.list(t,\"\",!0).map(function(r){return function(){if(r._id){var n=N.doTicks(t,r._id);return\"redraw\"===e&&(r._r=r.range.slice(),r._rl=_.simpleMap(r._r,r.r2l)),n}}}));c.tickformat||([\"none\",\"e\",\"E\",\"power\",\"SI\",\"B\"].indexOf(c.exponentformat)===-1&&(c.exponentformat=\"e\"),[\"all\",\"first\",\"last\",\"none\"].indexOf(c.showexponent)===-1&&(c.showexponent=\"all\")),c.setScale();var d,h,p,g,v,m=e.charAt(0),T=N.counterLetter(e),L=N.calcTicks(c),C=function(t){return[t.text,t.x,c.mirror].join(\"_\")},S=e+\"tick\",z=e+\"grid\",O=e+\"zl\",D=(c.linewidth||1)/2,P=(\"outside\"===c.ticks?c.ticklen:1)+(c.linewidth||0),E=0,I=A.crispRound(t,c.gridwidth,1),F=A.crispRound(t,c.zerolinewidth,I),j=A.crispRound(t,c.tickwidth,1);if(c._counterangle&&\"outside\"===c.ticks){var B=c._counterangle*Math.PI/180;P=c.ticklen*Math.cos(B)+(c.linewidth||0),E=c.ticklen*Math.sin(B)}if(\"x\"===m)d=[\"bottom\",\"top\"],h=function(t){return\"translate(\"+c.l2p(t.x)+\",0)\"},p=function(t,e){if(c._counterangle){var r=c._counterangle*Math.PI/180;return\"M0,\"+t+\"l\"+Math.sin(r)*e+\",\"+Math.cos(r)*e}return\"M0,\"+t+\"v\"+e};else{if(\"y\"!==m)return void _.warn(\"Unrecognized doTicks axis:\",e);d=[\"left\",\"right\"],h=function(t){return\"translate(0,\"+c.l2p(t.x)+\")\"},p=function(t,e){if(c._counterangle){var r=c._counterangle*Math.PI/180;return\"M\"+t+\",0l\"+Math.cos(r)*e+\",\"+-Math.sin(r)*e}return\"M\"+t+\",0h\"+e}}var q=c.side||d[0],H=[-1,1,q===d[1]?1:-1];if(\"inside\"!==c.ticks==(\"x\"===m)&&(H=H.map(function(t){return-t})),c.visible){var V=L.filter(n);if(f){if(a(c._axislayer,p(c._pos+D*H[2],H[2]*c.ticklen)),c._counteraxis){s({gridlayer:c._gridlayer,zerolinelayer:c._zerolinelayer},c._counteraxis)}return o(c._axislayer,c._pos)}g=N.getSubplots(t,c);var U=g.map(function(t){var e=u._plots[t];if(u._has(\"cartesian\")){var r=e[m+\"axislayer\"],n=c._linepositions[t]||[],i=e[T+\"axis\"],l=i._id===c.anchor,f=[!1,!1,!1],h=\"\";if(\"allticks\"===c.mirror?f=[!0,!0,!1]:l&&(\"ticks\"===c.mirror?f=[!0,!0,!1]:f[d.indexOf(q)]=!0),c.mirrors)for(v=0;v<2;v++){var g=c.mirrors[i._id+d[v]];\"ticks\"!==g&&\"labels\"!==g||(f[v]=!0)}return void 0!==n[2]&&(f[2]=!0),f.forEach(function(t,e){var r=n[e],a=H[e];t&&x(r)&&(h+=p(r+D*a,a*c.ticklen))}),a(r,h),s(e,i,t),o(r,n[3])}}).filter(function(t){return t&&t.then});return U.length?Promise.all(U):0}},N.swap=function(t,e){for(var r=p(t,e),n=0;n<r.length;n++)v(t,r[n].x,r[n].y)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/titles\":114,\"../../constants/numerical\":122,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../registry\":206,\"./axis_autotype\":172,\"./axis_ids\":174,\"./layout_attributes\":182,\"./layout_defaults\":183,\"./set_convert\":188,d3:7,\"fast-isnumeric\":10}],172:[function(t,e,r){\"use strict\";function n(t){if(!t)return!1;for(var e=0;e<t.length;e++)if(i(t[e]))return!0;return!1}function a(t,e){for(var r,n=0,a=0,o=Math.max(1,(t.length-1)/1e3),s=0;s<t.length;s+=o)r=t[Math.round(s)],l.isDateTime(r,e)&&(n+=1),i(r)&&(a+=1);return n>2*a}function o(t){for(var e,r=Math.max(1,(t.length-1)/1e3),n=0,a=0,o=0;o<t.length;o+=r)e=t[Math.round(o)],l.cleanNumber(e)!==s?n++:\"string\"==typeof e&&\"\"!==e&&\"None\"!==e&&a++;return a>2*n}var i=t(\"fast-isnumeric\"),l=t(\"../../lib\"),s=t(\"../../constants/numerical\").BADNUM;e.exports=function(t,e){return a(t,e)?\"date\":o(t)?\"category\":n(t)?\"linear\":\"-\"}},{\"../../constants/numerical\":122,\"../../lib\":136,\"fast-isnumeric\":10}],173:[function(t,e,r){\"use strict\";var n=t(\"tinycolor2\").mix,a=t(\"../../registry\"),o=t(\"../../lib\"),i=t(\"../../components/color/attributes\").lightFraction,l=t(\"./layout_attributes\"),s=t(\"./tick_value_defaults\"),c=t(\"./tick_mark_defaults\"),u=t(\"./tick_label_defaults\"),f=t(\"./category_order_defaults\"),d=t(\"./set_convert\"),h=t(\"./ordered_categories\");e.exports=function(t,e,r,p,g){function v(r,n){return o.coerce2(t,e,l,r,n)}var m=p.letter,y=p.font||{},x=\"Click to enter \"+(p.title||m.toUpperCase()+\" axis\")+\" title\",b=r(\"visible\",!p.cheateronly),_=e.type;if(\"date\"===_){a.getComponentMethod(\"calendars\",\"handleDefaults\")(t,e,\"calendar\",p.calendar)}if(d(e,g),r(\"autorange\",!e.isValidRange(t.range))&&r(\"rangemode\"),r(\"range\"),e.cleanRange(),f(t,e,r),e._initialCategories=\"category\"===_?h(m,e.categoryorder,e.categoryarray,p.data):[],!b)return e;var w=r(\"color\"),k=w===t.color?w:y.color;r(\"title\",x),o.coerceFont(r,\"titlefont\",{family:y.family,size:Math.round(1.2*y.size),color:k}),s(t,e,r,_),u(t,e,r,_,p),c(t,e,r,p);var M=v(\"linecolor\",w),A=v(\"linewidth\"),T=r(\"showline\",!!M||!!A);T||(delete e.linecolor,delete e.linewidth),(T||e.ticks)&&r(\"mirror\");var L=v(\"gridcolor\",n(w,p.bgColor,i).toRgbString()),C=v(\"gridwidth\");r(\"showgrid\",p.showGrid||!!L||!!C)||(delete e.gridcolor,delete e.gridwidth);var S=v(\"zerolinecolor\",w),z=v(\"zerolinewidth\");return r(\"zeroline\",p.showGrid||!!S||!!z)||(delete e.zerolinecolor,delete e.zerolinewidth),e}},{\"../../components/color/attributes\":24,\"../../lib\":136,\"../../registry\":206,\"./category_order_defaults\":175,\"./layout_attributes\":182,\"./ordered_categories\":184,\"./set_convert\":188,\"./tick_label_defaults\":189,\"./tick_mark_defaults\":190,\"./tick_value_defaults\":191,tinycolor2:13}],174:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t,r){for(var n=Object.keys(t),a=/^[xyz]axis[0-9]*/,o=[],i=0;i<n.length;i++){var l=n[i];e&&l.charAt(0)!==e||a.test(l)&&o.push(r+l)}return o.sort()}var a=t._fullLayout;if(!a)return[];var i=n(a,\"\");if(r)return i;for(var l=o.getSubplotIds(a,\"gl3d\")||[],s=0;s<l.length;s++){var c=l[s];i=i.concat(n(a[c],c+\".\"))}return i}var a=t(\"../../registry\"),o=t(\"../plots\"),i=t(\"../../lib\"),l=t(\"./constants\");r.id2name=function(t){if(\"string\"==typeof t&&t.match(l.AX_ID_PATTERN)){var e=t.substr(1);return\"1\"===e&&(e=\"\"),t.charAt(0)+\"axis\"+e}},r.name2id=function(t){if(t.match(l.AX_NAME_PATTERN)){var e=t.substr(5);return\"1\"===e&&(e=\"\"),t.charAt(0)+e}},r.cleanId=function(t,e){if(t.match(l.AX_ID_PATTERN)&&(!e||t.charAt(0)===e)){var r=t.substr(1).replace(/^0+/,\"\");return\"1\"===r&&(r=\"\"),t.charAt(0)+r}},r.list=function(t,e,r){return n(t,e,r).map(function(e){return i.nestedProperty(t._fullLayout,e).get()})},r.listIds=function(t,e){return n(t,e,!0).map(r.name2id)},r.getFromId=function(t,e,n){var a=t._fullLayout;return\"x\"===n?e=e.replace(/y[0-9]*/,\"\"):\"y\"===n&&(e=e.replace(/x[0-9]*/,\"\")),a[r.id2name(e)]},r.getFromTrace=function(t,e,n){var o=t._fullLayout,i=null;if(a.traceIs(e,\"gl3d\")){var l=e.scene;\"scene\"===l.substr(0,5)&&(i=o[l][n+\"axis\"])}else i=r.getFromId(t,e[n+\"axis\"]||n);return i}},{\"../../lib\":136,\"../../registry\":206,\"../plots\":199,\"./constants\":176}],175:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){if(\"category\"===e.type){var n,a=t.categoryarray,o=Array.isArray(a)&&a.length>0;o&&(n=\"array\");var i=r(\"categoryorder\",n);\"array\"===i&&r(\"categoryarray\"),o||\"array\"!==i||(e.categoryorder=\"trace\")}}},{}],176:[function(t,e,r){\"use strict\";e.exports={idRegex:{x:/^x([2-9]|[1-9][0-9]+)?$/,y:/^y([2-9]|[1-9][0-9]+)?$/},attrRegex:{x:/^xaxis([2-9]|[1-9][0-9]+)?$/,y:/^yaxis([2-9]|[1-9][0-9]+)?$/},xAxisMatch:/^xaxis[0-9]*$/,yAxisMatch:/^yaxis[0-9]*$/,AX_ID_PATTERN:/^[xyz][0-9]*$/,AX_NAME_PATTERN:/^[xyz]axis[0-9]*$/,MINDRAG:8,MINSELECT:12,MINZOOM:20,DRAGGERSIZE:20,BENDPX:1.5,REDRAWDELAY:50,DFLTRANGEX:[-1,6],DFLTRANGEY:[-1,4]}},{}],177:[function(t,e,r){\"use strict\";function n(t,e,r,n){var a,o,l,s,c=n[i(e)].type,u=[];for(o=0;o<r.length;o++)(l=r[o])!==e&&(s=n[i(l)],s.type!==c||s.fixedrange||u.push(l));for(a=0;a<t.length;a++)if(t[a][e]){var f=t[a],d=[];for(o=0;o<u.length;o++)l=u[o],f[l]||d.push(l);return{linkableAxes:d,thisGroup:f}}return{linkableAxes:u,thisGroup:null}}function a(t,e,r,n,a){var o,i,l,s,c;null===e?(e={},e[r]=1,c=t.length,t.push(e)):c=t.indexOf(e);var u=Object.keys(e);for(o=0;o<t.length;o++)if(l=t[o],o!==c&&l[n]){var f=l[n];for(i=0;i<u.length;i++)s=u[i],l[s]=f*a*e[s];return void t.splice(c,1)}if(1!==a)for(i=0;i<u.length;i++)e[u[i]]*=a;e[n]=1}var o=t(\"../../lib\"),i=t(\"./axis_ids\").id2name;e.exports=function(t,e,r,i,l){var s=l._axisConstraintGroups;if(!e.fixedrange&&t.scaleanchor){var c=n(s,e._id,i,l),u=o.coerce(t,e,{scaleanchor:{valType:\"enumerated\",values:c.linkableAxes}},\"scaleanchor\");if(u){var f=r(\"scaleratio\");f||(f=e.scaleratio=1),a(s,c.thisGroup,e._id,u,f)}else i.indexOf(t.scaleanchor)!==-1&&o.warn(\"ignored \"+e._name+'.scaleanchor: \"'+t.scaleanchor+'\" to avoid either an infinite loop and possibly inconsistent scaleratios, or because the targetaxis has fixed range.')}}},{\"../../lib\":136,\"./axis_ids\":174}],178:[function(t,e,r){\"use strict\";var n=t(\"./axis_ids\").id2name,a=t(\"./scale_zoom\"),o=t(\"../../constants/numerical\").ALMOST_EQUAL;e.exports=function(t){var e,r,i,l,s,c=t._fullLayout,u=c._axisConstraintGroups;for(e=0;e<u.length;e++){var f=u[e],d=Object.keys(f),h=1/0,p=0,g=1/0,v={},m={};for(r=0;r<d.length;r++)i=d[r],m[i]=l=c[n(i)],l.setScale(),v[i]=s=Math.abs(l._m)/f[i],h=Math.min(h,s),l._constraintShrinkable?delete l._constraintShrinkable:g=Math.min(g,s),p=Math.max(p,s);if(!(h>o*p))for(r=0;r<d.length;r++)i=d[r],(s=v[i])!==g&&a(m[i],s/g)}}},{\"../../constants/numerical\":122,\"./axis_ids\":174,\"./scale_zoom\":186}],179:[function(t,e,r){\"use strict\";function n(t,e,r,n,a,o,i){var l=t.draglayer.selectAll(\".\"+e).data([0]);return l.enter().append(\"rect\").classed(\"drag\",!0).classed(e,!0).style({fill:\"transparent\",\"stroke-width\":0}).attr(\"data-subplot\",t.id),l.call(L.setRect,n,a,o,i).call(C,r),l.node()}function a(t,e){for(var r=0;r<t.length;r++)if(!t[r].fixedrange)return e;return\"\"}function o(t,e){var r,n=t.range[e],a=Math.abs(n-t.range[1-e]);return\"date\"===t.type?n:\"log\"===t.type?(r=Math.ceil(Math.max(0,-Math.log(a)/Math.LN10))+3,b.format(\".\"+r+\"g\")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(a)/Math.LN10)+4,b.format(\".\"+String(r)+\"g\")(n))}function i(t,e,r,n){var a,o,l,s;for(a=0;a<t.length;a++)o=t[a],o.fixedrange||(l=o._rl[0],s=o._rl[1]-l,o.range=[o.l2r(l+s*e),o.l2r(l+s*r)]);if(n&&n.length){var c=(e+(1-r))/2;i(n,c,1-c)}}function l(t,e){for(var r=0;r<t.length;r++){var n=t[r];n.fixedrange||(n.range=[n.l2r(n._rl[0]-e/n._m),n.l2r(n._rl[1]-e/n._m)])}}function s(t){return 1-(t>=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function c(t,e){return t?\"nsew\"===t?\"pan\"===e?\"move\":\"crosshair\":t.toLowerCase()+\"-resize\":\"pointer\"}function u(t,e,r,n,a){return t.append(\"path\").attr(\"class\",\"zoombox\").style({fill:e>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"transform\",\"translate(\"+r+\", \"+n+\")\").attr(\"d\",a+\"Z\")}function f(t,e,r){return t.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:T.background,stroke:T.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"transform\",\"translate(\"+e+\", \"+r+\")\").attr(\"d\",\"M0,0Z\")}function d(t){t.selectAll(\".select-outline\").remove()}function h(t,e,r,n,a,o){t.attr(\"d\",n+\"M\"+r.l+\",\"+r.t+\"v\"+r.h+\"h\"+r.w+\"v-\"+r.h+\"h-\"+r.w+\"Z\"),a||(t.transition().style(\"fill\",o>.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),e.transition().style(\"opacity\",1).duration(200))}function p(t){b.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}function g(t){return[\"lasso\",\"select\"].indexOf(t)!==-1}function v(t,e){return\"M\"+(t.l-.5)+\",\"+(e-I-.5)+\"h-3v\"+(2*I+1)+\"h3ZM\"+(t.r+.5)+\",\"+(e-I-.5)+\"h3v\"+(2*I+1)+\"h-3Z\"}function m(t,e){return\"M\"+(e-I-.5)+\",\"+(t.t-.5)+\"v-3h\"+(2*I+1)+\"v3ZM\"+(e-I-.5)+\",\"+(t.b+.5)+\"v3h\"+(2*I+1)+\"v-3Z\"}function y(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,I)/2);return\"M\"+(t.l-3.5)+\",\"+(t.t-.5+e)+\"h3v\"+-e+\"h\"+e+\"v-3h-\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.t-.5+e)+\"h-3v\"+-e+\"h\"+-e+\"v-3h\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.b+.5-e)+\"h-3v\"+e+\"h\"+-e+\"v3h\"+(e+3)+\"ZM\"+(t.l-3.5)+\",\"+(t.b+.5-e)+\"h3v\"+e+\"h\"+e+\"v3h-\"+(e+3)+\"Z\"}function x(t,e,r){var n,a,o,i,l,s,c=!1,u={},f={};for(n=0;n<t.length;n++){for(i=t[n],a=0;a<e.length;a++)if(i[e[a]]){for(l in i)(\"x\"===l.charAt(0)?e:r).indexOf(l)===-1&&(u[l]=1);for(o=0;o<r.length;o++)i[r[o]]&&(c=!0)}for(a=0;a<r.length;a++)if(i[r[a]])for(s in i)(\"x\"===s.charAt(0)?e:r).indexOf(s)===-1&&(f[s]=1)}return c&&(M.extendFlat(u,f),f={}),{x:u,y:f,xy:c}}var b=t(\"d3\"),_=t(\"tinycolor2\"),w=t(\"../../plotly\"),k=t(\"../../registry\"),M=t(\"../../lib\"),A=t(\"../../lib/svg_text_utils\"),T=t(\"../../components/color\"),L=t(\"../../components/drawing\"),C=t(\"../../lib/setcursor\"),S=t(\"../../components/dragelement\"),z=t(\"./axes\").doTicks,O=t(\"./axis_ids\").getFromId,D=t(\"./select\"),P=t(\"./scale_zoom\"),E=t(\"./constants\"),N=E.MINDRAG,I=E.MINZOOM,R=!0;e.exports=function(t,e,r,T,C,F,j,B){function q(){K=[e.xaxis],tt=[e.yaxis];var r=K[0],n=tt[0];nt=r._length,at=n._length;var o=ft._axisConstraintGroups,i=[r._id],l=[n._id];J=[e].concat(j&&B?e.overlays:[]);for(var s=1;s<J.length;s++){var u=J[s].xaxis,f=J[s].yaxis;K.indexOf(u)===-1&&(K.push(u),i.push(u._id)),tt.indexOf(f)===-1&&(tt.push(f),l.push(f._id))}ot=a(K,B),it=a(tt,j),lt=c(it+ot,ft.dragmode),et=r._offset,rt=n._offset;var d=x(o,i,l);st=d.xy,ct=[];for(var h in d.x)ct.push(O(t,h));ut=[];for(var p in d.y)ut.push(O(t,p))}function H(e,r,n){var a=pt.getBoundingClientRect();vt=r-a.left,mt=n-a.top,yt={l:vt,r:vt,w:0,t:mt,b:mt,h:0},xt=t._hmpixcount?t._hmlumcount/t._hmpixcount:_(t._fullLayout.plot_bgcolor).getLuminance(),bt=\"M0,0H\"+nt+\"V\"+at+\"H0V0\",_t=!1,wt=\"xy\",kt=u(dt,xt,et,rt,bt),Mt=f(dt,et,rt),d(dt)}function V(e,r){function n(){wt=\"\",yt.r=yt.l,yt.t=yt.b,Mt.attr(\"d\",\"M0,0Z\")}if(t._transitioningWithDuration)return!1;var a=Math.max(0,Math.min(nt,e+vt)),o=Math.max(0,Math.min(at,r+mt)),i=Math.abs(a-vt),l=Math.abs(o-mt);yt.l=Math.min(vt,a),\n",
|
|
"yt.r=Math.max(vt,a),yt.t=Math.min(mt,o),yt.b=Math.max(mt,o),st?i>I||l>I?(wt=\"xy\",i/nt>l/at?(l=i*at/nt,mt>o?yt.t=mt-l:yt.b=mt+l):(i=l*nt/at,vt>a?yt.l=vt-i:yt.r=vt+i),Mt.attr(\"d\",y(yt))):n():!it||l<Math.min(Math.max(.6*i,N),I)?i<N?n():(yt.t=0,yt.b=at,wt=\"x\",Mt.attr(\"d\",v(yt,mt))):!ot||i<Math.min(.6*l,I)?(yt.l=0,yt.r=nt,wt=\"y\",Mt.attr(\"d\",m(yt,vt))):(wt=\"xy\",Mt.attr(\"d\",y(yt))),yt.w=yt.r-yt.l,yt.h=yt.b-yt.t,h(kt,Mt,yt,bt,_t,xt),_t=!0}function U(e,r){if(Math.min(yt.h,yt.w)<2*N)return 2===r&&W(),p(t);\"xy\"!==wt&&\"x\"!==wt||i(K,yt.l/nt,yt.r/nt,ct),\"xy\"!==wt&&\"y\"!==wt||i(tt,(at-yt.b)/at,(at-yt.t)/at,ut),p(t),$(wt),R&&t.data&&t._context.showTips&&(M.notifier(\"Double-click to<br>zoom back out\",\"long\"),R=!1)}function X(e,r){var n=1===(j+B).length;if(e)$();else if(2!==r||n){if(1===r&&n){var a=j?tt[0]:K[0],i=\"s\"===j||\"w\"===B?0:1,l=a._name+\".range[\"+i+\"]\",s=o(a,i),c=\"left\",u=\"middle\";if(a.fixedrange)return;j?(u=\"n\"===j?\"top\":\"bottom\",\"right\"===a.side&&(c=\"right\")):\"e\"===B&&(c=\"right\"),t._context.showAxisRangeEntryBoxes&&b.select(pt).call(A.makeEditable,null,{immediate:!0,background:ft.paper_bgcolor,text:String(s),fill:a.tickfont?a.tickfont.color:\"#444\",horizontalAlign:c,verticalAlign:u}).on(\"edit\",function(e){var r=a.d2r(e);void 0!==r&&w.relayout(t,l,r)})}}else W()}function G(e){function r(t,e,r){function n(e){return t.l2r(o+(e-o)*r)}if(!t.fixedrange){var a=M.simpleMap(t.range,t.r2l),o=a[0]+(a[1]-a[0])*e;t.range=a.map(n)}}if(t._context.scrollZoom||ft._enablescrollzoom){if(t._transitioningWithDuration)return M.pauseEvent(e);var n=t.querySelector(\".plotly\");if(q(),!(n.scrollHeight-n.clientHeight>10||n.scrollWidth-n.clientWidth>10)){clearTimeout(Tt);var a=-e.deltaY;if(isFinite(a)||(a=e.wheelDelta/10),!isFinite(a))return void M.log(\"Did not find wheel motion attributes: \",e);var o,i=Math.exp(-Math.min(Math.max(a,-20),20)/100),l=Ct.draglayer.select(\".nsewdrag\").node().getBoundingClientRect(),s=(e.clientX-l.left)/l.width,c=(l.bottom-e.clientY)/l.height;if(B||st){for(B||(s=.5),o=0;o<K.length;o++)r(K[o],s,i);At[2]*=i,At[0]+=At[2]*s*(1/i-1)}if(j||st){for(j||(c=.5),o=0;o<tt.length;o++)r(tt[o],c,i);At[3]*=i,At[1]+=At[3]*(1-c)*(1/i-1)}return Q(At),Z(j,B),Tt=setTimeout(function(){At=[0,0,nt,at];var t;t=st?\"xy\":(B?\"x\":\"\")+(j?\"y\":\"\"),$(t)},Lt),M.pauseEvent(e)}}}function Y(e,r){function n(t,e,r){for(var n,a,o=1-e,i=0;i<t.length;i++){var l=t[i];if(!l.fixedrange){n=l,a=l._rl[o]+(l._rl[e]-l._rl[o])/s(r/l._length);var c=l.l2r(a);c!==!1&&void 0!==c&&(l.range[e]=c)}}return n._length*(n._rl[e]-a)/(n._rl[e]-n._rl[o])}if(!t._transitioningWithDuration){if(q(),\"ew\"===ot||\"ns\"===it)return ot&&l(K,e),it&&l(tt,r),Q([ot?-e:0,it?-r:0,nt,at]),void Z(it,ot);if(st&&ot&&it){var a=\"w\"===ot==(\"n\"===it)?1:-1,o=(e/nt+a*r/at)/2;e=o*nt,r=a*o*at}\"w\"===ot?e=n(K,0,e):\"e\"===ot?e=n(K,1,-e):ot||(e=0),\"n\"===it?r=n(tt,1,r):\"s\"===it?r=n(tt,0,-r):it||(r=0);var i=\"w\"===ot?e:0,c=\"n\"===it?r:0;if(st){var u;if(!ot&&1===it.length){for(u=0;u<K.length;u++)K[u].range=K[u]._r.slice(),P(K[u],1-r/at);e=r*nt/at,i=e/2}if(!it&&1===ot.length){for(u=0;u<tt.length;u++)tt[u].range=tt[u]._r.slice(),P(tt[u],1-e/nt);r=e*at/nt,c=r/2}}Q([i,c,nt-e,at-r]),Z(it,ot)}}function Z(e,r){function n(t){for(o=0;o<t.length;o++)t[o].fixedrange||i.push(t[o]._id)}function a(n,a,l){for(o=0;o<n.length;o++){var s=n[o];if((r&&i.indexOf(s.xref)!==-1||e&&i.indexOf(s.yref)!==-1)&&(a(t,o),l))return}}var o,i=[];for((r||st)&&(n(K),n(ct)),(e||st)&&(n(tt),n(ut)),o=0;o<i.length;o++)z(t,i[o],!0);a(ft.annotations||[],k.getComponentMethod(\"annotations\",\"drawOne\")),a(ft.shapes||[],k.getComponentMethod(\"shapes\",\"drawOne\")),a(ft.images||[],k.getComponentMethod(\"images\",\"draw\"),!0)}function W(){if(!t._transitioningWithDuration){var e,r,n,a=t._context.doubleClick,o=(ot?K:[]).concat(it?tt:[]),i={};if(\"reset+autosize\"===a)for(a=\"autosize\",r=0;r<o.length;r++)if(e=o[r],e._rangeInitial&&(e.range[0]!==e._rangeInitial[0]||e.range[1]!==e._rangeInitial[1])||!e._rangeInitial&&!e.autorange){a=\"reset\";break}if(\"autosize\"===a)for(r=0;r<o.length;r++)e=o[r],e.fixedrange||(i[e._name+\".autorange\"]=!0);else if(\"reset\"===a)for((ot||st)&&(o=o.concat(ct)),it&&!st&&(o=o.concat(ut)),st&&(ot?it||(o=o.concat(tt)):o=o.concat(K)),r=0;r<o.length;r++)e=o[r],e._rangeInitial?(n=e._rangeInitial,i[e._name+\".range[0]\"]=n[0],i[e._name+\".range[1]\"]=n[1]):i[e._name+\".autorange\"]=!0;t.emit(\"plotly_doubleclick\",null),w.relayout(t,i)}}function $(e){void 0===e&&(e=(B?\"x\":\"\")+(j?\"y\":\"\"));var r,n={};\"xy\"===e?r=K.concat(tt):\"x\"===e?r=K:\"y\"===e&&(r=tt);for(var a=0;a<r.length;a++){var o=r[a];o._r[0]!==o.range[0]&&(n[o._name+\".range[0]\"]=o.range[0]),o._r[1]!==o.range[1]&&(n[o._name+\".range[1]\"]=o.range[1]),o.range=o._input.range=o._r.slice()}Q([0,0,nt,at]),w.relayout(t,n)}function Q(t){function e(t){return t.fixedrange?0:d&&ct.indexOf(t)!==-1?u:h&&(st?ct:ut).indexOf(t)!==-1?f:0}function r(t,e){return e?(t.range=t._r.slice(),P(t,e),t._length*(1-e)/2):0}var n,a,o,i,l,s=ft._plots,c=Object.keys(s),u=t[2]/K[0]._length,f=t[3]/tt[0]._length,d=B||st,h=j||st;for(n=0;n<c.length;n++){var p=s[c[n]],g=p.xaxis,v=p.yaxis,m=d&&!g.fixedrange&&K.indexOf(g)!==-1,y=h&&!v.fixedrange&&tt.indexOf(v)!==-1;if(m?(a=u,i=t[0]):(a=e(g),i=r(g,a)),y?(o=f,l=t[1]):(o=e(v),l=r(v,o)),a||o){a||(a=1),o||(o=1);var x=g._offset-i/a,b=v._offset-l/o;ft._defs.selectAll(\"#\"+p.clipId).call(L.setTranslate,i,l).call(L.setScale,a,o),p.plot.call(L.setTranslate,x,b).call(L.setScale,1/a,1/o).select(\".scatterlayer\").selectAll(\".points\").selectAll(\".point\").call(L.setPointGroupScale,a,o),p.plot.select(\".scatterlayer\").selectAll(\".points\").selectAll(\".textpoint\").call(L.setTextPointsScale,a,o)}}}var J,K,tt,et,rt,nt,at,ot,it,lt,st,ct,ut,ft=t._fullLayout,dt=t._fullLayout._zoomlayer,ht=j+B===\"nsew\";q();var pt=n(e,j+B+\"drag\",lt,r,T,C,F);if(!it&&!ot&&!g(ft.dragmode))return pt.onmousedown=null,pt.style.pointerEvents=ht?\"all\":\"none\",pt;var gt={element:pt,gd:t,plotinfo:e,doubleclick:W,prepFn:function(e,r,n){var a=t._fullLayout.dragmode;ht?e.shiftKey&&(a=\"pan\"===a?\"zoom\":\"pan\"):a=\"pan\",gt.minDrag=\"lasso\"===a?1:void 0,\"zoom\"===a?(gt.moveFn=V,gt.doneFn=U,gt.minDrag=1,H(e,r,n)):\"pan\"===a?(gt.moveFn=Y,gt.doneFn=X,d(dt)):g(a)&&(gt.xaxes=K,gt.yaxes=tt,D(e,r,n,gt,a))}};S.init(gt);var vt,mt,yt,xt,bt,_t,wt,kt,Mt,At=[0,0,nt,at],Tt=null,Lt=E.REDRAWDELAY,Ct=e.mainplot?ft._plots[e.mainplot]:e;return j.length*B.length!=1&&(void 0!==pt.onwheel?pt.onwheel=G:void 0!==pt.onmousewheel&&(pt.onmousewheel=G)),pt}},{\"../../components/color\":25,\"../../components/dragelement\":46,\"../../components/drawing\":49,\"../../lib\":136,\"../../lib/setcursor\":151,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../registry\":206,\"./axes\":171,\"./axis_ids\":174,\"./constants\":176,\"./scale_zoom\":186,\"./select\":187,d3:7,tinycolor2:13}],180:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../components/fx\"),o=t(\"../../components/dragelement\"),i=t(\"./constants\"),l=t(\"./dragbox\");e.exports=function(t){var e=t._fullLayout;if(e._has(\"cartesian\")&&!t._context.staticPlot){Object.keys(e._plots||{}).sort(function(t,r){if((e._plots[t].mainplot&&!0)===(e._plots[r].mainplot&&!0)){var n=t.split(\"y\"),a=r.split(\"y\");return n[0]===a[0]?Number(n[1]||1)-Number(a[1]||1):Number(n[0]||1)-Number(a[0]||1)}return e._plots[t].mainplot?1:-1}).forEach(function(r){var s=e._plots[r];if(e._has(\"cartesian\")){var c=s.xaxis,u=s.yaxis,f=(c._linepositions[r]||[])[3],d=(u._linepositions[r]||[])[3],h=i.DRAGGERSIZE;if(n(f)&&\"top\"===c.side&&(f-=h),n(d)&&\"right\"!==u.side&&(d-=h),!s.mainplot){var p=l(t,s,0,0,c._length,u._length,\"ns\",\"ew\");p.onmousemove=function(e){t._fullLayout._rehover=function(){t._fullLayout._hoversubplot===r&&a.hover(t,e,r)},a.hover(t,e,r),t._fullLayout._lasthover=p,t._fullLayout._hoversubplot=r},p.onmouseout=function(e){t._dragging||(t._fullLayout._hoversubplot=null,o.unhover(t,e))},p.onclick=function(e){a.click(t,e)},t._context.showAxisDragHandles&&(l(t,s,-h,-h,h,h,\"n\",\"w\"),l(t,s,c._length,-h,h,h,\"n\",\"e\"),l(t,s,-h,u._length,h,h,\"s\",\"w\"),l(t,s,c._length,u._length,h,h,\"s\",\"e\"))}t._context.showAxisDragHandles&&(n(f)&&(\"free\"===c.anchor&&(f-=e._size.h*(1-u.domain[1])),l(t,s,.1*c._length,f,.8*c._length,h,\"\",\"ew\"),l(t,s,0,f,.1*c._length,h,\"\",\"w\"),l(t,s,.9*c._length,f,.1*c._length,h,\"\",\"e\")),n(d)&&(\"free\"===u.anchor&&(d-=e._size.w*c.domain[0]),l(t,s,d,.1*u._length,h,.8*u._length,\"ns\",\"\"),l(t,s,d,.9*u._length,h,.1*u._length,\"s\",\"\"),l(t,s,d,0,h,.1*u._length,\"n\",\"\")))}});var r=e._hoverlayer.node();r.onmousemove=function(r){r.target=e._lasthover,a.hover(t,r,e._hoversubplot)},r.onclick=function(r){r.target=e._lasthover,a.click(t,r)},r.onmousedown=function(t){e._lasthover.onmousedown(t)}}}},{\"../../components/dragelement\":46,\"../../components/fx\":66,\"./constants\":176,\"./dragbox\":179,\"fast-isnumeric\":10}],181:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){var o=t._fullLayout,i=o._modules;e.plot&&e.plot.selectAll(\"g:not(.scatterlayer)\").selectAll(\"g.trace\").remove();for(var l=0;l<i.length;l++){var s=i[l];if(\"cartesian\"===s.basePlotModule.name){for(var c=[],u=0;u<r.length;u++){var f=r[u],d=f[0].trace;d._module===s&&d.visible===!0&&c.push(f)}s.plot(t,e,c,n,a)}}}function a(t){for(var e=t._fullLayout,r=Object.keys(e._plots),n=[],a=[],o=0;o<r.length;o++){var i=r[o],l=e._plots[i],s=l.xaxis,c=l.yaxis,u=f.getFromId(t,s.overlaying)||s;u!==s&&u.overlaying&&(u=s,s.overlaying=!1);var d=f.getFromId(t,c.overlaying)||c;d!==c&&d.overlaying&&(d=c,c.overlaying=!1);var h=u._id+d._id;h!==i&&r.indexOf(h)!==-1?(l.mainplot=h,l.mainplotinfo=e._plots[h],a.push(i),s.domain=u.domain.slice(),c.domain=d.domain.slice()):n.push(i)}return n=n.concat(a)}function o(t){function e(t){l(t,\"g\",\"imagelayer\"),l(t,\"g\",\"maplayer\"),l(t,\"g\",\"barlayer\"),l(t,\"g\",\"carpetlayer\"),l(t,\"g\",\"boxlayer\"),l(t,\"g\",\"scatterlayer\")}var r=t.plotgroup,n=t.id;if(t.mainplot){var a=t.mainplotinfo;t.gridlayer=l(a.overgrid,\"g\",n),t.zerolinelayer=l(a.overzero,\"g\",n),t.plot=l(a.overplot,\"g\",n),t.xlines=l(a.overlines,\"path\",n),t.ylines=l(a.overlines,\"path\",n),t.xaxislayer=l(a.overaxes,\"g\",n),t.yaxislayer=l(a.overaxes,\"g\",n)}else{var o=l(r,\"g\",\"layer-subplot\");t.shapelayer=l(o,\"g\",\"shapelayer\"),t.imagelayer=l(o,\"g\",\"imagelayer\"),t.gridlayer=l(r,\"g\",\"gridlayer\"),t.overgrid=l(r,\"g\",\"overgrid\"),t.zerolinelayer=l(r,\"g\",\"zerolinelayer\"),t.overzero=l(r,\"g\",\"overzero\"),t.plot=l(r,\"g\",\"plot\"),t.overplot=l(r,\"g\",\"overplot\"),t.xlines=l(r,\"path\",\"xlines\"),t.ylines=l(r,\"path\",\"ylines\"),t.overlines=l(r,\"g\",\"overlines\"),t.xaxislayer=l(r,\"g\",\"xaxislayer\"),t.yaxislayer=l(r,\"g\",\"yaxislayer\"),t.overaxes=l(r,\"g\",\"overaxes\")}t.plot.call(e),t.xlines.style(\"fill\",\"none\").classed(\"crisp\",!0),t.ylines.style(\"fill\",\"none\").classed(\"crisp\",!0)}function i(t,e){t&&t.each(function(t){var r=s.select(this),n=\"clip\"+e._uid+t+\"plot\";r.remove(),e._draggers.selectAll(\"g.\"+t).remove(),e._defs.select(\"#\"+n).remove()})}function l(t,e,r){var n=t.selectAll(\".\"+r).data([0]);return n.enter().append(e).classed(r,!0),n}var s=t(\"d3\"),c=t(\"../../lib\"),u=t(\"../plots\"),f=t(\"./axis_ids\"),d=t(\"./constants\");r.name=\"cartesian\",r.attr=[\"xaxis\",\"yaxis\"],r.idRoot=[\"x\",\"y\"],r.idRegex=d.idRegex,r.attrRegex=d.attrRegex,r.attributes=t(\"./attributes\"),r.layoutAttributes=t(\"./layout_attributes\"),r.transitionAxes=t(\"./transition_axes\"),r.plot=function(t,e,r,a){var o,i=t._fullLayout,l=u.getSubplotIds(i,\"cartesian\"),s=t.calcdata;if(!Array.isArray(e))for(e=[],o=0;o<s.length;o++)e.push(o);for(o=0;o<l.length;o++){for(var c,f=l[o],d=i._plots[f],h=[],p=0;p<s.length;p++){var g=s[p],v=g[0].trace;v.xaxis+v.yaxis===f&&((e.indexOf(v.index)!==-1||v.carpet)&&(c&&c[0].trace.xaxis+c[0].trace.yaxis===f&&[\"tonextx\",\"tonexty\",\"tonext\"].indexOf(v.fill)!==-1&&h.indexOf(c)===-1&&h.push(c),h.push(g)),c=g)}n(t,d,h,r,a)}},r.clean=function(t,e,r,n){var a,o,l,s=n._modules||[],c=e._modules||[];for(l=0;l<s.length;l++)if(\"scatter\"===s[l].name){a=!0;break}for(l=0;l<c.length;l++)if(\"scatter\"===c[l].name){o=!0;break}if(a&&!o){var u=n._plots,d=Object.keys(u||{});for(l=0;l<d.length;l++){var h=u[d[l]];h.plot&&h.plot.select(\"g.scatterlayer\").selectAll(\"g.trace\").remove()}n._infolayer.selectAll(\"g.rangeslider-container\").select(\"g.scatterlayer\").selectAll(\"g.trace\").remove()}var p=n._has&&n._has(\"cartesian\"),g=e._has&&e._has(\"cartesian\");if(p&&!g){var v=n._cartesianlayer.selectAll(\".subplot\"),m=f.listIds({_fullLayout:n});for(v.call(i,n),n._defs.selectAll(\".axesclip\").remove(),l=0;l<m.length;l++)n._infolayer.select(\".\"+m[l]+\"title\").remove()}},r.drawFramework=function(t){var e=t._fullLayout,r=a(t),n=e._cartesianlayer.selectAll(\".subplot\").data(r,c.identity);n.enter().append(\"g\").attr(\"class\",function(t){return\"subplot \"+t}),n.order(),n.exit().call(i,e),n.each(function(t){var r=e._plots[t];if(r.plotgroup=s.select(this),r.overlays=[],o(r),r.mainplot){e._plots[r.mainplot].overlays.push(r)}r.draglayer=l(e._draggers,\"g\",t)})},r.rangePlot=function(t,e,r){o(e),n(t,e,r),u.style(t)}},{\"../../lib\":136,\"../plots\":199,\"./attributes\":170,\"./axis_ids\":174,\"./constants\":176,\"./layout_attributes\":182,\"./transition_axes\":192,d3:7}],182:[function(t,e,r){\"use strict\";var n=t(\"../font_attributes\"),a=t(\"../../components/color/attributes\"),o=t(\"../../components/drawing/attributes\").dash,i=t(\"../../lib/extend\").extendFlat,l=t(\"./constants\");e.exports={visible:{valType:\"boolean\"},color:{valType:\"color\",dflt:a.defaultLine},title:{valType:\"string\"},titlefont:i({},n,{}),type:{valType:\"enumerated\",values:[\"-\",\"linear\",\"log\",\"date\",\"category\"],dflt:\"-\"},autorange:{valType:\"enumerated\",values:[!0,!1,\"reversed\"],dflt:!0},rangemode:{valType:\"enumerated\",values:[\"normal\",\"tozero\",\"nonnegative\"],dflt:\"normal\"},range:{valType:\"info_array\",items:[{valType:\"any\"},{valType:\"any\"}]},fixedrange:{valType:\"boolean\",dflt:!1},scaleanchor:{valType:\"enumerated\",values:[l.idRegex.x.toString(),l.idRegex.y.toString()]},scaleratio:{valType:\"number\",min:0,dflt:1},tickmode:{valType:\"enumerated\",values:[\"auto\",\"linear\",\"array\"]},nticks:{valType:\"integer\",min:0,dflt:0},tick0:{valType:\"any\"},dtick:{valType:\"any\"},tickvals:{valType:\"data_array\"},ticktext:{valType:\"data_array\"},ticks:{valType:\"enumerated\",values:[\"outside\",\"inside\",\"\"]},mirror:{valType:\"enumerated\",values:[!0,\"ticks\",!1,\"all\",\"allticks\"],dflt:!1},ticklen:{valType:\"number\",min:0,dflt:5},tickwidth:{valType:\"number\",min:0,dflt:1},tickcolor:{valType:\"color\",dflt:a.defaultLine},showticklabels:{valType:\"boolean\",dflt:!0},showspikes:{valType:\"boolean\",dflt:!1},spikecolor:{valType:\"color\",dflt:null},spikethickness:{valType:\"number\",dflt:3},spikedash:i({},o,{dflt:\"dash\"}),spikemode:{valType:\"flaglist\",flags:[\"toaxis\",\"across\",\"marker\"],dflt:\"toaxis\"},tickfont:i({},n,{}),tickangle:{valType:\"angle\",dflt:\"auto\"},tickprefix:{valType:\"string\",dflt:\"\"},showtickprefix:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},ticksuffix:{valType:\"string\",dflt:\"\"},showticksuffix:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},showexponent:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},exponentformat:{valType:\"enumerated\",values:[\"none\",\"e\",\"E\",\"power\",\"SI\",\"B\"],dflt:\"B\"},separatethousands:{valType:\"boolean\",dflt:!1},tickformat:{valType:\"string\",dflt:\"\"},hoverformat:{valType:\"string\",dflt:\"\"},showline:{valType:\"boolean\",dflt:!1},linecolor:{valType:\"color\",dflt:a.defaultLine},linewidth:{valType:\"number\",min:0,dflt:1},showgrid:{valType:\"boolean\"},gridcolor:{valType:\"color\",dflt:a.lightLine},gridwidth:{valType:\"number\",min:0,dflt:1},zeroline:{valType:\"boolean\"},zerolinecolor:{valType:\"color\",dflt:a.defaultLine},zerolinewidth:{valType:\"number\",dflt:1},anchor:{valType:\"enumerated\",values:[\"free\",l.idRegex.x.toString(),l.idRegex.y.toString()]},side:{valType:\"enumerated\",values:[\"top\",\"bottom\",\"left\",\"right\"]},overlaying:{valType:\"enumerated\",values:[\"free\",l.idRegex.x.toString(),l.idRegex.y.toString()]},domain:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]},position:{valType:\"number\",min:0,max:1,dflt:0},categoryorder:{valType:\"enumerated\",values:[\"trace\",\"category ascending\",\"category descending\",\"array\"],dflt:\"trace\"},categoryarray:{valType:\"data_array\"},_deprecated:{autotick:{valType:\"boolean\"}}}},{\"../../components/color/attributes\":24,\"../../components/drawing/attributes\":48,\"../../lib/extend\":132,\"../font_attributes\":195,\"./constants\":176}],183:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../lib\"),o=t(\"../../components/color\"),i=t(\"../layout_attributes\"),l=t(\"./constants\"),s=t(\"./layout_attributes\"),c=t(\"./type_defaults\"),u=t(\"./axis_defaults\"),f=t(\"./constraint_defaults\"),d=t(\"./position_defaults\"),h=t(\"./axis_ids\");e.exports=function(t,e,r){function p(t,e){return Number(t.substr(5)||1)-Number(e.substr(5)||1)}function g(t,e){return a.coerce(j,B,s,t,e)}function v(t){var e={x:E,y:P}[t];return a.simpleMap(e,h.name2id)}var m,y=Object.keys(t),x=[],b=[],_=[],w=[],k=[],M=[],A={},T={};for(m=0;m<r.length;m++){var L,C,S=r[m];if(n.traceIs(S,\"cartesian\"))L=x,C=b;else{if(!n.traceIs(S,\"gl2d\"))continue;L=_,C=w}var z=h.id2name(S.xaxis),O=h.id2name(S.yaxis);if(n.traceIs(S,\"carpet\")&&(\"carpet\"!==S.type||S._cheater)||z&&a.pushUnique(M,z),\"carpet\"===S.type&&S._cheater&&z&&a.pushUnique(k,z),z&&L.indexOf(z)===-1&&L.push(z),O&&C.indexOf(O)===-1&&C.push(O),n.traceIs(S,\"2dMap\")&&(A[z]=!0,A[O]=!0),n.traceIs(S,\"oriented\")){T[\"h\"===S.orientation?O:z]=!0}}if(!e._has(\"gl3d\")&&!e._has(\"geo\"))for(m=0;m<y.length;m++){var D=y[m];_.indexOf(D)===-1&&x.indexOf(D)===-1&&l.xAxisMatch.test(D)?x.push(D):w.indexOf(D)===-1&&b.indexOf(D)===-1&&l.yAxisMatch.test(D)&&b.push(D)}x.length&&b.length&&a.pushUnique(e._basePlotModules,n.subplotsRegistry.cartesian);var P=x.concat(_).sort(p),E=b.concat(w).sort(p),N=P.concat(E),I=o.background;P.length&&E.length&&(I=a.coerce(t,e,i,\"plot_bgcolor\"));var R,F,j,B,q=o.combine(I,e.paper_bgcolor),H={x:v(\"x\"),y:v(\"y\")};for(m=0;m<N.length;m++){R=N[m],a.isPlainObject(t[R])||(t[R]={}),j=t[R],B=e[R]={},c(j,B,g,r,R),F=R.charAt(0);var V=function(e,r){for(var n={x:P,y:E}[e],a=[],o=0;o<n.length;o++){var i=n[o];i===r||(t[i]||{}).overlaying||a.push(h.name2id(i))}return a}(F,R),U={letter:F,font:e.font,outerTicks:A[R],showGrid:!T[R],data:r,bgColor:q,calendar:e.calendar,cheateronly:\"x\"===F&&k.indexOf(R)!==-1&&M.indexOf(R)===-1};u(j,B,g,U,e);g(\"showspikes\")&&(g(\"spikecolor\"),g(\"spikethickness\"),g(\"spikedash\"),g(\"spikemode\"));var X={letter:F,counterAxes:H[F],overlayableAxes:V};d(j,B,g,X),B._input=j}var G=n.getComponentMethod(\"rangeslider\",\"handleDefaults\"),Y=n.getComponentMethod(\"rangeselector\",\"handleDefaults\");for(m=0;m<P.length;m++)R=P[m],j=t[R],B=e[R],G(t,e,R),\"date\"===B.type&&Y(j,B,e,E,B.calendar),g(\"fixedrange\");for(m=0;m<E.length;m++){R=E[m],j=t[R],B=e[R];var Z=e[h.id2name(B.anchor)];g(\"fixedrange\",Z&&Z.rangeslider&&Z.rangeslider.visible)}e._axisConstraintGroups=[];var W=H.x.concat(H.y);for(m=0;m<N.length;m++)R=N[m],F=R.charAt(0),j=t[R],B=e[R],f(j,B,g,W,e)}},{\"../../components/color\":25,\"../../lib\":136,\"../../registry\":206,\"../layout_attributes\":197,\"./axis_defaults\":173,\"./axis_ids\":174,\"./constants\":176,\"./constraint_defaults\":177,\"./layout_attributes\":182,\"./position_defaults\":185,\"./type_defaults\":193}],184:[function(t,e,r){\"use strict\";function n(t,e,r){var n,o,i,l,s,c=[],u=r.map(function(e){return e[t]}),f=a.bisector(e).left;for(n=0;n<u.length;n++)for(i=u[n],o=0;o<i.length;o++)null!==(l=i[o])&&void 0!==l&&((s=f(c,l))<c.length&&c[s]===l||c.splice(s,0,l));return c}var a=t(\"d3\");e.exports=function(t,e,r,o){switch(e){case\"array\":return Array.isArray(r)?r.slice():[];case\"category ascending\":return n(t,a.ascending,o);case\"category descending\":return n(t,a.descending,o);case\"trace\":default:return[]}}},{d3:7}],185:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\");e.exports=function(t,e,r,o){var i=o.counterAxes||[],l=o.overlayableAxes||[],s=o.letter;\"free\"===a.coerce(t,e,{anchor:{valType:\"enumerated\",values:[\"free\"].concat(i),dflt:n(t.position)?\"free\":i[0]||\"free\"}},\"anchor\")&&r(\"position\"),a.coerce(t,e,{side:{valType:\"enumerated\",values:\"x\"===s?[\"bottom\",\"top\"]:[\"left\",\"right\"],dflt:\"x\"===s?\"bottom\":\"left\"}},\"side\");var c=!1;if(l.length&&(c=a.coerce(t,e,{overlaying:{valType:\"enumerated\",values:[!1].concat(l),dflt:!1}},\"overlaying\")),!c){var u=r(\"domain\");u[0]>u[1]-.01&&(e.domain=[0,1]),a.noneOrAll(t.domain,e.domain,[0,1])}return e}},{\"../../lib\":136,\"fast-isnumeric\":10}],186:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){void 0===r&&(r=.5);var n=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=n[0]+(n[1]-n[0])*r,o=(a-n[0])*e;t.range=t._input.range=[t.l2r(a-o),t.l2r(a+o)]}},{}],187:[function(t,e,r){\"use strict\";function n(t){return t._id}var a=t(\"../../lib/polygon\"),o=t(\"../../components/color\"),i=t(\"./axes\"),l=t(\"./constants\"),s=a.filter,c=a.tester,u=l.MINSELECT;e.exports=function(t,e,r,a,f){function d(t){var e=\"y\"===t._id.charAt(0)?1:0;return function(r){return t.p2d(r[e])}}function h(t,e){return t-e}var p,g=a.gd._fullLayout._zoomlayer,v=a.element.getBoundingClientRect(),m=a.plotinfo.xaxis._offset,y=a.plotinfo.yaxis._offset,x=e-v.left,b=r-v.top,_=x,w=b,k=\"M\"+x+\",\"+b,M=a.xaxes[0]._length,A=a.yaxes[0]._length,T=a.xaxes.map(n),L=a.yaxes.map(n),C=a.xaxes.concat(a.yaxes);\"lasso\"===f&&(p=s([[x,b]],l.BENDPX));var S=g.selectAll(\"path.select-outline\").data([1,2]);S.enter().append(\"path\").attr(\"class\",function(t){return\"select-outline select-outline-\"+t}).attr(\"transform\",\"translate(\"+m+\", \"+y+\")\").attr(\"d\",k+\"Z\");var z,O,D,P,E,N=g.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:o.background,stroke:o.defaultLine,\"stroke-width\":1}).attr(\"transform\",\"translate(\"+m+\", \"+y+\")\").attr(\"d\",\"M0,0Z\"),I=[],R=a.gd,F=[];for(z=0;z<R.calcdata.length;z++)if(O=R.calcdata[z],D=O[0].trace,D._module&&D._module.selectPoints)if(a.subplot){if(D.subplot!==a.subplot)continue;I.push({selectPoints:D._module.selectPoints,cd:O,xaxis:a.xaxes[0],yaxis:a.yaxes[0]})}else{if(T.indexOf(D.xaxis)===-1)continue;if(L.indexOf(D.yaxis)===-1)continue;I.push({selectPoints:D._module.selectPoints,cd:O,xaxis:i.getFromId(R,D.xaxis),yaxis:i.getFromId(R,D.yaxis)})}a.moveFn=function(t,e){var r,n;_=Math.max(0,Math.min(M,t+x)),w=Math.max(0,Math.min(A,e+b));var o=Math.abs(_-x),i=Math.abs(w-b);for(\"select\"===f?(i<Math.min(.6*o,u)?(r=c([[x,0],[x,A],[_,A],[_,0]]),N.attr(\"d\",\"M\"+r.xmin+\",\"+(b-u)+\"h-4v\"+2*u+\"h4ZM\"+(r.xmax-1)+\",\"+(b-u)+\"h4v\"+2*u+\"h-4Z\")):o<Math.min(.6*i,u)?(r=c([[0,b],[0,w],[M,w],[M,b]]),N.attr(\"d\",\"M\"+(x-u)+\",\"+r.ymin+\"v-4h\"+2*u+\"v4ZM\"+(x-u)+\",\"+(r.ymax-1)+\"v4h\"+2*u+\"v-4Z\")):(r=c([[x,b],[x,w],[_,w],[_,b]]),N.attr(\"d\",\"M0,0Z\")),S.attr(\"d\",\"M\"+r.xmin+\",\"+r.ymin+\"H\"+(r.xmax-1)+\"V\"+(r.ymax-1)+\"H\"+r.xmin+\"Z\")):\"lasso\"===f&&(p.addPt([_,w]),r=c(p.filtered),S.attr(\"d\",\"M\"+p.filtered.join(\"L\")+\"Z\")),F=[],z=0;z<I.length;z++)P=I[z],[].push.apply(F,P.selectPoints(P,r));if(E={points:F},\"select\"===f){var l,s=E.range={};for(z=0;z<C.length;z++)n=C[z],l=n._id.charAt(0),s[n._id]=[n.p2d(r[l+\"min\"]),n.p2d(r[l+\"max\"])].sort(h)}else{var g=E.lassoPoints={};for(z=0;z<C.length;z++)n=C[z],g[n._id]=p.filtered.map(d(n))}a.gd.emit(\"plotly_selecting\",E)},a.doneFn=function(t,e){if(N.remove(),t||2!==e)a.gd.emit(\"plotly_selected\",E);else{for(S.remove(),z=0;z<I.length;z++)P=I[z],P.selectPoints(P,!1);R.emit(\"plotly_deselect\",null)}}}},{\"../../components/color\":25,\"../../lib/polygon\":146,\"./axes\":171,\"./constants\":176}],188:[function(t,e,r){\"use strict\";function n(t){return Math.pow(10,t)}function a(t){return i(t)?(t=Number(t),t<-d||t>d?h:i(t)?Number(t):h):h}var o=t(\"d3\"),i=t(\"fast-isnumeric\"),l=t(\"../../lib\"),s=l.cleanNumber,c=l.ms2DateTime,u=l.dateTime2ms,f=t(\"../../constants/numerical\"),d=f.FP_SAFE,h=f.BADNUM,p=t(\"./constants\"),g=t(\"./axis_ids\");e.exports=function(t,e){function r(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],a=t.range[1];return.5*(n+a-3*w*Math.abs(n-a))}return h}function f(e,r,n){var a=u(e,n||t.calendar);if(a===h){if(!i(e))return h;a=u(new Date(+e))}return a}function v(e,r,n){return c(e,r,n||t.calendar)}function m(e){return t._categories[Math.round(e)]}function y(e){if(null!==e&&void 0!==e){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return h}function x(e){if(t._categoriesMap){var r=t._categoriesMap[e];if(void 0!==r)return r}if(\"number\"==typeof e)return e}function b(e){return i(e)?o.round(t._b+t._m*e,2):h}function _(e){return(e-t._b)/t._m}e=e||{};var w=10;t.c2l=\"log\"===t.type?r:a,t.l2c=\"log\"===t.type?n:a,t.l2p=b,t.p2l=_,t.c2p=\"log\"===t.type?function(t,e){return b(r(t,e))}:b,t.p2c=\"log\"===t.type?function(t){return n(_(t))}:_,[\"linear\",\"-\"].indexOf(t.type)!==-1?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=s,t.c2d=t.c2r=t.l2d=t.l2r=a,t.d2p=t.r2p=function(t){return b(s(t))},t.p2d=t.p2r=_):\"log\"===t.type?(t.d2r=t.d2l=function(t,e){return r(s(t),e)},t.r2d=t.r2c=function(t){return n(s(t))},t.d2c=t.r2l=s,t.c2d=t.l2r=a,t.c2r=r,t.l2d=n,t.d2p=function(e,r){return b(t.d2r(e,r))},t.p2d=function(t){return n(_(t))},t.r2p=function(t){return b(s(t))},t.p2r=_):\"date\"===t.type?(t.d2r=t.r2d=l.identity,t.d2c=t.r2c=t.d2l=t.r2l=f,t.c2d=t.c2r=t.l2d=t.l2r=v,t.d2p=t.r2p=function(t,e,r){return b(f(t,0,r))},t.p2d=t.p2r=function(t,e,r){return v(_(t),e,r)}):\"category\"===t.type&&(t.d2r=t.d2c=t.d2l=y,t.r2d=t.c2d=t.l2d=m,t.d2l_noadd=x,t.r2l=t.l2r=t.r2c=t.c2r=a,t.d2p=function(t){return b(x(t))},t.p2d=function(t){return m(_(t))},t.r2p=b,t.p2r=_),t.fraction2r=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return t.l2r(r+e*(n-r))},t.r2fraction=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return(t.r2l(e)-r)/(n-r)},t.cleanRange=function(e){e||(e=\"range\");var r,n,a=l.nestedProperty(t,e).get(),o=(t._id||\"x\").charAt(0);if(n=\"date\"===t.type?l.dfltRange(t.calendar):\"y\"===o?p.DFLTRANGEY:p.DFLTRANGEX,n=n.slice(),!a||2!==a.length)return void l.nestedProperty(t,e).set(n);for(\"date\"===t.type&&(a[0]=l.cleanDate(a[0],h,t.calendar),a[1]=l.cleanDate(a[1],h,t.calendar)),r=0;r<2;r++)if(\"date\"===t.type){if(!l.isDateTime(a[r],t.calendar)){t[e]=n;break}if(t.r2l(a[0])===t.r2l(a[1])){var s=l.constrain(t.r2l(a[0]),l.MIN_MS+1e3,l.MAX_MS-1e3);a[0]=t.l2r(s-1e3),a[1]=t.l2r(s+1e3);break}}else{if(!i(a[r])){if(!i(a[1-r])){t[e]=n;break}a[r]=a[1-r]*(r?10:.1)}if(a[r]<-d?a[r]=-d:a[r]>d&&(a[r]=d),a[0]===a[1]){var c=Math.max(1,Math.abs(1e-6*a[0]));a[0]-=c,a[1]+=c}}},t.setScale=function(r){var n=e._size,a=t._id.charAt(0);if(t._categories||(t._categories=[]),t._categoriesMap||(t._categoriesMap={}),t.overlaying){var o=g.getFromId({_fullLayout:e},t.overlaying);t.domain=o.domain}var i=r&&t._r?\"_r\":\"range\",s=t.calendar;t.cleanRange(i);var c=t.r2l(t[i][0],s),u=t.r2l(t[i][1],s);if(\"y\"===a?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c),!isFinite(t._m)||!isFinite(t._b))throw l.notifier(\"Something went wrong with axis scaling\",\"long\"),e._replotting=!1,new Error(\"axis scaling\")},t.makeCalcdata=function(e,r){var n,a,o,i=\"date\"===t.type&&e[r+\"calendar\"];if(r in e)for(n=e[r],a=new Array(n.length),o=0;o<n.length;o++)a[o]=t.d2c(n[o],0,i);else{var l=r+\"0\"in e?t.d2c(e[r+\"0\"],0,i):0,s=e[\"d\"+r]?Number(e[\"d\"+r]):1;for(n=e[{x:\"y\",y:\"x\"}[r]],a=new Array(n.length),o=0;o<n.length;o++)a[o]=l+o*s}return a},t.isValidRange=function(e){return Array.isArray(e)&&2===e.length&&i(t.r2l(e[0]))&&i(t.r2l(e[1]))},t._min=[],t._max=[],t._separators=e.separators,delete t._minDtick,delete t._forceTick0}},{\"../../constants/numerical\":122,\"../../lib\":136,\"./axis_ids\":174,\"./constants\":176,d3:7,\"fast-isnumeric\":10}],189:[function(t,e,r){\"use strict\";function n(t){var e=[\"showexponent\",\"showtickprefix\",\"showticksuffix\"],r=e.filter(function(e){return void 0!==t[e]}),n=function(e){return t[e]===t[r[0]]};if(r.every(n)||1===r.length)return t[r[0]]}var a=t(\"../../lib\");e.exports=function(t,e,r,o,i){var l=n(t);if(r(\"tickprefix\")&&r(\"showtickprefix\",l),r(\"ticksuffix\")&&r(\"showticksuffix\",l),r(\"showticklabels\")){var s=i.font||{},c=e.color===t.color?e.color:s.color;a.coerceFont(r,\"tickfont\",{family:s.family,size:s.size,color:c}),r(\"tickangle\"),\"category\"!==o&&(r(\"tickformat\")||\"date\"===o||(r(\"showexponent\",l),r(\"exponentformat\"),r(\"separatethousands\")))}\"category\"===o||i.noHover||r(\"hoverformat\")}},{\"../../lib\":136}],190:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./layout_attributes\");e.exports=function(t,e,r,o){var i=n.coerce2(t,e,a,\"ticklen\"),l=n.coerce2(t,e,a,\"tickwidth\"),s=n.coerce2(t,e,a,\"tickcolor\",e.color);r(\"ticks\",o.outerTicks||i||l||s?\"outside\":\"\")||(delete e.ticklen,delete e.tickwidth,delete e.tickcolor)}},{\"../../lib\":136,\"./layout_attributes\":182}],191:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../../constants/numerical\").ONEDAY;e.exports=function(t,e,r,i){var l=\"auto\";\"array\"!==t.tickmode||\"log\"!==i&&\"date\"!==i||(t.tickmode=\"auto\"),Array.isArray(t.tickvals)?l=\"array\":t.dtick&&(l=\"linear\");var s=r(\"tickmode\",l);if(\"auto\"===s)r(\"nticks\");else if(\"linear\"===s){var c=\"date\"===i?o:1,u=r(\"dtick\",c);if(n(u))e.dtick=u>0?Number(u):c;else if(\"string\"!=typeof u)e.dtick=c;else{var f=u.charAt(0),d=u.substr(1);d=n(d)?Number(d):0,(d<=0||!(\"date\"===i&&\"M\"===f&&d===Math.round(d)||\"log\"===i&&\"L\"===f||\"log\"===i&&\"D\"===f&&(1===d||2===d)))&&(e.dtick=c)}var h=\"date\"===i?a.dateTick0(e.calendar):0,p=r(\"tick0\",h);\"date\"===i?e.tick0=a.cleanDate(p,h):n(p)&&\"D1\"!==u&&\"D2\"!==u?e.tick0=Number(p):e.tick0=h}else{var g=r(\"tickvals\");void 0===g?e.tickmode=\"auto\":r(\"ticktext\")}}},{\"../../constants/numerical\":122,\"../../lib\":136,\"fast-isnumeric\":10}],192:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../plotly\"),o=t(\"../../registry\"),i=t(\"../../components/drawing\"),l=t(\"./axes\"),s=/((x|y)([2-9]|[1-9][0-9]+)?)axis$/;e.exports=function(t,e,r,c){function u(e,r){function n(e,r){for(a=0;a<e.length;a++){var n=e[a];i.indexOf(n.xref)===-1&&i.indexOf(n.yref)===-1||r(t,a)}}var a,i=[];for(i=[e._id,r._id],a=0;a<i.length;a++)l.doTicks(t,i[a],!0);n(v.annotations||[],o.getComponentMethod(\"annotations\",\"drawOne\")),n(v.shapes||[],o.getComponentMethod(\"shapes\",\"drawOne\")),n(v.images||[],o.getComponentMethod(\"images\",\"draw\"))}function f(t){var e=t.xaxis,r=t.yaxis;v._defs.selectAll(\"#\"+t.clipId).call(i.setTranslate,0,0).call(i.setScale,1,1),t.plot.call(i.setTranslate,e._offset,r._offset).call(i.setScale,1,1).select(\".scatterlayer\").selectAll(\".points\").selectAll(\".point\").call(i.setPointGroupScale,1,1),t.plot.select(\".scatterlayer\").selectAll(\".points\").selectAll(\".textpoint\").call(i.setTextPointsScale,1,1)}function d(e,r){var n,a,o,l=y[e.xaxis._id],s=y[e.yaxis._id],c=[];if(l){n=t._fullLayout[l.axisName],a=n._r,o=l.to,c[0]=(a[0]*(1-r)+r*o[0]-a[0])/(a[1]-a[0])*e.xaxis._length;var f=a[1]-a[0],d=o[1]-o[0];n.range[0]=a[0]*(1-r)+r*o[0],n.range[1]=a[1]*(1-r)+r*o[1],c[2]=e.xaxis._length*(1-r+r*d/f)}else c[0]=0,c[2]=e.xaxis._length;if(s){n=t._fullLayout[s.axisName],a=n._r,o=s.to,c[1]=(a[1]*(1-r)+r*o[1]-a[1])/(a[0]-a[1])*e.yaxis._length;var h=a[1]-a[0],p=o[1]-o[0];n.range[0]=a[0]*(1-r)+r*o[0],n.range[1]=a[1]*(1-r)+r*o[1],c[3]=e.yaxis._length*(1-r+r*p/h)}else c[1]=0,c[3]=e.yaxis._length;u(e.xaxis,e.yaxis);var g=e.xaxis,m=e.yaxis,x=!!l,b=!!s,_=x?g._length/c[2]:1,w=b?m._length/c[3]:1,k=x?c[0]:0,M=b?c[1]:0,A=x?c[0]/c[2]*g._length:0,T=b?c[1]/c[3]*m._length:0,L=g._offset-A,C=m._offset-T;v._defs.selectAll(\"#\"+e.clipId).call(i.setTranslate,k,M).call(i.setScale,1/_,1/w),e.plot.call(i.setTranslate,L,C).call(i.setScale,_,w).selectAll(\".points\").selectAll(\".point\").call(i.setPointGroupScale,1/_,1/w),e.plot.selectAll(\".points\").selectAll(\".textpoint\").call(i.setTextPointsScale,1/_,1/w)}function h(){for(var e={},r=0;r<x.length;r++){var n=t._fullLayout[y[x[r]].axisName],o=y[x[r]].to;e[n._name+\".range[0]\"]=o[0],e[n._name+\".range[1]\"]=o[1],n.range=o.slice()}return _&&_(),a.relayout(t,e).then(function(){for(var t=0;t<b.length;t++)f(b[t])})}function p(){for(var e={},r=0;r<x.length;r++){var n=t._fullLayout[x[r]+\"axis\"];e[n._name+\".range[0]\"]=n.range[0],e[n._name+\".range[1]\"]=n.range[1],n.range=n._r.slice()}\n",
|
|
"return a.relayout(t,e).then(function(){for(var t=0;t<b.length;t++)f(b[t])})}function g(){k=Date.now();for(var t=Math.min(1,(k-w)/r.duration),e=A(t),n=0;n<b.length;n++)d(b[n],e);k-w>r.duration?(h(),M=window.cancelAnimationFrame(g)):M=window.requestAnimationFrame(g)}var v=t._fullLayout,m=[],y=function(t){var e,r,n,a,o,i={};for(e in t)if(r=e.split(\".\"),n=r[0].match(s)){var l=n[1],c=l+\"axis\";if(a=v[c],o={},Array.isArray(t[e])?o.to=t[e].slice(0):Array.isArray(t[e].range)&&(o.to=t[e].range.slice(0)),!o.to)continue;o.axisName=c,o.length=a._length,m.push(l),i[l]=o}return i}(e),x=Object.keys(y),b=function(t,e,r){var n,a,o,i=t._plots,l=[];for(n in i){var s=i[n];if(l.indexOf(s)===-1){var c=s.xaxis._id,u=s.yaxis._id,f=s.xaxis.range,d=s.yaxis.range;s.xaxis._r=s.xaxis.range.slice(),s.yaxis._r=s.yaxis.range.slice(),a=r[c]?r[c].to:f,o=r[u]?r[u].to:d,f[0]===a[0]&&f[1]===a[1]&&d[0]===o[0]&&d[1]===o[1]||e.indexOf(c)===-1&&e.indexOf(u)===-1||l.push(s)}}return l}(v,x,y);if(!b.length)return!1;var _;c&&(_=c());var w,k,M,A=n.ease(r.easing);return t._transitionData._interruptCallbacks.push(function(){return window.cancelAnimationFrame(M),M=null,p()}),w=Date.now(),M=window.requestAnimationFrame(g),Promise.resolve()}},{\"../../components/drawing\":49,\"../../plotly\":166,\"../../registry\":206,\"./axes\":171,d3:7}],193:[function(t,e,r){\"use strict\";function n(t,e){if(\"-\"===t.type){var r=t._id,n=r.charAt(0);r.indexOf(\"scene\")!==-1&&(r=n);var c=a(e,r,n);if(c){if(\"histogram\"===c.type&&n==={v:\"y\",h:\"x\"}[c.orientation||\"v\"])return void(t.type=\"linear\");var u=n+\"calendar\",f=c[u];if(i(c,n)){for(var d,h=o(c),p=[],g=0;g<e.length;g++)d=e[g],l.traceIs(d,\"box\")&&(d[n+\"axis\"]||n)===r&&(void 0!==d[h]?p.push(d[h][0]):void 0!==d.name?p.push(d.name):p.push(\"text\"),d[u]!==f&&(f=void 0));t.type=s(p,f)}else t.type=s(c[n]||[c[n+\"0\"]],f)}}}function a(t,e,r){for(var n=0;n<t.length;n++){var a=t[n];if((a[r+\"axis\"]||r)===e){if(i(a,r))return a;if((a[r]||[]).length||a[r+\"0\"])return a}}}function o(t){return{v:\"x\",h:\"y\"}[t.orientation||\"v\"]}function i(t,e){var r=o(t),n=l.traceIs(t,\"box\"),a=l.traceIs(t._fullInput||{},\"candlestick\");return n&&!a&&e===r&&void 0===t[r]&&void 0===t[r+\"0\"]}var l=t(\"../../registry\"),s=t(\"./axis_autotype\"),c=t(\"./axis_ids\").name2id;e.exports=function(t,e,r,a,o){o&&(e._name=o,e._id=c(o)),\"-\"===r(\"type\")&&(n(e,a),\"-\"===e.type?e.type=\"linear\":t.type=e.type)}},{\"../../registry\":206,\"./axis_autotype\":172,\"./axis_ids\":174}],194:[function(t,e,r){\"use strict\";function n(t,e,r){var n,a,o,i=!1;if(\"data\"===e.type)n=t._fullData[null!==e.traces?e.traces[0]:0];else{if(\"layout\"!==e.type)return!1;n=t._fullLayout}return a=c.nestedProperty(n,e.prop).get(),o=r[e.type]=r[e.type]||{},o.hasOwnProperty(e.prop)&&o[e.prop]!==a&&(i=!0),o[e.prop]=a,{changed:i,value:a}}function a(t,e){return Array.isArray(e[0])&&1===e[0].length&&[\"string\",\"number\"].indexOf(typeof e[0][0])!==-1?[{type:\"layout\",prop:\"_currentFrame\",value:e[0][0].toString()}]:[]}function o(t,e){var r=[],n=e[0],a={};if(\"string\"==typeof n)a[n]=e[1];else{if(!c.isPlainObject(n))return r;a=n}return l(a,function(t,e,n){r.push({type:\"layout\",prop:t,value:n})},\"\",0),r}function i(t,e){var r,n,a,o,i=[];if(n=e[0],a=e[1],r=e[2],o={},\"string\"==typeof n)o[n]=a;else{if(!c.isPlainObject(n))return i;o=n,void 0===r&&(r=a)}return void 0===r&&(r=null),l(o,function(e,n,a){var o;if(Array.isArray(a)){var l=Math.min(a.length,t.data.length);r&&(l=Math.min(l,r.length)),o=[];for(var s=0;s<l;s++)o[s]=r?r[s]:s}else o=r?r.slice(0):null;if(null===o)Array.isArray(a)&&(a=a[0]);else if(Array.isArray(o)){if(!Array.isArray(a)){var c=a;a=[];for(var u=0;u<o.length;u++)a[u]=c}a.length=Math.min(o.length,a.length)}i.push({type:\"data\",prop:e,traces:o,value:a})},\"\",0),i}function l(t,e,r,n){Object.keys(t).forEach(function(a){var o=t[a];if(\"_\"!==a[0]){var i=r+(n>0?\".\":\"\")+a;c.isPlainObject(o)?l(o,e,i,n+1):e(i,a,o)}})}var s=t(\"../plotly\"),c=t(\"../lib\");r.manageCommandObserver=function(t,e,a,o){var i={},l=!0;e&&e._commandObserver&&(i=e._commandObserver),i.cache||(i.cache={}),i.lookupTable={};var s=r.hasSimpleAPICommandBindings(t,a,i.lookupTable);if(e&&e._commandObserver){if(s)return i;if(e._commandObserver.remove)return e._commandObserver.remove(),e._commandObserver=null,i}if(s){n(t,s,i.cache),i.check=function(){if(l){var e=n(t,s,i.cache);return e.changed&&o&&void 0!==i.lookupTable[e.value]&&(i.disable(),Promise.resolve(o({value:e.value,type:s.type,prop:s.prop,traces:s.traces,index:i.lookupTable[e.value]})).then(i.enable,i.enable)),e.changed}};for(var u=[\"plotly_relayout\",\"plotly_redraw\",\"plotly_restyle\",\"plotly_update\",\"plotly_animatingframe\",\"plotly_afterplot\"],f=0;f<u.length;f++)t._internalOn(u[f],i.check);i.remove=function(){for(var e=0;e<u.length;e++)t._removeInternalListener(u[e],i.check)}}else c.warn(\"Unable to automatically bind plot updates to API command\"),i.lookupTable={},i.remove=function(){};return i.disable=function(){l=!1},i.enable=function(){l=!0},e&&(e._commandObserver=i),i},r.hasSimpleAPICommandBindings=function(t,e,n){var a,o,i=e.length;for(a=0;a<i;a++){var l,s=e[a],c=s.method,u=s.args;if(Array.isArray(u)||(u=[]),!c)return!1;var f=r.computeAPICommandBindings(t,c,u);if(1!==f.length)return!1;if(o){if(l=f[0],l.type!==o.type)return!1;if(l.prop!==o.prop)return!1;if(Array.isArray(o.traces)){if(!Array.isArray(l.traces))return!1;l.traces.sort();for(var d=0;d<o.traces.length;d++)if(o.traces[d]!==l.traces[d])return!1}else if(l.prop!==o.prop)return!1}else o=f[0],Array.isArray(o.traces)&&o.traces.sort();l=f[0];var h=l.value;if(Array.isArray(h)){if(1!==h.length)return!1;h=h[0]}n&&(n[h]=a)}return o},r.executeAPICommand=function(t,e,r){var n=s[e],a=[t];Array.isArray(r)||(r=[]);for(var o=0;o<r.length;o++)a.push(r[o]);return n.apply(null,a).catch(function(t){return c.warn(\"API call to Plotly.\"+e+\" rejected.\",t),Promise.reject(t)})},r.computeAPICommandBindings=function(t,e,r){var n;switch(Array.isArray(r)||(r=[]),e){case\"restyle\":n=i(t,r);break;case\"relayout\":n=o(t,r);break;case\"update\":n=i(t,[r[0],r[2]]).concat(o(t,[r[1]]));break;case\"animate\":n=a(t,r);break;default:n=[]}return n}},{\"../lib\":136,\"../plotly\":166}],195:[function(t,e,r){\"use strict\";e.exports={family:{valType:\"string\",noBlank:!0,strict:!0},size:{valType:\"number\",min:1},color:{valType:\"color\"}}},{}],196:[function(t,e,r){\"use strict\";e.exports={_isLinkedToArray:\"frames_entry\",group:{valType:\"string\"},name:{valType:\"string\"},traces:{valType:\"any\"},baseframe:{valType:\"string\"},data:{valType:\"any\"},layout:{valType:\"any\"}}},{}],197:[function(t,e,r){\"use strict\";var n=t(\"../lib\"),a=n.extendFlat,o=t(\"./font_attributes\"),i=t(\"../components/color/attributes\");e.exports={font:{family:a({},o.family,{dflt:'\"Open Sans\", verdana, arial, sans-serif'}),size:a({},o.size,{dflt:12}),color:a({},o.color,{dflt:i.defaultLine})},title:{valType:\"string\",dflt:\"Click to enter Plot title\"},titlefont:a({},o,{}),autosize:{valType:\"boolean\",dflt:!1},width:{valType:\"number\",min:10,dflt:700},height:{valType:\"number\",min:10,dflt:450},margin:{l:{valType:\"number\",min:0,dflt:80},r:{valType:\"number\",min:0,dflt:80},t:{valType:\"number\",min:0,dflt:100},b:{valType:\"number\",min:0,dflt:80},pad:{valType:\"number\",min:0,dflt:0},autoexpand:{valType:\"boolean\",dflt:!0}},paper_bgcolor:{valType:\"color\",dflt:i.background},plot_bgcolor:{valType:\"color\",dflt:i.background},separators:{valType:\"string\",dflt:\".,\"},hidesources:{valType:\"boolean\",dflt:!1},smith:{valType:\"enumerated\",values:[!1],dflt:!1},showlegend:{valType:\"boolean\"}}},{\"../components/color/attributes\":24,\"../lib\":136,\"./font_attributes\":195}],198:[function(t,e,r){\"use strict\";e.exports={t:{valType:\"number\",dflt:0},r:{valType:\"number\",dflt:0},b:{valType:\"number\",dflt:0},l:{valType:\"number\",dflt:0}}},{}],199:[function(t,e,r){\"use strict\";function n(t,e){e.text(\"\");var r=e.append(\"a\").attr({\"xlink:xlink:href\":\"#\",class:\"link--impt link--embedview\",\"font-weight\":\"bold\"}).text(t._context.linkText+\" \"+String.fromCharCode(187));if(t._context.sendData)r.on(\"click\",function(){p.sendDataToCloud(t)});else{var n=window.location.pathname.split(\"/\"),a=window.location.search;r.attr({\"xlink:xlink:show\":\"new\",\"xlink:xlink:href\":\"/\"+n[2].split(\".\")[0]+\"/\"+n[1]+a})}}function a(t,e,r,n){for(var a=t.transforms,o=[t],i=0;i<a.length;i++){var l=a[i],s=x[l.type];s&&s.transform&&(o=s.transform(o,{transform:l,fullTrace:t,fullData:e,layout:r,fullLayout:n,transformIndex:i}))}return o}function o(t){var e,r={left:0,right:0,bottom:0,top:0};if(t)for(e in t)t.hasOwnProperty(e)&&(r.left+=t[e].left||0,r.right+=t[e].right||0,r.bottom+=t[e].bottom||0,r.top+=t[e].top||0);return r}function i(t){for(var e=!1,r=0;r<t.length;r++){t[r]._categories=t[r]._initialCategories.slice(),t[r]._categoriesMap={};for(var n=0;n<t[r]._categories.length;n++)t[r]._categoriesMap[t[r]._categories[n]]=n;\"category\"===t[r].type&&(e=!0)}return e}var l=t(\"d3\"),s=t(\"fast-isnumeric\"),c=t(\"../plotly\"),u=t(\"../registry\"),f=t(\"../lib\"),d=t(\"../components/color\"),h=t(\"../constants/numerical\").BADNUM,p=e.exports={},g=t(\"./animation_attributes\"),v=t(\"./frame_attributes\"),m=f.relinkPrivateKeys;f.extendFlat(p,u),p.attributes=t(\"./attributes\"),p.attributes.type.values=p.allTypes,p.fontAttrs=t(\"./font_attributes\"),p.layoutAttributes=t(\"./layout_attributes\"),p.fontWeight=\"normal\";var y=p.subplotsRegistry,x=p.transformsRegistry,b=t(\"../components/errorbars\"),_=t(\"./command\");p.executeAPICommand=_.executeAPICommand,p.computeAPICommandBindings=_.computeAPICommandBindings,p.manageCommandObserver=_.manageCommandObserver,p.hasSimpleAPICommandBindings=_.hasSimpleAPICommandBindings,p.findSubplotIds=function(t,e){var r=[];if(!p.subplotsRegistry[e])return r;for(var n=p.subplotsRegistry[e].attr,a=0;a<t.length;a++){var o=t[a];p.traceIs(o,e)&&r.indexOf(o[n])===-1&&r.push(o[n])}return r},p.getSubplotIds=function(t,e){var r=p.subplotsRegistry[e];if(!r)return[];if(!(\"cartesian\"!==e||t._has&&t._has(\"cartesian\")))return[];if(!(\"gl2d\"!==e||t._has&&t._has(\"gl2d\")))return[];if(\"cartesian\"===e||\"gl2d\"===e)return Object.keys(t._plots||{});for(var n=r.idRegex,a=Object.keys(t),o=[],i=0;i<a.length;i++){var l=a[i];n.test(l)&&o.push(l)}var s=r.idRoot.length;return o.sort(function(t,e){return+(t.substr(s)||1)-+(e.substr(s)||1)}),o},p.getSubplotData=function(t,e,r){if(!p.subplotsRegistry[e])return[];for(var n,a=p.subplotsRegistry[e].attr,o=[],i=0;i<t.length;i++)if(n=t[i],\"gl2d\"===e&&p.traceIs(n,\"gl2d\")){var l=c.Axes.subplotMatch,s=\"x\"+r.match(l)[1],u=\"y\"+r.match(l)[2];n[a[0]]===s&&n[a[1]]===u&&o.push(n)}else n[a]===r&&o.push(n);return o},p.getSubplotCalcData=function(t,e,r){if(!p.subplotsRegistry[e])return[];for(var n=p.subplotsRegistry[e].attr,a=[],o=0;o<t.length;o++){var i=t[o];i[0].trace[n]===r&&a.push(i)}return a},p.redrawText=function(t){if(!(t.data&&t.data[0]&&t.data[0].r))return new Promise(function(e){setTimeout(function(){u.getComponentMethod(\"annotations\",\"draw\")(t),u.getComponentMethod(\"legend\",\"draw\")(t),(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()}),e(p.previousPromises(t))},300)})},p.resize=function(t){return new Promise(function(e,r){t&&\"none\"!==l.select(t).style(\"display\")||r(new Error(\"Resize must be passed a plot div element.\")),t._redrawTimer&&clearTimeout(t._redrawTimer),t._redrawTimer=setTimeout(function(){if(t.layout.width&&t.layout.height)return void e(t);delete t.layout.width,delete t.layout.height;var r=t.changed;t.autoplay=!0,c.relayout(t,{autosize:!0}).then(function(){t.changed=r,e(t)})},100)})},p.previousPromises=function(t){if((t._promises||[]).length)return Promise.all(t._promises).then(function(){t._promises=[]})},p.addLinks=function(t){if(t._context.showLink||t._context.showSources){var e=t._fullLayout,r=e._paper.selectAll(\"text.js-plot-link-container\").data([0]);r.enter().append(\"text\").classed(\"js-plot-link-container\",!0).style({\"font-family\":'\"Open Sans\", Arial, sans-serif',\"font-size\":\"12px\",fill:d.defaultLine,\"pointer-events\":\"all\"}).each(function(){var t=l.select(this);t.append(\"tspan\").classed(\"js-link-to-tool\",!0),t.append(\"tspan\").classed(\"js-link-spacer\",!0),t.append(\"tspan\").classed(\"js-sourcelinks\",!0)});var a=r.node(),o={y:e._paper.attr(\"height\")-9};document.body.contains(a)&&a.getComputedTextLength()>=e.width-20?(o[\"text-anchor\"]=\"start\",o.x=5):(o[\"text-anchor\"]=\"end\",o.x=e._paper.attr(\"width\")-7),r.attr(o);var i=r.select(\".js-link-to-tool\"),s=r.select(\".js-link-spacer\"),c=r.select(\".js-sourcelinks\");t._context.showSources&&t._context.showSources(t),t._context.showLink&&n(t,i),s.text(i.text()&&c.text()?\" - \":\"\")}},p.sendDataToCloud=function(t){t.emit(\"plotly_beforeexport\");var e=window.PLOTLYENV&&window.PLOTLYENV.BASE_URL||\"https://plot.ly\",r=l.select(t).append(\"div\").attr(\"id\",\"hiddenform\").style(\"display\",\"none\"),n=r.append(\"form\").attr({action:e+\"/external\",method:\"post\",target:\"_blank\"});return n.append(\"input\").attr({type:\"text\",name:\"data\"}).node().value=p.graphJson(t,!1,\"keepdata\"),n.node().submit(),r.remove(),t.emit(\"plotly_afterexport\"),!1},p.supplyDefaults=function(t){var e,r=t._fullLayout||{},n=t._fullLayout={},a=t.layout||{},o=t._fullData||[],i=t._fullData=[],l=t.data||[];if(t._transitionData||p.createTransitionData(t),r._initialAutoSizeIsDone){var s=r.width,u=r.height;p.supplyLayoutGlobalDefaults(a,n),a.width||(n.width=s),a.height||(n.height=u)}else{p.supplyLayoutGlobalDefaults(a,n);var f=!a.width||!a.height,d=n.autosize,h=t._context&&t._context.autosizable;f&&(d||h)?p.plotAutoSize(t,a,n):f&&p.sanitizeMargins(t),!d&&f&&(a.width=n.width,a.height=n.height)}n._initialAutoSizeIsDone=!0,n._dataLength=l.length,n._globalTransforms=(t._context||{}).globalTransforms,p.supplyDataDefaults(l,i,a,n),n._has=p._hasPlotType.bind(n);var g=n._modules;for(e=0;e<g.length;e++){var v=g[e];v.cleanData&&v.cleanData(i)}if(o.length===l.length)for(e=0;e<i.length;e++)m(i[e],o[e]);p.supplyLayoutModuleDefaults(a,n,i,t._transitionData),n._hasCartesian=n._has(\"cartesian\"),n._hasGeo=n._has(\"geo\"),n._hasGL3D=n._has(\"gl3d\"),n._hasGL2D=n._has(\"gl2d\"),n._hasTernary=n._has(\"ternary\"),n._hasPie=n._has(\"pie\"),p.cleanPlot(i,n,o,r),p.linkSubplots(i,n,o,r),m(n,r),p.doAutoMargin(t);var y=c.Axes.list(t);for(e=0;e<y.length;e++){y[e].setScale()}if((t.calcdata||[]).length===i.length)for(e=0;e<i.length;e++){var x=i[e];(t.calcdata[e][0]||{}).trace=x}},p.createTransitionData=function(t){t._transitionData||(t._transitionData={}),t._transitionData._frames||(t._transitionData._frames=[]),t._transitionData._frameHash||(t._transitionData._frameHash={}),t._transitionData._counter||(t._transitionData._counter=0),t._transitionData._interruptCallbacks||(t._transitionData._interruptCallbacks=[])},p._hasPlotType=function(t){for(var e=this._basePlotModules||[],r=0;r<e.length;r++){if(e[r].name===t)return!0}return!1},p.cleanPlot=function(t,e,r,n){var a,o,i=n._basePlotModules||[];for(a=0;a<i.length;a++){var l=i[a];l.clean&&l.clean(t,e,r,n)}var s=!!n._paper,c=!!n._infolayer;t:for(a=0;a<r.length;a++){var u=r[a],f=u.uid;for(o=0;o<t.length;o++){var d=t[o];if(f===d.uid)continue t}var h=\".hm\"+f+\",.contour\"+f+\",.carpet\"+f+\",#clip\"+f+\",.trace\"+f;s&&n._paper.selectAll(h).remove(),c&&(n._infolayer.selectAll(\".cb\"+f).remove(),n._infolayer.selectAll(\"g.rangeslider-container\").selectAll(h).remove())}},p.linkSubplots=function(t,e,r,n){for(var a=n._plots||{},o=e._plots={},i={_fullData:t,_fullLayout:e},l=c.Axes.getSubplots(i),s=0;s<l.length;s++){var u,f=l[s],d=a[f];d?(u=o[f]=d,u._scene2d&&u._scene2d.updateRefs(e)):(u=o[f]={},u.id=f),u.xaxis=c.Axes.getFromId(i,f,\"x\"),u.yaxis=c.Axes.getFromId(i,f,\"y\")}},p.supplyDataDefaults=function(t,e,r,n){function o(t){e.push(t);var r=t._module;r&&(f.pushUnique(c,r),f.pushUnique(d,t._module.basePlotModule),h++)}var i,l,s,c=n._modules=[],d=n._basePlotModules=[],h=0;n._transformModules=[];var g={},v=[];for(i=0;i<t.length;i++){if(s=t[i],l=p.supplyTraceDefaults(s,h,n,i),l.index=i,l._input=s,l._expandedIndex=h,l.transforms&&l.transforms.length)for(var m=a(l,e,r,n),y=0;y<m.length;y++){var x=m[y],b=p.supplyTraceDefaults(x,h,n,i);x.uid=b.uid=l.uid+y,b.index=i,b._input=s,b._fullInput=l,b._expandedIndex=h,b._expandedInput=x,o(b)}else l._fullInput=l,l._expandedInput=l,o(l);u.traceIs(l,\"carpetAxis\")&&(g[l.carpet]=l),u.traceIs(l,\"carpetDependent\")&&v.push(i)}for(i=0;i<v.length;i++)if(l=e[v[i]],l.visible){var _=g[l.carpet];l._carpet=_,_&&_.visible?(l.xaxis=_.xaxis,l.yaxis=_.yaxis):l.visible=!1}},p.supplyAnimationDefaults=function(t){function e(e,r){return f.coerce(t||{},n,g,e,r)}t=t||{};var r,n={};if(e(\"mode\"),e(\"direction\"),e(\"fromcurrent\"),Array.isArray(t.frame))for(n.frame=[],r=0;r<t.frame.length;r++)n.frame[r]=p.supplyAnimationFrameDefaults(t.frame[r]||{});else n.frame=p.supplyAnimationFrameDefaults(t.frame||{});if(Array.isArray(t.transition))for(n.transition=[],r=0;r<t.transition.length;r++)n.transition[r]=p.supplyAnimationTransitionDefaults(t.transition[r]||{});else n.transition=p.supplyAnimationTransitionDefaults(t.transition||{});return n},p.supplyAnimationFrameDefaults=function(t){function e(e,n){return f.coerce(t||{},r,g.frame,e,n)}var r={};return e(\"duration\"),e(\"redraw\"),r},p.supplyAnimationTransitionDefaults=function(t){function e(e,n){return f.coerce(t||{},r,g.transition,e,n)}var r={};return e(\"duration\"),e(\"easing\"),r},p.supplyFrameDefaults=function(t){function e(e,n){return f.coerce(t,r,v,e,n)}var r={};return e(\"group\"),e(\"name\"),e(\"traces\"),e(\"baseframe\"),e(\"data\"),e(\"layout\"),r},p.supplyTraceDefaults=function(t,e,r,n){function a(e,r){return f.coerce(t,i,p.attributes,e,r)}function o(e,r){if(p.traceIs(i,e))return f.coerce(t,i,p.subplotsRegistry[e].attributes,r)}var i={},l=d.defaults[e%d.defaults.length],s=a(\"visible\");a(\"type\"),a(\"uid\"),a(\"name\",\"trace \"+n);for(var c=Object.keys(y),h=0;h<c.length;h++){var g=c[h];if([\"cartesian\",\"gl2d\"].indexOf(g)===-1){var v=y[g].attr;v&&o(g,v)}}if(s){var m=p.getModule(i);i._module=m,a(\"hoverinfo\",1===r._dataLength?\"x+y+z+text\":void 0),p.traceIs(i,\"showLegend\")&&(a(\"showlegend\"),a(\"legendgroup\")),u.getComponentMethod(\"fx\",\"supplyDefaults\")(t,i,l,r),m&&m.supplyDefaults(t,i,l,r),p.traceIs(i,\"noOpacity\")||a(\"opacity\"),o(\"cartesian\",\"xaxis\"),o(\"cartesian\",\"yaxis\"),o(\"gl2d\",\"xaxis\"),o(\"gl2d\",\"yaxis\"),p.traceIs(i,\"notLegendIsolatable\")&&(i.visible=!!i.visible),p.supplyTransformDefaults(t,i,r)}return i},p.supplyTransformDefaults=function(t,e,r){var n=r._globalTransforms||[],a=r._transformModules||[];if(Array.isArray(t.transforms)||0!==n.length)for(var o=t.transforms||[],i=n.concat(o),l=e.transforms=[],s=0;s<i.length;s++){var c,u=i[s],d=u.type,h=x[d];h||f.warn(\"Unrecognized transform type \"+d+\".\"),h&&h.supplyDefaults?(c=h.supplyDefaults(u,e,r,t),c.type=d,c._module=h,f.pushUnique(a,h)):c=f.extendFlat({},u),l.push(c)}},p.supplyLayoutGlobalDefaults=function(t,e){function r(r,n){return f.coerce(t,e,p.layoutAttributes,r,n)}var n=f.coerceFont(r,\"font\");r(\"title\"),f.coerceFont(r,\"titlefont\",{family:n.family,size:Math.round(1.4*n.size),color:n.color}),r(\"autosize\",!(t.width&&t.height)),r(\"width\"),r(\"height\"),r(\"margin.l\"),r(\"margin.r\"),r(\"margin.t\"),r(\"margin.b\"),r(\"margin.pad\"),r(\"margin.autoexpand\"),t.width&&t.height&&p.sanitizeMargins(e),r(\"paper_bgcolor\"),r(\"separators\"),r(\"hidesources\"),r(\"smith\"),u.getComponentMethod(\"calendars\",\"handleDefaults\")(t,e,\"calendar\"),u.getComponentMethod(\"fx\",\"supplyLayoutGlobalDefaults\")(t,e,r)},p.plotAutoSize=function(t,e,r){var n,a,i=t._context||{},l=i.frameMargins,c=f.isPlotDiv(t);if(c&&t.emit(\"plotly_autosize\"),i.fillFrame)n=window.innerWidth,a=window.innerHeight,document.body.style.overflow=\"hidden\";else if(s(l)&&l>0){var u=o(t._boundingBoxMargins),d=u.left+u.right,h=u.bottom+u.top,g=1-2*l,v=r._container&&r._container.node?r._container.node().getBoundingClientRect():{width:r.width,height:r.height};n=Math.round(g*(v.width-d)),a=Math.round(g*(v.height-h))}else{var m=c?window.getComputedStyle(t):{};n=parseFloat(m.width)||r.width,a=parseFloat(m.height)||r.height}var y=p.layoutAttributes.width.min,x=p.layoutAttributes.height.min;n<y&&(n=y),a<x&&(a=x);var b=!e.width&&Math.abs(r.width-n)>1,_=!e.height&&Math.abs(r.height-a)>1;(_||b)&&(b&&(r.width=n),_&&(r.height=a)),t._initialAutoSize||(t._initialAutoSize={width:n,height:a}),p.sanitizeMargins(r)},p.supplyLayoutModuleDefaults=function(t,e,r,n){var a,o;c.Axes.supplyLayoutDefaults(t,e,r);var i=e._basePlotModules;for(a=0;a<i.length;a++)o=i[a],\"cartesian\"!==o.name&&o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r);var l=e._modules;for(a=0;a<l.length;a++)o=l[a],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r);var s=e._transformModules;for(a=0;a<s.length;a++)o=s[a],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r,n);var f=Object.keys(u.componentsRegistry);for(a=0;a<f.length;a++)o=u.componentsRegistry[f[a]],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r)},p.purge=function(t){var e=t._fullLayout||{};void 0!==e._glcontainer&&e._glcontainer.remove(),void 0!==e._geocontainer&&e._geocontainer.remove(),e._modeBar&&e._modeBar.destroy(),t._transitionData&&(t._transitionData._interruptCallbacks&&(t._transitionData._interruptCallbacks.length=0),t._transitionData._animationRaf&&window.cancelAnimationFrame(t._transitionData._animationRaf)),delete t.data,delete t.layout,delete t._fullData,delete t._fullLayout,delete t.calcdata,delete t.framework,delete t.empty,delete t.fid,delete t.undoqueue,delete t.undonum,delete t.autoplay,delete t.changed,delete t._promises,delete t._redrawTimer,delete t.firstscatter,delete t.hmlumcount,delete t.hmpixcount,delete t.numboxes,delete t._hoverTimer,delete t._lastHoverTime,delete t._transitionData,delete t._transitioning,delete t._initialAutoSize,t.removeAllListeners&&t.removeAllListeners()},p.style=function(t){for(var e=t._fullLayout._modules,r=0;r<e.length;r++){var n=e[r];n.style&&n.style(t)}},p.sanitizeMargins=function(t){if(t&&t.margin){var e,r=t.width,n=t.height,a=t.margin,o=r-(a.l+a.r),i=n-(a.t+a.b);o<0&&(e=(r-1)/(a.l+a.r),a.l=Math.floor(e*a.l),a.r=Math.floor(e*a.r)),i<0&&(e=(n-1)/(a.t+a.b),a.t=Math.floor(e*a.t),a.b=Math.floor(e*a.b))}},p.autoMargin=function(t,e,r){var n=t._fullLayout;if(n._pushmargin||(n._pushmargin={}),n.margin.autoexpand!==!1){if(r){var a=void 0===r.pad?12:r.pad;r.l+r.r>.5*n.width&&(r.l=r.r=0),r.b+r.t>.5*n.height&&(r.b=r.t=0),n._pushmargin[e]={l:{val:r.x,size:r.l+a},r:{val:r.x,size:r.r+a},b:{val:r.y,size:r.b+a},t:{val:r.y,size:r.t+a}}}else delete n._pushmargin[e];n._replotting||p.doAutoMargin(t)}},p.doAutoMargin=function(t){var e=t._fullLayout;e._size||(e._size={}),e._pushmargin||(e._pushmargin={});var r=e._size,n=JSON.stringify(r),a=Math.max(e.margin.l||0,0),o=Math.max(e.margin.r||0,0),i=Math.max(e.margin.t||0,0),l=Math.max(e.margin.b||0,0),u=e._pushmargin;if(e.margin.autoexpand!==!1){u.base={l:{val:0,size:a},r:{val:1,size:o},t:{val:1,size:i},b:{val:0,size:l}};for(var f=Object.keys(u),d=0;d<f.length;d++)for(var h=f[d],p=u[h].l||{},g=u[h].b||{},v=p.val,m=p.size,y=g.val,x=g.size,b=0;b<f.length;b++){var _=f[b];if(s(m)&&u[_].r){var w=u[_].r.val,k=u[_].r.size;if(w>v){var M=(m*w+(k-e.width)*v)/(w-v),A=(k*(1-v)+(m-e.width)*(1-w))/(w-v);M>=0&&A>=0&&M+A>a+o&&(a=M,o=A)}}if(s(x)&&u[_].t){var T=u[_].t.val,L=u[_].t.size;if(T>y){var C=(x*T+(L-e.height)*y)/(T-y),S=(L*(1-y)+(x-e.height)*(1-T))/(T-y);C>=0&&S>=0&&C+S>l+i&&(l=C,i=S)}}}}if(r.l=Math.round(a),r.r=Math.round(o),r.t=Math.round(i),r.b=Math.round(l),r.p=Math.round(e.margin.pad),r.w=Math.round(e.width)-r.l-r.r,r.h=Math.round(e.height)-r.t-r.b,!e._replotting&&\"{}\"!==n&&n!==JSON.stringify(e._size))return c.plot(t)},p.graphJson=function(t,e,r,n,a){function o(t){if(\"function\"==typeof t)return null;if(f.isPlainObject(t)){var e,n,a={};for(e in t)if(\"function\"!=typeof t[e]&&[\"_\",\"[\"].indexOf(e.charAt(0))===-1){if(\"keepdata\"===r){if(\"src\"===e.substr(e.length-3))continue}else if(\"keepstream\"===r){if(\"string\"==typeof(n=t[e+\"src\"])&&n.indexOf(\":\")>0&&!f.isPlainObject(t.stream))continue}else if(\"keepall\"!==r&&\"string\"==typeof(n=t[e+\"src\"])&&n.indexOf(\":\")>0)continue;a[e]=o(t[e])}return a}return Array.isArray(t)?t.map(o):f.isJSDate(t)?f.ms2DateTimeLocal(+t):t}(a&&e&&!t._fullData||a&&!e&&!t._fullLayout)&&p.supplyDefaults(t);var i=a?t._fullData:t.data,l=a?t._fullLayout:t.layout,s=(t._transitionData||{})._frames,c={data:(i||[]).map(function(t){var r=o(t);return e&&delete r.fit,r})};return e||(c.layout=o(l)),t.framework&&t.framework.isPolar&&(c=t.framework.getConfig()),s&&(c.frames=o(s)),\"object\"===n?c:JSON.stringify(c)},p.modifyFrames=function(t,e){var r,n,a,o=t._transitionData._frames,i=t._transitionData._frameHash;for(r=0;r<e.length;r++)switch(n=e[r],n.type){case\"replace\":a=n.value;var l=(o[n.index]||{}).name,s=a.name;o[n.index]=i[s]=a,s!==l&&(delete i[l],i[s]=a);break;case\"insert\":a=n.value,i[a.name]=a,o.splice(n.index,0,a);break;case\"delete\":a=o[n.index],delete i[a.name],o.splice(n.index,1)}return Promise.resolve()},p.computeFrame=function(t,e){var r,n,a,o,i=t._transitionData._frameHash;if(!e)throw new Error(\"computeFrame must be given a string frame name\");var l=i[e.toString()];if(!l)return!1;for(var s=[l],c=[l.name];l.baseframe&&(l=i[l.baseframe.toString()])&&c.indexOf(l.name)===-1;)s.push(l),c.push(l.name);for(var u={};l=s.pop();)if(l.layout&&(u.layout=p.extendLayout(u.layout,l.layout)),l.data){if(u.data||(u.data=[]),!(n=l.traces))for(n=[],r=0;r<l.data.length;r++)n[r]=r;for(u.traces||(u.traces=[]),r=0;r<l.data.length;r++)void 0!==(a=n[r])&&null!==a&&(o=u.traces.indexOf(a),o===-1&&(o=u.data.length,u.traces[o]=a),u.data[o]=p.extendTrace(u.data[o],l.data[r]))}return u},p.recomputeFrameHash=function(t){for(var e=t._transitionData._frameHash={},r=t._transitionData._frames,n=0;n<r.length;n++){var a=r[n];a&&a.name&&(e[a.name]=a)}},p.extendObjectWithContainers=function(t,e,r){var n,a,o,i,l,s,c,u,d=f.extendDeepNoArrays({},e||{}),h=f.expandObjectPaths(d),g={};if(r&&r.length)for(o=0;o<r.length;o++)n=f.nestedProperty(h,r[o]),a=n.get(),void 0===a?f.nestedProperty(g,r[o]).set(null):(n.set(null),f.nestedProperty(g,r[o]).set(a));if(t=f.extendDeepNoArrays(t||{},h),r&&r.length)for(o=0;o<r.length;o++)if(l=f.nestedProperty(g,r[o]),c=l.get()){for(s=f.nestedProperty(t,r[o]),u=s.get(),Array.isArray(u)||(u=[],s.set(u)),i=0;i<c.length;i++){var v=c[i];u[i]=null===v?null:p.extendObjectWithContainers(u[i],v)}s.set(u)}return t},p.dataArrayContainers=[\"transforms\"],p.layoutArrayContainers=u.layoutArrayContainers,p.extendTrace=function(t,e){return p.extendObjectWithContainers(t,e,p.dataArrayContainers)},p.extendLayout=function(t,e){return p.extendObjectWithContainers(t,e,p.layoutArrayContainers)},p.transition=function(t,e,r,n,a,o){function i(){var n;for(n=0;n<y.length;n++){var a=y[n],o=t._fullData[a],i=o._module;i&&(i.animatable&&x.push(a),t.data[y[n]]=p.extendTrace(t.data[y[n]],e[n]))}var l=f.expandObjectPaths(f.extendDeepNoArrays({},r)),s=/^[xy]axis[0-9]*$/;for(var c in l)s.test(c)&&delete l[c].range;return p.extendLayout(t.layout,l),p.supplyDefaults(t),p.doCalcdata(t),b.calc(t),Promise.resolve()}function l(t){var e=Promise.resolve();if(!t)return e;for(;t.length;)e=e.then(t.shift());return e}function s(t){if(t)for(;t.length;)t.shift()}function u(){return t.emit(\"plotly_transitioning\",[]),new Promise(function(e){function n(){return s++,function(){u++,_||u!==s||d(e)}}t._transitioning=!0,o.duration>0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push(function(){_=!0}),a.redraw&&t._transitionData._interruptCallbacks.push(function(){return c.redraw(t)}),t._transitionData._interruptCallbacks.push(function(){t.emit(\"plotly_transitioninterrupted\",[])});var i,l,s=0,u=0,h=t._fullLayout._basePlotModules,p=!1;if(r)for(l=0;l<h.length;l++)if(h[l].transitionAxes){var g=f.expandObjectPaths(r);p=h[l].transitionAxes(t,g,o,n)||p}for(p?(i=f.extendFlat({},o),i.duration=0):i=o,l=0;l<h.length;l++)h[l].plot(t,x,i,n);setTimeout(n())})}function d(e){if(t._transitionData)return s(t._transitionData._interruptCallbacks),Promise.resolve().then(function(){if(a.redraw)return c.redraw(t)}).then(function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit(\"plotly_transitioned\",[])}).then(e)}function h(){if(t._transitionData)return t._transitioning=!1,l(t._transitionData._interruptCallbacks)}var g,v,m=Array.isArray(e)?e.length:0,y=n.slice(0,m),x=[],_=!1;for(g=0;g<y.length;g++){v=y[g];var w=t._fullData[v],k=w._module;if(k&&!k.animatable){var M={};for(var A in e[g])M[A]=[e[g][A]]}}var T=[p.previousPromises,h,i,p.rehover,u],L=f.syncOrAsync(T,t);return L&&L.then||(L=Promise.resolve()),L.then(function(){return t})},p.doCalcdata=function(t,e){var r,n,a,o,l=c.Axes.list(t),s=t._fullData,f=t._fullLayout,d=new Array(s.length),p=(t.calcdata||[]).slice(0);for(t.calcdata=d,t.firstscatter=!0,t.numboxes=0,t._hmpixcount=0,t._hmlumcount=0,f._piecolormap={},f._piedefaultcolorcount=0,a=0;a<s.length;a++)Array.isArray(e)&&e.indexOf(a)===-1&&(d[a]=p[a]);var g=i(l),v=!1;for(a=0;a<s.length;a++)if(r=s[a],r.visible===!0&&r.transforms)for(n=r._module,n&&n.calc&&n.calc(t,r),o=0;o<r.transforms.length;o++){var m=r.transforms[o];n=x[m.type],n&&n.calcTransform&&(v=!0,n.calcTransform(t,r,m))}if(v){for(a=0;a<l.length;a++)l[a]._min=[],l[a]._max=[],l[a]._categories=[],l[a]._categoriesMap={};i(l)}for(a=0;a<s.length;a++){var y=[];r=s[a],r.visible===!0&&(n=r._module)&&n.calc&&(y=n.calc(t,r)),Array.isArray(y)&&y[0]||(y=[{x:h,y:h}]),y[0].t||(y[0].t={}),y[0].trace=r,d[a]=y}if(u.getComponentMethod(\"fx\",\"calc\")(t),g){var b=[\"annotations\",\"shapes\",\"images\"];for(a=0;a<b.length;a++)u.getComponentMethod(b[a],\"supplyLayoutDefaults\")(t.layout,f,s)}},p.rehover=function(t){t._fullLayout._rehover&&t._fullLayout._rehover()},p.generalUpdatePerTraceModule=function(t,e,r){var n,a=t.traceHash,o={};for(n=0;n<e.length;n++){var i=e[n],l=i[0].trace;l.visible&&(o[l.type]=o[l.type]||[],o[l.type].push(i))}var s=Object.keys(a),c=Object.keys(o);for(n=0;n<s.length;n++){var u=s[n];if(c.indexOf(u)===-1){var f=a[u][0];f[0].trace.visible=!1,o[u]=[f]}}for(c=Object.keys(o),n=0;n<c.length;n++){var d=o[c[n]];d[0][0].trace._module.plot(t,function(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];n[0].trace.visible===!0&&e.push(n)}return e}(d),r)}t.traceHash=o}},{\"../components/color\":25,\"../components/errorbars\":55,\"../constants/numerical\":122,\"../lib\":136,\"../plotly\":166,\"../registry\":206,\"./animation_attributes\":167,\"./attributes\":169,\"./command\":194,\"./font_attributes\":195,\"./frame_attributes\":196,\"./layout_attributes\":197,d3:7,\"fast-isnumeric\":10}],200:[function(t,e,r){\"use strict\";var n=t(\"../../traces/scatter/attributes\"),a=n.marker;e.exports={r:n.r,t:n.t,marker:{color:a.color,size:a.size,symbol:a.symbol,opacity:a.opacity}}},{\"../../traces/scatter/attributes\":240}],201:[function(t,e,r){\"use strict\";function n(t,e){return o({},e,{showline:{valType:\"boolean\"},showticklabels:{valType:\"boolean\"},tickorientation:{valType:\"enumerated\",values:[\"horizontal\",\"vertical\"]},ticklen:{valType:\"number\",min:0},tickcolor:{valType:\"color\"},ticksuffix:{valType:\"string\"},endpadding:{valType:\"number\"},visible:{valType:\"boolean\"}})}var a=t(\"../cartesian/layout_attributes\"),o=t(\"../../lib/extend\").extendFlat,i=o({},a.domain,{});e.exports={radialaxis:n(\"radial\",{range:{valType:\"info_array\",items:[{valType:\"number\"},{valType:\"number\"}]},domain:i,orientation:{valType:\"number\"}}),angularaxis:n(\"angular\",{range:{valType:\"info_array\",items:[{valType:\"number\",dflt:0},{valType:\"number\",dflt:360}]},domain:i}),layout:{direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"]},orientation:{valType:\"angle\"}}}},{\"../../lib/extend\":132,\"../cartesian/layout_attributes\":182}],202:[function(t,e,r){\"use strict\";(e.exports=t(\"./micropolar\")).manager=t(\"./micropolar_manager\")},{\"./micropolar\":203,\"./micropolar_manager\":204}],203:[function(t,e,r){var n=t(\"d3\"),a=t(\"../../lib\"),o=a.extendDeepAll,i=e.exports={version:\"0.2.2\"};i.Axis=function(){function t(t){r=t||r;var c=s.data,f=s.layout;return(\"string\"==typeof r||r.nodeName)&&(r=n.select(r)),r.datum(c).each(function(t,r){function s(t,e){return l(t)%360+f.orientation}var c=t.slice();u={data:i.util.cloneJson(c),layout:i.util.cloneJson(f)};var d=0;c.forEach(function(t,e){t.color||(t.color=f.defaultColorRange[d],d=(d+1)%f.defaultColorRange.length),\n",
|
|
"t.strokeColor||(t.strokeColor=\"LinePlot\"===t.geometry?t.color:n.rgb(t.color).darker().toString()),u.data[e].color=t.color,u.data[e].strokeColor=t.strokeColor,u.data[e].strokeDash=t.strokeDash,u.data[e].strokeSize=t.strokeSize});var h=c.filter(function(t,e){var r=t.visible;return void 0===r||r===!0}),p=!1,g=h.map(function(t,e){return p=p||void 0!==t.groupId,t});if(p){var v=n.nest().key(function(t,e){return void 0!==t.groupId?t.groupId:\"unstacked\"}).entries(g),m=[],y=v.map(function(t,e){if(\"unstacked\"===t.key)return t.values;var r=t.values[0].r.map(function(t,e){return 0});return t.values.forEach(function(t,e,n){t.yStack=[r],m.push(r),r=i.util.sumArrays(t.r,r)}),t.values});h=n.merge(y)}h.forEach(function(t,e){t.t=Array.isArray(t.t[0])?t.t:[t.t],t.r=Array.isArray(t.r[0])?t.r:[t.r]});var x=Math.min(f.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2;x=Math.max(10,x);var b,_=[f.margin.left+x,f.margin.top+x];if(p){b=[0,n.max(i.util.sumArrays(i.util.arrayLast(h).r[0],i.util.arrayLast(m)))]}else b=n.extent(i.util.flattenArray(h.map(function(t,e){return t.r})));f.radialAxis.domain!=i.DATAEXTENT&&(b[0]=0),a=n.scale.linear().domain(f.radialAxis.domain!=i.DATAEXTENT&&f.radialAxis.domain?f.radialAxis.domain:b).range([0,x]),u.layout.radialAxis.domain=a.domain();var w,k=i.util.flattenArray(h.map(function(t,e){return t.t})),M=\"string\"==typeof k[0];M&&(k=i.util.deduplicate(k),w=k.slice(),k=n.range(k.length),h=h.map(function(t,e){var r=t;return t.t=[k],p&&(r.yStack=t.yStack),r}));var A=h.filter(function(t,e){return\"LinePlot\"===t.geometry||\"DotPlot\"===t.geometry}).length===h.length,T=null===f.needsEndSpacing?M||!A:f.needsEndSpacing,L=f.angularAxis.domain&&f.angularAxis.domain!=i.DATAEXTENT&&!M&&f.angularAxis.domain[0]>=0,C=L?f.angularAxis.domain:n.extent(k),S=Math.abs(k[1]-k[0]);A&&!M&&(S=0);var z=C.slice();T&&M&&(z[1]+=S);var O=f.angularAxis.ticksCount||4;O>8&&(O=O/(O/8)+O%8),f.angularAxis.ticksStep&&(O=(z[1]-z[0])/O);var D=f.angularAxis.ticksStep||(z[1]-z[0])/(O*(f.minorTicks+1));w&&(D=Math.max(Math.round(D),1)),z[2]||(z[2]=D);var P=n.range.apply(this,z);if(P=P.map(function(t,e){return parseFloat(t.toPrecision(12))}),l=n.scale.linear().domain(z.slice(0,2)).range(\"clockwise\"===f.direction?[0,360]:[360,0]),u.layout.angularAxis.domain=l.domain(),u.layout.angularAxis.endPadding=T?S:0,void 0===(e=n.select(this).select(\"svg.chart-root\"))||e.empty()){var E=(new DOMParser).parseFromString(\"<svg xmlns='http://www.w3.org/2000/svg' class='chart-root'>' + '<g class='outer-group'>' + '<g class='chart-group'>' + '<circle class='background-circle'></circle>' + '<g class='geometry-group'></g>' + '<g class='radial axis-group'>' + '<circle class='outside-circle'></circle>' + '</g>' + '<g class='angular axis-group'></g>' + '<g class='guides-group'><line></line><circle r='0'></circle></g>' + '</g>' + '<g class='legend-group'></g>' + '<g class='tooltips-group'></g>' + '<g class='title-group'><text></text></g>' + '</g>' + '</svg>\",\"application/xml\"),N=this.appendChild(this.ownerDocument.importNode(E.documentElement,!0));e=n.select(N)}e.select(\".guides-group\").style({\"pointer-events\":\"none\"}),e.select(\".angular.axis-group\").style({\"pointer-events\":\"none\"}),e.select(\".radial.axis-group\").style({\"pointer-events\":\"none\"});var I,R=e.select(\".chart-group\"),F={fill:\"none\",stroke:f.tickColor},j={\"font-size\":f.font.size,\"font-family\":f.font.family,fill:f.font.color,\"text-shadow\":[\"-1px 0px\",\"1px -1px\",\"-1px 1px\",\"1px 1px\"].map(function(t,e){return\" \"+t+\" 0 \"+f.font.outlineColor}).join(\",\")};if(f.showLegend){I=e.select(\".legend-group\").attr({transform:\"translate(\"+[x,f.margin.top]+\")\"}).style({display:\"block\"});var B=h.map(function(t,e){var r=i.util.cloneJson(t);return r.symbol=\"DotPlot\"===t.geometry?t.dotType||\"circle\":\"LinePlot\"!=t.geometry?\"square\":\"line\",r.visibleInLegend=void 0===t.visibleInLegend||t.visibleInLegend,r.color=\"LinePlot\"===t.geometry?t.strokeColor:t.color,r});i.Legend().config({data:h.map(function(t,e){return t.name||\"Element\"+e}),legendConfig:o({},i.Legend.defaultConfig().legendConfig,{container:I,elements:B,reverseOrder:f.legend.reverseOrder})})();var q=I.node().getBBox();x=Math.min(f.width-q.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2,x=Math.max(10,x),_=[f.margin.left+x,f.margin.top+x],a.range([0,x]),u.layout.radialAxis.domain=a.domain(),I.attr(\"transform\",\"translate(\"+[_[0]+x,_[1]-x]+\")\")}else I=e.select(\".legend-group\").style({display:\"none\"});e.attr({width:f.width,height:f.height}).style({opacity:f.opacity}),R.attr(\"transform\",\"translate(\"+_+\")\").style({cursor:\"crosshair\"});var H=[(f.width-(f.margin.left+f.margin.right+2*x+(q?q.width:0)))/2,(f.height-(f.margin.top+f.margin.bottom+2*x))/2];if(H[0]=Math.max(0,H[0]),H[1]=Math.max(0,H[1]),e.select(\".outer-group\").attr(\"transform\",\"translate(\"+H+\")\"),f.title){var V=e.select(\"g.title-group text\").style(j).text(f.title),U=V.node().getBBox();V.attr({x:_[0]-U.width/2,y:_[1]-x-20})}var X=e.select(\".radial.axis-group\");if(f.radialAxis.gridLinesVisible){var G=X.selectAll(\"circle.grid-circle\").data(a.ticks(5));G.enter().append(\"circle\").attr({class:\"grid-circle\"}).style(F),G.attr(\"r\",a),G.exit().remove()}X.select(\"circle.outside-circle\").attr({r:x}).style(F);var Y=e.select(\"circle.background-circle\").attr({r:x}).style({fill:f.backgroundColor,stroke:f.stroke});if(f.radialAxis.visible){var Z=n.svg.axis().scale(a).ticks(5).tickSize(5);X.call(Z).attr({transform:\"rotate(\"+f.radialAxis.orientation+\")\"}),X.selectAll(\".domain\").style(F),X.selectAll(\"g>text\").text(function(t,e){return this.textContent+f.radialAxis.ticksSuffix}).style(j).style({\"text-anchor\":\"start\"}).attr({x:0,y:0,dx:0,dy:0,transform:function(t,e){return\"horizontal\"===f.radialAxis.tickOrientation?\"rotate(\"+-f.radialAxis.orientation+\") translate(\"+[0,j[\"font-size\"]]+\")\":\"translate(\"+[0,j[\"font-size\"]]+\")\"}}),X.selectAll(\"g>line\").style({stroke:\"black\"})}var W=e.select(\".angular.axis-group\").selectAll(\"g.angular-tick\").data(P),$=W.enter().append(\"g\").classed(\"angular-tick\",!0);W.attr({transform:function(t,e){return\"rotate(\"+s(t,e)+\")\"}}).style({display:f.angularAxis.visible?\"block\":\"none\"}),W.exit().remove(),$.append(\"line\").classed(\"grid-line\",!0).classed(\"major\",function(t,e){return e%(f.minorTicks+1)==0}).classed(\"minor\",function(t,e){return!(e%(f.minorTicks+1)==0)}).style(F),$.selectAll(\".minor\").style({stroke:f.minorTickColor}),W.select(\"line.grid-line\").attr({x1:f.tickLength?x-f.tickLength:0,x2:x}).style({display:f.angularAxis.gridLinesVisible?\"block\":\"none\"}),$.append(\"text\").classed(\"axis-text\",!0).style(j);var Q=W.select(\"text.axis-text\").attr({x:x+f.labelOffset,dy:\".35em\",transform:function(t,e){var r=s(t,e),n=x+f.labelOffset,a=f.angularAxis.tickOrientation;return\"horizontal\"==a?\"rotate(\"+-r+\" \"+n+\" 0)\":\"radial\"==a?r<270&&r>90?\"rotate(180 \"+n+\" 0)\":null:\"rotate(\"+(r<=180&&r>0?-90:90)+\" \"+n+\" 0)\"}}).style({\"text-anchor\":\"middle\",display:f.angularAxis.labelsVisible?\"block\":\"none\"}).text(function(t,e){return e%(f.minorTicks+1)!=0?\"\":w?w[t]+f.angularAxis.ticksSuffix:t+f.angularAxis.ticksSuffix}).style(j);f.angularAxis.rewriteTicks&&Q.text(function(t,e){return e%(f.minorTicks+1)!=0?\"\":f.angularAxis.rewriteTicks(this.textContent,e)});var J=n.max(R.selectAll(\".angular-tick text\")[0].map(function(t,e){return t.getCTM().e+t.getBBox().width}));I.attr({transform:\"translate(\"+[x+J,f.margin.top]+\")\"});var K=e.select(\"g.geometry-group\").selectAll(\"g\").size()>0,tt=e.select(\"g.geometry-group\").selectAll(\"g.geometry\").data(h);if(tt.enter().append(\"g\").attr({class:function(t,e){return\"geometry geometry\"+e}}),tt.exit().remove(),h[0]||K){var et=[];h.forEach(function(t,e){var r={};r.radialScale=a,r.angularScale=l,r.container=tt.filter(function(t,r){return r==e}),r.geometry=t.geometry,r.orientation=f.orientation,r.direction=f.direction,r.index=e,et.push({data:t,geometryConfig:r})});var rt=n.nest().key(function(t,e){return void 0!==t.data.groupId||\"unstacked\"}).entries(et),nt=[];rt.forEach(function(t,e){\"unstacked\"===t.key?nt=nt.concat(t.values.map(function(t,e){return[t]})):nt.push(t.values)}),nt.forEach(function(t,e){var r;r=Array.isArray(t)?t[0].geometryConfig.geometry:t.geometryConfig.geometry;var n=t.map(function(t,e){return o(i[r].defaultConfig(),t)});i[r]().config(n)()})}var at,ot,it=e.select(\".guides-group\"),lt=e.select(\".tooltips-group\"),st=i.tooltipPanel().config({container:lt,fontSize:8})(),ct=i.tooltipPanel().config({container:lt,fontSize:8})(),ut=i.tooltipPanel().config({container:lt,hasTick:!0})();if(!M){var ft=it.select(\"line\").attr({x1:0,y1:0,y2:0}).style({stroke:\"grey\",\"pointer-events\":\"none\"});R.on(\"mousemove.angular-guide\",function(t,e){var r=i.util.getMousePos(Y).angle;ft.attr({x2:-x,transform:\"rotate(\"+r+\")\"}).style({opacity:.5});var n=(r+180+360-f.orientation)%360;at=l.invert(n);var a=i.util.convertToCartesian(x+12,r+180);st.text(i.util.round(at)).move([a[0]+_[0],a[1]+_[1]])}).on(\"mouseout.angular-guide\",function(t,e){it.select(\"line\").style({opacity:0})})}var dt=it.select(\"circle\").style({stroke:\"grey\",fill:\"none\"});R.on(\"mousemove.radial-guide\",function(t,e){var r=i.util.getMousePos(Y).radius;dt.attr({r:r}).style({opacity:.5}),ot=a.invert(i.util.getMousePos(Y).radius);var n=i.util.convertToCartesian(r,f.radialAxis.orientation);ct.text(i.util.round(ot)).move([n[0]+_[0],n[1]+_[1]])}).on(\"mouseout.radial-guide\",function(t,e){dt.style({opacity:0}),ut.hide(),st.hide(),ct.hide()}),e.selectAll(\".geometry-group .mark\").on(\"mouseover.tooltip\",function(t,r){var a=n.select(this),o=a.style(\"fill\"),l=\"black\",s=a.style(\"opacity\")||1;if(a.attr({\"data-opacity\":s}),\"none\"!=o){a.attr({\"data-fill\":o}),l=n.hsl(o).darker().toString(),a.style({fill:l,opacity:1});var c={t:i.util.round(t[0]),r:i.util.round(t[1])};M&&(c.t=w[t[0]]);var u=\"t: \"+c.t+\", r: \"+c.r,f=this.getBoundingClientRect(),d=e.node().getBoundingClientRect(),h=[f.left+f.width/2-H[0]-d.left,f.top+f.height/2-H[1]-d.top];ut.config({color:l}).text(u),ut.move(h)}else o=a.style(\"stroke\"),a.attr({\"data-stroke\":o}),l=n.hsl(o).darker().toString(),a.style({stroke:l,opacity:1})}).on(\"mousemove.tooltip\",function(t,e){if(0!=n.event.which)return!1;n.select(this).attr(\"data-fill\")&&ut.show()}).on(\"mouseout.tooltip\",function(t,e){ut.hide();var r=n.select(this),a=r.attr(\"data-fill\");a?r.style({fill:a,opacity:r.attr(\"data-opacity\")}):r.style({stroke:r.attr(\"data-stroke\"),opacity:r.attr(\"data-opacity\")})})}),d}var e,r,a,l,s={data:[],layout:{}},c={},u={},f=n.dispatch(\"hover\"),d={};return d.render=function(e){return t(e),this},d.config=function(t){if(!arguments.length)return s;var e=i.util.cloneJson(t);return e.data.forEach(function(t,e){s.data[e]||(s.data[e]={}),o(s.data[e],i.Axis.defaultConfig().data[0]),o(s.data[e],t)}),o(s.layout,i.Axis.defaultConfig().layout),o(s.layout,e.layout),this},d.getLiveConfig=function(){return u},d.getinputConfig=function(){return c},d.radialScale=function(t){return a},d.angularScale=function(t){return l},d.svg=function(){return e},n.rebind(d,f,\"on\"),d},i.Axis.defaultConfig=function(t,e){return{data:[{t:[1,2,3,4],r:[10,11,12,13],name:\"Line1\",geometry:\"LinePlot\",color:null,strokeDash:\"solid\",strokeColor:null,strokeSize:\"1\",visibleInLegend:!0,opacity:1}],layout:{defaultColorRange:n.scale.category10().range(),title:null,height:450,width:500,margin:{top:40,right:40,bottom:40,left:40},font:{size:12,color:\"gray\",outlineColor:\"white\",family:\"Tahoma, sans-serif\"},direction:\"clockwise\",orientation:0,labelOffset:10,radialAxis:{domain:null,orientation:-45,ticksSuffix:\"\",visible:!0,gridLinesVisible:!0,tickOrientation:\"horizontal\",rewriteTicks:null},angularAxis:{domain:[0,360],ticksSuffix:\"\",visible:!0,gridLinesVisible:!0,labelsVisible:!0,tickOrientation:\"horizontal\",rewriteTicks:null,ticksCount:null,ticksStep:null},minorTicks:0,tickLength:null,tickColor:\"silver\",minorTickColor:\"#eee\",backgroundColor:\"none\",needsEndSpacing:null,showLegend:!0,legend:{reverseOrder:!1},opacity:1}}},i.util={},i.DATAEXTENT=\"dataExtent\",i.AREA=\"AreaChart\",i.LINE=\"LinePlot\",i.DOT=\"DotPlot\",i.BAR=\"BarChart\",i.util._override=function(t,e){for(var r in t)r in e&&(e[r]=t[r])},i.util._extend=function(t,e){for(var r in t)e[r]=t[r]},i.util._rndSnd=function(){return 2*Math.random()-1+(2*Math.random()-1)+(2*Math.random()-1)},i.util.dataFromEquation2=function(t,e){var r=e||6;return n.range(0,360+r,r).map(function(e,r){var n=e*Math.PI/180;return[e,t(n)]})},i.util.dataFromEquation=function(t,e,r){var a=e||6,o=[],i=[];n.range(0,360+a,a).forEach(function(e,r){var n=e*Math.PI/180,a=t(n);o.push(e),i.push(a)});var l={t:o,r:i};return r&&(l.name=r),l},i.util.ensureArray=function(t,e){if(void 0===t)return null;var r=[].concat(t);return n.range(e).map(function(t,e){return r[e]||r[0]})},i.util.fillArrays=function(t,e,r){return e.forEach(function(e,n){t[e]=i.util.ensureArray(t[e],r)}),t},i.util.cloneJson=function(t){return JSON.parse(JSON.stringify(t))},i.util.validateKeys=function(t,e){\"string\"==typeof e&&(e=e.split(\".\"));var r=e.shift();return t[r]&&(!e.length||objHasKeys(t[r],e))},i.util.sumArrays=function(t,e){return n.zip(t,e).map(function(t,e){return n.sum(t)})},i.util.arrayLast=function(t){return t[t.length-1]},i.util.arrayEqual=function(t,e){for(var r=Math.max(t.length,e.length,1);r-- >=0&&t[r]===e[r];);return r===-2},i.util.flattenArray=function(t){for(var e=[];!i.util.arrayEqual(e,t);)e=t,t=[].concat.apply([],t);return t},i.util.deduplicate=function(t){return t.filter(function(t,e,r){return r.indexOf(t)==e})},i.util.convertToCartesian=function(t,e){var r=e*Math.PI/180;return[t*Math.cos(r),t*Math.sin(r)]},i.util.round=function(t,e){var r=e||2,n=Math.pow(10,r);return Math.round(t*n)/n},i.util.getMousePos=function(t){var e=n.mouse(t.node()),r=e[0],a=e[1],o={};return o.x=r,o.y=a,o.pos=e,o.angle=180*(Math.atan2(a,r)+Math.PI)/Math.PI,o.radius=Math.sqrt(r*r+a*a),o},i.util.duplicatesCount=function(t){for(var e,r={},n={},a=0,o=t.length;a<o;a++)e=t[a],e in r?(r[e]++,n[e]=r[e]):r[e]=1;return n},i.util.duplicates=function(t){return Object.keys(i.util.duplicatesCount(t))},i.util.translator=function(t,e,r,n){if(n){var a=r.slice();r=e,e=a}var o=e.reduce(function(t,e){if(void 0!==t)return t[e]},t);void 0!==o&&(e.reduce(function(t,r,n){if(void 0!==t)return n===e.length-1&&delete t[r],t[r]},t),r.reduce(function(t,e,n){return void 0===t[e]&&(t[e]={}),n===r.length-1&&(t[e]=o),t[e]},t))},i.PolyChart=function(){function t(){var t=e[0].geometryConfig,r=t.container;\"string\"==typeof r&&(r=n.select(r)),r.datum(e).each(function(e,r){function o(e,r){return{r:t.radialScale(e[1]),t:(t.angularScale(e[0])+t.orientation)*Math.PI/180}}function i(t){return{x:t.r*Math.cos(t.t),y:t.r*Math.sin(t.t)}}var l=!!e[0].data.yStack,s=e.map(function(t,e){return l?n.zip(t.data.t[0],t.data.r[0],t.data.yStack[0]):n.zip(t.data.t[0],t.data.r[0])}),c=t.angularScale,u=t.radialScale.domain()[0],f={};f.bar=function(r,a,o){var i=e[o].data,l=t.radialScale(r[1])-t.radialScale(0),s=t.radialScale(r[2]||0),u=i.barWidth;n.select(this).attr({class:\"mark bar\",d:\"M\"+[[l+s,-u/2],[l+s,u/2],[s,u/2],[s,-u/2]].join(\"L\")+\"Z\",transform:function(e,r){return\"rotate(\"+(t.orientation+c(e[0]))+\")\"}})},f.dot=function(t,r,a){var l=t[2]?[t[0],t[1]+t[2]]:t,s=n.svg.symbol().size(e[a].data.dotSize).type(e[a].data.dotType)(t,r);n.select(this).attr({class:\"mark dot\",d:s,transform:function(t,e){var r=i(o(l));return\"translate(\"+[r.x,r.y]+\")\"}})};var d=n.svg.line.radial().interpolate(e[0].data.lineInterpolation).radius(function(e){return t.radialScale(e[1])}).angle(function(e){return t.angularScale(e[0])*Math.PI/180});f.line=function(r,a,o){var i=r[2]?s[o].map(function(t,e){return[t[0],t[1]+t[2]]}):s[o];if(n.select(this).each(f.dot).style({opacity:function(t,r){return+e[o].data.dotVisible},fill:v.stroke(r,a,o)}).attr({class:\"mark dot\"}),!(a>0)){var l=n.select(this.parentNode).selectAll(\"path.line\").data([0]);l.enter().insert(\"path\"),l.attr({class:\"line\",d:d(i),transform:function(e,r){return\"rotate(\"+(t.orientation+90)+\")\"},\"pointer-events\":\"none\"}).style({fill:function(t,e){return v.fill(r,a,o)},\"fill-opacity\":0,stroke:function(t,e){return v.stroke(r,a,o)},\"stroke-width\":function(t,e){return v[\"stroke-width\"](r,a,o)},\"stroke-dasharray\":function(t,e){return v[\"stroke-dasharray\"](r,a,o)},opacity:function(t,e){return v.opacity(r,a,o)},display:function(t,e){return v.display(r,a,o)}})}};var h=t.angularScale.range(),p=Math.abs(h[1]-h[0])/s[0].length*Math.PI/180,g=n.svg.arc().startAngle(function(t){return-p/2}).endAngle(function(t){return p/2}).innerRadius(function(e){return t.radialScale(u+(e[2]||0))}).outerRadius(function(e){return t.radialScale(u+(e[2]||0))+t.radialScale(e[1])});f.arc=function(e,r,a){n.select(this).attr({class:\"mark arc\",d:g,transform:function(e,r){return\"rotate(\"+(t.orientation+c(e[0])+90)+\")\"}})};var v={fill:function(t,r,n){return e[n].data.color},stroke:function(t,r,n){return e[n].data.strokeColor},\"stroke-width\":function(t,r,n){return e[n].data.strokeSize+\"px\"},\"stroke-dasharray\":function(t,r,n){return a[e[n].data.strokeDash]},opacity:function(t,r,n){return e[n].data.opacity},display:function(t,r,n){return void 0===e[n].data.visible||e[n].data.visible?\"block\":\"none\"}},m=n.select(this).selectAll(\"g.layer\").data(s);m.enter().append(\"g\").attr({class:\"layer\"});var y=m.selectAll(\"path.mark\").data(function(t,e){return t});y.enter().append(\"path\").attr({class:\"mark\"}),y.style(v).each(f[t.geometryType]),y.exit().remove(),m.exit().remove()})}var e=[i.PolyChart.defaultConfig()],r=n.dispatch(\"hover\"),a={solid:\"none\",dash:[5,2],dot:[2,5]};return t.config=function(t){return arguments.length?(t.forEach(function(t,r){e[r]||(e[r]={}),o(e[r],i.PolyChart.defaultConfig()),o(e[r],t)}),this):e},t.getColorScale=function(){},n.rebind(t,r,\"on\"),t},i.PolyChart.defaultConfig=function(){return{data:{name:\"geom1\",t:[[1,2,3,4]],r:[[1,2,3,4]],dotType:\"circle\",dotSize:64,dotVisible:!1,barWidth:20,color:\"#ffa500\",strokeSize:1,strokeColor:\"silver\",strokeDash:\"solid\",opacity:1,index:0,visible:!0,visibleInLegend:!0},geometryConfig:{geometry:\"LinePlot\",geometryType:\"arc\",direction:\"clockwise\",orientation:0,container:\"body\",radialScale:null,angularScale:null,colorScale:n.scale.category20()}}},i.BarChart=function(){return i.PolyChart()},i.BarChart.defaultConfig=function(){return{geometryConfig:{geometryType:\"bar\"}}},i.AreaChart=function(){return i.PolyChart()},i.AreaChart.defaultConfig=function(){return{geometryConfig:{geometryType:\"arc\"}}},i.DotPlot=function(){return i.PolyChart()},i.DotPlot.defaultConfig=function(){return{geometryConfig:{geometryType:\"dot\",dotType:\"circle\"}}},i.LinePlot=function(){return i.PolyChart()},i.LinePlot.defaultConfig=function(){return{geometryConfig:{geometryType:\"line\"}}},i.Legend=function(){function t(){var r=e.legendConfig,a=e.data.map(function(t,e){return[].concat(t).map(function(t,n){var a=o({},r.elements[e]);return a.name=t,a.color=[].concat(r.elements[e].color)[n],a})}),i=n.merge(a);i=i.filter(function(t,e){return r.elements[e]&&(r.elements[e].visibleInLegend||void 0===r.elements[e].visibleInLegend)}),r.reverseOrder&&(i=i.reverse());var l=r.container;(\"string\"==typeof l||l.nodeName)&&(l=n.select(l));var s=i.map(function(t,e){return t.color}),c=r.fontSize,u=null==r.isContinuous?\"number\"==typeof i[0]:r.isContinuous,f=u?r.height:c*i.length,d=l.classed(\"legend-group\",!0),h=d.selectAll(\"svg\").data([0]),p=h.enter().append(\"svg\").attr({width:300,height:f+c,xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",version:\"1.1\"});p.append(\"g\").classed(\"legend-axis\",!0),p.append(\"g\").classed(\"legend-marks\",!0);var g=n.range(i.length),v=n.scale[u?\"linear\":\"ordinal\"]().domain(g).range(s),m=n.scale[u?\"linear\":\"ordinal\"]().domain(g)[u?\"range\":\"rangePoints\"]([0,f]),y=function(t,e){var r=3*e;return\"line\"===t?\"M\"+[[-e/2,-e/12],[e/2,-e/12],[e/2,e/12],[-e/2,e/12]]+\"Z\":n.svg.symbolTypes.indexOf(t)!=-1?n.svg.symbol().type(t).size(r)():n.svg.symbol().type(\"square\").size(r)()};if(u){var x=h.select(\".legend-marks\").append(\"defs\").append(\"linearGradient\").attr({id:\"grad1\",x1:\"0%\",y1:\"0%\",x2:\"0%\",y2:\"100%\"}).selectAll(\"stop\").data(s);x.enter().append(\"stop\"),x.attr({offset:function(t,e){return e/(s.length-1)*100+\"%\"}}).style({\"stop-color\":function(t,e){return t}}),h.append(\"rect\").classed(\"legend-mark\",!0).attr({height:r.height,width:r.colorBandWidth,fill:\"url(#grad1)\"})}else{var b=h.select(\".legend-marks\").selectAll(\"path.legend-mark\").data(i);b.enter().append(\"path\").classed(\"legend-mark\",!0),b.attr({transform:function(t,e){return\"translate(\"+[c/2,m(e)+c/2]+\")\"},d:function(t,e){var r=t.symbol;return y(r,c)},fill:function(t,e){return v(e)}}),b.exit().remove()}var _=n.svg.axis().scale(m).orient(\"right\"),w=h.select(\"g.legend-axis\").attr({transform:\"translate(\"+[u?r.colorBandWidth:c,c/2]+\")\"}).call(_);return w.selectAll(\".domain\").style({fill:\"none\",stroke:\"none\"}),w.selectAll(\"line\").style({fill:\"none\",stroke:u?r.textColor:\"none\"}),w.selectAll(\"text\").style({fill:r.textColor,\"font-size\":r.fontSize}).text(function(t,e){return i[e].name}),t}var e=i.Legend.defaultConfig(),r=n.dispatch(\"hover\");return t.config=function(t){return arguments.length?(o(e,t),this):e},n.rebind(t,r,\"on\"),t},i.Legend.defaultConfig=function(t,e){return{data:[\"a\",\"b\",\"c\"],legendConfig:{elements:[{symbol:\"line\",color:\"red\"},{symbol:\"square\",color:\"yellow\"},{symbol:\"diamond\",color:\"limegreen\"}],height:150,colorBandWidth:30,fontSize:12,container:\"body\",isContinuous:null,textColor:\"grey\",reverseOrder:!1}}},i.tooltipPanel=function(){var t,e,r,a={container:null,hasTick:!1,fontSize:12,color:\"white\",padding:5},l=\"tooltip-\"+i.tooltipPanel.uid++,s=function(){t=a.container.selectAll(\"g.\"+l).data([0]);var n=t.enter().append(\"g\").classed(l,!0).style({\"pointer-events\":\"none\",display:\"none\"});return r=n.append(\"path\").style({fill:\"white\",\"fill-opacity\":.9}).attr({d:\"M0 0\"}),e=n.append(\"text\").attr({dx:a.padding+10,dy:.3*+a.fontSize}),s};return s.text=function(o){var i=n.hsl(a.color).l,l=i>=.5?\"#aaa\":\"white\",c=i>=.5?\"black\":\"white\",u=o||\"\";e.style({fill:c,\"font-size\":a.fontSize+\"px\"}).text(u);var f=a.padding,d=e.node().getBBox(),h={fill:a.color,stroke:l,\"stroke-width\":\"2px\"},p=d.width+2*f+10,g=d.height+2*f;return r.attr({d:\"M\"+[[10,-g/2],[10,-g/4],[a.hasTick?0:10,0],[10,g/4],[10,g/2],[p,g/2],[p,-g/2]].join(\"L\")+\"Z\"}).style(h),t.attr({transform:\"translate(\"+[10,-g/2+2*f]+\")\"}),t.style({display:\"block\"}),s},s.move=function(e){if(t)return t.attr({transform:\"translate(\"+[e[0],e[1]]+\")\"}).style({display:\"block\"}),s},s.hide=function(){if(t)return t.style({display:\"none\"}),s},s.show=function(){if(t)return t.style({display:\"block\"}),s},s.config=function(t){return o(a,t),s},s},i.tooltipPanel.uid=1,i.adapter={},i.adapter.plotly=function(){var t={};return t.convert=function(t,e){var r={};if(t.data&&(r.data=t.data.map(function(t,r){var n=o({},t);return[[n,[\"marker\",\"color\"],[\"color\"]],[n,[\"marker\",\"opacity\"],[\"opacity\"]],[n,[\"marker\",\"line\",\"color\"],[\"strokeColor\"]],[n,[\"marker\",\"line\",\"dash\"],[\"strokeDash\"]],[n,[\"marker\",\"line\",\"width\"],[\"strokeSize\"]],[n,[\"marker\",\"symbol\"],[\"dotType\"]],[n,[\"marker\",\"size\"],[\"dotSize\"]],[n,[\"marker\",\"barWidth\"],[\"barWidth\"]],[n,[\"line\",\"interpolation\"],[\"lineInterpolation\"]],[n,[\"showlegend\"],[\"visibleInLegend\"]]].forEach(function(t,r){i.util.translator.apply(null,t.concat(e))}),e||delete n.marker,e&&delete n.groupId,e?(\"LinePlot\"===n.geometry?(n.type=\"scatter\",n.dotVisible===!0?(delete n.dotVisible,n.mode=\"lines+markers\"):n.mode=\"lines\"):\"DotPlot\"===n.geometry?(n.type=\"scatter\",n.mode=\"markers\"):\"AreaChart\"===n.geometry?n.type=\"area\":\"BarChart\"===n.geometry&&(n.type=\"bar\"),delete n.geometry):(\"scatter\"===n.type?\"lines\"===n.mode?n.geometry=\"LinePlot\":\"markers\"===n.mode?n.geometry=\"DotPlot\":\"lines+markers\"===n.mode&&(n.geometry=\"LinePlot\",n.dotVisible=!0):\"area\"===n.type?n.geometry=\"AreaChart\":\"bar\"===n.type&&(n.geometry=\"BarChart\"),delete n.mode,delete n.type),n}),!e&&t.layout&&\"stack\"===t.layout.barmode)){var a=i.util.duplicates(r.data.map(function(t,e){return t.geometry}));r.data.forEach(function(t,e){var n=a.indexOf(t.geometry);n!=-1&&(r.data[e].groupId=n)})}if(t.layout){var l=o({},t.layout);if([[l,[\"plot_bgcolor\"],[\"backgroundColor\"]],[l,[\"showlegend\"],[\"showLegend\"]],[l,[\"radialaxis\"],[\"radialAxis\"]],[l,[\"angularaxis\"],[\"angularAxis\"]],[l.angularaxis,[\"showline\"],[\"gridLinesVisible\"]],[l.angularaxis,[\"showticklabels\"],[\"labelsVisible\"]],[l.angularaxis,[\"nticks\"],[\"ticksCount\"]],[l.angularaxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.angularaxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.angularaxis,[\"range\"],[\"domain\"]],[l.angularaxis,[\"endpadding\"],[\"endPadding\"]],[l.radialaxis,[\"showline\"],[\"gridLinesVisible\"]],[l.radialaxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.radialaxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.radialaxis,[\"range\"],[\"domain\"]],[l.angularAxis,[\"showline\"],[\"gridLinesVisible\"]],[l.angularAxis,[\"showticklabels\"],[\"labelsVisible\"]],[l.angularAxis,[\"nticks\"],[\"ticksCount\"]],[l.angularAxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.angularAxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.angularAxis,[\"range\"],[\"domain\"]],[l.angularAxis,[\"endpadding\"],[\"endPadding\"]],[l.radialAxis,[\"showline\"],[\"gridLinesVisible\"]],[l.radialAxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.radialAxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.radialAxis,[\"range\"],[\"domain\"]],[l.font,[\"outlinecolor\"],[\"outlineColor\"]],[l.legend,[\"traceorder\"],[\"reverseOrder\"]],[l,[\"labeloffset\"],[\"labelOffset\"]],[l,[\"defaultcolorrange\"],[\"defaultColorRange\"]]].forEach(function(t,r){i.util.translator.apply(null,t.concat(e))}),e?(void 0!==l.tickLength&&(l.angularaxis.ticklen=l.tickLength,delete l.tickLength),l.tickColor&&(l.angularaxis.tickcolor=l.tickColor,delete l.tickColor)):(l.angularAxis&&void 0!==l.angularAxis.ticklen&&(l.tickLength=l.angularAxis.ticklen),l.angularAxis&&void 0!==l.angularAxis.tickcolor&&(l.tickColor=l.angularAxis.tickcolor)),l.legend&&\"boolean\"!=typeof l.legend.reverseOrder&&(l.legend.reverseOrder=\"normal\"!=l.legend.reverseOrder),l.legend&&\"boolean\"==typeof l.legend.traceorder&&(l.legend.traceorder=l.legend.traceorder?\"reversed\":\"normal\",delete l.legend.reverseOrder),l.margin&&void 0!==l.margin.t){var s=[\"t\",\"r\",\"b\",\"l\",\"pad\"],c=[\"top\",\"right\",\"bottom\",\"left\",\"pad\"],u={};n.entries(l.margin).forEach(function(t,e){u[c[s.indexOf(t.key)]]=t.value}),l.margin=u}e&&(delete l.needsEndSpacing,delete l.minorTickColor,delete l.minorTicks,delete l.angularaxis.ticksCount,delete l.angularaxis.ticksCount,delete l.angularaxis.ticksStep,delete l.angularaxis.rewriteTicks,delete l.angularaxis.nticks,delete l.radialaxis.ticksCount,delete l.radialaxis.ticksCount,delete l.radialaxis.ticksStep,delete l.radialaxis.rewriteTicks,delete l.radialaxis.nticks),r.layout=l}return r},t}},{\"../../lib\":136,d3:7}],204:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../lib\"),o=t(\"../../components/color\"),i=t(\"./micropolar\"),l=t(\"./undo_manager\"),s=a.extendDeepAll,c=e.exports={};c.framework=function(t){function e(e,a){return a&&(f=a),n.select(n.select(f).node().parentNode).selectAll(\".svg-container>*:not(.chart-root)\").remove(),r=r?s(r,e):e,o||(o=i.Axis()),u=i.adapter.plotly().convert(r),o.config(u).render(f),t.data=r.data,t.layout=r.layout,c.fillLayout(t),r}var r,a,o,u,f,d=new l;return e.isPolar=!0,e.svg=function(){return o.svg()},e.getConfig=function(){return r},e.getLiveConfig=function(){return i.adapter.plotly().convert(o.getLiveConfig(),!0)},e.getLiveScales=function(){return{t:o.angularScale(),r:o.radialScale()}},e.setUndoPoint=function(){var t=this,e=i.util.cloneJson(r);!function(e,r){d.add({undo:function(){r&&t(r)},redo:function(){t(e)}})}(e,a),a=i.util.cloneJson(e)},e.undo=function(){d.undo()},e.redo=function(){d.redo()},e},c.fillLayout=function(t){var e=n.select(t).selectAll(\".plot-container\"),r=e.selectAll(\".svg-container\"),a=t.framework&&t.framework.svg&&t.framework.svg(),i={width:800,height:600,paper_bgcolor:o.background,_container:e,_paperdiv:r,_paper:a};t._fullLayout=s(i,t.layout)}},{\"../../components/color\":25,\"../../lib\":136,\"./micropolar\":203,\"./undo_manager\":205,d3:7}],205:[function(t,e,r){\"use strict\";e.exports=function(){function t(t,e){return t?(a=!0,t[e](),a=!1,this):this}var e,r=[],n=-1,a=!1;return{add:function(t){return a?this:(r.splice(n+1,r.length-n),r.push(t),n=r.length-1,this)},setCallback:function(t){e=t},undo:function(){var a=r[n];return a?(t(a,\"undo\"),n-=1,e&&e(a.undo),this):this},redo:function(){var a=r[n+1];return a?(t(a,\"redo\"),n+=1,e&&e(a.redo),this):this},clear:function(){r=[],n=-1},hasUndo:function(){return n!==-1},hasRedo:function(){return n<r.length-1},getCommands:function(){return r},getPreviousCommand:function(){return r[n-1]},getIndex:function(){return n}}}},{}],206:[function(t,e,r){\"use strict\";function n(t){if(t.layoutAttributes){var e=t.layoutAttributes._arrayAttrRegexps;if(e)for(var n=0;n<e.length;n++)l(r.layoutArrayRegexes,e[n])}}function a(t){return\"object\"==typeof t&&(t=t.type),t}var o=t(\"./lib/loggers\"),i=t(\"./lib/noop\"),l=t(\"./lib/push_unique\"),s=t(\"./plots/attributes\");r.modules={},r.allCategories={},r.allTypes=[],r.subplotsRegistry={},r.transformsRegistry={},r.componentsRegistry={},r.layoutArrayContainers=[],r.layoutArrayRegexes=[],r.register=function(t,e,n,a){if(r.modules[e])return void o.log(\"Type \"+e+\" already registered\");for(var i={},l=0;l<n.length;l++)i[n[l]]=!0,r.allCategories[n[l]]=!0;r.modules[e]={_module:t,categories:i},a&&Object.keys(a).length&&(r.modules[e].meta=a),r.allTypes.push(e)},r.registerSubplot=function(t){var e=t.name;if(r.subplotsRegistry[e])return void o.log(\"Plot type \"+e+\" already registered.\");n(t),r.subplotsRegistry[e]=t},r.registerComponent=function(t){var e=t.name;r.componentsRegistry[e]=t,t.layoutAttributes&&(t.layoutAttributes._isLinkedToArray&&l(r.layoutArrayContainers,e),n(t))},r.getModule=function(t){if(void 0!==t.r)return o.warn(\"Tried to put a polar trace on an incompatible graph of cartesian data. Ignoring this dataset.\",t),!1;var e=r.modules[a(t)];return!!e&&e._module},r.traceIs=function(t,e){if(\"various\"===(t=a(t)))return!1;var n=r.modules[t];return n||(t&&\"area\"!==t&&o.log(\"Unrecognized trace type \"+t+\".\"),n=r.modules[s.type.dflt]),!!n.categories[e]},r.getComponentMethod=function(t,e){var n=r.componentsRegistry[t];return n?n[e]||i:i}},{\"./lib/loggers\":139,\"./lib/noop\":143,\"./lib/push_unique\":147,\"./plots/attributes\":169}],207:[function(t,e,r){\"use strict\";function n(t){var e;switch(t){case\"themes__thumb\":e={autosize:!0,width:150,height:150,title:\"\",showlegend:!1,margin:{l:5,r:5,t:5,b:5,pad:0},annotations:[]};break;case\"thumbnail\":e={title:\"\",hidesources:!0,showlegend:!1,borderwidth:0,bordercolor:\"\",margin:{l:1,r:1,t:1,b:1,pad:0},annotations:[]};break;default:e={}}return e}function a(t){return[\"xaxis\",\"yaxis\",\"zaxis\"].indexOf(t.slice(0,5))>-1}var o=t(\"../lib\"),i=t(\"../plots/plots\"),l=o.extendFlat,s=o.extendDeep;e.exports=function(t,e){t.framework&&t.framework.isPolar&&(t=t.framework.getConfig());var r,o=t.data,c=t.layout,u=s([],o),f=s({},c,n(e.tileClass)),d=t._context||{};if(e.width&&(f.width=e.width),e.height&&(f.height=e.height),\"thumbnail\"===e.tileClass||\"themes__thumb\"===e.tileClass){f.annotations=[];var h=Object.keys(f);for(r=0;r<h.length;r++)a(h[r])&&(f[h[r]].title=\"\");for(r=0;r<u.length;r++){var p=u[r];p.showscale=!1,p.marker&&(p.marker.showscale=!1),\"pie\"===p.type&&(p.textposition=\"none\")}}if(Array.isArray(e.annotations))for(r=0;r<e.annotations.length;r++)f.annotations.push(e.annotations[r]);var g=i.getSubplotIds(f,\"gl3d\");if(g.length){var v={};for(\"thumbnail\"===e.tileClass&&(v={title:\"\",showaxeslabels:!1,showticklabels:!1,linetickenable:!1}),r=0;r<g.length;r++){var m=f[g[r]];m.xaxis||(m.xaxis={}),m.yaxis||(m.yaxis={}),m.zaxis||(m.zaxis={}),l(m.xaxis,v),l(m.yaxis,v),l(m.zaxis,v),m._scene=null}}var y=document.createElement(\"div\");e.tileClass&&(y.className=e.tileClass);var x={gd:y,td:y,layout:f,data:u,config:{staticPlot:void 0===e.staticPlot||e.staticPlot,plotGlPixelRatio:void 0===e.plotGlPixelRatio?2:e.plotGlPixelRatio,displaylogo:e.displaylogo||!1,showLink:e.showLink||!1,showTips:e.showTips||!1,mapboxAccessToken:d.mapboxAccessToken}}\n",
|
|
";return\"transparent\"!==e.setBackground&&(x.config.setBackground=e.setBackground||\"opaque\"),x.gd.defaultLayout=n(e.tileClass),x}},{\"../lib\":136,\"../plots/plots\":199}],208:[function(t,e,r){\"use strict\";function n(t,e){return e=e||{},e.format=e.format||\"png\",new Promise(function(r,n){t._snapshotInProgress&&n(new Error(\"Snapshotting already in progress.\")),o.isIE()&&\"svg\"!==e.format&&n(new Error(\"Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.\")),t._snapshotInProgress=!0;var l=a(t,e),s=e.filename||t.fn||\"newplot\";s+=\".\"+e.format,l.then(function(e){return t._snapshotInProgress=!1,i(e,s)}).then(function(t){r(t)}).catch(function(e){t._snapshotInProgress=!1,n(e)})})}var a=t(\"../plot_api/to_image\"),o=t(\"../lib\"),i=t(\"./filesaver\");e.exports=n},{\"../lib\":136,\"../plot_api/to_image\":164,\"./filesaver\":209}],209:[function(t,e,r){\"use strict\";var n=function(t,e){var r=document.createElement(\"a\"),n=\"download\"in r,a=/Version\\/[\\d\\.]+.*Safari/.test(navigator.userAgent);return new Promise(function(o,i){\"undefined\"!=typeof navigator&&/MSIE [1-9]\\./.test(navigator.userAgent)&&i(new Error(\"IE < 10 unsupported\")),a&&(document.location.href=\"data:application/octet-stream\"+t.slice(t.search(/[,;]/)),o(e)),e||(e=\"download\"),n&&(r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),o(e)),\"undefined\"!=typeof navigator&&navigator.msSaveBlob&&(navigator.msSaveBlob(new Blob([t]),e),o(e)),i(new Error(\"download error\"))})};e.exports=n},{}],210:[function(t,e,r){\"use strict\";r.getDelay=function(t){return t._has&&(t._has(\"gl3d\")||t._has(\"gl2d\"))?500:0},r.getRedrawFunc=function(t){if(!(t.data&&t.data[0]&&t.data[0].r))return function(){(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()})}}},{}],211:[function(t,e,r){\"use strict\";var n=t(\"./helpers\"),a={getDelay:n.getDelay,getRedrawFunc:n.getRedrawFunc,clone:t(\"./cloneplot\"),toSVG:t(\"./tosvg\"),svgToImg:t(\"./svgtoimg\"),toImage:t(\"./toimage\"),downloadImage:t(\"./download\")};e.exports=a},{\"./cloneplot\":207,\"./download\":208,\"./helpers\":210,\"./svgtoimg\":212,\"./toimage\":213,\"./tosvg\":214}],212:[function(t,e,r){\"use strict\";function n(t){var e=t.emitter||new o,r=new Promise(function(n,o){var i=window.Image,l=t.svg,s=t.format||\"png\";if(a.isIE()&&(l=l.replace(/\"/gi,\"'\"),l=l.replace(/(\\('#)(.*)('\\))/gi,'(\"$2\")'),l=l.replace(/(\\\\')/gi,'\"'),\"svg\"!==s)){var c=new Error(\"Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.\");return o(c),t.promise?r:e.emit(\"error\",c)}var u=t.canvas,f=u.getContext(\"2d\"),d=new i,h=\"data:image/svg+xml,\"+encodeURIComponent(l);u.height=t.height||150,u.width=t.width||300,d.onload=function(){var r;switch(\"svg\"!==s&&f.drawImage(d,0,0),s){case\"jpeg\":r=u.toDataURL(\"image/jpeg\");break;case\"png\":r=u.toDataURL(\"image/png\");break;case\"webp\":r=u.toDataURL(\"image/webp\");break;case\"svg\":r=h;break;default:if(o(new Error(\"Image format is not jpeg, png or svg\")),!t.promise)return e.emit(\"error\",\"Image format is not jpeg, png or svg\")}n(r),t.promise||e.emit(\"success\",r)},d.onerror=function(r){if(o(r),!t.promise)return e.emit(\"error\",r)},d.src=h});return t.promise?r:e}var a=t(\"../lib\"),o=t(\"events\").EventEmitter;e.exports=n},{\"../lib\":136,events:9}],213:[function(t,e,r){\"use strict\";function n(t,e){function r(){var t=l.getDelay(d._fullLayout);setTimeout(function(){var t=c(d),r=document.createElement(\"canvas\");r.id=i.randstr(),n=u({format:e.format,width:d._fullLayout.width,height:d._fullLayout.height,canvas:r,emitter:n,svg:t}),n.clean=function(){d&&document.body.removeChild(d)}},t)}var n=new a,f=s(t,{format:\"png\"}),d=f.gd;d.style.position=\"absolute\",d.style.left=\"-5000px\",document.body.appendChild(d);var h=l.getRedrawFunc(d);return o.plot(d,f.data,f.layout,f.config).then(h).then(r).catch(function(t){n.emit(\"error\",t)}),n}var a=t(\"events\").EventEmitter,o=t(\"../plotly\"),i=t(\"../lib\"),l=t(\"./helpers\"),s=t(\"./cloneplot\"),c=t(\"./tosvg\"),u=t(\"./svgtoimg\");e.exports=n},{\"../lib\":136,\"../plotly\":166,\"./cloneplot\":207,\"./helpers\":210,\"./svgtoimg\":212,\"./tosvg\":214,events:9}],214:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../lib/svg_text_utils\"),o=t(\"../components/drawing\"),i=t(\"../components/color\"),l=t(\"../constants/xmlns_namespaces\");e.exports=function(t,e){var r,s=t._fullLayout,c=s._paper,u=s._toppaper;c.insert(\"rect\",\":first-child\").call(o.setRect,0,0,s.width,s.height).call(i.fill,s.paper_bgcolor);var f=s._basePlotModules||[];for(r=0;r<f.length;r++){var d=f[r];d.toSVG&&d.toSVG(t)}if(u){var h=u.node().childNodes,p=Array.prototype.slice.call(h);for(r=0;r<p.length;r++){var g=p[r];g.childNodes.length&&c.node().appendChild(g)}}s._draggers&&s._draggers.remove(),c.node().style.background=\"\",c.selectAll(\"text\").attr(\"data-unformatted\",null).each(function(){var t=n.select(this);if(\"hidden\"===t.style(\"visibility\"))return void t.remove();t.style(\"visibility\",\"visible\");var e=t.style(\"font-family\");e&&e.indexOf('\"')!==-1&&t.style(\"font-family\",e.replace(/\"/g,\"TOBESTRIPPED\"))}),\"pdf\"!==e&&\"eps\"!==e||c.selectAll(\"#MathJax_SVG_glyphs path\").attr(\"stroke-width\",0),c.node().setAttributeNS(l.xmlns,\"xmlns\",l.svg),c.node().setAttributeNS(l.xmlns,\"xmlns:xlink\",l.xlink);var v=(new window.XMLSerializer).serializeToString(c.node());return v=a.html_entity_decode(v),v=a.xml_entity_encode(v),v=v.replace(/(\"TOBESTRIPPED)|(TOBESTRIPPED\")/g,\"'\")}},{\"../components/color\":25,\"../components/drawing\":49,\"../constants/xmlns_namespaces\":124,\"../lib/svg_text_utils\":153,d3:7}],215:[function(t,e,r){\"use strict\";var n=t(\"../../lib\").mergeArray;e.exports=function(t,e){n(e.text,t,\"tx\"),n(e.hovertext,t,\"htx\");var r=e.marker;if(r){n(r.opacity,t,\"mo\"),n(r.color,t,\"mc\");var a=r.line;a&&(n(a.color,t,\"mlc\"),n(a.width,t,\"mlw\"))}}},{\"../../lib\":136}],216:[function(t,e,r){\"use strict\";var n=t(\"../scatter/attributes\"),a=t(\"../../components/colorscale/color_attributes\"),o=t(\"../../components/errorbars/attributes\"),i=t(\"../../components/colorbar/attributes\"),l=t(\"../../plots/font_attributes\"),s=t(\"../../lib/extend\").extendFlat,c=t(\"../../lib/extend\").extendDeep,u=c({},l);u.family.arrayOk=!0,u.size.arrayOk=!0,u.color.arrayOk=!0;var f=n.marker,d=f.line,h=s({},d.width,{dflt:0}),p=s({},{width:h},a(\"marker.line\")),g=s({},{line:p},a(\"marker\"),{showscale:f.showscale,colorbar:i});e.exports={x:n.x,x0:n.x0,dx:n.dx,y:n.y,y0:n.y0,dy:n.dy,text:n.text,hovertext:n.hovertext,textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"none\",arrayOk:!0},textfont:s({},u,{}),insidetextfont:s({},u,{}),outsidetextfont:s({},u,{}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"]},base:{valType:\"any\",dflt:null,arrayOk:!0},offset:{valType:\"number\",dflt:null,arrayOk:!0},width:{valType:\"number\",dflt:null,min:0,arrayOk:!0},marker:g,r:n.r,t:n.t,error_y:o,error_x:o,_deprecated:{bardir:{valType:\"enumerated\",values:[\"v\",\"h\"]}}}},{\"../../components/colorbar/attributes\":26,\"../../components/colorscale/color_attributes\":32,\"../../components/errorbars/attributes\":51,\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../scatter/attributes\":240}],217:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../components/colorscale/has_colorscale\"),i=t(\"../../components/colorscale/calc\"),l=t(\"./arrays_to_calcdata\");e.exports=function(t,e){var r,s,c,u,f,d=a.getFromId(t,e.xaxis||\"x\"),h=a.getFromId(t,e.yaxis||\"y\"),p=e.orientation||(e.x&&!e.y?\"h\":\"v\");\"h\"===p?(r=d,c=d.makeCalcdata(e,\"x\"),s=h.makeCalcdata(e,\"y\"),f=e.xcalendar):(r=h,c=h.makeCalcdata(e,\"y\"),s=d.makeCalcdata(e,\"x\"),f=e.ycalendar);var g=Math.min(s.length,c.length),v=new Array(g);for(u=0;u<g;u++)v[u]={p:s[u],s:c[u]};var m,y=e.base;if(Array.isArray(y)){for(u=0;u<Math.min(y.length,v.length);u++)m=r.d2c(y[u],0,f),v[u].b=n(m)?m:0;for(;u<v.length;u++)v[u].b=0}else for(m=r.d2c(y,0,f),m=n(m)?m:0,u=0;u<v.length;u++)v[u].b=m;return o(e,\"marker\")&&i(e,e.marker.color,\"marker\",\"c\"),o(e,\"marker.line\")&&i(e,e.marker.line.color,\"marker.line\",\"c\"),l(v,e),v}},{\"../../components/colorscale/calc\":31,\"../../components/colorscale/has_colorscale\":38,\"../../plots/cartesian/axes\":171,\"./arrays_to_calcdata\":215,\"fast-isnumeric\":10}],218:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../components/color\"),o=t(\"../scatter/xy_defaults\"),i=t(\"../bar/style_defaults\"),l=t(\"../../components/errorbars/defaults\"),s=t(\"./attributes\");e.exports=function(t,e,r,c){function u(r,a){return n.coerce(t,e,s,r,a)}var f=n.coerceFont;if(!o(t,e,c,u))return void(e.visible=!1);u(\"orientation\",e.x&&!e.y?\"h\":\"v\"),u(\"base\"),u(\"offset\"),u(\"width\"),u(\"text\"),u(\"hovertext\");var d=u(\"textposition\"),h=Array.isArray(d)||\"auto\"===d,p=h||\"inside\"===d,g=h||\"outside\"===d;if(p||g){var v=f(u,\"textfont\",c.font);p&&f(u,\"insidetextfont\",v),g&&f(u,\"outsidetextfont\",v)}i(t,e,u,r,c),l(t,e,a.defaultLine,{axis:\"y\"}),l(t,e,a.defaultLine,{axis:\"x\",inherit:\"y\"})}},{\"../../components/color\":25,\"../../components/errorbars/defaults\":54,\"../../lib\":136,\"../bar/style_defaults\":227,\"../scatter/xy_defaults\":262,\"./attributes\":216}],219:[function(t,e,r){\"use strict\";var n=t(\"../../components/fx\"),a=t(\"../../components/errorbars\"),o=t(\"../../components/color\");e.exports=function(t,e,r,i){var l,s,c,u,f,d,h,p=t.cd,g=p[0].trace,v=p[0].t,m=t.xa,y=t.ya,x=function(t){return n.inbox(u(t)-l,f(t)-l)};\"h\"===g.orientation?(l=r,s=function(t){return t.y-t.w/2},c=function(t){return t.y+t.w/2},d=function(t){return n.inbox(t.b-e,t.x-e)+(t.x-e)/(t.x-t.b)},h=x):(l=e,s=function(t){return t.x-t.w/2},c=function(t){return t.x+t.w/2},h=function(t){return n.inbox(t.b-r,t.y-r)+(t.y-r)/(t.y-t.b)},d=x),u=\"closest\"===i?s:function(t){return Math.min(s(t),t.p-v.bargroupwidth/2)},f=\"closest\"===i?c:function(t){return Math.max(c(t),t.p+v.bargroupwidth/2)};var b=n.getDistanceFunction(i,d,h);if(n.getClosest(p,b,t),t.index!==!1){var _=t.index,w=p[_],k=w.mcc||g.marker.color,M=w.mlcc||g.marker.line.color,A=w.mlw||g.marker.line.width;o.opacity(k)?t.color=k:o.opacity(M)&&A&&(t.color=M);var T=g.base?w.b+w.s:w.s;return\"h\"===g.orientation?(t.x0=t.x1=m.c2p(w.x,!0),t.xLabelVal=T,t.y0=y.c2p(u(w),!0),t.y1=y.c2p(f(w),!0),t.yLabelVal=w.p):(t.y0=t.y1=y.c2p(w.y,!0),t.yLabelVal=T,t.x0=m.c2p(u(w),!0),t.x1=m.c2p(f(w),!0),t.xLabelVal=w.p),w.htx?t.text=w.htx:g.hovertext?t.text=g.hovertext:w.tx?t.text=w.tx:g.text&&(t.text=g.text),a.hoverInfo(w,g,t),[t]}}},{\"../../components/color\":25,\"../../components/errorbars\":55,\"../../components/fx\":66}],220:[function(t,e,r){\"use strict\";var n={};n.attributes=t(\"./attributes\"),n.layoutAttributes=t(\"./layout_attributes\"),n.supplyDefaults=t(\"./defaults\"),n.supplyLayoutDefaults=t(\"./layout_defaults\"),n.calc=t(\"./calc\"),n.setPositions=t(\"./set_positions\"),n.colorbar=t(\"../scatter/colorbar\"),n.arraysToCalcdata=t(\"./arrays_to_calcdata\"),n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.hoverPoints=t(\"./hover\"),n.moduleType=\"trace\",n.name=\"bar\",n.basePlotModule=t(\"../../plots/cartesian\"),n.categories=[\"cartesian\",\"bar\",\"oriented\",\"markerColorscale\",\"errorBarsOK\",\"showLegend\"],n.meta={},e.exports=n},{\"../../plots/cartesian\":181,\"../scatter/colorbar\":243,\"./arrays_to_calcdata\":215,\"./attributes\":216,\"./calc\":217,\"./defaults\":218,\"./hover\":219,\"./layout_attributes\":221,\"./layout_defaults\":222,\"./plot\":223,\"./set_positions\":224,\"./style\":226}],221:[function(t,e,r){\"use strict\";e.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\",\"relative\"],dflt:\"group\"},barnorm:{valType:\"enumerated\",values:[\"\",\"fraction\",\"percent\"],dflt:\"\"},bargap:{valType:\"number\",min:0,max:1},bargroupgap:{valType:\"number\",min:0,max:1,dflt:0}}},{}],222:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../lib\"),i=t(\"./layout_attributes\");e.exports=function(t,e,r){function l(r,n){return o.coerce(t,e,i,r,n)}for(var s=!1,c=!1,u=!1,f={},d=0;d<r.length;d++){var h=r[d];if(n.traceIs(h,\"bar\")){if(s=!0,\"overlay\"!==t.barmode&&\"stack\"!==t.barmode){var p=h.xaxis+h.yaxis;f[p]&&(u=!0),f[p]=!0}if(h.visible&&\"histogram\"===h.type){\"category\"!==a.getFromId({_fullLayout:e},h[\"v\"===h.orientation?\"xaxis\":\"yaxis\"]).type&&(c=!0)}}}if(s){\"overlay\"!==l(\"barmode\")&&l(\"barnorm\"),l(\"bargap\",c&&!u?0:.2),l(\"bargroupgap\")}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./layout_attributes\":221}],223:[function(t,e,r){\"use strict\";function n(t,e,r,n,i,d,h,p){function g(t,e,r){var n=t.append(\"text\").attr(\"data-notex\",1).text(e).attr({class:\"bartext\",transform:\"\",\"data-bb\":\"\",\"text-anchor\":\"middle\",x:0,y:0}).call(M.font,r);return n.call(w.convertToTspans),n.selectAll(\"tspan.line\").attr({x:0,y:0}),n}var v=r[0].trace,m=v.orientation,y=l(v,n);if(y){var x=s(v,n);if(\"none\"!==x){var b,_,k,A,T=c(v,n,t._fullLayout.font),L=u(v,n,T),C=f(v,n,T),S=t._fullLayout.barmode,z=\"stack\"===S,O=\"relative\"===S,P=z||O,E=r[n],N=!P||E._outmost,I=Math.abs(d-i)-2*D,R=Math.abs(p-h)-2*D;if(\"outside\"===x&&(N||(x=\"inside\")),\"auto\"===x)if(N){b=g(e,y,L),_=M.bBox(b.node()),k=_.width,A=_.height;var F=k>0&&A>0,j=k<=I&&A<=R,B=k<=R&&A<=I,q=\"h\"===m?I>=k*(R/A):R>=A*(I/k);F&&(j||B||q)?x=\"inside\":(x=\"outside\",b.remove(),b=null)}else x=\"inside\";if(!b&&(b=g(e,y,\"outside\"===x?C:L),_=M.bBox(b.node()),k=_.width,A=_.height,k<=0||A<=0))return void b.remove();var H;H=\"outside\"===x?o(i,d,h,p,_,m):a(i,d,h,p,_,m),b.attr(\"transform\",H)}}}function a(t,e,r,n,a,o){var l,s,c,u,f,d=a.width,h=a.height,p=(a.left+a.right)/2,g=(a.top+a.bottom)/2,v=Math.abs(e-t),m=Math.abs(n-r);v>2*D&&m>2*D?(f=D,v-=2*f,m-=2*f):f=0;var y,x;return d<=v&&h<=m?(y=!1,x=1):d<=m&&h<=v?(y=!0,x=1):d<h==v<m?(y=!1,x=Math.min(v/d,m/h)):(y=!0,x=Math.min(m/d,v/h)),y&&(y=90),y?(l=x*h,s=x*d):(l=x*d,s=x*h),\"h\"===o?e<t?(c=e+f+l/2,u=(r+n)/2):(c=e-f-l/2,u=(r+n)/2):n>r?(c=(t+e)/2,u=n-f-s/2):(c=(t+e)/2,u=n+f+s/2),i(p,g,c,u,x,y)}function o(t,e,r,n,a,o){var l,s=\"h\"===o?Math.abs(n-r):Math.abs(e-t);s>2*D&&(l=D,s-=2*l);var c,u,f,d,h=\"h\"===o?Math.min(1,s/a.height):Math.min(1,s/a.width),p=(a.left+a.right)/2,g=(a.top+a.bottom)/2;return c=h*a.width,u=h*a.height,\"h\"===o?e<t?(f=e-l-c/2,d=(r+n)/2):(f=e+l+c/2,d=(r+n)/2):n>r?(f=(t+e)/2,d=n+l+u/2):(f=(t+e)/2,d=n-l-u/2),i(p,g,f,d,h,!1)}function i(t,e,r,n,a,o){var i,l;return a<1?i=\"scale(\"+a+\") \":(a=1,i=\"\"),l=o?\"rotate(\"+o+\" \"+t+\" \"+e+\") \":\"\",\"translate(\"+(r-a*t)+\" \"+(n-a*e)+\")\"+i+l}function l(t,e){var r=h(t.text,e);return p(L,r)}function s(t,e){var r=h(t.textposition,e);return g(C,r)}function c(t,e,r){return d(S,t.textfont,e,r)}function u(t,e,r){return d(z,t.insidetextfont,e,r)}function f(t,e,r){return d(O,t.outsidetextfont,e,r)}function d(t,e,r,n){e=e||{};var a=h(e.family,r),o=h(e.size,r),i=h(e.color,r);return{family:p(t.family,a,n.family),size:v(t.size,o,n.size),color:m(t.color,i,n.color)}}function h(t,e){var r;return Array.isArray(t)?e<t.length&&(r=t[e]):r=t,r}function p(t,e,r){if(\"string\"==typeof e){if(e||!t.noBlank)return e}else if(\"number\"==typeof e&&!t.strict)return String(e);return void 0!==r?r:t.dflt}function g(t,e,r){return t.coerceNumber&&(e=+e),t.values.indexOf(e)!==-1?e:void 0!==r?r:t.dflt}function v(t,e,r){if(x(e)){e=+e;var n=t.min,a=t.max;if(!(void 0!==n&&e<n||void 0!==a&&e>a))return e}return void 0!==r?r:t.dflt}function m(t,e,r){return b(e).isValid()?e:void 0!==r?r:t.dflt}var y=t(\"d3\"),x=t(\"fast-isnumeric\"),b=t(\"tinycolor2\"),_=t(\"../../lib\"),w=t(\"../../lib/svg_text_utils\"),k=t(\"../../components/color\"),M=t(\"../../components/drawing\"),A=t(\"../../components/errorbars\"),T=t(\"./attributes\"),L=T.text,C=T.textposition,S=T.textfont,z=T.insidetextfont,O=T.outsidetextfont,D=3;e.exports=function(t,e,r){var a=e.xaxis,o=e.yaxis,i=t._fullLayout,l=e.plot.select(\".barlayer\").selectAll(\"g.trace.bars\").data(r);l.enter().append(\"g\").attr(\"class\",\"trace bars\"),l.append(\"g\").attr(\"class\",\"points\").each(function(e){var r=e[0].t,l=e[0].trace,s=r.poffset,c=Array.isArray(s);y.select(this).selectAll(\"g.point\").data(_.identity).enter().append(\"g\").classed(\"point\",!0).each(function(r,u){function f(t){return 0===i.bargap&&0===i.bargroupgap?y.round(Math.round(t)-A,2):t}function d(t,e){return Math.abs(t-e)>=2?f(t):t>e?Math.ceil(t):Math.floor(t)}var h,p,g,v,m=r.p+(c?s[u]:s),b=m+r.w,_=r.b,w=_+r.s;if(\"h\"===l.orientation?(g=o.c2p(m,!0),v=o.c2p(b,!0),h=a.c2p(_,!0),p=a.c2p(w,!0)):(h=a.c2p(m,!0),p=a.c2p(b,!0),g=o.c2p(_,!0),v=o.c2p(w,!0)),!(x(h)&&x(p)&&x(g)&&x(v)&&h!==p&&g!==v))return void y.select(this).remove();var M=(r.mlw+1||l.marker.line.width+1||(r.trace?r.trace.marker.line.width:0)+1)-1,A=y.round(M/2%1,2);if(!t._context.staticPlot){var T=k.opacity(r.mc||l.marker.color),L=T<1||M>.01?f:d;h=L(h,p),p=L(p,h),g=L(g,v),v=L(v,g)}var C=y.select(this);C.append(\"path\").attr(\"d\",\"M\"+h+\",\"+g+\"V\"+v+\"H\"+p+\"V\"+g+\"Z\"),n(t,C,e,u,h,p,g,v)})}),l.call(A.plot,e)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/errorbars\":55,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"./attributes\":216,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],224:[function(t,e,r){\"use strict\";function n(t,e,r,n){if(n.length){var l,s,c,u,f,d=t._fullLayout.barmode,h=\"overlay\"===d,p=\"group\"===d;if(h)a(t,e,r,n);else if(p){for(l=[],s=[],c=0;c<n.length;c++)u=n[c],f=u[0].trace,void 0===f.offset?s.push(u):l.push(u);s.length&&o(t,e,r,s),l.length&&a(t,e,r,l)}else{for(l=[],s=[],c=0;c<n.length;c++)u=n[c],f=u[0].trace,void 0===f.base?s.push(u):l.push(u);s.length&&i(t,e,r,s),l.length&&a(t,e,r,l)}}}function a(t,e,r,n){for(var a=t._fullLayout.barnorm,o=!a,i=0;i<n.length;i++){var s=n[i],c=new w([s],!1,o);l(t,e,c),a?(g(t,r,c),v(t,r,c)):h(t,r,c)}}function o(t,e,r,n){var a=t._fullLayout,o=a.barnorm,i=!o,l=new w(n,!1,i);s(t,e,l),o?(g(t,r,l),v(t,r,l)):h(t,r,l)}function i(t,e,r,n){var a=t._fullLayout,o=a.barmode,i=\"stack\"===o,s=\"relative\"===o,c=t._fullLayout.barnorm,u=s,f=!(c||i||s),d=new w(n,u,f);l(t,e,d),p(t,r,d);for(var h=0;h<n.length;h++)for(var g=n[h],m=0;m<g.length;m++){var y=g[m];if(y.s!==x){var b=y.b+y.s===d.get(y.p,y.s);b&&(y._outmost=!0)}}c&&v(t,r,d)}function l(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.bargap,d=l.bargroupgap,h=r.minDiff,p=r.traces,g=h*(1-s),v=g,m=v*(1-d),y=-m/2;for(n=0;n<p.length;n++)a=p[n],o=a[0],i=o.t,i.barwidth=m,i.poffset=y,i.bargroupwidth=g;r.binWidth=p[0][0].t.barwidth/100,c(r),u(t,e,r),f(t,e,r)}function s(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.bargap,d=l.bargroupgap,h=r.positions,p=r.distinctPositions,g=r.minDiff,v=r.traces,m=h.length!==p.length,y=v.length,x=g*(1-s),b=m?x/y:x,_=b*(1-d);for(n=0;n<y;n++){a=v[n],o=a[0];var w=m?((2*n+1-y)*b-_)/2:-_/2;i=o.t,i.barwidth=_,i.poffset=w,i.bargroupwidth=x}r.binWidth=v[0][0].t.barwidth/100,c(r),u(t,e,r),f(t,e,r,m)}function c(t){var e,r,n,a,o,i,l=t.traces;for(e=0;e<l.length;e++){r=l[e],n=r[0],a=n.trace,i=n.t;var s,c=a.offset,u=i.poffset;if(Array.isArray(c)){for(s=c.slice(0,r.length),o=0;o<s.length;o++)y(s[o])||(s[o]=u);for(o=s.length;o<r.length;o++)s.push(u);i.poffset=s}else void 0!==c&&(i.poffset=c);var f=a.width,d=i.barwidth;if(Array.isArray(f)){var h=f.slice(0,r.length);for(o=0;o<h.length;o++)y(h[o])||(h[o]=d);for(o=h.length;o<r.length;o++)h.push(d);if(i.barwidth=h,void 0===c){for(s=[],o=0;o<r.length;o++)s.push(u+(d-h[o])/2);i.poffset=s}}else void 0!==f&&(i.barwidth=f,void 0===c&&(i.poffset=u+(d-f)/2))}}function u(t,e,r){for(var n=r.traces,a=m(e),o=0;o<n.length;o++)for(var i=n[o],l=i[0].t,s=l.poffset,c=Array.isArray(s),u=l.barwidth,f=Array.isArray(u),d=0;d<i.length;d++){var h=i[d],p=h.w=f?u[d]:u;h[a]=h.p+(c?s[d]:s)+p/2}}function f(t,e,r,n){var a=r.traces,o=r.distinctPositions,i=o[0],l=r.minDiff,s=l/2;_.minDtick(e,l,i,n);for(var c=Math.min.apply(Math,o)-s,u=Math.max.apply(Math,o)+s,f=0;f<a.length;f++){var d=a[f],h=d[0],p=h.trace;if(void 0!==p.width||void 0!==p.offset)for(var g=h.t,v=g.poffset,m=g.barwidth,y=Array.isArray(v),x=Array.isArray(m),b=0;b<d.length;b++){var w=d[b],k=y?v[b]:v,M=x?m[b]:m,A=w.p,T=A+k,L=T+M;c=Math.min(c,T),u=Math.max(u,L)}}_.expand(e,[c,u],{padded:!1})}function d(t,e){y(t[0])?t[0]=Math.min(t[0],e):t[0]=e,y(t[1])?t[1]=Math.max(t[1],e):t[1]=e}function h(t,e,r){for(var n=r.traces,a=m(e),o=e.l2c(e.c2l(0)),i=[o,o],l=0;l<n.length;l++)for(var s=n[l],c=0;c<s.length;c++){var u=s[c],f=u.b,h=f+u.s;u[a]=h,y(e.c2l(h))&&d(i,h),y(e.c2l(f))&&d(i,f)}_.expand(e,i,{tozero:!0,padded:!0})}function p(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.barnorm,c=m(e),u=r.traces,f=e.l2c(e.c2l(0)),h=[f,f];for(n=0;n<u.length;n++)for(a=u[n],o=0;o<a.length;o++)if(i=a[o],i.s!==x){var p=r.put(i.p,i.b+i.s),g=p+i.b+i.s;i.b=p,i[c]=g,s||(y(e.c2l(g))&&d(h,g),y(e.c2l(p))&&d(h,p))}s||_.expand(e,h,{tozero:!0,padded:!0})}function g(t,e,r){for(var n=r.traces,a=0;a<n.length;a++)for(var o=n[a],i=0;i<o.length;i++){var l=o[i];l.s!==x&&r.put(l.p,l.b+l.s)}}function v(t,e,r){function n(t){y(e.c2l(t))&&(t<s-l||t>c+l||!y(s))&&(f=!0,d(u,t))}for(var a=r.traces,o=m(e),i=\"fraction\"===t._fullLayout.barnorm?1:100,l=i/1e9,s=e.l2c(e.c2l(0)),c=\"stack\"===t._fullLayout.barmode?i:s,u=[s,c],f=!1,h=0;h<a.length;h++)for(var p=a[h],g=0;g<p.length;g++){var v=p[g];if(v.s!==x){var b=Math.abs(i/r.get(v.p,v.s));v.b*=b,v.s*=b;var w=v.b,k=w+v.s;v[o]=k,n(k),n(w)}}_.expand(e,u,{tozero:!0,padded:f})}function m(t){return t._id.charAt(0)}var y=t(\"fast-isnumeric\"),x=t(\"../../constants/numerical\").BADNUM,b=t(\"../../registry\"),_=t(\"../../plots/cartesian/axes\"),w=t(\"./sieve.js\");e.exports=function(t,e){var r,a=e.xaxis,o=e.yaxis,i=t._fullData,l=t.calcdata,s=[],c=[];for(r=0;r<i.length;r++){var u=i[r];u.visible===!0&&b.traceIs(u,\"bar\")&&u.xaxis===a._id&&u.yaxis===o._id&&(\"h\"===u.orientation?s.push(l[r]):c.push(l[r]))}n(t,a,o,c),n(t,o,a,s)}},{\"../../constants/numerical\":122,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./sieve.js\":225,\"fast-isnumeric\":10}],225:[function(t,e,r){\"use strict\";function n(t,e,r){this.traces=t,this.separateNegativeValues=e,this.dontMergeOverlappingData=r;for(var n=[],i=0;i<t.length;i++)for(var l=t[i],s=0;s<l.length;s++){var c=l[s];c.p!==o&&n.push(c.p)}this.positions=n;var u=a.distinctVals(this.positions);this.distinctPositions=u.vals,this.minDiff=u.minDiff,this.binWidth=this.minDiff,this.bins={}}e.exports=n;var a=t(\"../../lib\"),o=t(\"../../constants/numerical\").BADNUM;n.prototype.put=function(t,e){var r=this.getLabel(t,e),n=this.bins[r]||0;return this.bins[r]=n+e,n},n.prototype.get=function(t,e){var r=this.getLabel(t,e);return this.bins[r]||0},n.prototype.getLabel=function(t,e){return(e<0&&this.separateNegativeValues?\"v\":\"^\")+(this.dontMergeOverlappingData?t:Math.round(t/this.binWidth))}},{\"../../constants/numerical\":122,\"../../lib\":136}],226:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../components/color\"),o=t(\"../../components/drawing\"),i=t(\"../../components/errorbars\");e.exports=function(t){var e=n.select(t).selectAll(\"g.trace.bars\"),r=e.size(),l=t._fullLayout;e.style(\"opacity\",function(t){return t[0].trace.opacity}).each(function(t){(\"stack\"===l.barmode&&r>1||0===l.bargap&&0===l.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr(\"shape-rendering\",\"crispEdges\")}),e.selectAll(\"g.points\").each(function(t){var e=t[0].trace,r=e.marker,i=r.line,l=o.tryColorscale(r,\"\"),s=o.tryColorscale(r,\"line\");n.select(this).selectAll(\"path\").each(function(t){var e,o,c=(t.mlw+1||i.width+1)-1,u=n.select(this);e=\"mc\"in t?t.mcc=l(t.mc):Array.isArray(r.color)?a.defaultLine:r.color,u.style(\"stroke-width\",c+\"px\").call(a.fill,e),c&&(o=\"mlc\"in t?t.mlcc=s(t.mlc):Array.isArray(i.color)?a.defaultLine:i.color,u.call(a.stroke,o))})}),e.call(i.style)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/errorbars\":55,d3:7}],227:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"../../components/colorscale/has_colorscale\"),o=t(\"../../components/colorscale/defaults\");e.exports=function(t,e,r,i,l){r(\"marker.color\",i),a(t,\"marker\")&&o(t,e,l,r,{prefix:\"marker.\",cLetter:\"c\"}),r(\"marker.line.color\",n.defaultLine),a(t,\"marker.line\")&&o(t,e,l,r,{prefix:\"marker.line.\",cLetter:\"c\"}),r(\"marker.line.width\")}},{\"../../components/color\":25,\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38}],228:[function(t,e,r){\"use strict\";var n=t(\"../../components/color/attributes\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../plots/attributes\"),i=t(\"../../lib/extend\").extendFlat;e.exports={labels:{valType:\"data_array\"},label0:{valType:\"number\",dflt:0},dlabel:{valType:\"number\",dflt:1},values:{valType:\"data_array\"},marker:{colors:{valType:\"data_array\"},line:{color:{valType:\"color\",dflt:n.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0}}},text:{valType:\"data_array\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},scalegroup:{valType:\"string\",dflt:\"\"},textinfo:{valType:\"flaglist\",flags:[\"label\",\"text\",\"value\",\"percent\"],extras:[\"none\"]},hoverinfo:i({},o.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"auto\",arrayOk:!0},textfont:i({},a,{}),insidetextfont:i({},a,{}),outsidetextfont:i({},a,{}),domain:{x:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]},y:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]}},hole:{valType:\"number\",min:0,max:1,dflt:0},sort:{valType:\"boolean\",dflt:!0},direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"],dflt:\"counterclockwise\"},rotation:{valType:\"number\",min:-360,max:360,dflt:0},pull:{valType:\"number\",min:0,max:1,dflt:0,arrayOk:!0}}},{\"../../components/color/attributes\":24,\"../../lib/extend\":132,\"../../plots/attributes\":169,\"../../plots/font_attributes\":195}],229:[function(t,e,r){\"use strict\";function n(t,e){for(var r=[],n=0;n<t.length;n++){var a=t[n],o=a[0].trace;o._module===e&&o.visible===!0&&r.push(a)}return r}var a=t(\"../../registry\");r.name=\"pie\",r.plot=function(t){var e=a.getModule(\"pie\"),r=n(t.calcdata,e);r.length&&e.plot(t,r)},r.clean=function(t,e,r,n){var a=n._has&&n._has(\"pie\"),o=e._has&&e._has(\"pie\");a&&!o&&n._pielayer.selectAll(\"g.trace\").remove()}},{\"../../registry\":206}],230:[function(t,e,r){\"use strict\";function n(t){if(!s){var e=i.defaults;s=e.slice();var r;for(r=0;r<e.length;r++)s.push(o(e[r]).lighten(20).toHexString());for(r=0;r<i.defaults.length;r++)s.push(o(e[r]).darken(20).toHexString())}return s[t%s.length]}var a=t(\"fast-isnumeric\"),o=t(\"tinycolor2\"),i=t(\"../../components/color\"),l=t(\"./helpers\");e.exports=function(t,e){var r,s,c,u,f,d,h=e.values,p=e.labels,g=[],v=t._fullLayout,m=v._piecolormap,y={},x=!1,b=0,_=v.hiddenlabels||[];if(e.dlabel)for(p=new Array(h.length),r=0;r<h.length;r++)p[r]=String(e.label0+r*e.dlabel);for(r=0;r<h.length;r++)s=h[r],a(s)&&((s=+s)<0||(c=p[r],void 0!==c&&\"\"!==c||(c=r),c=String(c),void 0===y[c]&&(y[c]=!0,u=o(e.marker.colors[r]),u.isValid()?(u=i.addOpacity(u,u.getAlpha()),m[c]||(m[c]=u)):m[c]?u=m[c]:(u=!1,x=!0),f=_.indexOf(c)!==-1,f||(b+=s),g.push({v:s,label:c,color:u,i:r,hidden:f}))));if(e.sort&&g.sort(function(t,e){return e.v-t.v}),x)for(r=0;r<g.length;r++)d=g[r],d.color===!1&&(m[d.label]=d.color=n(v._piedefaultcolorcount),v._piedefaultcolorcount++);if(g[0]&&(g[0].vTotal=b),e.textinfo&&\"none\"!==e.textinfo){var w,k=e.textinfo.indexOf(\"label\")!==-1,M=e.textinfo.indexOf(\"text\")!==-1,A=e.textinfo.indexOf(\"value\")!==-1,T=e.textinfo.indexOf(\"percent\")!==-1,L=v.separators;for(r=0;r<g.length;r++)d=g[r],w=k?[d.label]:[],M&&e.text[d.i]&&w.push(e.text[d.i]),A&&w.push(l.formatPieValue(d.v,L)),T&&w.push(l.formatPiePercent(d.v/b,L)),d.text=w.join(\"<br>\")}return g};var s},{\"../../components/color\":25,\"./helpers\":232,\"fast-isnumeric\":10,tinycolor2:13}],231:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\");e.exports=function(t,e,r,o){function i(r,o){return n.coerce(t,e,a,r,o)}var l=n.coerceFont,s=i(\"values\");if(!Array.isArray(s)||!s.length)return void(e.visible=!1);var c=i(\"labels\");Array.isArray(c)||(i(\"label0\"),i(\"dlabel\")),i(\"marker.line.width\")&&i(\"marker.line.color\");var u=i(\"marker.colors\");Array.isArray(u)||(e.marker.colors=[]),i(\"scalegroup\");var f=i(\"text\"),d=i(\"textinfo\",Array.isArray(f)?\"text+percent\":\"percent\");if(i(\"hovertext\"),i(\"hoverinfo\",1===o._dataLength?\"label+text+value+percent\":void 0),d&&\"none\"!==d){var h=i(\"textposition\"),p=Array.isArray(h)||\"auto\"===h,g=p||\"inside\"===h,v=p||\"outside\"===h;if(g||v){var m=l(i,\"textfont\",o.font);g&&l(i,\"insidetextfont\",m),v&&l(i,\"outsidetextfont\",m)}}i(\"domain.x\"),i(\"domain.y\"),i(\"hole\"),i(\"sort\"),i(\"direction\"),i(\"rotation\"),i(\"pull\")}},{\"../../lib\":136,\"./attributes\":228}],232:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");r.formatPiePercent=function(t,e){var r=(100*t).toPrecision(3);return r.lastIndexOf(\".\")!==-1&&(r=r.replace(/[.]?0+$/,\"\")),n.numSeparate(r,e)+\"%\"},r.formatPieValue=function(t,e){var r=t.toPrecision(10);return r.lastIndexOf(\".\")!==-1&&(r=r.replace(/[.]?0+$/,\"\")),n.numSeparate(r,e)}},{\"../../lib\":136}],233:[function(t,e,r){\"use strict\";var n={};n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.supplyLayoutDefaults=t(\"./layout_defaults\"),n.layoutAttributes=t(\"./layout_attributes\"),n.calc=t(\"./calc\"),n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.styleOne=t(\"./style_one\"),n.moduleType=\"trace\",n.name=\"pie\",n.basePlotModule=t(\"./base_plot\"),n.categories=[\"pie\",\"showLegend\"],n.meta={},e.exports=n},{\"./attributes\":228,\"./base_plot\":229,\"./calc\":230,\"./defaults\":231,\"./layout_attributes\":234,\"./layout_defaults\":235,\"./plot\":236,\"./style\":237,\"./style_one\":238}],234:[function(t,e,r){\"use strict\";e.exports={hiddenlabels:{valType:\"data_array\"}}},{}],235:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./layout_attributes\");e.exports=function(t,e){!function(r,o){n.coerce(t,e,a,r,o)}(\"hiddenlabels\")}},{\"../../lib\":136,\"./layout_attributes\":234}],236:[function(t,e,r){\"use strict\";function n(t,e,r){var n=Math.sqrt(t.width*t.width+t.height*t.height),o=t.width/t.height,i=Math.PI*Math.min(e.v/r.vTotal,.5),l=1-r.trace.hole,s=a(e,r),c={scale:s*r.r*2/n,rCenter:1-s,rotate:0};if(c.scale>=1)return c;var u=o+1/(2*Math.tan(i)),f=r.r*Math.min(1/(Math.sqrt(u*u+.5)+u),l/(Math.sqrt(o*o+l/2)+o)),d={scale:2*f/t.height,rCenter:Math.cos(f/r.r)-f*o/r.r,rotate:(180/Math.PI*e.midangle+720)%180-90},h=1/o,p=h+1/(2*Math.tan(i)),g=r.r*Math.min(1/(Math.sqrt(p*p+.5)+p),l/(Math.sqrt(h*h+l/2)+h)),v={scale:2*g/t.width,rCenter:Math.cos(g/r.r)-g/o/r.r,rotate:(180/Math.PI*e.midangle+810)%180-90},m=v.scale>d.scale?v:d;return c.scale<1&&m.scale>c.scale?m:c}function a(t,e){if(t.v===e.vTotal&&!e.trace.hole)return 1;var r=Math.PI*Math.min(t.v/e.vTotal,.5);return Math.min(1/(1+1/Math.sin(r)),(1-e.trace.hole)/2)}function o(t,e){var r=e.pxmid[0],n=e.pxmid[1],a=t.width/2,o=t.height/2;return r<0&&(a*=-1),n<0&&(o*=-1),{scale:1,rCenter:1,rotate:0,x:a+Math.abs(o)*(a>0?1:-1)/2,y:o/(1+r*r/(n*n)),outside:!0}}function i(t,e){function r(t,e){return t.pxmid[1]-e.pxmid[1]}function n(t,e){return e.pxmid[1]-t.pxmid[1]}var a,o,i,l,s,c,u,f,d,h,p,g,v;for(o=0;o<2;o++)for(i=o?r:n,s=o?Math.max:Math.min,u=o?1:-1,a=0;a<2;a++){for(l=a?Math.max:Math.min,c=a?1:-1,f=t[o][a],f.sort(i),d=t[1-o][a],h=d.concat(f),g=[],p=0;p<f.length;p++)void 0!==f[p].yLabelMid&&g.push(f[p]);for(v=!1,p=0;o&&p<d.length;p++)if(void 0!==d[p].yLabelMid){v=d[p];break}for(p=0;p<g.length;p++){var m=p&&g[p-1];v&&!p&&(m=v),function(t,r){r||(r={});var n,a,i,f,d,p,g=r.labelExtraY+(o?r.yLabelMax:r.yLabelMin),v=o?t.yLabelMin:t.yLabelMax,m=o?t.yLabelMax:t.yLabelMin,y=t.cyFinal+s(t.px0[1],t.px1[1]),x=g-v;if(x*u>0&&(t.labelExtraY=x),Array.isArray(e.pull))for(a=0;a<h.length;a++)(i=h[a])===t||(e.pull[t.i]||0)>=e.pull[i.i]||((t.pxmid[1]-i.pxmid[1])*u>0?(f=i.cyFinal+s(i.px0[1],i.px1[1]),(x=f-v-t.labelExtraY)*u>0&&(t.labelExtraY+=x)):(m+t.labelExtraY-y)*u>0&&(n=3*c*Math.abs(a-h.indexOf(t)),d=i.cxFinal+l(i.px0[0],i.px1[0]),(p=d+n-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*c>0&&(t.labelExtraX+=p)))}(g[p],m)}}}function l(t,e){var r,n,a,o,i,l,s,u,f,d,h=[];for(a=0;a<t.length;a++){if(i=t[a][0],l=i.trace,r=e.w*(l.domain.x[1]-l.domain.x[0]),n=e.h*(l.domain.y[1]-l.domain.y[0]),s=l.tiltaxis*Math.PI/180,u=l.pull,Array.isArray(u))for(u=0,o=0;o<l.pull.length;o++)l.pull[o]>u&&(u=l.pull[o]);i.r=Math.min(r/c(l.tilt,Math.sin(s),l.depth),n/c(l.tilt,Math.cos(s),l.depth))/(2+2*u),i.cx=e.l+e.w*(l.domain.x[1]+l.domain.x[0])/2,i.cy=e.t+e.h*(2-l.domain.y[1]-l.domain.y[0])/2,\n",
|
|
"l.scalegroup&&h.indexOf(l.scalegroup)===-1&&h.push(l.scalegroup)}for(o=0;o<h.length;o++){for(d=1/0,f=h[o],a=0;a<t.length;a++)i=t[a][0],i.trace.scalegroup===f&&(d=Math.min(d,i.r*i.r/i.vTotal));for(a=0;a<t.length;a++)i=t[a][0],i.trace.scalegroup===f&&(i.r=Math.sqrt(d*i.vTotal))}}function s(t){function e(t){var e=f.r*Math.sin(t),r=-f.r*Math.cos(t);return h?[e*(1-l*n*n)+r*i*l,e*i*l+r*(1-l*a*a),Math.sin(o)*(r*a-e*n)]:[e,r]}var r,n,a,o,i,l,s,c,u,f=t[0],d=f.trace,h=d.tilt,p=d.rotation*Math.PI/180,g=2*Math.PI/f.vTotal,v=\"px0\",m=\"px1\";if(\"counterclockwise\"===d.direction){for(s=0;s<t.length&&t[s].hidden;s++);if(s===t.length)return;p+=g*t[s].v,g*=-1,v=\"px1\",m=\"px0\"}for(h&&(o=h*Math.PI/180,r=d.tiltaxis*Math.PI/180,i=Math.sin(r)*Math.cos(r),l=1-Math.cos(o),n=Math.sin(r),a=Math.cos(r)),u=e(p),s=0;s<t.length;s++)c=t[s],c.hidden||(c[v]=u,p+=g*c.v/2,c.pxmid=e(p),c.midangle=p,p+=g*c.v/2,u=e(p),c[m]=u,c.largeArc=c.v>f.vTotal/2?1:0)}function c(t,e,r){if(!t)return 1;var n=Math.sin(t*Math.PI/180);return Math.max(.01,r*n*Math.abs(e)+2*Math.sqrt(1-n*n*e*e))}var u=t(\"d3\"),f=t(\"../../components/fx\"),d=t(\"../../components/color\"),h=t(\"../../components/drawing\"),p=t(\"../../lib/svg_text_utils\"),g=t(\"./helpers\");e.exports=function(t,e){var r=t._fullLayout;l(e,r._size);var c=r._pielayer.selectAll(\"g.trace\").data(e);c.enter().append(\"g\").attr({\"stroke-linejoin\":\"round\",class:\"trace\"}),c.exit().remove(),c.order(),c.each(function(e){var l=u.select(this),c=e[0],v=c.trace,m=(v.depth||0)*c.r*Math.sin(0)/2,y=v.tiltaxis||0,x=y*Math.PI/180,b=[m*Math.sin(x),m*Math.cos(x)],_=c.r*Math.cos(0),w=l.selectAll(\"g.part\").data(v.tilt?[\"top\",\"sides\"]:[\"top\"]);w.enter().append(\"g\").attr(\"class\",function(t){return t+\" part\"}),w.exit().remove(),w.order(),s(e),l.selectAll(\".top\").each(function(){var l=u.select(this).selectAll(\"g.slice\").data(e);l.enter().append(\"g\").classed(\"slice\",!0),l.exit().remove();var s=[[[],[]],[[],[]]],m=!1;l.each(function(e){function i(n){n.originalEvent=u.event;var o=t._fullLayout,i=t._fullData[v.index],l=i.hoverinfo;if(\"all\"===l&&(l=\"label+text+value+percent+name\"),t._dragging||o.hovermode===!1||\"none\"===l||\"skip\"===l||!l)return void f.hover(t,n,\"pie\");var s=a(e,c),d=w+e.pxmid[0]*(1-s),h=k+e.pxmid[1]*(1-s),p=r.separators,m=[];l.indexOf(\"label\")!==-1&&m.push(e.label),l.indexOf(\"text\")!==-1&&(i.hovertext?m.push(Array.isArray(i.hovertext)?i.hovertext[e.i]:i.hovertext):i.text&&i.text[e.i]&&m.push(i.text[e.i])),l.indexOf(\"value\")!==-1&&m.push(g.formatPieValue(e.v,p)),l.indexOf(\"percent\")!==-1&&m.push(g.formatPiePercent(e.v/c.vTotal,p));var y=i.hoverlabel;f.loneHover({x0:d-s*c.r,x1:d+s*c.r,y:h,text:m.join(\"<br>\"),name:l.indexOf(\"name\")!==-1?i.name:void 0,idealAlign:e.pxmid[0]<0?\"left\":\"right\",color:e.hbg||y.bgcolor||e.color,borderColor:e.hbc||y.bordercolor,fontFamily:e.htf||y.font.family,fontSize:e.hts||y.font.size,fontColor:e.htc||y.font.color},{container:o._hoverlayer.node(),outerContainer:o._paper.node()}),f.hover(t,n,\"pie\"),T=!0}function l(e){e.originalEvent=u.event,t.emit(\"plotly_unhover\",{event:u.event,points:[e]}),T&&(f.loneUnhover(r._hoverlayer.node()),T=!1)}function d(){t._hoverdata=[e],t._hoverdata.trace=c.trace,f.click(t,u.event)}function x(t,r,n,a){return\"a\"+a*c.r+\",\"+a*_+\" \"+y+\" \"+e.largeArc+(n?\" 1 \":\" 0 \")+a*(r[0]-t[0])+\",\"+a*(r[1]-t[1])}if(e.hidden)return void u.select(this).selectAll(\"path,g\").remove();s[e.pxmid[1]<0?0:1][e.pxmid[0]<0?0:1].push(e);var w=c.cx+b[0],k=c.cy+b[1],M=u.select(this),A=M.selectAll(\"path.surface\").data([e]),T=!1;if(A.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":\"all\"}),M.select(\"path.textline\").remove(),M.on(\"mouseover\",i).on(\"mouseout\",l).on(\"click\",d),v.pull){var L=+(Array.isArray(v.pull)?v.pull[e.i]:v.pull)||0;L>0&&(w+=L*e.pxmid[0],k+=L*e.pxmid[1])}e.cxFinal=w,e.cyFinal=k;var C=v.hole;if(e.v===c.vTotal){var S=\"M\"+(w+e.px0[0])+\",\"+(k+e.px0[1])+x(e.px0,e.pxmid,!0,1)+x(e.pxmid,e.px0,!0,1)+\"Z\";C?A.attr(\"d\",\"M\"+(w+C*e.px0[0])+\",\"+(k+C*e.px0[1])+x(e.px0,e.pxmid,!1,C)+x(e.pxmid,e.px0,!1,C)+\"Z\"+S):A.attr(\"d\",S)}else{var z=x(e.px0,e.px1,!0,1);if(C){var O=1-C;A.attr(\"d\",\"M\"+(w+C*e.px1[0])+\",\"+(k+C*e.px1[1])+x(e.px1,e.px0,!1,C)+\"l\"+O*e.px0[0]+\",\"+O*e.px0[1]+z+\"Z\")}else A.attr(\"d\",\"M\"+w+\",\"+k+\"l\"+e.px0[0]+\",\"+e.px0[1]+z+\"Z\")}var D=Array.isArray(v.textposition)?v.textposition[e.i]:v.textposition,P=M.selectAll(\"g.slicetext\").data(e.text&&\"none\"!==D?[0]:[]);P.enter().append(\"g\").classed(\"slicetext\",!0),P.exit().remove(),P.each(function(){var t=u.select(this).selectAll(\"text\").data([0]);t.enter().append(\"text\").attr(\"data-notex\",1),t.exit().remove(),t.text(e.text).attr({class:\"slicetext\",transform:\"\",\"data-bb\":\"\",\"text-anchor\":\"middle\",x:0,y:0}).call(h.font,\"outside\"===D?v.outsidetextfont:v.insidetextfont).call(p.convertToTspans),t.selectAll(\"tspan.line\").attr({x:0,y:0});var r,a=h.bBox(t.node());\"outside\"===D?r=o(a,e):(r=n(a,e,c),\"auto\"===D&&r.scale<1&&(t.call(h.font,v.outsidetextfont),v.outsidetextfont.family===v.insidetextfont.family&&v.outsidetextfont.size===v.insidetextfont.size||(t.attr({\"data-bb\":\"\"}),a=h.bBox(t.node())),r=o(a,e)));var i=w+e.pxmid[0]*r.rCenter+(r.x||0),l=k+e.pxmid[1]*r.rCenter+(r.y||0);r.outside&&(e.yLabelMin=l-a.height/2,e.yLabelMid=l,e.yLabelMax=l+a.height/2,e.labelExtraX=0,e.labelExtraY=0,m=!0),t.attr(\"transform\",\"translate(\"+i+\",\"+l+\")\"+(r.scale<1?\"scale(\"+r.scale+\")\":\"\")+(r.rotate?\"rotate(\"+r.rotate+\")\":\"\")+\"translate(\"+-(a.left+a.right)/2+\",\"+-(a.top+a.bottom)/2+\")\")})}),m&&i(s,v),l.each(function(t){if(t.labelExtraX||t.labelExtraY){var e=u.select(this),r=e.select(\"g.slicetext text\");r.attr(\"transform\",\"translate(\"+t.labelExtraX+\",\"+t.labelExtraY+\")\"+r.attr(\"transform\"));var n=t.cxFinal+t.pxmid[0],a=t.cyFinal+t.pxmid[1],o=\"M\"+n+\",\"+a,i=(t.yLabelMax-t.yLabelMin)*(t.pxmid[0]<0?-1:1)/4;if(t.labelExtraX){var l=t.labelExtraX*t.pxmid[1]/t.pxmid[0],s=t.yLabelMid+t.labelExtraY-(t.cyFinal+t.pxmid[1]);Math.abs(l)>Math.abs(s)?o+=\"l\"+s*t.pxmid[0]/t.pxmid[1]+\",\"+s+\"H\"+(n+t.labelExtraX+i):o+=\"l\"+t.labelExtraX+\",\"+l+\"v\"+(s-l)+\"h\"+i}else o+=\"V\"+(t.yLabelMid+t.labelExtraY)+\"h\"+i;e.append(\"path\").classed(\"textline\",!0).call(d.stroke,v.outsidetextfont.color).attr({\"stroke-width\":Math.min(2,v.outsidetextfont.size/8),d:o,fill:\"none\"})}})})}),setTimeout(function(){c.selectAll(\"tspan\").each(function(){var t=u.select(this);t.attr(\"dy\")&&t.attr(\"dy\",t.attr(\"dy\"))})},0)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/fx\":66,\"../../lib/svg_text_utils\":153,\"./helpers\":232,d3:7}],237:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"./style_one\");e.exports=function(t){t._fullLayout._pielayer.selectAll(\".trace\").each(function(t){var e=t[0],r=e.trace,o=n.select(this);o.style({opacity:r.opacity}),o.selectAll(\".top path.surface\").each(function(t){n.select(this).call(a,t,r)})})}},{\"./style_one\":238,d3:7}],238:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\");e.exports=function(t,e,r){var a=r.marker.line.color;Array.isArray(a)&&(a=a[e.i]||n.defaultLine);var o=r.marker.line.width||0;Array.isArray(o)&&(o=o[e.i]||0),t.style({\"stroke-width\":o}).call(n.fill,e.color).call(n.stroke,a)}},{\"../../components/color\":25}],239:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e){for(var r=0;r<t.length;r++)t[r].i=r;n.mergeArray(e.text,t,\"tx\"),n.mergeArray(e.hovertext,t,\"htx\"),n.mergeArray(e.customdata,t,\"data\"),n.mergeArray(e.textposition,t,\"tp\"),e.textfont&&(n.mergeArray(e.textfont.size,t,\"ts\"),n.mergeArray(e.textfont.color,t,\"tc\"),n.mergeArray(e.textfont.family,t,\"tf\"));var a=e.marker;if(a){n.mergeArray(a.size,t,\"ms\"),n.mergeArray(a.opacity,t,\"mo\"),n.mergeArray(a.symbol,t,\"mx\"),n.mergeArray(a.color,t,\"mc\");var o=a.line;a.line&&(n.mergeArray(o.color,t,\"mlc\"),n.mergeArray(o.width,t,\"mlw\"));var i=a.gradient;i&&\"none\"!==i.type&&(n.mergeArray(i.type,t,\"mgt\"),n.mergeArray(i.color,t,\"mgc\"))}}},{\"../../lib\":136}],240:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/color_attributes\"),a=t(\"../../components/errorbars/attributes\"),o=t(\"../../components/colorbar/attributes\"),i=t(\"../../components/drawing/attributes\").dash,l=t(\"../../components/drawing\"),s=(t(\"./constants\"),t(\"../../lib/extend\").extendFlat);e.exports={x:{valType:\"data_array\"},x0:{valType:\"any\",dflt:0},dx:{valType:\"number\",dflt:1},y:{valType:\"data_array\"},y0:{valType:\"any\",dflt:0},customdata:{valType:\"data_array\"},dy:{valType:\"number\",dflt:1},ids:{valType:\"data_array\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},mode:{valType:\"flaglist\",flags:[\"lines\",\"markers\",\"text\"],extras:[\"none\"]},hoveron:{valType:\"flaglist\",flags:[\"points\",\"fills\"]},line:{color:{valType:\"color\"},width:{valType:\"number\",min:0,dflt:2},shape:{valType:\"enumerated\",values:[\"linear\",\"spline\",\"hv\",\"vh\",\"hvh\",\"vhv\"],dflt:\"linear\"},smoothing:{valType:\"number\",min:0,max:1.3,dflt:1},dash:i,simplify:{valType:\"boolean\",dflt:!0}},connectgaps:{valType:\"boolean\",dflt:!1},fill:{valType:\"enumerated\",values:[\"none\",\"tozeroy\",\"tozerox\",\"tonexty\",\"tonextx\",\"toself\",\"tonext\"],dflt:\"none\"},fillcolor:{valType:\"color\"},marker:s({},{symbol:{valType:\"enumerated\",values:l.symbolList,dflt:\"circle\",arrayOk:!0},opacity:{valType:\"number\",min:0,max:1,arrayOk:!0},size:{valType:\"number\",min:0,dflt:6,arrayOk:!0},maxdisplayed:{valType:\"number\",min:0,dflt:0},sizeref:{valType:\"number\",dflt:1},sizemin:{valType:\"number\",min:0,dflt:0},sizemode:{valType:\"enumerated\",values:[\"diameter\",\"area\"],dflt:\"diameter\"},showscale:{valType:\"boolean\",dflt:!1},colorbar:o,line:s({},{width:{valType:\"number\",min:0,arrayOk:!0}},n(\"marker.line\")),gradient:{type:{valType:\"enumerated\",values:[\"radial\",\"horizontal\",\"vertical\",\"none\"],arrayOk:!0,dflt:\"none\"},color:{valType:\"color\",arrayOk:!0}}},n(\"marker\")),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\"],dflt:\"middle center\",arrayOk:!0},textfont:{family:{valType:\"string\",noBlank:!0,strict:!0,arrayOk:!0},size:{valType:\"number\",min:1,arrayOk:!0},color:{valType:\"color\",arrayOk:!0}},r:{valType:\"data_array\"},t:{valType:\"data_array\"},error_y:a,error_x:a}},{\"../../components/colorbar/attributes\":26,\"../../components/colorscale/color_attributes\":32,\"../../components/drawing\":49,\"../../components/drawing/attributes\":48,\"../../components/errorbars/attributes\":51,\"../../lib/extend\":132,\"./constants\":245}],241:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../constants/numerical\").BADNUM,i=t(\"./subtypes\"),l=t(\"./colorscale_calc\"),s=t(\"./arrays_to_calcdata\");e.exports=function(t,e){var r,c,u,f=a.getFromId(t,e.xaxis||\"x\"),d=a.getFromId(t,e.yaxis||\"y\"),h=f.makeCalcdata(e,\"x\"),p=d.makeCalcdata(e,\"y\"),g=Math.min(h.length,p.length);f._minDtick=0,d._minDtick=0,h.length>g&&h.splice(g,h.length-g),p.length>g&&p.splice(g,p.length-g);var v={padded:!0},m={padded:!0};if(i.hasMarkers(e)){if(r=e.marker,c=r.size,Array.isArray(c)){var y={type:\"linear\"};a.setConvert(y),c=y.makeCalcdata(e.marker,\"size\"),c.length>g&&c.splice(g,c.length-g)}var x,b=1.6*(e.marker.sizeref||1);x=\"area\"===e.marker.sizemode?function(t){return Math.max(Math.sqrt((t||0)/b),3)}:function(t){return Math.max((t||0)/b,3)},v.ppad=m.ppad=Array.isArray(c)?c.map(x):x(c)}l(e),!(\"tozerox\"===e.fill||\"tonextx\"===e.fill&&t.firstscatter)||h[0]===h[g-1]&&p[0]===p[g-1]?e.error_y.visible||[\"tonexty\",\"tozeroy\"].indexOf(e.fill)===-1&&(i.hasMarkers(e)||i.hasText(e))||(v.padded=!1,v.ppad=0):v.tozero=!0,!(\"tozeroy\"===e.fill||\"tonexty\"===e.fill&&t.firstscatter)||h[0]===h[g-1]&&p[0]===p[g-1]?[\"tonextx\",\"tozerox\"].indexOf(e.fill)!==-1&&(m.padded=!1):m.tozero=!0,a.expand(f,h,v),a.expand(d,p,m);var _=new Array(g);for(u=0;u<g;u++)_[u]=n(h[u])&&n(p[u])?{x:h[u],y:p[u]}:{x:o,y:o},e.ids&&(_[u].id=String(e.ids[u]));return s(_,e),t.firstscatter=!1,_}},{\"../../constants/numerical\":122,\"../../plots/cartesian/axes\":171,\"./arrays_to_calcdata\":239,\"./colorscale_calc\":244,\"./subtypes\":260,\"fast-isnumeric\":10}],242:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e=0;e<t.length;e++){var r=t[e];if(\"scatter\"===r.type){var n=r.fill;if(\"none\"!==n&&\"toself\"!==n&&(r.opacity=void 0,\"tonexty\"===n||\"tonextx\"===n))for(var a=e-1;a>=0;a--){var o=t[a];if(\"scatter\"===o.type&&o.xaxis===r.xaxis&&o.yaxis===r.yaxis){o.opacity=void 0;break}}}}}},{}],243:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../../plots/plots\"),i=t(\"../../components/colorscale\"),l=t(\"../../components/colorbar/draw\");e.exports=function(t,e){var r=e[0].trace,s=r.marker,c=\"cb\"+r.uid;if(t._fullLayout._infolayer.selectAll(\".\"+c).remove(),void 0===s||!s.showscale)return void o.autoMargin(t,c);var u=s.color,f=s.cmin,d=s.cmax;n(f)||(f=a.aggNums(Math.min,null,u)),n(d)||(d=a.aggNums(Math.max,null,u));var h=e[0].t.cb=l(t,c),p=i.makeColorScaleFunc(i.extractScale(s.colorscale,f,d),{noNumericCheck:!0});h.fillcolor(p).filllevels({start:f,end:d,size:(d-f)/254}).options(s.colorbar)()}},{\"../../components/colorbar/draw\":28,\"../../components/colorscale\":39,\"../../lib\":136,\"../../plots/plots\":199,\"fast-isnumeric\":10}],244:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/has_colorscale\"),a=t(\"../../components/colorscale/calc\"),o=t(\"./subtypes\");e.exports=function(t){o.hasLines(t)&&n(t,\"line\")&&a(t,t.line.color,\"line\",\"c\"),o.hasMarkers(t)&&(n(t,\"marker\")&&a(t,t.marker.color,\"marker\",\"c\"),n(t,\"marker.line\")&&a(t,t.marker.line.color,\"marker.line\",\"c\"))}},{\"../../components/colorscale/calc\":31,\"../../components/colorscale/has_colorscale\":38,\"./subtypes\":260}],245:[function(t,e,r){\"use strict\";e.exports={PTS_LINESONLY:20}},{}],246:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\"),o=t(\"./constants\"),i=t(\"./subtypes\"),l=t(\"./xy_defaults\"),s=t(\"./marker_defaults\"),c=t(\"./line_defaults\"),u=t(\"./line_shape_defaults\"),f=t(\"./text_defaults\"),d=t(\"./fillcolor_defaults\"),h=t(\"../../components/errorbars/defaults\");e.exports=function(t,e,r,p){function g(r,o){return n.coerce(t,e,a,r,o)}var v=l(t,e,p,g),m=v<o.PTS_LINESONLY?\"lines+markers\":\"lines\";if(!v)return void(e.visible=!1);g(\"customdata\"),g(\"text\"),g(\"hovertext\"),g(\"mode\",m),g(\"ids\"),i.hasLines(e)&&(c(t,e,r,p,g),u(t,e,g),g(\"connectgaps\"),g(\"line.simplify\")),i.hasMarkers(e)&&s(t,e,r,p,g,{gradient:!0}),i.hasText(e)&&f(t,e,p,g);var y=[];(i.hasMarkers(e)||i.hasText(e))&&(g(\"marker.maxdisplayed\"),y.push(\"points\")),g(\"fill\"),\"none\"!==e.fill&&(d(t,e,r,g),i.hasLines(e)||u(t,e,g)),\"tonext\"!==e.fill&&\"toself\"!==e.fill||y.push(\"fills\"),g(\"hoveron\",y.join(\"+\")||\"points\"),h(t,e,r,{axis:\"y\"}),h(t,e,r,{axis:\"x\",inherit:\"y\"})}},{\"../../components/errorbars/defaults\":54,\"../../lib\":136,\"./attributes\":240,\"./constants\":245,\"./fillcolor_defaults\":247,\"./line_defaults\":251,\"./line_shape_defaults\":253,\"./marker_defaults\":256,\"./subtypes\":260,\"./text_defaults\":261,\"./xy_defaults\":262}],247:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\");e.exports=function(t,e,r,a){var o=!1;if(e.marker){var i=e.marker.color,l=(e.marker.line||{}).color;i&&!Array.isArray(i)?o=i:l&&!Array.isArray(l)&&(o=l)}a(\"fillcolor\",n.addOpacity((e.line||{}).color||o||r,.5))}},{\"../../components/color\":25}],248:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"./subtypes\");e.exports=function(t,e){var r,o;if(\"lines\"===t.mode)return r=t.line.color,r&&n.opacity(r)?r:t.fillcolor;if(\"none\"===t.mode)return t.fill?t.fillcolor:\"\";var i=e.mcc||(t.marker||{}).color,l=e.mlcc||((t.marker||{}).line||{}).color;return o=i&&n.opacity(i)?i:l&&n.opacity(l)&&(e.mlw||((t.marker||{}).line||{}).width)?l:\"\",o?n.opacity(o)<.3?n.addOpacity(o,.3):o:(r=(t.line||{}).color,r&&n.opacity(r)&&a.hasLines(t)&&t.line.width?r:t.fillcolor)}},{\"../../components/color\":25,\"./subtypes\":260}],249:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../components/fx\"),o=t(\"../../components/errorbars\"),i=t(\"./get_trace_color\"),l=t(\"../../components/color\"),s=a.constants.MAXDIST;e.exports=function(t,e,r,c){var u=t.cd,f=u[0].trace,d=t.xa,h=t.ya,p=d.c2p(e),g=h.c2p(r),v=[p,g];if(f.hoveron.indexOf(\"points\")!==-1){var m=function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(d.c2p(t.x)-p)-e,1-3/e)},y=function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(h.c2p(t.y)-g)-e,1-3/e)},x=function(t){var e=Math.max(3,t.mrc||0),r=d.c2p(t.x)-p,n=h.c2p(t.y)-g;return Math.max(Math.sqrt(r*r+n*n)-e,1-3/e)},b=a.getDistanceFunction(c,m,y,x);if(a.getClosest(u,b,t),t.index!==!1){var _=u[t.index],w=d.c2p(_.x,!0),k=h.c2p(_.y,!0),M=_.mrc||1;return n.extendFlat(t,{color:i(f,_),x0:w-M,x1:w+M,xLabelVal:_.x,y0:k-M,y1:k+M,yLabelVal:_.y}),_.htx?t.text=_.htx:f.hovertext?t.text=f.hovertext:_.tx?t.text=_.tx:f.text&&(t.text=f.text),o.hoverInfo(_,f,t),[t]}}if(f.hoveron.indexOf(\"fills\")!==-1&&f._polygons){var A,T,L,C,S,z,O,D,P,E=f._polygons,N=[],I=!1,R=1/0,F=-1/0,j=1/0,B=-1/0;for(A=0;A<E.length;A++)L=E[A],L.contains(v)&&(I=!I,N.push(L),j=Math.min(j,L.ymin),B=Math.max(B,L.ymax));if(I){j=Math.max(j,0),B=Math.min(B,h._length);var q=(j+B)/2;for(A=0;A<N.length;A++)for(C=N[A].pts,T=1;T<C.length;T++)D=C[T-1][1],P=C[T][1],D>q!=P>=q&&(z=C[T-1][0],O=C[T][0],S=z+(O-z)*(q-D)/(P-D),R=Math.min(R,S),F=Math.max(F,S));R=Math.max(R,0),F=Math.min(F,d._length);var H=l.defaultLine;return l.opacity(f.fillcolor)?H=f.fillcolor:l.opacity((f.line||{}).color)&&(H=f.line.color),n.extendFlat(t,{distance:s+10,x0:R,x1:F,y0:q,y1:q,color:H}),delete t.index,f.text&&!Array.isArray(f.text)?t.text=String(f.text):t.text=f.name,[t]}}}},{\"../../components/color\":25,\"../../components/errorbars\":55,\"../../components/fx\":66,\"../../lib\":136,\"./get_trace_color\":248}],250:[function(t,e,r){\"use strict\";var n={},a=t(\"./subtypes\");n.hasLines=a.hasLines,n.hasMarkers=a.hasMarkers,n.hasText=a.hasText,n.isBubble=a.isBubble,n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.cleanData=t(\"./clean_data\"),n.calc=t(\"./calc\"),n.arraysToCalcdata=t(\"./arrays_to_calcdata\"),n.plot=t(\"./plot\"),n.colorbar=t(\"./colorbar\"),n.style=t(\"./style\"),n.hoverPoints=t(\"./hover\"),n.selectPoints=t(\"./select\"),n.animatable=!0,n.moduleType=\"trace\",n.name=\"scatter\",n.basePlotModule=t(\"../../plots/cartesian\"),n.categories=[\"cartesian\",\"symbols\",\"markerColorscale\",\"errorBarsOK\",\"showLegend\"],n.meta={},e.exports=n},{\"../../plots/cartesian\":181,\"./arrays_to_calcdata\":239,\"./attributes\":240,\"./calc\":241,\"./clean_data\":242,\"./colorbar\":243,\"./defaults\":246,\"./hover\":249,\"./plot\":257,\"./select\":258,\"./style\":259,\"./subtypes\":260}],251:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/has_colorscale\"),a=t(\"../../components/colorscale/defaults\");e.exports=function(t,e,r,o,i,l){var s=(t.marker||{}).color;if(i(\"line.color\",r),n(t,\"line\"))a(t,e,o,i,{prefix:\"line.\",cLetter:\"c\"});else{i(\"line.color\",!Array.isArray(s)&&s||r)}i(\"line.width\"),(l||{}).noDash||i(\"line.dash\")}},{\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38}],252:[function(t,e,r){\"use strict\";var n=t(\"../../constants/numerical\").BADNUM;e.exports=function(t,e){function r(e){var r=_.c2p(t[e].x),a=w.c2p(t[e].y);return r!==n&&a!==n&&[r,a]}function a(t){var e=t[0]/_._length,r=t[1]/w._length;return(1+10*Math.max(0,-e,e-1,-r,r-1))*A}var o,i,l,s,c,u,f,d,h,p,g,v,m,y,x,b,_=e.xaxis,w=e.yaxis,k=e.simplify,M=e.connectGaps,A=e.baseTolerance,T=e.linear,L=[],C=.2,S=new Array(t.length),z=0;for(k||(A=C=-1),o=0;o<t.length;o++)if(i=r(o)){for(z=0,S[z++]=i,o++;o<t.length;o++){if(!(s=r(o))){if(M)continue;break}if(T){if(!((f=function(t,e){var r=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(r*r+n*n)}(s,i))<a(s)*C)){for(h=[(s[0]-i[0])/f,(s[1]-i[1])/f],c=i,g=f,v=y=x=0,d=!1,l=s,o++;o<t.length;o++){if(!(u=r(o))){if(M)continue;break}if(p=[u[0]-i[0],u[1]-i[1]],b=p[0]*h[1]-p[1]*h[0],y=Math.min(y,b),(x=Math.max(x,b))-y>a(u))break;l=u,m=p[0]*h[0]+p[1]*h[1],m>g?(g=m,s=u,d=!1):m<v&&(v=m,c=u,d=!0)}if(d?(S[z++]=s,l!==c&&(S[z++]=c)):(c!==i&&(S[z++]=c),l!==s&&(S[z++]=s)),S[z++]=l,o>=t.length||!u)break;S[z++]=u,i=u}}else S[z++]=s}L.push(S.slice(0,z))}return L}},{\"../../constants/numerical\":122}],253:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){\"spline\"===r(\"line.shape\")&&r(\"line.smoothing\")}},{}],254:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){for(var n,a,o=null,i=0;i<r.length;++i)n=r[i],a=n[0].trace,a.visible===!0?(a._nexttrace=null,[\"tonextx\",\"tonexty\",\"tonext\"].indexOf(a.fill)!==-1&&(a._prevtrace=o,o&&(o._nexttrace=a)),o=a):a._prevtrace=a._nexttrace=null}},{}],255:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");e.exports=function(t){var e=t.marker,r=e.sizeref||1,a=e.sizemin||0,o=\"area\"===e.sizemode?function(t){return Math.sqrt(t/r)}:function(t){return t/r};return function(t){var e=o(t/2);return n(e)&&e>0?Math.max(e,a):0}}},{\"fast-isnumeric\":10}],256:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"../../components/colorscale/has_colorscale\"),o=t(\"../../components/colorscale/defaults\"),i=t(\"./subtypes\");e.exports=function(t,e,r,l,s,c){var u,f=i.isBubble(t),d=(t.line||{}).color;if(c=c||{},d&&(r=d),s(\"marker.symbol\"),s(\"marker.opacity\",f?.7:1),s(\"marker.size\"),s(\"marker.color\",r),a(t,\"marker\")&&o(t,e,l,s,{prefix:\"marker.\",cLetter:\"c\"}),c.noLine||(u=d&&!Array.isArray(d)&&e.marker.color!==d?d:f?n.background:n.defaultLine,s(\"marker.line.color\",u),a(t,\"marker.line\")&&o(t,e,l,s,{prefix:\"marker.line.\",cLetter:\"c\"}),s(\"marker.line.width\",f?1:0)),f&&(s(\"marker.sizeref\"),s(\"marker.sizemin\"),s(\"marker.sizemode\")),c.gradient){\"none\"!==s(\"marker.gradient.type\")&&s(\"marker.gradient.color\")}}},{\"../../components/color\":25,\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38,\"./subtypes\":260}],257:[function(t,e,r){\"use strict\";function n(t,e){var r;e.selectAll(\"g.trace\").each(function(t){var e=i.select(this);if(r=t[0].trace,r._nexttrace){if(r._nextFill=e.select(\".js-fill.js-tonext\"),!r._nextFill.size()){var n=\":first-child\";e.select(\".js-fill.js-tozero\").size()&&(n+=\" + *\"),r._nextFill=e.insert(\"path\",n).attr(\"class\",\"js-fill js-tonext\")}}else e.selectAll(\".js-fill.js-tonext\").remove(),r._nextFill=null;r.fill&&(\"tozero\"===r.fill.substr(0,6)||\"toself\"===r.fill||\"to\"===r.fill.substr(0,2)&&!r._prevtrace)?(r._ownFill=e.select(\".js-fill.js-tozero\"),r._ownFill.size()||(r._ownFill=e.insert(\"path\",\":first-child\").attr(\"class\",\"js-fill js-tozero\"))):(e.selectAll(\".js-fill.js-tozero\").remove(),r._ownFill=null)})}function a(t,e,r,n,a,d,p){function g(t){return k?t.transition():t}function v(t){return t.filter(function(t){return t.vis})}function m(t){return t.id}function y(t){if(t.ids)return m}function x(){return!1}function b(e){var r,n,a,o=e[0].trace,c=i.select(this),f=u.hasMarkers(o),d=u.hasText(o),h=y(o),p=x,m=x;f&&(p=o.marker.maxdisplayed||o._needsCull?v:l.identity),d&&(m=o.marker.maxdisplayed||o._needsCull?v:l.identity),n=c.selectAll(\"path.point\"),r=n.data(p,h);var b=r.enter().append(\"path\").classed(\"point\",!0);b.call(s.pointStyle,o).call(s.translatePoints,M,A,o),k&&b.style(\"opacity\",0).transition().style(\"opacity\",1);var _=f&&s.tryColorscale(o.marker,\"\"),w=f&&s.tryColorscale(o.marker,\"line\");r.each(function(e){var r=i.select(this),n=g(r);(a=s.translatePoint(e,n,M,A))&&(s.singlePointStyle(e,n,o,_,w,t),o.customdata&&r.classed(\"plotly-customdata\",null!==e.data&&void 0!==e.data))}),k?r.exit().transition().style(\"opacity\",0).remove():r.exit().remove(),n=c.selectAll(\"g\"),r=n.data(m,h),r.enter().append(\"g\").classed(\"textpoint\",!0).append(\"text\"),r.each(function(t){var e=i.select(this),r=g(e.select(\"text\"));(a=s.translatePoint(t,r,M,A))||e.remove()}),r.selectAll(\"text\").call(s.textPointStyle,o).each(function(t){var e=t.xp||M.c2p(t.x),r=t.yp||A.c2p(t.y);i.select(this).selectAll(\"tspan.line\").each(function(){g(i.select(this)).attr({x:e,y:r})})}),r.exit().remove()}var _,w;o(t,e,r,n,a);var k=!!p&&p.duration>0,M=r.xaxis,A=r.yaxis,T=n[0].trace,L=T.line,C=i.select(d);if(C.call(c.plot,r,p),T.visible===!0){g(C).style(\"opacity\",T.opacity);var S,z,O=T.fill.charAt(T.fill.length-1);\"x\"!==O&&\"y\"!==O&&(O=\"\"),n[0].node3=C;var D=\"\",P=[],E=T._prevtrace;E&&(D=E._prevRevpath||\"\",z=E._nextFill,P=E._polygons);var N,I,R,F,j,B,q,H,V,U=\"\",X=\"\",G=[],Y=[],Z=l.noop;if(S=T._ownFill,u.hasLines(T)||\"none\"!==T.fill){for(z&&z.datum(n),[\"hv\",\"vh\",\"hvh\",\"vhv\"].indexOf(L.shape)!==-1?(R=s.steps(L.shape),F=s.steps(L.shape.split(\"\").reverse().join(\"\"))):R=F=\"spline\"===L.shape?function(t){var e=t[t.length-1];return t[0][0]===e[0]&&t[0][1]===e[1]?s.smoothclosed(t.slice(1),L.smoothing):s.smoothopen(t,L.smoothing)}:function(t){return\"M\"+t.join(\"L\")},j=function(t){return F(t.reverse())},G=f(n,{xaxis:M,yaxis:A,connectGaps:T.connectgaps,baseTolerance:Math.max(L.width||1,3)/4,linear:\"linear\"===L.shape,simplify:L.simplify}),V=T._polygons=new Array(G.length),w=0;w<G.length;w++)T._polygons[w]=h(G[w]);G.length&&(B=G[0][0],q=G[G.length-1],H=q[q.length-1]),Y=G.filter(function(t){return t.length>1}),Z=function(t){return function(e){if(N=R(e),I=j(e),U?O?(U+=\"L\"+N.substr(1),X=I+\"L\"+X.substr(1)):(U+=\"Z\"+N,X=I+\"Z\"+X):(U=N,X=I),u.hasLines(T)&&e.length>1){var r=i.select(this);if(r.datum(n),t)g(r.style(\"opacity\",0).attr(\"d\",N).call(s.lineGroupStyle)).style(\"opacity\",1);else{var a=g(r);a.attr(\"d\",N),s.singleLineStyle(n,a)}}}}}var W=C.selectAll(\".js-line\").data(Y);g(W.exit()).style(\"opacity\",0).remove(),W.each(Z(!1)),W.enter().append(\"path\").classed(\"js-line\",!0).style(\"vector-effect\",\"non-scaling-stroke\").call(s.lineGroupStyle).each(Z(!0)),G.length&&(S?B&&H&&(O?(\"y\"===O?B[1]=H[1]=A.c2p(0,!0):\"x\"===O&&(B[0]=H[0]=M.c2p(0,!0)),g(S).attr(\"d\",\"M\"+H+\"L\"+B+\"L\"+U.substr(1))):g(S).attr(\"d\",U+\"Z\")):\"tonext\"===T.fill.substr(0,6)&&U&&D&&(\"tonext\"===T.fill?g(z).attr(\"d\",U+\"Z\"+D+\"Z\"):g(z).attr(\"d\",U+\"L\"+D.substr(1)+\"Z\"),T._polygons=T._polygons.concat(P)),T._prevRevpath=X,T._prevPolygons=V);var $=C.selectAll(\".points\");_=$.data([n]),$.each(b),_.enter().append(\"g\").classed(\"points\",!0).each(b),_.exit().remove()}}function o(t,e,r,n,a){var o=r.xaxis,s=r.yaxis,c=i.extent(l.simpleMap(o.range,o.r2c)),f=i.extent(l.simpleMap(s.range,s.r2c)),d=n[0].trace;if(u.hasMarkers(d)){var h=d.marker.maxdisplayed;if(0!==h){var p=n.filter(function(t){return t.x>=c[0]&&t.x<=c[1]&&t.y>=f[0]&&t.y<=f[1]}),g=Math.ceil(p.length/h),v=0;a.forEach(function(t,r){var n=t[0].trace;u.hasMarkers(n)&&n.marker.maxdisplayed>0&&r<e&&v++});var m=Math.round(v*g/3+Math.floor(v/3)*g/7.1);n.forEach(function(t){delete t.vis}),p.forEach(function(t,e){0===Math.round((e+m)%g)&&(t.vis=!0)})}}}var i=t(\"d3\"),l=t(\"../../lib\"),s=t(\"../../components/drawing\"),c=t(\"../../components/errorbars\"),u=t(\"./subtypes\"),f=t(\"./line_points\"),d=t(\"./link_traces\"),h=t(\"../../lib/polygon\").tester;e.exports=function(t,e,r,o,l){var s,c,u,f,h,p=e.plot.select(\"g.scatterlayer\"),g=!o,v=!!o&&o.duration>0;for(u=p.selectAll(\"g.trace\"),f=u.data(r,function(t){return t[0].trace.uid}),f.enter().append(\"g\").attr(\"class\",function(t){return\"trace scatter trace\"+t[0].trace.uid}).style(\"stroke-miterlimit\",2),d(t,e,r),n(t,p),s=0,c={};s<r.length;s++)c[r[s][0].trace.uid]=s;if(p.selectAll(\"g.trace\").sort(function(t,e){return c[t[0].trace.uid]>c[e[0].trace.uid]?1:-1}),v){l&&(h=l());i.transition().duration(o.duration).ease(o.easing).each(\"end\",function(){h&&h()}).each(\"interrupt\",function(){h&&h()}).each(function(){p.selectAll(\"g.trace\").each(function(n,i){a(t,i,e,n,r,this,o)})})}else p.selectAll(\"g.trace\").each(function(n,i){a(t,i,e,n,r,this,o)});g&&f.exit().remove(),p.selectAll(\"path:not([d])\").remove()}},{\"../../components/drawing\":49,\"../../components/errorbars\":55,\"../../lib\":136,\"../../lib/polygon\":146,\"./line_points\":252,\"./link_traces\":254,\"./subtypes\":260,d3:7}],258:[function(t,e,r){\"use strict\";var n=t(\"./subtypes\");e.exports=function(t,e){var r,a,o,i,l=t.cd,s=t.xaxis,c=t.yaxis,u=[],f=l[0].trace,d=f.index,h=f.marker,p=!n.hasMarkers(f)&&!n.hasText(f);if(f.visible===!0&&!p){var g=Array.isArray(h.opacity)?1:h.opacity;if(e===!1)for(r=0;r<l.length;r++)l[r].dim=0;else for(r=0;r<l.length;r++)a=l[r],o=s.c2p(a.x),i=c.c2p(a.y),e.contains([o,i])?(u.push({curveNumber:d,pointNumber:r,x:a.x,y:a.y,id:a.id}),a.dim=0):a.dim=1;return l[0].node3.selectAll(\"path.point\").style(\"opacity\",function(t){return((t.mo+1||g+1)-1)*(t.dim?.2:1)}),l[0].node3.selectAll(\"text\").style(\"opacity\",function(t){return t.dim?.2:1}),u}}},{\"./subtypes\":260}],259:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../components/drawing\"),o=t(\"../../components/errorbars\");e.exports=function(t){var e=n.select(t).selectAll(\"g.trace.scatter\");e.style(\"opacity\",function(t){return t[0].trace.opacity}),e.selectAll(\"g.points\").each(function(t){var e=n.select(this),r=e.selectAll(\"path.point\"),o=t.trace||t[0].trace;r.call(a.pointStyle,o),e.selectAll(\"text\").call(a.textPointStyle,o)}),e.selectAll(\"g.trace path.js-line\").call(a.lineGroupStyle),e.selectAll(\"g.trace path.js-fill\").call(a.fillGroupStyle),e.call(o.style)}},{\"../../components/drawing\":49,\"../../components/errorbars\":55,d3:7}],260:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports={hasLines:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"lines\")!==-1},hasMarkers:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"markers\")!==-1},hasText:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"text\")!==-1},isBubble:function(t){return n.isPlainObject(t.marker)&&Array.isArray(t.marker.size)}}},{\"../../lib\":136}],261:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e,r,a){a(\"textposition\"),n.coerceFont(a,\"textfont\",r.font)}},{\"../../lib\":136}],262:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");e.exports=function(t,e,r,a){var o,i=a(\"x\"),l=a(\"y\");if(n.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\"],r),i)l?(o=Math.min(i.length,l.length),o<i.length&&(e.x=i.slice(0,o)),o<l.length&&(e.y=l.slice(0,o))):(o=i.length,a(\"y0\"),a(\"dy\"));else{if(!l)return 0;o=e.y.length,a(\"x0\"),a(\"dx\")}return o}},{\"../../registry\":206}]},{},[5])(5)});window.define = window.__define;window.require = window.__require;window.__define = undefined; window.__require = undefined;/* global Highcharts, Plotly*/\n",
|
|
"/* eslint-disable */\n",
|
|
"function throttle(fn, timeout, invokeAsap, ctx) {\n",
|
|
" var typeofInvokeAsap = typeof invokeAsap;\n",
|
|
" if(typeofInvokeAsap === 'undefined') {\n",
|
|
" invokeAsap = true;\n",
|
|
" } else if(arguments.length === 3 && typeofInvokeAsap !== 'boolean') {\n",
|
|
" ctx = invokeAsap;\n",
|
|
" invokeAsap = true;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var timer, args, needInvoke,\n",
|
|
" wrapper = function() {\n",
|
|
" if(needInvoke) {\n",
|
|
" fn.apply(ctx, args);\n",
|
|
" needInvoke = false;\n",
|
|
" timer = setTimeout(wrapper, timeout);\n",
|
|
" } else {\n",
|
|
" timer = null;\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" return function() {\n",
|
|
" args = arguments;\n",
|
|
" ctx || (ctx = this);\n",
|
|
" needInvoke = true;\n",
|
|
"\n",
|
|
" if(!timer) {\n",
|
|
" invokeAsap?\n",
|
|
" wrapper() :\n",
|
|
" timer = setTimeout(wrapper, timeout);\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* eslint-enable */\n",
|
|
"function CatboostIpython() {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.init = function() {\n",
|
|
" this.charts = {};\n",
|
|
" /*\n",
|
|
" {\n",
|
|
" \"rmse_1\": {\n",
|
|
" ...\n",
|
|
" }\n",
|
|
" }\n",
|
|
" */\n",
|
|
" this.traces = {};\n",
|
|
" /*\n",
|
|
" {\n",
|
|
" \"rmse_1\": {\n",
|
|
" name: \"rmse\",\n",
|
|
" id: \"rmse_1\",\n",
|
|
" parent: \"div\",\n",
|
|
" traces: [\n",
|
|
" {\n",
|
|
" name: \"current;learn;0;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;0;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;1;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;1;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;best_point;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;;best_value\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" }\n",
|
|
" ]\n",
|
|
" }\n",
|
|
" }\n",
|
|
" */\n",
|
|
"\n",
|
|
" this.chartsToRedraw = {};\n",
|
|
" this.lastIndexes = {};\n",
|
|
" this.smoothness = -1;\n",
|
|
" this.layoutDisabled = {\n",
|
|
" series: {},\n",
|
|
" traces: {}\n",
|
|
" };\n",
|
|
" this.clickMode = false;\n",
|
|
" this.logarithmMode = 'linear';\n",
|
|
" this.lastSmooth = 0;\n",
|
|
" this.layout = null;\n",
|
|
" this.activeTab = '';\n",
|
|
" this.meta = {};\n",
|
|
" this.timeLeft = {};\n",
|
|
"\n",
|
|
" this.hasCVMode = false;\n",
|
|
" this.stddevEnabled = false;\n",
|
|
"\n",
|
|
" this.colors = [\n",
|
|
" '#68E256',\n",
|
|
" '#56AEE2',\n",
|
|
" '#CF56E2',\n",
|
|
" '#E28956',\n",
|
|
" '#56E289',\n",
|
|
" '#5668E2',\n",
|
|
" '#E256AE',\n",
|
|
" '#E2CF56',\n",
|
|
" '#56E2CF',\n",
|
|
" '#8A56E2',\n",
|
|
" '#E25668',\n",
|
|
" '#AEE256'\n",
|
|
" ];\n",
|
|
" this.colorsByPath = {};\n",
|
|
" this.colorIndex = 0;\n",
|
|
" this.lossFuncs = {};\n",
|
|
"\n",
|
|
" this.isCVinited = false;\n",
|
|
"};\n",
|
|
"\n",
|
|
"/* eslint-disable */\n",
|
|
"CatboostIpython.prototype.loadStyles = function(path, fn, scope) {\n",
|
|
" $('link[catboost=\"1\"]').remove();\n",
|
|
"\n",
|
|
" var head = document.getElementsByTagName('head')[0], // reference to document.head for appending/ removing link nodes\n",
|
|
" link = document.createElement('link'); // create the link node\n",
|
|
" link.setAttribute('href', path);\n",
|
|
" link.setAttribute('rel', 'stylesheet');\n",
|
|
" link.setAttribute('type', 'text/css');\n",
|
|
" link.setAttribute('catboost', '1');\n",
|
|
"\n",
|
|
" var sheet, cssRules;\n",
|
|
" // get the correct properties to check for depending on the browser\n",
|
|
" if ('sheet' in link) {\n",
|
|
" sheet = 'sheet'; cssRules = 'cssRules';\n",
|
|
" } else {\n",
|
|
" sheet = 'styleSheet'; cssRules = 'rules';\n",
|
|
" }\n",
|
|
"\n",
|
|
" var interval_id = setInterval(function() { // start checking whether the style sheet has successfully loaded\n",
|
|
" try {\n",
|
|
" if (link[sheet] && link[sheet][cssRules].length) { // SUCCESS! our style sheet has loaded\n",
|
|
" clearInterval(interval_id); // clear the counters\n",
|
|
" clearTimeout(timeout_id);\n",
|
|
" fn.call( scope || window, true, link); // fire the callback with success == true\n",
|
|
" }\n",
|
|
" } catch(e) {} finally {}\n",
|
|
" }, 50 ), // how often to check if the stylesheet is loaded\n",
|
|
" timeout_id = setTimeout( function() { // start counting down till fail\n",
|
|
" clearInterval( interval_id ); // clear the counters\n",
|
|
" clearTimeout( timeout_id );\n",
|
|
" head.removeChild( link ); // since the style sheet didn't load, remove the link node from the DOM\n",
|
|
" fn.call( scope || window, false, link ); // fire the callback with success == false\n",
|
|
" }, 15000 ); // how long to wait before failing\n",
|
|
"\n",
|
|
" head.appendChild( link ); // insert the link node into the DOM and start loading the style sheet\n",
|
|
"\n",
|
|
" return link; // return the link node;\n",
|
|
"};\n",
|
|
"/* eslint-enable */\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.resizeCharts = function() {\n",
|
|
" // width fix for development\n",
|
|
" $('.catboost-graph__charts', this.layout).css({width: $('.catboost-graph').width()});\n",
|
|
"\n",
|
|
" this.plotly.Plots.resize(this.traces[this.activeTab].parent);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addMeta = function(path, meta) {\n",
|
|
" this.meta[path] = meta;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addLayout = function(parent) {\n",
|
|
" if (this.layout) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var cvAreaControls = '';\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" cvAreaControls = '<div>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-cvstddev' + this.index + '\"' + (this.stddevEnabled ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control2-cvstddev' + this.index + '\" class=\"catboost-panel__controls2_label catboost-panel__controls2_label-long\">Standard Deviation</label>' +\n",
|
|
" '</div>';\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.layout = $('<div class=\"catboost\">' +\n",
|
|
" '<div class=\"catboost-panel\">' +\n",
|
|
" '<div class=\"catboost-panel__controls\">' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__controls_checkbox\" id=\"catboost-control-learn' + this.index + '\" ' + (!this.layoutDisabled.learn ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control-learn' + this.index + '\" class=\"catboost-panel__controls_label\"><div class=\"catboost-panel__serie_learn_pic\" style=\"border-color:#999\"></div>Learn</label>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__controls_checkbox\" id=\"catboost-control-test' + this.index + '\" ' + (!this.layoutDisabled.test ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control-test' + this.index + '\" class=\"catboost-panel__controls_label\"><div class=\"catboost-panel__serie_test_pic\" style=\"border-color:#999\"></div>Eval</label>' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__series ' + (this.layoutDisabled.learn ? ' catboost-panel__series_learn_disabled' : '') + '\">' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__controls2\">' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-clickmode' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-clickmode' + this.index + '\" class=\"catboost-panel__controls2_label\">Click Mode</label>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-log' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-log' + this.index + '\" class=\"catboost-panel__controls2_label\">Logarithm</label>' +\n",
|
|
" '<div>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-smooth' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-smooth' + this.index + '\" class=\"catboost-panel__controls2_label\">Smooth</label>' +\n",
|
|
" '<input id=\"catboost-control2-slider' + this.index + '\" disabled=\"disabled\" class=\"catboost-panel__control_slider\" type =\"range\" value=\"0\" min=\"0\" max=\"1\" step =\"0.01\" for=\"rangeInputValue\" name=\"rangeInput\"/>' +\n",
|
|
" '<input id=\"catboost-control2-slidervalue' + this.index + '\" disabled=\"disabled\" class=\"catboost-panel__control_slidervalue\" value=\"0\" min=\"0\" max=\"1\" for=\"rangeInput\" name=\"rangeInputValue\"/>' +\n",
|
|
" '</div>' +\n",
|
|
" cvAreaControls +\n",
|
|
" '</div>' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-graph\">' +\n",
|
|
" '<div class=\"catboost-graph__tabs\"></div>' +\n",
|
|
" '<div class=\"catboost-graph__charts\"></div>' +\n",
|
|
" '</div>' +\n",
|
|
" '</div>');\n",
|
|
" $(parent).append(this.layout);\n",
|
|
"\n",
|
|
" this.addTabEvents();\n",
|
|
" this.addControlEvents();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addTabEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('.catboost-graph__tabs', this.layout).click(function(e) {\n",
|
|
" if (!$(e.target).is('.catboost-graph__tab:not(.catboost-graph__tab_active)')) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var id = $(e.target).attr('tabid');\n",
|
|
"\n",
|
|
" self.activeTab = id;\n",
|
|
"\n",
|
|
" $('.catboost-graph__tab_active', self.layout).removeClass('catboost-graph__tab_active');\n",
|
|
" $('.catboost-graph__chart_active', self.layout).removeClass('catboost-graph__chart_active');\n",
|
|
"\n",
|
|
" $('.catboost-graph__tab[tabid=\"' + id + '\"]', self.layout).addClass('catboost-graph__tab_active');\n",
|
|
" $('.catboost-graph__chart[tabid=\"' + id + '\"]', self.layout).addClass('catboost-graph__chart_active');\n",
|
|
"\n",
|
|
" self.cleanSeries();\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" self.resizeCharts();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addControlEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('#catboost-control-learn' + this.index, this.layout).click(function() {\n",
|
|
" self.layoutDisabled.learn = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', self.layout).toggleClass('catboost-panel__series_learn_disabled', self.layoutDisabled.learn);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control-test' + this.index, this.layout).click(function() {\n",
|
|
" self.layoutDisabled.test = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', self.layout).toggleClass('catboost-panel__series_test_disabled', self.layoutDisabled.test);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-clickmode' + this.index, this.layout).click(function() {\n",
|
|
" self.clickMode = $(this)[0].checked;\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-log' + this.index, this.layout).click(function() {\n",
|
|
" self.logarithmMode = $(this)[0].checked ? 'log' : 'linear';\n",
|
|
"\n",
|
|
" self.forEveryLayout(function(layout) {\n",
|
|
" layout.yaxis = {type: self.logarithmMode};\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" var slider = $('#catboost-control2-slider' + this.index),\n",
|
|
" sliderValue = $('#catboost-control2-slidervalue' + this.index);\n",
|
|
"\n",
|
|
" $('#catboost-control2-smooth' + this.index, this.layout).click(function() {\n",
|
|
" var enabled = $(this)[0].checked;\n",
|
|
"\n",
|
|
" self.setSmoothness(enabled ? self.lastSmooth : -1);\n",
|
|
"\n",
|
|
" slider.prop('disabled', !enabled);\n",
|
|
" sliderValue.prop('disabled', !enabled);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-cvstddev' + this.index, this.layout).click(function() {\n",
|
|
" var enabled = $(this)[0].checked;\n",
|
|
"\n",
|
|
" self.setStddev(enabled);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" slider.on('input change', function() {\n",
|
|
" var smooth = Number($(this).val());\n",
|
|
"\n",
|
|
" sliderValue.val(isNaN(smooth) ? 0 : smooth);\n",
|
|
"\n",
|
|
" self.setSmoothness(smooth);\n",
|
|
" self.lastSmooth = smooth;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" sliderValue.on('input change', function() {\n",
|
|
" var smooth = Number($(this).val());\n",
|
|
"\n",
|
|
" slider.val(isNaN(smooth) ? 0 : smooth);\n",
|
|
"\n",
|
|
" self.setSmoothness(smooth);\n",
|
|
" self.lastSmooth = smooth;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setTraceVisibility = function(trace, visibility) {\n",
|
|
" if (trace) {\n",
|
|
" trace.visible = visibility;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesVisibility = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" traces,\n",
|
|
" smoothDisabled = this.getSmoothness() === -1,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train)) {\n",
|
|
" traces = tracesHash[train].traces;\n",
|
|
"\n",
|
|
" if (this.layoutDisabled.traces[train]) {\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" } else {\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" if (this.stddevEnabled) {\n",
|
|
" self.filterTracesOne(traces, {type: 'learn'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {type: 'test'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, best_point: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_first: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_last: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" } else {\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_first: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_last: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, best_point: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (smoothDisabled) {\n",
|
|
" self.filterTracesOne(traces, {smoothed: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (this.layoutDisabled['learn']) {\n",
|
|
" self.filterTracesOne(traces, {type: 'learn'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (this.layoutDisabled['test']) {\n",
|
|
" self.filterTracesOne(traces, {type: 'test'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getSmoothness = function() {\n",
|
|
" return this.smoothness && this.smoothness > -1 ? this.smoothness : -1;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setSmoothness = function(weight) {\n",
|
|
" if (weight < 0 && weight !== -1 || weight > 1) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.smoothness = weight;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setStddev = function(enabled) {\n",
|
|
" this.stddevEnabled = enabled;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redrawActiveChart = function() {\n",
|
|
" this.chartsToRedraw[this.activeTab] = true;\n",
|
|
"\n",
|
|
" this.redrawAll();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redraw = function() {\n",
|
|
" if (this.chartsToRedraw[this.activeTab]) {\n",
|
|
" this.chartsToRedraw[this.activeTab] = false;\n",
|
|
"\n",
|
|
" this.updateTracesVisibility();\n",
|
|
" this.updateTracesCV();\n",
|
|
" this.updateTracesBest();\n",
|
|
" this.updateTracesValues();\n",
|
|
" this.updateTracesSmoothness();\n",
|
|
"\n",
|
|
" this.plotly.redraw(this.traces[this.activeTab].parent);\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.drawTraces();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addRedrawFunc = function() {\n",
|
|
" this.redrawFunc = throttle(this.redraw, 400, false, this);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redrawAll = function() {\n",
|
|
" if (!this.redrawFunc) {\n",
|
|
" this.addRedrawFunc();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.redrawFunc();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addPoints = function(parent, data) {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" data.chunks.forEach(function(item) {\n",
|
|
" if (typeof item.remaining_time !== 'undefined' && typeof item.passed_time !== 'undefined') {\n",
|
|
" if (!self.timeLeft[data.path]) {\n",
|
|
" self.timeLeft[data.path] = [];\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.timeLeft[data.path][item.iteration] = [item.remaining_time, item.passed_time];\n",
|
|
" }\n",
|
|
"\n",
|
|
" ['test', 'learn'].forEach(function(type) {\n",
|
|
" var sets = self.meta[data.path][type + '_sets'],\n",
|
|
" metrics = self.meta[data.path][type + '_metrics'];\n",
|
|
"\n",
|
|
" for (var i = 0; i < metrics.length; i++) {\n",
|
|
" var nameOfMetric = metrics[i].name,\n",
|
|
" cvAdded = false;\n",
|
|
"\n",
|
|
" self.lossFuncs[nameOfMetric] = metrics[i].best_value;\n",
|
|
"\n",
|
|
" for (var j = 0; j < sets.length; j++) {\n",
|
|
" var nameOfSet = sets[j],\n",
|
|
" params = {\n",
|
|
" chartName: nameOfMetric,\n",
|
|
" index: i,\n",
|
|
" train: data.train,\n",
|
|
" type: type,\n",
|
|
" path: data.path,\n",
|
|
" indexOfSet: j,\n",
|
|
" nameOfSet: nameOfSet\n",
|
|
" },\n",
|
|
" key = self.getKey(params),\n",
|
|
" launchMode = self.getLaunchMode(data.path);\n",
|
|
"\n",
|
|
" if (!self.activeTab) {\n",
|
|
" self.activeTab = key.chartId;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (launchMode === 'CV' ) {\n",
|
|
" // we need to set launch mode before first getTrace call\n",
|
|
" self.hasCVMode = true;\n",
|
|
"\n",
|
|
" if (!self.isCVinited) {\n",
|
|
" // and we don't need to reset setting for next iterations\n",
|
|
" self.layoutDisabled.learn = true;\n",
|
|
" self.setStddev(true);\n",
|
|
"\n",
|
|
" self.isCVinited = true;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" var valuesOfSet = item[nameOfSet],\n",
|
|
" pointValue = valuesOfSet[i],\n",
|
|
" pointIndex = item.iteration,\n",
|
|
" // traces\n",
|
|
" trace = self.getTrace(parent, params),\n",
|
|
" smoothedTrace = self.getTrace(parent, $.extend({smoothed: true}, params)),\n",
|
|
" bestValueTrace = null;\n",
|
|
"\n",
|
|
" if (type === 'test') {\n",
|
|
" if (launchMode !== 'CV') {\n",
|
|
" self.getTrace(parent, $.extend({best_point: true}, params));\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof self.lossFuncs[nameOfMetric] === 'number') {\n",
|
|
" bestValueTrace = self.getTrace(parent, $.extend({best_value: true}, params));\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (pointValue !== 'inf' && pointValue !== 'nan') {\n",
|
|
" trace.x[pointIndex] = pointIndex;\n",
|
|
" trace.y[pointIndex] = valuesOfSet[i];\n",
|
|
" trace.hovertext[pointIndex] = nameOfSet + ': ' + valuesOfSet[i].toPrecision(7);\n",
|
|
"\n",
|
|
" smoothedTrace.x[pointIndex] = pointIndex;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (bestValueTrace) {\n",
|
|
" bestValueTrace.x[pointIndex] = pointIndex;\n",
|
|
" bestValueTrace.y[pointIndex] = self.lossFuncs[nameOfMetric];\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (launchMode === 'CV' && !cvAdded) {\n",
|
|
" cvAdded = true;\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_first: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_last: true}, params));\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_first: true, smoothed: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_last: true, smoothed: true}, params));\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true, smoothed: true}, params));\n",
|
|
"\n",
|
|
" if (type === 'test') {\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true, best_point: true}, params));\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.chartsToRedraw[key.chartId] = true;\n",
|
|
"\n",
|
|
" self.redrawAll();\n",
|
|
" }\n",
|
|
" });\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getLaunchMode = function(path) {\n",
|
|
" return this.meta[path].launch_mode;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChartNode = function(params, active) {\n",
|
|
" var node = $('<div class=\"catboost-graph__chart\" tabid=\"' + params.id + '\"></div>');\n",
|
|
"\n",
|
|
" if (active) {\n",
|
|
" node.addClass('catboost-graph__chart_active');\n",
|
|
" }\n",
|
|
"\n",
|
|
" return node;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChartTab = function(params, active) {\n",
|
|
" var node = $('<div class=\"catboost-graph__tab\" tabid=\"' + params.id + '\">' + params.name + '</div>');\n",
|
|
"\n",
|
|
" if (active) {\n",
|
|
" node.addClass('catboost-graph__tab_active');\n",
|
|
" }\n",
|
|
"\n",
|
|
" return node;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.forEveryChart = function(callback) {\n",
|
|
" for (var name in this.traces) {\n",
|
|
" if (this.traces.hasOwnProperty(name)) {\n",
|
|
" callback(this.traces[name]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.forEveryLayout = function(callback) {\n",
|
|
" this.forEveryChart(function(chart) {\n",
|
|
" callback(chart.layout);\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChart = function(parent, params) {\n",
|
|
" var id = params.id,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" if (this.charts[id]) {\n",
|
|
" return this.charts[id];\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.addLayout(parent);\n",
|
|
"\n",
|
|
" var active = this.activeTab === params.id,\n",
|
|
" chartNode = this.getChartNode(params, active),\n",
|
|
" chartTab = this.getChartTab(params, active);\n",
|
|
"\n",
|
|
" $('.catboost-graph__charts', this.layout).append(chartNode);\n",
|
|
" $('.catboost-graph__tabs', this.layout).append(chartTab);\n",
|
|
"\n",
|
|
" this.traces[id] = {\n",
|
|
" id: params.id,\n",
|
|
" name: params.name,\n",
|
|
" parent: chartNode[0],\n",
|
|
" traces: [],\n",
|
|
" layout: {\n",
|
|
" xaxis: {\n",
|
|
" range: [0, Number(this.meta[params.path].iteration_count)],\n",
|
|
" type: 'linear',\n",
|
|
" tickmode: 'auto',\n",
|
|
" showspikes: true,\n",
|
|
" spikethickness: 1,\n",
|
|
" spikedash: 'longdashdot',\n",
|
|
" spikemode: 'across',\n",
|
|
" zeroline: false,\n",
|
|
" showgrid: false\n",
|
|
" },\n",
|
|
" yaxis: {\n",
|
|
" zeroline: false\n",
|
|
" //showgrid: false\n",
|
|
" //hoverformat : '.7f'\n",
|
|
" },\n",
|
|
" separators: '. ',\n",
|
|
" //hovermode: 'x',\n",
|
|
" margin: {l: 38, r: 0, t: 35, b: 30},\n",
|
|
" autosize: true,\n",
|
|
" showlegend: false\n",
|
|
" },\n",
|
|
" options: {\n",
|
|
" scrollZoom: false,\n",
|
|
" modeBarButtonsToRemove: ['toggleSpikelines'],\n",
|
|
" displaylogo: false\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.charts[id] = this.plotly.plot(chartNode[0], this.traces[id].traces, this.traces[id].layout, this.traces[id].options);\n",
|
|
"\n",
|
|
" chartNode[0].on('plotly_hover', function(e) {\n",
|
|
" self.updateTracesValues(e.points[0].x);\n",
|
|
" });\n",
|
|
"\n",
|
|
" chartNode[0].on('plotly_click', function(e) {\n",
|
|
" self.updateTracesValues(e.points[0].x, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" return this.charts[id];\n",
|
|
"};\n",
|
|
"\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getTrace = function(parent, params) {\n",
|
|
" var key = this.getKey(params),\n",
|
|
" chartSeries = [];\n",
|
|
"\n",
|
|
" if (this.traces[key.chartId]) {\n",
|
|
" chartSeries = this.traces[key.chartId].traces.filter(function(trace) {\n",
|
|
" return trace.name === key.traceName;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (chartSeries.length) {\n",
|
|
" return chartSeries[0];\n",
|
|
" } else {\n",
|
|
" this.getChart(parent, {id: key.chartId, name: params.chartName, path: params.path});\n",
|
|
"\n",
|
|
" var plotParams = {\n",
|
|
" color: this.getNextColor(params.path, params.smoothed ? 0.2 : 1),\n",
|
|
" fillsmoothcolor: this.getNextColor(params.path, 0.1),\n",
|
|
" fillcolor: this.getNextColor(params.path, 0.4),\n",
|
|
" hoverinfo: params.cv_avg ? 'skip' : 'text+x',\n",
|
|
" width: params.cv_avg ? 2 : 1,\n",
|
|
" dash: params.type === 'test' ? 'solid' : 'dot'\n",
|
|
" },\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" hovertext: [],\n",
|
|
" hoverinfo: plotParams.hoverinfo,\n",
|
|
" line: {\n",
|
|
" width: plotParams.width,\n",
|
|
" dash: plotParams.dash,\n",
|
|
" color: plotParams.color\n",
|
|
" },\n",
|
|
" mode: 'lines',\n",
|
|
" hoveron: 'points',\n",
|
|
" connectgaps: true\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (params.best_point) {\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" marker: {\n",
|
|
" width: 2,\n",
|
|
" color: plotParams.color\n",
|
|
" },\n",
|
|
" hovertext: [],\n",
|
|
" hoverinfo: 'text',\n",
|
|
" mode: 'markers',\n",
|
|
" type: 'scatter'\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (params.best_value) {\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" line: {\n",
|
|
" width: 1,\n",
|
|
" dash: 'dash',\n",
|
|
" color: '#CCCCCC'\n",
|
|
" },\n",
|
|
" mode: 'lines',\n",
|
|
" connectgaps: true,\n",
|
|
" hoverinfo: 'skip'\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (params.cv_stddev_last) {\n",
|
|
" trace.fill = 'tonexty';\n",
|
|
" }\n",
|
|
"\n",
|
|
" trace._params.plotParams = plotParams;\n",
|
|
"\n",
|
|
" this.traces[key.chartId].traces.push(trace);\n",
|
|
"\n",
|
|
" return trace;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getKey = function(params) {\n",
|
|
" var traceName = [\n",
|
|
" params.train,\n",
|
|
" params.type,\n",
|
|
" params.indexOfSet,\n",
|
|
" (params.smoothed ? 'smoothed' : ''),\n",
|
|
" (params.best_point ? 'best_pount' : ''),\n",
|
|
" (params.best_value ? 'best_value' : ''),\n",
|
|
" (params.cv_avg ? 'cv_avg' : ''),\n",
|
|
" (params.cv_stddev_first ? 'cv_stddev_first' : ''),\n",
|
|
" (params.cv_stddev_last ? 'cv_stddev_last' : '')\n",
|
|
" ].join(';');\n",
|
|
"\n",
|
|
" return {\n",
|
|
" chartId: params.chartName,\n",
|
|
" traceName: traceName,\n",
|
|
" colorId: params.train\n",
|
|
" };\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.filterTracesEvery = function(traces, filter) {\n",
|
|
" traces = traces || this.traces[this.activeTab].traces;\n",
|
|
"\n",
|
|
" return traces.filter(function(trace) {\n",
|
|
" for (var prop in filter) {\n",
|
|
" if (filter.hasOwnProperty(prop)) {\n",
|
|
" if (filter[prop] !== trace._params[prop]) {\n",
|
|
" return false;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return true;\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.filterTracesOne = function(traces, filter) {\n",
|
|
" traces = traces || this.traces[this.activeTab].traces;\n",
|
|
"\n",
|
|
" return traces.filter(function(trace) {\n",
|
|
" for (var prop in filter) {\n",
|
|
" if (filter.hasOwnProperty(prop)) {\n",
|
|
" if (filter[prop] === trace._params[prop]) {\n",
|
|
" return true;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cleanSeries = function() {\n",
|
|
" $('.catboost-panel__series', this.layout).html('');\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.groupTraces = function() {\n",
|
|
" var traces = this.traces[this.activeTab].traces,\n",
|
|
" index = 0,\n",
|
|
" tracesHash = {};\n",
|
|
"\n",
|
|
" traces.map(function(trace) {\n",
|
|
" var train = trace._params.train;\n",
|
|
"\n",
|
|
" if (!tracesHash[train]) {\n",
|
|
" tracesHash[train] = {\n",
|
|
" index: index,\n",
|
|
" traces: [],\n",
|
|
" info: {\n",
|
|
" path: trace._params.path,\n",
|
|
" color: trace._params.plotParams.color\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" index++;\n",
|
|
" }\n",
|
|
"\n",
|
|
" tracesHash[train].traces.push(trace);\n",
|
|
" });\n",
|
|
"\n",
|
|
" return tracesHash;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.drawTraces = function() {\n",
|
|
" if ($('.catboost-panel__series .catboost-panel__serie', this.layout).length) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var html = '',\n",
|
|
" tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train)) {\n",
|
|
" html += this.drawTrace(train, tracesHash[train]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', this.layout).html(html);\n",
|
|
"\n",
|
|
" this.updateTracesValues();\n",
|
|
"\n",
|
|
" this.addTracesEvents();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getTraceDefParams = function(params) {\n",
|
|
" var defParams = {\n",
|
|
" smoothed: undefined,\n",
|
|
" best_point: undefined,\n",
|
|
" best_value: undefined,\n",
|
|
" cv_avg: undefined,\n",
|
|
" cv_stddev_first: undefined,\n",
|
|
" cv_stddev_last: undefined\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (params) {\n",
|
|
" return $.extend(defParams, params);\n",
|
|
" } else {\n",
|
|
" return defParams;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.drawTrace = function(train, hash) {\n",
|
|
" var info = hash.info,\n",
|
|
" id = 'catboost-serie-' + this.index + '-' + hash.index,\n",
|
|
" traces = {\n",
|
|
" learn: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'learn'})),\n",
|
|
" test: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'test'}))\n",
|
|
" },\n",
|
|
" items = {\n",
|
|
" learn: {\n",
|
|
" middle: '',\n",
|
|
" bottom: ''\n",
|
|
" },\n",
|
|
" test: {\n",
|
|
" middle: '',\n",
|
|
" bottom: ''\n",
|
|
" }\n",
|
|
" },\n",
|
|
" tracesNames = '';\n",
|
|
"\n",
|
|
" ['learn', 'test'].forEach(function(type) {\n",
|
|
" traces[type].forEach(function(trace) {\n",
|
|
" items[type].middle += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:' + info.color + '\"></div>' +\n",
|
|
" '<div data-index=\"' + trace._params.indexOfSet + '\" class=\"catboost-panel__serie_' + type + '_value\"></div>';\n",
|
|
"\n",
|
|
" items[type].bottom += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:transparent\"></div>' +\n",
|
|
" '<div data-index=\"' + trace._params.indexOfSet + '\" class=\"catboost-panel__serie_best_' + type + '_value\"></div>';\n",
|
|
"\n",
|
|
" tracesNames += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:' + info.color + '\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_' + type + '_name\">' + trace._params.nameOfSet + '</div>';\n",
|
|
" });\n",
|
|
" });\n",
|
|
"\n",
|
|
" var timeSpendHtml = '<div class=\"catboost-panel__serie_time\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_time_spend\" title=\"Time spend\"></div>' +\n",
|
|
" '</div>';\n",
|
|
"\n",
|
|
" var html = '<div id=\"' + id + '\" class=\"catboost-panel__serie\" style=\"color:' + info.color + '\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_top\">' +\n",
|
|
" '<input type=\"checkbox\" data-seriename=\"' + train + '\" class=\"catboost-panel__serie_checkbox\" id=\"' + id + '-box\" ' + (!this.layoutDisabled.series[train] ? 'checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label title=' + this.meta[info.path].name + ' for=\"' + id + '-box\" class=\"catboost-panel__serie_label\">' + train + '<div class=\"catboost-panel__serie_time_left\" title=\"Estimate time\"></div></label>' +\n",
|
|
" (this.getLaunchMode(info.path) !== 'Eval' ? timeSpendHtml : '') +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_hint catboost-panel__serie__learn_hint\">curr</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_hint catboost-panel__serie__test_hint\">best</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_iteration\" title=\"curr iteration\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_best_iteration\" title=\"best ' + (this.hasCVMode ? 'avg ' : '') + 'iteration\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_scroll\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_names\">' +\n",
|
|
" tracesNames +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_middle\">' +\n",
|
|
" items.learn.middle +\n",
|
|
" items.test.middle +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_bottom\">' +\n",
|
|
" items.learn.bottom +\n",
|
|
" items.test.bottom +\n",
|
|
" '</div>' +\n",
|
|
" '</div>' +\n",
|
|
" '</div>';\n",
|
|
"\n",
|
|
" return html;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesValues = function(iteration, click) {\n",
|
|
" var tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train) && !this.layoutDisabled.traces[train]) {\n",
|
|
" this.updateTraceValues(train, tracesHash[train], iteration, click);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesBest = function() {\n",
|
|
" var tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train) && !this.layoutDisabled.traces[train]) {\n",
|
|
" this.updateTraceBest(train, tracesHash[train]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getBestValue = function(data) {\n",
|
|
" if (!data.length) {\n",
|
|
" return {\n",
|
|
" best: undefined,\n",
|
|
" index: -1\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" var best = data[0],\n",
|
|
" index = 0,\n",
|
|
" func = this.lossFuncs[this.traces[this.activeTab].name],\n",
|
|
" bestDiff = typeof func === 'number' ? Math.abs(data[0] - func) : 0;\n",
|
|
"\n",
|
|
" for (var i = 1, l = data.length; i < l; i++) {\n",
|
|
" if (func === 'Min' && data[i] < best) {\n",
|
|
" best = data[i];\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (func === 'Max' && data[i] > best) {\n",
|
|
" best = data[i];\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof func === 'number' && Math.abs(data[i] - func) < bestDiff) {\n",
|
|
" best = data[i];\n",
|
|
" bestDiff = Math.abs(data[i] - func);\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return {\n",
|
|
" best: best,\n",
|
|
" index: index,\n",
|
|
" func: func\n",
|
|
" };\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCV = function() {\n",
|
|
" this.updateTracesCVAvg();\n",
|
|
"\n",
|
|
" if (this.hasCVMode && this.stddevEnabled) {\n",
|
|
" this.updateTracesCVStdDev();\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCVAvg = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" avgTraces = this.filterTracesEvery(tracesHash.traces, this.getTraceDefParams({\n",
|
|
" cv_avg: true\n",
|
|
" })),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" avgTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (origTraces.length) {\n",
|
|
" self.cvAvgFunc(origTraces, trace);\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cvAvgFunc = function(origTraces, avgTrace) {\n",
|
|
" var maxCount = origTraces.length,\n",
|
|
" maxLength = -1,\n",
|
|
" count,\n",
|
|
" sum;\n",
|
|
"\n",
|
|
" origTraces.forEach(function(origTrace) {\n",
|
|
" if (origTrace.y.length > maxLength) {\n",
|
|
" maxLength = origTrace.y.length;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" for (var i = 0; i < maxLength; i++) {\n",
|
|
" sum = 0;\n",
|
|
" count = 0;\n",
|
|
"\n",
|
|
" for (var j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" sum += origTraces[j].y[i];\n",
|
|
" count++;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (count > 0) {\n",
|
|
" avgTrace.x[i] = i;\n",
|
|
" avgTrace.y[i] = sum / count;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCVStdDev = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" firstTraces = this.filterTracesOne(tracesHash.traces, {cv_stddev_first: true}),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" firstTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed\n",
|
|
" })),\n",
|
|
" lastTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed,\n",
|
|
" cv_stddev_last: true\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (origTraces.length && lastTraces.length === 1) {\n",
|
|
" self.cvStdDevFunc(origTraces, trace, lastTraces[0]);\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cvStdDevFunc = function(origTraces, firstTrace, lastTrace) {\n",
|
|
" var maxCount = origTraces.length,\n",
|
|
" maxLength = -1,\n",
|
|
" count,\n",
|
|
" sum,\n",
|
|
" i, j;\n",
|
|
"\n",
|
|
" origTraces.forEach(function(origTrace) {\n",
|
|
" if (origTrace.y.length > maxLength) {\n",
|
|
" maxLength = origTrace.y.length;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" for (i = 0; i < maxLength; i++) {\n",
|
|
" sum = 0;\n",
|
|
" count = 0;\n",
|
|
"\n",
|
|
" for (j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" sum += origTraces[j].y[i];\n",
|
|
" count++;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (count <= 0) {\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var std = 0,\n",
|
|
" avg = sum / count;\n",
|
|
"\n",
|
|
" for (j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" std += Math.pow(origTraces[j].y[i] - avg, 2);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" std /= (count - 1);\n",
|
|
" std = Math.pow(std, 0.5);\n",
|
|
"\n",
|
|
" firstTrace.x[i] = i;\n",
|
|
" firstTrace.y[i] = avg - std;\n",
|
|
" firstTrace.hovertext[i] = firstTrace._params.type + ' std: ' + avg.toFixed(7) + '-' + std.toFixed(7);\n",
|
|
"\n",
|
|
" lastTrace.x[i] = i;\n",
|
|
" lastTrace.y[i] = avg + std;\n",
|
|
" lastTrace.hovertext[i] = lastTrace._params.type + ' std: ' + avg.toFixed(7) + '+' + std.toFixed(7);\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesSmoothness = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" smoothedTraces = this.filterTracesOne(tracesHash.traces, {smoothed: true}),\n",
|
|
" enabled = this.getSmoothness() > -1,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" smoothedTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" indexOfSet: trace._params.indexOfSet,\n",
|
|
" cv_avg: trace._params.cv_avg,\n",
|
|
" cv_stddev_first: trace._params.cv_stddev_first,\n",
|
|
" cv_stddev_last: trace._params.cv_stddev_last\n",
|
|
" })),\n",
|
|
" colorFlag = false;\n",
|
|
"\n",
|
|
" if (origTraces.length === 1) {\n",
|
|
" origTraces = origTraces[0];\n",
|
|
"\n",
|
|
" if (origTraces.visible) {\n",
|
|
" if (enabled) {\n",
|
|
" self.smoothFunc(origTraces, trace);\n",
|
|
" colorFlag = true;\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.highlightSmoothedTrace(origTraces, trace, colorFlag);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.highlightSmoothedTrace = function(trace, smoothedTrace, flag) {\n",
|
|
" if (flag) {\n",
|
|
" smoothedTrace.line.color = trace._params.plotParams.color;\n",
|
|
" trace.line.color = smoothedTrace._params.plotParams.color;\n",
|
|
" trace.hoverinfo = 'skip';\n",
|
|
"\n",
|
|
" if (trace._params.cv_stddev_last) {\n",
|
|
" trace.fillcolor = trace._params.plotParams.fillsmoothcolor;\n",
|
|
" }\n",
|
|
" } else {\n",
|
|
" trace.line.color = trace._params.plotParams.color;\n",
|
|
" trace.hoverinfo = trace._params.plotParams.hoverinfo;\n",
|
|
"\n",
|
|
" if (trace._params.cv_stddev_last) {\n",
|
|
" trace.fillcolor = trace._params.plotParams.fillcolor;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.smoothFunc = function(origTrace, smoothedTrace) {\n",
|
|
" var data = origTrace.y,\n",
|
|
" smoothedPoints = this.smooth(data, this.getSmoothness()),\n",
|
|
" smoothedIndex = 0;\n",
|
|
"\n",
|
|
" if (smoothedPoints.length) {\n",
|
|
" data.forEach(function (d, index) {\n",
|
|
" if (!smoothedTrace.x[index]) {\n",
|
|
" smoothedTrace.x[index] = index;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var nameOfSet = smoothedTrace._params.nameOfSet;\n",
|
|
"\n",
|
|
" if (smoothedTrace._params.cv_stddev_first || smoothedTrace._params.cv_stddev_last) {\n",
|
|
" nameOfSet = smoothedTrace._params.type + ' std';\n",
|
|
" }\n",
|
|
"\n",
|
|
" smoothedTrace.y[index] = smoothedPoints[smoothedIndex];\n",
|
|
" smoothedTrace.hovertext[index] = nameOfSet + '`: ' + smoothedPoints[smoothedIndex].toPrecision(7);\n",
|
|
"\n",
|
|
" smoothedIndex++;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.formatItemValue = function(value, index, suffix) {\n",
|
|
" if (typeof value === 'undefined') {\n",
|
|
" return '';\n",
|
|
" }\n",
|
|
"\n",
|
|
" suffix = suffix || '';\n",
|
|
"\n",
|
|
" return '<span title=\"' + suffix + 'value ' + value + '\">' + value + '</span>';\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTraceBest = function(train, hash) {\n",
|
|
" var traces = this.filterTracesOne(hash.traces, {best_point: true}),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" var testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: 'test',\n",
|
|
" indexOfSet: trace._params.indexOfSet\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (self.hasCVMode) {\n",
|
|
" testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: 'test',\n",
|
|
" cv_avg: true\n",
|
|
" }));\n",
|
|
" }\n",
|
|
"\n",
|
|
" var bestValue = self.getBestValue(testTrace.length === 1 ? testTrace[0].y : []);\n",
|
|
"\n",
|
|
" if (bestValue.index !== -1) {\n",
|
|
" trace.x[0] = bestValue.index;\n",
|
|
" trace.y[0] = bestValue.best;\n",
|
|
" trace.hovertext[0] = bestValue.func + ' (' + (self.hasCVMode ? 'avg' : trace._params.nameOfSet) + '): ' + bestValue.index + ' ' + bestValue.best;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTraceValues = function(name, hash, iteration, click) {\n",
|
|
" var id = 'catboost-serie-' + this.index + '-' + hash.index,\n",
|
|
" traces = {\n",
|
|
" learn: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'learn'})),\n",
|
|
" test: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'test'}))\n",
|
|
" },\n",
|
|
" path = hash.info.path,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" ['learn', 'test'].forEach(function(type) {\n",
|
|
" traces[type].forEach(function(trace) {\n",
|
|
" var data = trace.y || [],\n",
|
|
" index = typeof iteration !== 'undefined' && iteration < data.length - 1 ? iteration : data.length - 1,\n",
|
|
" value = data.length ? data[index] : undefined,\n",
|
|
" testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" type: 'test',\n",
|
|
" indexOfSet: trace._params.indexOfSet\n",
|
|
" })),\n",
|
|
" bestValue = self.getBestValue(testTrace.length === 1 ? testTrace[0].y : []),\n",
|
|
" timeLeft = '',\n",
|
|
" timeSpend = '';\n",
|
|
"\n",
|
|
" if (click || !self.clickMode) {\n",
|
|
" $('#' + id + ' .catboost-panel__serie_' + type + '_value[data-index=' + trace._params.indexOfSet + ']', self.layout)\n",
|
|
" .html(self.formatItemValue(value, index, type + ' '));\n",
|
|
" $('#' + id + ' .catboost-panel__serie_iteration', self.layout).html(index);\n",
|
|
"\n",
|
|
" if (self.timeLeft[path] && self.timeLeft[path][data.length - 1]) {\n",
|
|
" timeLeft = self.timeLeft[path][data.length - 1][0];\n",
|
|
" }\n",
|
|
" $('#' + id + ' .catboost-panel__serie_time_left', self.layout).html(timeLeft ? ('~' + self.convertTime(timeLeft)) : '');\n",
|
|
"\n",
|
|
" if (self.timeLeft[path] && self.timeLeft[path][index]) {\n",
|
|
" timeSpend = self.timeLeft[path][index][1];\n",
|
|
" }\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_time_spend', self.layout).html(self.convertTime(timeSpend));\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_iteration', self.layout).html(bestValue.index > -1 ? bestValue.index : '');\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_test_value[data-index=' + trace._params.indexOfSet + ']', self.layout)\n",
|
|
" .html(self.formatItemValue(bestValue.best, bestValue.index, 'best ' + trace._params.nameOfSet + ' '));\n",
|
|
" }\n",
|
|
" });\n",
|
|
" });\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" var testTrace = this.filterTracesEvery(hash.traces, this.getTraceDefParams({\n",
|
|
" type: 'test',\n",
|
|
" cv_avg: true\n",
|
|
" })),\n",
|
|
" bestValue = this.getBestValue(testTrace.length === 1 ? testTrace[0].y : []);\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_iteration', this.layout).html(bestValue.index > -1 ? bestValue.index : '');\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (click) {\n",
|
|
" this.clickMode = true;\n",
|
|
"\n",
|
|
" $('#catboost-control2-clickmode' + this.index, this.layout)[0].checked = true;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addTracesEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('.catboost-panel__serie_checkbox', this.layout).click(function() {\n",
|
|
" var name = $(this).data('seriename');\n",
|
|
"\n",
|
|
" self.layoutDisabled.traces[name] = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getNextColor = function(path, opacity) {\n",
|
|
" var color;\n",
|
|
"\n",
|
|
" if (this.colorsByPath[path]) {\n",
|
|
" color = this.colorsByPath[path];\n",
|
|
" } else {\n",
|
|
" color = this.colors[this.colorIndex];\n",
|
|
" this.colorsByPath[path] = color;\n",
|
|
"\n",
|
|
" this.colorIndex++;\n",
|
|
"\n",
|
|
" if (this.colorIndex > this.colors.length - 1) {\n",
|
|
" this.colorIndex = 0;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return this.hexToRgba(color, opacity);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.hexToRgba = function(value, opacity) {\n",
|
|
" if (value.length < 6) {\n",
|
|
" var pattern = /^#?([a-f\\d])([a-f\\d])([a-f\\d])/i;\n",
|
|
" value = value.replace(pattern, function(m, r, g, b) {\n",
|
|
" return '#' + r + r + g + g + b + b;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})/i.exec(value);\n",
|
|
" var rgb = {\n",
|
|
" r: parseInt(result[1], 16),\n",
|
|
" g: parseInt(result[2], 16),\n",
|
|
" b: parseInt(result[3], 16)\n",
|
|
" };\n",
|
|
"\n",
|
|
" return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + opacity + ')';\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.convertTime = function(time) {\n",
|
|
" if (!time) {\n",
|
|
" return '0s';\n",
|
|
" }\n",
|
|
"\n",
|
|
" time = Math.floor(time * 1000);\n",
|
|
"\n",
|
|
" var millis = time % 1000;\n",
|
|
" time = parseInt(time / 1000, 10);\n",
|
|
" var seconds = time % 60;\n",
|
|
" time = parseInt(time / 60, 10);\n",
|
|
" var minutes = time % 60;\n",
|
|
" time = parseInt(time / 60, 10);\n",
|
|
" var hours = time % 24;\n",
|
|
" var out = \"\";\n",
|
|
" if (hours && hours > 0) {\n",
|
|
" out += hours + 'h ';\n",
|
|
" seconds = 0;\n",
|
|
" millis = 0;\n",
|
|
" }\n",
|
|
" if (minutes && minutes > 0) {\n",
|
|
" out += minutes + 'm ';\n",
|
|
" millis = 0;\n",
|
|
" }\n",
|
|
" if (seconds && seconds > 0) {\n",
|
|
" out += seconds + 's ';\n",
|
|
" }\n",
|
|
" if (millis && millis > 0) {\n",
|
|
" out += millis + 'ms';\n",
|
|
" }\n",
|
|
"\n",
|
|
" return out.trim();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.mean = function(values, valueof) {\n",
|
|
" var n = values.length,\n",
|
|
" m = n,\n",
|
|
" i = -1,\n",
|
|
" value,\n",
|
|
" sum = 0,\n",
|
|
" number = function(x) {\n",
|
|
" return x === null ? NaN : +x;\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (valueof === null) {\n",
|
|
" while (++i < n) {\n",
|
|
" if (!isNaN(value = number(values[i]))) {\n",
|
|
" sum += value;\n",
|
|
" } else {\n",
|
|
" --m;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" } else {\n",
|
|
" while (++i < n) {\n",
|
|
" if (!isNaN(value = number(valueof(values[i], i, values)))) {\n",
|
|
" sum += value;\n",
|
|
" } else {\n",
|
|
" --m;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (m) {\n",
|
|
" return sum / m;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"// from TensorBoard\n",
|
|
"CatboostIpython.prototype.smooth = function(data, weight) {\n",
|
|
" // When increasing the smoothing window, it smoothes a lot with the first\n",
|
|
" // few points and then starts to gradually smooth slower, so using an\n",
|
|
" // exponential function makes the slider more consistent. 1000^x has a\n",
|
|
" // range of [1, 1000], so subtracting 1 and dividing by 999 results in a\n",
|
|
" // range of [0, 1], which can be used as the percentage of the data, so\n",
|
|
" // that the kernel size can be specified as a percentage instead of a\n",
|
|
" // hardcoded number, what would be bad with multiple series.\n",
|
|
" var factor = (Math.pow(1000, weight) - 1) / 999,\n",
|
|
" kernelRadius = Math.floor(data.length * factor / 2),\n",
|
|
" res = [],\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" data.forEach(function (d, i) {\n",
|
|
" var actualKernelRadius = Math.min(kernelRadius, i, data.length - i - 1);\n",
|
|
" var start = i - actualKernelRadius;\n",
|
|
" var end = i + actualKernelRadius + 1;\n",
|
|
" var point = d;\n",
|
|
" // Only smooth finite numbers.\n",
|
|
" if (!isFinite(point)) {\n",
|
|
" res.push(point);\n",
|
|
" } else {\n",
|
|
" res.push(self.mean(data.slice(start, end).filter(function(d) {\n",
|
|
" return isFinite(d);\n",
|
|
" }), null));\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" return res;\n",
|
|
"};\n",
|
|
"var debug = false;\n",
|
|
"\n",
|
|
"if (debug) {\n",
|
|
" require.config({\n",
|
|
" shim:{\n",
|
|
" \"custom/CatboostIpythonPlotly\":{\n",
|
|
" deps:[\"custom/plotly-basic.min\"]\n",
|
|
" }\n",
|
|
" }\n",
|
|
" })\n",
|
|
"\n",
|
|
" require.undef('catboost_module');\n",
|
|
" require.undef('custom/CatboostIpythonPlotly');\n",
|
|
"}\n",
|
|
"\n",
|
|
"var moduleBase = '@jupyter-widgets/base';\n",
|
|
"var modules = [moduleBase];\n",
|
|
"\n",
|
|
"if (debug) {\n",
|
|
" modules.push('custom/CatboostIpythonPlotly');\n",
|
|
"}\n",
|
|
"\n",
|
|
"define('catboost_module', modules, function(widgets) {\n",
|
|
" var getInstance = function(el) {\n",
|
|
" var id = $(el).attr('catboost-id');\n",
|
|
"\n",
|
|
" if (!id) {\n",
|
|
" return null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" id = id.replace('catboost_', '');\n",
|
|
"\n",
|
|
" if (!window.catboostIpythonInstances[id]) {\n",
|
|
" return null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" return window.catboostIpythonInstances[id];\n",
|
|
" },\n",
|
|
" addInstance = function(el) {\n",
|
|
" $(el).attr('catboost-id', 'catboost_' + window.catboostIpythonIndex);\n",
|
|
"\n",
|
|
" var catboostIpython = new CatboostIpython();\n",
|
|
" catboostIpython.index = window.catboostIpythonIndex;\n",
|
|
" catboostIpython.plotly = window.Plotly;\n",
|
|
" if (debug) {\n",
|
|
" catboostIpython.loadStyles('/custom/CatboostIpython.css', function(){catboostIpython.resizeCharts();})\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.catboostIpythonInstances[window.catboostIpythonIndex] = catboostIpython;\n",
|
|
"\n",
|
|
" window.catboostIpythonIndex++;\n",
|
|
"\n",
|
|
" return catboostIpython;\n",
|
|
" };\n",
|
|
"\n",
|
|
" var CatboostIpythonWidget = widgets.DOMWidgetView.extend({\n",
|
|
"\n",
|
|
" initialize: function() {\n",
|
|
" CatboostIpythonWidget.__super__.initialize.apply(this, arguments);\n",
|
|
"\n",
|
|
" if (!window.catboostIpythonInstances) {\n",
|
|
" window.catboostIpythonInstances = {};\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof window.catboostIpythonIndex === 'undefined') {\n",
|
|
" window.catboostIpythonIndex = 0;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var catboostIpythonInstance = getInstance(this.el);\n",
|
|
"\n",
|
|
" if (!catboostIpythonInstance) {\n",
|
|
" catboostIpythonInstance = addInstance(this.el);\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpythonInstance.init();\n",
|
|
" },\n",
|
|
"\n",
|
|
" render: function() {\n",
|
|
" this.value_changed();\n",
|
|
" this.model.on('change:value', this.value_changed, this);\n",
|
|
" },\n",
|
|
"\n",
|
|
" update: function() {\n",
|
|
" this.value_changed();\n",
|
|
" },\n",
|
|
"\n",
|
|
" value_changed: function() {\n",
|
|
" this.el.style['width'] = this.model.get('width');\n",
|
|
" this.el.style['height'] = this.model.get('height');\n",
|
|
" this.displayed.then(_.bind(this.render_charts, this));\n",
|
|
" },\n",
|
|
"\n",
|
|
" process_all: function(parent, params) {\n",
|
|
" var data = params.data;\n",
|
|
"\n",
|
|
" for (var path in data) {\n",
|
|
" if (data.hasOwnProperty(path)) {\n",
|
|
" this.process_row(parent, data[path])\n",
|
|
" }\n",
|
|
" }\n",
|
|
" },\n",
|
|
"\n",
|
|
" process_row: function(parent, data) {\n",
|
|
" var catboostIpython = getInstance(parent),\n",
|
|
" path = data.path,\n",
|
|
" content = data.content,\n",
|
|
" items = content.data.iterations,\n",
|
|
" firstIndex = 0,\n",
|
|
" chunks = [];\n",
|
|
"\n",
|
|
" if (!items || !items.length) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (!catboostIpython.lastIndex) {\n",
|
|
" catboostIpython.lastIndex = {}\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (catboostIpython.lastIndex[path]) {\n",
|
|
" firstIndex = catboostIpython.lastIndex[path] + 1;\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpython.lastIndex[path] = items.length - 1;\n",
|
|
"\n",
|
|
" for (var i = firstIndex; i < items.length; i++) {\n",
|
|
" chunks.push(items[i]);\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpython.addMeta(data.path, content.data.meta);\n",
|
|
"\n",
|
|
" catboostIpython.addPoints(parent, {\n",
|
|
" chunks: chunks,\n",
|
|
" train: data.name,\n",
|
|
" path: data.path\n",
|
|
" });\n",
|
|
" },\n",
|
|
"\n",
|
|
" render_charts: function () {\n",
|
|
" this.process_all(this.el, {\n",
|
|
" data: this.model.get('data')\n",
|
|
" });\n",
|
|
"\n",
|
|
" return this;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" return {\n",
|
|
" CatboostIpythonWidgetView: CatboostIpythonWidget\n",
|
|
" };\n",
|
|
"});\n",
|
|
"\n",
|
|
" </script>\n",
|
|
" "
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "22efc7eb32b8496abab420494a756c1d",
|
|
"version_minor": 0,
|
|
"version_major": 2
|
|
},
|
|
"text/plain": [
|
|
"MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Learning rate set to 0.074601\n",
|
|
"0:\tlearn: 0.6664772\ttest: 0.6598225\tbest: 0.6598225 (0)\ttotal: 67.1ms\tremaining: 1m 7s\n",
|
|
"1:\tlearn: 0.6462060\ttest: 0.6309224\tbest: 0.6309224 (1)\ttotal: 111ms\tremaining: 55.3s\n",
|
|
"2:\tlearn: 0.6386246\ttest: 0.6155197\tbest: 0.6155197 (2)\ttotal: 152ms\tremaining: 50.6s\n",
|
|
"3:\tlearn: 0.6343802\ttest: 0.6091950\tbest: 0.6091950 (3)\ttotal: 161ms\tremaining: 40s\n",
|
|
"4:\tlearn: 0.6190196\ttest: 0.5875192\tbest: 0.5875192 (4)\ttotal: 176ms\tremaining: 35s\n",
|
|
"5:\tlearn: 0.6060060\ttest: 0.5688370\tbest: 0.5688370 (5)\ttotal: 193ms\tremaining: 32s\n",
|
|
"6:\tlearn: 0.5991120\ttest: 0.5557620\tbest: 0.5557620 (6)\ttotal: 207ms\tremaining: 29.4s\n",
|
|
"7:\tlearn: 0.5866093\ttest: 0.5413014\tbest: 0.5413014 (7)\ttotal: 226ms\tremaining: 28s\n",
|
|
"8:\tlearn: 0.5793598\ttest: 0.5342297\tbest: 0.5342297 (8)\ttotal: 243ms\tremaining: 26.8s\n",
|
|
"9:\tlearn: 0.5689314\ttest: 0.5234456\tbest: 0.5234456 (9)\ttotal: 258ms\tremaining: 25.6s\n",
|
|
"10:\tlearn: 0.5604790\ttest: 0.5162653\tbest: 0.5162653 (10)\ttotal: 273ms\tremaining: 24.6s\n",
|
|
"11:\tlearn: 0.5534681\ttest: 0.5088781\tbest: 0.5088781 (11)\ttotal: 287ms\tremaining: 23.6s\n",
|
|
"12:\tlearn: 0.5472689\ttest: 0.4979438\tbest: 0.4979438 (12)\ttotal: 302ms\tremaining: 22.9s\n",
|
|
"13:\tlearn: 0.5416125\ttest: 0.4912554\tbest: 0.4912554 (13)\ttotal: 314ms\tremaining: 22.1s\n",
|
|
"14:\tlearn: 0.5400226\ttest: 0.4870358\tbest: 0.4870358 (14)\ttotal: 323ms\tremaining: 21.2s\n",
|
|
"15:\tlearn: 0.5348520\ttest: 0.4791274\tbest: 0.4791274 (15)\ttotal: 337ms\tremaining: 20.7s\n",
|
|
"16:\tlearn: 0.5276598\ttest: 0.4703363\tbest: 0.4703363 (16)\ttotal: 349ms\tremaining: 20.2s\n",
|
|
"17:\tlearn: 0.5220046\ttest: 0.4631076\tbest: 0.4631076 (17)\ttotal: 364ms\tremaining: 19.8s\n",
|
|
"18:\tlearn: 0.5170998\ttest: 0.4574221\tbest: 0.4574221 (18)\ttotal: 379ms\tremaining: 19.6s\n",
|
|
"19:\tlearn: 0.5103933\ttest: 0.4512453\tbest: 0.4512453 (19)\ttotal: 396ms\tremaining: 19.4s\n",
|
|
"20:\tlearn: 0.5069263\ttest: 0.4484321\tbest: 0.4484321 (20)\ttotal: 417ms\tremaining: 19.4s\n",
|
|
"21:\tlearn: 0.5039128\ttest: 0.4444746\tbest: 0.4444746 (21)\ttotal: 427ms\tremaining: 19s\n",
|
|
"22:\tlearn: 0.5030718\ttest: 0.4405774\tbest: 0.4405774 (22)\ttotal: 437ms\tremaining: 18.6s\n",
|
|
"23:\tlearn: 0.5003611\ttest: 0.4365948\tbest: 0.4365948 (23)\ttotal: 446ms\tremaining: 18.2s\n",
|
|
"24:\tlearn: 0.4994512\ttest: 0.4356378\tbest: 0.4356378 (24)\ttotal: 455ms\tremaining: 17.7s\n",
|
|
"25:\tlearn: 0.4985514\ttest: 0.4336090\tbest: 0.4336090 (25)\ttotal: 467ms\tremaining: 17.5s\n",
|
|
"26:\tlearn: 0.4957597\ttest: 0.4305569\tbest: 0.4305569 (26)\ttotal: 484ms\tremaining: 17.4s\n",
|
|
"27:\tlearn: 0.4948146\ttest: 0.4290581\tbest: 0.4290581 (27)\ttotal: 496ms\tremaining: 17.2s\n",
|
|
"28:\tlearn: 0.4936372\ttest: 0.4273405\tbest: 0.4273405 (28)\ttotal: 504ms\tremaining: 16.9s\n",
|
|
"29:\tlearn: 0.4920582\ttest: 0.4246512\tbest: 0.4246512 (29)\ttotal: 514ms\tremaining: 16.6s\n",
|
|
"30:\tlearn: 0.4891224\ttest: 0.4221725\tbest: 0.4221725 (30)\ttotal: 526ms\tremaining: 16.4s\n",
|
|
"31:\tlearn: 0.4861855\ttest: 0.4192032\tbest: 0.4192032 (31)\ttotal: 543ms\tremaining: 16.4s\n",
|
|
"32:\tlearn: 0.4838964\ttest: 0.4165394\tbest: 0.4165394 (32)\ttotal: 559ms\tremaining: 16.4s\n",
|
|
"33:\tlearn: 0.4826689\ttest: 0.4151356\tbest: 0.4151356 (33)\ttotal: 567ms\tremaining: 16.1s\n",
|
|
"34:\tlearn: 0.4808952\ttest: 0.4148035\tbest: 0.4148035 (34)\ttotal: 577ms\tremaining: 15.9s\n",
|
|
"35:\tlearn: 0.4797344\ttest: 0.4127014\tbest: 0.4127014 (35)\ttotal: 588ms\tremaining: 15.7s\n",
|
|
"36:\tlearn: 0.4777448\ttest: 0.4124642\tbest: 0.4124642 (36)\ttotal: 597ms\tremaining: 15.5s\n",
|
|
"37:\tlearn: 0.4775482\ttest: 0.4114250\tbest: 0.4114250 (37)\ttotal: 605ms\tremaining: 15.3s\n",
|
|
"38:\tlearn: 0.4759438\ttest: 0.4098661\tbest: 0.4098661 (38)\ttotal: 624ms\tremaining: 15.4s\n",
|
|
"39:\tlearn: 0.4750266\ttest: 0.4100413\tbest: 0.4098661 (38)\ttotal: 639ms\tremaining: 15.3s\n",
|
|
"40:\tlearn: 0.4735405\ttest: 0.4080374\tbest: 0.4080374 (40)\ttotal: 649ms\tremaining: 15.2s\n",
|
|
"41:\tlearn: 0.4712108\ttest: 0.4056218\tbest: 0.4056218 (41)\ttotal: 662ms\tremaining: 15.1s\n",
|
|
"42:\tlearn: 0.4701104\ttest: 0.4045607\tbest: 0.4045607 (42)\ttotal: 673ms\tremaining: 15s\n",
|
|
"43:\tlearn: 0.4692669\ttest: 0.4032063\tbest: 0.4032063 (43)\ttotal: 683ms\tremaining: 14.8s\n",
|
|
"44:\tlearn: 0.4659715\ttest: 0.3997288\tbest: 0.3997288 (44)\ttotal: 699ms\tremaining: 14.8s\n",
|
|
"45:\tlearn: 0.4650102\ttest: 0.3981658\tbest: 0.3981658 (45)\ttotal: 710ms\tremaining: 14.7s\n",
|
|
"46:\tlearn: 0.4648105\ttest: 0.3983970\tbest: 0.3981658 (45)\ttotal: 718ms\tremaining: 14.6s\n",
|
|
"47:\tlearn: 0.4642727\ttest: 0.3973671\tbest: 0.3973671 (47)\ttotal: 729ms\tremaining: 14.5s\n",
|
|
"48:\tlearn: 0.4627043\ttest: 0.3949006\tbest: 0.3949006 (48)\ttotal: 743ms\tremaining: 14.4s\n",
|
|
"49:\tlearn: 0.4622708\ttest: 0.3948793\tbest: 0.3948793 (49)\ttotal: 755ms\tremaining: 14.3s\n",
|
|
"50:\tlearn: 0.4597999\ttest: 0.3938833\tbest: 0.3938833 (50)\ttotal: 772ms\tremaining: 14.4s\n",
|
|
"51:\tlearn: 0.4597948\ttest: 0.3938891\tbest: 0.3938833 (50)\ttotal: 780ms\tremaining: 14.2s\n",
|
|
"52:\tlearn: 0.4590402\ttest: 0.3934329\tbest: 0.3934329 (52)\ttotal: 790ms\tremaining: 14.1s\n",
|
|
"53:\tlearn: 0.4587227\ttest: 0.3926588\tbest: 0.3926588 (53)\ttotal: 801ms\tremaining: 14s\n",
|
|
"54:\tlearn: 0.4578119\ttest: 0.3915945\tbest: 0.3915945 (54)\ttotal: 812ms\tremaining: 14s\n",
|
|
"55:\tlearn: 0.4557455\ttest: 0.3918817\tbest: 0.3915945 (54)\ttotal: 833ms\tremaining: 14s\n",
|
|
"56:\tlearn: 0.4535542\ttest: 0.3883786\tbest: 0.3883786 (56)\ttotal: 853ms\tremaining: 14.1s\n",
|
|
"57:\tlearn: 0.4524983\ttest: 0.3873252\tbest: 0.3873252 (57)\ttotal: 867ms\tremaining: 14.1s\n",
|
|
"58:\tlearn: 0.4520432\ttest: 0.3872331\tbest: 0.3872331 (58)\ttotal: 878ms\tremaining: 14s\n",
|
|
"59:\tlearn: 0.4512941\ttest: 0.3861632\tbest: 0.3861632 (59)\ttotal: 891ms\tremaining: 14s\n",
|
|
"60:\tlearn: 0.4512936\ttest: 0.3861705\tbest: 0.3861632 (59)\ttotal: 899ms\tremaining: 13.8s\n",
|
|
"61:\tlearn: 0.4509476\ttest: 0.3865863\tbest: 0.3861632 (59)\ttotal: 911ms\tremaining: 13.8s\n",
|
|
"62:\tlearn: 0.4505665\ttest: 0.3865416\tbest: 0.3861632 (59)\ttotal: 920ms\tremaining: 13.7s\n",
|
|
"63:\tlearn: 0.4485883\ttest: 0.3824785\tbest: 0.3824785 (63)\ttotal: 935ms\tremaining: 13.7s\n",
|
|
"64:\tlearn: 0.4474381\ttest: 0.3815634\tbest: 0.3815634 (64)\ttotal: 951ms\tremaining: 13.7s\n",
|
|
"65:\tlearn: 0.4465010\ttest: 0.3789640\tbest: 0.3789640 (65)\ttotal: 961ms\tremaining: 13.6s\n",
|
|
"66:\tlearn: 0.4460307\ttest: 0.3786647\tbest: 0.3786647 (66)\ttotal: 972ms\tremaining: 13.5s\n",
|
|
"67:\tlearn: 0.4456253\ttest: 0.3780137\tbest: 0.3780137 (67)\ttotal: 992ms\tremaining: 13.6s\n",
|
|
"68:\tlearn: 0.4445627\ttest: 0.3757159\tbest: 0.3757159 (68)\ttotal: 1.01s\tremaining: 13.6s\n",
|
|
"69:\tlearn: 0.4445610\ttest: 0.3757018\tbest: 0.3757018 (69)\ttotal: 1.01s\tremaining: 13.5s\n",
|
|
"70:\tlearn: 0.4437029\ttest: 0.3743208\tbest: 0.3743208 (70)\ttotal: 1.03s\tremaining: 13.5s\n",
|
|
"71:\tlearn: 0.4409781\ttest: 0.3714543\tbest: 0.3714543 (71)\ttotal: 1.05s\tremaining: 13.5s\n",
|
|
"72:\tlearn: 0.4383336\ttest: 0.3689270\tbest: 0.3689270 (72)\ttotal: 1.06s\tremaining: 13.5s\n",
|
|
"73:\tlearn: 0.4380087\ttest: 0.3686728\tbest: 0.3686728 (73)\ttotal: 1.07s\tremaining: 13.4s\n",
|
|
"74:\tlearn: 0.4371698\ttest: 0.3670758\tbest: 0.3670758 (74)\ttotal: 1.09s\tremaining: 13.5s\n",
|
|
"75:\tlearn: 0.4350106\ttest: 0.3682626\tbest: 0.3670758 (74)\ttotal: 1.11s\tremaining: 13.5s\n",
|
|
"76:\tlearn: 0.4350103\ttest: 0.3682697\tbest: 0.3670758 (74)\ttotal: 1.11s\tremaining: 13.4s\n",
|
|
"77:\tlearn: 0.4346695\ttest: 0.3694430\tbest: 0.3670758 (74)\ttotal: 1.13s\tremaining: 13.3s\n",
|
|
"78:\tlearn: 0.4331879\ttest: 0.3705065\tbest: 0.3670758 (74)\ttotal: 1.14s\tremaining: 13.3s\n",
|
|
"79:\tlearn: 0.4319200\ttest: 0.3706715\tbest: 0.3670758 (74)\ttotal: 1.16s\tremaining: 13.3s\n",
|
|
"80:\tlearn: 0.4314838\ttest: 0.3707926\tbest: 0.3670758 (74)\ttotal: 1.17s\tremaining: 13.2s\n",
|
|
"81:\tlearn: 0.4298096\ttest: 0.3726269\tbest: 0.3670758 (74)\ttotal: 1.18s\tremaining: 13.2s\n",
|
|
"82:\tlearn: 0.4297588\ttest: 0.3726364\tbest: 0.3670758 (74)\ttotal: 1.19s\tremaining: 13.2s\n",
|
|
"83:\tlearn: 0.4296253\ttest: 0.3726461\tbest: 0.3670758 (74)\ttotal: 1.2s\tremaining: 13.1s\n",
|
|
"84:\tlearn: 0.4292516\ttest: 0.3724533\tbest: 0.3670758 (74)\ttotal: 1.21s\tremaining: 13s\n",
|
|
"85:\tlearn: 0.4287195\ttest: 0.3728111\tbest: 0.3670758 (74)\ttotal: 1.23s\tremaining: 13s\n",
|
|
"86:\tlearn: 0.4284766\ttest: 0.3727670\tbest: 0.3670758 (74)\ttotal: 1.24s\tremaining: 13s\n",
|
|
"87:\tlearn: 0.4283419\ttest: 0.3733773\tbest: 0.3670758 (74)\ttotal: 1.24s\tremaining: 12.9s\n",
|
|
"88:\tlearn: 0.4271820\ttest: 0.3719134\tbest: 0.3670758 (74)\ttotal: 1.26s\tremaining: 12.9s\n",
|
|
"89:\tlearn: 0.4266065\ttest: 0.3721635\tbest: 0.3670758 (74)\ttotal: 1.27s\tremaining: 12.9s\n",
|
|
"90:\tlearn: 0.4250794\ttest: 0.3720891\tbest: 0.3670758 (74)\ttotal: 1.29s\tremaining: 12.9s\n",
|
|
"91:\tlearn: 0.4250346\ttest: 0.3720983\tbest: 0.3670758 (74)\ttotal: 1.3s\tremaining: 12.8s\n",
|
|
"92:\tlearn: 0.4241842\ttest: 0.3699135\tbest: 0.3670758 (74)\ttotal: 1.31s\tremaining: 12.8s\n",
|
|
"93:\tlearn: 0.4225066\ttest: 0.3692993\tbest: 0.3670758 (74)\ttotal: 1.32s\tremaining: 12.8s\n",
|
|
"94:\tlearn: 0.4225054\ttest: 0.3693386\tbest: 0.3670758 (74)\ttotal: 1.33s\tremaining: 12.7s\n",
|
|
"95:\tlearn: 0.4223937\ttest: 0.3691005\tbest: 0.3670758 (74)\ttotal: 1.34s\tremaining: 12.6s\n",
|
|
"96:\tlearn: 0.4215597\ttest: 0.3683187\tbest: 0.3670758 (74)\ttotal: 1.36s\tremaining: 12.6s\n",
|
|
"97:\tlearn: 0.4203299\ttest: 0.3652799\tbest: 0.3652799 (97)\ttotal: 1.37s\tremaining: 12.6s\n",
|
|
"98:\tlearn: 0.4190522\ttest: 0.3621626\tbest: 0.3621626 (98)\ttotal: 1.39s\tremaining: 12.6s\n",
|
|
"99:\tlearn: 0.4154490\ttest: 0.3628392\tbest: 0.3621626 (98)\ttotal: 1.4s\tremaining: 12.6s\n",
|
|
"100:\tlearn: 0.4146252\ttest: 0.3628446\tbest: 0.3621626 (98)\ttotal: 1.42s\tremaining: 12.6s\n",
|
|
"101:\tlearn: 0.4135645\ttest: 0.3609413\tbest: 0.3609413 (101)\ttotal: 1.43s\tremaining: 12.6s\n",
|
|
"102:\tlearn: 0.4134325\ttest: 0.3600997\tbest: 0.3600997 (102)\ttotal: 1.45s\tremaining: 12.6s\n",
|
|
"103:\tlearn: 0.4133951\ttest: 0.3601109\tbest: 0.3600997 (102)\ttotal: 1.45s\tremaining: 12.5s\n",
|
|
"104:\tlearn: 0.4131308\ttest: 0.3592382\tbest: 0.3592382 (104)\ttotal: 1.47s\tremaining: 12.5s\n",
|
|
"105:\tlearn: 0.4130294\ttest: 0.3587032\tbest: 0.3587032 (105)\ttotal: 1.48s\tremaining: 12.5s\n",
|
|
"106:\tlearn: 0.4125342\ttest: 0.3579470\tbest: 0.3579470 (106)\ttotal: 1.5s\tremaining: 12.5s\n",
|
|
"107:\tlearn: 0.4113974\ttest: 0.3569293\tbest: 0.3569293 (107)\ttotal: 1.51s\tremaining: 12.5s\n",
|
|
"108:\tlearn: 0.4108173\ttest: 0.3568711\tbest: 0.3568711 (108)\ttotal: 1.53s\tremaining: 12.5s\n",
|
|
"109:\tlearn: 0.4100442\ttest: 0.3560896\tbest: 0.3560896 (109)\ttotal: 1.55s\tremaining: 12.5s\n",
|
|
"110:\tlearn: 0.4090659\ttest: 0.3537163\tbest: 0.3537163 (110)\ttotal: 1.56s\tremaining: 12.5s\n",
|
|
"111:\tlearn: 0.4064699\ttest: 0.3502248\tbest: 0.3502248 (111)\ttotal: 1.58s\tremaining: 12.5s\n",
|
|
"112:\tlearn: 0.4052351\ttest: 0.3495639\tbest: 0.3495639 (112)\ttotal: 1.59s\tremaining: 12.5s\n",
|
|
"113:\tlearn: 0.4050753\ttest: 0.3489139\tbest: 0.3489139 (113)\ttotal: 1.6s\tremaining: 12.5s\n",
|
|
"114:\tlearn: 0.4029036\ttest: 0.3497024\tbest: 0.3489139 (113)\ttotal: 1.62s\tremaining: 12.5s\n",
|
|
"115:\tlearn: 0.4009195\ttest: 0.3480757\tbest: 0.3480757 (115)\ttotal: 1.64s\tremaining: 12.5s\n",
|
|
"116:\tlearn: 0.3995627\ttest: 0.3480118\tbest: 0.3480118 (116)\ttotal: 1.65s\tremaining: 12.5s\n",
|
|
"117:\tlearn: 0.3983242\ttest: 0.3492590\tbest: 0.3480118 (116)\ttotal: 1.67s\tremaining: 12.5s\n",
|
|
"118:\tlearn: 0.3980306\ttest: 0.3491362\tbest: 0.3480118 (116)\ttotal: 1.69s\tremaining: 12.5s\n",
|
|
"119:\tlearn: 0.3975302\ttest: 0.3490592\tbest: 0.3480118 (116)\ttotal: 1.71s\tremaining: 12.5s\n",
|
|
"120:\tlearn: 0.3973121\ttest: 0.3488841\tbest: 0.3480118 (116)\ttotal: 1.72s\tremaining: 12.5s\n",
|
|
"121:\tlearn: 0.3960897\ttest: 0.3464052\tbest: 0.3464052 (121)\ttotal: 1.73s\tremaining: 12.5s\n",
|
|
"122:\tlearn: 0.3950784\ttest: 0.3451232\tbest: 0.3451232 (122)\ttotal: 1.75s\tremaining: 12.5s\n",
|
|
"123:\tlearn: 0.3943043\ttest: 0.3445524\tbest: 0.3445524 (123)\ttotal: 1.77s\tremaining: 12.5s\n",
|
|
"124:\tlearn: 0.3936041\ttest: 0.3453798\tbest: 0.3445524 (123)\ttotal: 1.78s\tremaining: 12.5s\n",
|
|
"125:\tlearn: 0.3918229\ttest: 0.3426461\tbest: 0.3426461 (125)\ttotal: 1.8s\tremaining: 12.5s\n",
|
|
"126:\tlearn: 0.3903771\ttest: 0.3417161\tbest: 0.3417161 (126)\ttotal: 1.81s\tremaining: 12.5s\n",
|
|
"127:\tlearn: 0.3897033\ttest: 0.3403954\tbest: 0.3403954 (127)\ttotal: 1.83s\tremaining: 12.5s\n",
|
|
"128:\tlearn: 0.3890399\ttest: 0.3394564\tbest: 0.3394564 (128)\ttotal: 1.84s\tremaining: 12.5s\n",
|
|
"129:\tlearn: 0.3884105\ttest: 0.3401233\tbest: 0.3394564 (128)\ttotal: 1.87s\tremaining: 12.5s\n",
|
|
"130:\tlearn: 0.3877117\ttest: 0.3395392\tbest: 0.3394564 (128)\ttotal: 1.89s\tremaining: 12.5s\n",
|
|
"131:\tlearn: 0.3876645\ttest: 0.3395524\tbest: 0.3394564 (128)\ttotal: 1.9s\tremaining: 12.5s\n",
|
|
"132:\tlearn: 0.3863879\ttest: 0.3393034\tbest: 0.3393034 (132)\ttotal: 1.92s\tremaining: 12.5s\n",
|
|
"133:\tlearn: 0.3854992\ttest: 0.3385449\tbest: 0.3385449 (133)\ttotal: 1.94s\tremaining: 12.5s\n",
|
|
"134:\tlearn: 0.3852853\ttest: 0.3375203\tbest: 0.3375203 (134)\ttotal: 1.95s\tremaining: 12.5s\n",
|
|
"135:\tlearn: 0.3834471\ttest: 0.3400186\tbest: 0.3375203 (134)\ttotal: 1.97s\tremaining: 12.5s\n",
|
|
"136:\tlearn: 0.3834371\ttest: 0.3400258\tbest: 0.3375203 (134)\ttotal: 1.99s\tremaining: 12.5s\n",
|
|
"137:\tlearn: 0.3817184\ttest: 0.3395821\tbest: 0.3375203 (134)\ttotal: 2.01s\tremaining: 12.5s\n",
|
|
"138:\tlearn: 0.3809465\ttest: 0.3388013\tbest: 0.3375203 (134)\ttotal: 2.02s\tremaining: 12.5s\n",
|
|
"139:\tlearn: 0.3808146\ttest: 0.3386698\tbest: 0.3375203 (134)\ttotal: 2.04s\tremaining: 12.5s\n",
|
|
"140:\tlearn: 0.3805676\ttest: 0.3380244\tbest: 0.3375203 (134)\ttotal: 2.05s\tremaining: 12.5s\n",
|
|
"141:\tlearn: 0.3796549\ttest: 0.3368964\tbest: 0.3368964 (141)\ttotal: 2.07s\tremaining: 12.5s\n",
|
|
"142:\tlearn: 0.3774402\ttest: 0.3395046\tbest: 0.3368964 (141)\ttotal: 2.09s\tremaining: 12.5s\n",
|
|
"143:\tlearn: 0.3769460\ttest: 0.3389983\tbest: 0.3368964 (141)\ttotal: 2.1s\tremaining: 12.5s\n",
|
|
"144:\tlearn: 0.3764719\ttest: 0.3397295\tbest: 0.3368964 (141)\ttotal: 2.12s\tremaining: 12.5s\n",
|
|
"145:\tlearn: 0.3761308\ttest: 0.3396214\tbest: 0.3368964 (141)\ttotal: 2.14s\tremaining: 12.5s\n",
|
|
"146:\tlearn: 0.3753292\ttest: 0.3403456\tbest: 0.3368964 (141)\ttotal: 2.16s\tremaining: 12.6s\n",
|
|
"147:\tlearn: 0.3751463\ttest: 0.3405256\tbest: 0.3368964 (141)\ttotal: 2.18s\tremaining: 12.6s\n",
|
|
"148:\tlearn: 0.3729142\ttest: 0.3419831\tbest: 0.3368964 (141)\ttotal: 2.21s\tremaining: 12.6s\n",
|
|
"149:\tlearn: 0.3716310\ttest: 0.3413215\tbest: 0.3368964 (141)\ttotal: 2.23s\tremaining: 12.6s\n",
|
|
"150:\tlearn: 0.3713661\ttest: 0.3411367\tbest: 0.3368964 (141)\ttotal: 2.25s\tremaining: 12.6s\n",
|
|
"151:\tlearn: 0.3710830\ttest: 0.3420469\tbest: 0.3368964 (141)\ttotal: 2.27s\tremaining: 12.7s\n",
|
|
"152:\tlearn: 0.3697550\ttest: 0.3419096\tbest: 0.3368964 (141)\ttotal: 2.29s\tremaining: 12.7s\n",
|
|
"153:\tlearn: 0.3686245\ttest: 0.3419550\tbest: 0.3368964 (141)\ttotal: 2.32s\tremaining: 12.7s\n",
|
|
"154:\tlearn: 0.3673240\ttest: 0.3423916\tbest: 0.3368964 (141)\ttotal: 2.34s\tremaining: 12.8s\n",
|
|
"155:\tlearn: 0.3668303\ttest: 0.3445302\tbest: 0.3368964 (141)\ttotal: 2.36s\tremaining: 12.8s\n",
|
|
"156:\tlearn: 0.3659651\ttest: 0.3458817\tbest: 0.3368964 (141)\ttotal: 2.38s\tremaining: 12.8s\n",
|
|
"157:\tlearn: 0.3654258\ttest: 0.3449388\tbest: 0.3368964 (141)\ttotal: 2.41s\tremaining: 12.8s\n",
|
|
"158:\tlearn: 0.3635140\ttest: 0.3443812\tbest: 0.3368964 (141)\ttotal: 2.43s\tremaining: 12.9s\n",
|
|
"159:\tlearn: 0.3630616\ttest: 0.3438909\tbest: 0.3368964 (141)\ttotal: 2.45s\tremaining: 12.9s\n",
|
|
"160:\tlearn: 0.3627787\ttest: 0.3434770\tbest: 0.3368964 (141)\ttotal: 2.47s\tremaining: 12.9s\n",
|
|
"161:\tlearn: 0.3624495\ttest: 0.3429383\tbest: 0.3368964 (141)\ttotal: 2.49s\tremaining: 12.9s\n",
|
|
"162:\tlearn: 0.3617710\ttest: 0.3425749\tbest: 0.3368964 (141)\ttotal: 2.51s\tremaining: 12.9s\n",
|
|
"163:\tlearn: 0.3614711\ttest: 0.3419486\tbest: 0.3368964 (141)\ttotal: 2.54s\tremaining: 12.9s\n",
|
|
"164:\tlearn: 0.3613556\ttest: 0.3420927\tbest: 0.3368964 (141)\ttotal: 2.56s\tremaining: 12.9s\n",
|
|
"165:\tlearn: 0.3609495\ttest: 0.3425933\tbest: 0.3368964 (141)\ttotal: 2.58s\tremaining: 13s\n",
|
|
"166:\tlearn: 0.3605044\ttest: 0.3413995\tbest: 0.3368964 (141)\ttotal: 2.6s\tremaining: 13s\n",
|
|
"167:\tlearn: 0.3587192\ttest: 0.3427264\tbest: 0.3368964 (141)\ttotal: 2.62s\tremaining: 13s\n",
|
|
"168:\tlearn: 0.3574046\ttest: 0.3408992\tbest: 0.3368964 (141)\ttotal: 2.64s\tremaining: 13s\n",
|
|
"169:\tlearn: 0.3554031\ttest: 0.3394905\tbest: 0.3368964 (141)\ttotal: 2.67s\tremaining: 13s\n",
|
|
"170:\tlearn: 0.3552656\ttest: 0.3392875\tbest: 0.3368964 (141)\ttotal: 2.69s\tremaining: 13s\n",
|
|
"171:\tlearn: 0.3533954\ttest: 0.3403157\tbest: 0.3368964 (141)\ttotal: 2.71s\tremaining: 13s\n",
|
|
"172:\tlearn: 0.3520127\ttest: 0.3382418\tbest: 0.3368964 (141)\ttotal: 2.73s\tremaining: 13.1s\n",
|
|
"173:\tlearn: 0.3503890\ttest: 0.3377337\tbest: 0.3368964 (141)\ttotal: 2.76s\tremaining: 13.1s\n",
|
|
"174:\tlearn: 0.3477975\ttest: 0.3384210\tbest: 0.3368964 (141)\ttotal: 2.78s\tremaining: 13.1s\n",
|
|
"175:\tlearn: 0.3467401\ttest: 0.3387476\tbest: 0.3368964 (141)\ttotal: 2.8s\tremaining: 13.1s\n",
|
|
"176:\tlearn: 0.3460745\ttest: 0.3379054\tbest: 0.3368964 (141)\ttotal: 2.82s\tremaining: 13.1s\n",
|
|
"177:\tlearn: 0.3455549\ttest: 0.3372829\tbest: 0.3368964 (141)\ttotal: 2.85s\tremaining: 13.1s\n",
|
|
"178:\tlearn: 0.3454679\ttest: 0.3375740\tbest: 0.3368964 (141)\ttotal: 2.87s\tremaining: 13.2s\n",
|
|
"179:\tlearn: 0.3447744\ttest: 0.3372410\tbest: 0.3368964 (141)\ttotal: 2.9s\tremaining: 13.2s\n",
|
|
"180:\tlearn: 0.3436977\ttest: 0.3365488\tbest: 0.3365488 (180)\ttotal: 2.92s\tremaining: 13.2s\n",
|
|
"181:\tlearn: 0.3430318\ttest: 0.3358299\tbest: 0.3358299 (181)\ttotal: 2.94s\tremaining: 13.2s\n",
|
|
"182:\tlearn: 0.3416864\ttest: 0.3364973\tbest: 0.3358299 (181)\ttotal: 2.97s\tremaining: 13.3s\n",
|
|
"183:\tlearn: 0.3410605\ttest: 0.3376009\tbest: 0.3358299 (181)\ttotal: 3.02s\tremaining: 13.4s\n",
|
|
"184:\tlearn: 0.3405875\ttest: 0.3368493\tbest: 0.3358299 (181)\ttotal: 3.04s\tremaining: 13.4s\n",
|
|
"185:\tlearn: 0.3392433\ttest: 0.3379157\tbest: 0.3358299 (181)\ttotal: 3.07s\tremaining: 13.4s\n",
|
|
"186:\tlearn: 0.3388921\ttest: 0.3383425\tbest: 0.3358299 (181)\ttotal: 3.09s\tremaining: 13.4s\n",
|
|
"187:\tlearn: 0.3377990\ttest: 0.3381098\tbest: 0.3358299 (181)\ttotal: 3.11s\tremaining: 13.4s\n",
|
|
"188:\tlearn: 0.3370448\ttest: 0.3379576\tbest: 0.3358299 (181)\ttotal: 3.13s\tremaining: 13.4s\n",
|
|
"189:\tlearn: 0.3349461\ttest: 0.3373672\tbest: 0.3358299 (181)\ttotal: 3.15s\tremaining: 13.4s\n",
|
|
"190:\tlearn: 0.3334273\ttest: 0.3375000\tbest: 0.3358299 (181)\ttotal: 3.18s\tremaining: 13.5s\n",
|
|
"191:\tlearn: 0.3321925\ttest: 0.3365820\tbest: 0.3358299 (181)\ttotal: 3.2s\tremaining: 13.5s\n",
|
|
"192:\tlearn: 0.3315497\ttest: 0.3366504\tbest: 0.3358299 (181)\ttotal: 3.22s\tremaining: 13.5s\n",
|
|
"193:\tlearn: 0.3308260\ttest: 0.3380126\tbest: 0.3358299 (181)\ttotal: 3.25s\tremaining: 13.5s\n",
|
|
"194:\tlearn: 0.3295802\ttest: 0.3381771\tbest: 0.3358299 (181)\ttotal: 3.27s\tremaining: 13.5s\n",
|
|
"195:\tlearn: 0.3284964\ttest: 0.3367636\tbest: 0.3358299 (181)\ttotal: 3.29s\tremaining: 13.5s\n",
|
|
"196:\tlearn: 0.3278220\ttest: 0.3359609\tbest: 0.3358299 (181)\ttotal: 3.31s\tremaining: 13.5s\n",
|
|
"197:\tlearn: 0.3277441\ttest: 0.3360758\tbest: 0.3358299 (181)\ttotal: 3.33s\tremaining: 13.5s\n",
|
|
"198:\tlearn: 0.3274559\ttest: 0.3356264\tbest: 0.3356264 (198)\ttotal: 3.35s\tremaining: 13.5s\n",
|
|
"199:\tlearn: 0.3261690\ttest: 0.3345326\tbest: 0.3345326 (199)\ttotal: 3.37s\tremaining: 13.5s\n",
|
|
"200:\tlearn: 0.3248743\ttest: 0.3337475\tbest: 0.3337475 (200)\ttotal: 3.4s\tremaining: 13.5s\n",
|
|
"201:\tlearn: 0.3233117\ttest: 0.3342955\tbest: 0.3337475 (200)\ttotal: 3.43s\tremaining: 13.5s\n",
|
|
"202:\tlearn: 0.3218689\ttest: 0.3365787\tbest: 0.3337475 (200)\ttotal: 3.45s\tremaining: 13.5s\n",
|
|
"203:\tlearn: 0.3218173\ttest: 0.3364735\tbest: 0.3337475 (200)\ttotal: 3.47s\tremaining: 13.5s\n",
|
|
"204:\tlearn: 0.3200599\ttest: 0.3351934\tbest: 0.3337475 (200)\ttotal: 3.49s\tremaining: 13.5s\n",
|
|
"205:\tlearn: 0.3199710\ttest: 0.3353907\tbest: 0.3337475 (200)\ttotal: 3.51s\tremaining: 13.5s\n",
|
|
"206:\tlearn: 0.3195823\ttest: 0.3349318\tbest: 0.3337475 (200)\ttotal: 3.53s\tremaining: 13.5s\n",
|
|
"207:\tlearn: 0.3186969\ttest: 0.3347929\tbest: 0.3337475 (200)\ttotal: 3.55s\tremaining: 13.5s\n",
|
|
"208:\tlearn: 0.3181706\ttest: 0.3339697\tbest: 0.3337475 (200)\ttotal: 3.57s\tremaining: 13.5s\n",
|
|
"209:\tlearn: 0.3173928\ttest: 0.3325601\tbest: 0.3325601 (209)\ttotal: 3.59s\tremaining: 13.5s\n",
|
|
"210:\tlearn: 0.3158173\ttest: 0.3322272\tbest: 0.3322272 (210)\ttotal: 3.62s\tremaining: 13.6s\n",
|
|
"211:\tlearn: 0.3155587\ttest: 0.3325197\tbest: 0.3322272 (210)\ttotal: 3.65s\tremaining: 13.5s\n",
|
|
"212:\tlearn: 0.3146623\ttest: 0.3321090\tbest: 0.3321090 (212)\ttotal: 3.67s\tremaining: 13.5s\n",
|
|
"213:\tlearn: 0.3136622\ttest: 0.3316304\tbest: 0.3316304 (213)\ttotal: 3.69s\tremaining: 13.5s\n",
|
|
"214:\tlearn: 0.3135363\ttest: 0.3311336\tbest: 0.3311336 (214)\ttotal: 3.71s\tremaining: 13.5s\n",
|
|
"215:\tlearn: 0.3130884\ttest: 0.3303739\tbest: 0.3303739 (215)\ttotal: 3.73s\tremaining: 13.5s\n",
|
|
"216:\tlearn: 0.3120606\ttest: 0.3293567\tbest: 0.3293567 (216)\ttotal: 3.75s\tremaining: 13.5s\n",
|
|
"217:\tlearn: 0.3116664\ttest: 0.3281855\tbest: 0.3281855 (217)\ttotal: 3.77s\tremaining: 13.5s\n",
|
|
"218:\tlearn: 0.3111178\ttest: 0.3276296\tbest: 0.3276296 (218)\ttotal: 3.79s\tremaining: 13.5s\n",
|
|
"219:\tlearn: 0.3105086\ttest: 0.3264849\tbest: 0.3264849 (219)\ttotal: 3.81s\tremaining: 13.5s\n",
|
|
"220:\tlearn: 0.3102102\ttest: 0.3264765\tbest: 0.3264765 (220)\ttotal: 3.84s\tremaining: 13.6s\n",
|
|
"221:\tlearn: 0.3099024\ttest: 0.3267943\tbest: 0.3264765 (220)\ttotal: 3.87s\tremaining: 13.5s\n",
|
|
"222:\tlearn: 0.3095184\ttest: 0.3269157\tbest: 0.3264765 (220)\ttotal: 3.89s\tremaining: 13.6s\n",
|
|
"223:\tlearn: 0.3081494\ttest: 0.3271597\tbest: 0.3264765 (220)\ttotal: 3.92s\tremaining: 13.6s\n",
|
|
"224:\tlearn: 0.3072583\ttest: 0.3280309\tbest: 0.3264765 (220)\ttotal: 3.94s\tremaining: 13.6s\n",
|
|
"225:\tlearn: 0.3069200\ttest: 0.3279860\tbest: 0.3264765 (220)\ttotal: 3.96s\tremaining: 13.6s\n",
|
|
"226:\tlearn: 0.3058194\ttest: 0.3275059\tbest: 0.3264765 (220)\ttotal: 3.98s\tremaining: 13.6s\n",
|
|
"227:\tlearn: 0.3048644\ttest: 0.3272109\tbest: 0.3264765 (220)\ttotal: 4.03s\tremaining: 13.6s\n",
|
|
"228:\tlearn: 0.3047048\ttest: 0.3274258\tbest: 0.3264765 (220)\ttotal: 4.07s\tremaining: 13.7s\n",
|
|
"229:\tlearn: 0.3045425\ttest: 0.3274438\tbest: 0.3264765 (220)\ttotal: 4.09s\tremaining: 13.7s\n",
|
|
"230:\tlearn: 0.3040284\ttest: 0.3288018\tbest: 0.3264765 (220)\ttotal: 4.11s\tremaining: 13.7s\n",
|
|
"231:\tlearn: 0.3036682\ttest: 0.3277946\tbest: 0.3264765 (220)\ttotal: 4.13s\tremaining: 13.7s\n",
|
|
"232:\tlearn: 0.3035572\ttest: 0.3279877\tbest: 0.3264765 (220)\ttotal: 4.16s\tremaining: 13.7s\n",
|
|
"233:\tlearn: 0.3032328\ttest: 0.3279773\tbest: 0.3264765 (220)\ttotal: 4.18s\tremaining: 13.7s\n",
|
|
"234:\tlearn: 0.3020950\ttest: 0.3281325\tbest: 0.3264765 (220)\ttotal: 4.2s\tremaining: 13.7s\n",
|
|
"235:\tlearn: 0.3015849\ttest: 0.3251426\tbest: 0.3251426 (235)\ttotal: 4.22s\tremaining: 13.7s\n",
|
|
"236:\tlearn: 0.3005986\ttest: 0.3248403\tbest: 0.3248403 (236)\ttotal: 4.24s\tremaining: 13.7s\n",
|
|
"237:\tlearn: 0.2993313\ttest: 0.3246325\tbest: 0.3246325 (237)\ttotal: 4.26s\tremaining: 13.6s\n",
|
|
"238:\tlearn: 0.2991551\ttest: 0.3249482\tbest: 0.3246325 (237)\ttotal: 4.29s\tremaining: 13.7s\n",
|
|
"239:\tlearn: 0.2979459\ttest: 0.3239250\tbest: 0.3239250 (239)\ttotal: 4.31s\tremaining: 13.6s\n",
|
|
"240:\tlearn: 0.2970139\ttest: 0.3244116\tbest: 0.3239250 (239)\ttotal: 4.33s\tremaining: 13.6s\n",
|
|
"241:\tlearn: 0.2958231\ttest: 0.3247597\tbest: 0.3239250 (239)\ttotal: 4.36s\tremaining: 13.6s\n",
|
|
"242:\tlearn: 0.2941688\ttest: 0.3256091\tbest: 0.3239250 (239)\ttotal: 4.38s\tremaining: 13.6s\n",
|
|
"243:\tlearn: 0.2941355\ttest: 0.3256805\tbest: 0.3239250 (239)\ttotal: 4.4s\tremaining: 13.6s\n",
|
|
"244:\tlearn: 0.2938451\ttest: 0.3245563\tbest: 0.3239250 (239)\ttotal: 4.42s\tremaining: 13.6s\n",
|
|
"245:\tlearn: 0.2928544\ttest: 0.3243428\tbest: 0.3239250 (239)\ttotal: 4.44s\tremaining: 13.6s\n",
|
|
"246:\tlearn: 0.2925523\ttest: 0.3244779\tbest: 0.3239250 (239)\ttotal: 4.46s\tremaining: 13.6s\n",
|
|
"247:\tlearn: 0.2920144\ttest: 0.3261294\tbest: 0.3239250 (239)\ttotal: 4.49s\tremaining: 13.6s\n",
|
|
"248:\tlearn: 0.2915637\ttest: 0.3250557\tbest: 0.3239250 (239)\ttotal: 4.51s\tremaining: 13.6s\n",
|
|
"249:\tlearn: 0.2913799\ttest: 0.3249278\tbest: 0.3239250 (239)\ttotal: 4.53s\tremaining: 13.6s\n",
|
|
"250:\tlearn: 0.2912670\ttest: 0.3243420\tbest: 0.3239250 (239)\ttotal: 4.55s\tremaining: 13.6s\n",
|
|
"251:\tlearn: 0.2902476\ttest: 0.3237833\tbest: 0.3237833 (251)\ttotal: 4.58s\tremaining: 13.6s\n",
|
|
"252:\tlearn: 0.2897745\ttest: 0.3220344\tbest: 0.3220344 (252)\ttotal: 4.6s\tremaining: 13.6s\n",
|
|
"253:\tlearn: 0.2888427\ttest: 0.3235846\tbest: 0.3220344 (252)\ttotal: 4.62s\tremaining: 13.6s\n",
|
|
"254:\tlearn: 0.2883693\ttest: 0.3238512\tbest: 0.3220344 (252)\ttotal: 4.64s\tremaining: 13.6s\n",
|
|
"255:\tlearn: 0.2877987\ttest: 0.3232807\tbest: 0.3220344 (252)\ttotal: 4.66s\tremaining: 13.5s\n",
|
|
"256:\tlearn: 0.2873445\ttest: 0.3228971\tbest: 0.3220344 (252)\ttotal: 4.68s\tremaining: 13.5s\n",
|
|
"257:\tlearn: 0.2866949\ttest: 0.3223527\tbest: 0.3220344 (252)\ttotal: 4.71s\tremaining: 13.6s\n",
|
|
"258:\tlearn: 0.2855918\ttest: 0.3229576\tbest: 0.3220344 (252)\ttotal: 4.74s\tremaining: 13.5s\n",
|
|
"259:\tlearn: 0.2846880\ttest: 0.3225775\tbest: 0.3220344 (252)\ttotal: 4.76s\tremaining: 13.5s\n",
|
|
"260:\tlearn: 0.2824887\ttest: 0.3222291\tbest: 0.3220344 (252)\ttotal: 4.78s\tremaining: 13.5s\n",
|
|
"261:\tlearn: 0.2819380\ttest: 0.3239887\tbest: 0.3220344 (252)\ttotal: 4.8s\tremaining: 13.5s\n",
|
|
"262:\tlearn: 0.2816513\ttest: 0.3234118\tbest: 0.3220344 (252)\ttotal: 4.82s\tremaining: 13.5s\n",
|
|
"263:\tlearn: 0.2814300\ttest: 0.3231445\tbest: 0.3220344 (252)\ttotal: 4.84s\tremaining: 13.5s\n",
|
|
"264:\tlearn: 0.2810975\ttest: 0.3227193\tbest: 0.3220344 (252)\ttotal: 4.87s\tremaining: 13.5s\n",
|
|
"265:\tlearn: 0.2802928\ttest: 0.3234880\tbest: 0.3220344 (252)\ttotal: 4.9s\tremaining: 13.5s\n",
|
|
"266:\tlearn: 0.2798442\ttest: 0.3223112\tbest: 0.3220344 (252)\ttotal: 4.94s\tremaining: 13.6s\n",
|
|
"267:\tlearn: 0.2789938\ttest: 0.3230679\tbest: 0.3220344 (252)\ttotal: 4.98s\tremaining: 13.6s\n",
|
|
"268:\tlearn: 0.2785376\ttest: 0.3231186\tbest: 0.3220344 (252)\ttotal: 5s\tremaining: 13.6s\n",
|
|
"269:\tlearn: 0.2767426\ttest: 0.3218904\tbest: 0.3218904 (269)\ttotal: 5.05s\tremaining: 13.6s\n",
|
|
"270:\tlearn: 0.2763053\ttest: 0.3208901\tbest: 0.3208901 (270)\ttotal: 5.08s\tremaining: 13.7s\n",
|
|
"271:\tlearn: 0.2757219\ttest: 0.3202770\tbest: 0.3202770 (271)\ttotal: 5.11s\tremaining: 13.7s\n",
|
|
"272:\tlearn: 0.2752212\ttest: 0.3203453\tbest: 0.3202770 (271)\ttotal: 5.13s\tremaining: 13.7s\n",
|
|
"273:\tlearn: 0.2742395\ttest: 0.3219275\tbest: 0.3202770 (271)\ttotal: 5.15s\tremaining: 13.6s\n",
|
|
"274:\tlearn: 0.2735720\ttest: 0.3217131\tbest: 0.3202770 (271)\ttotal: 5.17s\tremaining: 13.6s\n",
|
|
"275:\tlearn: 0.2728224\ttest: 0.3211963\tbest: 0.3202770 (271)\ttotal: 5.19s\tremaining: 13.6s\n",
|
|
"276:\tlearn: 0.2725162\ttest: 0.3207129\tbest: 0.3202770 (271)\ttotal: 5.21s\tremaining: 13.6s\n",
|
|
"277:\tlearn: 0.2719089\ttest: 0.3200058\tbest: 0.3200058 (277)\ttotal: 5.24s\tremaining: 13.6s\n",
|
|
"278:\tlearn: 0.2712946\ttest: 0.3206884\tbest: 0.3200058 (277)\ttotal: 5.26s\tremaining: 13.6s\n",
|
|
"279:\tlearn: 0.2709349\ttest: 0.3201524\tbest: 0.3200058 (277)\ttotal: 5.28s\tremaining: 13.6s\n",
|
|
"280:\tlearn: 0.2701674\ttest: 0.3224420\tbest: 0.3200058 (277)\ttotal: 5.3s\tremaining: 13.6s\n",
|
|
"281:\tlearn: 0.2693123\ttest: 0.3216157\tbest: 0.3200058 (277)\ttotal: 5.32s\tremaining: 13.6s\n",
|
|
"282:\tlearn: 0.2690761\ttest: 0.3215704\tbest: 0.3200058 (277)\ttotal: 5.34s\tremaining: 13.5s\n",
|
|
"283:\tlearn: 0.2685201\ttest: 0.3230665\tbest: 0.3200058 (277)\ttotal: 5.38s\tremaining: 13.6s\n",
|
|
"284:\tlearn: 0.2679390\ttest: 0.3227924\tbest: 0.3200058 (277)\ttotal: 5.4s\tremaining: 13.6s\n",
|
|
"285:\tlearn: 0.2670964\ttest: 0.3222340\tbest: 0.3200058 (277)\ttotal: 5.43s\tremaining: 13.5s\n",
|
|
"286:\tlearn: 0.2663466\ttest: 0.3211293\tbest: 0.3200058 (277)\ttotal: 5.45s\tremaining: 13.5s\n",
|
|
"287:\tlearn: 0.2656140\ttest: 0.3216368\tbest: 0.3200058 (277)\ttotal: 5.47s\tremaining: 13.5s\n",
|
|
"288:\tlearn: 0.2653788\ttest: 0.3213893\tbest: 0.3200058 (277)\ttotal: 5.49s\tremaining: 13.5s\n",
|
|
"289:\tlearn: 0.2644749\ttest: 0.3225218\tbest: 0.3200058 (277)\ttotal: 5.51s\tremaining: 13.5s\n",
|
|
"290:\tlearn: 0.2640870\ttest: 0.3219443\tbest: 0.3200058 (277)\ttotal: 5.54s\tremaining: 13.5s\n",
|
|
"291:\tlearn: 0.2637237\ttest: 0.3224614\tbest: 0.3200058 (277)\ttotal: 5.56s\tremaining: 13.5s\n",
|
|
"292:\tlearn: 0.2627716\ttest: 0.3205108\tbest: 0.3200058 (277)\ttotal: 5.58s\tremaining: 13.5s\n",
|
|
"293:\tlearn: 0.2619855\ttest: 0.3225784\tbest: 0.3200058 (277)\ttotal: 5.6s\tremaining: 13.5s\n",
|
|
"294:\tlearn: 0.2615697\ttest: 0.3234081\tbest: 0.3200058 (277)\ttotal: 5.62s\tremaining: 13.4s\n",
|
|
"295:\tlearn: 0.2606173\ttest: 0.3206346\tbest: 0.3200058 (277)\ttotal: 5.64s\tremaining: 13.4s\n",
|
|
"296:\tlearn: 0.2604679\ttest: 0.3205838\tbest: 0.3200058 (277)\ttotal: 5.67s\tremaining: 13.4s\n",
|
|
"297:\tlearn: 0.2596508\ttest: 0.3200462\tbest: 0.3200058 (277)\ttotal: 5.69s\tremaining: 13.4s\n",
|
|
"298:\tlearn: 0.2592070\ttest: 0.3217201\tbest: 0.3200058 (277)\ttotal: 5.71s\tremaining: 13.4s\n",
|
|
"299:\tlearn: 0.2581787\ttest: 0.3232762\tbest: 0.3200058 (277)\ttotal: 5.73s\tremaining: 13.4s\n",
|
|
"300:\tlearn: 0.2569270\ttest: 0.3237985\tbest: 0.3200058 (277)\ttotal: 5.75s\tremaining: 13.3s\n",
|
|
"301:\tlearn: 0.2565765\ttest: 0.3255469\tbest: 0.3200058 (277)\ttotal: 5.77s\tremaining: 13.3s\n",
|
|
"302:\tlearn: 0.2548836\ttest: 0.3246864\tbest: 0.3200058 (277)\ttotal: 5.79s\tremaining: 13.3s\n",
|
|
"303:\tlearn: 0.2545078\ttest: 0.3246551\tbest: 0.3200058 (277)\ttotal: 5.82s\tremaining: 13.3s\n",
|
|
"304:\tlearn: 0.2539761\ttest: 0.3251842\tbest: 0.3200058 (277)\ttotal: 5.83s\tremaining: 13.3s\n",
|
|
"305:\tlearn: 0.2531831\ttest: 0.3245915\tbest: 0.3200058 (277)\ttotal: 5.86s\tremaining: 13.3s\n",
|
|
"306:\tlearn: 0.2530399\ttest: 0.3245777\tbest: 0.3200058 (277)\ttotal: 5.88s\tremaining: 13.3s\n",
|
|
"307:\tlearn: 0.2528164\ttest: 0.3245206\tbest: 0.3200058 (277)\ttotal: 5.91s\tremaining: 13.3s\n",
|
|
"308:\tlearn: 0.2526064\ttest: 0.3244535\tbest: 0.3200058 (277)\ttotal: 5.93s\tremaining: 13.3s\n",
|
|
"309:\tlearn: 0.2524286\ttest: 0.3235282\tbest: 0.3200058 (277)\ttotal: 5.96s\tremaining: 13.3s\n",
|
|
"310:\tlearn: 0.2520906\ttest: 0.3251411\tbest: 0.3200058 (277)\ttotal: 5.98s\tremaining: 13.2s\n",
|
|
"311:\tlearn: 0.2514886\ttest: 0.3250327\tbest: 0.3200058 (277)\ttotal: 6s\tremaining: 13.2s\n",
|
|
"312:\tlearn: 0.2508828\ttest: 0.3252720\tbest: 0.3200058 (277)\ttotal: 6.03s\tremaining: 13.2s\n",
|
|
"313:\tlearn: 0.2506791\ttest: 0.3239371\tbest: 0.3200058 (277)\ttotal: 6.07s\tremaining: 13.3s\n",
|
|
"314:\tlearn: 0.2501687\ttest: 0.3235234\tbest: 0.3200058 (277)\ttotal: 6.11s\tremaining: 13.3s\n",
|
|
"315:\tlearn: 0.2497406\ttest: 0.3242956\tbest: 0.3200058 (277)\ttotal: 6.13s\tremaining: 13.3s\n",
|
|
"316:\tlearn: 0.2491185\ttest: 0.3233617\tbest: 0.3200058 (277)\ttotal: 6.15s\tremaining: 13.3s\n",
|
|
"317:\tlearn: 0.2480398\ttest: 0.3230793\tbest: 0.3200058 (277)\ttotal: 6.17s\tremaining: 13.2s\n",
|
|
"318:\tlearn: 0.2473057\ttest: 0.3230382\tbest: 0.3200058 (277)\ttotal: 6.19s\tremaining: 13.2s\n",
|
|
"319:\tlearn: 0.2468940\ttest: 0.3218288\tbest: 0.3200058 (277)\ttotal: 6.22s\tremaining: 13.2s\n",
|
|
"320:\tlearn: 0.2452541\ttest: 0.3197873\tbest: 0.3197873 (320)\ttotal: 6.24s\tremaining: 13.2s\n",
|
|
"321:\tlearn: 0.2450583\ttest: 0.3196696\tbest: 0.3196696 (321)\ttotal: 6.26s\tremaining: 13.2s\n",
|
|
"322:\tlearn: 0.2445721\ttest: 0.3204715\tbest: 0.3196696 (321)\ttotal: 6.29s\tremaining: 13.2s\n",
|
|
"323:\tlearn: 0.2441427\ttest: 0.3209744\tbest: 0.3196696 (321)\ttotal: 6.31s\tremaining: 13.2s\n",
|
|
"324:\tlearn: 0.2438674\ttest: 0.3209314\tbest: 0.3196696 (321)\ttotal: 6.33s\tremaining: 13.1s\n",
|
|
"325:\tlearn: 0.2434764\ttest: 0.3201554\tbest: 0.3196696 (321)\ttotal: 6.35s\tremaining: 13.1s\n",
|
|
"326:\tlearn: 0.2430182\ttest: 0.3197804\tbest: 0.3196696 (321)\ttotal: 6.37s\tremaining: 13.1s\n",
|
|
"327:\tlearn: 0.2423230\ttest: 0.3192002\tbest: 0.3192002 (327)\ttotal: 6.39s\tremaining: 13.1s\n",
|
|
"328:\tlearn: 0.2417987\ttest: 0.3186197\tbest: 0.3186197 (328)\ttotal: 6.42s\tremaining: 13.1s\n",
|
|
"329:\tlearn: 0.2413733\ttest: 0.3185010\tbest: 0.3185010 (329)\ttotal: 6.44s\tremaining: 13.1s\n",
|
|
"330:\tlearn: 0.2410537\ttest: 0.3177056\tbest: 0.3177056 (330)\ttotal: 6.47s\tremaining: 13.1s\n",
|
|
"331:\tlearn: 0.2406344\ttest: 0.3182963\tbest: 0.3177056 (330)\ttotal: 6.49s\tremaining: 13.1s\n",
|
|
"332:\tlearn: 0.2404183\ttest: 0.3172621\tbest: 0.3172621 (332)\ttotal: 6.51s\tremaining: 13s\n",
|
|
"333:\tlearn: 0.2399131\ttest: 0.3161861\tbest: 0.3161861 (333)\ttotal: 6.53s\tremaining: 13s\n",
|
|
"334:\tlearn: 0.2397435\ttest: 0.3162841\tbest: 0.3161861 (333)\ttotal: 6.55s\tremaining: 13s\n",
|
|
"335:\tlearn: 0.2393043\ttest: 0.3159113\tbest: 0.3159113 (335)\ttotal: 6.57s\tremaining: 13s\n",
|
|
"336:\tlearn: 0.2392795\ttest: 0.3160941\tbest: 0.3159113 (335)\ttotal: 6.59s\tremaining: 13s\n",
|
|
"337:\tlearn: 0.2390489\ttest: 0.3158061\tbest: 0.3158061 (337)\ttotal: 6.61s\tremaining: 13s\n",
|
|
"338:\tlearn: 0.2387600\ttest: 0.3160059\tbest: 0.3158061 (337)\ttotal: 6.63s\tremaining: 12.9s\n",
|
|
"339:\tlearn: 0.2386845\ttest: 0.3159173\tbest: 0.3158061 (337)\ttotal: 6.66s\tremaining: 12.9s\n",
|
|
"340:\tlearn: 0.2383397\ttest: 0.3158989\tbest: 0.3158061 (337)\ttotal: 6.68s\tremaining: 12.9s\n",
|
|
"341:\tlearn: 0.2380908\ttest: 0.3165539\tbest: 0.3158061 (337)\ttotal: 6.7s\tremaining: 12.9s\n",
|
|
"342:\tlearn: 0.2380136\ttest: 0.3164796\tbest: 0.3158061 (337)\ttotal: 6.72s\tremaining: 12.9s\n",
|
|
"343:\tlearn: 0.2375307\ttest: 0.3159906\tbest: 0.3158061 (337)\ttotal: 6.75s\tremaining: 12.9s\n",
|
|
"344:\tlearn: 0.2370969\ttest: 0.3150500\tbest: 0.3150500 (344)\ttotal: 6.77s\tremaining: 12.8s\n",
|
|
"345:\tlearn: 0.2369640\ttest: 0.3150926\tbest: 0.3150500 (344)\ttotal: 6.79s\tremaining: 12.8s\n",
|
|
"346:\tlearn: 0.2361782\ttest: 0.3168486\tbest: 0.3150500 (344)\ttotal: 6.81s\tremaining: 12.8s\n",
|
|
"347:\tlearn: 0.2355638\ttest: 0.3168894\tbest: 0.3150500 (344)\ttotal: 6.83s\tremaining: 12.8s\n",
|
|
"348:\tlearn: 0.2345705\ttest: 0.3156646\tbest: 0.3150500 (344)\ttotal: 6.85s\tremaining: 12.8s\n",
|
|
"349:\tlearn: 0.2342992\ttest: 0.3154430\tbest: 0.3150500 (344)\ttotal: 6.88s\tremaining: 12.8s\n",
|
|
"350:\tlearn: 0.2333626\ttest: 0.3143013\tbest: 0.3143013 (350)\ttotal: 6.9s\tremaining: 12.8s\n",
|
|
"351:\tlearn: 0.2331503\ttest: 0.3148735\tbest: 0.3143013 (350)\ttotal: 6.93s\tremaining: 12.8s\n",
|
|
"352:\tlearn: 0.2328772\ttest: 0.3148594\tbest: 0.3143013 (350)\ttotal: 6.96s\tremaining: 12.7s\n",
|
|
"353:\tlearn: 0.2324078\ttest: 0.3151807\tbest: 0.3143013 (350)\ttotal: 6.98s\tremaining: 12.7s\n",
|
|
"354:\tlearn: 0.2318680\ttest: 0.3172500\tbest: 0.3143013 (350)\ttotal: 7s\tremaining: 12.7s\n",
|
|
"355:\tlearn: 0.2301244\ttest: 0.3151312\tbest: 0.3143013 (350)\ttotal: 7.02s\tremaining: 12.7s\n",
|
|
"356:\tlearn: 0.2296803\ttest: 0.3139809\tbest: 0.3139809 (356)\ttotal: 7.04s\tremaining: 12.7s\n",
|
|
"357:\tlearn: 0.2285364\ttest: 0.3119094\tbest: 0.3119094 (357)\ttotal: 7.06s\tremaining: 12.7s\n",
|
|
"358:\tlearn: 0.2281463\ttest: 0.3146867\tbest: 0.3119094 (357)\ttotal: 7.12s\tremaining: 12.7s\n",
|
|
"359:\tlearn: 0.2276262\ttest: 0.3138291\tbest: 0.3119094 (357)\ttotal: 7.15s\tremaining: 12.7s\n",
|
|
"360:\tlearn: 0.2272650\ttest: 0.3142031\tbest: 0.3119094 (357)\ttotal: 7.19s\tremaining: 12.7s\n",
|
|
"361:\tlearn: 0.2263969\ttest: 0.3145620\tbest: 0.3119094 (357)\ttotal: 7.21s\tremaining: 12.7s\n",
|
|
"362:\tlearn: 0.2256178\ttest: 0.3149349\tbest: 0.3119094 (357)\ttotal: 7.24s\tremaining: 12.7s\n",
|
|
"363:\tlearn: 0.2255198\ttest: 0.3145646\tbest: 0.3119094 (357)\ttotal: 7.25s\tremaining: 12.7s\n",
|
|
"364:\tlearn: 0.2252924\ttest: 0.3147219\tbest: 0.3119094 (357)\ttotal: 7.28s\tremaining: 12.7s\n",
|
|
"365:\tlearn: 0.2250715\ttest: 0.3146516\tbest: 0.3119094 (357)\ttotal: 7.3s\tremaining: 12.6s\n",
|
|
"366:\tlearn: 0.2247743\ttest: 0.3144040\tbest: 0.3119094 (357)\ttotal: 7.32s\tremaining: 12.6s\n",
|
|
"367:\tlearn: 0.2242782\ttest: 0.3161518\tbest: 0.3119094 (357)\ttotal: 7.34s\tremaining: 12.6s\n",
|
|
"368:\tlearn: 0.2241020\ttest: 0.3155429\tbest: 0.3119094 (357)\ttotal: 7.37s\tremaining: 12.6s\n",
|
|
"369:\tlearn: 0.2238773\ttest: 0.3158292\tbest: 0.3119094 (357)\ttotal: 7.39s\tremaining: 12.6s\n",
|
|
"370:\tlearn: 0.2237959\ttest: 0.3158195\tbest: 0.3119094 (357)\ttotal: 7.41s\tremaining: 12.6s\n",
|
|
"371:\tlearn: 0.2232172\ttest: 0.3155095\tbest: 0.3119094 (357)\ttotal: 7.43s\tremaining: 12.5s\n",
|
|
"372:\tlearn: 0.2227097\ttest: 0.3150365\tbest: 0.3119094 (357)\ttotal: 7.45s\tremaining: 12.5s\n",
|
|
"373:\tlearn: 0.2223752\ttest: 0.3153357\tbest: 0.3119094 (357)\ttotal: 7.47s\tremaining: 12.5s\n",
|
|
"374:\tlearn: 0.2219490\ttest: 0.3169741\tbest: 0.3119094 (357)\ttotal: 7.49s\tremaining: 12.5s\n",
|
|
"375:\tlearn: 0.2217220\ttest: 0.3168486\tbest: 0.3119094 (357)\ttotal: 7.51s\tremaining: 12.5s\n",
|
|
"376:\tlearn: 0.2216800\ttest: 0.3167389\tbest: 0.3119094 (357)\ttotal: 7.54s\tremaining: 12.5s\n",
|
|
"377:\tlearn: 0.2209831\ttest: 0.3145788\tbest: 0.3119094 (357)\ttotal: 7.56s\tremaining: 12.4s\n",
|
|
"378:\tlearn: 0.2203024\ttest: 0.3141477\tbest: 0.3119094 (357)\ttotal: 7.58s\tremaining: 12.4s\n",
|
|
"379:\tlearn: 0.2197154\ttest: 0.3137911\tbest: 0.3119094 (357)\ttotal: 7.6s\tremaining: 12.4s\n",
|
|
"380:\tlearn: 0.2189545\ttest: 0.3154727\tbest: 0.3119094 (357)\ttotal: 7.62s\tremaining: 12.4s\n",
|
|
"381:\tlearn: 0.2184389\ttest: 0.3155864\tbest: 0.3119094 (357)\ttotal: 7.64s\tremaining: 12.4s\n",
|
|
"382:\tlearn: 0.2180815\ttest: 0.3151073\tbest: 0.3119094 (357)\ttotal: 7.67s\tremaining: 12.3s\n",
|
|
"383:\tlearn: 0.2174960\ttest: 0.3158511\tbest: 0.3119094 (357)\ttotal: 7.69s\tremaining: 12.3s\n",
|
|
"384:\tlearn: 0.2164651\ttest: 0.3169457\tbest: 0.3119094 (357)\ttotal: 7.71s\tremaining: 12.3s\n",
|
|
"385:\tlearn: 0.2157699\ttest: 0.3157778\tbest: 0.3119094 (357)\ttotal: 7.73s\tremaining: 12.3s\n",
|
|
"386:\tlearn: 0.2157607\ttest: 0.3158080\tbest: 0.3119094 (357)\ttotal: 7.76s\tremaining: 12.3s\n",
|
|
"387:\tlearn: 0.2153043\ttest: 0.3160216\tbest: 0.3119094 (357)\ttotal: 7.78s\tremaining: 12.3s\n",
|
|
"388:\tlearn: 0.2146831\ttest: 0.3153982\tbest: 0.3119094 (357)\ttotal: 7.8s\tremaining: 12.3s\n",
|
|
"389:\tlearn: 0.2141842\ttest: 0.3148767\tbest: 0.3119094 (357)\ttotal: 7.82s\tremaining: 12.2s\n",
|
|
"390:\tlearn: 0.2137515\ttest: 0.3133006\tbest: 0.3119094 (357)\ttotal: 7.84s\tremaining: 12.2s\n",
|
|
"391:\tlearn: 0.2135136\ttest: 0.3129970\tbest: 0.3119094 (357)\ttotal: 7.87s\tremaining: 12.2s\n",
|
|
"392:\tlearn: 0.2132228\ttest: 0.3114946\tbest: 0.3114946 (392)\ttotal: 7.89s\tremaining: 12.2s\n",
|
|
"393:\tlearn: 0.2124851\ttest: 0.3111625\tbest: 0.3111625 (393)\ttotal: 7.91s\tremaining: 12.2s\n",
|
|
"394:\tlearn: 0.2123450\ttest: 0.3111193\tbest: 0.3111193 (394)\ttotal: 7.94s\tremaining: 12.2s\n",
|
|
"395:\tlearn: 0.2118953\ttest: 0.3120600\tbest: 0.3111193 (394)\ttotal: 7.97s\tremaining: 12.2s\n",
|
|
"396:\tlearn: 0.2118179\ttest: 0.3122279\tbest: 0.3111193 (394)\ttotal: 7.99s\tremaining: 12.1s\n",
|
|
"397:\tlearn: 0.2116740\ttest: 0.3119326\tbest: 0.3111193 (394)\ttotal: 8.01s\tremaining: 12.1s\n",
|
|
"398:\tlearn: 0.2116524\ttest: 0.3123241\tbest: 0.3111193 (394)\ttotal: 8.03s\tremaining: 12.1s\n",
|
|
"399:\tlearn: 0.2110381\ttest: 0.3121792\tbest: 0.3111193 (394)\ttotal: 8.05s\tremaining: 12.1s\n",
|
|
"400:\tlearn: 0.2109211\ttest: 0.3125812\tbest: 0.3111193 (394)\ttotal: 8.09s\tremaining: 12.1s\n",
|
|
"401:\tlearn: 0.2107829\ttest: 0.3124874\tbest: 0.3111193 (394)\ttotal: 8.14s\tremaining: 12.1s\n",
|
|
"402:\tlearn: 0.2104886\ttest: 0.3115179\tbest: 0.3111193 (394)\ttotal: 8.17s\tremaining: 12.1s\n",
|
|
"403:\tlearn: 0.2100496\ttest: 0.3101884\tbest: 0.3101884 (403)\ttotal: 8.19s\tremaining: 12.1s\n",
|
|
"404:\tlearn: 0.2099180\ttest: 0.3102349\tbest: 0.3101884 (403)\ttotal: 8.21s\tremaining: 12.1s\n",
|
|
"405:\tlearn: 0.2095959\ttest: 0.3108451\tbest: 0.3101884 (403)\ttotal: 8.24s\tremaining: 12.1s\n",
|
|
"406:\tlearn: 0.2092370\ttest: 0.3108771\tbest: 0.3101884 (403)\ttotal: 8.26s\tremaining: 12s\n",
|
|
"407:\tlearn: 0.2088328\ttest: 0.3105723\tbest: 0.3101884 (403)\ttotal: 8.28s\tremaining: 12s\n",
|
|
"408:\tlearn: 0.2087162\ttest: 0.3106422\tbest: 0.3101884 (403)\ttotal: 8.3s\tremaining: 12s\n",
|
|
"409:\tlearn: 0.2084766\ttest: 0.3105110\tbest: 0.3101884 (403)\ttotal: 8.32s\tremaining: 12s\n",
|
|
"410:\tlearn: 0.2084188\ttest: 0.3103437\tbest: 0.3101884 (403)\ttotal: 8.35s\tremaining: 12s\n",
|
|
"411:\tlearn: 0.2081080\ttest: 0.3100905\tbest: 0.3100905 (411)\ttotal: 8.37s\tremaining: 11.9s\n",
|
|
"412:\tlearn: 0.2074701\ttest: 0.3098965\tbest: 0.3098965 (412)\ttotal: 8.39s\tremaining: 11.9s\n",
|
|
"413:\tlearn: 0.2072126\ttest: 0.3103769\tbest: 0.3098965 (412)\ttotal: 8.42s\tremaining: 11.9s\n",
|
|
"414:\tlearn: 0.2072009\ttest: 0.3101887\tbest: 0.3098965 (412)\ttotal: 8.44s\tremaining: 11.9s\n",
|
|
"415:\tlearn: 0.2068360\ttest: 0.3097377\tbest: 0.3097377 (415)\ttotal: 8.46s\tremaining: 11.9s\n",
|
|
"416:\tlearn: 0.2059848\ttest: 0.3094822\tbest: 0.3094822 (416)\ttotal: 8.48s\tremaining: 11.9s\n",
|
|
"417:\tlearn: 0.2054855\ttest: 0.3099678\tbest: 0.3094822 (416)\ttotal: 8.5s\tremaining: 11.8s\n",
|
|
"418:\tlearn: 0.2048887\ttest: 0.3098426\tbest: 0.3094822 (416)\ttotal: 8.52s\tremaining: 11.8s\n",
|
|
"419:\tlearn: 0.2044166\ttest: 0.3088142\tbest: 0.3088142 (419)\ttotal: 8.54s\tremaining: 11.8s\n",
|
|
"420:\tlearn: 0.2041846\ttest: 0.3079639\tbest: 0.3079639 (420)\ttotal: 8.56s\tremaining: 11.8s\n",
|
|
"421:\tlearn: 0.2037445\ttest: 0.3078595\tbest: 0.3078595 (421)\ttotal: 8.59s\tremaining: 11.8s\n",
|
|
"422:\tlearn: 0.2031239\ttest: 0.3077150\tbest: 0.3077150 (422)\ttotal: 8.61s\tremaining: 11.7s\n",
|
|
"423:\tlearn: 0.2027433\ttest: 0.3072981\tbest: 0.3072981 (423)\ttotal: 8.63s\tremaining: 11.7s\n",
|
|
"424:\tlearn: 0.2026627\ttest: 0.3072085\tbest: 0.3072085 (424)\ttotal: 8.66s\tremaining: 11.7s\n",
|
|
"425:\tlearn: 0.2025986\ttest: 0.3073697\tbest: 0.3072085 (424)\ttotal: 8.68s\tremaining: 11.7s\n",
|
|
"426:\tlearn: 0.2020922\ttest: 0.3069990\tbest: 0.3069990 (426)\ttotal: 8.7s\tremaining: 11.7s\n",
|
|
"427:\tlearn: 0.2013590\ttest: 0.3057109\tbest: 0.3057109 (427)\ttotal: 8.72s\tremaining: 11.7s\n",
|
|
"428:\tlearn: 0.2009180\ttest: 0.3063807\tbest: 0.3057109 (427)\ttotal: 8.74s\tremaining: 11.6s\n",
|
|
"429:\tlearn: 0.2004774\ttest: 0.3058230\tbest: 0.3057109 (427)\ttotal: 8.76s\tremaining: 11.6s\n",
|
|
"430:\tlearn: 0.2004061\ttest: 0.3057218\tbest: 0.3057109 (427)\ttotal: 8.78s\tremaining: 11.6s\n",
|
|
"431:\tlearn: 0.1996249\ttest: 0.3058060\tbest: 0.3057109 (427)\ttotal: 8.81s\tremaining: 11.6s\n",
|
|
"432:\tlearn: 0.1993682\ttest: 0.3053345\tbest: 0.3053345 (432)\ttotal: 8.83s\tremaining: 11.6s\n",
|
|
"433:\tlearn: 0.1991686\ttest: 0.3053522\tbest: 0.3053345 (432)\ttotal: 8.85s\tremaining: 11.5s\n",
|
|
"434:\tlearn: 0.1988218\ttest: 0.3055996\tbest: 0.3053345 (432)\ttotal: 8.87s\tremaining: 11.5s\n",
|
|
"435:\tlearn: 0.1983701\ttest: 0.3055626\tbest: 0.3053345 (432)\ttotal: 8.9s\tremaining: 11.5s\n",
|
|
"436:\tlearn: 0.1980241\ttest: 0.3051032\tbest: 0.3051032 (436)\ttotal: 8.92s\tremaining: 11.5s\n",
|
|
"437:\tlearn: 0.1979395\ttest: 0.3042373\tbest: 0.3042373 (437)\ttotal: 8.95s\tremaining: 11.5s\n",
|
|
"438:\tlearn: 0.1975867\ttest: 0.3046654\tbest: 0.3042373 (437)\ttotal: 8.97s\tremaining: 11.5s\n",
|
|
"439:\tlearn: 0.1968638\ttest: 0.3023558\tbest: 0.3023558 (439)\ttotal: 9s\tremaining: 11.5s\n",
|
|
"440:\tlearn: 0.1965164\ttest: 0.3026255\tbest: 0.3023558 (439)\ttotal: 9.02s\tremaining: 11.4s\n",
|
|
"441:\tlearn: 0.1963720\ttest: 0.3025187\tbest: 0.3023558 (439)\ttotal: 9.04s\tremaining: 11.4s\n",
|
|
"442:\tlearn: 0.1960282\ttest: 0.3026460\tbest: 0.3023558 (439)\ttotal: 9.06s\tremaining: 11.4s\n",
|
|
"443:\tlearn: 0.1958677\ttest: 0.3027629\tbest: 0.3023558 (439)\ttotal: 9.09s\tremaining: 11.4s\n",
|
|
"444:\tlearn: 0.1955680\ttest: 0.3025443\tbest: 0.3023558 (439)\ttotal: 9.16s\tremaining: 11.4s\n",
|
|
"445:\tlearn: 0.1955397\ttest: 0.3026381\tbest: 0.3023558 (439)\ttotal: 9.19s\tremaining: 11.4s\n",
|
|
"446:\tlearn: 0.1954430\ttest: 0.3024576\tbest: 0.3023558 (439)\ttotal: 9.21s\tremaining: 11.4s\n",
|
|
"447:\tlearn: 0.1952908\ttest: 0.3020436\tbest: 0.3020436 (447)\ttotal: 9.23s\tremaining: 11.4s\n",
|
|
"448:\tlearn: 0.1944733\ttest: 0.3031577\tbest: 0.3020436 (447)\ttotal: 9.25s\tremaining: 11.4s\n",
|
|
"449:\tlearn: 0.1938516\ttest: 0.3027958\tbest: 0.3020436 (447)\ttotal: 9.27s\tremaining: 11.3s\n",
|
|
"450:\tlearn: 0.1937002\ttest: 0.3036071\tbest: 0.3020436 (447)\ttotal: 9.29s\tremaining: 11.3s\n",
|
|
"451:\tlearn: 0.1934686\ttest: 0.3034786\tbest: 0.3020436 (447)\ttotal: 9.31s\tremaining: 11.3s\n",
|
|
"452:\tlearn: 0.1926026\ttest: 0.3040125\tbest: 0.3020436 (447)\ttotal: 9.34s\tremaining: 11.3s\n",
|
|
"453:\tlearn: 0.1925431\ttest: 0.3036975\tbest: 0.3020436 (447)\ttotal: 9.36s\tremaining: 11.3s\n",
|
|
"454:\tlearn: 0.1913752\ttest: 0.3026900\tbest: 0.3020436 (447)\ttotal: 9.38s\tremaining: 11.2s\n",
|
|
"455:\tlearn: 0.1912783\ttest: 0.3028952\tbest: 0.3020436 (447)\ttotal: 9.4s\tremaining: 11.2s\n",
|
|
"456:\tlearn: 0.1910275\ttest: 0.3025857\tbest: 0.3020436 (447)\ttotal: 9.43s\tremaining: 11.2s\n",
|
|
"457:\tlearn: 0.1903735\ttest: 0.3018387\tbest: 0.3018387 (457)\ttotal: 9.45s\tremaining: 11.2s\n",
|
|
"458:\tlearn: 0.1902863\ttest: 0.3016340\tbest: 0.3016340 (458)\ttotal: 9.47s\tremaining: 11.2s\n",
|
|
"459:\tlearn: 0.1899290\ttest: 0.3021702\tbest: 0.3016340 (458)\ttotal: 9.49s\tremaining: 11.1s\n",
|
|
"460:\tlearn: 0.1897392\ttest: 0.3027392\tbest: 0.3016340 (458)\ttotal: 9.51s\tremaining: 11.1s\n",
|
|
"461:\tlearn: 0.1891910\ttest: 0.3017115\tbest: 0.3016340 (458)\ttotal: 9.54s\tremaining: 11.1s\n",
|
|
"462:\tlearn: 0.1890556\ttest: 0.3015709\tbest: 0.3015709 (462)\ttotal: 9.56s\tremaining: 11.1s\n",
|
|
"463:\tlearn: 0.1887583\ttest: 0.3015457\tbest: 0.3015457 (463)\ttotal: 9.58s\tremaining: 11.1s\n",
|
|
"464:\tlearn: 0.1883194\ttest: 0.3015929\tbest: 0.3015457 (463)\ttotal: 9.6s\tremaining: 11s\n",
|
|
"465:\tlearn: 0.1882070\ttest: 0.3015842\tbest: 0.3015457 (463)\ttotal: 9.62s\tremaining: 11s\n",
|
|
"466:\tlearn: 0.1880352\ttest: 0.3011346\tbest: 0.3011346 (466)\ttotal: 9.65s\tremaining: 11s\n",
|
|
"467:\tlearn: 0.1878475\ttest: 0.3005508\tbest: 0.3005508 (467)\ttotal: 9.68s\tremaining: 11s\n",
|
|
"468:\tlearn: 0.1872477\ttest: 0.3000772\tbest: 0.3000772 (468)\ttotal: 9.7s\tremaining: 11s\n",
|
|
"469:\tlearn: 0.1869897\ttest: 0.2996297\tbest: 0.2996297 (469)\ttotal: 9.72s\tremaining: 11s\n",
|
|
"470:\tlearn: 0.1865315\ttest: 0.2988517\tbest: 0.2988517 (470)\ttotal: 9.74s\tremaining: 10.9s\n",
|
|
"471:\tlearn: 0.1859486\ttest: 0.2964143\tbest: 0.2964143 (471)\ttotal: 9.77s\tremaining: 10.9s\n",
|
|
"472:\tlearn: 0.1857995\ttest: 0.2963192\tbest: 0.2963192 (472)\ttotal: 9.79s\tremaining: 10.9s\n",
|
|
"473:\tlearn: 0.1849236\ttest: 0.2958348\tbest: 0.2958348 (473)\ttotal: 9.81s\tremaining: 10.9s\n",
|
|
"474:\tlearn: 0.1836106\ttest: 0.2941979\tbest: 0.2941979 (474)\ttotal: 9.83s\tremaining: 10.9s\n",
|
|
"475:\tlearn: 0.1831882\ttest: 0.2936057\tbest: 0.2936057 (475)\ttotal: 9.85s\tremaining: 10.8s\n",
|
|
"476:\tlearn: 0.1816177\ttest: 0.2941160\tbest: 0.2936057 (475)\ttotal: 9.87s\tremaining: 10.8s\n",
|
|
"477:\tlearn: 0.1810110\ttest: 0.2930206\tbest: 0.2930206 (477)\ttotal: 9.89s\tremaining: 10.8s\n",
|
|
"478:\tlearn: 0.1805032\ttest: 0.2937012\tbest: 0.2930206 (477)\ttotal: 9.91s\tremaining: 10.8s\n",
|
|
"479:\tlearn: 0.1799497\ttest: 0.2929369\tbest: 0.2929369 (479)\ttotal: 9.94s\tremaining: 10.8s\n",
|
|
"480:\tlearn: 0.1793767\ttest: 0.2928436\tbest: 0.2928436 (480)\ttotal: 9.96s\tremaining: 10.8s\n",
|
|
"481:\tlearn: 0.1792914\ttest: 0.2925542\tbest: 0.2925542 (481)\ttotal: 9.98s\tremaining: 10.7s\n",
|
|
"482:\tlearn: 0.1791604\ttest: 0.2935477\tbest: 0.2925542 (481)\ttotal: 10s\tremaining: 10.7s\n",
|
|
"483:\tlearn: 0.1779802\ttest: 0.2928308\tbest: 0.2925542 (481)\ttotal: 10s\tremaining: 10.7s\n",
|
|
"484:\tlearn: 0.1774424\ttest: 0.2907211\tbest: 0.2907211 (484)\ttotal: 10.1s\tremaining: 10.7s\n",
|
|
"485:\tlearn: 0.1770674\ttest: 0.2899099\tbest: 0.2899099 (485)\ttotal: 10.1s\tremaining: 10.7s\n",
|
|
"486:\tlearn: 0.1769794\ttest: 0.2892942\tbest: 0.2892942 (486)\ttotal: 10.1s\tremaining: 10.6s\n",
|
|
"487:\tlearn: 0.1765762\ttest: 0.2887646\tbest: 0.2887646 (487)\ttotal: 10.2s\tremaining: 10.7s\n",
|
|
"488:\tlearn: 0.1765216\ttest: 0.2882770\tbest: 0.2882770 (488)\ttotal: 10.2s\tremaining: 10.7s\n",
|
|
"489:\tlearn: 0.1762514\ttest: 0.2877538\tbest: 0.2877538 (489)\ttotal: 10.2s\tremaining: 10.6s\n",
|
|
"490:\tlearn: 0.1759434\ttest: 0.2872693\tbest: 0.2872693 (490)\ttotal: 10.2s\tremaining: 10.6s\n",
|
|
"491:\tlearn: 0.1757192\ttest: 0.2874711\tbest: 0.2872693 (490)\ttotal: 10.3s\tremaining: 10.6s\n",
|
|
"492:\tlearn: 0.1755983\ttest: 0.2871540\tbest: 0.2871540 (492)\ttotal: 10.3s\tremaining: 10.6s\n",
|
|
"493:\tlearn: 0.1755525\ttest: 0.2871221\tbest: 0.2871221 (493)\ttotal: 10.3s\tremaining: 10.6s\n",
|
|
"494:\tlearn: 0.1752377\ttest: 0.2876102\tbest: 0.2871221 (493)\ttotal: 10.3s\tremaining: 10.5s\n",
|
|
"495:\tlearn: 0.1747890\ttest: 0.2882528\tbest: 0.2871221 (493)\ttotal: 10.4s\tremaining: 10.5s\n",
|
|
"496:\tlearn: 0.1747205\ttest: 0.2880991\tbest: 0.2871221 (493)\ttotal: 10.4s\tremaining: 10.5s\n",
|
|
"497:\tlearn: 0.1745294\ttest: 0.2882281\tbest: 0.2871221 (493)\ttotal: 10.4s\tremaining: 10.5s\n",
|
|
"498:\tlearn: 0.1743228\ttest: 0.2875775\tbest: 0.2871221 (493)\ttotal: 10.4s\tremaining: 10.5s\n",
|
|
"499:\tlearn: 0.1738721\ttest: 0.2868444\tbest: 0.2868444 (499)\ttotal: 10.4s\tremaining: 10.4s\n",
|
|
"500:\tlearn: 0.1737848\ttest: 0.2866751\tbest: 0.2866751 (500)\ttotal: 10.5s\tremaining: 10.4s\n",
|
|
"501:\tlearn: 0.1736505\ttest: 0.2860471\tbest: 0.2860471 (501)\ttotal: 10.5s\tremaining: 10.4s\n",
|
|
"502:\tlearn: 0.1734447\ttest: 0.2862500\tbest: 0.2860471 (501)\ttotal: 10.5s\tremaining: 10.4s\n",
|
|
"503:\tlearn: 0.1727491\ttest: 0.2857472\tbest: 0.2857472 (503)\ttotal: 10.5s\tremaining: 10.4s\n",
|
|
"504:\tlearn: 0.1719490\ttest: 0.2881112\tbest: 0.2857472 (503)\ttotal: 10.6s\tremaining: 10.4s\n",
|
|
"505:\tlearn: 0.1705113\ttest: 0.2871498\tbest: 0.2857472 (503)\ttotal: 10.6s\tremaining: 10.3s\n",
|
|
"506:\tlearn: 0.1703088\ttest: 0.2871525\tbest: 0.2857472 (503)\ttotal: 10.6s\tremaining: 10.3s\n",
|
|
"507:\tlearn: 0.1700343\ttest: 0.2870312\tbest: 0.2857472 (503)\ttotal: 10.6s\tremaining: 10.3s\n",
|
|
"508:\tlearn: 0.1694847\ttest: 0.2871094\tbest: 0.2857472 (503)\ttotal: 10.7s\tremaining: 10.3s\n",
|
|
"509:\tlearn: 0.1686960\ttest: 0.2876006\tbest: 0.2857472 (503)\ttotal: 10.7s\tremaining: 10.3s\n",
|
|
"510:\tlearn: 0.1686369\ttest: 0.2874959\tbest: 0.2857472 (503)\ttotal: 10.7s\tremaining: 10.2s\n",
|
|
"511:\tlearn: 0.1685373\ttest: 0.2874393\tbest: 0.2857472 (503)\ttotal: 10.7s\tremaining: 10.2s\n",
|
|
"512:\tlearn: 0.1684124\ttest: 0.2874136\tbest: 0.2857472 (503)\ttotal: 10.7s\tremaining: 10.2s\n",
|
|
"513:\tlearn: 0.1674766\ttest: 0.2867265\tbest: 0.2857472 (503)\ttotal: 10.8s\tremaining: 10.2s\n",
|
|
"514:\tlearn: 0.1673545\ttest: 0.2873168\tbest: 0.2857472 (503)\ttotal: 10.8s\tremaining: 10.2s\n",
|
|
"515:\tlearn: 0.1671290\ttest: 0.2871895\tbest: 0.2857472 (503)\ttotal: 10.8s\tremaining: 10.1s\n",
|
|
"516:\tlearn: 0.1666214\ttest: 0.2875431\tbest: 0.2857472 (503)\ttotal: 10.8s\tremaining: 10.1s\n",
|
|
"517:\tlearn: 0.1664852\ttest: 0.2878603\tbest: 0.2857472 (503)\ttotal: 10.8s\tremaining: 10.1s\n",
|
|
"518:\tlearn: 0.1663880\ttest: 0.2878397\tbest: 0.2857472 (503)\ttotal: 10.9s\tremaining: 10.1s\n",
|
|
"519:\tlearn: 0.1658845\ttest: 0.2874522\tbest: 0.2857472 (503)\ttotal: 10.9s\tremaining: 10.1s\n",
|
|
"520:\tlearn: 0.1658458\ttest: 0.2874124\tbest: 0.2857472 (503)\ttotal: 10.9s\tremaining: 10s\n",
|
|
"521:\tlearn: 0.1657301\ttest: 0.2873816\tbest: 0.2857472 (503)\ttotal: 11s\tremaining: 10s\n",
|
|
"522:\tlearn: 0.1654124\ttest: 0.2869302\tbest: 0.2857472 (503)\ttotal: 11s\tremaining: 10s\n",
|
|
"523:\tlearn: 0.1652782\ttest: 0.2870219\tbest: 0.2857472 (503)\ttotal: 11s\tremaining: 9.99s\n",
|
|
"524:\tlearn: 0.1647268\ttest: 0.2875223\tbest: 0.2857472 (503)\ttotal: 11s\tremaining: 9.97s\n",
|
|
"525:\tlearn: 0.1638935\ttest: 0.2864550\tbest: 0.2857472 (503)\ttotal: 11s\tremaining: 9.95s\n",
|
|
"526:\tlearn: 0.1637598\ttest: 0.2848655\tbest: 0.2848655 (526)\ttotal: 11.1s\tremaining: 9.93s\n",
|
|
"527:\tlearn: 0.1634325\ttest: 0.2847167\tbest: 0.2847167 (527)\ttotal: 11.1s\tremaining: 9.91s\n",
|
|
"528:\tlearn: 0.1631743\ttest: 0.2844104\tbest: 0.2844104 (528)\ttotal: 11.1s\tremaining: 9.89s\n",
|
|
"529:\tlearn: 0.1630561\ttest: 0.2844733\tbest: 0.2844104 (528)\ttotal: 11.1s\tremaining: 9.87s\n",
|
|
"530:\tlearn: 0.1627802\ttest: 0.2835471\tbest: 0.2835471 (530)\ttotal: 11.2s\tremaining: 9.88s\n",
|
|
"531:\tlearn: 0.1623848\ttest: 0.2841156\tbest: 0.2835471 (530)\ttotal: 11.2s\tremaining: 9.87s\n",
|
|
"532:\tlearn: 0.1617593\ttest: 0.2836724\tbest: 0.2835471 (530)\ttotal: 11.2s\tremaining: 9.86s\n",
|
|
"533:\tlearn: 0.1616241\ttest: 0.2847623\tbest: 0.2835471 (530)\ttotal: 11.3s\tremaining: 9.84s\n",
|
|
"534:\tlearn: 0.1613845\ttest: 0.2832507\tbest: 0.2832507 (534)\ttotal: 11.3s\tremaining: 9.81s\n",
|
|
"535:\tlearn: 0.1613368\ttest: 0.2828156\tbest: 0.2828156 (535)\ttotal: 11.3s\tremaining: 9.8s\n",
|
|
"536:\tlearn: 0.1611687\ttest: 0.2828736\tbest: 0.2828156 (535)\ttotal: 11.3s\tremaining: 9.78s\n",
|
|
"537:\tlearn: 0.1605478\ttest: 0.2822635\tbest: 0.2822635 (537)\ttotal: 11.4s\tremaining: 9.76s\n",
|
|
"538:\tlearn: 0.1599627\ttest: 0.2826619\tbest: 0.2822635 (537)\ttotal: 11.4s\tremaining: 9.74s\n",
|
|
"539:\tlearn: 0.1598788\ttest: 0.2826589\tbest: 0.2822635 (537)\ttotal: 11.4s\tremaining: 9.72s\n",
|
|
"540:\tlearn: 0.1596404\ttest: 0.2824933\tbest: 0.2822635 (537)\ttotal: 11.4s\tremaining: 9.7s\n",
|
|
"541:\tlearn: 0.1592799\ttest: 0.2822531\tbest: 0.2822531 (541)\ttotal: 11.5s\tremaining: 9.68s\n",
|
|
"542:\tlearn: 0.1592047\ttest: 0.2819088\tbest: 0.2819088 (542)\ttotal: 11.5s\tremaining: 9.66s\n",
|
|
"543:\tlearn: 0.1586438\ttest: 0.2827962\tbest: 0.2819088 (542)\ttotal: 11.5s\tremaining: 9.64s\n",
|
|
"544:\tlearn: 0.1584837\ttest: 0.2825906\tbest: 0.2819088 (542)\ttotal: 11.5s\tremaining: 9.62s\n",
|
|
"545:\tlearn: 0.1580315\ttest: 0.2824873\tbest: 0.2819088 (542)\ttotal: 11.5s\tremaining: 9.6s\n",
|
|
"546:\tlearn: 0.1574667\ttest: 0.2826341\tbest: 0.2819088 (542)\ttotal: 11.6s\tremaining: 9.58s\n",
|
|
"547:\tlearn: 0.1570216\ttest: 0.2827265\tbest: 0.2819088 (542)\ttotal: 11.6s\tremaining: 9.57s\n",
|
|
"548:\tlearn: 0.1566886\ttest: 0.2831575\tbest: 0.2819088 (542)\ttotal: 11.6s\tremaining: 9.55s\n",
|
|
"549:\tlearn: 0.1566304\ttest: 0.2831715\tbest: 0.2819088 (542)\ttotal: 11.6s\tremaining: 9.53s\n",
|
|
"550:\tlearn: 0.1562012\ttest: 0.2826185\tbest: 0.2819088 (542)\ttotal: 11.7s\tremaining: 9.51s\n",
|
|
"551:\tlearn: 0.1560971\ttest: 0.2825238\tbest: 0.2819088 (542)\ttotal: 11.7s\tremaining: 9.49s\n",
|
|
"552:\tlearn: 0.1553659\ttest: 0.2846724\tbest: 0.2819088 (542)\ttotal: 11.7s\tremaining: 9.47s\n",
|
|
"553:\tlearn: 0.1552867\ttest: 0.2843797\tbest: 0.2819088 (542)\ttotal: 11.7s\tremaining: 9.45s\n",
|
|
"554:\tlearn: 0.1551985\ttest: 0.2839720\tbest: 0.2819088 (542)\ttotal: 11.8s\tremaining: 9.43s\n",
|
|
"555:\tlearn: 0.1550766\ttest: 0.2839372\tbest: 0.2819088 (542)\ttotal: 11.8s\tremaining: 9.4s\n",
|
|
"556:\tlearn: 0.1548984\ttest: 0.2832543\tbest: 0.2819088 (542)\ttotal: 11.8s\tremaining: 9.38s\n",
|
|
"557:\tlearn: 0.1547746\ttest: 0.2833286\tbest: 0.2819088 (542)\ttotal: 11.8s\tremaining: 9.37s\n",
|
|
"558:\tlearn: 0.1546194\ttest: 0.2835540\tbest: 0.2819088 (542)\ttotal: 11.8s\tremaining: 9.35s\n",
|
|
"559:\tlearn: 0.1540901\ttest: 0.2825012\tbest: 0.2819088 (542)\ttotal: 11.9s\tremaining: 9.32s\n",
|
|
"560:\tlearn: 0.1537909\ttest: 0.2823767\tbest: 0.2819088 (542)\ttotal: 11.9s\tremaining: 9.3s\n",
|
|
"561:\tlearn: 0.1533903\ttest: 0.2830880\tbest: 0.2819088 (542)\ttotal: 11.9s\tremaining: 9.28s\n",
|
|
"562:\tlearn: 0.1532712\ttest: 0.2828577\tbest: 0.2819088 (542)\ttotal: 11.9s\tremaining: 9.26s\n",
|
|
"563:\tlearn: 0.1528173\ttest: 0.2824693\tbest: 0.2819088 (542)\ttotal: 12s\tremaining: 9.25s\n",
|
|
"564:\tlearn: 0.1526582\ttest: 0.2820139\tbest: 0.2819088 (542)\ttotal: 12s\tremaining: 9.23s\n",
|
|
"565:\tlearn: 0.1522182\ttest: 0.2826148\tbest: 0.2819088 (542)\ttotal: 12s\tremaining: 9.21s\n",
|
|
"566:\tlearn: 0.1518604\ttest: 0.2821539\tbest: 0.2819088 (542)\ttotal: 12s\tremaining: 9.19s\n",
|
|
"567:\tlearn: 0.1512013\ttest: 0.2819762\tbest: 0.2819088 (542)\ttotal: 12.1s\tremaining: 9.17s\n",
|
|
"568:\tlearn: 0.1510307\ttest: 0.2820713\tbest: 0.2819088 (542)\ttotal: 12.1s\tremaining: 9.15s\n",
|
|
"569:\tlearn: 0.1509427\ttest: 0.2820907\tbest: 0.2819088 (542)\ttotal: 12.1s\tremaining: 9.13s\n",
|
|
"570:\tlearn: 0.1504206\ttest: 0.2811841\tbest: 0.2811841 (570)\ttotal: 12.1s\tremaining: 9.1s\n",
|
|
"571:\tlearn: 0.1503767\ttest: 0.2808104\tbest: 0.2808104 (571)\ttotal: 12.1s\tremaining: 9.08s\n",
|
|
"572:\tlearn: 0.1496669\ttest: 0.2808488\tbest: 0.2808104 (571)\ttotal: 12.2s\tremaining: 9.06s\n",
|
|
"573:\tlearn: 0.1495191\ttest: 0.2806812\tbest: 0.2806812 (573)\ttotal: 12.2s\tremaining: 9.07s\n",
|
|
"574:\tlearn: 0.1486854\ttest: 0.2815728\tbest: 0.2806812 (573)\ttotal: 12.3s\tremaining: 9.07s\n",
|
|
"575:\tlearn: 0.1483141\ttest: 0.2817602\tbest: 0.2806812 (573)\ttotal: 12.3s\tremaining: 9.05s\n",
|
|
"576:\tlearn: 0.1481992\ttest: 0.2818175\tbest: 0.2806812 (573)\ttotal: 12.3s\tremaining: 9.03s\n",
|
|
"577:\tlearn: 0.1479820\ttest: 0.2813721\tbest: 0.2806812 (573)\ttotal: 12.3s\tremaining: 9.01s\n",
|
|
"578:\tlearn: 0.1475656\ttest: 0.2822437\tbest: 0.2806812 (573)\ttotal: 12.4s\tremaining: 8.99s\n",
|
|
"579:\tlearn: 0.1474956\ttest: 0.2823558\tbest: 0.2806812 (573)\ttotal: 12.4s\tremaining: 8.96s\n",
|
|
"580:\tlearn: 0.1474603\ttest: 0.2824934\tbest: 0.2806812 (573)\ttotal: 12.4s\tremaining: 8.94s\n",
|
|
"581:\tlearn: 0.1472997\ttest: 0.2824691\tbest: 0.2806812 (573)\ttotal: 12.4s\tremaining: 8.92s\n",
|
|
"582:\tlearn: 0.1472359\ttest: 0.2821969\tbest: 0.2806812 (573)\ttotal: 12.4s\tremaining: 8.9s\n",
|
|
"583:\tlearn: 0.1469297\ttest: 0.2831955\tbest: 0.2806812 (573)\ttotal: 12.5s\tremaining: 8.88s\n",
|
|
"584:\tlearn: 0.1466677\ttest: 0.2823439\tbest: 0.2806812 (573)\ttotal: 12.5s\tremaining: 8.86s\n",
|
|
"585:\tlearn: 0.1460587\ttest: 0.2824957\tbest: 0.2806812 (573)\ttotal: 12.5s\tremaining: 8.84s\n",
|
|
"586:\tlearn: 0.1459576\ttest: 0.2830768\tbest: 0.2806812 (573)\ttotal: 12.5s\tremaining: 8.82s\n",
|
|
"587:\tlearn: 0.1458134\ttest: 0.2835484\tbest: 0.2806812 (573)\ttotal: 12.6s\tremaining: 8.8s\n",
|
|
"588:\tlearn: 0.1452648\ttest: 0.2846965\tbest: 0.2806812 (573)\ttotal: 12.6s\tremaining: 8.77s\n",
|
|
"589:\tlearn: 0.1452531\ttest: 0.2846918\tbest: 0.2806812 (573)\ttotal: 12.6s\tremaining: 8.75s\n",
|
|
"590:\tlearn: 0.1449912\ttest: 0.2849444\tbest: 0.2806812 (573)\ttotal: 12.6s\tremaining: 8.73s\n",
|
|
"591:\tlearn: 0.1446963\ttest: 0.2858436\tbest: 0.2806812 (573)\ttotal: 12.6s\tremaining: 8.71s\n",
|
|
"592:\tlearn: 0.1443996\ttest: 0.2853027\tbest: 0.2806812 (573)\ttotal: 12.7s\tremaining: 8.69s\n",
|
|
"593:\tlearn: 0.1442313\ttest: 0.2850587\tbest: 0.2806812 (573)\ttotal: 12.7s\tremaining: 8.67s\n",
|
|
"594:\tlearn: 0.1441964\ttest: 0.2850163\tbest: 0.2806812 (573)\ttotal: 12.7s\tremaining: 8.65s\n",
|
|
"595:\tlearn: 0.1440101\ttest: 0.2845832\tbest: 0.2806812 (573)\ttotal: 12.7s\tremaining: 8.63s\n",
|
|
"596:\tlearn: 0.1438194\ttest: 0.2849871\tbest: 0.2806812 (573)\ttotal: 12.7s\tremaining: 8.61s\n",
|
|
"597:\tlearn: 0.1435601\ttest: 0.2849355\tbest: 0.2806812 (573)\ttotal: 12.8s\tremaining: 8.59s\n",
|
|
"598:\tlearn: 0.1434635\ttest: 0.2840746\tbest: 0.2806812 (573)\ttotal: 12.8s\tremaining: 8.56s\n",
|
|
"599:\tlearn: 0.1433428\ttest: 0.2861313\tbest: 0.2806812 (573)\ttotal: 12.8s\tremaining: 8.54s\n",
|
|
"600:\tlearn: 0.1428359\ttest: 0.2873873\tbest: 0.2806812 (573)\ttotal: 12.8s\tremaining: 8.52s\n",
|
|
"601:\tlearn: 0.1425856\ttest: 0.2874799\tbest: 0.2806812 (573)\ttotal: 12.9s\tremaining: 8.5s\n",
|
|
"602:\tlearn: 0.1415654\ttest: 0.2874788\tbest: 0.2806812 (573)\ttotal: 12.9s\tremaining: 8.48s\n",
|
|
"603:\tlearn: 0.1414132\ttest: 0.2881090\tbest: 0.2806812 (573)\ttotal: 12.9s\tremaining: 8.46s\n",
|
|
"604:\tlearn: 0.1413669\ttest: 0.2871250\tbest: 0.2806812 (573)\ttotal: 12.9s\tremaining: 8.44s\n",
|
|
"605:\tlearn: 0.1412936\ttest: 0.2872638\tbest: 0.2806812 (573)\ttotal: 13s\tremaining: 8.42s\n",
|
|
"606:\tlearn: 0.1412468\ttest: 0.2877821\tbest: 0.2806812 (573)\ttotal: 13s\tremaining: 8.4s\n",
|
|
"607:\tlearn: 0.1408715\ttest: 0.2873229\tbest: 0.2806812 (573)\ttotal: 13s\tremaining: 8.38s\n",
|
|
"608:\tlearn: 0.1407511\ttest: 0.2879901\tbest: 0.2806812 (573)\ttotal: 13s\tremaining: 8.36s\n",
|
|
"609:\tlearn: 0.1406428\ttest: 0.2871903\tbest: 0.2806812 (573)\ttotal: 13s\tremaining: 8.34s\n",
|
|
"610:\tlearn: 0.1403738\ttest: 0.2879874\tbest: 0.2806812 (573)\ttotal: 13.1s\tremaining: 8.31s\n",
|
|
"611:\tlearn: 0.1403311\ttest: 0.2877846\tbest: 0.2806812 (573)\ttotal: 13.1s\tremaining: 8.29s\n",
|
|
"612:\tlearn: 0.1402234\ttest: 0.2879419\tbest: 0.2806812 (573)\ttotal: 13.1s\tremaining: 8.27s\n",
|
|
"613:\tlearn: 0.1401833\ttest: 0.2879248\tbest: 0.2806812 (573)\ttotal: 13.1s\tremaining: 8.25s\n",
|
|
"614:\tlearn: 0.1401154\ttest: 0.2882780\tbest: 0.2806812 (573)\ttotal: 13.2s\tremaining: 8.23s\n",
|
|
"615:\tlearn: 0.1398939\ttest: 0.2880998\tbest: 0.2806812 (573)\ttotal: 13.2s\tremaining: 8.21s\n",
|
|
"616:\tlearn: 0.1392726\ttest: 0.2883773\tbest: 0.2806812 (573)\ttotal: 13.2s\tremaining: 8.19s\n",
|
|
"617:\tlearn: 0.1389314\ttest: 0.2882011\tbest: 0.2806812 (573)\ttotal: 13.3s\tremaining: 8.2s\n",
|
|
"618:\tlearn: 0.1385600\ttest: 0.2878916\tbest: 0.2806812 (573)\ttotal: 13.3s\tremaining: 8.2s\n",
|
|
"619:\tlearn: 0.1382956\ttest: 0.2874203\tbest: 0.2806812 (573)\ttotal: 13.3s\tremaining: 8.18s\n",
|
|
"620:\tlearn: 0.1382201\ttest: 0.2875948\tbest: 0.2806812 (573)\ttotal: 13.4s\tremaining: 8.16s\n",
|
|
"621:\tlearn: 0.1381136\ttest: 0.2877051\tbest: 0.2806812 (573)\ttotal: 13.4s\tremaining: 8.14s\n",
|
|
"622:\tlearn: 0.1378391\ttest: 0.2873855\tbest: 0.2806812 (573)\ttotal: 13.4s\tremaining: 8.12s\n",
|
|
"623:\tlearn: 0.1374452\ttest: 0.2870003\tbest: 0.2806812 (573)\ttotal: 13.4s\tremaining: 8.1s\n",
|
|
"624:\tlearn: 0.1373362\ttest: 0.2868271\tbest: 0.2806812 (573)\ttotal: 13.5s\tremaining: 8.07s\n",
|
|
"625:\tlearn: 0.1372119\ttest: 0.2862907\tbest: 0.2806812 (573)\ttotal: 13.5s\tremaining: 8.05s\n",
|
|
"626:\tlearn: 0.1371351\ttest: 0.2860946\tbest: 0.2806812 (573)\ttotal: 13.5s\tremaining: 8.03s\n",
|
|
"627:\tlearn: 0.1367724\ttest: 0.2862564\tbest: 0.2806812 (573)\ttotal: 13.5s\tremaining: 8.01s\n",
|
|
"628:\tlearn: 0.1366343\ttest: 0.2856616\tbest: 0.2806812 (573)\ttotal: 13.6s\tremaining: 7.99s\n",
|
|
"629:\tlearn: 0.1365936\ttest: 0.2859243\tbest: 0.2806812 (573)\ttotal: 13.6s\tremaining: 7.97s\n",
|
|
"630:\tlearn: 0.1365235\ttest: 0.2860263\tbest: 0.2806812 (573)\ttotal: 13.6s\tremaining: 7.95s\n",
|
|
"631:\tlearn: 0.1361912\ttest: 0.2857115\tbest: 0.2806812 (573)\ttotal: 13.6s\tremaining: 7.93s\n",
|
|
"632:\tlearn: 0.1360871\ttest: 0.2857001\tbest: 0.2806812 (573)\ttotal: 13.6s\tremaining: 7.91s\n",
|
|
"633:\tlearn: 0.1350098\ttest: 0.2860572\tbest: 0.2806812 (573)\ttotal: 13.7s\tremaining: 7.89s\n",
|
|
"634:\tlearn: 0.1349244\ttest: 0.2862129\tbest: 0.2806812 (573)\ttotal: 13.7s\tremaining: 7.87s\n",
|
|
"635:\tlearn: 0.1345205\ttest: 0.2862943\tbest: 0.2806812 (573)\ttotal: 13.7s\tremaining: 7.84s\n",
|
|
"636:\tlearn: 0.1342660\ttest: 0.2851979\tbest: 0.2806812 (573)\ttotal: 13.7s\tremaining: 7.82s\n",
|
|
"637:\tlearn: 0.1337419\ttest: 0.2849196\tbest: 0.2806812 (573)\ttotal: 13.8s\tremaining: 7.8s\n",
|
|
"638:\tlearn: 0.1337147\ttest: 0.2848726\tbest: 0.2806812 (573)\ttotal: 13.8s\tremaining: 7.78s\n",
|
|
"639:\tlearn: 0.1334909\ttest: 0.2840445\tbest: 0.2806812 (573)\ttotal: 13.8s\tremaining: 7.76s\n",
|
|
"640:\tlearn: 0.1332553\ttest: 0.2840946\tbest: 0.2806812 (573)\ttotal: 13.8s\tremaining: 7.74s\n",
|
|
"641:\tlearn: 0.1331198\ttest: 0.2840136\tbest: 0.2806812 (573)\ttotal: 13.8s\tremaining: 7.72s\n",
|
|
"642:\tlearn: 0.1328778\ttest: 0.2833652\tbest: 0.2806812 (573)\ttotal: 13.9s\tremaining: 7.7s\n",
|
|
"643:\tlearn: 0.1324288\ttest: 0.2834467\tbest: 0.2806812 (573)\ttotal: 13.9s\tremaining: 7.67s\n",
|
|
"644:\tlearn: 0.1324003\ttest: 0.2833375\tbest: 0.2806812 (573)\ttotal: 13.9s\tremaining: 7.65s\n",
|
|
"645:\tlearn: 0.1321503\ttest: 0.2829709\tbest: 0.2806812 (573)\ttotal: 13.9s\tremaining: 7.63s\n",
|
|
"646:\tlearn: 0.1319203\ttest: 0.2826962\tbest: 0.2806812 (573)\ttotal: 14s\tremaining: 7.62s\n",
|
|
"647:\tlearn: 0.1317628\ttest: 0.2838776\tbest: 0.2806812 (573)\ttotal: 14s\tremaining: 7.6s\n",
|
|
"648:\tlearn: 0.1317155\ttest: 0.2835930\tbest: 0.2806812 (573)\ttotal: 14s\tremaining: 7.58s\n",
|
|
"649:\tlearn: 0.1315552\ttest: 0.2830417\tbest: 0.2806812 (573)\ttotal: 14s\tremaining: 7.55s\n",
|
|
"650:\tlearn: 0.1315255\ttest: 0.2829078\tbest: 0.2806812 (573)\ttotal: 14.1s\tremaining: 7.53s\n",
|
|
"651:\tlearn: 0.1309392\ttest: 0.2829434\tbest: 0.2806812 (573)\ttotal: 14.1s\tremaining: 7.51s\n",
|
|
"652:\tlearn: 0.1305326\ttest: 0.2824802\tbest: 0.2806812 (573)\ttotal: 14.1s\tremaining: 7.49s\n",
|
|
"653:\tlearn: 0.1304290\ttest: 0.2822197\tbest: 0.2806812 (573)\ttotal: 14.1s\tremaining: 7.47s\n",
|
|
"654:\tlearn: 0.1304121\ttest: 0.2821294\tbest: 0.2806812 (573)\ttotal: 14.1s\tremaining: 7.45s\n",
|
|
"655:\tlearn: 0.1300468\ttest: 0.2814110\tbest: 0.2806812 (573)\ttotal: 14.2s\tremaining: 7.43s\n",
|
|
"656:\tlearn: 0.1298972\ttest: 0.2814251\tbest: 0.2806812 (573)\ttotal: 14.2s\tremaining: 7.41s\n",
|
|
"657:\tlearn: 0.1297073\ttest: 0.2815169\tbest: 0.2806812 (573)\ttotal: 14.2s\tremaining: 7.38s\n",
|
|
"658:\tlearn: 0.1289022\ttest: 0.2807405\tbest: 0.2806812 (573)\ttotal: 14.2s\tremaining: 7.36s\n",
|
|
"659:\tlearn: 0.1284172\ttest: 0.2809782\tbest: 0.2806812 (573)\ttotal: 14.3s\tremaining: 7.35s\n",
|
|
"660:\tlearn: 0.1282319\ttest: 0.2808458\tbest: 0.2806812 (573)\ttotal: 14.3s\tremaining: 7.35s\n",
|
|
"661:\tlearn: 0.1277479\ttest: 0.2811307\tbest: 0.2806812 (573)\ttotal: 14.3s\tremaining: 7.33s\n",
|
|
"662:\tlearn: 0.1274967\ttest: 0.2820323\tbest: 0.2806812 (573)\ttotal: 14.4s\tremaining: 7.3s\n",
|
|
"663:\tlearn: 0.1273915\ttest: 0.2821214\tbest: 0.2806812 (573)\ttotal: 14.4s\tremaining: 7.28s\n",
|
|
"664:\tlearn: 0.1272578\ttest: 0.2815455\tbest: 0.2806812 (573)\ttotal: 14.4s\tremaining: 7.26s\n",
|
|
"665:\tlearn: 0.1271242\ttest: 0.2815776\tbest: 0.2806812 (573)\ttotal: 14.4s\tremaining: 7.24s\n",
|
|
"666:\tlearn: 0.1267200\ttest: 0.2808607\tbest: 0.2806812 (573)\ttotal: 14.5s\tremaining: 7.22s\n",
|
|
"667:\tlearn: 0.1264347\ttest: 0.2814221\tbest: 0.2806812 (573)\ttotal: 14.5s\tremaining: 7.2s\n",
|
|
"668:\tlearn: 0.1262978\ttest: 0.2813043\tbest: 0.2806812 (573)\ttotal: 14.5s\tremaining: 7.18s\n",
|
|
"669:\tlearn: 0.1261799\ttest: 0.2819912\tbest: 0.2806812 (573)\ttotal: 14.5s\tremaining: 7.16s\n",
|
|
"670:\tlearn: 0.1253382\ttest: 0.2817529\tbest: 0.2806812 (573)\ttotal: 14.6s\tremaining: 7.13s\n",
|
|
"671:\tlearn: 0.1250924\ttest: 0.2821332\tbest: 0.2806812 (573)\ttotal: 14.6s\tremaining: 7.11s\n",
|
|
"672:\tlearn: 0.1246360\ttest: 0.2817957\tbest: 0.2806812 (573)\ttotal: 14.6s\tremaining: 7.09s\n",
|
|
"673:\tlearn: 0.1246109\ttest: 0.2818156\tbest: 0.2806812 (573)\ttotal: 14.6s\tremaining: 7.07s\n",
|
|
"674:\tlearn: 0.1244984\ttest: 0.2810855\tbest: 0.2806812 (573)\ttotal: 14.6s\tremaining: 7.05s\n",
|
|
"675:\tlearn: 0.1242267\ttest: 0.2815444\tbest: 0.2806812 (573)\ttotal: 14.7s\tremaining: 7.03s\n",
|
|
"676:\tlearn: 0.1240879\ttest: 0.2807290\tbest: 0.2806812 (573)\ttotal: 14.7s\tremaining: 7.01s\n",
|
|
"677:\tlearn: 0.1240063\ttest: 0.2808877\tbest: 0.2806812 (573)\ttotal: 14.7s\tremaining: 6.98s\n",
|
|
"678:\tlearn: 0.1236519\ttest: 0.2805222\tbest: 0.2805222 (678)\ttotal: 14.7s\tremaining: 6.96s\n",
|
|
"679:\tlearn: 0.1234585\ttest: 0.2814221\tbest: 0.2805222 (678)\ttotal: 14.8s\tremaining: 6.94s\n",
|
|
"680:\tlearn: 0.1231779\ttest: 0.2813922\tbest: 0.2805222 (678)\ttotal: 14.8s\tremaining: 6.92s\n",
|
|
"681:\tlearn: 0.1229748\ttest: 0.2813832\tbest: 0.2805222 (678)\ttotal: 14.8s\tremaining: 6.9s\n",
|
|
"682:\tlearn: 0.1229236\ttest: 0.2811342\tbest: 0.2805222 (678)\ttotal: 14.8s\tremaining: 6.88s\n",
|
|
"683:\tlearn: 0.1225337\ttest: 0.2805623\tbest: 0.2805222 (678)\ttotal: 14.8s\tremaining: 6.85s\n",
|
|
"684:\tlearn: 0.1224669\ttest: 0.2802340\tbest: 0.2802340 (684)\ttotal: 14.9s\tremaining: 6.83s\n",
|
|
"685:\tlearn: 0.1222389\ttest: 0.2801958\tbest: 0.2801958 (685)\ttotal: 14.9s\tremaining: 6.81s\n",
|
|
"686:\tlearn: 0.1221878\ttest: 0.2798049\tbest: 0.2798049 (686)\ttotal: 14.9s\tremaining: 6.79s\n",
|
|
"687:\tlearn: 0.1217585\ttest: 0.2808659\tbest: 0.2798049 (686)\ttotal: 14.9s\tremaining: 6.77s\n",
|
|
"688:\tlearn: 0.1216207\ttest: 0.2812696\tbest: 0.2798049 (686)\ttotal: 15s\tremaining: 6.75s\n",
|
|
"689:\tlearn: 0.1210648\ttest: 0.2804114\tbest: 0.2798049 (686)\ttotal: 15s\tremaining: 6.73s\n",
|
|
"690:\tlearn: 0.1209180\ttest: 0.2804638\tbest: 0.2798049 (686)\ttotal: 15s\tremaining: 6.71s\n",
|
|
"691:\tlearn: 0.1205017\ttest: 0.2805082\tbest: 0.2798049 (686)\ttotal: 15s\tremaining: 6.69s\n",
|
|
"692:\tlearn: 0.1202746\ttest: 0.2805975\tbest: 0.2798049 (686)\ttotal: 15s\tremaining: 6.66s\n",
|
|
"693:\tlearn: 0.1201810\ttest: 0.2807034\tbest: 0.2798049 (686)\ttotal: 15.1s\tremaining: 6.64s\n",
|
|
"694:\tlearn: 0.1196769\ttest: 0.2808033\tbest: 0.2798049 (686)\ttotal: 15.1s\tremaining: 6.62s\n",
|
|
"695:\tlearn: 0.1192631\ttest: 0.2793224\tbest: 0.2793224 (695)\ttotal: 15.1s\tremaining: 6.6s\n",
|
|
"696:\tlearn: 0.1191686\ttest: 0.2761752\tbest: 0.2761752 (696)\ttotal: 15.1s\tremaining: 6.58s\n",
|
|
"697:\tlearn: 0.1190438\ttest: 0.2761422\tbest: 0.2761422 (697)\ttotal: 15.1s\tremaining: 6.55s\n",
|
|
"698:\tlearn: 0.1186788\ttest: 0.2754613\tbest: 0.2754613 (698)\ttotal: 15.2s\tremaining: 6.54s\n",
|
|
"699:\tlearn: 0.1184071\ttest: 0.2761287\tbest: 0.2754613 (698)\ttotal: 15.2s\tremaining: 6.51s\n",
|
|
"700:\tlearn: 0.1183638\ttest: 0.2760427\tbest: 0.2754613 (698)\ttotal: 15.2s\tremaining: 6.49s\n",
|
|
"701:\tlearn: 0.1183501\ttest: 0.2760485\tbest: 0.2754613 (698)\ttotal: 15.2s\tremaining: 6.47s\n",
|
|
"702:\tlearn: 0.1180845\ttest: 0.2775426\tbest: 0.2754613 (698)\ttotal: 15.3s\tremaining: 6.46s\n",
|
|
"703:\tlearn: 0.1180499\ttest: 0.2772670\tbest: 0.2754613 (698)\ttotal: 15.4s\tremaining: 6.46s\n",
|
|
"704:\tlearn: 0.1178839\ttest: 0.2771804\tbest: 0.2754613 (698)\ttotal: 15.4s\tremaining: 6.43s\n",
|
|
"705:\tlearn: 0.1175498\ttest: 0.2785310\tbest: 0.2754613 (698)\ttotal: 15.4s\tremaining: 6.41s\n",
|
|
"706:\tlearn: 0.1173508\ttest: 0.2782280\tbest: 0.2754613 (698)\ttotal: 15.4s\tremaining: 6.39s\n",
|
|
"707:\tlearn: 0.1172898\ttest: 0.2782338\tbest: 0.2754613 (698)\ttotal: 15.4s\tremaining: 6.37s\n",
|
|
"708:\tlearn: 0.1170858\ttest: 0.2778374\tbest: 0.2754613 (698)\ttotal: 15.5s\tremaining: 6.35s\n",
|
|
"709:\tlearn: 0.1166632\ttest: 0.2770607\tbest: 0.2754613 (698)\ttotal: 15.5s\tremaining: 6.33s\n",
|
|
"710:\tlearn: 0.1163063\ttest: 0.2772659\tbest: 0.2754613 (698)\ttotal: 15.5s\tremaining: 6.3s\n",
|
|
"711:\tlearn: 0.1160587\ttest: 0.2765086\tbest: 0.2754613 (698)\ttotal: 15.5s\tremaining: 6.28s\n",
|
|
"712:\tlearn: 0.1157655\ttest: 0.2764026\tbest: 0.2754613 (698)\ttotal: 15.6s\tremaining: 6.26s\n",
|
|
"713:\tlearn: 0.1157144\ttest: 0.2763732\tbest: 0.2754613 (698)\ttotal: 15.6s\tremaining: 6.24s\n",
|
|
"714:\tlearn: 0.1156970\ttest: 0.2763059\tbest: 0.2754613 (698)\ttotal: 15.6s\tremaining: 6.22s\n",
|
|
"715:\tlearn: 0.1156287\ttest: 0.2761166\tbest: 0.2754613 (698)\ttotal: 15.6s\tremaining: 6.2s\n",
|
|
"716:\tlearn: 0.1153741\ttest: 0.2760382\tbest: 0.2754613 (698)\ttotal: 15.6s\tremaining: 6.17s\n",
|
|
"717:\tlearn: 0.1152103\ttest: 0.2746504\tbest: 0.2746504 (717)\ttotal: 15.7s\tremaining: 6.15s\n",
|
|
"718:\tlearn: 0.1149937\ttest: 0.2745630\tbest: 0.2745630 (718)\ttotal: 15.7s\tremaining: 6.13s\n",
|
|
"719:\tlearn: 0.1148356\ttest: 0.2735981\tbest: 0.2735981 (719)\ttotal: 15.7s\tremaining: 6.11s\n",
|
|
"720:\tlearn: 0.1145561\ttest: 0.2729159\tbest: 0.2729159 (720)\ttotal: 15.7s\tremaining: 6.09s\n",
|
|
"721:\tlearn: 0.1144272\ttest: 0.2728484\tbest: 0.2728484 (721)\ttotal: 15.8s\tremaining: 6.06s\n",
|
|
"722:\tlearn: 0.1143145\ttest: 0.2729657\tbest: 0.2728484 (721)\ttotal: 15.8s\tremaining: 6.04s\n",
|
|
"723:\tlearn: 0.1142844\ttest: 0.2727581\tbest: 0.2727581 (723)\ttotal: 15.8s\tremaining: 6.02s\n",
|
|
"724:\tlearn: 0.1138793\ttest: 0.2731852\tbest: 0.2727581 (723)\ttotal: 15.8s\tremaining: 6s\n",
|
|
"725:\tlearn: 0.1138466\ttest: 0.2729223\tbest: 0.2727581 (723)\ttotal: 15.8s\tremaining: 5.98s\n",
|
|
"726:\tlearn: 0.1136885\ttest: 0.2735308\tbest: 0.2727581 (723)\ttotal: 15.9s\tremaining: 5.96s\n",
|
|
"727:\tlearn: 0.1131881\ttest: 0.2726868\tbest: 0.2726868 (727)\ttotal: 15.9s\tremaining: 5.94s\n",
|
|
"728:\tlearn: 0.1129532\ttest: 0.2740367\tbest: 0.2726868 (727)\ttotal: 15.9s\tremaining: 5.92s\n",
|
|
"729:\tlearn: 0.1128431\ttest: 0.2742250\tbest: 0.2726868 (727)\ttotal: 15.9s\tremaining: 5.9s\n",
|
|
"730:\tlearn: 0.1126987\ttest: 0.2743908\tbest: 0.2726868 (727)\ttotal: 16s\tremaining: 5.88s\n",
|
|
"731:\tlearn: 0.1124354\ttest: 0.2720858\tbest: 0.2720858 (731)\ttotal: 16s\tremaining: 5.85s\n",
|
|
"732:\tlearn: 0.1122022\ttest: 0.2720399\tbest: 0.2720399 (732)\ttotal: 16s\tremaining: 5.83s\n",
|
|
"733:\tlearn: 0.1119748\ttest: 0.2706192\tbest: 0.2706192 (733)\ttotal: 16s\tremaining: 5.81s\n",
|
|
"734:\tlearn: 0.1117899\ttest: 0.2701800\tbest: 0.2701800 (734)\ttotal: 16.1s\tremaining: 5.79s\n",
|
|
"735:\tlearn: 0.1115701\ttest: 0.2694458\tbest: 0.2694458 (735)\ttotal: 16.1s\tremaining: 5.77s\n",
|
|
"736:\tlearn: 0.1112696\ttest: 0.2697448\tbest: 0.2694458 (735)\ttotal: 16.1s\tremaining: 5.74s\n",
|
|
"737:\tlearn: 0.1109293\ttest: 0.2695337\tbest: 0.2694458 (735)\ttotal: 16.1s\tremaining: 5.72s\n",
|
|
"738:\tlearn: 0.1109196\ttest: 0.2695719\tbest: 0.2694458 (735)\ttotal: 16.1s\tremaining: 5.7s\n",
|
|
"739:\tlearn: 0.1107321\ttest: 0.2699773\tbest: 0.2694458 (735)\ttotal: 16.2s\tremaining: 5.68s\n",
|
|
"740:\tlearn: 0.1106023\ttest: 0.2700895\tbest: 0.2694458 (735)\ttotal: 16.2s\tremaining: 5.66s\n",
|
|
"741:\tlearn: 0.1103093\ttest: 0.2712104\tbest: 0.2694458 (735)\ttotal: 16.2s\tremaining: 5.63s\n",
|
|
"742:\tlearn: 0.1096168\ttest: 0.2718912\tbest: 0.2694458 (735)\ttotal: 16.2s\tremaining: 5.61s\n",
|
|
"743:\tlearn: 0.1092973\ttest: 0.2708935\tbest: 0.2694458 (735)\ttotal: 16.3s\tremaining: 5.59s\n",
|
|
"744:\tlearn: 0.1091956\ttest: 0.2706985\tbest: 0.2694458 (735)\ttotal: 16.3s\tremaining: 5.57s\n",
|
|
"745:\tlearn: 0.1091548\ttest: 0.2708298\tbest: 0.2694458 (735)\ttotal: 16.3s\tremaining: 5.56s\n",
|
|
"746:\tlearn: 0.1089617\ttest: 0.2707554\tbest: 0.2694458 (735)\ttotal: 16.4s\tremaining: 5.55s\n",
|
|
"747:\tlearn: 0.1083028\ttest: 0.2719350\tbest: 0.2694458 (735)\ttotal: 16.4s\tremaining: 5.53s\n",
|
|
"748:\tlearn: 0.1081697\ttest: 0.2717127\tbest: 0.2694458 (735)\ttotal: 16.4s\tremaining: 5.51s\n",
|
|
"749:\tlearn: 0.1079554\ttest: 0.2711939\tbest: 0.2694458 (735)\ttotal: 16.5s\tremaining: 5.49s\n",
|
|
"750:\tlearn: 0.1078186\ttest: 0.2707665\tbest: 0.2694458 (735)\ttotal: 16.5s\tremaining: 5.47s\n",
|
|
"751:\tlearn: 0.1076519\ttest: 0.2707372\tbest: 0.2694458 (735)\ttotal: 16.5s\tremaining: 5.45s\n",
|
|
"752:\tlearn: 0.1072799\ttest: 0.2713386\tbest: 0.2694458 (735)\ttotal: 16.5s\tremaining: 5.42s\n",
|
|
"753:\tlearn: 0.1072584\ttest: 0.2713345\tbest: 0.2694458 (735)\ttotal: 16.6s\tremaining: 5.4s\n",
|
|
"754:\tlearn: 0.1072085\ttest: 0.2714828\tbest: 0.2694458 (735)\ttotal: 16.6s\tremaining: 5.38s\n",
|
|
"755:\tlearn: 0.1071036\ttest: 0.2712742\tbest: 0.2694458 (735)\ttotal: 16.6s\tremaining: 5.36s\n",
|
|
"756:\tlearn: 0.1066578\ttest: 0.2720785\tbest: 0.2694458 (735)\ttotal: 16.6s\tremaining: 5.33s\n",
|
|
"757:\tlearn: 0.1065993\ttest: 0.2710822\tbest: 0.2694458 (735)\ttotal: 16.6s\tremaining: 5.31s\n",
|
|
"758:\tlearn: 0.1065135\ttest: 0.2719703\tbest: 0.2694458 (735)\ttotal: 16.7s\tremaining: 5.29s\n",
|
|
"759:\tlearn: 0.1064799\ttest: 0.2719211\tbest: 0.2694458 (735)\ttotal: 16.7s\tremaining: 5.27s\n",
|
|
"760:\tlearn: 0.1064018\ttest: 0.2719147\tbest: 0.2694458 (735)\ttotal: 16.7s\tremaining: 5.25s\n",
|
|
"761:\tlearn: 0.1061628\ttest: 0.2713726\tbest: 0.2694458 (735)\ttotal: 16.7s\tremaining: 5.23s\n",
|
|
"762:\tlearn: 0.1060719\ttest: 0.2713321\tbest: 0.2694458 (735)\ttotal: 16.8s\tremaining: 5.2s\n",
|
|
"763:\tlearn: 0.1060187\ttest: 0.2717186\tbest: 0.2694458 (735)\ttotal: 16.8s\tremaining: 5.18s\n",
|
|
"764:\tlearn: 0.1059539\ttest: 0.2716847\tbest: 0.2694458 (735)\ttotal: 16.8s\tremaining: 5.16s\n",
|
|
"765:\tlearn: 0.1057300\ttest: 0.2720677\tbest: 0.2694458 (735)\ttotal: 16.8s\tremaining: 5.14s\n",
|
|
"766:\tlearn: 0.1056642\ttest: 0.2710966\tbest: 0.2694458 (735)\ttotal: 16.8s\tremaining: 5.12s\n",
|
|
"767:\tlearn: 0.1054105\ttest: 0.2722441\tbest: 0.2694458 (735)\ttotal: 16.9s\tremaining: 5.09s\n",
|
|
"768:\tlearn: 0.1052243\ttest: 0.2722576\tbest: 0.2694458 (735)\ttotal: 16.9s\tremaining: 5.07s\n",
|
|
"769:\tlearn: 0.1051340\ttest: 0.2726182\tbest: 0.2694458 (735)\ttotal: 16.9s\tremaining: 5.05s\n",
|
|
"770:\tlearn: 0.1050611\ttest: 0.2727449\tbest: 0.2694458 (735)\ttotal: 16.9s\tremaining: 5.03s\n",
|
|
"771:\tlearn: 0.1044997\ttest: 0.2715228\tbest: 0.2694458 (735)\ttotal: 17s\tremaining: 5.01s\n",
|
|
"772:\tlearn: 0.1042161\ttest: 0.2705450\tbest: 0.2694458 (735)\ttotal: 17s\tremaining: 4.99s\n",
|
|
"773:\tlearn: 0.1041601\ttest: 0.2702770\tbest: 0.2694458 (735)\ttotal: 17s\tremaining: 4.96s\n",
|
|
"774:\tlearn: 0.1039238\ttest: 0.2695830\tbest: 0.2694458 (735)\ttotal: 17s\tremaining: 4.94s\n",
|
|
"775:\tlearn: 0.1037425\ttest: 0.2695678\tbest: 0.2694458 (735)\ttotal: 17.1s\tremaining: 4.92s\n",
|
|
"776:\tlearn: 0.1036163\ttest: 0.2692852\tbest: 0.2692852 (776)\ttotal: 17.1s\tremaining: 4.9s\n",
|
|
"777:\tlearn: 0.1035567\ttest: 0.2698608\tbest: 0.2692852 (776)\ttotal: 17.1s\tremaining: 4.88s\n",
|
|
"778:\tlearn: 0.1035390\ttest: 0.2699929\tbest: 0.2692852 (776)\ttotal: 17.1s\tremaining: 4.86s\n",
|
|
"779:\tlearn: 0.1033697\ttest: 0.2716703\tbest: 0.2692852 (776)\ttotal: 17.1s\tremaining: 4.83s\n",
|
|
"780:\tlearn: 0.1030968\ttest: 0.2732172\tbest: 0.2692852 (776)\ttotal: 17.2s\tremaining: 4.81s\n",
|
|
"781:\tlearn: 0.1023914\ttest: 0.2733604\tbest: 0.2692852 (776)\ttotal: 17.2s\tremaining: 4.79s\n",
|
|
"782:\tlearn: 0.1020134\ttest: 0.2725902\tbest: 0.2692852 (776)\ttotal: 17.2s\tremaining: 4.77s\n",
|
|
"783:\tlearn: 0.1018354\ttest: 0.2723892\tbest: 0.2692852 (776)\ttotal: 17.2s\tremaining: 4.75s\n",
|
|
"784:\tlearn: 0.1016092\ttest: 0.2720085\tbest: 0.2692852 (776)\ttotal: 17.2s\tremaining: 4.72s\n",
|
|
"785:\tlearn: 0.1012240\ttest: 0.2716995\tbest: 0.2692852 (776)\ttotal: 17.3s\tremaining: 4.7s\n",
|
|
"786:\tlearn: 0.1011580\ttest: 0.2728895\tbest: 0.2692852 (776)\ttotal: 17.3s\tremaining: 4.68s\n",
|
|
"787:\tlearn: 0.1011488\ttest: 0.2727924\tbest: 0.2692852 (776)\ttotal: 17.3s\tremaining: 4.66s\n",
|
|
"788:\tlearn: 0.1010809\ttest: 0.2732696\tbest: 0.2692852 (776)\ttotal: 17.4s\tremaining: 4.65s\n",
|
|
"789:\tlearn: 0.1010199\ttest: 0.2733771\tbest: 0.2692852 (776)\ttotal: 17.4s\tremaining: 4.63s\n",
|
|
"790:\tlearn: 0.1007398\ttest: 0.2744358\tbest: 0.2692852 (776)\ttotal: 17.4s\tremaining: 4.61s\n",
|
|
"791:\tlearn: 0.1006025\ttest: 0.2745200\tbest: 0.2692852 (776)\ttotal: 17.5s\tremaining: 4.59s\n",
|
|
"792:\tlearn: 0.1005274\ttest: 0.2751661\tbest: 0.2692852 (776)\ttotal: 17.5s\tremaining: 4.57s\n",
|
|
"793:\tlearn: 0.1001650\ttest: 0.2730640\tbest: 0.2692852 (776)\ttotal: 17.5s\tremaining: 4.54s\n",
|
|
"794:\tlearn: 0.1000786\ttest: 0.2729167\tbest: 0.2692852 (776)\ttotal: 17.5s\tremaining: 4.52s\n",
|
|
"795:\tlearn: 0.0998121\ttest: 0.2729117\tbest: 0.2692852 (776)\ttotal: 17.6s\tremaining: 4.5s\n",
|
|
"796:\tlearn: 0.0997787\ttest: 0.2727505\tbest: 0.2692852 (776)\ttotal: 17.6s\tremaining: 4.48s\n",
|
|
"797:\tlearn: 0.0996585\ttest: 0.2724065\tbest: 0.2692852 (776)\ttotal: 17.6s\tremaining: 4.46s\n",
|
|
"798:\tlearn: 0.0995940\ttest: 0.2722234\tbest: 0.2692852 (776)\ttotal: 17.6s\tremaining: 4.43s\n",
|
|
"799:\tlearn: 0.0995501\ttest: 0.2722712\tbest: 0.2692852 (776)\ttotal: 17.7s\tremaining: 4.41s\n",
|
|
"800:\tlearn: 0.0994340\ttest: 0.2724402\tbest: 0.2692852 (776)\ttotal: 17.7s\tremaining: 4.39s\n",
|
|
"801:\tlearn: 0.0992212\ttest: 0.2728535\tbest: 0.2692852 (776)\ttotal: 17.7s\tremaining: 4.37s\n",
|
|
"802:\tlearn: 0.0990860\ttest: 0.2725671\tbest: 0.2692852 (776)\ttotal: 17.7s\tremaining: 4.35s\n",
|
|
"803:\tlearn: 0.0988971\ttest: 0.2714146\tbest: 0.2692852 (776)\ttotal: 17.8s\tremaining: 4.33s\n",
|
|
"804:\tlearn: 0.0988385\ttest: 0.2713334\tbest: 0.2692852 (776)\ttotal: 17.8s\tremaining: 4.3s\n",
|
|
"805:\tlearn: 0.0986828\ttest: 0.2713183\tbest: 0.2692852 (776)\ttotal: 17.8s\tremaining: 4.28s\n",
|
|
"806:\tlearn: 0.0983731\ttest: 0.2707121\tbest: 0.2692852 (776)\ttotal: 17.8s\tremaining: 4.26s\n",
|
|
"807:\tlearn: 0.0983497\ttest: 0.2706433\tbest: 0.2692852 (776)\ttotal: 17.8s\tremaining: 4.24s\n",
|
|
"808:\tlearn: 0.0982493\ttest: 0.2698351\tbest: 0.2692852 (776)\ttotal: 17.9s\tremaining: 4.22s\n",
|
|
"809:\tlearn: 0.0982241\ttest: 0.2699766\tbest: 0.2692852 (776)\ttotal: 17.9s\tremaining: 4.19s\n",
|
|
"810:\tlearn: 0.0980281\ttest: 0.2703773\tbest: 0.2692852 (776)\ttotal: 17.9s\tremaining: 4.17s\n",
|
|
"811:\tlearn: 0.0978327\ttest: 0.2705353\tbest: 0.2692852 (776)\ttotal: 17.9s\tremaining: 4.15s\n",
|
|
"812:\tlearn: 0.0976485\ttest: 0.2712918\tbest: 0.2692852 (776)\ttotal: 18s\tremaining: 4.13s\n",
|
|
"813:\tlearn: 0.0976265\ttest: 0.2710876\tbest: 0.2692852 (776)\ttotal: 18s\tremaining: 4.11s\n",
|
|
"814:\tlearn: 0.0974136\ttest: 0.2716318\tbest: 0.2692852 (776)\ttotal: 18s\tremaining: 4.09s\n",
|
|
"815:\tlearn: 0.0972917\ttest: 0.2711851\tbest: 0.2692852 (776)\ttotal: 18s\tremaining: 4.06s\n",
|
|
"816:\tlearn: 0.0970636\ttest: 0.2712659\tbest: 0.2692852 (776)\ttotal: 18s\tremaining: 4.04s\n",
|
|
"817:\tlearn: 0.0969784\ttest: 0.2712246\tbest: 0.2692852 (776)\ttotal: 18.1s\tremaining: 4.02s\n",
|
|
"818:\tlearn: 0.0968954\ttest: 0.2712418\tbest: 0.2692852 (776)\ttotal: 18.1s\tremaining: 4s\n",
|
|
"819:\tlearn: 0.0967223\ttest: 0.2711328\tbest: 0.2692852 (776)\ttotal: 18.1s\tremaining: 3.98s\n",
|
|
"820:\tlearn: 0.0964815\ttest: 0.2717895\tbest: 0.2692852 (776)\ttotal: 18.1s\tremaining: 3.95s\n",
|
|
"821:\tlearn: 0.0964299\ttest: 0.2721131\tbest: 0.2692852 (776)\ttotal: 18.2s\tremaining: 3.93s\n",
|
|
"822:\tlearn: 0.0961623\ttest: 0.2721184\tbest: 0.2692852 (776)\ttotal: 18.2s\tremaining: 3.91s\n",
|
|
"823:\tlearn: 0.0959290\ttest: 0.2716488\tbest: 0.2692852 (776)\ttotal: 18.2s\tremaining: 3.89s\n",
|
|
"824:\tlearn: 0.0958181\ttest: 0.2719644\tbest: 0.2692852 (776)\ttotal: 18.2s\tremaining: 3.87s\n",
|
|
"825:\tlearn: 0.0957201\ttest: 0.2717977\tbest: 0.2692852 (776)\ttotal: 18.2s\tremaining: 3.84s\n",
|
|
"826:\tlearn: 0.0956913\ttest: 0.2716665\tbest: 0.2692852 (776)\ttotal: 18.3s\tremaining: 3.82s\n",
|
|
"827:\tlearn: 0.0956645\ttest: 0.2716004\tbest: 0.2692852 (776)\ttotal: 18.3s\tremaining: 3.8s\n",
|
|
"828:\tlearn: 0.0955820\ttest: 0.2713525\tbest: 0.2692852 (776)\ttotal: 18.3s\tremaining: 3.78s\n",
|
|
"829:\tlearn: 0.0955428\ttest: 0.2715511\tbest: 0.2692852 (776)\ttotal: 18.3s\tremaining: 3.75s\n",
|
|
"830:\tlearn: 0.0953223\ttest: 0.2718741\tbest: 0.2692852 (776)\ttotal: 18.4s\tremaining: 3.74s\n",
|
|
"831:\tlearn: 0.0952166\ttest: 0.2716979\tbest: 0.2692852 (776)\ttotal: 18.5s\tremaining: 3.73s\n",
|
|
"832:\tlearn: 0.0947142\ttest: 0.2735401\tbest: 0.2692852 (776)\ttotal: 18.5s\tremaining: 3.71s\n",
|
|
"833:\tlearn: 0.0943638\ttest: 0.2731932\tbest: 0.2692852 (776)\ttotal: 18.5s\tremaining: 3.69s\n",
|
|
"834:\tlearn: 0.0942983\ttest: 0.2737046\tbest: 0.2692852 (776)\ttotal: 18.5s\tremaining: 3.66s\n",
|
|
"835:\tlearn: 0.0941468\ttest: 0.2751849\tbest: 0.2692852 (776)\ttotal: 18.6s\tremaining: 3.64s\n",
|
|
"836:\tlearn: 0.0939800\ttest: 0.2751380\tbest: 0.2692852 (776)\ttotal: 18.6s\tremaining: 3.62s\n",
|
|
"837:\tlearn: 0.0939414\ttest: 0.2752257\tbest: 0.2692852 (776)\ttotal: 18.6s\tremaining: 3.6s\n",
|
|
"838:\tlearn: 0.0935819\ttest: 0.2765342\tbest: 0.2692852 (776)\ttotal: 18.6s\tremaining: 3.58s\n",
|
|
"839:\tlearn: 0.0935403\ttest: 0.2761013\tbest: 0.2692852 (776)\ttotal: 18.7s\tremaining: 3.55s\n",
|
|
"840:\tlearn: 0.0935032\ttest: 0.2764730\tbest: 0.2692852 (776)\ttotal: 18.7s\tremaining: 3.53s\n",
|
|
"841:\tlearn: 0.0934864\ttest: 0.2765327\tbest: 0.2692852 (776)\ttotal: 18.7s\tremaining: 3.51s\n",
|
|
"842:\tlearn: 0.0932818\ttest: 0.2758113\tbest: 0.2692852 (776)\ttotal: 18.7s\tremaining: 3.49s\n",
|
|
"843:\tlearn: 0.0930652\ttest: 0.2756616\tbest: 0.2692852 (776)\ttotal: 18.7s\tremaining: 3.46s\n",
|
|
"844:\tlearn: 0.0929774\ttest: 0.2754009\tbest: 0.2692852 (776)\ttotal: 18.8s\tremaining: 3.44s\n",
|
|
"845:\tlearn: 0.0929083\ttest: 0.2751102\tbest: 0.2692852 (776)\ttotal: 18.8s\tremaining: 3.42s\n",
|
|
"846:\tlearn: 0.0927609\ttest: 0.2751197\tbest: 0.2692852 (776)\ttotal: 18.8s\tremaining: 3.4s\n",
|
|
"847:\tlearn: 0.0926837\ttest: 0.2751311\tbest: 0.2692852 (776)\ttotal: 18.8s\tremaining: 3.38s\n",
|
|
"848:\tlearn: 0.0926699\ttest: 0.2752320\tbest: 0.2692852 (776)\ttotal: 18.9s\tremaining: 3.35s\n",
|
|
"849:\tlearn: 0.0926033\ttest: 0.2752025\tbest: 0.2692852 (776)\ttotal: 18.9s\tremaining: 3.33s\n",
|
|
"850:\tlearn: 0.0922732\ttest: 0.2752409\tbest: 0.2692852 (776)\ttotal: 18.9s\tremaining: 3.31s\n",
|
|
"851:\tlearn: 0.0921659\ttest: 0.2753059\tbest: 0.2692852 (776)\ttotal: 18.9s\tremaining: 3.29s\n",
|
|
"852:\tlearn: 0.0919152\ttest: 0.2748592\tbest: 0.2692852 (776)\ttotal: 19s\tremaining: 3.27s\n",
|
|
"853:\tlearn: 0.0915178\ttest: 0.2747795\tbest: 0.2692852 (776)\ttotal: 19s\tremaining: 3.25s\n",
|
|
"854:\tlearn: 0.0912991\ttest: 0.2760235\tbest: 0.2692852 (776)\ttotal: 19s\tremaining: 3.22s\n",
|
|
"855:\tlearn: 0.0912712\ttest: 0.2762520\tbest: 0.2692852 (776)\ttotal: 19s\tremaining: 3.2s\n",
|
|
"856:\tlearn: 0.0911771\ttest: 0.2762577\tbest: 0.2692852 (776)\ttotal: 19.1s\tremaining: 3.18s\n",
|
|
"857:\tlearn: 0.0909427\ttest: 0.2765883\tbest: 0.2692852 (776)\ttotal: 19.1s\tremaining: 3.16s\n",
|
|
"858:\tlearn: 0.0908291\ttest: 0.2775036\tbest: 0.2692852 (776)\ttotal: 19.1s\tremaining: 3.13s\n",
|
|
"859:\tlearn: 0.0907660\ttest: 0.2778406\tbest: 0.2692852 (776)\ttotal: 19.1s\tremaining: 3.11s\n",
|
|
"860:\tlearn: 0.0906276\ttest: 0.2777790\tbest: 0.2692852 (776)\ttotal: 19.1s\tremaining: 3.09s\n",
|
|
"861:\tlearn: 0.0906030\ttest: 0.2777454\tbest: 0.2692852 (776)\ttotal: 19.2s\tremaining: 3.07s\n",
|
|
"862:\tlearn: 0.0905578\ttest: 0.2786176\tbest: 0.2692852 (776)\ttotal: 19.2s\tremaining: 3.05s\n",
|
|
"863:\tlearn: 0.0904926\ttest: 0.2785966\tbest: 0.2692852 (776)\ttotal: 19.2s\tremaining: 3.02s\n",
|
|
"864:\tlearn: 0.0904180\ttest: 0.2788950\tbest: 0.2692852 (776)\ttotal: 19.2s\tremaining: 3s\n",
|
|
"865:\tlearn: 0.0903370\ttest: 0.2783851\tbest: 0.2692852 (776)\ttotal: 19.3s\tremaining: 2.98s\n",
|
|
"866:\tlearn: 0.0901298\ttest: 0.2780798\tbest: 0.2692852 (776)\ttotal: 19.3s\tremaining: 2.96s\n",
|
|
"867:\tlearn: 0.0897241\ttest: 0.2778295\tbest: 0.2692852 (776)\ttotal: 19.3s\tremaining: 2.94s\n",
|
|
"868:\tlearn: 0.0894672\ttest: 0.2774876\tbest: 0.2692852 (776)\ttotal: 19.3s\tremaining: 2.91s\n",
|
|
"869:\tlearn: 0.0893993\ttest: 0.2774106\tbest: 0.2692852 (776)\ttotal: 19.3s\tremaining: 2.89s\n",
|
|
"870:\tlearn: 0.0892630\ttest: 0.2774523\tbest: 0.2692852 (776)\ttotal: 19.4s\tremaining: 2.87s\n",
|
|
"871:\tlearn: 0.0892335\ttest: 0.2772715\tbest: 0.2692852 (776)\ttotal: 19.4s\tremaining: 2.85s\n",
|
|
"872:\tlearn: 0.0892142\ttest: 0.2769923\tbest: 0.2692852 (776)\ttotal: 19.5s\tremaining: 2.83s\n",
|
|
"873:\tlearn: 0.0891367\ttest: 0.2771439\tbest: 0.2692852 (776)\ttotal: 19.5s\tremaining: 2.81s\n",
|
|
"874:\tlearn: 0.0890823\ttest: 0.2772502\tbest: 0.2692852 (776)\ttotal: 19.5s\tremaining: 2.79s\n",
|
|
"875:\tlearn: 0.0890651\ttest: 0.2772712\tbest: 0.2692852 (776)\ttotal: 19.6s\tremaining: 2.77s\n",
|
|
"876:\tlearn: 0.0888917\ttest: 0.2774013\tbest: 0.2692852 (776)\ttotal: 19.6s\tremaining: 2.75s\n",
|
|
"877:\tlearn: 0.0888048\ttest: 0.2774797\tbest: 0.2692852 (776)\ttotal: 19.6s\tremaining: 2.73s\n",
|
|
"878:\tlearn: 0.0886409\ttest: 0.2772526\tbest: 0.2692852 (776)\ttotal: 19.6s\tremaining: 2.7s\n",
|
|
"879:\tlearn: 0.0886079\ttest: 0.2773100\tbest: 0.2692852 (776)\ttotal: 19.7s\tremaining: 2.68s\n",
|
|
"880:\tlearn: 0.0883394\ttest: 0.2766006\tbest: 0.2692852 (776)\ttotal: 19.7s\tremaining: 2.66s\n",
|
|
"881:\tlearn: 0.0882294\ttest: 0.2766957\tbest: 0.2692852 (776)\ttotal: 19.7s\tremaining: 2.64s\n",
|
|
"882:\tlearn: 0.0881002\ttest: 0.2779128\tbest: 0.2692852 (776)\ttotal: 19.7s\tremaining: 2.61s\n",
|
|
"883:\tlearn: 0.0879947\ttest: 0.2778520\tbest: 0.2692852 (776)\ttotal: 19.7s\tremaining: 2.59s\n",
|
|
"884:\tlearn: 0.0878554\ttest: 0.2774804\tbest: 0.2692852 (776)\ttotal: 19.8s\tremaining: 2.57s\n",
|
|
"885:\tlearn: 0.0877606\ttest: 0.2773707\tbest: 0.2692852 (776)\ttotal: 19.8s\tremaining: 2.55s\n",
|
|
"886:\tlearn: 0.0876305\ttest: 0.2775782\tbest: 0.2692852 (776)\ttotal: 19.8s\tremaining: 2.52s\n",
|
|
"887:\tlearn: 0.0875824\ttest: 0.2775998\tbest: 0.2692852 (776)\ttotal: 19.8s\tremaining: 2.5s\n",
|
|
"888:\tlearn: 0.0875085\ttest: 0.2775477\tbest: 0.2692852 (776)\ttotal: 19.9s\tremaining: 2.48s\n",
|
|
"889:\tlearn: 0.0873875\ttest: 0.2767497\tbest: 0.2692852 (776)\ttotal: 19.9s\tremaining: 2.46s\n",
|
|
"890:\tlearn: 0.0872216\ttest: 0.2757103\tbest: 0.2692852 (776)\ttotal: 19.9s\tremaining: 2.44s\n",
|
|
"891:\tlearn: 0.0871900\ttest: 0.2757324\tbest: 0.2692852 (776)\ttotal: 19.9s\tremaining: 2.41s\n",
|
|
"892:\tlearn: 0.0870713\ttest: 0.2762089\tbest: 0.2692852 (776)\ttotal: 20s\tremaining: 2.39s\n",
|
|
"893:\tlearn: 0.0869311\ttest: 0.2761522\tbest: 0.2692852 (776)\ttotal: 20s\tremaining: 2.37s\n",
|
|
"894:\tlearn: 0.0869207\ttest: 0.2763438\tbest: 0.2692852 (776)\ttotal: 20s\tremaining: 2.35s\n",
|
|
"895:\tlearn: 0.0868229\ttest: 0.2760288\tbest: 0.2692852 (776)\ttotal: 20s\tremaining: 2.32s\n",
|
|
"896:\tlearn: 0.0867743\ttest: 0.2767258\tbest: 0.2692852 (776)\ttotal: 20s\tremaining: 2.3s\n",
|
|
"897:\tlearn: 0.0867431\ttest: 0.2764044\tbest: 0.2692852 (776)\ttotal: 20.1s\tremaining: 2.28s\n",
|
|
"898:\tlearn: 0.0866741\ttest: 0.2762972\tbest: 0.2692852 (776)\ttotal: 20.1s\tremaining: 2.26s\n",
|
|
"899:\tlearn: 0.0864701\ttest: 0.2762559\tbest: 0.2692852 (776)\ttotal: 20.1s\tremaining: 2.23s\n",
|
|
"900:\tlearn: 0.0864125\ttest: 0.2762469\tbest: 0.2692852 (776)\ttotal: 20.1s\tremaining: 2.21s\n",
|
|
"901:\tlearn: 0.0863479\ttest: 0.2766424\tbest: 0.2692852 (776)\ttotal: 20.1s\tremaining: 2.19s\n",
|
|
"902:\tlearn: 0.0863190\ttest: 0.2769055\tbest: 0.2692852 (776)\ttotal: 20.2s\tremaining: 2.17s\n",
|
|
"903:\tlearn: 0.0862092\ttest: 0.2770691\tbest: 0.2692852 (776)\ttotal: 20.2s\tremaining: 2.14s\n",
|
|
"904:\tlearn: 0.0861383\ttest: 0.2773182\tbest: 0.2692852 (776)\ttotal: 20.2s\tremaining: 2.12s\n",
|
|
"905:\tlearn: 0.0861174\ttest: 0.2773654\tbest: 0.2692852 (776)\ttotal: 20.2s\tremaining: 2.1s\n",
|
|
"906:\tlearn: 0.0860558\ttest: 0.2769274\tbest: 0.2692852 (776)\ttotal: 20.3s\tremaining: 2.08s\n",
|
|
"907:\tlearn: 0.0859902\ttest: 0.2768932\tbest: 0.2692852 (776)\ttotal: 20.3s\tremaining: 2.05s\n",
|
|
"908:\tlearn: 0.0859547\ttest: 0.2772506\tbest: 0.2692852 (776)\ttotal: 20.3s\tremaining: 2.03s\n",
|
|
"909:\tlearn: 0.0859156\ttest: 0.2772901\tbest: 0.2692852 (776)\ttotal: 20.3s\tremaining: 2.01s\n",
|
|
"910:\tlearn: 0.0857671\ttest: 0.2777660\tbest: 0.2692852 (776)\ttotal: 20.3s\tremaining: 1.99s\n",
|
|
"911:\tlearn: 0.0857250\ttest: 0.2778146\tbest: 0.2692852 (776)\ttotal: 20.4s\tremaining: 1.97s\n",
|
|
"912:\tlearn: 0.0856056\ttest: 0.2775238\tbest: 0.2692852 (776)\ttotal: 20.4s\tremaining: 1.94s\n",
|
|
"913:\tlearn: 0.0855736\ttest: 0.2774809\tbest: 0.2692852 (776)\ttotal: 20.4s\tremaining: 1.92s\n",
|
|
"914:\tlearn: 0.0854077\ttest: 0.2770031\tbest: 0.2692852 (776)\ttotal: 20.4s\tremaining: 1.9s\n",
|
|
"915:\tlearn: 0.0853466\ttest: 0.2778334\tbest: 0.2692852 (776)\ttotal: 20.5s\tremaining: 1.88s\n",
|
|
"916:\tlearn: 0.0852876\ttest: 0.2775524\tbest: 0.2692852 (776)\ttotal: 20.6s\tremaining: 1.86s\n",
|
|
"917:\tlearn: 0.0852382\ttest: 0.2783097\tbest: 0.2692852 (776)\ttotal: 20.6s\tremaining: 1.84s\n",
|
|
"918:\tlearn: 0.0851394\ttest: 0.2775718\tbest: 0.2692852 (776)\ttotal: 20.6s\tremaining: 1.82s\n",
|
|
"919:\tlearn: 0.0850944\ttest: 0.2779169\tbest: 0.2692852 (776)\ttotal: 20.6s\tremaining: 1.79s\n",
|
|
"920:\tlearn: 0.0850355\ttest: 0.2779517\tbest: 0.2692852 (776)\ttotal: 20.7s\tremaining: 1.77s\n",
|
|
"921:\tlearn: 0.0849579\ttest: 0.2779973\tbest: 0.2692852 (776)\ttotal: 20.7s\tremaining: 1.75s\n",
|
|
"922:\tlearn: 0.0848871\ttest: 0.2779228\tbest: 0.2692852 (776)\ttotal: 20.7s\tremaining: 1.73s\n",
|
|
"923:\tlearn: 0.0847715\ttest: 0.2772872\tbest: 0.2692852 (776)\ttotal: 20.7s\tremaining: 1.71s\n",
|
|
"924:\tlearn: 0.0846008\ttest: 0.2769435\tbest: 0.2692852 (776)\ttotal: 20.8s\tremaining: 1.68s\n",
|
|
"925:\tlearn: 0.0844972\ttest: 0.2771901\tbest: 0.2692852 (776)\ttotal: 20.8s\tremaining: 1.66s\n",
|
|
"926:\tlearn: 0.0843734\ttest: 0.2770618\tbest: 0.2692852 (776)\ttotal: 20.8s\tremaining: 1.64s\n",
|
|
"927:\tlearn: 0.0843005\ttest: 0.2770192\tbest: 0.2692852 (776)\ttotal: 20.8s\tremaining: 1.61s\n",
|
|
"928:\tlearn: 0.0841658\ttest: 0.2770191\tbest: 0.2692852 (776)\ttotal: 20.8s\tremaining: 1.59s\n",
|
|
"929:\tlearn: 0.0841427\ttest: 0.2768922\tbest: 0.2692852 (776)\ttotal: 20.9s\tremaining: 1.57s\n",
|
|
"930:\tlearn: 0.0839618\ttest: 0.2773593\tbest: 0.2692852 (776)\ttotal: 20.9s\tremaining: 1.55s\n",
|
|
"931:\tlearn: 0.0839274\ttest: 0.2770810\tbest: 0.2692852 (776)\ttotal: 20.9s\tremaining: 1.53s\n",
|
|
"932:\tlearn: 0.0838957\ttest: 0.2768082\tbest: 0.2692852 (776)\ttotal: 20.9s\tremaining: 1.5s\n",
|
|
"933:\tlearn: 0.0838701\ttest: 0.2767845\tbest: 0.2692852 (776)\ttotal: 21s\tremaining: 1.48s\n",
|
|
"934:\tlearn: 0.0838469\ttest: 0.2765988\tbest: 0.2692852 (776)\ttotal: 21s\tremaining: 1.46s\n",
|
|
"935:\tlearn: 0.0836062\ttest: 0.2759933\tbest: 0.2692852 (776)\ttotal: 21s\tremaining: 1.44s\n",
|
|
"936:\tlearn: 0.0835735\ttest: 0.2757186\tbest: 0.2692852 (776)\ttotal: 21s\tremaining: 1.41s\n",
|
|
"937:\tlearn: 0.0835612\ttest: 0.2756990\tbest: 0.2692852 (776)\ttotal: 21.1s\tremaining: 1.39s\n",
|
|
"938:\tlearn: 0.0832831\ttest: 0.2763839\tbest: 0.2692852 (776)\ttotal: 21.1s\tremaining: 1.37s\n",
|
|
"939:\tlearn: 0.0827296\ttest: 0.2753212\tbest: 0.2692852 (776)\ttotal: 21.1s\tremaining: 1.35s\n",
|
|
"940:\tlearn: 0.0825919\ttest: 0.2752041\tbest: 0.2692852 (776)\ttotal: 21.1s\tremaining: 1.32s\n",
|
|
"941:\tlearn: 0.0825532\ttest: 0.2751440\tbest: 0.2692852 (776)\ttotal: 21.1s\tremaining: 1.3s\n",
|
|
"942:\tlearn: 0.0825134\ttest: 0.2749609\tbest: 0.2692852 (776)\ttotal: 21.2s\tremaining: 1.28s\n",
|
|
"943:\tlearn: 0.0824778\ttest: 0.2747491\tbest: 0.2692852 (776)\ttotal: 21.2s\tremaining: 1.26s\n",
|
|
"944:\tlearn: 0.0824175\ttest: 0.2749258\tbest: 0.2692852 (776)\ttotal: 21.2s\tremaining: 1.23s\n",
|
|
"945:\tlearn: 0.0824063\ttest: 0.2749210\tbest: 0.2692852 (776)\ttotal: 21.2s\tremaining: 1.21s\n",
|
|
"946:\tlearn: 0.0821632\ttest: 0.2747040\tbest: 0.2692852 (776)\ttotal: 21.3s\tremaining: 1.19s\n",
|
|
"947:\tlearn: 0.0819407\ttest: 0.2743708\tbest: 0.2692852 (776)\ttotal: 21.3s\tremaining: 1.17s\n",
|
|
"948:\tlearn: 0.0818851\ttest: 0.2741998\tbest: 0.2692852 (776)\ttotal: 21.3s\tremaining: 1.14s\n",
|
|
"949:\tlearn: 0.0817726\ttest: 0.2741202\tbest: 0.2692852 (776)\ttotal: 21.3s\tremaining: 1.12s\n",
|
|
"950:\tlearn: 0.0817240\ttest: 0.2739560\tbest: 0.2692852 (776)\ttotal: 21.3s\tremaining: 1.1s\n",
|
|
"951:\tlearn: 0.0817137\ttest: 0.2738563\tbest: 0.2692852 (776)\ttotal: 21.4s\tremaining: 1.08s\n",
|
|
"952:\tlearn: 0.0815609\ttest: 0.2737170\tbest: 0.2692852 (776)\ttotal: 21.4s\tremaining: 1.05s\n",
|
|
"953:\tlearn: 0.0812574\ttest: 0.2743639\tbest: 0.2692852 (776)\ttotal: 21.4s\tremaining: 1.03s\n",
|
|
"954:\tlearn: 0.0812358\ttest: 0.2736487\tbest: 0.2692852 (776)\ttotal: 21.4s\tremaining: 1.01s\n",
|
|
"955:\tlearn: 0.0812152\ttest: 0.2734865\tbest: 0.2692852 (776)\ttotal: 21.5s\tremaining: 988ms\n",
|
|
"956:\tlearn: 0.0812000\ttest: 0.2733412\tbest: 0.2692852 (776)\ttotal: 21.5s\tremaining: 965ms\n",
|
|
"957:\tlearn: 0.0811016\ttest: 0.2735247\tbest: 0.2692852 (776)\ttotal: 21.6s\tremaining: 948ms\n",
|
|
"958:\tlearn: 0.0809270\ttest: 0.2732565\tbest: 0.2692852 (776)\ttotal: 21.7s\tremaining: 926ms\n",
|
|
"959:\tlearn: 0.0808333\ttest: 0.2726494\tbest: 0.2692852 (776)\ttotal: 21.7s\tremaining: 904ms\n",
|
|
"960:\tlearn: 0.0807935\ttest: 0.2723448\tbest: 0.2692852 (776)\ttotal: 21.7s\tremaining: 882ms\n",
|
|
"961:\tlearn: 0.0806939\ttest: 0.2727930\tbest: 0.2692852 (776)\ttotal: 21.7s\tremaining: 859ms\n",
|
|
"962:\tlearn: 0.0806092\ttest: 0.2731701\tbest: 0.2692852 (776)\ttotal: 21.8s\tremaining: 836ms\n",
|
|
"963:\tlearn: 0.0805539\ttest: 0.2731607\tbest: 0.2692852 (776)\ttotal: 21.8s\tremaining: 814ms\n",
|
|
"964:\tlearn: 0.0804164\ttest: 0.2727089\tbest: 0.2692852 (776)\ttotal: 21.8s\tremaining: 791ms\n",
|
|
"965:\tlearn: 0.0800942\ttest: 0.2721458\tbest: 0.2692852 (776)\ttotal: 21.8s\tremaining: 769ms\n",
|
|
"966:\tlearn: 0.0800829\ttest: 0.2721293\tbest: 0.2692852 (776)\ttotal: 21.9s\tremaining: 746ms\n",
|
|
"967:\tlearn: 0.0799836\ttest: 0.2734638\tbest: 0.2692852 (776)\ttotal: 21.9s\tremaining: 723ms\n",
|
|
"968:\tlearn: 0.0799179\ttest: 0.2743386\tbest: 0.2692852 (776)\ttotal: 21.9s\tremaining: 701ms\n",
|
|
"969:\tlearn: 0.0798946\ttest: 0.2741932\tbest: 0.2692852 (776)\ttotal: 21.9s\tremaining: 678ms\n",
|
|
"970:\tlearn: 0.0798621\ttest: 0.2741902\tbest: 0.2692852 (776)\ttotal: 22s\tremaining: 656ms\n",
|
|
"971:\tlearn: 0.0797757\ttest: 0.2740931\tbest: 0.2692852 (776)\ttotal: 22s\tremaining: 633ms\n",
|
|
"972:\tlearn: 0.0796789\ttest: 0.2739116\tbest: 0.2692852 (776)\ttotal: 22s\tremaining: 611ms\n",
|
|
"973:\tlearn: 0.0792292\ttest: 0.2729529\tbest: 0.2692852 (776)\ttotal: 22s\tremaining: 588ms\n",
|
|
"974:\tlearn: 0.0792146\ttest: 0.2729651\tbest: 0.2692852 (776)\ttotal: 22.1s\tremaining: 566ms\n",
|
|
"975:\tlearn: 0.0790510\ttest: 0.2729864\tbest: 0.2692852 (776)\ttotal: 22.1s\tremaining: 543ms\n",
|
|
"976:\tlearn: 0.0790014\ttest: 0.2729634\tbest: 0.2692852 (776)\ttotal: 22.1s\tremaining: 520ms\n",
|
|
"977:\tlearn: 0.0788816\ttest: 0.2729606\tbest: 0.2692852 (776)\ttotal: 22.1s\tremaining: 498ms\n",
|
|
"978:\tlearn: 0.0788330\ttest: 0.2731100\tbest: 0.2692852 (776)\ttotal: 22.1s\tremaining: 475ms\n",
|
|
"979:\tlearn: 0.0786675\ttest: 0.2730105\tbest: 0.2692852 (776)\ttotal: 22.2s\tremaining: 452ms\n",
|
|
"980:\tlearn: 0.0784029\ttest: 0.2730169\tbest: 0.2692852 (776)\ttotal: 22.2s\tremaining: 430ms\n",
|
|
"981:\tlearn: 0.0783484\ttest: 0.2729781\tbest: 0.2692852 (776)\ttotal: 22.2s\tremaining: 407ms\n",
|
|
"982:\tlearn: 0.0782327\ttest: 0.2731345\tbest: 0.2692852 (776)\ttotal: 22.2s\tremaining: 384ms\n",
|
|
"983:\tlearn: 0.0782263\ttest: 0.2732119\tbest: 0.2692852 (776)\ttotal: 22.3s\tremaining: 362ms\n",
|
|
"984:\tlearn: 0.0781320\ttest: 0.2730725\tbest: 0.2692852 (776)\ttotal: 22.3s\tremaining: 339ms\n",
|
|
"985:\tlearn: 0.0780982\ttest: 0.2734446\tbest: 0.2692852 (776)\ttotal: 22.3s\tremaining: 317ms\n",
|
|
"986:\tlearn: 0.0780380\ttest: 0.2741421\tbest: 0.2692852 (776)\ttotal: 22.3s\tremaining: 294ms\n",
|
|
"987:\tlearn: 0.0780238\ttest: 0.2741804\tbest: 0.2692852 (776)\ttotal: 22.4s\tremaining: 271ms\n",
|
|
"988:\tlearn: 0.0778927\ttest: 0.2741683\tbest: 0.2692852 (776)\ttotal: 22.4s\tremaining: 249ms\n",
|
|
"989:\tlearn: 0.0778079\ttest: 0.2744789\tbest: 0.2692852 (776)\ttotal: 22.4s\tremaining: 226ms\n",
|
|
"990:\tlearn: 0.0777030\ttest: 0.2744288\tbest: 0.2692852 (776)\ttotal: 22.4s\tremaining: 204ms\n",
|
|
"991:\tlearn: 0.0776797\ttest: 0.2743180\tbest: 0.2692852 (776)\ttotal: 22.4s\tremaining: 181ms\n",
|
|
"992:\tlearn: 0.0776177\ttest: 0.2733887\tbest: 0.2692852 (776)\ttotal: 22.5s\tremaining: 158ms\n",
|
|
"993:\tlearn: 0.0775452\ttest: 0.2731604\tbest: 0.2692852 (776)\ttotal: 22.5s\tremaining: 136ms\n",
|
|
"994:\tlearn: 0.0774421\ttest: 0.2727642\tbest: 0.2692852 (776)\ttotal: 22.5s\tremaining: 113ms\n",
|
|
"995:\tlearn: 0.0771971\ttest: 0.2720036\tbest: 0.2692852 (776)\ttotal: 22.5s\tremaining: 90.5ms\n",
|
|
"996:\tlearn: 0.0771258\ttest: 0.2717726\tbest: 0.2692852 (776)\ttotal: 22.6s\tremaining: 67.9ms\n",
|
|
"997:\tlearn: 0.0770762\ttest: 0.2719268\tbest: 0.2692852 (776)\ttotal: 22.6s\tremaining: 45.2ms\n",
|
|
"998:\tlearn: 0.0770167\ttest: 0.2717726\tbest: 0.2692852 (776)\ttotal: 22.6s\tremaining: 22.6ms\n",
|
|
"999:\tlearn: 0.0769772\ttest: 0.2725178\tbest: 0.2692852 (776)\ttotal: 22.7s\tremaining: 0us\n",
|
|
"\n",
|
|
"bestTest = 0.2692852158\n",
|
|
"bestIteration = 776\n",
|
|
"\n",
|
|
"Shrink model to first 777 iterations.\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "sq86ZDCor0xw",
|
|
"colab_type": "code",
|
|
"outputId": "cb17b636-994e-4ab8-9d4a-dfa7119d5816",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"print(end - start)"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"23.301390647888184\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "Q4vxZDFMrhRD",
|
|
"colab_type": "code",
|
|
"outputId": "b2deb63b-f686-405c-ba1d-174975b61474",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 35
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"print(end - start)"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"66.66963219642639\n"
|
|
],
|
|
"name": "stdout"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "4luRlINZh8Bs",
|
|
"colab_type": "code",
|
|
"outputId": "110c193b-b236-41cb-d0ec-f812227bd3e9",
|
|
"colab": {
|
|
"resources": {
|
|
"http://localhost:8080/nbextensions/google.colab/colabwidgets/controls.min.js": {
|
|
"data": "IWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfShleHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciByPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIoaSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJiJzdHJpbmciIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQoaSxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLCJhIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD0iIixuKG4ucz0xNDApfShbZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNCkscj1pLkJ1ZmZlcjtmdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dfWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiByKHQsZSxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1pOihvKGksZSksZS5CdWZmZXI9cyksbyhyLHMpLHMuZnJvbT1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCxlLG4pfSxzLmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIodCk7cmV0dXJuIHZvaWQgMCE9PWU/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbChlLG4pOmkuZmlsbChlKTppLmZpbGwoMCksaX0scy5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKHQpfSxzLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBpLlNsb3dCdWZmZXIodCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigzMDIpKSxpKG4oMzAzKSksaShuKDMwNCkpLGkobigzMDUpKSxpKG4oMzA2KSksaShuKDE4KSksaShuKDMwNykpLGkobigzMDgpKSxpKG4oMzA5KSksaShuKDMxMCkpLGkobigzMTEpKSxpKG4oMzEyKSksaShuKDMxMykpLGkobigzMTQpKSxpKG4oMzE1KSksaShuKDMxNikpfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fCJBc3NlcnRpb24gZmFpbGVkIil9ZnVuY3Rpb24gcih0LGUpe3Quc3VwZXJfPWU7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyBuLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gbyh0LGUsbil7aWYoby5pc0JOKHQpKXJldHVybiB0O3RoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLG51bGwhPT10JiYoImxlIiE9PWUmJiJiZSIhPT1lfHwobj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxufHwiYmUiKSl9dmFyIHM7Im9iamVjdCI9PXR5cGVvZiB0P3QuZXhwb3J0cz1vOmUuQk49byxvLkJOPW8sby53b3JkU2l6ZT0yNjt0cnl7cz1uKDE4MikuQnVmZmVyfWNhdGNoKHQpe31mdW5jdGlvbiBhKHQsZSxuKXtmb3IodmFyIGk9MCxyPU1hdGgubWluKHQubGVuZ3RoLG4pLG89ZTtvPHI7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyktNDg7aTw8PTQsaXw9cz49NDkmJnM8PTU0P3MtNDkrMTA6cz49MTcmJnM8PTIyP3MtMTcrMTA6MTUmc31yZXR1cm4gaX1mdW5jdGlvbiB1KHQsZSxuLGkpe2Zvcih2YXIgcj0wLG89TWF0aC5taW4odC5sZW5ndGgsbikscz1lO3M8bztzKyspe3ZhciBhPXQuY2hhckNvZGVBdChzKS00ODtyKj1pLHIrPWE+PTQ5P2EtNDkrMTA6YT49MTc/YS0xNysxMDphfXJldHVybiByfW8uaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG98fG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3Iud29yZFNpemU9PT1vLndvcmRTaXplJiZBcnJheS5pc0FycmF5KHQud29yZHMpfSxvLm1heD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKT4wP3Q6ZX0sby5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbXAoZSk8MD90OmV9LG8ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXROdW1iZXIodCxlLG4pO2lmKCJvYmplY3QiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxuKTsiaGV4Ij09PWUmJihlPTE2KSxpKGU9PT0oMHxlKSYmZT49MiYmZTw9MzYpO3ZhciByPTA7Ii0iPT09KHQ9dC50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKSlbMF0mJnIrKywxNj09PWU/dGhpcy5fcGFyc2VIZXgodCxyKTp0aGlzLl9wYXJzZUJhc2UodCxlLHIpLCItIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSwibGUiPT09biYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUsbil9LG8ucHJvdG90eXBlLl9pbml0TnVtYmVyPWZ1bmN0aW9uKHQsZSxuKXt0PDAmJih0aGlzLm5lZ2F0aXZlPTEsdD0tdCksdDw2NzEwODg2ND8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdF0sdGhpcy5sZW5ndGg9MSk6dDw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihpKHQ8OTAwNzE5OTI1NDc0MDk5MiksdGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLCJsZSI9PT1uJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxuKX0sby5wcm90b3R5cGUuX2luaXRBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaSgibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT0wO3ZhciBvLHMsYT0wO2lmKCJiZSI9PT1uKWZvcihyPXQubGVuZ3RoLTEsbz0wO3I+PTA7ci09MylzPXRbcl18dFtyLTFdPDw4fHRbci0yXTw8MTYsdGhpcy53b3Jkc1tvXXw9czw8YSY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09cz4+PjI2LWEmNjcxMDg4NjMsKGErPTI0KT49MjYmJihhLT0yNixvKyspO2Vsc2UgaWYoImxlIj09PW4pZm9yKHI9MCxvPTA7cjx0Lmxlbmd0aDtyKz0zKXM9dFtyXXx0W3IrMV08PDh8dFtyKzJdPDwxNix0aGlzLndvcmRzW29dfD1zPDxhJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1zPj4+MjYtYSY2NzEwODg2MywoYSs9MjQpPj0yNiYmKGEtPTI2LG8rKyk7cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuX3BhcnNlSGV4PWZ1bmN0aW9uKHQsZSl7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKCh0Lmxlbmd0aC1lKS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPTA7bjx0aGlzLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT0wO3ZhciBpLHIsbz0wO2ZvcihuPXQubGVuZ3RoLTYsaT0wO24+PWU7bi09NilyPWEodCxuLG4rNiksdGhpcy53b3Jkc1tpXXw9cjw8byY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PXI+Pj4yNi1vJjQxOTQzMDMsKG8rPTI0KT49MjYmJihvLT0yNixpKyspO24rNiE9PWUmJihyPWEodCxlLG4rNiksdGhpcy53b3Jkc1tpXXw9cjw8byY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PXI+Pj4yNi1vJjQxOTQzMDMpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbih0LGUsbil7dGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MTtmb3IodmFyIGk9MCxyPTE7cjw9NjcxMDg4NjM7cio9ZSlpKys7aS0tLHI9ci9lfDA7Zm9yKHZhciBvPXQubGVuZ3RoLW4scz1vJWksYT1NYXRoLm1pbihvLG8tcykrbixjPTAsaD1uO2g8YTtoKz1pKWM9dSh0LGgsaCtpLGUpLHRoaXMuaW11bG4ociksdGhpcy53b3Jkc1swXStjPDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPWM6dGhpcy5faWFkZG4oYyk7aWYoMCE9PXMpe3ZhciBsPTE7Zm9yKGM9dSh0LGgsdC5sZW5ndGgsZSksaD0wO2g8cztoKyspbCo9ZTt0aGlzLmltdWxuKGwpLHRoaXMud29yZHNbMF0rYzw2NzEwODg2ND90aGlzLndvcmRzWzBdKz1jOnRoaXMuX2lhZGRuKGMpfX0sby5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXt0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspdC53b3Jkc1tlXT10aGlzLndvcmRzW2VdO3QubGVuZ3RoPXRoaXMubGVuZ3RoLHQubmVnYXRpdmU9dGhpcy5uZWdhdGl2ZSx0LnJlZD10aGlzLnJlZH0sby5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbyhudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9LG8ucHJvdG90eXBlLl9leHBhbmQ9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Oyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN0cmlwPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aD4xJiYwPT09dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXTspdGhpcy5sZW5ndGgtLTtyZXR1cm4gdGhpcy5fbm9ybVNpZ24oKX0sby5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF0mJih0aGlzLm5lZ2F0aXZlPTApLHRoaXN9LG8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In07dmFyIGM9WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0saD1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxsPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO2Z1bmN0aW9uIGQodCxlLG4pe24ubmVnYXRpdmU9ZS5uZWdhdGl2ZV50Lm5lZ2F0aXZlO3ZhciBpPXQubGVuZ3RoK2UubGVuZ3RofDA7bi5sZW5ndGg9aSxpPWktMXwwO3ZhciByPTB8dC53b3Jkc1swXSxvPTB8ZS53b3Jkc1swXSxzPXIqbyxhPTY3MTA4ODYzJnMsdT1zLzY3MTA4ODY0fDA7bi53b3Jkc1swXT1hO2Zvcih2YXIgYz0xO2M8aTtjKyspe2Zvcih2YXIgaD11Pj4+MjYsbD02NzEwODg2MyZ1LGQ9TWF0aC5taW4oYyxlLmxlbmd0aC0xKSxmPU1hdGgubWF4KDAsYy10Lmxlbmd0aCsxKTtmPD1kO2YrKyl7dmFyIHA9Yy1mfDA7aCs9KHM9KHI9MHx0LndvcmRzW3BdKSoobz0wfGUud29yZHNbZl0pK2wpLzY3MTA4ODY0fDAsbD02NzEwODg2MyZzfW4ud29yZHNbY109MHxsLHU9MHxofXJldHVybiAwIT09dT9uLndvcmRzW2NdPTB8dTpuLmxlbmd0aC0tLG4uc3RyaXAoKX1vLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKGU9MHxlfHwxLDE2PT09KHQ9dHx8MTApfHwiaGV4Ij09PXQpe249IiI7Zm9yKHZhciByPTAsbz0wLHM9MDtzPHRoaXMubGVuZ3RoO3MrKyl7dmFyIGE9dGhpcy53b3Jkc1tzXSx1PSgxNjc3NzIxNSYoYTw8cnxvKSkudG9TdHJpbmcoMTYpO249MCE9PShvPWE+Pj4yNC1yJjE2Nzc3MjE1KXx8cyE9PXRoaXMubGVuZ3RoLTE/Y1s2LXUubGVuZ3RoXSt1K246dStuLChyKz0yKT49MjYmJihyLT0yNixzLS0pfWZvcigwIT09byYmKG49by50b1N0cmluZygxNikrbik7bi5sZW5ndGglZSE9MDspbj0iMCIrbjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJihuPSItIituKSxufWlmKHQ9PT0oMHx0KSYmdD49MiYmdDw9MzYpe3ZhciBkPWhbdF0sZj1sW3RdO249IiI7dmFyIHA9dGhpcy5jbG9uZSgpO2ZvcihwLm5lZ2F0aXZlPTA7IXAuaXNaZXJvKCk7KXt2YXIgbT1wLm1vZG4oZikudG9TdHJpbmcodCk7bj0ocD1wLmlkaXZuKGYpKS5pc1plcm8oKT9tK246Y1tkLW0ubGVuZ3RoXSttK259Zm9yKHRoaXMuaXNaZXJvKCkmJihuPSIwIituKTtuLmxlbmd0aCVlIT0wOyluPSIwIituO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG49Ii0iK24pLG59aSghMSwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpfSxvLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD90Kz02NzEwODg2NCp0aGlzLndvcmRzWzFdOjM9PT10aGlzLmxlbmd0aCYmMT09PXRoaXMud29yZHNbMl0/dCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJmkoITEsIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLDAhPT10aGlzLm5lZ2F0aXZlPy10OnR9LG8ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKDE2KX0sby5wcm90b3R5cGUudG9CdWZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaSh2b2lkIDAhPT1zKSx0aGlzLnRvQXJyYXlMaWtlKHMsdCxlKX0sby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmJ5dGVMZW5ndGgoKSxvPW58fE1hdGgubWF4KDEscik7aShyPD1vLCJieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoIiksaShvPjAsIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpLHRoaXMuc3RyaXAoKTt2YXIgcyxhLHU9ImxlIj09PWUsYz1uZXcgdChvKSxoPXRoaXMuY2xvbmUoKTtpZih1KXtmb3IoYT0wOyFoLmlzWmVybygpO2ErKylzPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSxjW2FdPXM7Zm9yKDthPG87YSsrKWNbYV09MH1lbHNle2ZvcihhPTA7YTxvLXI7YSsrKWNbYV09MDtmb3IoYT0wOyFoLmlzWmVybygpO2ErKylzPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSxjW28tYS0xXT1zfXJldHVybiBjfSxNYXRoLmNsejMyP28ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDMyLU1hdGguY2x6MzIodCl9Om8ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9dCxuPTA7cmV0dXJuIGU+PTQwOTYmJihuKz0xMyxlPj4+PTEzKSxlPj02NCYmKG4rPTcsZT4+Pj03KSxlPj04JiYobis9NCxlPj4+PTQpLGU+PTImJihuKz0yLGU+Pj49MiksbitlfSxvLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIDI2O3ZhciBlPXQsbj0wO3JldHVybiAwPT0oODE5MSZlKSYmKG4rPTEzLGU+Pj49MTMpLDA9PSgxMjcmZSkmJihuKz03LGU+Pj49NyksMD09KDE1JmUpJiYobis9NCxlPj4+PTQpLDA9PSgzJmUpJiYobis9MixlPj4+PTIpLDA9PSgxJmUpJiZuKyssbn0sby5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSxlPXRoaXMuX2NvdW50Qml0cyh0KTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK2V9LG8ucHJvdG90eXBlLnplcm9CaXRzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gMDtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbZV0pO2lmKHQrPW4sMjYhPT1uKWJyZWFrfXJldHVybiB0fSxvLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpLzgpfSxvLnByb3RvdHlwZS50b1R3b3M9ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlP3RoaXMuYWJzKCkuaW5vdG4odCkuaWFkZG4oMSk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5mcm9tVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50ZXN0bih0LTEpP3RoaXMubm90bih0KS5pYWRkbigxKS5pbmVnKCk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5pc05lZz1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZX0sby5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCl9LG8ucHJvdG90eXBlLmluZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1plcm8oKXx8KHRoaXMubmVnYXRpdmVePTEpLHRoaXN9LG8ucHJvdG90eXBlLml1b3I9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Lmxlbmd0aDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMud29yZHNbZV09dGhpcy53b3Jkc1tlXXx0LndvcmRzW2VdO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlvcj1mdW5jdGlvbih0KXtyZXR1cm4gaSgwPT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdW9yKHQpfSxvLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxvLnByb3RvdHlwZS51b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKHQpOnQuY2xvbmUoKS5pdW9yKHRoaXMpfSxvLnByb3RvdHlwZS5pdWFuZD1mdW5jdGlvbih0KXt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPXRoaXMud29yZHNbbl0mdC53b3Jkc1tuXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBpKDA9PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1YW5kKHQpfSxvLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYW5kKHQpOnQuY2xvbmUoKS5pYW5kKHRoaXMpfSxvLnByb3RvdHlwZS51YW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXVhbmQodCk6dC5jbG9uZSgpLml1YW5kKHRoaXMpfSxvLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhlPXRoaXMsbj10KTooZT10LG49dGhpcyk7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT1lLndvcmRzW2ldXm4ud29yZHNbaV07aWYodGhpcyE9PWUpZm9yKDtpPGUubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPWUud29yZHNbaV07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gaSgwPT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdXhvcih0KX0sby5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcih0KTp0LmNsb25lKCkuaXhvcih0aGlzKX0sby5wcm90b3R5cGUudXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1eG9yKHQpOnQuY2xvbmUoKS5pdXhvcih0aGlzKX0sby5wcm90b3R5cGUuaW5vdG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPTB8TWF0aC5jZWlsKHQvMjYpLG49dCUyNjt0aGlzLl9leHBhbmQoZSksbj4wJiZlLS07Zm9yKHZhciByPTA7cjxlO3IrKyl0aGlzLndvcmRzW3JdPTY3MTA4ODYzJn50aGlzLndvcmRzW3JdO3JldHVybiBuPjAmJih0aGlzLndvcmRzW3JdPX50aGlzLndvcmRzW3JdJjY3MTA4ODYzPj4yNi1uKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm5vdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih0KX0sby5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbih0LGUpe2koIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgbj10LzI2fDAscj10JTI2O3JldHVybiB0aGlzLl9leHBhbmQobisxKSx0aGlzLndvcmRzW25dPWU/dGhpcy53b3Jkc1tuXXwxPDxyOnRoaXMud29yZHNbbl0mfigxPDxyKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLGU9dGhpcy5pc3ViKHQpLHRoaXMubmVnYXRpdmVePTEsdGhpcy5fbm9ybVNpZ24oKTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIHQubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKTt0aGlzLmxlbmd0aD50Lmxlbmd0aD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgcj0wLG89MDtvPGkubGVuZ3RoO28rKyllPSgwfG4ud29yZHNbb10pKygwfGkud29yZHNbb10pK3IsdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlLHI9ZT4+PjI2O2Zvcig7MCE9PXImJm88bi5sZW5ndGg7bysrKWU9KDB8bi53b3Jkc1tvXSkrcix0aGlzLndvcmRzW29dPTY3MTA4ODYzJmUscj1lPj4+MjY7aWYodGhpcy5sZW5ndGg9bi5sZW5ndGgsMCE9PXIpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09cix0aGlzLmxlbmd0aCsrO2Vsc2UgaWYobiE9PXRoaXMpZm9yKDtvPG4ubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPW4ud29yZHNbb107cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMCE9PXQubmVnYXRpdmUmJjA9PT10aGlzLm5lZ2F0aXZlPyh0Lm5lZ2F0aXZlPTAsZT10aGlzLnN1Yih0KSx0Lm5lZ2F0aXZlXj0xLGUpOjA9PT10Lm5lZ2F0aXZlJiYwIT09dGhpcy5uZWdhdGl2ZT8odGhpcy5uZWdhdGl2ZT0wLGU9dC5zdWIodGhpcyksdGhpcy5uZWdhdGl2ZT0xLGUpOnRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxvLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKDAhPT10Lm5lZ2F0aXZlKXt0Lm5lZ2F0aXZlPTA7dmFyIGU9dGhpcy5pYWRkKHQpO3JldHVybiB0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKX1pZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZCh0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fbm9ybVNpZ24oKTt2YXIgbixpLHI9dGhpcy5jbXAodCk7aWYoMD09PXIpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmxlbmd0aD0xLHRoaXMud29yZHNbMF09MCx0aGlzO3I+MD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgbz0wLHM9MDtzPGkubGVuZ3RoO3MrKylvPShlPSgwfG4ud29yZHNbc10pLSgwfGkud29yZHNbc10pK28pPj4yNix0aGlzLndvcmRzW3NdPTY3MTA4ODYzJmU7Zm9yKDswIT09byYmczxuLmxlbmd0aDtzKyspbz0oZT0oMHxuLndvcmRzW3NdKStvKT4+MjYsdGhpcy53b3Jkc1tzXT02NzEwODg2MyZlO2lmKDA9PT1vJiZzPG4ubGVuZ3RoJiZuIT09dGhpcylmb3IoO3M8bi5sZW5ndGg7cysrKXRoaXMud29yZHNbc109bi53b3Jkc1tzXTtyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgscyksbiE9PXRoaXMmJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXN1Yih0KX07dmFyIGY9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzPXQud29yZHMsYT1lLndvcmRzLHU9bi53b3JkcyxjPTAsaD0wfHNbMF0sbD04MTkxJmgsZD1oPj4+MTMsZj0wfHNbMV0scD04MTkxJmYsbT1mPj4+MTMsZz0wfHNbMl0sdj04MTkxJmcsYj1nPj4+MTMseT0wfHNbM10sXz04MTkxJnksdz15Pj4+MTMseD0wfHNbNF0sTT04MTkxJngsUz14Pj4+MTMsRT0wfHNbNV0sQT04MTkxJkUsQz1FPj4+MTMsaz0wfHNbNl0sTz04MTkxJmssUD1rPj4+MTMsVD0wfHNbN10saj04MTkxJlQsST1UPj4+MTMsTD0wfHNbOF0sQj04MTkxJkwsRD1MPj4+MTMsUj0wfHNbOV0sej04MTkxJlIsTj1SPj4+MTMsVz0wfGFbMF0scT04MTkxJlcsSD1XPj4+MTMsRj0wfGFbMV0sVj04MTkxJkYsVT1GPj4+MTMsSz0wfGFbMl0sWT04MTkxJkssWD1LPj4+MTMsJD0wfGFbM10sRz04MTkxJiQsSj0kPj4+MTMsWj0wfGFbNF0sUT04MTkxJlosdHQ9Wj4+PjEzLGV0PTB8YVs1XSxudD04MTkxJmV0LGl0PWV0Pj4+MTMscnQ9MHxhWzZdLG90PTgxOTEmcnQsc3Q9cnQ+Pj4xMyxhdD0wfGFbN10sdXQ9ODE5MSZhdCxjdD1hdD4+PjEzLGh0PTB8YVs4XSxsdD04MTkxJmh0LGR0PWh0Pj4+MTMsZnQ9MHxhWzldLHB0PTgxOTEmZnQsbXQ9ZnQ+Pj4xMztuLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxuLmxlbmd0aD0xOTt2YXIgZ3Q9KGMrKGk9TWF0aC5pbXVsKGwscSkpfDApKygoODE5MSYocj0ocj1NYXRoLmltdWwobCxIKSkrTWF0aC5pbXVsKGQscSl8MCkpPDwxMyl8MDtjPSgobz1NYXRoLmltdWwoZCxIKSkrKHI+Pj4xMyl8MCkrKGd0Pj4+MjYpfDAsZ3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHAscSkscj0ocj1NYXRoLmltdWwocCxIKSkrTWF0aC5pbXVsKG0scSl8MCxvPU1hdGguaW11bChtLEgpO3ZhciB2dD0oYysoaT1pK01hdGguaW11bChsLFYpfDApfDApKygoODE5MSYocj0ocj1yK01hdGguaW11bChsLFUpfDApK01hdGguaW11bChkLFYpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxVKXwwKSsocj4+PjEzKXwwKSsodnQ+Pj4yNil8MCx2dCY9NjcxMDg4NjMsaT1NYXRoLmltdWwodixxKSxyPShyPU1hdGguaW11bCh2LEgpKStNYXRoLmltdWwoYixxKXwwLG89TWF0aC5pbXVsKGIsSCksaT1pK01hdGguaW11bChwLFYpfDAscj0ocj1yK01hdGguaW11bChwLFUpfDApK01hdGguaW11bChtLFYpfDAsbz1vK01hdGguaW11bChtLFUpfDA7dmFyIGJ0PShjKyhpPWkrTWF0aC5pbXVsKGwsWSl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKGwsWCl8MCkrTWF0aC5pbXVsKGQsWSl8MCkpPDwxMyl8MDtjPSgobz1vK01hdGguaW11bChkLFgpfDApKyhyPj4+MTMpfDApKyhidD4+PjI2KXwwLGJ0Jj02NzEwODg2MyxpPU1hdGguaW11bChfLHEpLHI9KHI9TWF0aC5pbXVsKF8sSCkpK01hdGguaW11bCh3LHEpfDAsbz1NYXRoLmltdWwodyxIKSxpPWkrTWF0aC5pbXVsKHYsVil8MCxyPShyPXIrTWF0aC5pbXVsKHYsVSl8MCkrTWF0aC5pbXVsKGIsVil8MCxvPW8rTWF0aC5pbXVsKGIsVSl8MCxpPWkrTWF0aC5pbXVsKHAsWSl8MCxyPShyPXIrTWF0aC5pbXVsKHAsWCl8MCkrTWF0aC5pbXVsKG0sWSl8MCxvPW8rTWF0aC5pbXVsKG0sWCl8MDt2YXIgeXQ9KGMrKGk9aStNYXRoLmltdWwobCxHKXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxKKXwwKStNYXRoLmltdWwoZCxHKXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsSil8MCkrKHI+Pj4xMyl8MCkrKHl0Pj4+MjYpfDAseXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKE0scSkscj0ocj1NYXRoLmltdWwoTSxIKSkrTWF0aC5pbXVsKFMscSl8MCxvPU1hdGguaW11bChTLEgpLGk9aStNYXRoLmltdWwoXyxWKXwwLHI9KHI9citNYXRoLmltdWwoXyxVKXwwKStNYXRoLmltdWwodyxWKXwwLG89bytNYXRoLmltdWwodyxVKXwwLGk9aStNYXRoLmltdWwodixZKXwwLHI9KHI9citNYXRoLmltdWwodixYKXwwKStNYXRoLmltdWwoYixZKXwwLG89bytNYXRoLmltdWwoYixYKXwwLGk9aStNYXRoLmltdWwocCxHKXwwLHI9KHI9citNYXRoLmltdWwocCxKKXwwKStNYXRoLmltdWwobSxHKXwwLG89bytNYXRoLmltdWwobSxKKXwwO3ZhciBfdD0oYysoaT1pK01hdGguaW11bChsLFEpfDApfDApKygoODE5MSYocj0ocj1yK01hdGguaW11bChsLHR0KXwwKStNYXRoLmltdWwoZCxRKXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsdHQpfDApKyhyPj4+MTMpfDApKyhfdD4+PjI2KXwwLF90Jj02NzEwODg2MyxpPU1hdGguaW11bChBLHEpLHI9KHI9TWF0aC5pbXVsKEEsSCkpK01hdGguaW11bChDLHEpfDAsbz1NYXRoLmltdWwoQyxIKSxpPWkrTWF0aC5pbXVsKE0sVil8MCxyPShyPXIrTWF0aC5pbXVsKE0sVSl8MCkrTWF0aC5pbXVsKFMsVil8MCxvPW8rTWF0aC5pbXVsKFMsVSl8MCxpPWkrTWF0aC5pbXVsKF8sWSl8MCxyPShyPXIrTWF0aC5pbXVsKF8sWCl8MCkrTWF0aC5pbXVsKHcsWSl8MCxvPW8rTWF0aC5pbXVsKHcsWCl8MCxpPWkrTWF0aC5pbXVsKHYsRyl8MCxyPShyPXIrTWF0aC5pbXVsKHYsSil8MCkrTWF0aC5pbXVsKGIsRyl8MCxvPW8rTWF0aC5pbXVsKGIsSil8MCxpPWkrTWF0aC5pbXVsKHAsUSl8MCxyPShyPXIrTWF0aC5pbXVsKHAsdHQpfDApK01hdGguaW11bChtLFEpfDAsbz1vK01hdGguaW11bChtLHR0KXwwO3ZhciB3dD0oYysoaT1pK01hdGguaW11bChsLG50KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxpdCl8MCkrTWF0aC5pbXVsKGQsbnQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxpdCl8MCkrKHI+Pj4xMyl8MCkrKHd0Pj4+MjYpfDAsd3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKE8scSkscj0ocj1NYXRoLmltdWwoTyxIKSkrTWF0aC5pbXVsKFAscSl8MCxvPU1hdGguaW11bChQLEgpLGk9aStNYXRoLmltdWwoQSxWKXwwLHI9KHI9citNYXRoLmltdWwoQSxVKXwwKStNYXRoLmltdWwoQyxWKXwwLG89bytNYXRoLmltdWwoQyxVKXwwLGk9aStNYXRoLmltdWwoTSxZKXwwLHI9KHI9citNYXRoLmltdWwoTSxYKXwwKStNYXRoLmltdWwoUyxZKXwwLG89bytNYXRoLmltdWwoUyxYKXwwLGk9aStNYXRoLmltdWwoXyxHKXwwLHI9KHI9citNYXRoLmltdWwoXyxKKXwwKStNYXRoLmltdWwodyxHKXwwLG89bytNYXRoLmltdWwodyxKKXwwLGk9aStNYXRoLmltdWwodixRKXwwLHI9KHI9citNYXRoLmltdWwodix0dCl8MCkrTWF0aC5pbXVsKGIsUSl8MCxvPW8rTWF0aC5pbXVsKGIsdHQpfDAsaT1pK01hdGguaW11bChwLG50KXwwLHI9KHI9citNYXRoLmltdWwocCxpdCl8MCkrTWF0aC5pbXVsKG0sbnQpfDAsbz1vK01hdGguaW11bChtLGl0KXwwO3ZhciB4dD0oYysoaT1pK01hdGguaW11bChsLG90KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxzdCl8MCkrTWF0aC5pbXVsKGQsb3QpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxzdCl8MCkrKHI+Pj4xMyl8MCkrKHh0Pj4+MjYpfDAseHQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKGoscSkscj0ocj1NYXRoLmltdWwoaixIKSkrTWF0aC5pbXVsKEkscSl8MCxvPU1hdGguaW11bChJLEgpLGk9aStNYXRoLmltdWwoTyxWKXwwLHI9KHI9citNYXRoLmltdWwoTyxVKXwwKStNYXRoLmltdWwoUCxWKXwwLG89bytNYXRoLmltdWwoUCxVKXwwLGk9aStNYXRoLmltdWwoQSxZKXwwLHI9KHI9citNYXRoLmltdWwoQSxYKXwwKStNYXRoLmltdWwoQyxZKXwwLG89bytNYXRoLmltdWwoQyxYKXwwLGk9aStNYXRoLmltdWwoTSxHKXwwLHI9KHI9citNYXRoLmltdWwoTSxKKXwwKStNYXRoLmltdWwoUyxHKXwwLG89bytNYXRoLmltdWwoUyxKKXwwLGk9aStNYXRoLmltdWwoXyxRKXwwLHI9KHI9citNYXRoLmltdWwoXyx0dCl8MCkrTWF0aC5pbXVsKHcsUSl8MCxvPW8rTWF0aC5pbXVsKHcsdHQpfDAsaT1pK01hdGguaW11bCh2LG50KXwwLHI9KHI9citNYXRoLmltdWwodixpdCl8MCkrTWF0aC5pbXVsKGIsbnQpfDAsbz1vK01hdGguaW11bChiLGl0KXwwLGk9aStNYXRoLmltdWwocCxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKHAsc3QpfDApK01hdGguaW11bChtLG90KXwwLG89bytNYXRoLmltdWwobSxzdCl8MDt2YXIgTXQ9KGMrKGk9aStNYXRoLmltdWwobCx1dCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKGwsY3QpfDApK01hdGguaW11bChkLHV0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKGQsY3QpfDApKyhyPj4+MTMpfDApKyhNdD4+PjI2KXwwLE10Jj02NzEwODg2MyxpPU1hdGguaW11bChCLHEpLHI9KHI9TWF0aC5pbXVsKEIsSCkpK01hdGguaW11bChELHEpfDAsbz1NYXRoLmltdWwoRCxIKSxpPWkrTWF0aC5pbXVsKGosVil8MCxyPShyPXIrTWF0aC5pbXVsKGosVSl8MCkrTWF0aC5pbXVsKEksVil8MCxvPW8rTWF0aC5pbXVsKEksVSl8MCxpPWkrTWF0aC5pbXVsKE8sWSl8MCxyPShyPXIrTWF0aC5pbXVsKE8sWCl8MCkrTWF0aC5pbXVsKFAsWSl8MCxvPW8rTWF0aC5pbXVsKFAsWCl8MCxpPWkrTWF0aC5pbXVsKEEsRyl8MCxyPShyPXIrTWF0aC5pbXVsKEEsSil8MCkrTWF0aC5pbXVsKEMsRyl8MCxvPW8rTWF0aC5pbXVsKEMsSil8MCxpPWkrTWF0aC5pbXVsKE0sUSl8MCxyPShyPXIrTWF0aC5pbXVsKE0sdHQpfDApK01hdGguaW11bChTLFEpfDAsbz1vK01hdGguaW11bChTLHR0KXwwLGk9aStNYXRoLmltdWwoXyxudCl8MCxyPShyPXIrTWF0aC5pbXVsKF8saXQpfDApK01hdGguaW11bCh3LG50KXwwLG89bytNYXRoLmltdWwodyxpdCl8MCxpPWkrTWF0aC5pbXVsKHYsb3QpfDAscj0ocj1yK01hdGguaW11bCh2LHN0KXwwKStNYXRoLmltdWwoYixvdCl8MCxvPW8rTWF0aC5pbXVsKGIsc3QpfDAsaT1pK01hdGguaW11bChwLHV0KXwwLHI9KHI9citNYXRoLmltdWwocCxjdCl8MCkrTWF0aC5pbXVsKG0sdXQpfDAsbz1vK01hdGguaW11bChtLGN0KXwwO3ZhciBTdD0oYysoaT1pK01hdGguaW11bChsLGx0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxkdCl8MCkrTWF0aC5pbXVsKGQsbHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxkdCl8MCkrKHI+Pj4xMyl8MCkrKFN0Pj4+MjYpfDAsU3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHoscSkscj0ocj1NYXRoLmltdWwoeixIKSkrTWF0aC5pbXVsKE4scSl8MCxvPU1hdGguaW11bChOLEgpLGk9aStNYXRoLmltdWwoQixWKXwwLHI9KHI9citNYXRoLmltdWwoQixVKXwwKStNYXRoLmltdWwoRCxWKXwwLG89bytNYXRoLmltdWwoRCxVKXwwLGk9aStNYXRoLmltdWwoaixZKXwwLHI9KHI9citNYXRoLmltdWwoaixYKXwwKStNYXRoLmltdWwoSSxZKXwwLG89bytNYXRoLmltdWwoSSxYKXwwLGk9aStNYXRoLmltdWwoTyxHKXwwLHI9KHI9citNYXRoLmltdWwoTyxKKXwwKStNYXRoLmltdWwoUCxHKXwwLG89bytNYXRoLmltdWwoUCxKKXwwLGk9aStNYXRoLmltdWwoQSxRKXwwLHI9KHI9citNYXRoLmltdWwoQSx0dCl8MCkrTWF0aC5pbXVsKEMsUSl8MCxvPW8rTWF0aC5pbXVsKEMsdHQpfDAsaT1pK01hdGguaW11bChNLG50KXwwLHI9KHI9citNYXRoLmltdWwoTSxpdCl8MCkrTWF0aC5pbXVsKFMsbnQpfDAsbz1vK01hdGguaW11bChTLGl0KXwwLGk9aStNYXRoLmltdWwoXyxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKF8sc3QpfDApK01hdGguaW11bCh3LG90KXwwLG89bytNYXRoLmltdWwodyxzdCl8MCxpPWkrTWF0aC5pbXVsKHYsdXQpfDAscj0ocj1yK01hdGguaW11bCh2LGN0KXwwKStNYXRoLmltdWwoYix1dCl8MCxvPW8rTWF0aC5pbXVsKGIsY3QpfDAsaT1pK01hdGguaW11bChwLGx0KXwwLHI9KHI9citNYXRoLmltdWwocCxkdCl8MCkrTWF0aC5pbXVsKG0sbHQpfDAsbz1vK01hdGguaW11bChtLGR0KXwwO3ZhciBFdD0oYysoaT1pK01hdGguaW11bChsLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwobCxtdCl8MCkrTWF0aC5pbXVsKGQscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoZCxtdCl8MCkrKHI+Pj4xMyl8MCkrKEV0Pj4+MjYpfDAsRXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosVikscj0ocj1NYXRoLmltdWwoeixVKSkrTWF0aC5pbXVsKE4sVil8MCxvPU1hdGguaW11bChOLFUpLGk9aStNYXRoLmltdWwoQixZKXwwLHI9KHI9citNYXRoLmltdWwoQixYKXwwKStNYXRoLmltdWwoRCxZKXwwLG89bytNYXRoLmltdWwoRCxYKXwwLGk9aStNYXRoLmltdWwoaixHKXwwLHI9KHI9citNYXRoLmltdWwoaixKKXwwKStNYXRoLmltdWwoSSxHKXwwLG89bytNYXRoLmltdWwoSSxKKXwwLGk9aStNYXRoLmltdWwoTyxRKXwwLHI9KHI9citNYXRoLmltdWwoTyx0dCl8MCkrTWF0aC5pbXVsKFAsUSl8MCxvPW8rTWF0aC5pbXVsKFAsdHQpfDAsaT1pK01hdGguaW11bChBLG50KXwwLHI9KHI9citNYXRoLmltdWwoQSxpdCl8MCkrTWF0aC5pbXVsKEMsbnQpfDAsbz1vK01hdGguaW11bChDLGl0KXwwLGk9aStNYXRoLmltdWwoTSxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKE0sc3QpfDApK01hdGguaW11bChTLG90KXwwLG89bytNYXRoLmltdWwoUyxzdCl8MCxpPWkrTWF0aC5pbXVsKF8sdXQpfDAscj0ocj1yK01hdGguaW11bChfLGN0KXwwKStNYXRoLmltdWwodyx1dCl8MCxvPW8rTWF0aC5pbXVsKHcsY3QpfDAsaT1pK01hdGguaW11bCh2LGx0KXwwLHI9KHI9citNYXRoLmltdWwodixkdCl8MCkrTWF0aC5pbXVsKGIsbHQpfDAsbz1vK01hdGguaW11bChiLGR0KXwwO3ZhciBBdD0oYysoaT1pK01hdGguaW11bChwLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwocCxtdCl8MCkrTWF0aC5pbXVsKG0scHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwobSxtdCl8MCkrKHI+Pj4xMyl8MCkrKEF0Pj4+MjYpfDAsQXQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosWSkscj0ocj1NYXRoLmltdWwoeixYKSkrTWF0aC5pbXVsKE4sWSl8MCxvPU1hdGguaW11bChOLFgpLGk9aStNYXRoLmltdWwoQixHKXwwLHI9KHI9citNYXRoLmltdWwoQixKKXwwKStNYXRoLmltdWwoRCxHKXwwLG89bytNYXRoLmltdWwoRCxKKXwwLGk9aStNYXRoLmltdWwoaixRKXwwLHI9KHI9citNYXRoLmltdWwoaix0dCl8MCkrTWF0aC5pbXVsKEksUSl8MCxvPW8rTWF0aC5pbXVsKEksdHQpfDAsaT1pK01hdGguaW11bChPLG50KXwwLHI9KHI9citNYXRoLmltdWwoTyxpdCl8MCkrTWF0aC5pbXVsKFAsbnQpfDAsbz1vK01hdGguaW11bChQLGl0KXwwLGk9aStNYXRoLmltdWwoQSxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKEEsc3QpfDApK01hdGguaW11bChDLG90KXwwLG89bytNYXRoLmltdWwoQyxzdCl8MCxpPWkrTWF0aC5pbXVsKE0sdXQpfDAscj0ocj1yK01hdGguaW11bChNLGN0KXwwKStNYXRoLmltdWwoUyx1dCl8MCxvPW8rTWF0aC5pbXVsKFMsY3QpfDAsaT1pK01hdGguaW11bChfLGx0KXwwLHI9KHI9citNYXRoLmltdWwoXyxkdCl8MCkrTWF0aC5pbXVsKHcsbHQpfDAsbz1vK01hdGguaW11bCh3LGR0KXwwO3ZhciBDdD0oYysoaT1pK01hdGguaW11bCh2LHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwodixtdCl8MCkrTWF0aC5pbXVsKGIscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoYixtdCl8MCkrKHI+Pj4xMyl8MCkrKEN0Pj4+MjYpfDAsQ3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosRykscj0ocj1NYXRoLmltdWwoeixKKSkrTWF0aC5pbXVsKE4sRyl8MCxvPU1hdGguaW11bChOLEopLGk9aStNYXRoLmltdWwoQixRKXwwLHI9KHI9citNYXRoLmltdWwoQix0dCl8MCkrTWF0aC5pbXVsKEQsUSl8MCxvPW8rTWF0aC5pbXVsKEQsdHQpfDAsaT1pK01hdGguaW11bChqLG50KXwwLHI9KHI9citNYXRoLmltdWwoaixpdCl8MCkrTWF0aC5pbXVsKEksbnQpfDAsbz1vK01hdGguaW11bChJLGl0KXwwLGk9aStNYXRoLmltdWwoTyxvdCl8MCxyPShyPXIrTWF0aC5pbXVsKE8sc3QpfDApK01hdGguaW11bChQLG90KXwwLG89bytNYXRoLmltdWwoUCxzdCl8MCxpPWkrTWF0aC5pbXVsKEEsdXQpfDAscj0ocj1yK01hdGguaW11bChBLGN0KXwwKStNYXRoLmltdWwoQyx1dCl8MCxvPW8rTWF0aC5pbXVsKEMsY3QpfDAsaT1pK01hdGguaW11bChNLGx0KXwwLHI9KHI9citNYXRoLmltdWwoTSxkdCl8MCkrTWF0aC5pbXVsKFMsbHQpfDAsbz1vK01hdGguaW11bChTLGR0KXwwO3ZhciBrdD0oYysoaT1pK01hdGguaW11bChfLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoXyxtdCl8MCkrTWF0aC5pbXVsKHcscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwodyxtdCl8MCkrKHI+Pj4xMyl8MCkrKGt0Pj4+MjYpfDAsa3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosUSkscj0ocj1NYXRoLmltdWwoeix0dCkpK01hdGguaW11bChOLFEpfDAsbz1NYXRoLmltdWwoTix0dCksaT1pK01hdGguaW11bChCLG50KXwwLHI9KHI9citNYXRoLmltdWwoQixpdCl8MCkrTWF0aC5pbXVsKEQsbnQpfDAsbz1vK01hdGguaW11bChELGl0KXwwLGk9aStNYXRoLmltdWwoaixvdCl8MCxyPShyPXIrTWF0aC5pbXVsKGosc3QpfDApK01hdGguaW11bChJLG90KXwwLG89bytNYXRoLmltdWwoSSxzdCl8MCxpPWkrTWF0aC5pbXVsKE8sdXQpfDAscj0ocj1yK01hdGguaW11bChPLGN0KXwwKStNYXRoLmltdWwoUCx1dCl8MCxvPW8rTWF0aC5pbXVsKFAsY3QpfDAsaT1pK01hdGguaW11bChBLGx0KXwwLHI9KHI9citNYXRoLmltdWwoQSxkdCl8MCkrTWF0aC5pbXVsKEMsbHQpfDAsbz1vK01hdGguaW11bChDLGR0KXwwO3ZhciBPdD0oYysoaT1pK01hdGguaW11bChNLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoTSxtdCl8MCkrTWF0aC5pbXVsKFMscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoUyxtdCl8MCkrKHI+Pj4xMyl8MCkrKE90Pj4+MjYpfDAsT3QmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosbnQpLHI9KHI9TWF0aC5pbXVsKHosaXQpKStNYXRoLmltdWwoTixudCl8MCxvPU1hdGguaW11bChOLGl0KSxpPWkrTWF0aC5pbXVsKEIsb3QpfDAscj0ocj1yK01hdGguaW11bChCLHN0KXwwKStNYXRoLmltdWwoRCxvdCl8MCxvPW8rTWF0aC5pbXVsKEQsc3QpfDAsaT1pK01hdGguaW11bChqLHV0KXwwLHI9KHI9citNYXRoLmltdWwoaixjdCl8MCkrTWF0aC5pbXVsKEksdXQpfDAsbz1vK01hdGguaW11bChJLGN0KXwwLGk9aStNYXRoLmltdWwoTyxsdCl8MCxyPShyPXIrTWF0aC5pbXVsKE8sZHQpfDApK01hdGguaW11bChQLGx0KXwwLG89bytNYXRoLmltdWwoUCxkdCl8MDt2YXIgUHQ9KGMrKGk9aStNYXRoLmltdWwoQSxwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKEEsbXQpfDApK01hdGguaW11bChDLHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKEMsbXQpfDApKyhyPj4+MTMpfDApKyhQdD4+PjI2KXwwLFB0Jj02NzEwODg2MyxpPU1hdGguaW11bCh6LG90KSxyPShyPU1hdGguaW11bCh6LHN0KSkrTWF0aC5pbXVsKE4sb3QpfDAsbz1NYXRoLmltdWwoTixzdCksaT1pK01hdGguaW11bChCLHV0KXwwLHI9KHI9citNYXRoLmltdWwoQixjdCl8MCkrTWF0aC5pbXVsKEQsdXQpfDAsbz1vK01hdGguaW11bChELGN0KXwwLGk9aStNYXRoLmltdWwoaixsdCl8MCxyPShyPXIrTWF0aC5pbXVsKGosZHQpfDApK01hdGguaW11bChJLGx0KXwwLG89bytNYXRoLmltdWwoSSxkdCl8MDt2YXIgVHQ9KGMrKGk9aStNYXRoLmltdWwoTyxwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKE8sbXQpfDApK01hdGguaW11bChQLHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKFAsbXQpfDApKyhyPj4+MTMpfDApKyhUdD4+PjI2KXwwLFR0Jj02NzEwODg2MyxpPU1hdGguaW11bCh6LHV0KSxyPShyPU1hdGguaW11bCh6LGN0KSkrTWF0aC5pbXVsKE4sdXQpfDAsbz1NYXRoLmltdWwoTixjdCksaT1pK01hdGguaW11bChCLGx0KXwwLHI9KHI9citNYXRoLmltdWwoQixkdCl8MCkrTWF0aC5pbXVsKEQsbHQpfDAsbz1vK01hdGguaW11bChELGR0KXwwO3ZhciBqdD0oYysoaT1pK01hdGguaW11bChqLHB0KXwwKXwwKSsoKDgxOTEmKHI9KHI9citNYXRoLmltdWwoaixtdCl8MCkrTWF0aC5pbXVsKEkscHQpfDApKTw8MTMpfDA7Yz0oKG89bytNYXRoLmltdWwoSSxtdCl8MCkrKHI+Pj4xMyl8MCkrKGp0Pj4+MjYpfDAsanQmPTY3MTA4ODYzLGk9TWF0aC5pbXVsKHosbHQpLHI9KHI9TWF0aC5pbXVsKHosZHQpKStNYXRoLmltdWwoTixsdCl8MCxvPU1hdGguaW11bChOLGR0KTt2YXIgSXQ9KGMrKGk9aStNYXRoLmltdWwoQixwdCl8MCl8MCkrKCg4MTkxJihyPShyPXIrTWF0aC5pbXVsKEIsbXQpfDApK01hdGguaW11bChELHB0KXwwKSk8PDEzKXwwO2M9KChvPW8rTWF0aC5pbXVsKEQsbXQpfDApKyhyPj4+MTMpfDApKyhJdD4+PjI2KXwwLEl0Jj02NzEwODg2Mzt2YXIgTHQ9KGMrKGk9TWF0aC5pbXVsKHoscHQpKXwwKSsoKDgxOTEmKHI9KHI9TWF0aC5pbXVsKHosbXQpKStNYXRoLmltdWwoTixwdCl8MCkpPDwxMyl8MDtyZXR1cm4gYz0oKG89TWF0aC5pbXVsKE4sbXQpKSsocj4+PjEzKXwwKSsoTHQ+Pj4yNil8MCxMdCY9NjcxMDg4NjMsdVswXT1ndCx1WzFdPXZ0LHVbMl09YnQsdVszXT15dCx1WzRdPV90LHVbNV09d3QsdVs2XT14dCx1WzddPU10LHVbOF09U3QsdVs5XT1FdCx1WzEwXT1BdCx1WzExXT1DdCx1WzEyXT1rdCx1WzEzXT1PdCx1WzE0XT1QdCx1WzE1XT1UdCx1WzE2XT1qdCx1WzE3XT1JdCx1WzE4XT1MdCwwIT09YyYmKHVbMTldPWMsbi5sZW5ndGgrKyksbn07ZnVuY3Rpb24gcCh0LGUsbil7cmV0dXJuKG5ldyBtKS5tdWxwKHQsZSxuKX1mdW5jdGlvbiBtKHQsZSl7dGhpcy54PXQsdGhpcy55PWV9TWF0aC5pbXVsfHwoZj1kKSxvLnByb3RvdHlwZS5tdWxUbz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubGVuZ3RoK3QubGVuZ3RoO3JldHVybiAxMD09PXRoaXMubGVuZ3RoJiYxMD09PXQubGVuZ3RoP2YodGhpcyx0LGUpOm48NjM/ZCh0aGlzLHQsZSk6bjwxMDI0P2Z1bmN0aW9uKHQsZSxuKXtuLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZSxuLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aDtmb3IodmFyIGk9MCxyPTAsbz0wO288bi5sZW5ndGgtMTtvKyspe3ZhciBzPXI7cj0wO2Zvcih2YXIgYT02NzEwODg2MyZpLHU9TWF0aC5taW4obyxlLmxlbmd0aC0xKSxjPU1hdGgubWF4KDAsby10Lmxlbmd0aCsxKTtjPD11O2MrKyl7dmFyIGg9by1jLGw9KDB8dC53b3Jkc1toXSkqKDB8ZS53b3Jkc1tjXSksZD02NzEwODg2MyZsO2E9NjcxMDg4NjMmKGQ9ZCthfDApLHIrPShzPShzPXMrKGwvNjcxMDg4NjR8MCl8MCkrKGQ+Pj4yNil8MCk+Pj4yNixzJj02NzEwODg2M31uLndvcmRzW29dPWEsaT1zLHM9cn1yZXR1cm4gMCE9PWk/bi53b3Jkc1tvXT1pOm4ubGVuZ3RoLS0sbi5zdHJpcCgpfSh0aGlzLHQsZSk6cCh0aGlzLHQsZSl9LG0ucHJvdG90eXBlLm1ha2VSQlQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxuPW8ucHJvdG90eXBlLl9jb3VudEJpdHModCktMSxpPTA7aTx0O2krKyllW2ldPXRoaXMucmV2QmluKGksbix0KTtyZXR1cm4gZX0sbS5wcm90b3R5cGUucmV2QmluPWZ1bmN0aW9uKHQsZSxuKXtpZigwPT09dHx8dD09PW4tMSlyZXR1cm4gdDtmb3IodmFyIGk9MCxyPTA7cjxlO3IrKylpfD0oMSZ0KTw8ZS1yLTEsdD4+PTE7cmV0dXJuIGl9LG0ucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLG4saSxyLG8pe2Zvcih2YXIgcz0wO3M8bztzKyspaVtzXT1lW3Rbc11dLHJbc109blt0W3NdXX0sbS5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLnBlcm11dGUobyx0LGUsbixpLHIpO2Zvcih2YXIgcz0xO3M8cjtzPDw9MSlmb3IodmFyIGE9czw8MSx1PU1hdGguY29zKDIqTWF0aC5QSS9hKSxjPU1hdGguc2luKDIqTWF0aC5QSS9hKSxoPTA7aDxyO2grPWEpZm9yKHZhciBsPXUsZD1jLGY9MDtmPHM7ZisrKXt2YXIgcD1uW2grZl0sbT1pW2grZl0sZz1uW2grZitzXSx2PWlbaCtmK3NdLGI9bCpnLWQqdjt2PWwqditkKmcsZz1iLG5baCtmXT1wK2csaVtoK2ZdPW0rdixuW2grZitzXT1wLWcsaVtoK2Yrc109bS12LGYhPT1hJiYoYj11KmwtYypkLGQ9dSpkK2MqbCxsPWIpfX0sbS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2I9ZnVuY3Rpb24odCxlKXt2YXIgbj0xfE1hdGgubWF4KGUsdCksaT0xJm4scj0wO2ZvcihuPW4vMnwwO247bj4+Pj0xKXIrKztyZXR1cm4gMTw8cisxK2l9LG0ucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbih0LGUsbil7aWYoIShuPD0xKSlmb3IodmFyIGk9MDtpPG4vMjtpKyspe3ZhciByPXRbaV07dFtpXT10W24taS0xXSx0W24taS0xXT1yLHI9ZVtpXSxlW2ldPS1lW24taS0xXSxlW24taS0xXT0tcn19LG0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9MDtpPGUvMjtpKyspe3ZhciByPTgxOTIqTWF0aC5yb3VuZCh0WzIqaSsxXS9lKStNYXRoLnJvdW5kKHRbMippXS9lKStuO3RbaV09NjcxMDg4NjMmcixuPXI8NjcxMDg4NjQ/MDpyLzY3MTA4ODY0fDB9cmV0dXJuIHR9LG0ucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBvPTAscz0wO3M8ZTtzKyspbys9MHx0W3NdLG5bMipzXT04MTkxJm8sbz4+Pj0xMyxuWzIqcysxXT04MTkxJm8sbz4+Pj0xMztmb3Iocz0yKmU7czxyOysrcyluW3NdPTA7aSgwPT09byksaSgwPT0oLTgxOTImbykpfSxtLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT0wO3JldHVybiBlfSxtLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0yKnRoaXMuZ3Vlc3NMZW4xM2IodC5sZW5ndGgsZS5sZW5ndGgpLHI9dGhpcy5tYWtlUkJUKGkpLG89dGhpcy5zdHViKGkpLHM9bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGM9bmV3IEFycmF5KGkpLGg9bmV3IEFycmF5KGkpLGw9bmV3IEFycmF5KGkpLGQ9bi53b3JkcztkLmxlbmd0aD1pLHRoaXMuY29udmVydDEzYih0LndvcmRzLHQubGVuZ3RoLHMsaSksdGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsYyxpKSx0aGlzLnRyYW5zZm9ybShzLG8sYSx1LGksciksdGhpcy50cmFuc2Zvcm0oYyxvLGgsbCxpLHIpO2Zvcih2YXIgZj0wO2Y8aTtmKyspe3ZhciBwPWFbZl0qaFtmXS11W2ZdKmxbZl07dVtmXT1hW2ZdKmxbZl0rdVtmXSpoW2ZdLGFbZl09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUoYSx1LGkpLHRoaXMudHJhbnNmb3JtKGEsdSxkLG8saSxyKSx0aGlzLmNvbmp1Z2F0ZShkLG8saSksdGhpcy5ub3JtYWxpemUxM2IoZCxpKSxuLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxuLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxuLnN0cmlwKCl9LG8ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sby5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHAodGhpcyx0LGUpfSxvLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sby5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCk7Zm9yKHZhciBlPTAsbj0wO248dGhpcy5sZW5ndGg7bisrKXt2YXIgcj0oMHx0aGlzLndvcmRzW25dKSp0LG89KDY3MTA4ODYzJnIpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9ci82NzEwODg2NHwwLGUrPW8+Pj4yNix0aGlzLndvcmRzW25dPTY3MTA4ODYzJm99cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tuXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LG8ucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0sby5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxvLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpfSxvLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LmJpdExlbmd0aCgpKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPW4vMjZ8MCxyPW4lMjY7ZVtuXT0odC53b3Jkc1tpXSYxPDxyKT4+PnJ9cmV0dXJuIGV9KHQpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbmV3IG8oMSk7Zm9yKHZhciBuPXRoaXMsaT0wO2k8ZS5sZW5ndGgmJjA9PT1lW2ldO2krKyxuPW4uc3FyKCkpO2lmKCsraTxlLmxlbmd0aClmb3IodmFyIHI9bi5zcXIoKTtpPGUubGVuZ3RoO2krKyxyPXIuc3FyKCkpMCE9PWVbaV0mJihuPW4ubXVsKHIpKTtyZXR1cm4gbn0sby5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uKHQpe2koIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZSxuPXQlMjYscj0odC1uKS8yNixvPTY3MTA4ODYzPj4+MjYtbjw8MjYtbjtpZigwIT09bil7dmFyIHM9MDtmb3IoZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgYT10aGlzLndvcmRzW2VdJm8sdT0oMHx0aGlzLndvcmRzW2VdKS1hPDxuO3RoaXMud29yZHNbZV09dXxzLHM9YT4+PjI2LW59cyYmKHRoaXMud29yZHNbZV09cyx0aGlzLmxlbmd0aCsrKX1pZigwIT09cil7Zm9yKGU9dGhpcy5sZW5ndGgtMTtlPj0wO2UtLSl0aGlzLndvcmRzW2Urcl09dGhpcy53b3Jkc1tlXTtmb3IoZT0wO2U8cjtlKyspdGhpcy53b3Jkc1tlXT0wO3RoaXMubGVuZ3RoKz1yfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlzaGxuPWZ1bmN0aW9uKHQpe3JldHVybiBpKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hsbih0KX0sby5wcm90b3R5cGUuaXVzaHJuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCkscj1lPyhlLWUlMjYpLzI2OjA7dmFyIG89dCUyNixzPU1hdGgubWluKCh0LW8pLzI2LHRoaXMubGVuZ3RoKSxhPTY3MTA4ODYzXjY3MTA4ODYzPj4+bzw8byx1PW47aWYoci09cyxyPU1hdGgubWF4KDAsciksdSl7Zm9yKHZhciBjPTA7YzxzO2MrKyl1LndvcmRzW2NdPXRoaXMud29yZHNbY107dS5sZW5ndGg9c31pZigwPT09cyk7ZWxzZSBpZih0aGlzLmxlbmd0aD5zKWZvcih0aGlzLmxlbmd0aC09cyxjPTA7Yzx0aGlzLmxlbmd0aDtjKyspdGhpcy53b3Jkc1tjXT10aGlzLndvcmRzW2Mrc107ZWxzZSB0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MTt2YXIgaD0wO2ZvcihjPXRoaXMubGVuZ3RoLTE7Yz49MCYmKDAhPT1ofHxjPj1yKTtjLS0pe3ZhciBsPTB8dGhpcy53b3Jkc1tjXTt0aGlzLndvcmRzW2NdPWg8PDI2LW98bD4+Pm8saD1sJmF9cmV0dXJuIHUmJjAhPT1oJiYodS53b3Jkc1t1Lmxlbmd0aCsrXT1oKSwwPT09dGhpcy5sZW5ndGgmJih0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pc2hybj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkoMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaHJuKHQsZSxuKX0sby5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKHQpfSxvLnByb3RvdHlwZS51c2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbih0KX0sby5wcm90b3R5cGUuc2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKHQpfSxvLnByb3RvdHlwZS51c2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybih0KX0sby5wcm90b3R5cGUudGVzdG49ZnVuY3Rpb24odCl7aSgibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYsbj0odC1lKS8yNixyPTE8PGU7cmV0dXJuISh0aGlzLmxlbmd0aDw9bikmJiEhKHRoaXMud29yZHNbbl0mcil9LG8ucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbih0KXtpKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2O2lmKGkoMD09PXRoaXMubmVnYXRpdmUsImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycyIpLHRoaXMubGVuZ3RoPD1uKXJldHVybiB0aGlzO2lmKDAhPT1lJiZuKyssdGhpcy5sZW5ndGg9TWF0aC5taW4obix0aGlzLmxlbmd0aCksMCE9PWUpe3ZhciByPTY3MTA4ODYzXjY3MTA4ODYzPj4+ZTw8ZTt0aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdJj1yfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm1hc2tuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKHQpfSxvLnByb3RvdHlwZS5pYWRkbj1mdW5jdGlvbih0KXtyZXR1cm4gaSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCksdDwwP3RoaXMuaXN1Ym4oLXQpOjAhPT10aGlzLm5lZ2F0aXZlPzE9PT10aGlzLmxlbmd0aCYmKDB8dGhpcy53b3Jkc1swXSk8dD8odGhpcy53b3Jkc1swXT10LSgwfHRoaXMud29yZHNbMF0pLHRoaXMubmVnYXRpdmU9MCx0aGlzKToodGhpcy5uZWdhdGl2ZT0wLHRoaXMuaXN1Ym4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXMpOnRoaXMuX2lhZGRuKHQpfSxvLnByb3RvdHlwZS5faWFkZG49ZnVuY3Rpb24odCl7dGhpcy53b3Jkc1swXSs9dDtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2VdPj02NzEwODg2NDtlKyspdGhpcy53b3Jkc1tlXS09NjcxMDg4NjQsZT09PXRoaXMubGVuZ3RoLTE/dGhpcy53b3Jkc1tlKzFdPTE6dGhpcy53b3Jkc1tlKzFdKys7cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLGUrMSksdGhpc30sby5wcm90b3R5cGUuaXN1Ym49ZnVuY3Rpb24odCl7aWYoaSgibnVtYmVyIj09dHlwZW9mIHQpLGkodDw2NzEwODg2NCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXM7aWYodGhpcy53b3Jkc1swXS09dCwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV08MDtlKyspdGhpcy53b3Jkc1tlXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tlKzFdLT0xO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbih0KX0sby5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHQpfSxvLnByb3RvdHlwZS5pYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKX0sby5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLHM9dC5sZW5ndGgrbjt0aGlzLl9leHBhbmQocyk7dmFyIGE9MDtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtvPSgwfHRoaXMud29yZHNbcituXSkrYTt2YXIgdT0oMHx0LndvcmRzW3JdKSplO2E9KChvLT02NzEwODg2MyZ1KT4+MjYpLSh1LzY3MTA4ODY0fDApLHRoaXMud29yZHNbcituXT02NzEwODg2MyZvfWZvcig7cjx0aGlzLmxlbmd0aC1uO3IrKylhPShvPSgwfHRoaXMud29yZHNbcituXSkrYSk+PjI2LHRoaXMud29yZHNbcituXT02NzEwODg2MyZvO2lmKDA9PT1hKXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKGkoLTE9PT1hKSxhPTAscj0wO3I8dGhpcy5sZW5ndGg7cisrKWE9KG89LSgwfHRoaXMud29yZHNbcl0pK2EpPj4yNix0aGlzLndvcmRzW3JdPTY3MTA4ODYzJm87cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uKHQsZSl7dmFyIG49KHRoaXMubGVuZ3RoLHQubGVuZ3RoKSxpPXRoaXMuY2xvbmUoKSxyPXQscz0wfHIud29yZHNbci5sZW5ndGgtMV07MCE9PShuPTI2LXRoaXMuX2NvdW50Qml0cyhzKSkmJihyPXIudXNobG4obiksaS5pdXNobG4obikscz0wfHIud29yZHNbci5sZW5ndGgtMV0pO3ZhciBhLHU9aS5sZW5ndGgtci5sZW5ndGg7aWYoIm1vZCIhPT1lKXsoYT1uZXcgbyhudWxsKSkubGVuZ3RoPXUrMSxhLndvcmRzPW5ldyBBcnJheShhLmxlbmd0aCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYS53b3Jkc1tjXT0wfXZhciBoPWkuY2xvbmUoKS5faXNobG5zdWJtdWwociwxLHUpOzA9PT1oLm5lZ2F0aXZlJiYoaT1oLGEmJihhLndvcmRzW3VdPTEpKTtmb3IodmFyIGw9dS0xO2w+PTA7bC0tKXt2YXIgZD02NzEwODg2NCooMHxpLndvcmRzW3IubGVuZ3RoK2xdKSsoMHxpLndvcmRzW3IubGVuZ3RoK2wtMV0pO2ZvcihkPU1hdGgubWluKGQvc3wwLDY3MTA4ODYzKSxpLl9pc2hsbnN1Ym11bChyLGQsbCk7MCE9PWkubmVnYXRpdmU7KWQtLSxpLm5lZ2F0aXZlPTAsaS5faXNobG5zdWJtdWwociwxLGwpLGkuaXNaZXJvKCl8fChpLm5lZ2F0aXZlXj0xKTthJiYoYS53b3Jkc1tsXT1kKX1yZXR1cm4gYSYmYS5zdHJpcCgpLGkuc3RyaXAoKSwiZGl2IiE9PWUmJjAhPT1uJiZpLml1c2hybihuKSx7ZGl2OmF8fG51bGwsbW9kOml9fSxvLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpKCF0LmlzWmVybygpKSx0aGlzLmlzWmVybygpP3tkaXY6bmV3IG8oMCksbW9kOm5ldyBvKDApfTowIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmU/KGE9dGhpcy5uZWcoKS5kaXZtb2QodCxlKSwibW9kIiE9PWUmJihyPWEuZGl2Lm5lZygpKSwiZGl2IiE9PWUmJihzPWEubW9kLm5lZygpLG4mJjAhPT1zLm5lZ2F0aXZlJiZzLmlhZGQodCkpLHtkaXY6cixtb2Q6c30pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZT8oYT10aGlzLmRpdm1vZCh0Lm5lZygpLGUpLCJtb2QiIT09ZSYmKHI9YS5kaXYubmVnKCkpLHtkaXY6cixtb2Q6YS5tb2R9KTowIT0odGhpcy5uZWdhdGl2ZSZ0Lm5lZ2F0aXZlKT8oYT10aGlzLm5lZygpLmRpdm1vZCh0Lm5lZygpLGUpLCJkaXYiIT09ZSYmKHM9YS5tb2QubmVnKCksbiYmMCE9PXMubmVnYXRpdmUmJnMuaXN1Yih0KSkse2RpdjphLmRpdixtb2Q6c30pOnQubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcCh0KTwwP3tkaXY6bmV3IG8oMCksbW9kOnRoaXN9OjE9PT10Lmxlbmd0aD8iZGl2Ij09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OiJtb2QiPT09ZT97ZGl2Om51bGwsbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpuZXcgbyh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp0aGlzLl93b3JkRGl2KHQsZSk7dmFyIHIscyxhfSxvLnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsImRpdiIsITEpLmRpdn0sby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LCJtb2QiLCExKS5tb2R9LG8ucHJvdG90eXBlLnVtb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsIm1vZCIsITApLm1vZH0sby5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kaXZtb2QodCk7aWYoZS5tb2QuaXNaZXJvKCkpcmV0dXJuIGUuZGl2O3ZhciBuPTAhPT1lLmRpdi5uZWdhdGl2ZT9lLm1vZC5pc3ViKHQpOmUubW9kLGk9dC51c2hybigxKSxyPXQuYW5kbG4oMSksbz1uLmNtcChpKTtyZXR1cm4gbzwwfHwxPT09ciYmMD09PW8/ZS5kaXY6MCE9PWUuZGl2Lm5lZ2F0aXZlP2UuZGl2LmlzdWJuKDEpOmUuZGl2LmlhZGRuKDEpfSxvLnByb3RvdHlwZS5tb2RuPWZ1bmN0aW9uKHQpe2kodDw9NjcxMDg4NjMpO2Zvcih2YXIgZT0oMTw8MjYpJXQsbj0wLHI9dGhpcy5sZW5ndGgtMTtyPj0wO3ItLSluPShlKm4rKDB8dGhpcy53b3Jkc1tyXSkpJXQ7cmV0dXJuIG59LG8ucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uKHQpe2kodDw9NjcxMDg4NjMpO2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIHI9KDB8dGhpcy53b3Jkc1tuXSkrNjcxMDg4NjQqZTt0aGlzLndvcmRzW25dPXIvdHwwLGU9ciV0fXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bih0KX0sby5wcm90b3R5cGUuZWdjZD1mdW5jdGlvbih0KXtpKDA9PT10Lm5lZ2F0aXZlKSxpKCF0LmlzWmVybygpKTt2YXIgZT10aGlzLG49dC5jbG9uZSgpO2U9MCE9PWUubmVnYXRpdmU/ZS51bW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIHI9bmV3IG8oMSkscz1uZXcgbygwKSxhPW5ldyBvKDApLHU9bmV3IG8oMSksYz0wO2UuaXNFdmVuKCkmJm4uaXNFdmVuKCk7KWUuaXVzaHJuKDEpLG4uaXVzaHJuKDEpLCsrYztmb3IodmFyIGg9bi5jbG9uZSgpLGw9ZS5jbG9uZSgpOyFlLmlzWmVybygpOyl7Zm9yKHZhciBkPTAsZj0xOzA9PShlLndvcmRzWzBdJmYpJiZkPDI2OysrZCxmPDw9MSk7aWYoZD4wKWZvcihlLml1c2hybihkKTtkLS0gPjA7KShyLmlzT2RkKCl8fHMuaXNPZGQoKSkmJihyLmlhZGQoaCkscy5pc3ViKGwpKSxyLml1c2hybigxKSxzLml1c2hybigxKTtmb3IodmFyIHA9MCxtPTE7MD09KG4ud29yZHNbMF0mbSkmJnA8MjY7KytwLG08PD0xKTtpZihwPjApZm9yKG4uaXVzaHJuKHApO3AtLSA+MDspKGEuaXNPZGQoKXx8dS5pc09kZCgpKSYmKGEuaWFkZChoKSx1LmlzdWIobCkpLGEuaXVzaHJuKDEpLHUuaXVzaHJuKDEpO2UuY21wKG4pPj0wPyhlLmlzdWIobiksci5pc3ViKGEpLHMuaXN1Yih1KSk6KG4uaXN1YihlKSxhLmlzdWIociksdS5pc3ViKHMpKX1yZXR1cm57YTphLGI6dSxnY2Q6bi5pdXNobG4oYyl9fSxvLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7aSgwPT09dC5uZWdhdGl2ZSksaSghdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxuPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciByLHM9bmV3IG8oMSksYT1uZXcgbygwKSx1PW4uY2xvbmUoKTtlLmNtcG4oMSk+MCYmbi5jbXBuKDEpPjA7KXtmb3IodmFyIGM9MCxoPTE7MD09KGUud29yZHNbMF0maCkmJmM8MjY7KytjLGg8PD0xKTtpZihjPjApZm9yKGUuaXVzaHJuKGMpO2MtLSA+MDspcy5pc09kZCgpJiZzLmlhZGQodSkscy5pdXNocm4oMSk7Zm9yKHZhciBsPTAsZD0xOzA9PShuLndvcmRzWzBdJmQpJiZsPDI2OysrbCxkPDw9MSk7aWYobD4wKWZvcihuLml1c2hybihsKTtsLS0gPjA7KWEuaXNPZGQoKSYmYS5pYWRkKHUpLGEuaXVzaHJuKDEpO2UuY21wKG4pPj0wPyhlLmlzdWIobikscy5pc3ViKGEpKToobi5pc3ViKGUpLGEuaXN1YihzKSl9cmV0dXJuKHI9MD09PWUuY21wbigxKT9zOmEpLmNtcG4oMCk8MCYmci5pYWRkKHQpLHJ9LG8ucHJvdG90eXBlLmdjZD1mdW5jdGlvbih0KXtpZih0aGlzLmlzWmVybygpKXJldHVybiB0LmFicygpO2lmKHQuaXNaZXJvKCkpcmV0dXJuIHRoaXMuYWJzKCk7dmFyIGU9dGhpcy5jbG9uZSgpLG49dC5jbG9uZSgpO2UubmVnYXRpdmU9MCxuLm5lZ2F0aXZlPTA7Zm9yKHZhciBpPTA7ZS5pc0V2ZW4oKSYmbi5pc0V2ZW4oKTtpKyspZS5pdXNocm4oMSksbi5pdXNocm4oMSk7Zm9yKDs7KXtmb3IoO2UuaXNFdmVuKCk7KWUuaXVzaHJuKDEpO2Zvcig7bi5pc0V2ZW4oKTspbi5pdXNocm4oMSk7dmFyIHI9ZS5jbXAobik7aWYocjwwKXt2YXIgbz1lO2U9bixuPW99ZWxzZSBpZigwPT09cnx8MD09PW4uY21wbigxKSlicmVhaztlLmlzdWIobil9cmV0dXJuIG4uaXVzaGxuKGkpfSxvLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVnY2QodCkuYS51bW9kKHQpfSxvLnByb3RvdHlwZS5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09KDEmdGhpcy53b3Jkc1swXSl9LG8ucHJvdG90eXBlLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PSgxJnRoaXMud29yZHNbMF0pfSxvLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53b3Jkc1swXSZ0fSxvLnByb3RvdHlwZS5iaW5jbj1mdW5jdGlvbih0KXtpKCJudW1iZXIiPT10eXBlb2YgdCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LHI9MTw8ZTtpZih0aGlzLmxlbmd0aDw9bilyZXR1cm4gdGhpcy5fZXhwYW5kKG4rMSksdGhpcy53b3Jkc1tuXXw9cix0aGlzO2Zvcih2YXIgbz1yLHM9bjswIT09byYmczx0aGlzLmxlbmd0aDtzKyspe3ZhciBhPTB8dGhpcy53b3Jkc1tzXTtvPShhKz1vKT4+PjI2LGEmPTY3MTA4ODYzLHRoaXMud29yZHNbc109YX1yZXR1cm4gMCE9PW8mJih0aGlzLndvcmRzW3NdPW8sdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF19LG8ucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24odCl7dmFyIGUsbj10PDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFuKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZuKXJldHVybiAxO2lmKHRoaXMuc3RyaXAoKSx0aGlzLmxlbmd0aD4xKWU9MTtlbHNle24mJih0PS10KSxpKHQ8PTY3MTA4ODYzLCJOdW1iZXIgaXMgdG9vIGJpZyIpO3ZhciByPTB8dGhpcy53b3Jkc1swXTtlPXI9PT10PzA6cjx0Py0xOjF9cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sby5wcm90b3R5cGUuY21wPWZ1bmN0aW9uKHQpe2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIDE7dmFyIGU9dGhpcy51Y21wKHQpO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT8wfC1lOmV9LG8ucHJvdG90eXBlLnVjbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg+dC5sZW5ndGgpcmV0dXJuIDE7aWYodGhpcy5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLTE7Zm9yKHZhciBlPTAsbj10aGlzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgaT0wfHRoaXMud29yZHNbbl0scj0wfHQud29yZHNbbl07aWYoaSE9PXIpe2k8cj9lPS0xOmk+ciYmKGU9MSk7YnJlYWt9fXJldHVybiBlfSxvLnByb3RvdHlwZS5ndG49ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmd0PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dGhpcy5jbXAodCl9LG8ucHJvdG90eXBlLmd0ZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT49MH0sby5wcm90b3R5cGUuZ3RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KT49MH0sby5wcm90b3R5cGUubHRuPWZ1bmN0aW9uKHQpe3JldHVybi0xPT09dGhpcy5jbXBuKHQpfSxvLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4tMT09PXRoaXMuY21wKHQpfSxvLnByb3RvdHlwZS5sdGVuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcG4odCk8PTB9LG8ucHJvdG90eXBlLmx0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8PTB9LG8ucHJvdG90eXBlLmVxbj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wbih0KX0sby5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcCh0KX0sby5yZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHQpfSxvLnByb3RvdHlwZS50b1JlZD1mdW5jdGlvbih0KXtyZXR1cm4gaSghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSxpKDA9PT10aGlzLm5lZ2F0aXZlLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLHQuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5yZWQuY29udmVydEZyb20odGhpcyl9LG8ucHJvdG90eXBlLl9mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZWQ9dCx0aGlzfSxvLnByb3RvdHlwZS5mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gaSghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkLCJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuYWRkKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZElBZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaWFkZCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pc3ViKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNobD1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnNobCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRNdWw9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkLCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5pbXVsKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FyKHRoaXMpfSxvLnByb3RvdHlwZS5yZWRJU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5yZWQsInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiBpKHRoaXMucmVkLCJyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcnQodGhpcyl9LG8ucHJvdG90eXBlLnJlZEludm09ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pbnZtKHRoaXMpfSxvLnByb3RvdHlwZS5yZWROZWc9ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLnJlZCwicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0sby5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMucmVkJiYhdC5yZWQsInJlZFBvdyhub3JtYWxOdW0pIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsdCl9O3ZhciBnPXtrMjU2Om51bGwscDIyNDpudWxsLHAxOTI6bnVsbCxwMjU1MTk6bnVsbH07ZnVuY3Rpb24gdih0LGUpe3RoaXMubmFtZT10LHRoaXMucD1uZXcgbyhlLDE2KSx0aGlzLm49dGhpcy5wLmJpdExlbmd0aCgpLHRoaXMuaz1uZXcgbygxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksdGhpcy50bXA9dGhpcy5fdG1wKCl9ZnVuY3Rpb24gYigpe3YuY2FsbCh0aGlzLCJrMjU2IiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYiKX1mdW5jdGlvbiB5KCl7di5jYWxsKHRoaXMsInAyMjQiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpfWZ1bmN0aW9uIF8oKXt2LmNhbGwodGhpcywicDE5MiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIil9ZnVuY3Rpb24gdygpe3YuY2FsbCh0aGlzLCIyNTUxOSIsIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKX1mdW5jdGlvbiB4KHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9by5fcHJpbWUodCk7dGhpcy5tPWUucCx0aGlzLnByaW1lPWV9ZWxzZSBpKHQuZ3RuKDEpLCJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSx0aGlzLm09dCx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gTSh0KXt4LmNhbGwodGhpcyx0KSx0aGlzLnNoaWZ0PXRoaXMubS5iaXRMZW5ndGgoKSx0aGlzLnNoaWZ0JTI2IT0wJiYodGhpcy5zaGlmdCs9MjYtdGhpcy5zaGlmdCUyNiksdGhpcy5yPW5ldyBvKDEpLml1c2hsbih0aGlzLnNoaWZ0KSx0aGlzLnIyPXRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLHRoaXMucmludj10aGlzLnIuX2ludm1wKHRoaXMubSksdGhpcy5taW52PXRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5taW52LnVtb2QodGhpcy5yKSx0aGlzLm1pbnY9dGhpcy5yLnN1Yih0aGlzLm1pbnYpfXYucHJvdG90eXBlLl90bXA9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbyhudWxsKTtyZXR1cm4gdC53b3Jkcz1uZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubi8xMykpLHR9LHYucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIGUsbj10O2Rve3RoaXMuc3BsaXQobix0aGlzLnRtcCksZT0obj0obj10aGlzLmltdWxLKG4pKS5pYWRkKHRoaXMudG1wKSkuYml0TGVuZ3RoKCl9d2hpbGUoZT50aGlzLm4pO3ZhciBpPWU8dGhpcy5uPy0xOm4udWNtcCh0aGlzLnApO3JldHVybiAwPT09aT8obi53b3Jkc1swXT0wLG4ubGVuZ3RoPTEpOmk+MD9uLmlzdWIodGhpcy5wKTpuLnN0cmlwKCksbn0sdi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXt0Lml1c2hybih0aGlzLm4sMCxlKX0sdi5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW11bCh0aGlzLmspfSxyKGIsdiksYi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC5taW4odC5sZW5ndGgsOSksaT0wO2k8bjtpKyspZS53b3Jkc1tpXT10LndvcmRzW2ldO2lmKGUubGVuZ3RoPW4sdC5sZW5ndGg8PTkpcmV0dXJuIHQud29yZHNbMF09MCx2b2lkKHQubGVuZ3RoPTEpO3ZhciByPXQud29yZHNbOV07Zm9yKGUud29yZHNbZS5sZW5ndGgrK109NDE5NDMwMyZyLGk9MTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPTB8dC53b3Jkc1tpXTt0LndvcmRzW2ktMTBdPSg0MTk0MzAzJm8pPDw0fHI+Pj4yMixyPW99cj4+Pj0yMix0LndvcmRzW2ktMTBdPXIsMD09PXImJnQubGVuZ3RoPjEwP3QubGVuZ3RoLT0xMDp0Lmxlbmd0aC09OX0sYi5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7dC53b3Jkc1t0Lmxlbmd0aF09MCx0LndvcmRzW3QubGVuZ3RoKzFdPTAsdC5sZW5ndGgrPTI7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT0wfHQud29yZHNbbl07ZSs9OTc3KmksdC53b3Jkc1tuXT02NzEwODg2MyZlLGU9NjQqaSsoZS82NzEwODg2NHwwKX1yZXR1cm4gMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJih0Lmxlbmd0aC0tLDA9PT10LndvcmRzW3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aC0tKSx0fSxyKHksdikscihfLHYpLHIodyx2KSx3LnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPTE5KigwfHQud29yZHNbbl0pK2Uscj02NzEwODg2MyZpO2k+Pj49MjYsdC53b3Jkc1tuXT1yLGU9aX1yZXR1cm4gMCE9PWUmJih0LndvcmRzW3QubGVuZ3RoKytdPWUpLHR9LG8uX3ByaW1lPWZ1bmN0aW9uKHQpe2lmKGdbdF0pcmV0dXJuIGdbdF07dmFyIGU7aWYoImsyNTYiPT09dCllPW5ldyBiO2Vsc2UgaWYoInAyMjQiPT09dCllPW5ldyB5O2Vsc2UgaWYoInAxOTIiPT09dCllPW5ldyBfO2Vsc2V7aWYoInAyNTUxOSIhPT10KXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK3QpO2U9bmV3IHd9cmV0dXJuIGdbdF09ZSxlfSx4LnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbih0KXtpKDA9PT10Lm5lZ2F0aXZlLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGkodC5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0seC5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24odCxlKXtpKDA9PSh0Lm5lZ2F0aXZlfGUubmVnYXRpdmUpLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGkodC5yZWQmJnQucmVkPT09ZS5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0seC5wcm90b3R5cGUuaW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UodCkuX2ZvcmNlUmVkKHRoaXMpOnQudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzWmVybygpP3QuY2xvbmUoKTp0aGlzLm0uc3ViKHQpLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciBuPXQuYWRkKGUpO3JldHVybiBuLmNtcCh0aGlzLm0pPj0wJiZuLmlzdWIodGhpcy5tKSxuLl9mb3JjZVJlZCh0aGlzKX0seC5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgbj10LmlhZGQoZSk7cmV0dXJuIG4uY21wKHRoaXMubSk+PTAmJm4uaXN1Yih0aGlzLm0pLG59LHgucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgbj10LnN1YihlKTtyZXR1cm4gbi5jbXBuKDApPDAmJm4uaWFkZCh0aGlzLm0pLG4uX2ZvcmNlUmVkKHRoaXMpfSx4LnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciBuPXQuaXN1YihlKTtyZXR1cm4gbi5jbXBuKDApPDAmJm4uaWFkZCh0aGlzLm0pLG59LHgucHJvdG90eXBlLnNobD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkxKHQpLHRoaXMuaW1vZCh0LnVzaGxuKGUpKX0seC5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQuaW11bChlKSl9LHgucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQubXVsKGUpKX0seC5wcm90b3R5cGUuaXNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbXVsKHQsdC5jbG9uZSgpKX0seC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm11bCh0LHQpfSx4LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKHQpe2lmKHQuaXNaZXJvKCkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT10aGlzLm0uYW5kbG4oMyk7aWYoaShlJTI9PTEpLDM9PT1lKXt2YXIgbj10aGlzLm0uYWRkKG5ldyBvKDEpKS5pdXNocm4oMik7cmV0dXJuIHRoaXMucG93KHQsbil9Zm9yKHZhciByPXRoaXMubS5zdWJuKDEpLHM9MDshci5pc1plcm8oKSYmMD09PXIuYW5kbG4oMSk7KXMrKyxyLml1c2hybigxKTtpKCFyLmlzWmVybygpKTt2YXIgYT1uZXcgbygxKS50b1JlZCh0aGlzKSx1PWEucmVkTmVnKCksYz10aGlzLm0uc3VibigxKS5pdXNocm4oMSksaD10aGlzLm0uYml0TGVuZ3RoKCk7Zm9yKGg9bmV3IG8oMipoKmgpLnRvUmVkKHRoaXMpOzAhPT10aGlzLnBvdyhoLGMpLmNtcCh1KTspaC5yZWRJQWRkKHUpO2Zvcih2YXIgbD10aGlzLnBvdyhoLHIpLGQ9dGhpcy5wb3codCxyLmFkZG4oMSkuaXVzaHJuKDEpKSxmPXRoaXMucG93KHQscikscD1zOzAhPT1mLmNtcChhKTspe2Zvcih2YXIgbT1mLGc9MDswIT09bS5jbXAoYSk7ZysrKW09bS5yZWRTcXIoKTtpKGc8cCk7dmFyIHY9dGhpcy5wb3cobCxuZXcgbygxKS5pdXNobG4ocC1nLTEpKTtkPWQucmVkTXVsKHYpLGw9di5yZWRTcXIoKSxmPWYucmVkTXVsKGwpLHA9Z31yZXR1cm4gZH0seC5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiAwIT09ZS5uZWdhdGl2ZT8oZS5uZWdhdGl2ZT0wLHRoaXMuaW1vZChlKS5yZWROZWcoKSk6dGhpcy5pbW9kKGUpfSx4LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCxlKXtpZihlLmlzWmVybygpKXJldHVybiBuZXcgbygxKS50b1JlZCh0aGlzKTtpZigwPT09ZS5jbXBuKDEpKXJldHVybiB0LmNsb25lKCk7dmFyIG49bmV3IEFycmF5KDE2KTtuWzBdPW5ldyBvKDEpLnRvUmVkKHRoaXMpLG5bMV09dDtmb3IodmFyIGk9MjtpPG4ubGVuZ3RoO2krKyluW2ldPXRoaXMubXVsKG5baS0xXSx0KTt2YXIgcj1uWzBdLHM9MCxhPTAsdT1lLmJpdExlbmd0aCgpJTI2O2ZvcigwPT09dSYmKHU9MjYpLGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciBjPWUud29yZHNbaV0saD11LTE7aD49MDtoLS0pe3ZhciBsPWM+PmgmMTtyIT09blswXSYmKHI9dGhpcy5zcXIocikpLDAhPT1sfHwwIT09cz8oczw8PTEsc3w9bCwoND09PSsrYXx8MD09PWkmJjA9PT1oKSYmKHI9dGhpcy5tdWwocixuW3NdKSxhPTAscz0wKSk6YT0wfXU9MjZ9cmV0dXJuIHJ9LHgucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXt2YXIgZT10LnVtb2QodGhpcy5tKTtyZXR1cm4gZT09PXQ/ZS5jbG9uZSgpOmV9LHgucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmUoKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxvLm1vbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNKHQpfSxyKE0seCksTS5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltb2QodC51c2hsbih0aGlzLnNoaWZ0KSl9LE0ucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Lm11bCh0aGlzLnJpbnYpKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxNLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gdC53b3Jkc1swXT0wLHQubGVuZ3RoPTEsdDt2YXIgbj10LmltdWwoZSksaT1uLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxyPW4uaXN1YihpKS5pdXNocm4odGhpcy5zaGlmdCksbz1yO3JldHVybiByLmNtcCh0aGlzLm0pPj0wP289ci5pc3ViKHRoaXMubSk6ci5jbXBuKDApPDAmJihvPXIuaWFkZCh0aGlzLm0pKSxvLl9mb3JjZVJlZCh0aGlzKX0sTS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciBuPXQubXVsKGUpLGk9bi5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSkscj1uLmlzdWIoaSkuaXVzaHJuKHRoaXMuc2hpZnQpLHM9cjtyZXR1cm4gci5jbXAodGhpcy5tKT49MD9zPXIuaXN1Yih0aGlzLm0pOnIuY21wbigwKTwwJiYocz1yLmlhZGQodGhpcy5tKSkscy5fZm9yY2VSZWQodGhpcyl9LE0ucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0Ll9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSkuX2ZvcmNlUmVkKHRoaXMpfX0odCx0aGlzKX0pLmNhbGwodGhpcyxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpewovKiEKICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAqCiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPgogKiBAbGljZW5zZSAgTUlUCiAqLwp2YXIgaT1uKDgxKSxyPW4oMTQ2KSxvPW4oODMpO2Z1bmN0aW9uIHMoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBhKHQsZSl7aWYocygpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gbCh0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4saSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4saSl7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisoaXx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PWk/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09aT9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixpKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9ZCh0LGUpO3JldHVybiB0fSh0LGUsbixpKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIGk9MHxwKGUsbikscj0odD1hKHQsaSkpLndyaXRlKGUsbik7ciE9PWkmJih0PXQuc2xpY2UoMCxyKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8ZihlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1hKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChpPWUubGVuZ3RoKSE9aT9hKHQsMCk6ZCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZvKGUuZGF0YSkpcmV0dXJuIGQodCxlLmRhdGEpfXZhciBpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBoKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gbCh0LGUpe2lmKGgoZSksdD1hKHQsZTwwPzA6MHxmKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIGQodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxmKGUubGVuZ3RoKTt0PWEodCxuKTtmb3IodmFyIGk9MDtpPG47aSs9MSl0W2ldPTI1NSZlW2ldO3JldHVybiB0fWZ1bmN0aW9uIGYodCl7aWYodD49cygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitzKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIHAodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIGk9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBXKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcSh0KS5sZW5ndGg7ZGVmYXVsdDppZihpKXJldHVybiBXKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLGk9ITB9fWZ1bmN0aW9uIG0odCxlLG4pe3ZhciBpPXRbZV07dFtlXT10W25dLHRbbl09aX1mdW5jdGlvbiBnKHQsZSxuLGkscil7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49cj8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKHIpcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighcilyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxpKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOnYodCxlLG4saSxyKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP3I/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTp2KHQsW2VdLG4saSxyKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiB2KHQsZSxuLGkscil7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1pJiYoInVjczIiPT09KGk9U3RyaW5nKGkpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09aXx8InV0ZjE2bGUiPT09aXx8InV0Zi0xNmxlIj09PWkpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihyKXt2YXIgaD0tMTtmb3Iobz1uO288YTtvKyspaWYoYyh0LG8pPT09YyhlLC0xPT09aD8wOm8taCkpe2lmKC0xPT09aCYmKGg9byksby1oKzE9PT11KXJldHVybiBoKnN9ZWxzZS0xIT09aCYmKG8tPW8taCksaD0tMX1lbHNlIGZvcihuK3U+YSYmKG49YS11KSxvPW47bz49MDtvLS0pe2Zvcih2YXIgbD0hMCxkPTA7ZDx1O2QrKylpZihjKHQsbytkKSE9PWMoZSxkKSl7bD0hMTticmVha31pZihsKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4saSl7bj1OdW1iZXIobil8fDA7dmFyIHI9dC5sZW5ndGgtbjtpPyhpPU51bWJlcihpKSk+ciYmKGk9cik6aT1yO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtpPm8vMiYmKGk9by8yKTtmb3IodmFyIHM9MDtzPGk7KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIHkodCxlLG4saSl7cmV0dXJuIEgoVyhlLHQubGVuZ3RoLW4pLHQsbixpKX1mdW5jdGlvbiBfKHQsZSxuLGkpe3JldHVybiBIKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4saSl9ZnVuY3Rpb24gdyh0LGUsbixpKXtyZXR1cm4gXyh0LGUsbixpKX1mdW5jdGlvbiB4KHQsZSxuLGkpe3JldHVybiBIKHEoZSksdCxuLGkpfWZ1bmN0aW9uIE0odCxlLG4saSl7cmV0dXJuIEgoZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPXQuY2hhckNvZGVBdChzKSxpPW4+Pjgscj1uJTI1NixvLnB1c2gociksby5wdXNoKGkpO3JldHVybiBvfShlLHQubGVuZ3RoLW4pLHQsbixpKX1mdW5jdGlvbiBTKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9pLmZyb21CeXRlQXJyYXkodCk6aS5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gRSh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIGk9W10scj1lO3I8bjspe3ZhciBvLHMsYSx1LGM9dFtyXSxoPW51bGwsbD1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKHIrbDw9bilzd2l0Y2gobCl7Y2FzZSAxOmM8MTI4JiYoaD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbcisxXSkpJiYodT0oMzEmYyk8PDZ8NjMmbyk+MTI3JiYoaD11KTticmVhaztjYXNlIDM6bz10W3IrMV0scz10W3IrMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGg9dSk7YnJlYWs7Y2FzZSA0Om89dFtyKzFdLHM9dFtyKzJdLGE9dFtyKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGg9dSl9bnVsbD09PWg/KGg9NjU1MzMsbD0xKTpoPjY1NTM1JiYoaC09NjU1MzYsaS5wdXNoKGg+Pj4xMCYxMDIzfDU1Mjk2KSxoPTU2MzIwfDEwMjMmaCksaS5wdXNoKGgpLHIrPWx9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PUEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLGk9MDtmb3IoO2k8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShpLGkrPUEpKTtyZXR1cm4gbn0oaSl9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1zKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBoKGUpLGU8PTA/YSh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiBpP2EodCxlKS5maWxsKG4saSk6YSh0LGUpLmZpbGwobik6YSh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gbChudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gbChudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgsaT1lLmxlbmd0aCxyPTAsbz1NYXRoLm1pbihuLGkpO3I8bzsrK3IpaWYodFtyXSE9PWVbcl0pe249dFtyXSxpPWVbcl07YnJlYWt9cmV0dXJuIG48aT8tMTppPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIW8odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciBpPXUuYWxsb2NVbnNhZmUoZSkscj0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBzPXRbbl07aWYoIXUuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShpLHIpLHIrPXMubGVuZ3RofXJldHVybiBpfSx1LmJ5dGVMZW5ndGg9cCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKW0odGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCltKHRoaXMsZSxlKzMpLG0odGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KW0odGhpcyxlLGUrNyksbSh0aGlzLGUrMSxlKzYpLG0odGhpcyxlKzIsZSs1KSxtKHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/RSh0aGlzLDAsdCk6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTyh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gRSh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBQKHRoaXMsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGk9ITB9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8aTwwfHxyPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihpPj1yJiZlPj1uKXJldHVybiAwO2lmKGk+PXIpcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KHI+Pj49MCktKGk+Pj49MCkscz0obj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksYz10aGlzLnNsaWNlKGksciksaD10LnNsaWNlKGUsbiksbD0wO2w8YTsrK2wpaWYoY1tsXSE9PWhbbF0pe289Y1tsXSxzPWhbbF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZyh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBnKHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixpKXtpZih2b2lkIDA9PT1lKWk9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKWk9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1pJiYoaT0idXRmOCIpKTooaT1uLG49dm9pZCAwKX12YXIgcj10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPnIpJiYobj1yKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO2l8fChpPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKGkpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB5KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBfKHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHcodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gTSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitpKTtpPSgiIitpKS50b0xvd2VyQ2FzZSgpLG89ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBBPTQwOTY7ZnVuY3Rpb24gQyh0LGUsbil7dmFyIGk9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9ZTtyPG47KytyKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbcl0pO3JldHVybiBpfWZ1bmN0aW9uIGsodCxlLG4pe3ZhciBpPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPWU7cjxuOysrcilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbcl0pO3JldHVybiBpfWZ1bmN0aW9uIE8odCxlLG4pe3ZhciBpPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+aSkmJihuPWkpO2Zvcih2YXIgcj0iIixvPWU7bzxuOysrbylyKz1OKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIFAodCxlLG4pe2Zvcih2YXIgaT10LnNsaWNlKGUsbikscj0iIixvPTA7bzxpLmxlbmd0aDtvKz0yKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoaVtvXSsyNTYqaVtvKzFdKTtyZXR1cm4gcn1mdW5jdGlvbiBUKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBqKHQsZSxuLGkscixvKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5yfHxlPG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4raT50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixpKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciByPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO3I8bzsrK3IpdFtuK3JdPShlJjI1NTw8OCooaT9yOjEtcikpPj4+OCooaT9yOjEtcil9ZnVuY3Rpb24gTCh0LGUsbixpKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIHI9MCxvPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7cjxvOysrcil0W24rcl09ZT4+PjgqKGk/cjozLXIpJjI1NX1mdW5jdGlvbiBCKHQsZSxuLGkscixvKXtpZihuK2k+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gRCh0LGUsbixpLG8pe3JldHVybiBvfHxCKHQsMCxuLDQpLHIud3JpdGUodCxlLG4saSwyMyw0KSxuKzR9ZnVuY3Rpb24gUih0LGUsbixpLG8pe3JldHVybiBvfHxCKHQsMCxuLDgpLHIud3JpdGUodCxlLG4saSw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9aSk8MCYmKHQ9MCk6dD5pJiYodD1pKSwoZT12b2lkIDA9PT1lP2k6fn5lKTwwPyhlKz1pKTwwJiYoZT0wKTplPmkmJihlPWkpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIHI9ZS10O249bmV3IHUocix2b2lkIDApO2Zvcih2YXIgbz0wO288cjsrK28pbltvXT10aGlzW28rdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxUKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPXRoaXNbdF0scj0xLG89MDsrK288ZSYmKHIqPTI1Nik7KWkrPXRoaXNbdCtvXSpyO3JldHVybiBpfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8VCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgaT10aGlzW3QrLS1lXSxyPTE7ZT4wJiYocio9MjU2KTspaSs9dGhpc1t0Ky0tZV0qcjtyZXR1cm4gaX0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8VCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgaT10aGlzW3RdLHI9MSxvPTA7KytvPGUmJihyKj0yNTYpOylpKz10aGlzW3Qrb10qcjtyZXR1cm4gaT49KHIqPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9ZSxyPTEsbz10aGlzW3QrLS1pXTtpPjAmJihyKj0yNTYpOylvKz10aGlzW3QrLS1pXSpyO3JldHVybiBvPj0ocio9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFQodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxUKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSxyLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksci5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw4LHRoaXMubGVuZ3RoKSxyLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDgsdGhpcy5sZW5ndGgpLHIucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLGkpeyh0PSt0LGV8PTAsbnw9MCxpKXx8aih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciByPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxuJiYocio9MjU2KTspdGhpc1tlK29dPXQvciYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4saSl7KHQ9K3QsZXw9MCxufD0wLGkpfHxqKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIHI9bi0xLG89MTtmb3IodGhpc1tlK3JdPTI1NSZ0Oy0tcj49MCYmKG8qPTI1Nik7KXRoaXNbZStyXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6TCh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpMKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4saSl7aWYodD0rdCxlfD0wLCFpKXt2YXIgcj1NYXRoLnBvdygyLDgqbi0xKTtqKHRoaXMsdCxlLG4sci0xLC1yKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPG4mJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQ9K3QsZXw9MCwhaSl7dmFyIHI9TWF0aC5wb3coMiw4Km4tMSk7aih0aGlzLHQsZSxuLHItMSwtcil9dmFyIG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28rMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8aih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxqKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOkwodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fGoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6TCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBEKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBEKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUih0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFIodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4saSl7aWYobnx8KG49MCksaXx8MD09PWl8fChpPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLGk+MCYmaTxuJiYoaT1uKSxpPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPGktbiYmKGk9dC5sZW5ndGgtZStuKTt2YXIgcixvPWktbjtpZih0aGlzPT09dCYmbjxlJiZlPGkpZm9yKHI9by0xO3I+PTA7LS1yKXRbcitlXT10aGlzW3Irbl07ZWxzZSBpZihvPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iocj0wO3I8bzsrK3IpdFtyK2VdPXRoaXNbcituXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4rbyksZSk7cmV0dXJuIG99LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4saSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KGk9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYoaT1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIHI9dC5jaGFyQ29kZUF0KDApO3I8MjU2JiYodD1yKX1pZih2b2lkIDAhPT1pJiYic3RyaW5nIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgaSYmIXUuaXNFbmNvZGluZyhpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2kpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288bjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9dS5pc0J1ZmZlcih0KT90OlcobmV3IHUodCxpKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxuLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciB6PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIE4odCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFcodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIGk9dC5sZW5ndGgscj1udWxsLG89W10scz0wO3M8aTsrK3Mpe2lmKChuPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFyKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09aSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfXI9bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSkscj1uO2NvbnRpbnVlfW49NjU1MzYrKHItNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgciYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKHI9bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHEodCl7cmV0dXJuIGkudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZSh6LCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBIKHQsZSxuLGkpe2Zvcih2YXIgcj0wO3I8aSYmIShyK24+PWUubGVuZ3RofHxyPj10Lmxlbmd0aCk7KytyKWVbcituXT10W3JdO3JldHVybiByfX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQsaSl7dmFyIHIsbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMiksYT1uKDMyMCksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy50eXBlPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNDb25mbGF0YWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiExfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvbmZsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiExfSx0fSgpO2UuTWVzc2FnZT11O3ZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBvKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpc0NvbmZsYXRhYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuY29uZmxhdGU9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGV9KHUpO2UuQ29uZmxhdGFibGVNZXNzYWdlPWMsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBuPW8uZ2V0KHQpO24mJjAhPT1uLmxlbmd0aD9zLmV2ZXJ5KHMucmV0cm8obiksZnVuY3Rpb24obil7cmV0dXJuIW58fGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0hMDt0cnl7aT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGUsbik6dC5tZXNzYWdlSG9vayhlLG4pfWNhdGNoKHQpe2ModCl9cmV0dXJuIGl9KG4sdCxlKX0pJiZwKHQsZSk6cCh0LGUpfWUuc2VuZE1lc3NhZ2U9bixlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7ZS5pc0NvbmZsYXRhYmxlJiZzLnNvbWUocixmdW5jdGlvbihuKXtyZXR1cm4gbi5oYW5kbGVyPT09dCYmISFuLm1zZyYmbi5tc2cudHlwZT09PWUudHlwZSYmISFuLm1zZy5pc0NvbmZsYXRhYmxlJiZuLm1zZy5jb25mbGF0ZShlKX0pfHxtKHQsZSl9LGUuaW5zdGFsbE1lc3NhZ2VIb29rPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5nZXQodCk7biYmLTEhPT1uLmluZGV4T2YoZSl8fChuP24ucHVzaChlKTpvLnNldCh0LFtlXSkpfSxlLnJlbW92ZU1lc3NhZ2VIb29rPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5nZXQodCk7aWYobil7dmFyIGk9bi5pbmRleE9mKGUpOy0xIT09aSYmKG5baV09bnVsbCx2KG4pKX19LGUuY2xlYXJEYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0KHQpO2UmJmUubGVuZ3RoPjAmJihzLkFycmF5RXh0LmZpbGwoZSxudWxsKSx2KGUpKSxzLmVhY2gocixmdW5jdGlvbihlKXtlLmhhbmRsZXI9PT10JiYoZS5oYW5kbGVyPW51bGwsZS5tc2c9bnVsbCl9KX0sZS5mbHVzaD1mdW5jdGlvbigpe2x8fDA9PT1ofHwoZihoKSxsPSEwLGcoKSxsPSExKX0sZS5nZXRFeGNlcHRpb25IYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGN9LGUuc2V0RXhjZXB0aW9uSGFuZGxlcj1mdW5jdGlvbih0KXt2YXIgZT1jO3JldHVybiBjPXQsZX07dmFyIHI9bmV3IGEuTGlua2VkTGlzdCxvPW5ldyBXZWFrTWFwLHU9bmV3IFNldCxjPWZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IodCl9LGg9MCxsPSExLGQ9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWU6dCxmPSJmdW5jdGlvbiI9PXR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZT9jYW5jZWxBbmltYXRpb25GcmFtZTppO2Z1bmN0aW9uIHAodCxlKXt0cnl7dC5wcm9jZXNzTWVzc2FnZShlKX1jYXRjaCh0KXtjKHQpfX1mdW5jdGlvbiBtKHQsZSl7ci5hZGRMYXN0KHtoYW5kbGVyOnQsbXNnOmV9KSwwPT09aCYmKGg9ZChnKSl9ZnVuY3Rpb24gZygpe2lmKGg9MCwhci5pc0VtcHR5KXt2YXIgdD17aGFuZGxlcjpudWxsLG1zZzpudWxsfTtmb3Ioci5hZGRMYXN0KHQpOzspe3ZhciBlPXIucmVtb3ZlRmlyc3QoKTtpZihlPT09dClyZXR1cm47ZS5oYW5kbGVyJiZlLm1zZyYmbihlLmhhbmRsZXIsZS5tc2cpfX19ZnVuY3Rpb24gdih0KXswPT09dS5zaXplJiZkKGIpLHUuYWRkKHQpfWZ1bmN0aW9uIGIoKXt1LmZvckVhY2goeSksdS5jbGVhcigpfWZ1bmN0aW9uIHkodCl7cy5BcnJheUV4dC5yZW1vdmVBbGxXaGVyZSh0LF8pfWZ1bmN0aW9uIF8odCl7cmV0dXJuIG51bGw9PT10fX0oZS5NZXNzYWdlTG9vcHx8KGUuTWVzc2FnZUxvb3A9e30pKX0pLmNhbGwodGhpcyxuKDQ0KS5zZXRJbW1lZGlhdGUsbig0NCkuY2xlYXJJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsbil7dmFyIGk7IWZ1bmN0aW9uKCl7dmFyIHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PT1zZWxmJiZzZWxmfHwib2JqZWN0Ij09dHlwZW9mIHQmJnQuZ2xvYmFsPT09dCYmdHx8dGhpc3x8e30sbz1yLl8scz1BcnJheS5wcm90b3R5cGUsYT1PYmplY3QucHJvdG90eXBlLHU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2w/U3ltYm9sLnByb3RvdHlwZTpudWxsLGM9cy5wdXNoLGg9cy5zbGljZSxsPWEudG9TdHJpbmcsZD1hLmhhc093blByb3BlcnR5LGY9QXJyYXkuaXNBcnJheSxwPU9iamVjdC5rZXlzLG09T2JqZWN0LmNyZWF0ZSxnPWZ1bmN0aW9uKCl7fSx2PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygdj90OnRoaXMgaW5zdGFuY2VvZiB2P3ZvaWQodGhpcy5fd3JhcHBlZD10KTpuZXcgdih0KX07ZS5ub2RlVHlwZT9yLl89djooIW4ubm9kZVR5cGUmJm4uZXhwb3J0cyYmKGU9bi5leHBvcnRzPXYpLGUuXz12KSx2LlZFUlNJT049IjEuOS4xIjt2YXIgYix5PWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChudWxsPT1uPzM6bil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixpLHIpe3JldHVybiB0LmNhbGwoZSxuLGkscil9O2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24obixpLHIsbyl7cmV0dXJuIHQuY2FsbChlLG4saSxyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fSxfPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdi5pdGVyYXRlZSE9PWI/di5pdGVyYXRlZSh0LGUpOm51bGw9PXQ/di5pZGVudGl0eTp2LmlzRnVuY3Rpb24odCk/eSh0LGUsbik6di5pc09iamVjdCh0KSYmIXYuaXNBcnJheSh0KT92Lm1hdGNoZXIodCk6di5wcm9wZXJ0eSh0KX07di5pdGVyYXRlZT1iPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF8odCxlLDEvMCl9O3ZhciB3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bnVsbD09ZT90Lmxlbmd0aC0xOitlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPU1hdGgubWF4KGFyZ3VtZW50cy5sZW5ndGgtZSwwKSxpPUFycmF5KG4pLHI9MDtyPG47cisrKWlbcl09YXJndW1lbnRzW3IrZV07c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKHRoaXMsaSk7Y2FzZSAxOnJldHVybiB0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0saSk7Y2FzZSAyOnJldHVybiB0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGkpfXZhciBvPUFycmF5KGUrMSk7Zm9yKHI9MDtyPGU7cisrKW9bcl09YXJndW1lbnRzW3JdO3JldHVybiBvW2VdPWksdC5hcHBseSh0aGlzLG8pfX0seD1mdW5jdGlvbih0KXtpZighdi5pc09iamVjdCh0KSlyZXR1cm57fTtpZihtKXJldHVybiBtKHQpO2cucHJvdG90eXBlPXQ7dmFyIGU9bmV3IGc7cmV0dXJuIGcucHJvdG90eXBlPW51bGwsZX0sTT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmQuY2FsbCh0LGUpfSxFPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXtpZihudWxsPT10KXJldHVybjt0PXRbZVtpXV19cmV0dXJuIG4/dDp2b2lkIDB9LEE9TWF0aC5wb3coMiw1MyktMSxDPU0oImxlbmd0aCIpLGs9ZnVuY3Rpb24odCl7dmFyIGU9Qyh0KTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJmU+PTAmJmU8PUF9O3YuZWFjaD12LmZvckVhY2g9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7aWYoZT15KGUsbiksayh0KSlmb3IoaT0wLHI9dC5sZW5ndGg7aTxyO2krKyllKHRbaV0saSx0KTtlbHNle3ZhciBvPXYua2V5cyh0KTtmb3IoaT0wLHI9by5sZW5ndGg7aTxyO2krKyllKHRbb1tpXV0sb1tpXSx0KX1yZXR1cm4gdH0sdi5tYXA9di5jb2xsZWN0PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz1BcnJheShyKSxzPTA7czxyO3MrKyl7dmFyIGE9aT9pW3NdOnM7b1tzXT1lKHRbYV0sYSx0KX1yZXR1cm4gb307dmFyIE89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+PTM7cmV0dXJuIGZ1bmN0aW9uKGUsbixpLHIpe3ZhciBvPSFrKGUpJiZ2LmtleXMoZSkscz0ob3x8ZSkubGVuZ3RoLGE9dD4wPzA6cy0xO2ZvcihyfHwoaT1lW28/b1thXTphXSxhKz10KTthPj0wJiZhPHM7YSs9dCl7dmFyIHU9bz9vW2FdOmE7aT1uKGksZVt1XSx1LGUpfXJldHVybiBpfShlLHkobixyLDQpLGksbyl9fTt2LnJlZHVjZT12LmZvbGRsPXYuaW5qZWN0PU8oMSksdi5yZWR1Y2VSaWdodD12LmZvbGRyPU8oLTEpLHYuZmluZD12LmRldGVjdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9KGsodCk/di5maW5kSW5kZXg6di5maW5kS2V5KSh0LGUsbik7aWYodm9pZCAwIT09aSYmLTEhPT1pKXJldHVybiB0W2ldfSx2LmZpbHRlcj12LnNlbGVjdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9W107cmV0dXJuIGU9XyhlLG4pLHYuZWFjaCh0LGZ1bmN0aW9uKHQsbixyKXtlKHQsbixyKSYmaS5wdXNoKHQpfSksaX0sdi5yZWplY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2LmZpbHRlcih0LHYubmVnYXRlKF8oZSkpLG4pfSx2LmV2ZXJ5PXYuYWxsPWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz0wO288cjtvKyspe3ZhciBzPWk/aVtvXTpvO2lmKCFlKHRbc10scyx0KSlyZXR1cm4hMX1yZXR1cm4hMH0sdi5zb21lPXYuYW55PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGk9IWsodCkmJnYua2V5cyh0KSxyPShpfHx0KS5sZW5ndGgsbz0wO288cjtvKyspe3ZhciBzPWk/aVtvXTpvO2lmKGUodFtzXSxzLHQpKXJldHVybiEwfXJldHVybiExfSx2LmNvbnRhaW5zPXYuaW5jbHVkZXM9di5pbmNsdWRlPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBrKHQpfHwodD12LnZhbHVlcyh0KSksKCJudW1iZXIiIT10eXBlb2Ygbnx8aSkmJihuPTApLHYuaW5kZXhPZih0LGUsbik+PTB9LHYuaW52b2tlPXcoZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT9yPWU6di5pc0FycmF5KGUpJiYoaT1lLnNsaWNlKDAsLTEpLGU9ZVtlLmxlbmd0aC0xXSksdi5tYXAodCxmdW5jdGlvbih0KXt2YXIgbz1yO2lmKCFvKXtpZihpJiZpLmxlbmd0aCYmKHQ9RSh0LGkpKSxudWxsPT10KXJldHVybjtvPXRbZV19cmV0dXJuIG51bGw9PW8/bzpvLmFwcGx5KHQsbil9KX0pLHYucGx1Y2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdi5tYXAodCx2LnByb3BlcnR5KGUpKX0sdi53aGVyZT1mdW5jdGlvbih0LGUpe3JldHVybiB2LmZpbHRlcih0LHYubWF0Y2hlcihlKSl9LHYuZmluZFdoZXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHYuZmluZCh0LHYubWF0Y2hlcihlKSl9LHYubWF4PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89LTEvMCxzPS0xLzA7aWYobnVsbD09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiYib2JqZWN0IiE9dHlwZW9mIHRbMF0mJm51bGwhPXQpZm9yKHZhciBhPTAsdT0odD1rKHQpP3Q6di52YWx1ZXModCkpLmxlbmd0aDthPHU7YSsrKW51bGwhPShpPXRbYV0pJiZpPm8mJihvPWkpO2Vsc2UgZT1fKGUsbiksdi5lYWNoKHQsZnVuY3Rpb24odCxuLGkpeygocj1lKHQsbixpKSk+c3x8cj09PS0xLzAmJm89PT0tMS8wKSYmKG89dCxzPXIpfSk7cmV0dXJuIG99LHYubWluPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89MS8wLHM9MS8wO2lmKG51bGw9PWV8fCJudW1iZXIiPT10eXBlb2YgZSYmIm9iamVjdCIhPXR5cGVvZiB0WzBdJiZudWxsIT10KWZvcih2YXIgYT0wLHU9KHQ9ayh0KT90OnYudmFsdWVzKHQpKS5sZW5ndGg7YTx1O2ErKyludWxsIT0oaT10W2FdKSYmaTxvJiYobz1pKTtlbHNlIGU9XyhlLG4pLHYuZWFjaCh0LGZ1bmN0aW9uKHQsbixpKXsoKHI9ZSh0LG4saSkpPHN8fHI9PT0xLzAmJm89PT0xLzApJiYobz10LHM9cil9KTtyZXR1cm4gb30sdi5zaHVmZmxlPWZ1bmN0aW9uKHQpe3JldHVybiB2LnNhbXBsZSh0LDEvMCl9LHYuc2FtcGxlPWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT1lfHxuKXJldHVybiBrKHQpfHwodD12LnZhbHVlcyh0KSksdFt2LnJhbmRvbSh0Lmxlbmd0aC0xKV07dmFyIGk9ayh0KT92LmNsb25lKHQpOnYudmFsdWVzKHQpLHI9QyhpKTtlPU1hdGgubWF4KE1hdGgubWluKGUsciksMCk7Zm9yKHZhciBvPXItMSxzPTA7czxlO3MrKyl7dmFyIGE9di5yYW5kb20ocyxvKSx1PWlbc107aVtzXT1pW2FdLGlbYV09dX1yZXR1cm4gaS5zbGljZSgwLGUpfSx2LnNvcnRCeT1mdW5jdGlvbih0LGUsbil7dmFyIGk9MDtyZXR1cm4gZT1fKGUsbiksdi5wbHVjayh2Lm1hcCh0LGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57dmFsdWU6dCxpbmRleDppKyssY3JpdGVyaWE6ZSh0LG4scil9fSkuc29ydChmdW5jdGlvbih0LGUpe3ZhciBuPXQuY3JpdGVyaWEsaT1lLmNyaXRlcmlhO2lmKG4hPT1pKXtpZihuPml8fHZvaWQgMD09PW4pcmV0dXJuIDE7aWYobjxpfHx2b2lkIDA9PT1pKXJldHVybi0xfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KSwidmFsdWUiKX07dmFyIFA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe3ZhciBvPWU/W1tdLFtdXTp7fTtyZXR1cm4gaT1fKGksciksdi5lYWNoKG4sZnVuY3Rpb24oZSxyKXt2YXIgcz1pKGUscixuKTt0KG8sZSxzKX0pLG99fTt2Lmdyb3VwQnk9UChmdW5jdGlvbih0LGUsbil7Uyh0LG4pP3Rbbl0ucHVzaChlKTp0W25dPVtlXX0pLHYuaW5kZXhCeT1QKGZ1bmN0aW9uKHQsZSxuKXt0W25dPWV9KSx2LmNvdW50Qnk9UChmdW5jdGlvbih0LGUsbil7Uyh0LG4pP3Rbbl0rKzp0W25dPTF9KTt2YXIgVD0vW15cdWQ4MDAtXHVkZmZmXXxbXHVkODAwLVx1ZGJmZl1bXHVkYzAwLVx1ZGZmZl18W1x1ZDgwMC1cdWRmZmZdL2c7di50b0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0P3YuaXNBcnJheSh0KT9oLmNhbGwodCk6di5pc1N0cmluZyh0KT90Lm1hdGNoKFQpOmsodCk/di5tYXAodCx2LmlkZW50aXR5KTp2LnZhbHVlcyh0KTpbXX0sdi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PzA6ayh0KT90Lmxlbmd0aDp2LmtleXModCkubGVuZ3RofSx2LnBhcnRpdGlvbj1QKGZ1bmN0aW9uKHQsZSxuKXt0W24/MDoxXS5wdXNoKGUpfSwhMCksdi5maXJzdD12LmhlYWQ9di50YWtlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dHx8dC5sZW5ndGg8MT9udWxsPT1lP3ZvaWQgMDpbXTpudWxsPT1lfHxuP3RbMF06di5pbml0aWFsKHQsdC5sZW5ndGgtZSl9LHYuaW5pdGlhbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguY2FsbCh0LDAsTWF0aC5tYXgoMCx0Lmxlbmd0aC0obnVsbD09ZXx8bj8xOmUpKSl9LHYubGFzdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXR8fHQubGVuZ3RoPDE/bnVsbD09ZT92b2lkIDA6W106bnVsbD09ZXx8bj90W3QubGVuZ3RoLTFdOnYucmVzdCh0LE1hdGgubWF4KDAsdC5sZW5ndGgtZSkpfSx2LnJlc3Q9di50YWlsPXYuZHJvcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguY2FsbCh0LG51bGw9PWV8fG4/MTplKX0sdi5jb21wYWN0PWZ1bmN0aW9uKHQpe3JldHVybiB2LmZpbHRlcih0LEJvb2xlYW4pfTt2YXIgaj1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9KGk9aXx8W10pLmxlbmd0aCxvPTAscz1DKHQpO288cztvKyspe3ZhciBhPXRbb107aWYoayhhKSYmKHYuaXNBcnJheShhKXx8di5pc0FyZ3VtZW50cyhhKSkpaWYoZSlmb3IodmFyIHU9MCxjPWEubGVuZ3RoO3U8YzspaVtyKytdPWFbdSsrXTtlbHNlIGooYSxlLG4saSkscj1pLmxlbmd0aDtlbHNlIG58fChpW3IrK109YSl9cmV0dXJuIGl9O3YuZmxhdHRlbj1mdW5jdGlvbih0LGUpe3JldHVybiBqKHQsZSwhMSl9LHYud2l0aG91dD13KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHYuZGlmZmVyZW5jZSh0LGUpfSksdi51bmlxPXYudW5pcXVlPWZ1bmN0aW9uKHQsZSxuLGkpe3YuaXNCb29sZWFuKGUpfHwoaT1uLG49ZSxlPSExKSxudWxsIT1uJiYobj1fKG4saSkpO2Zvcih2YXIgcj1bXSxvPVtdLHM9MCxhPUModCk7czxhO3MrKyl7dmFyIHU9dFtzXSxjPW4/bih1LHMsdCk6dTtlJiYhbj8ocyYmbz09PWN8fHIucHVzaCh1KSxvPWMpOm4/di5jb250YWlucyhvLGMpfHwoby5wdXNoKGMpLHIucHVzaCh1KSk6di5jb250YWlucyhyLHUpfHxyLnB1c2godSl9cmV0dXJuIHJ9LHYudW5pb249dyhmdW5jdGlvbih0KXtyZXR1cm4gdi51bmlxKGoodCwhMCwhMCkpfSksdi5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49YXJndW1lbnRzLmxlbmd0aCxpPTAscj1DKHQpO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoIXYuY29udGFpbnMoZSxvKSl7dmFyIHM7Zm9yKHM9MTtzPG4mJnYuY29udGFpbnMoYXJndW1lbnRzW3NdLG8pO3MrKyk7cz09PW4mJmUucHVzaChvKX19cmV0dXJuIGV9LHYuZGlmZmVyZW5jZT13KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9aihlLCEwLCEwKSx2LmZpbHRlcih0LGZ1bmN0aW9uKHQpe3JldHVybiF2LmNvbnRhaW5zKGUsdCl9KX0pLHYudW56aXA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQmJnYubWF4KHQsQykubGVuZ3RofHwwLG49QXJyYXkoZSksaT0wO2k8ZTtpKyspbltpXT12LnBsdWNrKHQsaSk7cmV0dXJuIG59LHYuemlwPXcodi51bnppcCksdi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49e30saT0wLHI9Qyh0KTtpPHI7aSsrKWU/blt0W2ldXT1lW2ldOm5bdFtpXVswXV09dFtpXVsxXTtyZXR1cm4gbn07dmFyIEk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtuPV8obixpKTtmb3IodmFyIHI9QyhlKSxvPXQ+MD8wOnItMTtvPj0wJiZvPHI7bys9dClpZihuKGVbb10sbyxlKSlyZXR1cm4gbztyZXR1cm4tMX19O3YuZmluZEluZGV4PUkoMSksdi5maW5kTGFzdEluZGV4PUkoLTEpLHYuc29ydGVkSW5kZXg9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPShuPV8obixpLDEpKShlKSxvPTAscz1DKHQpO288czspe3ZhciBhPU1hdGguZmxvb3IoKG8rcykvMik7bih0W2FdKTxyP289YSsxOnM9YX1yZXR1cm4gb307dmFyIEw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbihpLHIsbyl7dmFyIHM9MCxhPUMoaSk7aWYoIm51bWJlciI9PXR5cGVvZiBvKXQ+MD9zPW8+PTA/bzpNYXRoLm1heChvK2Escyk6YT1vPj0wP01hdGgubWluKG8rMSxhKTpvK2ErMTtlbHNlIGlmKG4mJm8mJmEpcmV0dXJuIGlbbz1uKGkscildPT09cj9vOi0xO2lmKHIhPXIpcmV0dXJuKG89ZShoLmNhbGwoaSxzLGEpLHYuaXNOYU4pKT49MD9vK3M6LTE7Zm9yKG89dD4wP3M6YS0xO28+PTAmJm88YTtvKz10KWlmKGlbb109PT1yKXJldHVybiBvO3JldHVybi0xfX07di5pbmRleE9mPUwoMSx2LmZpbmRJbmRleCx2LnNvcnRlZEluZGV4KSx2Lmxhc3RJbmRleE9mPUwoLTEsdi5maW5kTGFzdEluZGV4KSx2LnJhbmdlPWZ1bmN0aW9uKHQsZSxuKXtudWxsPT1lJiYoZT10fHwwLHQ9MCksbnx8KG49ZTx0Py0xOjEpO2Zvcih2YXIgaT1NYXRoLm1heChNYXRoLmNlaWwoKGUtdCkvbiksMCkscj1BcnJheShpKSxvPTA7bzxpO28rKyx0Kz1uKXJbb109dDtyZXR1cm4gcn0sdi5jaHVuaz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PWV8fGU8MSlyZXR1cm5bXTtmb3IodmFyIG49W10saT0wLHI9dC5sZW5ndGg7aTxyOyluLnB1c2goaC5jYWxsKHQsaSxpKz1lKSk7cmV0dXJuIG59O3ZhciBCPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYoIShpIGluc3RhbmNlb2YgZSkpcmV0dXJuIHQuYXBwbHkobixyKTt2YXIgbz14KHQucHJvdG90eXBlKSxzPXQuYXBwbHkobyxyKTtyZXR1cm4gdi5pc09iamVjdChzKT9zOm99O3YuYmluZD13KGZ1bmN0aW9uKHQsZSxuKXtpZighdi5pc0Z1bmN0aW9uKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkJpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbiIpO3ZhciBpPXcoZnVuY3Rpb24ocil7cmV0dXJuIEIodCxpLGUsdGhpcyxuLmNvbmNhdChyKSl9KTtyZXR1cm4gaX0pLHYucGFydGlhbD13KGZ1bmN0aW9uKHQsZSl7dmFyIG49di5wYXJ0aWFsLnBsYWNlaG9sZGVyLGk9ZnVuY3Rpb24oKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoLHM9QXJyYXkobyksYT0wO2E8bzthKyspc1thXT1lW2FdPT09bj9hcmd1bWVudHNbcisrXTplW2FdO2Zvcig7cjxhcmd1bWVudHMubGVuZ3RoOylzLnB1c2goYXJndW1lbnRzW3IrK10pO3JldHVybiBCKHQsaSx0aGlzLHRoaXMscyl9O3JldHVybiBpfSksdi5wYXJ0aWFsLnBsYWNlaG9sZGVyPXYsdi5iaW5kQWxsPXcoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT1qKGUsITEsITEpKS5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiYmluZEFsbCBtdXN0IGJlIHBhc3NlZCBmdW5jdGlvbiBuYW1lcyIpO2Zvcig7bi0tOyl7dmFyIGk9ZVtuXTt0W2ldPXYuYmluZCh0W2ldLHQpfX0pLHYubWVtb2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKGkpe3ZhciByPW4uY2FjaGUsbz0iIisoZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKTtyZXR1cm4gUyhyLG8pfHwocltvXT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscltvXX07cmV0dXJuIG4uY2FjaGU9e30sbn0sdi5kZWxheT13KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KG51bGwsbil9LGUpfSksdi5kZWZlcj12LnBhcnRpYWwodi5kZWxheSx2LDEpLHYudGhyb3R0bGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzLGE9MDtufHwobj17fSk7dmFyIHU9ZnVuY3Rpb24oKXthPSExPT09bi5sZWFkaW5nPzA6di5ub3coKSxpPW51bGwscz10LmFwcGx5KHIsbyksaXx8KHI9bz1udWxsKX0sYz1mdW5jdGlvbigpe3ZhciBjPXYubm93KCk7YXx8ITEhPT1uLmxlYWRpbmd8fChhPWMpO3ZhciBoPWUtKGMtYSk7cmV0dXJuIHI9dGhpcyxvPWFyZ3VtZW50cyxoPD0wfHxoPmU/KGkmJihjbGVhclRpbWVvdXQoaSksaT1udWxsKSxhPWMscz10LmFwcGx5KHIsbyksaXx8KHI9bz1udWxsKSk6aXx8ITE9PT1uLnRyYWlsaW5nfHwoaT1zZXRUaW1lb3V0KHUsaCkpLHN9O3JldHVybiBjLmNhbmNlbD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChpKSxhPTAsaT1yPW89bnVsbH0sY30sdi5kZWJvdW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPWZ1bmN0aW9uKGUsbil7aT1udWxsLG4mJihyPXQuYXBwbHkoZSxuKSl9LHM9dyhmdW5jdGlvbihzKXtpZihpJiZjbGVhclRpbWVvdXQoaSksbil7dmFyIGE9IWk7aT1zZXRUaW1lb3V0KG8sZSksYSYmKHI9dC5hcHBseSh0aGlzLHMpKX1lbHNlIGk9di5kZWxheShvLGUsdGhpcyxzKTtyZXR1cm4gcn0pO3JldHVybiBzLmNhbmNlbD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChpKSxpPW51bGx9LHN9LHYud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB2LnBhcnRpYWwoZSx0KX0sdi5uZWdhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sdi5jb21wb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49ZSxpPXRbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpO24tLTspaT10W25dLmNhbGwodGhpcyxpKTtyZXR1cm4gaX19LHYuYWZ0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtpZigtLXQ8MSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx2LmJlZm9yZT1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiBmdW5jdGlvbigpe3JldHVybi0tdD4wJiYobj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdDw9MSYmKGU9bnVsbCksbn19LHYub25jZT12LnBhcnRpYWwodi5iZWZvcmUsMiksdi5yZXN0QXJndW1lbnRzPXc7dmFyIEQ9IXt0b1N0cmluZzpudWxsfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgidG9TdHJpbmciKSxSPVsidmFsdWVPZiIsImlzUHJvdG90eXBlT2YiLCJ0b1N0cmluZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiaGFzT3duUHJvcGVydHkiLCJ0b0xvY2FsZVN0cmluZyJdLHo9ZnVuY3Rpb24odCxlKXt2YXIgbj1SLmxlbmd0aCxpPXQuY29uc3RydWN0b3Iscj12LmlzRnVuY3Rpb24oaSkmJmkucHJvdG90eXBlfHxhLG89ImNvbnN0cnVjdG9yIjtmb3IoUyh0LG8pJiYhdi5jb250YWlucyhlLG8pJiZlLnB1c2gobyk7bi0tOykobz1SW25dKWluIHQmJnRbb10hPT1yW29dJiYhdi5jb250YWlucyhlLG8pJiZlLnB1c2gobyl9O3Yua2V5cz1mdW5jdGlvbih0KXtpZighdi5pc09iamVjdCh0KSlyZXR1cm5bXTtpZihwKXJldHVybiBwKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KVModCxuKSYmZS5wdXNoKG4pO3JldHVybiBEJiZ6KHQsZSksZX0sdi5hbGxLZXlzPWZ1bmN0aW9uKHQpe2lmKCF2LmlzT2JqZWN0KHQpKXJldHVybltdO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gRCYmeih0LGUpLGV9LHYudmFsdWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT12LmtleXModCksbj1lLmxlbmd0aCxpPUFycmF5KG4pLHI9MDtyPG47cisrKWlbcl09dFtlW3JdXTtyZXR1cm4gaX0sdi5tYXBPYmplY3Q9ZnVuY3Rpb24odCxlLG4pe2U9XyhlLG4pO2Zvcih2YXIgaT12LmtleXModCkscj1pLmxlbmd0aCxvPXt9LHM9MDtzPHI7cysrKXt2YXIgYT1pW3NdO29bYV09ZSh0W2FdLGEsdCl9cmV0dXJuIG99LHYucGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXYua2V5cyh0KSxuPWUubGVuZ3RoLGk9QXJyYXkobikscj0wO3I8bjtyKyspaVtyXT1bZVtyXSx0W2Vbcl1dXTtyZXR1cm4gaX0sdi5pbnZlcnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LG49di5rZXlzKHQpLGk9MCxyPW4ubGVuZ3RoO2k8cjtpKyspZVt0W25baV1dXT1uW2ldO3JldHVybiBlfSx2LmZ1bmN0aW9ucz12Lm1ldGhvZHM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpdi5pc0Z1bmN0aW9uKHRbbl0pJiZlLnB1c2gobik7cmV0dXJuIGUuc29ydCgpfTt2YXIgTj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGUmJihuPU9iamVjdChuKSksaTwyfHxudWxsPT1uKXJldHVybiBuO2Zvcih2YXIgcj0xO3I8aTtyKyspZm9yKHZhciBvPWFyZ3VtZW50c1tyXSxzPXQobyksYT1zLmxlbmd0aCx1PTA7dTxhO3UrKyl7dmFyIGM9c1t1XTtlJiZ2b2lkIDAhPT1uW2NdfHwobltjXT1vW2NdKX1yZXR1cm4gbn19O3YuZXh0ZW5kPU4odi5hbGxLZXlzKSx2LmV4dGVuZE93bj12LmFzc2lnbj1OKHYua2V5cyksdi5maW5kS2V5PWZ1bmN0aW9uKHQsZSxuKXtlPV8oZSxuKTtmb3IodmFyIGkscj12LmtleXModCksbz0wLHM9ci5sZW5ndGg7bzxzO28rKylpZihlKHRbaT1yW29dXSxpLHQpKXJldHVybiBpfTt2YXIgVyxxLEg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluIG59O3YucGljaz13KGZ1bmN0aW9uKHQsZSl7dmFyIG49e30saT1lWzBdO2lmKG51bGw9PXQpcmV0dXJuIG47di5pc0Z1bmN0aW9uKGkpPyhlLmxlbmd0aD4xJiYoaT15KGksZVsxXSkpLGU9di5hbGxLZXlzKHQpKTooaT1ILGU9aihlLCExLCExKSx0PU9iamVjdCh0KSk7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXt2YXIgcz1lW3JdLGE9dFtzXTtpKGEscyx0KSYmKG5bc109YSl9cmV0dXJuIG59KSx2Lm9taXQ9dyhmdW5jdGlvbih0LGUpe3ZhciBuLGk9ZVswXTtyZXR1cm4gdi5pc0Z1bmN0aW9uKGkpPyhpPXYubmVnYXRlKGkpLGUubGVuZ3RoPjEmJihuPWVbMV0pKTooZT12Lm1hcChqKGUsITEsITEpLFN0cmluZyksaT1mdW5jdGlvbih0LG4pe3JldHVybiF2LmNvbnRhaW5zKGUsbil9KSx2LnBpY2sodCxpLG4pfSksdi5kZWZhdWx0cz1OKHYuYWxsS2V5cywhMCksdi5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj14KHQpO3JldHVybiBlJiZ2LmV4dGVuZE93bihuLGUpLG59LHYuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHYuaXNPYmplY3QodCk/di5pc0FycmF5KHQpP3Quc2xpY2UoKTp2LmV4dGVuZCh7fSx0KTp0fSx2LnRhcD1mdW5jdGlvbih0LGUpe3JldHVybiBlKHQpLHR9LHYuaXNNYXRjaD1mdW5jdGlvbih0LGUpe3ZhciBuPXYua2V5cyhlKSxpPW4ubGVuZ3RoO2lmKG51bGw9PXQpcmV0dXJuIWk7Zm9yKHZhciByPU9iamVjdCh0KSxvPTA7bzxpO28rKyl7dmFyIHM9bltvXTtpZihlW3NdIT09cltzXXx8IShzIGluIHIpKXJldHVybiExfXJldHVybiEwfSxXPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQ9PT1lKXJldHVybiAwIT09dHx8MS90PT0xL2U7aWYobnVsbD09dHx8bnVsbD09ZSlyZXR1cm4hMTtpZih0IT10KXJldHVybiBlIT1lO3ZhciByPXR5cGVvZiB0O3JldHVybigiZnVuY3Rpb24iPT09cnx8Im9iamVjdCI9PT1yfHwib2JqZWN0Ij09dHlwZW9mIGUpJiZxKHQsZSxuLGkpfSxxPWZ1bmN0aW9uKHQsZSxuLGkpe3QgaW5zdGFuY2VvZiB2JiYodD10Ll93cmFwcGVkKSxlIGluc3RhbmNlb2YgdiYmKGU9ZS5fd3JhcHBlZCk7dmFyIHI9bC5jYWxsKHQpO2lmKHIhPT1sLmNhbGwoZSkpcmV0dXJuITE7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIiIrdD09IiIrZTtjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuK3QhPSt0PytlIT0rZTowPT0rdD8xLyt0PT0xL2U6K3Q9PStlO2Nhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpyZXR1cm4rdD09K2U7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOnJldHVybiB1LnZhbHVlT2YuY2FsbCh0KT09PXUudmFsdWVPZi5jYWxsKGUpfXZhciBvPSJbb2JqZWN0IEFycmF5XSI9PT1yO2lmKCFvKXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgcz10LmNvbnN0cnVjdG9yLGE9ZS5jb25zdHJ1Y3RvcjtpZihzIT09YSYmISh2LmlzRnVuY3Rpb24ocykmJnMgaW5zdGFuY2VvZiBzJiZ2LmlzRnVuY3Rpb24oYSkmJmEgaW5zdGFuY2VvZiBhKSYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBlKXJldHVybiExfWk9aXx8W107Zm9yKHZhciBjPShuPW58fFtdKS5sZW5ndGg7Yy0tOylpZihuW2NdPT09dClyZXR1cm4gaVtjXT09PWU7aWYobi5wdXNoKHQpLGkucHVzaChlKSxvKXtpZigoYz10Lmxlbmd0aCkhPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IoO2MtLTspaWYoIVcodFtjXSxlW2NdLG4saSkpcmV0dXJuITF9ZWxzZXt2YXIgaCxkPXYua2V5cyh0KTtpZihjPWQubGVuZ3RoLHYua2V5cyhlKS5sZW5ndGghPT1jKXJldHVybiExO2Zvcig7Yy0tOylpZihoPWRbY10sIVMoZSxoKXx8IVcodFtoXSxlW2hdLG4saSkpcmV0dXJuITF9cmV0dXJuIG4ucG9wKCksaS5wb3AoKSwhMH0sdi5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFcodCxlKX0sdi5pc0VtcHR5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwoayh0KSYmKHYuaXNBcnJheSh0KXx8di5pc1N0cmluZyh0KXx8di5pc0FyZ3VtZW50cyh0KSk/MD09PXQubGVuZ3RoOjA9PT12LmtleXModCkubGVuZ3RoKX0sdi5pc0VsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8MSE9PXQubm9kZVR5cGUpfSx2LmlzQXJyYXk9Znx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PWwuY2FsbCh0KX0sdi5pc09iamVjdD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4iZnVuY3Rpb24iPT09ZXx8Im9iamVjdCI9PT1lJiYhIXR9LHYuZWFjaChbIkFyZ3VtZW50cyIsIkZ1bmN0aW9uIiwiU3RyaW5nIiwiTnVtYmVyIiwiRGF0ZSIsIlJlZ0V4cCIsIkVycm9yIiwiU3ltYm9sIiwiTWFwIiwiV2Vha01hcCIsIlNldCIsIldlYWtTZXQiXSxmdW5jdGlvbih0KXt2WyJpcyIrdF09ZnVuY3Rpb24oZSl7cmV0dXJuIGwuY2FsbChlKT09PSJbb2JqZWN0ICIrdCsiXSJ9fSksdi5pc0FyZ3VtZW50cyhhcmd1bWVudHMpfHwodi5pc0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gUyh0LCJjYWxsZWUiKX0pO3ZhciBGPXIuZG9jdW1lbnQmJnIuZG9jdW1lbnQuY2hpbGROb2Rlczsib2JqZWN0IiE9dHlwZW9mIEludDhBcnJheSYmImZ1bmN0aW9uIiE9dHlwZW9mIEYmJih2LmlzRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR8fCExfSksdi5pc0Zpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hdi5pc1N5bWJvbCh0KSYmaXNGaW5pdGUodCkmJiFpc05hTihwYXJzZUZsb2F0KHQpKX0sdi5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gdi5pc051bWJlcih0KSYmaXNOYU4odCl9LHYuaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHwiW29iamVjdCBCb29sZWFuXSI9PT1sLmNhbGwodCl9LHYuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0sdi5pc1VuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH0sdi5oYXM9ZnVuY3Rpb24odCxlKXtpZighdi5pc0FycmF5KGUpKXJldHVybiBTKHQsZSk7Zm9yKHZhciBuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXt2YXIgcj1lW2ldO2lmKG51bGw9PXR8fCFkLmNhbGwodCxyKSlyZXR1cm4hMTt0PXRbcl19cmV0dXJuISFufSx2Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gci5fPW8sdGhpc30sdi5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdi5jb25zdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHYubm9vcD1mdW5jdGlvbigpe30sdi5wcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4gdi5pc0FycmF5KHQpP2Z1bmN0aW9uKGUpe3JldHVybiBFKGUsdCl9Ok0odCl9LHYucHJvcGVydHlPZj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9mdW5jdGlvbigpe306ZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNBcnJheShlKT9FKHQsZSk6dFtlXX19LHYubWF0Y2hlcj12Lm1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9di5leHRlbmRPd24oe30sdCksZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNNYXRjaChlLHQpfX0sdi50aW1lcz1mdW5jdGlvbih0LGUsbil7dmFyIGk9QXJyYXkoTWF0aC5tYXgoMCx0KSk7ZT15KGUsbiwxKTtmb3IodmFyIHI9MDtyPHQ7cisrKWlbcl09ZShyKTtyZXR1cm4gaX0sdi5yYW5kb209ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLXQrMSkpfSx2Lm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFY9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCJgIjoiJiN4NjA7In0sVT12LmludmVydChWKSxLPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSxuPSIoPzoiK3Yua2V5cyh0KS5qb2luKCJ8IikrIikiLGk9UmVnRXhwKG4pLHI9UmVnRXhwKG4sImciKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8iIjoiIit0LGkudGVzdCh0KT90LnJlcGxhY2UocixlKTp0fX07di5lc2NhcGU9SyhWKSx2LnVuZXNjYXBlPUsoVSksdi5yZXN1bHQ9ZnVuY3Rpb24odCxlLG4pe3YuaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgaT1lLmxlbmd0aDtpZighaSlyZXR1cm4gdi5pc0Z1bmN0aW9uKG4pP24uY2FsbCh0KTpuO2Zvcih2YXIgcj0wO3I8aTtyKyspe3ZhciBvPW51bGw9PXQ/dm9pZCAwOnRbZVtyXV07dm9pZCAwPT09byYmKG89bixyPWkpLHQ9di5pc0Z1bmN0aW9uKG8pP28uY2FsbCh0KTpvfXJldHVybiB0fTt2YXIgWT0wO3YudW5pcXVlSWQ9ZnVuY3Rpb24odCl7dmFyIGU9KytZKyIiO3JldHVybiB0P3QrZTplfSx2LnRlbXBsYXRlU2V0dGluZ3M9e2V2YWx1YXRlOi88JShbXHNcU10rPyklPi9nLGludGVycG9sYXRlOi88JT0oW1xzXFNdKz8pJT4vZyxlc2NhcGU6LzwlLShbXHNcU10rPyklPi9nfTt2YXIgWD0vKC4pXi8sJD17IiciOiInIiwiXFwiOiJcXCIsIlxyIjoiciIsIlxuIjoibiIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxHPS9cXHwnfFxyfFxufFx1MjAyOHxcdTIwMjkvZyxKPWZ1bmN0aW9uKHQpe3JldHVybiJcXCIrJFt0XX07di50ZW1wbGF0ZT1mdW5jdGlvbih0LGUsbil7IWUmJm4mJihlPW4pLGU9di5kZWZhdWx0cyh7fSxlLHYudGVtcGxhdGVTZXR0aW5ncyk7dmFyIGkscj1SZWdFeHAoWyhlLmVzY2FwZXx8WCkuc291cmNlLChlLmludGVycG9sYXRlfHxYKS5zb3VyY2UsKGUuZXZhbHVhdGV8fFgpLnNvdXJjZV0uam9pbigifCIpKyJ8JCIsImciKSxvPTAscz0iX19wKz0nIjt0LnJlcGxhY2UocixmdW5jdGlvbihlLG4saSxyLGEpe3JldHVybiBzKz10LnNsaWNlKG8sYSkucmVwbGFjZShHLEopLG89YStlLmxlbmd0aCxuP3MrPSInK1xuKChfX3Q9KCIrbisiKSk9PW51bGw/Jyc6Xy5lc2NhcGUoX190KSkrXG4nIjppP3MrPSInK1xuKChfX3Q9KCIraSsiKSk9PW51bGw/Jyc6X190KStcbiciOnImJihzKz0iJztcbiIrcisiXG5fX3ArPSciKSxlfSkscys9Iic7XG4iLGUudmFyaWFibGV8fChzPSJ3aXRoKG9ianx8e30pe1xuIitzKyJ9XG4iKSxzPSJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4scHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcbiIrcysicmV0dXJuIF9fcDtcbiI7dHJ5e2k9bmV3IEZ1bmN0aW9uKGUudmFyaWFibGV8fCJvYmoiLCJfIixzKX1jYXRjaCh0KXt0aHJvdyB0LnNvdXJjZT1zLHR9dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGkuY2FsbCh0aGlzLHQsdil9LHU9ZS52YXJpYWJsZXx8Im9iaiI7cmV0dXJuIGEuc291cmNlPSJmdW5jdGlvbigiK3UrIil7XG4iK3MrIn0iLGF9LHYuY2hhaW49ZnVuY3Rpb24odCl7dmFyIGU9dih0KTtyZXR1cm4gZS5fY2hhaW49ITAsZX07dmFyIFo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2hhaW4/dihlKS5jaGFpbigpOmV9O3YubWl4aW49ZnVuY3Rpb24odCl7cmV0dXJuIHYuZWFjaCh2LmZ1bmN0aW9ucyh0KSxmdW5jdGlvbihlKXt2YXIgbj12W2VdPXRbZV07di5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5fd3JhcHBlZF07cmV0dXJuIGMuYXBwbHkodCxhcmd1bWVudHMpLFoodGhpcyxuLmFwcGx5KHYsdCkpfX0pLHZ9LHYubWl4aW4odiksdi5lYWNoKFsicG9wIiwicHVzaCIsInJldmVyc2UiLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sZnVuY3Rpb24odCl7dmFyIGU9c1t0XTt2LnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX3dyYXBwZWQ7cmV0dXJuIGUuYXBwbHkobixhcmd1bWVudHMpLCJzaGlmdCIhPT10JiYic3BsaWNlIiE9PXR8fDAhPT1uLmxlbmd0aHx8ZGVsZXRlIG5bMF0sWih0aGlzLG4pfX0pLHYuZWFjaChbImNvbmNhdCIsImpvaW4iLCJzbGljZSJdLGZ1bmN0aW9uKHQpe3ZhciBlPXNbdF07di5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gWih0aGlzLGUuYXBwbHkodGhpcy5fd3JhcHBlZCxhcmd1bWVudHMpKX19KSx2LnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93cmFwcGVkfSx2LnByb3RvdHlwZS52YWx1ZU9mPXYucHJvdG90eXBlLnRvSlNPTj12LnByb3RvdHlwZS52YWx1ZSx2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCl9LHZvaWQgMD09PShpPWZ1bmN0aW9uKCl7cmV0dXJuIHZ9LmFwcGx5KGUsW10pKXx8KG4uZXhwb3J0cz1pKX0oKX0pLmNhbGwodGhpcyxuKDEzKSxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oNSksdT1uKDMwKSxjPW4oMTEpLGg9big3NyksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuX2ZsYWdzPTAsdGhpcy5fbGF5b3V0PW51bGwsdGhpcy5fcGFyZW50PW51bGwsdGhpcy5fZGlzcG9zZWQ9bmV3IGMuU2lnbmFsKHRoaXMpLHRoaXMubm9kZT1vLmNyZWF0ZU5vZGUodCksdGhpcy5hZGRDbGFzcygicC1XaWRnZXQiKX1yZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuaXNEaXNwb3NlZHx8KHRoaXMuc2V0RmxhZyh0LkZsYWcuSXNEaXNwb3NlZCksdGhpcy5fZGlzcG9zZWQuZW1pdCh2b2lkIDApLHRoaXMucGFyZW50P3RoaXMucGFyZW50PW51bGw6dGhpcy5pc0F0dGFjaGVkJiZ0LmRldGFjaCh0aGlzKSx0aGlzLl9sYXlvdXQmJih0aGlzLl9sYXlvdXQuZGlzcG9zZSgpLHRoaXMuX2xheW91dD1udWxsKSxjLlNpZ25hbC5jbGVhckRhdGEodGhpcyksYS5NZXNzYWdlTG9vcC5jbGVhckRhdGEodGhpcyksdS5BdHRhY2hlZFByb3BlcnR5LmNsZWFyRGF0YSh0aGlzKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGVzdEZsYWcodC5GbGFnLklzRGlzcG9zZWQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBdHRhY2hlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc0F0dGFjaGVkKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzSGlkZGVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGVzdEZsYWcodC5GbGFnLklzSGlkZGVuKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVmlzaWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc1Zpc2libGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidGl0bGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby50aXRsZVByb3BlcnR5LmdldCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5pZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubm9kZS5pZD10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGF0YXNldCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZGF0YXNldH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBhcmVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJlbnR9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzLl9wYXJlbnQhPT1lKXtpZihlJiZ0aGlzLmNvbnRhaW5zKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJlbnQgd2lkZ2V0LiIpO2lmKHRoaXMuX3BhcmVudCYmIXRoaXMuX3BhcmVudC5pc0Rpc3Bvc2VkKXt2YXIgbj1uZXcgdC5DaGlsZE1lc3NhZ2UoImNoaWxkLXJlbW92ZWQiLHRoaXMpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5fcGFyZW50LG4pfWlmKHRoaXMuX3BhcmVudD1lLHRoaXMuX3BhcmVudCYmIXRoaXMuX3BhcmVudC5pc0Rpc3Bvc2VkKXtuPW5ldyB0LkNoaWxkTWVzc2FnZSgiY2hpbGQtYWRkZWQiLHRoaXMpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5fcGFyZW50LG4pfXRoaXMuaXNEaXNwb3NlZHx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLlBhcmVudENoYW5nZWQpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxheW91dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXlvdXR9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzLl9sYXlvdXQhPT1lKXtpZih0aGlzLnRlc3RGbGFnKHQuRmxhZy5EaXNhbGxvd0xheW91dCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHdpZGdldCBsYXlvdXQuIik7aWYodGhpcy5fbGF5b3V0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNoYW5nZSB3aWRnZXQgbGF5b3V0LiIpO2lmKGUucGFyZW50KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNoYW5nZSBsYXlvdXQgcGFyZW50LiIpO3RoaXMuX2xheW91dD1lLGUucGFyZW50PXRoaXN9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheW91dD90aGlzLl9sYXlvdXQuaXRlcigpOnMuZW1wdHkoKX0sdC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ7ZTtlPWUuX3BhcmVudClpZihlPT09dGhpcylyZXR1cm4hMDtyZXR1cm4hMX0sdC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZS5jbGFzc0xpc3QuY29udGFpbnModCl9LHQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQpe3RoaXMubm9kZS5jbGFzc0xpc3QuYWRkKHQpfSx0LnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbih0KXt0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSh0KX0sdC5wcm90b3R5cGUudG9nZ2xlQ2xhc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4hMD09PWU/KHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKHQpLCEwKTohMT09PWU/KHRoaXMubm9kZS5jbGFzc0xpc3QucmVtb3ZlKHQpLCExKTp0aGlzLm5vZGUuY2xhc3NMaXN0LnRvZ2dsZSh0KX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLHQuTXNnLlVwZGF0ZVJlcXVlc3QpfSx0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24oKXthLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKHRoaXMsdC5Nc2cuRml0UmVxdWVzdCl9LHQucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLHQuTXNnLkFjdGl2YXRlUmVxdWVzdCl9LHQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkNsb3NlUmVxdWVzdCl9LHQucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtpZih0aGlzLnRlc3RGbGFnKHQuRmxhZy5Jc0hpZGRlbikmJighdGhpcy5pc0F0dGFjaGVkfHx0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmlzVmlzaWJsZXx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkJlZm9yZVNob3cpLHRoaXMuY2xlYXJGbGFnKHQuRmxhZy5Jc0hpZGRlbiksdGhpcy5yZW1vdmVDbGFzcygicC1tb2QtaGlkZGVuIiksIXRoaXMuaXNBdHRhY2hlZHx8dGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5pc1Zpc2libGV8fGEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyx0Lk1zZy5BZnRlclNob3cpLHRoaXMucGFyZW50KSl7dmFyIGU9bmV3IHQuQ2hpbGRNZXNzYWdlKCJjaGlsZC1zaG93biIsdGhpcyk7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudCxlKX19LHQucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZighdGhpcy50ZXN0RmxhZyh0LkZsYWcuSXNIaWRkZW4pJiYoIXRoaXMuaXNBdHRhY2hlZHx8dGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5pc1Zpc2libGV8fGEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyx0Lk1zZy5CZWZvcmVIaWRlKSx0aGlzLnNldEZsYWcodC5GbGFnLklzSGlkZGVuKSx0aGlzLmFkZENsYXNzKCJwLW1vZC1oaWRkZW4iKSwhdGhpcy5pc0F0dGFjaGVkfHx0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmlzVmlzaWJsZXx8YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLHQuTXNnLkFmdGVySGlkZSksdGhpcy5wYXJlbnQpKXt2YXIgZT1uZXcgdC5DaGlsZE1lc3NhZ2UoImNoaWxkLWhpZGRlbiIsdGhpcyk7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudCxlKX19LHQucHJvdG90eXBlLnNldEhpZGRlbj1mdW5jdGlvbih0KXt0P3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfSx0LnByb3RvdHlwZS50ZXN0RmxhZz1mdW5jdGlvbih0KXtyZXR1cm4gMCE9KHRoaXMuX2ZsYWdzJnQpfSx0LnByb3RvdHlwZS5zZXRGbGFnPWZ1bmN0aW9uKHQpe3RoaXMuX2ZsYWdzfD10fSx0LnByb3RvdHlwZS5jbGVhckZsYWc9ZnVuY3Rpb24odCl7dGhpcy5fZmxhZ3MmPX50fSx0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXtzd2l0Y2goZS50eXBlKXtjYXNlInJlc2l6ZSI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vblJlc2l6ZShlKTticmVhaztjYXNlInVwZGF0ZS1yZXF1ZXN0Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uVXBkYXRlUmVxdWVzdChlKTticmVhaztjYXNlImZpdC1yZXF1ZXN0Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uRml0UmVxdWVzdChlKTticmVhaztjYXNlImJlZm9yZS1zaG93Ijp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQmVmb3JlU2hvdyhlKTticmVhaztjYXNlImFmdGVyLXNob3ciOnRoaXMuc2V0RmxhZyh0LkZsYWcuSXNWaXNpYmxlKSx0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQWZ0ZXJTaG93KGUpO2JyZWFrO2Nhc2UiYmVmb3JlLWhpZGUiOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25CZWZvcmVIaWRlKGUpO2JyZWFrO2Nhc2UiYWZ0ZXItaGlkZSI6dGhpcy5jbGVhckZsYWcodC5GbGFnLklzVmlzaWJsZSksdGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFmdGVySGlkZShlKTticmVhaztjYXNlImJlZm9yZS1hdHRhY2giOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25CZWZvcmVBdHRhY2goZSk7YnJlYWs7Y2FzZSJhZnRlci1hdHRhY2giOnRoaXMuaXNIaWRkZW58fHRoaXMucGFyZW50JiYhdGhpcy5wYXJlbnQuaXNWaXNpYmxlfHx0aGlzLnNldEZsYWcodC5GbGFnLklzVmlzaWJsZSksdGhpcy5zZXRGbGFnKHQuRmxhZy5Jc0F0dGFjaGVkKSx0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQWZ0ZXJBdHRhY2goZSk7YnJlYWs7Y2FzZSJiZWZvcmUtZGV0YWNoIjp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQmVmb3JlRGV0YWNoKGUpO2JyZWFrO2Nhc2UiYWZ0ZXItZGV0YWNoIjp0aGlzLmNsZWFyRmxhZyh0LkZsYWcuSXNWaXNpYmxlKSx0aGlzLmNsZWFyRmxhZyh0LkZsYWcuSXNBdHRhY2hlZCksdGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFmdGVyRGV0YWNoKGUpO2JyZWFrO2Nhc2UiYWN0aXZhdGUtcmVxdWVzdCI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkFjdGl2YXRlUmVxdWVzdChlKTticmVhaztjYXNlImNsb3NlLXJlcXVlc3QiOnRoaXMubm90aWZ5TGF5b3V0KGUpLHRoaXMub25DbG9zZVJlcXVlc3QoZSk7YnJlYWs7Y2FzZSJjaGlsZC1hZGRlZCI6dGhpcy5ub3RpZnlMYXlvdXQoZSksdGhpcy5vbkNoaWxkQWRkZWQoZSk7YnJlYWs7Y2FzZSJjaGlsZC1yZW1vdmVkIjp0aGlzLm5vdGlmeUxheW91dChlKSx0aGlzLm9uQ2hpbGRSZW1vdmVkKGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub3RpZnlMYXlvdXQoZSl9fSx0LnByb3RvdHlwZS5ub3RpZnlMYXlvdXQ9ZnVuY3Rpb24odCl7dGhpcy5fbGF5b3V0JiZ0aGlzLl9sYXlvdXQucHJvY2Vzc1BhcmVudE1lc3NhZ2UodCl9LHQucHJvdG90eXBlLm9uQ2xvc2VSZXF1ZXN0PWZ1bmN0aW9uKGUpe3RoaXMucGFyZW50P3RoaXMucGFyZW50PW51bGw6dGhpcy5pc0F0dGFjaGVkJiZ0LmRldGFjaCh0aGlzKX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkZpdFJlcXVlc3Q9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJTaG93PWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25CZWZvcmVIaWRlPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25BZnRlckhpZGU9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJBdHRhY2g9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkJlZm9yZURldGFjaD1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkNoaWxkQWRkZWQ9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt9LHR9KCk7ZS5XaWRnZXQ9bCxmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7dFt0LklzRGlzcG9zZWQ9MV09IklzRGlzcG9zZWQiLHRbdC5Jc0F0dGFjaGVkPTJdPSJJc0F0dGFjaGVkIix0W3QuSXNIaWRkZW49NF09IklzSGlkZGVuIix0W3QuSXNWaXNpYmxlPThdPSJJc1Zpc2libGUiLHRbdC5EaXNhbGxvd0xheW91dD0xNl09IkRpc2FsbG93TGF5b3V0In0odC5GbGFnfHwodC5GbGFnPXt9KSksZnVuY3Rpb24odCl7dC5CZWZvcmVTaG93PW5ldyBhLk1lc3NhZ2UoImJlZm9yZS1zaG93IiksdC5BZnRlclNob3c9bmV3IGEuTWVzc2FnZSgiYWZ0ZXItc2hvdyIpLHQuQmVmb3JlSGlkZT1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtaGlkZSIpLHQuQWZ0ZXJIaWRlPW5ldyBhLk1lc3NhZ2UoImFmdGVyLWhpZGUiKSx0LkJlZm9yZUF0dGFjaD1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtYXR0YWNoIiksdC5BZnRlckF0dGFjaD1uZXcgYS5NZXNzYWdlKCJhZnRlci1hdHRhY2giKSx0LkJlZm9yZURldGFjaD1uZXcgYS5NZXNzYWdlKCJiZWZvcmUtZGV0YWNoIiksdC5BZnRlckRldGFjaD1uZXcgYS5NZXNzYWdlKCJhZnRlci1kZXRhY2giKSx0LlBhcmVudENoYW5nZWQ9bmV3IGEuTWVzc2FnZSgicGFyZW50LWNoYW5nZWQiKSx0LlVwZGF0ZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJ1cGRhdGUtcmVxdWVzdCIpLHQuRml0UmVxdWVzdD1uZXcgYS5Db25mbGF0YWJsZU1lc3NhZ2UoImZpdC1yZXF1ZXN0IiksdC5BY3RpdmF0ZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJhY3RpdmF0ZS1yZXF1ZXN0IiksdC5DbG9zZVJlcXVlc3Q9bmV3IGEuQ29uZmxhdGFibGVNZXNzYWdlKCJjbG9zZS1yZXF1ZXN0Iil9KHQuTXNnfHwodC5Nc2c9e30pKTt2YXIgZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIGkuY2hpbGQ9bixpfXJldHVybiByKGUsdCksZX0oYS5NZXNzYWdlKTt0LkNoaWxkTWVzc2FnZT1lO3ZhciBuPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcywicmVzaXplIil8fHRoaXM7cmV0dXJuIGkud2lkdGg9ZSxpLmhlaWdodD1uLGl9cmV0dXJuIHIoZSx0KSxlfShhLk1lc3NhZ2UpO3QuUmVzaXplTWVzc2FnZT1uLGZ1bmN0aW9uKHQpe3QuVW5rbm93blNpemU9bmV3IHQoLTEsLTEpfShuPXQuUmVzaXplTWVzc2FnZXx8KHQuUmVzaXplTWVzc2FnZT17fSkpLHQuYXR0YWNoPWZ1bmN0aW9uKGUsbixpKXtpZih2b2lkIDA9PT1pJiYoaT1udWxsKSxlLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBhdHRhY2ggYSBjaGlsZCB3aWRnZXQuIik7aWYoZS5pc0F0dGFjaGVkfHxkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGUubm9kZSkpdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgaXMgYWxyZWFkeSBhdHRhY2hlZC4iKTtpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhuKSl0aHJvdyBuZXcgRXJyb3IoIkhvc3QgaXMgbm90IGF0dGFjaGVkLiIpO2EuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0Lk1zZy5CZWZvcmVBdHRhY2gpLG4uaW5zZXJ0QmVmb3JlKGUubm9kZSxpKSxhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdC5Nc2cuQWZ0ZXJBdHRhY2gpfSx0LmRldGFjaD1mdW5jdGlvbihlKXtpZihlLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBkZXRhY2ggYSBjaGlsZCB3aWRnZXQuIik7aWYoIWUuaXNBdHRhY2hlZHx8IWRvY3VtZW50LmJvZHkuY29udGFpbnMoZS5ub2RlKSl0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBpcyBub3QgYXR0YWNoZWQuIik7YS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQuTXNnLkJlZm9yZURldGFjaCksZS5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5ub2RlKSxhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdC5Nc2cuQWZ0ZXJEZXRhY2gpfX0obD1lLldpZGdldHx8KGUuV2lkZ2V0PXt9KSksZS5XaWRnZXQ9bCxmdW5jdGlvbih0KXt0LnRpdGxlUHJvcGVydHk9bmV3IHUuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToidGl0bGUiLGNyZWF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGguVGl0bGUoe293bmVyOnR9KX19KSx0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigxNDEpKSxpKG4oNzUpKSxpKG4oMzMzKSksaShuKDMzNCkpLGkobigzMzUpKSxpKG4oMzM2KSksaShuKDc0KSksaShuKDI1KSksaShuKDMzNykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGkobigzMTcpKSxpKG4oMzE4KSksaShuKDMxOSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPWU7aS52ZXJzaW9uPW4oMTg4KS52ZXJzaW9uLGkudXRpbHM9bigxODkpLGkucmFuZD1uKDEwNSksaS5jdXJ2ZT1uKDQ4KSxpLmN1cnZlcz1uKDE5NCksaS5lYz1uKDIwMiksaS5lZGRzYT1uKDIwNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaSxyPW4oMiksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5zZW5kZXI9dH1yZXR1cm4gdC5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiBpLmNvbm5lY3QodGhpcyx0LGUpfSx0LnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuZGlzY29ubmVjdCh0aGlzLHQsZSl9LHQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7aS5lbWl0KHRoaXMsdCl9LHR9KCk7ZS5TaWduYWw9byxmdW5jdGlvbih0KXt0LmRpc2Nvbm5lY3RCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7aS5kaXNjb25uZWN0QmV0d2Vlbih0LGUpfSx0LmRpc2Nvbm5lY3RTZW5kZXI9ZnVuY3Rpb24odCl7aS5kaXNjb25uZWN0U2VuZGVyKHQpfSx0LmRpc2Nvbm5lY3RSZWNlaXZlcj1mdW5jdGlvbih0KXtpLmRpc2Nvbm5lY3RSZWNlaXZlcih0KX0sdC5kaXNjb25uZWN0QWxsPWZ1bmN0aW9uKHQpe2kuZGlzY29ubmVjdEFsbCh0KX0sdC5jbGVhckRhdGE9ZnVuY3Rpb24odCl7aS5kaXNjb25uZWN0QWxsKHQpfSx0LmdldEV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5leGNlcHRpb25IYW5kbGVyfSx0LnNldEV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9aS5leGNlcHRpb25IYW5kbGVyO3JldHVybiBpLmV4Y2VwdGlvbkhhbmRsZXI9dCxlfX0obz1lLlNpZ25hbHx8KGUuU2lnbmFsPXt9KSksZS5TaWduYWw9byxmdW5jdGlvbihlKXtlLmV4Y2VwdGlvbkhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc29sZS5lcnJvcih0KX0sZS5jb25uZWN0PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fHZvaWQgMDt2YXIgbz1uLmdldCh0LnNlbmRlcik7aWYob3x8KG89W10sbi5zZXQodC5zZW5kZXIsbykpLGEobyx0LGUscikpcmV0dXJuITE7dmFyIHM9cnx8ZSx1PWkuZ2V0KHMpO3V8fCh1PVtdLGkuc2V0KHMsdSkpO3ZhciBjPXtzaWduYWw6dCxzbG90OmUsdGhpc0FyZzpyfTtyZXR1cm4gby5wdXNoKGMpLHUucHVzaChjKSwhMH0sZS5kaXNjb25uZWN0PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fHZvaWQgMDt2YXIgbz1uLmdldCh0LnNlbmRlcik7aWYoIW98fDA9PT1vLmxlbmd0aClyZXR1cm4hMTt2YXIgcz1hKG8sdCxlLHIpO2lmKCFzKXJldHVybiExO3ZhciB1PXJ8fGUsaD1pLmdldCh1KTtyZXR1cm4gcy5zaWduYWw9bnVsbCxjKG8pLGMoaCksITB9LGUuZGlzY29ubmVjdEJldHdlZW49ZnVuY3Rpb24odCxlKXt2YXIgbz1uLmdldCh0KTtpZihvJiYwIT09by5sZW5ndGgpe3ZhciBzPWkuZ2V0KGUpO3MmJjAhPT1zLmxlbmd0aCYmKHIuZWFjaChzLGZ1bmN0aW9uKGUpe2Uuc2lnbmFsJiZlLnNpZ25hbC5zZW5kZXI9PT10JiYoZS5zaWduYWw9bnVsbCl9KSxjKG8pLGMocykpfX0sZS5kaXNjb25uZWN0U2VuZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4uZ2V0KHQpO2UmJjAhPT1lLmxlbmd0aCYmKHIuZWFjaChlLGZ1bmN0aW9uKHQpe2lmKHQuc2lnbmFsKXt2YXIgZT10LnRoaXNBcmd8fHQuc2xvdDt0LnNpZ25hbD1udWxsLGMoaS5nZXQoZSkpfX0pLGMoZSkpfSxlLmRpc2Nvbm5lY3RSZWNlaXZlcj1mdW5jdGlvbih0KXt2YXIgZT1pLmdldCh0KTtlJiYwIT09ZS5sZW5ndGgmJihyLmVhY2goZSxmdW5jdGlvbih0KXtpZih0LnNpZ25hbCl7dmFyIGU9dC5zaWduYWwuc2VuZGVyO3Quc2lnbmFsPW51bGwsYyhuLmdldChlKSl9fSksYyhlKSl9LGUuZGlzY29ubmVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZT1uLmdldCh0KTtlJiZlLmxlbmd0aD4wJiYoci5lYWNoKGUsZnVuY3Rpb24odCl7dC5zaWduYWw9bnVsbH0pLGMoZSkpO3ZhciBvPWkuZ2V0KHQpO28mJm8ubGVuZ3RoPjAmJihyLmVhY2gobyxmdW5jdGlvbih0KXt0LnNpZ25hbD1udWxsfSksYyhvKSl9LGUuZW1pdD1mdW5jdGlvbih0LGUpe3ZhciBpPW4uZ2V0KHQuc2VuZGVyKTtpZihpJiYwIT09aS5sZW5ndGgpZm9yKHZhciByPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgcz1pW3JdO3Muc2lnbmFsPT09dCYmdShzLGUpfX07dmFyIG49bmV3IFdlYWtNYXAsaT1uZXcgV2Vha01hcCxvPW5ldyBTZXQscz0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZTp0O2Z1bmN0aW9uIGEodCxlLG4saSl7cmV0dXJuIHIuZmluZCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0LnNpZ25hbD09PWUmJnQuc2xvdD09PW4mJnQudGhpc0FyZz09PWl9KX1mdW5jdGlvbiB1KHQsbil7dmFyIGk9dC5zaWduYWwscj10LnNsb3Qsbz10LnRoaXNBcmc7dHJ5e3IuY2FsbChvLGkuc2VuZGVyLG4pfWNhdGNoKHQpe2UuZXhjZXB0aW9uSGFuZGxlcih0KX19ZnVuY3Rpb24gYyh0KXswPT09by5zaXplJiZzKGgpLG8uYWRkKHQpfWZ1bmN0aW9uIGgoKXtvLmZvckVhY2gobCksby5jbGVhcigpfWZ1bmN0aW9uIGwodCl7ci5BcnJheUV4dC5yZW1vdmVBbGxXaGVyZSh0LGQpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIG51bGw9PT10LnNpZ25hbH19KGl8fChpPXt9KSl9KS5jYWxsKHRoaXMsbig0NCkuc2V0SW1tZWRpYXRlKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big4KSxzPW4oMjMpLGE9big1NyksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQ29yZVdpZGdldE1vZGVsIixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF9tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF92aWV3X21vZHVsZV92ZXJzaW9uOmEuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTn0pfSxlfShvLldpZGdldE1vZGVsKTtlLkNvcmVXaWRnZXRNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkNvcmVET01XaWRnZXRNb2RlbCIsX3ZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfdmlld19tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixfbW9kZWxfbW9kdWxlX3ZlcnNpb246YS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZX0oby5ET01XaWRnZXRNb2RlbCk7ZS5Db3JlRE9NV2lkZ2V0TW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJDb3JlRGVzY3JpcHRpb25Nb2RlbCIsX3ZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfdmlld19tb2R1bGVfdmVyc2lvbjphLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixfbW9kZWxfbW9kdWxlX3ZlcnNpb246YS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZX0ocy5EZXNjcmlwdGlvbk1vZGVsKTtlLkNvcmVEZXNjcmlwdGlvbk1vZGVsPWx9LGZ1bmN0aW9uKHQsZSl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZXx8IkFzc2VydGlvbiBmYWlsZWQiKX10LmV4cG9ydHM9bixuLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtpZih0IT1lKXRocm93IG5ldyBFcnJvcihufHwiQXNzZXJ0aW9uIGZhaWxlZDogIit0KyIgIT0gIitlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4scil7InVzZSBzdHJpY3QiO3ZhciBvPVtdLHM9bi5kb2N1bWVudCxhPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PW8uc2xpY2UsYz1vLmNvbmNhdCxoPW8ucHVzaCxsPW8uaW5kZXhPZixkPXt9LGY9ZC50b1N0cmluZyxwPWQuaGFzT3duUHJvcGVydHksbT1wLnRvU3RyaW5nLGc9bS5jYWxsKE9iamVjdCksdj17fSxiPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LHk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sXz17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciBpLHI9KGU9ZXx8cykuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoci50ZXh0PXQsbilmb3IoaSBpbiBfKW5baV0mJihyW2ldPW5baV0pO2UuaGVhZC5hcHBlbmRDaGlsZChyKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfWZ1bmN0aW9uIHgodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P2RbZi5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IE0uZm4uaW5pdCh0LGUpfSxTPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBFKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPXgodCk7cmV0dXJuIWIodCkmJiF5KHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfU0uZm49TS5wcm90b3R5cGU9e2pxdWVyeToiMy4zLjEiLGNvbnN0cnVjdG9yOk0sbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPU0ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBNLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhNLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0Om8uc29ydCxzcGxpY2U6by5zcGxpY2V9LE0uZXh0ZW5kPU0uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscixvLHM9YXJndW1lbnRzWzBdfHx7fSxhPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIHMmJihjPXMscz1hcmd1bWVudHNbYV18fHt9LGErKyksIm9iamVjdCI9PXR5cGVvZiBzfHxiKHMpfHwocz17fSksYT09PXUmJihzPXRoaXMsYS0tKTthPHU7YSsrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1thXSkpZm9yKGUgaW4gdCluPXNbZV0scyE9PShpPXRbZV0pJiYoYyYmaSYmKE0uaXNQbGFpbk9iamVjdChpKXx8KHI9QXJyYXkuaXNBcnJheShpKSkpPyhyPyhyPSExLG89biYmQXJyYXkuaXNBcnJheShuKT9uOltdKTpvPW4mJk0uaXNQbGFpbk9iamVjdChuKT9uOnt9LHNbZV09TS5leHRlbmQoYyxvLGkpKTp2b2lkIDAhPT1pJiYoc1tlXT1pKSk7cmV0dXJuIHN9LE0uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy4zLjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKHQpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuISghdHx8IltvYmplY3QgT2JqZWN0XSIhPT1mLmNhbGwodCkpJiYoIShlPWEodCkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1wLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcikmJm0uY2FsbChuKT09PWcpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCl7dyh0KX0sZWFjaDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9MDtpZihFKHQpKWZvcihuPXQubGVuZ3RoO2k8biYmITEhPT1lLmNhbGwodFtpXSxpLHRbaV0pO2krKyk7ZWxzZSBmb3IoaSBpbiB0KWlmKCExPT09ZS5jYWxsKHRbaV0saSx0W2ldKSlicmVhaztyZXR1cm4gdH0sdHJpbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShTLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49ZXx8W107cmV0dXJuIG51bGwhPXQmJihFKE9iamVjdCh0KSk/TS5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgdD9bdF06dCk6aC5jYWxsKG4sdCkpLG59LGluQXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lPy0xOmwuY2FsbChlLHQsbil9LG1lcmdlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPStlLmxlbmd0aCxpPTAscj10Lmxlbmd0aDtpPG47aSsrKXRbcisrXT1lW2ldO3JldHVybiB0Lmxlbmd0aD1yLHR9LGdyZXA6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1bXSxyPTAsbz10Lmxlbmd0aCxzPSFuO3I8bztyKyspIWUodFtyXSxyKSE9PXMmJmkucHVzaCh0W3JdKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89MCxzPVtdO2lmKEUodCkpZm9yKGk9dC5sZW5ndGg7bzxpO28rKyludWxsIT0ocj1lKHRbb10sbyxuKSkmJnMucHVzaChyKTtlbHNlIGZvcihvIGluIHQpbnVsbCE9KHI9ZSh0W29dLG8sbikpJiZzLnB1c2gocik7cmV0dXJuIGMuYXBwbHkoW10scyl9LGd1aWQ6MSxzdXBwb3J0OnZ9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoTS5mbltTeW1ib2wuaXRlcmF0b3JdPW9bU3ltYm9sLml0ZXJhdG9yXSksTS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe2RbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2FzZSgpfSk7dmFyIEE9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTYtMDgtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnLHYsYix5LF89InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQseD0wLE09MCxTPXN0KCksRT1zdCgpLEE9c3QoKSxDPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lJiYobD0hMCksMH0saz17fS5oYXNPd25Qcm9wZXJ0eSxPPVtdLFA9Ty5wb3AsVD1PLnB1c2gsaj1PLnB1c2gsST1PLnNsaWNlLEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LEI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixEPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixSPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsej0iXFxbIitEKyIqKCIrUisiKSg/OiIrRCsiKihbKl4kfCF+XT89KSIrRCsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1IrIikpfCkiK0QrIipcXF0iLE49IjooIitSKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18Iit6KyIpKil8LiopXFwpfCkiLFc9bmV3IFJlZ0V4cChEKyIrIiwiZyIpLHE9bmV3IFJlZ0V4cCgiXiIrRCsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitEKyIrJCIsImciKSxIPW5ldyBSZWdFeHAoIl4iK0QrIiosIitEKyIqIiksRj1uZXcgUmVnRXhwKCJeIitEKyIqKFs+K35dfCIrRCsiKSIrRCsiKiIpLFY9bmV3IFJlZ0V4cCgiPSIrRCsiKihbXlxcXSdcIl0qPykiK0QrIipcXF0iLCJnIiksVT1uZXcgUmVnRXhwKE4pLEs9bmV3IFJlZ0V4cCgiXiIrUisiJCIpLFk9e0lEOm5ldyBSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitSKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitSKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIreiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK04pLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrRCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrRCsiKig/OihbKy1dfCkiK0QrIiooXFxkKyl8KSkiK0QrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitEKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0QrIiooKD86LVxcZCk/XFxkKikiK0QrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwkPS9eaFxkJC9pLEc9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLEo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxaPS9bK35dLyxRPW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrRCsiP3woIitEKyIpfC4pIiwiaWciKSx0dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9IjB4IitlLTY1NTM2O3JldHVybiBpIT1pfHxuP2U6aTwwP1N0cmluZy5mcm9tQ2hhckNvZGUoaSs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShpPj4xMHw1NTI5NiwxMDIzJml8NTYzMjApfSxldD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxudD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7ZCgpfSxydD1idChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJigiZm9ybSJpbiB0fHwibGFiZWwiaW4gdCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7ai5hcHBseShPPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksT1t3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtqPXthcHBseTpPLmxlbmd0aD9mdW5jdGlvbih0LGUpe1QuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPTA7dFtuKytdPWVbaSsrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIG90KHQsZSxpLHIpe3ZhciBvLGEsYyxoLGwscCx2LGI9ZSYmZS5vd25lckRvY3VtZW50LHg9ZT9lLm5vZGVUeXBlOjk7aWYoaT1pfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09eCYmOSE9PXgmJjExIT09eClyZXR1cm4gaTtpZighciYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWYmJmQoZSksZT1lfHxmLG0pKXtpZigxMSE9PXgmJihsPUouZXhlYyh0KSkpaWYobz1sWzFdKXtpZig5PT09eCl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQobykpKXJldHVybiBpO2lmKGMuaWQ9PT1vKXJldHVybiBpLnB1c2goYyksaX1lbHNlIGlmKGImJihjPWIuZ2V0RWxlbWVudEJ5SWQobykpJiZ5KGUsYykmJmMuaWQ9PT1vKXJldHVybiBpLnB1c2goYyksaX1lbHNle2lmKGxbMl0pcmV0dXJuIGouYXBwbHkoaSxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxpO2lmKChvPWxbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gai5hcHBseShpLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShvKSksaX1pZihuLnFzYSYmIUFbdCsiICJdJiYoIWd8fCFnLnRlc3QodCkpKXtpZigxIT09eCliPWUsdj10O2Vsc2UgaWYoIm9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2ZvcigoaD1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/aD1oLnJlcGxhY2UoZXQsbnQpOmUuc2V0QXR0cmlidXRlKCJpZCIsaD1fKSxhPShwPXModCkpLmxlbmd0aDthLS07KXBbYV09IiMiK2grIiAiK3Z0KHBbYV0pO3Y9cC5qb2luKCIsIiksYj1aLnRlc3QodCkmJm10KGUucGFyZW50Tm9kZSl8fGV9aWYodil0cnl7cmV0dXJuIGouYXBwbHkoaSxiLnF1ZXJ5U2VsZWN0b3JBbGwodikpLGl9Y2F0Y2godCl7fWZpbmFsbHl7aD09PV8mJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUodC5yZXBsYWNlKHEsIiQxIiksZSxpLHIpfWZ1bmN0aW9uIHN0KCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGUobixyKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT5pLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPXJ9fWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0W19dPSEwLHR9ZnVuY3Rpb24gdXQodCl7dmFyIGU9Zi5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIXQoZSl9Y2F0Y2godCl7cmV0dXJuITF9ZmluYWxseXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGx9fWZ1bmN0aW9uIGN0KHQsZSl7Zm9yKHZhciBuPXQuc3BsaXQoInwiKSxyPW4ubGVuZ3RoO3ItLTspaS5hdHRySGFuZGxlW25bcl1dPWV9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj1lJiZ0LGk9biYmMT09PXQubm9kZVR5cGUmJjE9PT1lLm5vZGVUeXBlJiZ0LnNvdXJjZUluZGV4LWUuc291cmNlSW5kZXg7aWYoaSlyZXR1cm4gaTtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09ZSlyZXR1cm4tMTtyZXR1cm4gdD8xOi0xfWZ1bmN0aW9uIGx0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZnQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZydChlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gYXQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsYXQoZnVuY3Rpb24obixpKXtmb3IodmFyIHIsbz10KFtdLG4ubGVuZ3RoLGUpLHM9by5sZW5ndGg7cy0tOyluW3I9b1tzXV0mJihuW3JdPSEoaVtyXT1uW3JdKSl9KX0pfWZ1bmN0aW9uIG10KHQpe3JldHVybiB0JiZ2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lJiZ0fWZvcihlIGluIG49b3Quc3VwcG9ydD17fSxvPW90LmlzWE1MPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJih0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hIWUmJiJIVE1MIiE9PWUubm9kZU5hbWV9LGQ9b3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUscixzPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIHMhPT1mJiY5PT09cy5ub2RlVHlwZSYmcy5kb2N1bWVudEVsZW1lbnQ/KHA9KGY9cykuZG9jdW1lbnRFbGVtZW50LG09IW8oZiksdyE9PWYmJihyPWYuZGVmYXVsdFZpZXcpJiZyLnRvcCE9PXImJihyLmFkZEV2ZW50TGlzdGVuZXI/ci5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpyLmF0dGFjaEV2ZW50JiZyLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChmLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1HLnRlc3QoZi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9dXQoZnVuY3Rpb24odCl7cmV0dXJuIHAuYXBwZW5kQ2hpbGQodCkuaWQ9XywhZi5nZXRFbGVtZW50c0J5TmFtZXx8IWYuZ2V0RWxlbWVudHNCeU5hbWUoXykubGVuZ3RofSksbi5nZXRCeUlkPyhpLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoUSx0dCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fSxpLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZtKXt2YXIgbj1lLmdldEVsZW1lbnRCeUlkKHQpO3JldHVybiBuP1tuXTpbXX19KTooaS5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKFEsdHQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxpLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZtKXt2YXIgbixpLHIsbz1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKG8pe2lmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltvXTtmb3Iocj1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLGk9MDtvPXJbaSsrXTspaWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW29dfXJldHVybltdfX0pLGkuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixpPVtdLHI9MCxvPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPW9bcisrXTspMT09PW4ubm9kZVR5cGUmJmkucHVzaChuKTtyZXR1cm4gaX1yZXR1cm4gb30saS5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJm0pcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0sdj1bXSxnPVtdLChuLnFzYT1HLnRlc3QoZi5xdWVyeVNlbGVjdG9yQWxsKSkmJih1dChmdW5jdGlvbih0KXtwLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIrXysiJz48L2E+PHNlbGVjdCBpZD0nIitfKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJmcucHVzaCgiWypeJF09IitEKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGcucHVzaCgiXFxbIitEKyIqKD86dmFsdWV8IitCKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrXysiLV0iKS5sZW5ndGh8fGcucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxnLnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrXysiKyoiKS5sZW5ndGh8fGcucHVzaCgiLiMuK1srfl0iKX0pLHV0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJmcucHVzaCgibmFtZSIrRCsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmZy5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLHAuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZnLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IiksZy5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPUcudGVzdChiPXAubWF0Y2hlc3x8cC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHAubW96TWF0Y2hlc1NlbGVjdG9yfHxwLm9NYXRjaGVzU2VsZWN0b3J8fHAubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1iLmNhbGwodCwiKiIpLGIuY2FsbCh0LCJbcyE9JyddOngiKSx2LnB1c2goIiE9IixOKX0pLGc9Zy5sZW5ndGgmJm5ldyBSZWdFeHAoZy5qb2luKCJ8IikpLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLGU9Ry50ZXN0KHAuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9ZXx8Ry50ZXN0KHAuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxpPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PWl8fCEoIWl8fDEhPT1pLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhpKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQz1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGw9ITAsMDt2YXIgaT0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gaXx8KDEmKGk9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1pP3Q9PT1mfHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZ5KHcsdCk/LTE6ZT09PWZ8fGUub3duZXJEb2N1bWVudD09PXcmJnkodyxlKT8xOmg/TChoLHQpLUwoaCxlKTowOjQmaT8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gbD0hMCwwO3ZhciBuLGk9MCxyPXQucGFyZW50Tm9kZSxvPWUucGFyZW50Tm9kZSxzPVt0XSxhPVtlXTtpZighcnx8IW8pcmV0dXJuIHQ9PT1mPy0xOmU9PT1mPzE6cj8tMTpvPzE6aD9MKGgsdCktTChoLGUpOjA7aWYocj09PW8pcmV0dXJuIGh0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KWEudW5zaGlmdChuKTtmb3IoO3NbaV09PT1hW2ldOylpKys7cmV0dXJuIGk/aHQoc1tpXSxhW2ldKTpzW2ldPT09dz8tMTphW2ldPT09dz8xOjB9LGYpOmZ9LG90Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gb3QodCxudWxsLG51bGwsZSl9LG90Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09ZiYmZCh0KSxlPWUucmVwbGFjZShWLCI9JyQxJ10iKSxuLm1hdGNoZXNTZWxlY3RvciYmbSYmIUFbZSsiICJdJiYoIXZ8fCF2LnRlc3QoZSkpJiYoIWd8fCFnLnRlc3QoZSkpKXRyeXt2YXIgaT1iLmNhbGwodCxlKTtpZihpfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGl9Y2F0Y2godCl7fXJldHVybiBvdChlLGYsbnVsbCxbdF0pLmxlbmd0aD4wfSxvdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09ZiYmZCh0KSx5KHQsZSl9LG90LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWYmJmQodCk7dmFyIHI9aS5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0sbz1yJiZrLmNhbGwoaS5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/cih0LGUsIW0pOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09bz9vOm4uYXR0cmlidXRlc3x8IW0/dC5nZXRBdHRyaWJ1dGUoZSk6KG89dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmby5zcGVjaWZpZWQ/by52YWx1ZTpudWxsfSxvdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UoZXQsbnQpfSxvdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LG90LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUsaT1bXSxyPTAsbz0wO2lmKGw9IW4uZGV0ZWN0RHVwbGljYXRlcyxoPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KEMpLGwpe2Zvcig7ZT10W28rK107KWU9PT10W29dJiYocj1pLnB1c2gobykpO2Zvcig7ci0tOyl0LnNwbGljZShpW3JdLDEpfXJldHVybiBoPW51bGwsdH0scj1vdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIsaT0wLG89dC5ub2RlVHlwZTtpZihvKXtpZigxPT09b3x8OT09PW98fDExPT09byl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1yKHQpfWVsc2UgaWYoMz09PW98fDQ9PT1vKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W2krK107KW4rPXIoZSk7cmV0dXJuIG59LChpPW90LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmF0LG1hdGNoOlksYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShRLHR0KSx0WzNdPSh0WzNdfHx0WzRdfHx0WzVdfHwiIikucmVwbGFjZShRLHR0KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8b3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmb3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIFkuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmVS50ZXN0KG4pJiYoZT1zKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShRLHR0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1TW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitEKyIpIit0KyIoIitEKyJ8JCkiKSkmJlModCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9b3QuYXR0cihpLHQpO3JldHVybiBudWxsPT1yPyIhPSI9PT1lOiFlfHwocis9IiIsIj0iPT09ZT9yPT09bjoiIT0iPT09ZT9yIT09bjoiXj0iPT09ZT9uJiYwPT09ci5pbmRleE9mKG4pOiIqPSI9PT1lP24mJnIuaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZyLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrci5yZXBsYWNlKFcsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihyPT09bnx8ci5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89Im50aCIhPT10LnNsaWNlKDAsMykscz0ibGFzdCIhPT10LnNsaWNlKC00KSxhPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1pJiYwPT09cj9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGgsbCxkLGYscCxtPW8hPT1zPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsZz1lLnBhcmVudE5vZGUsdj1hJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYj0hdSYmIWEseT0hMTtpZihnKXtpZihvKXtmb3IoO207KXtmb3IoZD1lO2Q9ZFttXTspaWYoYT9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT12OjE9PT1kLm5vZGVUeXBlKXJldHVybiExO3A9bT0ib25seSI9PT10JiYhcCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihwPVtzP2cuZmlyc3RDaGlsZDpnLmxhc3RDaGlsZF0scyYmYil7Zm9yKHk9KGY9KGM9KGg9KGw9KGQ9ZylbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChsW2QudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PXgmJmNbMV0pJiZjWzJdLGQ9ZiYmZy5jaGlsZE5vZGVzW2ZdO2Q9KytmJiZkJiZkW21dfHwoeT1mPTApfHxwLnBvcCgpOylpZigxPT09ZC5ub2RlVHlwZSYmKyt5JiZkPT09ZSl7aFt0XT1beCxmLHldO2JyZWFrfX1lbHNlIGlmKGImJih5PWY9KGM9KGg9KGw9KGQ9ZSlbX118fChkW19dPXt9KSlbZC51bmlxdWVJRF18fChsW2QudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PXgmJmNbMV0pLCExPT09eSlmb3IoOyhkPSsrZiYmZCYmZFttXXx8KHk9Zj0wKXx8cC5wb3AoKSkmJigoYT9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT12OjEhPT1kLm5vZGVUeXBlKXx8ISsreXx8KGImJigoaD0obD1kW19dfHwoZFtfXT17fSkpW2QudW5pcXVlSURdfHwobFtkLnVuaXF1ZUlEXT17fSkpW3RdPVt4LHldKSxkIT09ZSkpOyk7cmV0dXJuKHktPXIpPT09aXx8eSVpPT0wJiZ5L2k+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj1pLnBzZXVkb3NbdF18fGkuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxvdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiByW19dP3IoZSk6ci5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLGkuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2F0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciBpLG89cih0LGUpLHM9by5sZW5ndGg7cy0tOyl0W2k9TCh0LG9bc10pXT0hKG5baV09b1tzXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gcih0LDAsbil9KTpyfX0scHNldWRvczp7bm90OmF0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10saT1hKHQucmVwbGFjZShxLCIkMSIpKTtyZXR1cm4gaVtfXT9hdChmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIG8scz1pKHQsbnVsbCxyLFtdKSxhPXQubGVuZ3RoO2EtLTspKG89c1thXSkmJih0W2FdPSEoZVthXT1vKSl9KTpmdW5jdGlvbih0LHIsbyl7cmV0dXJuIGVbMF09dCxpKGUsbnVsbCxvLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6YXQoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBvdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmF0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShRLHR0KSxmdW5jdGlvbihlKXtyZXR1cm4oZS50ZXh0Q29udGVudHx8ZS5pbm5lclRleHR8fHIoZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzphdChmdW5jdGlvbih0KXtyZXR1cm4gSy50ZXN0KHR8fCIiKXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoUSx0dCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgbjtkb3tpZihuPW0/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT10fHwwPT09bi5pbmRleE9mKHQrIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24mJnQubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1wfSxmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWYuYWN0aXZlRWxlbWVudCYmKCFmLmhhc0ZvY3VzfHxmLmhhc0ZvY3VzKCkpJiYhISh0LnR5cGV8fHQuaHJlZnx8fnQudGFiSW5kZXgpfSxlbmFibGVkOmZ0KCExKSxkaXNhYmxlZDpmdCghMCksY2hlY2tlZDpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiEhdC5jaGVja2VkfHwib3B0aW9uIj09PWUmJiEhdC5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT10LnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbih0KXtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIWkucHNldWRvcy5lbXB0eSh0KX0saGVhZGVyOmZ1bmN0aW9uKHQpe3JldHVybiAkLnRlc3QodC5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBYLnRlc3QodC5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWUmJiJidXR0b24iPT09dC50eXBlfHwiYnV0dG9uIj09PWV9LHRleHQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09dC50eXBlJiYobnVsbD09KGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWUudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnB0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpwdChmdW5jdGlvbih0LGUpe3JldHVybltlLTFdfSksZXE6cHQoZnVuY3Rpb24odCxlLG4pe3JldHVybltuPDA/bitlOm5dfSksZXZlbjpwdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLG9kZDpwdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248ZTtuKz0yKXQucHVzaChuKTtyZXR1cm4gdH0pLGx0OnB0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bjwwP24rZTpuOy0taT49MDspdC5wdXNoKGkpO3JldHVybiB0fSksZ3Q6cHQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1uPDA/bitlOm47KytpPGU7KXQucHVzaChpKTtyZXR1cm4gdH0pfX0pLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0paS5wc2V1ZG9zW2VdPWx0KGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0paS5wc2V1ZG9zW2VdPWR0KGUpO2Z1bmN0aW9uIGd0KCl7fWZ1bmN0aW9uIHZ0KHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgsaT0iIjtlPG47ZSsrKWkrPXRbZV0udmFsdWU7cmV0dXJuIGl9ZnVuY3Rpb24gYnQodCxlLG4pe3ZhciBpPWUuZGlyLHI9ZS5uZXh0LG89cnx8aSxzPW4mJiJwYXJlbnROb2RlIj09PW8sYT1NKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSxuLHIpe2Zvcig7ZT1lW2ldOylpZigxPT09ZS5ub2RlVHlwZXx8cylyZXR1cm4gdChlLG4scik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxoLGwsZD1beCxhXTtpZih1KXtmb3IoO2U9ZVtpXTspaWYoKDE9PT1lLm5vZGVUeXBlfHxzKSYmdChlLG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO2U9ZVtpXTspaWYoMT09PWUubm9kZVR5cGV8fHMpaWYoaD0obD1lW19dfHwoZVtfXT17fSkpW2UudW5pcXVlSURdfHwobFtlLnVuaXF1ZUlEXT17fSksciYmcj09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbaV18fGU7ZWxzZXtpZigoYz1oW29dKSYmY1swXT09PXgmJmNbMV09PT1hKXJldHVybiBkWzJdPWNbMl07aWYoaFtvXT1kLGRbMl09dChlLG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0Lmxlbmd0aD4xP2Z1bmN0aW9uKGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZighdFtyXShlLG4saSkpcmV0dXJuITE7cmV0dXJuITB9OnRbMF19ZnVuY3Rpb24gX3QodCxlLG4saSxyKXtmb3IodmFyIG8scz1bXSxhPTAsdT10Lmxlbmd0aCxjPW51bGwhPWU7YTx1O2ErKykobz10W2FdKSYmKG4mJiFuKG8saSxyKXx8KHMucHVzaChvKSxjJiZlLnB1c2goYSkpKTtyZXR1cm4gc31mdW5jdGlvbiB3dCh0LGUsbixpLHIsbyl7cmV0dXJuIGkmJiFpW19dJiYoaT13dChpKSksciYmIXJbX10mJihyPXd0KHIsbykpLGF0KGZ1bmN0aW9uKG8scyxhLHUpe3ZhciBjLGgsbCxkPVtdLGY9W10scD1zLmxlbmd0aCxtPW98fGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjtpKyspb3QodCxlW2ldLG4pO3JldHVybiBufShlfHwiKiIsYS5ub2RlVHlwZT9bYV06YSxbXSksZz0hdHx8IW8mJmU/bTpfdChtLGQsdCxhLHUpLHY9bj9yfHwobz90OnB8fGkpP1tdOnM6ZztpZihuJiZuKGcsdixhLHUpLGkpZm9yKGM9X3QodixmKSxpKGMsW10sYSx1KSxoPWMubGVuZ3RoO2gtLTspKGw9Y1toXSkmJih2W2ZbaF1dPSEoZ1tmW2hdXT1sKSk7aWYobyl7aWYocnx8dCl7aWYocil7Zm9yKGM9W10saD12Lmxlbmd0aDtoLS07KShsPXZbaF0pJiZjLnB1c2goZ1toXT1sKTtyKG51bGwsdj1bXSxjLHUpfWZvcihoPXYubGVuZ3RoO2gtLTspKGw9dltoXSkmJihjPXI/TChvLGwpOmRbaF0pPi0xJiYob1tjXT0hKHNbY109bCkpfX1lbHNlIHY9X3Qodj09PXM/di5zcGxpY2UocCx2Lmxlbmd0aCk6dikscj9yKG51bGwscyx2LHUpOmouYXBwbHkocyx2KX0pfWZ1bmN0aW9uIHh0KHQpe2Zvcih2YXIgZSxuLHIsbz10Lmxlbmd0aCxzPWkucmVsYXRpdmVbdFswXS50eXBlXSxhPXN8fGkucmVsYXRpdmVbIiAiXSx1PXM/MTowLGg9YnQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lfSxhLCEwKSxsPWJ0KGZ1bmN0aW9uKHQpe3JldHVybiBMKGUsdCk+LTF9LGEsITApLGQ9W2Z1bmN0aW9uKHQsbixpKXt2YXIgcj0hcyYmKGl8fG4hPT1jKXx8KChlPW4pLm5vZGVUeXBlP2godCxuLGkpOmwodCxuLGkpKTtyZXR1cm4gZT1udWxsLHJ9XTt1PG87dSsrKWlmKG49aS5yZWxhdGl2ZVt0W3VdLnR5cGVdKWQ9W2J0KHl0KGQpLG4pXTtlbHNle2lmKChuPWkuZmlsdGVyW3RbdV0udHlwZV0uYXBwbHkobnVsbCx0W3VdLm1hdGNoZXMpKVtfXSl7Zm9yKHI9Kyt1O3I8byYmIWkucmVsYXRpdmVbdFtyXS50eXBlXTtyKyspO3JldHVybiB3dCh1PjEmJnl0KGQpLHU+MSYmdnQodC5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT10W3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShxLCIkMSIpLG4sdTxyJiZ4dCh0LnNsaWNlKHUscikpLHI8byYmeHQodD10LnNsaWNlKHIpKSxyPG8mJnZ0KHQpKX1kLnB1c2gobil9cmV0dXJuIHl0KGQpfXJldHVybiBndC5wcm90b3R5cGU9aS5maWx0ZXJzPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IGd0LHM9b3QudG9rZW5pemU9ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8scyxhLHUsYyxoPUVbdCsiICJdO2lmKGgpcmV0dXJuIGU/MDpoLnNsaWNlKDApO2ZvcihhPXQsdT1bXSxjPWkucHJlRmlsdGVyO2E7KXtmb3IocyBpbiBuJiYhKHI9SC5leGVjKGEpKXx8KHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSx1LnB1c2gobz1bXSkpLG49ITEsKHI9Ri5leGVjKGEpKSYmKG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZShxLCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKSxpLmZpbHRlcikhKHI9WVtzXS5leGVjKGEpKXx8Y1tzXSYmIShyPWNbc10ocikpfHwobj1yLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6cyxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gZT9hLmxlbmd0aDphP290LmVycm9yKHQpOkUodCx1KS5zbGljZSgwKX0sYT1vdC5jb21waWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXSxvPVtdLGE9QVt0KyIgIl07aWYoIWEpe2ZvcihlfHwoZT1zKHQpKSxuPWUubGVuZ3RoO24tLTspKGE9eHQoZVtuXSkpW19dP3IucHVzaChhKTpvLnB1c2goYSk7KGE9QSh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg+MCxyPXQubGVuZ3RoPjAsbz1mdW5jdGlvbihvLHMsYSx1LGgpe3ZhciBsLHAsZyx2PTAsYj0iMCIseT1vJiZbXSxfPVtdLHc9YyxNPW98fHImJmkuZmluZC5UQUcoIioiLGgpLFM9eCs9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLEU9TS5sZW5ndGg7Zm9yKGgmJihjPXM9PT1mfHxzfHxoKTtiIT09RSYmbnVsbCE9KGw9TVtiXSk7YisrKXtpZihyJiZsKXtmb3IocD0wLHN8fGwub3duZXJEb2N1bWVudD09PWZ8fChkKGwpLGE9IW0pO2c9dFtwKytdOylpZihnKGwsc3x8ZixhKSl7dS5wdXNoKGwpO2JyZWFrfWgmJih4PVMpfW4mJigobD0hZyYmbCkmJnYtLSxvJiZ5LnB1c2gobCkpfWlmKHYrPWIsbiYmYiE9PXYpe2ZvcihwPTA7Zz1lW3ArK107KWcoeSxfLHMsYSk7aWYobyl7aWYodj4wKWZvcig7Yi0tOyl5W2JdfHxfW2JdfHwoX1tiXT1QLmNhbGwodSkpO189X3QoXyl9ai5hcHBseSh1LF8pLGgmJiFvJiZfLmxlbmd0aD4wJiZ2K2UubGVuZ3RoPjEmJm90LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGgmJih4PVMsYz13KSx5fTtyZXR1cm4gbj9hdChvKTpvfShvLHIpKSkuc2VsZWN0b3I9dH1yZXR1cm4gYX0sdT1vdC5zZWxlY3Q9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8sdSxjLGgsbCxkPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LGY9IXImJnModD1kLnNlbGVjdG9yfHx0KTtpZihuPW58fFtdLDE9PT1mLmxlbmd0aCl7aWYoKHU9ZlswXT1mWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShjPXVbMF0pLnR5cGUmJjk9PT1lLm5vZGVUeXBlJiZtJiZpLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEoZT0oaS5maW5kLklEKGMubWF0Y2hlc1swXS5yZXBsYWNlKFEsdHQpLGUpfHxbXSlbMF0pKXJldHVybiBuO2QmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihvPVkubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtvLS0mJihjPXVbb10sIWkucmVsYXRpdmVbaD1jLnR5cGVdKTspaWYoKGw9aS5maW5kW2hdKSYmKHI9bChjLm1hdGNoZXNbMF0ucmVwbGFjZShRLHR0KSxaLnRlc3QodVswXS50eXBlKSYmbXQoZS5wYXJlbnROb2RlKXx8ZSkpKXtpZih1LnNwbGljZShvLDEpLCEodD1yLmxlbmd0aCYmdnQodSkpKXJldHVybiBqLmFwcGx5KG4sciksbjticmVha319cmV0dXJuKGR8fGEodCxmKSkocixlLCFtLG4sIWV8fFoudGVzdCh0KSYmbXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPV8uc3BsaXQoIiIpLnNvcnQoQykuam9pbigiIik9PT1fLG4uZGV0ZWN0RHVwbGljYXRlcz0hIWwsZCgpLG4uc29ydERldGFjaGVkPXV0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZi5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLHV0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGN0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGN0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLHV0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxjdChCLGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0pLG90fShuKTtNLmZpbmQ9QSxNLmV4cHI9QS5zZWxlY3RvcnMsTS5leHByWyI6Il09TS5leHByLnBzZXVkb3MsTS51bmlxdWVTb3J0PU0udW5pcXVlPUEudW5pcXVlU29ydCxNLnRleHQ9QS5nZXRUZXh0LE0uaXNYTUxEb2M9QS5pc1hNTCxNLmNvbnRhaW5zPUEuY29udGFpbnMsTS5lc2NhcGVTZWxlY3Rvcj1BLmVzY2FwZTt2YXIgQz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPVtdLHI9dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihyJiZNKHQpLmlzKG4pKWJyZWFrO2kucHVzaCh0KX1yZXR1cm4gaX0saz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sTz1NLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIFAodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBUPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGoodCxlLG4pe3JldHVybiBiKGUpP00uZ3JlcCh0LGZ1bmN0aW9uKHQsaSl7cmV0dXJuISFlLmNhbGwodCxpLHQpIT09bn0pOmUubm9kZVR5cGU/TS5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9NLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKGUsdCk+LTEhPT1ufSk6TS5maWx0ZXIoZSx0LG4pfU0uZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1pLm5vZGVUeXBlP00uZmluZC5tYXRjaGVzU2VsZWN0b3IoaSx0KT9baV06W106TS5maW5kLm1hdGNoZXModCxNLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LE0uZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLmxlbmd0aCxyPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhNKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxpO2UrKylpZihNLmNvbnRhaW5zKHJbZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPGk7ZSsrKU0uZmluZCh0LHJbZV0sbik7cmV0dXJuIGk+MT9NLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZPLnRlc3QodCk/TSh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBJLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoTS5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8SSwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEoaT0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkwuZXhlYyh0KSl8fCFpWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoaVsxXSl7aWYoZT1lIGluc3RhbmNlb2YgTT9lWzBdOmUsTS5tZXJnZSh0aGlzLE0ucGFyc2VIVE1MKGlbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6cywhMCkpLFQudGVzdChpWzFdKSYmTS5pc1BsYWluT2JqZWN0KGUpKWZvcihpIGluIGUpYih0aGlzW2ldKT90aGlzW2ldKGVbaV0pOnRoaXMuYXR0cihpLGVbaV0pO3JldHVybiB0aGlzfXJldHVybihyPXMuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1yLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOmIodCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoTSk6TS5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1NLmZuLEk9TShzKTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIFIodCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fU0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9TSh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihNLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9MCxyPXRoaXMubGVuZ3RoLG89W10scz0ic3RyaW5nIiE9dHlwZW9mIHQmJk0odCk7aWYoIU8udGVzdCh0KSlmb3IoO2k8cjtpKyspZm9yKG49dGhpc1tpXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYocz9zLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZNLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/TS51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/bC5jYWxsKE0odCksdGhpc1swXSk6bC5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhNLnVuaXF1ZVNvcnQoTS5tZXJnZSh0aGlzLmdldCgpLE0odCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksTS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBDKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gUih0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBSKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBDKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEModCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEModCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBDKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBrKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gayh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gUCh0LCJpZnJhbWUiKT90LmNvbnRlbnREb2N1bWVudDooUCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLE0ubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe00uZm5bdF09ZnVuY3Rpb24obixpKXt2YXIgcj1NLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYoaT1uKSxpJiYic3RyaW5nIj09dHlwZW9mIGkmJihyPU0uZmlsdGVyKGkscikpLHRoaXMubGVuZ3RoPjEmJihEW3RdfHxNLnVuaXF1ZVNvcnQociksQi50ZXN0KHQpJiZyLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIHo9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBOKHQpe3JldHVybiB0fWZ1bmN0aW9uIFcodCl7dGhyb3cgdH1mdW5jdGlvbiBxKHQsZSxuLGkpe3ZhciByO3RyeXt0JiZiKHI9dC5wcm9taXNlKT9yLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJmIocj10LnRoZW4pP3IuY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKGkpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1NLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gTS5lYWNoKHQubWF0Y2goeil8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOk0uZXh0ZW5kKHt9LHQpO3ZhciBlLG4saSxyLG89W10scz1bXSxhPS0xLHU9ZnVuY3Rpb24oKXtmb3Iocj1yfHx0Lm9uY2UsaT1lPSEwO3MubGVuZ3RoO2E9LTEpZm9yKG49cy5zaGlmdCgpOysrYTxvLmxlbmd0aDspITE9PT1vW2FdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihhPW8ubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxyJiYobz1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIG8mJihuJiYhZSYmKGE9by5sZW5ndGgtMSxzLnB1c2gobikpLGZ1bmN0aW9uIGUobil7TS5lYWNoKG4sZnVuY3Rpb24obixpKXtiKGkpP3QudW5pcXVlJiZjLmhhcyhpKXx8by5wdXNoKGkpOmkmJmkubGVuZ3RoJiYic3RyaW5nIiE9PXgoaSkmJmUoaSl9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gTS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1NLmluQXJyYXkoZSxvLG4pKT4tMTspby5zcGxpY2UobiwxKSxuPD1hJiZhLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/TS5pbkFycmF5KHQsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gcj1zPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHI9cz1bXSxufHxlfHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHJ8fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0scy5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBjfSxNLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLE0uQ2FsbGJhY2tzKCJtZW1vcnkiKSxNLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsTS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksTS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLE0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLE0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLGk9InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHIudGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBNLkRlZmVycmVkKGZ1bmN0aW9uKG4pe00uZWFjaChlLGZ1bmN0aW9uKGUsaSl7dmFyIHI9Yih0W2lbNF1dKSYmdFtpWzRdXTtvW2lbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9ciYmci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmYih0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltpWzBdKyJXaXRoIl0odGhpcyxyP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxpLHIpe3ZhciBvPTA7ZnVuY3Rpb24gcyh0LGUsaSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxvKSl7aWYoKG49aS5hcHBseShhLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sYihjKT9yP2MuY2FsbChuLHMobyxlLE4scikscyhvLGUsVyxyKSk6KG8rKyxjLmNhbGwobixzKG8sZSxOLHIpLHMobyxlLFcscikscyhvLGUsTixlLm5vdGlmeVdpdGgpKSk6KGkhPT1OJiYoYT12b2lkIDAsdT1bbl0pLChyfHxlLnJlc29sdmVXaXRoKShhLHUpKX19LGg9cj9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtNLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJk0uRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGguc3RhY2tUcmFjZSksdCsxPj1vJiYoaSE9PVcmJihhPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKGEsdSkpfX07dD9oKCk6KE0uRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoaC5zdGFja1RyYWNlPU0uRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChoKSl9fXJldHVybiBNLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKHMoMCxuLGIocik/cjpOLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKHMoMCxuLGIodCk/dDpOKSksZVsyXVszXS5hZGQocygwLG4sYihpKT9pOlcpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9NLmV4dGVuZCh0LHIpOnJ9fSxvPXt9O3JldHVybiBNLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBzPW5bMl0sYT1uWzVdO3JbblsxXV09cy5hZGQsYSYmcy5hZGQoZnVuY3Rpb24oKXtpPWF9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLHMuYWRkKG5bM10uZmlyZSksb1tuWzBdXT1mdW5jdGlvbigpe3JldHVybiBvW25bMF0rIldpdGgiXSh0aGlzPT09bz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LG9bblswXSsiV2l0aCJdPXMuZmlyZVdpdGh9KSxyLnByb21pc2UobyksdCYmdC5jYWxsKG8sbyksb30sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxpPUFycmF5KG4pLHI9dS5jYWxsKGFyZ3VtZW50cyksbz1NLkRlZmVycmVkKCkscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7aVt0XT10aGlzLHJbdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxvLnJlc29sdmVXaXRoKGkscil9fTtpZihlPD0xJiYocSh0LG8uZG9uZShzKG4pKS5yZXNvbHZlLG8ucmVqZWN0LCFlKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fGIocltuXSYmcltuXS50aGVuKSkpcmV0dXJuIG8udGhlbigpO2Zvcig7bi0tOylxKHJbbl0scyhuKSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO00uRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sTS5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciBGPU0uRGVmZXJyZWQoKTtmdW5jdGlvbiBWKCl7cy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixWKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFYpLE0ucmVhZHkoKX1NLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiBGLnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7TS5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LE0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1NLnJlYWR5V2FpdDpNLmlzUmVhZHkpfHwoTS5pc1JlYWR5PSEwLCEwIT09dCYmLS1NLnJlYWR5V2FpdD4wfHxGLnJlc29sdmVXaXRoKHMsW01dKSl9fSksTS5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09cy5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1zLnJlYWR5U3RhdGUmJiFzLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoTS5yZWFkeSk6KHMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsViksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixWKSk7dmFyIFU9ZnVuY3Rpb24odCxlLG4saSxyLG8scyl7dmFyIGE9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PXgobikpZm9yKGEgaW4gcj0hMCxuKVUodCxlLGEsblthXSwhMCxvLHMpO2Vsc2UgaWYodm9pZCAwIT09aSYmKHI9ITAsYihpKXx8KHM9ITApLGMmJihzPyhlLmNhbGwodCxpKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChNKHQpLG4pfSkpLGUpKWZvcig7YTx1O2ErKyllKHRbYV0sbixzP2k6aS5jYWxsKHRbYV0sYSxlKHRbYV0sbikpKTtyZXR1cm4gcj90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOm99LEs9L14tbXMtLyxZPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFgodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQucmVwbGFjZShLLCJtcy0iKS5yZXBsYWNlKFksWCl9dmFyIEc9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPU0uZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sRyh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJbJChlKV09bjtlbHNlIGZvcihpIGluIGUpclskKGkpXT1lW2ldO3JldHVybiByfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dWyQoZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09aSl7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKCQpOihlPSQoZSkpaW4gaT9bZV06ZS5tYXRjaCh6KXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIGlbZVtuXV19KHZvaWQgMD09PWV8fE0uaXNFbXB0eU9iamVjdChpKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIU0uaXNFbXB0eU9iamVjdChlKX19O3ZhciBaPW5ldyBKLFE9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIGk7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYoaT0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUoaSkpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9US5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59TS5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFEuaGFzRGF0YSh0KXx8Wi5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBaLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX19KSxNLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvPXRoaXNbMF0scz1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihyPVEuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhWi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1zLmxlbmd0aDtuLS07KXNbbl0mJjA9PT0oaT1zW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihpPSQoaS5zbGljZSg1KSksbnQobyxpLHJbaV0pKTtaLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gcn1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyx0KX0pOlUodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1RLmdldChvLHQpKT9uOnZvaWQgMCE9PShuPW50KG8sdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLHQpfSl9fSksTS5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLGk9Wi5nZXQodCxlKSxuJiYoIWl8fEFycmF5LmlzQXJyYXkobik/aT1aLmFjY2Vzcyh0LGUsTS5tYWtlQXJyYXkobikpOmkucHVzaChuKSksaXx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49TS5xdWV1ZSh0LGUpLGk9bi5sZW5ndGgscj1uLnNoaWZ0KCksbz1NLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09ciYmKHI9bi5zaGlmdCgpLGktLSksciYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLHIuY2FsbCh0LGZ1bmN0aW9uKCl7TS5kZXF1ZXVlKHQsZSl9LG8pKSwhaSYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFouZ2V0KHQsbil8fFouYWNjZXNzKHQsbix7ZW1wdHk6TS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksTS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP00ucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49TS5xdWV1ZSh0aGlzLHQsZSk7TS5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZNLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtNLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT0xLHI9TS5EZWZlcnJlZCgpLG89dGhpcyxzPXRoaXMubGVuZ3RoLGE9ZnVuY3Rpb24oKXstLWl8fHIucmVzb2x2ZVdpdGgobyxbb10pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7cy0tOykobj1aLmdldChvW3NdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihpKyssbi5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCksci5wcm9taXNlKGUpfX0pO3ZhciBpdD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxydD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIraXQrIikoW2EteiVdKikkIiwiaSIpLG90PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmTS5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJiJub25lIj09PU0uY3NzKHQsImRpc3BsYXkiKX0sYXQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbyxzPXt9O2ZvcihvIGluIGUpc1tvXT10LnN0eWxlW29dLHQuc3R5bGVbb109ZVtvXTtmb3IobyBpbiByPW4uYXBwbHkodCxpfHxbXSksZSl0LnN0eWxlW29dPXNbb107cmV0dXJuIHJ9O2Z1bmN0aW9uIHV0KHQsZSxuLGkpe3ZhciByLG8scz0yMCxhPWk/ZnVuY3Rpb24oKXtyZXR1cm4gaS5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gTS5jc3ModCxlLCIiKX0sdT1hKCksYz1uJiZuWzNdfHwoTS5jc3NOdW1iZXJbZV0/IiI6InB4IiksaD0oTS5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJnJ0LmV4ZWMoTS5jc3ModCxlKSk7aWYoaCYmaFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8aFszXSxoPSt1fHwxO3MtLTspTS5zdHlsZSh0LGUsaCtjKSwoMS1vKSooMS0obz1hKCkvdXx8LjUpKTw9MCYmKHM9MCksaC89bztoKj0yLE0uc3R5bGUodCxlLGgrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGg9K2h8fCt1fHwwLHI9blsxXT9oKyhuWzFdKzEpKm5bMl06K25bMl0saSYmKGkudW5pdD1jLGkuc3RhcnQ9aCxpLmVuZD1yKSkscn12YXIgY3Q9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQsaT10Lm5vZGVOYW1lLHI9Y3RbaV07cmV0dXJuIHJ8fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQoaSkpLHI9TS5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1yJiYocj0iYmxvY2siKSxjdFtpXT1yLHIpfWZ1bmN0aW9uIGx0KHQsZSl7Zm9yKHZhciBuLGkscj1bXSxvPTAscz10Lmxlbmd0aDtvPHM7bysrKShpPXRbb10pLnN0eWxlJiYobj1pLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKHJbb109Wi5nZXQoaSwiZGlzcGxheSIpfHxudWxsLHJbb118fChpLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWkuc3R5bGUuZGlzcGxheSYmc3QoaSkmJihyW29dPWh0KGkpKSk6Im5vbmUiIT09biYmKHJbb109Im5vbmUiLFouc2V0KGksImRpc3BsYXkiLG4pKSk7Zm9yKG89MDtvPHM7bysrKW51bGwhPXJbb10mJih0W29dLnN0eWxlLmRpc3BsYXk9cltvXSk7cmV0dXJuIHR9TS5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7c3QodGhpcyk/TSh0aGlzKS5zaG93KCk6TSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZHQ9L14oPzpjaGVja2JveHxyYWRpbykkL2ksZnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2kscHQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gZ3QodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmUCh0LGUpP00ubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24gdnQodCxlKXtmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspWi5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFouZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIGJ0LHl0LF90PS88fCYjP1x3KzsvO2Z1bmN0aW9uIHd0KHQsZSxuLGkscil7Zm9yKHZhciBvLHMsYSx1LGMsaCxsPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGQ9W10sZj0wLHA9dC5sZW5ndGg7ZjxwO2YrKylpZigobz10W2ZdKXx8MD09PW8paWYoIm9iamVjdCI9PT14KG8pKU0ubWVyZ2UoZCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKF90LnRlc3Qobykpe2ZvcihzPXN8fGwuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSksYT0oZnQuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W2FdfHxtdC5fZGVmYXVsdCxzLmlubmVySFRNTD11WzFdK00uaHRtbFByZWZpbHRlcihvKSt1WzJdLGg9dVswXTtoLS07KXM9cy5sYXN0Q2hpbGQ7TS5tZXJnZShkLHMuY2hpbGROb2RlcyksKHM9bC5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIGQucHVzaChlLmNyZWF0ZVRleHROb2RlKG8pKTtmb3IobC50ZXh0Q29udGVudD0iIixmPTA7bz1kW2YrK107KWlmKGkmJk0uaW5BcnJheShvLGkpPi0xKXImJnIucHVzaChvKTtlbHNlIGlmKGM9TS5jb250YWlucyhvLm93bmVyRG9jdW1lbnQsbykscz1ndChsLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxjJiZ2dChzKSxuKWZvcihoPTA7bz1zW2grK107KXB0LnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKTtyZXR1cm4gbH1idD1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoeXQ9cy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHl0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSx5dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYnQuYXBwZW5kQ2hpbGQoeXQpLHYuY2hlY2tDbG9uZT1idC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYnQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix2Lm5vQ2xvbmVDaGVja2VkPSEhYnQuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciB4dD1zLmRvY3VtZW50RWxlbWVudCxNdD0vXmtleS8sU3Q9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLEV0PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24ga3QoKXt0cnl7cmV0dXJuIHMuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fWZ1bmN0aW9uIE90KHQsZSxuLGkscixvKXt2YXIgcyxhO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGEgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihpPWl8fG4sbj12b2lkIDApLGUpT3QodCxhLG4saSxlW2FdLG8pO3JldHVybiB0fWlmKG51bGw9PWkmJm51bGw9PXI/KHI9bixpPW49dm9pZCAwKTpudWxsPT1yJiYoInN0cmluZyI9PXR5cGVvZiBuPyhyPWksaT12b2lkIDApOihyPWksaT1uLG49dm9pZCAwKSksITE9PT1yKXI9Q3Q7ZWxzZSBpZighcilyZXR1cm4gdDtyZXR1cm4gMT09PW8mJihzPXIsKHI9ZnVuY3Rpb24odCl7cmV0dXJuIE0oKS5vZmYodCkscy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD1NLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe00uZXZlbnQuYWRkKHRoaXMsZSxyLGksbil9KX1NLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnPVouZ2V0KHQpO2lmKGcpZm9yKG4uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixyPW8uc2VsZWN0b3IpLHImJk0uZmluZC5tYXRjaGVzU2VsZWN0b3IoeHQsciksbi5ndWlkfHwobi5ndWlkPU0uZ3VpZCsrKSwodT1nLmV2ZW50cyl8fCh1PWcuZXZlbnRzPXt9KSwocz1nLmhhbmRsZSl8fChzPWcuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1NJiZNLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9NLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goeil8fFsiIl0pLmxlbmd0aDtjLS07KWY9bT0oYT1FdC5leGVjKGVbY10pfHxbXSlbMV0scD0oYVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGYmJihsPU0uZXZlbnQuc3BlY2lhbFtmXXx8e30sZj0ocj9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8ZixsPU0uZXZlbnQuc3BlY2lhbFtmXXx8e30saD1NLmV4dGVuZCh7dHlwZTpmLG9yaWdUeXBlOm0sZGF0YTppLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpyLG5lZWRzQ29udGV4dDpyJiZNLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QociksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxvKSwoZD11W2ZdKXx8KChkPXVbZl09W10pLmRlbGVnYXRlQ291bnQ9MCxsLnNldHVwJiYhMSE9PWwuc2V0dXAuY2FsbCh0LGkscCxzKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZixzKSksbC5hZGQmJihsLmFkZC5jYWxsKHQsaCksaC5oYW5kbGVyLmd1aWR8fChoLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxyP2Quc3BsaWNlKGQuZGVsZWdhdGVDb3VudCsrLDAsaCk6ZC5wdXNoKGgpLE0uZXZlbnQuZ2xvYmFsW2ZdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8scyxhLHUsYyxoLGwsZCxmLHAsbSxnPVouaGFzRGF0YSh0KSYmWi5nZXQodCk7aWYoZyYmKHU9Zy5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKHopfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihmPW09KGE9RXQuZXhlYyhlW2NdKXx8W10pWzFdLHA9KGFbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxmKXtmb3IobD1NLmV2ZW50LnNwZWNpYWxbZl18fHt9LGQ9dVtmPShpP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxmXXx8W10sYT1hWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLHM9bz1kLmxlbmd0aDtvLS07KWg9ZFtvXSwhciYmbSE9PWgub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWguZ3VpZHx8YSYmIWEudGVzdChoLm5hbWVzcGFjZSl8fGkmJmkhPT1oLnNlbGVjdG9yJiYoIioqIiE9PWl8fCFoLnNlbGVjdG9yKXx8KGQuc3BsaWNlKG8sMSksaC5zZWxlY3RvciYmZC5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwodCxoKSk7cyYmIWQubGVuZ3RoJiYobC50ZWFyZG93biYmITEhPT1sLnRlYXJkb3duLmNhbGwodCxwLGcuaGFuZGxlKXx8TS5yZW1vdmVFdmVudCh0LGYsZy5oYW5kbGUpLGRlbGV0ZSB1W2ZdKX1lbHNlIGZvcihmIGluIHUpTS5ldmVudC5yZW1vdmUodCxmK2VbY10sbixpLCEwKTtNLmlzRW1wdHlPYmplY3QodSkmJloucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhPU0uZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFouZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saD1NLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307Zm9yKHVbMF09YSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWgucHJlRGlzcGF0Y2h8fCExIT09aC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkpe2ZvcihzPU0uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsYyksZT0wOyhyPXNbZSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihhLmN1cnJlbnRUYXJnZXQ9ci5lbGVtLG49MDsobz1yLmhhbmRsZXJzW24rK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylhLnJuYW1lc3BhY2UmJiFhLnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fChhLmhhbmRsZU9iaj1vLGEuZGF0YT1vLmRhdGEsdm9pZCAwIT09KGk9KChNLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoci5lbGVtLHUpKSYmITE9PT0oYS5yZXN1bHQ9aSkmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBoLnBvc3REaXNwYXRjaCYmaC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbyxzLGE9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKG89W10scz17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1zW3I9KGk9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKHNbcl09aS5uZWVkc0NvbnRleHQ/TShyLHRoaXMpLmluZGV4KGMpPi0xOk0uZmluZChyLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksc1tyXSYmby5wdXNoKGkpO28ubGVuZ3RoJiZhLnB1c2goe2VsZW06YyxoYW5kbGVyczpvfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZhLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksYX0sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShNLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6YihlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbTS5leHBhbmRvXT90Om5ldyBNLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09a3QoKSYmdGhpcy5mb2N1cylyZXR1cm4gdGhpcy5mb2N1cygpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcz09PWt0KCkmJnRoaXMuYmx1cilyZXR1cm4gdGhpcy5ibHVyKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKCJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJlAodGhpcywiaW5wdXQiKSlyZXR1cm4gdGhpcy5jbGljaygpLCExfSxfZGVmYXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gUCh0LnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LE0ucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LE0uRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBNLkV2ZW50KSlyZXR1cm4gbmV3IE0uRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZNLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbTS5leHBhbmRvXT0hMH0sTS5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk0uRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sTS5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24odCl7dmFyIGU9dC5idXR0b247cmV0dXJuIG51bGw9PXQud2hpY2gmJk10LnRlc3QodC50eXBlKT9udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlOiF0LndoaWNoJiZ2b2lkIDAhPT1lJiZTdC50ZXN0KHQudHlwZSk/MSZlPzE6MiZlPzM6NCZlPzI6MDp0LndoaWNofX0sTS5ldmVudC5hZGRQcm9wKSxNLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7TS5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixpPXQucmVsYXRlZFRhcmdldCxyPXQuaGFuZGxlT2JqO3JldHVybiBpJiYoaT09PXRoaXN8fE0uY29udGFpbnModGhpcyxpKSl8fCh0LnR5cGU9ci5vcmlnVHlwZSxuPXIuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC50eXBlPWUpLG59fX0pLE0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gT3QodGhpcyx0LGUsbixpKX0sb25lOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBPdCh0aGlzLHQsZSxuLGksMSl9LG9mZjpmdW5jdGlvbih0LGUsbil7dmFyIGkscjtpZih0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LmhhbmRsZU9iailyZXR1cm4gaT10LmhhbmRsZU9iaixNKHQuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHIgaW4gdCl0aGlzLm9mZihyLGUsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZXx8KG49ZSxlPXZvaWQgMCksITE9PT1uJiYobj1DdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TS5ldmVudC5yZW1vdmUodGhpcyx0LG4sZSl9KX19KTt2YXIgUHQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopW14+XSopXC8+L2dpLFR0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLGp0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLEl0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBMdCh0LGUpe3JldHVybiBQKHQsInRhYmxlIikmJlAoMTEhPT1lLm5vZGVUeXBlP2U6ZS5maXJzdENoaWxkLCJ0ciIpJiZNKHQpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiB0LnR5cGU9KG51bGwhPT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrdC50eXBlLHR9ZnVuY3Rpb24gRHQodCl7cmV0dXJuInRydWUvIj09PSh0LnR5cGV8fCIiKS5zbGljZSgwLDUpP3QudHlwZT10LnR5cGUuc2xpY2UoNSk6dC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0fWZ1bmN0aW9uIFJ0KHQsZSl7dmFyIG4saSxyLG8scyxhLHUsYztpZigxPT09ZS5ub2RlVHlwZSl7aWYoWi5oYXNEYXRhKHQpJiYobz1aLmFjY2Vzcyh0KSxzPVouc2V0KGUsbyksYz1vLmV2ZW50cykpZm9yKHIgaW4gZGVsZXRlIHMuaGFuZGxlLHMuZXZlbnRzPXt9LGMpZm9yKG49MCxpPWNbcl0ubGVuZ3RoO248aTtuKyspTS5ldmVudC5hZGQoZSxyLGNbcl1bbl0pO1EuaGFzRGF0YSh0KSYmKGE9US5hY2Nlc3ModCksdT1NLmV4dGVuZCh7fSxhKSxRLnNldChlLHUpKX19ZnVuY3Rpb24genQodCxlLG4saSl7ZT1jLmFwcGx5KFtdLGUpO3ZhciByLG8scyxhLHUsaCxsPTAsZD10Lmxlbmd0aCxmPWQtMSxwPWVbMF0sbT1iKHApO2lmKG18fGQ+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhdi5jaGVja0Nsb25lJiZqdC50ZXN0KHApKXJldHVybiB0LmVhY2goZnVuY3Rpb24ocil7dmFyIG89dC5lcShyKTttJiYoZVswXT1wLmNhbGwodGhpcyxyLG8uaHRtbCgpKSksenQobyxlLG4saSl9KTtpZihkJiYobz0ocj13dChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LGkpKS5maXJzdENoaWxkLDE9PT1yLmNoaWxkTm9kZXMubGVuZ3RoJiYocj1vKSxvfHxpKSl7Zm9yKGE9KHM9TS5tYXAoZ3Qociwic2NyaXB0IiksQnQpKS5sZW5ndGg7bDxkO2wrKyl1PXIsbCE9PWYmJih1PU0uY2xvbmUodSwhMCwhMCksYSYmTS5tZXJnZShzLGd0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbbF0sdSxsKTtpZihhKWZvcihoPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxNLm1hcChzLER0KSxsPTA7bDxhO2wrKyl1PXNbbF0scHQudGVzdCh1LnR5cGV8fCIiKSYmIVouYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmTS5jb250YWlucyhoLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/TS5fZXZhbFVybCYmTS5fZXZhbFVybCh1LnNyYyk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoSXQsIiIpLGgsdSkpfXJldHVybiB0fWZ1bmN0aW9uIE50KHQsZSxuKXtmb3IodmFyIGkscj1lP00uZmlsdGVyKGUsdCk6dCxvPTA7bnVsbCE9KGk9cltvXSk7bysrKW58fDEhPT1pLm5vZGVUeXBlfHxNLmNsZWFuRGF0YShndChpKSksaS5wYXJlbnROb2RlJiYobiYmTS5jb250YWlucyhpLm93bmVyRG9jdW1lbnQsaSkmJnZ0KGd0KGksInNjcmlwdCIpKSxpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSkpO3JldHVybiB0fU0uZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoUHQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHMsYSx1LGMsaD10LmNsb25lTm9kZSghMCksbD1NLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KTtpZighKHYubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fE0uaXNYTUxEb2ModCkpKWZvcihzPWd0KGgpLGk9MCxyPShvPWd0KHQpKS5sZW5ndGg7aTxyO2krKylhPW9baV0sdT1zW2ldLGM9dm9pZCAwLCJpbnB1dCI9PT0oYz11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZkdC50ZXN0KGEudHlwZSk/dS5jaGVja2VkPWEuY2hlY2tlZDoiaW5wdXQiIT09YyYmInRleHRhcmVhIiE9PWN8fCh1LmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSk7aWYoZSlpZihuKWZvcihvPW98fGd0KHQpLHM9c3x8Z3QoaCksaT0wLHI9by5sZW5ndGg7aTxyO2krKylSdChvW2ldLHNbaV0pO2Vsc2UgUnQodCxoKTtyZXR1cm4ocz1ndChoLCJzY3JpcHQiKSkubGVuZ3RoPjAmJnZ0KHMsIWwmJmd0KHQsInNjcmlwdCIpKSxofSxjbGVhbkRhdGE6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4saSxyPU0uZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49dFtvXSk7bysrKWlmKEcobikpe2lmKGU9bltaLmV4cGFuZG9dKXtpZihlLmV2ZW50cylmb3IoaSBpbiBlLmV2ZW50cylyW2ldP00uZXZlbnQucmVtb3ZlKG4saSk6TS5yZW1vdmVFdmVudChuLGksZS5oYW5kbGUpO25bWi5leHBhbmRvXT12b2lkIDB9bltRLmV4cGFuZG9dJiYobltRLmV4cGFuZG9dPXZvaWQgMCl9fX0pLE0uZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24odCl7cmV0dXJuIE50KHRoaXMsdCwhMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gTnQodGhpcyx0KX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gVSh0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P00udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD10KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB6dCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8THQodGhpcyx0KS5hcHBlbmRDaGlsZCh0KX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgZT1MdCh0aGlzLHQpO2UuaW5zZXJ0QmVmb3JlKHQsZS5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtudWxsIT0odD10aGlzW2VdKTtlKyspMT09PXQubm9kZVR5cGUmJihNLmNsZWFuRGF0YShndCh0LCExKSksdC50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bnVsbCE9dCYmdCxlPW51bGw9PWU/dDplLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIE0uY2xvbmUodGhpcyx0LGUpfSl9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIFUodGhpcyxmdW5jdGlvbih0KXt2YXIgZT10aGlzWzBdfHx7fSxuPTAsaT10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT10JiYxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZS5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYhVHQudGVzdCh0KSYmIW10WyhmdC5leGVjKHQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7dD1NLmh0bWxQcmVmaWx0ZXIodCk7dHJ5e2Zvcig7bjxpO24rKykxPT09KGU9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoTS5jbGVhbkRhdGEoZ3QoZSwhMSkpLGUuaW5uZXJIVE1MPXQpO2U9MH1jYXRjaCh0KXt9fWUmJnRoaXMuZW1wdHkoKS5hcHBlbmQodCl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4genQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5wYXJlbnROb2RlO00uaW5BcnJheSh0aGlzLHQpPDAmJihNLmNsZWFuRGF0YShndCh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LHQpfX0pLE0uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKHQsZSl7TS5mblt0XT1mdW5jdGlvbih0KXtmb3IodmFyIG4saT1bXSxyPU0odCksbz1yLmxlbmd0aC0xLHM9MDtzPD1vO3MrKyluPXM9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCksTShyW3NdKVtlXShuKSxoLmFwcGx5KGksbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkpfX0pO3ZhciBXdD1uZXcgUmVnRXhwKCJeKCIraXQrIikoPyFweClbYS16JV0rJCIsImkiKSxxdD1mdW5jdGlvbih0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGUmJmUub3BlbmVyfHwoZT1uKSxlLmdldENvbXB1dGVkU3R5bGUodCl9LEh0PW5ldyBSZWdFeHAob3Quam9pbigifCIpLCJpIik7ZnVuY3Rpb24gRnQodCxlLG4pe3ZhciBpLHIsbyxzLGE9dC5zdHlsZTtyZXR1cm4obj1ufHxxdCh0KSkmJigiIiE9PShzPW4uZ2V0UHJvcGVydHlWYWx1ZShlKXx8bltlXSl8fE0uY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHwocz1NLnN0eWxlKHQsZSkpLCF2LnBpeGVsQm94U3R5bGVzKCkmJld0LnRlc3QocykmJkh0LnRlc3QoZSkmJihpPWEud2lkdGgscj1hLm1pbldpZHRoLG89YS5tYXhXaWR0aCxhLm1pbldpZHRoPWEubWF4V2lkdGg9YS53aWR0aD1zLHM9bi53aWR0aCxhLndpZHRoPWksYS5taW5XaWR0aD1yLGEubWF4V2lkdGg9bykpLHZvaWQgMCE9PXM/cysiIjpzfWZ1bmN0aW9uIFZ0KHQsZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCF0KCkpcmV0dXJuKHRoaXMuZ2V0PWUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYoaCl7Yy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixoLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHh0LmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGgpO3ZhciB0PW4uZ2V0Q29tcHV0ZWRTdHlsZShoKTtpPSIxJSIhPT10LnRvcCx1PTEyPT09ZSh0Lm1hcmdpbkxlZnQpLGguc3R5bGUucmlnaHQ9IjYwJSIsYT0zNj09PWUodC5yaWdodCkscj0zNj09PWUodC53aWR0aCksaC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLG89MzY9PT1oLm9mZnNldFdpZHRofHwiYWJzb2x1dGUiLHh0LnJlbW92ZUNoaWxkKGMpLGg9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgaSxyLG8sYSx1LGM9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxoPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZSYmKGguc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixoLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdi5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWguc3R5bGUuYmFja2dyb3VuZENsaXAsTS5leHRlbmQodix7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxhfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99fSkpfSgpO3ZhciBVdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sS3Q9L14tLS8sWXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFh0PXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSwkdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sR3Q9cy5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBKdCh0KXt2YXIgZT1NLmNzc1Byb3BzW3RdO3JldHVybiBlfHwoZT1NLmNzc1Byb3BzW3RdPWZ1bmN0aW9uKHQpe2lmKHQgaW4gR3QpcmV0dXJuIHQ7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49JHQubGVuZ3RoO24tLTspaWYoKHQ9JHRbbl0rZSlpbiBHdClyZXR1cm4gdH0odCl8fHQpLGV9ZnVuY3Rpb24gWnQodCxlLG4pe3ZhciBpPXJ0LmV4ZWMoZSk7cmV0dXJuIGk/TWF0aC5tYXgoMCxpWzJdLShufHwwKSkrKGlbM118fCJweCIpOmV9ZnVuY3Rpb24gUXQodCxlLG4saSxyLG8pe3ZhciBzPSJ3aWR0aCI9PT1lPzE6MCxhPTAsdT0wO2lmKG49PT0oaT8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7czw0O3MrPTIpIm1hcmdpbiI9PT1uJiYodSs9TS5jc3ModCxuK290W3NdLCEwLHIpKSxpPygiY29udGVudCI9PT1uJiYodS09TS5jc3ModCwicGFkZGluZyIrb3Rbc10sITAscikpLCJtYXJnaW4iIT09biYmKHUtPU0uY3NzKHQsImJvcmRlciIrb3Rbc10rIldpZHRoIiwhMCxyKSkpOih1Kz1NLmNzcyh0LCJwYWRkaW5nIitvdFtzXSwhMCxyKSwicGFkZGluZyIhPT1uP3UrPU0uY3NzKHQsImJvcmRlciIrb3Rbc10rIldpZHRoIiwhMCxyKTphKz1NLmNzcyh0LCJib3JkZXIiK290W3NdKyJXaWR0aCIsITAscikpO3JldHVybiFpJiZvPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tby11LWEtLjUpKSksdX1mdW5jdGlvbiB0ZSh0LGUsbil7dmFyIGk9cXQodCkscj1GdCh0LGUsaSksbz0iYm9yZGVyLWJveCI9PT1NLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHM9bztpZihXdC50ZXN0KHIpKXtpZighbilyZXR1cm4gcjtyPSJhdXRvIn1yZXR1cm4gcz1zJiYodi5ib3hTaXppbmdSZWxpYWJsZSgpfHxyPT09dC5zdHlsZVtlXSksKCJhdXRvIj09PXJ8fCFwYXJzZUZsb2F0KHIpJiYiaW5saW5lIj09PU0uY3NzKHQsImRpc3BsYXkiLCExLGkpKSYmKHI9dFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0scz0hMCksKHI9cGFyc2VGbG9hdChyKXx8MCkrUXQodCxlLG58fChvPyJib3JkZXIiOiJjb250ZW50IikscyxpLHIpKyJweCJ9ZnVuY3Rpb24gZWUodCxlLG4saSxyKXtyZXR1cm4gbmV3IGVlLnByb3RvdHlwZS5pbml0KHQsZSxuLGkscil9TS5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1GdCh0LCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIHIsbyxzLGE9JChlKSx1PUt0LnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPUp0KGEpKSxzPU0uY3NzSG9va3NbZV18fE0uY3NzSG9va3NbYV0sdm9pZCAwPT09bilyZXR1cm4gcyYmImdldCJpbiBzJiZ2b2lkIDAhPT0ocj1zLmdldCh0LCExLGkpKT9yOmNbZV07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihyPXJ0LmV4ZWMobikpJiZyWzFdJiYobj11dCh0LGUsciksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiPT09byYmKG4rPXImJnJbM118fChNLmNzc051bWJlclthXT8iIjoicHgiKSksdi5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLHMmJiJzZXQiaW4gcyYmdm9pZCAwPT09KG49cy5zZXQodCxuLGkpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByLG8scyxhPSQoZSk7cmV0dXJuIEt0LnRlc3QoZSl8fChlPUp0KGEpKSwocz1NLmNzc0hvb2tzW2VdfHxNLmNzc0hvb2tzW2FdKSYmImdldCJpbiBzJiYocj1zLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1yJiYocj1GdCh0LGUsaSkpLCJub3JtYWwiPT09ciYmZSBpbiBYdCYmKHI9WHRbZV0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KHIpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDpyKTpyfX0pLE0uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtNLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLGkpe2lmKG4pcmV0dXJuIVV0LnRlc3QoTS5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD90ZSh0LGUsaSk6YXQodCxZdCxmdW5jdGlvbigpe3JldHVybiB0ZSh0LGUsaSl9KX0sc2V0OmZ1bmN0aW9uKHQsbixpKXt2YXIgcixvPXF0KHQpLHM9ImJvcmRlci1ib3giPT09TS5jc3ModCwiYm94U2l6aW5nIiwhMSxvKSxhPWkmJlF0KHQsZSxpLHMsbyk7cmV0dXJuIHMmJnYuc2Nyb2xsYm94U2l6ZSgpPT09by5wb3NpdGlvbiYmKGEtPU1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1wYXJzZUZsb2F0KG9bZV0pLVF0KHQsZSwiYm9yZGVyIiwhMSxvKS0uNSkpLGEmJihyPXJ0LmV4ZWMobikpJiYicHgiIT09KHJbM118fCJweCIpJiYodC5zdHlsZVtlXT1uLG49TS5jc3ModCxlKSksWnQoMCxuLGEpfX19KSxNLmNzc0hvb2tzLm1hcmdpbkxlZnQ9VnQodi5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24odCxlKXtpZihlKXJldHVybihwYXJzZUZsb2F0KEZ0KHQsIm1hcmdpbkxlZnQiKSl8fHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1hdCh0LHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksTS5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24odCxlKXtNLmNzc0hvb2tzW3QrZV09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIGk9MCxyPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07aTw0O2krKylyW3Qrb3RbaV0rZV09b1tpXXx8b1tpLTJdfHxvWzBdO3JldHVybiByfX0sIm1hcmdpbiIhPT10JiYoTS5jc3NIb29rc1t0K2VdLnNldD1adCl9KSxNLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXt9LHM9MDtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IoaT1xdCh0KSxyPWUubGVuZ3RoO3M8cjtzKyspb1tlW3NdXT1NLmNzcyh0LGVbc10sITEsaSk7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/TS5zdHlsZSh0LGUsbik6TS5jc3ModCxlKX0sdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9fSksTS5Ud2Vlbj1lZSxlZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmVlLGluaXQ6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuZWxlbT10LHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPXJ8fE0uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1lLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1pLHRoaXMudW5pdD1vfHwoTS5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciB0PWVlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0JiZ0LmdldD90LmdldCh0aGlzKTplZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24odCl7dmFyIGUsbj1lZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWU9TS5lYXNpbmdbdGhpcy5lYXNpbmddKHQsdGhpcy5vcHRpb25zLmR1cmF0aW9uKnQsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZT10LHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSplK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmVlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGVlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1lZS5wcm90b3R5cGUsZWUucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAxIT09dC5lbGVtLm5vZGVUeXBlfHxudWxsIT10LmVsZW1bdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW3QucHJvcF0/dC5lbGVtW3QucHJvcF06KGU9TS5jc3ModC5lbGVtLHQucHJvcCwiIikpJiYiYXV0byIhPT1lP2U6MH0sc2V0OmZ1bmN0aW9uKHQpe00uZnguc3RlcFt0LnByb3BdP00uZnguc3RlcFt0LnByb3BdKHQpOjEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGw9PXQuZWxlbS5zdHlsZVtNLmNzc1Byb3BzW3QucHJvcF1dJiYhTS5jc3NIb29rc1t0LnByb3BdP3QuZWxlbVt0LnByb3BdPXQubm93Ok0uc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGVlLnByb3BIb29rcy5zY3JvbGxUb3A9ZWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sTS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxNLmZ4PWVlLnByb3RvdHlwZS5pbml0LE0uZnguc3RlcD17fTt2YXIgbmUsaWUscmU9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLG9lPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gc2UoKXtpZSYmKCExPT09cy5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNlKTpuLnNldFRpbWVvdXQoc2UsTS5meC5pbnRlcnZhbCksTS5meC50aWNrKCkpfWZ1bmN0aW9uIGFlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe25lPXZvaWQgMH0pLG5lPURhdGUubm93KCl9ZnVuY3Rpb24gdWUodCxlKXt2YXIgbixpPTAscj17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO2k8NDtpKz0yLWUpclsibWFyZ2luIisobj1vdFtpXSldPXJbInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihyLm9wYWNpdHk9ci53aWR0aD10KSxyfWZ1bmN0aW9uIGNlKHQsZSxuKXtmb3IodmFyIGkscj0oaGUudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoaGUudHdlZW5lcnNbIioiXSksbz0wLHM9ci5sZW5ndGg7bzxzO28rKylpZihpPXJbb10uY2FsbChuLGUsdCkpcmV0dXJuIGl9ZnVuY3Rpb24gaGUodCxlLG4pe3ZhciBpLHIsbz0wLHM9aGUucHJlZmlsdGVycy5sZW5ndGgsYT1NLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihyKXJldHVybiExO2Zvcih2YXIgZT1uZXx8YWUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxpPTEtKG4vYy5kdXJhdGlvbnx8MCksbz0wLHM9Yy50d2VlbnMubGVuZ3RoO288cztvKyspYy50d2VlbnNbb10ucnVuKGkpO3JldHVybiBhLm5vdGlmeVdpdGgodCxbYyxpLG5dKSxpPDEmJnM/bjooc3x8YS5ub3RpZnlXaXRoKHQsW2MsMSwwXSksYS5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPWEucHJvbWlzZSh7ZWxlbTp0LHByb3BzOk0uZXh0ZW5kKHt9LGUpLG9wdHM6TS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOk0uZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6bmV8fGFlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgaT1NLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2goaSksaX0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLGk9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihyKXJldHVybiB0aGlzO2ZvcihyPSEwO248aTtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhhLm5vdGlmeVdpdGgodCxbYywxLDBdKSxhLnJlc29sdmVXaXRoKHQsW2MsZV0pKTphLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxoPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM7Zm9yKG4gaW4gdClpZihyPWVbaT0kKG4pXSxvPXRbbl0sQXJyYXkuaXNBcnJheShvKSYmKHI9b1sxXSxvPXRbbl09b1swXSksbiE9PWkmJih0W2ldPW8sZGVsZXRlIHRbbl0pLChzPU0uY3NzSG9va3NbaV0pJiYiZXhwYW5kImluIHMpZm9yKG4gaW4gbz1zLmV4cGFuZChvKSxkZWxldGUgdFtpXSxvKW4gaW4gdHx8KHRbbl09b1tuXSxlW25dPXIpO2Vsc2UgZVtpXT1yfShoLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtvPHM7bysrKWlmKGk9aGUucHJlZmlsdGVyc1tvXS5jYWxsKGMsdCxoLGMub3B0cykpcmV0dXJuIGIoaS5zdG9wKSYmKE0uX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1pLnN0b3AuYmluZChpKSksaTtyZXR1cm4gTS5tYXAoaCxjZSxjKSxiKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksTS5meC50aW1lcihNLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfU0uQW5pbWF0aW9uPU0uZXh0ZW5kKGhlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gdXQobi5lbGVtLHQscnQuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXtiKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKHopO2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7aSsrKW49dFtpXSxoZS50d2VlbmVyc1tuXT1oZS50d2VlbmVyc1tuXXx8W10saGUudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbyxzLGEsdSxjLGgsbD0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLGQ9dGhpcyxmPXt9LHA9dC5zdHlsZSxtPXQubm9kZVR5cGUmJnN0KHQpLGc9Wi5nZXQodCwiZnhzaG93Iik7Zm9yKGkgaW4gbi5xdWV1ZXx8KG51bGw9PShzPU0uX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihzLnVucXVldWVkPTAsYT1zLmVtcHR5LmZpcmUscy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7cy51bnF1ZXVlZHx8YSgpfSkscy51bnF1ZXVlZCsrLGQuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5hbHdheXMoZnVuY3Rpb24oKXtzLnVucXVldWVkLS0sTS5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8cy5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKHI9ZVtpXSxyZS50ZXN0KHIpKXtpZihkZWxldGUgZVtpXSxvPW98fCJ0b2dnbGUiPT09cixyPT09KG0/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PXJ8fCFnfHx2b2lkIDA9PT1nW2ldKWNvbnRpbnVlO209ITB9ZltpXT1nJiZnW2ldfHxNLnN0eWxlKHQsaSl9aWYoKHU9IU0uaXNFbXB0eU9iamVjdChlKSl8fCFNLmlzRW1wdHlPYmplY3QoZikpZm9yKGkgaW4gbCYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxudWxsPT0oYz1nJiZnLmRpc3BsYXkpJiYoYz1aLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShoPU0uY3NzKHQsImRpc3BsYXkiKSkmJihjP2g9YzoobHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxoPU0uY3NzKHQsImRpc3BsYXkiKSxsdChbdF0pKSksKCJpbmxpbmUiPT09aHx8ImlubGluZS1ibG9jayI9PT1oJiZudWxsIT1jKSYmIm5vbmUiPT09TS5jc3ModCwiZmxvYXQiKSYmKHV8fChkLmRvbmUoZnVuY3Rpb24oKXtwLmRpc3BsYXk9Y30pLG51bGw9PWMmJihoPXAuZGlzcGxheSxjPSJub25lIj09PWg/IiI6aCkpLHAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGQuYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGYpdXx8KGc/ImhpZGRlbiJpbiBnJiYobT1nLmhpZGRlbik6Zz1aLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxvJiYoZy5oaWRkZW49IW0pLG0mJmx0KFt0XSwhMCksZC5kb25lKGZ1bmN0aW9uKCl7Zm9yKGkgaW4gbXx8bHQoW3RdKSxaLnJlbW92ZSh0LCJmeHNob3ciKSxmKU0uc3R5bGUodCxpLGZbaV0pfSkpLHU9Y2UobT9nW2ldOjAsaSxkKSxpIGluIGd8fChnW2ldPXUuc3RhcnQsbSYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2hlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpoZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksTS5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dCYmIm9iamVjdCI9PXR5cGVvZiB0P00uZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8Yih0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhYihlKSYmZX07cmV0dXJuIE0uZngub2ZmP2kuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGkuZHVyYXRpb24mJihpLmR1cmF0aW9uIGluIE0uZnguc3BlZWRzP2kuZHVyYXRpb249TS5meC5zcGVlZHNbaS5kdXJhdGlvbl06aS5kdXJhdGlvbj1NLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9aS5xdWV1ZSYmITAhPT1pLnF1ZXVlfHwoaS5xdWV1ZT0iZngiKSxpLm9sZD1pLmNvbXBsZXRlLGkuY29tcGxldGU9ZnVuY3Rpb24oKXtiKGkub2xkKSYmaS5vbGQuY2FsbCh0aGlzKSxpLnF1ZXVlJiZNLmRlcXVldWUodGhpcyxpLnF1ZXVlKX0saX0sTS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5maWx0ZXIoc3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLGkpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPU0uaXNFbXB0eU9iamVjdCh0KSxvPU0uc3BlZWQoZSxuLGkpLHM9ZnVuY3Rpb24oKXt2YXIgZT1oZSh0aGlzLE0uZXh0ZW5kKHt9LHQpLG8pOyhyfHxaLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBzLmZpbmlzaD1zLHJ8fCExPT09by5xdWV1ZT90aGlzLmVhY2gocyk6dGhpcy5xdWV1ZShvLnF1ZXVlLHMpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAscj1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixvPU0udGltZXJzLHM9Wi5nZXQodGhpcyk7aWYocilzW3JdJiZzW3JdLnN0b3AmJmkoc1tyXSk7ZWxzZSBmb3IociBpbiBzKXNbcl0mJnNbcl0uc3RvcCYmb2UudGVzdChyKSYmaShzW3JdKTtmb3Iocj1vLmxlbmd0aDtyLS07KW9bcl0uZWxlbSE9PXRoaXN8fG51bGwhPXQmJm9bcl0ucXVldWUhPT10fHwob1tyXS5hbmltLnN0b3AobiksZT0hMSxvLnNwbGljZShyLDEpKTshZSYmbnx8TS5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1aLmdldCh0aGlzKSxpPW5bdCsicXVldWUiXSxyPW5bdCsicXVldWVIb29rcyJdLG89TS50aW1lcnMscz1pP2kubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLE0ucXVldWUodGhpcyx0LFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9by5sZW5ndGg7ZS0tOylvW2VdLmVsZW09PT10aGlzJiZvW2VdLnF1ZXVlPT09dCYmKG9bZV0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8cztlKyspaVtlXSYmaVtlXS5maW5pc2gmJmlbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksTS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPU0uZm5bZV07TS5mbltlXT1mdW5jdGlvbih0LGkscil7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHVlKGUsITApLHQsaSxyKX19KSxNLmVhY2goe3NsaWRlRG93bjp1ZSgic2hvdyIpLHNsaWRlVXA6dWUoImhpZGUiKSxzbGlkZVRvZ2dsZTp1ZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe00uZm5bdF09ZnVuY3Rpb24odCxuLGkpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4saSl9fSksTS50aW1lcnM9W10sTS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49TS50aW1lcnM7Zm9yKG5lPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8TS5meC5zdG9wKCksbmU9dm9pZCAwfSxNLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe00udGltZXJzLnB1c2godCksTS5meC5zdGFydCgpfSxNLmZ4LmludGVydmFsPTEzLE0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpZXx8KGllPSEwLHNlKCkpfSxNLmZ4LnN0b3A9ZnVuY3Rpb24oKXtpZT1udWxsfSxNLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxNLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9TS5meCYmTS5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLGkpe3ZhciByPW4uc2V0VGltZW91dChlLHQpO2kuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KHIpfX0pfSxmdW5jdGlvbigpe3ZhciB0PXMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPXMuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQocy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIsdi5jaGVja09uPSIiIT09dC52YWx1ZSx2Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9cy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIsdi5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIGxlLGRlPU0uZXhwci5hdHRySGFuZGxlO00uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxNLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00ucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksTS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbz10Lm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP00ucHJvcCh0LGUsbik6KDE9PT1vJiZNLmlzWE1MRG9jKHQpfHwocj1NLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoTS5leHByLm1hdGNoLmJvb2wudGVzdChlKT9sZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgTS5yZW1vdmVBdHRyKHQsZSk6ciYmInNldCJpbiByJiZ2b2lkIDAhPT0oaT1yLnNldCh0LG4sZSkpP2k6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6ciYmImdldCJpbiByJiZudWxsIT09KGk9ci5nZXQodCxlKSk/aTpudWxsPT0oaT1NLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6aSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXYucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJlAodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixpPTAscj1lJiZlLm1hdGNoKHopO2lmKHImJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1yW2krK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGxlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9NLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxNLmVhY2goTS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj1kZVtlXXx8TS5maW5kLmF0dHI7ZGVbZV09ZnVuY3Rpb24odCxlLGkpe3ZhciByLG8scz1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGl8fChvPWRlW3NdLGRlW3NdPXIscj1udWxsIT1uKHQsZSxpKT9zOm51bGwsZGVbc109bykscn19KTt2YXIgZmU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxwZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gbWUodCl7cmV0dXJuKHQubWF0Y2goeil8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goeil8fFtdfU0uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodGhpcyxNLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW00ucHJvcEZpeFt0XXx8dF19KX19KSxNLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXQubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJk0uaXNYTUxEb2ModCl8fChlPU0ucHJvcEZpeFtlXXx8ZSxyPU0ucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP3ImJiJzZXQiaW4gciYmdm9pZCAwIT09KGk9ci5zZXQodCxuLGUpKT9pOnRbZV09bjpyJiYiZ2V0ImluIHImJm51bGwhPT0oaT1yLmdldCh0LGUpKT9pOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1NLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOmZlLnRlc3QodC5ub2RlTmFtZSl8fHBlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSksdi5vcHRTZWxlY3RlZHx8KE0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxNLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe00ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxNLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIsbyxzLGEsdT0wO2lmKGIodCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtNKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsZ2UodGhpcykpKX0pO2lmKChlPXZlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYocj1nZShuKSxpPTE9PT1uLm5vZGVUeXBlJiYiICIrbWUocikrIiAiKXtmb3Iocz0wO289ZVtzKytdOylpLmluZGV4T2YoIiAiK28rIiAiKTwwJiYoaSs9bysiICIpO3IhPT0oYT1tZShpKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG8scyxhLHU9MDtpZihiKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7TSh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLGdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPXZlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYocj1nZShuKSxpPTE9PT1uLm5vZGVUeXBlJiYiICIrbWUocikrIiAiKXtmb3Iocz0wO289ZVtzKytdOylmb3IoO2kuaW5kZXhPZigiICIrbysiICIpPi0xOylpPWkucmVwbGFjZSgiICIrbysiICIsIiAiKTtyIT09KGE9bWUoaSkpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LGk9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJmk/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6Yih0KT90aGlzLmVhY2goZnVuY3Rpb24obil7TSh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLGdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUscixvLHM7aWYoaSlmb3Iocj0wLG89TSh0aGlzKSxzPXZlKHQpO2U9c1tyKytdOylvLmhhc0NsYXNzKGUpP28ucmVtb3ZlQ2xhc3MoZSk6by5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT1nZSh0aGlzKSkmJlouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpaLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tpKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIittZShnZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBiZT0vXHIvZztNLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9Yih0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIHI7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0ocj1pP3QuY2FsbCh0aGlzLG4sTSh0aGlzKS52YWwoKSk6dCk/cj0iIjoibnVtYmVyIj09dHlwZW9mIHI/cis9IiI6QXJyYXkuaXNBcnJheShyKSYmKHI9TS5tYXAocixmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPU0udmFsSG9va3NbdGhpcy50eXBlXXx8TS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLHIsInZhbHVlIil8fCh0aGlzLnZhbHVlPXIpKX0pKTpyPyhlPU0udmFsSG9va3Nbci50eXBlXXx8TS52YWxIb29rc1tyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChyLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1yLnZhbHVlKT9uLnJlcGxhY2UoYmUsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksTS5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1NLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6bWUoTS50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyPXQub3B0aW9ucyxvPXQuc2VsZWN0ZWRJbmRleCxzPSJzZWxlY3Qtb25lIj09PXQudHlwZSxhPXM/bnVsbDpbXSx1PXM/bysxOnIubGVuZ3RoO2ZvcihpPW88MD91OnM/bzowO2k8dTtpKyspaWYoKChuPXJbaV0pLnNlbGVjdGVkfHxpPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IVAobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1NKG4pLnZhbCgpLHMpcmV0dXJuIGU7YS5wdXNoKGUpfXJldHVybiBhfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyPXQub3B0aW9ucyxvPU0ubWFrZUFycmF5KGUpLHM9ci5sZW5ndGg7cy0tOykoKGk9cltzXSkuc2VsZWN0ZWQ9TS5pbkFycmF5KE0udmFsSG9va3Mub3B0aW9uLmdldChpKSxvKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLE0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe00udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1NLmluQXJyYXkoTSh0KS52YWwoKSxlKT4tMX19LHYuY2hlY2tPbnx8KE0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx2LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciB5ZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sX2U9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07TS5leHRlbmQoTS5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbyxhLHUsYyxoLGwsZCxmLG09W2l8fHNdLGc9cC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx2PXAuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9Zj11PWk9aXx8cywzIT09aS5ub2RlVHlwZSYmOCE9PWkubm9kZVR5cGUmJiF5ZS50ZXN0KGcrTS5ldmVudC50cmlnZ2VyZWQpJiYoZy5pbmRleE9mKCIuIik+LTEmJih2PWcuc3BsaXQoIi4iKSxnPXYuc2hpZnQoKSx2LnNvcnQoKSksaD1nLmluZGV4T2YoIjoiKTwwJiYib24iK2csKHQ9dFtNLmV4cGFuZG9dP3Q6bmV3IE0uRXZlbnQoZywib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9cj8yOjMsdC5uYW1lc3BhY2U9di5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Yuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1pKSxlPW51bGw9PWU/W3RdOk0ubWFrZUFycmF5KGUsW3RdKSxkPU0uZXZlbnQuc3BlY2lhbFtnXXx8e30scnx8IWQudHJpZ2dlcnx8ITEhPT1kLnRyaWdnZXIuYXBwbHkoaSxlKSkpe2lmKCFyJiYhZC5ub0J1YmJsZSYmIXkoaSkpe2ZvcihjPWQuZGVsZWdhdGVUeXBlfHxnLHllLnRlc3QoYytnKXx8KGE9YS5wYXJlbnROb2RlKTthO2E9YS5wYXJlbnROb2RlKW0ucHVzaChhKSx1PWE7dT09PShpLm93bmVyRG9jdW1lbnR8fHMpJiZtLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihvPTA7KGE9bVtvKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZj1hLHQudHlwZT1vPjE/YzpkLmJpbmRUeXBlfHxnLChsPShaLmdldChhLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlouZ2V0KGEsImhhbmRsZSIpKSYmbC5hcHBseShhLGUpLChsPWgmJmFbaF0pJiZsLmFwcGx5JiZHKGEpJiYodC5yZXN1bHQ9bC5hcHBseShhLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT1nLHJ8fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGQuX2RlZmF1bHQmJiExIT09ZC5fZGVmYXVsdC5hcHBseShtLnBvcCgpLGUpfHwhRyhpKXx8aCYmYihpW2ddKSYmIXkoaSkmJigodT1pW2hdKSYmKGlbaF09bnVsbCksTS5ldmVudC50cmlnZ2VyZWQ9Zyx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihnLF9lKSxpW2ddKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZyxfZSksTS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihpW2hdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1NLmV4dGVuZChuZXcgTS5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtNLmV2ZW50LnRyaWdnZXIoaSxudWxsLGUpfX0pLE0uZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00uZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIE0uZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSksdi5mb2N1c2lufHxNLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7TS5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LE0uZXZlbnQuZml4KHQpKX07TS5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBpPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxyPVouYWNjZXNzKGksZSk7cnx8aS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksWi5hY2Nlc3MoaSxlLChyfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMscj1aLmFjY2VzcyhpLGUpLTE7cj9aLmFjY2VzcyhpLGUscik6KGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFoucmVtb3ZlKGksZSkpfX19KTt2YXIgd2U9bi5sb2NhdGlvbix4ZT1EYXRlLm5vdygpLE1lPS9cPy87TS5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fE0uZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBTZT0vXFtcXSQvLEVlPS9ccj9cbi9nLEFlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxDZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24ga2UodCxlLG4saSl7dmFyIHI7aWYoQXJyYXkuaXNBcnJheShlKSlNLmVhY2goZSxmdW5jdGlvbihlLHIpe258fFNlLnRlc3QodCk/aSh0LHIpOmtlKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIHImJm51bGwhPXI/ZToiIikrIl0iLHIsbixpKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14KGUpKWkodCxlKTtlbHNlIGZvcihyIGluIGUpa2UodCsiWyIrcisiXSIsZVtyXSxuLGkpfU0ucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixpPVtdLHI9ZnVuY3Rpb24odCxlKXt2YXIgbj1iKGUpP2UoKTplO2lbaS5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKEFycmF5LmlzQXJyYXkodCl8fHQuanF1ZXJ5JiYhTS5pc1BsYWluT2JqZWN0KHQpKU0uZWFjaCh0LGZ1bmN0aW9uKCl7cih0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIHQpa2Uobix0W25dLGUscik7cmV0dXJuIGkuam9pbigiJiIpfSxNLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIE0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgdD1NLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gdD9NLm1ha2VBcnJheSh0KTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFNKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmQ2UudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUFlLnRlc3QodCkmJih0aGlzLmNoZWNrZWR8fCFkdC50ZXN0KHQpKX0pLm1hcChmdW5jdGlvbih0LGUpe3ZhciBuPU0odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP00ubWFwKG4sZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZS5uYW1lLHZhbHVlOnQucmVwbGFjZShFZSwiXHJcbiIpfX0pOntuYW1lOmUubmFtZSx2YWx1ZTpuLnJlcGxhY2UoRWUsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgT2U9LyUyMC9nLFBlPS8jLiokLyxUZT0vKFs/Jl0pXz1bXiZdKi8samU9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxJZT0vXig/OkdFVHxIRUFEKSQvLExlPS9eXC9cLy8sQmU9e30sRGU9e30sUmU9IiovIi5jb25jYXQoIioiKSx6ZT1zLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBOZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iKiIpO3ZhciBpLHI9MCxvPWUudG9Mb3dlckNhc2UoKS5tYXRjaCh6KXx8W107aWYoYihuKSlmb3IoO2k9b1tyKytdOykiKyI9PT1pWzBdPyhpPWkuc2xpY2UoMSl8fCIqIiwodFtpXT10W2ldfHxbXSkudW5zaGlmdChuKSk6KHRbaV09dFtpXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIFdlKHQsZSxuLGkpe3ZhciByPXt9LG89dD09PURlO2Z1bmN0aW9uIHMoYSl7dmFyIHU7cmV0dXJuIHJbYV09ITAsTS5lYWNoKHRbYV18fFtdLGZ1bmN0aW9uKHQsYSl7dmFyIGM9YShlLG4saSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxvfHxyW2NdP28/ISh1PWMpOnZvaWQgMDooZS5kYXRhVHlwZXMudW5zaGlmdChjKSxzKGMpLCExKX0pLHV9cmV0dXJuIHMoZS5kYXRhVHlwZXNbMF0pfHwhclsiKiJdJiZzKCIqIil9ZnVuY3Rpb24gcWUodCxlKXt2YXIgbixpLHI9TS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIGUpdm9pZCAwIT09ZVtuXSYmKChyW25dP3Q6aXx8KGk9e30pKVtuXT1lW25dKTtyZXR1cm4gaSYmTS5leHRlbmQoITAsdCxpKSx0fXplLmhyZWY9d2UuaHJlZixNLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6d2UuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdCh3ZS5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpSZSx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6TS5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/cWUocWUodCxNLmFqYXhTZXR0aW5ncyksZSk6cWUoTS5hamF4U2V0dGluZ3MsdCl9LGFqYXhQcmVmaWx0ZXI6TmUoQmUpLGFqYXhUcmFuc3BvcnQ6TmUoRGUpLGFqYXg6ZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLGU9ZXx8e307dmFyIGkscixvLGEsdSxjLGgsbCxkLGYscD1NLmFqYXhTZXR1cCh7fSxlKSxtPXAuY29udGV4dHx8cCxnPXAuY29udGV4dCYmKG0ubm9kZVR5cGV8fG0uanF1ZXJ5KT9NKG0pOk0uZXZlbnQsdj1NLkRlZmVycmVkKCksYj1NLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx5PXAuc3RhdHVzQ29kZXx8e30sXz17fSx3PXt9LHg9ImNhbmNlbGVkIixTPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24odCl7dmFyIGU7aWYoaCl7aWYoIWEpZm9yKGE9e307ZT1qZS5leGVjKG8pOylhW2VbMV0udG9Mb3dlckNhc2UoKV09ZVsyXTtlPWFbdC50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09ZT9udWxsOmV9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBoP286bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1oJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LF9bdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09aCYmKHAubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGgpUy5hbHdheXModFtTLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCl5W2VdPVt5W2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHx4O3JldHVybiBpJiZpLmFib3J0KGUpLEUoMCxlKSx0aGlzfX07aWYodi5wcm9taXNlKFMpLHAudXJsPSgodHx8cC51cmx8fHdlLmhyZWYpKyIiKS5yZXBsYWNlKExlLHdlLnByb3RvY29sKyIvLyIpLHAudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxwLm1ldGhvZHx8cC50eXBlLHAuZGF0YVR5cGVzPShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goeil8fFsiIl0sbnVsbD09cC5jcm9zc0RvbWFpbil7Yz1zLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPXAudXJsLGMuaHJlZj1jLmhyZWYscC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7cC5jcm9zc0RvbWFpbj0hMH19aWYocC5kYXRhJiZwLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHAuZGF0YSYmKHAuZGF0YT1NLnBhcmFtKHAuZGF0YSxwLnRyYWRpdGlvbmFsKSksV2UoQmUscCxlLFMpLGgpcmV0dXJuIFM7Zm9yKGQgaW4obD1NLmV2ZW50JiZwLmdsb2JhbCkmJjA9PU0uYWN0aXZlKysmJk0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IikscC50eXBlPXAudHlwZS50b1VwcGVyQ2FzZSgpLHAuaGFzQ29udGVudD0hSWUudGVzdChwLnR5cGUpLHI9cC51cmwucmVwbGFjZShQZSwiIikscC5oYXNDb250ZW50P3AuZGF0YSYmcC5wcm9jZXNzRGF0YSYmMD09PShwLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihwLmRhdGE9cC5kYXRhLnJlcGxhY2UoT2UsIisiKSk6KGY9cC51cmwuc2xpY2Uoci5sZW5ndGgpLHAuZGF0YSYmKHAucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgcC5kYXRhKSYmKHIrPShNZS50ZXN0KHIpPyImIjoiPyIpK3AuZGF0YSxkZWxldGUgcC5kYXRhKSwhMT09PXAuY2FjaGUmJihyPXIucmVwbGFjZShUZSwiJDEiKSxmPShNZS50ZXN0KHIpPyImIjoiPyIpKyJfPSIreGUrKytmKSxwLnVybD1yK2YpLHAuaWZNb2RpZmllZCYmKE0ubGFzdE1vZGlmaWVkW3JdJiZTLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixNLmxhc3RNb2RpZmllZFtyXSksTS5ldGFnW3JdJiZTLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLE0uZXRhZ1tyXSkpLChwLmRhdGEmJnAuaGFzQ29udGVudCYmITEhPT1wLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmUy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHAuY29udGVudFR5cGUpLFMuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixwLmRhdGFUeXBlc1swXSYmcC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXT9wLmFjY2VwdHNbcC5kYXRhVHlwZXNbMF1dKygiKiIhPT1wLmRhdGFUeXBlc1swXT8iLCAiK1JlKyI7IHE9MC4wMSI6IiIpOnAuYWNjZXB0c1siKiJdKSxwLmhlYWRlcnMpUy5zZXRSZXF1ZXN0SGVhZGVyKGQscC5oZWFkZXJzW2RdKTtpZihwLmJlZm9yZVNlbmQmJighMT09PXAuYmVmb3JlU2VuZC5jYWxsKG0sUyxwKXx8aCkpcmV0dXJuIFMuYWJvcnQoKTtpZih4PSJhYm9ydCIsYi5hZGQocC5jb21wbGV0ZSksUy5kb25lKHAuc3VjY2VzcyksUy5mYWlsKHAuZXJyb3IpLGk9V2UoRGUscCxlLFMpKXtpZihTLnJlYWR5U3RhdGU9MSxsJiZnLnRyaWdnZXIoImFqYXhTZW5kIixbUyxwXSksaClyZXR1cm4gUztwLmFzeW5jJiZwLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Uy5hYm9ydCgidGltZW91dCIpfSxwLnRpbWVvdXQpKTt0cnl7aD0hMSxpLnNlbmQoXyxFKX1jYXRjaCh0KXtpZihoKXRocm93IHQ7RSgtMSx0KX19ZWxzZSBFKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBFKHQsZSxzLGEpe3ZhciBjLGQsZixfLHcseD1lO2h8fChoPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLGk9dm9pZCAwLG89YXx8IiIsUy5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LHMmJihfPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscixvLHMsYT10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PWkmJihpPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihpKWZvcihyIGluIGEpaWYoYVtyXSYmYVtyXS50ZXN0KGkpKXt1LnVuc2hpZnQocik7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKHIgaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tyKyIgIit1WzBdXSl7bz1yO2JyZWFrfXN8fChzPXIpfW89b3x8c31pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119KHAsUyxzKSksXz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcixvLHMsYSx1LGM9e30saD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGhbMV0pZm9yKHMgaW4gdC5jb252ZXJ0ZXJzKWNbcy50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbc107Zm9yKG89aC5zaGlmdCgpO287KWlmKHQucmVzcG9uc2VGaWVsZHNbb10mJihuW3QucmVzcG9uc2VGaWVsZHNbb11dPWUpLCF1JiZpJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PW8sbz1oLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShzPWNbdSsiICIrb118fGNbIiogIitvXSkpZm9yKHIgaW4gYylpZigoYT1yLnNwbGl0KCIgIikpWzFdPT09byYmKHM9Y1t1KyIgIithWzBdXXx8Y1siKiAiK2FbMF1dKSl7ITA9PT1zP3M9Y1tyXTohMCE9PWNbcl0mJihvPWFbMF0saC51bnNoaWZ0KGFbMV0pKTticmVha31pZighMCE9PXMpaWYocyYmdC50aHJvd3MpZT1zKGUpO2Vsc2UgdHJ5e2U9cyhlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpzP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KHAsXyxTLGMpLGM/KHAuaWZNb2RpZmllZCYmKCh3PVMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihNLmxhc3RNb2RpZmllZFtyXT13KSwodz1TLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoTS5ldGFnW3JdPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1wLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT10P3g9Im5vdG1vZGlmaWVkIjooeD1fLnN0YXRlLGQ9Xy5kYXRhLGM9IShmPV8uZXJyb3IpKSk6KGY9eCwhdCYmeHx8KHg9ImVycm9yIix0PDAmJih0PTApKSksUy5zdGF0dXM9dCxTLnN0YXR1c1RleHQ9KGV8fHgpKyIiLGM/di5yZXNvbHZlV2l0aChtLFtkLHgsU10pOnYucmVqZWN0V2l0aChtLFtTLHgsZl0pLFMuc3RhdHVzQ29kZSh5KSx5PXZvaWQgMCxsJiZnLnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtTLHAsYz9kOmZdKSxiLmZpcmVXaXRoKG0sW1MseF0pLGwmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW1MscF0pLC0tTS5hY3RpdmV8fE0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBTfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTS5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE0uZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLE0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe01bZV09ZnVuY3Rpb24odCxuLGkscil7cmV0dXJuIGIobikmJihyPXJ8fGksaT1uLG49dm9pZCAwKSxNLmFqYXgoTS5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpyLGRhdGE6bixzdWNjZXNzOml9LE0uaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLE0uX2V2YWxVcmw9ZnVuY3Rpb24odCl7cmV0dXJuIE0uYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsdGhyb3dzOiEwfSl9LE0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYoYih0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPU0odCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGIodCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe00odGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPU0odGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9Yih0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe00odGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe00odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksTS5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFNLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxNLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sTS5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgSGU9ezA6MjAwLDEyMjM6MjA0fSxGZT1NLmFqYXhTZXR0aW5ncy54aHIoKTt2LmNvcnM9ISFGZSYmIndpdGhDcmVkZW50aWFscyJpbiBGZSx2LmFqYXg9RmU9ISFGZSxNLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUsaTtpZih2LmNvcnN8fEZlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe3ZhciBzLGE9dC54aHIoKTtpZihhLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IocyBpbiB0LnhockZpZWxkcylhW3NdPXQueGhyRmllbGRzW3NdO2ZvcihzIGluIHQubWltZVR5cGUmJmEub3ZlcnJpZGVNaW1lVHlwZSYmYS5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fHJbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KHJbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxyKWEuc2V0UmVxdWVzdEhlYWRlcihzLHJbc10pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9aT1hLm9ubG9hZD1hLm9uZXJyb3I9YS5vbmFib3J0PWEub250aW1lb3V0PWEub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/YS5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2YgYS5zdGF0dXM/bygwLCJlcnJvciIpOm8oYS5zdGF0dXMsYS5zdGF0dXNUZXh0KTpvKEhlW2Euc3RhdHVzXXx8YS5zdGF0dXMsYS5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShhLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBhLnJlc3BvbnNlVGV4dD97YmluYXJ5OmEucmVzcG9uc2V9Ont0ZXh0OmEucmVzcG9uc2VUZXh0fSxhLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxhLm9ubG9hZD1lKCksaT1hLm9uZXJyb3I9YS5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1hLm9uYWJvcnQ/YS5vbmFib3J0PWk6YS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09YS5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZpKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXthLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxNLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLE0uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBNLmdsb2JhbEV2YWwodCksdH19fSksTS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLE0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxyKXtlPU0oIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmcigiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLHMuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBWZSxVZT1bXSxLZT0vKD0pXD8oPz0mfCQpfFw/XD8vO00uYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1VZS5wb3AoKXx8TS5leHBhbmRvKyJfIit4ZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksTS5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUsaSl7dmFyIHIsbyxzLGE9ITEhPT10Lmpzb25wJiYoS2UudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZLZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiByPXQuanNvbnBDYWxsYmFjaz1iKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLGE/dFthXT10W2FdLnJlcGxhY2UoS2UsIiQxIityKTohMSE9PXQuanNvbnAmJih0LnVybCs9KE1lLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK3IpLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHxNLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixvPW5bcl0sbltyXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PW8/TShuKS5yZW1vdmVQcm9wKHIpOm5bcl09byx0W3JdJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxVZS5wdXNoKHIpKSxzJiZiKG8pJiZvKHNbMF0pLHM9bz12b2lkIDB9KSwic2NyaXB0In0pLHYuY3JlYXRlSFRNTERvY3VtZW50PSgoVmU9cy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1WZS5jaGlsZE5vZGVzLmxlbmd0aCksTS5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwodi5jcmVhdGVIVE1MRG9jdW1lbnQ/KChpPShlPXMuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPXMubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQoaSkpOmU9cyksbz0hbiYmW10sKHI9VC5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KHJbMV0pXToocj13dChbdF0sZSxvKSxvJiZvLmxlbmd0aCYmTShvKS5yZW1vdmUoKSxNLm1lcmdlKFtdLHIuY2hpbGROb2RlcykpKTt2YXIgaSxyLG99LE0uZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHM9dGhpcyxhPXQuaW5kZXhPZigiICIpO3JldHVybiBhPi0xJiYoaT1tZSh0LnNsaWNlKGEpKSx0PXQuc2xpY2UoMCxhKSksYihlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihyPSJQT1NUIikscy5sZW5ndGg+MCYmTS5hamF4KHt1cmw6dCx0eXBlOnJ8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe289YXJndW1lbnRzLHMuaHRtbChpP00oIjxkaXY+IikuYXBwZW5kKE0ucGFyc2VIVE1MKHQpKS5maW5kKGkpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7cy5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sTS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtNLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksTS5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIE0uZ3JlcChNLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sTS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIGkscixvLHMsYSx1LGM9TS5jc3ModCwicG9zaXRpb24iKSxoPU0odCksbD17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLGE9aC5vZmZzZXQoKSxvPU0uY3NzKHQsInRvcCIpLHU9TS5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTE/KHM9KGk9aC5wb3NpdGlvbigpKS50b3Ascj1pLmxlZnQpOihzPXBhcnNlRmxvYXQobyl8fDAscj1wYXJzZUZsb2F0KHUpfHwwKSxiKGUpJiYoZT1lLmNhbGwodCxuLE0uZXh0ZW5kKHt9LGEpKSksbnVsbCE9ZS50b3AmJihsLnRvcD1lLnRvcC1hLnRvcCtzKSxudWxsIT1lLmxlZnQmJihsLmxlZnQ9ZS5sZWZ0LWEubGVmdCtyKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxsKTpoLmNzcyhsKX19LE0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtNLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixpPXRoaXNbMF07cmV0dXJuIGk/aS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49aS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixpPXRoaXNbMF0scj17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09TS5jc3MoaSwicG9zaXRpb24iKSllPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49aS5vd25lckRvY3VtZW50LHQ9aS5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PU0uY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1pJiYxPT09dC5ub2RlVHlwZSYmKChyPU0odCkub2Zmc2V0KCkpLnRvcCs9TS5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPU0uY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLXIudG9wLU0uY3NzKGksIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LXIubGVmdC1NLmNzcyhpLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09TS5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8eHR9KX19KSxNLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtNLmZuW3RdPWZ1bmN0aW9uKGkpe3JldHVybiBVKHRoaXMsZnVuY3Rpb24odCxpLHIpe3ZhciBvO2lmKHkodCk/bz10Ojk9PT10Lm5vZGVUeXBlJiYobz10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1yKXJldHVybiBvP29bZV06dFtpXTtvP28uc2Nyb2xsVG8obj9vLnBhZ2VYT2Zmc2V0OnIsbj9yOm8ucGFnZVlPZmZzZXQpOnRbaV09cn0sdCxpLGFyZ3VtZW50cy5sZW5ndGgpfX0pLE0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe00uY3NzSG9va3NbZV09VnQodi5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1GdCh0LGUpLFd0LnRlc3Qobik/TSh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksTS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtNLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4saSl7TS5mbltpXT1mdW5jdGlvbihyLG8pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiByKSxhPW58fCghMD09PXJ8fCEwPT09bz8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFUodGhpcyxmdW5jdGlvbihlLG4scil7dmFyIG87cmV0dXJuIHkoZSk/MD09PWkuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KG89ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLG9bInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLG9bIm9mZnNldCIrdF0sb1siY2xpZW50Iit0XSkpOnZvaWQgMD09PXI/TS5jc3MoZSxuLGEpOk0uc3R5bGUoZSxuLHIsYSl9LGUscz9yOnZvaWQgMCxzKX19KX0pLE0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe00uZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLE0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxNLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0aGlzLm9uKGUsdCxuLGkpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksTS5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLGkscjtpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksYih0KSlyZXR1cm4gaT11LmNhbGwoYXJndW1lbnRzLDIpLChyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxNLmd1aWQrKyxyfSxNLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P00ucmVhZHlXYWl0Kys6TS5yZWFkeSghMCl9LE0uaXNBcnJheT1BcnJheS5pc0FycmF5LE0ucGFyc2VKU09OPUpTT04ucGFyc2UsTS5ub2RlTmFtZT1QLE0uaXNGdW5jdGlvbj1iLE0uaXNXaW5kb3c9eSxNLmNhbWVsQ2FzZT0kLE0udHlwZT14LE0ubm93PURhdGUubm93LE0uaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPU0udHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KGk9ZnVuY3Rpb24oKXtyZXR1cm4gTX0uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPWkpO3ZhciBZZT1uLmpRdWVyeSxYZT1uLiQ7cmV0dXJuIE0ubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09TSYmKG4uJD1YZSksdCYmbi5qUXVlcnk9PT1NJiYobi5qUXVlcnk9WWUpLE19LHJ8fChuLmpRdWVyeT1uLiQ9TSksTX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1uKDgpO2UudXVpZD1pLnV1aWQsZS5XcmFwcGVkRXJyb3I9aS5XcmFwcGVkRXJyb3IsZS5yZXNvbHZlUHJvbWlzZXNEaWN0PWkucmVzb2x2ZVByb21pc2VzRGljdDt2YXIgcj1uKDgpO2UucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW5ldyByLldyYXBwZWRFcnJvcih0LG4pO3JldHVybiBlJiZjb25zb2xlLmVycm9yKGkpLFByb21pc2UucmVqZWN0KGkpfX0sZS50eXBlc2V0PWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZSYmKHQudGV4dENvbnRlbnQ9ZSksdm9pZCAwIT09d2luZG93Lk1hdGhKYXgmJk1hdGhKYXguSHViLlF1ZXVlKFsiVHlwZXNldCIsTWF0aEpheC5IdWIsdF0pfSxlLmVzY2FwZV9odG1sPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLnRleHRDb250ZW50PXQsZS5pbm5lckhUTUx9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTQpLHI9bigwKTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIDU1Mjk2PT0oNjQ1MTImdC5jaGFyQ29kZUF0KGUpKSYmKCEoZTwwfHxlKzE+PXQubGVuZ3RoKSYmNTYzMjA9PSg2NDUxMiZ0LmNoYXJDb2RlQXQoZSsxKSkpfWZ1bmN0aW9uIHModCl7cmV0dXJuKHQ+Pj4yNHx0Pj4+OCY2NTI4MHx0PDw4JjE2NzExNjgwfCgyNTUmdCk8PDI0KT4+PjB9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoPyIwIit0OnR9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gNz09PXQubGVuZ3RoPyIwIit0OjY9PT10Lmxlbmd0aD8iMDAiK3Q6NT09PXQubGVuZ3RoPyIwMDAiK3Q6ND09PXQubGVuZ3RoPyIwMDAwIit0OjM9PT10Lmxlbmd0aD8iMDAwMDAiK3Q6Mj09PXQubGVuZ3RoPyIwMDAwMDAiK3Q6MT09PXQubGVuZ3RoPyIwMDAwMDAwIit0OnR9ZS5pbmhlcml0cz1yLGUudG9BcnJheT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuc2xpY2UoKTtpZighdClyZXR1cm5bXTt2YXIgbj1bXTtpZigic3RyaW5nIj09dHlwZW9mIHQpaWYoZSl7aWYoImhleCI9PT1lKWZvcigodD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksIiIpKS5sZW5ndGglMiE9MCYmKHQ9IjAiK3QpLHI9MDtyPHQubGVuZ3RoO3IrPTIpbi5wdXNoKHBhcnNlSW50KHRbcl0rdFtyKzFdLDE2KSl9ZWxzZSBmb3IodmFyIGk9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBzPXQuY2hhckNvZGVBdChyKTtzPDEyOD9uW2krK109czpzPDIwNDg/KG5baSsrXT1zPj42fDE5MixuW2krK109NjMmc3wxMjgpOm8odCxyKT8ocz02NTUzNisoKDEwMjMmcyk8PDEwKSsoMTAyMyZ0LmNoYXJDb2RlQXQoKytyKSksbltpKytdPXM+PjE4fDI0MCxuW2krK109cz4+MTImNjN8MTI4LG5baSsrXT1zPj42JjYzfDEyOCxuW2krK109NjMmc3wxMjgpOihuW2krK109cz4+MTJ8MjI0LG5baSsrXT1zPj42JjYzfDEyOCxuW2krK109NjMmc3wxMjgpfWVsc2UgZm9yKHI9MDtyPHQubGVuZ3RoO3IrKyluW3JdPTB8dFtyXTtyZXR1cm4gbn0sZS50b0hleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9IiIsbj0wO248dC5sZW5ndGg7bisrKWUrPWEodFtuXS50b1N0cmluZygxNikpO3JldHVybiBlfSxlLmh0b25sPXMsZS50b0hleDMyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPSIiLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dFtpXTsibGl0dGxlIj09PWUmJihyPXMocikpLG4rPXUoci50b1N0cmluZygxNikpfXJldHVybiBufSxlLnplcm8yPWEsZS56ZXJvOD11LGUuam9pbjMyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPW4tZTtpKG8lND09MCk7Zm9yKHZhciBzPW5ldyBBcnJheShvLzQpLGE9MCx1PWU7YTxzLmxlbmd0aDthKyssdSs9NCl7dmFyIGM7Yz0iYmlnIj09PXI/dFt1XTw8MjR8dFt1KzFdPDwxNnx0W3UrMl08PDh8dFt1KzNdOnRbdSszXTw8MjR8dFt1KzJdPDwxNnx0W3UrMV08PDh8dFt1XSxzW2FdPWM+Pj4wfXJldHVybiBzfSxlLnNwbGl0MzI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFycmF5KDQqdC5sZW5ndGgpLGk9MCxyPTA7aTx0Lmxlbmd0aDtpKysscis9NCl7dmFyIG89dFtpXTsiYmlnIj09PWU/KG5bcl09bz4+PjI0LG5bcisxXT1vPj4+MTYmMjU1LG5bcisyXT1vPj4+OCYyNTUsbltyKzNdPTI1NSZvKToobltyKzNdPW8+Pj4yNCxuW3IrMl09bz4+PjE2JjI1NSxuW3IrMV09bz4+PjgmMjU1LG5bcl09MjU1Jm8pfXJldHVybiBufSxlLnJvdHIzMj1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+ZXx0PDwzMi1lfSxlLnJvdGwzMj1mdW5jdGlvbih0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfSxlLnN1bTMyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZT4+PjB9LGUuc3VtMzJfMz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrZStuPj4+MH0sZS5zdW0zMl80PWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0K2UrbitpPj4+MH0sZS5zdW0zMl81PWZ1bmN0aW9uKHQsZSxuLGkscil7cmV0dXJuIHQrZStuK2krcj4+PjB9LGUuc3VtNjQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dFtlXSxvPWkrdFtlKzFdPj4+MCxzPShvPGk/MTowKStuK3I7dFtlXT1zPj4+MCx0W2UrMV09b30sZS5zdW02NF9oaT1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4oZStpPj4+MDxlPzE6MCkrdCtuPj4+MH0sZS5zdW02NF9sbz1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gZStpPj4+MH0sZS5zdW02NF80X2hpPWZ1bmN0aW9uKHQsZSxuLGkscixvLHMsYSl7dmFyIHU9MCxjPWU7cmV0dXJuIHUrPShjPWMraT4+PjApPGU/MTowLHUrPShjPWMrbz4+PjApPG8/MTowLHQrbityK3MrKHUrPShjPWMrYT4+PjApPGE/MTowKT4+PjB9LGUuc3VtNjRfNF9sbz1mdW5jdGlvbih0LGUsbixpLHIsbyxzLGEpe3JldHVybiBlK2krbythPj4+MH0sZS5zdW02NF81X2hpPWZ1bmN0aW9uKHQsZSxuLGkscixvLHMsYSx1LGMpe3ZhciBoPTAsbD1lO3JldHVybiBoKz0obD1sK2k+Pj4wKTxlPzE6MCxoKz0obD1sK28+Pj4wKTxvPzE6MCxoKz0obD1sK2E+Pj4wKTxhPzE6MCx0K24rcitzK3UrKGgrPShsPWwrYz4+PjApPGM/MTowKT4+PjB9LGUuc3VtNjRfNV9sbz1mdW5jdGlvbih0LGUsbixpLHIsbyxzLGEsdSxjKXtyZXR1cm4gZStpK28rYStjPj4+MH0sZS5yb3RyNjRfaGk9ZnVuY3Rpb24odCxlLG4pe3JldHVybihlPDwzMi1ufHQ+Pj5uKT4+PjB9LGUucm90cjY0X2xvPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4odDw8MzItbnxlPj4+bik+Pj4wfSxlLnNocjY0X2hpPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD4+Pm59LGUuc2hyNjRfbG89ZnVuY3Rpb24odCxlLG4pe3JldHVybih0PDwzMi1ufGU+Pj5uKT4+PjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuaXRlcj90Lml0ZXIoKTpuZXcgcih0KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5pdGVyPWksZS5lYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9MCxvPWkodCk7dm9pZCAwIT09KG49by5uZXh0KCkpOylpZighMT09PWUobixyKyspKXJldHVybn0sZS5ldmVyeT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPTAsbz1pKHQpO3ZvaWQgMCE9PShuPW8ubmV4dCgpKTspaWYoIWUobixyKyspKXJldHVybiExO3JldHVybiEwfSxlLnNvbWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0wLG89aSh0KTt2b2lkIDAhPT0obj1vLm5leHQoKSk7KWlmKGUobixyKyspKXJldHVybiEwO3JldHVybiExfSxlLnRvQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MCxyPVtdLG89aSh0KTt2b2lkIDAhPT0oZT1vLm5leHQoKSk7KXJbbisrXT1lO3JldHVybiByfTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPW5ldyB0KHRoaXMuX3NvdXJjZSk7cmV0dXJuIGUuX2luZGV4PXRoaXMuX2luZGV4LGV9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2luZGV4Pj10aGlzLl9zb3VyY2UubGVuZ3RoKSlyZXR1cm4gdGhpcy5fc291cmNlW3RoaXMuX2luZGV4KytdfSx0fSgpO2UuQXJyYXlJdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMjApLHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixvPWl8fHJ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyPXQuZXhwb3J0cz17fTtmdW5jdGlvbiBvKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gYSh0KXtpZihuPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChuPT09b3x8IW4pJiZzZXRUaW1lb3V0KXJldHVybiBuPXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gbih0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCwwKX19fSFmdW5jdGlvbigpe3RyeXtuPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6b31jYXRjaCh0KXtuPW99dHJ5e2k9ImZ1bmN0aW9uIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6c31jYXRjaCh0KXtpPXN9fSgpO3ZhciB1LGM9W10saD0hMSxsPS0xO2Z1bmN0aW9uIGQoKXtoJiZ1JiYoaD0hMSx1Lmxlbmd0aD9jPXUuY29uY2F0KGMpOmw9LTEsYy5sZW5ndGgmJmYoKSl9ZnVuY3Rpb24gZigpe2lmKCFoKXt2YXIgdD1hKGQpO2g9ITA7Zm9yKHZhciBlPWMubGVuZ3RoO2U7KXtmb3IodT1jLGM9W107KytsPGU7KXUmJnVbbF0ucnVuKCk7bD0tMSxlPWMubGVuZ3RofXU9bnVsbCxoPSExLGZ1bmN0aW9uKHQpe2lmKGk9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigoaT09PXN8fCFpKSYmY2xlYXJUaW1lb3V0KXJldHVybiBpPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e2kodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBpLmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gaS5jYWxsKHRoaXMsdCl9fX0odCl9fWZ1bmN0aW9uIHAodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1mdW5jdGlvbiBtKCl7fXIubmV4dFRpY2s9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtjLnB1c2gobmV3IHAodCxlKSksMSE9PWMubGVuZ3RofHxofHxhKGYpfSxwLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxyLnRpdGxlPSJicm93c2VyIixyLmJyb3dzZXI9ITAsci5lbnY9e30sci5hcmd2PVtdLHIudmVyc2lvbj0iIixyLnZlcnNpb25zPXt9LHIub249bSxyLmFkZExpc3RlbmVyPW0sci5vbmNlPW0sci5vZmY9bSxyLnJlbW92ZUxpc3RlbmVyPW0sci5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxyLmVtaXQ9bSxyLnByZXBlbmRMaXN0ZW5lcj1tLHIucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLHIubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybltdfSxyLmJpbmRpbmc9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxyLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0sci5jaGRpcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxyLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU5KS5UcmFuc2Zvcm0sbz1uKDYzKS5TdHJpbmdEZWNvZGVyO2Z1bmN0aW9uIHModCl7ci5jYWxsKHRoaXMpLHRoaXMuaGFzaE1vZGU9InN0cmluZyI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9maW5hbCYmKHRoaXMuX19maW5hbD10aGlzLl9maW5hbCx0aGlzLl9maW5hbD1udWxsKSx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH1uKDApKHMscikscy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuZnJvbSh0LGUpKTt2YXIgcj10aGlzLl91cGRhdGUodCk7cmV0dXJuIHRoaXMuaGFzaE1vZGU/dGhpczoobiYmKHI9dGhpcy5fdG9TdHJpbmcocixuKSkscil9LHMucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKCl7fSxzLnByb3RvdHlwZS5nZXRBdXRoVGFnPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIil9LHMucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInRyeWluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKX0scy5wcm90b3R5cGUuc2V0QUFEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpfSxzLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaTt0cnl7dGhpcy5oYXNoTW9kZT90aGlzLl91cGRhdGUodCk6dGhpcy5wdXNoKHRoaXMuX3VwZGF0ZSh0KSl9Y2F0Y2godCl7aT10fWZpbmFsbHl7bihpKX19LHMucHJvdG90eXBlLl9mbHVzaD1mdW5jdGlvbih0KXt2YXIgZTt0cnl7dGhpcy5wdXNoKHRoaXMuX19maW5hbCgpKX1jYXRjaCh0KXtlPXR9dChlKX0scy5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2ZpbmFsKCl8fGkuYWxsb2MoMCk7cmV0dXJuIHQmJihlPXRoaXMuX3RvU3RyaW5nKGUsdCwhMCkpLGV9LHMucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IG8oZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcigiY2FuJ3Qgc3dpdGNoIGVuY29kaW5ncyIpO3ZhciBpPXRoaXMuX2RlY29kZXIud3JpdGUodCk7cmV0dXJuIG4mJihpKz10aGlzLl9kZWNvZGVyLmVuZCgpKSxpfSx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPW4oOSksbz1uKDUpLHM9bigzMCksYT1uKDExKSx1PW4oNyksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuX2Rpc3Bvc2VkPSExLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2ZpdFBvbGljeT10LmZpdFBvbGljeXx8InNldC1taW4tc2l6ZSJ9cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9kaXNwb3NlZD0hMCxhLlNpZ25hbC5jbGVhckRhdGEodGhpcykscy5BdHRhY2hlZFByb3BlcnR5LmNsZWFyRGF0YSh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuX3BhcmVudCE9PXQpe2lmKHRoaXMuX3BhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjaGFuZ2UgcGFyZW50IHdpZGdldC4iKTtpZih0LmxheW91dCE9PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmVudCB3aWRnZXQuIik7dGhpcy5fcGFyZW50PXQsdGhpcy5pbml0KCl9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZml0UG9saWN5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpdFBvbGljeX0sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuX2ZpdFBvbGljeSE9PXQmJih0aGlzLl9maXRQb2xpY3k9dCx0aGlzLl9wYXJlbnQpKXt2YXIgZT10aGlzLl9wYXJlbnQubm9kZS5zdHlsZTtlLm1pbldpZHRoPSIiLGUubWluSGVpZ2h0PSIiLGUubWF4V2lkdGg9IiIsZS5tYXhIZWlnaHQ9IiIsdGhpcy5fcGFyZW50LmZpdCgpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5wcm9jZXNzUGFyZW50TWVzc2FnZT1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlInJlc2l6ZSI6dGhpcy5vblJlc2l6ZSh0KTticmVhaztjYXNlInVwZGF0ZS1yZXF1ZXN0Ijp0aGlzLm9uVXBkYXRlUmVxdWVzdCh0KTticmVhaztjYXNlImZpdC1yZXF1ZXN0Ijp0aGlzLm9uRml0UmVxdWVzdCh0KTticmVhaztjYXNlImJlZm9yZS1zaG93Ijp0aGlzLm9uQmVmb3JlU2hvdyh0KTticmVhaztjYXNlImFmdGVyLXNob3ciOnRoaXMub25BZnRlclNob3codCk7YnJlYWs7Y2FzZSJiZWZvcmUtaGlkZSI6dGhpcy5vbkJlZm9yZUhpZGUodCk7YnJlYWs7Y2FzZSJhZnRlci1oaWRlIjp0aGlzLm9uQWZ0ZXJIaWRlKHQpO2JyZWFrO2Nhc2UiYmVmb3JlLWF0dGFjaCI6dGhpcy5vbkJlZm9yZUF0dGFjaCh0KTticmVhaztjYXNlImFmdGVyLWF0dGFjaCI6dGhpcy5vbkFmdGVyQXR0YWNoKHQpO2JyZWFrO2Nhc2UiYmVmb3JlLWRldGFjaCI6dGhpcy5vbkJlZm9yZURldGFjaCh0KTticmVhaztjYXNlImFmdGVyLWRldGFjaCI6dGhpcy5vbkFmdGVyRGV0YWNoKHQpO2JyZWFrO2Nhc2UiY2hpbGQtcmVtb3ZlZCI6dGhpcy5vbkNoaWxkUmVtb3ZlZCh0KTticmVhaztjYXNlImNoaWxkLXNob3duIjp0aGlzLm9uQ2hpbGRTaG93bih0KTticmVhaztjYXNlImNoaWxkLWhpZGRlbiI6dGhpcy5vbkNoaWxkSGlkZGVuKHQpfX0sdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5wYXJlbnQ9dC5wYXJlbnR9KX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24odCl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LHUuV2lkZ2V0LlJlc2l6ZU1lc3NhZ2UuVW5rbm93blNpemUpfSl9LHQucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXtpLmVhY2godGhpcyxmdW5jdGlvbih0KXtvLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuUmVzaXplTWVzc2FnZS5Vbmtub3duU2l6ZSl9KX0sdC5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJBdHRhY2g9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQmVmb3JlRGV0YWNoPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe28uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkFmdGVyRGV0YWNoPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe28uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkJlZm9yZVNob3c9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5pc0hpZGRlbnx8by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJTaG93PWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe2UuaXNIaWRkZW58fG8uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkJlZm9yZUhpZGU9ZnVuY3Rpb24odCl7aS5lYWNoKHRoaXMsZnVuY3Rpb24oZSl7ZS5pc0hpZGRlbnx8by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHQpfSl9LHQucHJvdG90eXBlLm9uQWZ0ZXJIaWRlPWZ1bmN0aW9uKHQpe2kuZWFjaCh0aGlzLGZ1bmN0aW9uKGUpe2UuaXNIaWRkZW58fG8uTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx0KX0pfSx0LnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZVdpZGdldCh0LmNoaWxkKX0sdC5wcm90b3R5cGUub25GaXRSZXF1ZXN0PWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25DaGlsZFNob3duPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt9LHR9KCk7ZS5MYXlvdXQ9YyxmdW5jdGlvbih0KXt0LmdldEhvcml6b250YWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGguaG9yaXpvbnRhbEFsaWdubWVudFByb3BlcnR5LmdldCh0KX0sdC5zZXRIb3Jpem9udGFsQWxpZ25tZW50PWZ1bmN0aW9uKHQsZSl7aC5ob3Jpem9udGFsQWxpZ25tZW50UHJvcGVydHkuc2V0KHQsZSl9LHQuZ2V0VmVydGljYWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudmVydGljYWxBbGlnbm1lbnRQcm9wZXJ0eS5nZXQodCl9LHQuc2V0VmVydGljYWxBbGlnbm1lbnQ9ZnVuY3Rpb24odCxlKXtoLnZlcnRpY2FsQWxpZ25tZW50UHJvcGVydHkuc2V0KHQsZSl9fShjPWUuTGF5b3V0fHwoZS5MYXlvdXQ9e30pKSxlLkxheW91dD1jO3ZhciBoLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3RvcD1OYU4sdGhpcy5fbGVmdD1OYU4sdGhpcy5fd2lkdGg9TmFOLHRoaXMuX2hlaWdodD1OYU4sdGhpcy5fbWluV2lkdGg9MCx0aGlzLl9taW5IZWlnaHQ9MCx0aGlzLl9tYXhXaWR0aD0xLzAsdGhpcy5fbWF4SGVpZ2h0PTEvMCx0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLndpZGdldD10LHRoaXMud2lkZ2V0Lm5vZGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIn1yZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9kaXNwb3NlZCl7dGhpcy5fZGlzcG9zZWQ9ITA7dmFyIHQ9dGhpcy53aWRnZXQubm9kZS5zdHlsZTt0LnBvc2l0aW9uPSIiLHQudG9wPSIiLHQubGVmdD0iIix0LndpZHRoPSIiLHQuaGVpZ2h0PSIifX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJtaW5XaWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5XaWR0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1pbkhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5IZWlnaHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJtYXhXaWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhXaWR0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1heEhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhIZWlnaHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0Rpc3Bvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNIaWRkZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWRnZXQuaXNIaWRkZW59LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc1Zpc2libGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWRnZXQuaXNWaXNpYmxlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBdHRhY2hlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndpZGdldC5pc0F0dGFjaGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZpdD1mdW5jdGlvbigpe3ZhciB0PXIuRWxlbWVudEV4dC5zaXplTGltaXRzKHRoaXMud2lkZ2V0Lm5vZGUpO3RoaXMuX21pbldpZHRoPXQubWluV2lkdGgsdGhpcy5fbWluSGVpZ2h0PXQubWluSGVpZ2h0LHRoaXMuX21heFdpZHRoPXQubWF4V2lkdGgsdGhpcy5fbWF4SGVpZ2h0PXQubWF4SGVpZ2h0fSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9TWF0aC5tYXgodGhpcy5fbWluV2lkdGgsTWF0aC5taW4obix0aGlzLl9tYXhXaWR0aCkpLHM9TWF0aC5tYXgodGhpcy5fbWluSGVpZ2h0LE1hdGgubWluKGksdGhpcy5fbWF4SGVpZ2h0KSk7aWYocjxuKXN3aXRjaChjLmdldEhvcml6b250YWxBbGlnbm1lbnQodGhpcy53aWRnZXQpKXtjYXNlImxlZnQiOmJyZWFrO2Nhc2UiY2VudGVyIjp0Kz0obi1yKS8yO2JyZWFrO2Nhc2UicmlnaHQiOnQrPW4tcjticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn1pZihzPGkpc3dpdGNoKGMuZ2V0VmVydGljYWxBbGlnbm1lbnQodGhpcy53aWRnZXQpKXtjYXNlInRvcCI6YnJlYWs7Y2FzZSJjZW50ZXIiOmUrPShpLXMpLzI7YnJlYWs7Y2FzZSJib3R0b20iOmUrPWktczticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn12YXIgYT0hMSxoPXRoaXMud2lkZ2V0Lm5vZGUuc3R5bGU7aWYodGhpcy5fdG9wIT09ZSYmKHRoaXMuX3RvcD1lLGgudG9wPWUrInB4IiksdGhpcy5fbGVmdCE9PXQmJih0aGlzLl9sZWZ0PXQsaC5sZWZ0PXQrInB4IiksdGhpcy5fd2lkdGghPT1yJiYoYT0hMCx0aGlzLl93aWR0aD1yLGgud2lkdGg9cisicHgiKSx0aGlzLl9oZWlnaHQhPT1zJiYoYT0hMCx0aGlzLl9oZWlnaHQ9cyxoLmhlaWdodD1zKyJweCIpLGEpe3ZhciBsPW5ldyB1LldpZGdldC5SZXNpemVNZXNzYWdlKHIscyk7by5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLndpZGdldCxsKX19LHR9KCk7ZS5MYXlvdXRJdGVtPWwsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt0LnBhcmVudCYmdC5wYXJlbnQubGF5b3V0JiZ0LnBhcmVudC51cGRhdGUoKX10Lmhvcml6b250YWxBbGlnbm1lbnRQcm9wZXJ0eT1uZXcgcy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJob3Jpem9udGFsQWxpZ25tZW50IixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4iY2VudGVyIn0sY2hhbmdlZDplfSksdC52ZXJ0aWNhbEFsaWdubWVudFByb3BlcnR5PW5ldyBzLkF0dGFjaGVkUHJvcGVydHkoe25hbWU6InZlcnRpY2FsQWxpZ25tZW50IixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4idG9wIn0sY2hhbmdlZDplfSl9KGh8fChoPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDgpLGE9bigxNiksdT1uKDU3KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRGVzY3JpcHRpb25TdHlsZU1vZGVsIixfbW9kZWxfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIixfbW9kZWxfbW9kdWxlX3ZlcnNpb246dS5KVVBZVEVSX0NPTlRST0xTX1ZFUlNJT059KX0sZS5zdHlsZVByb3BlcnRpZXM9e2Rlc2NyaXB0aW9uX3dpZHRoOntzZWxlY3RvcjoiLndpZGdldC1sYWJlbCIsYXR0cmlidXRlOiJ3aWR0aCIsZGVmYXVsdDpudWxsfX0sZX0ocy5TdHlsZU1vZGVsKTtlLkRlc2NyaXB0aW9uU3R5bGVNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRGVzY3JpcHRpb25Nb2RlbCIsX3ZpZXdfbmFtZToiRGVzY3JpcHRpb25WaWV3Iixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF9tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLF92aWV3X21vZHVsZV92ZXJzaW9uOnUuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjp1LkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTixkZXNjcmlwdGlvbjoiIixkZXNjcmlwdGlvbl90b29sdGlwOm51bGx9KX0sZX0ocy5ET01XaWRnZXRNb2RlbCk7ZS5EZXNjcmlwdGlvbk1vZGVsPWg7dmFyIGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsKSx0aGlzLmxhYmVsLmNsYXNzTmFtZT0id2lkZ2V0LWxhYmVsIix0aGlzLmxhYmVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmRlc2NyaXB0aW9uIix0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpkZXNjcmlwdGlvbl90b29sdGlwIix0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKSx0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKCl9LGUucHJvdG90eXBlLnR5cGVzZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEudHlwZXNldCh0LGUpfSl9LGUucHJvdG90eXBlLnVwZGF0ZURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbC5nZXQoImRlc2NyaXB0aW9uIiksZT10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb25fdG9vbHRpcCIpO251bGw9PT1lJiYoZT10KSwwPT09dC5sZW5ndGg/dGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PSJub25lIjoodGhpcy5sYWJlbC5pbm5lckhUTUw9dCx0aGlzLnR5cGVzZXQodGhpcy5sYWJlbCksdGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PSIiKSx0aGlzLmxhYmVsLnRpdGxlPWV9LGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5EZXNjcmlwdGlvblZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGV9KGgpO2UuTGFiZWxlZERPTVdpZGdldE1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShsKTtlLkxhYmVsZWRET01XaWRnZXRWaWV3PWZ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0Mykscj1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlfTt0LmV4cG9ydHM9bDt2YXIgbz1uKDMyKTtvLmluaGVyaXRzPW4oMCk7dmFyIHM9big4NSksYT1uKDYyKTtvLmluaGVyaXRzKGwscyk7Zm9yKHZhciB1PXIoYS5wcm90b3R5cGUpLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIGg9dVtjXTtsLnByb3RvdHlwZVtoXXx8KGwucHJvdG90eXBlW2hdPWEucHJvdG90eXBlW2hdKX1mdW5jdGlvbiBsKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0KTtzLmNhbGwodGhpcyx0KSxhLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixkKX1mdW5jdGlvbiBkKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxpLm5leHRUaWNrKGYsdGhpcyl9ZnVuY3Rpb24gZih0KXt0LmVuZCgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQpfSxzZXQ6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXQsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksbC5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksdGhpcy5lbmQoKSxpLm5leHRUaWNrKGUsdCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4MSksYT1uKDI2KSx1PW4oMjMxKSxjPW4oMjk4KTtlLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1lLmluZGV4T2YodCl9KX0sZS5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxlKX0sZS5hc3NpZ249T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgaSBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpJiYodFtpXT1uW2ldKX1yZXR1cm4gdH0sZS51dWlkPWZ1bmN0aW9uKCl7cmV0dXJuIGEuVVVJRC51dWlkNCgpfTt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4saSl7dmFyIHI9dC5jYWxsKHRoaXMsbil8fHRoaXM7cmV0dXJuIGNvbnNvbGUud2FybigiV3JhcHBlZEVycm9yIGhhcyBiZWVuIGRlcHJlY2F0ZWQhIiksci5lcnJvcl9zdGFjaz1pIGluc3RhbmNlb2YgZT9pLmVycm9yX3N0YWNrOltpXSxyLmVycm9yX3N0YWNrLnB1c2gocikscn1yZXR1cm4gcihlLHQpLGV9KEVycm9yKTtlLldyYXBwZWRFcnJvcj1oLGUucmVzb2x2ZVByb21pc2VzRGljdD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qua2V5cyh0KSxuPVtdO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5wdXNoKHRbZV0pfSksUHJvbWlzZS5hbGwobikudGhlbihmdW5jdGlvbihuKXt0PXt9O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRbZVtpXV09bltpXTtyZXR1cm4gdH0pfSxlLnJlamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aHJvdyBlJiZjb25zb2xlLmVycm9yKG5ldyBFcnJvcih0KSksbn19LGUucHV0X2J1ZmZlcnM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXtmb3IodmFyIHI9ZVtpXSxvPXQscz0wO3M8ci5sZW5ndGgtMTtzKyspbz1vW3Jbc11dO29bcltyLmxlbmd0aC0xXV09bltpXX19LGUucmVtb3ZlX2J1ZmZlcnM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1bXTtyZXR1cm57c3RhdGU6ZnVuY3Rpb24gdChpLHIpe2lmKGkudG9KU09OJiYoaT1pLnRvSlNPTigpKSxBcnJheS5pc0FycmF5KGkpKWZvcih2YXIgcz0hMSxhPTA7YTxpLmxlbmd0aDthKyspKGg9aVthXSkmJihoIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyhoKT8oc3x8KGk9aS5zbGljZSgpLHM9ITApLGUucHVzaChBcnJheUJ1ZmZlci5pc1ZpZXcoaCk/aC5idWZmZXI6aCksbi5wdXNoKHIuY29uY2F0KFthXSkpLGlbYV09bnVsbCk6KGw9dChoLHIuY29uY2F0KFthXSkpKSE9PWgmJihzfHwoaT1pLnNsaWNlKCkscz0hMCksaVthXT1sKSk7ZWxzZSBpZihjKGkpKWZvcih2YXIgdSBpbiBpKXt2YXIgaCxsO3M9ITEsaS5oYXNPd25Qcm9wZXJ0eSh1KSYmKGg9aVt1XSkmJihoIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyhoKT8oc3x8KGk9byh7fSxpKSxzPSEwKSxlLnB1c2goQXJyYXlCdWZmZXIuaXNWaWV3KGgpP2guYnVmZmVyOmgpLG4ucHVzaChyLmNvbmNhdChbdV0pKSxkZWxldGUgaVt1XSk6KGw9dChoLHIuY29uY2F0KFt1XSkpKSE9PWgmJihzfHwoaT1vKHt9LGkpLHM9ITApLGlbdV09bCkpfXJldHVybiBpfSh0LFtdKSxidWZmZXJzOmUsYnVmZmVyX3BhdGhzOm59fTt2YXIgbD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMEEiLCIwQiIsIjBDIiwiMEQiLCIwRSIsIjBGIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxQSIsIjFCIiwiMUMiLCIxRCIsIjFFIiwiMUYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJBIiwiMkIiLCIyQyIsIjJEIiwiMkUiLCIyRiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM0EiLCIzQiIsIjNDIiwiM0QiLCIzRSIsIjNGIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0QSIsIjRCIiwiNEMiLCI0RCIsIjRFIiwiNEYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVBIiwiNUIiLCI1QyIsIjVEIiwiNUUiLCI1RiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNkEiLCI2QiIsIjZDIiwiNkQiLCI2RSIsIjZGIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3QSIsIjdCIiwiN0MiLCI3RCIsIjdFIiwiN0YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhBIiwiOEIiLCI4QyIsIjhEIiwiOEUiLCI4RiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOUEiLCI5QiIsIjlDIiwiOUQiLCI5RSIsIjlGIiwiQTAiLCJBMSIsIkEyIiwiQTMiLCJBNCIsIkE1IiwiQTYiLCJBNyIsIkE4IiwiQTkiLCJBQSIsIkFCIiwiQUMiLCJBRCIsIkFFIiwiQUYiLCJCMCIsIkIxIiwiQjIiLCJCMyIsIkI0IiwiQjUiLCJCNiIsIkI3IiwiQjgiLCJCOSIsIkJBIiwiQkIiLCJCQyIsIkJEIiwiQkUiLCJCRiIsIkMwIiwiQzEiLCJDMiIsIkMzIiwiQzQiLCJDNSIsIkM2IiwiQzciLCJDOCIsIkM5IiwiQ0EiLCJDQiIsIkNDIiwiQ0QiLCJDRSIsIkNGIiwiRDAiLCJEMSIsIkQyIiwiRDMiLCJENCIsIkQ1IiwiRDYiLCJENyIsIkQ4IiwiRDkiLCJEQSIsIkRCIiwiREMiLCJERCIsIkRFIiwiREYiLCJFMCIsIkUxIiwiRTIiLCJFMyIsIkU0IiwiRTUiLCJFNiIsIkU3IiwiRTgiLCJFOSIsIkVBIiwiRUIiLCJFQyIsIkVEIiwiRUUiLCJFRiIsIkYwIiwiRjEiLCJGMiIsIkYzIiwiRjQiLCJGNSIsIkY2IiwiRjciLCJGOCIsIkY5IiwiRkEiLCJGQiIsIkZDIiwiRkQiLCJGRSIsIkZGIl07ZS5idWZmZXJUb0hleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFVpbnQ4QXJyYXkodCksbj1bXSxpPTA7aTxlLmxlbmd0aDtpKyspbi5wdXNoKGxbZVtpXV0pO3JldHVybiBuLmpvaW4oIiIpfSxlLmhleFRvQnVmZmVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0Lmxlbmd0aC8yKSxuPTA7bjx0Lmxlbmd0aDtuKz0yKWVbbi8yXT1wYXJzZUludCh0LnNsaWNlKG4sbisyKSwxNik7cmV0dXJuIGUuYnVmZmVyfSxlLmJ1ZmZlclRvQmFzZTY0PWZ1bmN0aW9uKHQpe3JldHVybiBzLmZyb21CeXRlQXJyYXkobmV3IFVpbnQ4QXJyYXkodCkpfSxlLmJhc2U2NFRvQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBzLnRvQnl0ZUFycmF5KHQpLmJ1ZmZlcn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDE0MikpLGkobigxNDMpKSxpKG4oMTQ0KSksaShuKDgyKSksaShuKDIyOSkpLGkobigyMzApKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxpKXt2YXIgcj1uKDEpLkJ1ZmZlcixvPWUuY3J5cHRvfHxlLm1zQ3J5cHRvO28mJm8uZ2V0UmFuZG9tVmFsdWVzP3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe2lmKHQ+NjU1MzYpdGhyb3cgbmV3IEVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHM9bmV3IGUuVWludDhBcnJheSh0KTt0PjAmJm8uZ2V0UmFuZG9tVmFsdWVzKHMpO3ZhciBhPXIuZnJvbShzLmJ1ZmZlcik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIGkubmV4dFRpY2soZnVuY3Rpb24oKXtuKG51bGwsYSl9KTtyZXR1cm4gYX06dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSl7dGhpcy5fYmxvY2s9aS5hbGxvYyh0KSx0aGlzLl9maW5hbFNpemU9ZSx0aGlzLl9ibG9ja1NpemU9dCx0aGlzLl9sZW49MH1yLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXsic3RyaW5nIj09dHlwZW9mIHQmJihlPWV8fCJ1dGY4Iix0PWkuZnJvbSh0LGUpKTtmb3IodmFyIG49dGhpcy5fYmxvY2sscj10aGlzLl9ibG9ja1NpemUsbz10Lmxlbmd0aCxzPXRoaXMuX2xlbixhPTA7YTxvOyl7Zm9yKHZhciB1PXMlcixjPU1hdGgubWluKG8tYSxyLXUpLGg9MDtoPGM7aCsrKW5bdStoXT10W2EraF07YSs9Yywocys9Yyklcj09MCYmdGhpcy5fdXBkYXRlKG4pfXJldHVybiB0aGlzLl9sZW4rPW8sdGhpc30sci5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xlbiV0aGlzLl9ibG9ja1NpemU7dGhpcy5fYmxvY2tbZV09MTI4LHRoaXMuX2Jsb2NrLmZpbGwoMCxlKzEpLGU+PXRoaXMuX2ZpbmFsU2l6ZSYmKHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayksdGhpcy5fYmxvY2suZmlsbCgwKSk7dmFyIG49OCp0aGlzLl9sZW47aWYobjw9NDI5NDk2NzI5NSl0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKG4sdGhpcy5fYmxvY2tTaXplLTQpO2Vsc2V7dmFyIGk9KDQyOTQ5NjcyOTUmbik+Pj4wLHI9KG4taSkvNDI5NDk2NzI5Njt0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHIsdGhpcy5fYmxvY2tTaXplLTgpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyQkUoaSx0aGlzLl9ibG9ja1NpemUtNCl9dGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKTt2YXIgbz10aGlzLl9oYXNoKCk7cmV0dXJuIHQ/by50b1N0cmluZyh0KTpvfSxyLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MiKX0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI0NSkscj1uKDI1MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49cih0LGUpO3JldHVybiBpKG4pP246dm9pZCAwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGkscj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcGlkPWkubmV4dFBJRCgpLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5fY3JlYXRlPXQuY3JlYXRlLHRoaXMuX2NvZXJjZT10LmNvZXJjZXx8bnVsbCx0aGlzLl9jb21wYXJlPXQuY29tcGFyZXx8bnVsbCx0aGlzLl9jaGFuZ2VkPXQuY2hhbmdlZHx8bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPWkuZW5zdXJlTWFwKHQpO3JldHVybiB0aGlzLl9waWQgaW4gZT9lW3RoaXMuX3BpZF06ZVt0aGlzLl9waWRdPXRoaXMuX2NyZWF0ZVZhbHVlKHQpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWkuZW5zdXJlTWFwKHQpO249dGhpcy5fcGlkIGluIHI/clt0aGlzLl9waWRdOnJbdGhpcy5fcGlkXT10aGlzLl9jcmVhdGVWYWx1ZSh0KTt2YXIgbz10aGlzLl9jb2VyY2VWYWx1ZSh0LGUpO3RoaXMuX21heWJlTm90aWZ5KHQsbixyW3RoaXMuX3BpZF09byl9LHQucHJvdG90eXBlLmNvZXJjZT1mdW5jdGlvbih0KXt2YXIgZSxuPWkuZW5zdXJlTWFwKHQpO2U9dGhpcy5fcGlkIGluIG4/blt0aGlzLl9waWRdOm5bdGhpcy5fcGlkXT10aGlzLl9jcmVhdGVWYWx1ZSh0KTt2YXIgcj10aGlzLl9jb2VyY2VWYWx1ZSh0LGUpO3RoaXMuX21heWJlTm90aWZ5KHQsZSxuW3RoaXMuX3BpZF09cil9LHQucHJvdG90eXBlLl9jcmVhdGVWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4oMCx0aGlzLl9jcmVhdGUpKHQpfSx0LnByb3RvdHlwZS5fY29lcmNlVmFsdWU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb2VyY2U7cmV0dXJuIG4/bih0LGUpOmV9LHQucHJvdG90eXBlLl9jb21wYXJlVmFsdWU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb21wYXJlO3JldHVybiBuP24odCxlKTp0PT09ZX0sdC5wcm90b3R5cGUuX21heWJlTm90aWZ5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9jaGFuZ2VkO2kmJiF0aGlzLl9jb21wYXJlVmFsdWUoZSxuKSYmaSh0LGUsbil9LHR9KCk7ZS5BdHRhY2hlZFByb3BlcnR5PXIsZnVuY3Rpb24odCl7dC5jbGVhckRhdGE9ZnVuY3Rpb24odCl7aS5vd25lckRhdGEuZGVsZXRlKHQpfX0ocj1lLkF0dGFjaGVkUHJvcGVydHl8fChlLkF0dGFjaGVkUHJvcGVydHk9e30pKSxlLkF0dGFjaGVkUHJvcGVydHk9cixmdW5jdGlvbih0KXt2YXIgZTt0Lm93bmVyRGF0YT1uZXcgV2Vha01hcCx0Lm5leHRQSUQ9KGU9MCxmdW5jdGlvbigpe3JldHVybiJwaWQtIisoIiIrTWF0aC5yYW5kb20oKSkuc2xpY2UoMikrIi0iK2UrK30pLHQuZW5zdXJlTWFwPWZ1bmN0aW9uKGUpe3ZhciBuPXQub3duZXJEYXRhLmdldChlKTtyZXR1cm4gbnx8KG49T2JqZWN0LmNyZWF0ZShudWxsKSx0Lm93bmVyRGF0YS5zZXQoZSxuKSxuKX19KGl8fChpPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigwKSxyPW4oNTgpLG89big2NCkscz1uKDY1KSxhPW4oMjEpO2Z1bmN0aW9uIHUodCl7YS5jYWxsKHRoaXMsImRpZ2VzdCIpLHRoaXMuX2hhc2g9dH1pKHUsYSksdS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9oYXNoLnVwZGF0ZSh0KX0sdS5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2guZGlnZXN0KCl9LHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ibWQ1Ij09PSh0PXQudG9Mb3dlckNhc2UoKSk/bmV3IHI6InJtZDE2MCI9PT10fHwicmlwZW1kMTYwIj09PXQ/bmV3IG86bmV3IHUocyh0KSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1lLmlzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheSh0KToiW29iamVjdCBBcnJheV0iPT09bih0KX0sZS5pc0Jvb2xlYW49ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH0sZS5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fSxlLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxlLmlzTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH0sZS5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9LGUuaXNTeW1ib2w9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fSxlLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fSxlLmlzUmVnRXhwPWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09bih0KX0sZS5pc09iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fSxlLmlzRGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1uKHQpfSxlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PW4odCl8fHQgaW5zdGFuY2VvZiBFcnJvcn0sZS5pc0Z1bmN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxlLmlzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHwic3RyaW5nIj09dHlwZW9mIHR8fCJzeW1ib2wiPT10eXBlb2YgdHx8dm9pZCAwPT09dH0sZS5pc0J1ZmZlcj10LmlzQnVmZmVyfSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGk9TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLHI9bmV3IGUoaSksbz0wO288aTsrK28pcltvXT10W29dXm5bb107cmV0dXJuIHJ9fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTQpO2Z1bmN0aW9uIG8oKXt0aGlzLnBlbmRpbmc9bnVsbCx0aGlzLnBlbmRpbmdUb3RhbD0wLHRoaXMuYmxvY2tTaXplPXRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplLHRoaXMub3V0U2l6ZT10aGlzLmNvbnN0cnVjdG9yLm91dFNpemUsdGhpcy5obWFjU3RyZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGgsdGhpcy5wYWRMZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGgvOCx0aGlzLmVuZGlhbj0iYmlnIix0aGlzLl9kZWx0YTg9dGhpcy5ibG9ja1NpemUvOCx0aGlzLl9kZWx0YTMyPXRoaXMuYmxvY2tTaXplLzMyfWUuQmxvY2tIYXNoPW8sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7aWYodD1pLnRvQXJyYXkodCxlKSx0aGlzLnBlbmRpbmc/dGhpcy5wZW5kaW5nPXRoaXMucGVuZGluZy5jb25jYXQodCk6dGhpcy5wZW5kaW5nPXQsdGhpcy5wZW5kaW5nVG90YWwrPXQubGVuZ3RoLHRoaXMucGVuZGluZy5sZW5ndGg+PXRoaXMuX2RlbHRhOCl7dmFyIG49KHQ9dGhpcy5wZW5kaW5nKS5sZW5ndGgldGhpcy5fZGVsdGE4O3RoaXMucGVuZGluZz10LnNsaWNlKHQubGVuZ3RoLW4sdC5sZW5ndGgpLDA9PT10aGlzLnBlbmRpbmcubGVuZ3RoJiYodGhpcy5wZW5kaW5nPW51bGwpLHQ9aS5qb2luMzIodCwwLHQubGVuZ3RoLW4sdGhpcy5lbmRpYW4pO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cis9dGhpcy5fZGVsdGEzMil0aGlzLl91cGRhdGUodCxyLHIrdGhpcy5fZGVsdGEzMil9cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpLHIobnVsbD09PXRoaXMucGVuZGluZyksdGhpcy5fZGlnZXN0KHQpfSxvLnByb3RvdHlwZS5fcGFkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wZW5kaW5nVG90YWwsZT10aGlzLl9kZWx0YTgsbj1lLSh0K3RoaXMucGFkTGVuZ3RoKSVlLGk9bmV3IEFycmF5KG4rdGhpcy5wYWRMZW5ndGgpO2lbMF09MTI4O2Zvcih2YXIgcj0xO3I8bjtyKyspaVtyXT0wO2lmKHQ8PD0zLCJiaWciPT09dGhpcy5lbmRpYW4pe2Zvcih2YXIgbz04O288dGhpcy5wYWRMZW5ndGg7bysrKWlbcisrXT0wO2lbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT10Pj4+MjQmMjU1LGlbcisrXT10Pj4+MTYmMjU1LGlbcisrXT10Pj4+OCYyNTUsaVtyKytdPTI1NSZ0fWVsc2UgZm9yKGlbcisrXT0yNTUmdCxpW3IrK109dD4+PjgmMjU1LGlbcisrXT10Pj4+MTYmMjU1LGlbcisrXT10Pj4+MjQmMjU1LGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLGlbcisrXT0wLG89ODtvPHRoaXMucGFkTGVuZ3RoO28rKylpW3IrK109MDtyZXR1cm4gaX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lO2kuYmlnbnVtPW4oMyksaS5kZWZpbmU9bigyMTApLmRlZmluZSxpLmJhc2U9bigzNiksaS5jb25zdGFudHM9bigxMTEpLGkuZGVjb2RlcnM9bigyMTYpLGkuZW5jb2RlcnM9bigyMTgpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9ZTtpLlJlcG9ydGVyPW4oMjEzKS5SZXBvcnRlcixpLkRlY29kZXJCdWZmZXI9bigxMTApLkRlY29kZXJCdWZmZXIsaS5FbmNvZGVyQnVmZmVyPW4oMTEwKS5FbmNvZGVyQnVmZmVyLGkuTm9kZT1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDcyKSxyPW4oMjQ2KSxvPW4oMjQ3KSxzPSJbb2JqZWN0IE51bGxdIixhPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHU9aT9pLnRvU3RyaW5nVGFnOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD9hOnM6dSYmdSBpbiBPYmplY3QodCk/cih0KTpvKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDQwKSksaShuKDc2KSksaShuKDMyMikpLGkobigzMjMpKSxpKG4oMzI0KSksaShuKDEzMikpLGkobigzMjUpKSxpKG4oMzI2KSksaShuKDMyNykpLGkobigyMikpLGkobigxMzEpKSxpKG4oMzI4KSksaShuKDU0KSksaShuKDQxKSksaShuKDMyOSkpLGkobigzMzApKSxpKG4oMTMzKSksaShuKDMzMSkpLGkobigxMzQpKSxpKG4oMTM1KSksaShuKDgwKSksaShuKDMzMikpLGkobig3NykpLGkobig3KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zaXplSGludD0wLHRoaXMubWluU2l6ZT0wLHRoaXMubWF4U2l6ZT0xLzAsdGhpcy5zdHJldGNoPTEsdGhpcy5zaXplPTAsdGhpcy5kb25lPSExfX0oKTtlLkJveFNpemVyPWksZnVuY3Rpb24odCl7dC5jYWxjPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIGU7Zm9yKHZhciBpPTAscj0wLG89MCxzPTAsYT0wLHU9MDt1PG47Kyt1KXt2YXIgYz0odj10W3VdKS5taW5TaXplLGg9di5tYXhTaXplLGw9di5zaXplSGludDt2LmRvbmU9ITEsdi5zaXplPU1hdGgubWF4KGMsTWF0aC5taW4obCxoKSksbys9di5zaXplLGkrPWMscis9aCx2LnN0cmV0Y2g+MCYmKHMrPXYuc3RyZXRjaCxhKyspfWlmKGU9PT1vKXJldHVybiAwO2lmKGU8PWkpe2Zvcih1PTA7dTxuOysrdSkodj10W3VdKS5zaXplPXYubWluU2l6ZTtyZXR1cm4gZS1pfWlmKGU+PXIpe2Zvcih1PTA7dTxuOysrdSkodj10W3VdKS5zaXplPXYubWF4U2l6ZTtyZXR1cm4gZS1yfXZhciBkPW47aWYoZTxvKXtmb3IodmFyIGY9by1lO2E+MCYmZj4uMDE7KXt2YXIgcD1mLG09cztmb3IodT0wO3U8bjsrK3UpaWYoISh2PXRbdV0pLmRvbmUmJjAhPT12LnN0cmV0Y2gpe3ZhciBnPXYuc3RyZXRjaCpwL207di5zaXplLWc8PXYubWluU2l6ZT8oZi09di5zaXplLXYubWluU2l6ZSxzLT12LnN0cmV0Y2gsdi5zaXplPXYubWluU2l6ZSx2LmRvbmU9ITAsZC0tLGEtLSk6KGYtPWcsdi5zaXplLT1nKX19Zm9yKDtkPjAmJmY+LjAxOylmb3IoZz1mL2QsdT0wO3U8bjsrK3UpKHY9dFt1XSkuZG9uZXx8KHYuc2l6ZS1nPD12Lm1pblNpemU/KGYtPXYuc2l6ZS12Lm1pblNpemUsdi5zaXplPXYubWluU2l6ZSx2LmRvbmU9ITAsZC0tKTooZi09Zyx2LnNpemUtPWcpKX1lbHNle2ZvcihmPWUtbzthPjAmJmY+LjAxOylmb3IocD1mLG09cyx1PTA7dTxuOysrdSkodj10W3VdKS5kb25lfHwwPT09di5zdHJldGNofHwoZz12LnN0cmV0Y2gqcC9tLHYuc2l6ZStnPj12Lm1heFNpemU/KGYtPXYubWF4U2l6ZS12LnNpemUscy09di5zdHJldGNoLHYuc2l6ZT12Lm1heFNpemUsdi5kb25lPSEwLGQtLSxhLS0pOihmLT1nLHYuc2l6ZSs9ZykpO2Zvcig7ZD4wJiZmPi4wMTspZm9yKGc9Zi9kLHU9MDt1PG47Kyt1KXt2YXIgdjsodj10W3VdKS5kb25lfHwodi5zaXplK2c+PXYubWF4U2l6ZT8oZi09di5tYXhTaXplLXYuc2l6ZSx2LnNpemU9di5tYXhTaXplLHYuZG9uZT0hMCxkLS0pOihmLT1nLHYuc2l6ZSs9ZykpfX1yZXR1cm4gMH0sdC5hZGp1c3Q9ZnVuY3Rpb24odCxlLG4pezAhPT10Lmxlbmd0aCYmMCE9PW4mJihuPjA/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wLHI9MDtyPD1lOysrcil7dmFyIG89dFtyXTtpKz1vLm1heFNpemUtby5zaXplfWZvcih2YXIgcz0wLHI9ZSsxLGE9dC5sZW5ndGg7cjxhOysrcil7dmFyIG89dFtyXTtzKz1vLnNpemUtby5taW5TaXplfWZvcih2YXIgdT1uPU1hdGgubWluKG4saSxzKSxyPWU7cj49MCYmdT4wOy0tcil7dmFyIG89dFtyXSxjPW8ubWF4U2l6ZS1vLnNpemU7Yz49dT8oby5zaXplSGludD1vLnNpemUrdSx1PTApOihvLnNpemVIaW50PW8uc2l6ZStjLHUtPWMpfWZvcih2YXIgaD1uLHI9ZSsxLGE9dC5sZW5ndGg7cjxhJiZoPjA7KytyKXt2YXIgbz10W3JdLGM9by5zaXplLW8ubWluU2l6ZTtjPj1oPyhvLnNpemVIaW50PW8uc2l6ZS1oLGg9MCk6KG8uc2l6ZUhpbnQ9by5zaXplLWMsaC09Yyl9fSh0LGUsbik6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wLHI9ZSsxLG89dC5sZW5ndGg7cjxvOysrcil7dmFyIHM9dFtyXTtpKz1zLm1heFNpemUtcy5zaXplfWZvcih2YXIgYT0wLHI9MDtyPD1lOysrcil7dmFyIHM9dFtyXTthKz1zLnNpemUtcy5taW5TaXplfWZvcih2YXIgdT1uPU1hdGgubWluKG4saSxhKSxyPWUrMSxvPXQubGVuZ3RoO3I8byYmdT4wOysrcil7dmFyIHM9dFtyXSxjPXMubWF4U2l6ZS1zLnNpemU7Yz49dT8ocy5zaXplSGludD1zLnNpemUrdSx1PTApOihzLnNpemVIaW50PXMuc2l6ZStjLHUtPWMpfWZvcih2YXIgaD1uLHI9ZTtyPj0wJiZoPjA7LS1yKXt2YXIgcz10W3JdLGM9cy5zaXplLXMubWluU2l6ZTtjPj1oPyhzLnNpemVIaW50PXMuc2l6ZS1oLGg9MCk6KHMuc2l6ZUhpbnQ9cy5zaXplLWMsaC09Yyl9fSh0LGUsLW4pKX19KGUuQm94RW5naW5lfHwoZS5Cb3hFbmdpbmU9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyKSxzPW4oNSksYT1uKDIyKSx1PW4oNyksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl93aWRnZXRzPVtdLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl93aWRnZXRzLmxlbmd0aD4wOyl0aGlzLl93aWRnZXRzLnBvcCgpLmRpc3Bvc2UoKTt0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gby5pdGVyKHRoaXMuX3dpZGdldHMpfSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRXaWRnZXQodGhpcy5fd2lkZ2V0cy5sZW5ndGgsdCl9LGUucHJvdG90eXBlLmluc2VydFdpZGdldD1mdW5jdGlvbih0LGUpe2UucGFyZW50PXRoaXMucGFyZW50O3ZhciBuPXRoaXMuX3dpZGdldHMuaW5kZXhPZihlKSxpPU1hdGgubWF4KDAsTWF0aC5taW4odCx0aGlzLl93aWRnZXRzLmxlbmd0aCkpO2lmKC0xPT09bilyZXR1cm4gby5BcnJheUV4dC5pbnNlcnQodGhpcy5fd2lkZ2V0cyxpLGUpLHZvaWQodGhpcy5wYXJlbnQmJnRoaXMuYXR0YWNoV2lkZ2V0KGksZSkpO2k9PT10aGlzLl93aWRnZXRzLmxlbmd0aCYmaS0tLG4hPT1pJiYoby5BcnJheUV4dC5tb3ZlKHRoaXMuX3dpZGdldHMsbixpKSx0aGlzLnBhcmVudCYmdGhpcy5tb3ZlV2lkZ2V0KG4saSxlKSl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZVdpZGdldEF0KHRoaXMuX3dpZGdldHMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldEF0PWZ1bmN0aW9uKHQpe3ZhciBlPW8uQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fd2lkZ2V0cyx0KTtlJiZ0aGlzLnBhcmVudCYmdGhpcy5kZXRhY2hXaWRnZXQodCxlKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpLG8uZWFjaCh0aGlzLGZ1bmN0aW9uKHQsbil7ZS5hdHRhY2hXaWRnZXQobix0KX0pfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnBhcmVudC5ub2RlLmNoaWxkcmVuW3RdO3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx1LldpZGdldC5Nc2cuQmVmb3JlQXR0YWNoKSx0aGlzLnBhcmVudC5ub2RlLmluc2VydEJlZm9yZShlLm5vZGUsbiksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLHUuV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2Uobix1LldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKG4ubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShuLHUuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCk7dmFyIGk9dGhpcy5wYXJlbnQubm9kZS5jaGlsZHJlbltlXTt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKG4sdS5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5pbnNlcnRCZWZvcmUobi5ub2RlLGkpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2Uobix1LldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsdS5XaWRnZXQuTXNnLkJlZm9yZURldGFjaCksdGhpcy5wYXJlbnQubm9kZS5yZW1vdmVDaGlsZChlLm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSx1LldpZGdldC5Nc2cuQWZ0ZXJEZXRhY2gpfSxlfShhLkxheW91dCk7ZS5QYW5lbExheW91dD1jfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvO3I9W24oMTUpXSx2b2lkIDA9PT0obz0iZnVuY3Rpb24iPT10eXBlb2YoaT1mdW5jdGlvbih0KXtyZXR1cm4gdC51aT10LnVpfHx7fSx0LnVpLnZlcnNpb249IjEuMTIuMSJ9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUpeyFlLnZlcnNpb258fDA9PT1lLnZlcnNpb24uaW5kZXhPZigidjAuIil8fDA9PT1lLnZlcnNpb24uaW5kZXhPZigidjEuIikmJjAhPT1lLnZlcnNpb24uaW5kZXhPZigidjEuOC4iKT90LmV4cG9ydHM9e25leHRUaWNrOmZ1bmN0aW9uKHQsbixpLHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJjYWxsYmFjayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7dmFyIG8scyxhPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGEpe2Nhc2UgMDpjYXNlIDE6cmV0dXJuIGUubmV4dFRpY2sodCk7Y2FzZSAyOnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsbil9KTtjYXNlIDM6cmV0dXJuIGUubmV4dFRpY2soZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxuLGkpfSk7Y2FzZSA0OnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsbixpLHIpfSk7ZGVmYXVsdDpmb3Iobz1uZXcgQXJyYXkoYS0xKSxzPTA7czxvLmxlbmd0aDspb1tzKytdPWFyZ3VtZW50c1tzXTtyZXR1cm4gZS5uZXh0VGljayhmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxvKX0pfX19OnQuZXhwb3J0cz1lfSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXt2YXIgaT12b2lkIDAhPT10JiZ0fHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fHdpbmRvdyxyPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faWQ9dCx0aGlzLl9jbGVhckZuPWV9ZS5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHIuY2FsbChzZXRUaW1lb3V0LGksYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxlLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHIuY2FsbChzZXRJbnRlcnZhbCxpLGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LGUuY2xlYXJUaW1lb3V0PWUuY2xlYXJJbnRlcnZhbD1mdW5jdGlvbih0KXt0JiZ0LmNsb3NlKCl9LG8ucHJvdG90eXBlLnVucmVmPW8ucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sby5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwoaSx0aGlzLl9pZCl9LGUuZW5yb2xsPWZ1bmN0aW9uKHQsZSl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PWV9LGUudW5lbnJvbGw9ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PS0xfSxlLl91bnJlZkFjdGl2ZT1lLmFjdGl2ZT1mdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCk7dmFyIGU9dC5faWRsZVRpbWVvdXQ7ZT49MCYmKHQuX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuX29uVGltZW91dCYmdC5fb25UaW1lb3V0KCl9LGUpKX0sbigxNTApLGUuc2V0SW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5zZXRJbW1lZGlhdGV8fHZvaWQgMCE9PXQmJnQuc2V0SW1tZWRpYXRlfHx0aGlzJiZ0aGlzLnNldEltbWVkaWF0ZSxlLmNsZWFySW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jbGVhckltbWVkaWF0ZXx8dm9pZCAwIT09dCYmdC5jbGVhckltbWVkaWF0ZXx8dGhpcyYmdGhpcy5jbGVhckltbWVkaWF0ZX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQpe2kuaXNCdWZmZXIodCl8fCh0PWkuZnJvbSh0KSk7Zm9yKHZhciBlPXQubGVuZ3RoLzR8MCxuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQucmVhZFVJbnQzMkJFKDQqcik7cmV0dXJuIG59ZnVuY3Rpb24gbyh0KXtmb3IoOzA8dC5sZW5ndGg7dCsrKXRbMF09MH1mdW5jdGlvbiBzKHQsZSxuLGkscil7Zm9yKHZhciBvLHMsYSx1LGM9blswXSxoPW5bMV0sbD1uWzJdLGQ9blszXSxmPXRbMF1eZVswXSxwPXRbMV1eZVsxXSxtPXRbMl1eZVsyXSxnPXRbM11eZVszXSx2PTQsYj0xO2I8cjtiKyspbz1jW2Y+Pj4yNF1eaFtwPj4+MTYmMjU1XV5sW20+Pj44JjI1NV1eZFsyNTUmZ11eZVt2KytdLHM9Y1twPj4+MjRdXmhbbT4+PjE2JjI1NV1ebFtnPj4+OCYyNTVdXmRbMjU1JmZdXmVbdisrXSxhPWNbbT4+PjI0XV5oW2c+Pj4xNiYyNTVdXmxbZj4+PjgmMjU1XV5kWzI1NSZwXV5lW3YrK10sdT1jW2c+Pj4yNF1eaFtmPj4+MTYmMjU1XV5sW3A+Pj44JjI1NV1eZFsyNTUmbV1eZVt2KytdLGY9byxwPXMsbT1hLGc9dTtyZXR1cm4gbz0oaVtmPj4+MjRdPDwyNHxpW3A+Pj4xNiYyNTVdPDwxNnxpW20+Pj44JjI1NV08PDh8aVsyNTUmZ10pXmVbdisrXSxzPShpW3A+Pj4yNF08PDI0fGlbbT4+PjE2JjI1NV08PDE2fGlbZz4+PjgmMjU1XTw8OHxpWzI1NSZmXSleZVt2KytdLGE9KGlbbT4+PjI0XTw8MjR8aVtnPj4+MTYmMjU1XTw8MTZ8aVtmPj4+OCYyNTVdPDw4fGlbMjU1JnBdKV5lW3YrK10sdT0oaVtnPj4+MjRdPDwyNHxpW2Y+Pj4xNiYyNTVdPDwxNnxpW3A+Pj44JjI1NV08PDh8aVsyNTUmbV0pXmVbdisrXSxbbz4+Pj0wLHM+Pj49MCxhPj4+PTAsdT4+Pj0wXX12YXIgYT1bMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NF0sdT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkoMjU2KSxlPTA7ZTwyNTY7ZSsrKXRbZV09ZTwxMjg/ZTw8MTplPDwxXjI4Mztmb3IodmFyIG49W10saT1bXSxyPVtbXSxbXSxbXSxbXV0sbz1bW10sW10sW10sW11dLHM9MCxhPTAsdT0wO3U8MjU2OysrdSl7dmFyIGM9YV5hPDwxXmE8PDJeYTw8M15hPDw0O2M9Yz4+PjheMjU1JmNeOTksbltzXT1jLGlbY109czt2YXIgaD10W3NdLGw9dFtoXSxkPXRbbF0sZj0yNTcqdFtjXV4xNjg0MzAwOCpjO3JbMF1bc109Zjw8MjR8Zj4+PjgsclsxXVtzXT1mPDwxNnxmPj4+MTYsclsyXVtzXT1mPDw4fGY+Pj4yNCxyWzNdW3NdPWYsZj0xNjg0MzAwOSpkXjY1NTM3KmxeMjU3KmheMTY4NDMwMDgqcyxvWzBdW2NdPWY8PDI0fGY+Pj44LG9bMV1bY109Zjw8MTZ8Zj4+PjE2LG9bMl1bY109Zjw8OHxmPj4+MjQsb1szXVtjXT1mLDA9PT1zP3M9YT0xOihzPWhedFt0W3RbZF5oXV1dLGFePXRbdFthXV0pfXJldHVybntTQk9YOm4sSU5WX1NCT1g6aSxTVUJfTUlYOnIsSU5WX1NVQl9NSVg6b319KCk7ZnVuY3Rpb24gYyh0KXt0aGlzLl9rZXk9cih0KSx0aGlzLl9yZXNldCgpfWMuYmxvY2tTaXplPTE2LGMua2V5U2l6ZT0zMixjLnByb3RvdHlwZS5ibG9ja1NpemU9Yy5ibG9ja1NpemUsYy5wcm90b3R5cGUua2V5U2l6ZT1jLmtleVNpemUsYy5wcm90b3R5cGUuX3Jlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2tleSxlPXQubGVuZ3RoLG49ZSs2LGk9NCoobisxKSxyPVtdLG89MDtvPGU7bysrKXJbb109dFtvXTtmb3Iobz1lO288aTtvKyspe3ZhciBzPXJbby0xXTtvJWU9PTA/KHM9czw8OHxzPj4+MjQscz11LlNCT1hbcz4+PjI0XTw8MjR8dS5TQk9YW3M+Pj4xNiYyNTVdPDwxNnx1LlNCT1hbcz4+PjgmMjU1XTw8OHx1LlNCT1hbMjU1JnNdLHNePWFbby9lfDBdPDwyNCk6ZT42JiZvJWU9PTQmJihzPXUuU0JPWFtzPj4+MjRdPDwyNHx1LlNCT1hbcz4+PjE2JjI1NV08PDE2fHUuU0JPWFtzPj4+OCYyNTVdPDw4fHUuU0JPWFsyNTUmc10pLHJbb109cltvLWVdXnN9Zm9yKHZhciBjPVtdLGg9MDtoPGk7aCsrKXt2YXIgbD1pLWgsZD1yW2wtKGglND8wOjQpXTtjW2hdPWg8NHx8bDw9ND9kOnUuSU5WX1NVQl9NSVhbMF1bdS5TQk9YW2Q+Pj4yNF1dXnUuSU5WX1NVQl9NSVhbMV1bdS5TQk9YW2Q+Pj4xNiYyNTVdXV51LklOVl9TVUJfTUlYWzJdW3UuU0JPWFtkPj4+OCYyNTVdXV51LklOVl9TVUJfTUlYWzNdW3UuU0JPWFsyNTUmZF1dfXRoaXMuX25Sb3VuZHM9bix0aGlzLl9rZXlTY2hlZHVsZT1yLHRoaXMuX2ludktleVNjaGVkdWxlPWN9LGMucHJvdG90eXBlLmVuY3J5cHRCbG9ja1Jhdz1mdW5jdGlvbih0KXtyZXR1cm4gcyh0PXIodCksdGhpcy5fa2V5U2NoZWR1bGUsdS5TVUJfTUlYLHUuU0JPWCx0aGlzLl9uUm91bmRzKX0sYy5wcm90b3R5cGUuZW5jcnlwdEJsb2NrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW5jcnlwdEJsb2NrUmF3KHQpLG49aS5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIG4ud3JpdGVVSW50MzJCRShlWzBdLDApLG4ud3JpdGVVSW50MzJCRShlWzFdLDQpLG4ud3JpdGVVSW50MzJCRShlWzJdLDgpLG4ud3JpdGVVSW50MzJCRShlWzNdLDEyKSxufSxjLnByb3RvdHlwZS5kZWNyeXB0QmxvY2s9ZnVuY3Rpb24odCl7dmFyIGU9KHQ9cih0KSlbMV07dFsxXT10WzNdLHRbM109ZTt2YXIgbj1zKHQsdGhpcy5faW52S2V5U2NoZWR1bGUsdS5JTlZfU1VCX01JWCx1LklOVl9TQk9YLHRoaXMuX25Sb3VuZHMpLG89aS5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIG8ud3JpdGVVSW50MzJCRShuWzBdLDApLG8ud3JpdGVVSW50MzJCRShuWzNdLDQpLG8ud3JpdGVVSW50MzJCRShuWzJdLDgpLG8ud3JpdGVVSW50MzJCRShuWzFdLDEyKSxvfSxjLnByb3RvdHlwZS5zY3J1Yj1mdW5jdGlvbigpe28odGhpcy5fa2V5U2NoZWR1bGUpLG8odGhpcy5faW52S2V5U2NoZWR1bGUpLG8odGhpcy5fa2V5KX0sdC5leHBvcnRzLkFFUz1jfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7aWYoaS5pc0J1ZmZlcih0KXx8KHQ9aS5mcm9tKHQsImJpbmFyeSIpKSxlJiYoaS5pc0J1ZmZlcihlKXx8KGU9aS5mcm9tKGUsImJpbmFyeSIpKSw4IT09ZS5sZW5ndGgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJzYWx0IHNob3VsZCBiZSBCdWZmZXIgd2l0aCA4IGJ5dGUgbGVuZ3RoIik7Zm9yKHZhciBzPW4vOCxhPWkuYWxsb2MocyksdT1pLmFsbG9jKG98fDApLGM9aS5hbGxvYygwKTtzPjB8fG8+MDspe3ZhciBoPW5ldyByO2gudXBkYXRlKGMpLGgudXBkYXRlKHQpLGUmJmgudXBkYXRlKGUpLGM9aC5kaWdlc3QoKTt2YXIgbD0wO2lmKHM+MCl7dmFyIGQ9YS5sZW5ndGgtcztsPU1hdGgubWluKHMsYy5sZW5ndGgpLGMuY29weShhLGQsMCxsKSxzLT1sfWlmKGw8Yy5sZW5ndGgmJm8+MCl7dmFyIGY9dS5sZW5ndGgtbyxwPU1hdGgubWluKG8sYy5sZW5ndGgtbCk7Yy5jb3B5KHUsZixsLGwrcCksby09cH19cmV0dXJuIGMuZmlsbCgwKSx7a2V5OmEsaXY6dX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC53ZWJwYWNrUG9seWZpbGx8fCh0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sdC5wYXRocz1bXSx0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQubH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiaWQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0Lml9fSksdC53ZWJwYWNrUG9seWZpbGw9MSksdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9ZTtpLmJhc2U9bigxOTApLGkuc2hvcnQ9bigxOTEpLGkubW9udD1uKDE5MiksaS5lZHdhcmRzPW4oMTkzKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDIwOSkscj1uKDIyMSksbz1uKDIyMikscz1uKDY3KSxhPW4oOTQpO2Z1bmN0aW9uIHUodCl7dmFyIG47Im9iamVjdCIhPXR5cGVvZiB0fHxlLmlzQnVmZmVyKHQpfHwobj10LnBhc3NwaHJhc2UsdD10LmtleSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgZSh0KSk7dmFyIHUsYyxoPW8odCxuKSxsPWgudGFnLGQ9aC5kYXRhO3N3aXRjaChsKXtjYXNlIkNFUlRJRklDQVRFIjpjPWkuY2VydGlmaWNhdGUuZGVjb2RlKGQsImRlciIpLnRic0NlcnRpZmljYXRlLnN1YmplY3RQdWJsaWNLZXlJbmZvO2Nhc2UiUFVCTElDIEtFWSI6c3dpdGNoKGN8fChjPWkuUHVibGljS2V5LmRlY29kZShkLCJkZXIiKSksdT1jLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbigiLiIpKXtjYXNlIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjpyZXR1cm4gaS5SU0FQdWJsaWNLZXkuZGVjb2RlKGMuc3ViamVjdFB1YmxpY0tleS5kYXRhLCJkZXIiKTtjYXNlIjEuMi44NDAuMTAwNDUuMi4xIjpyZXR1cm4gYy5zdWJqZWN0UHJpdmF0ZUtleT1jLnN1YmplY3RQdWJsaWNLZXkse3R5cGU6ImVjIixkYXRhOmN9O2Nhc2UiMS4yLjg0MC4xMDA0MC40LjEiOnJldHVybiBjLmFsZ29yaXRobS5wYXJhbXMucHViX2tleT1pLkRTQXBhcmFtLmRlY29kZShjLnN1YmplY3RQdWJsaWNLZXkuZGF0YSwiZGVyIikse3R5cGU6ImRzYSIsZGF0YTpjLmFsZ29yaXRobS5wYXJhbXN9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSBpZCAiK3UpfXRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgdHlwZSAiK2wpO2Nhc2UiRU5DUllQVEVEIFBSSVZBVEUgS0VZIjpkPWZ1bmN0aW9uKHQsbil7dmFyIGk9dC5hbGdvcml0aG0uZGVjcnlwdC5rZGUua2RlcGFyYW1zLnNhbHQsbz1wYXJzZUludCh0LmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwxMCksdT1yW3QuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLmFsZ28uam9pbigiLiIpXSxjPXQuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2LGg9dC5zdWJqZWN0UHJpdmF0ZUtleSxsPXBhcnNlSW50KHUuc3BsaXQoIi0iKVsxXSwxMCkvOCxkPWEucGJrZGYyU3luYyhuLGksbyxsKSxmPXMuY3JlYXRlRGVjaXBoZXJpdih1LGQsYykscD1bXTtyZXR1cm4gcC5wdXNoKGYudXBkYXRlKGgpKSxwLnB1c2goZi5maW5hbCgpKSxlLmNvbmNhdChwKX0oZD1pLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGQsImRlciIpLG4pO2Nhc2UiUFJJVkFURSBLRVkiOnN3aXRjaCh1PShjPWkuUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIikpLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbigiLiIpKXtjYXNlIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjpyZXR1cm4gaS5SU0FQcml2YXRlS2V5LmRlY29kZShjLnN1YmplY3RQcml2YXRlS2V5LCJkZXIiKTtjYXNlIjEuMi44NDAuMTAwNDUuMi4xIjpyZXR1cm57Y3VydmU6Yy5hbGdvcml0aG0uY3VydmUscHJpdmF0ZUtleTppLkVDUHJpdmF0ZUtleS5kZWNvZGUoYy5zdWJqZWN0UHJpdmF0ZUtleSwiZGVyIikucHJpdmF0ZUtleX07Y2FzZSIxLjIuODQwLjEwMDQwLjQuMSI6cmV0dXJuIGMuYWxnb3JpdGhtLnBhcmFtcy5wcml2X2tleT1pLkRTQXBhcmFtLmRlY29kZShjLnN1YmplY3RQcml2YXRlS2V5LCJkZXIiKSx7dHlwZToiZHNhIixwYXJhbXM6Yy5hbGdvcml0aG0ucGFyYW1zfTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgaWQgIit1KX10aHJvdyBuZXcgRXJyb3IoInVua25vd24ga2V5IHR5cGUgIitsKTtjYXNlIlJTQSBQVUJMSUMgS0VZIjpyZXR1cm4gaS5SU0FQdWJsaWNLZXkuZGVjb2RlKGQsImRlciIpO2Nhc2UiUlNBIFBSSVZBVEUgS0VZIjpyZXR1cm4gaS5SU0FQcml2YXRlS2V5LmRlY29kZShkLCJkZXIiKTtjYXNlIkRTQSBQUklWQVRFIEtFWSI6cmV0dXJue3R5cGU6ImRzYSIscGFyYW1zOmkuRFNBUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIil9O2Nhc2UiRUMgUFJJVkFURSBLRVkiOnJldHVybntjdXJ2ZTooZD1pLkVDUHJpdmF0ZUtleS5kZWNvZGUoZCwiZGVyIikpLnBhcmFtZXRlcnMudmFsdWUscHJpdmF0ZUtleTpkLnByaXZhdGVLZXl9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSB0eXBlICIrbCl9fXQuZXhwb3J0cz11LHUuc2lnbmF0dXJlPWkuc2lnbmF0dXJlfSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjM1KSxyPW4oMjM2KSxvPW4oMjM3KSxzPW4oMjM4KSxhPW4oMjM5KTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fXUucHJvdG90eXBlLmNsZWFyPWksdS5wcm90b3R5cGUuZGVsZXRlPXIsdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPXMsdS5wcm90b3R5cGUuc2V0PWEsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDExOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYoaSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjkpKE9iamVjdCwiY3JlYXRlIik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gaShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDQxKSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5hZGRDbGFzcygicC1QYW5lbCIpLG4ubGF5b3V0PW8uY3JlYXRlTGF5b3V0KGUpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIndpZGdldHMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXQuYWRkV2lkZ2V0KHQpfSxlLnByb3RvdHlwZS5pbnNlcnRXaWRnZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmxheW91dC5pbnNlcnRXaWRnZXQodCxlKX0sZX0obig3KS5XaWRnZXQpO2UuUGFuZWw9YSxmdW5jdGlvbih0KXt0LmNyZWF0ZUxheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5sYXlvdXR8fG5ldyBzLlBhbmVsTGF5b3V0fX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMudHlwZT0idGV4dCIsdGhpcy5jb250ZW50PXR9fSgpO2UuVmlydHVhbFRleHQ9cjt2YXIgbyxzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt0aGlzLnR5cGU9ImVsZW1lbnQiLHRoaXMudGFnPXQsdGhpcy5hdHRycz1lLHRoaXMuY2hpbGRyZW49bn19KCk7ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9e30sbj1bXSxpPTEsbz1hcmd1bWVudHMubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPWFyZ3VtZW50c1tpXTsic3RyaW5nIj09dHlwZW9mIGE/bi5wdXNoKG5ldyByKGEpKTphIGluc3RhbmNlb2Ygcj9uLnB1c2goYSk6YSBpbnN0YW5jZW9mIHM/bi5wdXNoKGEpOmEgaW5zdGFuY2VvZiBBcnJheT91KG4sYSk6MT09PWkmJmEmJiJvYmplY3QiPT10eXBlb2YgYSYmKGU9YSl9cmV0dXJuIG5ldyBzKHQsZSxuKTtmdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuPTAsaT1lO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dOyJzdHJpbmciPT10eXBlb2Ygbz90LnB1c2gobmV3IHIobykpOm8gaW5zdGFuY2VvZiByP3QucHVzaChvKTpvIGluc3RhbmNlb2YgcyYmdC5wdXNoKG8pfX19ZS5WaXJ0dWFsRWxlbWVudD1zLGUuaD1hLGZ1bmN0aW9uKHQpe3QuYT10LmJpbmQodm9pZCAwLCJhIiksdC5hYmJyPXQuYmluZCh2b2lkIDAsImFiYnIiKSx0LmFkZHJlc3M9dC5iaW5kKHZvaWQgMCwiYWRkcmVzcyIpLHQuYXJlYT10LmJpbmQodm9pZCAwLCJhcmVhIiksdC5hcnRpY2xlPXQuYmluZCh2b2lkIDAsImFydGljbGUiKSx0LmFzaWRlPXQuYmluZCh2b2lkIDAsImFzaWRlIiksdC5hdWRpbz10LmJpbmQodm9pZCAwLCJhdWRpbyIpLHQuYj10LmJpbmQodm9pZCAwLCJiIiksdC5iZGk9dC5iaW5kKHZvaWQgMCwiYmRpIiksdC5iZG89dC5iaW5kKHZvaWQgMCwiYmRvIiksdC5ibG9ja3F1b3RlPXQuYmluZCh2b2lkIDAsImJsb2NrcXVvdGUiKSx0LmJyPXQuYmluZCh2b2lkIDAsImJyIiksdC5idXR0b249dC5iaW5kKHZvaWQgMCwiYnV0dG9uIiksdC5jYW52YXM9dC5iaW5kKHZvaWQgMCwiY2FudmFzIiksdC5jYXB0aW9uPXQuYmluZCh2b2lkIDAsImNhcHRpb24iKSx0LmNpdGU9dC5iaW5kKHZvaWQgMCwiY2l0ZSIpLHQuY29kZT10LmJpbmQodm9pZCAwLCJjb2RlIiksdC5jb2w9dC5iaW5kKHZvaWQgMCwiY29sIiksdC5jb2xncm91cD10LmJpbmQodm9pZCAwLCJjb2xncm91cCIpLHQuZGF0YT10LmJpbmQodm9pZCAwLCJkYXRhIiksdC5kYXRhbGlzdD10LmJpbmQodm9pZCAwLCJkYXRhbGlzdCIpLHQuZGQ9dC5iaW5kKHZvaWQgMCwiZGQiKSx0LmRlbD10LmJpbmQodm9pZCAwLCJkZWwiKSx0LmRmbj10LmJpbmQodm9pZCAwLCJkZm4iKSx0LmRpdj10LmJpbmQodm9pZCAwLCJkaXYiKSx0LmRsPXQuYmluZCh2b2lkIDAsImRsIiksdC5kdD10LmJpbmQodm9pZCAwLCJkdCIpLHQuZW09dC5iaW5kKHZvaWQgMCwiZW0iKSx0LmVtYmVkPXQuYmluZCh2b2lkIDAsImVtYmVkIiksdC5maWVsZHNldD10LmJpbmQodm9pZCAwLCJmaWVsZHNldCIpLHQuZmlnY2FwdGlvbj10LmJpbmQodm9pZCAwLCJmaWdjYXB0aW9uIiksdC5maWd1cmU9dC5iaW5kKHZvaWQgMCwiZmlndXJlIiksdC5mb290ZXI9dC5iaW5kKHZvaWQgMCwiZm9vdGVyIiksdC5mb3JtPXQuYmluZCh2b2lkIDAsImZvcm0iKSx0LmgxPXQuYmluZCh2b2lkIDAsImgxIiksdC5oMj10LmJpbmQodm9pZCAwLCJoMiIpLHQuaDM9dC5iaW5kKHZvaWQgMCwiaDMiKSx0Lmg0PXQuYmluZCh2b2lkIDAsImg0IiksdC5oNT10LmJpbmQodm9pZCAwLCJoNSIpLHQuaDY9dC5iaW5kKHZvaWQgMCwiaDYiKSx0LmhlYWRlcj10LmJpbmQodm9pZCAwLCJoZWFkZXIiKSx0LmhyPXQuYmluZCh2b2lkIDAsImhyIiksdC5pPXQuYmluZCh2b2lkIDAsImkiKSx0LmlmcmFtZT10LmJpbmQodm9pZCAwLCJpZnJhbWUiKSx0LmltZz10LmJpbmQodm9pZCAwLCJpbWciKSx0LmlucHV0PXQuYmluZCh2b2lkIDAsImlucHV0IiksdC5pbnM9dC5iaW5kKHZvaWQgMCwiaW5zIiksdC5rYmQ9dC5iaW5kKHZvaWQgMCwia2JkIiksdC5sYWJlbD10LmJpbmQodm9pZCAwLCJsYWJlbCIpLHQubGVnZW5kPXQuYmluZCh2b2lkIDAsImxlZ2VuZCIpLHQubGk9dC5iaW5kKHZvaWQgMCwibGkiKSx0Lm1haW49dC5iaW5kKHZvaWQgMCwibWFpbiIpLHQubWFwPXQuYmluZCh2b2lkIDAsIm1hcCIpLHQubWFyaz10LmJpbmQodm9pZCAwLCJtYXJrIiksdC5tZXRlcj10LmJpbmQodm9pZCAwLCJtZXRlciIpLHQubmF2PXQuYmluZCh2b2lkIDAsIm5hdiIpLHQubm9zY3JpcHQ9dC5iaW5kKHZvaWQgMCwibm9zY3JpcHQiKSx0Lm9iamVjdD10LmJpbmQodm9pZCAwLCJvYmplY3QiKSx0Lm9sPXQuYmluZCh2b2lkIDAsIm9sIiksdC5vcHRncm91cD10LmJpbmQodm9pZCAwLCJvcHRncm91cCIpLHQub3B0aW9uPXQuYmluZCh2b2lkIDAsIm9wdGlvbiIpLHQub3V0cHV0PXQuYmluZCh2b2lkIDAsIm91dHB1dCIpLHQucD10LmJpbmQodm9pZCAwLCJwIiksdC5wYXJhbT10LmJpbmQodm9pZCAwLCJwYXJhbSIpLHQucHJlPXQuYmluZCh2b2lkIDAsInByZSIpLHQucHJvZ3Jlc3M9dC5iaW5kKHZvaWQgMCwicHJvZ3Jlc3MiKSx0LnE9dC5iaW5kKHZvaWQgMCwicSIpLHQucnA9dC5iaW5kKHZvaWQgMCwicnAiKSx0LnJ0PXQuYmluZCh2b2lkIDAsInJ0IiksdC5ydWJ5PXQuYmluZCh2b2lkIDAsInJ1YnkiKSx0LnM9dC5iaW5kKHZvaWQgMCwicyIpLHQuc2FtcD10LmJpbmQodm9pZCAwLCJzYW1wIiksdC5zZWN0aW9uPXQuYmluZCh2b2lkIDAsInNlY3Rpb24iKSx0LnNlbGVjdD10LmJpbmQodm9pZCAwLCJzZWxlY3QiKSx0LnNtYWxsPXQuYmluZCh2b2lkIDAsInNtYWxsIiksdC5zb3VyY2U9dC5iaW5kKHZvaWQgMCwic291cmNlIiksdC5zcGFuPXQuYmluZCh2b2lkIDAsInNwYW4iKSx0LnN0cm9uZz10LmJpbmQodm9pZCAwLCJzdHJvbmciKSx0LnN1Yj10LmJpbmQodm9pZCAwLCJzdWIiKSx0LnN1bW1hcnk9dC5iaW5kKHZvaWQgMCwic3VtbWFyeSIpLHQuc3VwPXQuYmluZCh2b2lkIDAsInN1cCIpLHQudGFibGU9dC5iaW5kKHZvaWQgMCwidGFibGUiKSx0LnRib2R5PXQuYmluZCh2b2lkIDAsInRib2R5IiksdC50ZD10LmJpbmQodm9pZCAwLCJ0ZCIpLHQudGV4dGFyZWE9dC5iaW5kKHZvaWQgMCwidGV4dGFyZWEiKSx0LnRmb290PXQuYmluZCh2b2lkIDAsInRmb290IiksdC50aD10LmJpbmQodm9pZCAwLCJ0aCIpLHQudGhlYWQ9dC5iaW5kKHZvaWQgMCwidGhlYWQiKSx0LnRpbWU9dC5iaW5kKHZvaWQgMCwidGltZSIpLHQudGl0bGU9dC5iaW5kKHZvaWQgMCwidGl0bGUiKSx0LnRyPXQuYmluZCh2b2lkIDAsInRyIiksdC50cmFjaz10LmJpbmQodm9pZCAwLCJ0cmFjayIpLHQudT10LmJpbmQodm9pZCAwLCJ1IiksdC51bD10LmJpbmQodm9pZCAwLCJ1bCIpLHQudmFyXz10LmJpbmQodm9pZCAwLCJ2YXIiKSx0LnZpZGVvPXQuYmluZCh2b2lkIDAsInZpZGVvIiksdC53YnI9dC5iaW5kKHZvaWQgMCwid2JyIil9KGE9ZS5ofHwoZS5oPXt9KSksZnVuY3Rpb24odCl7dC5yZWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNyZWF0ZURPTU5vZGUodCl9LHQucmVuZGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49by5ob3N0TWFwLmdldChlKXx8W10saT1vLmFzQ29udGVudEFycmF5KHQpO28uaG9zdE1hcC5zZXQoZSxpKSxvLnVwZGF0ZUNvbnRlbnQoZSxuLGkpfX0oZS5WaXJ0dWFsRE9NfHwoZS5WaXJ0dWFsRE9NPXt9KSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtpZigidGV4dCI9PT10LnR5cGUpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQuY29udGVudCk7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0LnRhZyk7IWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIGUpaSBpbiBufHwoIm9uIj09PWkuc3Vic3RyKDAsMik/dFtpXT1lW2ldOnQuc2V0QXR0cmlidXRlKGksZVtpXSkpO3ZvaWQgMCE9PWUuY2xhc3NOYW1lJiZ0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUuY2xhc3NOYW1lKTt2b2lkIDAhPT1lLmh0bWxGb3ImJnQuc2V0QXR0cmlidXRlKCJmb3IiLGUuaHRtbEZvcik7ZS5kYXRhc2V0JiZmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKXQuc2V0QXR0cmlidXRlKCJkYXRhLSIrbixlW25dKX0odCxlLmRhdGFzZXQpO2Uuc3R5bGUmJmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10LnN0eWxlO2ZvcihuIGluIGUpaVtuXT1lW25dfSh0LGUuc3R5bGUpfShpLHQuYXR0cnMpO2Zvcih2YXIgcj0wLG89dC5jaGlsZHJlbi5sZW5ndGg7cjxvOysrcilpLmFwcGVuZENoaWxkKGUodC5jaGlsZHJlbltyXSkpO3JldHVybiBpfXQuaG9zdE1hcD1uZXcgV2Vha01hcCx0LmFzQ29udGVudEFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0P3QgaW5zdGFuY2VvZiBBcnJheT90Olt0XTpbXX0sdC5jcmVhdGVET01Ob2RlPWUsdC51cGRhdGVDb250ZW50PWZ1bmN0aW9uIHQobixvLHMpe2lmKG8hPT1zKXtmb3IodmFyIGE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5maXJzdENoaWxkLGk9T2JqZWN0LmNyZWF0ZShudWxsKSxyPTAsbz1lO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdOyJlbGVtZW50Ij09PXMudHlwZSYmcy5hdHRycy5rZXkmJihpW3MuYXR0cnMua2V5XT17dk5vZGU6cyxlbGVtZW50Om59KSxuPW4ubmV4dFNpYmxpbmd9cmV0dXJuIGl9KG4sbyksdT1vLnNsaWNlKCksYz1uLmZpcnN0Q2hpbGQsaD1zLmxlbmd0aCxsPTA7bDxoOysrbClpZihsPj11Lmxlbmd0aCluLmFwcGVuZENoaWxkKGUoc1tsXSkpO2Vsc2V7dmFyIGQ9dVtsXSxmPXNbbF07aWYoZCE9PWYpaWYoInRleHQiIT09ZC50eXBlfHwidGV4dCIhPT1mLnR5cGUpaWYoInRleHQiIT09ZC50eXBlJiYidGV4dCIhPT1mLnR5cGUpe3ZhciBwPWYuYXR0cnMua2V5O2lmKHAmJnAgaW4gYSl7dmFyIG09YVtwXTttLnZOb2RlIT09ZCYmKGkuQXJyYXlFeHQubW92ZSh1LHUuaW5kZXhPZihtLnZOb2RlLGwrMSksbCksbi5pbnNlcnRCZWZvcmUobS5lbGVtZW50LGMpLGQ9bS52Tm9kZSxjPW0uZWxlbWVudCl9aWYoZCE9PWYpe3ZhciBnPWQuYXR0cnMua2V5O2cmJmchPT1wPyhpLkFycmF5RXh0Lmluc2VydCh1LGwsZiksbi5pbnNlcnRCZWZvcmUoZShmKSxjKSk6ZC50YWc9PT1mLnRhZz8ocihjLGQuYXR0cnMsZi5hdHRycyksdChjLGQuY2hpbGRyZW4sZi5jaGlsZHJlbiksYz1jLm5leHRTaWJsaW5nKTooaS5BcnJheUV4dC5pbnNlcnQodSxsLGYpLG4uaW5zZXJ0QmVmb3JlKGUoZiksYykpfWVsc2UgYz1jLm5leHRTaWJsaW5nfWVsc2UgaS5BcnJheUV4dC5pbnNlcnQodSxsLGYpLG4uaW5zZXJ0QmVmb3JlKGUoZiksYyk7ZWxzZSBjLnRleHRDb250ZW50PWYuY29udGVudCxjPWMubmV4dFNpYmxpbmc7ZWxzZSBjPWMubmV4dFNpYmxpbmd9Zm9yKGw9dS5sZW5ndGgtaDtsPjA7LS1sKW4ucmVtb3ZlQ2hpbGQobi5sYXN0Q2hpbGQpfX07dmFyIG49e2tleTohMCxjbGFzc05hbWU6ITAsaHRtbEZvcjohMCxkYXRhc2V0OiEwLHN0eWxlOiEwfTtmdW5jdGlvbiByKHQsZSxpKXtpZihlIT09aSl7dmFyIHI7Zm9yKHIgaW4gZSlyIGluIG58fHIgaW4gaXx8KCJvbiI9PT1yLnN1YnN0cigwLDIpP3Rbcl09bnVsbDp0LnJlbW92ZUF0dHJpYnV0ZShyKSk7Zm9yKHIgaW4gaSlyIGluIG58fGVbcl09PT1pW3JdfHwoIm9uIj09PXIuc3Vic3RyKDAsMik/dFtyXT1pW3JdOnQuc2V0QXR0cmlidXRlKHIsaVtyXSkpO2UuY2xhc3NOYW1lIT09aS5jbGFzc05hbWUmJih2b2lkIDAhPT1pLmNsYXNzTmFtZT90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGkuY2xhc3NOYW1lKTp0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSksZS5odG1sRm9yIT09aS5odG1sRm9yJiYodm9pZCAwIT09aS5odG1sRm9yP3Quc2V0QXR0cmlidXRlKCJmb3IiLGkuaHRtbEZvcik6dC5yZW1vdmVBdHRyaWJ1dGUoImZvciIpKSxlLmRhdGFzZXQhPT1pLmRhdGFzZXQmJmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkgaW4gZSlpIGluIG58fHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLSIraSk7Zm9yKHZhciByIGluIG4pZVtyXSE9PW5bcl0mJnQuc2V0QXR0cmlidXRlKCJkYXRhLSIrcixuW3JdKX0odCxlLmRhdGFzZXR8fHt9LGkuZGF0YXNldHx8e30pLGUuc3R5bGUhPT1pLnN0eWxlJiZmdW5jdGlvbih0LGUsbil7dmFyIGkscj10LnN0eWxlO2ZvcihpIGluIGUpaSBpbiBufHwocltpXT0iIik7Zm9yKGkgaW4gbillW2ldIT09bltpXSYmKHJbaV09bltpXSl9KHQsZS5zdHlsZXx8e30saS5zdHlsZXx8e30pfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpLHI9big3OCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpczt0aGlzLl9vblNjcm9sbEZyYW1lPWZ1bmN0aW9uKCl7aWYoZS5fc2Nyb2xsVGFyZ2V0KXt2YXIgdD1lLl9zY3JvbGxUYXJnZXQsbj10LmVsZW1lbnQscj10LmVkZ2Usbz10LmRpc3RhbmNlLHM9aS5TQ1JPTExfRURHRV9TSVpFLW8sYT1NYXRoLnBvdyhzL2kuU0NST0xMX0VER0VfU0laRSwyKSx1PU1hdGgubWF4KDEsTWF0aC5yb3VuZChhKmkuU0NST0xMX0VER0VfU0laRSkpO3N3aXRjaChyKXtjYXNlInRvcCI6bi5zY3JvbGxUb3AtPXU7YnJlYWs7Y2FzZSJsZWZ0IjpuLnNjcm9sbExlZnQtPXU7YnJlYWs7Y2FzZSJyaWdodCI6bi5zY3JvbGxMZWZ0Kz11O2JyZWFrO2Nhc2UiYm90dG9tIjpuLnNjcm9sbFRvcCs9dX1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZS5fb25TY3JvbGxGcmFtZSl9fSx0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLl9kcm9wQWN0aW9uPSJub25lIix0aGlzLl9vdmVycmlkZT1udWxsLHRoaXMuX2N1cnJlbnRUYXJnZXQ9bnVsbCx0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX3Byb21pc2U9bnVsbCx0aGlzLl9zY3JvbGxUYXJnZXQ9bnVsbCx0aGlzLl9yZXNvbHZlPW51bGwsdGhpcy5taW1lRGF0YT10Lm1pbWVEYXRhLHRoaXMuZHJhZ0ltYWdlPXQuZHJhZ0ltYWdlfHxudWxsLHRoaXMucHJvcG9zZWRBY3Rpb249dC5wcm9wb3NlZEFjdGlvbnx8ImNvcHkiLHRoaXMuc3VwcG9ydGVkQWN0aW9ucz10LnN1cHBvcnRlZEFjdGlvbnN8fCJhbGwiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsfXJldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXtpZih0aGlzLl9kaXNwb3NlZD0hMCx0aGlzLl9jdXJyZW50VGFyZ2V0KXt2YXIgdD1pLmNyZWF0ZU1vdXNlRXZlbnQoIm1vdXNldXAiLC0xLC0xKTtpLmRpc3BhdGNoRHJhZ0xlYXZlKHRoaXMsdGhpcy5fY3VycmVudFRhcmdldCxudWxsLHQpfXRoaXMuX2ZpbmFsaXplKCJub25lIil9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKHRoaXMuX2Rpc3Bvc2VkKXJldHVybiBQcm9taXNlLnJlc29sdmUoIm5vbmUiKTtpZih0aGlzLl9wcm9taXNlKXJldHVybiB0aGlzLl9wcm9taXNlO3RoaXMuX2FkZExpc3RlbmVycygpLHRoaXMuX2F0dGFjaERyYWdJbWFnZSh0LGUpLHRoaXMuX3Byb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24odCxlKXtuLl9yZXNvbHZlPXR9KTt2YXIgcj1pLmNyZWF0ZU1vdXNlRXZlbnQoIm1vdXNlbW92ZSIsdCxlKTtyZXR1cm4gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChyKSx0aGlzLl9wcm9taXNlfSx0LnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlIm1vdXNlbW92ZSI6dGhpcy5fZXZ0TW91c2VNb3ZlKHQpO2JyZWFrO2Nhc2UibW91c2V1cCI6dGhpcy5fZXZ0TW91c2VVcCh0KTticmVhaztjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7ZGVmYXVsdDp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19LHQucHJvdG90eXBlLl9ldnRNb3VzZU1vdmU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fdXBkYXRlQ3VycmVudFRhcmdldCh0KSx0aGlzLl91cGRhdGVEcmFnU2Nyb2xsKHQpLHRoaXMuX21vdmVEcmFnSW1hZ2UodC5jbGllbnRYLHQuY2xpZW50WSl9LHQucHJvdG90eXBlLl9ldnRNb3VzZVVwPWZ1bmN0aW9uKHQpe2lmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDA9PT10LmJ1dHRvbilpZih0aGlzLl91cGRhdGVDdXJyZW50VGFyZ2V0KHQpLHRoaXMuX2N1cnJlbnRUYXJnZXQpe2lmKCJub25lIj09PXRoaXMuX2Ryb3BBY3Rpb24pcmV0dXJuIGkuZGlzcGF0Y2hEcmFnTGVhdmUodGhpcyx0aGlzLl9jdXJyZW50VGFyZ2V0LG51bGwsdCksdm9pZCB0aGlzLl9maW5hbGl6ZSgibm9uZSIpO3ZhciBlPWkuZGlzcGF0Y2hEcm9wKHRoaXMsdGhpcy5fY3VycmVudFRhcmdldCx0KTt0aGlzLl9maW5hbGl6ZShlKX1lbHNlIHRoaXMuX2ZpbmFsaXplKCJub25lIil9LHQucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiZ0aGlzLmRpc3Bvc2UoKX0sdC5wcm90b3R5cGUuX2FkZExpc3RlbmVycz1mdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKX0sdC5wcm90b3R5cGUuX3JlbW92ZUxpc3RlbmVycz1mdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKX0sdC5wcm90b3R5cGUuX3VwZGF0ZURyYWdTY3JvbGw9ZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kU2Nyb2xsVGFyZ2V0KHQpOyh0aGlzLl9zY3JvbGxUYXJnZXR8fGUpJiYodGhpcy5fc2Nyb2xsVGFyZ2V0fHxzZXRUaW1lb3V0KHRoaXMuX29uU2Nyb2xsRnJhbWUsNTAwKSx0aGlzLl9zY3JvbGxUYXJnZXQ9ZSl9LHQucHJvdG90eXBlLl91cGRhdGVDdXJyZW50VGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2N1cnJlbnRUYXJnZXQsbj10aGlzLl9jdXJyZW50VGFyZ2V0LHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHQuY2xpZW50WCx0LmNsaWVudFkpO3RoaXMuX2N1cnJlbnRFbGVtZW50PW8sbyE9PXImJm8hPT1uJiZpLmRpc3BhdGNoRHJhZ0V4aXQodGhpcyxuLG8sdCksbyE9PXImJm8hPT1uJiYobj1pLmRpc3BhdGNoRHJhZ0VudGVyKHRoaXMsbyxuLHQpKSxuIT09ZSYmKHRoaXMuX2N1cnJlbnRUYXJnZXQ9bixpLmRpc3BhdGNoRHJhZ0xlYXZlKHRoaXMsZSxuLHQpKTt2YXIgcz1pLmRpc3BhdGNoRHJhZ092ZXIodGhpcyxuLHQpO3RoaXMuX3NldERyb3BBY3Rpb24ocyl9LHQucHJvdG90eXBlLl9hdHRhY2hEcmFnSW1hZ2U9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmRyYWdJbWFnZSl7dGhpcy5kcmFnSW1hZ2UuY2xhc3NMaXN0LmFkZCgicC1tb2QtZHJhZy1pbWFnZSIpO3ZhciBuPXRoaXMuZHJhZ0ltYWdlLnN0eWxlO24ucG9pbnRlckV2ZW50cz0ibm9uZSIsbi5wb3NpdGlvbj0iZml4ZWQiLG4udG9wPWUrInB4IixuLmxlZnQ9dCsicHgiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnSW1hZ2UpfX0sdC5wcm90b3R5cGUuX21vdmVEcmFnSW1hZ2U9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmRyYWdJbWFnZSl7dmFyIG49dGhpcy5kcmFnSW1hZ2Uuc3R5bGU7bi50b3A9ZSsicHgiLG4ubGVmdD10KyJweCJ9fSx0LnByb3RvdHlwZS5fZGV0YWNoRHJhZ0ltYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5kcmFnSW1hZ2Upe3ZhciB0PXRoaXMuZHJhZ0ltYWdlLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdJbWFnZSl9fSx0LnByb3RvdHlwZS5fc2V0RHJvcEFjdGlvbj1mdW5jdGlvbihlKXtpZihlPWkudmFsaWRhdGVBY3Rpb24oZSx0aGlzLnN1cHBvcnRlZEFjdGlvbnMpLCF0aGlzLl9vdmVycmlkZXx8dGhpcy5fZHJvcEFjdGlvbiE9PWUpc3dpdGNoKGUpe2Nhc2Uibm9uZSI6dGhpcy5fZHJvcEFjdGlvbj1lLHRoaXMuX292ZXJyaWRlPXQub3ZlcnJpZGVDdXJzb3IoIm5vLWRyb3AiKTticmVhaztjYXNlImNvcHkiOnRoaXMuX2Ryb3BBY3Rpb249ZSx0aGlzLl9vdmVycmlkZT10Lm92ZXJyaWRlQ3Vyc29yKCJjb3B5Iik7YnJlYWs7Y2FzZSJsaW5rIjp0aGlzLl9kcm9wQWN0aW9uPWUsdGhpcy5fb3ZlcnJpZGU9dC5vdmVycmlkZUN1cnNvcigiYWxpYXMiKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX2Ryb3BBY3Rpb249ZSx0aGlzLl9vdmVycmlkZT10Lm92ZXJyaWRlQ3Vyc29yKCJtb3ZlIil9fSx0LnByb3RvdHlwZS5fZmluYWxpemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVzb2x2ZTt0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKSx0aGlzLl9kZXRhY2hEcmFnSW1hZ2UoKSx0aGlzLl9vdmVycmlkZSYmKHRoaXMuX292ZXJyaWRlLmRpc3Bvc2UoKSx0aGlzLl9vdmVycmlkZT1udWxsKSx0aGlzLm1pbWVEYXRhLmNsZWFyKCksdGhpcy5fZGlzcG9zZWQ9ITAsdGhpcy5fZHJvcEFjdGlvbj0ibm9uZSIsdGhpcy5fY3VycmVudFRhcmdldD1udWxsLHRoaXMuX2N1cnJlbnRFbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsVGFyZ2V0PW51bGwsdGhpcy5fcHJvbWlzZT1udWxsLHRoaXMuX3Jlc29sdmU9bnVsbCxlJiZlKHQpfSx0fSgpO2UuRHJhZz1vLGZ1bmN0aW9uKHQpe3Qub3ZlcnJpZGVDdXJzb3I9ZnVuY3Rpb24odCl7dmFyIG49KytlO3JldHVybiBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj10LGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicC1tb2Qtb3ZlcnJpZGUtY3Vyc29yIiksbmV3IHIuRGlzcG9zYWJsZURlbGVnYXRlKGZ1bmN0aW9uKCl7bj09PWUmJihkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0iIixkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLW92ZXJyaWRlLWN1cnNvciIpKX0pfTt2YXIgZT0wfShvPWUuRHJhZ3x8KGUuRHJhZz17fSkpLGUuRHJhZz1vLGZ1bmN0aW9uKHQpe3QuU0NST0xMX0VER0VfU0laRT0yMCx0LnZhbGlkYXRlQWN0aW9uPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIGVbdF0mbltpXT90OiJub25lIn0sdC5jcmVhdGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO3JldHVybiBpLmluaXRNb3VzZUV2ZW50KHQsITAsITAsd2luZG93LDAsMCwwLGUsbiwhMSwhMSwhMSwhMSwwLG51bGwpLGl9LHQuZmluZFNjcm9sbFRhcmdldD1mdW5jdGlvbihlKXtmb3IodmFyIG49ZS5jbGllbnRYLGk9ZS5jbGllbnRZLHI9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChuLGkpO3I7cj1yLnBhcmVudEVsZW1lbnQpaWYoci5oYXNBdHRyaWJ1dGUoImRhdGEtcC1kcmFnc2Nyb2xsIikpe3ZhciBvPTAscz0wO3I9PT1kb2N1bWVudC5ib2R5JiYobz13aW5kb3cucGFnZVhPZmZzZXQscz13aW5kb3cucGFnZVlPZmZzZXQpO3ZhciBhPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdT1hLnRvcCtzLGM9YS5sZWZ0K28saD1jK2Eud2lkdGgsbD11K2EuaGVpZ2h0O2lmKCEobjxjfHxuPj1ofHxpPHV8fGk+PWwpKXt2YXIgZD1uLWMrMSxmPWktdSsxLHA9aC1uLG09bC1pLGc9TWF0aC5taW4oZCxmLHAsbSk7aWYoIShnPnQuU0NST0xMX0VER0VfU0laRSkpe3ZhciB2PXZvaWQgMDtzd2l0Y2goZyl7Y2FzZSBtOnY9ImJvdHRvbSI7YnJlYWs7Y2FzZSBmOnY9InRvcCI7YnJlYWs7Y2FzZSBwOnY9InJpZ2h0IjticmVhaztjYXNlIGQ6dj0ibGVmdCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9dmFyIGI9ci5zY3JvbGxXaWR0aC1yLmNsaWVudFdpZHRoLHk9ci5zY3JvbGxIZWlnaHQtci5jbGllbnRIZWlnaHQsXz12b2lkIDA7c3dpdGNoKHYpe2Nhc2UidG9wIjpfPXk+MCYmci5zY3JvbGxUb3A+MDticmVhaztjYXNlImxlZnQiOl89Yj4wJiZyLnNjcm9sbExlZnQ+MDticmVhaztjYXNlInJpZ2h0IjpfPWI+MCYmci5zY3JvbGxMZWZ0PGI7YnJlYWs7Y2FzZSJib3R0b20iOl89eT4wJiZyLnNjcm9sbFRvcDx5O2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifWlmKF8pcmV0dXJue2VsZW1lbnQ6cixlZGdlOnYsZGlzdGFuY2U6Z319fX1yZXR1cm4gbnVsbH0sdC5kaXNwYXRjaERyYWdFbnRlcj1mdW5jdGlvbih0LGUsbixyKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgbz1pKCJwLWRyYWdlbnRlciIsdCxyLG4pO3JldHVybiBlLmRpc3BhdGNoRXZlbnQobyk/ZT09PWRvY3VtZW50LmJvZHk/bjoobz1pKCJwLWRyYWdlbnRlciIsdCxyLG4pLGRvY3VtZW50LmJvZHkuZGlzcGF0Y2hFdmVudChvKSxkb2N1bWVudC5ib2R5KTplfSx0LmRpc3BhdGNoRHJhZ0V4aXQ9ZnVuY3Rpb24odCxlLG4scil7aWYoZSl7dmFyIG89aSgicC1kcmFnZXhpdCIsdCxyLG4pO2UuZGlzcGF0Y2hFdmVudChvKX19LHQuZGlzcGF0Y2hEcmFnTGVhdmU9ZnVuY3Rpb24odCxlLG4scil7aWYoZSl7dmFyIG89aSgicC1kcmFnbGVhdmUiLHQscixuKTtlLmRpc3BhdGNoRXZlbnQobyl9fSx0LmRpc3BhdGNoRHJhZ092ZXI9ZnVuY3Rpb24odCxlLG4pe2lmKCFlKXJldHVybiJub25lIjt2YXIgcj1pKCJwLWRyYWdvdmVyIix0LG4sbnVsbCk7cmV0dXJuIGUuZGlzcGF0Y2hFdmVudChyKT8ibm9uZSI6ci5kcm9wQWN0aW9ufSx0LmRpc3BhdGNoRHJvcD1mdW5jdGlvbih0LGUsbil7aWYoIWUpcmV0dXJuIm5vbmUiO3ZhciByPWkoInAtZHJvcCIsdCxuLG51bGwpO3JldHVybiBlLmRpc3BhdGNoRXZlbnQocik/Im5vbmUiOnIuZHJvcEFjdGlvbn07dmFyIGU9e25vbmU6MCxjb3B5OjEsbGluazoyLG1vdmU6NH0sbj17bm9uZTplLm5vbmUsY29weTplLmNvcHksbGluazplLmxpbmssbW92ZTplLm1vdmUsImNvcHktbGluayI6ZS5jb3B5fGUubGluaywiY29weS1tb3ZlIjplLmNvcHl8ZS5tb3ZlLCJsaW5rLW1vdmUiOmUubGlua3xlLm1vdmUsYWxsOmUuY29weXxlLmxpbmt8ZS5tb3ZlfTtmdW5jdGlvbiBpKHQsZSxuLGkpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7cmV0dXJuIHIuaW5pdE1vdXNlRXZlbnQodCwhMCwhMCx3aW5kb3csMCxuLnNjcmVlblgsbi5zY3JlZW5ZLG4uY2xpZW50WCxuLmNsaWVudFksbi5jdHJsS2V5LG4uYWx0S2V5LG4uc2hpZnRLZXksbi5tZXRhS2V5LG4uYnV0dG9uLGkpLHIuZHJvcEFjdGlvbj0ibm9uZSIsci5taW1lRGF0YT1lLm1pbWVEYXRhLHIucHJvcG9zZWRBY3Rpb249ZS5wcm9wb3NlZEFjdGlvbixyLnN1cHBvcnRlZEFjdGlvbnM9ZS5zdXBwb3J0ZWRBY3Rpb25zLHIuc291cmNlPWUuc291cmNlLHJ9fShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLkpVUFlURVJfQ09OVFJPTFNfVkVSU0lPTj0iMS40LjAifSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMCkscj1uKDg0KSxvPW4oMSkuQnVmZmVyLHM9bmV3IEFycmF5KDE2KTtmdW5jdGlvbiBhKCl7ci5jYWxsKHRoaXMsNjQpLHRoaXMuX2E9MTczMjU4NDE5Myx0aGlzLl9iPTQwMjMyMzM0MTcsdGhpcy5fYz0yNTYyMzgzMTAyLHRoaXMuX2Q9MjcxNzMzODc4fWZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gdDw8ZXx0Pj4+MzItZX1mdW5jdGlvbiBjKHQsZSxuLGkscixvLHMpe3JldHVybiB1KHQrKGUmbnx+ZSZpKStyK298MCxzKStlfDB9ZnVuY3Rpb24gaCh0LGUsbixpLHIsbyxzKXtyZXR1cm4gdSh0KyhlJml8biZ+aSkrcitvfDAscykrZXwwfWZ1bmN0aW9uIGwodCxlLG4saSxyLG8scyl7cmV0dXJuIHUodCsoZV5uXmkpK3Irb3wwLHMpK2V8MH1mdW5jdGlvbiBkKHQsZSxuLGkscixvLHMpe3JldHVybiB1KHQrKG5eKGV8fmkpKStyK298MCxzKStlfDB9aShhLHIpLGEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9cyxlPTA7ZTwxNjsrK2UpdFtlXT10aGlzLl9ibG9jay5yZWFkSW50MzJMRSg0KmUpO3ZhciBuPXRoaXMuX2EsaT10aGlzLl9iLHI9dGhpcy5fYyxvPXRoaXMuX2Q7bj1jKG4saSxyLG8sdFswXSwzNjE0MDkwMzYwLDcpLG89YyhvLG4saSxyLHRbMV0sMzkwNTQwMjcxMCwxMikscj1jKHIsbyxuLGksdFsyXSw2MDYxMDU4MTksMTcpLGk9YyhpLHIsbyxuLHRbM10sMzI1MDQ0MTk2NiwyMiksbj1jKG4saSxyLG8sdFs0XSw0MTE4NTQ4Mzk5LDcpLG89YyhvLG4saSxyLHRbNV0sMTIwMDA4MDQyNiwxMikscj1jKHIsbyxuLGksdFs2XSwyODIxNzM1OTU1LDE3KSxpPWMoaSxyLG8sbix0WzddLDQyNDkyNjEzMTMsMjIpLG49YyhuLGkscixvLHRbOF0sMTc3MDAzNTQxNiw3KSxvPWMobyxuLGkscix0WzldLDIzMzY1NTI4NzksMTIpLHI9YyhyLG8sbixpLHRbMTBdLDQyOTQ5MjUyMzMsMTcpLGk9YyhpLHIsbyxuLHRbMTFdLDIzMDQ1NjMxMzQsMjIpLG49YyhuLGkscixvLHRbMTJdLDE4MDQ2MDM2ODIsNyksbz1jKG8sbixpLHIsdFsxM10sNDI1NDYyNjE5NSwxMikscj1jKHIsbyxuLGksdFsxNF0sMjc5Mjk2NTAwNiwxNyksbj1oKG4saT1jKGkscixvLG4sdFsxNV0sMTIzNjUzNTMyOSwyMikscixvLHRbMV0sNDEyOTE3MDc4Niw1KSxvPWgobyxuLGkscix0WzZdLDMyMjU0NjU2NjQsOSkscj1oKHIsbyxuLGksdFsxMV0sNjQzNzE3NzEzLDE0KSxpPWgoaSxyLG8sbix0WzBdLDM5MjEwNjk5OTQsMjApLG49aChuLGkscixvLHRbNV0sMzU5MzQwODYwNSw1KSxvPWgobyxuLGkscix0WzEwXSwzODAxNjA4Myw5KSxyPWgocixvLG4saSx0WzE1XSwzNjM0NDg4OTYxLDE0KSxpPWgoaSxyLG8sbix0WzRdLDM4ODk0Mjk0NDgsMjApLG49aChuLGkscixvLHRbOV0sNTY4NDQ2NDM4LDUpLG89aChvLG4saSxyLHRbMTRdLDMyNzUxNjM2MDYsOSkscj1oKHIsbyxuLGksdFszXSw0MTA3NjAzMzM1LDE0KSxpPWgoaSxyLG8sbix0WzhdLDExNjM1MzE1MDEsMjApLG49aChuLGkscixvLHRbMTNdLDI4NTAyODU4MjksNSksbz1oKG8sbixpLHIsdFsyXSw0MjQzNTYzNTEyLDkpLHI9aChyLG8sbixpLHRbN10sMTczNTMyODQ3MywxNCksbj1sKG4saT1oKGkscixvLG4sdFsxMl0sMjM2ODM1OTU2MiwyMCkscixvLHRbNV0sNDI5NDU4ODczOCw0KSxvPWwobyxuLGkscix0WzhdLDIyNzIzOTI4MzMsMTEpLHI9bChyLG8sbixpLHRbMTFdLDE4MzkwMzA1NjIsMTYpLGk9bChpLHIsbyxuLHRbMTRdLDQyNTk2NTc3NDAsMjMpLG49bChuLGkscixvLHRbMV0sMjc2Mzk3NTIzNiw0KSxvPWwobyxuLGkscix0WzRdLDEyNzI4OTMzNTMsMTEpLHI9bChyLG8sbixpLHRbN10sNDEzOTQ2OTY2NCwxNiksaT1sKGkscixvLG4sdFsxMF0sMzIwMDIzNjY1NiwyMyksbj1sKG4saSxyLG8sdFsxM10sNjgxMjc5MTc0LDQpLG89bChvLG4saSxyLHRbMF0sMzkzNjQzMDA3NCwxMSkscj1sKHIsbyxuLGksdFszXSwzNTcyNDQ1MzE3LDE2KSxpPWwoaSxyLG8sbix0WzZdLDc2MDI5MTg5LDIzKSxuPWwobixpLHIsbyx0WzldLDM2NTQ2MDI4MDksNCksbz1sKG8sbixpLHIsdFsxMl0sMzg3MzE1MTQ2MSwxMSkscj1sKHIsbyxuLGksdFsxNV0sNTMwNzQyNTIwLDE2KSxuPWQobixpPWwoaSxyLG8sbix0WzJdLDMyOTk2Mjg2NDUsMjMpLHIsbyx0WzBdLDQwOTYzMzY0NTIsNiksbz1kKG8sbixpLHIsdFs3XSwxMTI2ODkxNDE1LDEwKSxyPWQocixvLG4saSx0WzE0XSwyODc4NjEyMzkxLDE1KSxpPWQoaSxyLG8sbix0WzVdLDQyMzc1MzMyNDEsMjEpLG49ZChuLGkscixvLHRbMTJdLDE3MDA0ODU1NzEsNiksbz1kKG8sbixpLHIsdFszXSwyMzk5OTgwNjkwLDEwKSxyPWQocixvLG4saSx0WzEwXSw0MjkzOTE1NzczLDE1KSxpPWQoaSxyLG8sbix0WzFdLDIyNDAwNDQ0OTcsMjEpLG49ZChuLGkscixvLHRbOF0sMTg3MzMxMzM1OSw2KSxvPWQobyxuLGkscix0WzE1XSw0MjY0MzU1NTUyLDEwKSxyPWQocixvLG4saSx0WzZdLDI3MzQ3Njg5MTYsMTUpLGk9ZChpLHIsbyxuLHRbMTNdLDEzMDkxNTE2NDksMjEpLG49ZChuLGkscixvLHRbNF0sNDE0OTQ0NDIyNiw2KSxvPWQobyxuLGkscix0WzExXSwzMTc0NzU2OTE3LDEwKSxyPWQocixvLG4saSx0WzJdLDcxODc4NzI1OSwxNSksaT1kKGkscixvLG4sdFs5XSwzOTUxNDgxNzQ1LDIxKSx0aGlzLl9hPXRoaXMuX2ErbnwwLHRoaXMuX2I9dGhpcy5fYitpfDAsdGhpcy5fYz10aGlzLl9jK3J8MCx0aGlzLl9kPXRoaXMuX2Qrb3wwfSxhLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKCl7dGhpcy5fYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK109MTI4LHRoaXMuX2Jsb2NrT2Zmc2V0PjU2JiYodGhpcy5fYmxvY2suZmlsbCgwLHRoaXMuX2Jsb2NrT2Zmc2V0LDY0KSx0aGlzLl91cGRhdGUoKSx0aGlzLl9ibG9ja09mZnNldD0wKSx0aGlzLl9ibG9jay5maWxsKDAsdGhpcy5fYmxvY2tPZmZzZXQsNTYpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyTEUodGhpcy5fbGVuZ3RoWzBdLDU2KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFsxXSw2MCksdGhpcy5fdXBkYXRlKCk7dmFyIHQ9by5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIHQud3JpdGVJbnQzMkxFKHRoaXMuX2EsMCksdC53cml0ZUludDMyTEUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJMRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkxFKHRoaXMuX2QsMTIpLHR9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPXI7dmFyIGk9big2MCkuRXZlbnRFbWl0dGVyO2Z1bmN0aW9uIHIoKXtpLmNhbGwodGhpcyl9bigwKShyLGkpLHIuUmVhZGFibGU9big2MSksci5Xcml0YWJsZT1uKDE1Myksci5EdXBsZXg9bigxNTQpLHIuVHJhbnNmb3JtPW4oMTU1KSxyLlBhc3NUaHJvdWdoPW4oMTU2KSxyLlN0cmVhbT1yLHIucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLHIpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxlJiYhMT09PWUuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGModCl7aWYoaCgpLDA9PT1pLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGgoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixyKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixjKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGgpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixoKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsaCl9cmV0dXJuIG4ub24oImVycm9yIixjKSx0Lm9uKCJlcnJvciIsYyksbi5vbigiZW5kIixoKSxuLm9uKCJjbG9zZSIsaCksdC5vbigiY2xvc2UiLGgpLHQuZW1pdCgicGlwZSIsbiksdH19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHIodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBvKHQpe3JldHVybiB2b2lkIDA9PT10fXQuZXhwb3J0cz1uLG4uRXZlbnRFbWl0dGVyPW4sbi5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsbi5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsbi5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLG4ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgVHlwZUVycm9yKCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sbi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxuLHMsYSx1LGM7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSwiZXJyb3IiPT09dCYmKCF0aGlzLl9ldmVudHMuZXJyb3J8fHIodGhpcy5fZXZlbnRzLmVycm9yKSYmIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKXtpZigoZT1hcmd1bWVudHNbMV0paW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBoPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBoLmNvbnRleHQ9ZSxofWlmKG8obj10aGlzLl9ldmVudHNbdF0pKXJldHVybiExO2lmKGkobikpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbi5hcHBseSh0aGlzLGEpfWVsc2UgaWYocihuKSlmb3IoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkscz0oYz1uLnNsaWNlKCkpLmxlbmd0aCx1PTA7dTxzO3UrKyljW3VdLmFwcGx5KHRoaXMsYSk7cmV0dXJuITB9LG4ucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHM7aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gdGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSx0aGlzLl9ldmVudHMubmV3TGlzdGVuZXImJnRoaXMuZW1pdCgibmV3TGlzdGVuZXIiLHQsaShlLmxpc3RlbmVyKT9lLmxpc3RlbmVyOmUpLHRoaXMuX2V2ZW50c1t0XT9yKHRoaXMuX2V2ZW50c1t0XSk/dGhpcy5fZXZlbnRzW3RdLnB1c2goZSk6dGhpcy5fZXZlbnRzW3RdPVt0aGlzLl9ldmVudHNbdF0sZV06dGhpcy5fZXZlbnRzW3RdPWUscih0aGlzLl9ldmVudHNbdF0pJiYhdGhpcy5fZXZlbnRzW3RdLndhcm5lZCYmKHM9byh0aGlzLl9tYXhMaXN0ZW5lcnMpP24uZGVmYXVsdE1heExpc3RlbmVyczp0aGlzLl9tYXhMaXN0ZW5lcnMpJiZzPjAmJnRoaXMuX2V2ZW50c1t0XS5sZW5ndGg+cyYmKHRoaXMuX2V2ZW50c1t0XS53YXJuZWQ9ITAsY29uc29sZS5lcnJvcigiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4iLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGgpLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpLHRoaXN9LG4ucHJvdG90eXBlLm9uPW4ucHJvdG90eXBlLmFkZExpc3RlbmVyLG4ucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBuPSExO2Z1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUxpc3RlbmVyKHQsciksbnx8KG49ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiByLmxpc3RlbmVyPWUsdGhpcy5vbih0LHIpLHRoaXN9LG4ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxzLGE7aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW3RdKXJldHVybiB0aGlzO2lmKHM9KG49dGhpcy5fZXZlbnRzW3RdKS5sZW5ndGgsbz0tMSxuPT09ZXx8aShuLmxpc3RlbmVyKSYmbi5saXN0ZW5lcj09PWUpZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsZSk7ZWxzZSBpZihyKG4pKXtmb3IoYT1zO2EtLSA+MDspaWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXImJm5bYV0ubGlzdGVuZXI9PT1lKXtvPWE7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzOzE9PT1uLmxlbmd0aD8obi5sZW5ndGg9MCxkZWxldGUgdGhpcy5fZXZlbnRzW3RdKTpuLnNwbGljZShvLDEpLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxlKX1yZXR1cm4gdGhpc30sbi5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLG47aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW3RdJiZkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihlIGluIHRoaXMuX2V2ZW50cykicmVtb3ZlTGlzdGVuZXIiIT09ZSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz17fSx0aGlzfWlmKGkobj10aGlzLl9ldmVudHNbdF0pKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxuKTtlbHNlIGlmKG4pZm9yKDtuLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcih0LG5bbi5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXN9LG4ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbdF0/aSh0aGlzLl9ldmVudHNbdF0pP1t0aGlzLl9ldmVudHNbdF1dOnRoaXMuX2V2ZW50c1t0XS5zbGljZSgpOltdfSxuLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2V2ZW50cyl7dmFyIGU9dGhpcy5fZXZlbnRzW3RdO2lmKGkoZSkpcmV0dXJuIDE7aWYoZSlyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9LG4ubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiB0Lmxpc3RlbmVyQ291bnQoZSl9fSxmdW5jdGlvbih0LGUsbil7KGU9dC5leHBvcnRzPW4oODUpKS5TdHJlYW09ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1uKDYyKSxlLkR1cGxleD1uKDI0KSxlLlRyYW5zZm9ybT1uKDg4KSxlLlBhc3NUaHJvdWdoPW4oMTUyKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxpLHIpe3ZhciBvPW4oNDMpO2Z1bmN0aW9uIHModCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZW50cnk7dC5lbnRyeT1udWxsO2Zvcig7aTspe3ZhciByPWkuY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxyKG4pLGk9aS5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlP2UuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9dDplLmNvcmtlZFJlcXVlc3RzRnJlZT10fShlLHQpfX10LmV4cG9ydHM9Yjt2YXIgYSx1PSFlLmJyb3dzZXImJlsidjAuMTAiLCJ2MC45LiJdLmluZGV4T2YoZS52ZXJzaW9uLnNsaWNlKDAsNSkpPi0xP2k6by5uZXh0VGljaztiLldyaXRhYmxlU3RhdGU9djt2YXIgYz1uKDMyKTtjLmluaGVyaXRzPW4oMCk7dmFyIGg9e2RlcHJlY2F0ZTpuKDE1MSl9LGw9big4NiksZD1uKDEpLkJ1ZmZlcixmPXIuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBwLG09big4Nyk7ZnVuY3Rpb24gZygpe31mdW5jdGlvbiB2KHQsZSl7YT1hfHxuKDI0KSx0PXR8fHt9O3ZhciBpPWUgaW5zdGFuY2VvZiBhO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLGM9dC53cml0YWJsZUhpZ2hXYXRlck1hcmssaD10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6aSYmKGN8fDA9PT1jKT9jOmgsdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbD0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWwsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciBuPXQuX3dyaXRhYmxlU3RhdGUsaT1uLnN5bmMscj1uLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0obiksZSkhZnVuY3Rpb24odCxlLG4saSxyKXstLWUucGVuZGluZ2NiLG4/KG8ubmV4dFRpY2socixpKSxvLm5leHRUaWNrKFMsdCxlKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixpKSk6KHIoaSksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsaSksUyh0LGUpKX0odCxuLGksZSxyKTtlbHNle3ZhciBzPXgobik7c3x8bi5jb3JrZWR8fG4uYnVmZmVyUHJvY2Vzc2luZ3x8IW4uYnVmZmVyZWRSZXF1ZXN0fHx3KHQsbiksaT91KF8sdCxuLHMscik6Xyh0LG4scyxyKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHModGhpcyl9ZnVuY3Rpb24gYih0KXtpZihhPWF8fG4oMjQpLCEocC5jYWxsKGIsdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBhKSlyZXR1cm4gbmV3IGIodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgdih0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZpbmFsJiYodGhpcy5fZmluYWw9dC5maW5hbCkpLGwuY2FsbCh0aGlzKX1mdW5jdGlvbiB5KHQsZSxuLGkscixvLHMpe2Uud3JpdGVsZW49aSxlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLG4/dC5fd3JpdGV2KHIsZS5vbndyaXRlKTp0Ll93cml0ZShyLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gXyh0LGUsbixpKXtufHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0saSgpLFModCxlKX1mdW5jdGlvbiB3KHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmbiYmbi5uZXh0KXt2YXIgaT1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LHI9bmV3IEFycmF5KGkpLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1uO2Zvcih2YXIgYT0wLHU9ITA7bjspclthXT1uLG4uaXNCdWZ8fCh1PSExKSxuPW4ubmV4dCxhKz0xO3IuYWxsQnVmZmVycz11LHkodCxlLCEwLGUubGVuZ3RoLHIsIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBzKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7bjspe3ZhciBjPW4uY2h1bmssaD1uLmVuY29kaW5nLGw9bi5jYWxsYmFjaztpZih5KHQsZSwhMSxlLm9iamVjdE1vZGU/MTpjLmxlbmd0aCxjLGgsbCksbj1uLm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha31udWxsPT09biYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD1uLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiB4KHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIE0odCxlKXt0Ll9maW5hbChmdW5jdGlvbihuKXtlLnBlbmRpbmdjYi0tLG4mJnQuZW1pdCgiZXJyb3IiLG4pLGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSxTKHQsZSl9KX1mdW5jdGlvbiBTKHQsZSl7dmFyIG49eChlKTtyZXR1cm4gbiYmKCFmdW5jdGlvbih0LGUpe2UucHJlZmluaXNoZWR8fGUuZmluYWxDYWxsZWR8fCgiZnVuY3Rpb24iPT10eXBlb2YgdC5fZmluYWw/KGUucGVuZGluZ2NiKyssZS5maW5hbENhbGxlZD0hMCxvLm5leHRUaWNrKE0sdCxlKSk6KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSkpfSh0LGUpLDA9PT1lLnBlbmRpbmdjYiYmKGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSkpLG59Yy5pbmhlcml0cyhiLGwpLHYucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6aC5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0sIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIiwiREVQMDAwMyIpfSl9Y2F0Y2godCl7fX0oKSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaGFzSW5zdGFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT8ocD1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYixTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEhcC5jYWxsKHRoaXMsdCl8fHRoaXM9PT1iJiYodCYmdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIHYpfX0pKTpwPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpc30sYi5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0sYi5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9dGhpcy5fd3JpdGFibGVTdGF0ZSxzPSExLGE9IXIub2JqZWN0TW9kZSYmKGk9dCxkLmlzQnVmZmVyKGkpfHxpIGluc3RhbmNlb2YgZik7cmV0dXJuIGEmJiFkLmlzQnVmZmVyKHQpJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZC5mcm9tKHQpfSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT1udWxsKSxhP2U9ImJ1ZmZlciI6ZXx8KGU9ci5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1nKSxyLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIG49bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixuKSxvLm5leHRUaWNrKGUsbil9KHRoaXMsbik6KGF8fGZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPSEwLHM9ITE7cmV0dXJuIG51bGw9PT1uP3M9bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKToic3RyaW5nIj09dHlwZW9mIG58fHZvaWQgMD09PW58fGUub2JqZWN0TW9kZXx8KHM9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxzJiYodC5lbWl0KCJlcnJvciIscyksby5uZXh0VGljayhpLHMpLHI9ITEpLHJ9KHRoaXMscix0LG4pKSYmKHIucGVuZGluZ2NiKysscz1mdW5jdGlvbih0LGUsbixpLHIsbyl7aWYoIW4pe3ZhciBzPWZ1bmN0aW9uKHQsZSxuKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPWQuZnJvbShlLG4pKTtyZXR1cm4gZX0oZSxpLHIpO2khPT1zJiYobj0hMCxyPSJidWZmZXIiLGk9cyl9dmFyIGE9ZS5vYmplY3RNb2RlPzE6aS5sZW5ndGg7ZS5sZW5ndGgrPWE7dmFyIHU9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3V8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGM9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bms6aSxlbmNvZGluZzpyLGlzQnVmOm4sY2FsbGJhY2s6byxuZXh0Om51bGx9LGM/Yy5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIHkodCxlLCExLGEsaSxyLG8pO3JldHVybiB1fSh0aGlzLHIsYSx0LGUsbikpLHN9LGIucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxiLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8dyh0aGlzLHQpKX0sYi5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxiLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLG4pe24obmV3IEVycm9yKCJfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LGIucHJvdG90eXBlLl93cml0ZXY9bnVsbCxiLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KG49dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxpLmNvcmtlZCYmKGkuY29ya2VkPTEsdGhpcy51bmNvcmsoKSksaS5lbmRpbmd8fGkuZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxuKXtlLmVuZGluZz0hMCxTKHQsZSksbiYmKGUuZmluaXNoZWQ/by5uZXh0VGljayhuKTp0Lm9uY2UoImZpbmlzaCIsbikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxpLG4pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxiLnByb3RvdHlwZS5kZXN0cm95PW0uZGVzdHJveSxiLnByb3RvdHlwZS5fdW5kZXN0cm95PW0udW5kZXN0cm95LGIucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmQoKSxlKHQpfX0pLmNhbGwodGhpcyxuKDIwKSxuKDQ0KS5zZXRJbW1lZGlhdGUsbigxMykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMSkuQnVmZmVyLHI9aS5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2goKHQ9IiIrdCkmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBvKHQpe3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiJ1dGY4Ijtmb3IodmFyIGU7Oylzd2l0Y2godCl7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4idXRmOCI7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiJ1dGYxNmxlIjtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiJsYXRpbjEiO2Nhc2UiYmFzZTY0IjpjYXNlImFzY2lpIjpjYXNlImhleCI6cmV0dXJuIHQ7ZGVmYXVsdDppZihlKXJldHVybjt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLGU9ITB9fSh0KTtpZigic3RyaW5nIiE9dHlwZW9mIGUmJihpLmlzRW5jb2Rpbmc9PT1yfHwhcih0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiBlfHx0fSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjE2bGUiOnRoaXMudGV4dD11LHRoaXMuZW5kPWMsZT00O2JyZWFrO2Nhc2UidXRmOCI6dGhpcy5maWxsTGFzdD1hLGU9NDticmVhaztjYXNlImJhc2U2NCI6dGhpcy50ZXh0PWgsdGhpcy5lbmQ9bCxlPTM7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy53cml0ZT1kLHZvaWQodGhpcy5lbmQ9Zil9dGhpcy5sYXN0TmVlZD0wLHRoaXMubGFzdFRvdGFsPTAsdGhpcy5sYXN0Q2hhcj1pLmFsbG9jVW5zYWZlKGUpfWZ1bmN0aW9uIHModCl7cmV0dXJuIHQ8PTEyNz8wOnQ+PjU9PTY/Mjp0Pj40PT0xND8zOnQ+PjM9PTMwPzQ6dD4+Nj09Mj8tMTotMn1mdW5jdGlvbiBhKHQpe3ZhciBlPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsbj1mdW5jdGlvbih0LGUsbil7aWYoMTI4IT0oMTkyJmVbMF0pKXJldHVybiB0Lmxhc3ROZWVkPTAsIu+/vSI7aWYodC5sYXN0TmVlZD4xJiZlLmxlbmd0aD4xKXtpZigxMjghPSgxOTImZVsxXSkpcmV0dXJuIHQubGFzdE5lZWQ9MSwi77+9IjtpZih0Lmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJjEyOCE9KDE5MiZlWzJdKSlyZXR1cm4gdC5sYXN0TmVlZD0yLCLvv70ifX0odGhpcyx0KTtyZXR1cm4gdm9pZCAwIT09bj9uOnRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoPyh0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpKToodC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHQubGVuZ3RoKSx2b2lkKHRoaXMubGFzdE5lZWQtPXQubGVuZ3RoKSl9ZnVuY3Rpb24gdSh0LGUpe2lmKCh0Lmxlbmd0aC1lKSUyPT0wKXt2YXIgbj10LnRvU3RyaW5nKCJ1dGYxNmxlIixlKTtpZihuKXt2YXIgaT1uLmNoYXJDb2RlQXQobi5sZW5ndGgtMSk7aWYoaT49NTUyOTYmJmk8PTU2MzE5KXJldHVybiB0aGlzLmxhc3ROZWVkPTIsdGhpcy5sYXN0VG90YWw9NCx0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT10W3QubGVuZ3RoLTFdLG4uc2xpY2UoMCwtMSl9cmV0dXJuIG59cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXSx0LnRvU3RyaW5nKCJ1dGYxNmxlIixlLHQubGVuZ3RoLTEpfWZ1bmN0aW9uIGModCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtpZih0aGlzLmxhc3ROZWVkKXt2YXIgbj10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkO3JldHVybiBlK3RoaXMubGFzdENoYXIudG9TdHJpbmcoInV0ZjE2bGUiLDAsbil9cmV0dXJuIGV9ZnVuY3Rpb24gaCh0LGUpe3ZhciBuPSh0Lmxlbmd0aC1lKSUzO3JldHVybiAwPT09bj90LnRvU3RyaW5nKCJiYXNlNjQiLGUpOih0aGlzLmxhc3ROZWVkPTMtbix0aGlzLmxhc3RUb3RhbD0zLDE9PT1uP3RoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSksdC50b1N0cmluZygiYmFzZTY0IixlLHQubGVuZ3RoLW4pKX1mdW5jdGlvbiBsKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJiYXNlNjQiLDAsMy10aGlzLmxhc3ROZWVkKTplfWZ1bmN0aW9uIGQodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIn1lLlN0cmluZ0RlY29kZXI9byxvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIiI7dmFyIGUsbjtpZih0aGlzLmxhc3ROZWVkKXtpZih2b2lkIDA9PT0oZT10aGlzLmZpbGxMYXN0KHQpKSlyZXR1cm4iIjtuPXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2Ugbj0wO3JldHVybiBuPHQubGVuZ3RoP2U/ZSt0aGlzLnRleHQodCxuKTp0aGlzLnRleHQodCxuKTplfHwiIn0sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSsi77+9IjplfSxvLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUubGVuZ3RoLTE7aWYoaTxuKXJldHVybiAwO3ZhciByPXMoZVtpXSk7aWYocj49MClyZXR1cm4gcj4wJiYodC5sYXN0TmVlZD1yLTEpLHI7aWYoLS1pPG58fC0yPT09cilyZXR1cm4gMDtpZigocj1zKGVbaV0pKT49MClyZXR1cm4gcj4wJiYodC5sYXN0TmVlZD1yLTIpLHI7aWYoLS1pPG58fC0yPT09cilyZXR1cm4gMDtpZigocj1zKGVbaV0pKT49MClyZXR1cm4gcj4wJiYoMj09PXI/cj0wOnQubGFzdE5lZWQ9ci0zKSxyO3JldHVybiAwfSh0aGlzLHQsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHQudG9TdHJpbmcoInV0ZjgiLGUpO3RoaXMubGFzdFRvdGFsPW47dmFyIGk9dC5sZW5ndGgtKG4tdGhpcy5sYXN0TmVlZCk7cmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLDAsaSksdC50b1N0cmluZygidXRmOCIsZSxpKX0sby5wcm90b3R5cGUuZmlsbExhc3Q9ZnVuY3Rpb24odCl7aWYodGhpcy5sYXN0TmVlZDw9dC5sZW5ndGgpcmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7dC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHQubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT10Lmxlbmd0aH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0KS5CdWZmZXIscj1uKDApLG89big4NCkscz1uZXcgQXJyYXkoMTYpLGE9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10sdT1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxjPVsxMSwxNCwxNSwxMiw1LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSxoPVs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXSxsPVswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdLGQ9WzEzNTI4Mjk5MjYsMTU0ODYwMzY4NCwxODM2MDcyNjkxLDIwNTM5OTQyMTcsMF07ZnVuY3Rpb24gZigpe28uY2FsbCh0aGlzLDY0KSx0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjB9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfWZ1bmN0aW9uIG0odCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlXm5eaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIGcodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlJm58fmUmaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIHYodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KygoZXx+bileaSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIGIodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlJml8biZ+aSkrbytzfDAsYSkrcnwwfWZ1bmN0aW9uIHkodCxlLG4saSxyLG8scyxhKXtyZXR1cm4gcCh0KyhlXihufH5pKSkrbytzfDAsYSkrcnwwfXIoZixvKSxmLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXMsZT0wO2U8MTY7KytlKXRbZV09dGhpcy5fYmxvY2sucmVhZEludDMyTEUoNCplKTtmb3IodmFyIG49MHx0aGlzLl9hLGk9MHx0aGlzLl9iLHI9MHx0aGlzLl9jLG89MHx0aGlzLl9kLGY9MHx0aGlzLl9lLF89MHx0aGlzLl9hLHc9MHx0aGlzLl9iLHg9MHx0aGlzLl9jLE09MHx0aGlzLl9kLFM9MHx0aGlzLl9lLEU9MDtFPDgwO0UrPTEpe3ZhciBBLEM7RTwxNj8oQT1tKG4saSxyLG8sZix0W2FbRV1dLGxbMF0sY1tFXSksQz15KF8sdyx4LE0sUyx0W3VbRV1dLGRbMF0saFtFXSkpOkU8MzI/KEE9ZyhuLGkscixvLGYsdFthW0VdXSxsWzFdLGNbRV0pLEM9YihfLHcseCxNLFMsdFt1W0VdXSxkWzFdLGhbRV0pKTpFPDQ4PyhBPXYobixpLHIsbyxmLHRbYVtFXV0sbFsyXSxjW0VdKSxDPXYoXyx3LHgsTSxTLHRbdVtFXV0sZFsyXSxoW0VdKSk6RTw2ND8oQT1iKG4saSxyLG8sZix0W2FbRV1dLGxbM10sY1tFXSksQz1nKF8sdyx4LE0sUyx0W3VbRV1dLGRbM10saFtFXSkpOihBPXkobixpLHIsbyxmLHRbYVtFXV0sbFs0XSxjW0VdKSxDPW0oXyx3LHgsTSxTLHRbdVtFXV0sZFs0XSxoW0VdKSksbj1mLGY9byxvPXAociwxMCkscj1pLGk9QSxfPVMsUz1NLE09cCh4LDEwKSx4PXcsdz1DfXZhciBrPXRoaXMuX2IrcitNfDA7dGhpcy5fYj10aGlzLl9jK28rU3wwLHRoaXMuX2M9dGhpcy5fZCtmK198MCx0aGlzLl9kPXRoaXMuX2Urbit3fDAsdGhpcy5fZT10aGlzLl9hK2kreHwwLHRoaXMuX2E9a30sZi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3RoaXMuX2Jsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0KytdPTEyOCx0aGlzLl9ibG9ja09mZnNldD41NiYmKHRoaXMuX2Jsb2NrLmZpbGwoMCx0aGlzLl9ibG9ja09mZnNldCw2NCksdGhpcy5fdXBkYXRlKCksdGhpcy5fYmxvY2tPZmZzZXQ9MCksdGhpcy5fYmxvY2suZmlsbCgwLHRoaXMuX2Jsb2NrT2Zmc2V0LDU2KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFswXSw1NiksdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMV0sNjApLHRoaXMuX3VwZGF0ZSgpO3ZhciB0PWkuYWxsb2M/aS5hbGxvYygyMCk6bmV3IGkoMjApO3JldHVybiB0LndyaXRlSW50MzJMRSh0aGlzLl9hLDApLHQud3JpdGVJbnQzMkxFKHRoaXMuX2IsNCksdC53cml0ZUludDMyTEUodGhpcy5fYyw4KSx0LndyaXRlSW50MzJMRSh0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJMRSh0aGlzLl9lLDE2KSx0fSx0LmV4cG9ydHM9Zn0sZnVuY3Rpb24odCxlLG4peyhlPXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKTt2YXIgbj1lW3RdO2lmKCFuKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IHN1cHBvcnRlZCAod2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMpIik7cmV0dXJuIG5ldyBufSkuc2hhPW4oMTU3KSxlLnNoYTE9bigxNTgpLGUuc2hhMjI0PW4oMTU5KSxlLnNoYTI1Nj1uKDg5KSxlLnNoYTM4ND1uKDE2MCksZS5zaGE1MTI9big5MCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS51dGlscz1uKDE2NiksZS5DaXBoZXI9bigxNjcpLGUuREVTPW4oMTY4KSxlLkNCQz1uKDE2OSksZS5FREU9bigxNzApfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxNzEpLHI9bigxNzkpLG89bigxMDApO2UuY3JlYXRlQ2lwaGVyPWUuQ2lwaGVyPWkuY3JlYXRlQ2lwaGVyLGUuY3JlYXRlQ2lwaGVyaXY9ZS5DaXBoZXJpdj1pLmNyZWF0ZUNpcGhlcml2LGUuY3JlYXRlRGVjaXBoZXI9ZS5EZWNpcGhlcj1yLmNyZWF0ZURlY2lwaGVyLGUuY3JlYXRlRGVjaXBoZXJpdj1lLkRlY2lwaGVyaXY9ci5jcmVhdGVEZWNpcGhlcml2LGUubGlzdENpcGhlcnM9ZS5nZXRDaXBoZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPXtFQ0I6bigxNzIpLENCQzpuKDE3MyksQ0ZCOm4oMTc0KSxDRkI4Om4oMTc1KSxDRkIxOm4oMTc2KSxPRkI6bigxNzcpLENUUjpuKDk4KSxHQ006big5OCl9LHI9bigxMDApO2Zvcih2YXIgbyBpbiByKXJbb10ubW9kdWxlPWlbcltvXS5tb2RlXTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDMpLHI9bigyNyk7ZnVuY3Rpb24gbyh0LG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXModCk7cmV0dXJue2JsaW5kZXI6ZS50b1JlZChpLm1vbnQodC5tb2R1bHVzKSkucmVkUG93KG5ldyBpKHQucHVibGljRXhwb25lbnQpKS5mcm9tUmVkKCksdW5ibGluZGVyOmUuaW52bSh0Lm1vZHVsdXMpfX0obiksbz1uLm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGE9KGkubW9udChuLm1vZHVsdXMpLG5ldyBpKHQpLm11bChyLmJsaW5kZXIpLnVtb2Qobi5tb2R1bHVzKSksdT1hLnRvUmVkKGkubW9udChuLnByaW1lMSkpLGM9YS50b1JlZChpLm1vbnQobi5wcmltZTIpKSxoPW4uY29lZmZpY2llbnQsbD1uLnByaW1lMSxkPW4ucHJpbWUyLGY9dS5yZWRQb3cobi5leHBvbmVudDEpLHA9Yy5yZWRQb3cobi5leHBvbmVudDIpO2Y9Zi5mcm9tUmVkKCkscD1wLmZyb21SZWQoKTt2YXIgbT1mLmlzdWIocCkuaW11bChoKS51bW9kKGwpO3JldHVybiBtLmltdWwoZCkscC5pYWRkKG0pLG5ldyBlKHAuaW11bChyLnVuYmxpbmRlcikudW1vZChuLm1vZHVsdXMpLnRvQXJyYXkoITEsbykpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCksbj1uZXcgaShyKGUpKTtuLmNtcCh0Lm1vZHVsdXMpPj0wfHwhbi51bW9kKHQucHJpbWUxKXx8IW4udW1vZCh0LnByaW1lMik7KW49bmV3IGkocihlKSk7cmV0dXJuIG59dC5leHBvcnRzPW8sby5nZXRyPXN9KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9ZTtpLnV0aWxzPW4oMTcpLGkuY29tbW9uPW4oMzQpLGkuc2hhPW4oMTk1KSxpLnJpcGVtZD1uKDE5OSksaS5obWFjPW4oMjAwKSxpLnNoYTE9aS5zaGEuc2hhMSxpLnNoYTI1Nj1pLnNoYS5zaGEyNTYsaS5zaGEyMjQ9aS5zaGEuc2hhMjI0LGkuc2hhMzg0PWkuc2hhLnNoYTM4NCxpLnNoYTUxMj1pLnNoYS5zaGE1MTIsaS5yaXBlbWQxNjA9aS5yaXBlbWQucmlwZW1kMTYwfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIk1hcCIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxOSkuU3ltYm9sO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe3ZhciBuPUFycmF5LmlzQXJyYXk7dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuSlVQWVRFUl9XSURHRVRTX1ZFUlNJT049IjEuMS4wIixlLlBST1RPQ09MX1ZFUlNJT049IjIuMC4wIn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMjUpLGE9bigzMDApLHU9bigxMjkpLGM9bigxNSksaD1uKDMwMSksbD1uKDM5KSxkPW4oNSksZj1uKDc0KTtmdW5jdGlvbiBwKHQsZSl7dmFyIG47cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/KG49W10sdC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7bi5wdXNoKHAodCxlKSl9KSxQcm9taXNlLmFsbChuKSk6dCBpbnN0YW5jZW9mIE9iamVjdD8obj17fSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe25baV09cCh0W2ldLGUpfSkscy5yZXNvbHZlUHJvbWlzZXNEaWN0KG4pKToic3RyaW5nIj09dHlwZW9mIHQmJiJJUFlfTU9ERUxfIj09PXQuc2xpY2UoMCwxMCk/ZS5nZXRfbW9kZWwodC5zbGljZSgxMCx0Lmxlbmd0aCkpOlByb21pc2UucmVzb2x2ZSh0KX1lLnVucGFja19tb2RlbHM9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJue19tb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvYmFzZSIsX21vZGVsX25hbWU6IldpZGdldE1vZGVsIixfbW9kZWxfbW9kdWxlX3ZlcnNpb246Zi5KVVBZVEVSX1dJREdFVFNfVkVSU0lPTixfdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvYmFzZSIsX3ZpZXdfbmFtZTpudWxsLF92aWV3X21vZHVsZV92ZXJzaW9uOmYuSlVQWVRFUl9XSURHRVRTX1ZFUlNJT04sX3ZpZXdfY291bnQ6bnVsbH19LGUucHJvdG90eXBlLmlzTmV3PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlLG4pLHRoaXMud2lkZ2V0X21hbmFnZXI9bi53aWRnZXRfbWFuYWdlcix0aGlzLm1vZGVsX2lkPW4ubW9kZWxfaWQ7dmFyIGk9bi5jb21tO3RoaXMudmlld3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnN0YXRlX2NoYW5nZT1Qcm9taXNlLnJlc29sdmUoKSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5fc3RhdGVfbG9jaz1udWxsLHRoaXMuX21zZ19idWZmZXI9bnVsbCx0aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdfbXNncz0wLHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmY9e30saT8odGhpcy5jb21tPWksaS5vbl9jbG9zZSh0aGlzLl9oYW5kbGVfY29tbV9jbG9zZWQuYmluZCh0aGlzKSksaS5vbl9tc2codGhpcy5faGFuZGxlX2NvbW1fbXNnLmJpbmQodGhpcykpLHRoaXMuY29tbV9saXZlPSEwKTp0aGlzLmNvbW1fbGl2ZT0hMX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb21tX2xpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbV9saXZlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY29tbV9saXZlPXQsdGhpcy50cmlnZ2VyKCJjb21tX2xpdmVfdXBkYXRlIil9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbih0LGUsbil7aWYodm9pZCAwIT09dGhpcy5jb21tKXt2YXIgaT17bWV0aG9kOiJjdXN0b20iLGNvbnRlbnQ6dH07dGhpcy5jb21tLnNlbmQoaSxlLHt9LG4pfX0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD0hMSksIXRoaXMuX2Nsb3NlZCl7dGhpcy5fY2xvc2VkPSEwLHRoaXMuY29tbSYmIXQmJnRoaXMuY29tbS5jbG9zZSgpLHRoaXMuc3RvcExpc3RlbmluZygpLHRoaXMudHJpZ2dlcigiZGVzdHJveSIsdGhpcyksdGhpcy5jb21tJiZkZWxldGUgdGhpcy5jb21tO3ZhciBuPU9iamVjdC5rZXlzKHRoaXMudmlld3MpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZS52aWV3c1t0XS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbW92ZSgpfSl9KTtyZXR1cm4gZGVsZXRlIHRoaXMudmlld3MsUHJvbWlzZS5hbGwobikudGhlbihmdW5jdGlvbigpe30pfX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jb21tX2Nsb3NlZD1mdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImNvbW06Y2xvc2UiKSx0aGlzLmNsb3NlKCEwKX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jb21tX21zZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3N3aXRjaCh0LmNvbnRlbnQuZGF0YS5tZXRob2Qpe2Nhc2UidXBkYXRlIjpyZXR1cm4gdGhpcy5zdGF0ZV9jaGFuZ2U9dGhpcy5zdGF0ZV9jaGFuZ2UudGhlbihmdW5jdGlvbigpe3ZhciBuPXQuY29udGVudC5kYXRhLnN0YXRlLGk9dC5jb250ZW50LmRhdGEuYnVmZmVyX3BhdGhzfHxbXSxyPSh0LmJ1ZmZlcnN8fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRhVmlldz90Om5ldyBEYXRhVmlldyh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/dDp0LmJ1ZmZlcil9KTtyZXR1cm4gcy5wdXRfYnVmZmVycyhuLGksciksZS5jb25zdHJ1Y3Rvci5fZGVzZXJpYWxpemVfc3RhdGUobixlLndpZGdldF9tYW5hZ2VyKX0pLnRoZW4oZnVuY3Rpb24odCl7ZS5zZXRfc3RhdGUodCl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IHByb2Nlc3MgdXBkYXRlIG1zZyBmb3IgbW9kZWwgaWQ6ICIrdGhpcy5tb2RlbF9pZCwhMCkpLHRoaXMuc3RhdGVfY2hhbmdlO2Nhc2UiY3VzdG9tIjpyZXR1cm4gdGhpcy50cmlnZ2VyKCJtc2c6Y3VzdG9tIix0LmNvbnRlbnQuZGF0YS5jb250ZW50LHQuYnVmZmVycyksUHJvbWlzZS5yZXNvbHZlKCl9fSxlLnByb3RvdHlwZS5zZXRfc3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5fc3RhdGVfbG9jaz10O3RyeXt0aGlzLnNldCh0KX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJFcnJvciBzZXR0aW5nIHN0YXRlOiAiK3QubWVzc2FnZSl9ZmluYWxseXt0aGlzLl9zdGF0ZV9sb2NrPW51bGx9fSxlLnByb3RvdHlwZS5nZXRfc3RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzO2lmKHQpe3ZhciBuPXRoaXMuZGVmYXVsdHMsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyk6bixyPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MuaXNFcXVhbChlW3RdLGlbdF0pfHwoclt0XT1lW3RdKX0pLHJ9cmV0dXJuIG8oe30sZSl9LGUucHJvdG90eXBlLl9oYW5kbGVfc3RhdHVzPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMuY29tbSYmImlkbGUiPT09dC5jb250ZW50LmV4ZWN1dGlvbl9zdGF0ZSYmKHRoaXMuX3BlbmRpbmdfbXNncy0tLG51bGwhPT10aGlzLl9tc2dfYnVmZmVyJiZ0aGlzLl9wZW5kaW5nX21zZ3M8MSYmKHRoaXMuc2VuZF9zeW5jX21lc3NhZ2UodGhpcy5fbXNnX2J1ZmZlcix0aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcyksdGhpcy5fbXNnX2J1ZmZlcj1udWxsLHRoaXMuX21zZ19idWZmZXJfY2FsbGJhY2tzPW51bGwpKX0sZS5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndpZGdldF9tYW5hZ2VyLmNhbGxiYWNrcyh0KX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1hLnNldC5jYWxsKHRoaXMsdCxlLG4pO2lmKHZvaWQgMCE9PXRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYpe3ZhciByPXRoaXMuY2hhbmdlZEF0dHJpYnV0ZXMoKXx8e307aWYodGhpcy5fc3RhdGVfbG9jaylmb3IodmFyIG89MCx1PU9iamVjdC5rZXlzKHRoaXMuX3N0YXRlX2xvY2spO288dS5sZW5ndGg7bysrKXt2YXIgYz11W29dO3JbY109PT10aGlzLl9zdGF0ZV9sb2NrW2NdJiZkZWxldGUgcltjXX10aGlzLl9idWZmZXJlZF9zdGF0ZV9kaWZmPXMuYXNzaWduKHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYscil9cmV0dXJuIGl9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSx2b2lkIDA9PT10aGlzLmNvbW0pdGhyb3ciU3luY2luZyBlcnJvcjogbm8gY29tbSBjaGFubmVsIGRlZmluZWQiO3ZhciBpPSJwYXRjaCI9PT10P24uYXR0cnM6ZS5nZXRfc3RhdGUobi5kcm9wX2RlZmF1bHRzKTtpZih0aGlzLl9zdGF0ZV9sb2NrKWZvcih2YXIgcj0wLG89T2JqZWN0LmtleXModGhpcy5fc3RhdGVfbG9jayk7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07aVthXT09PXRoaXMuX3N0YXRlX2xvY2tbYV0mJmRlbGV0ZSBpW2FdfXZhciB1PXRoaXMuc2VyaWFsaXplKGkpO2lmKE9iamVjdC5rZXlzKHUpLmxlbmd0aD4wKXt2YXIgYz1uLmNhbGxiYWNrc3x8dGhpcy5jYWxsYmFja3MoKTtpZih0aGlzLl9wZW5kaW5nX21zZ3M+PTEpe3N3aXRjaCh0KXtjYXNlInBhdGNoIjp0aGlzLl9tc2dfYnVmZmVyPXMuYXNzaWduKHRoaXMuX21zZ19idWZmZXJ8fHt9LHUpO2JyZWFrO2Nhc2UidXBkYXRlIjpjYXNlImNyZWF0ZSI6dGhpcy5fbXNnX2J1ZmZlcj11O2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWNvZ25pemVkIHN5bmNpbmcgbWV0aG9kIn10aGlzLl9tc2dfYnVmZmVyX2NhbGxiYWNrcz1jfWVsc2UgdGhpcy5zZW5kX3N5bmNfbWVzc2FnZShpLGMpfX0sZS5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNvbnN0cnVjdG9yLnNlcmlhbGl6ZXJzfHx7fSxuPTAsaT1PYmplY3Qua2V5cyh0KTtuPGkubGVuZ3RoO24rKyl7dmFyIHI9aVtuXTt0cnl7ZVtyXSYmZVtyXS5zZXJpYWxpemU/dFtyXT1lW3JdLnNlcmlhbGl6ZSh0W3JdLHRoaXMpOnRbcl09SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0W3JdKSksdFtyXSYmdFtyXS50b0pTT04mJih0W3JdPXRbcl0udG9KU09OKCkpfWNhdGNoKHQpe3Rocm93IGNvbnNvbGUuZXJyb3IoIkVycm9yIHNlcmlhbGl6aW5nIHdpZGdldCBzdGF0ZSBhdHRyaWJ1dGU6ICIsciksdH19cmV0dXJuIHR9LGUucHJvdG90eXBlLnNlbmRfc3luY19tZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dHJ5e2UuaW9wdWI9ZS5pb3B1Ynx8e307dmFyIGk9ZS5pb3B1Yi5zdGF0dXM7ZS5pb3B1Yi5zdGF0dXM9ZnVuY3Rpb24odCl7bi5faGFuZGxlX3N0YXR1cyh0KSxpJiZpKHQpfTt2YXIgcj1zLnJlbW92ZV9idWZmZXJzKHQpO3RoaXMuY29tbS5zZW5kKHttZXRob2Q6InVwZGF0ZSIsc3RhdGU6ci5zdGF0ZSxidWZmZXJfcGF0aHM6ci5idWZmZXJfcGF0aHN9LGUse30sci5idWZmZXJzKSx0aGlzLl9wZW5kaW5nX21zZ3MrK31jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3Qgc2VuZCB3aWRnZXQgc3luYyBtZXNzYWdlIix0KX19LGUucHJvdG90eXBlLnNhdmVfY2hhbmdlcz1mdW5jdGlvbih0KXtpZih0aGlzLmNvbW1fbGl2ZSl7dmFyIGU9e3BhdGNoOiEwfTt0JiYoZS5jYWxsYmFja3M9dCksdGhpcy5zYXZlKHRoaXMuX2J1ZmZlcmVkX3N0YXRlX2RpZmYsZSksdGhpcy5fYnVmZmVyZWRfc3RhdGVfZGlmZj17fX19LGUucHJvdG90eXBlLm9uX3NvbWVfY2hhbmdlPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dC5zb21lKHRoaXMuaGFzQ2hhbmdlZCx0aGlzKSYmZS5hcHBseShuLGFyZ3VtZW50cyl9LHRoaXMpfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24odCl7cmV0dXJuIklQWV9NT0RFTF8iK3RoaXMubW9kZWxfaWR9LGUuX2Rlc2VyaWFsaXplX3N0YXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLnNlcmlhbGl6ZXJzO2lmKGkpZm9yKHZhciByIGluIG49e30sdClpW3JdJiZpW3JdLmRlc2VyaWFsaXplP25bcl09aVtyXS5kZXNlcmlhbGl6ZSh0W3JdLGUpOm5bcl09dFtyXTtlbHNlIG49dDtyZXR1cm4gcy5yZXNvbHZlUHJvbWlzZXNEaWN0KG4pfSxlfSh1Lk1vZGVsKTtlLldpZGdldE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmFzc2lnbih0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfZG9tX2NsYXNzZXM6W119KX0sZS5zZXJpYWxpemVycz1vKHt9LG0uc2VyaWFsaXplcnMse2xheW91dDp7ZGVzZXJpYWxpemU6cH0sc3R5bGU6e2Rlc2VyaWFsaXplOnB9fSksZX0obSk7ZS5ET01XaWRnZXRNb2RlbD1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlIixmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5rZXlzKGUubW9kZWwuY2hhbmdlZEF0dHJpYnV0ZXMoKXx8e30pOyJfdmlld19jb3VudCI9PT10WzBdJiYxPT09dC5sZW5ndGh8fGUudXBkYXRlKCl9KSx0aGlzLm9wdGlvbnM9dC5vcHRpb25zLHRoaXMub25jZSgicmVtb3ZlIixmdW5jdGlvbigpeyJudW1iZXIiPT10eXBlb2YgZS5tb2RlbC5nZXQoIl92aWV3X2NvdW50IikmJihlLm1vZGVsLnNldCgiX3ZpZXdfY291bnQiLGUubW9kZWwuZ2V0KCJfdmlld19jb3VudCIpLTEpLGUubW9kZWwuc2F2ZV9jaGFuZ2VzKCkpfSksdGhpcy5vbmNlKCJkaXNwbGF5ZWQiLGZ1bmN0aW9uKCl7Im51bWJlciI9PXR5cGVvZiBlLm1vZGVsLmdldCgiX3ZpZXdfY291bnQiKSYmKGUubW9kZWwuc2V0KCJfdmlld19jb3VudCIsZS5tb2RlbC5nZXQoIl92aWV3X2NvdW50IikrMSksZS5tb2RlbC5zYXZlX2NoYW5nZXMoKSl9KSx0aGlzLmRpc3BsYXllZD1uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Uub25jZSgiZGlzcGxheWVkIix0KX0pfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmNyZWF0ZV9jaGlsZF92aWV3PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3JldHVybiBlPW8oe3BhcmVudDp0aGlzfSxlKSx0aGlzLm1vZGVsLndpZGdldF9tYW5hZ2VyLmNyZWF0ZV92aWV3KHQsZSkuY2F0Y2gocy5yZWplY3QoIkNvdWxkIG5vdCBjcmVhdGUgY2hpbGQgdmlldyIsITApKX0sZS5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kZWwuY2FsbGJhY2tzKHRoaXMpfSxlLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZW5kKHQsdGhpcy5jYWxsYmFja3MoKSxlKX0sZS5wcm90b3R5cGUudG91Y2g9ZnVuY3Rpb24oKXt0aGlzLm1vZGVsLnNhdmVfY2hhbmdlcyh0aGlzLmNhbGxiYWNrcygpKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpLHRoaXMudHJpZ2dlcigicmVtb3ZlIiksdGhpc30sZX0oaC5OYXRpdmVWaWV3KTtlLldpZGdldFZpZXc9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXRoaXMsaT1lLnZpZXc7cmV0dXJuIGRlbGV0ZSBlLnZpZXcsKG49dC5jYWxsKHRoaXMsZSl8fHRoaXMpLl92aWV3PWksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlLnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSksdGhpcy5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpfSxlfShsLldpZGdldCk7ZS5KdXB5dGVyUGhvc3Bob3JXaWRnZXQ9Yjt2YXIgeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfZG9tX2NsYXNzZXMiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5wcmV2aW91cygiX2RvbV9jbGFzc2VzIik7bi51cGRhdGVfY2xhc3NlcyhpLGUpfSksdGhpcy5sYXlvdXRQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmxheW91dCIsZnVuY3Rpb24odCxlKXtuLnNldExheW91dChlLHQucHJldmlvdXMoImxheW91dCIpKX0pLHRoaXMuc3R5bGVQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOnN0eWxlIixmdW5jdGlvbih0LGUpe24uc2V0U3R5bGUoZSx0LnByZXZpb3VzKCJzdHlsZSIpKX0pLHRoaXMuZGlzcGxheWVkLnRoZW4oZnVuY3Rpb24oKXtuLnVwZGF0ZV9jbGFzc2VzKFtdLG4ubW9kZWwuZ2V0KCJfZG9tX2NsYXNzZXMiKSksbi5zZXRMYXlvdXQobi5tb2RlbC5nZXQoImxheW91dCIpKSxuLnNldFN0eWxlKG4ubW9kZWwuZ2V0KCJzdHlsZSIpKX0pLHRoaXMuX2NvbW1fbGl2ZV91cGRhdGUoKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNvbW1fbGl2ZV91cGRhdGUiLGZ1bmN0aW9uKCl7bi5fY29tbV9saXZlX3VwZGF0ZSgpfSl9LGUucHJvdG90eXBlLnNldExheW91dD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dCYmKHRoaXMubGF5b3V0UHJvbWlzZT10aGlzLmxheW91dFByb21pc2UudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUudW5sYXlvdXQoKSxuLnN0b3BMaXN0ZW5pbmcoZS5tb2RlbCksZS5yZW1vdmUoKSksbi5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBuLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQudHJpZ2dlcigiZGlzcGxheWVkIiksbi5saXN0ZW5Ubyh0Lm1vZGVsLCJjaGFuZ2UiLGZ1bmN0aW9uKCl7ZC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZShuLnBXaWRnZXQsbC5XaWRnZXQuUmVzaXplTWVzc2FnZS5Vbmtub3duU2l6ZSl9KSxkLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKG4ucFdpZGdldCxsLldpZGdldC5SZXNpemVNZXNzYWdlLlVua25vd25TaXplKSx0fSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGFkZCBMYXlvdXRWaWV3IHRvIERPTVdpZGdldFZpZXciLCEwKSl9KSl9LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0JiYodGhpcy5zdHlsZVByb21pc2U9dGhpcy5zdHlsZVByb21pc2UudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUudW5zdHlsZSgpLG4uc3RvcExpc3RlbmluZyhlLm1vZGVsKSxlLnJlbW92ZSgpKSxuLmNyZWF0ZV9jaGlsZF92aWV3KHQpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIG4uZGlzcGxheWVkLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdC50cmlnZ2VyKCJkaXNwbGF5ZWQiKSx0fSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGFkZCBzdHlsZVZpZXcgdG8gRE9NV2lkZ2V0VmlldyIsITApKX0pKX0sZS5wcm90b3R5cGUudXBkYXRlX2NsYXNzZXM9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXRoaXMuZWwpLHMuZGlmZmVyZW5jZSh0LGUpLm1hcChmdW5jdGlvbih0KXtuLmNsYXNzTGlzdD9uLmNsYXNzTGlzdC5yZW1vdmUodCk6bi5zZXRBdHRyaWJ1dGUoImNsYXNzIixuLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5yZXBsYWNlKHQsIiIpKX0pLHMuZGlmZmVyZW5jZShlLHQpLm1hcChmdW5jdGlvbih0KXtuLmNsYXNzTGlzdD9uLmNsYXNzTGlzdC5hZGQodCk6bi5zZXRBdHRyaWJ1dGUoImNsYXNzIixuLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb25jYXQoIiAiLHQpKX0pfSxlLnByb3RvdHlwZS51cGRhdGVfbWFwcGVkX2NsYXNzZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMubW9kZWwucHJldmlvdXMoZSkscj10W2ldP3RbaV06W10sbz10W2k9dGhpcy5tb2RlbC5nZXQoZSldP3RbaV06W107dGhpcy51cGRhdGVfY2xhc3NlcyhyLG8sbnx8dGhpcy5lbCl9LGUucHJvdG90eXBlLnNldF9tYXBwZWRfY2xhc3Nlcz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5tb2RlbC5nZXQoZSkscj10W2ldP3RbaV06W107dGhpcy51cGRhdGVfY2xhc3NlcyhbXSxyLG58fHRoaXMuZWwpfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLnBXaWRnZXQmJnRoaXMucFdpZGdldC5kaXNwb3NlKCksdGhpcy4kZWw9dCBpbnN0YW5jZW9mIGM/dDpjKHQpLHRoaXMuZWw9dGhpcy4kZWxbMF0sdGhpcy5wV2lkZ2V0PW5ldyBiKHtub2RlOnQsdmlldzp0aGlzfSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBXaWRnZXQmJnRoaXMucFdpZGdldC5kaXNwb3NlKCksdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnByb2Nlc3NQaG9zcGhvck1lc3NhZ2U9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJhZnRlci1hdHRhY2giOnRoaXMudHJpZ2dlcigiZGlzcGxheWVkIil9fSxlLnByb3RvdHlwZS5fY29tbV9saXZlX3VwZGF0ZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuY29tbV9saXZlP3RoaXMucFdpZGdldC5yZW1vdmVDbGFzcygianVweXRlci13aWRnZXRzLWRpc2Nvbm5lY3RlZCIpOnRoaXMucFdpZGdldC5hZGRDbGFzcygianVweXRlci13aWRnZXRzLWRpc2Nvbm5lY3RlZCIpfSxlfSh2KTtlLkRPTVdpZGdldFZpZXc9eX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDIpLGE9big5KSx1PW4oNSksYz1uKDMwKSxoPW4oNDApLGw9bigyMiksZD1uKDQxKSxmPW4oNykscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2ZpeGVkPTAsbi5fc3BhY2luZz00LG4uX2RpcnR5PSExLG4uX3NpemVycz1bXSxuLl9pdGVtcz1bXSxuLl9ib3g9bnVsbCxuLl9hbGlnbm1lbnQ9InN0YXJ0IixuLl9kaXJlY3Rpb249InRvcC10by1ib3R0b20iLHZvaWQgMCE9PWUuZGlyZWN0aW9uJiYobi5fZGlyZWN0aW9uPWUuZGlyZWN0aW9uKSx2b2lkIDAhPT1lLmFsaWdubWVudCYmKG4uX2FsaWdubWVudD1lLmFsaWdubWVudCksdm9pZCAwIT09ZS5zcGFjaW5nJiYobi5fc3BhY2luZz1vLmNsYW1wU3BhY2luZyhlLnNwYWNpbmcpKSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3MuZWFjaCh0aGlzLl9pdGVtcyxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2JveD1udWxsLHRoaXMuX2l0ZW1zLmxlbmd0aD0wLHRoaXMuX3NpemVycy5sZW5ndGg9MCx0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZGlyZWN0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RpcmVjdGlvbiE9PXQmJih0aGlzLl9kaXJlY3Rpb249dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQuZGlyZWN0aW9uPXQsdGhpcy5wYXJlbnQuZml0KCkpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbGlnbm1lbnQhPT10JiYodGhpcy5fYWxpZ25tZW50PXQsdGhpcy5wYXJlbnQmJih0aGlzLnBhcmVudC5kYXRhc2V0LmFsaWdubWVudD10LHRoaXMucGFyZW50LnVwZGF0ZSgpKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBTcGFjaW5nKHQpLHRoaXMuX3NwYWNpbmchPT10JiYodGhpcy5fc3BhY2luZz10LHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMucGFyZW50LmRhdGFzZXQuZGlyZWN0aW9uPXRoaXMuZGlyZWN0aW9uLHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXRoaXMuYWxpZ25tZW50LHQucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuYXR0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7cy5BcnJheUV4dC5pbnNlcnQodGhpcy5faXRlbXMsdCxuZXcgbC5MYXlvdXRJdGVtKGUpKSxzLkFycmF5RXh0Lmluc2VydCh0aGlzLl9zaXplcnMsdCxuZXcgaC5Cb3hTaXplciksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5CZWZvcmVBdHRhY2gpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkFmdGVyQXR0YWNoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUubW92ZVdpZGdldD1mdW5jdGlvbih0LGUsbil7cy5BcnJheUV4dC5tb3ZlKHRoaXMuX2l0ZW1zLHQsZSkscy5BcnJheUV4dC5tb3ZlKHRoaXMuX3NpemVycyx0LGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpO3MuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fc2l6ZXJzLHQpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxmLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksbi5kaXNwb3NlKCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLG49MCxpPXRoaXMuX2l0ZW1zLmxlbmd0aDtuPGk7KytuKXQrPSshdGhpcy5faXRlbXNbbl0uaXNIaWRkZW47dGhpcy5fZml4ZWQ9dGhpcy5fc3BhY2luZypNYXRoLm1heCgwLHQtMSk7dmFyIHI9by5pc0hvcml6b250YWwodGhpcy5fZGlyZWN0aW9uKSxzPXI/dGhpcy5fZml4ZWQ6MCxjPXI/MDp0aGlzLl9maXhlZDtmb3Iobj0wLGk9dGhpcy5faXRlbXMubGVuZ3RoO248aTsrK24pe3ZhciBoPXRoaXMuX2l0ZW1zW25dLGw9dGhpcy5fc2l6ZXJzW25dO2guaXNIaWRkZW4/KGwubWluU2l6ZT0wLGwubWF4U2l6ZT0wKTooaC5maXQoKSxsLnNpemVIaW50PWUuZ2V0U2l6ZUJhc2lzKGgud2lkZ2V0KSxsLnN0cmV0Y2g9ZS5nZXRTdHJldGNoKGgud2lkZ2V0KSxyPyhsLm1pblNpemU9aC5taW5XaWR0aCxsLm1heFNpemU9aC5tYXhXaWR0aCxzKz1oLm1pbldpZHRoLGM9TWF0aC5tYXgoYyxoLm1pbkhlaWdodCkpOihsLm1pblNpemU9aC5taW5IZWlnaHQsbC5tYXhTaXplPWgubWF4SGVpZ2h0LGMrPWgubWluSGVpZ2h0LHM9TWF0aC5tYXgocyxoLm1pbldpZHRoKSkpfXZhciBkPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3MrPWQuaG9yaXpvbnRhbFN1bSxjKz1kLnZlcnRpY2FsU3VtO3ZhciBwPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7cC5taW5XaWR0aD1zKyJweCIscC5taW5IZWlnaHQ9YysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZi5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvLHM9dGhpcy5fYm94LnBhZGRpbmdUb3AsdT10aGlzLl9ib3gucGFkZGluZ0xlZnQsYz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLGw9ZS10aGlzLl9ib3gudmVydGljYWxTdW07c3dpdGNoKHRoaXMuX2RpcmVjdGlvbil7Y2FzZSJsZWZ0LXRvLXJpZ2h0IjpvPWguQm94RW5naW5lLmNhbGModGhpcy5fc2l6ZXJzLE1hdGgubWF4KDAsYy10aGlzLl9maXhlZCkpO2JyZWFrO2Nhc2UidG9wLXRvLWJvdHRvbSI6bz1oLkJveEVuZ2luZS5jYWxjKHRoaXMuX3NpemVycyxNYXRoLm1heCgwLGwtdGhpcy5fZml4ZWQpKTticmVhaztjYXNlInJpZ2h0LXRvLWxlZnQiOm89aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9zaXplcnMsTWF0aC5tYXgoMCxjLXRoaXMuX2ZpeGVkKSksdSs9YzticmVhaztjYXNlImJvdHRvbS10by10b3AiOm89aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9zaXplcnMsTWF0aC5tYXgoMCxsLXRoaXMuX2ZpeGVkKSkscys9bDticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn12YXIgZD0wLGY9MDtpZihvPjApc3dpdGNoKHRoaXMuX2FsaWdubWVudCl7Y2FzZSJzdGFydCI6YnJlYWs7Y2FzZSJjZW50ZXIiOmQ9MCxmPW8vMjticmVhaztjYXNlImVuZCI6ZD0wLGY9bzticmVhaztjYXNlImp1c3RpZnkiOmQ9by9uLGY9MDticmVhaztkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn1mb3IoaT0wLHI9dGhpcy5faXRlbXMubGVuZ3RoO2k8cjsrK2kpe3ZhciBwPXRoaXMuX2l0ZW1zW2ldO2lmKCFwLmlzSGlkZGVuKXt2YXIgbT10aGlzLl9zaXplcnNbaV0uc2l6ZTtzd2l0Y2godGhpcy5fZGlyZWN0aW9uKXtjYXNlImxlZnQtdG8tcmlnaHQiOnAudXBkYXRlKHUrZixzLG0rZCxsKSx1Kz1tK2QrdGhpcy5fc3BhY2luZzticmVhaztjYXNlInRvcC10by1ib3R0b20iOnAudXBkYXRlKHUscytmLGMsbStkKSxzKz1tK2QrdGhpcy5fc3BhY2luZzticmVhaztjYXNlInJpZ2h0LXRvLWxlZnQiOnAudXBkYXRlKHUtZi1tLWQscyxtK2QsbCksdS09bStkK3RoaXMuX3NwYWNpbmc7YnJlYWs7Y2FzZSJib3R0b20tdG8tdG9wIjpwLnVwZGF0ZSh1LHMtZi1tLWQsYyxtK2QpLHMtPW0rZCt0aGlzLl9zcGFjaW5nO2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifX19fX0sZX0oZC5QYW5lbExheW91dCk7ZS5Cb3hMYXlvdXQ9cCxmdW5jdGlvbih0KXt0LmdldFN0cmV0Y2g9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyZXRjaFByb3BlcnR5LmdldCh0KX0sdC5zZXRTdHJldGNoPWZ1bmN0aW9uKHQsZSl7by5zdHJldGNoUHJvcGVydHkuc2V0KHQsZSl9LHQuZ2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnNpemVCYXNpc1Byb3BlcnR5LmdldCh0KX0sdC5zZXRTaXplQmFzaXM9ZnVuY3Rpb24odCxlKXtvLnNpemVCYXNpc1Byb3BlcnR5LnNldCh0LGUpfX0ocD1lLkJveExheW91dHx8KGUuQm94TGF5b3V0PXt9KSksZS5Cb3hMYXlvdXQ9cCxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3QucGFyZW50JiZ0LnBhcmVudC5sYXlvdXQgaW5zdGFuY2VvZiBwJiZ0LnBhcmVudC5maXQoKX10LnN0cmV0Y2hQcm9wZXJ0eT1uZXcgYy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJzdHJldGNoIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZX0pLHQuc2l6ZUJhc2lzUHJvcGVydHk9bmV3IGMuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToic2l6ZUJhc2lzIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZX0pLHQuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKHQpe3JldHVybiJsZWZ0LXRvLXJpZ2h0Ij09PXR8fCJyaWdodC10by1sZWZ0Ij09PXR9LHQuY2xhbXBTcGFjaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGguZmxvb3IodCkpfX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxMSkscj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fbGFiZWw9IiIsdGhpcy5fY2FwdGlvbj0iIix0aGlzLl9tbmVtb25pYz0tMSx0aGlzLl9pY29uQ2xhc3M9IiIsdGhpcy5faWNvbkxhYmVsPSIiLHRoaXMuX2NsYXNzTmFtZT0iIix0aGlzLl9jbG9zYWJsZT0hMSx0aGlzLl9jaGFuZ2VkPW5ldyBpLlNpZ25hbCh0aGlzKSx0aGlzLm93bmVyPXQub3duZXIsdm9pZCAwIT09dC5sYWJlbCYmKHRoaXMuX2xhYmVsPXQubGFiZWwpLHZvaWQgMCE9PXQubW5lbW9uaWMmJih0aGlzLl9tbmVtb25pYz10Lm1uZW1vbmljKSx2b2lkIDAhPT10Lmljb24mJih0aGlzLl9pY29uQ2xhc3M9dC5pY29uKSx2b2lkIDAhPT10Lmljb25DbGFzcyYmKHRoaXMuX2ljb25DbGFzcz10Lmljb25DbGFzcyksdm9pZCAwIT09dC5pY29uTGFiZWwmJih0aGlzLl9pY29uTGFiZWw9dC5pY29uTGFiZWwpLHZvaWQgMCE9PXQuY2FwdGlvbiYmKHRoaXMuX2NhcHRpb249dC5jYXB0aW9uKSx2b2lkIDAhPT10LmNsYXNzTmFtZSYmKHRoaXMuX2NsYXNzTmFtZT10LmNsYXNzTmFtZSksdm9pZCAwIT09dC5jbG9zYWJsZSYmKHRoaXMuX2Nsb3NhYmxlPXQuY2xvc2FibGUpLHRoaXMuX2RhdGFzZXQ9dC5kYXRhc2V0fHx7fX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjaGFuZ2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJsYWJlbCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsIT09dCYmKHRoaXMuX2xhYmVsPXQsdGhpcy5fY2hhbmdlZC5lbWl0KHZvaWQgMCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibW5lbW9uaWMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW5lbW9uaWN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tbmVtb25pYyE9PXQmJih0aGlzLl9tbmVtb25pYz10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29uQ2xhc3N9LHNldDpmdW5jdGlvbih0KXt0aGlzLmljb25DbGFzcz10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaWNvbkNsYXNzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb25DbGFzc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ljb25DbGFzcyE9PXQmJih0aGlzLl9pY29uQ2xhc3M9dCx0aGlzLl9jaGFuZ2VkLmVtaXQodm9pZCAwKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uTGFiZWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbkxhYmVsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faWNvbkxhYmVsIT09dCYmKHRoaXMuX2ljb25MYWJlbD10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNhcHRpb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FwdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcHRpb24hPT10JiYodGhpcy5fY2FwdGlvbj10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNsYXNzTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGFzc05hbWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jbGFzc05hbWUhPT10JiYodGhpcy5fY2xhc3NOYW1lPXQsdGhpcy5fY2hhbmdlZC5lbWl0KHZvaWQgMCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY2xvc2FibGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xvc2FibGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jbG9zYWJsZSE9PXQmJih0aGlzLl9jbG9zYWJsZT10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImRhdGFzZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXNldH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGFzZXQhPT10JiYodGhpcy5fZGF0YXNldD10LHRoaXMuX2NoYW5nZWQuZW1pdCh2b2lkIDApKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpO2UuVGl0bGU9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9mbj10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fZm59LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lmKHRoaXMuX2ZuKXt2YXIgdD10aGlzLl9mbjt0aGlzLl9mbj1udWxsLHQoKX19LHR9KCk7ZS5EaXNwb3NhYmxlRGVsZWdhdGU9cjt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9kaXNwb3NlZD0hMSx0aGlzLl9pdGVtcz1uZXcgU2V0fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlzcG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5fZGlzcG9zZWQ9ITAsdGhpcy5faXRlbXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2l0ZW1zLmNsZWFyKCkpfSx0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlbXMuaGFzKHQpfSx0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKHQpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuZGVsZXRlKHQpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX2l0ZW1zLmNsZWFyKCl9LHR9KCk7ZS5EaXNwb3NhYmxlU2V0PW8sZnVuY3Rpb24odCl7dC5mcm9tPWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0O3JldHVybiBpLmVhY2goZSxmdW5jdGlvbih0KXtuLmFkZCh0KX0pLG59fShvPWUuRGlzcG9zYWJsZVNldHx8KGUuRGlzcG9zYWJsZVNldD17fSkpLGUuRGlzcG9zYWJsZVNldD1vfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmdldEtleWJvYXJkTGF5b3V0PWZ1bmN0aW9uKCl7cmV0dXJuIGkua2V5Ym9hcmRMYXlvdXR9LGUuc2V0S2V5Ym9hcmRMYXlvdXQ9ZnVuY3Rpb24odCl7aS5rZXlib2FyZExheW91dD10fTt2YXIgaSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3RoaXMubmFtZT1lLHRoaXMuX2NvZGVzPW4sdGhpcy5fa2V5cz10LmV4dHJhY3RLZXlzKG4pfXJldHVybiB0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2tleXMpfSx0LnByb3RvdHlwZS5pc1ZhbGlkS2V5PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuX2tleXN9LHQucHJvdG90eXBlLmtleUZvcktleWRvd25FdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29kZXNbdC5rZXlDb2RlXXx8IiJ9LHR9KCk7ZS5LZXljb2RlTGF5b3V0PXIsZnVuY3Rpb24odCl7dC5leHRyYWN0S2V5cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgbiBpbiB0KWVbdFtuXV09ITA7cmV0dXJuIGV9fShyPWUuS2V5Y29kZUxheW91dHx8KGUuS2V5Y29kZUxheW91dD17fSkpLGUuS2V5Y29kZUxheW91dD1yLGUuRU5fVVM9bmV3IHIoImVuLXVzIix7ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEzOiJFbnRlciIsMTk6IlBhdXNlIiwyNzoiRXNjYXBlIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsNDg6IjAiLDQ5OiIxIiw1MDoiMiIsNTE6IjMiLDUyOiI0Iiw1MzoiNSIsNTQ6IjYiLDU1OiI3Iiw1NjoiOCIsNTc6IjkiLDU5OiI7Iiw2MToiPSIsNjU6IkEiLDY2OiJCIiw2NzoiQyIsNjg6IkQiLDY5OiJFIiw3MDoiRiIsNzE6IkciLDcyOiJIIiw3MzoiSSIsNzQ6IkoiLDc1OiJLIiw3NjoiTCIsNzc6Ik0iLDc4OiJOIiw3OToiTyIsODA6IlAiLDgxOiJRIiw4MjoiUiIsODM6IlMiLDg0OiJUIiw4NToiVSIsODY6IlYiLDg3OiJXIiw4ODoiWCIsODk6IlkiLDkwOiJaIiw5MzoiQ29udGV4dE1lbnUiLDk2OiIwIiw5NzoiMSIsOTg6IjIiLDk5OiIzIiwxMDA6IjQiLDEwMToiNSIsMTAyOiI2IiwxMDM6IjciLDEwNDoiOCIsMTA1OiI5IiwxMDY6IioiLDEwNzoiKyIsMTA5OiItIiwxMTA6Ii4iLDExMToiLyIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTczOiItIiwxODY6IjsiLDE4NzoiPSIsMTg4OiIsIiwxODk6Ii0iLDE5MDoiLiIsMTkxOiIvIiwxOTI6ImAiLDIxOToiWyIsMjIwOiJcXCIsMjIxOiJdIiwyMjI6IicifSksZnVuY3Rpb24odCl7dC5rZXlib2FyZExheW91dD1lLkVOX1VTfShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDkpLHU9big1NiksYz1uKDUpLGg9bigxMSksbD1uKDU1KSxkPW4oNzcpLGY9big3KSxwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dm9pZCAwPT09biYmKG49e30pO3ZhciBpPXQuY2FsbCh0aGlzLHtub2RlOm8uY3JlYXRlTm9kZSgpfSl8fHRoaXM7cmV0dXJuIGkuX2N1cnJlbnRJbmRleD0tMSxpLl90aXRsZXM9W10saS5fcHJldmlvdXNUaXRsZT1udWxsLGkuX2RyYWdEYXRhPW51bGwsaS5fdGFiTW92ZWQ9bmV3IGguU2lnbmFsKGkpLGkuX2N1cnJlbnRDaGFuZ2VkPW5ldyBoLlNpZ25hbChpKSxpLl90YWJDbG9zZVJlcXVlc3RlZD1uZXcgaC5TaWduYWwoaSksaS5fdGFiRGV0YWNoUmVxdWVzdGVkPW5ldyBoLlNpZ25hbChpKSxpLl90YWJBY3RpdmF0ZVJlcXVlc3RlZD1uZXcgaC5TaWduYWwoaSksaS5hZGRDbGFzcygicC1UYWJCYXIiKSxpLnNldEZsYWcoZi5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS50YWJzTW92YWJsZT1uLnRhYnNNb3ZhYmxlfHwhMSxpLmFsbG93RGVzZWxlY3Q9bi5hbGxvd0Rlc2VsZWN0fHwhMSxpLmluc2VydEJlaGF2aW9yPW4uaW5zZXJ0QmVoYXZpb3J8fCJzZWxlY3QtdGFiLWlmLW5lZWRlZCIsaS5yZW1vdmVCZWhhdmlvcj1uLnJlbW92ZUJlaGF2aW9yfHwic2VsZWN0LXRhYi1hZnRlciIsaS5yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpLl9vcmllbnRhdGlvbj1uLm9yaWVudGF0aW9ufHwiaG9yaXpvbnRhbCIsaS5kYXRhc2V0Lm9yaWVudGF0aW9uPWkuX29yaWVudGF0aW9uLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fdGl0bGVzLmxlbmd0aD0wLHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCx0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJNb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90YWJNb3ZlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYkFjdGl2YXRlUmVxdWVzdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RhYkFjdGl2YXRlUmVxdWVzdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFiQ2xvc2VSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFiQ2xvc2VSZXF1ZXN0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJEZXRhY2hSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFiRGV0YWNoUmVxdWVzdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudFRpdGxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpdGxlc1t0aGlzLl9jdXJyZW50SW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jdXJyZW50SW5kZXg9dD90aGlzLl90aXRsZXMuaW5kZXhPZih0KTotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImN1cnJlbnRJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50SW5kZXh9LHNldDpmdW5jdGlvbih0KXtpZigodDwwfHx0Pj10aGlzLl90aXRsZXMubGVuZ3RoKSYmKHQ9LTEpLHRoaXMuX2N1cnJlbnRJbmRleCE9PXQpe3ZhciBlPXRoaXMuX2N1cnJlbnRJbmRleCxuPXRoaXMuX3RpdGxlc1tlXXx8bnVsbCxpPXQscj10aGlzLl90aXRsZXNbaV18fG51bGw7dGhpcy5fY3VycmVudEluZGV4PWksdGhpcy5fcHJldmlvdXNUaXRsZT1uLHRoaXMudXBkYXRlKCksdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDplLHByZXZpb3VzVGl0bGU6bixjdXJyZW50SW5kZXg6aSxjdXJyZW50VGl0bGU6cn0pfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fb3JpZW50YXRpb249dCx0aGlzLmRhdGFzZXQub3JpZW50YXRpb249dCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0aXRsZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGl0bGVzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY29udGVudE5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInAtVGFiQmFyLWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRUYWI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5zZXJ0VGFiKHRoaXMuX3RpdGxlcy5sZW5ndGgsdCl9LGUucHJvdG90eXBlLmluc2VydFRhYj1mdW5jdGlvbih0LGUpe3RoaXMuX3JlbGVhc2VNb3VzZSgpO3ZhciBuPW8uYXNUaXRsZShlKSxpPXRoaXMuX3RpdGxlcy5pbmRleE9mKG4pLHI9TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX3RpdGxlcy5sZW5ndGgpKTtyZXR1cm4tMT09PWk/KHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX3RpdGxlcyxyLG4pLG4uY2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLHRoaXMudXBkYXRlKCksdGhpcy5fYWRqdXN0Q3VycmVudEZvckluc2VydChyLG4pLG4pOihyPT09dGhpcy5fdGl0bGVzLmxlbmd0aCYmci0tLGk9PT1yP246KHMuQXJyYXlFeHQubW92ZSh0aGlzLl90aXRsZXMsaSxyKSx0aGlzLnVwZGF0ZSgpLHRoaXMuX2FkanVzdEN1cnJlbnRGb3JNb3ZlKGksciksbikpfSxlLnByb3RvdHlwZS5yZW1vdmVUYWI9ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVUYWJBdCh0aGlzLl90aXRsZXMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZVRhYkF0PWZ1bmN0aW9uKHQpe3RoaXMuX3JlbGVhc2VNb3VzZSgpO3ZhciBlPXMuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fdGl0bGVzLHQpO2UmJihlLmNoYW5nZWQuZGlzY29ubmVjdCh0aGlzLl9vblRpdGxlQ2hhbmdlZCx0aGlzKSxlPT09dGhpcy5fcHJldmlvdXNUaXRsZSYmKHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCksdGhpcy51cGRhdGUoKSx0aGlzLl9hZGp1c3RDdXJyZW50Rm9yUmVtb3ZlKHQsZSkpfSxlLnByb3RvdHlwZS5jbGVhclRhYnM9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5fdGl0bGVzLmxlbmd0aCl7dGhpcy5fcmVsZWFzZU1vdXNlKCk7Zm9yKHZhciB0PTAsZT10aGlzLl90aXRsZXM7dDxlLmxlbmd0aDt0Kyspe2VbdF0uY2hhbmdlZC5kaXNjb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpfXZhciBuPXRoaXMuY3VycmVudEluZGV4LGk9dGhpcy5jdXJyZW50VGl0bGU7dGhpcy5fY3VycmVudEluZGV4PS0xLHRoaXMuX3ByZXZpb3VzVGl0bGU9bnVsbCx0aGlzLl90aXRsZXMubGVuZ3RoPTAsdGhpcy51cGRhdGUoKSwtMSE9PW4mJnRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6bixwcmV2aW91c1RpdGxlOmksY3VycmVudEluZGV4Oi0xLGN1cnJlbnRUaXRsZTpudWxsfSl9fSxlLnByb3RvdHlwZS5yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJtb3VzZWRvd24iOnRoaXMuX2V2dE1vdXNlRG93bih0KTticmVhaztjYXNlIm1vdXNlbW92ZSI6dGhpcy5fZXZ0TW91c2VNb3ZlKHQpO2JyZWFrO2Nhc2UibW91c2V1cCI6dGhpcy5fZXZ0TW91c2VVcCh0KTticmVhaztjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl90aXRsZXMsbj10aGlzLnJlbmRlcmVyLGk9dGhpcy5jdXJyZW50VGl0bGUscj1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MCxzPWUubGVuZ3RoO288czsrK28pe3ZhciBhPWVbb10sdT1hPT09aSxjPXU/czpzLW8tMTtyW29dPW4ucmVuZGVyVGFiKHt0aXRsZTphLGN1cnJlbnQ6dSx6SW5kZXg6Y30pfWwuVmlydHVhbERPTS5yZW5kZXIocix0aGlzLmNvbnRlbnROb2RlKX0sZS5wcm90b3R5cGUuX2V2dEtleURvd249ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksMjc9PT10LmtleUNvZGUmJnRoaXMuX3JlbGVhc2VNb3VzZSgpfSxlLnByb3RvdHlwZS5fZXZ0TW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKCgwPT09dC5idXR0b258fDE9PT10LmJ1dHRvbikmJiF0aGlzLl9kcmFnRGF0YSl7dmFyIGU9dGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixuPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgoZSxmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pO2lmKC0xIT09biYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2RyYWdEYXRhPXt0YWI6ZVtuXSxpbmRleDpuLHByZXNzWDp0LmNsaWVudFgscHJlc3NZOnQuY2xpZW50WSx0YWJQb3M6LTEsdGFiU2l6ZTotMSx0YWJQcmVzc1BvczotMSx0YXJnZXRJbmRleDotMSx0YWJMYXlvdXQ6bnVsbCxjb250ZW50UmVjdDpudWxsLG92ZXJyaWRlOm51bGwsZHJhZ0FjdGl2ZTohMSxkcmFnQWJvcnRlZDohMSxkZXRhY2hSZXF1ZXN0ZWQ6ITF9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLDEhPT10LmJ1dHRvbikpe3ZhciBpPWVbbl0ucXVlcnlTZWxlY3Rvcih0aGlzLnJlbmRlcmVyLmNsb3NlSWNvblNlbGVjdG9yKTtpJiZpLmNvbnRhaW5zKHQudGFyZ2V0KXx8KHRoaXMudGFic01vdmFibGUmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKSksdGhpcy5hbGxvd0Rlc2VsZWN0JiZ0aGlzLmN1cnJlbnRJbmRleD09PW4/dGhpcy5jdXJyZW50SW5kZXg9LTE6dGhpcy5jdXJyZW50SW5kZXg9biwtMSE9PXRoaXMuY3VycmVudEluZGV4JiZ0aGlzLl90YWJBY3RpdmF0ZVJlcXVlc3RlZC5lbWl0KHtpbmRleDp0aGlzLmN1cnJlbnRJbmRleCx0aXRsZTp0aGlzLmN1cnJlbnRUaXRsZX0pKX19fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RyYWdEYXRhO2lmKGUpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBuPXRoaXMuY29udGVudE5vZGUuY2hpbGRyZW47aWYoZS5kcmFnQWN0aXZlfHxvLmRyYWdFeGNlZWRlZChlLHQpKXtpZighZS5kcmFnQWN0aXZlKXt2YXIgaT1lLnRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsiaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbj8oZS50YWJQb3M9ZS50YWIub2Zmc2V0TGVmdCxlLnRhYlNpemU9aS53aWR0aCxlLnRhYlByZXNzUG9zPWUucHJlc3NYLWkubGVmdCk6KGUudGFiUG9zPWUudGFiLm9mZnNldFRvcCxlLnRhYlNpemU9aS5oZWlnaHQsZS50YWJQcmVzc1Bvcz1lLnByZXNzWS1pLnRvcCksZS50YWJMYXlvdXQ9by5zbmFwVGFiTGF5b3V0KG4sdGhpcy5fb3JpZW50YXRpb24pLGUuY29udGVudFJlY3Q9dGhpcy5jb250ZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlLm92ZXJyaWRlPXUuRHJhZy5vdmVycmlkZUN1cnNvcigiZGVmYXVsdCIpLGUudGFiLmNsYXNzTGlzdC5hZGQoInAtbW9kLWRyYWdnaW5nIiksdGhpcy5hZGRDbGFzcygicC1tb2QtZHJhZ2dpbmciKSxlLmRyYWdBY3RpdmU9ITB9aWYoIWUuZGV0YWNoUmVxdWVzdGVkJiZvLmRldGFjaEV4Y2VlZGVkKGUsdCkpe2UuZGV0YWNoUmVxdWVzdGVkPSEwO3ZhciByPWUuaW5kZXgscz10LmNsaWVudFgsYT10LmNsaWVudFksYz1uW3JdLGg9dGhpcy5fdGl0bGVzW3JdO2lmKHRoaXMuX3RhYkRldGFjaFJlcXVlc3RlZC5lbWl0KHtpbmRleDpyLHRpdGxlOmgsdGFiOmMsY2xpZW50WDpzLGNsaWVudFk6YX0pLGUuZHJhZ0Fib3J0ZWQpcmV0dXJufW8ubGF5b3V0VGFicyhuLGUsdCx0aGlzLl9vcmllbnRhdGlvbil9fX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZigwPT09dC5idXR0b258fDE9PT10LmJ1dHRvbil7dmFyIG49dGhpcy5fZHJhZ0RhdGE7aWYobil7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcywhMCksIW4uZHJhZ0FjdGl2ZSl7dGhpcy5fZHJhZ0RhdGE9bnVsbDt2YXIgaT10aGlzLmNvbnRlbnROb2RlLmNoaWxkcmVuLHI9cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleChpLGZ1bmN0aW9uKGUpe3JldHVybiBhLkVsZW1lbnRFeHQuaGl0VGVzdChlLHQuY2xpZW50WCx0LmNsaWVudFkpfSk7aWYociE9PW4uaW5kZXgpcmV0dXJuO3ZhciB1PXRoaXMuX3RpdGxlc1tyXTtpZighdS5jbG9zYWJsZSlyZXR1cm47aWYoMT09PXQuYnV0dG9uKXJldHVybiB2b2lkIHRoaXMuX3RhYkNsb3NlUmVxdWVzdGVkLmVtaXQoe2luZGV4OnIsdGl0bGU6dX0pO3ZhciBoPWlbcl0ucXVlcnlTZWxlY3Rvcih0aGlzLnJlbmRlcmVyLmNsb3NlSWNvblNlbGVjdG9yKTtyZXR1cm4gaCYmaC5jb250YWlucyh0LnRhcmdldCk/dm9pZCB0aGlzLl90YWJDbG9zZVJlcXVlc3RlZC5lbWl0KHtpbmRleDpyLHRpdGxlOnV9KTp2b2lkIDB9aWYoMD09PXQuYnV0dG9uKXtvLmZpbmFsaXplVGFiUG9zaXRpb24obix0aGlzLl9vcmllbnRhdGlvbiksbi50YWIuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtZHJhZ2dpbmciKTt2YXIgbD1vLnBhcnNlVHJhbnNpdGlvbkR1cmF0aW9uKG4udGFiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIW4uZHJhZ0Fib3J0ZWQpe2UuX2RyYWdEYXRhPW51bGwsby5yZXNldFRhYlBvc2l0aW9ucyhlLmNvbnRlbnROb2RlLmNoaWxkcmVuLGUuX29yaWVudGF0aW9uKSxuLm92ZXJyaWRlLmRpc3Bvc2UoKSxlLnJlbW92ZUNsYXNzKCJwLW1vZC1kcmFnZ2luZyIpO3ZhciB0PW4uaW5kZXgsaT1uLnRhcmdldEluZGV4Oy0xIT09aSYmdCE9PWkmJihzLkFycmF5RXh0Lm1vdmUoZS5fdGl0bGVzLHQsaSksZS5fYWRqdXN0Q3VycmVudEZvck1vdmUodCxpKSxlLl90YWJNb3ZlZC5lbWl0KHtmcm9tSW5kZXg6dCx0b0luZGV4OmksdGl0bGU6ZS5fdGl0bGVzW2ldfSksYy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KSl9fSxsKX19fX0sZS5wcm90b3R5cGUuX3JlbGVhc2VNb3VzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RyYWdEYXRhO3QmJih0aGlzLl9kcmFnRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLHQuZHJhZ0Fib3J0ZWQ9ITAsdC5kcmFnQWN0aXZlJiYoby5yZXNldFRhYlBvc2l0aW9ucyh0aGlzLmNvbnRlbnROb2RlLmNoaWxkcmVuLHRoaXMuX29yaWVudGF0aW9uKSx0Lm92ZXJyaWRlLmRpc3Bvc2UoKSx0LnRhYi5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1kcmFnZ2luZyIpLHRoaXMucmVtb3ZlQ2xhc3MoInAtbW9kLWRyYWdnaW5nIikpKX0sZS5wcm90b3R5cGUuX2FkanVzdEN1cnJlbnRGb3JJbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmN1cnJlbnRUaXRsZSxpPXRoaXMuX2N1cnJlbnRJbmRleCxyPXRoaXMuaW5zZXJ0QmVoYXZpb3I7aWYoInNlbGVjdC10YWIiPT09cnx8InNlbGVjdC10YWItaWYtbmVlZGVkIj09PXImJi0xPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PXQsdGhpcy5fcHJldmlvdXNUaXRsZT1uLHZvaWQgdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDppLHByZXZpb3VzVGl0bGU6bixjdXJyZW50SW5kZXg6dCxjdXJyZW50VGl0bGU6ZX0pO2k+PXQmJnRoaXMuX2N1cnJlbnRJbmRleCsrfSxlLnByb3RvdHlwZS5fYWRqdXN0Q3VycmVudEZvck1vdmU9ZnVuY3Rpb24odCxlKXt0aGlzLl9jdXJyZW50SW5kZXg9PT10P3RoaXMuX2N1cnJlbnRJbmRleD1lOnRoaXMuX2N1cnJlbnRJbmRleDx0JiZ0aGlzLl9jdXJyZW50SW5kZXg+PWU/dGhpcy5fY3VycmVudEluZGV4Kys6dGhpcy5fY3VycmVudEluZGV4PnQmJnRoaXMuX2N1cnJlbnRJbmRleDw9ZSYmdGhpcy5fY3VycmVudEluZGV4LS19LGUucHJvdG90eXBlLl9hZGp1c3RDdXJyZW50Rm9yUmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY3VycmVudEluZGV4LGk9dGhpcy5yZW1vdmVCZWhhdmlvcjtpZihuPT09dCl7aWYoMD09PXRoaXMuX3RpdGxlcy5sZW5ndGgpcmV0dXJuIHRoaXMuX2N1cnJlbnRJbmRleD0tMSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4Oi0xLGN1cnJlbnRUaXRsZTpudWxsfSk7aWYoInNlbGVjdC10YWItYWZ0ZXIiPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PU1hdGgubWluKHQsdGhpcy5fdGl0bGVzLmxlbmd0aC0xKSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4OnRoaXMuX2N1cnJlbnRJbmRleCxjdXJyZW50VGl0bGU6dGhpcy5jdXJyZW50VGl0bGV9KTtpZigic2VsZWN0LXRhYi1iZWZvcmUiPT09aSlyZXR1cm4gdGhpcy5fY3VycmVudEluZGV4PU1hdGgubWF4KDAsdC0xKSx2b2lkIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1RpdGxlOmUsY3VycmVudEluZGV4OnRoaXMuX2N1cnJlbnRJbmRleCxjdXJyZW50VGl0bGU6dGhpcy5jdXJyZW50VGl0bGV9KTtpZigic2VsZWN0LXByZXZpb3VzLXRhYiI9PT1pKXJldHVybiB0aGlzLl9wcmV2aW91c1RpdGxlPyh0aGlzLl9jdXJyZW50SW5kZXg9dGhpcy5fdGl0bGVzLmluZGV4T2YodGhpcy5fcHJldmlvdXNUaXRsZSksdGhpcy5fcHJldmlvdXNUaXRsZT1udWxsKTp0aGlzLl9jdXJyZW50SW5kZXg9TWF0aC5taW4odCx0aGlzLl90aXRsZXMubGVuZ3RoLTEpLHZvaWQgdGhpcy5fY3VycmVudENoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDp0LHByZXZpb3VzVGl0bGU6ZSxjdXJyZW50SW5kZXg6dGhpcy5fY3VycmVudEluZGV4LGN1cnJlbnRUaXRsZTp0aGlzLmN1cnJlbnRUaXRsZX0pO3RoaXMuX2N1cnJlbnRJbmRleD0tMSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNUaXRsZTplLGN1cnJlbnRJbmRleDotMSxjdXJyZW50VGl0bGU6bnVsbH0pfWVsc2Ugbj50JiZ0aGlzLl9jdXJyZW50SW5kZXgtLX0sZS5wcm90b3R5cGUuX29uVGl0bGVDaGFuZ2VkPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlKCl9LGV9KGYuV2lkZ2V0KTtlLlRhYkJhcj1wLGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuY2xvc2VJY29uU2VsZWN0b3I9Ii5wLVRhYkJhci10YWJDbG9zZUljb24iLHRoaXMuX3RhYklEPTAsdGhpcy5fdGFiS2V5cz1uZXcgV2Vha01hcH1yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyVGFiPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGl0bGUuY2FwdGlvbixuPXRoaXMuY3JlYXRlVGFiS2V5KHQpLGk9dGhpcy5jcmVhdGVUYWJTdHlsZSh0KSxyPXRoaXMuY3JlYXRlVGFiQ2xhc3ModCksbz10aGlzLmNyZWF0ZVRhYkRhdGFzZXQodCk7cmV0dXJuIGwuaC5saSh7a2V5Om4sY2xhc3NOYW1lOnIsdGl0bGU6ZSxzdHlsZTppLGRhdGFzZXQ6b30sdGhpcy5yZW5kZXJJY29uKHQpLHRoaXMucmVuZGVyTGFiZWwodCksdGhpcy5yZW5kZXJDbG9zZUljb24odCkpfSx0LnByb3RvdHlwZS5yZW5kZXJJY29uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3JlYXRlSWNvbkNsYXNzKHQpO3JldHVybiBsLmguZGl2KHtjbGFzc05hbWU6ZX0sdC50aXRsZS5pY29uTGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLVRhYkJhci10YWJMYWJlbCJ9LHQudGl0bGUubGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJDbG9zZUljb249ZnVuY3Rpb24odCl7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1UYWJCYXItdGFiQ2xvc2VJY29uIn0pfSx0LnByb3RvdHlwZS5jcmVhdGVUYWJLZXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGFiS2V5cy5nZXQodC50aXRsZSk7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0YWIta2V5LSIrdGhpcy5fdGFiSUQrKyx0aGlzLl90YWJLZXlzLnNldCh0LnRpdGxlLGUpKSxlfSx0LnByb3RvdHlwZS5jcmVhdGVUYWJTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm57ekluZGV4OiIiK3QuekluZGV4fX0sdC5wcm90b3R5cGUuY3JlYXRlVGFiQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtVGFiQmFyLXRhYiI7cmV0dXJuIHQudGl0bGUuY2xhc3NOYW1lJiYoZSs9IiAiK3QudGl0bGUuY2xhc3NOYW1lKSx0LnRpdGxlLmNsb3NhYmxlJiYoZSs9IiBwLW1vZC1jbG9zYWJsZSIpLHQuY3VycmVudCYmKGUrPSIgcC1tb2QtY3VycmVudCIpLGV9LHQucHJvdG90eXBlLmNyZWF0ZVRhYkRhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGl0bGUuZGF0YXNldH0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLVRhYkJhci10YWJJY29uIixuPXQudGl0bGUuaWNvbkNsYXNzO3JldHVybiBuP2UrIiAiK246ZX0sdH0oKTt0LlJlbmRlcmVyPWUsdC5kZWZhdWx0UmVuZGVyZXI9bmV3IGV9KHA9ZS5UYWJCYXJ8fChlLlRhYkJhcj17fSkpLGUuVGFiQmFyPXAsZnVuY3Rpb24odCl7dC5EUkFHX1RIUkVTSE9MRD01LHQuREVUQUNIX1RIUkVTSE9MRD0yMCx0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJwLVRhYkJhci1jb250ZW50Iix0LmFwcGVuZENoaWxkKGUpLHR9LHQuYXNUaXRsZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGQuVGl0bGU/dDpuZXcgZC5UaXRsZSh0KX0sdC5wYXJzZVRyYW5zaXRpb25EdXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gMWUzKihwYXJzZUZsb2F0KGUudHJhbnNpdGlvbkR1cmF0aW9uKXx8MCl9LHQuc25hcFRhYkxheW91dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgpLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpe3ZhciBvPXRbaV0scz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvKTtuW2ldPSJob3Jpem9udGFsIj09PWU/e3BvczpvLm9mZnNldExlZnQsc2l6ZTpvLm9mZnNldFdpZHRoLG1hcmdpbjpwYXJzZUZsb2F0KHMubWFyZ2luTGVmdCl8fDB9Ontwb3M6by5vZmZzZXRUb3Asc2l6ZTpvLm9mZnNldEhlaWdodCxtYXJnaW46cGFyc2VGbG9hdChzLm1hcmdpblRvcCl8fDB9fXJldHVybiBufSx0LmRyYWdFeGNlZWRlZD1mdW5jdGlvbihlLG4pe3ZhciBpPU1hdGguYWJzKG4uY2xpZW50WC1lLnByZXNzWCkscj1NYXRoLmFicyhuLmNsaWVudFktZS5wcmVzc1kpO3JldHVybiBpPj10LkRSQUdfVEhSRVNIT0xEfHxyPj10LkRSQUdfVEhSRVNIT0xEfSx0LmRldGFjaEV4Y2VlZGVkPWZ1bmN0aW9uKGUsbil7dmFyIGk9ZS5jb250ZW50UmVjdDtyZXR1cm4gbi5jbGllbnRYPGkubGVmdC10LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WD49aS5yaWdodCt0LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WTxpLnRvcC10LkRFVEFDSF9USFJFU0hPTER8fG4uY2xpZW50WT49aS5ib3R0b20rdC5ERVRBQ0hfVEhSRVNIT0xEfSx0LmxheW91dFRhYnM9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbyxzLGE7Imhvcml6b250YWwiPT09aT8ocj1lLnByZXNzWCxvPW4uY2xpZW50WC1lLmNvbnRlbnRSZWN0LmxlZnQscz1uLmNsaWVudFgsYT1lLmNvbnRlbnRSZWN0LndpZHRoKToocj1lLnByZXNzWSxvPW4uY2xpZW50WS1lLmNvbnRlbnRSZWN0LnRvcCxzPW4uY2xpZW50WSxhPWUuY29udGVudFJlY3QuaGVpZ2h0KTtmb3IodmFyIHU9ZS5pbmRleCxjPW8tZS50YWJQcmVzc1BvcyxoPWMrZS50YWJTaXplLGw9MCxkPXQubGVuZ3RoO2w8ZDsrK2wpe3ZhciBmPXZvaWQgMCxwPWUudGFiTGF5b3V0W2xdLG09cC5wb3MrKHAuc2l6ZT4+MSk7aWYobDxlLmluZGV4JiZjPG0pZj1lLnRhYlNpemUrZS50YWJMYXlvdXRbbCsxXS5tYXJnaW4rInB4Iix1PU1hdGgubWluKHUsbCk7ZWxzZSBpZihsPmUuaW5kZXgmJmg+bSlmPS1lLnRhYlNpemUtcC5tYXJnaW4rInB4Iix1PU1hdGgubWF4KHUsbCk7ZWxzZSBpZihsPT09ZS5pbmRleCl7dmFyIGc9cy1yLHY9YS0oZS50YWJQb3MrZS50YWJTaXplKTtmPU1hdGgubWF4KC1lLnRhYlBvcyxNYXRoLm1pbihnLHYpKSsicHgifWVsc2UgZj0iIjsiaG9yaXpvbnRhbCI9PT1pP3RbbF0uc3R5bGUubGVmdD1mOnRbbF0uc3R5bGUudG9wPWZ9ZS50YXJnZXRJbmRleD11fSx0LmZpbmFsaXplVGFiUG9zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbixpO2lmKG49Imhvcml6b250YWwiPT09ZT90LmNvbnRlbnRSZWN0LndpZHRoOnQuY29udGVudFJlY3QuaGVpZ2h0LHQudGFyZ2V0SW5kZXg9PT10LmluZGV4KWk9MDtlbHNlIGlmKHQudGFyZ2V0SW5kZXg+dC5pbmRleClpPShyPXQudGFiTGF5b3V0W3QudGFyZ2V0SW5kZXhdKS5wb3Mrci5zaXplLXQudGFiU2l6ZS10LnRhYlBvcztlbHNle3ZhciByO2k9KHI9dC50YWJMYXlvdXRbdC50YXJnZXRJbmRleF0pLnBvcy10LnRhYlBvc312YXIgbz1uLSh0LnRhYlBvcyt0LnRhYlNpemUpLHM9TWF0aC5tYXgoLXQudGFiUG9zLE1hdGgubWluKGksbykpOyJob3Jpem9udGFsIj09PWU/dC50YWIuc3R5bGUubGVmdD1zKyJweCI6dC50YWIuc3R5bGUudG9wPXMrInB4In0sdC5yZXNldFRhYlBvc2l0aW9ucz1mdW5jdGlvbih0LGUpe3MuZWFjaCh0LGZ1bmN0aW9uKHQpeyJob3Jpem9udGFsIj09PWU/dC5zdHlsZS5sZWZ0PSIiOnQuc3R5bGUudG9wPSIifSl9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxpPWVbMV07cmV0dXJuIDMqKG4raSkvNC1pfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWModCksaT1uWzBdLHM9blsxXSxhPW5ldyBvKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsaSxzKSksdT0wLGg9cz4wP2ktNDppLGw9MDtsPGg7bCs9NCllPXJbdC5jaGFyQ29kZUF0KGwpXTw8MTh8clt0LmNoYXJDb2RlQXQobCsxKV08PDEyfHJbdC5jaGFyQ29kZUF0KGwrMildPDw2fHJbdC5jaGFyQ29kZUF0KGwrMyldLGFbdSsrXT1lPj4xNiYyNTUsYVt1KytdPWU+PjgmMjU1LGFbdSsrXT0yNTUmZTsyPT09cyYmKGU9clt0LmNoYXJDb2RlQXQobCldPDwyfHJbdC5jaGFyQ29kZUF0KGwrMSldPj40LGFbdSsrXT0yNTUmZSk7MT09PXMmJihlPXJbdC5jaGFyQ29kZUF0KGwpXTw8MTB8clt0LmNoYXJDb2RlQXQobCsxKV08PDR8clt0LmNoYXJDb2RlQXQobCsyKV0+PjIsYVt1KytdPWU+PjgmMjU1LGFbdSsrXT0yNTUmZSk7cmV0dXJuIGF9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aCxyPW4lMyxvPVtdLHM9MCxhPW4tcjtzPGE7cys9MTYzODMpby5wdXNoKGgodCxzLHMrMTYzODM+YT9hOnMrMTYzODMpKTsxPT09cj8oZT10W24tMV0sby5wdXNoKGlbZT4+Ml0raVtlPDw0JjYzXSsiPT0iKSk6Mj09PXImJihlPSh0W24tMl08PDgpK3Rbbi0xXSxvLnB1c2goaVtlPj4xMF0raVtlPj40JjYzXStpW2U8PDImNjNdKyI9IikpO3JldHVybiBvLmpvaW4oIiIpfTtmb3IodmFyIGk9W10scj1bXSxvPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LHM9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGE9MCx1PXMubGVuZ3RoO2E8dTsrK2EpaVthXT1zW2FdLHJbcy5jaGFyQ29kZUF0KGEpXT1hO2Z1bmN0aW9uIGModCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49dC5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj1lKSxbbixuPT09ZT8wOjQtbiU0XX1mdW5jdGlvbiBoKHQsZSxuKXtmb3IodmFyIHIsbyxzPVtdLGE9ZTthPG47YSs9MylyPSh0W2FdPDwxNiYxNjcxMTY4MCkrKHRbYSsxXTw8OCY2NTI4MCkrKDI1NSZ0W2ErMl0pLHMucHVzaChpWyhvPXIpPj4xOCY2M10raVtvPj4xMiY2M10raVtvPj42JjYzXStpWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1yWyItIi5jaGFyQ29kZUF0KDApXT02MixyWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7dmFyIGU7dC5nZXRSYW5kb21WYWx1ZXM9KGU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuY3J5cHRvfHx3aW5kb3cubXNDcnlwdG8pfHxuKDE0NSl8fG51bGwpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRSYW5kb21WYWx1ZXM/ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0UmFuZG9tVmFsdWVzKHQpfTplJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yYW5kb21GaWxsU3luYz9mdW5jdGlvbih0KXtyZXR1cm4gZS5yYW5kb21GaWxsU3luYyh0KX06ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmFuZG9tQnl0ZXM/ZnVuY3Rpb24odCl7Zm9yKHZhciBuPWUucmFuZG9tQnl0ZXModC5sZW5ndGgpLGk9MCxyPW4ubGVuZ3RoO2k8cjsrK2kpdFtpXT1uW2ldfTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTAsaT10Lmxlbmd0aDtuPGk7KytuKW4lND09MCYmKGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpPj4+MCksdFtuXT0yNTUmZSxlPj4+PTh9fShlLlJhbmRvbXx8KGUuUmFuZG9tPXt9KSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxKS5CdWZmZXIscj1uKDU5KS5UcmFuc2Zvcm07ZnVuY3Rpb24gbyh0KXtyLmNhbGwodGhpcyksdGhpcy5fYmxvY2s9aS5hbGxvY1Vuc2FmZSh0KSx0aGlzLl9ibG9ja1NpemU9dCx0aGlzLl9ibG9ja09mZnNldD0wLHRoaXMuX2xlbmd0aD1bMCwwLDAsMF0sdGhpcy5fZmluYWxpemVkPSExfW4oMCkobyxyKSxvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1udWxsO3RyeXt0aGlzLnVwZGF0ZSh0LGUpfWNhdGNoKHQpe2k9dH1uKGkpfSxvLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbDt0cnl7dGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpfWNhdGNoKHQpe2U9dH10KGUpfSxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtpZihmdW5jdGlvbih0LGUpe2lmKCFpLmlzQnVmZmVyKHQpJiYic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihlKyIgbXVzdCBiZSBhIHN0cmluZyBvciBhIGJ1ZmZlciIpfSh0LCJEYXRhIiksdGhpcy5fZmluYWxpemVkKXRocm93IG5ldyBFcnJvcigiRGlnZXN0IGFscmVhZHkgY2FsbGVkIik7aS5pc0J1ZmZlcih0KXx8KHQ9aS5mcm9tKHQsZSkpO2Zvcih2YXIgbj10aGlzLl9ibG9jayxyPTA7dGhpcy5fYmxvY2tPZmZzZXQrdC5sZW5ndGgtcj49dGhpcy5fYmxvY2tTaXplOyl7Zm9yKHZhciBvPXRoaXMuX2Jsb2NrT2Zmc2V0O288dGhpcy5fYmxvY2tTaXplOyluW28rK109dFtyKytdO3RoaXMuX3VwZGF0ZSgpLHRoaXMuX2Jsb2NrT2Zmc2V0PTB9Zm9yKDtyPHQubGVuZ3RoOyluW3RoaXMuX2Jsb2NrT2Zmc2V0KytdPXRbcisrXTtmb3IodmFyIHM9MCxhPTgqdC5sZW5ndGg7YT4wOysrcyl0aGlzLl9sZW5ndGhbc10rPWEsKGE9dGhpcy5fbGVuZ3RoW3NdLzQyOTQ5NjcyOTZ8MCk+MCYmKHRoaXMuX2xlbmd0aFtzXS09NDI5NDk2NzI5NiphKTtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sby5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2ZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBhbHJlYWR5IGNhbGxlZCIpO3RoaXMuX2ZpbmFsaXplZD0hMDt2YXIgZT10aGlzLl9kaWdlc3QoKTt2b2lkIDAhPT10JiYoZT1lLnRvU3RyaW5nKHQpKSx0aGlzLl9ibG9jay5maWxsKDApLHRoaXMuX2Jsb2NrT2Zmc2V0PTA7Zm9yKHZhciBuPTA7bjw0Oysrbil0aGlzLl9sZW5ndGhbbl09MDtyZXR1cm4gZX0sby5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX2RpZ2VzdCBpcyBub3QgaW1wbGVtZW50ZWQiKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUsaSl7dmFyIHI9big0Myk7dC5leHBvcnRzPXk7dmFyIG8scz1uKDgzKTt5LlJlYWRhYmxlU3RhdGU9YjtuKDYwKS5FdmVudEVtaXR0ZXI7dmFyIGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSx1PW4oODYpLGM9bigxKS5CdWZmZXIsaD1lLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgbD1uKDMyKTtsLmluaGVyaXRzPW4oMCk7dmFyIGQ9bigxNDcpLGY9dm9pZCAwO2Y9ZCYmZC5kZWJ1Z2xvZz9kLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbigpe307dmFyIHAsbT1uKDE0OCksZz1uKDg3KTtsLmluaGVyaXRzKHksdSk7dmFyIHY9WyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl07ZnVuY3Rpb24gYih0LGUpe3Q9dHx8e307dmFyIGk9ZSBpbnN0YW5jZW9mKG89b3x8bigyNCkpO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLHM9dC5yZWFkYWJsZUhpZ2hXYXRlck1hcmssYT10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6aSYmKHN8fDA9PT1zKT9zOmEsdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmJ1ZmZlcj1uZXcgbSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYocHx8KHA9big2MykuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBwKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24geSh0KXtpZihvPW98fG4oMjQpLCEodGhpcyBpbnN0YW5jZW9mIHkpKXJldHVybiBuZXcgeSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBiKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpKSx1LmNhbGwodGhpcyl9ZnVuY3Rpb24gXyh0LGUsbixpLHIpe3ZhciBvLHM9dC5fcmVhZGFibGVTdGF0ZTtudWxsPT09ZT8ocy5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgbj1lLmRlY29kZXIuZW5kKCk7biYmbi5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKG4pLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aCl9ZS5lbmRlZD0hMCxTKHQpfSh0LHMpKToocnx8KG89ZnVuY3Rpb24odCxlKXt2YXIgbjtpPWUsYy5pc0J1ZmZlcihpKXx8aSBpbnN0YW5jZW9mIGh8fCJzdHJpbmciPT10eXBlb2YgZXx8dm9pZCAwPT09ZXx8dC5vYmplY3RNb2RlfHwobj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3ZhciBpO3JldHVybiBufShzLGUpKSxvP3QuZW1pdCgiZXJyb3IiLG8pOnMub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MD8oInN0cmluZyI9PXR5cGVvZiBlfHxzLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PWMucHJvdG90eXBlfHwoZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5mcm9tKHQpfShlKSksaT9zLmVuZEVtaXR0ZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTp3KHQscyxlLCEwKTpzLmVuZGVkP3QuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSk6KHMucmVhZGluZz0hMSxzLmRlY29kZXImJiFuPyhlPXMuZGVjb2Rlci53cml0ZShlKSxzLm9iamVjdE1vZGV8fDAhPT1lLmxlbmd0aD93KHQscyxlLCExKTpBKHQscykpOncodCxzLGUsITEpKSk6aXx8KHMucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KHMpfWZ1bmN0aW9uIHcodCxlLG4saSl7ZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsbiksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChuKTplLmJ1ZmZlci5wdXNoKG4pLGUubmVlZFJlYWRhYmxlJiZTKHQpKSxBKHQsZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHkucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSkseS5wcm90b3R5cGUuZGVzdHJveT1nLmRlc3Ryb3kseS5wcm90b3R5cGUuX3VuZGVzdHJveT1nLnVuZGVzdHJveSx5LnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSxlKHQpfSx5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBpLm9iamVjdE1vZGU/bj0hMDoic3RyaW5nIj09dHlwZW9mIHQmJigoZT1lfHxpLmRlZmF1bHRFbmNvZGluZykhPT1pLmVuY29kaW5nJiYodD1jLmZyb20odCxlKSxlPSIiKSxuPSEwKSxfKHRoaXMsdCxlLCExLG4pfSx5LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBfKHRoaXMsdCxudWxsLCEwLCExKX0seS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30seS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHB8fChwPW4oNjMpLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgcCh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIHg9ODM4ODYwODtmdW5jdGlvbiBNKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49eD90PXg6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gUyh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoZigiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9yLm5leHRUaWNrKEUsdCk6RSh0KSl9ZnVuY3Rpb24gRSh0KXtmKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLFAodCl9ZnVuY3Rpb24gQSh0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLHIubmV4dFRpY2soQyx0LGUpKX1mdW5jdGlvbiBDKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihmKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxuIT09ZS5sZW5ndGgpOyluPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gayh0KXtmKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gTyh0LGUpe2UucmVhZGluZ3x8KGYoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksUCh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBQKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGYoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gVCh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP249ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KG49ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6bj1mdW5jdGlvbih0LGUsbil7dmFyIGk7dDxlLmhlYWQuZGF0YS5sZW5ndGg/KGk9ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6aT10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpuP2Z1bmN0aW9uKHQsZSl7dmFyIG49ZS5oZWFkLGk9MSxyPW4uZGF0YTt0LT1yLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHM9PT1vLmxlbmd0aD9yKz1vOnIrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIG49Yy5hbGxvY1Vuc2FmZSh0KSxpPWUuaGVhZCxyPTE7aS5kYXRhLmNvcHkobiksdC09aS5kYXRhLmxlbmd0aDtmb3IoO2k9aS5uZXh0Oyl7dmFyIG89aS5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShuLG4ubGVuZ3RoLXQsMCxzKSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsrcixpLm5leHQ/ZS5oZWFkPWkubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9aSxpLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytyfXJldHVybiBlLmxlbmd0aC09cixufSh0LGUpO3JldHVybiBpfSh0LGUuYnVmZmVyLGUuZGVjb2Rlciksbik7dmFyIG59ZnVuY3Rpb24gaih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHIubmV4dFRpY2soSSxlLHQpKX1mdW5jdGlvbiBJKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBMKHQsZSl7Zm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfXkucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7ZigicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLG49dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gZigicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/aih0aGlzKTpTKHRoaXMpLG51bGw7aWYoMD09PSh0PU0odCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmaih0aGlzKSxudWxsO3ZhciBpLHI9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGYoIm5lZWQgcmVhZGFibGUiLHIpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmZigibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLHI9ITApLGUuZW5kZWR8fGUucmVhZGluZz9mKCJyZWFkaW5nIG9yIGVuZGVkIixyPSExKTpyJiYoZigiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1NKG4sZSkpKSxudWxsPT09KGk9dD4wP1QodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLG4hPT10JiZlLmVuZGVkJiZqKHRoaXMpKSxudWxsIT09aSYmdGhpcy5lbWl0KCJkYXRhIixpKSxpfSx5LnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSx5LnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG8ucGlwZXNDb3VudCl7Y2FzZSAwOm8ucGlwZXM9dDticmVhaztjYXNlIDE6by5waXBlcz1bby5waXBlcyx0XTticmVhaztkZWZhdWx0Om8ucGlwZXMucHVzaCh0KX1vLnBpcGVzQ291bnQrPTEsZigicGlwZSBjb3VudD0lZCBvcHRzPSVqIixvLnBpcGVzQ291bnQsZSk7dmFyIHU9KCFlfHwhMSE9PWUuZW5kKSYmdCE9PWkuc3Rkb3V0JiZ0IT09aS5zdGRlcnI/aDp5O2Z1bmN0aW9uIGMoZSxpKXtmKCJvbnVucGlwZSIpLGU9PT1uJiZpJiYhMT09PWkuaGFzVW5waXBlZCYmKGkuaGFzVW5waXBlZD0hMCxmKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHYpLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsYiksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGwpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixnKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLGMpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsaCksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIix5KSxuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixtKSxkPSEwLCFvLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8bCgpKX1mdW5jdGlvbiBoKCl7Zigib25lbmQiKSx0LmVuZCgpfW8uZW5kRW1pdHRlZD9yLm5leHRUaWNrKHUpOm4ub25jZSgiZW5kIix1KSx0Lm9uKCJ1bnBpcGUiLGMpO3ZhciBsPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZigicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZhKHQsImRhdGEiKSYmKGUuZmxvd2luZz0hMCxQKHQpKX19KG4pO3Qub24oImRyYWluIixsKTt2YXIgZD0hMTt2YXIgcD0hMTtmdW5jdGlvbiBtKGUpe2YoIm9uZGF0YSIpLHA9ITEsITEhPT10LndyaXRlKGUpfHxwfHwoKDE9PT1vLnBpcGVzQ291bnQmJm8ucGlwZXM9PT10fHxvLnBpcGVzQ291bnQ+MSYmLTEhPT1MKG8ucGlwZXMsdCkpJiYhZCYmKGYoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsbi5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxuLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxwPSEwKSxuLnBhdXNlKCkpfWZ1bmN0aW9uIGcoZSl7Zigib25lcnJvciIsZSkseSgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixnKSwwPT09YSh0LCJlcnJvciIpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiB2KCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixiKSx5KCl9ZnVuY3Rpb24gYigpe2YoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHYpLHkoKX1mdW5jdGlvbiB5KCl7ZigidW5waXBlIiksbi51bnBpcGUodCl9cmV0dXJuIG4ub24oImRhdGEiLG0pLGZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUsbik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/cyh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KG4pOnQuX2V2ZW50c1tlXT1bbix0Ll9ldmVudHNbZV1dOnQub24oZSxuKX0odCwiZXJyb3IiLGcpLHQub25jZSgiY2xvc2UiLHYpLHQub25jZSgiZmluaXNoIixiKSx0LmVtaXQoInBpcGUiLG4pLG8uZmxvd2luZ3x8KGYoInBpcGUgcmVzdW1lIiksbi5yZXN1bWUoKSksdH0seS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsbj17aGFzVW5waXBlZDohMX07aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlcz90aGlzOih0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzLG4pLHRoaXMpO2lmKCF0KXt2YXIgaT1lLnBpcGVzLHI9ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBvPTA7bzxyO28rKylpW29dLmVtaXQoInVucGlwZSIsdGhpcyxuKTtyZXR1cm4gdGhpc312YXIgcz1MKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1zP3RoaXM6KGUucGlwZXMuc3BsaWNlKHMsMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzLG4pLHRoaXMpfSx5LnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciBuPXUucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLmVuZEVtaXR0ZWR8fGkucmVhZGFibGVMaXN0ZW5pbmd8fChpLnJlYWRhYmxlTGlzdGVuaW5nPWkubmVlZFJlYWRhYmxlPSEwLGkuZW1pdHRlZFJlYWRhYmxlPSExLGkucmVhZGluZz9pLmxlbmd0aCYmUyh0aGlzKTpyLm5leHRUaWNrKGssdGhpcykpfXJldHVybiBufSx5LnByb3RvdHlwZS5hZGRMaXN0ZW5lcj15LnByb3RvdHlwZS5vbix5LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChmKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHIubmV4dFRpY2soTyx0LGUpKX0odGhpcyx0KSksdGhpc30seS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gZigiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoZigicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSx5LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlLGk9ITE7Zm9yKHZhciByIGluIHQub24oImVuZCIsZnVuY3Rpb24oKXtpZihmKCJ3cmFwcGVkIGVuZCIpLG4uZGVjb2RlciYmIW4uZW5kZWQpe3ZhciB0PW4uZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmZS5wdXNoKHQpfWUucHVzaChudWxsKX0pLHQub24oImRhdGEiLGZ1bmN0aW9uKHIpeyhmKCJ3cmFwcGVkIGRhdGEiKSxuLmRlY29kZXImJihyPW4uZGVjb2Rlci53cml0ZShyKSksbi5vYmplY3RNb2RlJiZudWxsPT1yKXx8KG4ub2JqZWN0TW9kZXx8ciYmci5sZW5ndGgpJiYoZS5wdXNoKHIpfHwoaT0hMCx0LnBhdXNlKCkpKX0pLHQpdm9pZCAwPT09dGhpc1tyXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0mJih0aGlzW3JdPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KHIpKTtmb3IodmFyIG89MDtvPHYubGVuZ3RoO28rKyl0Lm9uKHZbb10sdGhpcy5lbWl0LmJpbmQodGhpcyx2W29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24oZSl7Zigid3JhcHBlZCBfcmVhZCIsZSksaSYmKGk9ITEsdC5yZXN1bWUoKSl9LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LnByb3RvdHlwZSwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLHkuX2Zyb21MaXN0PVR9KS5jYWxsKHRoaXMsbigxMyksbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjApLkV2ZW50RW1pdHRlcn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDQzKTtmdW5jdGlvbiByKHQsZSl7dC5lbWl0KCJlcnJvciIsZSl9dC5leHBvcnRzPXtkZXN0cm95OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLHM9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG98fHM/KGU/ZSh0KTohdHx8dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fGkubmV4dFRpY2socix0aGlzLHQpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveSh0fHxudWxsLGZ1bmN0aW9uKHQpeyFlJiZ0PyhpLm5leHRUaWNrKHIsbix0KSxuLl93cml0YWJsZVN0YXRlJiYobi5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITApKTplJiZlKHQpfSksdGhpcyl9LHVuZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPXM7dmFyIGk9bigyNCkscj1uKDMyKTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIndyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1lJiZ0aGlzLnB1c2goZSksaSh0KTt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3IucmVhZGluZz0hMSwoci5uZWVkUmVhZGFibGV8fHIubGVuZ3RoPHIuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoci5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBzKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHMpKXJldHVybiBuZXcgcyh0KTtpLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06by5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixhKX1mdW5jdGlvbiBhKCl7dmFyIHQ9dGhpczsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goZnVuY3Rpb24oZSxuKXt1KHQsZSxuKX0pOnUodGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIHUodCxlLG4pe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO2lmKG51bGwhPW4mJnQucHVzaChuKSx0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKHQuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfXIuaW5oZXJpdHM9bigwKSxyLmluaGVyaXRzKHMsaSkscy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLGkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LHMucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3Rocm93IG5ldyBFcnJvcigiX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxzLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKGkud3JpdGVjYj1uLGkud3JpdGVjaHVuaz10LGkud3JpdGVlbmNvZGluZz1lLCFpLnRyYW5zZm9ybWluZyl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTsoaS5uZWVkVHJhbnNmb3JtfHxyLm5lZWRSZWFkYWJsZXx8ci5sZW5ndGg8ci5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChyLmhpZ2hXYXRlck1hcmspfX0scy5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LHMucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsdCxmdW5jdGlvbih0KXtlKHQpLG4uZW1pdCgiY2xvc2UiKX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDI4KSxvPW4oMSkuQnVmZmVyLHM9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0sYT1uZXcgQXJyYXkoNjQpO2Z1bmN0aW9uIHUoKXt0aGlzLmluaXQoKSx0aGlzLl93PWEsci5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGModCxlLG4pe3JldHVybiBuXnQmKGVebil9ZnVuY3Rpb24gaCh0LGUsbil7cmV0dXJuIHQmZXxuJih0fGUpfWZ1bmN0aW9uIGwodCl7cmV0dXJuKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKX1mdW5jdGlvbiBkKHQpe3JldHVybih0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KX1mdW5jdGlvbiBmKHQpe3JldHVybih0Pj4+N3x0PDwyNSleKHQ+Pj4xOHx0PDwxNCledD4+PjN9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzc5MDMzNzAzLHRoaXMuX2I9MzE0NDEzNDI3Nyx0aGlzLl9jPTEwMTM5MDQyNDIsdGhpcy5fZD0yNzczNDgwNzYyLHRoaXMuX2U9MTM1OTg5MzExOSx0aGlzLl9mPTI2MDA4MjI5MjQsdGhpcy5fZz01Mjg3MzQ2MzUsdGhpcy5faD0xNTQxNDU5MjI1LHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxpPTB8dGhpcy5fYSxyPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxhPTB8dGhpcy5fZCx1PTB8dGhpcy5fZSxwPTB8dGhpcy5fZixtPTB8dGhpcy5fZyxnPTB8dGhpcy5faCx2PTA7djwxNjsrK3Ypblt2XT10LnJlYWRJbnQzMkJFKDQqdik7Zm9yKDt2PDY0OysrdiluW3ZdPTB8KCgoZT1uW3YtMl0pPj4+MTd8ZTw8MTUpXihlPj4+MTl8ZTw8MTMpXmU+Pj4xMCkrblt2LTddK2Yoblt2LTE1XSkrblt2LTE2XTtmb3IodmFyIGI9MDtiPDY0OysrYil7dmFyIHk9ZytkKHUpK2ModSxwLG0pK3NbYl0rbltiXXwwLF89bChpKStoKGkscixvKXwwO2c9bSxtPXAscD11LHU9YSt5fDAsYT1vLG89cixyPWksaT15K198MH10aGlzLl9hPWkrdGhpcy5fYXwwLHRoaXMuX2I9cit0aGlzLl9ifDAsdGhpcy5fYz1vK3RoaXMuX2N8MCx0aGlzLl9kPWErdGhpcy5fZHwwLHRoaXMuX2U9dSt0aGlzLl9lfDAsdGhpcy5fZj1wK3RoaXMuX2Z8MCx0aGlzLl9nPW0rdGhpcy5fZ3wwLHRoaXMuX2g9Zyt0aGlzLl9ofDB9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9by5hbGxvY1Vuc2FmZSgzMik7cmV0dXJuIHQud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCksdC53cml0ZUludDMyQkUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2gsMjgpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMjgpLG89bigxKS5CdWZmZXIscz1bMTExNjM1MjQwOCwzNjA5NzY3NDU4LDE4OTk0NDc0NDEsNjAyODkxNzI1LDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSwzOTIxMDA5NTczLDIxNzMyOTU1NDgsOTYxOTg3MTYzLDQwODE2Mjg0NzIsMTUwODk3MDk5MywzMDUzODM0MjY1LDI0NTM2MzU3NDgsMjkzNzY3MTU3OSwyODcwNzYzMjIxLDM2NjQ2MDk1NjAsMzYyNDM4MTA4MCwyNzM0ODgzMzk0LDMxMDU5ODQwMSwxMTY0OTk2NTQyLDYwNzIyNTI3OCwxMzIzNjEwNzY0LDE0MjY4ODE5ODcsMzU5MDMwNDk5NCwxOTI1MDc4Mzg4LDQwNjgxODIzODMsMjE2MjA3ODIwNiw5OTEzMzYxMTMsMjYxNDg4ODEwMyw2MzM4MDMzMTcsMzI0ODIyMjU4MCwzNDc5Nzc0ODY4LDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCw0MDIyMjI0Nzc0LDk0NDcxMTEzOSwyNjQzNDcwNzgsMjM0MTI2Mjc3Myw2MDQ4MDc2MjgsMjAwNzgwMDkzMyw3NzAyNTU5ODMsMTQ5NTk5MDkwMSwxMjQ5MTUwMTIyLDE4NTY0MzEyMzUsMTU1NTA4MTY5MiwzMTc1MjE4MTMyLDE5OTYwNjQ5ODYsMjE5ODk1MDgzNywyNTU0MjIwODgyLDM5OTk3MTkzMzksMjgyMTgzNDM0OSw3NjY3ODQwMTYsMjk1Mjk5NjgwOCwyNTY2NTk0ODc5LDMyMTAzMTM2NzEsMzIwMzMzNzk1NiwzMzM2NTcxODkxLDEwMzQ0NTcwMjYsMzU4NDUyODcxMSwyNDY2OTQ4OTAxLDExMzkyNjk5MywzNzU4MzI2MzgzLDMzODI0MTg5NSwxNjg3MTc5MzYsNjY2MzA3MjA1LDExODgxNzk5NjQsNzczNTI5OTEyLDE1NDYwNDU3MzQsMTI5NDc1NzM3MiwxNTIyODA1NDg1LDEzOTYxODIyOTEsMjY0MzgzMzgyMywxNjk1MTgzNzAwLDIzNDM1MjczOTAsMTk4NjY2MTA1MSwxMDE0NDc3NDgwLDIxNzcwMjYzNTAsMTIwNjc1OTE0MiwyNDU2OTU2MDM3LDM0NDA3NzYyNywyNzMwNDg1OTIxLDEyOTA4NjM0NjAsMjgyMDMwMjQxMSwzMTU4NDU0MjczLDMyNTk3MzA4MDAsMzUwNTk1MjY1NywzMzQ1NzY0NzcxLDEwNjIxNzAwOCwzNTE2MDY1ODE3LDM2MDYwMDgzNDQsMzYwMDM1MjgwNCwxNDMyNzI1Nzc2LDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCwyNzU0MjMzNDQsODUxMTY5NzIwLDQzMDIyNzczNCwzMTAwODIzNzUyLDUwNjk0ODYxNiwxMzYzMjU4MTk1LDY1OTA2MDU1NiwzNzUwNjg1NTkzLDg4Mzk5Nzg3NywzNzg1MDUwMjgwLDk1ODEzOTU3MSwzMzE4MzA3NDI3LDEzMjI4MjIyMTgsMzgxMjcyMzQwMywxNTM3MDAyMDYzLDIwMDMwMzQ5OTUsMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5LDE5NTU1NjIyMjIsMTU3NTk5MDAxMiwyMDI0MTA0ODE1LDExMjU1OTI5MjgsMjIyNzczMDQ1MiwyNzE2OTA0MzA2LDIzNjE4NTI0MjQsNDQyNzc2MDQ0LDI0Mjg0MzY0NzQsNTkzNjk4MzQ0LDI3NTY3MzQxODcsMzczMzExMDI0OSwzMjA0MDMxNDc5LDI5OTkzNTE1NzMsMzMyOTMyNTI5OCwzODE1OTIwNDI3LDMzOTE1Njk2MTQsMzkyODM4MzkwMCwzNTE1MjY3MjcxLDU2NjI4MDcxMSwzOTQwMTg3NjA2LDM0NTQwNjk1MzQsNDExODYzMDI3MSw0MDAwMjM5OTkyLDExNjQxODQ3NCwxOTE0MTM4NTU0LDE3NDI5MjQyMSwyNzMxMDU1MjcwLDI4OTM4MDM1NiwzMjAzOTkzMDA2LDQ2MDM5MzI2OSwzMjA2MjAzMTUsNjg1NDcxNzMzLDU4NzQ5NjgzNiw4NTIxNDI5NzEsMTA4Njc5Mjg1MSwxMDE3MDM2Mjk4LDM2NTU0MzEwMCwxMTI2MDAwNTgwLDI2MTgyOTc2NzYsMTI4ODAzMzQ3MCwzNDA5ODU1MTU4LDE1MDE1MDU5NDgsNDIzNDUwOTg2NiwxNjA3MTY3OTE1LDk4NzE2NzQ2OCwxODE2NDAyMzE2LDEyNDYxODk1OTFdLGE9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxyLmNhbGwodGhpcywxMjgsMTEyKX1mdW5jdGlvbiBjKHQsZSxuKXtyZXR1cm4gbl50JihlXm4pfWZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiB0JmV8biYodHxlKX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuKHQ+Pj4yOHxlPDw0KV4oZT4+PjJ8dDw8MzApXihlPj4+N3x0PDwyNSl9ZnVuY3Rpb24gZCh0LGUpe3JldHVybih0Pj4+MTR8ZTw8MTgpXih0Pj4+MTh8ZTw8MTQpXihlPj4+OXx0PDwyMyl9ZnVuY3Rpb24gZih0LGUpe3JldHVybih0Pj4+MXxlPDwzMSleKHQ+Pj44fGU8PDI0KV50Pj4+N31mdW5jdGlvbiBwKHQsZSl7cmV0dXJuKHQ+Pj4xfGU8PDMxKV4odD4+Pjh8ZTw8MjQpXih0Pj4+N3xlPDwyNSl9ZnVuY3Rpb24gbSh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyledD4+PjZ9ZnVuY3Rpb24gZyh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyleKHQ+Pj42fGU8PDI2KX1mdW5jdGlvbiB2KHQsZSl7cmV0dXJuIHQ+Pj4wPGU+Pj4wPzE6MH1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0xNzc5MDMzNzAzLHRoaXMuX2JoPTMxNDQxMzQyNzcsdGhpcy5fY2g9MTAxMzkwNDI0Mix0aGlzLl9kaD0yNzczNDgwNzYyLHRoaXMuX2VoPTEzNTk4OTMxMTksdGhpcy5fZmg9MjYwMDgyMjkyNCx0aGlzLl9naD01Mjg3MzQ2MzUsdGhpcy5faGg9MTU0MTQ1OTIyNSx0aGlzLl9hbD00MDg5MjM1NzIwLHRoaXMuX2JsPTIyMjc4NzM1OTUsdGhpcy5fY2w9NDI3MTE3NTcyMyx0aGlzLl9kbD0xNTk1NzUwMTI5LHRoaXMuX2VsPTI5MTc1NjUxMzcsdGhpcy5fZmw9NzI1NTExMTk5LHRoaXMuX2dsPTQyMTUzODk1NDcsdGhpcy5faGw9MzI3MDMzMjA5LHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3csbj0wfHRoaXMuX2FoLGk9MHx0aGlzLl9iaCxyPTB8dGhpcy5fY2gsbz0wfHRoaXMuX2RoLGE9MHx0aGlzLl9laCx1PTB8dGhpcy5fZmgsYj0wfHRoaXMuX2doLHk9MHx0aGlzLl9oaCxfPTB8dGhpcy5fYWwsdz0wfHRoaXMuX2JsLHg9MHx0aGlzLl9jbCxNPTB8dGhpcy5fZGwsUz0wfHRoaXMuX2VsLEU9MHx0aGlzLl9mbCxBPTB8dGhpcy5fZ2wsQz0wfHRoaXMuX2hsLGs9MDtrPDMyO2srPTIpZVtrXT10LnJlYWRJbnQzMkJFKDQqayksZVtrKzFdPXQucmVhZEludDMyQkUoNCprKzQpO2Zvcig7azwxNjA7ays9Mil7dmFyIE89ZVtrLTMwXSxQPWVbay0zMCsxXSxUPWYoTyxQKSxqPXAoUCxPKSxJPW0oTz1lW2stNF0sUD1lW2stNCsxXSksTD1nKFAsTyksQj1lW2stMTRdLEQ9ZVtrLTE0KzFdLFI9ZVtrLTMyXSx6PWVbay0zMisxXSxOPWorRHwwLFc9VCtCK3YoTixqKXwwO1c9KFc9VytJK3YoTj1OK0x8MCxMKXwwKStSK3YoTj1OK3p8MCx6KXwwLGVba109VyxlW2srMV09Tn1mb3IodmFyIHE9MDtxPDE2MDtxKz0yKXtXPWVbcV0sTj1lW3ErMV07dmFyIEg9aChuLGksciksRj1oKF8sdyx4KSxWPWwobixfKSxVPWwoXyxuKSxLPWQoYSxTKSxZPWQoUyxhKSxYPXNbcV0sJD1zW3ErMV0sRz1jKGEsdSxiKSxKPWMoUyxFLEEpLFo9QytZfDAsUT15K0srdihaLEMpfDA7UT0oUT0oUT1RK0crdihaPVorSnwwLEopfDApK1grdihaPVorJHwwLCQpfDApK1crdihaPVorTnwwLE4pfDA7dmFyIHR0PVUrRnwwLGV0PVYrSCt2KHR0LFUpfDA7eT1iLEM9QSxiPXUsQT1FLHU9YSxFPVMsYT1vK1ErdihTPU0rWnwwLE0pfDAsbz1yLE09eCxyPWkseD13LGk9bix3PV8sbj1RK2V0K3YoXz1aK3R0fDAsWil8MH10aGlzLl9hbD10aGlzLl9hbCtffDAsdGhpcy5fYmw9dGhpcy5fYmwrd3wwLHRoaXMuX2NsPXRoaXMuX2NsK3h8MCx0aGlzLl9kbD10aGlzLl9kbCtNfDAsdGhpcy5fZWw9dGhpcy5fZWwrU3wwLHRoaXMuX2ZsPXRoaXMuX2ZsK0V8MCx0aGlzLl9nbD10aGlzLl9nbCtBfDAsdGhpcy5faGw9dGhpcy5faGwrQ3wwLHRoaXMuX2FoPXRoaXMuX2FoK24rdih0aGlzLl9hbCxfKXwwLHRoaXMuX2JoPXRoaXMuX2JoK2krdih0aGlzLl9ibCx3KXwwLHRoaXMuX2NoPXRoaXMuX2NoK3Irdih0aGlzLl9jbCx4KXwwLHRoaXMuX2RoPXRoaXMuX2RoK28rdih0aGlzLl9kbCxNKXwwLHRoaXMuX2VoPXRoaXMuX2VoK2Erdih0aGlzLl9lbCxTKXwwLHRoaXMuX2ZoPXRoaXMuX2ZoK3Urdih0aGlzLl9mbCxFKXwwLHRoaXMuX2doPXRoaXMuX2doK2Irdih0aGlzLl9nbCxBKXwwLHRoaXMuX2hoPXRoaXMuX2hoK3krdih0aGlzLl9obCxDKXwwfSx1LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PW8uYWxsb2NVbnNhZmUoNjQpO2Z1bmN0aW9uIGUoZSxuLGkpe3Qud3JpdGVJbnQzMkJFKGUsaSksdC53cml0ZUludDMyQkUobixpKzQpfXJldHVybiBlKHRoaXMuX2FoLHRoaXMuX2FsLDApLGUodGhpcy5fYmgsdGhpcy5fYmwsOCksZSh0aGlzLl9jaCx0aGlzLl9jbCwxNiksZSh0aGlzLl9kaCx0aGlzLl9kbCwyNCksZSh0aGlzLl9laCx0aGlzLl9lbCwzMiksZSh0aGlzLl9maCx0aGlzLl9mbCw0MCksZSh0aGlzLl9naCx0aGlzLl9nbCw0OCksZSh0aGlzLl9oaCx0aGlzLl9obCw1NiksdH0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigwKSxyPW4oMTYxKSxvPW4oMjEpLHM9bigxKS5CdWZmZXIsYT1uKDkyKSx1PW4oNjQpLGM9big2NSksaD1zLmFsbG9jKDEyOCk7ZnVuY3Rpb24gbCh0LGUpe28uY2FsbCh0aGlzLCJkaWdlc3QiKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPXMuZnJvbShlKSk7dmFyIG49InNoYTUxMiI9PT10fHwic2hhMzg0Ij09PXQ/MTI4OjY0Oyh0aGlzLl9hbGc9dCx0aGlzLl9rZXk9ZSxlLmxlbmd0aD5uKT9lPSgicm1kMTYwIj09PXQ/bmV3IHU6Yyh0KSkudXBkYXRlKGUpLmRpZ2VzdCgpOmUubGVuZ3RoPG4mJihlPXMuY29uY2F0KFtlLGhdLG4pKTtmb3IodmFyIGk9dGhpcy5faXBhZD1zLmFsbG9jVW5zYWZlKG4pLHI9dGhpcy5fb3BhZD1zLmFsbG9jVW5zYWZlKG4pLGE9MDthPG47YSsrKWlbYV09NTReZVthXSxyW2FdPTkyXmVbYV07dGhpcy5faGFzaD0icm1kMTYwIj09PXQ/bmV3IHU6Yyh0KSx0aGlzLl9oYXNoLnVwZGF0ZShpKX1pKGwsbyksbC5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9oYXNoLnVwZGF0ZSh0KX0sbC5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faGFzaC5kaWdlc3QoKTtyZXR1cm4oInJtZDE2MCI9PT10aGlzLl9hbGc/bmV3IHU6Yyh0aGlzLl9hbGcpKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKHQpLmRpZ2VzdCgpfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4icm1kMTYwIj09PSh0PXQudG9Mb3dlckNhc2UoKSl8fCJyaXBlbWQxNjAiPT09dD9uZXcgbCgicm1kMTYwIixlKToibWQ1Ij09PXQ/bmV3IHIoYSxlKTpuZXcgbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4obmV3IGkpLnVwZGF0ZSh0KS5kaWdlc3QoKX19LGZ1bmN0aW9uKHQpe3QuZXhwb3J0cz17c2hhMjI0V2l0aFJTQUVuY3J5cHRpb246e3NpZ246InJzYSIsaGFzaDoic2hhMjI0IixpZDoiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMifSwiUlNBLVNIQTIyNCI6e3NpZ246ImVjZHNhL3JzYSIsaGFzaDoic2hhMjI0IixpZDoiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMifSxzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbjp7c2lnbjoicnNhIixoYXNoOiJzaGEyNTYiLGlkOiIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCJ9LCJSU0EtU0hBMjU2Ijp7c2lnbjoiZWNkc2EvcnNhIixoYXNoOiJzaGEyNTYiLGlkOiIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCJ9LHNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uOntzaWduOiJyc2EiLGhhc2g6InNoYTM4NCIsaWQ6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sIlJTQS1TSEEzODQiOntzaWduOiJlY2RzYS9yc2EiLGhhc2g6InNoYTM4NCIsaWQ6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sc2hhNTEyV2l0aFJTQUVuY3J5cHRpb246e3NpZ246InJzYSIsaGFzaDoic2hhNTEyIixpZDoiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAifSwiUlNBLVNIQTUxMiI6e3NpZ246ImVjZHNhL3JzYSIsaGFzaDoic2hhNTEyIixpZDoiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAifSwiUlNBLVNIQTEiOntzaWduOiJyc2EiLGhhc2g6InNoYTEiLGlkOiIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTQifSwiZWNkc2Etd2l0aC1TSEExIjp7c2lnbjoiZWNkc2EiLGhhc2g6InNoYTEiLGlkOiIifSxzaGEyNTY6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEyNTYiLGlkOiIifSxzaGEyMjQ6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEyMjQiLGlkOiIifSxzaGEzODQ6e3NpZ246ImVjZHNhIixoYXNoOiJzaGEzODQiLGlkOiIifSxzaGE1MTI6e3NpZ246ImVjZHNhIixoYXNoOiJzaGE1MTIiLGlkOiIifSwiRFNBLVNIQSI6e3NpZ246ImRzYSIsaGFzaDoic2hhMSIsaWQ6IiJ9LCJEU0EtU0hBMSI6e3NpZ246ImRzYSIsaGFzaDoic2hhMSIsaWQ6IiJ9LERTQTp7c2lnbjoiZHNhIixoYXNoOiJzaGExIixpZDoiIn0sIkRTQS1XSVRILVNIQTIyNCI6e3NpZ246ImRzYSIsaGFzaDoic2hhMjI0IixpZDoiIn0sIkRTQS1TSEEyMjQiOntzaWduOiJkc2EiLGhhc2g6InNoYTIyNCIsaWQ6IiJ9LCJEU0EtV0lUSC1TSEEyNTYiOntzaWduOiJkc2EiLGhhc2g6InNoYTI1NiIsaWQ6IiJ9LCJEU0EtU0hBMjU2Ijp7c2lnbjoiZHNhIixoYXNoOiJzaGEyNTYiLGlkOiIifSwiRFNBLVdJVEgtU0hBMzg0Ijp7c2lnbjoiZHNhIixoYXNoOiJzaGEzODQiLGlkOiIifSwiRFNBLVNIQTM4NCI6e3NpZ246ImRzYSIsaGFzaDoic2hhMzg0IixpZDoiIn0sIkRTQS1XSVRILVNIQTUxMiI6e3NpZ246ImRzYSIsaGFzaDoic2hhNTEyIixpZDoiIn0sIkRTQS1TSEE1MTIiOntzaWduOiJkc2EiLGhhc2g6InNoYTUxMiIsaWQ6IiJ9LCJEU0EtUklQRU1EMTYwIjp7c2lnbjoiZHNhIixoYXNoOiJybWQxNjAiLGlkOiIifSxyaXBlbWQxNjBXaXRoUlNBOntzaWduOiJyc2EiLGhhc2g6InJtZDE2MCIsaWQ6IjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNCJ9LCJSU0EtUklQRU1EMTYwIjp7c2lnbjoicnNhIixoYXNoOiJybWQxNjAiLGlkOiIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTQifSxtZDVXaXRoUlNBRW5jcnlwdGlvbjp7c2lnbjoicnNhIixoYXNoOiJtZDUiLGlkOiIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjA1MDUwMDA0MTAifSwiUlNBLU1ENSI6e3NpZ246InJzYSIsaGFzaDoibWQ1IixpZDoiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwIn19fSxmdW5jdGlvbih0LGUsbil7ZS5wYmtkZjI9bigxNjMpLGUucGJrZGYyU3luYz1uKDk3KX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj1NYXRoLnBvdygyLDMwKS0xO2Z1bmN0aW9uIGkodCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIHQmJiFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IobisiIG11c3QgYmUgYSBidWZmZXIgb3Igc3RyaW5nIil9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyLG8pe2lmKGkodCwiUGFzc3dvcmQiKSxpKGUsIlNhbHQiKSwibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSXRlcmF0aW9ucyBub3QgYSBudW1iZXIiKTtpZihyPDApdGhyb3cgbmV3IFR5cGVFcnJvcigiQmFkIGl0ZXJhdGlvbnMiKTtpZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5IGxlbmd0aCBub3QgYSBudW1iZXIiKTtpZihvPDB8fG8+bnx8byE9byl0aHJvdyBuZXcgVHlwZUVycm9yKCJCYWQga2V5IGxlbmd0aCIpfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIG47ZS5icm93c2VyP249InV0Zi04IjpuPXBhcnNlSW50KGUudmVyc2lvbi5zcGxpdCgiLiIpWzBdLnNsaWNlKDEpLDEwKT49Nj8idXRmLTgiOiJiaW5hcnkiO3QuZXhwb3J0cz1ufSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oOTIpLHI9big2NCksbz1uKDY1KSxzPW4oOTUpLGE9big5NiksdT1uKDEpLkJ1ZmZlcixjPXUuYWxsb2MoMTI4KSxoPXttZDU6MTYsc2hhMToyMCxzaGEyMjQ6Mjgsc2hhMjU2OjMyLHNoYTM4NDo0OCxzaGE1MTI6NjQscm1kMTYwOjIwLHJpcGVtZDE2MDoyMH07ZnVuY3Rpb24gbCh0LGUsbil7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuInJtZDE2MCI9PT10fHwicmlwZW1kMTYwIj09PXQ/ZnVuY3Rpb24odCl7cmV0dXJuKG5ldyByKS51cGRhdGUodCkuZGlnZXN0KCl9OiJtZDUiPT09dD9pOmZ1bmN0aW9uKGUpe3JldHVybiBvKHQpLnVwZGF0ZShlKS5kaWdlc3QoKX19KHQpLGE9InNoYTUxMiI9PT10fHwic2hhMzg0Ij09PXQ/MTI4OjY0O2UubGVuZ3RoPmE/ZT1zKGUpOmUubGVuZ3RoPGEmJihlPXUuY29uY2F0KFtlLGNdLGEpKTtmb3IodmFyIGw9dS5hbGxvY1Vuc2FmZShhK2hbdF0pLGQ9dS5hbGxvY1Vuc2FmZShhK2hbdF0pLGY9MDtmPGE7ZisrKWxbZl09NTReZVtmXSxkW2ZdPTkyXmVbZl07dmFyIHA9dS5hbGxvY1Vuc2FmZShhK24rNCk7bC5jb3B5KHAsMCwwLGEpLHRoaXMuaXBhZDE9cCx0aGlzLmlwYWQyPWwsdGhpcy5vcGFkPWQsdGhpcy5hbGc9dCx0aGlzLmJsb2Nrc2l6ZT1hLHRoaXMuaGFzaD1zLHRoaXMuc2l6ZT1oW3RdfWwucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvcHkoZSx0aGlzLmJsb2Nrc2l6ZSksdGhpcy5oYXNoKGUpLmNvcHkodGhpcy5vcGFkLHRoaXMuYmxvY2tzaXplKSx0aGlzLmhhc2godGhpcy5vcGFkKX0sdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGkscil7cyh0LGUsbixpKSx1LmlzQnVmZmVyKHQpfHwodD11LmZyb20odCxhKSksdS5pc0J1ZmZlcihlKXx8KGU9dS5mcm9tKGUsYSkpO3ZhciBvPW5ldyBsKHI9cnx8InNoYTEiLHQsZS5sZW5ndGgpLGM9dS5hbGxvY1Vuc2FmZShpKSxkPXUuYWxsb2NVbnNhZmUoZS5sZW5ndGgrNCk7ZS5jb3B5KGQsMCwwLGUubGVuZ3RoKTtmb3IodmFyIGY9MCxwPWhbcl0sbT1NYXRoLmNlaWwoaS9wKSxnPTE7Zzw9bTtnKyspe2Qud3JpdGVVSW50MzJCRShnLGUubGVuZ3RoKTtmb3IodmFyIHY9by5ydW4oZCxvLmlwYWQxKSxiPXYseT0xO3k8bjt5Kyspe2I9by5ydW4oYixvLmlwYWQyKTtmb3IodmFyIF89MDtfPHA7XysrKXZbX11ePWJbX119di5jb3B5KGMsZiksZis9cH1yZXR1cm4gY319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDMzKSxyPW4oMSkuQnVmZmVyLG89big5OSk7ZnVuY3Rpb24gcyh0KXt2YXIgZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrUmF3KHQuX3ByZXYpO3JldHVybiBvKHQuX3ByZXYpLGV9ZS5lbmNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jZWlsKGUubGVuZ3RoLzE2KSxvPXQuX2NhY2hlLmxlbmd0aDt0Ll9jYWNoZT1yLmNvbmNhdChbdC5fY2FjaGUsci5hbGxvY1Vuc2FmZSgxNipuKV0pO2Zvcih2YXIgYT0wO2E8bjthKyspe3ZhciB1PXModCksYz1vKzE2KmE7dC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzBdLGMrMCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzFdLGMrNCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzJdLGMrOCksdC5fY2FjaGUud3JpdGVVSW50MzJCRSh1WzNdLGMrMTIpfXZhciBoPXQuX2NhY2hlLnNsaWNlKDAsZS5sZW5ndGgpO3JldHVybiB0Ll9jYWNoZT10Ll9jYWNoZS5zbGljZShlLmxlbmd0aCksaShlLGgpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGg7bi0tOyl7aWYoMjU1IT09KGU9dC5yZWFkVUludDgobikpKXtlKyssdC53cml0ZVVJbnQ4KGUsbik7YnJlYWt9dC53cml0ZVVJbnQ4KDAsbil9fX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPXsiYWVzLTEyOC1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTE5Mi1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjE5MixpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTI1Ni1lY2IiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjowLG1vZGU6IkVDQiIsdHlwZToiYmxvY2sifSwiYWVzLTEyOC1jYmMiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDQkMiLHR5cGU6ImJsb2NrIn0sImFlcy0xOTItY2JjIjp7Y2lwaGVyOiJBRVMiLGtleToxOTIsaXY6MTYsbW9kZToiQ0JDIix0eXBlOiJibG9jayJ9LCJhZXMtMjU2LWNiYyI6e2NpcGhlcjoiQUVTIixrZXk6MjU2LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMxMjg6e2NpcGhlcjoiQUVTIixrZXk6MTI4LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMxOTI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSxhZXMyNTY6e2NpcGhlcjoiQUVTIixrZXk6MjU2LGl2OjE2LG1vZGU6IkNCQyIsdHlwZToiYmxvY2sifSwiYWVzLTEyOC1jZmIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDRkIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLWNmYiI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtY2ZiIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiQ0ZCIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jZmI4Ijp7Y2lwaGVyOiJBRVMiLGtleToxMjgsaXY6MTYsbW9kZToiQ0ZCOCIsdHlwZToic3RyZWFtIn0sImFlcy0xOTItY2ZiOCI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQjgiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjgiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxNixtb2RlOiJDRkI4Iix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jZmIxIjp7Y2lwaGVyOiJBRVMiLGtleToxMjgsaXY6MTYsbW9kZToiQ0ZCMSIsdHlwZToic3RyZWFtIn0sImFlcy0xOTItY2ZiMSI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNGQjEiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjEiOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxNixtb2RlOiJDRkIxIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1vZmIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJPRkIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLW9mYiI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6Ik9GQiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtb2ZiIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiT0ZCIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1jdHIiOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxNixtb2RlOiJDVFIiLHR5cGU6InN0cmVhbSJ9LCJhZXMtMTkyLWN0ciI6e2NpcGhlcjoiQUVTIixrZXk6MTkyLGl2OjE2LG1vZGU6IkNUUiIsdHlwZToic3RyZWFtIn0sImFlcy0yNTYtY3RyIjp7Y2lwaGVyOiJBRVMiLGtleToyNTYsaXY6MTYsbW9kZToiQ1RSIix0eXBlOiJzdHJlYW0ifSwiYWVzLTEyOC1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjEyOCxpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifSwiYWVzLTE5Mi1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjE5MixpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifSwiYWVzLTI1Ni1nY20iOntjaXBoZXI6IkFFUyIsa2V5OjI1NixpdjoxMixtb2RlOiJHQ00iLHR5cGU6ImF1dGgifX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDQ1KSxyPW4oMSkuQnVmZmVyLG89bigyMSkscz1uKDApLGE9bigxNzgpLHU9bigzMyksYz1uKDk5KTtmdW5jdGlvbiBoKHQsZSxuLHMpe28uY2FsbCh0aGlzKTt2YXIgdT1yLmFsbG9jKDQsMCk7dGhpcy5fY2lwaGVyPW5ldyBpLkFFUyhlKTt2YXIgaD10aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHUpO3RoaXMuX2doYXNoPW5ldyBhKGgpLG49ZnVuY3Rpb24odCxlLG4pe2lmKDEyPT09ZS5sZW5ndGgpcmV0dXJuIHQuX2ZpbklEPXIuY29uY2F0KFtlLHIuZnJvbShbMCwwLDAsMV0pXSksci5jb25jYXQoW2Usci5mcm9tKFswLDAsMCwyXSldKTt2YXIgaT1uZXcgYShuKSxvPWUubGVuZ3RoLHM9byUxNjtpLnVwZGF0ZShlKSxzJiYocz0xNi1zLGkudXBkYXRlKHIuYWxsb2MocywwKSkpLGkudXBkYXRlKHIuYWxsb2MoOCwwKSk7dmFyIHU9OCpvLGg9ci5hbGxvYyg4KTtoLndyaXRlVUludEJFKHUsMCw4KSxpLnVwZGF0ZShoKSx0Ll9maW5JRD1pLnN0YXRlO3ZhciBsPXIuZnJvbSh0Ll9maW5JRCk7cmV0dXJuIGMobCksbH0odGhpcyxuLGgpLHRoaXMuX3ByZXY9ci5mcm9tKG4pLHRoaXMuX2NhY2hlPXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fc2VjQ2FjaGU9ci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PXMsdGhpcy5fYWxlbj0wLHRoaXMuX2xlbj0wLHRoaXMuX21vZGU9dCx0aGlzLl9hdXRoVGFnPW51bGwsdGhpcy5fY2FsbGVkPSExfXMoaCxvKSxoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9jYWxsZWQmJnRoaXMuX2FsZW4pe3ZhciBlPTE2LXRoaXMuX2FsZW4lMTY7ZTwxNiYmKGU9ci5hbGxvYyhlLDApLHRoaXMuX2doYXNoLnVwZGF0ZShlKSl9dGhpcy5fY2FsbGVkPSEwO3ZhciBuPXRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLHQpO3JldHVybiB0aGlzLl9kZWNyeXB0P3RoaXMuX2doYXNoLnVwZGF0ZSh0KTp0aGlzLl9naGFzaC51cGRhdGUobiksdGhpcy5fbGVuKz10Lmxlbmd0aCxufSxoLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXtpZih0aGlzLl9kZWNyeXB0JiYhdGhpcy5fYXV0aFRhZyl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSIpO3ZhciB0PXUodGhpcy5fZ2hhc2guZmluYWwoOCp0aGlzLl9hbGVuLDgqdGhpcy5fbGVuKSx0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHRoaXMuX2ZpbklEKSk7aWYodGhpcy5fZGVjcnlwdCYmZnVuY3Rpb24odCxlKXt2YXIgbj0wO3QubGVuZ3RoIT09ZS5sZW5ndGgmJm4rKztmb3IodmFyIGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLHI9MDtyPGk7KytyKW4rPXRbcl1eZVtyXTtyZXR1cm4gbn0odCx0aGlzLl9hdXRoVGFnKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSIpO3RoaXMuX2F1dGhUYWc9dCx0aGlzLl9jaXBoZXIuc2NydWIoKX0saC5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe2lmKHRoaXMuX2RlY3J5cHR8fCFyLmlzQnVmZmVyKHRoaXMuX2F1dGhUYWcpKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKTtyZXR1cm4gdGhpcy5fYXV0aFRhZ30saC5wcm90b3R5cGUuc2V0QXV0aFRhZz1mdW5jdGlvbih0KXtpZighdGhpcy5fZGVjcnlwdCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIik7dGhpcy5fYXV0aFRhZz10fSxoLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FsbGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGluZyB0byBzZXQgQUFEIGluIHVuc3VwcG9ydGVkIHN0YXRlIik7dGhpcy5fZ2hhc2gudXBkYXRlKHQpLHRoaXMuX2FsZW4rPXQubGVuZ3RofSx0LmV4cG9ydHM9aH0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNDUpLHI9bigxKS5CdWZmZXIsbz1uKDIxKTtmdW5jdGlvbiBzKHQsZSxuLHMpe28uY2FsbCh0aGlzKSx0aGlzLl9jaXBoZXI9bmV3IGkuQUVTKGUpLHRoaXMuX3ByZXY9ci5mcm9tKG4pLHRoaXMuX2NhY2hlPXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fc2VjQ2FjaGU9ci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PXMsdGhpcy5fbW9kZT10fW4oMCkocyxvKSxzLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0LHRoaXMuX2RlY3J5cHQpfSxzLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt0aGlzLl9jaXBoZXIuc2NydWIoKX0sdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3KTt0LmV4cG9ydHM9YixiLnNpbXBsZVNpZXZlPWcsYi5mZXJtYXRUZXN0PXY7dmFyIHI9bigzKSxvPW5ldyByKDI0KSxzPW5ldyhuKDEwNCkpLGE9bmV3IHIoMSksdT1uZXcgcigyKSxjPW5ldyByKDUpLGg9KG5ldyByKDE2KSxuZXcgcig4KSxuZXcgcigxMCkpLGw9bmV3IHIoMyksZD0obmV3IHIoNyksbmV3IHIoMTEpKSxmPW5ldyByKDQpLHA9KG5ldyByKDEyKSxudWxsKTtmdW5jdGlvbiBtKCl7aWYobnVsbCE9PXApcmV0dXJuIHA7dmFyIHQ9W107dFswXT0yO2Zvcih2YXIgZT0xLG49MztuPDEwNDg1NzY7bis9Mil7Zm9yKHZhciBpPU1hdGguY2VpbChNYXRoLnNxcnQobikpLHI9MDtyPGUmJnRbcl08PWkmJm4ldFtyXSE9MDtyKyspO2UhPT1yJiZ0W3JdPD1pfHwodFtlKytdPW4pfXJldHVybiBwPXQsdH1mdW5jdGlvbiBnKHQpe2Zvcih2YXIgZT1tKCksbj0wO248ZS5sZW5ndGg7bisrKWlmKDA9PT10Lm1vZG4oZVtuXSkpcmV0dXJuIDA9PT10LmNtcG4oZVtuXSk7cmV0dXJuITB9ZnVuY3Rpb24gdih0KXt2YXIgZT1yLm1vbnQodCk7cmV0dXJuIDA9PT11LnRvUmVkKGUpLnJlZFBvdyh0LnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpfWZ1bmN0aW9uIGIodCxlKXtpZih0PDE2KXJldHVybiBuZXcgcigyPT09ZXx8NT09PWU/WzE0MCwxMjNdOlsxNDAsMzldKTt2YXIgbixwO2ZvcihlPW5ldyByKGUpOzspe2ZvcihuPW5ldyByKGkoTWF0aC5jZWlsKHQvOCkpKTtuLmJpdExlbmd0aCgpPnQ7KW4uaXNocm4oMSk7aWYobi5pc0V2ZW4oKSYmbi5pYWRkKGEpLG4udGVzdG4oMSl8fG4uaWFkZCh1KSxlLmNtcCh1KSl7aWYoIWUuY21wKGMpKWZvcig7bi5tb2QoaCkuY21wKGwpOyluLmlhZGQoZil9ZWxzZSBmb3IoO24ubW9kKG8pLmNtcChkKTspbi5pYWRkKGYpO2lmKGcocD1uLnNocm4oMSkpJiZnKG4pJiZ2KHApJiZ2KG4pJiZzLnRlc3QocCkmJnMudGVzdChuKSlyZXR1cm4gbn19fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzKSxyPW4oMTA1KTtmdW5jdGlvbiBvKHQpe3RoaXMucmFuZD10fHxuZXcgci5SYW5kfXQuZXhwb3J0cz1vLG8uY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX0sby5wcm90b3R5cGUuX3JhbmRiZWxvdz1mdW5jdGlvbih0KXt2YXIgZT10LmJpdExlbmd0aCgpLG49TWF0aC5jZWlsKGUvOCk7ZG97dmFyIHI9bmV3IGkodGhpcy5yYW5kLmdlbmVyYXRlKG4pKX13aGlsZShyLmNtcCh0KT49MCk7cmV0dXJuIHJ9LG8ucHJvdG90eXBlLl9yYW5kcmFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN1Yih0KTtyZXR1cm4gdC5hZGQodGhpcy5fcmFuZGJlbG93KG4pKX0sby5wcm90b3R5cGUudGVzdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5iaXRMZW5ndGgoKSxvPWkubW9udCh0KSxzPW5ldyBpKDEpLnRvUmVkKG8pO2V8fChlPU1hdGgubWF4KDEsci80OHwwKSk7Zm9yKHZhciBhPXQuc3VibigxKSx1PTA7IWEudGVzdG4odSk7dSsrKTtmb3IodmFyIGM9dC5zaHJuKHUpLGg9YS50b1JlZChvKTtlPjA7ZS0tKXt2YXIgbD10aGlzLl9yYW5kcmFuZ2UobmV3IGkoMiksYSk7biYmbihsKTt2YXIgZD1sLnRvUmVkKG8pLnJlZFBvdyhjKTtpZigwIT09ZC5jbXAocykmJjAhPT1kLmNtcChoKSl7Zm9yKHZhciBmPTE7Zjx1O2YrKyl7aWYoMD09PShkPWQucmVkU3FyKCkpLmNtcChzKSlyZXR1cm4hMTtpZigwPT09ZC5jbXAoaCkpYnJlYWt9aWYoZj09PXUpcmV0dXJuITF9fXJldHVybiEwfSxvLnByb3RvdHlwZS5nZXREaXZpc29yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5iaXRMZW5ndGgoKSxyPWkubW9udCh0KSxvPW5ldyBpKDEpLnRvUmVkKHIpO2V8fChlPU1hdGgubWF4KDEsbi80OHwwKSk7Zm9yKHZhciBzPXQuc3VibigxKSxhPTA7IXMudGVzdG4oYSk7YSsrKTtmb3IodmFyIHU9dC5zaHJuKGEpLGM9cy50b1JlZChyKTtlPjA7ZS0tKXt2YXIgaD10aGlzLl9yYW5kcmFuZ2UobmV3IGkoMikscyksbD10LmdjZChoKTtpZigwIT09bC5jbXBuKDEpKXJldHVybiBsO3ZhciBkPWgudG9SZWQocikucmVkUG93KHUpO2lmKDAhPT1kLmNtcChvKSYmMCE9PWQuY21wKGMpKXtmb3IodmFyIGY9MTtmPGE7ZisrKXtpZigwPT09KGQ9ZC5yZWRTcXIoKSkuY21wKG8pKXJldHVybiBkLmZyb21SZWQoKS5zdWJuKDEpLmdjZCh0KTtpZigwPT09ZC5jbXAoYykpYnJlYWt9aWYoZj09PWEpcmV0dXJuKGQ9ZC5yZWRTcXIoKSkuZnJvbVJlZCgpLnN1Ym4oMSkuZ2NkKHQpfX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtmdW5jdGlvbiByKHQpe3RoaXMucmFuZD10fWlmKHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXx8KGk9bmV3IHIobnVsbCkpLGkuZ2VuZXJhdGUodCl9LHQuZXhwb3J0cy5SYW5kPXIsci5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhbmQodCl9LHIucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMucmFuZC5nZXRCeXRlcylyZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKHQpO2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0KSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10aGlzLnJhbmQuZ2V0Qnl0ZSgpO3JldHVybiBlfSwib2JqZWN0Ij09dHlwZW9mIHNlbGYpc2VsZi5jcnlwdG8mJnNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcz9yLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpLGV9OnNlbGYubXNDcnlwdG8mJnNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzP3IucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSxlfToib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKHIucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iil9KTtlbHNlIHRyeXt2YXIgbz1uKDE4Myk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8ucmFuZG9tQnl0ZXMpdGhyb3cgbmV3IEVycm9yKCJOb3Qgc3VwcG9ydGVkIik7ci5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8ucmFuZG9tQnl0ZXModCl9fWNhdGNoKHQpe319LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9ZTtmdW5jdGlvbiByKHQpe3JldHVybiAxPT09dC5sZW5ndGg/IjAiK3Q6dH1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT0iIixuPTA7bjx0Lmxlbmd0aDtuKyspZSs9cih0W25dLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGV9aS50b0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5zbGljZSgpO2lmKCF0KXJldHVybltdO3ZhciBuPVtdO2lmKCJzdHJpbmciIT10eXBlb2YgdCl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspbltpXT0wfHRbaV07cmV0dXJuIG59aWYoImhleCI9PT1lKWZvcigodD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksIiIpKS5sZW5ndGglMiE9MCYmKHQ9IjAiK3QpLGk9MDtpPHQubGVuZ3RoO2krPTIpbi5wdXNoKHBhcnNlSW50KHRbaV0rdFtpKzFdLDE2KSk7ZWxzZSBmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcj10LmNoYXJDb2RlQXQoaSksbz1yPj44LHM9MjU1JnI7bz9uLnB1c2gobyxzKTpuLnB1c2gocyl9cmV0dXJuIG59LGkuemVybzI9cixpLnRvSGV4PW8saS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4iaGV4Ij09PWU/byh0KTp0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KS5yb3RyMzI7ZnVuY3Rpb24gcih0LGUsbil7cmV0dXJuIHQmZV5+dCZufWZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiB0JmVedCZuXmUmbn1mdW5jdGlvbiBzKHQsZSxuKXtyZXR1cm4gdF5lXm59ZS5mdF8xPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiAwPT09dD9yKGUsbixpKToxPT09dHx8Mz09PXQ/cyhlLG4saSk6Mj09PXQ/byhlLG4saSk6dm9pZCAwfSxlLmNoMzI9cixlLm1hajMyPW8sZS5wMzI9cyxlLnMwXzI1Nj1mdW5jdGlvbih0KXtyZXR1cm4gaSh0LDIpXmkodCwxMyleaSh0LDIyKX0sZS5zMV8yNTY9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCw2KV5pKHQsMTEpXmkodCwyNSl9LGUuZzBfMjU2PWZ1bmN0aW9uKHQpe3JldHVybiBpKHQsNyleaSh0LDE4KV50Pj4+M30sZS5nMV8yNTY9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCwxNyleaSh0LDE5KV50Pj4+MTB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTcpLHI9bigzNCksbz1uKDEwNykscz1uKDE0KSxhPWkuc3VtMzIsdT1pLnN1bTMyXzQsYz1pLnN1bTMyXzUsaD1vLmNoMzIsbD1vLm1hajMyLGQ9by5zMF8yNTYsZj1vLnMxXzI1NixwPW8uZzBfMjU2LG09by5nMV8yNTYsZz1yLkJsb2NrSGFzaCx2PVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdO2Z1bmN0aW9uIGIoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBiKSlyZXR1cm4gbmV3IGI7Zy5jYWxsKHRoaXMpLHRoaXMuaD1bMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdLHRoaXMuaz12LHRoaXMuVz1uZXcgQXJyYXkoNjQpfWkuaW5oZXJpdHMoYixnKSx0LmV4cG9ydHM9YixiLmJsb2NrU2l6ZT01MTIsYi5vdXRTaXplPTI1NixiLmhtYWNTdHJlbmd0aD0xOTIsYi5wYWRMZW5ndGg9NjQsYi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLlcsaT0wO2k8MTY7aSsrKW5baV09dFtlK2ldO2Zvcig7aTxuLmxlbmd0aDtpKyspbltpXT11KG0obltpLTJdKSxuW2ktN10scChuW2ktMTVdKSxuW2ktMTZdKTt2YXIgcj10aGlzLmhbMF0sbz10aGlzLmhbMV0sZz10aGlzLmhbMl0sdj10aGlzLmhbM10sYj10aGlzLmhbNF0seT10aGlzLmhbNV0sXz10aGlzLmhbNl0sdz10aGlzLmhbN107Zm9yKHModGhpcy5rLmxlbmd0aD09PW4ubGVuZ3RoKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciB4PWModyxmKGIpLGgoYix5LF8pLHRoaXMua1tpXSxuW2ldKSxNPWEoZChyKSxsKHIsbyxnKSk7dz1fLF89eSx5PWIsYj1hKHYseCksdj1nLGc9byxvPXIscj1hKHgsTSl9dGhpcy5oWzBdPWEodGhpcy5oWzBdLHIpLHRoaXMuaFsxXT1hKHRoaXMuaFsxXSxvKSx0aGlzLmhbMl09YSh0aGlzLmhbMl0sZyksdGhpcy5oWzNdPWEodGhpcy5oWzNdLHYpLHRoaXMuaFs0XT1hKHRoaXMuaFs0XSxiKSx0aGlzLmhbNV09YSh0aGlzLmhbNV0seSksdGhpcy5oWzZdPWEodGhpcy5oWzZdLF8pLHRoaXMuaFs3XT1hKHRoaXMuaFs3XSx3KX0sYi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaCwiYmlnIik6aS5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTcpLHI9bigzNCksbz1uKDE0KSxzPWkucm90cjY0X2hpLGE9aS5yb3RyNjRfbG8sdT1pLnNocjY0X2hpLGM9aS5zaHI2NF9sbyxoPWkuc3VtNjQsbD1pLnN1bTY0X2hpLGQ9aS5zdW02NF9sbyxmPWkuc3VtNjRfNF9oaSxwPWkuc3VtNjRfNF9sbyxtPWkuc3VtNjRfNV9oaSxnPWkuc3VtNjRfNV9sbyx2PXIuQmxvY2tIYXNoLGI9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXTtmdW5jdGlvbiB5KCl7aWYoISh0aGlzIGluc3RhbmNlb2YgeSkpcmV0dXJuIG5ldyB5O3YuY2FsbCh0aGlzKSx0aGlzLmg9WzE3NzkwMzM3MDMsNDA4OTIzNTcyMCwzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUsMTAxMzkwNDI0Miw0MjcxMTc1NzIzLDI3NzM0ODA3NjIsMTU5NTc1MDEyOSwxMzU5ODkzMTE5LDI5MTc1NjUxMzcsMjYwMDgyMjkyNCw3MjU1MTExOTksNTI4NzM0NjM1LDQyMTUzODk1NDcsMTU0MTQ1OTIyNSwzMjcwMzMyMDldLHRoaXMuaz1iLHRoaXMuVz1uZXcgQXJyYXkoMTYwKX1mdW5jdGlvbiBfKHQsZSxuLGkscil7dmFyIG89dCZuXn50JnI7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24gdyh0LGUsbixpLHIsbyl7dmFyIHM9ZSZpXn5lJm87cmV0dXJuIHM8MCYmKHMrPTQyOTQ5NjcyOTYpLHN9ZnVuY3Rpb24geCh0LGUsbixpLHIpe3ZhciBvPXQmbl50JnJebiZyO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIE0odCxlLG4saSxyLG8pe3ZhciBzPWUmaV5lJm9eaSZvO3JldHVybiBzPDAmJihzKz00Mjk0OTY3Mjk2KSxzfWZ1bmN0aW9uIFModCxlKXt2YXIgbj1zKHQsZSwyOClecyhlLHQsMilecyhlLHQsNyk7cmV0dXJuIG48MCYmKG4rPTQyOTQ5NjcyOTYpLG59ZnVuY3Rpb24gRSh0LGUpe3ZhciBuPWEodCxlLDI4KV5hKGUsdCwyKV5hKGUsdCw3KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBBKHQsZSl7dmFyIG49cyh0LGUsMTQpXnModCxlLDE4KV5zKGUsdCw5KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBDKHQsZSl7dmFyIG49YSh0LGUsMTQpXmEodCxlLDE4KV5hKGUsdCw5KTtyZXR1cm4gbjwwJiYobis9NDI5NDk2NzI5Niksbn1mdW5jdGlvbiBrKHQsZSl7dmFyIG49cyh0LGUsMSlecyh0LGUsOCledSh0LGUsNyk7cmV0dXJuIG48MCYmKG4rPTQyOTQ5NjcyOTYpLG59ZnVuY3Rpb24gTyh0LGUpe3ZhciBuPWEodCxlLDEpXmEodCxlLDgpXmModCxlLDcpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWZ1bmN0aW9uIFAodCxlKXt2YXIgbj1zKHQsZSwxOSlecyhlLHQsMjkpXnUodCxlLDYpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWZ1bmN0aW9uIFQodCxlKXt2YXIgbj1hKHQsZSwxOSleYShlLHQsMjkpXmModCxlLDYpO3JldHVybiBuPDAmJihuKz00Mjk0OTY3Mjk2KSxufWkuaW5oZXJpdHMoeSx2KSx0LmV4cG9ydHM9eSx5LmJsb2NrU2l6ZT0xMDI0LHkub3V0U2l6ZT01MTIseS5obWFjU3RyZW5ndGg9MTkyLHkucGFkTGVuZ3RoPTEyOCx5LnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuVyxpPTA7aTwzMjtpKyspbltpXT10W2UraV07Zm9yKDtpPG4ubGVuZ3RoO2krPTIpe3ZhciByPVAobltpLTRdLG5baS0zXSksbz1UKG5baS00XSxuW2ktM10pLHM9bltpLTE0XSxhPW5baS0xM10sdT1rKG5baS0zMF0sbltpLTI5XSksYz1PKG5baS0zMF0sbltpLTI5XSksaD1uW2ktMzJdLGw9bltpLTMxXTtuW2ldPWYocixvLHMsYSx1LGMsaCxsKSxuW2krMV09cChyLG8scyxhLHUsYyxoLGwpfX0seS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3ByZXBhcmVCbG9jayh0LGUpO3ZhciBuPXRoaXMuVyxpPXRoaXMuaFswXSxyPXRoaXMuaFsxXSxzPXRoaXMuaFsyXSxhPXRoaXMuaFszXSx1PXRoaXMuaFs0XSxjPXRoaXMuaFs1XSxmPXRoaXMuaFs2XSxwPXRoaXMuaFs3XSx2PXRoaXMuaFs4XSxiPXRoaXMuaFs5XSx5PXRoaXMuaFsxMF0saz10aGlzLmhbMTFdLE89dGhpcy5oWzEyXSxQPXRoaXMuaFsxM10sVD10aGlzLmhbMTRdLGo9dGhpcy5oWzE1XTtvKHRoaXMuay5sZW5ndGg9PT1uLmxlbmd0aCk7Zm9yKHZhciBJPTA7STxuLmxlbmd0aDtJKz0yKXt2YXIgTD1ULEI9aixEPUEodixiKSxSPUModixiKSx6PV8odixiLHksayxPKSxOPXcodixiLHksayxPLFApLFc9dGhpcy5rW0ldLHE9dGhpcy5rW0krMV0sSD1uW0ldLEY9bltJKzFdLFY9bShMLEIsRCxSLHosTixXLHEsSCxGKSxVPWcoTCxCLEQsUix6LE4sVyxxLEgsRik7TD1TKGksciksQj1FKGksciksRD14KGkscixzLGEsdSksUj1NKGkscixzLGEsdSxjKTt2YXIgSz1sKEwsQixELFIpLFk9ZChMLEIsRCxSKTtUPU8saj1QLE89eSxQPWsseT12LGs9Yix2PWwoZixwLFYsVSksYj1kKHAscCxWLFUpLGY9dSxwPWMsdT1zLGM9YSxzPWksYT1yLGk9bChWLFUsSyxZKSxyPWQoVixVLEssWSl9aCh0aGlzLmgsMCxpLHIpLGgodGhpcy5oLDIscyxhKSxoKHRoaXMuaCw0LHUsYyksaCh0aGlzLmgsNixmLHApLGgodGhpcy5oLDgsdixiKSxoKHRoaXMuaCwxMCx5LGspLGgodGhpcy5oLDEyLE8sUCksaCh0aGlzLmgsMTQsVCxqKX0seS5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaCwiYmlnIik6aS5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMzYpLlJlcG9ydGVyLG89big0KS5CdWZmZXI7ZnVuY3Rpb24gcyh0LGUpe3IuY2FsbCh0aGlzLGUpLG8uaXNCdWZmZXIodCk/KHRoaXMuYmFzZT10LHRoaXMub2Zmc2V0PTAsdGhpcy5sZW5ndGg9dC5sZW5ndGgpOnRoaXMuZXJyb3IoIklucHV0IG5vdCBCdWZmZXIiKX1mdW5jdGlvbiBhKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmxlbmd0aD0wLHRoaXMudmFsdWU9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBhfHwodD1uZXcgYSh0LGUpKSx0aGlzLmxlbmd0aCs9dC5sZW5ndGgsdH0sdGhpcyk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCEoMDw9dCYmdDw9MjU1KSlyZXR1cm4gZS5lcnJvcigibm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZSIpO3RoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD0xfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KXRoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD1vLmJ5dGVMZW5ndGgodCk7ZWxzZXtpZighby5pc0J1ZmZlcih0KSlyZXR1cm4gZS5lcnJvcigiVW5zdXBwb3J0ZWQgdHlwZTogIit0eXBlb2YgdCk7dGhpcy52YWx1ZT10LHRoaXMubGVuZ3RoPXQubGVuZ3RofX1pKHMsciksZS5EZWNvZGVyQnVmZmVyPXMscy5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3JldHVybntvZmZzZXQ6dGhpcy5vZmZzZXQscmVwb3J0ZXI6ci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpfX0scy5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgcyh0aGlzLmJhc2UpO3JldHVybiBlLm9mZnNldD10Lm9mZnNldCxlLmxlbmd0aD10aGlzLm9mZnNldCx0aGlzLm9mZnNldD10Lm9mZnNldCxyLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcyx0LnJlcG9ydGVyKSxlfSxzLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0PT09dGhpcy5sZW5ndGh9LHMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXQrMTw9dGhpcy5sZW5ndGg/dGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCEwKTp0aGlzLmVycm9yKHR8fCJEZWNvZGVyQnVmZmVyIG92ZXJydW4iKX0scy5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcy5vZmZzZXQrdDw9dGhpcy5sZW5ndGgpKXJldHVybiB0aGlzLmVycm9yKGV8fCJEZWNvZGVyQnVmZmVyIG92ZXJydW4iKTt2YXIgbj1uZXcgcyh0aGlzLmJhc2UpO3JldHVybiBuLl9yZXBvcnRlclN0YXRlPXRoaXMuX3JlcG9ydGVyU3RhdGUsbi5vZmZzZXQ9dGhpcy5vZmZzZXQsbi5sZW5ndGg9dGhpcy5vZmZzZXQrdCx0aGlzLm9mZnNldCs9dCxufSxzLnByb3RvdHlwZS5yYXc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYmFzZS5zbGljZSh0P3Qub2Zmc2V0OnRoaXMub2Zmc2V0LHRoaXMubGVuZ3RoKX0sZS5FbmNvZGVyQnVmZmVyPWEsYS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0LGUpe3JldHVybiB0fHwodD1uZXcgbyh0aGlzLmxlbmd0aCkpLGV8fChlPTApLDA9PT10aGlzLmxlbmd0aD90OihBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpP3RoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihuKXtuLmpvaW4odCxlKSxlKz1uLmxlbmd0aH0pOigibnVtYmVyIj09dHlwZW9mIHRoaXMudmFsdWU/dFtlXT10aGlzLnZhbHVlOiJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZT90LndyaXRlKHRoaXMudmFsdWUsZSk6by5pc0J1ZmZlcih0aGlzLnZhbHVlKSYmdGhpcy52YWx1ZS5jb3B5KHQsZSksZSs9dGhpcy5sZW5ndGgpLHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPWU7aS5fcmV2ZXJzZT1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXsoMHxuKT09biYmKG58PTApO3ZhciBpPXRbbl07ZVtpXT1ufSksZX0saS5kZXI9bigyMTUpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMzUpLG89ci5iYXNlLHM9ci5iaWdudW0sYT1yLmNvbnN0YW50cy5kZXI7ZnVuY3Rpb24gdSh0KXt0aGlzLmVuYz0iZGVyIix0aGlzLm5hbWU9dC5uYW1lLHRoaXMuZW50aXR5PXQsdGhpcy50cmVlPW5ldyBjLHRoaXMudHJlZS5faW5pdCh0LmJvZHkpfWZ1bmN0aW9uIGModCl7by5Ob2RlLmNhbGwodGhpcywiZGVyIix0KX1mdW5jdGlvbiBoKHQsZSl7dmFyIG49dC5yZWFkVUludDgoZSk7aWYodC5pc0Vycm9yKG4pKXJldHVybiBuO3ZhciBpPWEudGFnQ2xhc3Nbbj4+Nl0scj0wPT0oMzImbik7aWYoMzE9PSgzMSZuKSl7dmFyIG89bjtmb3Iobj0wOzEyOD09KDEyOCZvKTspe2lmKG89dC5yZWFkVUludDgoZSksdC5pc0Vycm9yKG8pKXJldHVybiBvO248PD03LG58PTEyNyZvfX1lbHNlIG4mPTMxO3JldHVybntjbHM6aSxwcmltaXRpdmU6cix0YWc6bix0YWdTdHI6YS50YWdbbl19fWZ1bmN0aW9uIGwodCxlLG4pe3ZhciBpPXQucmVhZFVJbnQ4KG4pO2lmKHQuaXNFcnJvcihpKSlyZXR1cm4gaTtpZighZSYmMTI4PT09aSlyZXR1cm4gbnVsbDtpZigwPT0oMTI4JmkpKXJldHVybiBpO3ZhciByPTEyNyZpO2lmKHI+NClyZXR1cm4gdC5lcnJvcigibGVuZ3RoIG9jdGVjdCBpcyB0b28gbG9uZyIpO2k9MDtmb3IodmFyIG89MDtvPHI7bysrKXtpPDw9ODt2YXIgcz10LnJlYWRVSW50OChuKTtpZih0LmlzRXJyb3IocykpcmV0dXJuIHM7aXw9c31yZXR1cm4gaX10LmV4cG9ydHM9dSx1LnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uRGVjb2RlckJ1ZmZlcnx8KHQ9bmV3IG8uRGVjb2RlckJ1ZmZlcih0LGUpKSx0aGlzLnRyZWUuX2RlY29kZSh0LGUpfSxpKGMsby5Ob2RlKSxjLnByb3RvdHlwZS5fcGVla1RhZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuITE7dmFyIGk9dC5zYXZlKCkscj1oKHQsJ0ZhaWxlZCB0byBwZWVrIHRhZzogIicrZSsnIicpO3JldHVybiB0LmlzRXJyb3Iocik/cjoodC5yZXN0b3JlKGkpLHIudGFnPT09ZXx8ci50YWdTdHI9PT1lfHxyLnRhZ1N0cisib2YiPT09ZXx8bil9LGMucHJvdG90eXBlLl9kZWNvZGVUYWc9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWgodCwnRmFpbGVkIHRvIGRlY29kZSB0YWcgb2YgIicrZSsnIicpO2lmKHQuaXNFcnJvcihpKSlyZXR1cm4gaTt2YXIgcj1sKHQsaS5wcmltaXRpdmUsJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mICInK2UrJyInKTtpZih0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYoIW4mJmkudGFnIT09ZSYmaS50YWdTdHIhPT1lJiZpLnRhZ1N0cisib2YiIT09ZSlyZXR1cm4gdC5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogIicrZSsnIicpO2lmKGkucHJpbWl0aXZlfHxudWxsIT09cilyZXR1cm4gdC5za2lwKHIsJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiAiJytlKyciJyk7dmFyIG89dC5zYXZlKCkscz10aGlzLl9za2lwVW50aWxFbmQodCwnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogIicrdGhpcy50YWcrJyInKTtyZXR1cm4gdC5pc0Vycm9yKHMpP3M6KHI9dC5vZmZzZXQtby5vZmZzZXQsdC5yZXN0b3JlKG8pLHQuc2tpcChyLCdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogIicrZSsnIicpKX0sYy5wcm90b3R5cGUuX3NraXBVbnRpbEVuZD1mdW5jdGlvbih0LGUpe2Zvcig7Oyl7dmFyIG49aCh0LGUpO2lmKHQuaXNFcnJvcihuKSlyZXR1cm4gbjt2YXIgaSxyPWwodCxuLnByaW1pdGl2ZSxlKTtpZih0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYoaT1uLnByaW1pdGl2ZXx8bnVsbCE9PXI/dC5za2lwKHIpOnRoaXMuX3NraXBVbnRpbEVuZCh0LGUpLHQuaXNFcnJvcihpKSlyZXR1cm4gaTtpZigiZW5kIj09PW4udGFnU3RyKWJyZWFrfX0sYy5wcm90b3R5cGUuX2RlY29kZUxpc3Q9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPVtdOyF0LmlzRW1wdHkoKTspe3ZhciBvPXRoaXMuX3BlZWtUYWcodCwiZW5kIik7aWYodC5pc0Vycm9yKG8pKXJldHVybiBvO3ZhciBzPW4uZGVjb2RlKHQsImRlciIsaSk7aWYodC5pc0Vycm9yKHMpJiZvKWJyZWFrO3IucHVzaChzKX1yZXR1cm4gcn0sYy5wcm90b3R5cGUuX2RlY29kZVN0cj1mdW5jdGlvbih0LGUpe2lmKCJiaXRzdHIiPT09ZSl7dmFyIG49dC5yZWFkVUludDgoKTtyZXR1cm4gdC5pc0Vycm9yKG4pP246e3VudXNlZDpuLGRhdGE6dC5yYXcoKX19aWYoImJtcHN0ciI9PT1lKXt2YXIgaT10LnJhdygpO2lmKGkubGVuZ3RoJTI9PTEpcmV0dXJuIHQuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKHZhciByPSIiLG89MDtvPGkubGVuZ3RoLzI7bysrKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoaS5yZWFkVUludDE2QkUoMipvKSk7cmV0dXJuIHJ9aWYoIm51bXN0ciI9PT1lKXt2YXIgcz10LnJhdygpLnRvU3RyaW5nKCJhc2NpaSIpO3JldHVybiB0aGlzLl9pc051bXN0cihzKT9zOnQuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyIpfWlmKCJvY3RzdHIiPT09ZSlyZXR1cm4gdC5yYXcoKTtpZigib2JqRGVzYyI9PT1lKXJldHVybiB0LnJhdygpO2lmKCJwcmludHN0ciI9PT1lKXt2YXIgYT10LnJhdygpLnRvU3RyaW5nKCJhc2NpaSIpO3JldHVybiB0aGlzLl9pc1ByaW50c3RyKGEpP2E6dC5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMiKX1yZXR1cm4vc3RyJC8udGVzdChlKT90LnJhdygpLnRvU3RyaW5nKCk6dC5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICIrZSsiIHVuc3VwcG9ydGVkIil9LGMucHJvdG90eXBlLl9kZWNvZGVPYmppZD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHI9W10sbz0wOyF0LmlzRW1wdHkoKTspe3ZhciBzPXQucmVhZFVJbnQ4KCk7bzw8PTcsb3w9MTI3JnMsMD09KDEyOCZzKSYmKHIucHVzaChvKSxvPTApfTEyOCZzJiZyLnB1c2gobyk7dmFyIGE9clswXS80MHwwLHU9clswXSU0MDtpZihpPW4/cjpbYSx1XS5jb25jYXQoci5zbGljZSgxKSksZSl7dmFyIGM9ZVtpLmpvaW4oIiAiKV07dm9pZCAwPT09YyYmKGM9ZVtpLmpvaW4oIi4iKV0pLHZvaWQgMCE9PWMmJihpPWMpfXJldHVybiBpfSxjLnByb3RvdHlwZS5fZGVjb2RlVGltZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQucmF3KCkudG9TdHJpbmcoKTtpZigiZ2VudGltZSI9PT1lKXZhciBpPTB8bi5zbGljZSgwLDQpLHI9MHxuLnNsaWNlKDQsNiksbz0wfG4uc2xpY2UoNiw4KSxzPTB8bi5zbGljZSg4LDEwKSxhPTB8bi5zbGljZSgxMCwxMiksdT0wfG4uc2xpY2UoMTIsMTQpO2Vsc2V7aWYoInV0Y3RpbWUiIT09ZSlyZXR1cm4gdC5lcnJvcigiRGVjb2RpbmcgIitlKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2k9MHxuLnNsaWNlKDAsMikscj0wfG4uc2xpY2UoMiw0KSxvPTB8bi5zbGljZSg0LDYpLHM9MHxuLnNsaWNlKDYsOCksYT0wfG4uc2xpY2UoOCwxMCksdT0wfG4uc2xpY2UoMTAsMTIpO2k9aTw3MD8yZTMraToxOTAwK2l9cmV0dXJuIERhdGUuVVRDKGksci0xLG8scyxhLHUsMCl9LGMucHJvdG90eXBlLl9kZWNvZGVOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxjLnByb3RvdHlwZS5fZGVjb2RlQm9vbD1mdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVSW50OCgpO3JldHVybiB0LmlzRXJyb3IoZSk/ZTowIT09ZX0sYy5wcm90b3R5cGUuX2RlY29kZUludD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucmF3KCksaT1uZXcgcyhuKTtyZXR1cm4gZSYmKGk9ZVtpLnRvU3RyaW5nKDEwKV18fGkpLGl9LGMucHJvdG90eXBlLl91c2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksdC5fZ2V0RGVjb2RlcigiZGVyIikudHJlZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big0KS5CdWZmZXIsbz1uKDM1KSxzPW8uYmFzZSxhPW8uY29uc3RhbnRzLmRlcjtmdW5jdGlvbiB1KHQpe3RoaXMuZW5jPSJkZXIiLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5lbnRpdHk9dCx0aGlzLnRyZWU9bmV3IGMsdGhpcy50cmVlLl9pbml0KHQuYm9keSl9ZnVuY3Rpb24gYyh0KXtzLk5vZGUuY2FsbCh0aGlzLCJkZXIiLHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ8MTA/IjAiK3Q6dH10LmV4cG9ydHM9dSx1LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUodCxlKS5qb2luKCl9LGkoYyxzLk5vZGUpLGMucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIG8scz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcjsic2Vxb2YiPT09dD90PSJzZXEiOiJzZXRvZiI9PT10JiYodD0ic2V0Iik7aWYoYS50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodCkpcj1hLnRhZ0J5TmFtZVt0XTtlbHNle2lmKCJudW1iZXIiIT10eXBlb2YgdHx8KDB8dCkhPT10KXJldHVybiBpLmVycm9yKCJVbmtub3duIHRhZzogIit0KTtyPXR9aWYocj49MzEpcmV0dXJuIGkuZXJyb3IoIk11bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCIpO2V8fChyfD0zMik7cmV0dXJuIHJ8PWEudGFnQ2xhc3NCeU5hbWVbbnx8InVuaXZlcnNhbCJdPDw2fSh0LGUsbix0aGlzLnJlcG9ydGVyKTtpZihpLmxlbmd0aDwxMjgpcmV0dXJuKG89bmV3IHIoMikpWzBdPXMsb1sxXT1pLmxlbmd0aCx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFtvLGldKTtmb3IodmFyIHU9MSxjPWkubGVuZ3RoO2M+PTI1NjtjPj49OCl1Kys7KG89bmV3IHIoMit1KSlbMF09cyxvWzFdPTEyOHx1O2M9MSt1O2Zvcih2YXIgaD1pLmxlbmd0aDtoPjA7Yy0tLGg+Pj04KW9bY109MjU1Jmg7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW28saV0pfSxjLnByb3RvdHlwZS5fZW5jb2RlU3RyPWZ1bmN0aW9uKHQsZSl7aWYoImJpdHN0ciI9PT1lKXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswfHQudW51c2VkLHQuZGF0YV0pO2lmKCJibXBzdHIiPT09ZSl7Zm9yKHZhciBuPW5ldyByKDIqdC5sZW5ndGgpLGk9MDtpPHQubGVuZ3RoO2krKyluLndyaXRlVUludDE2QkUodC5jaGFyQ29kZUF0KGkpLDIqaSk7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobil9cmV0dXJuIm51bXN0ciI9PT1lP3RoaXMuX2lzTnVtc3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyBvbmx5IGRpZ2l0cyBhbmQgc3BhY2UiKToicHJpbnRzdHIiPT09ZT90aGlzLl9pc1ByaW50c3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzIG9ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggcGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sIHF1ZXN0aW9uIG1hcmsiKTovc3RyJC8udGVzdChlKT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpOiJvYmpEZXNjIj09PWU/dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0KTp0aGlzLnJlcG9ydGVyLmVycm9yKCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogIitlKyIgdW5zdXBwb3J0ZWQiKX0sYy5wcm90b3R5cGUuX2VuY29kZU9iamlkPWZ1bmN0aW9uKHQsZSxuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCFlKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kIik7aWYoIWUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIm9iamlkIG5vdCBmb3VuZCBpbiB2YWx1ZXMgbWFwIik7dD1lW3RdLnNwbGl0KC9bXHNcLl0rL2cpO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV18PTB9ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt0PXQuc2xpY2UoKTtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV18PTB9aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIm9iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsIGdvdDogIitKU09OLnN0cmluZ2lmeSh0KSk7aWYoIW4pe2lmKHRbMV0+PTQwKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0IiKTt0LnNwbGljZSgwLDIsNDAqdFswXSt0WzFdKX12YXIgbz0wO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07Zm9yKG8rKztzPj0xMjg7cz4+PTcpbysrfXZhciBhPW5ldyByKG8pLHU9YS5sZW5ndGgtMTtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXtzPXRbaV07Zm9yKGFbdS0tXT0xMjcmczsocz4+PTcpPjA7KWFbdS0tXT0xMjh8MTI3JnN9cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYSl9LGMucHJvdG90eXBlLl9lbmNvZGVUaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT1uZXcgRGF0ZSh0KTtyZXR1cm4iZ2VudGltZSI9PT1lP249W2goaS5nZXRGdWxsWWVhcigpKSxoKGkuZ2V0VVRDTW9udGgoKSsxKSxoKGkuZ2V0VVRDRGF0ZSgpKSxoKGkuZ2V0VVRDSG91cnMoKSksaChpLmdldFVUQ01pbnV0ZXMoKSksaChpLmdldFVUQ1NlY29uZHMoKSksIloiXS5qb2luKCIiKToidXRjdGltZSI9PT1lP249W2goaS5nZXRGdWxsWWVhcigpJTEwMCksaChpLmdldFVUQ01vbnRoKCkrMSksaChpLmdldFVUQ0RhdGUoKSksaChpLmdldFVUQ0hvdXJzKCkpLGgoaS5nZXRVVENNaW51dGVzKCkpLGgoaS5nZXRVVENTZWNvbmRzKCkpLCJaIl0uam9pbigiIik6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2RpbmcgIitlKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpLHRoaXMuX2VuY29kZVN0cihuLCJvY3RzdHIiKX0sYy5wcm90b3R5cGUuX2VuY29kZU51bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcigiIil9LGMucHJvdG90eXBlLl9lbmNvZGVJbnQ9ZnVuY3Rpb24odCxlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCFlKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIik7aWYoIWUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIlZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluOiAiK0pTT04uc3RyaW5naWZ5KHQpKTt0PWVbdF19aWYoIm51bWJlciIhPXR5cGVvZiB0JiYhci5pc0J1ZmZlcih0KSl7dmFyIG49dC50b0FycmF5KCk7IXQuc2lnbiYmMTI4Jm5bMF0mJm4udW5zaGlmdCgwKSx0PW5ldyByKG4pfWlmKHIuaXNCdWZmZXIodCkpe3ZhciBpPXQubGVuZ3RoOzA9PT10Lmxlbmd0aCYmaSsrO3ZhciBvPW5ldyByKGkpO3JldHVybiB0LmNvcHkobyksMD09PXQubGVuZ3RoJiYob1swXT0wKSx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG8pfWlmKHQ8MTI4KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpO2lmKHQ8MjU2KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLHRdKTtpPTE7Zm9yKHZhciBzPXQ7cz49MjU2O3M+Pj04KWkrKztmb3Iocz0obz1uZXcgQXJyYXkoaSkpLmxlbmd0aC0xO3M+PTA7cy0tKW9bc109MjU1JnQsdD4+PTg7cmV0dXJuIDEyOCZvWzBdJiZvLnVuc2hpZnQoMCksdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihuZXcgcihvKSl9LGMucHJvdG90eXBlLl9lbmNvZGVCb29sPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQ/MjU1OjApfSxjLnByb3RvdHlwZS5fdXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLHQuX2dldEVuY29kZXIoImRlciIpLnRyZWV9LGMucHJvdG90eXBlLl9za2lwRGVmYXVsdD1mdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PXIuZGVmYXVsdClyZXR1cm4hMTt2YXIgbz10LmpvaW4oKTtpZih2b2lkIDA9PT1yLmRlZmF1bHRCdWZmZXImJihyLmRlZmF1bHRCdWZmZXI9dGhpcy5fZW5jb2RlVmFsdWUoci5kZWZhdWx0LGUsbikuam9pbigpKSxvLmxlbmd0aCE9PXIuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpcmV0dXJuITE7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylpZihvW2ldIT09ci5kZWZhdWx0QnVmZmVyW2ldKXJldHVybiExO3JldHVybiEwfX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPXsiMS4zLjEzMi4wLjEwIjoic2VjcDI1NmsxIiwiMS4zLjEzMi4wLjMzIjoicDIyNCIsIjEuMi44NDAuMTAwNDUuMy4xLjEiOiJwMTkyIiwiMS4yLjg0MC4xMDA0NS4zLjEuNyI6InAyNTYiLCIxLjMuMTMyLjAuMzQiOiJwMzg0IiwiMS4zLjEzMi4wLjM1IjoicDUyMSJ9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzMSkscj1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiBvKHQpe3ZhciBlPXIuYWxsb2NVbnNhZmUoNCk7cmV0dXJuIGUud3JpdGVVSW50MzJCRSh0LDApLGV9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHM9ci5hbGxvYygwKSxhPTA7cy5sZW5ndGg8ZTspbj1vKGErKykscz1yLmNvbmNhdChbcyxpKCJzaGExIikudXBkYXRlKHQpLnVwZGF0ZShuKS5kaWdlc3QoKV0pO3JldHVybiBzLnNsaWNlKDAsZSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPS0xOysraTxuOyl0W2ldXj1lW2ldO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMykscj1uKDEpLkJ1ZmZlcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5mcm9tKHQudG9SZWQoaS5tb250KGUubW9kdWx1cykpLnJlZFBvdyhuZXcgaShlLnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpLnRvQXJyYXkoKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDM3KSxyPW4oMTIxKSxvPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHU9IltvYmplY3QgUHJveHldIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkpcmV0dXJuITE7dmFyIGU9aSh0KTtyZXR1cm4gZT09c3x8ZT09YXx8ZT09b3x8ZT09dX19LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZTt0LmV4cG9ydHM9bn0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gbi5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1MSkscj1uKDI1OCksbz1uKDI2MCkscz1uKDI2MSksYT1uKDI2Mik7ZnVuY3Rpb24gdSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX11LnByb3RvdHlwZS5jbGVhcj1pLHUucHJvdG90eXBlLmRlbGV0ZT1yLHUucHJvdG90eXBlLmdldD1vLHUucHJvdG90eXBlLmhhcz1zLHUucHJvdG90eXBlLnNldD1hLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyNjMpLHI9bigyNjYpLG89bigyNjcpLHM9MSxhPTI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHUsYyxoKXt2YXIgbD1uJnMsZD10Lmxlbmd0aCxmPWUubGVuZ3RoO2lmKGQhPWYmJiEobCYmZj5kKSlyZXR1cm4hMTt2YXIgcD1oLmdldCh0KTtpZihwJiZoLmdldChlKSlyZXR1cm4gcD09ZTt2YXIgbT0tMSxnPSEwLHY9biZhP25ldyBpOnZvaWQgMDtmb3IoaC5zZXQodCxlKSxoLnNldChlLHQpOysrbTxkOyl7dmFyIGI9dFttXSx5PWVbbV07aWYodSl2YXIgXz1sP3UoeSxiLG0sZSx0LGgpOnUoYix5LG0sdCxlLGgpO2lmKHZvaWQgMCE9PV8pe2lmKF8pY29udGludWU7Zz0hMTticmVha31pZih2KXtpZighcihlLGZ1bmN0aW9uKHQsZSl7aWYoIW8odixlKSYmKGI9PT10fHxjKGIsdCxuLHUsaCkpKXJldHVybiB2LnB1c2goZSl9KSl7Zz0hMTticmVha319ZWxzZSBpZihiIT09eSYmIWMoYix5LG4sdSxoKSl7Zz0hMTticmVha319cmV0dXJuIGguZGVsZXRlKHQpLGguZGVsZXRlKGUpLGd9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTkpLHI9bigyODQpLG89ZSYmIWUubm9kZVR5cGUmJmUscz1vJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJiF0Lm5vZGVUeXBlJiZ0LGE9cyYmcy5leHBvcnRzPT09bz9pLkJ1ZmZlcjp2b2lkIDAsdT0oYT9hLmlzQnVmZmVyOnZvaWQgMCl8fHI7dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsbig0NykodCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyODYpLHI9bigyODcpLG89bigyODgpLHM9byYmby5pc1R5cGVkQXJyYXksYT1zP3Iocyk6aTt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt2YXIgbj05MDA3MTk5MjU0NzQwOTkxO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9bn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX19LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oaSl7dmFyIHIsbyxzO3M9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PXNlbGYmJnNlbGZ8fCJvYmplY3QiPT10eXBlb2YgaSYmaS5nbG9iYWw9PWkmJmkscj1bbig2KSxuKDE1KSxlXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0LGUsbil7cy5CYWNrYm9uZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LkJhY2tib25lLG89QXJyYXkucHJvdG90eXBlLnNsaWNlO2UuVkVSU0lPTj0iMS4yLjMiLGUuJD1pLGUubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB0LkJhY2tib25lPXIsdGhpc30sZS5lbXVsYXRlSFRUUD0hMSxlLmVtdWxhdGVKU09OPSExO3ZhciBzPWZ1bmN0aW9uKHQsZSxpKXtuLmVhY2goZSxmdW5jdGlvbihlLHIpe25bcl0mJih0LnByb3RvdHlwZVtyXT1mdW5jdGlvbih0LGUsaSl7c3dpdGNoKHQpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbltlXSh0aGlzW2ldKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbltlXSh0aGlzW2ldLHQpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIG5bZV0odGhpc1tpXSxhKHQsdGhpcykscil9O2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCxyLG8pe3JldHVybiBuW2VdKHRoaXNbaV0sYSh0LHRoaXMpLHIsbyl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9by5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQudW5zaGlmdCh0aGlzW2ldKSxuW2VdLmFwcGx5KG4sdCl9fX0oZSxyLGkpKX0pfSxhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbih0KT90Om4uaXNPYmplY3QodCkmJiFlLl9pc01vZGVsKHQpP3UodCk6bi5pc1N0cmluZyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQodCl9OnR9LHU9ZnVuY3Rpb24odCl7dmFyIGU9bi5tYXRjaGVzKHQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0LmF0dHJpYnV0ZXMpfX0sYz1lLkV2ZW50cz17fSxoPS9ccysvLGw9ZnVuY3Rpb24odCxlLGkscixvKXt2YXIgcyxhPTA7aWYoaSYmIm9iamVjdCI9PXR5cGVvZiBpKXt2b2lkIDAhPT1yJiYiY29udGV4dCJpbiBvJiZ2b2lkIDA9PT1vLmNvbnRleHQmJihvLmNvbnRleHQ9cik7Zm9yKHM9bi5rZXlzKGkpO2E8cy5sZW5ndGg7YSsrKWU9bCh0LGUsc1thXSxpW3NbYV1dLG8pfWVsc2UgaWYoaSYmaC50ZXN0KGkpKWZvcihzPWkuc3BsaXQoaCk7YTxzLmxlbmd0aDthKyspZT10KGUsc1thXSxyLG8pO2Vsc2UgZT10KGUsaSxyLG8pO3JldHVybiBlfTtjLm9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZCh0aGlzLHQsZSxuKX07dmFyIGQ9ZnVuY3Rpb24odCxlLG4saSxyKXtpZih0Ll9ldmVudHM9bChmLHQuX2V2ZW50c3x8e30sZSxuLHtjb250ZXh0OmksY3R4OnQsbGlzdGVuaW5nOnJ9KSxyKXt2YXIgbz10Ll9saXN0ZW5lcnN8fCh0Ll9saXN0ZW5lcnM9e30pO29bci5pZF09cn1yZXR1cm4gdH07Yy5saXN0ZW5Ubz1mdW5jdGlvbih0LGUsaSl7aWYoIXQpcmV0dXJuIHRoaXM7dmFyIHI9dC5fbGlzdGVuSWR8fCh0Ll9saXN0ZW5JZD1uLnVuaXF1ZUlkKCJsIikpLG89dGhpcy5fbGlzdGVuaW5nVG98fCh0aGlzLl9saXN0ZW5pbmdUbz17fSkscz1vW3JdO2lmKCFzKXt2YXIgYT10aGlzLl9saXN0ZW5JZHx8KHRoaXMuX2xpc3RlbklkPW4udW5pcXVlSWQoImwiKSk7cz1vW3JdPXtvYmo6dCxvYmpJZDpyLGlkOmEsbGlzdGVuaW5nVG86byxjb3VudDowfX1yZXR1cm4gZCh0LGUsaSx0aGlzLHMpLHRoaXN9O3ZhciBmPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKG4pe3ZhciByPXRbZV18fCh0W2VdPVtdKSxvPWkuY29udGV4dCxzPWkuY3R4LGE9aS5saXN0ZW5pbmc7YSYmYS5jb3VudCsrLHIucHVzaCh7Y2FsbGJhY2s6bixjb250ZXh0Om8sY3R4Om98fHMsbGlzdGVuaW5nOmF9KX1yZXR1cm4gdH07Yy5vZmY9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9ldmVudHM/KHRoaXMuX2V2ZW50cz1sKHAsdGhpcy5fZXZlbnRzLHQsZSx7Y29udGV4dDpuLGxpc3RlbmVyczp0aGlzLl9saXN0ZW5lcnN9KSx0aGlzKTp0aGlzfSxjLnN0b3BMaXN0ZW5pbmc9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuX2xpc3RlbmluZ1RvO2lmKCFyKXJldHVybiB0aGlzO2Zvcih2YXIgbz10P1t0Ll9saXN0ZW5JZF06bi5rZXlzKHIpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGE9cltvW3NdXTtpZighYSlicmVhazthLm9iai5vZmYoZSxpLHRoaXMpfXJldHVybiBuLmlzRW1wdHkocikmJih0aGlzLl9saXN0ZW5pbmdUbz12b2lkIDApLHRoaXN9O3ZhciBwPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHQpe3ZhciBvLHM9MCxhPXIuY29udGV4dCx1PXIubGlzdGVuZXJzO2lmKGV8fGl8fGEpe2Zvcih2YXIgYz1lP1tlXTpuLmtleXModCk7czxjLmxlbmd0aDtzKyspe2U9Y1tzXTt2YXIgaD10W2VdO2lmKCFoKWJyZWFrO2Zvcih2YXIgbD1bXSxkPTA7ZDxoLmxlbmd0aDtkKyspe3ZhciBmPWhbZF07aSYmaSE9PWYuY2FsbGJhY2smJmkhPT1mLmNhbGxiYWNrLl9jYWxsYmFja3x8YSYmYSE9PWYuY29udGV4dD9sLnB1c2goZik6KG89Zi5saXN0ZW5pbmcpJiYwPT0tLW8uY291bnQmJihkZWxldGUgdVtvLmlkXSxkZWxldGUgby5saXN0ZW5pbmdUb1tvLm9iaklkXSl9bC5sZW5ndGg/dFtlXT1sOmRlbGV0ZSB0W2VdfXJldHVybiBuLnNpemUodCk/dDp2b2lkIDB9Zm9yKHZhciBwPW4ua2V5cyh1KTtzPHAubGVuZ3RoO3MrKylvPXVbcFtzXV0sZGVsZXRlIHVbby5pZF0sZGVsZXRlIG8ubGlzdGVuaW5nVG9bby5vYmpJZF19fTtjLm9uY2U9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWwobSx7fSx0LGUsbi5iaW5kKHRoaXMub2ZmLHRoaXMpKTtyZXR1cm4gdGhpcy5vbihyLHZvaWQgMCxpKX0sYy5saXN0ZW5Ub09uY2U9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWwobSx7fSxlLGksbi5iaW5kKHRoaXMuc3RvcExpc3RlbmluZyx0aGlzLHQpKTtyZXR1cm4gdGhpcy5saXN0ZW5Ubyh0LHIpfTt2YXIgbT1mdW5jdGlvbih0LGUsaSxyKXtpZihpKXt2YXIgbz10W2VdPW4ub25jZShmdW5jdGlvbigpe3IoZSxvKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pO28uX2NhbGxiYWNrPWl9cmV0dXJuIHR9O2MudHJpZ2dlcj1mdW5jdGlvbih0KXtpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2Zvcih2YXIgZT1NYXRoLm1heCgwLGFyZ3VtZW50cy5sZW5ndGgtMSksbj1BcnJheShlKSxpPTA7aTxlO2krKyluW2ldPWFyZ3VtZW50c1tpKzFdO3JldHVybiBsKGcsdGhpcy5fZXZlbnRzLHQsdm9pZCAwLG4pLHRoaXN9O3ZhciBnPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQpe3ZhciByPXRbZV0sbz10LmFsbDtyJiZvJiYobz1vLnNsaWNlKCkpLHImJnYocixpKSxvJiZ2KG8sW2VdLmNvbmNhdChpKSl9cmV0dXJuIHR9LHY9ZnVuY3Rpb24odCxlKXt2YXIgbixpPS0xLHI9dC5sZW5ndGgsbz1lWzBdLHM9ZVsxXSxhPWVbMl07c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCk7cmV0dXJuO2Nhc2UgMTpmb3IoOysraTxyOykobj10W2ldKS5jYWxsYmFjay5jYWxsKG4uY3R4LG8pO3JldHVybjtjYXNlIDI6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCxvLHMpO3JldHVybjtjYXNlIDM6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suY2FsbChuLmN0eCxvLHMsYSk7cmV0dXJuO2RlZmF1bHQ6Zm9yKDsrK2k8cjspKG49dFtpXSkuY2FsbGJhY2suYXBwbHkobi5jdHgsZSk7cmV0dXJufX07Yy5iaW5kPWMub24sYy51bmJpbmQ9Yy5vZmYsbi5leHRlbmQoZSxjKTt2YXIgYj1lLk1vZGVsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dHx8e307ZXx8KGU9e30pLHRoaXMuY2lkPW4udW5pcXVlSWQodGhpcy5jaWRQcmVmaXgpLHRoaXMuYXR0cmlidXRlcz17fSxlLmNvbGxlY3Rpb24mJih0aGlzLmNvbGxlY3Rpb249ZS5jb2xsZWN0aW9uKSxlLnBhcnNlJiYoaT10aGlzLnBhcnNlKGksZSl8fHt9KSxpPW4uZGVmYXVsdHMoe30saSxuLnJlc3VsdCh0aGlzLCJkZWZhdWx0cyIpKSx0aGlzLnNldChpLGUpLHRoaXMuY2hhbmdlZD17fSx0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtuLmV4dGVuZChiLnByb3RvdHlwZSxjLHtjaGFuZ2VkOm51bGwsdmFsaWRhdGlvbkVycm9yOm51bGwsaWRBdHRyaWJ1dGU6ImlkIixjaWRQcmVmaXg6ImMiLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHRvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gbi5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfSxlc2NhcGU6ZnVuY3Rpb24odCl7cmV0dXJuIG4uZXNjYXBlKHRoaXMuZ2V0KHQpKX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10aGlzLmdldCh0KX0sbWF0Y2hlczpmdW5jdGlvbih0KXtyZXR1cm4hIW4uaXRlcmF0ZWUodCx0aGlzKSh0aGlzLmF0dHJpYnV0ZXMpfSxzZXQ6ZnVuY3Rpb24odCxlLGkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXM7dmFyIHI7aWYoIm9iamVjdCI9PXR5cGVvZiB0PyhyPXQsaT1lKToocj17fSlbdF09ZSxpfHwoaT17fSksIXRoaXMuX3ZhbGlkYXRlKHIsaSkpcmV0dXJuITE7dmFyIG89aS51bnNldCxzPWkuc2lsZW50LGE9W10sdT10aGlzLl9jaGFuZ2luZzt0aGlzLl9jaGFuZ2luZz0hMCx1fHwodGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzPW4uY2xvbmUodGhpcy5hdHRyaWJ1dGVzKSx0aGlzLmNoYW5nZWQ9e30pO3ZhciBjPXRoaXMuYXR0cmlidXRlcyxoPXRoaXMuY2hhbmdlZCxsPXRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcztmb3IodmFyIGQgaW4gcillPXJbZF0sbi5pc0VxdWFsKGNbZF0sZSl8fGEucHVzaChkKSxuLmlzRXF1YWwobFtkXSxlKT9kZWxldGUgaFtkXTpoW2RdPWUsbz9kZWxldGUgY1tkXTpjW2RdPWU7aWYodGhpcy5pZD10aGlzLmdldCh0aGlzLmlkQXR0cmlidXRlKSwhcyl7YS5sZW5ndGgmJih0aGlzLl9wZW5kaW5nPWkpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKXRoaXMudHJpZ2dlcigiY2hhbmdlOiIrYVtmXSx0aGlzLGNbYVtmXV0saSl9aWYodSlyZXR1cm4gdGhpcztpZighcylmb3IoO3RoaXMuX3BlbmRpbmc7KWk9dGhpcy5fcGVuZGluZyx0aGlzLl9wZW5kaW5nPSExLHRoaXMudHJpZ2dlcigiY2hhbmdlIix0aGlzLGkpO3JldHVybiB0aGlzLl9wZW5kaW5nPSExLHRoaXMuX2NoYW5naW5nPSExLHRoaXN9LHVuc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsdm9pZCAwLG4uZXh0ZW5kKHt9LGUse3Vuc2V0OiEwfSkpfSxjbGVhcjpmdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIGkgaW4gdGhpcy5hdHRyaWJ1dGVzKWVbaV09dm9pZCAwO3JldHVybiB0aGlzLnNldChlLG4uZXh0ZW5kKHt9LHQse3Vuc2V0OiEwfSkpfSxoYXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyFuLmlzRW1wdHkodGhpcy5jaGFuZ2VkKTpuLmhhcyh0aGlzLmNoYW5nZWQsdCl9LGNoYW5nZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiEhdGhpcy5oYXNDaGFuZ2VkKCkmJm4uY2xvbmUodGhpcy5jaGFuZ2VkKTt2YXIgZT10aGlzLl9jaGFuZ2luZz90aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM6dGhpcy5hdHRyaWJ1dGVzLGk9e307Zm9yKHZhciByIGluIHQpe3ZhciBvPXRbcl07bi5pc0VxdWFsKGVbcl0sbyl8fChpW3JdPW8pfXJldHVybiEhbi5zaXplKGkpJiZpfSxwcmV2aW91czpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzP3RoaXMuX3ByZXZpb3VzQXR0cmlidXRlc1t0XTpudWxsfSxwcmV2aW91c0F0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpfSxmZXRjaDpmdW5jdGlvbih0KXt0PW4uZXh0ZW5kKHtwYXJzZTohMH0sdCk7dmFyIGU9dGhpcyxpPXQuc3VjY2VzcztyZXR1cm4gdC5zdWNjZXNzPWZ1bmN0aW9uKG4pe3ZhciByPXQucGFyc2U/ZS5wYXJzZShuLHQpOm47aWYoIWUuc2V0KHIsdCkpcmV0dXJuITE7aSYmaS5jYWxsKHQuY29udGV4dCxlLG4sdCksZS50cmlnZ2VyKCJzeW5jIixlLG4sdCl9LFIodGhpcyx0KSx0aGlzLnN5bmMoInJlYWQiLHRoaXMsdCl9LHNhdmU6ZnVuY3Rpb24odCxlLGkpe3ZhciByO251bGw9PXR8fCJvYmplY3QiPT10eXBlb2YgdD8ocj10LGk9ZSk6KHI9e30pW3RdPWU7dmFyIG89KGk9bi5leHRlbmQoe3ZhbGlkYXRlOiEwLHBhcnNlOiEwfSxpKSkud2FpdDtpZihyJiYhbyl7aWYoIXRoaXMuc2V0KHIsaSkpcmV0dXJuITF9ZWxzZSBpZighdGhpcy5fdmFsaWRhdGUocixpKSlyZXR1cm4hMTt2YXIgcz10aGlzLGE9aS5zdWNjZXNzLHU9dGhpcy5hdHRyaWJ1dGVzO2kuc3VjY2Vzcz1mdW5jdGlvbih0KXtzLmF0dHJpYnV0ZXM9dTt2YXIgZT1pLnBhcnNlP3MucGFyc2UodCxpKTp0O2lmKG8mJihlPW4uZXh0ZW5kKHt9LHIsZSkpLGUmJiFzLnNldChlLGkpKXJldHVybiExO2EmJmEuY2FsbChpLmNvbnRleHQscyx0LGkpLHMudHJpZ2dlcigic3luYyIscyx0LGkpfSxSKHRoaXMsaSksciYmbyYmKHRoaXMuYXR0cmlidXRlcz1uLmV4dGVuZCh7fSx1LHIpKTt2YXIgYz10aGlzLmlzTmV3KCk/ImNyZWF0ZSI6aS5wYXRjaD8icGF0Y2giOiJ1cGRhdGUiOyJwYXRjaCIhPT1jfHxpLmF0dHJzfHwoaS5hdHRycz1yKTt2YXIgaD10aGlzLnN5bmMoYyx0aGlzLGkpO3JldHVybiB0aGlzLmF0dHJpYnV0ZXM9dSxofSxkZXN0cm95OmZ1bmN0aW9uKHQpe3Q9dD9uLmNsb25lKHQpOnt9O3ZhciBlPXRoaXMsaT10LnN1Y2Nlc3Mscj10LndhaXQsbz1mdW5jdGlvbigpe2Uuc3RvcExpc3RlbmluZygpLGUudHJpZ2dlcigiZGVzdHJveSIsZSxlLmNvbGxlY3Rpb24sdCl9O3Quc3VjY2Vzcz1mdW5jdGlvbihuKXtyJiZvKCksaSYmaS5jYWxsKHQuY29udGV4dCxlLG4sdCksZS5pc05ldygpfHxlLnRyaWdnZXIoInN5bmMiLGUsbix0KX07dmFyIHM9ITE7cmV0dXJuIHRoaXMuaXNOZXcoKT9uLmRlZmVyKHQuc3VjY2Vzcyk6KFIodGhpcyx0KSxzPXRoaXMuc3luYygiZGVsZXRlIix0aGlzLHQpKSxyfHxvKCksc30sdXJsOmZ1bmN0aW9uKCl7dmFyIHQ9bi5yZXN1bHQodGhpcywidXJsUm9vdCIpfHxuLnJlc3VsdCh0aGlzLmNvbGxlY3Rpb24sInVybCIpfHxEKCk7aWYodGhpcy5pc05ldygpKXJldHVybiB0O3ZhciBlPXRoaXMuZ2V0KHRoaXMuaWRBdHRyaWJ1dGUpO3JldHVybiB0LnJlcGxhY2UoL1teXC9dJC8sIiQmLyIpK2VuY29kZVVSSUNvbXBvbmVudChlKX0scGFyc2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hdHRyaWJ1dGVzKX0saXNOZXc6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5oYXModGhpcy5pZEF0dHJpYnV0ZSl9LGlzVmFsaWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlKHt9LG4uZGVmYXVsdHMoe3ZhbGlkYXRlOiEwfSx0KSl9LF92YWxpZGF0ZTpmdW5jdGlvbih0LGUpe2lmKCFlLnZhbGlkYXRlfHwhdGhpcy52YWxpZGF0ZSlyZXR1cm4hMDt0PW4uZXh0ZW5kKHt9LHRoaXMuYXR0cmlidXRlcyx0KTt2YXIgaT10aGlzLnZhbGlkYXRpb25FcnJvcj10aGlzLnZhbGlkYXRlKHQsZSl8fG51bGw7cmV0dXJuIWl8fCh0aGlzLnRyaWdnZXIoImludmFsaWQiLHRoaXMsaSxuLmV4dGVuZChlLHt2YWxpZGF0aW9uRXJyb3I6aX0pKSwhMSl9fSkscyhiLHtrZXlzOjEsdmFsdWVzOjEscGFpcnM6MSxpbnZlcnQ6MSxwaWNrOjAsb21pdDowLGNoYWluOjEsaXNFbXB0eToxfSwiYXR0cmlidXRlcyIpO3ZhciB5PWUuQ29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2V8fChlPXt9KSxlLm1vZGVsJiYodGhpcy5tb2RlbD1lLm1vZGVsKSx2b2lkIDAhPT1lLmNvbXBhcmF0b3ImJih0aGlzLmNvbXBhcmF0b3I9ZS5jb21wYXJhdG9yKSx0aGlzLl9yZXNldCgpLHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCYmdGhpcy5yZXNldCh0LG4uZXh0ZW5kKHtzaWxlbnQ6ITB9LGUpKX0sXz17YWRkOiEwLHJlbW92ZTohMCxtZXJnZTohMH0sdz17YWRkOiEwLHJlbW92ZTohMX0seD1mdW5jdGlvbih0LGUsbil7bj1NYXRoLm1pbihNYXRoLm1heChuLDApLHQubGVuZ3RoKTtmb3IodmFyIGk9QXJyYXkodC5sZW5ndGgtbikscj1lLmxlbmd0aCxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT10W28rbl07Zm9yKG89MDtvPHI7bysrKXRbbytuXT1lW29dO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspdFtvK3Irbl09aVtvXX07bi5leHRlbmQoeS5wcm90b3R5cGUsYyx7bW9kZWw6Yixpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSx0b0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTih0KX0pfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldCh0LG4uZXh0ZW5kKHttZXJnZTohMX0sZSx3KSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe2U9bi5leHRlbmQoe30sZSk7dmFyIGk9IW4uaXNBcnJheSh0KTt0PWk/W3RdOm4uY2xvbmUodCk7dmFyIHI9dGhpcy5fcmVtb3ZlTW9kZWxzKHQsZSk7cmV0dXJuIWUuc2lsZW50JiZyJiZ0aGlzLnRyaWdnZXIoInVwZGF0ZSIsdGhpcyxlKSxpP3JbMF06cn0sc2V0OmZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dCl7KGU9bi5kZWZhdWx0cyh7fSxlLF8pKS5wYXJzZSYmIXRoaXMuX2lzTW9kZWwodCkmJih0PXRoaXMucGFyc2UodCxlKSk7dmFyIGk9IW4uaXNBcnJheSh0KTt0PWk/W3RdOnQuc2xpY2UoKTt2YXIgcj1lLmF0O251bGwhPXImJihyPStyKSxyPDAmJihyKz10aGlzLmxlbmd0aCsxKTtmb3IodmFyIG8scz1bXSxhPVtdLHU9W10sYz17fSxoPWUuYWRkLGw9ZS5tZXJnZSxkPWUucmVtb3ZlLGY9ITEscD10aGlzLmNvbXBhcmF0b3ImJm51bGw9PXImJiExIT09ZS5zb3J0LG09bi5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpP3RoaXMuY29tcGFyYXRvcjpudWxsLGc9MDtnPHQubGVuZ3RoO2crKyl7bz10W2ddO3ZhciB2PXRoaXMuZ2V0KG8pO2lmKHYpe2lmKGwmJm8hPT12KXt2YXIgYj10aGlzLl9pc01vZGVsKG8pP28uYXR0cmlidXRlczpvO2UucGFyc2UmJihiPXYucGFyc2UoYixlKSksdi5zZXQoYixlKSxwJiYhZiYmKGY9di5oYXNDaGFuZ2VkKG0pKX1jW3YuY2lkXXx8KGNbdi5jaWRdPSEwLHMucHVzaCh2KSksdFtnXT12fWVsc2UgaCYmKG89dFtnXT10aGlzLl9wcmVwYXJlTW9kZWwobyxlKSkmJihhLnB1c2gobyksdGhpcy5fYWRkUmVmZXJlbmNlKG8sZSksY1tvLmNpZF09ITAscy5wdXNoKG8pKX1pZihkKXtmb3IoZz0wO2c8dGhpcy5sZW5ndGg7ZysrKW89dGhpcy5tb2RlbHNbZ10sY1tvLmNpZF18fHUucHVzaChvKTt1Lmxlbmd0aCYmdGhpcy5fcmVtb3ZlTW9kZWxzKHUsZSl9dmFyIHk9ITEsdz0hcCYmaCYmZDtpZihzLmxlbmd0aCYmdz8oeT10aGlzLmxlbmd0aCE9cy5sZW5ndGh8fG4uc29tZSh0aGlzLm1vZGVscyxmdW5jdGlvbih0LGUpe3JldHVybiB0IT09c1tlXX0pLHRoaXMubW9kZWxzLmxlbmd0aD0wLHgodGhpcy5tb2RlbHMscywwKSx0aGlzLmxlbmd0aD10aGlzLm1vZGVscy5sZW5ndGgpOmEubGVuZ3RoJiYocCYmKGY9ITApLHgodGhpcy5tb2RlbHMsYSxudWxsPT1yP3RoaXMubGVuZ3RoOnIpLHRoaXMubGVuZ3RoPXRoaXMubW9kZWxzLmxlbmd0aCksZiYmdGhpcy5zb3J0KHtzaWxlbnQ6ITB9KSwhZS5zaWxlbnQpe2ZvcihnPTA7ZzxhLmxlbmd0aDtnKyspbnVsbCE9ciYmKGUuaW5kZXg9citnKSwobz1hW2ddKS50cmlnZ2VyKCJhZGQiLG8sdGhpcyxlKTsoZnx8eSkmJnRoaXMudHJpZ2dlcigic29ydCIsdGhpcyxlKSwoYS5sZW5ndGh8fHUubGVuZ3RoKSYmdGhpcy50cmlnZ2VyKCJ1cGRhdGUiLHRoaXMsZSl9cmV0dXJuIGk/dFswXTp0fX0scmVzZXQ6ZnVuY3Rpb24odCxlKXtlPWU/bi5jbG9uZShlKTp7fTtmb3IodmFyIGk9MDtpPHRoaXMubW9kZWxzLmxlbmd0aDtpKyspdGhpcy5fcmVtb3ZlUmVmZXJlbmNlKHRoaXMubW9kZWxzW2ldLGUpO3JldHVybiBlLnByZXZpb3VzTW9kZWxzPXRoaXMubW9kZWxzLHRoaXMuX3Jlc2V0KCksdD10aGlzLmFkZCh0LG4uZXh0ZW5kKHtzaWxlbnQ6ITB9LGUpKSxlLnNpbGVudHx8dGhpcy50cmlnZ2VyKCJyZXNldCIsdGhpcyxlKSx0fSxwdXNoOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsbi5leHRlbmQoe2F0OnRoaXMubGVuZ3RofSxlKSl9LHBvcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmF0KHRoaXMubGVuZ3RoLTEpO3JldHVybiB0aGlzLnJlbW92ZShlLHQpfSx1bnNoaWZ0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsbi5leHRlbmQoe2F0OjB9LGUpKX0sc2hpZnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdCgwKTtyZXR1cm4gdGhpcy5yZW1vdmUoZSx0KX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gby5hcHBseSh0aGlzLm1vZGVscyxhcmd1bWVudHMpfSxnZXQ6ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dGhpcy5tb2RlbElkKHRoaXMuX2lzTW9kZWwodCk/dC5hdHRyaWJ1dGVzOnQpO3JldHVybiB0aGlzLl9ieUlkW3RdfHx0aGlzLl9ieUlkW2VdfHx0aGlzLl9ieUlkW3QuY2lkXX19LGF0OmZ1bmN0aW9uKHQpe3JldHVybiB0PDAmJih0Kz10aGlzLmxlbmd0aCksdGhpcy5tb2RlbHNbdF19LHdoZXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbZT8iZmluZCI6ImZpbHRlciJdKHQpfSxmaW5kV2hlcmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud2hlcmUodCwhMCl9LHNvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21wYXJhdG9yO2lmKCFlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNvcnQgYSBzZXQgd2l0aG91dCBhIGNvbXBhcmF0b3IiKTt0fHwodD17fSk7dmFyIGk9ZS5sZW5ndGg7cmV0dXJuIG4uaXNGdW5jdGlvbihlKSYmKGU9bi5iaW5kKGUsdGhpcykpLDE9PT1pfHxuLmlzU3RyaW5nKGUpP3RoaXMubW9kZWxzPXRoaXMuc29ydEJ5KGUpOnRoaXMubW9kZWxzLnNvcnQoZSksdC5zaWxlbnR8fHRoaXMudHJpZ2dlcigic29ydCIsdGhpcyx0KSx0aGlzfSxwbHVjazpmdW5jdGlvbih0KXtyZXR1cm4gbi5pbnZva2UodGhpcy5tb2RlbHMsImdldCIsdCl9LGZldGNoOmZ1bmN0aW9uKHQpe3ZhciBlPSh0PW4uZXh0ZW5kKHtwYXJzZTohMH0sdCkpLnN1Y2Nlc3MsaT10aGlzO3JldHVybiB0LnN1Y2Nlc3M9ZnVuY3Rpb24obil7dmFyIHI9dC5yZXNldD8icmVzZXQiOiJzZXQiO2lbcl0obix0KSxlJiZlLmNhbGwodC5jb250ZXh0LGksbix0KSxpLnRyaWdnZXIoInN5bmMiLGksbix0KX0sUih0aGlzLHQpLHRoaXMuc3luYygicmVhZCIsdGhpcyx0KX0sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9KGU9ZT9uLmNsb25lKGUpOnt9KS53YWl0O2lmKCEodD10aGlzLl9wcmVwYXJlTW9kZWwodCxlKSkpcmV0dXJuITE7aXx8dGhpcy5hZGQodCxlKTt2YXIgcj10aGlzLG89ZS5zdWNjZXNzO3JldHVybiBlLnN1Y2Nlc3M9ZnVuY3Rpb24odCxlLG4pe2kmJnIuYWRkKHQsbiksbyYmby5jYWxsKG4uY29udGV4dCx0LGUsbil9LHQuc2F2ZShudWxsLGUpLHR9LHBhcnNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubW9kZWxzLHttb2RlbDp0aGlzLm1vZGVsLGNvbXBhcmF0b3I6dGhpcy5jb21wYXJhdG9yfSl9LG1vZGVsSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbdGhpcy5tb2RlbC5wcm90b3R5cGUuaWRBdHRyaWJ1dGV8fCJpZCJdfSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmxlbmd0aD0wLHRoaXMubW9kZWxzPVtdLHRoaXMuX2J5SWQ9e319LF9wcmVwYXJlTW9kZWw6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9pc01vZGVsKHQpKXJldHVybiB0LmNvbGxlY3Rpb258fCh0LmNvbGxlY3Rpb249dGhpcyksdDsoZT1lP24uY2xvbmUoZSk6e30pLmNvbGxlY3Rpb249dGhpczt2YXIgaT1uZXcgdGhpcy5tb2RlbCh0LGUpO3JldHVybiBpLnZhbGlkYXRpb25FcnJvcj8odGhpcy50cmlnZ2VyKCJpbnZhbGlkIix0aGlzLGkudmFsaWRhdGlvbkVycm9yLGUpLCExKTppfSxfcmVtb3ZlTW9kZWxzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dGhpcy5nZXQodFtpXSk7aWYocil7dmFyIG89dGhpcy5pbmRleE9mKHIpO3RoaXMubW9kZWxzLnNwbGljZShvLDEpLHRoaXMubGVuZ3RoLS0sZS5zaWxlbnR8fChlLmluZGV4PW8sci50cmlnZ2VyKCJyZW1vdmUiLHIsdGhpcyxlKSksbi5wdXNoKHIpLHRoaXMuX3JlbW92ZVJlZmVyZW5jZShyLGUpfX1yZXR1cm4hIW4ubGVuZ3RoJiZufSxfaXNNb2RlbDpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGJ9LF9hZGRSZWZlcmVuY2U6ZnVuY3Rpb24odCxlKXt0aGlzLl9ieUlkW3QuY2lkXT10O3ZhciBuPXRoaXMubW9kZWxJZCh0LmF0dHJpYnV0ZXMpO251bGwhPW4mJih0aGlzLl9ieUlkW25dPXQpLHQub24oImFsbCIsdGhpcy5fb25Nb2RlbEV2ZW50LHRoaXMpfSxfcmVtb3ZlUmVmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7ZGVsZXRlIHRoaXMuX2J5SWRbdC5jaWRdO3ZhciBuPXRoaXMubW9kZWxJZCh0LmF0dHJpYnV0ZXMpO251bGwhPW4mJmRlbGV0ZSB0aGlzLl9ieUlkW25dLHRoaXM9PT10LmNvbGxlY3Rpb24mJmRlbGV0ZSB0LmNvbGxlY3Rpb24sdC5vZmYoImFsbCIsdGhpcy5fb25Nb2RlbEV2ZW50LHRoaXMpfSxfb25Nb2RlbEV2ZW50OmZ1bmN0aW9uKHQsZSxuLGkpe2lmKCJhZGQiIT09dCYmInJlbW92ZSIhPT10fHxuPT09dGhpcyl7aWYoImRlc3Ryb3kiPT09dCYmdGhpcy5yZW1vdmUoZSxpKSwiY2hhbmdlIj09PXQpe3ZhciByPXRoaXMubW9kZWxJZChlLnByZXZpb3VzQXR0cmlidXRlcygpKSxvPXRoaXMubW9kZWxJZChlLmF0dHJpYnV0ZXMpO3IhPT1vJiYobnVsbCE9ciYmZGVsZXRlIHRoaXMuX2J5SWRbcl0sbnVsbCE9byYmKHRoaXMuX2J5SWRbb109ZSkpfXRoaXMudHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0pLHMoeSx7Zm9yRWFjaDozLGVhY2g6MyxtYXA6Myxjb2xsZWN0OjMscmVkdWNlOjQsZm9sZGw6NCxpbmplY3Q6NCxyZWR1Y2VSaWdodDo0LGZvbGRyOjQsZmluZDozLGRldGVjdDozLGZpbHRlcjozLHNlbGVjdDozLHJlamVjdDozLGV2ZXJ5OjMsYWxsOjMsc29tZTozLGFueTozLGluY2x1ZGU6MyxpbmNsdWRlczozLGNvbnRhaW5zOjMsaW52b2tlOjAsbWF4OjMsbWluOjMsdG9BcnJheToxLHNpemU6MSxmaXJzdDozLGhlYWQ6Myx0YWtlOjMsaW5pdGlhbDozLHJlc3Q6Myx0YWlsOjMsZHJvcDozLGxhc3Q6Myx3aXRob3V0OjAsZGlmZmVyZW5jZTowLGluZGV4T2Y6MyxzaHVmZmxlOjEsbGFzdEluZGV4T2Y6Myxpc0VtcHR5OjEsY2hhaW46MSxzYW1wbGU6MyxwYXJ0aXRpb246Myxncm91cEJ5OjMsY291bnRCeTozLHNvcnRCeTozLGluZGV4Qnk6M30sIm1vZGVscyIpO3ZhciBNPWUuVmlldz1mdW5jdGlvbih0KXt0aGlzLmNpZD1uLnVuaXF1ZUlkKCJ2aWV3Iiksbi5leHRlbmQodGhpcyxuLnBpY2sodCxFKSksdGhpcy5fZW5zdXJlRWxlbWVudCgpLHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFM9L14oXFMrKVxzKiguKikkLyxFPVsibW9kZWwiLCJjb2xsZWN0aW9uIiwiZWwiLCJpZCIsImF0dHJpYnV0ZXMiLCJjbGFzc05hbWUiLCJ0YWdOYW1lIiwiZXZlbnRzIl07bi5leHRlbmQoTS5wcm90b3R5cGUsYyx7dGFnTmFtZToiZGl2IiwkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLiRlbC5maW5kKHQpfSxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbW92ZUVsZW1lbnQoKSx0aGlzLnN0b3BMaXN0ZW5pbmcoKSx0aGlzfSxfcmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMuJGVsLnJlbW92ZSgpfSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnVuZGVsZWdhdGVFdmVudHMoKSx0aGlzLl9zZXRFbGVtZW50KHQpLHRoaXMuZGVsZWdhdGVFdmVudHMoKSx0aGlzfSxfc2V0RWxlbWVudDpmdW5jdGlvbih0KXt0aGlzLiRlbD10IGluc3RhbmNlb2YgZS4kP3Q6ZS4kKHQpLHRoaXMuZWw9dGhpcy4kZWxbMF19LGRlbGVnYXRlRXZlbnRzOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PW4ucmVzdWx0KHRoaXMsImV2ZW50cyIpKSwhdClyZXR1cm4gdGhpcztmb3IodmFyIGUgaW4gdGhpcy51bmRlbGVnYXRlRXZlbnRzKCksdCl7dmFyIGk9dFtlXTtpZihuLmlzRnVuY3Rpb24oaSl8fChpPXRoaXNbaV0pLGkpe3ZhciByPWUubWF0Y2goUyk7dGhpcy5kZWxlZ2F0ZShyWzFdLHJbMl0sbi5iaW5kKGksdGhpcykpfX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLiRlbC5vbih0KyIuZGVsZWdhdGVFdmVudHMiK3RoaXMuY2lkLGUsbiksdGhpc30sdW5kZWxlZ2F0ZUV2ZW50czpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbCYmdGhpcy4kZWwub2ZmKCIuZGVsZWdhdGVFdmVudHMiK3RoaXMuY2lkKSx0aGlzfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy4kZWwub2ZmKHQrIi5kZWxlZ2F0ZUV2ZW50cyIrdGhpcy5jaWQsZSxuKSx0aGlzfSxfY3JlYXRlRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KX0sX2Vuc3VyZUVsZW1lbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLmVsKXRoaXMuc2V0RWxlbWVudChuLnJlc3VsdCh0aGlzLCJlbCIpKTtlbHNle3ZhciB0PW4uZXh0ZW5kKHt9LG4ucmVzdWx0KHRoaXMsImF0dHJpYnV0ZXMiKSk7dGhpcy5pZCYmKHQuaWQ9bi5yZXN1bHQodGhpcywiaWQiKSksdGhpcy5jbGFzc05hbWUmJih0LmNsYXNzPW4ucmVzdWx0KHRoaXMsImNsYXNzTmFtZSIpKSx0aGlzLnNldEVsZW1lbnQodGhpcy5fY3JlYXRlRWxlbWVudChuLnJlc3VsdCh0aGlzLCJ0YWdOYW1lIikpKSx0aGlzLl9zZXRBdHRyaWJ1dGVzKHQpfX0sX3NldEF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7dGhpcy4kZWwuYXR0cih0KX19KSxlLnN5bmM9ZnVuY3Rpb24odCxpLHIpe3ZhciBvPUFbdF07bi5kZWZhdWx0cyhyfHwocj17fSkse2VtdWxhdGVIVFRQOmUuZW11bGF0ZUhUVFAsZW11bGF0ZUpTT046ZS5lbXVsYXRlSlNPTn0pO3ZhciBzPXt0eXBlOm8sZGF0YVR5cGU6Impzb24ifTtpZihyLnVybHx8KHMudXJsPW4ucmVzdWx0KGksInVybCIpfHxEKCkpLG51bGwhPXIuZGF0YXx8IWl8fCJjcmVhdGUiIT09dCYmInVwZGF0ZSIhPT10JiYicGF0Y2giIT09dHx8KHMuY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLHMuZGF0YT1KU09OLnN0cmluZ2lmeShyLmF0dHJzfHxpLnRvSlNPTihyKSkpLHIuZW11bGF0ZUpTT04mJihzLmNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHMuZGF0YT1zLmRhdGE/e21vZGVsOnMuZGF0YX06e30pLHIuZW11bGF0ZUhUVFAmJigiUFVUIj09PW98fCJERUxFVEUiPT09b3x8IlBBVENIIj09PW8pKXtzLnR5cGU9IlBPU1QiLHIuZW11bGF0ZUpTT04mJihzLmRhdGEuX21ldGhvZD1vKTt2YXIgYT1yLmJlZm9yZVNlbmQ7ci5iZWZvcmVTZW5kPWZ1bmN0aW9uKHQpe2lmKHQuc2V0UmVxdWVzdEhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsbyksYSlyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSJHRVQiPT09cy50eXBlfHxyLmVtdWxhdGVKU09OfHwocy5wcm9jZXNzRGF0YT0hMSk7dmFyIHU9ci5lcnJvcjtyLmVycm9yPWZ1bmN0aW9uKHQsZSxuKXtyLnRleHRTdGF0dXM9ZSxyLmVycm9yVGhyb3duPW4sdSYmdS5jYWxsKHIuY29udGV4dCx0LGUsbil9O3ZhciBjPXIueGhyPWUuYWpheChuLmV4dGVuZChzLHIpKTtyZXR1cm4gaS50cmlnZ2VyKCJyZXF1ZXN0IixpLGMsciksY307dmFyIEE9e2NyZWF0ZToiUE9TVCIsdXBkYXRlOiJQVVQiLHBhdGNoOiJQQVRDSCIsZGVsZXRlOiJERUxFVEUiLHJlYWQ6IkdFVCJ9O2UuYWpheD1mdW5jdGlvbigpe3JldHVybiBlLiQuYWpheC5hcHBseShlLiQsYXJndW1lbnRzKX07dmFyIEM9ZS5Sb3V0ZXI9ZnVuY3Rpb24odCl7dHx8KHQ9e30pLHQucm91dGVzJiYodGhpcy5yb3V0ZXM9dC5yb3V0ZXMpLHRoaXMuX2JpbmRSb3V0ZXMoKSx0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxrPS9cKCguKj8pXCkvZyxPPS8oXChcPyk/Olx3Ky9nLFA9L1wqXHcrL2csVD0vW1wte31cW1xdKz8uLFxcXF4kfCNcc10vZztuLmV4dGVuZChDLnByb3RvdHlwZSxjLHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyb3V0ZTpmdW5jdGlvbih0LGkscil7bi5pc1JlZ0V4cCh0KXx8KHQ9dGhpcy5fcm91dGVUb1JlZ0V4cCh0KSksbi5pc0Z1bmN0aW9uKGkpJiYocj1pLGk9IiIpLHJ8fChyPXRoaXNbaV0pO3ZhciBvPXRoaXM7cmV0dXJuIGUuaGlzdG9yeS5yb3V0ZSh0LGZ1bmN0aW9uKG4pe3ZhciBzPW8uX2V4dHJhY3RQYXJhbWV0ZXJzKHQsbik7ITEhPT1vLmV4ZWN1dGUocixzLGkpJiYoby50cmlnZ2VyLmFwcGx5KG8sWyJyb3V0ZToiK2ldLmNvbmNhdChzKSksby50cmlnZ2VyKCJyb3V0ZSIsaSxzKSxlLmhpc3RvcnkudHJpZ2dlcigicm91dGUiLG8saSxzKSl9KSx0aGlzfSxleGVjdXRlOmZ1bmN0aW9uKHQsZSxuKXt0JiZ0LmFwcGx5KHRoaXMsZSl9LG5hdmlnYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuaGlzdG9yeS5uYXZpZ2F0ZSh0LG4pLHRoaXN9LF9iaW5kUm91dGVzOmZ1bmN0aW9uKCl7aWYodGhpcy5yb3V0ZXMpe3RoaXMucm91dGVzPW4ucmVzdWx0KHRoaXMsInJvdXRlcyIpO2Zvcih2YXIgdCxlPW4ua2V5cyh0aGlzLnJvdXRlcyk7bnVsbCE9KHQ9ZS5wb3AoKSk7KXRoaXMucm91dGUodCx0aGlzLnJvdXRlc1t0XSl9fSxfcm91dGVUb1JlZ0V4cDpmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoVCwiXFwkJiIpLnJlcGxhY2UoaywiKD86JDEpPyIpLnJlcGxhY2UoTyxmdW5jdGlvbih0LGUpe3JldHVybiBlP3Q6IihbXi8/XSspIn0pLnJlcGxhY2UoUCwiKFteP10qPykiKSxuZXcgUmVnRXhwKCJeIit0KyIoPzpcXD8oW1xcc1xcU10qKSk/JCIpfSxfZXh0cmFjdFBhcmFtZXRlcnM6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4ZWMoZSkuc2xpY2UoMSk7cmV0dXJuIG4ubWFwKGksZnVuY3Rpb24odCxlKXtyZXR1cm4gZT09PWkubGVuZ3RoLTE/dHx8bnVsbDp0P2RlY29kZVVSSUNvbXBvbmVudCh0KTpudWxsfSl9fSk7dmFyIGo9ZS5IaXN0b3J5PWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVycz1bXSx0aGlzLmNoZWNrVXJsPW4uYmluZCh0aGlzLmNoZWNrVXJsLHRoaXMpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYodGhpcy5sb2NhdGlvbj13aW5kb3cubG9jYXRpb24sdGhpcy5oaXN0b3J5PXdpbmRvdy5oaXN0b3J5KX0sST0vXlsjXC9dfFxzKyQvZyxMPS9eXC8rfFwvKyQvZyxCPS8jLiokLztqLnN0YXJ0ZWQ9ITEsbi5leHRlbmQoai5wcm90b3R5cGUsYyx7aW50ZXJ2YWw6NTAsYXRSb290OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9bXlwvXSQvLCIkJi8iKTtyZXR1cm4gdD09PXRoaXMucm9vdCYmIXRoaXMuZ2V0U2VhcmNoKCl9LG1hdGNoUm9vdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGVjb2RlRnJhZ21lbnQodGhpcy5sb2NhdGlvbi5wYXRobmFtZSksZT10LnNsaWNlKDAsdGhpcy5yb290Lmxlbmd0aC0xKSsiLyI7cmV0dXJuIGU9PT10aGlzLnJvb3R9LGRlY29kZUZyYWdtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBkZWNvZGVVUkkodC5yZXBsYWNlKC8lMjUvZywiJTI1MjUiKSl9LGdldFNlYXJjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiovLCIiKS5tYXRjaCgvXD8uKy8pO3JldHVybiB0P3RbMF06IiJ9LGdldEhhc2g6ZnVuY3Rpb24odCl7dmFyIGU9KHR8fHRoaXMpLmxvY2F0aW9uLmhyZWYubWF0Y2goLyMoLiopJC8pO3JldHVybiBlP2VbMV06IiJ9LGdldFBhdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRlY29kZUZyYWdtZW50KHRoaXMubG9jYXRpb24ucGF0aG5hbWUrdGhpcy5nZXRTZWFyY2goKSkuc2xpY2UodGhpcy5yb290Lmxlbmd0aC0xKTtyZXR1cm4iLyI9PT10LmNoYXJBdCgwKT90LnNsaWNlKDEpOnR9LGdldEZyYWdtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10JiYodD10aGlzLl91c2VQdXNoU3RhdGV8fCF0aGlzLl93YW50c0hhc2hDaGFuZ2U/dGhpcy5nZXRQYXRoKCk6dGhpcy5nZXRIYXNoKCkpLHQucmVwbGFjZShJLCIiKX0sc3RhcnQ6ZnVuY3Rpb24odCl7aWYoai5zdGFydGVkKXRocm93IG5ldyBFcnJvcigiQmFja2JvbmUuaGlzdG9yeSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQiKTtpZihqLnN0YXJ0ZWQ9ITAsdGhpcy5vcHRpb25zPW4uZXh0ZW5kKHtyb290OiIvIn0sdGhpcy5vcHRpb25zLHQpLHRoaXMucm9vdD10aGlzLm9wdGlvbnMucm9vdCx0aGlzLl93YW50c0hhc2hDaGFuZ2U9ITEhPT10aGlzLm9wdGlvbnMuaGFzaENoYW5nZSx0aGlzLl9oYXNIYXNoQ2hhbmdlPSJvbmhhc2hjaGFuZ2UiaW4gd2luZG93JiYodm9pZCAwPT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+NyksdGhpcy5fdXNlSGFzaENoYW5nZT10aGlzLl93YW50c0hhc2hDaGFuZ2UmJnRoaXMuX2hhc0hhc2hDaGFuZ2UsdGhpcy5fd2FudHNQdXNoU3RhdGU9ISF0aGlzLm9wdGlvbnMucHVzaFN0YXRlLHRoaXMuX2hhc1B1c2hTdGF0ZT0hKCF0aGlzLmhpc3Rvcnl8fCF0aGlzLmhpc3RvcnkucHVzaFN0YXRlKSx0aGlzLl91c2VQdXNoU3RhdGU9dGhpcy5fd2FudHNQdXNoU3RhdGUmJnRoaXMuX2hhc1B1c2hTdGF0ZSx0aGlzLmZyYWdtZW50PXRoaXMuZ2V0RnJhZ21lbnQoKSx0aGlzLnJvb3Q9KCIvIit0aGlzLnJvb3QrIi8iKS5yZXBsYWNlKEwsIi8iKSx0aGlzLl93YW50c0hhc2hDaGFuZ2UmJnRoaXMuX3dhbnRzUHVzaFN0YXRlKXtpZighdGhpcy5faGFzUHVzaFN0YXRlJiYhdGhpcy5hdFJvb3QoKSl7dmFyIGU9dGhpcy5yb290LnNsaWNlKDAsLTEpfHwiLyI7cmV0dXJuIHRoaXMubG9jYXRpb24ucmVwbGFjZShlKyIjIit0aGlzLmdldFBhdGgoKSksITB9dGhpcy5faGFzUHVzaFN0YXRlJiZ0aGlzLmF0Um9vdCgpJiZ0aGlzLm5hdmlnYXRlKHRoaXMuZ2V0SGFzaCgpLHtyZXBsYWNlOiEwfSl9aWYoIXRoaXMuX2hhc0hhc2hDaGFuZ2UmJnRoaXMuX3dhbnRzSGFzaENoYW5nZSYmIXRoaXMuX3VzZVB1c2hTdGF0ZSl7dGhpcy5pZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksdGhpcy5pZnJhbWUuc3JjPSJqYXZhc2NyaXB0OjAiLHRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuaWZyYW1lLnRhYkluZGV4PS0xO3ZhciBpPWRvY3VtZW50LmJvZHkscj1pLmluc2VydEJlZm9yZSh0aGlzLmlmcmFtZSxpLmZpcnN0Q2hpbGQpLmNvbnRlbnRXaW5kb3c7ci5kb2N1bWVudC5vcGVuKCksci5kb2N1bWVudC5jbG9zZSgpLHIubG9jYXRpb24uaGFzaD0iIyIrdGhpcy5mcmFnbWVudH12YXIgbz13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXR0YWNoRXZlbnQoIm9uIit0LGUpfTtpZih0aGlzLl91c2VQdXNoU3RhdGU/bygicG9wc3RhdGUiLHRoaXMuY2hlY2tVcmwsITEpOnRoaXMuX3VzZUhhc2hDaGFuZ2UmJiF0aGlzLmlmcmFtZT9vKCJoYXNoY2hhbmdlIix0aGlzLmNoZWNrVXJsLCExKTp0aGlzLl93YW50c0hhc2hDaGFuZ2UmJih0aGlzLl9jaGVja1VybEludGVydmFsPXNldEludGVydmFsKHRoaXMuY2hlY2tVcmwsdGhpcy5pbnRlcnZhbCkpLCF0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiB0aGlzLmxvYWRVcmwoKX0sc3RvcDpmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyfHxmdW5jdGlvbih0LGUpe3JldHVybiBkZXRhY2hFdmVudCgib24iK3QsZSl9O3RoaXMuX3VzZVB1c2hTdGF0ZT90KCJwb3BzdGF0ZSIsdGhpcy5jaGVja1VybCwhMSk6dGhpcy5fdXNlSGFzaENoYW5nZSYmIXRoaXMuaWZyYW1lJiZ0KCJoYXNoY2hhbmdlIix0aGlzLmNoZWNrVXJsLCExKSx0aGlzLmlmcmFtZSYmKGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5pZnJhbWUpLHRoaXMuaWZyYW1lPW51bGwpLHRoaXMuX2NoZWNrVXJsSW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tVcmxJbnRlcnZhbCksai5zdGFydGVkPSExfSxyb3V0ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlcnMudW5zaGlmdCh7cm91dGU6dCxjYWxsYmFjazplfSl9LGNoZWNrVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RnJhZ21lbnQoKTtpZihlPT09dGhpcy5mcmFnbWVudCYmdGhpcy5pZnJhbWUmJihlPXRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSksZT09PXRoaXMuZnJhZ21lbnQpcmV0dXJuITE7dGhpcy5pZnJhbWUmJnRoaXMubmF2aWdhdGUoZSksdGhpcy5sb2FkVXJsKCl9LGxvYWRVcmw6ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLm1hdGNoUm9vdCgpJiYodD10aGlzLmZyYWdtZW50PXRoaXMuZ2V0RnJhZ21lbnQodCksbi5zb21lKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oZSl7aWYoZS5yb3V0ZS50ZXN0KHQpKXJldHVybiBlLmNhbGxiYWNrKHQpLCEwfSkpfSxuYXZpZ2F0ZTpmdW5jdGlvbih0LGUpe2lmKCFqLnN0YXJ0ZWQpcmV0dXJuITE7ZSYmITAhPT1lfHwoZT17dHJpZ2dlcjohIWV9KSx0PXRoaXMuZ2V0RnJhZ21lbnQodHx8IiIpO3ZhciBuPXRoaXMucm9vdDsiIiE9PXQmJiI/IiE9PXQuY2hhckF0KDApfHwobj1uLnNsaWNlKDAsLTEpfHwiLyIpO3ZhciBpPW4rdDtpZih0PXRoaXMuZGVjb2RlRnJhZ21lbnQodC5yZXBsYWNlKEIsIiIpKSx0aGlzLmZyYWdtZW50IT09dCl7aWYodGhpcy5mcmFnbWVudD10LHRoaXMuX3VzZVB1c2hTdGF0ZSl0aGlzLmhpc3RvcnlbZS5yZXBsYWNlPyJyZXBsYWNlU3RhdGUiOiJwdXNoU3RhdGUiXSh7fSxkb2N1bWVudC50aXRsZSxpKTtlbHNle2lmKCF0aGlzLl93YW50c0hhc2hDaGFuZ2UpcmV0dXJuIHRoaXMubG9jYXRpb24uYXNzaWduKGkpO2lmKHRoaXMuX3VwZGF0ZUhhc2godGhpcy5sb2NhdGlvbix0LGUucmVwbGFjZSksdGhpcy5pZnJhbWUmJnQhPT10aGlzLmdldEhhc2godGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykpe3ZhciByPXRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3c7ZS5yZXBsYWNlfHwoci5kb2N1bWVudC5vcGVuKCksci5kb2N1bWVudC5jbG9zZSgpKSx0aGlzLl91cGRhdGVIYXNoKHIubG9jYXRpb24sdCxlLnJlcGxhY2UpfX1yZXR1cm4gZS50cmlnZ2VyP3RoaXMubG9hZFVybCh0KTp2b2lkIDB9fSxfdXBkYXRlSGFzaDpmdW5jdGlvbih0LGUsbil7aWYobil7dmFyIGk9dC5ocmVmLnJlcGxhY2UoLyhqYXZhc2NyaXB0OnwjKS4qJC8sIiIpO3QucmVwbGFjZShpKyIjIitlKX1lbHNlIHQuaGFzaD0iIyIrZX19KSxlLmhpc3Rvcnk9bmV3IGosYi5leHRlbmQ9eS5leHRlbmQ9Qy5leHRlbmQ9TS5leHRlbmQ9ai5leHRlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyPXRoaXM7aT10JiZuLmhhcyh0LCJjb25zdHJ1Y3RvciIpP3QuY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4uZXh0ZW5kKGkscixlKTt2YXIgbz1mdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3I9aX07cmV0dXJuIG8ucHJvdG90eXBlPXIucHJvdG90eXBlLGkucHJvdG90eXBlPW5ldyBvLHQmJm4uZXh0ZW5kKGkucHJvdG90eXBlLHQpLGkuX19zdXBlcl9fPXIucHJvdG90eXBlLGl9O3ZhciBEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCdBICJ1cmwiIHByb3BlcnR5IG9yIGZ1bmN0aW9uIG11c3QgYmUgc3BlY2lmaWVkJyl9LFI9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVycm9yO2UuZXJyb3I9ZnVuY3Rpb24oaSl7biYmbi5jYWxsKGUuY29udGV4dCx0LGksZSksdC50cmlnZ2VyKCJlcnJvciIsdCxpLGUpfX07cmV0dXJuIGV9KHMsbix0LGUpfS5hcHBseShlLHIpKXx8KHQuZXhwb3J0cz1vKX0pLmNhbGwodGhpcyxuKDEzKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpLHI9bigyKSxvPW4oMjYpLHM9big3OCksYT1uKDkpLHU9big3OSksYz1uKDExKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX3RpbWVySUQ9MCx0aGlzLl9yZXBsYXlpbmc9ITEsdGhpcy5fa2V5c3Ryb2tlcz1bXSx0aGlzLl9rZXlkb3duRXZlbnRzPVtdLHRoaXMuX2tleUJpbmRpbmdzPVtdLHRoaXMuX2V4YWN0S2V5TWF0Y2g9bnVsbCx0aGlzLl9jb21tYW5kcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2NvbW1hbmRDaGFuZ2VkPW5ldyBjLlNpZ25hbCh0aGlzKSx0aGlzLl9jb21tYW5kRXhlY3V0ZWQ9bmV3IGMuU2lnbmFsKHRoaXMpLHRoaXMuX2tleUJpbmRpbmdDaGFuZ2VkPW5ldyBjLlNpZ25hbCh0aGlzKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjb21tYW5kQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNvbW1hbmRFeGVjdXRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kRXhlY3V0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJrZXlCaW5kaW5nQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9rZXlCaW5kaW5nQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImtleUJpbmRpbmdzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2tleUJpbmRpbmdzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmxpc3RDb21tYW5kcz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9jb21tYW5kcyl9LHQucHJvdG90eXBlLmhhc0NvbW1hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5fY29tbWFuZHN9LHQucHJvdG90eXBlLmFkZENvbW1hbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKHQgaW4gdGhpcy5fY29tbWFuZHMpdGhyb3cgbmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgYWxyZWFkeSByZWdpc3RlcmVkLiIpO3JldHVybiB0aGlzLl9jb21tYW5kc1t0XT1pLmNyZWF0ZUNvbW1hbmQoZSksdGhpcy5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOiJhZGRlZCJ9KSxuZXcgcy5EaXNwb3NhYmxlRGVsZWdhdGUoZnVuY3Rpb24oKXtkZWxldGUgbi5fY29tbWFuZHNbdF0sbi5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOiJyZW1vdmVkIn0pfSl9LHQucHJvdG90eXBlLm5vdGlmeUNvbW1hbmRDaGFuZ2VkPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQmJiEodCBpbiB0aGlzLl9jb21tYW5kcykpdGhyb3cgbmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgaXMgbm90IHJlZ2lzdGVyZWQuIik7dGhpcy5fY29tbWFuZENoYW5nZWQuZW1pdCh7aWQ6dCx0eXBlOnQ/ImNoYW5nZWQiOiJtYW55LWNoYW5nZWQifSl9LHQucHJvdG90eXBlLmxhYmVsPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9by5KU09ORXh0LmVtcHR5T2JqZWN0KTt2YXIgbj10aGlzLl9jb21tYW5kc1t0XTtyZXR1cm4gbj9uLmxhYmVsLmNhbGwodm9pZCAwLGUpOiIifSx0LnByb3RvdHlwZS5tbmVtb25pYz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5tbmVtb25pYy5jYWxsKHZvaWQgMCxlKTotMX0sdC5wcm90b3R5cGUuaWNvbj1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpLHRoaXMuaWNvbkNsYXNzKHQsZSl9LHQucHJvdG90eXBlLmljb25DbGFzcz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5pY29uQ2xhc3MuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmljb25MYWJlbD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5pY29uTGFiZWwuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmNhcHRpb249ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24uY2FwdGlvbi5jYWxsKHZvaWQgMCxlKToiIn0sdC5wcm90b3R5cGUudXNhZ2U9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24udXNhZ2UuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmNsYXNzTmFtZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuIG4/bi5jbGFzc05hbWUuY2FsbCh2b2lkIDAsZSk6IiJ9LHQucHJvdG90eXBlLmRhdGFzZXQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiBuP24uZGF0YXNldC5jYWxsKHZvaWQgMCxlKTp7fX0sdC5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9by5KU09ORXh0LmVtcHR5T2JqZWN0KTt2YXIgbj10aGlzLl9jb21tYW5kc1t0XTtyZXR1cm4hIW4mJm4uaXNFbmFibGVkLmNhbGwodm9pZCAwLGUpfSx0LnByb3RvdHlwZS5pc1RvZ2dsZWQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT1vLkpTT05FeHQuZW1wdHlPYmplY3QpO3ZhciBuPXRoaXMuX2NvbW1hbmRzW3RdO3JldHVybiEhbiYmbi5pc1RvZ2dsZWQuY2FsbCh2b2lkIDAsZSl9LHQucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG49dGhpcy5fY29tbWFuZHNbdF07cmV0dXJuISFuJiZuLmlzVmlzaWJsZS5jYWxsKHZvaWQgMCxlKX0sdC5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW8uSlNPTkV4dC5lbXB0eU9iamVjdCk7dmFyIG4saT10aGlzLl9jb21tYW5kc1t0XTtpZighaSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDb21tYW5kICciK3QrIicgbm90IHJlZ2lzdGVyZWQuIikpO3RyeXtuPWkuZXhlY3V0ZS5jYWxsKHZvaWQgMCxlKX1jYXRjaCh0KXtuPVByb21pc2UucmVqZWN0KHQpfXZhciByPVByb21pc2UucmVzb2x2ZShuKTtyZXR1cm4gdGhpcy5fY29tbWFuZEV4ZWN1dGVkLmVtaXQoe2lkOnQsYXJnczplLHJlc3VsdDpyfSkscn0sdC5wcm90b3R5cGUuYWRkS2V5QmluZGluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49aS5jcmVhdGVLZXlCaW5kaW5nKHQpO3JldHVybiB0aGlzLl9rZXlCaW5kaW5ncy5wdXNoKG4pLHRoaXMuX2tleUJpbmRpbmdDaGFuZ2VkLmVtaXQoe2JpbmRpbmc6bix0eXBlOiJhZGRlZCJ9KSxuZXcgcy5EaXNwb3NhYmxlRGVsZWdhdGUoZnVuY3Rpb24oKXtyLkFycmF5RXh0LnJlbW92ZUZpcnN0T2YoZS5fa2V5QmluZGluZ3MsbiksZS5fa2V5QmluZGluZ0NoYW5nZWQuZW1pdCh7YmluZGluZzpuLHR5cGU6InJlbW92ZWQifSl9KX0sdC5wcm90b3R5cGUucHJvY2Vzc0tleWRvd25FdmVudD1mdW5jdGlvbihlKXtpZighdGhpcy5fcmVwbGF5aW5nKXt2YXIgbj10LmtleXN0cm9rZUZvcktleWRvd25FdmVudChlKTtpZighbilyZXR1cm4gdGhpcy5fcmVwbGF5S2V5ZG93bkV2ZW50cygpLHZvaWQgdGhpcy5fY2xlYXJQZW5kaW5nU3RhdGUoKTt0aGlzLl9rZXlzdHJva2VzLnB1c2gobik7dmFyIHI9aS5tYXRjaEtleUJpbmRpbmcodGhpcy5fa2V5QmluZGluZ3MsdGhpcy5fa2V5c3Ryb2tlcyxlKSxvPXIuZXhhY3Qscz1yLnBhcnRpYWw7aWYoIW8mJiFzKXJldHVybiB0aGlzLl9yZXBsYXlLZXlkb3duRXZlbnRzKCksdm9pZCB0aGlzLl9jbGVhclBlbmRpbmdTdGF0ZSgpO2lmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLG8mJiFzKXJldHVybiB0aGlzLl9leGVjdXRlS2V5QmluZGluZyhvKSx2b2lkIHRoaXMuX2NsZWFyUGVuZGluZ1N0YXRlKCk7byYmKHRoaXMuX2V4YWN0S2V5TWF0Y2g9byksdGhpcy5fa2V5ZG93bkV2ZW50cy5wdXNoKGUpLHRoaXMuX3N0YXJ0VGltZXIoKX19LHQucHJvdG90eXBlLl9zdGFydFRpbWVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fdGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb25QZW5kaW5nVGltZW91dCgpfSxpLkNIT1JEX1RJTUVPVVQpfSx0LnByb3RvdHlwZS5fY2xlYXJUaW1lcj1mdW5jdGlvbigpezAhPT10aGlzLl90aW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySUQpLHRoaXMuX3RpbWVySUQ9MCl9LHQucHJvdG90eXBlLl9yZXBsYXlLZXlkb3duRXZlbnRzPWZ1bmN0aW9uKCl7MCE9PXRoaXMuX2tleWRvd25FdmVudHMubGVuZ3RoJiYodGhpcy5fcmVwbGF5aW5nPSEwLHRoaXMuX2tleWRvd25FdmVudHMuZm9yRWFjaChpLnJlcGxheUtleUV2ZW50KSx0aGlzLl9yZXBsYXlpbmc9ITEpfSx0LnByb3RvdHlwZS5fZXhlY3V0ZUtleUJpbmRpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb21tYW5kLG49dC5hcmdzO2lmKHRoaXMuaGFzQ29tbWFuZChlKSYmdGhpcy5pc0VuYWJsZWQoZSxuKSl0aGlzLmV4ZWN1dGUoZSxuKTtlbHNle3ZhciBpPXRoaXMuaGFzQ29tbWFuZChlKT8iZW5hYmxlZCI6InJlZ2lzdGVyZWQiLHI9IkNhbm5vdCBleGVjdXRlIGtleSBiaW5kaW5nICciK3Qua2V5cy5qb2luKCIsICIpKyInOiIsbz0iY29tbWFuZCAnIitlKyInIGlzIG5vdCAiK2krIi4iO2NvbnNvbGUud2FybihyKyIgIitvKX19LHQucHJvdG90eXBlLl9jbGVhclBlbmRpbmdTdGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyVGltZXIoKSx0aGlzLl9leGFjdEtleU1hdGNoPW51bGwsdGhpcy5fa2V5c3Ryb2tlcy5sZW5ndGg9MCx0aGlzLl9rZXlkb3duRXZlbnRzLmxlbmd0aD0wfSx0LnByb3RvdHlwZS5fb25QZW5kaW5nVGltZW91dD1mdW5jdGlvbigpe3RoaXMuX3RpbWVySUQ9MCx0aGlzLl9leGFjdEtleU1hdGNoP3RoaXMuX2V4ZWN1dGVLZXlCaW5kaW5nKHRoaXMuX2V4YWN0S2V5TWF0Y2gpOnRoaXMuX3JlcGxheUtleWRvd25FdmVudHMoKSx0aGlzLl9jbGVhclBlbmRpbmdTdGF0ZSgpfSx0fSgpO2UuQ29tbWFuZFJlZ2lzdHJ5PWgsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtmb3IodmFyIGU9IiIsbj0hMSxpPSExLHI9ITEsbz0hMSxzPTAsdT10LnNwbGl0KC9ccysvKTtzPHUubGVuZ3RoO3MrKyl7dmFyIGM9dVtzXTsiQWNjZWwiPT09Yz9hLlBsYXRmb3JtLklTX01BQz9pPSEwOnI9ITA6IkFsdCI9PT1jP249ITA6IkNtZCI9PT1jP2k9ITA6IkN0cmwiPT09Yz9yPSEwOiJTaGlmdCI9PT1jP289ITA6Yy5sZW5ndGg+MCYmKGU9Yyl9cmV0dXJue2NtZDppLGN0cmw6cixhbHQ6bixzaGlmdDpvLGtleTplfX10LnBhcnNlS2V5c3Ryb2tlPWUsdC5ub3JtYWxpemVLZXlzdHJva2U9ZnVuY3Rpb24odCl7dmFyIG49IiIsaT1lKHQpO3JldHVybiBpLmN0cmwmJihuKz0iQ3RybCAiKSxpLmFsdCYmKG4rPSJBbHQgIiksaS5zaGlmdCYmKG4rPSJTaGlmdCAiKSxpLmNtZCYmYS5QbGF0Zm9ybS5JU19NQUMmJihuKz0iQ21kICIpLG4raS5rZXl9LHQuZm9ybWF0S2V5c3Ryb2tlPWZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9ZSh0KTtyZXR1cm4gYS5QbGF0Zm9ybS5JU19NQUM/KGkuY3RybCYmKG4rPSLijIMgIiksaS5hbHQmJihuKz0i4oylICIpLGkuc2hpZnQmJihuKz0i4oenICIpLGkuY21kJiYobis9IuKMmCAiKSk6KGkuY3RybCYmKG4rPSJDdHJsKyIpLGkuYWx0JiYobis9IkFsdCsiKSxpLnNoaWZ0JiYobis9IlNoaWZ0KyIpKSxuK2kua2V5fSx0LmtleXN0cm9rZUZvcktleWRvd25FdmVudD1mdW5jdGlvbih0KXt2YXIgZT11LmdldEtleWJvYXJkTGF5b3V0KCkua2V5Rm9yS2V5ZG93bkV2ZW50KHQpO2lmKCFlKXJldHVybiIiO3ZhciBuPSIiO3JldHVybiB0LmN0cmxLZXkmJihuKz0iQ3RybCAiKSx0LmFsdEtleSYmKG4rPSJBbHQgIiksdC5zaGlmdEtleSYmKG4rPSJTaGlmdCAiKSx0Lm1ldGFLZXkmJmEuUGxhdGZvcm0uSVNfTUFDJiYobis9IkNtZCAiKSxuK2V9fShoPWUuQ29tbWFuZFJlZ2lzdHJ5fHwoZS5Db21tYW5kUmVnaXN0cnk9e30pKSxlLkNvbW1hbmRSZWdpc3RyeT1oLGZ1bmN0aW9uKHQpe3QuQ0hPUkRfVElNRU9VVD0xZTMsdC5jcmVhdGVDb21tYW5kPWZ1bmN0aW9uKHQpe3JldHVybntleGVjdXRlOnQuZXhlY3V0ZSxsYWJlbDp1KHQubGFiZWwsZSksbW5lbW9uaWM6dSh0Lm1uZW1vbmljLG4pLGljb25DbGFzczp1KHQuaWNvbkNsYXNzfHx0Lmljb24sZSksaWNvbkxhYmVsOnUodC5pY29uTGFiZWwsZSksY2FwdGlvbjp1KHQuY2FwdGlvbixlKSx1c2FnZTp1KHQudXNhZ2UsZSksY2xhc3NOYW1lOnUodC5jbGFzc05hbWUsZSksZGF0YXNldDp1KHQuZGF0YXNldCxzKSxpc0VuYWJsZWQ6dC5pc0VuYWJsZWR8fGksaXNUb2dnbGVkOnQuaXNUb2dnbGVkfHxyLGlzVmlzaWJsZTp0LmlzVmlzaWJsZXx8aX19LHQuY3JlYXRlS2V5QmluZGluZz1mdW5jdGlvbih0KXtyZXR1cm57a2V5czpjKHQpLHNlbGVjdG9yOmwodCksY29tbWFuZDp0LmNvbW1hbmQsYXJnczp0LmFyZ3N8fG8uSlNPTkV4dC5lbXB0eU9iamVjdH19LHQubWF0Y2hLZXlCaW5kaW5nPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bnVsbCxyPSExLG89MS8wLHM9MCx1PTAsYz10Lmxlbmd0aDt1PGM7Kyt1KXt2YXIgaD10W3VdLGw9ZChoLmtleXMsZSk7aWYoMCE9PWwpaWYoMiE9PWwpe3ZhciBwPWYoaC5zZWxlY3RvcixuKTtpZighKC0xPT09cHx8cD5vKSl7dmFyIG09YS5TZWxlY3Rvci5jYWxjdWxhdGVTcGVjaWZpY2l0eShoLnNlbGVjdG9yKTsoIWl8fHA8b3x8bT49cykmJihpPWgsbz1wLHM9bSl9fWVsc2Ugcnx8LTE9PT1mKGguc2VsZWN0b3Isbil8fChyPSEwKX1yZXR1cm57ZXhhY3Q6aSxwYXJ0aWFsOnJ9fSx0LnJlcGxheUtleUV2ZW50PWZ1bmN0aW9uKHQpe3QudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj10LmJ1YmJsZXN8fCEwLGk9dC5jYW5jZWxhYmxlfHwhMDtyZXR1cm4gZS5pbml0RXZlbnQodC50eXBlfHwia2V5ZG93biIsbixpKSxlLmtleT10LmtleXx8IiIsZS5rZXlDb2RlPXQua2V5Q29kZXx8MCxlLndoaWNoPXQua2V5Q29kZXx8MCxlLmN0cmxLZXk9dC5jdHJsS2V5fHwhMSxlLmFsdEtleT10LmFsdEtleXx8ITEsZS5zaGlmdEtleT10LnNoaWZ0S2V5fHwhMSxlLm1ldGFLZXk9dC5tZXRhS2V5fHwhMSxlLnZpZXc9dC52aWV3fHx3aW5kb3csZX0odCkpfTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiIifSxuPWZ1bmN0aW9uKCl7cmV0dXJuLTF9LGk9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scj1mdW5jdGlvbigpe3JldHVybiExfSxzPWZ1bmN0aW9uKCl7cmV0dXJue319O2Z1bmN0aW9uIHUodCxlKXtyZXR1cm4gdm9pZCAwPT09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gYyh0KXtyZXR1cm4oYS5QbGF0Zm9ybS5JU19XSU4/dC53aW5LZXlzfHx0LmtleXM6YS5QbGF0Zm9ybS5JU19NQUM/dC5tYWNLZXlzfHx0LmtleXM6dC5saW51eEtleXN8fHQua2V5cykubWFwKGgubm9ybWFsaXplS2V5c3Ryb2tlKX1mdW5jdGlvbiBsKHQpe2lmKC0xIT09dC5zZWxlY3Rvci5pbmRleE9mKCIsIikpdGhyb3cgbmV3IEVycm9yKCJTZWxlY3RvciBjYW5ub3QgY29udGFpbiBjb21tYXM6ICIrdC5zZWxlY3Rvcik7aWYoIWEuU2VsZWN0b3IuaXNWYWxpZCh0LnNlbGVjdG9yKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2VsZWN0b3I6ICIrdC5zZWxlY3Rvcik7cmV0dXJuIHQuc2VsZWN0b3J9ZnVuY3Rpb24gZCh0LGUpe2lmKHQubGVuZ3RoPGUubGVuZ3RoKXJldHVybiAwO2Zvcih2YXIgbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilpZih0W25dIT09ZVtuXSlyZXR1cm4gMDtyZXR1cm4gdC5sZW5ndGg+ZS5sZW5ndGg/MjoxfWZ1bmN0aW9uIGYodCxlKXtmb3IodmFyIG49ZS50YXJnZXQsaT1lLmN1cnJlbnRUYXJnZXQscj0wO251bGwhPT1uO249bi5wYXJlbnRFbGVtZW50LCsrcil7aWYoYS5TZWxlY3Rvci5tYXRjaGVzKG4sdCkpcmV0dXJuIHI7aWYobj09PWkpcmV0dXJuLTF9cmV0dXJuLTF9fShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHMsYT1uKDIpLHU9bigxMzApLGM9bigyNiksaD1uKDkpLGw9big3OSksZD1uKDUpLGY9bigxMSkscD1uKDU1KSxtPW4oNyksZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLHtub2RlOnMuY3JlYXRlTm9kZSgpfSl8fHRoaXM7cmV0dXJuIGkuX2NoaWxkSW5kZXg9LTEsaS5fYWN0aXZlSW5kZXg9LTEsaS5fb3BlblRpbWVySUQ9MCxpLl9jbG9zZVRpbWVySUQ9MCxpLl9pdGVtcz1bXSxpLl9jaGlsZE1lbnU9bnVsbCxpLl9wYXJlbnRNZW51PW51bGwsaS5fYWJvdXRUb0Nsb3NlPW5ldyBmLlNpZ25hbChpKSxpLl9tZW51UmVxdWVzdGVkPW5ldyBmLlNpZ25hbChpKSxpLmFkZENsYXNzKCJwLU1lbnUiKSxpLnNldEZsYWcobS5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5jb21tYW5kcz1uLmNvbW1hbmRzLGkucmVuZGVyZXI9bi5yZW5kZXJlcnx8ZS5kZWZhdWx0UmVuZGVyZXIsaX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCksdGhpcy5faXRlbXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFib3V0VG9DbG9zZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hYm91dFRvQ2xvc2V9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtZW51UmVxdWVzdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lbnVSZXF1ZXN0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwYXJlbnRNZW51Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudE1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjaGlsZE1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRNZW51fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicm9vdE1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0Ll9wYXJlbnRNZW51Oyl0PXQuX3BhcmVudE1lbnU7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZWFmTWVudSIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QuX2NoaWxkTWVudTspdD10Ll9jaGlsZE1lbnU7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1NZW51LWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFjdGl2ZUl0ZW0iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbXNbdGhpcy5fYWN0aXZlSW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmVJbmRleD10P3RoaXMuX2l0ZW1zLmluZGV4T2YodCk6LTF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhY3RpdmVJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVJbmRleH0sc2V0OmZ1bmN0aW9uKHQpeyh0PDB8fHQ+PXRoaXMuX2l0ZW1zLmxlbmd0aCkmJih0PS0xKSwtMT09PXR8fHMuY2FuQWN0aXZhdGUodGhpcy5faXRlbXNbdF0pfHwodD0tMSksdGhpcy5fYWN0aXZlSW5kZXghPT10JiYodGhpcy5fYWN0aXZlSW5kZXg9dCx0aGlzLnVwZGF0ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIml0ZW1zIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmFjdGl2YXRlTmV4dEl0ZW09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pdGVtcy5sZW5ndGgsZT10aGlzLl9hY3RpdmVJbmRleCxuPWU8dC0xP2UrMTowLGk9MD09PW4/dC0xOm4tMTt0aGlzLmFjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5faXRlbXMscy5jYW5BY3RpdmF0ZSxuLGkpfSxlLnByb3RvdHlwZS5hY3RpdmF0ZVByZXZpb3VzSXRlbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2l0ZW1zLmxlbmd0aCxlPXRoaXMuX2FjdGl2ZUluZGV4LG49ZTw9MD90LTE6ZS0xLGk9bj09PXQtMT8wOm4rMTt0aGlzLmFjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZExhc3RJbmRleCh0aGlzLl9pdGVtcyxzLmNhbkFjdGl2YXRlLG4saSl9LGUucHJvdG90eXBlLnRyaWdnZXJBY3RpdmVJdGVtPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKXt2YXIgdD10aGlzLmFjdGl2ZUl0ZW07aWYodClpZih0aGlzLl9jYW5jZWxPcGVuVGltZXIoKSx0aGlzLl9jYW5jZWxDbG9zZVRpbWVyKCksInN1Ym1lbnUiIT09dC50eXBlKXt0aGlzLnJvb3RNZW51LmNsb3NlKCk7dmFyIGU9dC5jb21tYW5kLG49dC5hcmdzO3RoaXMuY29tbWFuZHMuaXNFbmFibGVkKGUsbik/dGhpcy5jb21tYW5kcy5leGVjdXRlKGUsbik6Y29uc29sZS5sb2coIkNvbW1hbmQgJyIrZSsiJyBpcyBkaXNhYmxlZC4iKX1lbHNlIHRoaXMuX29wZW5DaGlsZE1lbnUoITApfX0sZS5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnNlcnRJdGVtKHRoaXMuX2l0ZW1zLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0SXRlbT1mdW5jdGlvbih0LGUpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5jbG9zZSgpLHRoaXMuYWN0aXZlSW5kZXg9LTE7dmFyIG49TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX2l0ZW1zLmxlbmd0aCkpLGk9cy5jcmVhdGVJdGVtKHRoaXMsZSk7cmV0dXJuIGEuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX2l0ZW1zLG4saSksdGhpcy51cGRhdGUoKSxpfSxlLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlSXRlbUF0KHRoaXMuX2l0ZW1zLmluZGV4T2YodCkpfSxlLnByb3RvdHlwZS5yZW1vdmVJdGVtQXQ9ZnVuY3Rpb24odCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsb3NlKCksdGhpcy5hY3RpdmVJbmRleD0tMSxhLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpJiZ0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5jbGVhckl0ZW1zPWZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsb3NlKCksdGhpcy5hY3RpdmVJbmRleD0tMSwwIT09dGhpcy5faXRlbXMubGVuZ3RoJiYodGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy51cGRhdGUoKSl9LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24odCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdGhpcy5pc0F0dGFjaGVkKXt2YXIgaT1uLmZvcmNlWHx8ITEscj1uLmZvcmNlWXx8ITE7cy5vcGVuUm9vdE1lbnUodGhpcyx0LGUsaSxyKSx0aGlzLmFjdGl2YXRlKCl9fSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlImtleWRvd24iOnRoaXMuX2V2dEtleURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZXVwIjp0aGlzLl9ldnRNb3VzZVVwKHQpO2JyZWFrO2Nhc2UibW91c2Vtb3ZlIjp0aGlzLl9ldnRNb3VzZU1vdmUodCk7YnJlYWs7Y2FzZSJtb3VzZWVudGVyIjp0aGlzLl9ldnRNb3VzZUVudGVyKHQpO2JyZWFrO2Nhc2UibW91c2VsZWF2ZSI6dGhpcy5fZXZ0TW91c2VMZWF2ZSh0KTticmVhaztjYXNlIm1vdXNlZG93biI6dGhpcy5fZXZ0TW91c2VEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLCEwKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdGhpcyksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApfSxlLnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm9kZS5mb2N1cygpfSxlLnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2l0ZW1zLG49dGhpcy5yZW5kZXJlcixpPXRoaXMuX2FjdGl2ZUluZGV4LHI9cy5jb21wdXRlQ29sbGFwc2VkKGUpLG89bmV3IEFycmF5KGUubGVuZ3RoKSxhPTAsdT1lLmxlbmd0aDthPHU7KythKXt2YXIgYz1lW2FdLGg9YT09PWksbD1yW2FdO29bYV09bi5yZW5kZXJJdGVtKHtpdGVtOmMsYWN0aXZlOmgsY29sbGFwc2VkOmx9KX1wLlZpcnR1YWxET00ucmVuZGVyKG8sdGhpcy5jb250ZW50Tm9kZSl9LGUucHJvdG90eXBlLm9uQ2xvc2VSZXF1ZXN0PWZ1bmN0aW9uKGUpe3RoaXMuX2NhbmNlbE9wZW5UaW1lcigpLHRoaXMuX2NhbmNlbENsb3NlVGltZXIoKSx0aGlzLmFjdGl2ZUluZGV4PS0xO3ZhciBuPXRoaXMuX2NoaWxkTWVudTtuJiYodGhpcy5fY2hpbGRJbmRleD0tMSx0aGlzLl9jaGlsZE1lbnU9bnVsbCxuLl9wYXJlbnRNZW51PW51bGwsbi5jbG9zZSgpKTt2YXIgaT10aGlzLl9wYXJlbnRNZW51O2kmJih0aGlzLl9wYXJlbnRNZW51PW51bGwsaS5fY2hpbGRJbmRleD0tMSxpLl9jaGlsZE1lbnU9bnVsbCxpLmFjdGl2YXRlKCkpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fYWJvdXRUb0Nsb3NlLmVtaXQodm9pZCAwKSx0LnByb3RvdHlwZS5vbkNsb3NlUmVxdWVzdC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXQua2V5Q29kZTtpZigxMyE9PWUpaWYoMjchPT1lKWlmKDM3IT09ZSlpZigzOCE9PWUpaWYoMzkhPT1lKWlmKDQwIT09ZSl7dmFyIG49bC5nZXRLZXlib2FyZExheW91dCgpLmtleUZvcktleWRvd25FdmVudCh0KTtpZihuKXt2YXIgaT10aGlzLl9hY3RpdmVJbmRleCsxLHI9cy5maW5kTW5lbW9uaWModGhpcy5faXRlbXMsbixpKTstMT09PXIuaW5kZXh8fHIubXVsdGlwbGU/LTEhPT1yLmluZGV4P3RoaXMuYWN0aXZlSW5kZXg9ci5pbmRleDotMSE9PXIuYXV0byYmKHRoaXMuYWN0aXZlSW5kZXg9ci5hdXRvKToodGhpcy5hY3RpdmVJbmRleD1yLmluZGV4LHRoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKSl9fWVsc2UgdGhpcy5hY3RpdmF0ZU5leHRJdGVtKCk7ZWxzZXt2YXIgbz10aGlzLmFjdGl2ZUl0ZW07byYmInN1Ym1lbnUiPT09by50eXBlP3RoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKTp0aGlzLnJvb3RNZW51Ll9tZW51UmVxdWVzdGVkLmVtaXQoIm5leHQiKX1lbHNlIHRoaXMuYWN0aXZhdGVQcmV2aW91c0l0ZW0oKTtlbHNlIHRoaXMuX3BhcmVudE1lbnU/dGhpcy5jbG9zZSgpOnRoaXMuX21lbnVSZXF1ZXN0ZWQuZW1pdCgicHJldmlvdXMiKTtlbHNlIHRoaXMuY2xvc2UoKTtlbHNlIHRoaXMudHJpZ2dlckFjdGl2ZUl0ZW0oKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7MD09PXQuYnV0dG9uJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy50cmlnZ2VyQWN0aXZlSXRlbSgpKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTW92ZT1mdW5jdGlvbih0KXt2YXIgZT1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuY29udGVudE5vZGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7cmV0dXJuIGguRWxlbWVudEV4dC5oaXRUZXN0KGUsdC5jbGllbnRYLHQuY2xpZW50WSl9KTtpZihlIT09dGhpcy5fYWN0aXZlSW5kZXgpe2lmKHRoaXMuYWN0aXZlSW5kZXg9ZSwoZT10aGlzLmFjdGl2ZUluZGV4KT09PXRoaXMuX2NoaWxkSW5kZXgpcmV0dXJuIHRoaXMuX2NhbmNlbE9wZW5UaW1lcigpLHZvaWQgdGhpcy5fY2FuY2VsQ2xvc2VUaW1lcigpOy0xIT09dGhpcy5fY2hpbGRJbmRleCYmdGhpcy5fc3RhcnRDbG9zZVRpbWVyKCksdGhpcy5fY2FuY2VsT3BlblRpbWVyKCk7dmFyIG49dGhpcy5hY3RpdmVJdGVtO24mJiJzdWJtZW51Ij09PW4udHlwZSYmbi5zdWJtZW51JiZ0aGlzLl9zdGFydE9wZW5UaW1lcigpfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRW50ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3BhcmVudE1lbnU7ZTtlPWUuX3BhcmVudE1lbnUpZS5fY2FuY2VsT3BlblRpbWVyKCksZS5fY2FuY2VsQ2xvc2VUaW1lcigpLGUuYWN0aXZlSW5kZXg9ZS5fY2hpbGRJbmRleH0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTGVhdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5fY2FuY2VsT3BlblRpbWVyKCksdGhpcy5fY2hpbGRNZW51KXt2YXIgZT10LmNsaWVudFgsbj10LmNsaWVudFk7aC5FbGVtZW50RXh0LmhpdFRlc3QodGhpcy5fY2hpbGRNZW51Lm5vZGUsZSxuKT90aGlzLl9jYW5jZWxDbG9zZVRpbWVyKCk6KHRoaXMuYWN0aXZlSW5kZXg9LTEsdGhpcy5fc3RhcnRDbG9zZVRpbWVyKCkpfWVsc2UgdGhpcy5hY3RpdmVJbmRleD0tMX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXt0aGlzLl9wYXJlbnRNZW51fHwocy5oaXRUZXN0TWVudXModGhpcyx0LmNsaWVudFgsdC5jbGllbnRZKT8odC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpOnRoaXMuY2xvc2UoKSl9LGUucHJvdG90eXBlLl9vcGVuQ2hpbGRNZW51PWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgZT10aGlzLmFjdGl2ZUl0ZW07aWYoZSYmInN1Ym1lbnUiPT09ZS50eXBlJiZlLnN1Ym1lbnUpe3ZhciBuPWUuc3VibWVudTtpZihuIT09dGhpcy5fY2hpbGRNZW51KXt0aGlzLl9jbG9zZUNoaWxkTWVudSgpLHRoaXMuX2NoaWxkTWVudT1uLHRoaXMuX2NoaWxkSW5kZXg9dGhpcy5fYWN0aXZlSW5kZXgsbi5fcGFyZW50TWVudT10aGlzLGQuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcyxtLldpZGdldC5Nc2cuVXBkYXRlUmVxdWVzdCk7dmFyIGk9dGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlblt0aGlzLl9hY3RpdmVJbmRleF07cy5vcGVuU3VibWVudShuLGkpLHQmJihuLmFjdGl2ZUluZGV4PS0xLG4uYWN0aXZhdGVOZXh0SXRlbSgpKSxuLmFjdGl2YXRlKCl9fWVsc2UgdGhpcy5fY2xvc2VDaGlsZE1lbnUoKX0sZS5wcm90b3R5cGUuX2Nsb3NlQ2hpbGRNZW51PWZ1bmN0aW9uKCl7dGhpcy5fY2hpbGRNZW51JiZ0aGlzLl9jaGlsZE1lbnUuY2xvc2UoKX0sZS5wcm90b3R5cGUuX3N0YXJ0T3BlblRpbWVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczswPT09dGhpcy5fb3BlblRpbWVySUQmJih0aGlzLl9vcGVuVGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb3BlblRpbWVySUQ9MCx0Ll9vcGVuQ2hpbGRNZW51KCl9LHMuVElNRVJfREVMQVkpKX0sZS5wcm90b3R5cGUuX3N0YXJ0Q2xvc2VUaW1lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7MD09PXRoaXMuX2Nsb3NlVGltZXJJRCYmKHRoaXMuX2Nsb3NlVGltZXJJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fY2xvc2VUaW1lcklEPTAsdC5fY2xvc2VDaGlsZE1lbnUoKX0scy5USU1FUl9ERUxBWSkpfSxlLnByb3RvdHlwZS5fY2FuY2VsT3BlblRpbWVyPWZ1bmN0aW9uKCl7MCE9PXRoaXMuX29wZW5UaW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lcklEKSx0aGlzLl9vcGVuVGltZXJJRD0wKX0sZS5wcm90b3R5cGUuX2NhbmNlbENsb3NlVGltZXI9ZnVuY3Rpb24oKXswIT09dGhpcy5fY2xvc2VUaW1lcklEJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2Nsb3NlVGltZXJJRCksdGhpcy5fY2xvc2VUaW1lcklEPTApfSxlfShtLldpZGdldCk7ZS5NZW51PWcsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXJJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3JlYXRlSXRlbUNsYXNzKHQpLG49dGhpcy5jcmVhdGVJdGVtRGF0YXNldCh0KTtyZXR1cm4gcC5oLmxpKHtjbGFzc05hbWU6ZSxkYXRhc2V0Om59LHRoaXMucmVuZGVySWNvbih0KSx0aGlzLnJlbmRlckxhYmVsKHQpLHRoaXMucmVuZGVyU2hvcnRjdXQodCksdGhpcy5yZW5kZXJTdWJtZW51KHQpKX0sdC5wcm90b3R5cGUucmVuZGVySWNvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNyZWF0ZUljb25DbGFzcyh0KTtyZXR1cm4gcC5oLmRpdih7Y2xhc3NOYW1lOmV9LHQuaXRlbS5pY29uTGFiZWwpfSx0LnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdExhYmVsKHQpO3JldHVybiBwLmguZGl2KHtjbGFzc05hbWU6InAtTWVudS1pdGVtTGFiZWwifSxlKX0sdC5wcm90b3R5cGUucmVuZGVyU2hvcnRjdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRTaG9ydGN1dCh0KTtyZXR1cm4gcC5oLmRpdih7Y2xhc3NOYW1lOiJwLU1lbnUtaXRlbVNob3J0Y3V0In0sZSl9LHQucHJvdG90eXBlLnJlbmRlclN1Ym1lbnU9ZnVuY3Rpb24odCl7cmV0dXJuIHAuaC5kaXYoe2NsYXNzTmFtZToicC1NZW51LWl0ZW1TdWJtZW51SWNvbiJ9KX0sdC5wcm90b3R5cGUuY3JlYXRlSXRlbUNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLU1lbnUtaXRlbSI7dC5pdGVtLmlzRW5hYmxlZHx8KGUrPSIgcC1tb2QtZGlzYWJsZWQiKSx0Lml0ZW0uaXNUb2dnbGVkJiYoZSs9IiBwLW1vZC10b2dnbGVkIiksdC5pdGVtLmlzVmlzaWJsZXx8KGUrPSIgcC1tb2QtaGlkZGVuIiksdC5hY3RpdmUmJihlKz0iIHAtbW9kLWFjdGl2ZSIpLHQuY29sbGFwc2VkJiYoZSs9IiBwLW1vZC1jb2xsYXBzZWQiKTt2YXIgbj10Lml0ZW0uY2xhc3NOYW1lO3JldHVybiBuJiYoZSs9IiAiK24pLGV9LHQucHJvdG90eXBlLmNyZWF0ZUl0ZW1EYXRhc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPWUudHlwZSxpPWUuY29tbWFuZCxyPWUuZGF0YXNldDtyZXR1cm4gbyh7fSxyLCJjb21tYW5kIj09PW4/e3R5cGU6bixjb21tYW5kOml9Ont0eXBlOm59KX0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLU1lbnUtaXRlbUljb24iLG49dC5pdGVtLmljb25DbGFzcztyZXR1cm4gbj9lKyIgIituOmV9LHQucHJvdG90eXBlLmZvcm1hdExhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPWUubGFiZWwsaT1lLm1uZW1vbmljO2lmKGk8MHx8aT49bi5sZW5ndGgpcmV0dXJuIG47dmFyIHI9bi5zbGljZSgwLGkpLG89bi5zbGljZShpKzEpLHM9bltpXTtyZXR1cm5bcixwLmguc3Bhbih7Y2xhc3NOYW1lOiJwLU1lbnUtaXRlbU1uZW1vbmljIn0scyksb119LHQucHJvdG90eXBlLmZvcm1hdFNob3J0Y3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbS5rZXlCaW5kaW5nO3JldHVybiBlP2Uua2V5cy5tYXAocy5mb3JtYXRLZXlzdHJva2UpLmpvaW4oIiwgIik6bnVsbH0sdH0oKTt0LlJlbmRlcmVyPWUsdC5kZWZhdWx0UmVuZGVyZXI9bmV3IGV9KGc9ZS5NZW51fHwoZS5NZW51PXt9KSksZS5NZW51PWcsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ic2VwYXJhdG9yIiE9PXQudHlwZSYmdC5pc0VuYWJsZWQmJnQuaXNWaXNpYmxlfXQuVElNRVJfREVMQVk9MzAwLHQuU1VCTUVOVV9PVkVSTEFQPTMsdC5jcmVhdGVOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpO3JldHVybiBlLmNsYXNzTmFtZT0icC1NZW51LWNvbnRlbnQiLHQuYXBwZW5kQ2hpbGQoZSksdC50YWJJbmRleD0tMSx0fSx0LmNhbkFjdGl2YXRlPWUsdC5jcmVhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQuY29tbWFuZHMsZSl9LHQuZm9ybWF0S2V5c3Ryb2tlPWZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dS5Db21tYW5kUmVnaXN0cnkucGFyc2VLZXlzdHJva2UodCk7cmV0dXJuIGguUGxhdGZvcm0uSVNfTUFDPyhuLmN0cmwmJihlKz0i4oyDICIpLG4uYWx0JiYoZSs9IuKMpSAiKSxuLnNoaWZ0JiYoZSs9IuKHpyAiKSxuLmNtZCYmKGUrPSLijJggIikpOihuLmN0cmwmJihlKz0iQ3RybCsiKSxuLmFsdCYmKGUrPSJBbHQrIiksbi5zaGlmdCYmKGUrPSJTaGlmdCsiKSksZStuLmtleX0sdC5oaXRUZXN0TWVudXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10O2k7aT1pLmNoaWxkTWVudSlpZihoLkVsZW1lbnRFeHQuaGl0VGVzdChpLm5vZGUsZSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sdC5jb21wdXRlQ29sbGFwc2VkPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7YS5BcnJheUV4dC5maWxsKGUsITEpO2Zvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbilpZigocz10W25dKS5pc1Zpc2libGUpe2lmKCJzZXBhcmF0b3IiIT09cy50eXBlKWJyZWFrO2Vbbl09ITB9Zm9yKHZhciByPWktMTtyPj0wOy0tcilpZigocz10W3JdKS5pc1Zpc2libGUpe2lmKCJzZXBhcmF0b3IiIT09cy50eXBlKWJyZWFrO2Vbcl09ITB9Zm9yKHZhciBvPSExOysrbjxyOyl7dmFyIHM7KHM9dFtuXSkuaXNWaXNpYmxlJiYoInNlcGFyYXRvciIhPT1zLnR5cGU/bz0hMTpvP2Vbbl09ITA6bz0hMCl9cmV0dXJuIGV9LHQub3BlblJvb3RNZW51PWZ1bmN0aW9uKHQsZSxuLGkscil7ZC5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LG0uV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KTt2YXIgbz13aW5kb3cucGFnZVhPZmZzZXQscz13aW5kb3cucGFnZVlPZmZzZXQsYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGM9dS0ocj9uOjApLGg9dC5ub2RlLGw9aC5zdHlsZTtsLnRvcD0iIixsLmxlZnQ9IiIsbC53aWR0aD0iIixsLmhlaWdodD0iIixsLnZpc2liaWxpdHk9ImhpZGRlbiIsbC5tYXhIZWlnaHQ9YysicHgiLG0uV2lkZ2V0LmF0dGFjaCh0LGRvY3VtZW50LmJvZHkpO3ZhciBmPWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1mLndpZHRoLGc9Zi5oZWlnaHQ7IWkmJmUrcD5vK2EmJihlPW8rYS1wKSwhciYmbitnPnMrdSYmKG4+cyt1P249cyt1LWc6bi09ZyksbC50b3A9TWF0aC5tYXgoMCxuKSsicHgiLGwubGVmdD1NYXRoLm1heCgwLGUpKyJweCIsbC52aXNpYmlsaXR5PSIifSx0Lm9wZW5TdWJtZW51PWZ1bmN0aW9uKGUsbil7ZC5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLG0uV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KTt2YXIgaT13aW5kb3cucGFnZVhPZmZzZXQscj13aW5kb3cucGFnZVlPZmZzZXQsbz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGE9cyx1PWUubm9kZSxjPXUuc3R5bGU7Yy50b3A9IiIsYy5sZWZ0PSIiLGMud2lkdGg9IiIsYy5oZWlnaHQ9IiIsYy52aXNpYmlsaXR5PSJoaWRkZW4iLGMubWF4SGVpZ2h0PWErInB4IixtLldpZGdldC5hdHRhY2goZSxkb2N1bWVudC5ib2R5KTt2YXIgbD11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9bC53aWR0aCxwPWwuaGVpZ2h0LGc9aC5FbGVtZW50RXh0LmJveFNpemluZyhlLm5vZGUpLHY9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxiPXYucmlnaHQtdC5TVUJNRU5VX09WRVJMQVA7YitmPmkrbyYmKGI9di5sZWZ0K3QuU1VCTUVOVV9PVkVSTEFQLWYpO3ZhciB5PXYudG9wLWcuYm9yZGVyVG9wLWcucGFkZGluZ1RvcDt5K3A+citzJiYoeT12LmJvdHRvbStnLmJvcmRlckJvdHRvbStnLnBhZGRpbmdCb3R0b20tcCksYy50b3A9TWF0aC5tYXgoMCx5KSsicHgiLGMubGVmdD1NYXRoLm1heCgwLGIpKyJweCIsYy52aXNpYmlsaXR5PSIifSx0LmZpbmRNbmVtb25pYz1mdW5jdGlvbih0LG4saSl7Zm9yKHZhciByPS0xLG89LTEscz0hMSxhPW4udG9VcHBlckNhc2UoKSx1PTAsYz10Lmxlbmd0aDt1PGM7Kyt1KXt2YXIgaD0odStpKSVjLGw9dFtoXTtpZihlKGwpKXt2YXIgZD1sLmxhYmVsO2lmKDAhPT1kLmxlbmd0aCl7dmFyIGY9bC5tbmVtb25pYztmPj0wJiZmPGQubGVuZ3RoP2RbZl0udG9VcHBlckNhc2UoKT09PWEmJigtMT09PXI/cj1oOnM9ITApOi0xPT09byYmZFswXS50b1VwcGVyQ2FzZSgpPT09YSYmKG89aCl9fX1yZXR1cm57aW5kZXg6cixtdWx0aXBsZTpzLGF1dG86b319O3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2NvbW1hbmRzPXQsdGhpcy50eXBlPWUudHlwZXx8ImNvbW1hbmQiLHRoaXMuY29tbWFuZD1lLmNvbW1hbmR8fCIiLHRoaXMuYXJncz1lLmFyZ3N8fGMuSlNPTkV4dC5lbXB0eU9iamVjdCx0aGlzLnN1Ym1lbnU9ZS5zdWJtZW51fHxudWxsfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhYmVsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5sYWJlbDoiIn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm1uZW1vbmljIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLm1uZW1vbmljKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5tbmVtb25pYzotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29uQ2xhc3N9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uQ2xhc3MiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaWNvbkNsYXNzKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5pY29uQ2xhc3M6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpY29uTGFiZWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaWNvbkxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5pY29uTGFiZWw6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjYXB0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmNhcHRpb24odGhpcy5jb21tYW5kLHRoaXMuYXJncyk6InN1Ym1lbnUiPT09dGhpcy50eXBlJiZ0aGlzLnN1Ym1lbnU/dGhpcy5zdWJtZW51LnRpdGxlLmNhcHRpb246IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjbGFzc05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuY2xhc3NOYW1lKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51Ij09PXRoaXMudHlwZSYmdGhpcy5zdWJtZW51P3RoaXMuc3VibWVudS50aXRsZS5jbGFzc05hbWU6IiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJkYXRhc2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmRhdGFzZXQodGhpcy5jb21tYW5kLHRoaXMuYXJncyk6InN1Ym1lbnUiPT09dGhpcy50eXBlJiZ0aGlzLnN1Ym1lbnU/dGhpcy5zdWJtZW51LnRpdGxlLmRhdGFzZXQ6e319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc0VuYWJsZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iY29tbWFuZCI9PT10aGlzLnR5cGU/dGhpcy5fY29tbWFuZHMuaXNFbmFibGVkKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpOiJzdWJtZW51IiE9PXRoaXMudHlwZXx8bnVsbCE9PXRoaXMuc3VibWVudX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVG9nZ2xlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiJjb21tYW5kIj09PXRoaXMudHlwZSYmdGhpcy5fY29tbWFuZHMuaXNUb2dnbGVkKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNWaXNpYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImNvbW1hbmQiPT09dGhpcy50eXBlP3RoaXMuX2NvbW1hbmRzLmlzVmlzaWJsZSh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKToic3VibWVudSIhPT10aGlzLnR5cGV8fG51bGwhPT10aGlzLnN1Ym1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJrZXlCaW5kaW5nIix7Z2V0OmZ1bmN0aW9uKCl7aWYoImNvbW1hbmQiPT09dGhpcy50eXBlKXt2YXIgdD10aGlzLmNvbW1hbmQsZT10aGlzLmFyZ3M7cmV0dXJuIGEuQXJyYXlFeHQuZmluZExhc3RWYWx1ZSh0aGlzLl9jb21tYW5kcy5rZXlCaW5kaW5ncyxmdW5jdGlvbihuKXtyZXR1cm4gbi5jb21tYW5kPT09dCYmYy5KU09ORXh0LmRlZXBFcXVhbChuLmFyZ3MsZSl9KXx8bnVsbH1yZXR1cm4gbnVsbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpfShzfHwocz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDkpLHU9big1KSxjPW4oNDApLGg9bigyMiksbD1uKDcpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3NwYWNpbmc9NCxuLl9kaXJ0eT0hMSxuLl9yb290PW51bGwsbi5fYm94PW51bGwsbi5faXRlbXM9bmV3IE1hcCxuLnJlbmRlcmVyPWUucmVuZGVyZXIsdm9pZCAwIT09ZS5zcGFjaW5nJiYobi5fc3BhY2luZz1vLmNsYW1wU3BhY2luZyhlLnNwYWNpbmcpKSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaXRlcigpO3RoaXMuX2l0ZW1zLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9ib3g9bnVsbCx0aGlzLl9yb290PW51bGwsdGhpcy5faXRlbXMuY2xlYXIoKSxzLmVhY2goZSxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBTcGFjaW5nKHQpLHRoaXMuX3NwYWNpbmchPT10JiYodGhpcy5fc3BhY2luZz10LHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpc0VtcHR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9yb290fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290Lml0ZXJBbGxXaWRnZXRzKCk6cy5lbXB0eSgpfSxlLnByb3RvdHlwZS53aWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC5pdGVyVXNlcldpZGdldHMoKTpzLmVtcHR5KCl9LGUucHJvdG90eXBlLnNlbGVjdGVkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMuX3Jvb3QuaXRlclNlbGVjdGVkV2lkZ2V0cygpOnMuZW1wdHkoKX0sZS5wcm90b3R5cGUudGFiQmFycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMuX3Jvb3QuaXRlclRhYkJhcnMoKTpzLmVtcHR5KCl9LGUucHJvdG90eXBlLmhhbmRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290Lml0ZXJIYW5kbGVzKCk6cy5lbXB0eSgpfSxlLnByb3RvdHlwZS5tb3ZlSGFuZGxlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9yb290JiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInAtbW9kLWhpZGRlbiIpKXt2YXIgaSxyPXRoaXMuX3Jvb3QuZmluZFNwbGl0Tm9kZSh0KTtpZihyKTAhPT0oaT0iaG9yaXpvbnRhbCI9PT1yLm5vZGUub3JpZW50YXRpb24/ZS10Lm9mZnNldExlZnQ6bi10Lm9mZnNldFRvcCkmJihyLm5vZGUuaG9sZFNpemVzKCksYy5Cb3hFbmdpbmUuYWRqdXN0KHIubm9kZS5zaXplcnMsci5pbmRleCxpKSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCkpfX0sZS5wcm90b3R5cGUuc2F2ZUxheW91dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290Pyh0aGlzLl9yb290LmhvbGRBbGxTaXplcygpLHttYWluOnRoaXMuX3Jvb3QuY3JlYXRlQ29uZmlnKCl9KTp7bWFpbjpudWxsfX0sZS5wcm90b3R5cGUucmVzdG9yZUxheW91dD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMsaT1uZXcgU2V0O2U9dC5tYWluP28ubm9ybWFsaXplQXJlYUNvbmZpZyh0Lm1haW4saSk6bnVsbDt2YXIgcj10aGlzLndpZGdldHMoKSxhPXRoaXMudGFiQmFycygpLHU9dGhpcy5oYW5kbGVzKCk7dGhpcy5fcm9vdD1udWxsLHMuZWFjaChyLGZ1bmN0aW9uKHQpe2kuaGFzKHQpfHwodC5wYXJlbnQ9bnVsbCl9KSxzLmVhY2goYSxmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHMuZWFjaCh1LGZ1bmN0aW9uKHQpe3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucGFyZW50PW4ucGFyZW50fSksdGhpcy5fcm9vdD1lP28ucmVhbGl6ZUFyZWFDb25maWcoZSx7Y3JlYXRlVGFiQmFyOmZ1bmN0aW9uKCl7cmV0dXJuIG4uX2NyZWF0ZVRhYkJhcigpfSxjcmVhdGVIYW5kbGU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5fY3JlYXRlSGFuZGxlKCl9fSk6bnVsbCx0aGlzLnBhcmVudCYmKGkuZm9yRWFjaChmdW5jdGlvbih0KXtuLmF0dGFjaFdpZGdldCh0KX0pLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUuYWRkV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVmfHxudWxsLGk9ZS5tb2RlfHwidGFiLWFmdGVyIixyPW51bGw7aWYodGhpcy5fcm9vdCYmbiYmKHI9dGhpcy5fcm9vdC5maW5kVGFiTm9kZShuKSksbiYmIXIpdGhyb3cgbmV3IEVycm9yKCJSZWZlcmVuY2Ugd2lkZ2V0IGlzIG5vdCBpbiB0aGUgbGF5b3V0LiIpO3N3aXRjaCh0LnBhcmVudD10aGlzLnBhcmVudCxpKXtjYXNlInRhYi1hZnRlciI6dGhpcy5faW5zZXJ0VGFiKHQsbixyLCEwKTticmVhaztjYXNlInRhYi1iZWZvcmUiOnRoaXMuX2luc2VydFRhYih0LG4sciwhMSk7YnJlYWs7Y2FzZSJzcGxpdC10b3AiOnRoaXMuX2luc2VydFNwbGl0KHQsbixyLCJ2ZXJ0aWNhbCIsITEpO2JyZWFrO2Nhc2Uic3BsaXQtbGVmdCI6dGhpcy5faW5zZXJ0U3BsaXQodCxuLHIsImhvcml6b250YWwiLCExKTticmVhaztjYXNlInNwbGl0LXJpZ2h0Ijp0aGlzLl9pbnNlcnRTcGxpdCh0LG4sciwiaG9yaXpvbnRhbCIsITApO2JyZWFrO2Nhc2Uic3BsaXQtYm90dG9tIjp0aGlzLl9pbnNlcnRTcGxpdCh0LG4sciwidmVydGljYWwiLCEwKX10aGlzLnBhcmVudCYmKHRoaXMuYXR0YWNoV2lkZ2V0KHQpLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0PWZ1bmN0aW9uKHQpe3RoaXMuX3JlbW92ZVdpZGdldCh0KSx0aGlzLnBhcmVudCYmKHRoaXMuZGV0YWNoV2lkZ2V0KHQpLHRoaXMucGFyZW50LmZpdCgpKX0sZS5wcm90b3R5cGUuaGl0VGVzdFRhYkFyZWFzPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX3Jvb3R8fCF0aGlzLnBhcmVudHx8IXRoaXMucGFyZW50LmlzVmlzaWJsZSlyZXR1cm4gbnVsbDt0aGlzLl9ib3h8fCh0aGlzLl9ib3g9YS5FbGVtZW50RXh0LmJveFNpemluZyh0aGlzLnBhcmVudC5ub2RlKSk7dmFyIG49dGhpcy5wYXJlbnQubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQtbi5sZWZ0LXRoaXMuX2JveC5ib3JkZXJMZWZ0LHI9ZS1uLnRvcC10aGlzLl9ib3guYm9yZGVyVG9wLG89dGhpcy5fcm9vdC5oaXRUZXN0VGFiTm9kZXMoaSxyKTtpZighbylyZXR1cm4gbnVsbDt2YXIgcz1vLnRhYkJhcix1PW8udG9wLGM9by5sZWZ0LGg9by53aWR0aCxsPW8uaGVpZ2h0LGQ9dGhpcy5fYm94LmJvcmRlckxlZnQrdGhpcy5fYm94LmJvcmRlclJpZ2h0LGY9dGhpcy5fYm94LmJvcmRlclRvcCt0aGlzLl9ib3guYm9yZGVyQm90dG9tO3JldHVybnt0YWJCYXI6cyx4OmkseTpyLHRvcDp1LGxlZnQ6YyxyaWdodDpuLndpZHRoLWQtKGMraCksYm90dG9tOm4uaGVpZ2h0LWYtKHUrbCksd2lkdGg6aCxoZWlnaHQ6bH19LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKSxzLmVhY2godGhpcyxmdW5jdGlvbih0KXtlLmF0dGFjaFdpZGdldCh0KX0pLHMuZWFjaCh0aGlzLmhhbmRsZXMoKSxmdW5jdGlvbih0KXtlLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKHQpfSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLmF0dGFjaFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5ub2RlIT09dC5ub2RlLnBhcmVudE5vZGUmJih0aGlzLl9pdGVtcy5zZXQodCxuZXcgaC5MYXlvdXRJdGVtKHQpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsbC5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0Lm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCxsLldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpKX0sZS5wcm90b3R5cGUuZGV0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQpe2lmKHRoaXMucGFyZW50Lm5vZGU9PT10Lm5vZGUucGFyZW50Tm9kZSl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGwuV2lkZ2V0Lk1zZy5CZWZvcmVEZXRhY2gpLHRoaXMucGFyZW50Lm5vZGUucmVtb3ZlQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsbC5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKTt2YXIgZT10aGlzLl9pdGVtcy5nZXQodCk7ZSYmKHRoaXMuX2l0ZW1zLmRlbGV0ZSh0KSxlLmRpc3Bvc2UoKSl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZVNob3c9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUub25CZWZvcmVTaG93LmNhbGwodGhpcyxlKSx0aGlzLnBhcmVudC51cGRhdGUoKX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUub25CZWZvcmVBdHRhY2guY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vbkNoaWxkU2hvd249ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRIaWRkZW49ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzVmlzaWJsZSYmdGhpcy5fdXBkYXRlKHQud2lkdGgsdC5oZWlnaHQpfSxlLnByb3RvdHlwZS5vblVwZGF0ZVJlcXVlc3Q9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUoLTEsLTEpfSxlLnByb3RvdHlwZS5vbkZpdFJlcXVlc3Q9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdGhpcy5fZml0KCl9LGUucHJvdG90eXBlLl9yZW1vdmVXaWRnZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fcm9vdCl7dmFyIGU9dGhpcy5fcm9vdC5maW5kVGFiTm9kZSh0KTtpZihlKWlmKGUudGFiQmFyLnRpdGxlcy5sZW5ndGg+MSllLnRhYkJhci5yZW1vdmVUYWIodC50aXRsZSk7ZWxzZSBpZihlLnRhYkJhci5kaXNwb3NlKCksdGhpcy5fcm9vdCE9PWUpe3RoaXMuX3Jvb3QuaG9sZEFsbFNpemVzKCk7dmFyIG49ZS5wYXJlbnQ7ZS5wYXJlbnQ9bnVsbDt2YXIgaT1zLkFycmF5RXh0LnJlbW92ZUZpcnN0T2Yobi5jaGlsZHJlbixlKSxyPXMuQXJyYXlFeHQucmVtb3ZlQXQobi5oYW5kbGVzLGkpO2lmKHMuQXJyYXlFeHQucmVtb3ZlQXQobi5zaXplcnMsaSksci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksbi5jaGlsZHJlbi5sZW5ndGg+MSluLnN5bmNIYW5kbGVzKCk7ZWxzZXt2YXIgYT1uLnBhcmVudDtuLnBhcmVudD1udWxsO3ZhciB1PW4uY2hpbGRyZW5bMF0sYz1uLmhhbmRsZXNbMF07aWYobi5jaGlsZHJlbi5sZW5ndGg9MCxuLmhhbmRsZXMubGVuZ3RoPTAsbi5zaXplcnMubGVuZ3RoPTAsYy5wYXJlbnROb2RlJiZjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyksdGhpcy5fcm9vdD09PW4pcmV0dXJuIHUucGFyZW50PW51bGwsdm9pZCh0aGlzLl9yb290PXUpO3ZhciBoPWEsbD1oLmNoaWxkcmVuLmluZGV4T2Yobik7aWYodSBpbnN0YW5jZW9mIG8uVGFiTGF5b3V0Tm9kZSlyZXR1cm4gdS5wYXJlbnQ9aCx2b2lkKGguY2hpbGRyZW5bbF09dSk7dmFyIGQ9cy5BcnJheUV4dC5yZW1vdmVBdChoLmhhbmRsZXMsbCk7cy5BcnJheUV4dC5yZW1vdmVBdChoLmNoaWxkcmVuLGwpLHMuQXJyYXlFeHQucmVtb3ZlQXQoaC5zaXplcnMsbCksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zm9yKHZhciBmPTAscD11LmNoaWxkcmVuLmxlbmd0aDtmPHA7KytmKXt2YXIgbT11LmNoaWxkcmVuW2ZdLGc9dS5oYW5kbGVzW2ZdLHY9dS5zaXplcnNbZl07cy5BcnJheUV4dC5pbnNlcnQoaC5jaGlsZHJlbixsK2YsbSkscy5BcnJheUV4dC5pbnNlcnQoaC5oYW5kbGVzLGwrZixnKSxzLkFycmF5RXh0Lmluc2VydChoLnNpemVycyxsK2YsdiksbS5wYXJlbnQ9aH11LmNoaWxkcmVuLmxlbmd0aD0wLHUuaGFuZGxlcy5sZW5ndGg9MCx1LnNpemVycy5sZW5ndGg9MCx1LnBhcmVudD1udWxsLGguc3luY0hhbmRsZXMoKX19ZWxzZSB0aGlzLl9yb290PW51bGx9fSxlLnByb3RvdHlwZS5faW5zZXJ0VGFiPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQhPT1lKXtpZighdGhpcy5fcm9vdCl7dmFyIHI9bmV3IG8uVGFiTGF5b3V0Tm9kZSh0aGlzLl9jcmVhdGVUYWJCYXIoKSk7cmV0dXJuIHIudGFiQmFyLmFkZFRhYih0LnRpdGxlKSx2b2lkKHRoaXMuX3Jvb3Q9cil9dmFyIHM7bnx8KG49dGhpcy5fcm9vdC5maW5kRmlyc3RUYWJOb2RlKCkpLC0xPT09bi50YWJCYXIudGl0bGVzLmluZGV4T2YodC50aXRsZSkmJih0aGlzLl9yZW1vdmVXaWRnZXQodCksdC5oaWRlKCkpLHM9ZT9uLnRhYkJhci50aXRsZXMuaW5kZXhPZihlLnRpdGxlKTpuLnRhYkJhci5jdXJyZW50SW5kZXgsbi50YWJCYXIuaW5zZXJ0VGFiKHMrKGk/MTowKSx0LnRpdGxlKX19LGUucHJvdG90eXBlLl9pbnNlcnRTcGxpdD1mdW5jdGlvbih0LGUsbixpLHIpe2lmKHQhPT1lfHwhbnx8MSE9PW4udGFiQmFyLnRpdGxlcy5sZW5ndGgpe3RoaXMuX3JlbW92ZVdpZGdldCh0KTt2YXIgYT1uZXcgby5UYWJMYXlvdXROb2RlKHRoaXMuX2NyZWF0ZVRhYkJhcigpKTtpZihhLnRhYkJhci5hZGRUYWIodC50aXRsZSksdGhpcy5fcm9vdCl7aWYoIW58fCFuLnBhcmVudCl7dmFyIHU9dGhpcy5fc3BsaXRSb290KGkpLGM9cj91LmNoaWxkcmVuLmxlbmd0aDowO3Uubm9ybWFsaXplU2l6ZXMoKTt2YXIgaD1vLmNyZWF0ZVNpemVyKG4/MTpvLkdPTERFTl9SQVRJTyk7cmV0dXJuIHMuQXJyYXlFeHQuaW5zZXJ0KHUuY2hpbGRyZW4sYyxhKSxzLkFycmF5RXh0Lmluc2VydCh1LnNpemVycyxjLGgpLHMuQXJyYXlFeHQuaW5zZXJ0KHUuaGFuZGxlcyxjLHRoaXMuX2NyZWF0ZUhhbmRsZSgpKSxhLnBhcmVudD11LHUubm9ybWFsaXplU2l6ZXMoKSx2b2lkIHUuc3luY0hhbmRsZXMoKX12YXIgbD1uLnBhcmVudDtpZihsLm9yaWVudGF0aW9uPT09aSl7dmFyIGQ9bC5jaGlsZHJlbi5pbmRleE9mKG4pO2wubm9ybWFsaXplU2l6ZXMoKTt2YXIgZj1sLnNpemVyc1tkXS5zaXplSGludC89MixwPWQrKHI/MTowKTtyZXR1cm4gcy5BcnJheUV4dC5pbnNlcnQobC5jaGlsZHJlbixwLGEpLHMuQXJyYXlFeHQuaW5zZXJ0KGwuc2l6ZXJzLHAsby5jcmVhdGVTaXplcihmKSkscy5BcnJheUV4dC5pbnNlcnQobC5oYW5kbGVzLHAsdGhpcy5fY3JlYXRlSGFuZGxlKCkpLGEucGFyZW50PWwsdm9pZCBsLnN5bmNIYW5kbGVzKCl9dmFyIG09cy5BcnJheUV4dC5yZW1vdmVGaXJzdE9mKGwuY2hpbGRyZW4sbiksZz1uZXcgby5TcGxpdExheW91dE5vZGUoaSk7Zy5ub3JtYWxpemVkPSEwLGcuY2hpbGRyZW4ucHVzaChuKSxnLnNpemVycy5wdXNoKG8uY3JlYXRlU2l6ZXIoLjUpKSxnLmhhbmRsZXMucHVzaCh0aGlzLl9jcmVhdGVIYW5kbGUoKSksbi5wYXJlbnQ9Zzt2YXIgdj1yPzE6MDtzLkFycmF5RXh0Lmluc2VydChnLmNoaWxkcmVuLHYsYSkscy5BcnJheUV4dC5pbnNlcnQoZy5zaXplcnMsdixvLmNyZWF0ZVNpemVyKC41KSkscy5BcnJheUV4dC5pbnNlcnQoZy5oYW5kbGVzLHYsdGhpcy5fY3JlYXRlSGFuZGxlKCkpLGEucGFyZW50PWcsZy5zeW5jSGFuZGxlcygpLHMuQXJyYXlFeHQuaW5zZXJ0KGwuY2hpbGRyZW4sbSxnKSxnLnBhcmVudD1sfWVsc2UgdGhpcy5fcm9vdD1hfX0sZS5wcm90b3R5cGUuX3NwbGl0Um9vdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yb290O2lmKGUgaW5zdGFuY2VvZiBvLlNwbGl0TGF5b3V0Tm9kZSYmZS5vcmllbnRhdGlvbj09PXQpcmV0dXJuIGU7dmFyIG49dGhpcy5fcm9vdD1uZXcgby5TcGxpdExheW91dE5vZGUodCk7cmV0dXJuIGUmJihuLmNoaWxkcmVuLnB1c2goZSksbi5zaXplcnMucHVzaChvLmNyZWF0ZVNpemVyKDApKSxuLmhhbmRsZXMucHVzaCh0aGlzLl9jcmVhdGVIYW5kbGUoKSksZS5wYXJlbnQ9biksbn0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe3ZhciB0PTAsZT0wO2lmKHRoaXMuX3Jvb3Qpe3ZhciBuPXRoaXMuX3Jvb3QuZml0KHRoaXMuX3NwYWNpbmcsdGhpcy5faXRlbXMpO3Q9bi5taW5XaWR0aCxlPW4ubWluSGVpZ2h0fXZhciBpPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3QrPWkuaG9yaXpvbnRhbFN1bSxlKz1pLnZlcnRpY2FsU3VtO3ZhciByPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7ci5taW5XaWR0aD10KyJweCIsci5taW5IZWlnaHQ9ZSsicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsbC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGwuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2RpcnR5PSExLHRoaXMuX3Jvb3Qpe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBuPXRoaXMuX2JveC5wYWRkaW5nVG9wLGk9dGhpcy5fYm94LnBhZGRpbmdMZWZ0LHI9dC10aGlzLl9ib3guaG9yaXpvbnRhbFN1bSxvPWUtdGhpcy5fYm94LnZlcnRpY2FsU3VtO3RoaXMuX3Jvb3QudXBkYXRlKG4saSxyLG8sdGhpcy5fc3BhY2luZyx0aGlzLl9pdGVtcyl9fSxlLnByb3RvdHlwZS5fY3JlYXRlVGFiQmFyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZW5kZXJlci5jcmVhdGVUYWJCYXIoKTtyZXR1cm4gdC5vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsdGhpcy5wYXJlbnQmJih0LnBhcmVudD10aGlzLnBhcmVudCx0aGlzLmF0dGFjaFdpZGdldCh0KSksdH0sZS5wcm90b3R5cGUuX2NyZWF0ZUhhbmRsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmVuZGVyZXIuY3JlYXRlSGFuZGxlKCksZT10LnN0eWxlO3JldHVybiBlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS50b3A9IjAiLGUubGVmdD0iMCIsZS53aWR0aD0iMCIsZS5oZWlnaHQ9IjAiLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKHQpLHR9LGV9KGguTGF5b3V0KTtlLkRvY2tMYXlvdXQ9ZCxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBlPW5ldyBjLkJveFNpemVyO3JldHVybiBlLnNpemVIaW50PXQsZS5zaXplPXQsZX1mdW5jdGlvbiBuKHQsZSl7cmV0dXJuInRhYi1hcmVhIj09PXQudHlwZT9mdW5jdGlvbih0LGUpe2lmKDA9PT10LndpZGdldHMubGVuZ3RoKXJldHVybiBudWxsO3ZhciBuPVtdO2lmKHMuZWFjaCh0LndpZGdldHMsZnVuY3Rpb24odCl7ZS5oYXModCl8fChlLmFkZCh0KSxuLnB1c2godCkpfSksMD09PW4ubGVuZ3RoKXJldHVybiBudWxsO3ZhciBpPXQuY3VycmVudEluZGV4Oy0xIT09aSYmKGk8MHx8aT49bi5sZW5ndGgpJiYoaT0wKTtyZXR1cm57dHlwZToidGFiLWFyZWEiLHdpZGdldHM6bixjdXJyZW50SW5kZXg6aX19KHQsZSk6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5vcmllbnRhdGlvbixyPVtdLG89W10scz0wLGE9dC5jaGlsZHJlbi5sZW5ndGg7czxhOysrcyl7dmFyIHU9bih0LmNoaWxkcmVuW3NdLGUpO3UmJigidGFiLWFyZWEiPT09dS50eXBlfHx1Lm9yaWVudGF0aW9uIT09aT8oci5wdXNoKHUpLG8ucHVzaChNYXRoLmFicyh0LnNpemVzW3NdfHwwKSkpOihyLnB1c2guYXBwbHkocix1LmNoaWxkcmVuKSxvLnB1c2guYXBwbHkobyx1LnNpemVzKSkpfWlmKDA9PT1yLmxlbmd0aClyZXR1cm4gbnVsbDtpZigxPT09ci5sZW5ndGgpcmV0dXJuIHJbMF07cmV0dXJue3R5cGU6InNwbGl0LWFyZWEiLG9yaWVudGF0aW9uOmksY2hpbGRyZW46cixzaXplczpvfX0odCxlKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuInRhYi1hcmVhIj09PXQudHlwZT9mdW5jdGlvbih0LGUpe3ZhciBuPWUuY3JlYXRlVGFiQmFyKCk7cmV0dXJuIHMuZWFjaCh0LndpZGdldHMsZnVuY3Rpb24odCl7dC5oaWRlKCksbi5hZGRUYWIodC50aXRsZSl9KSxuLmN1cnJlbnRJbmRleD10LmN1cnJlbnRJbmRleCxuZXcgcihuKX0odCxuKTpmdW5jdGlvbih0LG4pe3ZhciByPW5ldyBvKHQub3JpZW50YXRpb24pO3JldHVybiBzLmVhY2godC5jaGlsZHJlbixmdW5jdGlvbihvLHMpe3ZhciBhPWkobyxuKSx1PWUodC5zaXplc1tzXSksYz1uLmNyZWF0ZUhhbmRsZSgpO3IuY2hpbGRyZW4ucHVzaChhKSxyLmhhbmRsZXMucHVzaChjKSxyLnNpemVycy5wdXNoKHUpLGEucGFyZW50PXJ9KSxyLnN5bmNIYW5kbGVzKCksci5ub3JtYWxpemVTaXplcygpLHJ9KHQsbil9dC5HT0xERU5fUkFUSU89LjYxOCx0LmNsYW1wU3BhY2luZz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKHQpKX0sdC5jcmVhdGVTaXplcj1lLHQubm9ybWFsaXplQXJlYUNvbmZpZz1uLHQucmVhbGl6ZUFyZWFDb25maWc9aTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wYXJlbnQ9bnVsbCx0aGlzLl90b3A9MCx0aGlzLl9sZWZ0PTAsdGhpcy5fd2lkdGg9MCx0aGlzLl9oZWlnaHQ9MDt2YXIgZT1uZXcgYy5Cb3hTaXplcixuPW5ldyBjLkJveFNpemVyO2Uuc3RyZXRjaD0wLG4uc3RyZXRjaD0xLHRoaXMudGFiQmFyPXQsdGhpcy5zaXplcnM9W2Usbl19cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidG9wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RvcH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxlZnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVmdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIndpZHRoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaGVpZ2h0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pdGVyQWxsV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiBzLmNoYWluKHMub25jZSh0aGlzLnRhYkJhciksdGhpcy5pdGVyVXNlcldpZGdldHMoKSl9LHQucHJvdG90eXBlLml0ZXJVc2VyV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiBzLm1hcCh0aGlzLnRhYkJhci50aXRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQub3duZXJ9KX0sdC5wcm90b3R5cGUuaXRlclNlbGVjdGVkV2lkZ2V0cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMudGFiQmFyLmN1cnJlbnRUaXRsZTtyZXR1cm4gdD9zLm9uY2UodC5vd25lcik6cy5lbXB0eSgpfSx0LnByb3RvdHlwZS5pdGVyVGFiQmFycz1mdW5jdGlvbigpe3JldHVybiBzLm9uY2UodGhpcy50YWJCYXIpfSx0LnByb3RvdHlwZS5pdGVySGFuZGxlcz1mdW5jdGlvbigpe3JldHVybiBzLmVtcHR5KCl9LHQucHJvdG90eXBlLmZpbmRUYWJOb2RlPWZ1bmN0aW9uKHQpe3JldHVybi0xIT09dGhpcy50YWJCYXIudGl0bGVzLmluZGV4T2YodC50aXRsZSk/dGhpczpudWxsfSx0LnByb3RvdHlwZS5maW5kU3BsaXROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kRmlyc3RUYWJOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmhpdFRlc3RUYWJOb2Rlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0PHRoaXMuX2xlZnR8fHQ+PXRoaXMuX2xlZnQrdGhpcy5fd2lkdGg/bnVsbDplPHRoaXMuX3RvcHx8ZT49dGhpcy5fdG9wK3RoaXMuX2hlaWdodD9udWxsOnRoaXN9LHQucHJvdG90eXBlLmNyZWF0ZUNvbmZpZz1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJ0YWItYXJlYSIsd2lkZ2V0czp0aGlzLnRhYkJhci50aXRsZXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm93bmVyfSksY3VycmVudEluZGV4OnRoaXMudGFiQmFyLmN1cnJlbnRJbmRleH19LHQucHJvdG90eXBlLmhvbGRBbGxTaXplcz1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZml0PWZ1bmN0aW9uKHQsZSl7dmFyIG49MCxpPTAscj1lLmdldCh0aGlzLnRhYkJhciksbz10aGlzLnRhYkJhci5jdXJyZW50VGl0bGUscz1vP2UuZ2V0KG8ub3duZXIpOnZvaWQgMCxhPXRoaXMuc2l6ZXJzLHU9YVswXSxjPWFbMV07cmV0dXJuIHImJnIuZml0KCkscyYmcy5maXQoKSxyJiYhci5pc0hpZGRlbj8obj1NYXRoLm1heChuLHIubWluV2lkdGgpLGkrPXIubWluSGVpZ2h0LHUubWluU2l6ZT1yLm1pbkhlaWdodCx1Lm1heFNpemU9ci5tYXhIZWlnaHQpOih1Lm1pblNpemU9MCx1Lm1heFNpemU9MCkscyYmIXMuaXNIaWRkZW4/KG49TWF0aC5tYXgobixzLm1pbldpZHRoKSxpKz1zLm1pbkhlaWdodCxjLm1pblNpemU9cy5taW5IZWlnaHQsYy5tYXhTaXplPTEvMCk6KGMubWluU2l6ZT0wLGMubWF4U2l6ZT0xLzApLHttaW5XaWR0aDpuLG1pbkhlaWdodDppLG1heFdpZHRoOjEvMCxtYXhIZWlnaHQ6MS8wfX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl90b3A9ZSx0aGlzLl9sZWZ0PXQsdGhpcy5fd2lkdGg9bix0aGlzLl9oZWlnaHQ9aTt2YXIgcz1vLmdldCh0aGlzLnRhYkJhciksYT10aGlzLnRhYkJhci5jdXJyZW50VGl0bGUsdT1hP28uZ2V0KGEub3duZXIpOnZvaWQgMDtpZihjLkJveEVuZ2luZS5jYWxjKHRoaXMuc2l6ZXJzLGkpLHMmJiFzLmlzSGlkZGVuKXt2YXIgaD10aGlzLnNpemVyc1swXS5zaXplO3MudXBkYXRlKHQsZSxuLGgpLGUrPWh9aWYodSYmIXUuaXNIaWRkZW4pe2g9dGhpcy5zaXplcnNbMV0uc2l6ZTt1LnVwZGF0ZSh0LGUsbixoKX19LHR9KCk7dC5UYWJMYXlvdXROb2RlPXI7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucGFyZW50PW51bGwsdGhpcy5ub3JtYWxpemVkPSExLHRoaXMuY2hpbGRyZW49W10sdGhpcy5zaXplcnM9W10sdGhpcy5oYW5kbGVzPVtdLHRoaXMub3JpZW50YXRpb249dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlckFsbFdpZGdldHM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJBbGxXaWRnZXRzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlclVzZXJXaWRnZXRzPWZ1bmN0aW9uKCl7dmFyIHQ9cy5tYXAodGhpcy5jaGlsZHJlbixmdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVyVXNlcldpZGdldHMoKX0pO3JldHVybiBuZXcgcy5DaGFpbkl0ZXJhdG9yKHQpfSx0LnByb3RvdHlwZS5pdGVyU2VsZWN0ZWRXaWRnZXRzPWZ1bmN0aW9uKCl7dmFyIHQ9cy5tYXAodGhpcy5jaGlsZHJlbixmdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVyU2VsZWN0ZWRXaWRnZXRzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlclRhYkJhcnM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJUYWJCYXJzKCl9KTtyZXR1cm4gbmV3IHMuQ2hhaW5JdGVyYXRvcih0KX0sdC5wcm90b3R5cGUuaXRlckhhbmRsZXM9ZnVuY3Rpb24oKXt2YXIgdD1zLm1hcCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKHQpe3JldHVybiB0Lml0ZXJIYW5kbGVzKCl9KTtyZXR1cm4gcy5jaGFpbih0aGlzLmhhbmRsZXMsbmV3IHMuQ2hhaW5JdGVyYXRvcih0KSl9LHQucHJvdG90eXBlLmZpbmRUYWJOb2RlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxuOysrZSl7dmFyIGk9dGhpcy5jaGlsZHJlbltlXS5maW5kVGFiTm9kZSh0KTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kU3BsaXROb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFuZGxlcy5pbmRleE9mKHQpO2lmKC0xIT09ZSlyZXR1cm57aW5kZXg6ZSxub2RlOnRoaXN9O2Zvcih2YXIgbj0wLGk9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5jaGlsZHJlbltuXS5maW5kU3BsaXROb2RlKHQpO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLmZpbmRGaXJzdFRhYk5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuY2hpbGRyZW4ubGVuZ3RoP251bGw6dGhpcy5jaGlsZHJlblswXS5maW5kRmlyc3RUYWJOb2RlKCl9LHQucHJvdG90eXBlLmhpdFRlc3RUYWJOb2Rlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5jaGlsZHJlbltuXS5oaXRUZXN0VGFiTm9kZXModCxlKTtpZihyKXJldHVybiByfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5jcmVhdGVDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWVudGF0aW9uLGU9dGhpcy5jcmVhdGVOb3JtYWxpemVkU2l6ZXMoKTtyZXR1cm57dHlwZToic3BsaXQtYXJlYSIsb3JpZW50YXRpb246dCxjaGlsZHJlbjp0aGlzLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVDb25maWcoKX0pLHNpemVzOmV9fSx0LnByb3RvdHlwZS5zeW5jSGFuZGxlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cy5lYWNoKHRoaXMuaGFuZGxlcyxmdW5jdGlvbihlLG4pe2Uuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWVudGF0aW9uIix0Lm9yaWVudGF0aW9uKSxuPT09dC5oYW5kbGVzLmxlbmd0aC0xP2UuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIik6ZS5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1oaWRkZW4iKX0pfSx0LnByb3RvdHlwZS5ob2xkU2l6ZXM9ZnVuY3Rpb24oKXtzLmVhY2godGhpcy5zaXplcnMsZnVuY3Rpb24odCl7dC5zaXplSGludD10LnNpemV9KX0sdC5wcm90b3R5cGUuaG9sZEFsbFNpemVzPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuY2hpbGRyZW4sZnVuY3Rpb24odCl7cmV0dXJuIHQuaG9sZEFsbFNpemVzKCl9KSx0aGlzLmhvbGRTaXplcygpfSx0LnByb3RvdHlwZS5ub3JtYWxpemVTaXplcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2l6ZXJzLmxlbmd0aDtpZigwIT09dCl7dGhpcy5ob2xkU2l6ZXMoKTt2YXIgZT1zLnJlZHVjZSh0aGlzLnNpemVycyxmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uuc2l6ZUhpbnR9LDApOzA9PT1lP3MuZWFjaCh0aGlzLnNpemVycyxmdW5jdGlvbihlKXtlLnNpemU9ZS5zaXplSGludD0xL3R9KTpzLmVhY2godGhpcy5zaXplcnMsZnVuY3Rpb24odCl7dC5zaXplPXQuc2l6ZUhpbnQvPWV9KSx0aGlzLm5vcm1hbGl6ZWQ9ITB9fSx0LnByb3RvdHlwZS5jcmVhdGVOb3JtYWxpemVkU2l6ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNpemVycy5sZW5ndGg7aWYoMD09PXQpcmV0dXJuW107dmFyIGU9dGhpcy5zaXplcnMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNpemV9KSxuPXMucmVkdWNlKGUsZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSwwKTtyZXR1cm4gMD09PW4/cy5lYWNoKGUsZnVuY3Rpb24obixpKXtlW2ldPTEvdH0pOnMuZWFjaChlLGZ1bmN0aW9uKHQsaSl7ZVtpXT10L259KSxlfSx0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbixpPU1hdGgubWF4KDAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSkqdCxyPW4/aTowLG89bj8wOmkscz0wLGE9dGhpcy5jaGlsZHJlbi5sZW5ndGg7czxhOysrcyl7dmFyIHU9dGhpcy5jaGlsZHJlbltzXS5maXQodCxlKTtuPyhvPU1hdGgubWF4KG8sdS5taW5IZWlnaHQpLHIrPXUubWluV2lkdGgsdGhpcy5zaXplcnNbc10ubWluU2l6ZT11Lm1pbldpZHRoKToocj1NYXRoLm1heChyLHUubWluV2lkdGgpLG8rPXUubWluSGVpZ2h0LHRoaXMuc2l6ZXJzW3NdLm1pblNpemU9dS5taW5IZWlnaHQpfXJldHVybnttaW5XaWR0aDpyLG1pbkhlaWdodDpvLG1heFdpZHRoOjEvMCxtYXhIZWlnaHQ6MS8wfX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uLHU9TWF0aC5tYXgoMCx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKSpyLGg9TWF0aC5tYXgoMCwoYT9uOmkpLXUpO3RoaXMubm9ybWFsaXplZCYmKHMuZWFjaCh0aGlzLnNpemVycyxmdW5jdGlvbih0KXt0LnNpemVIaW50Kj1ofSksdGhpcy5ub3JtYWxpemVkPSExKSxjLkJveEVuZ2luZS5jYWxjKHRoaXMuc2l6ZXJzLGgpO2Zvcih2YXIgbD0wLGQ9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bDxkOysrbCl7dmFyIGY9dGhpcy5jaGlsZHJlbltsXSxwPXRoaXMuc2l6ZXJzW2xdLnNpemUsbT10aGlzLmhhbmRsZXNbbF0uc3R5bGU7YT8oZi51cGRhdGUodCxlLHAsaSxyLG8pLHQrPXAsbS50b3A9ZSsicHgiLG0ubGVmdD10KyJweCIsbS53aWR0aD1yKyJweCIsbS5oZWlnaHQ9aSsicHgiLHQrPXIpOihmLnVwZGF0ZSh0LGUsbixwLHIsbyksZSs9cCxtLnRvcD1lKyJweCIsbS5sZWZ0PXQrInB4IixtLndpZHRoPW4rInB4IixtLmhlaWdodD1yKyJweCIsZSs9cil9fSx0fSgpO3QuU3BsaXRMYXlvdXROb2RlPW99KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDUpLGM9bigzMCksaD1uKDQwKSxsPW4oMjIpLGQ9big0MSksZj1uKDcpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2ZpeGVkPTAsbi5fc3BhY2luZz00LG4uX2RpcnR5PSExLG4uX2hhc05vcm1lZFNpemVzPSExLG4uX3NpemVycz1bXSxuLl9pdGVtcz1bXSxuLl9oYW5kbGVzPVtdLG4uX2JveD1udWxsLG4uX2FsaWdubWVudD0ic3RhcnQiLG4uX29yaWVudGF0aW9uPSJob3Jpem9udGFsIixuLnJlbmRlcmVyPWUucmVuZGVyZXIsdm9pZCAwIT09ZS5vcmllbnRhdGlvbiYmKG4uX29yaWVudGF0aW9uPWUub3JpZW50YXRpb24pLHZvaWQgMCE9PWUuYWxpZ25tZW50JiYobi5fYWxpZ25tZW50PWUuYWxpZ25tZW50KSx2b2lkIDAhPT1lLnNwYWNpbmcmJihuLl9zcGFjaW5nPW8uY2xhbXBTcGFjaW5nKGUuc3BhY2luZykpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fc2l6ZXJzLmxlbmd0aD0wLHRoaXMuX2hhbmRsZXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fb3JpZW50YXRpb249dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQub3JpZW50YXRpb249dCx0aGlzLnBhcmVudC5maXQoKSkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25tZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsaWdubWVudH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2FsaWdubWVudCE9PXQmJih0aGlzLl9hbGlnbm1lbnQ9dCx0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXQsdGhpcy5wYXJlbnQudXBkYXRlKCkpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3Q9by5jbGFtcFNwYWNpbmcodCksdGhpcy5fc3BhY2luZyE9PXQmJih0aGlzLl9zcGFjaW5nPXQsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpdCgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImhhbmRsZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFuZGxlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZWxhdGl2ZVNpemVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8ubm9ybWFsaXplKHRoaXMuX3NpemVycy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2l6ZX0pKX0sZS5wcm90b3R5cGUuc2V0UmVsYXRpdmVTaXplcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2l6ZXJzLmxlbmd0aCxuPXQuc2xpY2UoMCxlKTtuLmxlbmd0aDxlOyluLnB1c2goMCk7Zm9yKHZhciBpPW8ubm9ybWFsaXplKG4pLHI9MDtyPGU7KytyKXt2YXIgcz10aGlzLl9zaXplcnNbcl07cy5zaXplSGludD1pW3JdLHMuc2l6ZT1pW3JdfXRoaXMuX2hhc05vcm1lZFNpemVzPSEwLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC51cGRhdGUoKX0sZS5wcm90b3R5cGUubW92ZUhhbmRsZT1mdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5faGFuZGxlc1t0XTtpZihpJiYhaS5jbGFzc0xpc3QuY29udGFpbnMoInAtbW9kLWhpZGRlbiIpJiYwIT09KG49Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/ZS1pLm9mZnNldExlZnQ6ZS1pLm9mZnNldFRvcCkpe2Zvcih2YXIgcj0wLG89dGhpcy5fc2l6ZXJzO3I8by5sZW5ndGg7cisrKXt2YXIgcz1vW3JdO3Muc2l6ZT4wJiYocy5zaXplSGludD1zLnNpemUpfWguQm94RW5naW5lLmFkanVzdCh0aGlzLl9zaXplcnMsdCxuKSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCl9fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQuZGF0YXNldC5vcmllbnRhdGlvbj10aGlzLm9yaWVudGF0aW9uLHRoaXMucGFyZW50LmRhdGFzZXQuYWxpZ25tZW50PXRoaXMuYWxpZ25tZW50LHQucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuYXR0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGwuTGF5b3V0SXRlbShlKSxpPW8uY3JlYXRlSGFuZGxlKHRoaXMucmVuZGVyZXIpLHI9by5hdmVyYWdlU2l6ZSh0aGlzLl9zaXplcnMpLGE9by5jcmVhdGVTaXplcihyKTtzLkFycmF5RXh0Lmluc2VydCh0aGlzLl9pdGVtcyx0LG4pLHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX3NpemVycyx0LGEpLHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX2hhbmRsZXMsdCxpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZChlLm5vZGUpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQoaSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGYuV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe3MuQXJyYXlFeHQubW92ZSh0aGlzLl9pdGVtcyx0LGUpLHMuQXJyYXlFeHQubW92ZSh0aGlzLl9zaXplcnMsdCxlKSxzLkFycmF5RXh0Lm1vdmUodGhpcy5faGFuZGxlcyx0LGUpLHRoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpLGk9cy5BcnJheUV4dC5yZW1vdmVBdCh0aGlzLl9oYW5kbGVzLHQpO3MuQXJyYXlFeHQucmVtb3ZlQXQodGhpcy5fc2l6ZXJzLHQpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxmLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQubm9kZS5yZW1vdmVDaGlsZChpKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKGUsZi5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKSxuLmRpc3Bvc2UoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25CZWZvcmVTaG93PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm9uQmVmb3JlU2hvdy5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQudXBkYXRlKCl9LGUucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoLmNhbGwodGhpcyxlKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZFNob3duPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vbkNoaWxkSGlkZGVuPWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmZpdCgpfSxlLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSh0LndpZHRoLHQuaGVpZ2h0KX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzVmlzaWJsZSYmdGhpcy5fdXBkYXRlKC0xLC0xKX0sZS5wcm90b3R5cGUub25GaXRSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnRoaXMuX2ZpdCgpfSxlLnByb3RvdHlwZS5fZml0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsbj0tMSxpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl0aGlzLl9pdGVtc1tpXS5pc0hpZGRlbj90aGlzLl9oYW5kbGVzW2ldLmNsYXNzTGlzdC5hZGQoInAtbW9kLWhpZGRlbiIpOih0aGlzLl9oYW5kbGVzW2ldLmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLWhpZGRlbiIpLG49aSx0KyspOy0xIT09biYmdGhpcy5faGFuZGxlc1tuXS5jbGFzc0xpc3QuYWRkKCJwLW1vZC1oaWRkZW4iKSx0aGlzLl9maXhlZD10aGlzLl9zcGFjaW5nKk1hdGgubWF4KDAsdC0xKTt2YXIgbz0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbixzPW8/dGhpcy5fZml4ZWQ6MCxjPW8/MDp0aGlzLl9maXhlZDtmb3IoaT0wLHI9dGhpcy5faXRlbXMubGVuZ3RoO2k8cjsrK2kpe3ZhciBoPXRoaXMuX2l0ZW1zW2ldLGw9dGhpcy5fc2l6ZXJzW2ldO2wuc2l6ZT4wJiYobC5zaXplSGludD1sLnNpemUpLGguaXNIaWRkZW4/KGwubWluU2l6ZT0wLGwubWF4U2l6ZT0wKTooaC5maXQoKSxsLnN0cmV0Y2g9ZS5nZXRTdHJldGNoKGgud2lkZ2V0KSxvPyhsLm1pblNpemU9aC5taW5XaWR0aCxsLm1heFNpemU9aC5tYXhXaWR0aCxzKz1oLm1pbldpZHRoLGM9TWF0aC5tYXgoYyxoLm1pbkhlaWdodCkpOihsLm1pblNpemU9aC5taW5IZWlnaHQsbC5tYXhTaXplPWgubWF4SGVpZ2h0LGMrPWgubWluSGVpZ2h0LHM9TWF0aC5tYXgocyxoLm1pbldpZHRoKSkpfXZhciBkPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3MrPWQuaG9yaXpvbnRhbFN1bSxjKz1kLnZlcnRpY2FsU3VtO3ZhciBwPXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7cC5taW5XaWR0aD1zKyJweCIscC5taW5IZWlnaHQ9YysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZi5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGYuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PWEuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvLHM9dGhpcy5fYm94LnBhZGRpbmdUb3AsdT10aGlzLl9ib3gucGFkZGluZ0xlZnQsYz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLGw9ZS10aGlzLl9ib3gudmVydGljYWxTdW0sZD0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnRhdGlvbjtpZihvPWQ/TWF0aC5tYXgoMCxjLXRoaXMuX2ZpeGVkKTpNYXRoLm1heCgwLGwtdGhpcy5fZml4ZWQpLHRoaXMuX2hhc05vcm1lZFNpemVzKXtmb3IodmFyIGY9MCxwPXRoaXMuX3NpemVycztmPHAubGVuZ3RoO2YrKyl7cFtmXS5zaXplSGludCo9b310aGlzLl9oYXNOb3JtZWRTaXplcz0hMX12YXIgbT1oLkJveEVuZ2luZS5jYWxjKHRoaXMuX3NpemVycyxvKSxnPTAsdj0wO2lmKG0+MClzd2l0Y2godGhpcy5fYWxpZ25tZW50KXtjYXNlInN0YXJ0IjpicmVhaztjYXNlImNlbnRlciI6Zz0wLHY9bS8yO2JyZWFrO2Nhc2UiZW5kIjpnPTAsdj1tO2JyZWFrO2Nhc2UianVzdGlmeSI6Zz1tL24sdj0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUifWZvcihpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl7dmFyIGI9dGhpcy5faXRlbXNbaV07aWYoIWIuaXNIaWRkZW4pe3ZhciB5PXRoaXMuX3NpemVyc1tpXS5zaXplLF89dGhpcy5faGFuZGxlc1tpXS5zdHlsZTtkPyhiLnVwZGF0ZSh1K3Yscyx5K2csbCksdSs9eStnLF8udG9wPXMrInB4IixfLmxlZnQ9dSt2KyJweCIsXy53aWR0aD10aGlzLl9zcGFjaW5nKyJweCIsXy5oZWlnaHQ9bCsicHgiLHUrPXRoaXMuX3NwYWNpbmcpOihiLnVwZGF0ZSh1LHMrdixjLHkrZykscys9eStnLF8udG9wPXMrdisicHgiLF8ubGVmdD11KyJweCIsXy53aWR0aD1jKyJweCIsXy5oZWlnaHQ9dGhpcy5fc3BhY2luZysicHgiLHMrPXRoaXMuX3NwYWNpbmcpfX19fSxlfShkLlBhbmVsTGF5b3V0KTtlLlNwbGl0TGF5b3V0PXAsZnVuY3Rpb24odCl7dC5nZXRTdHJldGNoPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmV0Y2hQcm9wZXJ0eS5nZXQodCl9LHQuc2V0U3RyZXRjaD1mdW5jdGlvbih0LGUpe28uc3RyZXRjaFByb3BlcnR5LnNldCh0LGUpfX0ocD1lLlNwbGl0TGF5b3V0fHwoZS5TcGxpdExheW91dD17fSkpLGUuU3BsaXRMYXlvdXQ9cCxmdW5jdGlvbih0KXt0LnN0cmV0Y2hQcm9wZXJ0eT1uZXcgYy5BdHRhY2hlZFByb3BlcnR5KHtuYW1lOiJzdHJldGNoIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sY29lcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LGNoYW5nZWQ6ZnVuY3Rpb24odCl7dC5wYXJlbnQmJnQucGFyZW50LmxheW91dCBpbnN0YW5jZW9mIHAmJnQucGFyZW50LmZpdCgpfX0pLHQuY3JlYXRlU2l6ZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGguQm94U2l6ZXI7cmV0dXJuIGUuc2l6ZUhpbnQ9TWF0aC5mbG9vcih0KSxlfSx0LmNyZWF0ZUhhbmRsZT1mdW5jdGlvbih0KXt2YXIgZT10LmNyZWF0ZUhhbmRsZSgpO3JldHVybiBlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZX0sdC5jbGFtcFNwYWNpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcih0KSl9LHQuYXZlcmFnZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5zaXplfSwwKS90Lmxlbmd0aHx8MH0sdC5ub3JtYWxpemU9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107dmFyIG49dC5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtNYXRoLmFicyhlKX0sMCk7cmV0dXJuIDA9PT1uP3QubWFwKGZ1bmN0aW9uKHQpe3JldHVybiAxL2V9KTp0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC9ufSl9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDIpLHM9big5KSxhPW4oNSksdT1uKDIyKSxjPW4oNDEpLGg9big3KSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2RpcnR5PSExLGUuX2l0ZW1zPVtdLGUuX2JveD1udWxsLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7by5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXtvLkFycmF5RXh0Lmluc2VydCh0aGlzLl9pdGVtcyx0LG5ldyB1LkxheW91dEl0ZW0oZSkpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJmEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxoLldpZGdldC5Nc2cuQmVmb3JlQXR0YWNoKSx0aGlzLnBhcmVudC5ub2RlLmFwcGVuZENoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGguV2lkZ2V0Lk1zZy5BZnRlckF0dGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm1vdmVXaWRnZXQ9ZnVuY3Rpb24odCxlLG4pe28uQXJyYXlFeHQubW92ZSh0aGlzLl9pdGVtcyx0LGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1vLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpO3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJmEuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UoZSxoLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKGUubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZShlLGguV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksbi53aWRnZXQubm9kZS5zdHlsZS56SW5kZXg9IiIsbi5kaXNwb3NlKCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxuPTAsaT10aGlzLl9pdGVtcy5sZW5ndGg7bjxpOysrbil7dmFyIHI9dGhpcy5faXRlbXNbbl07ci5pc0hpZGRlbnx8KHIuZml0KCksdD1NYXRoLm1heCh0LHIubWluV2lkdGgpLGU9TWF0aC5tYXgoZSxyLm1pbkhlaWdodCkpfXZhciBvPXRoaXMuX2JveD1zLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3QrPW8uaG9yaXpvbnRhbFN1bSxlKz1vLnZlcnRpY2FsU3VtO3ZhciB1PXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7dS5taW5XaWR0aD10KyJweCIsdS5taW5IZWlnaHQ9ZSsicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmYS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsaC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZhLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGguV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RpcnR5PSExO2Zvcih2YXIgbj0wLGk9MCxyPXRoaXMuX2l0ZW1zLmxlbmd0aDtpPHI7KytpKW4rPSshdGhpcy5faXRlbXNbaV0uaXNIaWRkZW47aWYoMCE9PW4pe3Q8MCYmKHQ9dGhpcy5wYXJlbnQubm9kZS5vZmZzZXRXaWR0aCksZTwwJiYoZT10aGlzLnBhcmVudC5ub2RlLm9mZnNldEhlaWdodCksdGhpcy5fYm94fHwodGhpcy5fYm94PXMuRWxlbWVudEV4dC5ib3hTaXppbmcodGhpcy5wYXJlbnQubm9kZSkpO3ZhciBvPXRoaXMuX2JveC5wYWRkaW5nVG9wLGE9dGhpcy5fYm94LnBhZGRpbmdMZWZ0LHU9dC10aGlzLl9ib3guaG9yaXpvbnRhbFN1bSxjPWUtdGhpcy5fYm94LnZlcnRpY2FsU3VtO2ZvcihpPTAscj10aGlzLl9pdGVtcy5sZW5ndGg7aTxyOysraSl7dmFyIGg9dGhpcy5faXRlbXNbaV07aC5pc0hpZGRlbnx8KGgud2lkZ2V0Lm5vZGUuc3R5bGUuekluZGV4PSIiK2ksaC51cGRhdGUoYSxvLHUsYykpfX19LGV9KGMuUGFuZWxMYXlvdXQpO2UuU3RhY2tlZExheW91dD1sfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMTEpLGE9big1NCksdT1uKDEzNCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyx7bGF5b3V0Om8uY3JlYXRlTGF5b3V0KGUpfSl8fHRoaXM7cmV0dXJuIG4uX3dpZGdldFJlbW92ZWQ9bmV3IHMuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtU3RhY2tlZFBhbmVsIiksbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0UmVtb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRSZW1vdmVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm9uQ2hpbGRBZGRlZD1mdW5jdGlvbih0KXt0LmNoaWxkLmFkZENsYXNzKCJwLVN0YWNrZWRQYW5lbC1jaGlsZCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0LmNoaWxkLnJlbW92ZUNsYXNzKCJwLVN0YWNrZWRQYW5lbC1jaGlsZCIpLHRoaXMuX3dpZGdldFJlbW92ZWQuZW1pdCh0LmNoaWxkKX0sZX0oYS5QYW5lbCk7ZS5TdGFja2VkUGFuZWw9YyxmdW5jdGlvbih0KXt0LmNyZWF0ZUxheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5sYXlvdXR8fG5ldyB1LlN0YWNrZWRMYXlvdXR9fShvfHwobz17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9bigxNiksYz1uKDIpLGg9big1KSxsPW4oMzkpLGQ9big2KSxmPW4oMTUpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10aGlzLGk9ZS52aWV3O3JldHVybiBkZWxldGUgZS52aWV3LChuPXQuY2FsbCh0aGlzLGUpfHx0aGlzKS5fdmlldz1pLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSksdGhpcy5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5pc0Rpc3Bvc2VkfHwodC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3ZpZXcmJnRoaXMuX3ZpZXcucmVtb3ZlKCksdGhpcy5fdmlldz1udWxsKX0sZX0obC5QYW5lbCk7ZS5KdXB5dGVyUGhvc3Bob3JQYW5lbFdpZGdldD1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiQm94VmlldyIsX21vZGVsX25hbWU6IkJveE1vZGVsIixjaGlsZHJlbjpbXSxib3hfc3R5bGU6IiJ9KX0sZS5zZXJpYWxpemVycz1vKHt9LGEuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHtjaGlsZHJlbjp7ZGVzZXJpYWxpemU6cy51bnBhY2tfbW9kZWxzfX0pLGV9KGEuQ29yZURPTVdpZGdldE1vZGVsKTtlLkJveE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJIQm94VmlldyIsX21vZGVsX25hbWU6IkhCb3hNb2RlbCJ9KX0sZX0obSk7ZS5IQm94TW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGQuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IlZCb3hWaWV3IixfbW9kZWxfbmFtZToiVkJveE1vZGVsIn0pfSxlfShtKTtlLlZCb3hNb2RlbD12O3ZhciBiPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuX2NyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucFdpZGdldD1uZXcgcCh7dmlldzp0aGlzfSksdGhpcy5wV2lkZ2V0Lm5vZGV9LGUucHJvdG90eXBlLl9zZXRFbGVtZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZWx8fHQhPT10aGlzLnBXaWRnZXQubm9kZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNldCB0aGUgRE9NIGVsZW1lbnQuIik7dGhpcy5lbD10aGlzLnBXaWRnZXQubm9kZSx0aGlzLiRlbD1mKHRoaXMucFdpZGdldC5ub2RlKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuX3ZpZXdzPW5ldyBzLlZpZXdMaXN0KHRoaXMuYWRkX2NoaWxkX21vZGVsLG51bGwsdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6Y2hpbGRyZW4iLHRoaXMudXBkYXRlX2NoaWxkcmVuKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpib3hfc3R5bGUiLHRoaXMudXBkYXRlX2JveF9zdHlsZSksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC1jb250YWluZXIiKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC1ib3giKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy51cGRhdGVfY2hpbGRyZW4oKSx0aGlzLnNldF9ib3hfc3R5bGUoKX0sZS5wcm90b3R5cGUudXBkYXRlX2NoaWxkcmVuPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbl92aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImNoaWxkcmVuIikpLnRoZW4oZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2guTWVzc2FnZUxvb3AucG9zdE1lc3NhZ2UodC5wV2lkZ2V0LGwuV2lkZ2V0LlJlc2l6ZU1lc3NhZ2UuVW5rbm93blNpemUpfSl9KX0sZS5wcm90b3R5cGUudXBkYXRlX2JveF9zdHlsZT1mdW5jdGlvbigpe3RoaXMudXBkYXRlX21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJib3hfc3R5bGUiKX0sZS5wcm90b3R5cGUuc2V0X2JveF9zdHlsZT1mdW5jdGlvbigpe3RoaXMuc2V0X21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJib3hfc3R5bGUiKX0sZS5wcm90b3R5cGUuYWRkX2NoaWxkX21vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgbC5XaWRnZXQ7cmV0dXJuIHRoaXMucFdpZGdldC5hZGRXaWRnZXQobiksdGhpcy5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3ZhciBpPWMuQXJyYXlFeHQuZmlyc3RJbmRleE9mKGUucFdpZGdldC53aWRnZXRzLG4pO3JldHVybiBlLnBXaWRnZXQuaW5zZXJ0V2lkZ2V0KGksdC5wV2lkZ2V0KSxuLmRpc3Bvc2UoKSx0fSkuY2F0Y2godS5yZWplY3QoIkNvdWxkIG5vdCBhZGQgY2hpbGQgdmlldyB0byBib3giLCEwKSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5fdmlld3M9bnVsbCx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sZS5jbGFzc19tYXA9e3N1Y2Nlc3M6WyJhbGVydCIsImFsZXJ0LXN1Y2Nlc3MiXSxpbmZvOlsiYWxlcnQiLCJhbGVydC1pbmZvIl0sd2FybmluZzpbImFsZXJ0IiwiYWxlcnQtd2FybmluZyJdLGRhbmdlcjpbImFsZXJ0IiwiYWxlcnQtZGFuZ2VyIl19LGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5Cb3hWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpLHRoaXMucFdpZGdldC5hZGRDbGFzcygid2lkZ2V0LWhib3giKX0sZX0oYik7ZS5IQm94Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoIndpZGdldC12Ym94Iil9LGV9KGIpO2UuVkJveFZpZXc9Xzt2YXIgdz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJ3aWRnZXQtZ3JpZGJveCIpLHRoaXMucFdpZGdldC5yZW1vdmVDbGFzcygid2lkZ2V0LWJveCIpfSxlfShiKTtlLkdyaWRCb3hWaWV3PXc7dmFyIHg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJHcmlkQm94VmlldyIsX21vZGVsX25hbWU6IkdyaWRCb3hNb2RlbCJ9KX0sZX0obSk7ZS5HcmlkQm94TW9kZWw9eH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9bigyMyksdT1uKDgpLGM9bigxNiksaD1uKDEzOSksbD1uKDYpLGQ9bigxNSk7bigzNDcpO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkludE1vZGVsIix2YWx1ZTowfSl9LGV9KHMuQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuSW50TW9kZWw9Zjt2YXIgcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGwuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJCb3VuZGVkSW50TW9kZWwiLG1heDoxMDAsbWluOjB9KX0sZX0oZik7ZS5Cb3VuZGVkSW50TW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNsaWRlclN0eWxlTW9kZWwifSl9LGUuc3R5bGVQcm9wZXJ0aWVzPW8oe30sYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwuc3R5bGVQcm9wZXJ0aWVzLHtoYW5kbGVfY29sb3I6e3NlbGVjdG9yOiIudWktc2xpZGVyLWhhbmRsZSIsYXR0cmlidXRlOiJiYWNrZ3JvdW5kLWNvbG9yIixkZWZhdWx0Om51bGx9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuU2xpZGVyU3R5bGVNb2RlbD1tO3ZhciBnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkludFNsaWRlck1vZGVsIixfdmlld19uYW1lOiJJbnRTbGlkZXJWaWV3IixzdGVwOjEsb3JpZW50YXRpb246Imhvcml6b250YWwiLHJlYWRvdXQ6ITAscmVhZG91dF9mb3JtYXQ6ImQiLGNvbnRpbnVvdXNfdXBkYXRlOiEwLHN0eWxlOm51bGwsZGlzYWJsZWQ6ITF9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPWguZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0ocCk7ZS5JbnRTbGlkZXJNb2RlbD1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZX0oZyk7ZS5JbnRSYW5nZVNsaWRlck1vZGVsPXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcGFyc2VfdmFsdWU9cGFyc2VJbnQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1zbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1oc2xpZGVyIiksKHRoaXMuJHNsaWRlcj1kKCI8ZGl2IC8+IikpLnNsaWRlcih7c2xpZGU6dGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UuYmluZCh0aGlzKSxzdG9wOnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZC5iaW5kKHRoaXMpfSkuYWRkQ2xhc3MoInNsaWRlciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWRlcl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgic2xpZGVyLWNvbnRhaW5lciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzbGlkZXJbMF0pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJfY29udGFpbmVyKSx0aGlzLnJlYWRvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtcmVhZG91dCIpLHRoaXMucmVhZG91dC5jb250ZW50RWRpdGFibGU9InRydWUiLHRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPT10aGlzKXt2YXIgbj10aGlzO24uJHNsaWRlci5zbGlkZXIoe30pLFsic3RlcCIsImRpc2FibGVkIl0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uLm1vZGVsLmdldCh0KTt2b2lkIDAhPT1lJiZuLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLHQsZSl9KSx0aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKT90aGlzLnJlYWRvdXQuY29udGVudEVkaXRhYmxlPSJmYWxzZSI6dGhpcy5yZWFkb3V0LmNvbnRlbnRFZGl0YWJsZT0idHJ1ZSI7dmFyIGk9dGhpcy5tb2RlbC5nZXQoIm1heCIpLHI9dGhpcy5tb2RlbC5nZXQoIm1pbiIpO3I8PWkmJih2b2lkIDAhPT1pJiZ0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJtYXgiLGkpLHZvaWQgMCE9PXImJnRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm1pbiIscikpO3ZhciBvPXRoaXMubW9kZWwuZ2V0KCJvcmllbnRhdGlvbiIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm9yaWVudGF0aW9uIixvKSwidmVydGljYWwiPT09bz8odGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXZzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS12Ym94IikpOih0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC12c2xpZGVyIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS12Ym94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSksdGhpcy5tb2RlbC5nZXQoInJlYWRvdXQiKT8odGhpcy5yZWFkb3V0LnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5kaXNwbGF5ZWQudGhlbihmdW5jdGlvbigpe24ucmVhZG91dF9vdmVyZmxvdygpP24ucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJvdmVyZmxvdyIpOm4ucmVhZG91dC5jbGFzc0xpc3QucmVtb3ZlKCJvdmVyZmxvdyIpfSkpOnRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIn1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJlYWRvdXRfb3ZlcmZsb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkb3V0LnNjcm9sbFdpZHRoPnRoaXMucmVhZG91dC5jbGllbnRXaWR0aH0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlOiJoYW5kbGVTbGlkZXJDaGFuZ2UiLHNsaWRlc3RvcDoiaGFuZGxlU2xpZGVyQ2hhbmdlZCIsImJsdXIgW2NvbnRlbnRFZGl0YWJsZT10cnVlXSI6ImhhbmRsZVRleHRDaGFuZ2UiLCJrZXlkb3duIFtjb250ZW50RWRpdGFibGU9dHJ1ZV0iOiJoYW5kbGVLZXlEb3duIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7MTM9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVUZXh0Q2hhbmdlKCkpfSxlLnByb3RvdHlwZS5fdmFsaWRhdGVfc2xpZGVfdmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodCl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLkJhc2VJbnRTbGlkZXJWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcmFuZ2VfcmVnZXg9L15ccyooWystXT9cZCspXHMqWy064oCTXVxzKihbKy1dP1xkKykvLGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxlKSx0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJyYW5nZSIsITApO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlcyIsbi5zbGljZSgpKSx0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKG4pLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpIT09biYmKHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsbix7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpfSxlLnByb3RvdHlwZS52YWx1ZVRvU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWwucmVhZG91dF9mb3JtYXR0ZXI7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkuam9pbigiIOKAkyAiKX0sZS5wcm90b3R5cGUuc3RyaW5nVG9WYWx1ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yYW5nZV9yZWdleC5leGVjKHQpO3JldHVybiBlP1t0aGlzLl9wYXJzZV92YWx1ZShlWzFdKSx0aGlzLl9wYXJzZV92YWx1ZShlWzJdKV06bnVsbH0sZS5wcm90b3R5cGUuaGFuZGxlVGV4dENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RyaW5nVG9WYWx1ZSh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQpLGU9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpO251bGw9PT10fHxpc05hTih0WzBdKXx8aXNOYU4odFsxXSl8fHRbMF0+dFsxXT90aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKToodD1bTWF0aC5tYXgoTWF0aC5taW4odFswXSxuKSxlKSxNYXRoLm1heChNYXRoLm1pbih0WzFdLG4pLGUpXSlbMF0hPT10aGlzLm1vZGVsLmdldCgidmFsdWUiKVswXXx8dFsxXSE9PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpWzFdPyh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHQpLHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsdCx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpOnRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5tb2RlbC5nZXQoInZhbHVlIikpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnZhbHVlcy5tYXAodGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcobiksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS52YWx1ZXMubWFwKHRoaXMuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLG4se3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShiKTtlLkludFJhbmdlU2xpZGVyVmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMsZSk7dmFyIG49dGhpcy5tb2RlbC5nZXQoIm1pbiIpLGk9dGhpcy5tb2RlbC5nZXQoIm1heCIpLHI9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7cj5pP3I9aTpyPG4mJihyPW4pLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlIixyKSx0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHIpLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpIT09ciYmKHRoaXMubW9kZWwuc2V0KCJ2YWx1ZSIscix7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCkpfSxlLnByb3RvdHlwZS52YWx1ZVRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybigwLHRoaXMubW9kZWwucmVhZG91dF9mb3JtYXR0ZXIpKHQpfSxlLnByb3RvdHlwZS5zdHJpbmdUb1ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJzZV92YWx1ZSh0KX0sZS5wcm90b3R5cGUuaGFuZGxlVGV4dENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RyaW5nVG9WYWx1ZSh0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQpLGU9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpO2lzTmFOKHQpP3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5tb2RlbC5nZXQoInZhbHVlIikpOih0PU1hdGgubWF4KE1hdGgubWluKHQsbiksZSkpIT09dGhpcy5tb2RlbC5nZXQoInZhbHVlIik/KHRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcodCksdGhpcy5tb2RlbC5zZXQoInZhbHVlIix0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKSk6dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0aGlzLm1vZGVsLmdldCgidmFsdWUiKSl9LGUucHJvdG90eXBlLmhhbmRsZVNsaWRlckNoYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlKGUudmFsdWUpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcobiksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSk7dGhpcy5tb2RlbC5zZXQoInZhbHVlIixuLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0oYik7ZS5JbnRTbGlkZXJWaWV3PV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiSW50VGV4dE1vZGVsIixfdmlld19uYW1lOiJJbnRUZXh0VmlldyIsZGlzYWJsZWQ6ITEsY29udGludW91c191cGRhdGU6ITF9KX0sZX0oZik7ZS5JbnRUZXh0TW9kZWw9dzt2YXIgeD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGwuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJCb3VuZGVkSW50VGV4dE1vZGVsIixfdmlld19uYW1lOiJJbnRUZXh0VmlldyIsZGlzYWJsZWQ6ITEsY29udGludW91c191cGRhdGU6ITEsc3RlcDoxfSl9LGV9KHApO2UuQm91bmRlZEludFRleHRNb2RlbD14O3ZhciBNPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlSW50LGUuX2RlZmF1bHRfc3RlcD0iMSIsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0IiksdGhpcy50ZXh0Ym94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdGhpcy50ZXh0Ym94LnR5cGU9Im51bWJlciIsdGhpcy50ZXh0Ym94LnJlcXVpcmVkPSEwLHRoaXMudGV4dGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9Yy51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRib3gpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lfHxlLnVwZGF0ZWRfdmlldyE9PXRoaXMpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuX3BhcnNlX3ZhbHVlKHRoaXMudGV4dGJveC52YWx1ZSkhPT1uJiYodGhpcy50ZXh0Ym94LnZhbHVlPW4udG9TdHJpbmcoKSksdm9pZCAwIT09dGhpcy5tb2RlbC5nZXQoIm1pbiIpJiYodGhpcy50ZXh0Ym94Lm1pbj10aGlzLm1vZGVsLmdldCgibWluIikpLHZvaWQgMCE9PXRoaXMubW9kZWwuZ2V0KCJtYXgiKSYmKHRoaXMudGV4dGJveC5tYXg9dGhpcy5tb2RlbC5nZXQoIm1heCIpKSx2b2lkIDAhPT10aGlzLm1vZGVsLmdldCgic3RlcCIpJiZudWxsIT09dGhpcy5tb2RlbC5nZXQoInN0ZXAiKT90aGlzLnRleHRib3guc3RlcD10aGlzLm1vZGVsLmdldCgic3RlcCIpOnRoaXMudGV4dGJveC5zdGVwPXRoaXMuX2RlZmF1bHRfc3RlcCx0aGlzLnRleHRib3guZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIil9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImtleWRvd24gaW5wdXQiOiJoYW5kbGVLZXlEb3duIiwia2V5cHJlc3MgaW5wdXQiOiJoYW5kbGVLZXlwcmVzcyIsImlucHV0IGlucHV0IjoiaGFuZGxlQ2hhbmdpbmciLCJjaGFuZ2UgaW5wdXQiOiJoYW5kbGVDaGFuZ2VkIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5cHJlc3M9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQudmFsdWUudHJpbSgpOyIiPT09ZXx8WyItIiwiLS4iLCIuIiwiKy4iLCIrIl0uaW5kZXhPZihlKT49MHx8dGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlQ2hhbmdlZCh0KX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wYXJzZV92YWx1ZSh0LnRhcmdldC52YWx1ZSk7aWYoaXNOYU4oZSkpdC50YXJnZXQudmFsdWU9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7ZWxzZXt2YXIgbj1lO3ZvaWQgMCE9PXRoaXMubW9kZWwuZ2V0KCJtYXgiKSYmKG49TWF0aC5taW4odGhpcy5tb2RlbC5nZXQoIm1heCIpLG4pKSx2b2lkIDAhPT10aGlzLm1vZGVsLmdldCgibWluIikmJihuPU1hdGgubWF4KHRoaXMubW9kZWwuZ2V0KCJtaW4iKSxuKSksbiE9PWUmJih0LnRhcmdldC52YWx1ZT1uLGU9biksZSE9PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpJiYodGhpcy5tb2RlbC5zZXQoInZhbHVlIixlLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKSl9fSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5JbnRUZXh0Vmlldz1NO3ZhciBTPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiUHJvZ3Jlc3NTdHlsZU1vZGVsIn0pfSxlLnN0eWxlUHJvcGVydGllcz1vKHt9LGEuRGVzY3JpcHRpb25TdHlsZU1vZGVsLnN0eWxlUHJvcGVydGllcyx7YmFyX2NvbG9yOntzZWxlY3RvcjoiLnByb2dyZXNzLWJhciIsYXR0cmlidXRlOiJiYWNrZ3JvdW5kLWNvbG9yIixkZWZhdWx0Om51bGx9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuUHJvZ3Jlc3NTdHlsZU1vZGVsPVM7dmFyIEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiSW50UHJvZ3Jlc3NNb2RlbCIsX3ZpZXdfbmFtZToiUHJvZ3Jlc3NWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsYmFyX3N0eWxlOiIiLHN0eWxlOm51bGx9KX0sZX0ocCk7ZS5JbnRQcm9ncmVzc01vZGVsPUU7dmFyIEE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmJhcl9zdHlsZSIsdGhpcy51cGRhdGVfYmFyX3N0eWxlKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKTt2YXIgZT0iaG9yaXpvbnRhbCI9PT10aGlzLm1vZGVsLmdldCgib3JpZW50YXRpb24iKT8id2lkZ2V0LWhwcm9ncmVzcyI6IndpZGdldC12cHJvZ3Jlc3MiO3RoaXMuZWwuY2xhc3NMaXN0LmFkZChlKSx0aGlzLnByb2dyZXNzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMucHJvZ3Jlc3MuY2xhc3NMaXN0LmFkZCgicHJvZ3Jlc3MiKSx0aGlzLnByb2dyZXNzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnByb2dyZXNzKSx0aGlzLmJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmJhci5jbGFzc0xpc3QuYWRkKCJwcm9ncmVzcy1iYXIiKSx0aGlzLmJhci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuYmFyLnN0eWxlLmJvdHRvbT0iMHB4Iix0aGlzLmJhci5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMucHJvZ3Jlc3MuYXBwZW5kQ2hpbGQodGhpcy5iYXIpLHRoaXMudXBkYXRlKCksdGhpcy5zZXRfYmFyX3N0eWxlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpLG49dGhpcy5tb2RlbC5nZXQoIm1heCIpLGk9dGhpcy5tb2RlbC5nZXQoIm1pbiIpLHI9MTAwKihlLWkpLyhuLWkpO3JldHVybiJob3Jpem9udGFsIj09PXRoaXMubW9kZWwuZ2V0KCJvcmllbnRhdGlvbiIpPyh0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtdmJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LXZwcm9ncmVzcyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHByb2dyZXNzIiksdGhpcy5iYXIuc3R5bGUud2lkdGg9cisiJSIsdGhpcy5iYXIuc3R5bGUuaGVpZ2h0PSIxMDAlIik6KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtaHByb2dyZXNzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLXZib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC12cHJvZ3Jlc3MiKSx0aGlzLmJhci5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5iYXIuc3R5bGUuaGVpZ2h0PXIrIiUiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUudXBkYXRlX2Jhcl9zdHlsZT1mdW5jdGlvbigpe3RoaXMudXBkYXRlX21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJiYXJfc3R5bGUiLHRoaXMuYmFyKX0sZS5wcm90b3R5cGUuc2V0X2Jhcl9zdHlsZT1mdW5jdGlvbigpe3RoaXMuc2V0X21hcHBlZF9jbGFzc2VzKGUuY2xhc3NfbWFwLCJiYXJfc3R5bGUiLHRoaXMuYmFyKX0sZS5jbGFzc19tYXA9e3N1Y2Nlc3M6WyJwcm9ncmVzcy1iYXItc3VjY2VzcyJdLGluZm86WyJwcm9ncmVzcy1iYXItaW5mbyJdLHdhcm5pbmc6WyJwcm9ncmVzcy1iYXItd2FybmluZyJdLGRhbmdlcjpbInByb2dyZXNzLWJhci1kYW5nZXIiXX0sZX0oYS5EZXNjcmlwdGlvblZpZXcpO2UuUHJvZ3Jlc3NWaWV3PUE7dmFyIEM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBsLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiUGxheU1vZGVsIixfdmlld19uYW1lOiJQbGF5VmlldyIsX3BsYXlpbmc6ITEsX3JlcGVhdDohMSxzaG93X3JlcGVhdDohMCxpbnRlcnZhbDoxMDAsc3RlcDoxLGRpc2FibGVkOiExfSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5sb29wPWZ1bmN0aW9uKCl7aWYodGhpcy5nZXQoIl9wbGF5aW5nIikpe3ZhciB0PXRoaXMuZ2V0KCJ2YWx1ZSIpK3RoaXMuZ2V0KCJzdGVwIik7dDw9dGhpcy5nZXQoIm1heCIpPyh0aGlzLnNldCgidmFsdWUiLHQpLHRoaXMuc2NoZWR1bGVfbmV4dCgpKTp0aGlzLmdldCgiX3JlcGVhdCIpPyh0aGlzLnNldCgidmFsdWUiLHRoaXMuZ2V0KCJtaW4iKSksdGhpcy5zY2hlZHVsZV9uZXh0KCkpOnRoaXMuc2V0KCJfcGxheWluZyIsITEpLHRoaXMuc2F2ZV9jaGFuZ2VzKCl9fSxlLnByb3RvdHlwZS5zY2hlZHVsZV9uZXh0PWZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sb29wLmJpbmQodGhpcyksdGhpcy5nZXQoImludGVydmFsIikpfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9wbGF5aW5nIiwhMSksdGhpcy5zZXQoInZhbHVlIix0aGlzLmdldCgibWluIikpLHRoaXMuc2F2ZV9jaGFuZ2VzKCl9LGUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9wbGF5aW5nIiwhMSksdGhpcy5zYXZlX2NoYW5nZXMoKX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuc2V0KCJfcGxheWluZyIsITApLHRoaXMuZ2V0KCJ2YWx1ZSIpPT10aGlzLmdldCgibWF4Iik/KHRoaXMuc2V0KCJ2YWx1ZSIsdGhpcy5nZXQoIm1pbiIpKSx0aGlzLnNjaGVkdWxlX25leHQoKSx0aGlzLnNhdmVfY2hhbmdlcygpKTp0aGlzLmxvb3AoKX0sZS5wcm90b3R5cGUucmVwZWF0PWZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9yZXBlYXQiLCF0aGlzLmdldCgiX3JlcGVhdCIpKSx0aGlzLnNhdmVfY2hhbmdlcygpfSxlfShwKTtlLlBsYXlNb2RlbD1DO3ZhciBrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXBsYXkiKSx0aGlzLnBsYXlCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5wYXVzZUJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKSx0aGlzLnN0b3BCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5yZXBlYXRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksdGhpcy5wbGF5QnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMucGF1c2VCdXR0b24uY2xhc3NOYW1lPSJqdXB5dGVyLWJ1dHRvbiIsdGhpcy5zdG9wQnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMucmVwZWF0QnV0dG9uLmNsYXNzTmFtZT0ianVweXRlci1idXR0b24iLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5wbGF5QnV0dG9uKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMucGF1c2VCdXR0b24pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zdG9wQnV0dG9uKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMucmVwZWF0QnV0dG9uKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7ZS5jbGFzc05hbWU9ImZhIGZhLXBsYXkiLHRoaXMucGxheUJ1dHRvbi5hcHBlbmRDaGlsZChlKTt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7bi5jbGFzc05hbWU9ImZhIGZhLXBhdXNlIix0aGlzLnBhdXNlQnV0dG9uLmFwcGVuZENoaWxkKG4pO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTtpLmNsYXNzTmFtZT0iZmEgZmEtc3RvcCIsdGhpcy5zdG9wQnV0dG9uLmFwcGVuZENoaWxkKGkpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTtyLmNsYXNzTmFtZT0iZmEgZmEtcmV0d2VldCIsdGhpcy5yZXBlYXRCdXR0b24uYXBwZW5kQ2hpbGQociksdGhpcy5wbGF5QnV0dG9uLm9uY2xpY2s9dGhpcy5tb2RlbC5wbGF5LmJpbmQodGhpcy5tb2RlbCksdGhpcy5wYXVzZUJ1dHRvbi5vbmNsaWNrPXRoaXMubW9kZWwucGF1c2UuYmluZCh0aGlzLm1vZGVsKSx0aGlzLnN0b3BCdXR0b24ub25jbGljaz10aGlzLm1vZGVsLnN0b3AuYmluZCh0aGlzLm1vZGVsKSx0aGlzLnJlcGVhdEJ1dHRvbi5vbmNsaWNrPXRoaXMubW9kZWwucmVwZWF0LmJpbmQodGhpcy5tb2RlbCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X3BsYXlpbmciLHRoaXMudXBkYXRlX3BsYXlpbmcpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOl9yZXBlYXQiLHRoaXMudXBkYXRlX3JlcGVhdCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6c2hvd19yZXBlYXQiLHRoaXMudXBkYXRlX3JlcGVhdCksdGhpcy51cGRhdGVfcGxheWluZygpLHRoaXMudXBkYXRlX3JlcGVhdCgpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMucGxheUJ1dHRvbi5kaXNhYmxlZD10LHRoaXMucGF1c2VCdXR0b24uZGlzYWJsZWQ9dCx0aGlzLnN0b3BCdXR0b24uZGlzYWJsZWQ9dCx0aGlzLnJlcGVhdEJ1dHRvbi5kaXNhYmxlZD10LHRoaXMudXBkYXRlX3BsYXlpbmcoKX0sZS5wcm90b3R5cGUudXBkYXRlX3BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiX3BsYXlpbmciKSxlPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3Q/KGV8fCh0aGlzLnBhdXNlQnV0dG9uLmRpc2FibGVkPSExKSx0aGlzLnBsYXlCdXR0b24uY2xhc3NMaXN0LmFkZCgibW9kLWFjdGl2ZSIpKTooZXx8KHRoaXMucGF1c2VCdXR0b24uZGlzYWJsZWQ9ITApLHRoaXMucGxheUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIikpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVwZWF0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbC5nZXQoIl9yZXBlYXQiKTt0aGlzLnJlcGVhdEJ1dHRvbi5zdHlsZS5kaXNwbGF5PXRoaXMubW9kZWwuZ2V0KCJzaG93X3JlcGVhdCIpP3RoaXMucGxheUJ1dHRvbi5zdHlsZS5kaXNwbGF5OiJub25lIix0P3RoaXMucmVwZWF0QnV0dG9uLmNsYXNzTGlzdC5hZGQoIm1vZC1hY3RpdmUiKTp0aGlzLnJlcGVhdEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIil9LGV9KHUuRE9NV2lkZ2V0Vmlldyk7ZS5QbGF5Vmlldz1rfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvOwovKiEKICogalF1ZXJ5IFVJIFdpZGdldCAxLjEyLjEKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovcj1bbigxNSksbig0MildLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3ZhciBlLG49MCxpPUFycmF5LnByb3RvdHlwZS5zbGljZTtyZXR1cm4gdC5jbGVhbkRhdGE9KGU9dC5jbGVhbkRhdGEsZnVuY3Rpb24obil7dmFyIGkscixvO2ZvcihvPTA7bnVsbCE9KHI9bltvXSk7bysrKXRyeXsoaT10Ll9kYXRhKHIsImV2ZW50cyIpKSYmaS5yZW1vdmUmJnQocikudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKHQpe31lKG4pfSksdC53aWRnZXQ9ZnVuY3Rpb24oZSxuLGkpe3ZhciByLG8scyxhPXt9LHU9ZS5zcGxpdCgiLiIpWzBdLGM9dSsiLSIrKGU9ZS5zcGxpdCgiLiIpWzFdKTtyZXR1cm4gaXx8KGk9bixuPXQuV2lkZ2V0KSx0LmlzQXJyYXkoaSkmJihpPXQuZXh0ZW5kLmFwcGx5KG51bGwsW3t9XS5jb25jYXQoaSkpKSx0LmV4cHJbIjoiXVtjLnRvTG93ZXJDYXNlKCldPWZ1bmN0aW9uKGUpe3JldHVybiEhdC5kYXRhKGUsYyl9LHRbdV09dFt1XXx8e30scj10W3VdW2VdLG89dFt1XVtlXT1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9jcmVhdGVXaWRnZXQpcmV0dXJuIG5ldyBvKHQsZSk7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KHQsZSl9LHQuZXh0ZW5kKG8scix7dmVyc2lvbjppLnZlcnNpb24sX3Byb3RvOnQuZXh0ZW5kKHt9LGkpLF9jaGlsZENvbnN0cnVjdG9yczpbXX0pLChzPW5ldyBuKS5vcHRpb25zPXQud2lkZ2V0LmV4dGVuZCh7fSxzLm9wdGlvbnMpLHQuZWFjaChpLGZ1bmN0aW9uKGUsaSl7dC5pc0Z1bmN0aW9uKGkpP2FbZV09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG4ucHJvdG90eXBlW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiByKHQpe3JldHVybiBuLnByb3RvdHlwZVtlXS5hcHBseSh0aGlzLHQpfXJldHVybiBmdW5jdGlvbigpe3ZhciBlLG49dGhpcy5fc3VwZXIsbz10aGlzLl9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9cixlPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPW4sdGhpcy5fc3VwZXJBcHBseT1vLGV9fSgpOmFbZV09aX0pLG8ucHJvdG90eXBlPXQud2lkZ2V0LmV4dGVuZChzLHt3aWRnZXRFdmVudFByZWZpeDpyJiZzLndpZGdldEV2ZW50UHJlZml4fHxlfSxhLHtjb25zdHJ1Y3RvcjpvLG5hbWVzcGFjZTp1LHdpZGdldE5hbWU6ZSx3aWRnZXRGdWxsTmFtZTpjfSkscj8odC5lYWNoKHIuX2NoaWxkQ29uc3RydWN0b3JzLGZ1bmN0aW9uKGUsbil7dmFyIGk9bi5wcm90b3R5cGU7dC53aWRnZXQoaS5uYW1lc3BhY2UrIi4iK2kud2lkZ2V0TmFtZSxvLG4uX3Byb3RvKX0pLGRlbGV0ZSByLl9jaGlsZENvbnN0cnVjdG9ycyk6bi5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaChvKSx0LndpZGdldC5icmlkZ2UoZSxvKSxvfSx0LndpZGdldC5leHRlbmQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHIsbz1pLmNhbGwoYXJndW1lbnRzLDEpLHM9MCxhPW8ubGVuZ3RoO3M8YTtzKyspZm9yKG4gaW4gb1tzXSlyPW9bc11bbl0sb1tzXS5oYXNPd25Qcm9wZXJ0eShuKSYmdm9pZCAwIT09ciYmKHQuaXNQbGFpbk9iamVjdChyKT9lW25dPXQuaXNQbGFpbk9iamVjdChlW25dKT90LndpZGdldC5leHRlbmQoe30sZVtuXSxyKTp0LndpZGdldC5leHRlbmQoe30scik6ZVtuXT1yKTtyZXR1cm4gZX0sdC53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGUsbil7dmFyIHI9bi5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWV8fGU7dC5mbltlXT1mdW5jdGlvbihvKXt2YXIgcz0ic3RyaW5nIj09dHlwZW9mIG8sYT1pLmNhbGwoYXJndW1lbnRzLDEpLHU9dGhpcztyZXR1cm4gcz90aGlzLmxlbmd0aHx8Imluc3RhbmNlIiE9PW8/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG4saT10LmRhdGEodGhpcyxyKTtyZXR1cm4iaW5zdGFuY2UiPT09bz8odT1pLCExKTppP3QuaXNGdW5jdGlvbihpW29dKSYmIl8iIT09by5jaGFyQXQoMCk/KG49aVtvXS5hcHBseShpLGEpKSE9PWkmJnZvaWQgMCE9PW4/KHU9biYmbi5qcXVlcnk/dS5wdXNoU3RhY2sobi5nZXQoKSk6biwhMSk6dm9pZCAwOnQuZXJyb3IoIm5vIHN1Y2ggbWV0aG9kICciK28rIicgZm9yICIrZSsiIHdpZGdldCBpbnN0YW5jZSIpOnQuZXJyb3IoImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIitlKyIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IGF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIitvKyInIil9KTp1PXZvaWQgMDooYS5sZW5ndGgmJihvPXQud2lkZ2V0LmV4dGVuZC5hcHBseShudWxsLFtvXS5jb25jYXQoYSkpKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10LmRhdGEodGhpcyxyKTtlPyhlLm9wdGlvbihvfHx7fSksZS5faW5pdCYmZS5faW5pdCgpKTp0LmRhdGEodGhpcyxyLG5ldyBuKG8sdGhpcykpfSkpLHV9fSx0LldpZGdldD1mdW5jdGlvbigpe30sdC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzPVtdLHQuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVudFByZWZpeDoiIixkZWZhdWx0RWxlbWVudDoiPGRpdj4iLG9wdGlvbnM6e2NsYXNzZXM6e30sZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oZSxpKXtpPXQoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PXQoaSksdGhpcy51dWlkPW4rKyx0aGlzLmV2ZW50TmFtZXNwYWNlPSIuIit0aGlzLndpZGdldE5hbWUrdGhpcy51dWlkLHRoaXMuYmluZGluZ3M9dCgpLHRoaXMuaG92ZXJhYmxlPXQoKSx0aGlzLmZvY3VzYWJsZT10KCksdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cD17fSxpIT09dGhpcyYmKHQuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24odCl7dC50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PXQoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9dCh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz10LndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSxlKSx0aGlzLl9jcmVhdGUoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7cmV0dXJue319LF9nZXRDcmVhdGVFdmVudERhdGE6dC5ub29wLF9jcmVhdGU6dC5ub29wLF9pbml0OnQubm9vcCxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9kZXN0cm95KCksdC5lYWNoKHRoaXMuY2xhc3Nlc0VsZW1lbnRMb29rdXAsZnVuY3Rpb24odCxuKXtlLl9yZW1vdmVDbGFzcyhuLHQpfSksdGhpcy5lbGVtZW50Lm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLHRoaXMud2lkZ2V0KCkub2ZmKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKSx0aGlzLmJpbmRpbmdzLm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKX0sX2Rlc3Ryb3k6dC5ub29wLHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihlLG4pe3ZhciBpLHIsbyxzPWU7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlpZihzPXt9LGk9ZS5zcGxpdCgiLiIpLGU9aS5zaGlmdCgpLGkubGVuZ3RoKXtmb3Iocj1zW2VdPXQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnNbZV0pLG89MDtvPGkubGVuZ3RoLTE7bysrKXJbaVtvXV09cltpW29dXXx8e30scj1yW2lbb11dO2lmKGU9aS5wb3AoKSwxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09cltlXT9udWxsOnJbZV07cltlXT1ufWVsc2V7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXRoaXMub3B0aW9uc1tlXT9udWxsOnRoaXMub3B0aW9uc1tlXTtzW2VdPW59cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMocyksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdCl0aGlzLl9zZXRPcHRpb24oZSx0W2VdKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiJjbGFzc2VzIj09PXQmJnRoaXMuX3NldE9wdGlvbkNsYXNzZXMoZSksdGhpcy5vcHRpb25zW3RdPWUsImRpc2FibGVkIj09PXQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKGUpLHRoaXN9LF9zZXRPcHRpb25DbGFzc2VzOmZ1bmN0aW9uKGUpe3ZhciBuLGkscjtmb3IobiBpbiBlKXI9dGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFtuXSxlW25dIT09dGhpcy5vcHRpb25zLmNsYXNzZXNbbl0mJnImJnIubGVuZ3RoJiYoaT10KHIuZ2V0KCkpLHRoaXMuX3JlbW92ZUNsYXNzKHIsbiksaS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzKHtlbGVtZW50Omksa2V5czpuLGNsYXNzZXM6ZSxhZGQ6ITB9KSkpfSxfc2V0T3B0aW9uRGlzYWJsZWQ6ZnVuY3Rpb24odCl7dGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy53aWRnZXQoKSx0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLG51bGwsISF0KSx0JiYodGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5ob3ZlcmFibGUsbnVsbCwidWktc3RhdGUtaG92ZXIiKSx0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmZvY3VzYWJsZSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpKX0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoe2Rpc2FibGVkOiExfSl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITB9KX0sX2NsYXNzZXM6ZnVuY3Rpb24oZSl7dmFyIG49W10saT10aGlzO2Z1bmN0aW9uIHIocixvKXt2YXIgcyxhO2ZvcihhPTA7YTxyLmxlbmd0aDthKyspcz1pLmNsYXNzZXNFbGVtZW50TG9va3VwW3JbYV1dfHx0KCkscz1lLmFkZD90KHQudW5pcXVlKHMuZ2V0KCkuY29uY2F0KGUuZWxlbWVudC5nZXQoKSkpKTp0KHMubm90KGUuZWxlbWVudCkuZ2V0KCkpLGkuY2xhc3Nlc0VsZW1lbnRMb29rdXBbclthXV09cyxuLnB1c2goclthXSksbyYmZS5jbGFzc2VzW3JbYV1dJiZuLnB1c2goZS5jbGFzc2VzW3JbYV1dKX1yZXR1cm4gZT10LmV4dGVuZCh7ZWxlbWVudDp0aGlzLmVsZW1lbnQsY2xhc3Nlczp0aGlzLm9wdGlvbnMuY2xhc3Nlc3x8e319LGUpLHRoaXMuX29uKGUuZWxlbWVudCx7cmVtb3ZlOiJfdW50cmFja0NsYXNzZXNFbGVtZW50In0pLGUua2V5cyYmcihlLmtleXMubWF0Y2goL1xTKy9nKXx8W10sITApLGUuZXh0cmEmJnIoZS5leHRyYS5tYXRjaCgvXFMrL2cpfHxbXSksbi5qb2luKCIgIil9LF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmVhY2gobi5jbGFzc2VzRWxlbWVudExvb2t1cCxmdW5jdGlvbihpLHIpey0xIT09dC5pbkFycmF5KGUudGFyZ2V0LHIpJiYobi5jbGFzc2VzRWxlbWVudExvb2t1cFtpXT10KHIubm90KGUudGFyZ2V0KS5nZXQoKSkpfSl9LF9yZW1vdmVDbGFzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKHQsZSxuLCExKX0sX2FkZENsYXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3ModCxlLG4sITApfSxfdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlLG4saSl7aT0iYm9vbGVhbiI9PXR5cGVvZiBpP2k6bjt2YXIgcj0ic3RyaW5nIj09dHlwZW9mIHR8fG51bGw9PT10LG89e2V4dHJhOnI/ZTpuLGtleXM6cj90OmUsZWxlbWVudDpyP3RoaXMuZWxlbWVudDp0LGFkZDppfTtyZXR1cm4gby5lbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuX2NsYXNzZXMobyksaSksdGhpc30sX29uOmZ1bmN0aW9uKGUsbixpKXt2YXIgcixvPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgZSYmKGk9bixuPWUsZT0hMSksaT8obj1yPXQobiksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChuKSk6KGk9bixuPXRoaXMuZWxlbWVudCxyPXRoaXMud2lkZ2V0KCkpLHQuZWFjaChpLGZ1bmN0aW9uKGkscyl7ZnVuY3Rpb24gYSgpe2lmKGV8fCEwIT09by5vcHRpb25zLmRpc2FibGVkJiYhdCh0aGlzKS5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSlyZXR1cm4oInN0cmluZyI9PXR5cGVvZiBzP29bc106cykuYXBwbHkobyxhcmd1bWVudHMpfSJzdHJpbmciIT10eXBlb2YgcyYmKGEuZ3VpZD1zLmd1aWQ9cy5ndWlkfHxhLmd1aWR8fHQuZ3VpZCsrKTt2YXIgdT1pLm1hdGNoKC9eKFtcdzotXSopXHMqKC4qKSQvKSxjPXVbMV0rby5ldmVudE5hbWVzcGFjZSxoPXVbMl07aD9yLm9uKGMsaCxhKTpuLm9uKGMsYSl9KX0sX29mZjpmdW5jdGlvbihlLG4pe249KG58fCIiKS5zcGxpdCgiICIpLmpvaW4odGhpcy5ldmVudE5hbWVzcGFjZSsiICIpK3RoaXMuZXZlbnROYW1lc3BhY2UsZS5vZmYobikub2ZmKG4pLHRoaXMuYmluZGluZ3M9dCh0aGlzLmJpbmRpbmdzLm5vdChlKS5nZXQoKSksdGhpcy5mb2N1c2FibGU9dCh0aGlzLmZvY3VzYWJsZS5ub3QoZSkuZ2V0KCkpLHRoaXMuaG92ZXJhYmxlPXQodGhpcy5ob3ZlcmFibGUubm90KGUpLmdldCgpKX0sX2RlbGF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybigic3RyaW5nIj09dHlwZW9mIHQ/blt0XTp0KS5hcHBseShuLGFyZ3VtZW50cyl9LGV8fDApfSxfaG92ZXJhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuaG92ZXJhYmxlPXRoaXMuaG92ZXJhYmxlLmFkZChlKSx0aGlzLl9vbihlLHttb3VzZWVudGVyOmZ1bmN0aW9uKGUpe3RoaXMuX2FkZENsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKGUpe3RoaXMuX3JlbW92ZUNsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1ob3ZlciIpfX0pfSxfZm9jdXNhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNhYmxlPXRoaXMuZm9jdXNhYmxlLmFkZChlKSx0aGlzLl9vbihlLHtmb2N1c2luOmZ1bmN0aW9uKGUpe3RoaXMuX2FkZENsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpfSxmb2N1c291dDpmdW5jdGlvbihlKXt0aGlzLl9yZW1vdmVDbGFzcyh0KGUuY3VycmVudFRhcmdldCksbnVsbCwidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLG8scz10aGlzLm9wdGlvbnNbZV07aWYoaT1pfHx7fSwobj10LkV2ZW50KG4pKS50eXBlPShlPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9lOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrZSkudG9Mb3dlckNhc2UoKSxuLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sbz1uLm9yaWdpbmFsRXZlbnQpZm9yKHIgaW4gbylyIGluIG58fChuW3JdPW9bcl0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihuLGkpLCEodC5pc0Z1bmN0aW9uKHMpJiYhMT09PXMuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtuXS5jb25jYXQoaSkpfHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19LHQuZWFjaCh7c2hvdzoiZmFkZUluIixoaWRlOiJmYWRlT3V0In0sZnVuY3Rpb24oZSxuKXt0LldpZGdldC5wcm90b3R5cGVbIl8iK2VdPWZ1bmN0aW9uKGkscixvKXt2YXIgczsic3RyaW5nIj09dHlwZW9mIHImJihyPXtlZmZlY3Q6cn0pO3ZhciBhPXI/ITA9PT1yfHwibnVtYmVyIj09dHlwZW9mIHI/bjpyLmVmZmVjdHx8bjplOyJudW1iZXIiPT10eXBlb2Yocj1yfHx7fSkmJihyPXtkdXJhdGlvbjpyfSkscz0hdC5pc0VtcHR5T2JqZWN0KHIpLHIuY29tcGxldGU9byxyLmRlbGF5JiZpLmRlbGF5KHIuZGVsYXkpLHMmJnQuZWZmZWN0cyYmdC5lZmZlY3RzLmVmZmVjdFthXT9pW2VdKHIpOmEhPT1lJiZpW2FdP2lbYV0oci5kdXJhdGlvbixyLmVhc2luZyxvKTppLnF1ZXVlKGZ1bmN0aW9uKG4pe3QodGhpcylbZV0oKSxvJiZvLmNhbGwoaVswXSksbigpfSl9fSksdC53aWRnZXR9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoKG49KHQ9ZT90LnRvRXhwb25lbnRpYWwoZS0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBuLGk9dC5zbGljZSgwLG4pO3JldHVybltpLmxlbmd0aD4xP2lbMF0raS5zbGljZSgyKTppLCt0LnNsaWNlKG4rMSldfSxyPWZ1bmN0aW9uKHQpe3JldHVybih0PWkoTWF0aC5hYnModCkpKT90WzFdOk5hTn0sbz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBzKHQpe3JldHVybiBuZXcgYSh0KX1mdW5jdGlvbiBhKHQpe2lmKCEoZT1vLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGU7dGhpcy5maWxsPWVbMV18fCIgIix0aGlzLmFsaWduPWVbMl18fCI+Iix0aGlzLnNpZ249ZVszXXx8Ii0iLHRoaXMuc3ltYm9sPWVbNF18fCIiLHRoaXMuemVybz0hIWVbNV0sdGhpcy53aWR0aD1lWzZdJiYrZVs2XSx0aGlzLmNvbW1hPSEhZVs3XSx0aGlzLnByZWNpc2lvbj1lWzhdJiYrZVs4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFlWzldLHRoaXMudHlwZT1lWzEwXXx8IiJ9cy5wcm90b3R5cGU9YS5wcm90b3R5cGUsYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTt2YXIgdSxjLGgsbCxkPWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBlLG49dC5sZW5ndGgsaT0xLHI9LTE7aTxuOysraSlzd2l0Y2godFtpXSl7Y2FzZSIuIjpyPWU9aTticmVhaztjYXNlIjAiOjA9PT1yJiYocj1pKSxlPWk7YnJlYWs7ZGVmYXVsdDppZihyPjApe2lmKCErdFtpXSlicmVhayB0O3I9MH19cmV0dXJuIHI+MD90LnNsaWNlKDAscikrdC5zbGljZShlKzEpOnR9LGY9ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIHI9blswXSxvPW5bMV07cmV0dXJuIG88MD8iMC4iK25ldyBBcnJheSgtbykuam9pbigiMCIpK3I6ci5sZW5ndGg+bysxP3Iuc2xpY2UoMCxvKzEpKyIuIityLnNsaWNlKG8rMSk6cituZXcgQXJyYXkoby1yLmxlbmd0aCsyKS5qb2luKCIwIil9LHA9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxMCl9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKGUpfSxmOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYoMTAwKnQsZSl9LHI6ZixzOmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciByPW5bMF0sbz1uWzFdLHM9by0odT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihvLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gcz09PWE/cjpzPmE/cituZXcgQXJyYXkocy1hKzEpLmpvaW4oIjAiKTpzPjA/ci5zbGljZSgwLHMpKyIuIityLnNsaWNlKHMpOiIwLiIrbmV3IEFycmF5KDEtcykuam9pbigiMCIpK2kodCxNYXRoLm1heCgwLGUrcy0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sbT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0sdj1mdW5jdGlvbih0KXt2YXIgZSxuLGk9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KGU9dC5ncm91cGluZyxuPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQsaSl7Zm9yKHZhciByPXQubGVuZ3RoLG89W10scz0wLGE9ZVswXSx1PTA7cj4wJiZhPjAmJih1K2ErMT5pJiYoYT1NYXRoLm1heCgxLGktdSkpLG8ucHVzaCh0LnN1YnN0cmluZyhyLT1hLHIrYSkpLCEoKHUrPWErMSk+aSkpOylhPWVbcz0ocysxKSVlLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4obil9KTptLG89dC5jdXJyZW5jeSxhPXQuZGVjaW1hbCxjPXQubnVtZXJhbHM/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24oZSl7cmV0dXJuIHRbK2VdfSl9fSh0Lm51bWVyYWxzKTptLGg9dC5wZXJjZW50fHwiJSI7ZnVuY3Rpb24gbCh0KXt2YXIgZT0odD1zKHQpKS5maWxsLG49dC5hbGlnbixyPXQuc2lnbixsPXQuc3ltYm9sLGY9dC56ZXJvLG09dC53aWR0aCx2PXQuY29tbWEsYj10LnByZWNpc2lvbix5PXQudHJpbSxfPXQudHlwZTsibiI9PT1fPyh2PSEwLF89ImciKTpwW19dfHwobnVsbD09YiYmKGI9MTIpLHk9ITAsXz0iZyIpLChmfHwiMCI9PT1lJiYiPSI9PT1uKSYmKGY9ITAsZT0iMCIsbj0iPSIpO3ZhciB3PSIkIj09PWw/b1swXToiIyI9PT1sJiYvW2JveFhdLy50ZXN0KF8pPyIwIitfLnRvTG93ZXJDYXNlKCk6IiIseD0iJCI9PT1sP29bMV06L1slcF0vLnRlc3QoXyk/aDoiIixNPXBbX10sUz0vW2RlZmdwcnMlXS8udGVzdChfKTtmdW5jdGlvbiBFKHQpe3ZhciBvLHMsaCxsPXcscD14O2lmKCJjIj09PV8pcD1NKHQpK3AsdD0iIjtlbHNle3ZhciBFPSh0PSt0KTwwO2lmKHQ9TShNYXRoLmFicyh0KSxiKSx5JiYodD1kKHQpKSxFJiYwPT0rdCYmKEU9ITEpLGw9KEU/IigiPT09cj9yOiItIjoiLSI9PT1yfHwiKCI9PT1yPyIiOnIpK2wscD0oInMiPT09Xz9nWzgrdS8zXToiIikrcCsoRSYmIigiPT09cj8iKSI6IiIpLFMpZm9yKG89LTEscz10Lmxlbmd0aDsrK288czspaWYoNDg+KGg9dC5jaGFyQ29kZUF0KG8pKXx8aD41Nyl7cD0oNDY9PT1oP2ErdC5zbGljZShvKzEpOnQuc2xpY2UobykpK3AsdD10LnNsaWNlKDAsbyk7YnJlYWt9fXYmJiFmJiYodD1pKHQsMS8wKSk7dmFyIEE9bC5sZW5ndGgrdC5sZW5ndGgrcC5sZW5ndGgsQz1BPG0/bmV3IEFycmF5KG0tQSsxKS5qb2luKGUpOiIiO3N3aXRjaCh2JiZmJiYodD1pKEMrdCxDLmxlbmd0aD9tLXAubGVuZ3RoOjEvMCksQz0iIiksbil7Y2FzZSI8Ijp0PWwrdCtwK0M7YnJlYWs7Y2FzZSI9Ijp0PWwrQyt0K3A7YnJlYWs7Y2FzZSJeIjp0PUMuc2xpY2UoMCxBPUMubGVuZ3RoPj4xKStsK3QrcCtDLnNsaWNlKEEpO2JyZWFrO2RlZmF1bHQ6dD1DK2wrdCtwfXJldHVybiBjKHQpfXJldHVybiBiPW51bGw9PWI/NjovW2dwcnNdLy50ZXN0KF8pP01hdGgubWF4KDEsTWF0aC5taW4oMjEsYikpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsYikpLEUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sRX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsZSl7dmFyIG49bCgoKHQ9cyh0KSkudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IocihlKS8zKSkpLG89TWF0aC5wb3coMTAsLWkpLGE9Z1s4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKG8qdCkrYX19fX07ZnVuY3Rpb24gYih0KXtyZXR1cm4gYz12KHQpLGg9Yy5mb3JtYXQsbD1jLmZvcm1hdFByZWZpeCxjfWIoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7dmFyIHk9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsLXIoTWF0aC5hYnModCkpKX0sXz1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHIoZSkvMykpKS1yKE1hdGguYWJzKHQpKSl9LHc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxlPU1hdGguYWJzKGUpLXQsTWF0aC5tYXgoMCxyKGUpLXIodCkpKzF9O24uZChlLCJmb3JtYXREZWZhdWx0TG9jYWxlIixmdW5jdGlvbigpe3JldHVybiBifSksbi5kKGUsImZvcm1hdCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLG4uZChlLCJmb3JtYXRQcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSxuLmQoZSwiZm9ybWF0TG9jYWxlIixmdW5jdGlvbigpe3JldHVybiB2fSksbi5kKGUsImZvcm1hdFNwZWNpZmllciIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJwcmVjaXNpb25GaXhlZCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLG4uZChlLCJwcmVjaXNpb25QcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIF99KSxuLmQoZSwicHJlY2lzaW9uUm91bmQiLGZ1bmN0aW9uKCl7cmV0dXJuIHd9KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Zm9yKHZhciBpPW4oOCkscj1uKDMzOCksbz1uKDM2MCkscz17fSxhPTAsdT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpKTthPHUubGVuZ3RoO2ErKyl7dmFyIGM9dVthXTsoYy5lbmRzV2l0aCgiTW9kZWwiKXx8Yy5lbmRzV2l0aCgiVmlldyIpKSYmKHNbY109aVtjXSl9Zm9yKHZhciBoPTAsbD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKTtoPGwubGVuZ3RoO2grKyl7dmFyIGQ9bFtoXTsoZC5lbmRzV2l0aCgiTW9kZWwiKXx8ZC5lbmRzV2l0aCgiVmlldyIpKSYmKHNbZF09cltkXSl9Zm9yKHZhciBmPTAscD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKTtmPHAubGVuZ3RoO2YrKyl7dmFyIG09cFtmXTsobS5lbmRzV2l0aCgiTW9kZWwiKXx8bS5lbmRzV2l0aCgiVmlldyIpKSYmKHNbbV09b1ttXSl9ZS5kZWZhdWx0PXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSxyPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKShmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHModCl7dHJ5e3UoaS5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBhKHQpe3RyeXt1KGkudGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHUodCl7dC5kb25lP3IodC52YWx1ZSk6bmV3IG4oZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pLnRoZW4ocyxhKX11KChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KX0sbz10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6YSgwKSx0aHJvdzphKDEpLHJldHVybjphKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIGEobyl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihvKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3M7KXRyeXtpZihuPTEsaSYmKHI9MiZvWzBdP2kucmV0dXJuOm9bMF0/aS50aHJvd3x8KChyPWkucmV0dXJuKSYmci5jYWxsKGkpLDApOmkubmV4dCkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVsyJm9bMF0sci52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6cj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKyssaT1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocj0ocj1zLnRyeXMpLmxlbmd0aD4wJiZyW3IubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFyfHxvWzFdPnJbMF0mJm9bMV08clszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxyWzFdKXtzLmxhYmVsPXJbMV0scj1vO2JyZWFrfWlmKHImJnMubGFiZWw8clsyXSl7cy5sYWJlbD1yWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9clsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89ZS5jYWxsKHQscyl9Y2F0Y2godCl7bz1bNix0XSxpPTB9ZmluYWxseXtuPXI9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28sYV0pfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDI1KSxhPW4oNzQpLHU9YS5QUk9UT0NPTF9WRVJTSU9OLnNwbGl0KCIuIiwxKVswXSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuY29tbV90YXJnZXRfbmFtZT0ianVweXRlci53aWRnZXQiLHRoaXMuX21vZGVscz1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiB0LnByb3RvdHlwZS5kaXNwbGF5X21vZGVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzO3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdGhpcy5jcmVhdGVfdmlldyhlLG4pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGkuZGlzcGxheV92aWV3KHQsZSxuKX0pLmNhdGNoKHMucmVqZWN0KCJDb3VsZCBub3QgY3JlYXRlIHZpZXciLCEwKSl9LHQucHJvdG90eXBlLnNldFZpZXdPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksdH0sdC5wcm90b3R5cGUuY3JlYXRlX3ZpZXc9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgaT10LnN0YXRlX2NoYW5nZT10LnN0YXRlX2NoYW5nZS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZENsYXNzKHQuZ2V0KCJfdmlld19uYW1lIiksdC5nZXQoIl92aWV3X21vZHVsZSIpLHQuZ2V0KCJfdmlld19tb2R1bGVfdmVyc2lvbiIpKS50aGVuKGZ1bmN0aW9uKGkpe3ZhciByPW5ldyBpKHttb2RlbDp0LG9wdGlvbnM6bi5zZXRWaWV3T3B0aW9ucyhlKX0pO3JldHVybiByLmxpc3RlblRvKHQsImRlc3Ryb3kiLHIucmVtb3ZlKSxQcm9taXNlLnJlc29sdmUoci5yZW5kZXIoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiByfSl9KS5jYXRjaChzLnJlamVjdCgiQ291bGQgbm90IGNyZWF0ZSBhIHZpZXcgZm9yIG1vZGVsIGlkICIrdC5tb2RlbF9pZCwhMCkpfSkscj1zLnV1aWQoKTtyZXR1cm4gdC52aWV3c1tyXT1pLGkudGhlbihmdW5jdGlvbih0KXt0Lm9uY2UoInJlbW92ZSIsZnVuY3Rpb24oKXtkZWxldGUgdC5tb2RlbC52aWV3c1tyXX0sbil9KSx0LnN0YXRlX2NoYW5nZX0sdC5wcm90b3R5cGUuY2FsbGJhY2tzPWZ1bmN0aW9uKHQpe3JldHVybnt9fSx0LnByb3RvdHlwZS5nZXRfbW9kZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21vZGVsc1t0XX0sdC5wcm90b3R5cGUuaGFuZGxlX2NvbW1fb3Blbj1mdW5jdGlvbih0LGUpe3ZhciBuPShlLm1ldGFkYXRhfHx7fSkudmVyc2lvbnx8IiI7aWYobi5zcGxpdCgiLiIsMSlbMF0hPT11KXt2YXIgaT0iV3Jvbmcgd2lkZ2V0IHByb3RvY29sIHZlcnNpb246IHJlY2VpdmVkIHByb3RvY29sIHZlcnNpb24gJyIrbisiJywgYnV0IHdhcyBleHBlY3RpbmcgbWFqb3IgdmVyc2lvbiAnIit1KyInIjtyZXR1cm4gY29uc29sZS5lcnJvcihpKSxQcm9taXNlLnJlamVjdChpKX12YXIgcj1lLmNvbnRlbnQuZGF0YSxvPXIuYnVmZmVyX3BhdGhzfHxbXSxhPShlLmJ1ZmZlcnN8fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRhVmlldz90Om5ldyBEYXRhVmlldyh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/dDp0LmJ1ZmZlcil9KTtyZXR1cm4gcy5wdXRfYnVmZmVycyhyLnN0YXRlLG8sYSksdGhpcy5uZXdfbW9kZWwoe21vZGVsX25hbWU6ci5zdGF0ZS5fbW9kZWxfbmFtZSxtb2RlbF9tb2R1bGU6ci5zdGF0ZS5fbW9kZWxfbW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOnIuc3RhdGUuX21vZGVsX21vZHVsZV92ZXJzaW9uLGNvbW06dH0sci5zdGF0ZSkuY2F0Y2gocy5yZWplY3QoIkNvdWxkIG5vdCBjcmVhdGUgYSBtb2RlbC4iLCEwKSl9LHQucHJvdG90eXBlLm5ld193aWRnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXM7aWYodm9pZCAwPT09ZSYmKGU9e30pLHZvaWQgMD09PXQudmlld19uYW1lfHx2b2lkIDA9PT10LnZpZXdfbW9kdWxlfHx2b2lkIDA9PT10LnZpZXdfbW9kdWxlX3ZlcnNpb24pcmV0dXJuIFByb21pc2UucmVqZWN0KCJuZXdfd2lkZ2V0KC4uLikgbXVzdCBiZSBnaXZlbiB2aWV3IGluZm9ybWF0aW9uIGluIHRoZSBvcHRpb25zLiIpO249dC5jb21tP1Byb21pc2UucmVzb2x2ZSh0LmNvbW0pOnRoaXMuX2NyZWF0ZV9jb21tKHRoaXMuY29tbV90YXJnZXRfbmFtZSx0Lm1vZGVsX2lkLHtzdGF0ZTp7X21vZGVsX21vZHVsZTp0Lm1vZGVsX21vZHVsZSxfbW9kZWxfbW9kdWxlX3ZlcnNpb246dC5tb2RlbF9tb2R1bGVfdmVyc2lvbixfbW9kZWxfbmFtZTp0Lm1vZGVsX25hbWUsX3ZpZXdfbW9kdWxlOnQudmlld19tb2R1bGUsX3ZpZXdfbW9kdWxlX3ZlcnNpb246dC52aWV3X21vZHVsZV92ZXJzaW9uLF92aWV3X25hbWU6dC52aWV3X25hbWV9fSx7dmVyc2lvbjphLlBST1RPQ09MX1ZFUlNJT059KTt2YXIgbz1pKHt9LHQpO3JldHVybiBuLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIG8uY29tbT10LHIubmV3X21vZGVsKG8sZSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5zeW5jKCJjcmVhdGUiLHQpLHR9KX0sZnVuY3Rpb24oKXtyZXR1cm4gby5tb2RlbF9pZHx8KG8ubW9kZWxfaWQ9cy51dWlkKCkpLHIubmV3X21vZGVsKG8sZSl9KX0sdC5wcm90b3R5cGUucmVnaXN0ZXJfbW9kZWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuX21vZGVsc1t0XT1lLGUudGhlbihmdW5jdGlvbihlKXtlLm9uY2UoImNvbW06Y2xvc2UiLGZ1bmN0aW9uKCl7ZGVsZXRlIG4uX21vZGVsc1t0XX0pfSl9LHQucHJvdG90eXBlLm5ld19tb2RlbD1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSkscih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixpO3JldHVybiBvKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDppZih0Lm1vZGVsX2lkKW49dC5tb2RlbF9pZDtlbHNle2lmKCF0LmNvbW0pdGhyb3cgbmV3IEVycm9yKCJOZWl0aGVyIGNvbW0gbm9yIG1vZGVsX2lkIHByb3ZpZGVkIGluIG9wdGlvbnMgb2JqZWN0LiBBdCBsZWFzdCBvbmUgbXVzdCBleGlzdC4iKTtuPXQubW9kZWxfaWQ9dC5jb21tLmNvbW1faWR9cmV0dXJuIGk9dGhpcy5fbWFrZV9tb2RlbCh0LGUpLHRoaXMucmVnaXN0ZXJfbW9kZWwobixpKSxbNCxpXTtjYXNlIDE6cmV0dXJuWzIsci5zZW50KCldfX0pfSl9LHQucHJvdG90eXBlLl9tYWtlX21vZGVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLGkscixzLGEsdSxjO3JldHVybiBvKHRoaXMsZnVuY3Rpb24obyl7c3dpdGNoKG8ubGFiZWwpe2Nhc2UgMDpuPXQubW9kZWxfaWQsaT10aGlzLmxvYWRDbGFzcyh0Lm1vZGVsX25hbWUsdC5tb2RlbF9tb2R1bGUsdC5tb2RlbF9tb2R1bGVfdmVyc2lvbiksby5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gby50cnlzLnB1c2goWzEsMywsNF0pLFs0LGldO2Nhc2UgMjpyZXR1cm4gcj1vLnNlbnQoKSxbMyw0XTtjYXNlIDM6dGhyb3cgcz1vLnNlbnQoKSxjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgd2lkZ2V0IikscztjYXNlIDQ6aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2RlbCBtb2R1bGUgIit0Lm1vZGVsX21vZHVsZSsiQCIrdC5tb2RlbF9tb2R1bGVfdmVyc2lvbisiLCAiK3QubW9kZWxfbmFtZSk7cmV0dXJuWzQsci5fZGVzZXJpYWxpemVfc3RhdGUoZSx0aGlzKV07Y2FzZSA1OnJldHVybiBhPW8uc2VudCgpLHU9e3dpZGdldF9tYW5hZ2VyOnRoaXMsbW9kZWxfaWQ6bixjb21tOnQuY29tbX0sKGM9bmV3IHIoYSx1KSkubmFtZT10Lm1vZGVsX25hbWUsYy5tb2R1bGU9dC5tb2RlbF9tb2R1bGUsWzIsY119fSl9KX0sdC5wcm90b3R5cGUuY2xlYXJfc3RhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBzLnJlc29sdmVQcm9taXNlc0RpY3QodGhpcy5fbW9kZWxzKS50aGVuKGZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0uY2xvc2UoKX0pLHQuX21vZGVscz17fX0pfSx0LnByb3RvdHlwZS5nZXRfc3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxzLnJlc29sdmVQcm9taXNlc0RpY3QodGhpcy5fbW9kZWxzKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByPWVbaV0sbz1zLnJlbW92ZV9idWZmZXJzKHIuc2VyaWFsaXplKHIuZ2V0X3N0YXRlKHQuZHJvcF9kZWZhdWx0cykpKSxhPW8uYnVmZmVycy5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm57ZGF0YTpzLmJ1ZmZlclRvQmFzZTY0KHQpLHBhdGg6by5idWZmZXJfcGF0aHNbZV0sZW5jb2Rpbmc6ImJhc2U2NCJ9fSk7bltpXT17bW9kZWxfbmFtZTpyLm5hbWUsbW9kZWxfbW9kdWxlOnIubW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOnIuZ2V0KCJfbW9kZWxfbW9kdWxlX3ZlcnNpb24iKSxzdGF0ZTpvLnN0YXRlfSxhLmxlbmd0aD4wJiYobltpXS5idWZmZXJzPWEpfSkse3ZlcnNpb25fbWFqb3I6Mix2ZXJzaW9uX21pbm9yOjAsc3RhdGU6bn19KX0sdC5wcm90b3R5cGUuc2V0X3N0YXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoISh0LnZlcnNpb25fbWFqb3ImJnQudmVyc2lvbl9tYWpvcjw9MikpdGhyb3ciVW5zdXBwb3J0ZWQgd2lkZ2V0IHN0YXRlIGZvcm1hdCI7dmFyIG49dC5zdGF0ZTtyZXR1cm4gdGhpcy5fZ2V0X2NvbW1faW5mbygpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbihpKXt2YXIgcj17YmFzZTY0OnMuYmFzZTY0VG9CdWZmZXIsaGV4OnMuaGV4VG9CdWZmZXJ9LG89bltpXSxhPW8uc3RhdGU7aWYoby5idWZmZXJzKXt2YXIgdT1vLmJ1ZmZlcnMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBhdGh9KSxjPW8uYnVmZmVycy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRhVmlldyhyW3QuZW5jb2RpbmddKHQuZGF0YSkpfSk7cy5wdXRfYnVmZmVycyhvLnN0YXRlLHUsYyl9aWYoZS5fbW9kZWxzW2ldKXJldHVybiBlLl9tb2RlbHNbaV0udGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5fZGVzZXJpYWxpemVfc3RhdGUoYXx8e30sZSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRfc3RhdGUoZSksdH0pfSk7dmFyIGg9e21vZGVsX2lkOmksbW9kZWxfbmFtZTpvLm1vZGVsX25hbWUsbW9kZWxfbW9kdWxlOm8ubW9kZWxfbW9kdWxlLG1vZGVsX21vZHVsZV92ZXJzaW9uOm8ubW9kZWxfbW9kdWxlX3ZlcnNpb259O3JldHVybiB0Lmhhc093blByb3BlcnR5KGkpP2UuX2NyZWF0ZV9jb21tKGUuY29tbV90YXJnZXRfbmFtZSxpKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBoLmNvbW09dCxlLm5ld19tb2RlbChoKX0pOmUubmV3X21vZGVsKGgsYSl9KSl9KX0sdC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5fbW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX21vZGVsc1tlXS50aGVuKGZ1bmN0aW9uKHQpe3QuY29tbV9saXZlPSExfSl9KX0sdC5wcm90b3R5cGUucmVzb2x2ZVVybD1mdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfSx0fSgpO2UuTWFuYWdlckJhc2U9Y30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIG4odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gaSh0LHIpe2lmKHQ9PT1yKXJldHVybiEwO2lmKGUodCl8fGUocikpcmV0dXJuITE7dmFyIG89bih0KSxzPW4ocik7cmV0dXJuIG89PT1zJiYobyYmcz9mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiEwO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7KytuKWlmKCFpKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9KHQscik6ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4hMDtmb3IodmFyIG4gaW4gdClpZighKG4gaW4gZSkpcmV0dXJuITE7Zm9yKHZhciBuIGluIGUpaWYoIShuIGluIHQpKXJldHVybiExO2Zvcih2YXIgbiBpbiB0KWlmKCFpKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9KHQscikpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIGUodCk/dDpuKHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT1yKHRbbl0pO3JldHVybiBlfSh0KTpmdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdCllW25dPXIodFtuXSk7cmV0dXJuIGV9KHQpfXQuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZSh7fSksdC5lbXB0eUFycmF5PU9iamVjdC5mcmVlemUoW10pLHQuaXNQcmltaXRpdmU9ZSx0LmlzQXJyYXk9bix0LmlzT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiFlKHQpJiYhbih0KX0sdC5kZWVwRXF1YWw9aSx0LmRlZXBDb3B5PXJ9KGUuSlNPTkV4dHx8KGUuSlNPTkV4dD17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl90eXBlcz1bXSx0aGlzLl92YWx1ZXM9W119cmV0dXJuIHQucHJvdG90eXBlLnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGVzLnNsaWNlKCl9LHQucHJvdG90eXBlLmhhc0RhdGE9ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT10aGlzLl90eXBlcy5pbmRleE9mKHQpfSx0LnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3R5cGVzLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lP3RoaXMuX3ZhbHVlc1tlXTp2b2lkIDB9LHQucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCxlKXt0aGlzLmNsZWFyRGF0YSh0KSx0aGlzLl90eXBlcy5wdXNoKHQpLHRoaXMuX3ZhbHVlcy5wdXNoKGUpfSx0LnByb3RvdHlwZS5jbGVhckRhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHlwZXMuaW5kZXhPZih0KTstMSE9PWUmJih0aGlzLl90eXBlcy5zcGxpY2UoZSwxKSx0aGlzLl92YWx1ZXMuc3BsaWNlKGUsMSkpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX3R5cGVzLmxlbmd0aD0wLHRoaXMuX3ZhbHVlcy5sZW5ndGg9MH0sdH0oKTtlLk1pbWVEYXRhPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7dC5fcmVzb2x2ZT1lLHQuX3JlamVjdD1ufSl9cmV0dXJuIHQucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24odCl7KDAsdGhpcy5fcmVzb2x2ZSkodCl9LHQucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXsoMCx0aGlzLl9yZWplY3QpKHQpfSx0fSgpO2UuUHJvbWlzZURlbGVnYXRlPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5yYW5kb21CeXRlcz1lLnJuZz1lLnBzZXVkb1JhbmRvbUJ5dGVzPWUucHJuZz1uKDI3KSxlLmNyZWF0ZUhhc2g9ZS5IYXNoPW4oMzEpLGUuY3JlYXRlSG1hYz1lLkhtYWM9big5MSk7dmFyIGk9bigxNjIpLHI9T2JqZWN0LmtleXMoaSksbz1bInNoYTEiLCJzaGEyMjQiLCJzaGEyNTYiLCJzaGEzODQiLCJzaGE1MTIiLCJtZDUiLCJybWQxNjAiXS5jb25jYXQocik7ZS5nZXRIYXNoZXM9ZnVuY3Rpb24oKXtyZXR1cm4gb307dmFyIHM9big5NCk7ZS5wYmtkZjI9cy5wYmtkZjIsZS5wYmtkZjJTeW5jPXMucGJrZGYyU3luYzt2YXIgYT1uKDE2NCk7ZS5DaXBoZXI9YS5DaXBoZXIsZS5jcmVhdGVDaXBoZXI9YS5jcmVhdGVDaXBoZXIsZS5DaXBoZXJpdj1hLkNpcGhlcml2LGUuY3JlYXRlQ2lwaGVyaXY9YS5jcmVhdGVDaXBoZXJpdixlLkRlY2lwaGVyPWEuRGVjaXBoZXIsZS5jcmVhdGVEZWNpcGhlcj1hLmNyZWF0ZURlY2lwaGVyLGUuRGVjaXBoZXJpdj1hLkRlY2lwaGVyaXYsZS5jcmVhdGVEZWNpcGhlcml2PWEuY3JlYXRlRGVjaXBoZXJpdixlLmdldENpcGhlcnM9YS5nZXRDaXBoZXJzLGUubGlzdENpcGhlcnM9YS5saXN0Q2lwaGVyczt2YXIgdT1uKDE4MSk7ZS5EaWZmaWVIZWxsbWFuR3JvdXA9dS5EaWZmaWVIZWxsbWFuR3JvdXAsZS5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXA9dS5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXAsZS5nZXREaWZmaWVIZWxsbWFuPXUuZ2V0RGlmZmllSGVsbG1hbixlLmNyZWF0ZURpZmZpZUhlbGxtYW49dS5jcmVhdGVEaWZmaWVIZWxsbWFuLGUuRGlmZmllSGVsbG1hbj11LkRpZmZpZUhlbGxtYW47dmFyIGM9bigxODYpO2UuY3JlYXRlU2lnbj1jLmNyZWF0ZVNpZ24sZS5TaWduPWMuU2lnbixlLmNyZWF0ZVZlcmlmeT1jLmNyZWF0ZVZlcmlmeSxlLlZlcmlmeT1jLlZlcmlmeSxlLmNyZWF0ZUVDREg9bigyMjQpO3ZhciBoPW4oMjI1KTtlLnB1YmxpY0VuY3J5cHQ9aC5wdWJsaWNFbmNyeXB0LGUucHJpdmF0ZUVuY3J5cHQ9aC5wcml2YXRlRW5jcnlwdCxlLnB1YmxpY0RlY3J5cHQ9aC5wdWJsaWNEZWNyeXB0LGUucHJpdmF0ZURlY3J5cHQ9aC5wcml2YXRlRGVjcnlwdDt2YXIgbD1uKDIyOCk7ZS5yYW5kb21GaWxsPWwucmFuZG9tRmlsbCxlLnJhbmRvbUZpbGxTeW5jPWwucmFuZG9tRmlsbFN5bmMsZS5jcmVhdGVDcmVkZW50aWFscz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihbInNvcnJ5LCBjcmVhdGVDcmVkZW50aWFscyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iiwid2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMiLCJodHRwczovL2dpdGh1Yi5jb20vY3J5cHRvLWJyb3dzZXJpZnkvY3J5cHRvLWJyb3dzZXJpZnkiXS5qb2luKCJcbiIpKX0sZS5jb25zdGFudHM9e0RIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUU6MixESF9DSEVDS19QX05PVF9QUklNRToxLERIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1I6NCxESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SOjgsTlBOX0VOQUJMRUQ6MSxBTFBOX0VOQUJMRUQ6MSxSU0FfUEtDUzFfUEFERElORzoxLFJTQV9TU0xWMjNfUEFERElORzoyLFJTQV9OT19QQURESU5HOjMsUlNBX1BLQ1MxX09BRVBfUEFERElORzo0LFJTQV9YOTMxX1BBRERJTkc6NSxSU0FfUEtDUzFfUFNTX1BBRERJTkc6NixQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQ6MixQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDo0LFBPSU5UX0NPTlZFUlNJT05fSFlCUklEOjZ9fSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvLHMsYT04KnItaS0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1uP3ItMTowLGQ9bj8tMToxLGY9dFtlK2xdO2ZvcihsKz1kLG89ZiYoMTw8LWgpLTEsZj4+PS1oLGgrPWE7aD4wO289MjU2Km8rdFtlK2xdLGwrPWQsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPWk7aD4wO3M9MjU2KnMrdFtlK2xdLGwrPWQsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsaSksby09Y31yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1pKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIHMsYSx1LGM9OCpvLXItMSxoPSgxPDxjKS0xLGw9aD4+MSxkPTIzPT09cj9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1pPzA6by0xLHA9aT8xOi0xLG09ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrbD49MT9kL3U6ZCpNYXRoLnBvdygyLDEtbCkpKnU+PTImJihzKyssdS89MikscytsPj1oPyhhPTAscz1oKTpzK2w+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLHIpLHMrPWwpOihhPWUqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIscikscz0wKSk7cj49ODt0W24rZl09MjU1JmEsZis9cCxhLz0yNTYsci09OCk7Zm9yKHM9czw8cnxhLGMrPXI7Yz4wO3RbbitmXT0yNTUmcyxmKz1wLHMvPTI1NixjLT04KTt0W24rZi1wXXw9MTI4Km19fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEpLkJ1ZmZlcixyPW4oMTQ5KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxuPSIiK2UuZGF0YTtlPWUubmV4dDspbis9dCtlLmRhdGE7cmV0dXJuIG59LHQucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGkuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGUsbixyLG89aS5hbGxvY1Vuc2FmZSh0Pj4+MCkscz10aGlzLmhlYWQsYT0wO3M7KWU9cy5kYXRhLG49byxyPWEsZS5jb3B5KG4sciksYSs9cy5kYXRhLmxlbmd0aCxzPXMubmV4dDtyZXR1cm4gb30sdH0oKSxyJiZyLmluc3BlY3QmJnIuaW5zcGVjdC5jdXN0b20mJih0LmV4cG9ydHMucHJvdG90eXBlW3IuaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIHQ9ci5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIit0fSl9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsbil7InVzZSBzdHJpY3QiO2lmKCF0LnNldEltbWVkaWF0ZSl7dmFyIGkscixvLHMsYSx1PTEsYz17fSxoPSExLGw9dC5kb2N1bWVudCxkPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Q9ZCYmZC5zZXRUaW1lb3V0P2Q6dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/aT1mdW5jdGlvbih0KXtlLm5leHRUaWNrKGZ1bmN0aW9uKCl7cCh0KX0pfTohZnVuY3Rpb24oKXtpZih0LnBvc3RNZXNzYWdlJiYhdC5pbXBvcnRTY3JpcHRzKXt2YXIgZT0hMCxuPXQub25tZXNzYWdlO3JldHVybiB0Lm9ubWVzc2FnZT1mdW5jdGlvbigpe2U9ITF9LHQucG9zdE1lc3NhZ2UoIiIsIioiKSx0Lm9ubWVzc2FnZT1uLGV9fSgpP3QuTWVzc2FnZUNoYW5uZWw/KChvPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe3AodC5kYXRhKX0saT1mdW5jdGlvbih0KXtvLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6bCYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBsLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyhyPWwuZG9jdW1lbnRFbGVtZW50LGk9ZnVuY3Rpb24odCl7dmFyIGU9bC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3AodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxyLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0sci5hcHBlbmRDaGlsZChlKX0pOmk9ZnVuY3Rpb24odCl7c2V0VGltZW91dChwLDAsdCl9OihzPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixhPWZ1bmN0aW9uKGUpe2Uuc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT1lLmRhdGEuaW5kZXhPZihzKSYmcCgrZS5kYXRhLnNsaWNlKHMubGVuZ3RoKSl9LHQuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGEsITEpOnQuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsYSksaT1mdW5jdGlvbihlKXt0LnBvc3RNZXNzYWdlKHMrZSwiKiIpfSksZC5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIGNbdV09cixpKHUpLHUrK30sZC5jbGVhckltbWVkaWF0ZT1mfWZ1bmN0aW9uIGYodCl7ZGVsZXRlIGNbdF19ZnVuY3Rpb24gcCh0KXtpZihoKXNldFRpbWVvdXQocCwwLHQpO2Vsc2V7dmFyIGU9Y1t0XTtpZihlKXtoPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxpPXQuYXJncztzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoaVswXSk7YnJlYWs7Y2FzZSAyOmUoaVswXSxpWzFdKTticmVhaztjYXNlIDM6ZShpWzBdLGlbMV0saVsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KG4saSl9fShlKX1maW5hbGx5e2YodCksaD0hMX19fX19KCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT10P3RoaXM6dDpzZWxmKX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXt0cnl7aWYoIWUubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXZhciBuPWUubG9jYWxTdG9yYWdlW3RdO3JldHVybiBudWxsIT1uJiYidHJ1ZSI9PT1TdHJpbmcobikudG9Mb3dlckNhc2UoKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihuKCJub0RlcHJlY2F0aW9uIikpcmV0dXJuIHQ7dmFyIGk9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWkpe2lmKG4oInRocm93RGVwcmVjYXRpb24iKSl0aHJvdyBuZXcgRXJyb3IoZSk7bigidHJhY2VEZXByZWNhdGlvbiIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLGk9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19KS5jYWxsKHRoaXMsbigxMykpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1vO3ZhciBpPW4oODgpLHI9bigzMik7ZnVuY3Rpb24gbyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8odCk7aS5jYWxsKHRoaXMsdCl9ci5pbmhlcml0cz1uKDApLHIuaW5oZXJpdHMobyxpKSxvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXtuKG51bGwsdCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjIpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNjEpLlRyYW5zZm9ybX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDYxKS5QYXNzVGhyb3VnaH0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDI4KSxvPW4oMSkuQnVmZmVyLHM9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxhPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxyLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdDw8MzB8dD4+PjJ9ZnVuY3Rpb24gaCh0LGUsbixpKXtyZXR1cm4gMD09PXQ/ZSZufH5lJmk6Mj09PXQ/ZSZufGUmaXxuJmk6ZV5uXml9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxpPTB8dGhpcy5fYSxyPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxhPTB8dGhpcy5fZCx1PTB8dGhpcy5fZSxsPTA7bDwxNjsrK2wpbltsXT10LnJlYWRJbnQzMkJFKDQqbCk7Zm9yKDtsPDgwOysrbCluW2xdPW5bbC0zXV5uW2wtOF1ebltsLTE0XV5uW2wtMTZdO2Zvcih2YXIgZD0wO2Q8ODA7KytkKXt2YXIgZj1+fihkLzIwKSxwPTB8KChlPWkpPDw1fGU+Pj4yNykraChmLHIsbyxhKSt1K25bZF0rc1tmXTt1PWEsYT1vLG89YyhyKSxyPWksaT1wfXRoaXMuX2E9aSt0aGlzLl9hfDAsdGhpcy5fYj1yK3RoaXMuX2J8MCx0aGlzLl9jPW8rdGhpcy5fY3wwLHRoaXMuX2Q9YSt0aGlzLl9kfDAsdGhpcy5fZT11K3RoaXMuX2V8MH0sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1vLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oMjgpLG89bigxKS5CdWZmZXIscz1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLGE9bmV3IEFycmF5KDgwKTtmdW5jdGlvbiB1KCl7dGhpcy5pbml0KCksdGhpcy5fdz1hLHIuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBjKHQpe3JldHVybiB0PDw1fHQ+Pj4yN31mdW5jdGlvbiBoKHQpe3JldHVybiB0PDwzMHx0Pj4+Mn1mdW5jdGlvbiBsKHQsZSxuLGkpe3JldHVybiAwPT09dD9lJm58fmUmaToyPT09dD9lJm58ZSZpfG4maTplXm5eaX1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sdS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj10aGlzLl93LGk9MHx0aGlzLl9hLHI9MHx0aGlzLl9iLG89MHx0aGlzLl9jLGE9MHx0aGlzLl9kLHU9MHx0aGlzLl9lLGQ9MDtkPDE2OysrZCluW2RdPXQucmVhZEludDMyQkUoNCpkKTtmb3IoO2Q8ODA7KytkKW5bZF09KGU9bltkLTNdXm5bZC04XV5uW2QtMTRdXm5bZC0xNl0pPDwxfGU+Pj4zMTtmb3IodmFyIGY9MDtmPDgwOysrZil7dmFyIHA9fn4oZi8yMCksbT1jKGkpK2wocCxyLG8sYSkrdStuW2ZdK3NbcF18MDt1PWEsYT1vLG89aChyKSxyPWksaT1tfXRoaXMuX2E9aSt0aGlzLl9hfDAsdGhpcy5fYj1yK3RoaXMuX2J8MCx0aGlzLl9jPW8rdGhpcy5fY3wwLHRoaXMuX2Q9YSt0aGlzLl9kfDAsdGhpcy5fZT11K3RoaXMuX2V8MH0sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1vLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKSxyPW4oODkpLG89bigyOCkscz1uKDEpLkJ1ZmZlcixhPW5ldyBBcnJheSg2NCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxvLmNhbGwodGhpcyw2NCw1Nil9aSh1LHIpLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0zMjM4MzcxMDMyLHRoaXMuX2I9OTE0MTUwNjYzLHRoaXMuX2M9ODEyNzAyOTk5LHRoaXMuX2Q9NDE0NDkxMjY5Nyx0aGlzLl9lPTQyOTA3NzU4NTcsdGhpcy5fZj0xNzUwNjAzMDI1LHRoaXMuX2c9MTY5NDA3NjgzOSx0aGlzLl9oPTMyMDQwNzU0MjgsdGhpc30sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1zLmFsbG9jVW5zYWZlKDI4KTtyZXR1cm4gdC53cml0ZUludDMyQkUodGhpcy5fYSwwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9iLDQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUodGhpcy5fZCwxMiksdC53cml0ZUludDMyQkUodGhpcy5fZSwxNiksdC53cml0ZUludDMyQkUodGhpcy5fZiwyMCksdC53cml0ZUludDMyQkUodGhpcy5fZywyNCksdH0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big5MCksbz1uKDI4KSxzPW4oMSkuQnVmZmVyLGE9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9YSxvLmNhbGwodGhpcywxMjgsMTEyKX1pKHUsciksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0zNDE4MDcwMzY1LHRoaXMuX2JoPTE2NTQyNzAyNTAsdGhpcy5fY2g9MjQzODUyOTM3MCx0aGlzLl9kaD0zNTU0NjIzNjAsdGhpcy5fZWg9MTczMTQwNTQxNSx0aGlzLl9maD0yMzk0MTgwMjMxLHRoaXMuX2doPTM2NzUwMDg1MjUsdGhpcy5faGg9MTIwMzA2MjgxMyx0aGlzLl9hbD0zMjM4MzcxMDMyLHRoaXMuX2JsPTkxNDE1MDY2Myx0aGlzLl9jbD04MTI3MDI5OTksdGhpcy5fZGw9NDE0NDkxMjY5Nyx0aGlzLl9lbD00MjkwNzc1ODU3LHRoaXMuX2ZsPTE3NTA2MDMwMjUsdGhpcy5fZ2w9MTY5NDA3NjgzOSx0aGlzLl9obD0zMjA0MDc1NDI4LHRoaXN9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9cy5hbGxvY1Vuc2FmZSg0OCk7ZnVuY3Rpb24gZShlLG4saSl7dC53cml0ZUludDMyQkUoZSxpKSx0LndyaXRlSW50MzJCRShuLGkrNCl9cmV0dXJuIGUodGhpcy5fYWgsdGhpcy5fYWwsMCksZSh0aGlzLl9iaCx0aGlzLl9ibCw4KSxlKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSxlKHRoaXMuX2RoLHRoaXMuX2RsLDI0KSxlKHRoaXMuX2VoLHRoaXMuX2VsLDMyKSxlKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSx0fSx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDApLHI9bigxKS5CdWZmZXIsbz1uKDIxKSxzPXIuYWxsb2MoMTI4KSxhPTY0O2Z1bmN0aW9uIHUodCxlKXtvLmNhbGwodGhpcywiZGlnZXN0IiksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1yLmZyb20oZSkpLHRoaXMuX2FsZz10LHRoaXMuX2tleT1lLGUubGVuZ3RoPmE/ZT10KGUpOmUubGVuZ3RoPGEmJihlPXIuY29uY2F0KFtlLHNdLGEpKTtmb3IodmFyIG49dGhpcy5faXBhZD1yLmFsbG9jVW5zYWZlKGEpLGk9dGhpcy5fb3BhZD1yLmFsbG9jVW5zYWZlKGEpLHU9MDt1PGE7dSsrKW5bdV09NTReZVt1XSxpW3VdPTkyXmVbdV07dGhpcy5faGFzaD1bbl19aSh1LG8pLHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5faGFzaC5wdXNoKHQpfSx1LnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9hbGcoci5jb25jYXQodGhpcy5faGFzaCkpO3JldHVybiB0aGlzLl9hbGcoci5jb25jYXQoW3RoaXMuX29wYWQsdF0pKX0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big5Myl9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSxpKXt2YXIgcixvPW4oOTUpLHM9big5NiksYT1uKDk3KSx1PW4oMSkuQnVmZmVyLGM9ZS5jcnlwdG8mJmUuY3J5cHRvLnN1YnRsZSxoPXtzaGE6IlNIQS0xIiwic2hhLTEiOiJTSEEtMSIsc2hhMToiU0hBLTEiLHNoYTI1NjoiU0hBLTI1NiIsInNoYS0yNTYiOiJTSEEtMjU2IixzaGEzODQ6IlNIQS0zODQiLCJzaGEtMzg0IjoiU0hBLTM4NCIsInNoYS01MTIiOiJTSEEtNTEyIixzaGE1MTI6IlNIQS01MTIifSxsPVtdO2Z1bmN0aW9uIGQodCxlLG4saSxyKXtyZXR1cm4gYy5pbXBvcnRLZXkoInJhdyIsdCx7bmFtZToiUEJLREYyIn0sITEsWyJkZXJpdmVCaXRzIl0pLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGMuZGVyaXZlQml0cyh7bmFtZToiUEJLREYyIixzYWx0OmUsaXRlcmF0aW9uczpuLGhhc2g6e25hbWU6cn19LHQsaTw8Myl9KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB1LmZyb20odCl9KX10LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGYscCxtLGcpeyJmdW5jdGlvbiI9PXR5cGVvZiBtJiYoZz1tLG09dm9pZCAwKTt2YXIgdj1oWyhtPW18fCJzaGExIikudG9Mb3dlckNhc2UoKV07aWYoIXZ8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLlByb21pc2UpcmV0dXJuIGkubmV4dFRpY2soZnVuY3Rpb24oKXt2YXIgZTt0cnl7ZT1hKHQsbixmLHAsbSl9Y2F0Y2godCl7cmV0dXJuIGcodCl9ZyhudWxsLGUpfSk7aWYobyh0LG4sZixwKSwiZnVuY3Rpb24iIT10eXBlb2YgZyl0aHJvdyBuZXcgRXJyb3IoIk5vIGNhbGxiYWNrIHByb3ZpZGVkIHRvIHBia2RmMiIpO3UuaXNCdWZmZXIodCl8fCh0PXUuZnJvbSh0LHMpKSx1LmlzQnVmZmVyKG4pfHwobj11LmZyb20obixzKSksZnVuY3Rpb24odCxlKXt0LnRoZW4oZnVuY3Rpb24odCl7aS5uZXh0VGljayhmdW5jdGlvbigpe2UobnVsbCx0KX0pfSxmdW5jdGlvbih0KXtpLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZSh0KX0pfSl9KGZ1bmN0aW9uKHQpe2lmKGUucHJvY2VzcyYmIWUucHJvY2Vzcy5icm93c2VyKXJldHVybiBQcm9taXNlLnJlc29sdmUoITEpO2lmKCFjfHwhYy5pbXBvcnRLZXl8fCFjLmRlcml2ZUJpdHMpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMSk7aWYodm9pZCAwIT09bFt0XSlyZXR1cm4gbFt0XTt2YXIgbj1kKHI9cnx8dS5hbGxvYyg4KSxyLDEwLDEyOCx0KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuITB9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiExfSk7cmV0dXJuIGxbdF09bixufSh2KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlP2QodCxuLGYscCx2KTphKHQsbixmLHAsbSl9KSxnKX19KS5jYWxsKHRoaXMsbigxMyksbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxNjUpLHI9big2Nyksbz1uKDY4KSxzPW4oMTgwKSxhPW4oNDYpO2Z1bmN0aW9uIHUodCxlLG4pe2lmKHQ9dC50b0xvd2VyQ2FzZSgpLG9bdF0pcmV0dXJuIHIuY3JlYXRlQ2lwaGVyaXYodCxlLG4pO2lmKHNbdF0pcmV0dXJuIG5ldyBpKHtrZXk6ZSxpdjpuLG1vZGU6dH0pO3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpfWZ1bmN0aW9uIGModCxlLG4pe2lmKHQ9dC50b0xvd2VyQ2FzZSgpLG9bdF0pcmV0dXJuIHIuY3JlYXRlRGVjaXBoZXJpdih0LGUsbik7aWYoc1t0XSlyZXR1cm4gbmV3IGkoe2tleTplLGl2Om4sbW9kZTp0LGRlY3J5cHQ6ITB9KTt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKX1lLmNyZWF0ZUNpcGhlcj1lLkNpcGhlcj1mdW5jdGlvbih0LGUpe3ZhciBuLGk7aWYodD10LnRvTG93ZXJDYXNlKCksb1t0XSluPW9bdF0ua2V5LGk9b1t0XS5pdjtlbHNle2lmKCFzW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpO249OCpzW3RdLmtleSxpPXNbdF0uaXZ9dmFyIHI9YShlLCExLG4saSk7cmV0dXJuIHUodCxyLmtleSxyLml2KX0sZS5jcmVhdGVDaXBoZXJpdj1lLkNpcGhlcml2PXUsZS5jcmVhdGVEZWNpcGhlcj1lLkRlY2lwaGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG4saTtpZih0PXQudG9Mb3dlckNhc2UoKSxvW3RdKW49b1t0XS5rZXksaT1vW3RdLml2O2Vsc2V7aWYoIXNbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7bj04KnNbdF0ua2V5LGk9c1t0XS5pdn12YXIgcj1hKGUsITEsbixpKTtyZXR1cm4gYyh0LHIua2V5LHIuaXYpfSxlLmNyZWF0ZURlY2lwaGVyaXY9ZS5EZWNpcGhlcml2PWMsZS5saXN0Q2lwaGVycz1lLmdldENpcGhlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMocykuY29uY2F0KHIuZ2V0Q2lwaGVycygpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIxKSxyPW4oNjYpLG89bigwKSxzPW4oMSkuQnVmZmVyLGE9eyJkZXMtZWRlMy1jYmMiOnIuQ0JDLmluc3RhbnRpYXRlKHIuRURFKSwiZGVzLWVkZTMiOnIuRURFLCJkZXMtZWRlLWNiYyI6ci5DQkMuaW5zdGFudGlhdGUoci5FREUpLCJkZXMtZWRlIjpyLkVERSwiZGVzLWNiYyI6ci5DQkMuaW5zdGFudGlhdGUoci5ERVMpLCJkZXMtZWNiIjpyLkRFU307ZnVuY3Rpb24gdSh0KXtpLmNhbGwodGhpcyk7dmFyIGUsbj10Lm1vZGUudG9Mb3dlckNhc2UoKSxyPWFbbl07ZT10LmRlY3J5cHQ/ImRlY3J5cHQiOiJlbmNyeXB0Ijt2YXIgbz10LmtleTtzLmlzQnVmZmVyKG8pfHwobz1zLmZyb20obykpLCJkZXMtZWRlIiE9PW4mJiJkZXMtZWRlLWNiYyIhPT1ufHwobz1zLmNvbmNhdChbbyxvLnNsaWNlKDAsOCldKSk7dmFyIHU9dC5pdjtzLmlzQnVmZmVyKHUpfHwodT1zLmZyb20odSkpLHRoaXMuX2Rlcz1yLmNyZWF0ZSh7a2V5Om8saXY6dSx0eXBlOmV9KX1hLmRlcz1hWyJkZXMtY2JjIl0sYS5kZXMzPWFbImRlcy1lZGUzLWNiYyJdLHQuZXhwb3J0cz11LG8odSxpKSx1LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBzLmZyb20odGhpcy5fZGVzLnVwZGF0ZSh0KSl9LHUucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3JldHVybiBzLmZyb20odGhpcy5fZGVzLmZpbmFsKCkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybih0WzArZV08PDI0fHRbMStlXTw8MTZ8dFsyK2VdPDw4fHRbMytlXSk+Pj4wfSxlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLG4pe3RbMCtuXT1lPj4+MjQsdFsxK25dPWU+Pj4xNiYyNTUsdFsyK25dPWU+Pj44JjI1NSx0WzMrbl09MjU1JmV9LGUuaXA9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPTAsbz0wLHM9NjtzPj0wO3MtPTIpe2Zvcih2YXIgYT0wO2E8PTI0O2ErPTgpcjw8PTEscnw9ZT4+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClyPDw9MSxyfD10Pj4+YStzJjF9Zm9yKHM9NjtzPj0wO3MtPTIpe2ZvcihhPTE7YTw9MjU7YSs9OClvPDw9MSxvfD1lPj4+YStzJjE7Zm9yKGE9MTthPD0yNTthKz04KW88PD0xLG98PXQ+Pj5hK3MmMX1uW2krMF09cj4+PjAsbltpKzFdPW8+Pj4wfSxlLnJpcD1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9MCxvPTAscz0wO3M8NDtzKyspZm9yKHZhciBhPTI0O2E+PTA7YS09OClyPDw9MSxyfD1lPj4+YStzJjEscjw8PTEscnw9dD4+PmErcyYxO2ZvcihzPTQ7czw4O3MrKylmb3IoYT0yNDthPj0wO2EtPTgpbzw8PTEsb3w9ZT4+PmErcyYxLG88PD0xLG98PXQ+Pj5hK3MmMTtuW2krMF09cj4+PjAsbltpKzFdPW8+Pj4wfSxlLnBjMT1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9MCxvPTAscz03O3M+PTU7cy0tKXtmb3IodmFyIGE9MDthPD0yNDthKz04KXI8PD0xLHJ8PWU+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClyPDw9MSxyfD10Pj5hK3MmMX1mb3IoYT0wO2E8PTI0O2ErPTgpcjw8PTEscnw9ZT4+YStzJjE7Zm9yKHM9MTtzPD0zO3MrKyl7Zm9yKGE9MDthPD0yNDthKz04KW88PD0xLG98PWU+PmErcyYxO2ZvcihhPTA7YTw9MjQ7YSs9OClvPDw9MSxvfD10Pj5hK3MmMX1mb3IoYT0wO2E8PTI0O2ErPTgpbzw8PTEsb3w9dD4+YStzJjE7bltpKzBdPXI+Pj4wLG5baSsxXT1vPj4+MH0sZS5yMjhzaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw8ZSYyNjg0MzU0NTV8dD4+PjI4LWV9O3ZhciBpPVsxNCwxMSwxNyw0LDI3LDIzLDI1LDAsMTMsMjIsNywxOCw1LDksMTYsMjQsMiwyMCwxMiwyMSwxLDgsMTUsMjYsMTUsNCwyNSwxOSw5LDEsMjYsMTYsNSwxMSwyMyw4LDEyLDcsMTcsMCwyMiwzLDEwLDE0LDYsMjAsMjcsMjRdO2UucGMyPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgbz0wLHM9MCxhPWkubGVuZ3RoPj4+MSx1PTA7dTxhO3UrKylvPDw9MSxvfD10Pj4+aVt1XSYxO2Zvcih1PWE7dTxpLmxlbmd0aDt1Kyspczw8PTEsc3w9ZT4+PmlbdV0mMTtuW3IrMF09bz4+PjAsbltyKzFdPXM+Pj4wfSxlLmV4cGFuZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9MCxyPTA7aT0oMSZ0KTw8NXx0Pj4+Mjc7Zm9yKHZhciBvPTIzO28+PTE1O28tPTQpaTw8PTYsaXw9dD4+Pm8mNjM7Zm9yKG89MTE7bz49MztvLT00KXJ8PXQ+Pj5vJjYzLHI8PD02O3J8PSgzMSZ0KTw8MXx0Pj4+MzEsZVtuKzBdPWk+Pj4wLGVbbisxXT1yPj4+MH07dmFyIHI9WzE0LDAsNCwxNSwxMyw3LDEsNCwyLDE0LDE1LDIsMTEsMTMsOCwxLDMsMTAsMTAsNiw2LDEyLDEyLDExLDUsOSw5LDUsMCwzLDcsOCw0LDE1LDEsMTIsMTQsOCw4LDIsMTMsNCw2LDksMiwxLDExLDcsMTUsNSwxMiwxMSw5LDMsNywxNCwzLDEwLDEwLDAsNSw2LDAsMTMsMTUsMywxLDEzLDgsNCwxNCw3LDYsMTUsMTEsMiwzLDgsNCwxNCw5LDEyLDcsMCwyLDEsMTMsMTAsMTIsNiwwLDksNSwxMSwxMCw1LDAsMTMsMTQsOCw3LDEwLDExLDEsMTAsMyw0LDE1LDEzLDQsMSwyLDUsMTEsOCw2LDEyLDcsNiwxMiw5LDAsMyw1LDIsMTQsMTUsOSwxMCwxMywwLDcsOSwwLDE0LDksNiwzLDMsNCwxNSw2LDUsMTAsMSwyLDEzLDgsMTIsNSw3LDE0LDExLDEyLDQsMTEsMiwxNSw4LDEsMTMsMSw2LDEwLDQsMTMsOSwwLDgsNiwxNSw5LDMsOCwwLDcsMTEsNCwxLDE1LDIsMTQsMTIsMyw1LDExLDEwLDUsMTQsMiw3LDEyLDcsMTMsMTMsOCwxNCwxMSwzLDUsMCw2LDYsMTUsOSwwLDEwLDMsMSw0LDIsNyw4LDIsNSwxMiwxMSwxLDEyLDEwLDQsMTQsMTUsOSwxMCwzLDYsMTUsOSwwLDAsNiwxMiwxMCwxMSwxLDcsMTMsMTMsOCwxNSw5LDEsNCwzLDUsMTQsMTEsNSwxMiwyLDcsOCwyLDQsMTQsMiwxNCwxMiwxMSw0LDIsMSwxMiw3LDQsMTAsNywxMSwxMyw2LDEsOCw1LDUsMCwzLDE1LDE1LDEwLDEzLDMsMCw5LDE0LDgsOSw2LDQsMTEsMiw4LDEsMTIsMTEsNywxMCwxLDEzLDE0LDcsMiw4LDEzLDE1LDYsOSwxNSwxMiwwLDUsOSw2LDEwLDMsNCwwLDUsMTQsMywxMiwxMCwxLDE1LDEwLDQsMTUsMiw5LDcsMiwxMiw2LDksOCw1LDAsNiwxMywxLDMsMTMsNCwxNCwxNCwwLDcsMTEsNSwzLDExLDgsOSw0LDE0LDMsMTUsMiw1LDEyLDIsOSw4LDUsMTIsMTUsMywxMCw3LDExLDAsMTQsNCwxLDEwLDcsMSw2LDEzLDAsMTEsOCw2LDEzLDQsMTMsMTEsMCwyLDExLDE0LDcsMTUsNCwwLDksOCwxLDEzLDEwLDMsMTQsMTIsMyw5LDUsNywxMiw1LDIsMTAsMTUsNiw4LDEsNiwxLDYsNCwxMSwxMSwxMywxMyw4LDEyLDEsMyw0LDcsMTAsMTQsNywxMCw5LDE1LDUsNiwwLDgsMTUsMCwxNCw1LDIsOSwzLDIsMTIsMTMsMSwyLDE1LDgsMTMsNCw4LDYsMTAsMTUsMywxMSw3LDEsNCwxMCwxMiw5LDUsMyw2LDE0LDExLDUsMCwwLDE0LDEyLDksNywyLDcsMiwxMSwxLDQsMTQsMSw3LDksNCwxMiwxMCwxNCw4LDIsMTMsMCwxNSw2LDEyLDEwLDksMTMsMCwxNSwzLDMsNSw1LDYsOCwxMV07ZS5zdWJzdGl0dXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAsaT0wO2k8NDtpKyspe248PD00LG58PXJbNjQqaSsodD4+PjE4LTYqaSY2MyldfWZvcihpPTA7aTw0O2krKyl7bjw8PTQsbnw9clsyNTYrNjQqaSsoZT4+PjE4LTYqaSY2MyldfXJldHVybiBuPj4+MH07dmFyIG89WzE2LDI1LDEyLDExLDMsMjAsNCwxNSwzMSwxNyw5LDYsMjcsMTQsMSwyMiwzMCwyNCw4LDE4LDAsNSwyOSwyMywxMywxOSwyLDI2LDEwLDIxLDI4LDddO2UucGVybXV0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjxvLmxlbmd0aDtuKyspZTw8PTEsZXw9dD4+Pm9bbl0mMTtyZXR1cm4gZT4+PjB9LGUucGFkU3BsaXQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10LnRvU3RyaW5nKDIpO2kubGVuZ3RoPGU7KWk9IjAiK2k7Zm9yKHZhciByPVtdLG89MDtvPGU7bys9bilyLnB1c2goaS5zbGljZShvLG8rbikpO3JldHVybiByLmpvaW4oIiAiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCk7ZnVuY3Rpb24gcih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLnR5cGU9dGhpcy5vcHRpb25zLnR5cGUsdGhpcy5ibG9ja1NpemU9OCx0aGlzLl9pbml0KCksdGhpcy5idWZmZXI9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKSx0aGlzLmJ1ZmZlck9mZj0wfXQuZXhwb3J0cz1yLHIucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7fSxyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aD9bXToiZGVjcnlwdCI9PT10aGlzLnR5cGU/dGhpcy5fdXBkYXRlRGVjcnlwdCh0KTp0aGlzLl91cGRhdGVFbmNyeXB0KHQpfSxyLnByb3RvdHlwZS5fYnVmZmVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPU1hdGgubWluKHRoaXMuYnVmZmVyLmxlbmd0aC10aGlzLmJ1ZmZlck9mZix0Lmxlbmd0aC1lKSxpPTA7aTxuO2krKyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZitpXT10W2UraV07cmV0dXJuIHRoaXMuYnVmZmVyT2ZmKz1uLG59LHIucHJvdG90eXBlLl9mbHVzaEJ1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsMCx0LGUpLHRoaXMuYnVmZmVyT2ZmPTAsdGhpcy5ibG9ja1NpemV9LHIucHJvdG90eXBlLl91cGRhdGVFbmNyeXB0PWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj0wLGk9KHRoaXMuYnVmZmVyT2ZmK3QubGVuZ3RoKS90aGlzLmJsb2NrU2l6ZXwwLHI9bmV3IEFycmF5KGkqdGhpcy5ibG9ja1NpemUpOzAhPT10aGlzLmJ1ZmZlck9mZiYmKGUrPXRoaXMuX2J1ZmZlcih0LGUpLHRoaXMuYnVmZmVyT2ZmPT09dGhpcy5idWZmZXIubGVuZ3RoJiYobis9dGhpcy5fZmx1c2hCdWZmZXIocixuKSkpO2Zvcih2YXIgbz10Lmxlbmd0aC0odC5sZW5ndGgtZSkldGhpcy5ibG9ja1NpemU7ZTxvO2UrPXRoaXMuYmxvY2tTaXplKXRoaXMuX3VwZGF0ZSh0LGUscixuKSxuKz10aGlzLmJsb2NrU2l6ZTtmb3IoO2U8dC5sZW5ndGg7ZSsrLHRoaXMuYnVmZmVyT2ZmKyspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZdPXRbZV07cmV0dXJuIHJ9LHIucHJvdG90eXBlLl91cGRhdGVEZWNyeXB0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MCxpPU1hdGguY2VpbCgodGhpcy5idWZmZXJPZmYrdC5sZW5ndGgpL3RoaXMuYmxvY2tTaXplKS0xLHI9bmV3IEFycmF5KGkqdGhpcy5ibG9ja1NpemUpO2k+MDtpLS0pZSs9dGhpcy5fYnVmZmVyKHQsZSksbis9dGhpcy5fZmx1c2hCdWZmZXIocixuKTtyZXR1cm4gZSs9dGhpcy5fYnVmZmVyKHQsZSkscn0sci5wcm90b3R5cGUuZmluYWw9ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4gdCYmKGU9dGhpcy51cGRhdGUodCkpLG49ImVuY3J5cHQiPT09dGhpcy50eXBlP3RoaXMuX2ZpbmFsRW5jcnlwdCgpOnRoaXMuX2ZpbmFsRGVjcnlwdCgpLGU/ZS5jb25jYXQobik6bn0sci5wcm90b3R5cGUuX3BhZD1mdW5jdGlvbih0LGUpe2lmKDA9PT1lKXJldHVybiExO2Zvcig7ZTx0Lmxlbmd0aDspdFtlKytdPTA7cmV0dXJuITB9LHIucHJvdG90eXBlLl9maW5hbEVuY3J5cHQ9ZnVuY3Rpb24oKXtpZighdGhpcy5fcGFkKHRoaXMuYnVmZmVyLHRoaXMuYnVmZmVyT2ZmKSlyZXR1cm5bXTt2YXIgdD1uZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpO3JldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsMCx0LDApLHR9LHIucHJvdG90eXBlLl91bnBhZD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sci5wcm90b3R5cGUuX2ZpbmFsRGVjcnlwdD1mdW5jdGlvbigpe2kuZXF1YWwodGhpcy5idWZmZXJPZmYsdGhpcy5ibG9ja1NpemUsIk5vdCBlbm91Z2ggZGF0YSB0byBkZWNyeXB0Iik7dmFyIHQ9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtyZXR1cm4gdGhpcy5fZmx1c2hCdWZmZXIodCwwKSx0aGlzLl91bnBhZCh0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCkscj1uKDApLG89big2Nikscz1vLnV0aWxzLGE9by5DaXBoZXI7ZnVuY3Rpb24gdSgpe3RoaXMudG1wPW5ldyBBcnJheSgyKSx0aGlzLmtleXM9bnVsbH1mdW5jdGlvbiBjKHQpe2EuY2FsbCh0aGlzLHQpO3ZhciBlPW5ldyB1O3RoaXMuX2Rlc1N0YXRlPWUsdGhpcy5kZXJpdmVLZXlzKGUsdC5rZXkpfXIoYyxhKSx0LmV4cG9ydHM9YyxjLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGModCl9O3ZhciBoPVsxLDEsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMiwxXTtjLnByb3RvdHlwZS5kZXJpdmVLZXlzPWZ1bmN0aW9uKHQsZSl7dC5rZXlzPW5ldyBBcnJheSgzMiksaS5lcXVhbChlLmxlbmd0aCx0aGlzLmJsb2NrU2l6ZSwiSW52YWxpZCBrZXkgbGVuZ3RoIik7dmFyIG49cy5yZWFkVUludDMyQkUoZSwwKSxyPXMucmVhZFVJbnQzMkJFKGUsNCk7cy5wYzEobixyLHQudG1wLDApLG49dC50bXBbMF0scj10LnRtcFsxXTtmb3IodmFyIG89MDtvPHQua2V5cy5sZW5ndGg7bys9Mil7dmFyIGE9aFtvPj4+MV07bj1zLnIyOHNobChuLGEpLHI9cy5yMjhzaGwocixhKSxzLnBjMihuLHIsdC5rZXlzLG8pfX0sYy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9kZXNTdGF0ZSxvPXMucmVhZFVJbnQzMkJFKHQsZSksYT1zLnJlYWRVSW50MzJCRSh0LGUrNCk7cy5pcChvLGEsci50bXAsMCksbz1yLnRtcFswXSxhPXIudG1wWzFdLCJlbmNyeXB0Ij09PXRoaXMudHlwZT90aGlzLl9lbmNyeXB0KHIsbyxhLHIudG1wLDApOnRoaXMuX2RlY3J5cHQocixvLGEsci50bXAsMCksbz1yLnRtcFswXSxhPXIudG1wWzFdLHMud3JpdGVVSW50MzJCRShuLG8saSkscy53cml0ZVVJbnQzMkJFKG4sYSxpKzQpfSxjLnByb3RvdHlwZS5fcGFkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLWUsaT1lO2k8dC5sZW5ndGg7aSsrKXRbaV09bjtyZXR1cm4hMH0sYy5wcm90b3R5cGUuX3VucGFkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10W3QubGVuZ3RoLTFdLG49dC5sZW5ndGgtZTtuPHQubGVuZ3RoO24rKylpLmVxdWFsKHRbbl0sZSk7cmV0dXJuIHQuc2xpY2UoMCx0Lmxlbmd0aC1lKX0sYy5wcm90b3R5cGUuX2VuY3J5cHQ9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89ZSxhPW4sdT0wO3U8dC5rZXlzLmxlbmd0aDt1Kz0yKXt2YXIgYz10LmtleXNbdV0saD10LmtleXNbdSsxXTtzLmV4cGFuZChhLHQudG1wLDApLGNePXQudG1wWzBdLGhePXQudG1wWzFdO3ZhciBsPXMuc3Vic3RpdHV0ZShjLGgpLGQ9YTthPShvXnMucGVybXV0ZShsKSk+Pj4wLG89ZH1zLnJpcChhLG8saSxyKX0sYy5wcm90b3R5cGUuX2RlY3J5cHQ9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89bixhPWUsdT10LmtleXMubGVuZ3RoLTI7dT49MDt1LT0yKXt2YXIgYz10LmtleXNbdV0saD10LmtleXNbdSsxXTtzLmV4cGFuZChvLHQudG1wLDApLGNePXQudG1wWzBdLGhePXQudG1wWzFdO3ZhciBsPXMuc3Vic3RpdHV0ZShjLGgpLGQ9bztvPShhXnMucGVybXV0ZShsKSk+Pj4wLGE9ZH1zLnJpcChvLGEsaSxyKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNCkscj1uKDApLG89e307ZnVuY3Rpb24gcyh0KXtpLmVxdWFsKHQubGVuZ3RoLDgsIkludmFsaWQgSVYgbGVuZ3RoIiksdGhpcy5pdj1uZXcgQXJyYXkoOCk7Zm9yKHZhciBlPTA7ZTx0aGlzLml2Lmxlbmd0aDtlKyspdGhpcy5pdltlXT10W2VdfWUuaW5zdGFudGlhdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLl9jYmNJbml0KCl9cihlLHQpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhvKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBzPW5baV07ZS5wcm90b3R5cGVbc109b1tzXX1yZXR1cm4gZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlfSxvLl9jYmNJbml0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHModGhpcy5vcHRpb25zLml2KTt0aGlzLl9jYmNTdGF0ZT10fSxvLl91cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fY2JjU3RhdGUsbz10aGlzLmNvbnN0cnVjdG9yLnN1cGVyXy5wcm90b3R5cGUscz1yLml2O2lmKCJlbmNyeXB0Ij09PXRoaXMudHlwZSl7Zm9yKHZhciBhPTA7YTx0aGlzLmJsb2NrU2l6ZTthKyspc1thXV49dFtlK2FdO28uX3VwZGF0ZS5jYWxsKHRoaXMscywwLG4saSk7Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKylzW2FdPW5baSthXX1lbHNle28uX3VwZGF0ZS5jYWxsKHRoaXMsdCxlLG4saSk7Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKyluW2krYV1ePXNbYV07Zm9yKGE9MDthPHRoaXMuYmxvY2tTaXplO2ErKylzW2FdPXRbZSthXX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMTQpLHI9bigwKSxvPW4oNjYpLHM9by5DaXBoZXIsYT1vLkRFUztmdW5jdGlvbiB1KHQsZSl7aS5lcXVhbChlLmxlbmd0aCwyNCwiSW52YWxpZCBrZXkgbGVuZ3RoIik7dmFyIG49ZS5zbGljZSgwLDgpLHI9ZS5zbGljZSg4LDE2KSxvPWUuc2xpY2UoMTYsMjQpO3RoaXMuY2lwaGVycz0iZW5jcnlwdCI9PT10P1thLmNyZWF0ZSh7dHlwZToiZW5jcnlwdCIsa2V5Om59KSxhLmNyZWF0ZSh7dHlwZToiZGVjcnlwdCIsa2V5OnJ9KSxhLmNyZWF0ZSh7dHlwZToiZW5jcnlwdCIsa2V5Om99KV06W2EuY3JlYXRlKHt0eXBlOiJkZWNyeXB0IixrZXk6b30pLGEuY3JlYXRlKHt0eXBlOiJlbmNyeXB0IixrZXk6cn0pLGEuY3JlYXRlKHt0eXBlOiJkZWNyeXB0IixrZXk6bn0pXX1mdW5jdGlvbiBjKHQpe3MuY2FsbCh0aGlzLHQpO3ZhciBlPW5ldyB1KHRoaXMudHlwZSx0aGlzLm9wdGlvbnMua2V5KTt0aGlzLl9lZGVTdGF0ZT1lfXIoYyxzKSx0LmV4cG9ydHM9YyxjLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGModCl9LGMucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fZWRlU3RhdGU7ci5jaXBoZXJzWzBdLl91cGRhdGUodCxlLG4saSksci5jaXBoZXJzWzFdLl91cGRhdGUobixpLG4saSksci5jaXBoZXJzWzJdLl91cGRhdGUobixpLG4saSl9LGMucHJvdG90eXBlLl9wYWQ9YS5wcm90b3R5cGUuX3BhZCxjLnByb3RvdHlwZS5fdW5wYWQ9YS5wcm90b3R5cGUuX3VucGFkfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big2OCkscj1uKDEwMSksbz1uKDEpLkJ1ZmZlcixzPW4oMTAyKSxhPW4oMjEpLHU9big0NSksYz1uKDQ2KTtmdW5jdGlvbiBoKHQsZSxuKXthLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGQsdGhpcy5fY2lwaGVyPW5ldyB1LkFFUyhlKSx0aGlzLl9wcmV2PW8uZnJvbShuKSx0aGlzLl9tb2RlPXQsdGhpcy5fYXV0b3BhZGRpbmc9ITB9bigwKShoLGEpLGgucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGUsbjt0aGlzLl9jYWNoZS5hZGQodCk7Zm9yKHZhciBpPVtdO2U9dGhpcy5fY2FjaGUuZ2V0KCk7KW49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsZSksaS5wdXNoKG4pO3JldHVybiBvLmNvbmNhdChpKX07dmFyIGw9by5hbGxvYygxNiwxNik7ZnVuY3Rpb24gZCgpe3RoaXMuY2FjaGU9by5hbGxvY1Vuc2FmZSgwKX1mdW5jdGlvbiBmKHQsZSxuKXt2YXIgYT1pW3QudG9Mb3dlckNhc2UoKV07aWYoIWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1vLmZyb20oZSkpLGUubGVuZ3RoIT09YS5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGggIitlLmxlbmd0aCk7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1vLmZyb20obikpLCJHQ00iIT09YS5tb2RlJiZuLmxlbmd0aCE9PWEuaXYpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpdiBsZW5ndGggIituLmxlbmd0aCk7cmV0dXJuInN0cmVhbSI9PT1hLnR5cGU/bmV3IHMoYS5tb2R1bGUsZSxuKToiYXV0aCI9PT1hLnR5cGU/bmV3IHIoYS5tb2R1bGUsZSxuKTpuZXcgaChhLm1vZHVsZSxlLG4pfWgucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NhY2hlLmZsdXNoKCk7aWYodGhpcy5fYXV0b3BhZGRpbmcpcmV0dXJuIHQ9dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCksdGhpcy5fY2lwaGVyLnNjcnViKCksdDtpZighdC5lcXVhbHMobCkpdGhyb3cgdGhpcy5fY2lwaGVyLnNjcnViKCksbmV3IEVycm9yKCJkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgiKX0saC5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F1dG9wYWRkaW5nPSEhdCx0aGlzfSxkLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5jYWNoZT1vLmNvbmNhdChbdGhpcy5jYWNoZSx0XSl9LGQucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe2lmKHRoaXMuY2FjaGUubGVuZ3RoPjE1KXt2YXIgdD10aGlzLmNhY2hlLnNsaWNlKDAsMTYpO3JldHVybiB0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHR9cmV0dXJuIG51bGx9LGQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTE2LXRoaXMuY2FjaGUubGVuZ3RoLGU9by5hbGxvY1Vuc2FmZSh0KSxuPS0xOysrbjx0OyllLndyaXRlVUludDgodCxuKTtyZXR1cm4gby5jb25jYXQoW3RoaXMuY2FjaGUsZV0pfSxlLmNyZWF0ZUNpcGhlcml2PWYsZS5jcmVhdGVDaXBoZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1pW3QudG9Mb3dlckNhc2UoKV07aWYoIW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7dmFyIHI9YyhlLCExLG4ua2V5LG4uaXYpO3JldHVybiBmKHQsci5rZXksci5pdil9fSxmdW5jdGlvbih0LGUpe2UuZW5jcnlwdD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKGUpfSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDMzKTtlLmVuY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1pKGUsdC5fcHJldik7cmV0dXJuIHQuX3ByZXY9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayhuKSx0Ll9wcmV2fSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll9wcmV2O3QuX3ByZXY9ZTt2YXIgcj10Ll9jaXBoZXIuZGVjcnlwdEJsb2NrKGUpO3JldHVybiBpKHIsbil9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxKS5CdWZmZXIscj1uKDMzKTtmdW5jdGlvbiBvKHQsZSxuKXt2YXIgbz1lLmxlbmd0aCxzPXIoZSx0Ll9jYWNoZSk7cmV0dXJuIHQuX2NhY2hlPXQuX2NhY2hlLnNsaWNlKG8pLHQuX3ByZXY9aS5jb25jYXQoW3QuX3ByZXYsbj9lOnNdKSxzfWUuZW5jcnlwdD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLHM9aS5hbGxvY1Vuc2FmZSgwKTtlLmxlbmd0aDspe2lmKDA9PT10Ll9jYWNoZS5sZW5ndGgmJih0Ll9jYWNoZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXY9aS5hbGxvY1Vuc2FmZSgwKSksISh0Ll9jYWNoZS5sZW5ndGg8PWUubGVuZ3RoKSl7cz1pLmNvbmNhdChbcyxvKHQsZSxuKV0pO2JyZWFrfXI9dC5fY2FjaGUubGVuZ3RoLHM9aS5jb25jYXQoW3Msbyh0LGUuc2xpY2UoMCxyKSxuKV0pLGU9ZS5zbGljZShyKX1yZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSxuKXt2YXIgcj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpWzBdXmU7cmV0dXJuIHQuX3ByZXY9aS5jb25jYXQoW3QuX3ByZXYuc2xpY2UoMSksaS5mcm9tKFtuP2U6cl0pXSkscn1lLmVuY3J5cHQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbz1lLmxlbmd0aCxzPWkuYWxsb2NVbnNhZmUobyksYT0tMTsrK2E8bzspc1thXT1yKHQsZVthXSxuKTtyZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEpLkJ1ZmZlcjtmdW5jdGlvbiByKHQsZSxuKXtmb3IodmFyIGkscixzPS0xLGE9MDsrK3M8ODspaT1lJjE8PDctcz8xMjg6MCxhKz0oMTI4JihyPXQuX2NpcGhlci5lbmNyeXB0QmxvY2sodC5fcHJldilbMF1eaSkpPj5zJTgsdC5fcHJldj1vKHQuX3ByZXYsbj9pOnIpO3JldHVybiBhfWZ1bmN0aW9uIG8odCxlKXt2YXIgbj10Lmxlbmd0aCxyPS0xLG89aS5hbGxvY1Vuc2FmZSh0Lmxlbmd0aCk7Zm9yKHQ9aS5jb25jYXQoW3QsaS5mcm9tKFtlXSldKTsrK3I8bjspb1tyXT10W3JdPDwxfHRbcisxXT4+NztyZXR1cm4gb31lLmVuY3J5cHQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgbz1lLmxlbmd0aCxzPWkuYWxsb2NVbnNhZmUobyksYT0tMTsrK2E8bzspc1thXT1yKHQsZVthXSxuKTtyZXR1cm4gc319LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24odCl7dmFyIGk9bigzMyk7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5fcHJldj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXZ9ZS5lbmNyeXB0PWZ1bmN0aW9uKGUsbil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8bi5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxyKGUpXSk7dmFyIG89ZS5fY2FjaGUuc2xpY2UoMCxuLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKG4ubGVuZ3RoKSxpKG4sbyl9fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMSkuQnVmZmVyLHI9aS5hbGxvYygxNiwwKTtmdW5jdGlvbiBvKHQpe3ZhciBlPWkuYWxsb2NVbnNhZmUoMTYpO3JldHVybiBlLndyaXRlVUludDMyQkUodFswXT4+PjAsMCksZS53cml0ZVVJbnQzMkJFKHRbMV0+Pj4wLDQpLGUud3JpdGVVSW50MzJCRSh0WzJdPj4+MCw4KSxlLndyaXRlVUludDMyQkUodFszXT4+PjAsMTIpLGV9ZnVuY3Rpb24gcyh0KXt0aGlzLmg9dCx0aGlzLnN0YXRlPWkuYWxsb2MoMTYsMCksdGhpcy5jYWNoZT1pLmFsbG9jVW5zYWZlKDApfXMucHJvdG90eXBlLmdoYXNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMTsrK2U8dC5sZW5ndGg7KXRoaXMuc3RhdGVbZV1ePXRbZV07dGhpcy5fbXVsdGlwbHkoKX0scy5wcm90b3R5cGUuX211bHRpcGx5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixpPVsodD10aGlzLmgpLnJlYWRVSW50MzJCRSgwKSx0LnJlYWRVSW50MzJCRSg0KSx0LnJlYWRVSW50MzJCRSg4KSx0LnJlYWRVSW50MzJCRSgxMildLHI9WzAsMCwwLDBdLHM9LTE7KytzPDEyODspe2ZvcigwIT0odGhpcy5zdGF0ZVt+fihzLzgpXSYxPDw3LXMlOCkmJihyWzBdXj1pWzBdLHJbMV1ePWlbMV0sclsyXV49aVsyXSxyWzNdXj1pWzNdKSxuPTAhPSgxJmlbM10pLGU9MztlPjA7ZS0tKWlbZV09aVtlXT4+PjF8KDEmaVtlLTFdKTw8MzE7aVswXT1pWzBdPj4+MSxuJiYoaVswXT1pWzBdXjIyNTw8MjQpfXRoaXMuc3RhdGU9byhyKX0scy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLmNhY2hlPWkuY29uY2F0KFt0aGlzLmNhY2hlLHRdKTt0aGlzLmNhY2hlLmxlbmd0aD49MTY7KWU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHRoaXMuZ2hhc2goZSl9LHMucHJvdG90eXBlLmZpbmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RoJiZ0aGlzLmdoYXNoKGkuY29uY2F0KFt0aGlzLmNhY2hlLHJdLDE2KSksdGhpcy5naGFzaChvKFswLHQsMCxlXSkpLHRoaXMuc3RhdGV9LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMDEpLHI9bigxKS5CdWZmZXIsbz1uKDY4KSxzPW4oMTAyKSxhPW4oMjEpLHU9big0NSksYz1uKDQ2KTtmdW5jdGlvbiBoKHQsZSxuKXthLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGwsdGhpcy5fbGFzdD12b2lkIDAsdGhpcy5fY2lwaGVyPW5ldyB1LkFFUyhlKSx0aGlzLl9wcmV2PXIuZnJvbShuKSx0aGlzLl9tb2RlPXQsdGhpcy5fYXV0b3BhZGRpbmc9ITB9ZnVuY3Rpb24gbCgpe3RoaXMuY2FjaGU9ci5hbGxvY1Vuc2FmZSgwKX1mdW5jdGlvbiBkKHQsZSxuKXt2YXIgYT1vW3QudG9Mb3dlckNhc2UoKV07aWYoIWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1yLmZyb20obikpLCJHQ00iIT09YS5tb2RlJiZuLmxlbmd0aCE9PWEuaXYpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpdiBsZW5ndGggIituLmxlbmd0aCk7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1yLmZyb20oZSkpLGUubGVuZ3RoIT09YS5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGggIitlLmxlbmd0aCk7cmV0dXJuInN0cmVhbSI9PT1hLnR5cGU/bmV3IHMoYS5tb2R1bGUsZSxuLCEwKToiYXV0aCI9PT1hLnR5cGU/bmV3IGkoYS5tb2R1bGUsZSxuLCEwKTpuZXcgaChhLm1vZHVsZSxlLG4pfW4oMCkoaCxhKSxoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5fY2FjaGUuYWRkKHQpO2Zvcih2YXIgaT1bXTtlPXRoaXMuX2NhY2hlLmdldCh0aGlzLl9hdXRvcGFkZGluZyk7KW49dGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsZSksaS5wdXNoKG4pO3JldHVybiByLmNvbmNhdChpKX0saC5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2FjaGUuZmx1c2goKTtpZih0aGlzLl9hdXRvcGFkZGluZylyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dFsxNV07aWYoZTwxfHxlPjE2KXRocm93IG5ldyBFcnJvcigidW5hYmxlIHRvIGRlY3J5cHQgZGF0YSIpO3ZhciBuPS0xO2Zvcig7KytuPGU7KWlmKHRbbisoMTYtZSldIT09ZSl0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBkZWNyeXB0IGRhdGEiKTtpZigxNj09PWUpcmV0dXJuO3JldHVybiB0LnNsaWNlKDAsMTYtZSl9KHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLHQpKTtpZih0KXRocm93IG5ldyBFcnJvcigiZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoIil9LGgucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hdXRvcGFkZGluZz0hIXQsdGhpc30sbC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGU9ci5jb25jYXQoW3RoaXMuY2FjaGUsdF0pfSxsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU7aWYodCl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGV9ZWxzZSBpZih0aGlzLmNhY2hlLmxlbmd0aD49MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGU7cmV0dXJuIG51bGx9LGwucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGV9LGUuY3JlYXRlRGVjaXBoZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1vW3QudG9Mb3dlckNhc2UoKV07aWYoIW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7dmFyIGk9YyhlLCExLG4ua2V5LG4uaXYpO3JldHVybiBkKHQsaS5rZXksaS5pdil9LGUuY3JlYXRlRGVjaXBoZXJpdj1kfSxmdW5jdGlvbih0LGUpe2VbImRlcy1lY2IiXT17a2V5OjgsaXY6MH0sZVsiZGVzLWNiYyJdPWUuZGVzPXtrZXk6OCxpdjo4fSxlWyJkZXMtZWRlMy1jYmMiXT1lLmRlczM9e2tleToyNCxpdjo4fSxlWyJkZXMtZWRlMyJdPXtrZXk6MjQsaXY6MH0sZVsiZGVzLWVkZS1jYmMiXT17a2V5OjE2LGl2Ojh9LGVbImRlcy1lZGUiXT17a2V5OjE2LGl2OjB9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTAzKSxyPW4oMTg0KSxvPW4oMTg1KTt2YXIgcz17YmluYXJ5OiEwLGhleDohMCxiYXNlNjQ6ITB9O2UuRGlmZmllSGVsbG1hbkdyb3VwPWUuY3JlYXRlRGlmZmllSGVsbG1hbkdyb3VwPWUuZ2V0RGlmZmllSGVsbG1hbj1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdChyW2VdLnByaW1lLCJoZXgiKSxpPW5ldyB0KHJbZV0uZ2VuLCJoZXgiKTtyZXR1cm4gbmV3IG8obixpKX0sZS5jcmVhdGVEaWZmaWVIZWxsbWFuPWUuRGlmZmllSGVsbG1hbj1mdW5jdGlvbiBlKG4scixhLHUpe3JldHVybiB0LmlzQnVmZmVyKHIpfHx2b2lkIDA9PT1zW3JdP2UobiwiYmluYXJ5IixyLGEpOihyPXJ8fCJiaW5hcnkiLHU9dXx8ImJpbmFyeSIsYT1hfHxuZXcgdChbMl0pLHQuaXNCdWZmZXIoYSl8fChhPW5ldyB0KGEsdSkpLCJudW1iZXIiPT10eXBlb2Ygbj9uZXcgbyhpKG4sYSksYSwhMCk6KHQuaXNCdWZmZXIobil8fChuPW5ldyB0KG4scikpLG5ldyBvKG4sYSwhMCkpKX19KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQpe3QuZXhwb3J0cz17bW9kcDE6e2dlbjoiMDIiLHByaW1lOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjNhMzYyMGZmZmZmZmZmZmZmZmZmZmYifSxtb2RwMjp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U2NTM4MWZmZmZmZmZmZmZmZmZmZmYifSxtb2RwNTp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMjM3MzI3ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxNDp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhY2FhNjhmZmZmZmZmZmZmZmZmZmZmIn0sbW9kcDE1OntnZW46IjAyIixwcmltZToiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkzYWQyY2FmZmZmZmZmZmZmZmZmZmZmIn0sbW9kcDE2OntnZW46IjAyIixwcmltZToiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDYzMTk5ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxNzp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkY2M0MDI0ZmZmZmZmZmZmZmZmZmZmZiJ9LG1vZHAxODp7Z2VuOiIwMiIscHJpbWU6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmIn19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBpPW4oMykscj1uZXcobigxMDQpKSxvPW5ldyBpKDI0KSxzPW5ldyBpKDExKSxhPW5ldyBpKDEwKSx1PW5ldyBpKDMpLGM9bmV3IGkoNyksaD1uKDEwMyksbD1uKDI3KTtmdW5jdGlvbiBkKHQsbil7cmV0dXJuIG49bnx8InV0ZjgiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQsbikpLHRoaXMuX3B1Yj1uZXcgaSh0KSx0aGlzfWZ1bmN0aW9uIGYodCxuKXtyZXR1cm4gbj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSksdGhpcy5fcHJpdj1uZXcgaSh0KSx0aGlzfXQuZXhwb3J0cz1tO3ZhciBwPXt9O2Z1bmN0aW9uIG0odCxlLG4pe3RoaXMuc2V0R2VuZXJhdG9yKGUpLHRoaXMuX19wcmltZT1uZXcgaSh0KSx0aGlzLl9wcmltZT1pLm1vbnQodGhpcy5fX3ByaW1lKSx0aGlzLl9wcmltZUxlbj10Lmxlbmd0aCx0aGlzLl9wdWI9dm9pZCAwLHRoaXMuX3ByaXY9dm9pZCAwLHRoaXMuX3ByaW1lQ29kZT12b2lkIDAsbj8odGhpcy5zZXRQdWJsaWNLZXk9ZCx0aGlzLnNldFByaXZhdGVLZXk9Zik6dGhpcy5fcHJpbWVDb2RlPTh9ZnVuY3Rpb24gZyh0LG4pe3ZhciBpPW5ldyBlKHQudG9BcnJheSgpKTtyZXR1cm4gbj9pLnRvU3RyaW5nKG4pOml9T2JqZWN0LmRlZmluZVByb3BlcnR5KG0ucHJvdG90eXBlLCJ2ZXJpZnlFcnJvciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0aGlzLl9wcmltZUNvZGUmJih0aGlzLl9wcmltZUNvZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnRvU3RyaW5nKCJoZXgiKSxpPVtuLHQudG9TdHJpbmcoMTYpXS5qb2luKCJfIik7aWYoaSBpbiBwKXJldHVybiBwW2ldO3ZhciBsLGQ9MDtpZih0LmlzRXZlbigpfHwhaC5zaW1wbGVTaWV2ZXx8IWguZmVybWF0VGVzdCh0KXx8IXIudGVzdCh0KSlyZXR1cm4gZCs9MSxkKz0iMDIiPT09bnx8IjA1Ij09PW4/ODo0LHBbaV09ZCxkO3N3aXRjaChyLnRlc3QodC5zaHJuKDEpKXx8KGQrPTIpLG4pe2Nhc2UiMDIiOnQubW9kKG8pLmNtcChzKSYmKGQrPTgpO2JyZWFrO2Nhc2UiMDUiOihsPXQubW9kKGEpKS5jbXAodSkmJmwuY21wKGMpJiYoZCs9OCk7YnJlYWs7ZGVmYXVsdDpkKz00fXJldHVybiBwW2ldPWQsZH0odGhpcy5fX3ByaW1lLHRoaXMuX19nZW4pKSx0aGlzLl9wcmltZUNvZGV9fSksbS5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByaXZ8fCh0aGlzLl9wcml2PW5ldyBpKGwodGhpcy5fcHJpbWVMZW4pKSksdGhpcy5fcHViPXRoaXMuX2dlbi50b1JlZCh0aGlzLl9wcmltZSkucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKSx0aGlzLmdldFB1YmxpY0tleSgpfSxtLnByb3RvdHlwZS5jb21wdXRlU2VjcmV0PWZ1bmN0aW9uKHQpe3ZhciBuPSh0PSh0PW5ldyBpKHQpKS50b1JlZCh0aGlzLl9wcmltZSkpLnJlZFBvdyh0aGlzLl9wcml2KS5mcm9tUmVkKCkscj1uZXcgZShuLnRvQXJyYXkoKSksbz10aGlzLmdldFByaW1lKCk7aWYoci5sZW5ndGg8by5sZW5ndGgpe3ZhciBzPW5ldyBlKG8ubGVuZ3RoLXIubGVuZ3RoKTtzLmZpbGwoMCkscj1lLmNvbmNhdChbcyxyXSl9cmV0dXJuIHJ9LG0ucHJvdG90eXBlLmdldFB1YmxpY0tleT1mdW5jdGlvbih0KXtyZXR1cm4gZyh0aGlzLl9wdWIsdCl9LG0ucHJvdG90eXBlLmdldFByaXZhdGVLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fcHJpdix0KX0sbS5wcm90b3R5cGUuZ2V0UHJpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fX3ByaW1lLHQpfSxtLnByb3RvdHlwZS5nZXRHZW5lcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGcodGhpcy5fZ2VuLHQpfSxtLnByb3RvdHlwZS5zZXRHZW5lcmF0b3I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSksdGhpcy5fX2dlbj10LHRoaXMuX2dlbj1uZXcgaSh0KSx0aGlzfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9bigzMSkscj1uKDU5KSxvPW4oMCkscz1uKDE4NyksYT1uKDIyMyksdT1uKDkzKTtmdW5jdGlvbiBjKHQpe3IuV3JpdGFibGUuY2FsbCh0aGlzKTt2YXIgZT11W3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIGRpZ2VzdCIpO3RoaXMuX2hhc2hUeXBlPWUuaGFzaCx0aGlzLl9oYXNoPWkoZS5oYXNoKSx0aGlzLl90YWc9ZS5pZCx0aGlzLl9zaWduVHlwZT1lLnNpZ259ZnVuY3Rpb24gaCh0KXtyLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGU9dVt0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbWVzc2FnZSBkaWdlc3QiKTt0aGlzLl9oYXNoPWkoZS5oYXNoKSx0aGlzLl90YWc9ZS5pZCx0aGlzLl9zaWduVHlwZT1lLnNpZ259ZnVuY3Rpb24gbCh0KXtyZXR1cm4gbmV3IGModCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gbmV3IGgodCl9T2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbih0KXt1W3RdLmlkPW5ldyBlKHVbdF0uaWQsImhleCIpLHVbdC50b0xvd2VyQ2FzZSgpXT11W3RdfSksbyhjLHIuV3JpdGFibGUpLGMucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUsbil7dGhpcy5faGFzaC51cGRhdGUodCksbigpfSxjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBlKHQsbikpLHRoaXMuX2hhc2gudXBkYXRlKHQpLHRoaXN9LGMucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24odCxlKXt0aGlzLmVuZCgpO3ZhciBuPXRoaXMuX2hhc2guZGlnZXN0KCksaT1zKG4sdCx0aGlzLl9oYXNoVHlwZSx0aGlzLl9zaWduVHlwZSx0aGlzLl90YWcpO3JldHVybiBlP2kudG9TdHJpbmcoZSk6aX0sbyhoLHIuV3JpdGFibGUpLGgucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUsbil7dGhpcy5faGFzaC51cGRhdGUodCksbigpfSxoLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBlKHQsbikpLHRoaXMuX2hhc2gudXBkYXRlKHQpLHRoaXN9LGgucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LG4saSl7InN0cmluZyI9PXR5cGVvZiBuJiYobj1uZXcgZShuLGkpKSx0aGlzLmVuZCgpO3ZhciByPXRoaXMuX2hhc2guZGlnZXN0KCk7cmV0dXJuIGEobixyLHQsdGhpcy5fc2lnblR5cGUsdGhpcy5fdGFnKX0sdC5leHBvcnRzPXtTaWduOmwsVmVyaWZ5OmQsY3JlYXRlU2lnbjpsLGNyZWF0ZVZlcmlmeTpkfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9big5MSkscj1uKDY5KSxvPW4oMTApLmVjLHM9bigzKSxhPW4oNDkpLHU9bigxMTQpO2Z1bmN0aW9uIGModCxuLHIsbyl7aWYoKHQ9bmV3IGUodC50b0FycmF5KCkpKS5sZW5ndGg8bi5ieXRlTGVuZ3RoKCkpe3ZhciBzPW5ldyBlKG4uYnl0ZUxlbmd0aCgpLXQubGVuZ3RoKTtzLmZpbGwoMCksdD1lLmNvbmNhdChbcyx0XSl9dmFyIGE9ci5sZW5ndGgsdT1mdW5jdGlvbih0LG4pe3Q9KHQ9aCh0LG4pKS5tb2Qobik7dmFyIGk9bmV3IGUodC50b0FycmF5KCkpO2lmKGkubGVuZ3RoPG4uYnl0ZUxlbmd0aCgpKXt2YXIgcj1uZXcgZShuLmJ5dGVMZW5ndGgoKS1pLmxlbmd0aCk7ci5maWxsKDApLGk9ZS5jb25jYXQoW3IsaV0pfXJldHVybiBpfShyLG4pLGM9bmV3IGUoYSk7Yy5maWxsKDEpO3ZhciBsPW5ldyBlKGEpO3JldHVybiBsLmZpbGwoMCksbD1pKG8sbCkudXBkYXRlKGMpLnVwZGF0ZShuZXcgZShbMF0pKS51cGRhdGUodCkudXBkYXRlKHUpLmRpZ2VzdCgpLGM9aShvLGwpLnVwZGF0ZShjKS5kaWdlc3QoKSx7azpsPWkobyxsKS51cGRhdGUoYykudXBkYXRlKG5ldyBlKFsxXSkpLnVwZGF0ZSh0KS51cGRhdGUodSkuZGlnZXN0KCksdjpjPWkobyxsKS51cGRhdGUoYykuZGlnZXN0KCl9fWZ1bmN0aW9uIGgodCxlKXt2YXIgbj1uZXcgcyh0KSxpPSh0Lmxlbmd0aDw8MyktZS5iaXRMZW5ndGgoKTtyZXR1cm4gaT4wJiZuLmlzaHJuKGkpLG59ZnVuY3Rpb24gbCh0LG4scil7dmFyIG8scztkb3tmb3Iobz1uZXcgZSgwKTs4Km8ubGVuZ3RoPHQuYml0TGVuZ3RoKCk7KW4udj1pKHIsbi5rKS51cGRhdGUobi52KS5kaWdlc3QoKSxvPWUuY29uY2F0KFtvLG4udl0pO3M9aChvLHQpLG4uaz1pKHIsbi5rKS51cGRhdGUobi52KS51cGRhdGUobmV3IGUoWzBdKSkuZGlnZXN0KCksbi52PWkocixuLmspLnVwZGF0ZShuLnYpLmRpZ2VzdCgpfXdoaWxlKC0xIT09cy5jbXAodCkpO3JldHVybiBzfWZ1bmN0aW9uIGQodCxlLG4saSl7cmV0dXJuIHQudG9SZWQocy5tb250KG4pKS5yZWRQb3coZSkuZnJvbVJlZCgpLm1vZChpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGksZixwKXt2YXIgbT1hKG4pO2lmKG0uY3VydmUpe2lmKCJlY2RzYSIhPT1mJiYiZWNkc2EvcnNhIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIGk9dVtuLmN1cnZlLmpvaW4oIi4iKV07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGN1cnZlICIrbi5jdXJ2ZS5qb2luKCIuIikpO3ZhciByPW5ldyBvKGkpLmtleUZyb21Qcml2YXRlKG4ucHJpdmF0ZUtleSkuc2lnbih0KTtyZXR1cm4gbmV3IGUoci50b0RFUigpKX0odCxtKX1pZigiZHNhIj09PW0udHlwZSl7aWYoImRzYSIhPT1mKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHJpdmF0ZSBrZXkgdHlwZSIpO3JldHVybiBmdW5jdGlvbih0LG4saSl7Zm9yKHZhciByLG89bi5wYXJhbXMucHJpdl9rZXksYT1uLnBhcmFtcy5wLHU9bi5wYXJhbXMucSxmPW4ucGFyYW1zLmcscD1uZXcgcygwKSxtPWgodCx1KS5tb2QodSksZz0hMSx2PWMobyx1LHQsaSk7ITE9PT1nOylyPWwodSx2LGkpLHA9ZChmLHIsYSx1KSwwPT09KGc9ci5pbnZtKHUpLmltdWwobS5hZGQoby5tdWwocCkpKS5tb2QodSkpLmNtcG4oMCkmJihnPSExLHA9bmV3IHMoMCkpO3JldHVybiBmdW5jdGlvbih0LG4pe3Q9dC50b0FycmF5KCksbj1uLnRvQXJyYXkoKSwxMjgmdFswXSYmKHQ9WzBdLmNvbmNhdCh0KSksMTI4Jm5bMF0mJihuPVswXS5jb25jYXQobikpO3ZhciBpPVs0OCx0Lmxlbmd0aCtuLmxlbmd0aCs0LDIsdC5sZW5ndGhdO3JldHVybiBpPWkuY29uY2F0KHQsWzIsbi5sZW5ndGhdLG4pLG5ldyBlKGkpfShwLGcpfSh0LG0saSl9aWYoInJzYSIhPT1mJiYiZWNkc2EvcnNhIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7dD1lLmNvbmNhdChbcCx0XSk7Zm9yKHZhciBnPW0ubW9kdWx1cy5ieXRlTGVuZ3RoKCksdj1bMCwxXTt0Lmxlbmd0aCt2Lmxlbmd0aCsxPGc7KXYucHVzaCgyNTUpO3YucHVzaCgwKTtmb3IodmFyIGI9LTE7KytiPHQubGVuZ3RoOyl2LnB1c2godFtiXSk7cmV0dXJuIHIodixtKX0sdC5leHBvcnRzLmdldEtleT1jLHQuZXhwb3J0cy5tYWtlS2V5PWx9KS5jYWxsKHRoaXMsbig0KS5CdWZmZXIpfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9e25hbWU6ImVsbGlwdGljIix2ZXJzaW9uOiI2LjQuMSIsZGVzY3JpcHRpb246IkVDIGNyeXB0b2dyYXBoeSIsbWFpbjoibGliL2VsbGlwdGljLmpzIixmaWxlczpbImxpYiJdLHNjcmlwdHM6e2pzY3M6ImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvaW5kZXguanMiLGpzaGludDoianNjcyBiZW5jaG1hcmtzLyouanMgbGliLyouanMgbGliLyoqLyouanMgbGliLyoqLyoqLyouanMgdGVzdC9pbmRleC5qcyIsbGludDoibnBtIHJ1biBqc2NzICYmIG5wbSBydW4ganNoaW50Iix1bml0OiJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qcyIsdGVzdDoibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gdW5pdCIsdmVyc2lvbjoiZ3J1bnQgZGlzdCAmJiBnaXQgYWRkIGRpc3QvIn0scmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6ImdpdEBnaXRodWIuY29tOmluZHV0bnkvZWxsaXB0aWMifSxrZXl3b3JkczpbIkVDIiwiRWxsaXB0aWMiLCJjdXJ2ZSIsIkNyeXB0b2dyYXBoeSJdLGF1dGhvcjoiRmVkb3IgSW5kdXRueSA8ZmVkb3JAaW5kdXRueS5jb20+IixsaWNlbnNlOiJNSVQiLGJ1Z3M6e3VybDoiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzIn0saG9tZXBhZ2U6Imh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljIixkZXZEZXBlbmRlbmNpZXM6e2JyZnM6Il4xLjQuMyIsY292ZXJhbGxzOiJeMi4xMS4zIixncnVudDoiXjAuNC41IiwiZ3J1bnQtYnJvd3NlcmlmeSI6Il41LjAuMCIsImdydW50LWNsaSI6Il4xLjIuMCIsImdydW50LWNvbnRyaWItY29ubmVjdCI6Il4xLjAuMCIsImdydW50LWNvbnRyaWItY29weSI6Il4xLjAuMCIsImdydW50LWNvbnRyaWItdWdsaWZ5IjoiXjEuMC4xIiwiZ3J1bnQtbW9jaGEtaXN0YW5idWwiOiJeMy4wLjEiLCJncnVudC1zYXVjZWxhYnMiOiJeOC42LjIiLGlzdGFuYnVsOiJeMC40LjIiLGpzY3M6Il4yLjkuMCIsanNoaW50OiJeMi42LjAiLG1vY2hhOiJeMi4xLjAifSxkZXBlbmRlbmNpZXM6eyJibi5qcyI6Il40LjQuMCIsYnJvcmFuZDoiXjEuMC4xIiwiaGFzaC5qcyI6Il4xLjAuMCIsImhtYWMtZHJiZyI6Il4xLjAuMCIsaW5oZXJpdHM6Il4yLjAuMSIsIm1pbmltYWxpc3RpYy1hc3NlcnQiOiJeMS4wLjAiLCJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjoiXjEuMC4wIn0sX3Jlc29sdmVkOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbGxpcHRpYy8tL2VsbGlwdGljLTYuNC4xLnRneiIsX2ludGVncml0eToic2hhNTEyLUJzWEx6NXNxWDhPSGNzaDdDcUJNenR5WEFSbUdRM0xXUHRHakppNkRpSkhxNUMvcXZpOVAzT3Fnc3dLU0RmdGJ1OCtJb0kvUURUQW0yZkZuUTlTWlNRPT0iLF9mcm9tOiJlbGxpcHRpY0A2LjQuMSJ9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPWUscj1uKDMpLG89bigxNCkscz1uKDEwNik7aS5hc3NlcnQ9byxpLnRvQXJyYXk9cy50b0FycmF5LGkuemVybzI9cy56ZXJvMixpLnRvSGV4PXMudG9IZXgsaS5lbmNvZGU9cy5lbmNvZGUsaS5nZXROQUY9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT0xPDxlKzEscj10LmNsb25lKCk7ci5jbXBuKDEpPj0wOyl7dmFyIG87aWYoci5pc09kZCgpKXt2YXIgcz1yLmFuZGxuKGktMSk7bz1zPihpPj4xKS0xPyhpPj4xKS1zOnMsci5pc3VibihvKX1lbHNlIG89MDtuLnB1c2gobyk7Zm9yKHZhciBhPTAhPT1yLmNtcG4oMCkmJjA9PT1yLmFuZGxuKGktMSk/ZSsxOjEsdT0xO3U8YTt1Kyspbi5wdXNoKDApO3IuaXVzaHJuKGEpfXJldHVybiBufSxpLmdldEpTRj1mdW5jdGlvbih0LGUpe3ZhciBuPVtbXSxbXV07dD10LmNsb25lKCksZT1lLmNsb25lKCk7Zm9yKHZhciBpPTAscj0wO3QuY21wbigtaSk+MHx8ZS5jbXBuKC1yKT4wOyl7dmFyIG8scyxhLHU9dC5hbmRsbigzKStpJjMsYz1lLmFuZGxuKDMpK3ImMzszPT09dSYmKHU9LTEpLDM9PT1jJiYoYz0tMSksbz0wPT0oMSZ1KT8wOjMhPShhPXQuYW5kbG4oNykraSY3KSYmNSE9PWF8fDIhPT1jP3U6LXUsblswXS5wdXNoKG8pLHM9MD09KDEmYyk/MDozIT0oYT1lLmFuZGxuKDcpK3ImNykmJjUhPT1hfHwyIT09dT9jOi1jLG5bMV0ucHVzaChzKSwyKmk9PT1vKzEmJihpPTEtaSksMipyPT09cysxJiYocj0xLXIpLHQuaXVzaHJuKDEpLGUuaXVzaHJuKDEpfXJldHVybiBufSxpLmNhY2hlZFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0iXyIrZTt0LnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzW2ldP3RoaXNbaV06dGhpc1tpXT1uLmNhbGwodGhpcyl9fSxpLnBhcnNlQnl0ZXM9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2kudG9BcnJheSh0LCJoZXgiKTp0fSxpLmludEZyb21MRT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodCwiaGV4IiwibGUiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMTApLnV0aWxzLG89ci5nZXROQUYscz1yLmdldEpTRixhPXIuYXNzZXJ0O2Z1bmN0aW9uIHUodCxlKXt0aGlzLnR5cGU9dCx0aGlzLnA9bmV3IGkoZS5wLDE2KSx0aGlzLnJlZD1lLnByaW1lP2kucmVkKGUucHJpbWUpOmkubW9udCh0aGlzLnApLHRoaXMuemVybz1uZXcgaSgwKS50b1JlZCh0aGlzLnJlZCksdGhpcy5vbmU9bmV3IGkoMSkudG9SZWQodGhpcy5yZWQpLHRoaXMudHdvPW5ldyBpKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLm49ZS5uJiZuZXcgaShlLm4sMTYpLHRoaXMuZz1lLmcmJnRoaXMucG9pbnRGcm9tSlNPTihlLmcsZS5nUmVkKSx0aGlzLl93bmFmVDE9bmV3IEFycmF5KDQpLHRoaXMuX3duYWZUMj1uZXcgQXJyYXkoNCksdGhpcy5fd25hZlQzPW5ldyBBcnJheSg0KSx0aGlzLl93bmFmVDQ9bmV3IEFycmF5KDQpO3ZhciBuPXRoaXMubiYmdGhpcy5wLmRpdih0aGlzLm4pOyFufHxuLmNtcG4oMTAwKT4wP3RoaXMucmVkTj1udWxsOih0aGlzLl9tYXh3ZWxsVHJpY2s9ITAsdGhpcy5yZWROPXRoaXMubi50b1JlZCh0aGlzLnJlZCkpfWZ1bmN0aW9uIGModCxlKXt0aGlzLmN1cnZlPXQsdGhpcy50eXBlPWUsdGhpcy5wcmVjb21wdXRlZD1udWxsfXQuZXhwb3J0cz11LHUucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sdS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSx1LnByb3RvdHlwZS5fZml4ZWROYWZNdWw9ZnVuY3Rpb24odCxlKXthKHQucHJlY29tcHV0ZWQpO3ZhciBuPXQuX2dldERvdWJsZXMoKSxpPW8oZSwxKSxyPSgxPDxuLnN0ZXArMSktKG4uc3RlcCUyPT0wPzI6MSk7ci89Mztmb3IodmFyIHM9W10sdT0wO3U8aS5sZW5ndGg7dSs9bi5zdGVwKXt2YXIgYz0wO2ZvcihlPXUrbi5zdGVwLTE7ZT49dTtlLS0pYz0oYzw8MSkraVtlXTtzLnB1c2goYyl9Zm9yKHZhciBoPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxsPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxkPXI7ZD4wO2QtLSl7Zm9yKHU9MDt1PHMubGVuZ3RoO3UrKyl7KGM9c1t1XSk9PT1kP2w9bC5taXhlZEFkZChuLnBvaW50c1t1XSk6Yz09PS1kJiYobD1sLm1peGVkQWRkKG4ucG9pbnRzW3VdLm5lZygpKSl9aD1oLmFkZChsKX1yZXR1cm4gaC50b1AoKX0sdS5wcm90b3R5cGUuX3duYWZNdWw9ZnVuY3Rpb24odCxlKXt2YXIgbj00LGk9dC5fZ2V0TkFGUG9pbnRzKG4pO249aS53bmQ7Zm9yKHZhciByPWkucG9pbnRzLHM9byhlLG4pLHU9dGhpcy5qcG9pbnQobnVsbCxudWxsLG51bGwpLGM9cy5sZW5ndGgtMTtjPj0wO2MtLSl7Zm9yKGU9MDtjPj0wJiYwPT09c1tjXTtjLS0pZSsrO2lmKGM+PTAmJmUrKyx1PXUuZGJscChlKSxjPDApYnJlYWs7dmFyIGg9c1tjXTthKDAhPT1oKSx1PSJhZmZpbmUiPT09dC50eXBlP2g+MD91Lm1peGVkQWRkKHJbaC0xPj4xXSk6dS5taXhlZEFkZChyWy1oLTE+PjFdLm5lZygpKTpoPjA/dS5hZGQocltoLTE+PjFdKTp1LmFkZChyWy1oLTE+PjFdLm5lZygpKX1yZXR1cm4iYWZmaW5lIj09PXQudHlwZT91LnRvUCgpOnV9LHUucHJvdG90eXBlLl93bmFmTXVsQWRkPWZ1bmN0aW9uKHQsZSxuLGkscil7Zm9yKHZhciBhPXRoaXMuX3duYWZUMSx1PXRoaXMuX3duYWZUMixjPXRoaXMuX3duYWZUMyxoPTAsbD0wO2w8aTtsKyspe3ZhciBkPShFPWVbbF0pLl9nZXROQUZQb2ludHModCk7YVtsXT1kLnduZCx1W2xdPWQucG9pbnRzfWZvcihsPWktMTtsPj0xO2wtPTIpe3ZhciBmPWwtMSxwPWw7aWYoMT09PWFbZl0mJjE9PT1hW3BdKXt2YXIgbT1bZVtmXSxudWxsLG51bGwsZVtwXV07MD09PWVbZl0ueS5jbXAoZVtwXS55KT8obVsxXT1lW2ZdLmFkZChlW3BdKSxtWzJdPWVbZl0udG9KKCkubWl4ZWRBZGQoZVtwXS5uZWcoKSkpOjA9PT1lW2ZdLnkuY21wKGVbcF0ueS5yZWROZWcoKSk/KG1bMV09ZVtmXS50b0ooKS5taXhlZEFkZChlW3BdKSxtWzJdPWVbZl0uYWRkKGVbcF0ubmVnKCkpKToobVsxXT1lW2ZdLnRvSigpLm1peGVkQWRkKGVbcF0pLG1bMl09ZVtmXS50b0ooKS5taXhlZEFkZChlW3BdLm5lZygpKSk7dmFyIGc9Wy0zLC0xLC01LC03LDAsNyw1LDEsM10sdj1zKG5bZl0sbltwXSk7aD1NYXRoLm1heCh2WzBdLmxlbmd0aCxoKSxjW2ZdPW5ldyBBcnJheShoKSxjW3BdPW5ldyBBcnJheShoKTtmb3IodmFyIGI9MDtiPGg7YisrKXt2YXIgeT0wfHZbMF1bYl0sXz0wfHZbMV1bYl07Y1tmXVtiXT1nWzMqKHkrMSkrKF8rMSldLGNbcF1bYl09MCx1W2ZdPW19fWVsc2UgY1tmXT1vKG5bZl0sYVtmXSksY1twXT1vKG5bcF0sYVtwXSksaD1NYXRoLm1heChjW2ZdLmxlbmd0aCxoKSxoPU1hdGgubWF4KGNbcF0ubGVuZ3RoLGgpfXZhciB3PXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSx4PXRoaXMuX3duYWZUNDtmb3IobD1oO2w+PTA7bC0tKXtmb3IodmFyIE09MDtsPj0wOyl7dmFyIFM9ITA7Zm9yKGI9MDtiPGk7YisrKXhbYl09MHxjW2JdW2xdLDAhPT14W2JdJiYoUz0hMSk7aWYoIVMpYnJlYWs7TSsrLGwtLX1pZihsPj0wJiZNKyssdz13LmRibHAoTSksbDwwKWJyZWFrO2ZvcihiPTA7YjxpO2IrKyl7dmFyIEUsQT14W2JdOzAhPT1BJiYoQT4wP0U9dVtiXVtBLTE+PjFdOkE8MCYmKEU9dVtiXVstQS0xPj4xXS5uZWcoKSksdz0iYWZmaW5lIj09PUUudHlwZT93Lm1peGVkQWRkKEUpOncuYWRkKEUpKX19Zm9yKGw9MDtsPGk7bCsrKXVbbF09bnVsbDtyZXR1cm4gcj93OncudG9QKCl9LHUuQmFzZVBvaW50PWMsYy5wcm90b3R5cGUuZXE9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpfSx1LnByb3RvdHlwZS5kZWNvZGVQb2ludD1mdW5jdGlvbih0LGUpe3Q9ci50b0FycmF5KHQsZSk7dmFyIG49dGhpcy5wLmJ5dGVMZW5ndGgoKTtpZigoND09PXRbMF18fDY9PT10WzBdfHw3PT09dFswXSkmJnQubGVuZ3RoLTE9PTIqbilyZXR1cm4gNj09PXRbMF0/YSh0W3QubGVuZ3RoLTFdJTI9PTApOjc9PT10WzBdJiZhKHRbdC5sZW5ndGgtMV0lMj09MSksdGhpcy5wb2ludCh0LnNsaWNlKDEsMStuKSx0LnNsaWNlKDErbiwxKzIqbikpO2lmKCgyPT09dFswXXx8Mz09PXRbMF0pJiZ0Lmxlbmd0aC0xPT09bilyZXR1cm4gdGhpcy5wb2ludEZyb21YKHQuc2xpY2UoMSwxK24pLDM9PT10WzBdKTt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcG9pbnQgZm9ybWF0Iil9LGMucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5jb2RlKHQsITApfSxjLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCksbj10aGlzLmdldFgoKS50b0FycmF5KCJiZSIsZSk7cmV0dXJuIHQ/W3RoaXMuZ2V0WSgpLmlzRXZlbigpPzI6M10uY29uY2F0KG4pOls0XS5jb25jYXQobix0aGlzLmdldFkoKS50b0FycmF5KCJiZSIsZSkpfSxjLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5lbmNvZGUodGhpcy5fZW5jb2RlKGUpLHQpfSxjLnByb3RvdHlwZS5wcmVjb21wdXRlPWZ1bmN0aW9uKHQpe2lmKHRoaXMucHJlY29tcHV0ZWQpcmV0dXJuIHRoaXM7dmFyIGU9e2RvdWJsZXM6bnVsbCxuYWY6bnVsbCxiZXRhOm51bGx9O3JldHVybiBlLm5hZj10aGlzLl9nZXROQUZQb2ludHMoOCksZS5kb3VibGVzPXRoaXMuX2dldERvdWJsZXMoNCx0KSxlLmJldGE9dGhpcy5fZ2V0QmV0YSgpLHRoaXMucHJlY29tcHV0ZWQ9ZSx0aGlzfSxjLnByb3RvdHlwZS5faGFzRG91Ymxlcz1mdW5jdGlvbih0KXtpZighdGhpcy5wcmVjb21wdXRlZClyZXR1cm4hMTt2YXIgZT10aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7cmV0dXJuISFlJiZlLnBvaW50cy5sZW5ndGg+PU1hdGguY2VpbCgodC5iaXRMZW5ndGgoKSsxKS9lLnN0ZXApfSxjLnByb3RvdHlwZS5fZ2V0RG91Ymxlcz1mdW5jdGlvbih0LGUpe2lmKHRoaXMucHJlY29tcHV0ZWQmJnRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylyZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO2Zvcih2YXIgbj1bdGhpc10saT10aGlzLHI9MDtyPGU7cis9dCl7Zm9yKHZhciBvPTA7bzx0O28rKylpPWkuZGJsKCk7bi5wdXNoKGkpfXJldHVybntzdGVwOnQscG9pbnRzOm59fSxjLnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzPWZ1bmN0aW9uKHQpe2lmKHRoaXMucHJlY29tcHV0ZWQmJnRoaXMucHJlY29tcHV0ZWQubmFmKXJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtmb3IodmFyIGU9W3RoaXNdLG49KDE8PHQpLTEsaT0xPT09bj9udWxsOnRoaXMuZGJsKCkscj0xO3I8bjtyKyspZVtyXT1lW3ItMV0uYWRkKGkpO3JldHVybnt3bmQ6dCxwb2ludHM6ZX19LGMucHJvdG90eXBlLl9nZXRCZXRhPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGMucHJvdG90eXBlLmRibHA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248dDtuKyspZT1lLmRibCgpO3JldHVybiBlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDQ4KSxyPW4oMTApLG89bigzKSxzPW4oMCksYT1pLmJhc2UsdT1yLnV0aWxzLmFzc2VydDtmdW5jdGlvbiBjKHQpe2EuY2FsbCh0aGlzLCJzaG9ydCIsdCksdGhpcy5hPW5ldyBvKHQuYSwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuYj1uZXcgbyh0LmIsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLnRpbnY9dGhpcy50d28ucmVkSW52bSgpLHRoaXMuemVyb0E9MD09PXRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSx0aGlzLnRocmVlQT0wPT09dGhpcy5hLmZyb21SZWQoKS5zdWIodGhpcy5wKS5jbXBuKC0zKSx0aGlzLmVuZG89dGhpcy5fZ2V0RW5kb21vcnBoaXNtKHQpLHRoaXMuX2VuZG9XbmFmVDE9bmV3IEFycmF5KDQpLHRoaXMuX2VuZG9XbmFmVDI9bmV3IEFycmF5KDQpfWZ1bmN0aW9uIGgodCxlLG4saSl7YS5CYXNlUG9pbnQuY2FsbCh0aGlzLHQsImFmZmluZSIpLG51bGw9PT1lJiZudWxsPT09bj8odGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy5pbmY9ITApOih0aGlzLng9bmV3IG8oZSwxNiksdGhpcy55PW5ldyBvKG4sMTYpLGkmJih0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpLHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLmluZj0hMSl9ZnVuY3Rpb24gbCh0LGUsbixpKXthLkJhc2VQb2ludC5jYWxsKHRoaXMsdCwiamFjb2JpYW4iKSxudWxsPT09ZSYmbnVsbD09PW4mJm51bGw9PT1pPyh0aGlzLng9dGhpcy5jdXJ2ZS5vbmUsdGhpcy55PXRoaXMuY3VydmUub25lLHRoaXMuej1uZXcgbygwKSk6KHRoaXMueD1uZXcgbyhlLDE2KSx0aGlzLnk9bmV3IG8obiwxNiksdGhpcy56PW5ldyBvKGksMTYpKSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueS5yZWR8fCh0aGlzLnk9dGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy56LnJlZHx8KHRoaXMuej10aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnpPbmU9dGhpcy56PT09dGhpcy5jdXJ2ZS5vbmV9cyhjLGEpLHQuZXhwb3J0cz1jLGMucHJvdG90eXBlLl9nZXRFbmRvbW9ycGhpc209ZnVuY3Rpb24odCl7aWYodGhpcy56ZXJvQSYmdGhpcy5nJiZ0aGlzLm4mJjE9PT10aGlzLnAubW9kbigzKSl7dmFyIGUsbjtpZih0LmJldGEpZT1uZXcgbyh0LmJldGEsMTYpLnRvUmVkKHRoaXMucmVkKTtlbHNle3ZhciBpPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO2U9KGU9aVswXS5jbXAoaVsxXSk8MD9pWzBdOmlbMV0pLnRvUmVkKHRoaXMucmVkKX1pZih0LmxhbWJkYSluPW5ldyBvKHQubGFtYmRhLDE2KTtlbHNle3ZhciByPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pOzA9PT10aGlzLmcubXVsKHJbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChlKSk/bj1yWzBdOihuPXJbMV0sdSgwPT09dGhpcy5nLm11bChuKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoZSkpKSl9cmV0dXJue2JldGE6ZSxsYW1iZGE6bixiYXNpczp0LmJhc2lzP3QuYmFzaXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybnthOm5ldyBvKHQuYSwxNiksYjpuZXcgbyh0LmIsMTYpfX0pOnRoaXMuX2dldEVuZG9CYXNpcyhuKX19fSxjLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ9PT10aGlzLnA/dGhpcy5yZWQ6by5tb250KHQpLG49bmV3IG8oMikudG9SZWQoZSkucmVkSW52bSgpLGk9bi5yZWROZWcoKSxyPW5ldyBvKDMpLnRvUmVkKGUpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwobik7cmV0dXJuW2kucmVkQWRkKHIpLmZyb21SZWQoKSxpLnJlZFN1YihyKS5mcm9tUmVkKCldfSxjLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLGkscixzLGEsdSxjLGgsbD10aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkvMikpLGQ9dCxmPXRoaXMubi5jbG9uZSgpLHA9bmV3IG8oMSksbT1uZXcgbygwKSxnPW5ldyBvKDApLHY9bmV3IG8oMSksYj0wOzAhPT1kLmNtcG4oMCk7KXt2YXIgeT1mLmRpdihkKTtjPWYuc3ViKHkubXVsKGQpKSxoPWcuc3ViKHkubXVsKHApKTt2YXIgXz12LnN1Yih5Lm11bChtKSk7aWYoIWkmJmMuY21wKGwpPDApZT11Lm5lZygpLG49cCxpPWMubmVnKCkscj1oO2Vsc2UgaWYoaSYmMj09KytiKWJyZWFrO3U9YyxmPWQsZD1jLGc9cCxwPWgsdj1tLG09X31zPWMubmVnKCksYT1oO3ZhciB3PWkuc3FyKCkuYWRkKHIuc3FyKCkpO3JldHVybiBzLnNxcigpLmFkZChhLnNxcigpKS5jbXAodyk+PTAmJihzPWUsYT1uKSxpLm5lZ2F0aXZlJiYoaT1pLm5lZygpLHI9ci5uZWcoKSkscy5uZWdhdGl2ZSYmKHM9cy5uZWcoKSxhPWEubmVnKCkpLFt7YTppLGI6cn0se2E6cyxiOmF9XX0sYy5wcm90b3R5cGUuX2VuZG9TcGxpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVuZG8uYmFzaXMsbj1lWzBdLGk9ZVsxXSxyPWkuYi5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxvPW4uYi5uZWcoKS5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxzPXIubXVsKG4uYSksYT1vLm11bChpLmEpLHU9ci5tdWwobi5iKSxjPW8ubXVsKGkuYik7cmV0dXJue2sxOnQuc3ViKHMpLnN1YihhKSxrMjp1LmFkZChjKS5uZWcoKX19LGMucHJvdG90eXBlLnBvaW50RnJvbVg9ZnVuY3Rpb24odCxlKXsodD1uZXcgbyh0LDE2KSkucmVkfHwodD10LnRvUmVkKHRoaXMucmVkKSk7dmFyIG49dC5yZWRTcXIoKS5yZWRNdWwodCkucmVkSUFkZCh0LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYiksaT1uLnJlZFNxcnQoKTtpZigwIT09aS5yZWRTcXIoKS5yZWRTdWIobikuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvaW50Iik7dmFyIHI9aS5mcm9tUmVkKCkuaXNPZGQoKTtyZXR1cm4oZSYmIXJ8fCFlJiZyKSYmKGk9aS5yZWROZWcoKSksdGhpcy5wb2ludCh0LGkpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtpZih0LmluZilyZXR1cm4hMDt2YXIgZT10Lngsbj10LnksaT10aGlzLmEucmVkTXVsKGUpLHI9ZS5yZWRTcXIoKS5yZWRNdWwoZSkucmVkSUFkZChpKS5yZWRJQWRkKHRoaXMuYik7cmV0dXJuIDA9PT1uLnJlZFNxcigpLnJlZElTdWIocikuY21wbigwKX0sYy5wcm90b3R5cGUuX2VuZG9XbmFmTXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcy5fZW5kb1duYWZUMSxyPXRoaXMuX2VuZG9XbmFmVDIsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcz10aGlzLl9lbmRvU3BsaXQoZVtvXSksYT10W29dLHU9YS5fZ2V0QmV0YSgpO3MuazEubmVnYXRpdmUmJihzLmsxLmluZWcoKSxhPWEubmVnKCEwKSkscy5rMi5uZWdhdGl2ZSYmKHMuazIuaW5lZygpLHU9dS5uZWcoITApKSxpWzIqb109YSxpWzIqbysxXT11LHJbMipvXT1zLmsxLHJbMipvKzFdPXMuazJ9Zm9yKHZhciBjPXRoaXMuX3duYWZNdWxBZGQoMSxpLHIsMipvLG4pLGg9MDtoPDIqbztoKyspaVtoXT1udWxsLHJbaF09bnVsbDtyZXR1cm4gY30scyhoLGEuQmFzZVBvaW50KSxjLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBoKHRoaXMsdCxlLG4pfSxjLnByb3RvdHlwZS5wb2ludEZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGguZnJvbUpTT04odGhpcyx0LGUpfSxoLnByb3RvdHlwZS5fZ2V0QmV0YT1mdW5jdGlvbigpe2lmKHRoaXMuY3VydmUuZW5kbyl7dmFyIHQ9dGhpcy5wcmVjb21wdXRlZDtpZih0JiZ0LmJldGEpcmV0dXJuIHQuYmV0YTt2YXIgZT10aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLHRoaXMueSk7aWYodCl7dmFyIG49dGhpcy5jdXJ2ZSxpPWZ1bmN0aW9uKHQpe3JldHVybiBuLnBvaW50KHQueC5yZWRNdWwobi5lbmRvLmJldGEpLHQueSl9O3QuYmV0YT1lLGUucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxuYWY6dC5uYWYmJnt3bmQ6dC5uYWYud25kLHBvaW50czp0Lm5hZi5wb2ludHMubWFwKGkpfSxkb3VibGVzOnQuZG91YmxlcyYme3N0ZXA6dC5kb3VibGVzLnN0ZXAscG9pbnRzOnQuZG91Ymxlcy5wb2ludHMubWFwKGkpfX19cmV0dXJuIGV9fSxoLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmVjb21wdXRlZD9bdGhpcy54LHRoaXMueSx0aGlzLnByZWNvbXB1dGVkJiZ7ZG91Ymxlczp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMmJntzdGVwOnRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpfSxuYWY6dGhpcy5wcmVjb21wdXRlZC5uYWYmJnt3bmQ6dGhpcy5wcmVjb21wdXRlZC5uYWYud25kLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSl9fV06W3RoaXMueCx0aGlzLnldfSxoLmZyb21KU09OPWZ1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpO3ZhciBpPXQucG9pbnQoZVswXSxlWzFdLG4pO2lmKCFlWzJdKXJldHVybiBpO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQucG9pbnQoZVswXSxlWzFdLG4pfXZhciBvPWVbMl07cmV0dXJuIGkucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxkb3VibGVzOm8uZG91YmxlcyYme3N0ZXA6by5kb3VibGVzLnN0ZXAscG9pbnRzOltpXS5jb25jYXQoby5kb3VibGVzLnBvaW50cy5tYXAocikpfSxuYWY6by5uYWYmJnt3bmQ6by5uYWYud25kLHBvaW50czpbaV0uY29uY2F0KG8ubmFmLnBvaW50cy5tYXAocikpfX0saX0saC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT8iPEVDIFBvaW50IEluZmluaXR5PiI6IjxFQyBQb2ludCB4OiAiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIiB5OiAiK3RoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIj4ifSxoLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5mfSxoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pbmYpcmV0dXJuIHQ7aWYodC5pbmYpcmV0dXJuIHRoaXM7aWYodGhpcy5lcSh0KSlyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLm5lZygpLmVxKHQpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7aWYoMD09PXRoaXMueC5jbXAodC54KSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciBlPXRoaXMueS5yZWRTdWIodC55KTswIT09ZS5jbXBuKDApJiYoZT1lLnJlZE11bCh0aGlzLngucmVkU3ViKHQueCkucmVkSW52bSgpKSk7dmFyIG49ZS5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1Yih0LngpLGk9ZS5yZWRNdWwodGhpcy54LnJlZFN1YihuKSkucmVkSVN1Yih0aGlzLnkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG4saSl9LGgucHJvdG90eXBlLmRibD1mdW5jdGlvbigpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzO3ZhciB0PXRoaXMueS5yZWRBZGQodGhpcy55KTtpZigwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIGU9dGhpcy5jdXJ2ZS5hLG49dGhpcy54LnJlZFNxcigpLGk9dC5yZWRJbnZtKCkscj1uLnJlZEFkZChuKS5yZWRJQWRkKG4pLnJlZElBZGQoZSkucmVkTXVsKGkpLG89ci5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSkscz1yLnJlZE11bCh0aGlzLngucmVkU3ViKG8pKS5yZWRJU3ViKHRoaXMueSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobyxzKX0saC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnguZnJvbVJlZCgpfSxoLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueS5mcm9tUmVkKCl9LGgucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgbyh0LDE2KSx0aGlzLl9oYXNEb3VibGVzKHQpP3RoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsdCk6dGhpcy5jdXJ2ZS5lbmRvP3RoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFt0aGlzXSxbdF0pOnRoaXMuY3VydmUuX3duYWZNdWwodGhpcyx0KX0saC5wcm90b3R5cGUubXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bdGhpcyxlXSxyPVt0LG5dO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoaSxyKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsaSxyLDIpfSxoLnByb3RvdHlwZS5qbXVsQWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bdGhpcyxlXSxyPVt0LG5dO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoaSxyLCEwKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsaSxyLDIsITApfSxoLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuaW5mPT09dC5pbmYmJih0aGlzLmluZnx8MD09PXRoaXMueC5jbXAodC54KSYmMD09PXRoaXMueS5jbXAodC55KSl9LGgucHJvdG90eXBlLm5lZz1mdW5jdGlvbih0KXtpZih0aGlzLmluZilyZXR1cm4gdGhpczt2YXIgZT10aGlzLmN1cnZlLnBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCkpO2lmKHQmJnRoaXMucHJlY29tcHV0ZWQpe3ZhciBuPXRoaXMucHJlY29tcHV0ZWQsaT1mdW5jdGlvbih0KXtyZXR1cm4gdC5uZWcoKX07ZS5wcmVjb21wdXRlZD17bmFmOm4ubmFmJiZ7d25kOm4ubmFmLnduZCxwb2ludHM6bi5uYWYucG9pbnRzLm1hcChpKX0sZG91YmxlczpuLmRvdWJsZXMmJntzdGVwOm4uZG91Ymxlcy5zdGVwLHBvaW50czpuLmRvdWJsZXMucG9pbnRzLm1hcChpKX19fXJldHVybiBlfSxoLnByb3RvdHlwZS50b0o9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmY/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnksdGhpcy5jdXJ2ZS5vbmUpfSxzKGwsYS5CYXNlUG9pbnQpLGMucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBsKHRoaXMsdCxlLG4pfSxsLnByb3RvdHlwZS50b1A9ZnVuY3Rpb24oKXtpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciB0PXRoaXMuei5yZWRJbnZtKCksZT10LnJlZFNxcigpLG49dGhpcy54LnJlZE11bChlKSxpPXRoaXMueS5yZWRNdWwoZSkucmVkTXVsKHQpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG4saSl9LGwucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsdGhpcy55LnJlZE5lZygpLHRoaXMueil9LGwucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdDtpZih0LmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpczt2YXIgZT10LnoucmVkU3FyKCksbj10aGlzLnoucmVkU3FyKCksaT10aGlzLngucmVkTXVsKGUpLHI9dC54LnJlZE11bChuKSxvPXRoaXMueS5yZWRNdWwoZS5yZWRNdWwodC56KSkscz10LnkucmVkTXVsKG4ucmVkTXVsKHRoaXMueikpLGE9aS5yZWRTdWIociksdT1vLnJlZFN1YihzKTtpZigwPT09YS5jbXBuKDApKXJldHVybiAwIT09dS5jbXBuKDApP3RoaXMuY3VydmUuanBvaW50KG51bGwsbnVsbCxudWxsKTp0aGlzLmRibCgpO3ZhciBjPWEucmVkU3FyKCksaD1jLnJlZE11bChhKSxsPWkucmVkTXVsKGMpLGQ9dS5yZWRTcXIoKS5yZWRJQWRkKGgpLnJlZElTdWIobCkucmVkSVN1YihsKSxmPXUucmVkTXVsKGwucmVkSVN1YihkKSkucmVkSVN1YihvLnJlZE11bChoKSkscD10aGlzLnoucmVkTXVsKHQueikucmVkTXVsKGEpO3JldHVybiB0aGlzLmN1cnZlLmpwb2ludChkLGYscCl9LGwucHJvdG90eXBlLm1peGVkQWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0LnRvSigpO2lmKHQuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXRoaXMueCxpPXQueC5yZWRNdWwoZSkscj10aGlzLnksbz10LnkucmVkTXVsKGUpLnJlZE11bCh0aGlzLnopLHM9bi5yZWRTdWIoaSksYT1yLnJlZFN1YihvKTtpZigwPT09cy5jbXBuKDApKXJldHVybiAwIT09YS5jbXBuKDApP3RoaXMuY3VydmUuanBvaW50KG51bGwsbnVsbCxudWxsKTp0aGlzLmRibCgpO3ZhciB1PXMucmVkU3FyKCksYz11LnJlZE11bChzKSxoPW4ucmVkTXVsKHUpLGw9YS5yZWRTcXIoKS5yZWRJQWRkKGMpLnJlZElTdWIoaCkucmVkSVN1YihoKSxkPWEucmVkTXVsKGgucmVkSVN1YihsKSkucmVkSVN1YihyLnJlZE11bChjKSksZj10aGlzLnoucmVkTXVsKHMpO3JldHVybiB0aGlzLmN1cnZlLmpwb2ludChsLGQsZil9LGwucHJvdG90eXBlLmRibHA9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIHRoaXM7aWYodGhpcy5pc0luZmluaXR5KCkpcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuZGJsKCk7aWYodGhpcy5jdXJ2ZS56ZXJvQXx8dGhpcy5jdXJ2ZS50aHJlZUEpe2Zvcih2YXIgZT10aGlzLG49MDtuPHQ7bisrKWU9ZS5kYmwoKTtyZXR1cm4gZX12YXIgaT10aGlzLmN1cnZlLmEscj10aGlzLmN1cnZlLnRpbnYsbz10aGlzLngscz10aGlzLnksYT10aGlzLnosdT1hLnJlZFNxcigpLnJlZFNxcigpLGM9cy5yZWRBZGQocyk7Zm9yKG49MDtuPHQ7bisrKXt2YXIgaD1vLnJlZFNxcigpLGw9Yy5yZWRTcXIoKSxkPWwucmVkU3FyKCksZj1oLnJlZEFkZChoKS5yZWRJQWRkKGgpLnJlZElBZGQoaS5yZWRNdWwodSkpLHA9by5yZWRNdWwobCksbT1mLnJlZFNxcigpLnJlZElTdWIocC5yZWRBZGQocCkpLGc9cC5yZWRJU3ViKG0pLHY9Zi5yZWRNdWwoZyk7dj12LnJlZElBZGQodikucmVkSVN1YihkKTt2YXIgYj1jLnJlZE11bChhKTtuKzE8dCYmKHU9dS5yZWRNdWwoZCkpLG89bSxhPWIsYz12fXJldHVybiB0aGlzLmN1cnZlLmpwb2ludChvLGMucmVkTXVsKHIpLGEpfSxsLnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLnplcm9BP3RoaXMuX3plcm9EYmwoKTp0aGlzLmN1cnZlLnRocmVlQT90aGlzLl90aHJlZURibCgpOnRoaXMuX2RibCgpfSxsLnByb3RvdHlwZS5femVyb0RibD1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZih0aGlzLnpPbmUpe3ZhciBpPXRoaXMueC5yZWRTcXIoKSxyPXRoaXMueS5yZWRTcXIoKSxvPXIucmVkU3FyKCkscz10aGlzLngucmVkQWRkKHIpLnJlZFNxcigpLnJlZElTdWIoaSkucmVkSVN1YihvKTtzPXMucmVkSUFkZChzKTt2YXIgYT1pLnJlZEFkZChpKS5yZWRJQWRkKGkpLHU9YS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyksYz1vLnJlZElBZGQobyk7Yz0oYz1jLnJlZElBZGQoYykpLnJlZElBZGQoYyksdD11LGU9YS5yZWRNdWwocy5yZWRJU3ViKHUpKS5yZWRJU3ViKGMpLG49dGhpcy55LnJlZEFkZCh0aGlzLnkpfWVsc2V7dmFyIGg9dGhpcy54LnJlZFNxcigpLGw9dGhpcy55LnJlZFNxcigpLGQ9bC5yZWRTcXIoKSxmPXRoaXMueC5yZWRBZGQobCkucmVkU3FyKCkucmVkSVN1YihoKS5yZWRJU3ViKGQpO2Y9Zi5yZWRJQWRkKGYpO3ZhciBwPWgucmVkQWRkKGgpLnJlZElBZGQoaCksbT1wLnJlZFNxcigpLGc9ZC5yZWRJQWRkKGQpO2c9KGc9Zy5yZWRJQWRkKGcpKS5yZWRJQWRkKGcpLHQ9bS5yZWRJU3ViKGYpLnJlZElTdWIoZiksZT1wLnJlZE11bChmLnJlZElTdWIodCkpLnJlZElTdWIoZyksbj0obj10aGlzLnkucmVkTXVsKHRoaXMueikpLnJlZElBZGQobil9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxuKX0sbC5wcm90b3R5cGUuX3RocmVlRGJsPWZ1bmN0aW9uKCl7dmFyIHQsZSxuO2lmKHRoaXMuek9uZSl7dmFyIGk9dGhpcy54LnJlZFNxcigpLHI9dGhpcy55LnJlZFNxcigpLG89ci5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQocikucmVkU3FyKCkucmVkSVN1YihpKS5yZWRJU3ViKG8pO3M9cy5yZWRJQWRkKHMpO3ZhciBhPWkucmVkQWRkKGkpLnJlZElBZGQoaSkucmVkSUFkZCh0aGlzLmN1cnZlLmEpLHU9YS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7dD11O3ZhciBjPW8ucmVkSUFkZChvKTtjPShjPWMucmVkSUFkZChjKSkucmVkSUFkZChjKSxlPWEucmVkTXVsKHMucmVkSVN1Yih1KSkucmVkSVN1YihjKSxuPXRoaXMueS5yZWRBZGQodGhpcy55KX1lbHNle3ZhciBoPXRoaXMuei5yZWRTcXIoKSxsPXRoaXMueS5yZWRTcXIoKSxkPXRoaXMueC5yZWRNdWwobCksZj10aGlzLngucmVkU3ViKGgpLnJlZE11bCh0aGlzLngucmVkQWRkKGgpKTtmPWYucmVkQWRkKGYpLnJlZElBZGQoZik7dmFyIHA9ZC5yZWRJQWRkKGQpLG09KHA9cC5yZWRJQWRkKHApKS5yZWRBZGQocCk7dD1mLnJlZFNxcigpLnJlZElTdWIobSksbj10aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihsKS5yZWRJU3ViKGgpO3ZhciBnPWwucmVkU3FyKCk7Zz0oZz0oZz1nLnJlZElBZGQoZykpLnJlZElBZGQoZykpLnJlZElBZGQoZyksZT1mLnJlZE11bChwLnJlZElTdWIodCkpLnJlZElTdWIoZyl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxuKX0sbC5wcm90b3R5cGUuX2RibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VydmUuYSxlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPWkucmVkU3FyKCkucmVkU3FyKCksbz1lLnJlZFNxcigpLHM9bi5yZWRTcXIoKSxhPW8ucmVkQWRkKG8pLnJlZElBZGQobykucmVkSUFkZCh0LnJlZE11bChyKSksdT1lLnJlZEFkZChlKSxjPSh1PXUucmVkSUFkZCh1KSkucmVkTXVsKHMpLGg9YS5yZWRTcXIoKS5yZWRJU3ViKGMucmVkQWRkKGMpKSxsPWMucmVkSVN1YihoKSxkPXMucmVkU3FyKCk7ZD0oZD0oZD1kLnJlZElBZGQoZCkpLnJlZElBZGQoZCkpLnJlZElBZGQoZCk7dmFyIGY9YS5yZWRNdWwobCkucmVkSVN1YihkKSxwPW4ucmVkQWRkKG4pLnJlZE11bChpKTtyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoaCxmLHApfSxsLnByb3RvdHlwZS50cnBsPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY3VydmUuemVyb0EpcmV0dXJuIHRoaXMuZGJsKCkuYWRkKHRoaXMpO3ZhciB0PXRoaXMueC5yZWRTcXIoKSxlPXRoaXMueS5yZWRTcXIoKSxuPXRoaXMuei5yZWRTcXIoKSxpPWUucmVkU3FyKCkscj10LnJlZEFkZCh0KS5yZWRJQWRkKHQpLG89ci5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQoZSkucmVkU3FyKCkucmVkSVN1Yih0KS5yZWRJU3ViKGkpLGE9KHM9KHM9KHM9cy5yZWRJQWRkKHMpKS5yZWRBZGQocykucmVkSUFkZChzKSkucmVkSVN1YihvKSkucmVkU3FyKCksdT1pLnJlZElBZGQoaSk7dT0odT0odT11LnJlZElBZGQodSkpLnJlZElBZGQodSkpLnJlZElBZGQodSk7dmFyIGM9ci5yZWRJQWRkKHMpLnJlZFNxcigpLnJlZElTdWIobykucmVkSVN1YihhKS5yZWRJU3ViKHUpLGg9ZS5yZWRNdWwoYyk7aD0oaD1oLnJlZElBZGQoaCkpLnJlZElBZGQoaCk7dmFyIGw9dGhpcy54LnJlZE11bChhKS5yZWRJU3ViKGgpO2w9KGw9bC5yZWRJQWRkKGwpKS5yZWRJQWRkKGwpO3ZhciBkPXRoaXMueS5yZWRNdWwoYy5yZWRNdWwodS5yZWRJU3ViKGMpKS5yZWRJU3ViKHMucmVkTXVsKGEpKSk7ZD0oZD0oZD1kLnJlZElBZGQoZCkpLnJlZElBZGQoZCkpLnJlZElBZGQoZCk7dmFyIGY9dGhpcy56LnJlZEFkZChzKS5yZWRTcXIoKS5yZWRJU3ViKG4pLnJlZElTdWIoYSk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGwsZCxmKX0sbC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bmV3IG8odCxlKSx0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsdCl9LGwucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe2lmKCJhZmZpbmUiPT09dC50eXBlKXJldHVybiB0aGlzLmVxKHQudG9KKCkpO2lmKHRoaXM9PT10KXJldHVybiEwO3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXQuei5yZWRTcXIoKTtpZigwIT09dGhpcy54LnJlZE11bChuKS5yZWRJU3ViKHQueC5yZWRNdWwoZSkpLmNtcG4oMCkpcmV0dXJuITE7dmFyIGk9ZS5yZWRNdWwodGhpcy56KSxyPW4ucmVkTXVsKHQueik7cmV0dXJuIDA9PT10aGlzLnkucmVkTXVsKHIpLnJlZElTdWIodC55LnJlZE11bChpKSkuY21wbigwKX0sbC5wcm90b3R5cGUuZXFYVG9QPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuei5yZWRTcXIoKSxuPXQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bChlKTtpZigwPT09dGhpcy54LmNtcChuKSlyZXR1cm4hMDtmb3IodmFyIGk9dC5jbG9uZSgpLHI9dGhpcy5jdXJ2ZS5yZWROLnJlZE11bChlKTs7KXtpZihpLmlhZGQodGhpcy5jdXJ2ZS5uKSxpLmNtcCh0aGlzLmN1cnZlLnApPj0wKXJldHVybiExO2lmKG4ucmVkSUFkZChyKSwwPT09dGhpcy54LmNtcChuKSlyZXR1cm4hMH19LGwucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/IjxFQyBKUG9pbnQgSW5maW5pdHk+IjoiPEVDIEpQb2ludCB4OiAiK3RoaXMueC50b1N0cmluZygxNiwyKSsiIHk6ICIrdGhpcy55LnRvU3RyaW5nKDE2LDIpKyIgejogIit0aGlzLnoudG9TdHJpbmcoMTYsMikrIj4ifSxsLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big0OCkscj1uKDMpLG89bigwKSxzPWkuYmFzZSxhPW4oMTApLnV0aWxzO2Z1bmN0aW9uIHUodCl7cy5jYWxsKHRoaXMsIm1vbnQiLHQpLHRoaXMuYT1uZXcgcih0LmEsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmI9bmV3IHIodC5iLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5pND1uZXcgcig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpLHRoaXMudHdvPW5ldyByKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmEyND10aGlzLmk0LnJlZE11bCh0aGlzLmEucmVkQWRkKHRoaXMudHdvKSl9ZnVuY3Rpb24gYyh0LGUsbil7cy5CYXNlUG9pbnQuY2FsbCh0aGlzLHQsInByb2plY3RpdmUiKSxudWxsPT09ZSYmbnVsbD09PW4/KHRoaXMueD10aGlzLmN1cnZlLm9uZSx0aGlzLno9dGhpcy5jdXJ2ZS56ZXJvKToodGhpcy54PW5ldyByKGUsMTYpLHRoaXMuej1uZXcgcihuLDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSkpfW8odSxzKSx0LmV4cG9ydHM9dSx1LnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10Lm5vcm1hbGl6ZSgpLngsbj1lLnJlZFNxcigpLGk9bi5yZWRNdWwoZSkucmVkQWRkKG4ucmVkTXVsKHRoaXMuYSkpLnJlZEFkZChlKTtyZXR1cm4gMD09PWkucmVkU3FydCgpLnJlZFNxcigpLmNtcChpKX0sbyhjLHMuQmFzZVBvaW50KSx1LnByb3RvdHlwZS5kZWNvZGVQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBvaW50KGEudG9BcnJheSh0LGUpLDEpfSx1LnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgYyh0aGlzLHQsZSl9LHUucHJvdG90eXBlLnBvaW50RnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIGMuZnJvbUpTT04odGhpcyx0KX0sYy5wcm90b3R5cGUucHJlY29tcHV0ZT1mdW5jdGlvbigpe30sYy5wcm90b3R5cGUuX2VuY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFgoKS50b0FycmF5KCJiZSIsdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSl9LGMuZnJvbUpTT049ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGModCxlWzBdLGVbMV18fHQub25lKX0sYy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT8iPEVDIFBvaW50IEluZmluaXR5PiI6IjxFQyBQb2ludCB4OiAiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIiB6OiAiK3RoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIj4ifSxjLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX0sYy5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLGU9dGhpcy54LnJlZFN1Yih0aGlzLnopLnJlZFNxcigpLG49dC5yZWRTdWIoZSksaT10LnJlZE11bChlKSxyPW4ucmVkTXVsKGUucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChuKSkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KGkscil9LGMucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LGMucHJvdG90eXBlLmRpZmZBZGQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLngucmVkQWRkKHRoaXMueiksaT10aGlzLngucmVkU3ViKHRoaXMueikscj10LngucmVkQWRkKHQueiksbz10LngucmVkU3ViKHQueikucmVkTXVsKG4pLHM9ci5yZWRNdWwoaSksYT1lLnoucmVkTXVsKG8ucmVkQWRkKHMpLnJlZFNxcigpKSx1PWUueC5yZWRNdWwoby5yZWRJU3ViKHMpLnJlZFNxcigpKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChhLHUpfSxjLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuY2xvbmUoKSxuPXRoaXMsaT10aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCkscj1bXTswIT09ZS5jbXBuKDApO2UuaXVzaHJuKDEpKXIucHVzaChlLmFuZGxuKDEpKTtmb3IodmFyIG89ci5sZW5ndGgtMTtvPj0wO28tLSkwPT09cltvXT8obj1uLmRpZmZBZGQoaSx0aGlzKSxpPWkuZGJsKCkpOihpPW4uZGlmZkFkZChpLHRoaXMpLG49bi5kYmwoKSk7cmV0dXJuIGl9LGMucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LGMucHJvdG90eXBlLmp1bWxBZGQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZSIpfSxjLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuZ2V0WCgpLmNtcCh0LmdldFgoKSl9LGMucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLng9dGhpcy54LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpc30sYy5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLHRoaXMueC5mcm9tUmVkKCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oNDgpLHI9bigxMCksbz1uKDMpLHM9bigwKSxhPWkuYmFzZSx1PXIudXRpbHMuYXNzZXJ0O2Z1bmN0aW9uIGModCl7dGhpcy50d2lzdGVkPTEhPSgwfHQuYSksdGhpcy5tT25lQT10aGlzLnR3aXN0ZWQmJi0xPT0oMHx0LmEpLHRoaXMuZXh0ZW5kZWQ9dGhpcy5tT25lQSxhLmNhbGwodGhpcywiZWR3YXJkcyIsdCksdGhpcy5hPW5ldyBvKHQuYSwxNikudW1vZCh0aGlzLnJlZC5tKSx0aGlzLmE9dGhpcy5hLnRvUmVkKHRoaXMucmVkKSx0aGlzLmM9bmV3IG8odC5jLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5jMj10aGlzLmMucmVkU3FyKCksdGhpcy5kPW5ldyBvKHQuZCwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuZGQ9dGhpcy5kLnJlZEFkZCh0aGlzLmQpLHUoIXRoaXMudHdpc3RlZHx8MD09PXRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSksdGhpcy5vbmVDPTE9PSgwfHQuYyl9ZnVuY3Rpb24gaCh0LGUsbixpLHIpe2EuQmFzZVBvaW50LmNhbGwodGhpcyx0LCJwcm9qZWN0aXZlIiksbnVsbD09PWUmJm51bGw9PT1uJiZudWxsPT09aT8odGhpcy54PXRoaXMuY3VydmUuemVybyx0aGlzLnk9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXMudD10aGlzLmN1cnZlLnplcm8sdGhpcy56T25lPSEwKToodGhpcy54PW5ldyBvKGUsMTYpLHRoaXMueT1uZXcgbyhuLDE2KSx0aGlzLno9aT9uZXcgbyhpLDE2KTp0aGlzLmN1cnZlLm9uZSx0aGlzLnQ9ciYmbmV3IG8ociwxNiksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnkucmVkfHwodGhpcy55PXRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy50JiYhdGhpcy50LnJlZCYmKHRoaXMudD10aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnpPbmU9dGhpcy56PT09dGhpcy5jdXJ2ZS5vbmUsdGhpcy5jdXJ2ZS5leHRlbmRlZCYmIXRoaXMudCYmKHRoaXMudD10aGlzLngucmVkTXVsKHRoaXMueSksdGhpcy56T25lfHwodGhpcy50PXRoaXMudC5yZWRNdWwodGhpcy56LnJlZEludm0oKSkpKSl9cyhjLGEpLHQuZXhwb3J0cz1jLGMucHJvdG90eXBlLl9tdWxBPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1PbmVBP3QucmVkTmVnKCk6dGhpcy5hLnJlZE11bCh0KX0sYy5wcm90b3R5cGUuX211bEM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub25lQz90OnRoaXMuYy5yZWRNdWwodCl9LGMucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5wb2ludCh0LGUsbixpKX0sYy5wcm90b3R5cGUucG9pbnRGcm9tWD1mdW5jdGlvbih0LGUpeyh0PW5ldyBvKHQsMTYpKS5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgbj10LnJlZFNxcigpLGk9dGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bChuKSkscj10aGlzLm9uZS5yZWRTdWIodGhpcy5jMi5yZWRNdWwodGhpcy5kKS5yZWRNdWwobikpLHM9aS5yZWRNdWwoci5yZWRJbnZtKCkpLGE9cy5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKHMpLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpO3ZhciB1PWEuZnJvbVJlZCgpLmlzT2RkKCk7cmV0dXJuKGUmJiF1fHwhZSYmdSkmJihhPWEucmVkTmVnKCkpLHRoaXMucG9pbnQodCxhKX0sYy5wcm90b3R5cGUucG9pbnRGcm9tWT1mdW5jdGlvbih0LGUpeyh0PW5ldyBvKHQsMTYpKS5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgbj10LnJlZFNxcigpLGk9bi5yZWRTdWIodGhpcy5jMikscj1uLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKSxzPWkucmVkTXVsKHIucmVkSW52bSgpKTtpZigwPT09cy5jbXAodGhpcy56ZXJvKSl7aWYoZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9pbnQiKTtyZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sdCl9dmFyIGE9cy5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKHMpLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpO3JldHVybiBhLmZyb21SZWQoKS5pc09kZCgpIT09ZSYmKGE9YS5yZWROZWcoKSksdGhpcy5wb2ludChhLHQpfSxjLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtpZih0LmlzSW5maW5pdHkoKSlyZXR1cm4hMDt0Lm5vcm1hbGl6ZSgpO3ZhciBlPXQueC5yZWRTcXIoKSxuPXQueS5yZWRTcXIoKSxpPWUucmVkTXVsKHRoaXMuYSkucmVkQWRkKG4pLHI9dGhpcy5jMi5yZWRNdWwodGhpcy5vbmUucmVkQWRkKHRoaXMuZC5yZWRNdWwoZSkucmVkTXVsKG4pKSk7cmV0dXJuIDA9PT1pLmNtcChyKX0scyhoLGEuQmFzZVBvaW50KSxjLnByb3RvdHlwZS5wb2ludEZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBoLmZyb21KU09OKHRoaXMsdCl9LGMucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBuZXcgaCh0aGlzLHQsZSxuLGkpfSxoLmZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBoKHQsZVswXSxlWzFdLGVbMl0pfSxoLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpPyI8RUMgUG9pbnQgSW5maW5pdHk+IjoiPEVDIFBvaW50IHg6ICIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHk6ICIrdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHo6ICIrdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiPiJ9LGgucHJvdG90eXBlLmlzSW5maW5pdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMueC5jbXBuKDApJiYoMD09PXRoaXMueS5jbXAodGhpcy56KXx8dGhpcy56T25lJiYwPT09dGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpKX0saC5wcm90b3R5cGUuX2V4dERibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC5yZWRTcXIoKSxlPXRoaXMueS5yZWRTcXIoKSxuPXRoaXMuei5yZWRTcXIoKTtuPW4ucmVkSUFkZChuKTt2YXIgaT10aGlzLmN1cnZlLl9tdWxBKHQpLHI9dGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIodCkucmVkSVN1YihlKSxvPWkucmVkQWRkKGUpLHM9by5yZWRTdWIobiksYT1pLnJlZFN1YihlKSx1PXIucmVkTXVsKHMpLGM9by5yZWRNdWwoYSksaD1yLnJlZE11bChhKSxsPXMucmVkTXVsKG8pO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHUsYyxsLGgpfSxoLnByb3RvdHlwZS5fcHJvakRibD1mdW5jdGlvbigpe3ZhciB0LGUsbixpPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKSxyPXRoaXMueC5yZWRTcXIoKSxvPXRoaXMueS5yZWRTcXIoKTtpZih0aGlzLmN1cnZlLnR3aXN0ZWQpe3ZhciBzPShjPXRoaXMuY3VydmUuX211bEEocikpLnJlZEFkZChvKTtpZih0aGlzLnpPbmUpdD1pLnJlZFN1YihyKS5yZWRTdWIobykucmVkTXVsKHMucmVkU3ViKHRoaXMuY3VydmUudHdvKSksZT1zLnJlZE11bChjLnJlZFN1YihvKSksbj1zLnJlZFNxcigpLnJlZFN1YihzKS5yZWRTdWIocyk7ZWxzZXt2YXIgYT10aGlzLnoucmVkU3FyKCksdT1zLnJlZFN1YihhKS5yZWRJU3ViKGEpO3Q9aS5yZWRTdWIocikucmVkSVN1YihvKS5yZWRNdWwodSksZT1zLnJlZE11bChjLnJlZFN1YihvKSksbj1zLnJlZE11bCh1KX19ZWxzZXt2YXIgYz1yLnJlZEFkZChvKTthPXRoaXMuY3VydmUuX211bEModGhpcy56KS5yZWRTcXIoKSx1PWMucmVkU3ViKGEpLnJlZFN1YihhKTt0PXRoaXMuY3VydmUuX211bEMoaS5yZWRJU3ViKGMpKS5yZWRNdWwodSksZT10aGlzLmN1cnZlLl9tdWxDKGMpLnJlZE11bChyLnJlZElTdWIobykpLG49Yy5yZWRNdWwodSl9cmV0dXJuIHRoaXMuY3VydmUucG9pbnQodCxlLG4pfSxoLnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dERibCgpOnRoaXMuX3Byb2pEYmwoKX0saC5wcm90b3R5cGUuX2V4dEFkZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHQueS5yZWRTdWIodC54KSksbj10aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHQueS5yZWRBZGQodC54KSksaT10aGlzLnQucmVkTXVsKHRoaXMuY3VydmUuZGQpLnJlZE11bCh0LnQpLHI9dGhpcy56LnJlZE11bCh0LnoucmVkQWRkKHQueikpLG89bi5yZWRTdWIoZSkscz1yLnJlZFN1YihpKSxhPXIucmVkQWRkKGkpLHU9bi5yZWRBZGQoZSksYz1vLnJlZE11bChzKSxoPWEucmVkTXVsKHUpLGw9by5yZWRNdWwodSksZD1zLnJlZE11bChhKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChjLGgsZCxsKX0saC5wcm90b3R5cGUuX3Byb2pBZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMuei5yZWRNdWwodC56KSxyPWkucmVkU3FyKCksbz10aGlzLngucmVkTXVsKHQueCkscz10aGlzLnkucmVkTXVsKHQueSksYT10aGlzLmN1cnZlLmQucmVkTXVsKG8pLnJlZE11bChzKSx1PXIucmVkU3ViKGEpLGM9ci5yZWRBZGQoYSksaD10aGlzLngucmVkQWRkKHRoaXMueSkucmVkTXVsKHQueC5yZWRBZGQodC55KSkucmVkSVN1YihvKS5yZWRJU3ViKHMpLGw9aS5yZWRNdWwodSkucmVkTXVsKGgpO3JldHVybiB0aGlzLmN1cnZlLnR3aXN0ZWQ/KGU9aS5yZWRNdWwoYykucmVkTXVsKHMucmVkU3ViKHRoaXMuY3VydmUuX211bEEobykpKSxuPXUucmVkTXVsKGMpKTooZT1pLnJlZE11bChjKS5yZWRNdWwocy5yZWRTdWIobykpLG49dGhpcy5jdXJ2ZS5fbXVsQyh1KS5yZWRNdWwoYykpLHRoaXMuY3VydmUucG9pbnQobCxlLG4pfSxoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP3Q6dC5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dEFkZCh0KTp0aGlzLl9wcm9qQWRkKHQpfSxoLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hhc0RvdWJsZXModCk/dGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcyx0KTp0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsdCl9LGgucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxuXSwyLCExKX0saC5wcm90b3R5cGUuam11bEFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxuXSwyLCEwKX0saC5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7aWYodGhpcy56T25lKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuei5yZWRJbnZtKCk7cmV0dXJuIHRoaXMueD10aGlzLngucmVkTXVsKHQpLHRoaXMueT10aGlzLnkucmVkTXVsKHQpLHRoaXMudCYmKHRoaXMudD10aGlzLnQucmVkTXVsKHQpKSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56T25lPSEwLHRoaXN9LGgucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSx0aGlzLnksdGhpcy56LHRoaXMudCYmdGhpcy50LnJlZE5lZygpKX0saC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLHRoaXMueC5mcm9tUmVkKCl9LGgucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnkuZnJvbVJlZCgpfSxoLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fDA9PT10aGlzLmdldFgoKS5jbXAodC5nZXRYKCkpJiYwPT09dGhpcy5nZXRZKCkuY21wKHQuZ2V0WSgpKX0saC5wcm90b3R5cGUuZXFYVG9QPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh0aGlzLnopO2lmKDA9PT10aGlzLnguY21wKGUpKXJldHVybiEwO2Zvcih2YXIgbj10LmNsb25lKCksaT10aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7Oyl7aWYobi5pYWRkKHRoaXMuY3VydmUubiksbi5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihlLnJlZElBZGQoaSksMD09PXRoaXMueC5jbXAoZSkpcmV0dXJuITB9fSxoLnByb3RvdHlwZS50b1A9aC5wcm90b3R5cGUubm9ybWFsaXplLGgucHJvdG90eXBlLm1peGVkQWRkPWgucHJvdG90eXBlLmFkZH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPWUsbz1uKDcwKSxzPW4oMTApLGE9cy51dGlscy5hc3NlcnQ7ZnVuY3Rpb24gdSh0KXsic2hvcnQiPT09dC50eXBlP3RoaXMuY3VydmU9bmV3IHMuY3VydmUuc2hvcnQodCk6ImVkd2FyZHMiPT09dC50eXBlP3RoaXMuY3VydmU9bmV3IHMuY3VydmUuZWR3YXJkcyh0KTp0aGlzLmN1cnZlPW5ldyBzLmN1cnZlLm1vbnQodCksdGhpcy5nPXRoaXMuY3VydmUuZyx0aGlzLm49dGhpcy5jdXJ2ZS5uLHRoaXMuaGFzaD10Lmhhc2gsYSh0aGlzLmcudmFsaWRhdGUoKSwiSW52YWxpZCBjdXJ2ZSIpLGEodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwiSW52YWxpZCBjdXJ2ZSwgRypOICE9IE8iKX1mdW5jdGlvbiBjKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsdCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIG49bmV3IHUoZSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59KSxufX0pfXIuUHJlc2V0Q3VydmU9dSxjKCJwMTkyIix7dHlwZToic2hvcnQiLHByaW1lOiJwMTkyIixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIsYToiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxIixuOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMSIsaGFzaDpvLnNoYTI1NixnUmVkOiExLGc6WyIxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMiIsIjA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExIl19KSxjKCJwMjI0Iix7dHlwZToic2hvcnQiLHByaW1lOiJwMjI0IixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIsYToiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUiLGI6ImI0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0IixuOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCIsaGFzaDpvLnNoYTI1NixnUmVkOiExLGc6WyJiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMSIsImJkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0Il19KSxjKCJwMjU2Iix7dHlwZToic2hvcnQiLHByaW1lOm51bGwscDoiZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYiLGE6ImZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjIixiOiI1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YiIsbjoiZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTEiLGhhc2g6by5zaGEyNTYsZ1JlZDohMSxnOlsiNmIxN2QxZjIgZTEyYzQyNDcgZjhiY2U2ZTUgNjNhNDQwZjIgNzcwMzdkODEgMmRlYjMzYTAgZjRhMTM5NDUgZDg5OGMyOTYiLCI0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNSJdfSksYygicDM4NCIse3R5cGU6InNob3J0IixwcmltZTpudWxsLHA6ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIixhOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYyIsYjoiYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYiLG46ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczIixoYXNoOm8uc2hhMzg0LGdSZWQ6ITEsZzpbImFhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4IDU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3IiwiMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYiXX0pLGMoInA1MjEiLHt0eXBlOiJzaG9ydCIscHJpbWU6bnVsbCxwOiIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiIsYToiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViIDk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkIDNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwIixuOiIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCBmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOSIsaGFzaDpvLnNoYTUxMixnUmVkOiExLGc6WyIwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyBhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NiIsIjAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5IDU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxIDNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwIl19KSxjKCJjdXJ2ZTI1NTE5Iix7dHlwZToibW9udCIscHJpbWU6InAyNTUxOSIscDoiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIsYToiNzZkMDYiLGI6IjEiLG46IjEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQiLGhhc2g6by5zaGEyNTYsZ1JlZDohMSxnOlsiOSJdfSksYygiZWQyNTUxOSIse3R5cGU6ImVkd2FyZHMiLHByaW1lOiJwMjU1MTkiLHA6IjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiLGE6Ii0xIixjOiIxIixkOiI1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzIixuOiIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkIixoYXNoOm8uc2hhMjU2LGdSZWQ6ITEsZzpbIjIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEiLCI2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4Il19KTt0cnl7aT1uKDIwMSl9Y2F0Y2godCl7aT12b2lkIDB9Yygic2VjcDI1NmsxIix7dHlwZToic2hvcnQiLHByaW1lOiJrMjU2IixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIsYToiMCIsYjoiNyIsbjoiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEiLGg6IjEiLGhhc2g6by5zaGEyNTYsYmV0YToiN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZSIsbGFtYmRhOiI1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyIixiYXNpczpbe2E6IjMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1IixiOiItZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMifSx7YToiMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4IixiOiIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSJ9XSxnUmVkOiExLGc6WyI3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4IiwiNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCIsaV19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLnNoYTE9bigxOTYpLGUuc2hhMjI0PW4oMTk3KSxlLnNoYTI1Nj1uKDEwOCksZS5zaGEzODQ9bigxOTgpLGUuc2hhNTEyPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMzQpLG89bigxMDcpLHM9aS5yb3RsMzIsYT1pLnN1bTMyLHU9aS5zdW0zMl81LGM9by5mdF8xLGg9ci5CbG9ja0hhc2gsbD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml07ZnVuY3Rpb24gZCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGQpKXJldHVybiBuZXcgZDtoLmNhbGwodGhpcyksdGhpcy5oPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0sdGhpcy5XPW5ldyBBcnJheSg4MCl9aS5pbmhlcml0cyhkLGgpLHQuZXhwb3J0cz1kLGQuYmxvY2tTaXplPTUxMixkLm91dFNpemU9MTYwLGQuaG1hY1N0cmVuZ3RoPTgwLGQucGFkTGVuZ3RoPTY0LGQucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5XLGk9MDtpPDE2O2krKyluW2ldPXRbZStpXTtmb3IoO2k8bi5sZW5ndGg7aSsrKW5baV09cyhuW2ktM11ebltpLThdXm5baS0xNF1ebltpLTE2XSwxKTt2YXIgcj10aGlzLmhbMF0sbz10aGlzLmhbMV0saD10aGlzLmhbMl0sZD10aGlzLmhbM10sZj10aGlzLmhbNF07Zm9yKGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHA9fn4oaS8yMCksbT11KHMociw1KSxjKHAsbyxoLGQpLGYsbltpXSxsW3BdKTtmPWQsZD1oLGg9cyhvLDMwKSxvPXIscj1tfXRoaXMuaFswXT1hKHRoaXMuaFswXSxyKSx0aGlzLmhbMV09YSh0aGlzLmhbMV0sbyksdGhpcy5oWzJdPWEodGhpcy5oWzJdLGgpLHRoaXMuaFszXT1hKHRoaXMuaFszXSxkKSx0aGlzLmhbNF09YSh0aGlzLmhbNF0sZil9LGQucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuImhleCI9PT10P2kudG9IZXgzMih0aGlzLmgsImJpZyIpOmkuc3BsaXQzMih0aGlzLmgsImJpZyIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTA4KTtmdW5jdGlvbiBvKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvO3IuY2FsbCh0aGlzKSx0aGlzLmg9WzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdfWkuaW5oZXJpdHMobyxyKSx0LmV4cG9ydHM9byxvLmJsb2NrU2l6ZT01MTIsby5vdXRTaXplPTIyNCxvLmhtYWNTdHJlbmd0aD0xOTIsby5wYWRMZW5ndGg9NjQsby5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4iaGV4Ij09PXQ/aS50b0hleDMyKHRoaXMuaC5zbGljZSgwLDcpLCJiaWciKTppLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsNyksImJpZyIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTA5KTtmdW5jdGlvbiBvKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvO3IuY2FsbCh0aGlzKSx0aGlzLmg9WzM0MTgwNzAzNjUsMzIzODM3MTAzMiwxNjU0MjcwMjUwLDkxNDE1MDY2MywyNDM4NTI5MzcwLDgxMjcwMjk5OSwzNTU0NjIzNjAsNDE0NDkxMjY5NywxNzMxNDA1NDE1LDQyOTA3NzU4NTcsMjM5NDE4MDIzMSwxNzUwNjAzMDI1LDM2NzUwMDg1MjUsMTY5NDA3NjgzOSwxMjAzMDYyODEzLDMyMDQwNzU0MjhdfWkuaW5oZXJpdHMobyxyKSx0LmV4cG9ydHM9byxvLmJsb2NrU2l6ZT0xMDI0LG8ub3V0U2l6ZT0zODQsby5obWFjU3RyZW5ndGg9MTkyLG8ucGFkTGVuZ3RoPTEyOCxvLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVybiJoZXgiPT09dD9pLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsMTIpLCJiaWciKTppLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsMTIpLCJiaWciKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigxNykscj1uKDM0KSxvPWkucm90bDMyLHM9aS5zdW0zMixhPWkuc3VtMzJfMyx1PWkuc3VtMzJfNCxjPXIuQmxvY2tIYXNoO2Z1bmN0aW9uIGgoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBoKSlyZXR1cm4gbmV3IGg7Yy5jYWxsKHRoaXMpLHRoaXMuaD1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdLHRoaXMuZW5kaWFuPSJsaXR0bGUifWZ1bmN0aW9uIGwodCxlLG4saSl7cmV0dXJuIHQ8PTE1P2Vebl5pOnQ8PTMxP2Umbnx+ZSZpOnQ8PTQ3PyhlfH5uKV5pOnQ8PTYzP2UmaXxuJn5pOmVeKG58fmkpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIHQ8PTE1PzA6dDw9MzE/MTUxODUwMDI0OTp0PD00Nz8xODU5Nzc1MzkzOnQ8PTYzPzI0MDA5NTk3MDg6Mjg0MDg1MzgzOH1mdW5jdGlvbiBmKHQpe3JldHVybiB0PD0xNT8xMzUyODI5OTI2OnQ8PTMxPzE1NDg2MDM2ODQ6dDw9NDc/MTgzNjA3MjY5MTp0PD02Mz8yMDUzOTk0MjE3OjB9aS5pbmhlcml0cyhoLGMpLGUucmlwZW1kMTYwPWgsaC5ibG9ja1NpemU9NTEyLGgub3V0U2l6ZT0xNjAsaC5obWFjU3RyZW5ndGg9MTkyLGgucGFkTGVuZ3RoPTY0LGgucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5oWzBdLGk9dGhpcy5oWzFdLHI9dGhpcy5oWzJdLGM9dGhpcy5oWzNdLGg9dGhpcy5oWzRdLGI9bix5PWksXz1yLHc9Yyx4PWgsTT0wO008ODA7TSsrKXt2YXIgUz1zKG8odShuLGwoTSxpLHIsYyksdFtwW01dK2VdLGQoTSkpLGdbTV0pLGgpO249aCxoPWMsYz1vKHIsMTApLHI9aSxpPVMsUz1zKG8odShiLGwoNzktTSx5LF8sdyksdFttW01dK2VdLGYoTSkpLHZbTV0pLHgpLGI9eCx4PXcsdz1vKF8sMTApLF89eSx5PVN9Uz1hKHRoaXMuaFsxXSxyLHcpLHRoaXMuaFsxXT1hKHRoaXMuaFsyXSxjLHgpLHRoaXMuaFsyXT1hKHRoaXMuaFszXSxoLGIpLHRoaXMuaFszXT1hKHRoaXMuaFs0XSxuLHkpLHRoaXMuaFs0XT1hKHRoaXMuaFswXSxpLF8pLHRoaXMuaFswXT1TfSxoLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVybiJoZXgiPT09dD9pLnRvSGV4MzIodGhpcy5oLCJsaXR0bGUiKTppLnNwbGl0MzIodGhpcy5oLCJsaXR0bGUiKX07dmFyIHA9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10sbT1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxnPVsxMSwxNCwxNSwxMiw1LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSx2PVs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE3KSxyPW4oMTQpO2Z1bmN0aW9uIG8odCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0LGUsbik7dGhpcy5IYXNoPXQsdGhpcy5ibG9ja1NpemU9dC5ibG9ja1NpemUvOCx0aGlzLm91dFNpemU9dC5vdXRTaXplLzgsdGhpcy5pbm5lcj1udWxsLHRoaXMub3V0ZXI9bnVsbCx0aGlzLl9pbml0KGkudG9BcnJheShlLG4pKX10LmV4cG9ydHM9byxvLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt0Lmxlbmd0aD50aGlzLmJsb2NrU2l6ZSYmKHQ9KG5ldyB0aGlzLkhhc2gpLnVwZGF0ZSh0KS5kaWdlc3QoKSkscih0Lmxlbmd0aDw9dGhpcy5ibG9ja1NpemUpO2Zvcih2YXIgZT10Lmxlbmd0aDtlPHRoaXMuYmxvY2tTaXplO2UrKyl0LnB1c2goMCk7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdXj01NDtmb3IodGhpcy5pbm5lcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpLGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdXj0xMDY7dGhpcy5vdXRlcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpfSxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUodCxlKSx0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2RvdWJsZXM6e3N0ZXA6NCxwb2ludHM6W1siZTYwZmNlOTNiNTllOWVjNTMwMTFhYWJjMjFjMjNlOTdiMmEzMTM2OWI4N2E1YWU5YzQ0ZWU4OWUyYTZkZWMwYSIsImY3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEiXSxbIjgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgiLCIxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmIl0sWyIxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5IiwiZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NSJdLFsiMzYzZDkwZDQ0N2IwMGM5Yzk5Y2VhYzA1YjYyNjJlZTA1MzQ0MWM3ZTU1NTUyZmZlNTI2YmFkOGY4M2ZmNDY0MCIsIjRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOSJdLFsiOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYyIsIjRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYiXSxbIjcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEiLCI5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmIl0sWyJlZWJmYTRkNDkzYmViZjk4YmE1ZmVlYzgxMmMyZDNiNTA5NDc5NjEyMzdhOTE5ODM5YTUzM2VjYTBlN2RkN2ZhIiwiNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OSJdLFsiMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCIsImNkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDkiXSxbImUxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQiLCI5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkIl0sWyJmZWVhNmNhZTQ2ZDU1YjUzMGFjMjgzOWYxNDNiZDdlYzVjZjhiMjY2YTQxZDZhZjUyZDVlNjg4ZDkwOTQ2OTZkIiwiZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCJdLFsiZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMSIsIjliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQiXSxbIjUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAiLCI1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4Il0sWyI4ZTdiY2QwYmQzNTk4M2E3NzE5Y2NhNzc2NGNhOTA2Nzc5YjUzYTA0M2E5YjhiY2FlZmY5NTlmNDNhZDg2MDQ3IiwiMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYSJdLFsiMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MiIsIjI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMiXSxbIjZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNyIsIjdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAiXSxbIjMzMjJkNDAxMjQzYzRlMjU4MmEyMTQ3YzEwNGQ2ZWNiZjc3NGQxNjNkYjBmNWU1MzEzYjdlMGU3NDJkMGU2YmQiLCI1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwIl0sWyI4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzIiwiN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNiJdLFsiOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhIiwiNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OSJdLFsiNjI2MGNlN2Y0NjE4MDFjMzRmMDY3Y2UwZjAyODczYThmMWIwZTQ0ZGZjNjk3NTJhY2NlY2Q4MTlmMzhmZDhlOCIsImJjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTciXSxbImU1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQiLCI0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhIl0sWyJlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1IiwiN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCJdLFsiMjEzYzdhNzE1Y2Q1ZDQ1MzU4ZDBiYmY5ZGMwY2UwMjIwNGIxMGJkZGUyYTNmNTg1NDBhZDY5MDhkMDU1OTc1NCIsIjRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjIiXSxbIjRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MiLCIxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2Il0sWyJmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2IiwiNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZiJdLFsiNzZlNjQxMTNmNjc3Y2YwZTEwYTI1NzBkNTk5OTY4ZDMxNTQ0ZTE3OWI3NjA0MzI5NTJjMDJhNDQxN2JkZGUzOSIsImM5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEiXSxbImM3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEiLCI4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzIl0sWyJkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiIiwiZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZiJdLFsiYjhkYTk0MDMyYTk1NzUxOGViMGY2NDMzNTcxZTg3NjFjZWZmYzczNjkzZTg0ZWRkNDkxNTBhNTY0ZjY3NmUwMyIsIjI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTciXSxbImU4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQiLCJlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4Il0sWyJhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwIiwiNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMSJdLFsiOTBhZDg1YjM4OWQ2YjkzNjQ2M2Y5ZDA1MTI2NzhkZTIwOGNjMzMwYjExMzA3ZmZmYWI3YWM2M2UzZmIwNGVkNCIsImU1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCJdLFsiOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYSIsIjY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODIiXSxbImU0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEiLCIxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjIl0sWyI4YzAwZmE5YjE4ZWJmMzMxZWI5NjE1MzdhNDVhNDI2NmM3MDM0ZjJmMGQ0ZTFkMDcxNmZiNmVhZTIwZWFlMjllIiwiZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YiJdLFsiZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MSIsIjJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEiXSxbImI2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYiLCI2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUiXSxbImQ2OGE4MGM4MjgwYmI4NDA3OTMyMzRhYTExOGYwNjIzMWQ2ZjFmYzY3ZTczYzVhNWRlZGEwZjViNDk2OTQzZTgiLCJkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwIl0sWyIzMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkIiwiNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCJdLFsiNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NiIsIjM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkIl0sWyI5YzM5MTlhODRhNDc0ODcwZmFlZDhhOWMxY2M2NjAyMTUyMzQ4OTA1NGQ3ZjAzMDhjYmZjOTljOGFjMWY5OGNkIiwiZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCJdLFsiNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNSIsIjlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgiXSxbImE1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYiLCI0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4Il0sWyI3Nzc4YTc4YzI4ZGVjM2UzMGEwNWZlOTYyOWRlOGMzOGJiMzBkMWY1Y2Y5YTNhMjA4Zjc2Mzg4OWJlNThhZDcxIiwiMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYyJdLFsiOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjIiwiYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZiJdLFsiODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MSIsIjFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjIiXSxbImZmMmIwZGNlOTdlZWNlOTdjMWM5YjYwNDE3OThiODVkZmRmYjZkODg4MmRhMjAzMDhmNTQwNDgyNDUyNjA4N2UiLCI0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3Il0sWyI4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxIiwiYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYyJdLFsiZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMyIsImJlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QiXSxbImU0YTQyZDQzYzVjZjE2OWQ5MzkxZGY2ZGVjZjQyZWU1NDFiNmQ4ZjBjOWExMzc0MDFlMjM2MzJkZGEzNGQyNGYiLCI0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0Il0sWyIxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5IiwiYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCJdLFsiMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZSIsImIzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAiXSxbImZhNTBjMGY2MWQyMmU1ZjA3ZTNhY2ViYjFhYTA3YjEyOGQwMDEyMjA5YTI4Yjk3NzZkNzZhODc5MzE4MGVlZjkiLCI2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExIl0sWyJkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyIiwiODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSJdLFsiYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMyIsIjdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMiXSxbIjE3NGE1M2I5YzlhMjg1ODcyZDM5ZTU2ZTY5MTNjYWIxNWQ1OWIxZmE1MTI1MDhjMDIyZjM4MmRlODMxOTQ5N2MiLCJjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczIl0sWyI5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhIiwiMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCJdLFsiZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MSIsImU4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUiXSxbIjY0NTg3ZTIzMzU0NzFlYjg5MGVlNzg5NmQ3Y2ZkYzg2NmJhY2JkYmQzODM5MzE3YjM0MzZmOWI0NTYxN2UwNzMiLCJkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5Il0sWyI4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4IiwiMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSJdLFsiMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YiIsIjY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjciXSxbImJjNGE5ZGY1YjcxM2ZlMmU5YWVmNDMwYmNjMWRjOTdhMGNkOWNjZWRlMmYyODU4OGNhZGEzYTBkMmQ4M2YzNjYiLCJkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEiXSxbIjhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEiLCI0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyIl0sWyI4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAiLCI2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1Il0sWyJkZDM2MjVmYWVmNWJhMDYwNzQ2Njk3MTZiYmQzNzg4ZDg5YmRkZTgxNTk1OTk2ODA5MmY3NmNjNGViOWE5Nzg3IiwiN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MyJdLFsiZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZSIsImVhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODIiXV19LG5hZjp7d25kOjcscG9pbnRzOltbImY5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjkiLCIzODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyIl0sWyIyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0IiwiZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNiJdLFsiNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYyIsIjZhZWJjYTQwYmEyNTU5NjBhMzE3OGQ2ZDg2MWE1NGRiYTgxM2QwYjgxM2ZkZTdiNWE1MDgyNjI4MDg3MjY0ZGEiXSxbImFjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUiLCJjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3Il0sWyI3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiIiwiZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYiJdLFsiZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCIsImFiMDkwMmU4ZDg4MGE4OTc1ODIxMmViNjVjZGFmNDczYTFhMDZkYTUyMWZhOTFmMjliNWNiNTJkYjAzZWQ4MSJdLFsiZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZSIsIjU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgiXSxbImRlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQiLCI0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3Il0sWyIyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjIiwiODVlODliYzAzNzk0NWQ5M2IzNDMwODNiNWExYzg2MTMxYTAxZjYwYzUwMjY5NzYzYjU3MGM4NTRlNWMwOWI3YSJdLFsiMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNSIsIjMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMiXSxbIjJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YiLCIyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjciXSxbIjkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQiLCI3MzAxNmY3YmYyMzRhYWRlNWQxYWE3MWJkZWEyYjFmZjNmYzBkZTJhODg3OTEyZmZlNTRhMzJjZTk3Y2IzNDAyIl0sWyJkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5IiwiYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NSJdLFsiYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYiIsIjIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODIiXSxbIjZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQiLCJlMDIyY2Y0MmMyYmQ0YTcwOGIzZjUxMjZmMTZhMjRhZDhiMzNiYTQ4ZDA0MjNiNmVmZDVlNjM0ODEwMGQ4YTgyIl0sWyIxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1IiwiYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NiJdLFsiNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OSIsIjI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OSJdLFsiNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCIsIjgwZmMwNmJkOGNjNWIwMTA5ODA4OGExOTUwZWVkMGRiMDFhYTEzMjk2N2FiNDcyMjM1ZjU2NDI0ODNiMjVlYWYiXSxbIjgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYiLCIxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhIl0sWyI3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiIiwiZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3Il0sWyJkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5IiwiZWVjZjQxMjUzMTM2ZTVmOTk5NjZmMjE4ODFmZDY1NmViYzQzNDU0MDVjNTIwZGJjMDYzNDY1YjUyMTQwOTkzMyJdLFsiNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzIiwiNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YSJdLFsiNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCIsIjk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYiXSxbImYyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAiLCJlMGRlZGM5YjNiMmY4ZGFkNGRhMWYzMmRlYzI1MzFkZjllYjVmYmViMDU5OGU0ZmQxYTExN2RiYTcwM2EzYzM3Il0sWyI0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViIiwiNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZSJdLFsiZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NyIsImNlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYiXSxbImNhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEiLCJjYjQ3NDY2MGVmMzVmNWYyYTQxYjY0M2ZhNWU0NjA1NzVmNGZhOWI3OTYyMjMyYTVjMzJmOTA4MzE4YTA0NDc2Il0sWyIyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwIiwiNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCJdLFsiNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNSIsIjkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MSJdLFsiNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCIsIjY3M2ZiODZlNWJkYTMwZmIzY2QwZWQzMDRlYTQ5YTAyM2VlMzNkMDE5N2E2OTVkMGM1ZDk4MDkzYzUzNjY4MyJdLFsiZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCIsIjU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUiXSxbIjE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWIiLCIzYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiIl0sWyJkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmIiwiNTVlYjJkYWZkODRkNmNjZDVmODYyYjc4NWRjMzlkNGFiMTU3MjIyNzIwZWY5ZGEyMTdiOGM0NWNmMmJhMjQxNyJdLFsiNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MyIsImVmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgiXSxbIjI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEiLCJlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhIl0sWyJhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1IiwiZjk4YTNmZDgzMWViMmI3NDlhOTNiMGU2ZjM1Y2ZiNDBjOGNkNWFhNjY3YTE1NTgxYmMyZmVkZWQ0OThmZDljNiJdLFsiNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YSIsIjc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYiXSxbIjU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UiLCJjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlIl0sWyJmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4IiwiZTEzODE3YjQ0ZWUxNGRlNjYzYmY0YmM4MDgzNDFmMzI2OTQ5ZTIxYTZhNzVjMjU3MDc3ODQxOWJkYWY1NzMzZCJdLFsiNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYyIsIjMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTIiXSxbIjk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTkiLCJlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlIl0sWyI3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiIiwiMTAwYjYxMGVjNGZmYjQ3NjBkNWMxZmMxMzNlZjZmNmIxMjUwN2EwNTFmMDRhYzU3NjBhZmE1YjI5ZGI4MzQzNyJdLFsiMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYSIsImVmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEiXSxbImQzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYiLCI4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0Il0sWyIxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwIiwiNjg2NTFjZjliNmRhOTAzZTA5MTQ0NDhjNmNkOWQ0Y2E4OTY4NzhmNTI4MmJlNGM4Y2MwNmUyYTQwNDA3ODU3NSJdLFsiNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCIsImY1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQiXSxbIjE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMiLCJkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkIl0sWyJhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwIiwiZWRkNzdmNTBiY2I1YTNjYWIyZTkwNzM3MzA5NjY3ZjI2NDE0NjJhNTQwNzBmM2Q1MTkyMTJkMzljMTk3YTYyOSJdLFsiZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCIsImE4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNiJdLFsiMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMyIsIjY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQiXSxbIjM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYiLCI5NDE0Njg1ZTk3YjFiNTk1NGJkNDZmNzMwMTc0MTM2ZDU3ZjFjZWViNDg3NDQzZGM1MzIxODU3YmE3M2FiZWUiXSxbImYyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMiLCI0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxIl0sWyJkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4IiwiZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYiJdLFsiMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZiIsIjVmMzAzMmY1ODkyMTU2ZTM5Y2NkM2Q3OTE1YjllMWRhMmU2ZGFjOWU2ZjI2ZTk2MTExOGQxNGI4NDYyZTE2NjEiXSxbIjc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUiLCI4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2Il0sWyJlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2IiwiOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZSJdLFsiMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNSIsIjVlNDYzMTE1MGU2MmZiNDBkMGU4YzJhN2NhNTgwNGEzOWQ1ODE4NmE1MGU0OTcxMzk2MjY3NzhlMjViMDY3NGQiXSxbImVhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTkiLCJmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjIl0sWyI3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEiLCJmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0Il0sWyI0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1IiwiNDIyNDJhOTY5MjgzYTVmMzM5YmE3ZjA3NWUzNmJhMmFmOTI1Y2UzMGQ3NjdlZDZlNTVmNGIwMzE4ODBkNTYyYyJdLFsiYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNSIsIjIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmIiXSxbImM0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTciLCI0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMiXSxbIjg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEiLCI3Mzg2N2Y1OWMwNjU5ZTgxOTA0ZjlhMWM3NTQzNjk4ZTYyNTYyZDY3NDRjMTY5Y2U3YTM2ZGUwMWE4ZDYxNTQiXSxbIjVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUiLCIzOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1Il0sWyIzNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2IiwiZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYyJdLFsiMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2IiwiZWFkMTIxNjg1OTVmZTFiZTk5MjUyMTI5YjZlNTZiMzM5MWY3YWIxNDEwY2QxZTBlZjNkY2RjYWJkMmZkYTIyNCJdLFsiOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZSIsIjZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUiXSxbIjFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQiLCI2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYiXSxbIjg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEiLCIzZDk4YTljZGQwMjZkZDQzZjM5MDQ4ZjI1YTg4NDdmNGZjYWZhZDE4OTVkN2E2MzNjNmZlZDNjMzVlOTk5NTExIl0sWyIyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxIiwiYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiIl0sWyJhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyIiwiYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMiJdLFsiNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1IiwiY2YyMTc0MTE4YzhiNmQ3YTRiNDhmNmQ1MzRjZTVjNzk0MjJjMDg2YTYzNDYwNTAyYjgyN2NlNjJhMzI2NjgzYyJdLFsiZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYiIsIjZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMiXSxbImVhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQiLCIzMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkIl0sWyJhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmIiwiNjc0OWU2N2MwMjliODVmNTJhMDM0ZWFmZDA5NjgzNmIyNTIwODE4NjgwZTI2YWM4ZjNkZmJjZGI3MTc0OTcwMCJdLFsiZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODkiLCIyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0Il0sWyI1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2IiwiYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NiJdLFsiMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCIsIjk5OGM3NGE4Y2Q0NWFjMDEyODlkNTgzM2E3YmViNDc0NGZmNTM2YjAxYjI1N2JlNGM1NzY3YmVhOTNlYTU3YTQiXSxbIjNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EiLCJiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3Il0sWyJjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwIiwiYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMyJdLFsiYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NyIsIjZmMGEyNTZiYzVlZmRmNDI5YTJmYjYyNDJmMWE0M2EyZDliOTI1YmI0YTRiM2EyNmJiOGUwZjQ1ZWI1OTYwOTYiXSxbImMxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MyIsImMzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgiXSxbImE2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYiLCIyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYiXSxbIjM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgiLCI2MGVhN2Y2MWEzNTM1MjRkMWM5ODdmNmVjZWM5MmYwODZkNTY1YWI2ODc4NzBjYjEyNjg5ZmYxZTMxYzc0NDQ4Il0sWyJkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhIiwiNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YSJdLFsiYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMSIsIjVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQiXSxbIjRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDIiLCI3NTcxZDc0ZWU1ZTBmYjkyYTdhOGIzM2EwNzc4MzM0MWE1NDkyMTQ0Y2M1NGJjYzQwYTk0NDczNjkzNjA2NDM3Il0sWyIzNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhIiwiYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNyJdLFsiY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNiIsIjhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQiXSxbImI0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYiLCIzOWU1Yzk5MjViNWE1NGIwNzQzM2E0ZjE4YzYxNzI2ZjhiYjEzMWMwMTJjYTU0MmViMjRhOGFjMDcyMDA2ODJhIl0sWyJkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlIiwiNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCJdLFsiNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCIsIjI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzciXSxbImRmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEiLCJlY2ZiNzA1NmNmMWRlMDQyZjk0MjBiYWIzOTY3OTNjMGMzOTBiZGU3NGI0YmJkZmYxNmE4M2FlMDlhOWE3NTE3Il0sWyI2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5IiwiY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCJdLFsiZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZiIsImY1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUiXSxbImViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMiLCI2Y2I5YTg4NzZkOWNiODUyMDYwOWFmM2FkZDI2Y2QyMGEwYTdjZDhhOTQxMTEzMWNlODVmNDQxMDAwOTkyMjNlIl0sWyIxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyIiwiZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMSJdLFsiZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YSIsIjFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjIiXSxbImIyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAiLCI1ZjMxMGQ0YjNjOTliOWViYjE5Zjc3ZDQxYzFkZWUwMThjZjBkMzRmZDQxOTE2MTQwMDNlOTQ1YTEyMTZlNDIzIl0sWyJmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkIiwiNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCJdLFsiOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMSIsImNkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgiXSxbIjUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMiLCJjM2I5OTdkMDUwZWU1ZDQyM2ViYWY2NmE2ZGI5ZjU3YjMxODBjOTAyODc1Njc5ZGU5MjRiNjlkODRhN2IzNzUiXSxbImU2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTIiLCI2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkIl0sWyI3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzIiwiY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYyJdLFsiNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCIsIjk3MzExNDFkODFmYzhmODA4NGQzN2M2ZTc1NDIwMDZiM2VlMWI0MGQ2MGRmZTUzNjJhNWIxMzJmZDE3ZGRjMCJdLFsiMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCIsImVlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MiXSxbImUyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjciLCJkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0Il0sWyI4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4IiwiYzRlMTAyMDkxNjk4MGE0ZGE1ZDAxYWM1ZTZhZDMzMDczNGVmMGQ3OTA2NjMxYzRmMjM5MDQyNmIyZWRkNzkxZiJdLFsiNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZSIsIjY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDkiXSxbIjNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QiLCJjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYiXSxbIjY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmIiLCIyOTlkMjFmOTQxM2YzM2IzZWRmNDNiMjU3MDA0NTgwYjcwZGI1N2RhMGIxODIyNTllMDllZWNjNjllMGQzOGE1Il0sWyJkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmIiwiZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NyJdLFsiMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNiIsIjQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2IiXSxbImJlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTciLCI2MjE4OGJjNDlkNjFlNTQyODU3M2Q0OGE3NGUxYzY1NWIxYzYxMDkwOTA1NjgyYTBkNTU1OGVkNzJkY2NiOWJjIl0sWyI5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhIiwiN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YyJdLFsiYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYyIsImFiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYiXSxbImQ1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTIiLCI0Y2IwNDQzN2YzOTFlZDczMTExYTEzY2MxZDRkZDBkYjE2OTM0NjVjMjI0MDQ4MGQ4OTU1ZTg1OTJmMjc0NDdhIl0sWyJkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiIiwiYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NiJdLFsiNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NSIsImJmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YiXSxbIjc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTciLCI2MDNjMTJkYWYzZDk4NjJlZjJiMjVmZTFkZTI4OWFlZDI0ZWQyOTFlMGVjNjcwODcwM2E1YmQ1NjdmMzJlZDAzIl0sWyI3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5IiwiY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCJdLFsiMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMyIsIjU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgiXSxbIjllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTciLCI3MTJmY2RkMWI5MDUzZjA5MDAzYTM0ODFmYTc3NjJlOWZmZDdjOGVmMzVhMzg1MDllMmZiZjI2MjkwMDgzNzMiXSxbIjE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYiLCJlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzIl0sWyI3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4IiwiOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCJdLFsiODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMSIsIjllOTk0OTgwZDk5MTdlMjJiNzZiMDYxOTI3ZmEwNDE0M2QwOTZjY2M1NDk2M2U2YTVlYmZhNWYzZjhlMjg2YzEiXSxbIjFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAiLCI0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5Il1dfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMjAzKSxvPW4oMTApLHM9by51dGlscy5hc3NlcnQsYT1uKDIwNCksdT1uKDIwNSk7ZnVuY3Rpb24gYyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBjKSlyZXR1cm4gbmV3IGModCk7InN0cmluZyI9PXR5cGVvZiB0JiYocyhvLmN1cnZlcy5oYXNPd25Qcm9wZXJ0eSh0KSwiVW5rbm93biBjdXJ2ZSAiK3QpLHQ9by5jdXJ2ZXNbdF0pLHQgaW5zdGFuY2VvZiBvLmN1cnZlcy5QcmVzZXRDdXJ2ZSYmKHQ9e2N1cnZlOnR9KSx0aGlzLmN1cnZlPXQuY3VydmUuY3VydmUsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLm5oPXRoaXMubi51c2hybigxKSx0aGlzLmc9dGhpcy5jdXJ2ZS5nLHRoaXMuZz10LmN1cnZlLmcsdGhpcy5nLnByZWNvbXB1dGUodC5jdXJ2ZS5uLmJpdExlbmd0aCgpKzEpLHRoaXMuaGFzaD10Lmhhc2h8fHQuY3VydmUuaGFzaH10LmV4cG9ydHM9YyxjLnByb3RvdHlwZS5rZXlQYWlyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYSh0aGlzLHQpfSxjLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBhLmZyb21Qcml2YXRlKHRoaXMsdCxlKX0sYy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0LGUpe3JldHVybiBhLmZyb21QdWJsaWModGhpcyx0LGUpfSxjLnByb3RvdHlwZS5nZW5LZXlQYWlyPWZ1bmN0aW9uKHQpe3R8fCh0PXt9KTtmb3IodmFyIGU9bmV3IHIoe2hhc2g6dGhpcy5oYXNoLHBlcnM6dC5wZXJzLHBlcnNFbmM6dC5wZXJzRW5jfHwidXRmOCIsZW50cm9weTp0LmVudHJvcHl8fG8ucmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxlbnRyb3B5RW5jOnQuZW50cm9weSYmdC5lbnRyb3B5RW5jfHwidXRmOCIsbm9uY2U6dGhpcy5uLnRvQXJyYXkoKX0pLG49dGhpcy5uLmJ5dGVMZW5ndGgoKSxzPXRoaXMubi5zdWIobmV3IGkoMikpOzspe3ZhciBhPW5ldyBpKGUuZ2VuZXJhdGUobikpO2lmKCEoYS5jbXAocyk+MCkpcmV0dXJuIGEuaWFkZG4oMSksdGhpcy5rZXlGcm9tUHJpdmF0ZShhKX19LGMucHJvdG90eXBlLl90cnVuY2F0ZVRvTj1mdW5jdGlvbih0LGUpe3ZhciBuPTgqdC5ieXRlTGVuZ3RoKCktdGhpcy5uLmJpdExlbmd0aCgpO3JldHVybiBuPjAmJih0PXQudXNocm4obikpLCFlJiZ0LmNtcCh0aGlzLm4pPj0wP3Quc3ViKHRoaXMubik6dH0sYy5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUsbixvKXsib2JqZWN0Ij09dHlwZW9mIG4mJihvPW4sbj1udWxsKSxvfHwobz17fSksZT10aGlzLmtleUZyb21Qcml2YXRlKGUsbiksdD10aGlzLl90cnVuY2F0ZVRvTihuZXcgaSh0LDE2KSk7Zm9yKHZhciBzPXRoaXMubi5ieXRlTGVuZ3RoKCksYT1lLmdldFByaXZhdGUoKS50b0FycmF5KCJiZSIscyksYz10LnRvQXJyYXkoImJlIixzKSxoPW5ldyByKHtoYXNoOnRoaXMuaGFzaCxlbnRyb3B5OmEsbm9uY2U6YyxwZXJzOm8ucGVycyxwZXJzRW5jOm8ucGVyc0VuY3x8InV0ZjgifSksbD10aGlzLm4uc3ViKG5ldyBpKDEpKSxkPTA7O2QrKyl7dmFyIGY9by5rP28uayhkKTpuZXcgaShoLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTtpZighKChmPXRoaXMuX3RydW5jYXRlVG9OKGYsITApKS5jbXBuKDEpPD0wfHxmLmNtcChsKT49MCkpe3ZhciBwPXRoaXMuZy5tdWwoZik7aWYoIXAuaXNJbmZpbml0eSgpKXt2YXIgbT1wLmdldFgoKSxnPW0udW1vZCh0aGlzLm4pO2lmKDAhPT1nLmNtcG4oMCkpe3ZhciB2PWYuaW52bSh0aGlzLm4pLm11bChnLm11bChlLmdldFByaXZhdGUoKSkuaWFkZCh0KSk7aWYoMCE9PSh2PXYudW1vZCh0aGlzLm4pKS5jbXBuKDApKXt2YXIgYj0ocC5nZXRZKCkuaXNPZGQoKT8xOjApfCgwIT09bS5jbXAoZyk/MjowKTtyZXR1cm4gby5jYW5vbmljYWwmJnYuY21wKHRoaXMubmgpPjAmJih2PXRoaXMubi5zdWIodiksYl49MSksbmV3IHUoe3I6ZyxzOnYscmVjb3ZlcnlQYXJhbTpifSl9fX19fX0sYy5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQsZSxuLHIpe3Q9dGhpcy5fdHJ1bmNhdGVUb04obmV3IGkodCwxNikpLG49dGhpcy5rZXlGcm9tUHVibGljKG4scik7dmFyIG89KGU9bmV3IHUoZSwiaGV4IikpLnIscz1lLnM7aWYoby5jbXBuKDEpPDB8fG8uY21wKHRoaXMubik+PTApcmV0dXJuITE7aWYocy5jbXBuKDEpPDB8fHMuY21wKHRoaXMubik+PTApcmV0dXJuITE7dmFyIGEsYz1zLmludm0odGhpcy5uKSxoPWMubXVsKHQpLnVtb2QodGhpcy5uKSxsPWMubXVsKG8pLnVtb2QodGhpcy5uKTtyZXR1cm4gdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrPyEoYT10aGlzLmcuam11bEFkZChoLG4uZ2V0UHVibGljKCksbCkpLmlzSW5maW5pdHkoKSYmYS5lcVhUb1Aobyk6IShhPXRoaXMuZy5tdWxBZGQoaCxuLmdldFB1YmxpYygpLGwpKS5pc0luZmluaXR5KCkmJjA9PT1hLmdldFgoKS51bW9kKHRoaXMubikuY21wKG8pfSxjLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5PWZ1bmN0aW9uKHQsZSxuLHIpe3MoKDMmbik9PT1uLCJUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzIiksZT1uZXcgdShlLHIpO3ZhciBvPXRoaXMubixhPW5ldyBpKHQpLGM9ZS5yLGg9ZS5zLGw9MSZuLGQ9bj4+MTtpZihjLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKT49MCYmZCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZSIpO2M9ZD90aGlzLmN1cnZlLnBvaW50RnJvbVgoYy5hZGQodGhpcy5jdXJ2ZS5uKSxsKTp0aGlzLmN1cnZlLnBvaW50RnJvbVgoYyxsKTt2YXIgZj1lLnIuaW52bShvKSxwPW8uc3ViKGEpLm11bChmKS51bW9kKG8pLG09aC5tdWwoZikudW1vZChvKTtyZXR1cm4gdGhpcy5nLm11bEFkZChwLGMsbSl9LGMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW09ZnVuY3Rpb24odCxlLG4saSl7aWYobnVsbCE9PShlPW5ldyB1KGUsaSkpLnJlY292ZXJ5UGFyYW0pcmV0dXJuIGUucmVjb3ZlcnlQYXJhbTtmb3IodmFyIHI9MDtyPDQ7cisrKXt2YXIgbzt0cnl7bz10aGlzLnJlY292ZXJQdWJLZXkodCxlLHIpfWNhdGNoKHQpe2NvbnRpbnVlfWlmKG8uZXEobikpcmV0dXJuIHJ9dGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3IiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big3MCkscj1uKDEwNiksbz1uKDE0KTtmdW5jdGlvbiBzKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHMpKXJldHVybiBuZXcgcyh0KTt0aGlzLmhhc2g9dC5oYXNoLHRoaXMucHJlZFJlc2lzdD0hIXQucHJlZFJlc2lzdCx0aGlzLm91dExlbj10aGlzLmhhc2gub3V0U2l6ZSx0aGlzLm1pbkVudHJvcHk9dC5taW5FbnRyb3B5fHx0aGlzLmhhc2guaG1hY1N0cmVuZ3RoLHRoaXMuX3Jlc2VlZD1udWxsLHRoaXMucmVzZWVkSW50ZXJ2YWw9bnVsbCx0aGlzLks9bnVsbCx0aGlzLlY9bnVsbDt2YXIgZT1yLnRvQXJyYXkodC5lbnRyb3B5LHQuZW50cm9weUVuY3x8ImhleCIpLG49ci50b0FycmF5KHQubm9uY2UsdC5ub25jZUVuY3x8ImhleCIpLGk9ci50b0FycmF5KHQucGVycyx0LnBlcnNFbmN8fCJoZXgiKTtvKGUubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCwiTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAiK3RoaXMubWluRW50cm9weSsiIGJpdHMiKSx0aGlzLl9pbml0KGUsbixpKX10LmV4cG9ydHM9cyxzLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5jb25jYXQoZSkuY29uY2F0KG4pO3RoaXMuSz1uZXcgQXJyYXkodGhpcy5vdXRMZW4vOCksdGhpcy5WPW5ldyBBcnJheSh0aGlzLm91dExlbi84KTtmb3IodmFyIHI9MDtyPHRoaXMuVi5sZW5ndGg7cisrKXRoaXMuS1tyXT0wLHRoaXMuVltyXT0xO3RoaXMuX3VwZGF0ZShpKSx0aGlzLl9yZXNlZWQ9MSx0aGlzLnJlc2VlZEludGVydmFsPTI4MTQ3NDk3NjcxMDY1Nn0scy5wcm90b3R5cGUuX2htYWM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkuaG1hYyh0aGlzLmhhc2gsdGhpcy5LKX0scy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFswXSk7dCYmKGU9ZS51cGRhdGUodCkpLHRoaXMuSz1lLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksdCYmKHRoaXMuSz10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFsxXSkudXBkYXRlKHQpLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCkpfSxzLnByb3RvdHlwZS5yZXNlZWQ9ZnVuY3Rpb24odCxlLG4saSl7InN0cmluZyIhPXR5cGVvZiBlJiYoaT1uLG49ZSxlPW51bGwpLHQ9ci50b0FycmF5KHQsZSksbj1yLnRvQXJyYXkobixpKSxvKHQubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCwiTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAiK3RoaXMubWluRW50cm9weSsiIGJpdHMiKSx0aGlzLl91cGRhdGUodC5jb25jYXQobnx8W10pKSx0aGlzLl9yZXNlZWQ9MX0scy5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5fcmVzZWVkPnRoaXMucmVzZWVkSW50ZXJ2YWwpdGhyb3cgbmV3IEVycm9yKCJSZXNlZWQgaXMgcmVxdWlyZWQiKTsic3RyaW5nIiE9dHlwZW9mIGUmJihpPW4sbj1lLGU9bnVsbCksbiYmKG49ci50b0FycmF5KG4saXx8ImhleCIpLHRoaXMuX3VwZGF0ZShuKSk7Zm9yKHZhciBvPVtdO28ubGVuZ3RoPHQ7KXRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksbz1vLmNvbmNhdCh0aGlzLlYpO3ZhciBzPW8uc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5fdXBkYXRlKG4pLHRoaXMuX3Jlc2VlZCsrLHIuZW5jb2RlKHMsZSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMykscj1uKDEwKS51dGlscy5hc3NlcnQ7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuZWM9dCx0aGlzLnByaXY9bnVsbCx0aGlzLnB1Yj1udWxsLGUucHJpdiYmdGhpcy5faW1wb3J0UHJpdmF0ZShlLnByaXYsZS5wcml2RW5jKSxlLnB1YiYmdGhpcy5faW1wb3J0UHVibGljKGUucHViLGUucHViRW5jKX10LmV4cG9ydHM9byxvLmZyb21QdWJsaWM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluc3RhbmNlb2Ygbz9lOm5ldyBvKHQse3B1YjplLHB1YkVuYzpufSl9LG8uZnJvbVByaXZhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlIGluc3RhbmNlb2Ygbz9lOm5ldyBvKHQse3ByaXY6ZSxwcml2RW5jOm59KX0sby5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFB1YmxpYygpO3JldHVybiB0LmlzSW5maW5pdHkoKT97cmVzdWx0OiExLHJlYXNvbjoiSW52YWxpZCBwdWJsaWMga2V5In06dC52YWxpZGF0ZSgpP3QubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpP3tyZXN1bHQ6ITAscmVhc29uOm51bGx9OntyZXN1bHQ6ITEscmVhc29uOiJQdWJsaWMga2V5ICogTiAhPSBPIn06e3Jlc3VsdDohMSxyZWFzb246IlB1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQifX0sby5wcm90b3R5cGUuZ2V0UHVibGljPWZ1bmN0aW9uKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYoZT10LHQ9bnVsbCksdGhpcy5wdWJ8fCh0aGlzLnB1Yj10aGlzLmVjLmcubXVsKHRoaXMucHJpdikpLGU/dGhpcy5wdWIuZW5jb2RlKGUsdCk6dGhpcy5wdWJ9LG8ucHJvdG90eXBlLmdldFByaXZhdGU9ZnVuY3Rpb24odCl7cmV0dXJuImhleCI9PT10P3RoaXMucHJpdi50b1N0cmluZygxNiwyKTp0aGlzLnByaXZ9LG8ucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcml2PW5ldyBpKHQsZXx8MTYpLHRoaXMucHJpdj10aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pfSxvLnByb3RvdHlwZS5faW1wb3J0UHVibGljPWZ1bmN0aW9uKHQsZSl7aWYodC54fHx0LnkpcmV0dXJuIm1vbnQiPT09dGhpcy5lYy5jdXJ2ZS50eXBlP3IodC54LCJOZWVkIHggY29vcmRpbmF0ZSIpOiJzaG9ydCIhPT10aGlzLmVjLmN1cnZlLnR5cGUmJiJlZHdhcmRzIiE9PXRoaXMuZWMuY3VydmUudHlwZXx8cih0LngmJnQueSwiTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZSIpLHZvaWQodGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5wb2ludCh0LngsdC55KSk7dGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludCh0LGUpfSxvLnByb3RvdHlwZS5kZXJpdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubXVsKHRoaXMucHJpdikuZ2V0WCgpfSxvLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5lYy5zaWduKHQsdGhpcyxlLG4pfSxvLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYy52ZXJpZnkodCxlLHRoaXMpfSxvLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIjxLZXkgcHJpdjogIisodGhpcy5wcml2JiZ0aGlzLnByaXYudG9TdHJpbmcoMTYsMikpKyIgcHViOiAiKyh0aGlzLnB1YiYmdGhpcy5wdWIuaW5zcGVjdCgpKSsiID4ifX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDMpLHI9bigxMCkudXRpbHMsbz1yLmFzc2VydDtmdW5jdGlvbiBzKHQsZSl7aWYodCBpbnN0YW5jZW9mIHMpcmV0dXJuIHQ7dGhpcy5faW1wb3J0REVSKHQsZSl8fChvKHQuciYmdC5zLCJTaWduYXR1cmUgd2l0aG91dCByIG9yIHMiKSx0aGlzLnI9bmV3IGkodC5yLDE2KSx0aGlzLnM9bmV3IGkodC5zLDE2KSx2b2lkIDA9PT10LnJlY292ZXJ5UGFyYW0/dGhpcy5yZWNvdmVyeVBhcmFtPW51bGw6dGhpcy5yZWNvdmVyeVBhcmFtPXQucmVjb3ZlcnlQYXJhbSl9ZnVuY3Rpb24gYSgpe3RoaXMucGxhY2U9MH1mdW5jdGlvbiB1KHQsZSl7dmFyIG49dFtlLnBsYWNlKytdO2lmKCEoMTI4Jm4pKXJldHVybiBuO2Zvcih2YXIgaT0xNSZuLHI9MCxvPTAscz1lLnBsYWNlO288aTtvKysscysrKXI8PD04LHJ8PXRbc107cmV0dXJuIGUucGxhY2U9cyxyfWZ1bmN0aW9uIGModCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aC0xOyF0W2VdJiYhKDEyOCZ0W2UrMV0pJiZlPG47KWUrKztyZXR1cm4gMD09PWU/dDp0LnNsaWNlKGUpfWZ1bmN0aW9uIGgodCxlKXtpZihlPDEyOCl0LnB1c2goZSk7ZWxzZXt2YXIgbj0xKyhNYXRoLmxvZyhlKS9NYXRoLkxOMj4+PjMpO2Zvcih0LnB1c2goMTI4fG4pOy0tbjspdC5wdXNoKGU+Pj4objw8MykmMjU1KTt0LnB1c2goZSl9fXQuZXhwb3J0cz1zLHMucHJvdG90eXBlLl9pbXBvcnRERVI9ZnVuY3Rpb24odCxlKXt0PXIudG9BcnJheSh0LGUpO3ZhciBuPW5ldyBhO2lmKDQ4IT09dFtuLnBsYWNlKytdKXJldHVybiExO2lmKHUodCxuKStuLnBsYWNlIT09dC5sZW5ndGgpcmV0dXJuITE7aWYoMiE9PXRbbi5wbGFjZSsrXSlyZXR1cm4hMTt2YXIgbz11KHQsbikscz10LnNsaWNlKG4ucGxhY2UsbytuLnBsYWNlKTtpZihuLnBsYWNlKz1vLDIhPT10W24ucGxhY2UrK10pcmV0dXJuITE7dmFyIGM9dSh0LG4pO2lmKHQubGVuZ3RoIT09YytuLnBsYWNlKXJldHVybiExO3ZhciBoPXQuc2xpY2Uobi5wbGFjZSxjK24ucGxhY2UpO3JldHVybiAwPT09c1swXSYmMTI4JnNbMV0mJihzPXMuc2xpY2UoMSkpLDA9PT1oWzBdJiYxMjgmaFsxXSYmKGg9aC5zbGljZSgxKSksdGhpcy5yPW5ldyBpKHMpLHRoaXMucz1uZXcgaShoKSx0aGlzLnJlY292ZXJ5UGFyYW09bnVsbCwhMH0scy5wcm90b3R5cGUudG9ERVI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yLnRvQXJyYXkoKSxuPXRoaXMucy50b0FycmF5KCk7Zm9yKDEyOCZlWzBdJiYoZT1bMF0uY29uY2F0KGUpKSwxMjgmblswXSYmKG49WzBdLmNvbmNhdChuKSksZT1jKGUpLG49YyhuKTshKG5bMF18fDEyOCZuWzFdKTspbj1uLnNsaWNlKDEpO3ZhciBpPVsyXTtoKGksZS5sZW5ndGgpLChpPWkuY29uY2F0KGUpKS5wdXNoKDIpLGgoaSxuLmxlbmd0aCk7dmFyIG89aS5jb25jYXQobikscz1bNDhdO3JldHVybiBoKHMsby5sZW5ndGgpLHM9cy5jb25jYXQobyksci5lbmNvZGUocyx0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9big3MCkscj1uKDEwKSxvPXIudXRpbHMscz1vLmFzc2VydCxhPW8ucGFyc2VCeXRlcyx1PW4oMjA3KSxjPW4oMjA4KTtmdW5jdGlvbiBoKHQpe2lmKHMoImVkMjU1MTkiPT09dCwib25seSB0ZXN0ZWQgd2l0aCBlZDI1NTE5IHNvIGZhciIpLCEodGhpcyBpbnN0YW5jZW9mIGgpKXJldHVybiBuZXcgaCh0KTt0PXIuY3VydmVzW3RdLmN1cnZlO3RoaXMuY3VydmU9dCx0aGlzLmc9dC5nLHRoaXMuZy5wcmVjb21wdXRlKHQubi5iaXRMZW5ndGgoKSsxKSx0aGlzLnBvaW50Q2xhc3M9dC5wb2ludCgpLmNvbnN0cnVjdG9yLHRoaXMuZW5jb2RpbmdMZW5ndGg9TWF0aC5jZWlsKHQubi5iaXRMZW5ndGgoKS84KSx0aGlzLmhhc2g9aS5zaGE1MTJ9dC5leHBvcnRzPWgsaC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUpe3Q9YSh0KTt2YXIgbj10aGlzLmtleUZyb21TZWNyZXQoZSksaT10aGlzLmhhc2hJbnQobi5tZXNzYWdlUHJlZml4KCksdCkscj10aGlzLmcubXVsKGkpLG89dGhpcy5lbmNvZGVQb2ludChyKSxzPXRoaXMuaGFzaEludChvLG4ucHViQnl0ZXMoKSx0KS5tdWwobi5wcml2KCkpLHU9aS5hZGQocykudW1vZCh0aGlzLmN1cnZlLm4pO3JldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoe1I6cixTOnUsUmVuY29kZWQ6b30pfSxoLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlLG4pe3Q9YSh0KSxlPXRoaXMubWFrZVNpZ25hdHVyZShlKTt2YXIgaT10aGlzLmtleUZyb21QdWJsaWMobikscj10aGlzLmhhc2hJbnQoZS5SZW5jb2RlZCgpLGkucHViQnl0ZXMoKSx0KSxvPXRoaXMuZy5tdWwoZS5TKCkpO3JldHVybiBlLlIoKS5hZGQoaS5wdWIoKS5tdWwocikpLmVxKG8pfSxoLnByb3RvdHlwZS5oYXNoSW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaGFzaCgpLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQudXBkYXRlKGFyZ3VtZW50c1tlXSk7cmV0dXJuIG8uaW50RnJvbUxFKHQuZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKX0saC5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0KXtyZXR1cm4gdS5mcm9tUHVibGljKHRoaXMsdCl9LGgucHJvdG90eXBlLmtleUZyb21TZWNyZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUuZnJvbVNlY3JldCh0aGlzLHQpfSxoLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgYz90Om5ldyBjKHRoaXMsdCl9LGgucHJvdG90eXBlLmVuY29kZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0WSgpLnRvQXJyYXkoImxlIix0aGlzLmVuY29kaW5nTGVuZ3RoKTtyZXR1cm4gZVt0aGlzLmVuY29kaW5nTGVuZ3RoLTFdfD10LmdldFgoKS5pc09kZCgpPzEyODowLGV9LGgucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPSh0PW8ucGFyc2VCeXRlcyh0KSkubGVuZ3RoLTEsbj10LnNsaWNlKDAsZSkuY29uY2F0KC0xMjkmdFtlXSksaT0wIT0oMTI4JnRbZV0pLHI9by5pbnRGcm9tTEUobik7cmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWShyLGkpfSxoLnByb3RvdHlwZS5lbmNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9BcnJheSgibGUiLHRoaXMuZW5jb2RpbmdMZW5ndGgpfSxoLnByb3RvdHlwZS5kZWNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uaW50RnJvbUxFKHQpfSxoLnByb3RvdHlwZS5pc1BvaW50PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEwKS51dGlscyxyPWkuYXNzZXJ0LG89aS5wYXJzZUJ5dGVzLHM9aS5jYWNoZWRQcm9wZXJ0eTtmdW5jdGlvbiBhKHQsZSl7dGhpcy5lZGRzYT10LHRoaXMuX3NlY3JldD1vKGUuc2VjcmV0KSx0LmlzUG9pbnQoZS5wdWIpP3RoaXMuX3B1Yj1lLnB1Yjp0aGlzLl9wdWJCeXRlcz1vKGUucHViKX1hLmZyb21QdWJsaWM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGE/ZTpuZXcgYSh0LHtwdWI6ZX0pfSxhLmZyb21TZWNyZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGE/ZTpuZXcgYSh0LHtzZWNyZXQ6ZX0pfSxhLnByb3RvdHlwZS5zZWNyZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VjcmV0fSxzKGEsInB1YkJ5dGVzIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpfSkscyhhLCJwdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B1YkJ5dGVzP3RoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5fcHViQnl0ZXMpOnRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpfSkscyhhLCJwcml2Qnl0ZXMiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGRzYSxlPXRoaXMuaGFzaCgpLG49dC5lbmNvZGluZ0xlbmd0aC0xLGk9ZS5zbGljZSgwLHQuZW5jb2RpbmdMZW5ndGgpO3JldHVybiBpWzBdJj0yNDgsaVtuXSY9MTI3LGlbbl18PTY0LGl9KSxzKGEsInByaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMucHJpdkJ5dGVzKCkpfSkscyhhLCJoYXNoIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCl9KSxzKGEsIm1lc3NhZ2VQcmVmaXgiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpfSksYS5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLl9zZWNyZXQsIktleVBhaXIgY2FuIG9ubHkgdmVyaWZ5IiksdGhpcy5lZGRzYS5zaWduKHQsdGhpcyl9LGEucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVkZHNhLnZlcmlmeSh0LGUsdGhpcyl9LGEucHJvdG90eXBlLmdldFNlY3JldD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLl9zZWNyZXQsIktleVBhaXIgaXMgcHVibGljIG9ubHkiKSxpLmVuY29kZSh0aGlzLnNlY3JldCgpLHQpfSxhLnByb3RvdHlwZS5nZXRQdWJsaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGkuZW5jb2RlKHRoaXMucHViQnl0ZXMoKSx0KX0sdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMTApLnV0aWxzLG89ci5hc3NlcnQscz1yLmNhY2hlZFByb3BlcnR5LGE9ci5wYXJzZUJ5dGVzO2Z1bmN0aW9uIHUodCxlKXt0aGlzLmVkZHNhPXQsIm9iamVjdCIhPXR5cGVvZiBlJiYoZT1hKGUpKSxBcnJheS5pc0FycmF5KGUpJiYoZT17UjplLnNsaWNlKDAsdC5lbmNvZGluZ0xlbmd0aCksUzplLnNsaWNlKHQuZW5jb2RpbmdMZW5ndGgpfSksbyhlLlImJmUuUywiU2lnbmF0dXJlIHdpdGhvdXQgUiBvciBTIiksdC5pc1BvaW50KGUuUikmJih0aGlzLl9SPWUuUiksZS5TIGluc3RhbmNlb2YgaSYmKHRoaXMuX1M9ZS5TKSx0aGlzLl9SZW5jb2RlZD1BcnJheS5pc0FycmF5KGUuUik/ZS5SOmUuUmVuY29kZWQsdGhpcy5fU2VuY29kZWQ9QXJyYXkuaXNBcnJheShlLlMpP2UuUzplLlNlbmNvZGVkfXModSwiUyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKX0pLHModSwiUiIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpfSkscyh1LCJSZW5jb2RlZCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSl9KSxzKHUsIlNlbmNvZGVkIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmVuY29kZUludCh0aGlzLlMoKSl9KSx1LnByb3RvdHlwZS50b0J5dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmVuY29kZWQoKS5jb25jYXQodGhpcy5TZW5jb2RlZCgpKX0sdS5wcm90b3R5cGUudG9IZXg9ZnVuY3Rpb24oKXtyZXR1cm4gci5lbmNvZGUodGhpcy50b0J5dGVzKCksImhleCIpLnRvVXBwZXJDYXNlKCl9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oMzUpO2UuY2VydGlmaWNhdGU9bigyMjApO3ZhciByPWkuZGVmaW5lKCJSU0FQcml2YXRlS2V5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksdGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSx0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSx0aGlzLmtleSgicHJpdmF0ZUV4cG9uZW50IikuaW50KCksdGhpcy5rZXkoInByaW1lMSIpLmludCgpLHRoaXMua2V5KCJwcmltZTIiKS5pbnQoKSx0aGlzLmtleSgiZXhwb25lbnQxIikuaW50KCksdGhpcy5rZXkoImV4cG9uZW50MiIpLmludCgpLHRoaXMua2V5KCJjb2VmZmljaWVudCIpLmludCgpKX0pO2UuUlNBUHJpdmF0ZUtleT1yO3ZhciBvPWkuZGVmaW5lKCJSU0FQdWJsaWNLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSx0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSl9KTtlLlJTQVB1YmxpY0tleT1vO3ZhciBzPWkuZGVmaW5lKCJTdWJqZWN0UHVibGljS2V5SW5mbyIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikudXNlKGEpLHRoaXMua2V5KCJzdWJqZWN0UHVibGljS2V5IikuYml0c3RyKCkpfSk7ZS5QdWJsaWNLZXk9czt2YXIgYT1pLmRlZmluZSgiQWxnb3JpdGhtSWRlbnRpZmllciIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikub2JqaWQoKSx0aGlzLmtleSgibm9uZSIpLm51bGxfKCkub3B0aW9uYWwoKSx0aGlzLmtleSgiY3VydmUiKS5vYmppZCgpLm9wdGlvbmFsKCksdGhpcy5rZXkoInBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgicCIpLmludCgpLHRoaXMua2V5KCJxIikuaW50KCksdGhpcy5rZXkoImciKS5pbnQoKSkub3B0aW9uYWwoKSl9KSx1PWkuZGVmaW5lKCJQcml2YXRlS2V5SW5mbyIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidmVyc2lvbiIpLmludCgpLHRoaXMua2V5KCJhbGdvcml0aG0iKS51c2UoYSksdGhpcy5rZXkoInN1YmplY3RQcml2YXRlS2V5Iikub2N0c3RyKCkpfSk7ZS5Qcml2YXRlS2V5PXU7dmFyIGM9aS5kZWZpbmUoIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS5zZXEoKS5vYmoodGhpcy5rZXkoImlkIikub2JqaWQoKSx0aGlzLmtleSgiZGVjcnlwdCIpLnNlcSgpLm9iaih0aGlzLmtleSgia2RlIikuc2VxKCkub2JqKHRoaXMua2V5KCJpZCIpLm9iamlkKCksdGhpcy5rZXkoImtkZXBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgic2FsdCIpLm9jdHN0cigpLHRoaXMua2V5KCJpdGVycyIpLmludCgpKSksdGhpcy5rZXkoImNpcGhlciIpLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnbyIpLm9iamlkKCksdGhpcy5rZXkoIml2Iikub2N0c3RyKCkpKSksdGhpcy5rZXkoInN1YmplY3RQcml2YXRlS2V5Iikub2N0c3RyKCkpfSk7ZS5FbmNyeXB0ZWRQcml2YXRlS2V5PWM7dmFyIGg9aS5kZWZpbmUoIkRTQVByaXZhdGVLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5pbnQoKSx0aGlzLmtleSgicCIpLmludCgpLHRoaXMua2V5KCJxIikuaW50KCksdGhpcy5rZXkoImciKS5pbnQoKSx0aGlzLmtleSgicHViX2tleSIpLmludCgpLHRoaXMua2V5KCJwcml2X2tleSIpLmludCgpKX0pO2UuRFNBUHJpdmF0ZUtleT1oLGUuRFNBcGFyYW09aS5kZWZpbmUoIkRTQXBhcmFtIixmdW5jdGlvbigpe3RoaXMuaW50KCl9KTt2YXIgbD1pLmRlZmluZSgiRUNQcml2YXRlS2V5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksdGhpcy5rZXkoInByaXZhdGVLZXkiKS5vY3RzdHIoKSx0aGlzLmtleSgicGFyYW1ldGVycyIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKGQpLHRoaXMua2V5KCJwdWJsaWNLZXkiKS5vcHRpb25hbCgpLmV4cGxpY2l0KDEpLmJpdHN0cigpKX0pO2UuRUNQcml2YXRlS2V5PWw7dmFyIGQ9aS5kZWZpbmUoIkVDUGFyYW1ldGVycyIsZnVuY3Rpb24oKXt0aGlzLmNob2ljZSh7bmFtZWRDdXJ2ZTp0aGlzLm9iamlkKCl9KX0pO2Uuc2lnbmF0dXJlPWkuZGVmaW5lKCJzaWduYXR1cmUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInIiKS5pbnQoKSx0aGlzLmtleSgicyIpLmludCgpKX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigzNSkscj1uKDApO2Z1bmN0aW9uIG8odCxlKXt0aGlzLm5hbWU9dCx0aGlzLmJvZHk9ZSx0aGlzLmRlY29kZXJzPXt9LHRoaXMuZW5jb2RlcnM9e319ZS5kZWZpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8odCxlKX0sby5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPW4oMjExKS5ydW5JblRoaXNDb250ZXh0KCIoZnVuY3Rpb24gIit0aGlzLm5hbWUrIihlbnRpdHkpIHtcbiAgdGhpcy5faW5pdE5hbWVkKGVudGl0eSk7XG59KSIpfWNhdGNoKHQpe2U9ZnVuY3Rpb24odCl7dGhpcy5faW5pdE5hbWVkKHQpfX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9pbml0TmFtZWQ9ZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZSl9LG5ldyBlKHRoaXMpfSxvLnByb3RvdHlwZS5fZ2V0RGVjb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHwiZGVyIix0aGlzLmRlY29kZXJzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5kZWNvZGVyc1t0XT10aGlzLl9jcmVhdGVOYW1lZChpLmRlY29kZXJzW3RdKSksdGhpcy5kZWNvZGVyc1t0XX0sby5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlKS5kZWNvZGUodCxuKX0sby5wcm90b3R5cGUuX2dldEVuY29kZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dHx8ImRlciIsdGhpcy5lbmNvZGVycy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuZW5jb2RlcnNbdF09dGhpcy5fY3JlYXRlTmFtZWQoaS5lbmNvZGVyc1t0XSkpLHRoaXMuZW5jb2RlcnNbdF19LG8ucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZSkuZW5jb2RlKHQsbil9fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgaW5kZXhPZj1fX3dlYnBhY2tfcmVxdWlyZV9fKDIxMiksT2JqZWN0X2tleXM9ZnVuY3Rpb24odCl7aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0sZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKHQuZm9yRWFjaClyZXR1cm4gdC5mb3JFYWNoKGUpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUodFtuXSxuLHQpfSxkZWZpbmVQcm9wPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl8iLHt9KSxmdW5jdGlvbih0LGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7d3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsdmFsdWU6bn0pfX1jYXRjaCh0KXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3RbZV09bn19fSgpLGdsb2JhbHM9WyJBcnJheSIsIkJvb2xlYW4iLCJEYXRlIiwiRXJyb3IiLCJFdmFsRXJyb3IiLCJGdW5jdGlvbiIsIkluZmluaXR5IiwiSlNPTiIsIk1hdGgiLCJOYU4iLCJOdW1iZXIiLCJPYmplY3QiLCJSYW5nZUVycm9yIiwiUmVmZXJlbmNlRXJyb3IiLCJSZWdFeHAiLCJTdHJpbmciLCJTeW50YXhFcnJvciIsIlR5cGVFcnJvciIsIlVSSUVycm9yIiwiZGVjb2RlVVJJIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZW5jb2RlVVJJIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwiZXZhbCIsImlzRmluaXRlIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJ1bmRlZmluZWQiLCJ1bmVzY2FwZSJdO2Z1bmN0aW9uIENvbnRleHQoKXt9Q29udGV4dC5wcm90b3R5cGU9e307dmFyIFNjcmlwdD1leHBvcnRzLlNjcmlwdD1mdW5jdGlvbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBTY3JpcHQpKXJldHVybiBuZXcgU2NyaXB0KHQpO3RoaXMuY29kZT10fTtTY3JpcHQucHJvdG90eXBlLnJ1bkluQ29udGV4dD1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBDb250ZXh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuZWVkcyBhICdjb250ZXh0JyBhcmd1bWVudC4iKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlfHwoZS5zdHlsZT17fSksZS5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBuPWUuY29udGVudFdpbmRvdyxpPW4uZXZhbCxyPW4uZXhlY1NjcmlwdDshaSYmciYmKHIuY2FsbChuLCJudWxsIiksaT1uLmV2YWwpLGZvckVhY2goT2JqZWN0X2tleXModCksZnVuY3Rpb24oZSl7bltlXT10W2VdfSksZm9yRWFjaChnbG9iYWxzLGZ1bmN0aW9uKGUpe3RbZV0mJihuW2VdPXRbZV0pfSk7dmFyIG89T2JqZWN0X2tleXMobikscz1pLmNhbGwobix0aGlzLmNvZGUpO3JldHVybiBmb3JFYWNoKE9iamVjdF9rZXlzKG4pLGZ1bmN0aW9uKGUpeyhlIGluIHR8fC0xPT09aW5kZXhPZihvLGUpKSYmKHRbZV09bltlXSl9KSxmb3JFYWNoKGdsb2JhbHMsZnVuY3Rpb24oZSl7ZSBpbiB0fHxkZWZpbmVQcm9wKHQsZSxuW2VdKX0pLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksc30sU2NyaXB0LnByb3RvdHlwZS5ydW5JblRoaXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIGV2YWwodGhpcy5jb2RlKX0sU2NyaXB0LnByb3RvdHlwZS5ydW5Jbk5ld0NvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9U2NyaXB0LmNyZWF0ZUNvbnRleHQodCksbj10aGlzLnJ1bkluQ29udGV4dChlKTtyZXR1cm4gZm9yRWFjaChPYmplY3Rfa2V5cyhlKSxmdW5jdGlvbihuKXt0W25dPWVbbl19KSxufSxmb3JFYWNoKE9iamVjdF9rZXlzKFNjcmlwdC5wcm90b3R5cGUpLGZ1bmN0aW9uKHQpe2V4cG9ydHNbdF09U2NyaXB0W3RdPWZ1bmN0aW9uKGUpe3ZhciBuPVNjcmlwdChlKTtyZXR1cm4gblt0XS5hcHBseShuLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KSxleHBvcnRzLmNyZWF0ZVNjcmlwdD1mdW5jdGlvbih0KXtyZXR1cm4gZXhwb3J0cy5TY3JpcHQodCl9LGV4cG9ydHMuY3JlYXRlQ29udGV4dD1TY3JpcHQuY3JlYXRlQ29udGV4dD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQ29udGV4dDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJmZvckVhY2goT2JqZWN0X2tleXModCksZnVuY3Rpb24obil7ZVtuXT10W25dfSksZX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49W10uaW5kZXhPZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihuKXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpaWYodFtpXT09PWUpcmV0dXJuIGk7cmV0dXJuLTF9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigwKTtmdW5jdGlvbiByKHQpe3RoaXMuX3JlcG9ydGVyU3RhdGU9e29iajpudWxsLHBhdGg6W10sb3B0aW9uczp0fHx7fSxlcnJvcnM6W119fWZ1bmN0aW9uIG8odCxlKXt0aGlzLnBhdGg9dCx0aGlzLnJldGhyb3coZSl9ZS5SZXBvcnRlcj1yLHIucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvfSxyLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm57b2JqOnQub2JqLHBhdGhMZW46dC5wYXRoLmxlbmd0aH19LHIucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtlLm9iaj10Lm9iaixlLnBhdGg9ZS5wYXRoLnNsaWNlKDAsdC5wYXRoTGVuKX0sci5wcm90b3R5cGUuZW50ZXJLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKHQpfSxyLnByb3RvdHlwZS5leGl0S2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7ZS5wYXRoPWUucGF0aC5zbGljZSgwLHQtMSl9LHIucHJvdG90eXBlLmxlYXZlS2V5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9yZXBvcnRlclN0YXRlO3RoaXMuZXhpdEtleSh0KSxudWxsIT09aS5vYmomJihpLm9ialtlXT1uKX0sci5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbigiLyIpfSxyLnByb3RvdHlwZS5lbnRlck9iamVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlcG9ydGVyU3RhdGUsZT10Lm9iajtyZXR1cm4gdC5vYmo9e30sZX0sci5wcm90b3R5cGUubGVhdmVPYmplY3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxuPWUub2JqO3JldHVybiBlLm9iaj10LG59LHIucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5fcmVwb3J0ZXJTdGF0ZSxpPXQgaW5zdGFuY2VvZiBvO2lmKGU9aT90Om5ldyBvKG4ucGF0aC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIlsiK0pTT04uc3RyaW5naWZ5KHQpKyJdIn0pLmpvaW4oIiIpLHQubWVzc2FnZXx8dCx0LnN0YWNrKSwhbi5vcHRpb25zLnBhcnRpYWwpdGhyb3cgZTtyZXR1cm4gaXx8bi5lcnJvcnMucHVzaChlKSxlfSxyLnByb3RvdHlwZS53cmFwUmVzdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7cmV0dXJuIGUub3B0aW9ucy5wYXJ0aWFsP3tyZXN1bHQ6dGhpcy5pc0Vycm9yKHQpP251bGw6dCxlcnJvcnM6ZS5lcnJvcnN9OnR9LGkobyxFcnJvciksby5wcm90b3R5cGUucmV0aHJvdz1mdW5jdGlvbih0KXtpZih0aGlzLm1lc3NhZ2U9dCsiIGF0OiAiKyh0aGlzLnBhdGh8fCIoc2hhbGxvdykiKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxvKSwhdGhpcy5zdGFjayl0cnl7dGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSl9Y2F0Y2godCl7dGhpcy5zdGFjaz10LnN0YWNrfXJldHVybiB0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzYpLlJlcG9ydGVyLHI9bigzNikuRW5jb2RlckJ1ZmZlcixvPW4oMzYpLkRlY29kZXJCdWZmZXIscz1uKDE0KSxhPVsic2VxIiwic2Vxb2YiLCJzZXQiLCJzZXRvZiIsIm9iamlkIiwiYm9vbCIsImdlbnRpbWUiLCJ1dGN0aW1lIiwibnVsbF8iLCJlbnVtIiwiaW50Iiwib2JqRGVzYyIsImJpdHN0ciIsImJtcHN0ciIsImNoYXJzdHIiLCJnZW5zdHIiLCJncmFwaHN0ciIsImlhNXN0ciIsImlzbzY0NnN0ciIsIm51bXN0ciIsIm9jdHN0ciIsInByaW50c3RyIiwidDYxc3RyIiwidW5pc3RyIiwidXRmOHN0ciIsInZpZGVvc3RyIl0sdT1bImtleSIsIm9iaiIsInVzZSIsIm9wdGlvbmFsIiwiZXhwbGljaXQiLCJpbXBsaWNpdCIsImRlZiIsImNob2ljZSIsImFueSIsImNvbnRhaW5zIl0uY29uY2F0KGEpO2Z1bmN0aW9uIGModCxlKXt2YXIgbj17fTt0aGlzLl9iYXNlU3RhdGU9bixuLmVuYz10LG4ucGFyZW50PWV8fG51bGwsbi5jaGlsZHJlbj1udWxsLG4udGFnPW51bGwsbi5hcmdzPW51bGwsbi5yZXZlcnNlQXJncz1udWxsLG4uY2hvaWNlPW51bGwsbi5vcHRpb25hbD0hMSxuLmFueT0hMSxuLm9iaj0hMSxuLnVzZT1udWxsLG4udXNlRGVjb2Rlcj1udWxsLG4ua2V5PW51bGwsbi5kZWZhdWx0PW51bGwsbi5leHBsaWNpdD1udWxsLG4uaW1wbGljaXQ9bnVsbCxuLmNvbnRhaW5zPW51bGwsbi5wYXJlbnR8fChuLmNoaWxkcmVuPVtdLHRoaXMuX3dyYXAoKSl9dC5leHBvcnRzPWM7dmFyIGg9WyJlbmMiLCJwYXJlbnQiLCJjaGlsZHJlbiIsInRhZyIsImFyZ3MiLCJyZXZlcnNlQXJncyIsImNob2ljZSIsIm9wdGlvbmFsIiwiYW55Iiwib2JqIiwidXNlIiwiYWx0ZXJlZFVzZSIsImtleSIsImRlZmF1bHQiLCJleHBsaWNpdCIsImltcGxpY2l0IiwiY29udGFpbnMiXTtjLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPXt9O2guZm9yRWFjaChmdW5jdGlvbihuKXtlW25dPXRbbl19KTt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLnBhcmVudCk7cmV0dXJuIG4uX2Jhc2VTdGF0ZT1lLG59LGMucHJvdG90eXBlLl93cmFwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIG49bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuY2hpbGRyZW4ucHVzaChuKSxuW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19LHRoaXMpfSxjLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cyhudWxsPT09ZS5wYXJlbnQpLHQuY2FsbCh0aGlzKSxlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Ll9iYXNlU3RhdGUucGFyZW50PT09dGhpc30sdGhpcykscy5lcXVhbChlLmNoaWxkcmVuLmxlbmd0aCwxLCJSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQiKX0sYy5wcm90b3R5cGUuX3VzZUFyZ3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlLG49dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yfSx0aGlzKTt0PXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEodCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpfSx0aGlzKSwwIT09bi5sZW5ndGgmJihzKG51bGw9PT1lLmNoaWxkcmVuKSxlLmNoaWxkcmVuPW4sbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX2Jhc2VTdGF0ZS5wYXJlbnQ9dGhpc30sdGhpcykpLDAhPT10Lmxlbmd0aCYmKHMobnVsbD09PWUuYXJncyksZS5hcmdzPXQsZS5yZXZlcnNlQXJncz10Lm1hcChmdW5jdGlvbih0KXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fHQuY29uc3RydWN0b3IhPT1PYmplY3QpcmV0dXJuIHQ7dmFyIGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7bj09KDB8bikmJihufD0wKTt2YXIgaT10W25dO2VbaV09bn0pLGV9KSl9LFsiX3BlZWtUYWciLCJfZGVjb2RlVGFnIiwiX3VzZSIsIl9kZWNvZGVTdHIiLCJfZGVjb2RlT2JqaWQiLCJfZGVjb2RlVGltZSIsIl9kZWNvZGVOdWxsIiwiX2RlY29kZUludCIsIl9kZWNvZGVCb29sIiwiX2RlY29kZUxpc3QiLCJfZW5jb2RlQ29tcG9zaXRlIiwiX2VuY29kZVN0ciIsIl9lbmNvZGVPYmppZCIsIl9lbmNvZGVUaW1lIiwiX2VuY29kZU51bGwiLCJfZW5jb2RlSW50IiwiX2VuY29kZUJvb2wiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3Rocm93IG5ldyBFcnJvcih0KyIgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogIitlLmVuYyl9fSksYS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gcyhudWxsPT09ZS50YWcpLGUudGFnPXQsdGhpcy5fdXNlQXJncyhuKSx0aGlzfX0pLGMucHJvdG90eXBlLnVzZT1mdW5jdGlvbih0KXtzKHQpO3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gcyhudWxsPT09ZS51c2UpLGUudXNlPXQsdGhpc30sYy5wcm90b3R5cGUub3B0aW9uYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZVN0YXRlLm9wdGlvbmFsPSEwLHRoaXN9LGMucHJvdG90eXBlLmRlZj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUuZGVmYXVsdCksZS5kZWZhdWx0PXQsZS5vcHRpb25hbD0hMCx0aGlzfSxjLnByb3RvdHlwZS5leHBsaWNpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUuZXhwbGljaXQmJm51bGw9PT1lLmltcGxpY2l0KSxlLmV4cGxpY2l0PXQsdGhpc30sYy5wcm90b3R5cGUuaW1wbGljaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmV4cGxpY2l0JiZudWxsPT09ZS5pbXBsaWNpdCksZS5pbXBsaWNpdD10LHRoaXN9LGMucHJvdG90eXBlLm9iaj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQub2JqPSEwLDAhPT1lLmxlbmd0aCYmdGhpcy5fdXNlQXJncyhlKSx0aGlzfSxjLnByb3RvdHlwZS5rZXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmtleSksZS5rZXk9dCx0aGlzfSxjLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZVN0YXRlLmFueT0hMCx0aGlzfSxjLnByb3RvdHlwZS5jaG9pY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzKG51bGw9PT1lLmNob2ljZSksZS5jaG9pY2U9dCx0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKSx0aGlzfSxjLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHMobnVsbD09PWUudXNlKSxlLmNvbnRhaW5zPXQsdGhpc30sYy5wcm90b3R5cGUuX2RlY29kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09bi5wYXJlbnQpcmV0dXJuIHQud3JhcFJlc3VsdChuLmNoaWxkcmVuWzBdLl9kZWNvZGUodCxlKSk7dmFyIGkscj1uLmRlZmF1bHQscz0hMCxhPW51bGw7aWYobnVsbCE9PW4ua2V5JiYoYT10LmVudGVyS2V5KG4ua2V5KSksbi5vcHRpb25hbCl7dmFyIHU9bnVsbDtpZihudWxsIT09bi5leHBsaWNpdD91PW4uZXhwbGljaXQ6bnVsbCE9PW4uaW1wbGljaXQ/dT1uLmltcGxpY2l0Om51bGwhPT1uLnRhZyYmKHU9bi50YWcpLG51bGwhPT11fHxuLmFueSl7aWYocz10aGlzLl9wZWVrVGFnKHQsdSxuLmFueSksdC5pc0Vycm9yKHMpKXJldHVybiBzfWVsc2V7dmFyIGM9dC5zYXZlKCk7dHJ5e251bGw9PT1uLmNob2ljZT90aGlzLl9kZWNvZGVHZW5lcmljKG4udGFnLHQsZSk6dGhpcy5fZGVjb2RlQ2hvaWNlKHQsZSkscz0hMH1jYXRjaCh0KXtzPSExfXQucmVzdG9yZShjKX19aWYobi5vYmomJnMmJihpPXQuZW50ZXJPYmplY3QoKSkscyl7aWYobnVsbCE9PW4uZXhwbGljaXQpe3ZhciBoPXRoaXMuX2RlY29kZVRhZyh0LG4uZXhwbGljaXQpO2lmKHQuaXNFcnJvcihoKSlyZXR1cm4gaDt0PWh9dmFyIGw9dC5vZmZzZXQ7aWYobnVsbD09PW4udXNlJiZudWxsPT09bi5jaG9pY2Upe2lmKG4uYW55KWM9dC5zYXZlKCk7dmFyIGQ9dGhpcy5fZGVjb2RlVGFnKHQsbnVsbCE9PW4uaW1wbGljaXQ/bi5pbXBsaWNpdDpuLnRhZyxuLmFueSk7aWYodC5pc0Vycm9yKGQpKXJldHVybiBkO24uYW55P3I9dC5yYXcoYyk6dD1kfWlmKGUmJmUudHJhY2smJm51bGwhPT1uLnRhZyYmZS50cmFjayh0LnBhdGgoKSxsLHQubGVuZ3RoLCJ0YWdnZWQiKSxlJiZlLnRyYWNrJiZudWxsIT09bi50YWcmJmUudHJhY2sodC5wYXRoKCksdC5vZmZzZXQsdC5sZW5ndGgsImNvbnRlbnQiKSxyPW4uYW55P3I6bnVsbD09PW4uY2hvaWNlP3RoaXMuX2RlY29kZUdlbmVyaWMobi50YWcsdCxlKTp0aGlzLl9kZWNvZGVDaG9pY2UodCxlKSx0LmlzRXJyb3IocikpcmV0dXJuIHI7aWYobi5hbnl8fG51bGwhPT1uLmNob2ljZXx8bnVsbD09PW4uY2hpbGRyZW58fG4uY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihuKXtuLl9kZWNvZGUodCxlKX0pLG4uY29udGFpbnMmJigib2N0c3RyIj09PW4udGFnfHwiYml0c3RyIj09PW4udGFnKSl7dmFyIGY9bmV3IG8ocik7cj10aGlzLl9nZXRVc2Uobi5jb250YWlucyx0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShmLGUpfX1yZXR1cm4gbi5vYmomJnMmJihyPXQubGVhdmVPYmplY3QoaSkpLG51bGw9PT1uLmtleXx8bnVsbD09PXImJiEwIT09cz9udWxsIT09YSYmdC5leGl0S2V5KGEpOnQubGVhdmVLZXkoYSxuLmtleSxyKSxyfSxjLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fYmFzZVN0YXRlO3JldHVybiJzZXEiPT09dHx8InNldCI9PT10P251bGw6InNlcW9mIj09PXR8fCJzZXRvZiI9PT10P3RoaXMuX2RlY29kZUxpc3QoZSx0LGkuYXJnc1swXSxuKTovc3RyJC8udGVzdCh0KT90aGlzLl9kZWNvZGVTdHIoZSx0LG4pOiJvYmppZCI9PT10JiZpLmFyZ3M/dGhpcy5fZGVjb2RlT2JqaWQoZSxpLmFyZ3NbMF0saS5hcmdzWzFdLG4pOiJvYmppZCI9PT10P3RoaXMuX2RlY29kZU9iamlkKGUsbnVsbCxudWxsLG4pOiJnZW50aW1lIj09PXR8fCJ1dGN0aW1lIj09PXQ/dGhpcy5fZGVjb2RlVGltZShlLHQsbik6Im51bGxfIj09PXQ/dGhpcy5fZGVjb2RlTnVsbChlLG4pOiJib29sIj09PXQ/dGhpcy5fZGVjb2RlQm9vbChlLG4pOiJvYmpEZXNjIj09PXQ/dGhpcy5fZGVjb2RlU3RyKGUsdCxuKToiaW50Ij09PXR8fCJlbnVtIj09PXQ/dGhpcy5fZGVjb2RlSW50KGUsaS5hcmdzJiZpLmFyZ3NbMF0sbik6bnVsbCE9PWkudXNlP3RoaXMuX2dldFVzZShpLnVzZSxlLl9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShlLG4pOmUuZXJyb3IoInVua25vd24gdGFnOiAiK3QpfSxjLnByb3RvdHlwZS5fZ2V0VXNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYmFzZVN0YXRlO3JldHVybiBuLnVzZURlY29kZXI9dGhpcy5fdXNlKHQsZSkscyhudWxsPT09bi51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50KSxuLnVzZURlY29kZXI9bi51c2VEZWNvZGVyLl9iYXNlU3RhdGUuY2hpbGRyZW5bMF0sbi5pbXBsaWNpdCE9PW4udXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0JiYobi51c2VEZWNvZGVyPW4udXNlRGVjb2Rlci5jbG9uZSgpLG4udXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0PW4uaW1wbGljaXQpLG4udXNlRGVjb2Rlcn0sYy5wcm90b3R5cGUuX2RlY29kZUNob2ljZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZSxpPW51bGwscj0hMTtyZXR1cm4gT2JqZWN0LmtleXMobi5jaG9pY2UpLnNvbWUoZnVuY3Rpb24obyl7dmFyIHM9dC5zYXZlKCksYT1uLmNob2ljZVtvXTt0cnl7dmFyIHU9YS5fZGVjb2RlKHQsZSk7aWYodC5pc0Vycm9yKHUpKXJldHVybiExO2k9e3R5cGU6byx2YWx1ZTp1fSxyPSEwfWNhdGNoKGUpe3JldHVybiB0LnJlc3RvcmUocyksITF9cmV0dXJuITB9LHRoaXMpLHI/aTp0LmVycm9yKCJDaG9pY2Ugbm90IG1hdGNoZWQiKX0sYy5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQsdGhpcy5yZXBvcnRlcil9LGMucHJvdG90eXBlLl9lbmNvZGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09aS5kZWZhdWx0fHxpLmRlZmF1bHQhPT10KXt2YXIgcj10aGlzLl9lbmNvZGVWYWx1ZSh0LGUsbik7aWYodm9pZCAwIT09ciYmIXRoaXMuX3NraXBEZWZhdWx0KHIsZSxuKSlyZXR1cm4gcn19LGMucHJvdG90eXBlLl9lbmNvZGVWYWx1ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fYmFzZVN0YXRlO2lmKG51bGw9PT1yLnBhcmVudClyZXR1cm4gci5jaGlsZHJlblswXS5fZW5jb2RlKHQsZXx8bmV3IGkpO3ZhciBvPW51bGw7aWYodGhpcy5yZXBvcnRlcj1lLHIub3B0aW9uYWwmJnZvaWQgMD09PXQpe2lmKG51bGw9PT1yLmRlZmF1bHQpcmV0dXJuO3Q9ci5kZWZhdWx0fXZhciBzPW51bGwsYT0hMTtpZihyLmFueSlvPXRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk7ZWxzZSBpZihyLmNob2ljZSlvPXRoaXMuX2VuY29kZUNob2ljZSh0LGUpO2Vsc2UgaWYoci5jb250YWlucylzPXRoaXMuX2dldFVzZShyLmNvbnRhaW5zLG4pLl9lbmNvZGUodCxlKSxhPSEwO2Vsc2UgaWYoci5jaGlsZHJlbilzPXIuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG4pe2lmKCJudWxsXyI9PT1uLl9iYXNlU3RhdGUudGFnKXJldHVybiBuLl9lbmNvZGUobnVsbCxlLHQpO2lmKG51bGw9PT1uLl9iYXNlU3RhdGUua2V5KXJldHVybiBlLmVycm9yKCJDaGlsZCBzaG91bGQgaGF2ZSBhIGtleSIpO3ZhciBpPWUuZW50ZXJLZXkobi5fYmFzZVN0YXRlLmtleSk7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXJldHVybiBlLmVycm9yKCJDaGlsZCBleHBlY3RlZCwgYnV0IGlucHV0IGlzIG5vdCBvYmplY3QiKTt2YXIgcj1uLl9lbmNvZGUodFtuLl9iYXNlU3RhdGUua2V5XSxlLHQpO3JldHVybiBlLmxlYXZlS2V5KGkpLHJ9LHRoaXMpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLHM9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzKTtlbHNlIGlmKCJzZXFvZiI9PT1yLnRhZ3x8InNldG9mIj09PXIudGFnKXtpZighci5hcmdzfHwxIT09ci5hcmdzLmxlbmd0aClyZXR1cm4gZS5lcnJvcigiVG9vIG1hbnkgYXJncyBmb3IgOiAiK3IudGFnKTtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5lcnJvcigic2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheSIpO3ZhciB1PXRoaXMuY2xvbmUoKTt1Ll9iYXNlU3RhdGUuaW1wbGljaXQ9bnVsbCxzPXRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodC5tYXAoZnVuY3Rpb24obil7dmFyIGk9dGhpcy5fYmFzZVN0YXRlO3JldHVybiB0aGlzLl9nZXRVc2UoaS5hcmdzWzBdLHQpLl9lbmNvZGUobixlKX0sdSkpfWVsc2UgbnVsbCE9PXIudXNlP289dGhpcy5fZ2V0VXNlKHIudXNlLG4pLl9lbmNvZGUodCxlKToocz10aGlzLl9lbmNvZGVQcmltaXRpdmUoci50YWcsdCksYT0hMCk7aWYoIXIuYW55JiZudWxsPT09ci5jaG9pY2Upe3ZhciBjPW51bGwhPT1yLmltcGxpY2l0P3IuaW1wbGljaXQ6ci50YWcsaD1udWxsPT09ci5pbXBsaWNpdD8idW5pdmVyc2FsIjoiY29udGV4dCI7bnVsbD09PWM/bnVsbD09PXIudXNlJiZlLmVycm9yKCJUYWcgY291bGQgYmUgb21pdHRlZCBvbmx5IGZvciAudXNlKCkiKTpudWxsPT09ci51c2UmJihvPXRoaXMuX2VuY29kZUNvbXBvc2l0ZShjLGEsaCxzKSl9cmV0dXJuIG51bGwhPT1yLmV4cGxpY2l0JiYobz10aGlzLl9lbmNvZGVDb21wb3NpdGUoci5leHBsaWNpdCwhMSwiY29udGV4dCIsbykpLG99LGMucHJvdG90eXBlLl9lbmNvZGVDaG9pY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9iYXNlU3RhdGUsaT1uLmNob2ljZVt0LnR5cGVdO3JldHVybiBpfHxzKCExLHQudHlwZSsiIG5vdCBmb3VuZCBpbiAiK0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKG4uY2hvaWNlKSkpLGkuX2VuY29kZSh0LnZhbHVlLGUpfSxjLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYmFzZVN0YXRlO2lmKC9zdHIkLy50ZXN0KHQpKXJldHVybiB0aGlzLl9lbmNvZGVTdHIoZSx0KTtpZigib2JqaWQiPT09dCYmbi5hcmdzKXJldHVybiB0aGlzLl9lbmNvZGVPYmppZChlLG4ucmV2ZXJzZUFyZ3NbMF0sbi5hcmdzWzFdKTtpZigib2JqaWQiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZSxudWxsLG51bGwpO2lmKCJnZW50aW1lIj09PXR8fCJ1dGN0aW1lIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZSx0KTtpZigibnVsbF8iPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO2lmKCJpbnQiPT09dHx8ImVudW0iPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlSW50KGUsbi5hcmdzJiZuLnJldmVyc2VBcmdzWzBdKTtpZigiYm9vbCI9PT10KXJldHVybiB0aGlzLl9lbmNvZGVCb29sKGUpO2lmKCJvYmpEZXNjIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZVN0cihlLHQpO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgdGFnOiAiK3QpfSxjLnByb3RvdHlwZS5faXNOdW1zdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bMC05IF0qJC8udGVzdCh0KX0sYy5wcm90b3R5cGUuX2lzUHJpbnRzdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bQS1aYS16MC05ICdcKFwpXCssXC1cLlwvOj1cP10qJC8udGVzdCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDExMSk7ZS50YWdDbGFzcz17MDoidW5pdmVyc2FsIiwxOiJhcHBsaWNhdGlvbiIsMjoiY29udGV4dCIsMzoicHJpdmF0ZSJ9LGUudGFnQ2xhc3NCeU5hbWU9aS5fcmV2ZXJzZShlLnRhZ0NsYXNzKSxlLnRhZz17MDoiZW5kIiwxOiJib29sIiwyOiJpbnQiLDM6ImJpdHN0ciIsNDoib2N0c3RyIiw1OiJudWxsXyIsNjoib2JqaWQiLDc6Im9iakRlc2MiLDg6ImV4dGVybmFsIiw5OiJyZWFsIiwxMDoiZW51bSIsMTE6ImVtYmVkIiwxMjoidXRmOHN0ciIsMTM6InJlbGF0aXZlT2lkIiwxNjoic2VxIiwxNzoic2V0IiwxODoibnVtc3RyIiwxOToicHJpbnRzdHIiLDIwOiJ0NjFzdHIiLDIxOiJ2aWRlb3N0ciIsMjI6ImlhNXN0ciIsMjM6InV0Y3RpbWUiLDI0OiJnZW50aW1lIiwyNToiZ3JhcGhzdHIiLDI2OiJpc282NDZzdHIiLDI3OiJnZW5zdHIiLDI4OiJ1bmlzdHIiLDI5OiJjaGFyc3RyIiwzMDoiYm1wc3RyIn0sZS50YWdCeU5hbWU9aS5fcmV2ZXJzZShlLnRhZyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lO2kuZGVyPW4oMTEyKSxpLnBlbT1uKDIxNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDApLHI9big0KS5CdWZmZXIsbz1uKDExMik7ZnVuY3Rpb24gcyh0KXtvLmNhbGwodGhpcyx0KSx0aGlzLmVuYz0icGVtIn1pKHMsbyksdC5leHBvcnRzPXMscy5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQudG9TdHJpbmcoKS5zcGxpdCgvW1xyXG5dKy9nKSxpPWUubGFiZWwudG9VcHBlckNhc2UoKSxzPS9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLyxhPS0xLHU9LTEsYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgaD1uW2NdLm1hdGNoKHMpO2lmKG51bGwhPT1oJiZoWzJdPT09aSl7aWYoLTEhPT1hKXtpZigiRU5EIiE9PWhbMV0pYnJlYWs7dT1jO2JyZWFrfWlmKCJCRUdJTiIhPT1oWzFdKWJyZWFrO2E9Y319aWYoLTE9PT1hfHwtMT09PXUpdGhyb3cgbmV3IEVycm9yKCJQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAiK2kpO3ZhciBsPW4uc2xpY2UoYSsxLHUpLmpvaW4oIiIpO2wucmVwbGFjZSgvW15hLXowLTlcK1wvPV0rL2dpLCIiKTt2YXIgZD1uZXcgcihsLCJiYXNlNjQiKTtyZXR1cm4gby5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcyxkLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPWU7aS5kZXI9bigxMTMpLGkucGVtPW4oMjE5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMCkscj1uKDExMyk7ZnVuY3Rpb24gbyh0KXtyLmNhbGwodGhpcyx0KSx0aGlzLmVuYz0icGVtIn1pKG8sciksdC5leHBvcnRzPW8sby5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsdCkudG9TdHJpbmcoImJhc2U2NCIpLGk9WyItLS0tLUJFR0lOICIrZS5sYWJlbCsiLS0tLS0iXSxvPTA7bzxuLmxlbmd0aDtvKz02NClpLnB1c2gobi5zbGljZShvLG8rNjQpKTtyZXR1cm4gaS5wdXNoKCItLS0tLUVORCAiK2UubGFiZWwrIi0tLS0tIiksaS5qb2luKCJcbiIpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDM1KSxyPWkuZGVmaW5lKCJUaW1lIixmdW5jdGlvbigpe3RoaXMuY2hvaWNlKHt1dGNUaW1lOnRoaXMudXRjdGltZSgpLGdlbmVyYWxUaW1lOnRoaXMuZ2VudGltZSgpfSl9KSxvPWkuZGVmaW5lKCJBdHRyaWJ1dGVUeXBlVmFsdWUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInR5cGUiKS5vYmppZCgpLHRoaXMua2V5KCJ2YWx1ZSIpLmFueSgpKX0pLHM9aS5kZWZpbmUoIkFsZ29yaXRobUlkZW50aWZpZXIiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImFsZ29yaXRobSIpLm9iamlkKCksdGhpcy5rZXkoInBhcmFtZXRlcnMiKS5vcHRpb25hbCgpKX0pLGE9aS5kZWZpbmUoIlN1YmplY3RQdWJsaWNLZXlJbmZvIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS51c2UocyksdGhpcy5rZXkoInN1YmplY3RQdWJsaWNLZXkiKS5iaXRzdHIoKSl9KSx1PWkuZGVmaW5lKCJSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lIixmdW5jdGlvbigpe3RoaXMuc2V0b2Yobyl9KSxjPWkuZGVmaW5lKCJSRE5TZXF1ZW5jZSIsZnVuY3Rpb24oKXt0aGlzLnNlcW9mKHUpfSksaD1pLmRlZmluZSgiTmFtZSIsZnVuY3Rpb24oKXt0aGlzLmNob2ljZSh7cmRuU2VxdWVuY2U6dGhpcy51c2UoYyl9KX0pLGw9aS5kZWZpbmUoIlZhbGlkaXR5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJub3RCZWZvcmUiKS51c2UociksdGhpcy5rZXkoIm5vdEFmdGVyIikudXNlKHIpKX0pLGQ9aS5kZWZpbmUoIkV4dGVuc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiZXh0bklEIikub2JqaWQoKSx0aGlzLmtleSgiY3JpdGljYWwiKS5ib29sKCkuZGVmKCExKSx0aGlzLmtleSgiZXh0blZhbHVlIikub2N0c3RyKCkpfSksZj1pLmRlZmluZSgiVEJTQ2VydGlmaWNhdGUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5leHBsaWNpdCgwKS5pbnQoKSx0aGlzLmtleSgic2VyaWFsTnVtYmVyIikuaW50KCksdGhpcy5rZXkoInNpZ25hdHVyZSIpLnVzZShzKSx0aGlzLmtleSgiaXNzdWVyIikudXNlKGgpLHRoaXMua2V5KCJ2YWxpZGl0eSIpLnVzZShsKSx0aGlzLmtleSgic3ViamVjdCIpLnVzZShoKSx0aGlzLmtleSgic3ViamVjdFB1YmxpY0tleUluZm8iKS51c2UoYSksdGhpcy5rZXkoImlzc3VlclVuaXF1ZUlEIikuaW1wbGljaXQoMSkuYml0c3RyKCkub3B0aW9uYWwoKSx0aGlzLmtleSgic3ViamVjdFVuaXF1ZUlEIikuaW1wbGljaXQoMikuYml0c3RyKCkub3B0aW9uYWwoKSx0aGlzLmtleSgiZXh0ZW5zaW9ucyIpLmV4cGxpY2l0KDMpLnNlcW9mKGQpLm9wdGlvbmFsKCkpfSkscD1pLmRlZmluZSgiWDUwOUNlcnRpZmljYXRlIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ0YnNDZXJ0aWZpY2F0ZSIpLnVzZShmKSx0aGlzLmtleSgic2lnbmF0dXJlQWxnb3JpdGhtIikudXNlKHMpLHRoaXMua2V5KCJzaWduYXR1cmVWYWx1ZSIpLmJpdHN0cigpKX0pO3QuZXhwb3J0cz1wfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9eyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4xIjoiYWVzLTEyOC1lY2IiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yIjoiYWVzLTEyOC1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zIjoiYWVzLTEyOC1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40IjoiYWVzLTEyOC1jZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSI6ImFlcy0xOTItZWNiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjIiOiJhZXMtMTkyLWNiYyIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIzIjoiYWVzLTE5Mi1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCI6ImFlcy0xOTItY2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDEiOiJhZXMtMjU2LWVjYiIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQyIjoiYWVzLTI1Ni1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MyI6ImFlcy0yNTYtb2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDQiOiJhZXMtMjU2LWNmYiJ9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBpPS9Qcm9jLVR5cGU6IDQsRU5DUllQVEVEW1xuXHJdK0RFSy1JbmZvOiBBRVMtKCg/OjEyOCl8KD86MTkyKXwoPzoyNTYpKS1DQkMsKFswLTlBLUhdKylbXG5ccl0rKFswLTlBLXpcblxyXCtcL1w9XSspW1xuXHJdKy9tLHI9L14tLS0tLUJFR0lOICgoPzouKiBLRVkpfENFUlRJRklDQVRFKS0tLS0tL20sbz0vXi0tLS0tQkVHSU4gKCg/Oi4qIEtFWSl8Q0VSVElGSUNBVEUpLS0tLS0oWzAtOUEtelxuXHJcK1wvXD1dKyktLS0tLUVORCBcMS0tLS0tJC9tLHM9big0NiksYT1uKDY3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgdSxjPXQudG9TdHJpbmcoKSxoPWMubWF0Y2goaSk7aWYoaCl7dmFyIGw9ImFlcyIraFsxXSxkPW5ldyBlKGhbMl0sImhleCIpLGY9bmV3IGUoaFszXS5yZXBsYWNlKC9bXHJcbl0vZywiIiksImJhc2U2NCIpLHA9cyhuLGQuc2xpY2UoMCw4KSxwYXJzZUludChoWzFdLDEwKSkua2V5LG09W10sZz1hLmNyZWF0ZURlY2lwaGVyaXYobCxwLGQpO20ucHVzaChnLnVwZGF0ZShmKSksbS5wdXNoKGcuZmluYWwoKSksdT1lLmNvbmNhdChtKX1lbHNle3ZhciB2PWMubWF0Y2gobyk7dT1uZXcgZSh2WzJdLnJlcGxhY2UoL1tcclxuXS9nLCIiKSwiYmFzZTY0Iil9cmV0dXJue3RhZzpjLm1hdGNoKHIpWzFdLGRhdGE6dX19fSkuY2FsbCh0aGlzLG4oNCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgaT1uKDMpLHI9bigxMCkuZWMsbz1uKDQ5KSxzPW4oMTE0KTtmdW5jdGlvbiBhKHQsZSl7aWYodC5jbXBuKDApPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaWciKTtpZih0LmNtcChlKT49ZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2lnIil9dC5leHBvcnRzPWZ1bmN0aW9uKHQsbix1LGMsaCl7dmFyIGw9byh1KTtpZigiZWMiPT09bC50eXBlKXtpZigiZWNkc2EiIT09YyYmImVjZHNhL3JzYSIhPT1jKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1zW24uZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbigiLiIpXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY3VydmUgIituLmRhdGEuYWxnb3JpdGhtLmN1cnZlLmpvaW4oIi4iKSk7dmFyIG89bmV3IHIoaSksYT1uLmRhdGEuc3ViamVjdFByaXZhdGVLZXkuZGF0YTtyZXR1cm4gby52ZXJpZnkoZSx0LGEpfSh0LG4sbCl9aWYoImRzYSI9PT1sLnR5cGUpe2lmKCJkc2EiIT09Yyl0aHJvdyBuZXcgRXJyb3IoIndyb25nIHB1YmxpYyBrZXkgdHlwZSIpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9bi5kYXRhLnAscz1uLmRhdGEucSx1PW4uZGF0YS5nLGM9bi5kYXRhLnB1Yl9rZXksaD1vLnNpZ25hdHVyZS5kZWNvZGUodCwiZGVyIiksbD1oLnMsZD1oLnI7YShsLHMpLGEoZCxzKTt2YXIgZj1pLm1vbnQocikscD1sLmludm0ocyk7cmV0dXJuIDA9PT11LnRvUmVkKGYpLnJlZFBvdyhuZXcgaShlKS5tdWwocCkubW9kKHMpKS5mcm9tUmVkKCkubXVsKGMudG9SZWQoZikucmVkUG93KGQubXVsKHApLm1vZChzKSkuZnJvbVJlZCgpKS5tb2QocikubW9kKHMpLmNtcChkKX0odCxuLGwpfWlmKCJyc2EiIT09YyYmImVjZHNhL3JzYSIhPT1jKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7bj1lLmNvbmNhdChbaCxuXSk7Zm9yKHZhciBkPWwubW9kdWx1cy5ieXRlTGVuZ3RoKCksZj1bMV0scD0wO24ubGVuZ3RoK2YubGVuZ3RoKzI8ZDspZi5wdXNoKDI1NSkscCsrO2YucHVzaCgwKTtmb3IodmFyIG09LTE7KyttPG4ubGVuZ3RoOylmLnB1c2goblttXSk7Zj1uZXcgZShmKTt2YXIgZz1pLm1vbnQobC5tb2R1bHVzKTt0PSh0PW5ldyBpKHQpLnRvUmVkKGcpKS5yZWRQb3cobmV3IGkobC5wdWJsaWNFeHBvbmVudCkpLHQ9bmV3IGUodC5mcm9tUmVkKCkudG9BcnJheSgpKTt2YXIgdj1wPDg/MTowO2ZvcihkPU1hdGgubWluKHQubGVuZ3RoLGYubGVuZ3RoKSx0Lmxlbmd0aCE9PWYubGVuZ3RoJiYodj0xKSxtPS0xOysrbTxkOyl2fD10W21dXmZbbV07cmV0dXJuIDA9PT12fX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIGk9bigxMCkscj1uKDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHModCl9O3ZhciBvPXtzZWNwMjU2azE6e25hbWU6InNlY3AyNTZrMSIsYnl0ZUxlbmd0aDozMn0sc2VjcDIyNHIxOntuYW1lOiJwMjI0IixieXRlTGVuZ3RoOjI4fSxwcmltZTI1NnYxOntuYW1lOiJwMjU2IixieXRlTGVuZ3RoOjMyfSxwcmltZTE5MnYxOntuYW1lOiJwMTkyIixieXRlTGVuZ3RoOjI0fSxlZDI1NTE5OntuYW1lOiJlZDI1NTE5IixieXRlTGVuZ3RoOjMyfSxzZWNwMzg0cjE6e25hbWU6InAzODQiLGJ5dGVMZW5ndGg6NDh9LHNlY3A1MjFyMTp7bmFtZToicDUyMSIsYnl0ZUxlbmd0aDo2Nn19O2Z1bmN0aW9uIHModCl7dGhpcy5jdXJ2ZVR5cGU9b1t0XSx0aGlzLmN1cnZlVHlwZXx8KHRoaXMuY3VydmVUeXBlPXtuYW1lOnR9KSx0aGlzLmN1cnZlPW5ldyBpLmVjKHRoaXMuY3VydmVUeXBlLm5hbWUpLHRoaXMua2V5cz12b2lkIDB9ZnVuY3Rpb24gYSh0LG4saSl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9dC50b0FycmF5KCkpO3ZhciByPW5ldyBlKHQpO2lmKGkmJnIubGVuZ3RoPGkpe3ZhciBvPW5ldyBlKGktci5sZW5ndGgpO28uZmlsbCgwKSxyPWUuY29uY2F0KFtvLHJdKX1yZXR1cm4gbj9yLnRvU3RyaW5nKG4pOnJ9by5wMjI0PW8uc2VjcDIyNHIxLG8ucDI1Nj1vLnNlY3AyNTZyMT1vLnByaW1lMjU2djEsby5wMTkyPW8uc2VjcDE5MnIxPW8ucHJpbWUxOTJ2MSxvLnAzODQ9by5zZWNwMzg0cjEsby5wNTIxPW8uc2VjcDUyMXIxLHMucHJvdG90eXBlLmdlbmVyYXRlS2V5cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmtleXM9dGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCksdGhpcy5nZXRQdWJsaWNLZXkodCxlKX0scy5wcm90b3R5cGUuY29tcHV0ZVNlY3JldD1mdW5jdGlvbih0LG4saSl7cmV0dXJuIG49bnx8InV0ZjgiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQsbikpLGEodGhpcy5jdXJ2ZS5rZXlGcm9tUHVibGljKHQpLmdldFB1YmxpYygpLm11bCh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpKS5nZXRYKCksaSx0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKX0scy5wcm90b3R5cGUuZ2V0UHVibGljS2V5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5rZXlzLmdldFB1YmxpYygiY29tcHJlc3NlZCI9PT1lLCEwKTtyZXR1cm4iaHlicmlkIj09PWUmJihuW24ubGVuZ3RoLTFdJTI/blswXT03Om5bMF09NiksYShuLHQpfSxzLnByb3RvdHlwZS5nZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQpe3JldHVybiBhKHRoaXMua2V5cy5nZXRQcml2YXRlKCksdCl9LHMucHJvdG90eXBlLnNldFB1YmxpY0tleT1mdW5jdGlvbih0LG4pe3JldHVybiBuPW58fCJ1dGY4IixlLmlzQnVmZmVyKHQpfHwodD1uZXcgZSh0LG4pKSx0aGlzLmtleXMuX2ltcG9ydFB1YmxpYyh0KSx0aGlzfSxzLnByb3RvdHlwZS5zZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQsbil7bj1ufHwidXRmOCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxuKSk7dmFyIGk9bmV3IHIodCk7cmV0dXJuIGk9aS50b1N0cmluZygxNiksdGhpcy5rZXlzPXRoaXMuY3VydmUuZ2VuS2V5UGFpcigpLHRoaXMua2V5cy5faW1wb3J0UHJpdmF0ZShpKSx0aGlzfX0pLmNhbGwodGhpcyxuKDQpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXtlLnB1YmxpY0VuY3J5cHQ9bigyMjYpLGUucHJpdmF0ZURlY3J5cHQ9bigyMjcpLGUucHJpdmF0ZUVuY3J5cHQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5wdWJsaWNFbmNyeXB0KHQsbiwhMCl9LGUucHVibGljRGVjcnlwdD1mdW5jdGlvbih0LG4pe3JldHVybiBlLnByaXZhdGVEZWNyeXB0KHQsbiwhMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big0OSkscj1uKDI3KSxvPW4oMzEpLHM9bigxMTUpLGE9bigxMTYpLHU9bigzKSxjPW4oMTE3KSxoPW4oNjkpLGw9bigxKS5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgZDtkPXQucGFkZGluZz90LnBhZGRpbmc6bj8xOjQ7dmFyIGYscD1pKHQpO2lmKDQ9PT1kKWY9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGk9ZS5sZW5ndGgsYz1vKCJzaGExIikudXBkYXRlKGwuYWxsb2MoMCkpLmRpZ2VzdCgpLGg9Yy5sZW5ndGgsZD0yKmg7aWYoaT5uLWQtMil0aHJvdyBuZXcgRXJyb3IoIm1lc3NhZ2UgdG9vIGxvbmciKTt2YXIgZj1sLmFsbG9jKG4taS1kLTIpLHA9bi1oLTEsbT1yKGgpLGc9YShsLmNvbmNhdChbYyxmLGwuYWxsb2MoMSwxKSxlXSxwKSxzKG0scCkpLHY9YShtLHMoZyxoKSk7cmV0dXJuIG5ldyB1KGwuY29uY2F0KFtsLmFsbG9jKDEpLHYsZ10sbikpfShwLGUpO2Vsc2UgaWYoMT09PWQpZj1mdW5jdGlvbih0LGUsbil7dmFyIGksbz1lLmxlbmd0aCxzPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCk7aWYobz5zLTExKXRocm93IG5ldyBFcnJvcigibWVzc2FnZSB0b28gbG9uZyIpO2k9bj9sLmFsbG9jKHMtby0zLDI1NSk6ZnVuY3Rpb24odCl7dmFyIGUsbj1sLmFsbG9jVW5zYWZlKHQpLGk9MCxvPXIoMip0KSxzPTA7Zm9yKDtpPHQ7KXM9PT1vLmxlbmd0aCYmKG89cigyKnQpLHM9MCksKGU9b1tzKytdKSYmKG5baSsrXT1lKTtyZXR1cm4gbn0ocy1vLTMpO3JldHVybiBuZXcgdShsLmNvbmNhdChbbC5mcm9tKFswLG4/MToyXSksaSxsLmFsbG9jKDEpLGVdLHMpKX0ocCxlLG4pO2Vsc2V7aWYoMyE9PWQpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHBhZGRpbmciKTtpZigoZj1uZXcgdShlKSkuY21wKHAubW9kdWx1cyk+PTApdGhyb3cgbmV3IEVycm9yKCJkYXRhIHRvbyBsb25nIGZvciBtb2R1bHVzIil9cmV0dXJuIG4/aChmLHApOmMoZixwKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDQ5KSxyPW4oMTE1KSxvPW4oMTE2KSxzPW4oMyksYT1uKDY5KSx1PW4oMzEpLGM9bigxMTcpLGg9bigxKS5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbDtsPXQucGFkZGluZz90LnBhZGRpbmc6bj8xOjQ7dmFyIGQsZj1pKHQpLHA9Zi5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtpZihlLmxlbmd0aD5wfHxuZXcgcyhlKS5jbXAoZi5tb2R1bHVzKT49MCl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTtkPW4/YyhuZXcgcyhlKSxmKTphKGUsZik7dmFyIG09aC5hbGxvYyhwLWQubGVuZ3RoKTtpZihkPWguY29uY2F0KFttLGRdLHApLDQ9PT1sKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCksaT11KCJzaGExIikudXBkYXRlKGguYWxsb2MoMCkpLmRpZ2VzdCgpLHM9aS5sZW5ndGg7aWYoMCE9PWVbMF0pdGhyb3cgbmV3IEVycm9yKCJkZWNyeXB0aW9uIGVycm9yIik7dmFyIGE9ZS5zbGljZSgxLHMrMSksYz1lLnNsaWNlKHMrMSksbD1vKGEscihjLHMpKSxkPW8oYyxyKGwsbi1zLTEpKTtpZihmdW5jdGlvbih0LGUpe3Q9aC5mcm9tKHQpLGU9aC5mcm9tKGUpO3ZhciBuPTAsaT10Lmxlbmd0aDt0Lmxlbmd0aCE9PWUubGVuZ3RoJiYobisrLGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpKTt2YXIgcj0tMTtmb3IoOysrcjxpOyluKz10W3JdXmVbcl07cmV0dXJuIG59KGksZC5zbGljZSgwLHMpKSl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTt2YXIgZj1zO2Zvcig7MD09PWRbZl07KWYrKztpZigxIT09ZFtmKytdKXRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpO3JldHVybiBkLnNsaWNlKGYpfShmLGQpO2lmKDE9PT1sKXJldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5zbGljZSgwLDIpLHI9MixvPTA7Zm9yKDswIT09ZVtyKytdOylpZihyPj1lLmxlbmd0aCl7bysrO2JyZWFrfXZhciBzPWUuc2xpY2UoMixyLTEpOygiMDAwMiIhPT1pLnRvU3RyaW5nKCJoZXgiKSYmIW58fCIwMDAxIiE9PWkudG9TdHJpbmcoImhleCIpJiZuKSYmbysrO3MubGVuZ3RoPDgmJm8rKztpZihvKXRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpO3JldHVybiBlLnNsaWNlKHIpfSgwLGQsbik7aWYoMz09PWwpcmV0dXJuIGQ7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHBhZGRpbmciKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigic2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclxudXNlIGNocm9tZSwgRmlyZUZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfXZhciBvPW4oMSkscz1uKDI3KSxhPW8uQnVmZmVyLHU9by5rTWF4TGVuZ3RoLGM9dC5jcnlwdG98fHQubXNDcnlwdG8saD1NYXRoLnBvdygyLDMyKS0xO2Z1bmN0aW9uIGwodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQhPXQpdGhyb3cgbmV3IFR5cGVFcnJvcigib2Zmc2V0IG11c3QgYmUgYSBudW1iZXIiKTtpZih0Pmh8fHQ8MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvZmZzZXQgbXVzdCBiZSBhIHVpbnQzMiIpO2lmKHQ+dXx8dD5lKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZCh0LGUsbil7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0IT10KXRocm93IG5ldyBUeXBlRXJyb3IoInNpemUgbXVzdCBiZSBhIG51bWJlciIpO2lmKHQ+aHx8dDwwKXRocm93IG5ldyBUeXBlRXJyb3IoInNpemUgbXVzdCBiZSBhIHVpbnQzMiIpO2lmKHQrZT5ufHx0PnUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImJ1ZmZlciB0b28gc21hbGwiKX1mdW5jdGlvbiBmKHQsZSxuLHIpe2lmKGkuYnJvd3Nlcil7dmFyIG89dC5idWZmZXIsYT1uZXcgVWludDhBcnJheShvLGUsbik7cmV0dXJuIGMuZ2V0UmFuZG9tVmFsdWVzKGEpLHI/dm9pZCBpLm5leHRUaWNrKGZ1bmN0aW9uKCl7cihudWxsLHQpfSk6dH1pZighcilyZXR1cm4gcyhuKS5jb3B5KHQsZSksdDtzKG4sZnVuY3Rpb24obixpKXtpZihuKXJldHVybiByKG4pO2kuY29weSh0LGUpLHIobnVsbCx0KX0pfWMmJmMuZ2V0UmFuZG9tVmFsdWVzfHwhaS5icm93c2VyPyhlLnJhbmRvbUZpbGw9ZnVuY3Rpb24oZSxuLGkscil7aWYoIShhLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgdC5VaW50OEFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyPW4sbj0wLGk9ZS5sZW5ndGg7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgaSlyPWksaT1lLmxlbmd0aC1uO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignImNiIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gbChuLGUubGVuZ3RoKSxkKGksbixlLmxlbmd0aCksZihlLG4saSxyKX0sZS5yYW5kb21GaWxsU3luYz1mdW5jdGlvbihlLG4saSl7dm9pZCAwPT09biYmKG49MCk7aWYoIShhLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgdC5VaW50OEFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtsKG4sZS5sZW5ndGgpLHZvaWQgMD09PWkmJihpPWUubGVuZ3RoLW4pO3JldHVybiBkKGksbixlLmxlbmd0aCksZihlLG4saSl9KTooZS5yYW5kb21GaWxsPXIsZS5yYW5kb21GaWxsU3luYz1yKX0pLmNhbGwodGhpcyxuKDEzKSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMubmFtZT10LHRoaXMuX3Rva2VuU3RydWN0dXJhbFByb3BlcnR5VD1udWxsfX0oKTtlLlRva2VuPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oODIpOyFmdW5jdGlvbih0KXt0LnV1aWQ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBVaW50OEFycmF5KDE2KSxlPW5ldyBBcnJheSgyNTYpLG49MDtuPDE2OysrbillW25dPSIwIituLnRvU3RyaW5nKDE2KTtmb3Iobj0xNjtuPDI1NjsrK24pZVtuXT1uLnRvU3RyaW5nKDE2KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5SYW5kb20uZ2V0UmFuZG9tVmFsdWVzKHQpLHRbNl09NjR8MTUmdFs2XSx0WzhdPTEyOHw2MyZ0WzhdLGVbdFswXV0rZVt0WzFdXStlW3RbMl1dK2VbdFszXV0rIi0iK2VbdFs0XV0rZVt0WzVdXSsiLSIrZVt0WzZdXStlW3RbN11dKyItIitlW3RbOF1dK2VbdFs5XV0rIi0iK2VbdFsxMF1dK2VbdFsxMV1dK2VbdFsxMl1dK2VbdFsxM11dK2VbdFsxNF1dK2VbdFsxNV1dfX0oKX0oZS5VVUlEfHwoZS5VVUlEPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzMykscj1uKDM4KTt0LmV4cG9ydHM9ZnVuY3Rpb24gdChlLG4sbyxzLGEpe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFyKGUpJiYhcihuKT9lIT1lJiZuIT1uOmkoZSxuLG8scyx0LGEpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDIzNCkscj1uKDEyNCksbz1uKDI2OCkscz1uKDI3MiksYT1uKDI5MyksdT1uKDczKSxjPW4oMTI1KSxoPW4oMTI2KSxsPTEsZD0iW29iamVjdCBBcmd1bWVudHNdIixmPSJbb2JqZWN0IEFycmF5XSIscD0iW29iamVjdCBPYmplY3RdIixtPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGcsdixiKXt2YXIgeT11KHQpLF89dShlKSx3PXk/ZjphKHQpLHg9Xz9mOmEoZSksTT0odz13PT1kP3A6dyk9PXAsUz0oeD14PT1kP3A6eCk9PXAsRT13PT14O2lmKEUmJmModCkpe2lmKCFjKGUpKXJldHVybiExO3k9ITAsTT0hMX1pZihFJiYhTSlyZXR1cm4gYnx8KGI9bmV3IGkpLHl8fGgodCk/cih0LGUsbixnLHYsYik6byh0LGUsdyxuLGcsdixiKTtpZighKG4mbCkpe3ZhciBBPU0mJm0uY2FsbCh0LCJfX3dyYXBwZWRfXyIpLEM9UyYmbS5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoQXx8Qyl7dmFyIGs9QT90LnZhbHVlKCk6dCxPPUM/ZS52YWx1ZSgpOmU7cmV0dXJuIGJ8fChiPW5ldyBpKSx2KGssTyxuLGcsYil9fXJldHVybiEhRSYmKGJ8fChiPW5ldyBpKSxzKHQsZSxuLGcsdixiKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1MCkscj1uKDI0MCksbz1uKDI0MSkscz1uKDI0MiksYT1uKDI0MyksdT1uKDI0NCk7ZnVuY3Rpb24gYyh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBpKHQpO3RoaXMuc2l6ZT1lLnNpemV9Yy5wcm90b3R5cGUuY2xlYXI9cixjLnByb3RvdHlwZS5kZWxldGU9byxjLnByb3RvdHlwZS5nZXQ9cyxjLnByb3RvdHlwZS5oYXM9YSxjLnByb3RvdHlwZS5zZXQ9dSx0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpLHI9QXJyYXkucHJvdG90eXBlLnNwbGljZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWkoZSx0KTtyZXR1cm4hKG48MHx8KG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpyLmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLDApKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWkoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLl9fZGF0YV9fLHQpPi0xfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1pKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1MCk7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgaSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTApLHI9big3MSksbz1uKDEyMykscz0yMDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgaSl7dmFyIGE9bi5fX2RhdGFfXztpZighcnx8YS5sZW5ndGg8cy0xKXJldHVybiBhLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgbyhhKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMTkpLHI9bigyNDgpLG89bigxMjEpLHM9bigxMjIpLGE9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sdT1GdW5jdGlvbi5wcm90b3R5cGUsYz1PYmplY3QucHJvdG90eXBlLGg9dS50b1N0cmluZyxsPWMuaGFzT3duUHJvcGVydHksZD1SZWdFeHAoIl4iK2guY2FsbChsKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISghbyh0KXx8cih0KSkmJihpKHQpP2Q6YSkudGVzdChzKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDcyKSxyPU9iamVjdC5wcm90b3R5cGUsbz1yLmhhc093blByb3BlcnR5LHM9ci50b1N0cmluZyxhPWk/aS50b1N0cmluZ1RhZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8uY2FsbCh0LGEpLG49dFthXTt0cnl7dFthXT12b2lkIDA7dmFyIGk9ITB9Y2F0Y2godCl7fXZhciByPXMuY2FsbCh0KTtyZXR1cm4gaSYmKGU/dFthXT1uOmRlbGV0ZSB0W2FdKSxyfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9bigyNDkpLG89KGk9L1teLl0rJC8uZXhlYyhyJiZyLmtleXMmJnIua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2k6IiI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiEhbyYmbyBpbiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTkpWyJfX2NvcmUtanNfc2hhcmVkX18iXTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI1Mikscj1uKDUwKSxvPW4oNzEpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGksbWFwOm5ldyhvfHxyKSxzdHJpbmc6bmV3IGl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjUzKSxyPW4oMjU0KSxvPW4oMjU1KSxzPW4oMjU2KSxhPW4oMjU3KTtmdW5jdGlvbiB1KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fXUucHJvdG90eXBlLmNsZWFyPWksdS5wcm90b3R5cGUuZGVsZXRlPXIsdS5wcm90b3R5cGUuZ2V0PW8sdS5wcm90b3R5cGUuaGFzPXMsdS5wcm90b3R5cGUuc2V0PWEsdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWk/aShudWxsKTp7fSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTIpLHI9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihpKXt2YXIgbj1lW3RdO3JldHVybiBuPT09cj92b2lkIDA6bn1yZXR1cm4gby5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Mikscj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBpP3ZvaWQgMCE9PWVbdF06ci5jYWxsKGUsdCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Mikscj0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsblt0XT1pJiZ2b2lkIDA9PT1lP3I6ZSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQpLmdldCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDUzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0KS5oYXModCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTIzKSxyPW4oMjY0KSxvPW4oMjY1KTtmdW5jdGlvbiBzKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBpOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1zLnByb3RvdHlwZS5hZGQ9cy5wcm90b3R5cGUucHVzaD1yLHMucHJvdG90eXBlLmhhcz1vLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUpe3ZhciBuPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsbiksdGhpc319LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oNzIpLHI9bigyNjkpLG89bigxMTgpLHM9bigxMjQpLGE9bigyNzApLHU9bigyNzEpLGM9MSxoPTIsbD0iW29iamVjdCBCb29sZWFuXSIsZD0iW29iamVjdCBEYXRlXSIsZj0iW29iamVjdCBFcnJvcl0iLHA9IltvYmplY3QgTWFwXSIsbT0iW29iamVjdCBOdW1iZXJdIixnPSJbb2JqZWN0IFJlZ0V4cF0iLHY9IltvYmplY3QgU2V0XSIsYj0iW29iamVjdCBTdHJpbmddIix5PSJbb2JqZWN0IFN5bWJvbF0iLF89IltvYmplY3QgQXJyYXlCdWZmZXJdIix3PSJbb2JqZWN0IERhdGFWaWV3XSIseD1pP2kucHJvdG90eXBlOnZvaWQgMCxNPXg/eC52YWx1ZU9mOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4saSx4LFMsRSl7c3dpdGNoKG4pe2Nhc2UgdzppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgXzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhUyhuZXcgcih0KSxuZXcgcihlKSkpO2Nhc2UgbDpjYXNlIGQ6Y2FzZSBtOnJldHVybiBvKCt0LCtlKTtjYXNlIGY6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIGc6Y2FzZSBiOnJldHVybiB0PT1lKyIiO2Nhc2UgcDp2YXIgQT1hO2Nhc2Ugdjp2YXIgQz1pJmM7aWYoQXx8KEE9dSksdC5zaXplIT1lLnNpemUmJiFDKXJldHVybiExO3ZhciBrPUUuZ2V0KHQpO2lmKGspcmV0dXJuIGs9PWU7aXw9aCxFLnNldCh0LGUpO3ZhciBPPXMoQSh0KSxBKGUpLGkseCxTLEUpO3JldHVybiBFLmRlbGV0ZSh0KSxPO2Nhc2UgeTppZihNKXJldHVybiBNLmNhbGwodCk9PU0uY2FsbChlKX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDE5KS5VaW50OEFycmF5O3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0LGkpe25bKytlXT1baSx0XX0pLG59fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtuWysrZV09dH0pLG59fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyNzMpLHI9MSxvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHMsYSx1KXt2YXIgYz1uJnIsaD1pKHQpLGw9aC5sZW5ndGg7aWYobCE9aShlKS5sZW5ndGgmJiFjKXJldHVybiExO2Zvcih2YXIgZD1sO2QtLTspe3ZhciBmPWhbZF07aWYoIShjP2YgaW4gZTpvLmNhbGwoZSxmKSkpcmV0dXJuITF9dmFyIHA9dS5nZXQodCk7aWYocCYmdS5nZXQoZSkpcmV0dXJuIHA9PWU7dmFyIG09ITA7dS5zZXQodCxlKSx1LnNldChlLHQpO2Zvcih2YXIgZz1jOysrZDxsOyl7dmFyIHY9dFtmPWhbZF1dLGI9ZVtmXTtpZihzKXZhciB5PWM/cyhiLHYsZixlLHQsdSk6cyh2LGIsZix0LGUsdSk7aWYoISh2b2lkIDA9PT15P3Y9PT1ifHxhKHYsYixuLHMsdSk6eSkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09Zil9aWYobSYmIWcpe3ZhciBfPXQuY29uc3RydWN0b3Isdz1lLmNvbnN0cnVjdG9yO18hPXcmJiJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSYmISgiZnVuY3Rpb24iPT10eXBlb2YgXyYmXyBpbnN0YW5jZW9mIF8mJiJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdykmJihtPSExKX1yZXR1cm4gdS5kZWxldGUodCksdS5kZWxldGUoZSksbX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3NCkscj1uKDI3Niksbz1uKDI3OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQsbyxyKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI3NSkscj1uKDczKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWUodCk7cmV0dXJuIHIodCk/bzppKG8sbih0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxpPWUubGVuZ3RoLHI9dC5sZW5ndGg7KytuPGk7KXRbcituXT1lW25dO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMjc3KSxyPW4oMjc4KSxvPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUscz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGE9cz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksaShzKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBvLmNhbGwodCxlKX0pKX06cjt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEsaT1udWxsPT10PzA6dC5sZW5ndGgscj0wLG89W107KytuPGk7KXt2YXIgcz10W25dO2UocyxuLHQpJiYob1tyKytdPXMpfXJldHVybiBvfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI4MCkscj1uKDI4OSksbz1uKDI5Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpP2kodCk6cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI4MSkscj1uKDI4Miksbz1uKDczKSxzPW4oMTI1KSxhPW4oMjg1KSx1PW4oMTI2KSxjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49byh0KSxoPSFuJiZyKHQpLGw9IW4mJiFoJiZzKHQpLGQ9IW4mJiFoJiYhbCYmdSh0KSxmPW58fGh8fGx8fGQscD1mP2kodC5sZW5ndGgsU3RyaW5nKTpbXSxtPXAubGVuZ3RoO2Zvcih2YXIgZyBpbiB0KSFlJiYhYy5jYWxsKHQsZyl8fGYmJigibGVuZ3RoIj09Z3x8bCYmKCJvZmZzZXQiPT1nfHwicGFyZW50Ij09Zyl8fGQmJigiYnVmZmVyIj09Z3x8ImJ5dGVMZW5ndGgiPT1nfHwiYnl0ZU9mZnNldCI9PWcpfHxhKGcsbSkpfHxwLnB1c2goZyk7cmV0dXJuIHB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxpPUFycmF5KHQpOysrbjx0OylpW25dPWUobik7cmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyODMpLHI9bigzOCksbz1PYmplY3QucHJvdG90eXBlLHM9by5oYXNPd25Qcm9wZXJ0eSxhPW8ucHJvcGVydHlJc0VudW1lcmFibGUsdT1pKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/aTpmdW5jdGlvbih0KXtyZXR1cm4gcih0KSYmcy5jYWxsKHQsImNhbGxlZSIpJiYhYS5jYWxsKHQsImNhbGxlZSIpfTt0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzcpLHI9bigzOCksbz0iW29iamVjdCBBcmd1bWVudHNdIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkmJmkodCk9PW99fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiExfX0sZnVuY3Rpb24odCxlKXt2YXIgbj05MDA3MTk5MjU0NzQwOTkxLGk9L14oPzowfFsxLTldXGQqKSQvO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9uOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDM3KSxyPW4oMTI3KSxvPW4oMzgpLHM9e307c1siW29iamVjdCBGbG9hdDMyQXJyYXldIl09c1siW29iamVjdCBGbG9hdDY0QXJyYXldIl09c1siW29iamVjdCBJbnQ4QXJyYXldIl09c1siW29iamVjdCBJbnQxNkFycmF5XSJdPXNbIltvYmplY3QgSW50MzJBcnJheV0iXT1zWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09c1siW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1zWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPXNbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsc1siW29iamVjdCBBcmd1bWVudHNdIl09c1siW29iamVjdCBBcnJheV0iXT1zWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPXNbIltvYmplY3QgQm9vbGVhbl0iXT1zWyJbb2JqZWN0IERhdGFWaWV3XSJdPXNbIltvYmplY3QgRGF0ZV0iXT1zWyJbb2JqZWN0IEVycm9yXSJdPXNbIltvYmplY3QgRnVuY3Rpb25dIl09c1siW29iamVjdCBNYXBdIl09c1siW29iamVjdCBOdW1iZXJdIl09c1siW29iamVjdCBPYmplY3RdIl09c1siW29iamVjdCBSZWdFeHBdIl09c1siW29iamVjdCBTZXRdIl09c1siW29iamVjdCBTdHJpbmddIl09c1siW29iamVjdCBXZWFrTWFwXSJdPSExLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmcih0Lmxlbmd0aCkmJiEhc1tpKHQpXX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciBpPW4oMTIwKSxyPWUmJiFlLm5vZGVUeXBlJiZlLG89ciYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiYhdC5ub2RlVHlwZSYmdCxzPW8mJm8uZXhwb3J0cz09PXImJmkucHJvY2VzcyxhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fHMmJnMuYmluZGluZyYmcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9YX0pLmNhbGwodGhpcyxuKDQ3KSh0KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5MCkscj1uKDI5MSksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighaSh0KSlyZXR1cm4gcih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKW8uY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEyOCkoT2JqZWN0LmtleXMsT2JqZWN0KTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTE5KSxyPW4oMTI3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnIodC5sZW5ndGgpJiYhaSh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5NCkscj1uKDcxKSxvPW4oMjk1KSxzPW4oMjk2KSxhPW4oMjk3KSx1PW4oMzcpLGM9bigxMjIpLGg9YyhpKSxsPWMociksZD1jKG8pLGY9YyhzKSxwPWMoYSksbT11OyhpJiYiW29iamVjdCBEYXRhVmlld10iIT1tKG5ldyBpKG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxyJiYiW29iamVjdCBNYXBdIiE9bShuZXcgcil8fG8mJiJbb2JqZWN0IFByb21pc2VdIiE9bShvLnJlc29sdmUoKSl8fHMmJiJbb2JqZWN0IFNldF0iIT1tKG5ldyBzKXx8YSYmIltvYmplY3QgV2Vha01hcF0iIT1tKG5ldyBhKSkmJihtPWZ1bmN0aW9uKHQpe3ZhciBlPXUodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxpPW4/YyhuKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIGg6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIGw6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSBkOnJldHVybiJbb2JqZWN0IFByb21pc2VdIjtjYXNlIGY6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBwOnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pLHQuZXhwb3J0cz1tfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIkRhdGFWaWV3Iik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDI5KShuKDE5KSwiUHJvbWlzZSIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIlNldCIpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigyOSkobigxOSksIldlYWtNYXAiKTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMzcpLHI9bigyOTkpLG89bigzOCkscz0iW29iamVjdCBPYmplY3RdIixhPUZ1bmN0aW9uLnByb3RvdHlwZSx1PU9iamVjdC5wcm90b3R5cGUsYz1hLnRvU3RyaW5nLGg9dS5oYXNPd25Qcm9wZXJ0eSxsPWMuY2FsbChPYmplY3QpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbyh0KXx8aSh0KSE9cylyZXR1cm4hMTt2YXIgZT1yKHQpO2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciBuPWguY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmYy5jYWxsKG4pPT1sfX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTI4KShPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDI1KTtlLnNldD1mdW5jdGlvbih0LGUsbil7aWYobnVsbD09dClyZXR1cm4gdGhpczt2YXIgbztpZigib2JqZWN0Ij09dHlwZW9mIHQ/KG89dCxuPWUpOihvPXt9KVt0XT1lLG58fChuPXt9KSwhdGhpcy5fdmFsaWRhdGUobyxuKSlyZXR1cm4hMTt2YXIgcz1uLnVuc2V0LGE9bi5zaWxlbnQsdT1bXSxjPXRoaXMuX2NoYW5naW5nO3RoaXMuX2NoYW5naW5nPSEwLGN8fCh0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM9aSh7fSx0aGlzLmF0dHJpYnV0ZXMpLHRoaXMuY2hhbmdlZD17fSk7dmFyIGg9dGhpcy5hdHRyaWJ1dGVzLGw9dGhpcy5jaGFuZ2VkLGQ9dGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzO2Zvcih2YXIgZiBpbiBvKWU9b1tmXSxyLmlzRXF1YWwoaFtmXSxlKXx8dS5wdXNoKGYpLHIuaXNFcXVhbChkW2ZdLGUpP2RlbGV0ZSBsW2ZdOmxbZl09ZSxzP2RlbGV0ZSBoW2ZdOmhbZl09ZTtpZih0aGlzLmlkPXRoaXMuZ2V0KHRoaXMuaWRBdHRyaWJ1dGUpLCFhKXt1Lmxlbmd0aCYmKHRoaXMuX3BlbmRpbmc9bik7Zm9yKHZhciBwPTA7cDx1Lmxlbmd0aDtwKyspdGhpcy50cmlnZ2VyKCJjaGFuZ2U6Iit1W3BdLHRoaXMsaFt1W3BdXSxuKX1pZihjKXJldHVybiB0aGlzO2lmKCFhKWZvcig7dGhpcy5fcGVuZGluZzspbj10aGlzLl9wZW5kaW5nLHRoaXMuX3BlbmRpbmc9ITEsdGhpcy50cmlnZ2VyKCJjaGFuZ2UiLHRoaXMsbik7cmV0dXJuIHRoaXMuX3BlbmRpbmc9ITEsdGhpcy5fY2hhbmdpbmc9ITEsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTI5KSxzPUVsZW1lbnQucHJvdG90eXBlLGE9cy5tYXRjaGVzfHxzLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cy5tb3pNYXRjaGVzU2VsZWN0b3J8fHMubXNNYXRjaGVzU2VsZWN0b3J8fHMub01hdGNoZXNTZWxlY3Rvcnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSh0aGlzLmRvY3VtZW50fHx0aGlzLm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwodCksbj1lLmxlbmd0aDstLW4+PTAmJmUuaXRlbShuKSE9PXRoaXM7KTtyZXR1cm4gbj4tMX0sdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKCl7dGhpcy51bmRlbGVnYXRlRXZlbnRzKCksdGhpcy5lbC5wYXJlbnROb2RlJiZ0aGlzLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbCl9LGUucHJvdG90eXBlLl9zZXRFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuZWw9dH0sZS5wcm90b3R5cGUuX3NldEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpZSBpbiB0aGlzLmVsP3RoaXMuZWxbZV09dFtlXTp0aGlzLmVsLnNldEF0dHJpYnV0ZShlLHRbZV0pfSxlLnByb3RvdHlwZS5kZWxlZ2F0ZT1mdW5jdGlvbih0LGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9bnVsbCksdm9pZCAwPT09dGhpcy5fZG9tRXZlbnRzJiYodGhpcy5fZG9tRXZlbnRzPVtdKTt2YXIgaT10aGlzLmVsLHI9ZT9mdW5jdGlvbih0KXtmb3IodmFyIHI9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtyJiZyIT09aTtyPXIucGFyZW50Tm9kZSlpZihhLmNhbGwocixlKSlyZXR1cm4gdC5kZWxlZ2F0ZVRhcmdldD1yLG4uaGFuZGxlRXZlbnQ/bi5oYW5kbGVFdmVudCh0KTpuKHQpfTpuO3JldHVybiB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIodCxyLCExKSx0aGlzLl9kb21FdmVudHMucHVzaCh7ZXZlbnROYW1lOnQsaGFuZGxlcjpyLGxpc3RlbmVyOm4sc2VsZWN0b3I6ZX0pLHJ9LGUucHJvdG90eXBlLnVuZGVsZWdhdGU9ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobj1lLGU9bnVsbCksdGhpcy5lbCYmdGhpcy5fZG9tRXZlbnRzKWZvcih2YXIgaT10aGlzLl9kb21FdmVudHMuc2xpY2UoKSxyPWkubGVuZ3RoO3ItLTspe3ZhciBvPWlbcl07IShvLmV2ZW50TmFtZSE9PXR8fG4mJm8ubGlzdGVuZXIhPT1ufHxlJiZvLnNlbGVjdG9yIT09ZSkmJih0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoby5ldmVudE5hbWUsby5oYW5kbGVyLCExKSx0aGlzLl9kb21FdmVudHMuc3BsaWNlKHIsMSkpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS51bmRlbGVnYXRlRXZlbnRzPWZ1bmN0aW9uKCl7aWYodGhpcy5lbCYmdGhpcy5fZG9tRXZlbnRzKXtmb3IodmFyIHQ9dGhpcy5fZG9tRXZlbnRzLmxlbmd0aCxlPTA7ZTx0O2UrKyl7dmFyIG49dGhpcy5fZG9tRXZlbnRzW2VdO3RoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLmV2ZW50TmFtZSxuLmhhbmRsZXIsITEpfXRoaXMuX2RvbUV2ZW50cy5sZW5ndGg9MH1yZXR1cm4gdGhpc30sZX0oby5WaWV3KTtlLk5hdGl2ZVZpZXc9dX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpLHI9KGk9aTwwP01hdGgubWF4KDAsaStvKTpNYXRoLm1pbihpLG8tMSkpPG4/aSsxKyhvLW4pOmktbisxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuK3MpJW87aWYodFthXT09PWUpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtyPShuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpKTwoaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk/bisxKyhvLWkpOm4taSsxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuLXMrbyklbztpZih0W2FdPT09ZSlyZXR1cm4gYX1yZXR1cm4tMX1mdW5jdGlvbiBpKHQsZSxuLGkpe3ZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPS0xKTt2YXIgcixvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybi0xO249bjwwP01hdGgubWF4KDAsbitvKTpNYXRoLm1pbihuLG8tMSkscj0oaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk8bj9pKzErKG8tbik6aS1uKzE7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9KG4rcyklbztpZihlKHRbYV0sYSkpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gcih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIHIsbz10Lmxlbmd0aDtpZigwPT09bylyZXR1cm4tMTtyPShuPW48MD9NYXRoLm1heCgwLG4rbyk6TWF0aC5taW4obixvLTEpKTwoaT1pPDA/TWF0aC5tYXgoMCxpK28pOk1hdGgubWluKGksby0xKSk/bisxKyhvLWkpOm4taSsxO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPShuLXMrbyklbztpZihlKHRbYV0sYSkpcmV0dXJuIGF9cmV0dXJuLTF9ZnVuY3Rpb24gbyh0LGUsbil7dm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49LTEpO3ZhciBpPXQubGVuZ3RoO2lmKCEoaTw9MSkpZm9yKGU9ZTwwP01hdGgubWF4KDAsZStpKTpNYXRoLm1pbihlLGktMSksbj1uPDA/TWF0aC5tYXgoMCxuK2kpOk1hdGgubWluKG4saS0xKTtlPG47KXt2YXIgcj10W2VdLG89dFtuXTt0W2UrK109byx0W24tLV09cn19ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKGU8MCYmKGUrPW4pLCEoZTwwfHxlPj1uKSl7Zm9yKHZhciBpPXRbZV0scj1lKzE7cjxuOysrcil0W3ItMV09dFtyXTtyZXR1cm4gdC5sZW5ndGg9bi0xLGl9fXQuZmlyc3RJbmRleE9mPWUsdC5sYXN0SW5kZXhPZj1uLHQuZmluZEZpcnN0SW5kZXg9aSx0LmZpbmRMYXN0SW5kZXg9cix0LmZpbmRGaXJzdFZhbHVlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PXImJihyPS0xKTt2YXIgbz1pKHQsZSxuLHIpO3JldHVybi0xIT09bz90W29dOnZvaWQgMH0sdC5maW5kTGFzdFZhbHVlPWZ1bmN0aW9uKHQsZSxuLGkpe3ZvaWQgMD09PW4mJihuPS0xKSx2b2lkIDA9PT1pJiYoaT0wKTt2YXIgbz1yKHQsZSxuLGkpO3JldHVybi0xIT09bz90W29dOnZvaWQgMH0sdC5sb3dlckJvdW5kPWZ1bmN0aW9uKHQsZSxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybiAwO2Zvcih2YXIgcz1pPWk8MD9NYXRoLm1heCgwLGkrbyk6TWF0aC5taW4oaSxvLTEpLGE9KHI9cjwwP01hdGgubWF4KDAscitvKTpNYXRoLm1pbihyLG8tMSkpLWkrMTthPjA7KXt2YXIgdT1hPj4xLGM9cyt1O24odFtjXSxlKTwwPyhzPWMrMSxhLT11KzEpOmE9dX1yZXR1cm4gc30sdC51cHBlckJvdW5kPWZ1bmN0aW9uKHQsZSxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPXQubGVuZ3RoO2lmKDA9PT1vKXJldHVybiAwO2Zvcih2YXIgcz1pPWk8MD9NYXRoLm1heCgwLGkrbyk6TWF0aC5taW4oaSxvLTEpLGE9KHI9cjwwP01hdGgubWF4KDAscitvKTpNYXRoLm1pbihyLG8tMSkpLWkrMTthPjA7KXt2YXIgdT1hPj4xLGM9cyt1O24odFtjXSxlKT4wP2E9dToocz1jKzEsYS09dSsxKX1yZXR1cm4gc30sdC5tb3ZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10Lmxlbmd0aDtpZighKGk8PTEpJiYoZT1lPDA/TWF0aC5tYXgoMCxlK2kpOk1hdGgubWluKGUsaS0xKSkhPT0obj1uPDA/TWF0aC5tYXgoMCxuK2kpOk1hdGgubWluKG4saS0xKSkpe2Zvcih2YXIgcj10W2VdLG89ZTxuPzE6LTEscz1lO3MhPT1uO3MrPW8pdFtzXT10W3Mrb107dFtuXT1yfX0sdC5yZXZlcnNlPW8sdC5yb3RhdGU9ZnVuY3Rpb24odCxlLG4saSl7dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9LTEpO3ZhciByPXQubGVuZ3RoO2lmKCEocjw9MXx8KG49bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSkpPj0oaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKSkpKXt2YXIgcz1pLW4rMTtpZihlPjA/ZSU9czplPDAmJihlPShlJXMrcyklcyksMCE9PWUpe3ZhciBhPW4rZTtvKHQsbixhLTEpLG8odCxhLGkpLG8odCxuLGkpfX19LHQuZmlsbD1mdW5jdGlvbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHI9dC5sZW5ndGg7aWYoMCE9PXIpe3ZhciBvO249bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSksbz0oaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKSk8bj9pKzErKHItbik6aS1uKzE7Zm9yKHZhciBzPTA7czxvOysrcyl0WyhuK3MpJXJdPWV9fSx0Lmluc2VydD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5sZW5ndGg7ZT1lPDA/TWF0aC5tYXgoMCxlK2kpOk1hdGgubWluKGUsaSk7Zm9yKHZhciByPWk7cj5lOy0tcil0W3JdPXRbci0xXTt0W2VdPW59LHQucmVtb3ZlQXQ9cyx0LnJlbW92ZUZpcnN0T2Y9ZnVuY3Rpb24odCxuLGkscil7dm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBvPWUodCxuLGkscik7cmV0dXJuLTEhPT1vJiZzKHQsbyksb30sdC5yZW1vdmVMYXN0T2Y9ZnVuY3Rpb24odCxlLGkscil7dm9pZCAwPT09aSYmKGk9LTEpLHZvaWQgMD09PXImJihyPTApO3ZhciBvPW4odCxlLGkscik7cmV0dXJuLTEhPT1vJiZzKHQsbyksb30sdC5yZW1vdmVBbGxPZj1mdW5jdGlvbih0LGUsbixpKXt2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0tMSk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7bj1uPDA/TWF0aC5tYXgoMCxuK3IpOk1hdGgubWluKG4sci0xKSxpPWk8MD9NYXRoLm1heCgwLGkrcik6TWF0aC5taW4oaSxyLTEpO2Zvcih2YXIgbz0wLHM9MDtzPHI7KytzKW48PWkmJnM+PW4mJnM8PWkmJnRbc109PT1lP28rKzppPG4mJihzPD1pfHxzPj1uKSYmdFtzXT09PWU/bysrOm8+MCYmKHRbcy1vXT10W3NdKTtyZXR1cm4gbz4wJiYodC5sZW5ndGg9ci1vKSxvfSx0LnJlbW92ZUZpcnN0V2hlcmU9ZnVuY3Rpb24odCxlLG4scil7dmFyIG87dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09ciYmKHI9LTEpO3ZhciBhPWkodCxlLG4scik7cmV0dXJuLTEhPT1hJiYobz1zKHQsYSkpLHtpbmRleDphLHZhbHVlOm99fSx0LnJlbW92ZUxhc3RXaGVyZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0tMSksdm9pZCAwPT09aSYmKGk9MCk7dmFyIGE9cih0LGUsbixpKTtyZXR1cm4tMSE9PWEmJihvPXModCxhKSkse2luZGV4OmEsdmFsdWU6b319LHQucmVtb3ZlQWxsV2hlcmU9ZnVuY3Rpb24odCxlLG4saSl7dm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9LTEpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO249bjwwP01hdGgubWF4KDAsbityKTpNYXRoLm1pbihuLHItMSksaT1pPDA/TWF0aC5tYXgoMCxpK3IpOk1hdGgubWluKGksci0xKTtmb3IodmFyIG89MCxzPTA7czxyOysrcyluPD1pJiZzPj1uJiZzPD1pJiZlKHRbc10scyk/bysrOmk8biYmKHM8PWl8fHM+PW4pJiZlKHRbc10scyk/bysrOm8+MCYmKHRbcy1vXT10W3NdKTtyZXR1cm4gbz4wJiYodC5sZW5ndGg9ci1vKSxvfX0oZS5BcnJheUV4dHx8KGUuQXJyYXlFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS5jaGFpbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gbmV3IHIoaS5pdGVyKHQubWFwKGkuaXRlcikpKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2Nsb25lZD0hMSx0aGlzLl9zb3VyY2U9dCx0aGlzLl9hY3RpdmU9dm9pZCAwfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCkpO3JldHVybiBlLl9hY3RpdmU9dGhpcy5fYWN0aXZlJiZ0aGlzLl9hY3RpdmUuY2xvbmUoKSxlLl9jbG9uZWQ9ITAsdGhpcy5fY2xvbmVkPSEwLGV9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLl9hY3RpdmUpe3ZhciB0PXRoaXMuX3NvdXJjZS5uZXh0KCk7aWYodm9pZCAwPT09dClyZXR1cm47dGhpcy5fYWN0aXZlPXRoaXMuX2Nsb25lZD90LmNsb25lKCk6dH12YXIgZT10aGlzLl9hY3RpdmUubmV4dCgpO3JldHVybiB2b2lkIDAhPT1lP2U6KHRoaXMuX2FjdGl2ZT12b2lkIDAsdGhpcy5uZXh0KCkpfSx0fSgpO2UuQ2hhaW5JdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpfTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHR9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt9LHR9KCk7ZS5FbXB0eUl0ZXJhdG9yPWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dCx0aGlzLl9mbj1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCksdGhpcy5fZm4pO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcy5fZm4sbj10aGlzLl9zb3VyY2U7dm9pZCAwIT09KHQ9bi5uZXh0KCkpOylpZihlKHQsdGhpcy5faW5kZXgrKykpcmV0dXJuIHR9LHR9KCk7ZS5GaWx0ZXJJdGVyYXRvcj1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1uKDE4KTtlLmZpbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0wLG89aS5pdGVyKHQpO3ZvaWQgMCE9PShuPW8ubmV4dCgpKTspaWYoZShuLHIrKykpcmV0dXJuIG59LGUubWluPWZ1bmN0aW9uKHQsZSl7dmFyIG49aS5pdGVyKHQpLHI9bi5uZXh0KCk7aWYodm9pZCAwIT09cil7Zm9yKHZhciBvPXI7dm9pZCAwIT09KHI9bi5uZXh0KCkpOyllKHIsbyk8MCYmKG89cik7cmV0dXJuIG99fSxlLm1heD1mdW5jdGlvbih0LGUpe3ZhciBuPWkuaXRlcih0KSxyPW4ubmV4dCgpO2lmKHZvaWQgMCE9PXIpe2Zvcih2YXIgbz1yO3ZvaWQgMCE9PShyPW4ubmV4dCgpKTspZShyLG8pPjAmJihvPXIpO3JldHVybiBvfX0sZS5taW5tYXg9ZnVuY3Rpb24odCxlKXt2YXIgbj1pLml0ZXIodCkscj1uLm5leHQoKTtpZih2b2lkIDAhPT1yKXtmb3IodmFyIG89cixzPXI7dm9pZCAwIT09KHI9bi5uZXh0KCkpOyllKHIsbyk8MD9vPXI6ZShyLHMpPjAmJihzPXIpO3JldHVybltvLHNdfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faW5kZXg9MCx0aGlzLl9zb3VyY2U9dCx0aGlzLl9mbj1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlLmNsb25lKCksdGhpcy5fZm4pO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc291cmNlLm5leHQoKTtpZih2b2lkIDAhPT10KXJldHVybiB0aGlzLl9mbi5jYWxsKHZvaWQgMCx0LHRoaXMuX2luZGV4KyspfSx0fSgpO2UuTWFwSXRlcmF0b3I9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5yYW5nZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWU/bmV3IHIoMCx0LDEpOm5ldyByKHQsZSx2b2lkIDA9PT1uPzE6bil9O3ZhciBpLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLl9pbmRleD0wLHRoaXMuX3N0YXJ0PXQsdGhpcy5fc3RvcD1lLHRoaXMuX3N0ZXA9bix0aGlzLl9sZW5ndGg9aS5yYW5nZUxlbmd0aCh0LGUsbil9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdCh0aGlzLl9zdGFydCx0aGlzLl9zdG9wLHRoaXMuX3N0ZXApO3JldHVybiBlLl9pbmRleD10aGlzLl9pbmRleCxlfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYoISh0aGlzLl9pbmRleD49dGhpcy5fbGVuZ3RoKSlyZXR1cm4gdGhpcy5fc3RhcnQrdGhpcy5fc3RlcCp0aGlzLl9pbmRleCsrfSx0fSgpO2UuUmFuZ2VJdGVyYXRvcj1yLGZ1bmN0aW9uKHQpe3QucmFuZ2VMZW5ndGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09bj8xLzA6dD5lJiZuPjA/MDp0PGUmJm48MD8wOk1hdGguY2VpbCgoZS10KS9uKX19KGl8fChpPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UucmVkdWNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0wLG89aS5pdGVyKHQpLHM9by5uZXh0KCk7aWYodm9pZCAwPT09cyYmdm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgaXRlcmFibGUgd2l0aCBubyBpbml0aWFsIHZhbHVlLiIpO2lmKHZvaWQgMD09PXMpcmV0dXJuIG47dmFyIGEsdSxjPW8ubmV4dCgpO2lmKHZvaWQgMD09PWMmJnZvaWQgMD09PW4pcmV0dXJuIHM7aWYodm9pZCAwPT09YylyZXR1cm4gZShuLHMscisrKTtmb3IoYT1lKHZvaWQgMD09PW4/czplKG4scyxyKyspLGMscisrKTt2b2lkIDAhPT0odT1vLm5leHQoKSk7KWE9ZShhLHUscisrKTtyZXR1cm4gYX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUucmVwZWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LGUub25jZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGkodCwxKX07dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fdmFsdWU9dCx0aGlzLl9jb3VudD1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3ZhbHVlLHRoaXMuX2NvdW50KX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcy5fY291bnQ8PTApKXJldHVybiB0aGlzLl9jb3VudC0tLHRoaXMuX3ZhbHVlfSx0fSgpO2UuUmVwZWF0SXRlcmF0b3I9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5yZXRybz1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZXRybz90LnJldHJvKCk6bmV3IGkodCl9O3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9zb3VyY2U9dCx0aGlzLl9pbmRleD10Lmxlbmd0aC0xfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQodGhpcy5fc291cmNlKTtyZXR1cm4gZS5faW5kZXg9dGhpcy5faW5kZXgsZX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKCEodGhpcy5faW5kZXg8MHx8dGhpcy5faW5kZXg+PXRoaXMuX3NvdXJjZS5sZW5ndGgpKXJldHVybiB0aGlzLl9zb3VyY2VbdGhpcy5faW5kZXgtLV19LHR9KCk7ZS5SZXRyb0FycmF5SXRlcmF0b3I9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS50b3BvbG9naWNTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49bmV3IFNldCxyPW5ldyBNYXA7cmV0dXJuIGkuZWFjaCh0LGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLGk9ci5nZXQobik7aT9pLnB1c2goZSk6ci5zZXQobixbZV0pfSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7byhlKX0pLGU7ZnVuY3Rpb24gbyh0KXtpZighbi5oYXModCkpe24uYWRkKHQpO3ZhciBpPXIuZ2V0KHQpO2kmJmkuZm9yRWFjaChvKSxlLnB1c2godCl9fX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2Uuc3RyaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc291cmNlPXQsdGhpcy5fc3RlcD1lfXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3NvdXJjZS5jbG9uZSgpLHRoaXMuX3N0ZXApfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NvdXJjZS5uZXh0KCksZT10aGlzLl9zdGVwLTE7ZT4wOy0tZSl0aGlzLl9zb3VyY2UubmV4dCgpO3JldHVybiB0fSx0fSgpO2UuU3RyaWRlSXRlcmF0b3I9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7Zm9yKHZhciBpPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLG89bixzPWUubGVuZ3RoO3I8czsrK3IsKytvKXtpZigtMT09PShvPXQuaW5kZXhPZihlW3JdLG8pKSlyZXR1cm4gbnVsbDtpW3JdPW99cmV0dXJuIGl9dC5maW5kSW5kaWNlcz1lLHQubWF0Y2hTdW1PZlNxdWFyZXM9ZnVuY3Rpb24odCxuLGkpe3ZvaWQgMD09PWkmJihpPTApO3ZhciByPWUodCxuLGkpO2lmKCFyKXJldHVybiBudWxsO2Zvcih2YXIgbz0wLHM9MCxhPXIubGVuZ3RoO3M8YTsrK3Mpe3ZhciB1PXJbc10taTtvKz11KnV9cmV0dXJue3Njb3JlOm8saW5kaWNlczpyfX0sdC5tYXRjaFN1bU9mRGVsdGFzPWZ1bmN0aW9uKHQsbixpKXt2b2lkIDA9PT1pJiYoaT0wKTt2YXIgcj1lKHQsbixpKTtpZighcilyZXR1cm4gbnVsbDtmb3IodmFyIG89MCxzPWktMSxhPTAsdT1yLmxlbmd0aDthPHU7KythKXt2YXIgYz1yW2FdO28rPWMtcy0xLHM9Y31yZXR1cm57c2NvcmU6byxpbmRpY2VzOnJ9fSx0LmhpZ2hsaWdodD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPVtdLHI9MCxvPTAscz1lLmxlbmd0aDtyPHM7KXtmb3IodmFyIGE9ZVtyXSx1PWVbcl07KytyPHMmJmVbcl09PT11KzE7KXUrKztvPGEmJmkucHVzaCh0LnNsaWNlKG8sYSkpLGE8dSsxJiZpLnB1c2gobih0LnNsaWNlKGEsdSsxKSkpLG89dSsxfXJldHVybiBvPHQubGVuZ3RoJiZpLnB1c2godC5zbGljZShvKSksaX19KGUuU3RyaW5nRXh0fHwoZS5TdHJpbmdFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOCk7ZS50YWtlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByKGkuaXRlcih0KSxlKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc291cmNlPXQsdGhpcy5fY291bnQ9ZX1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9zb3VyY2UuY2xvbmUoKSx0aGlzLl9jb3VudCl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2NvdW50PD0wKSl7dmFyIHQ9dGhpcy5fc291cmNlLm5leHQoKTtpZih2b2lkIDAhPT10KXJldHVybiB0aGlzLl9jb3VudC0tLHR9fSx0fSgpO2UuVGFrZUl0ZXJhdG9yPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTgpO2UuemlwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBuZXcgcih0Lm1hcChpLml0ZXIpKX07dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3NvdXJjZT10fXJldHVybiB0LnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuX3NvdXJjZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvbmUoKX0pKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fc291cmNlLmxlbmd0aCksZT0wLG49dGhpcy5fc291cmNlLmxlbmd0aDtlPG47KytlKXt2YXIgaT10aGlzLl9zb3VyY2VbZV0ubmV4dCgpO2lmKHZvaWQgMD09PWkpcmV0dXJuO3RbZV09aX1yZXR1cm4gdH0sdH0oKTtlLlppcEl0ZXJhdG9yPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGZ1bmN0aW9uKHQpe3QuYm94U2l6aW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLG49cGFyc2VGbG9hdChlLmJvcmRlclRvcFdpZHRoKXx8MCxpPXBhcnNlRmxvYXQoZS5ib3JkZXJMZWZ0V2lkdGgpfHwwLHI9cGFyc2VGbG9hdChlLmJvcmRlclJpZ2h0V2lkdGgpfHwwLG89cGFyc2VGbG9hdChlLmJvcmRlckJvdHRvbVdpZHRoKXx8MCxzPXBhcnNlRmxvYXQoZS5wYWRkaW5nVG9wKXx8MCxhPXBhcnNlRmxvYXQoZS5wYWRkaW5nTGVmdCl8fDAsdT1wYXJzZUZsb2F0KGUucGFkZGluZ1JpZ2h0KXx8MCxjPXBhcnNlRmxvYXQoZS5wYWRkaW5nQm90dG9tKXx8MDtyZXR1cm57Ym9yZGVyVG9wOm4sYm9yZGVyTGVmdDppLGJvcmRlclJpZ2h0OnIsYm9yZGVyQm90dG9tOm8scGFkZGluZ1RvcDpzLHBhZGRpbmdMZWZ0OmEscGFkZGluZ1JpZ2h0OnUscGFkZGluZ0JvdHRvbTpjLGhvcml6b250YWxTdW06aSthK3Urcix2ZXJ0aWNhbFN1bTpuK3MrYytvfX0sdC5zaXplTGltaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLG49cGFyc2VGbG9hdChlLm1pbldpZHRoKXx8MCxpPXBhcnNlRmxvYXQoZS5taW5IZWlnaHQpfHwwLHI9cGFyc2VGbG9hdChlLm1heFdpZHRoKXx8MS8wLG89cGFyc2VGbG9hdChlLm1heEhlaWdodCl8fDEvMDtyZXR1cm57bWluV2lkdGg6bixtaW5IZWlnaHQ6aSxtYXhXaWR0aDpyPU1hdGgubWF4KG4sciksbWF4SGVpZ2h0Om89TWF0aC5tYXgoaSxvKX19LHQuaGl0VGVzdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZT49aS5sZWZ0JiZlPGkucmlnaHQmJm4+PWkudG9wJiZuPGkuYm90dG9tfSx0LnNjcm9sbEludG9WaWV3SWZOZWVkZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpLnRvcDw9bi50b3AmJmkuYm90dG9tPj1uLmJvdHRvbXx8KGkudG9wPG4udG9wJiZpLmhlaWdodDw9bi5oZWlnaHQ/dC5zY3JvbGxUb3AtPW4udG9wLWkudG9wOmkuYm90dG9tPm4uYm90dG9tJiZpLmhlaWdodD49bi5oZWlnaHQ/dC5zY3JvbGxUb3AtPW4udG9wLWkudG9wOmkudG9wPG4udG9wJiZpLmhlaWdodD5uLmhlaWdodD90LnNjcm9sbFRvcC09bi5ib3R0b20taS5ib3R0b206aS5ib3R0b20+bi5ib3R0b20mJmkuaGVpZ2h0PG4uaGVpZ2h0JiYodC5zY3JvbGxUb3AtPW4uYm90dG9tLWkuYm90dG9tKSl9fShlLkVsZW1lbnRFeHR8fChlLkVsZW1lbnRFeHQ9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7dC5JU19NQUM9ISFuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL01hYy9pKSx0LklTX1dJTj0hIW5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvV2luL2kpLHQuSVNfSUU9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdC5JU19FREdFPS9FZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfShlLlBsYXRmb3JtfHwoZS5QbGF0Zm9ybT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXt0LmNhbGN1bGF0ZVNwZWNpZmljaXR5PWZ1bmN0aW9uKHQpe2lmKHQgaW4gaS5zcGVjaWZpY2l0eUNhY2hlKXJldHVybiBpLnNwZWNpZmljaXR5Q2FjaGVbdF07dmFyIGU9aS5jYWxjdWxhdGVTaW5nbGUodCk7cmV0dXJuIGkuc3BlY2lmaWNpdHlDYWNoZVt0XT1lfSx0LmlzVmFsaWQ9ZnVuY3Rpb24odCl7aWYodCBpbiBpLnZhbGlkaXR5Q2FjaGUpcmV0dXJuIGkudmFsaWRpdHlDYWNoZVt0XTt2YXIgZT0hMDt0cnl7aS50ZXN0RWxlbS5xdWVyeVNlbGVjdG9yKHQpfWNhdGNoKHQpe2U9ITF9cmV0dXJuIGkudmFsaWRpdHlDYWNoZVt0XT1lfSx0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5wcm90b01hdGNoRnVuYy5jYWxsKHQsZSl9fShlLlNlbGVjdG9yfHwoZS5TZWxlY3Rvcj17fSkpLGZ1bmN0aW9uKHQpe3ZhciBlO3Quc3BlY2lmaWNpdHlDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHQudmFsaWRpdHlDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHQudGVzdEVsZW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5wcm90b01hdGNoRnVuYz0oZT1FbGVtZW50LnByb3RvdHlwZSkubWF0Y2hlc3x8ZS5tYXRjaGVzU2VsZWN0b3J8fGUubW96TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yfHxlLm9NYXRjaGVzU2VsZWN0b3J8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxmdW5jdGlvbih0KXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KTtyZXR1cm4tMSE9PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0aGlzKX0sdC5jYWxjdWxhdGVTaW5nbGU9ZnVuY3Rpb24odCl7dmFyIGU9MCxoPTAsbD0wO2Z1bmN0aW9uIGQoZSl7dmFyIG49dC5tYXRjaChlKTtyZXR1cm4gbnVsbCE9PW4mJih0PXQuc2xpY2UoblswXS5sZW5ndGgpLCEwKX1mb3IodD0odD10LnNwbGl0KCIsIiwxKVswXSkucmVwbGFjZShjLCIgJDEgIik7dC5sZW5ndGg+MDspaWYoZChuKSllKys7ZWxzZSBpZihkKGkpKWgrKztlbHNlIGlmKGQocikpaCsrO2Vsc2UgaWYoZChzKSlsKys7ZWxzZSBpZihkKGEpKWgrKztlbHNlIGlmKGQobykpbCsrO2Vsc2UgaWYoIWQodSkpcmV0dXJuIDA7cmV0dXJuKGU9TWF0aC5taW4oZSwyNTUpKTw8MTZ8KGg9TWF0aC5taW4oaCwyNTUpKTw8OHwobD1NYXRoLm1pbihsLDI1NSkpfTt2YXIgbj0vXiNbXlxzXCs+fiNcLlxbOl0rLyxpPS9eXC5bXlxzXCs+fiNcLlxbOl0rLyxyPS9eXFtbXlxdXStcXS8sbz0vXlteXHNcKz5+I1wuXFs6XSsvLHM9L14oOjpbXlxzXCs+fiNcLlxbOl0rfDpmaXJzdC1saW5lfDpmaXJzdC1sZXR0ZXJ8OmJlZm9yZXw6YWZ0ZXIpLyxhPS9eOlteXHNcKz5+I1wuXFs6XSsvLHU9L15bXHNcKz5+XCpdKy8sYz0vOm5vdFwoKFteXCldKylcKS9nfShpfHwoaT17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX0obigzMjEpKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGkscj1uKDIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZmlyc3Q9bnVsbCx0aGlzLl9sYXN0PW51bGwsdGhpcy5fbGVuZ3RoPTB9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNFbXB0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fbGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpcnN0P3RoaXMuX2ZpcnN0LnZhbHVlOnZvaWQgMH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhc3QiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFzdD90aGlzLl9sYXN0LnZhbHVlOnZvaWQgMH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXJzdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhc3ROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3R9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Gb3J3YXJkVmFsdWVJdGVyYXRvcih0aGlzLl9maXJzdCl9LHQucHJvdG90eXBlLnJldHJvPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LlJldHJvVmFsdWVJdGVyYXRvcih0aGlzLl9sYXN0KX0sdC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRm9yd2FyZE5vZGVJdGVyYXRvcih0aGlzLl9maXJzdCl9LHQucHJvdG90eXBlLnJldHJvTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuUmV0cm9Ob2RlSXRlcmF0b3IodGhpcy5fbGFzdCl9LHQucHJvdG90eXBlLmFkZEZpcnN0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpLkxpbmtlZExpc3ROb2RlKHRoaXMsdCk7cmV0dXJuIHRoaXMuX2ZpcnN0PyhlLm5leHQ9dGhpcy5fZmlyc3QsdGhpcy5fZmlyc3QucHJldj1lLHRoaXMuX2ZpcnN0PWUpOih0aGlzLl9maXJzdD1lLHRoaXMuX2xhc3Q9ZSksdGhpcy5fbGVuZ3RoKyssZX0sdC5wcm90b3R5cGUuYWRkTGFzdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpO3JldHVybiB0aGlzLl9sYXN0PyhlLnByZXY9dGhpcy5fbGFzdCx0aGlzLl9sYXN0Lm5leHQ9ZSx0aGlzLl9sYXN0PWUpOih0aGlzLl9maXJzdD1lLHRoaXMuX2xhc3Q9ZSksdGhpcy5fbGVuZ3RoKyssZX0sdC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKHQsZSl7aWYoIWV8fGU9PT10aGlzLl9maXJzdClyZXR1cm4gdGhpcy5hZGRGaXJzdCh0KTtpZighKGUgaW5zdGFuY2VvZiBpLkxpbmtlZExpc3ROb2RlKXx8ZS5saXN0IT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIlJlZmVyZW5jZSBub2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgbj1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpLHI9ZSxvPXIucHJldjtyZXR1cm4gbi5uZXh0PXIsbi5wcmV2PW8sci5wcmV2PW4sby5uZXh0PW4sdGhpcy5fbGVuZ3RoKyssbn0sdC5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCxlKXtpZighZXx8ZT09PXRoaXMuX2xhc3QpcmV0dXJuIHRoaXMuYWRkTGFzdCh0KTtpZighKGUgaW5zdGFuY2VvZiBpLkxpbmtlZExpc3ROb2RlKXx8ZS5saXN0IT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIlJlZmVyZW5jZSBub2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgbj1uZXcgaS5MaW5rZWRMaXN0Tm9kZSh0aGlzLHQpLHI9ZSxvPXIubmV4dDtyZXR1cm4gbi5uZXh0PW8sbi5wcmV2PXIsci5uZXh0PW4sby5wcmV2PW4sdGhpcy5fbGVuZ3RoKyssbn0sdC5wcm90b3R5cGUucmVtb3ZlRmlyc3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9maXJzdDtpZih0KXJldHVybiB0PT09dGhpcy5fbGFzdD8odGhpcy5fZmlyc3Q9bnVsbCx0aGlzLl9sYXN0PW51bGwpOih0aGlzLl9maXJzdD10Lm5leHQsdGhpcy5fZmlyc3QucHJldj1udWxsKSx0Lmxpc3Q9bnVsbCx0Lm5leHQ9bnVsbCx0LnByZXY9bnVsbCx0aGlzLl9sZW5ndGgtLSx0LnZhbHVlfSx0LnByb3RvdHlwZS5yZW1vdmVMYXN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGFzdDtpZih0KXJldHVybiB0PT09dGhpcy5fZmlyc3Q/KHRoaXMuX2ZpcnN0PW51bGwsdGhpcy5fbGFzdD1udWxsKToodGhpcy5fbGFzdD10LnByZXYsdGhpcy5fbGFzdC5uZXh0PW51bGwpLHQubGlzdD1udWxsLHQubmV4dD1udWxsLHQucHJldj1udWxsLHRoaXMuX2xlbmd0aC0tLHQudmFsdWV9LHQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgaS5MaW5rZWRMaXN0Tm9kZSl8fHQubGlzdCE9PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJOb2RlIGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdC4iKTt2YXIgZT10O2U9PT10aGlzLl9maXJzdCYmZT09PXRoaXMuX2xhc3Q/KHRoaXMuX2ZpcnN0PW51bGwsdGhpcy5fbGFzdD1udWxsKTplPT09dGhpcy5fZmlyc3Q/KHRoaXMuX2ZpcnN0PWUubmV4dCx0aGlzLl9maXJzdC5wcmV2PW51bGwpOmU9PT10aGlzLl9sYXN0Pyh0aGlzLl9sYXN0PWUucHJldix0aGlzLl9sYXN0Lm5leHQ9bnVsbCk6KGUubmV4dC5wcmV2PWUucHJldixlLnByZXYubmV4dD1lLm5leHQpLGUubGlzdD1udWxsLGUubmV4dD1udWxsLGUucHJldj1udWxsLHRoaXMuX2xlbmd0aC0tfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9maXJzdDt0Oyl7dmFyIGU9dC5uZXh0O3QubGlzdD1udWxsLHQucHJldj1udWxsLHQubmV4dD1udWxsLHQ9ZX10aGlzLl9maXJzdD1udWxsLHRoaXMuX2xhc3Q9bnVsbCx0aGlzLl9sZW5ndGg9MH0sdH0oKTtlLkxpbmtlZExpc3Q9byxmdW5jdGlvbih0KXt0LmZyb209ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHQ7cmV0dXJuIHIuZWFjaChlLGZ1bmN0aW9uKHQpe24uYWRkTGFzdCh0KX0pLG59O3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9ub2RlPXR9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy5fbm9kZSl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2RlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0aGlzLl9ub2RlPXQubmV4dCx0LnZhbHVlfX0sdH0oKTt0LkZvcndhcmRWYWx1ZUl0ZXJhdG9yPWU7dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX25vZGU9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9ub2RlKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHRoaXMuX25vZGU9dC5wcmV2LHQudmFsdWV9fSx0fSgpO3QuUmV0cm9WYWx1ZUl0ZXJhdG9yPW47dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX25vZGU9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLl9ub2RlKX0sdC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGUpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHRoaXMuX25vZGU9dC5uZXh0LHR9fSx0fSgpO3QuRm9yd2FyZE5vZGVJdGVyYXRvcj1pO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9ub2RlPXR9cmV0dXJuIHQucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy5fbm9kZSl9LHQucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2RlKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0aGlzLl9ub2RlPXQucHJldix0fX0sdH0oKTt0LlJldHJvTm9kZUl0ZXJhdG9yPW99KG89ZS5MaW5rZWRMaXN0fHwoZS5MaW5rZWRMaXN0PXt9KSksZS5MaW5rZWRMaXN0PW8sZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt0aGlzLmxpc3Q9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbCx0aGlzLmxpc3Q9dCx0aGlzLnZhbHVlPWV9fSgpO3QuTGlua2VkTGlzdE5vZGU9ZX0oaXx8KGk9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG8scz1uKDc2KSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzLHtsYXlvdXQ6by5jcmVhdGVMYXlvdXQoZSl9KXx8dGhpcztyZXR1cm4gbi5hZGRDbGFzcygicC1Cb3hQYW5lbCIpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImRpcmVjdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5kaXJlY3Rpb259LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5kaXJlY3Rpb249dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5hbGlnbm1lbnQ9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNwYWNpbmc9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5vbkNoaWxkQWRkZWQ9ZnVuY3Rpb24odCl7dC5jaGlsZC5hZGRDbGFzcygicC1Cb3hQYW5lbC1jaGlsZCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXt0LmNoaWxkLnJlbW92ZUNsYXNzKCJwLUJveFBhbmVsLWNoaWxkIil9LGV9KG4oNTQpLlBhbmVsKTtlLkJveFBhbmVsPWEsZnVuY3Rpb24odCl7dC5nZXRTdHJldGNoPWZ1bmN0aW9uKHQpe3JldHVybiBzLkJveExheW91dC5nZXRTdHJldGNoKHQpfSx0LnNldFN0cmV0Y2g9ZnVuY3Rpb24odCxlKXtzLkJveExheW91dC5zZXRTdHJldGNoKHQsZSl9LHQuZ2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBzLkJveExheW91dC5nZXRTaXplQmFzaXModCl9LHQuc2V0U2l6ZUJhc2lzPWZ1bmN0aW9uKHQsZSl7cy5Cb3hMYXlvdXQuc2V0U2l6ZUJhc2lzKHQsZSl9fShhPWUuQm94UGFuZWx8fChlLkJveFBhbmVsPXt9KSksZS5Cb3hQYW5lbD1hLGZ1bmN0aW9uKHQpe3QuY3JlYXRlTGF5b3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmxheW91dHx8bmV3IHMuQm94TGF5b3V0KHQpfX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzLGE9bigyKSx1PW4oMjYpLGM9bigxMzApLGg9big5KSxsPW4oNTUpLGQ9big3KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMse25vZGU6cy5jcmVhdGVOb2RlKCl9KXx8dGhpcztyZXR1cm4gaS5fYWN0aXZlSW5kZXg9LTEsaS5faXRlbXM9W10saS5fcmVzdWx0cz1udWxsLGkuYWRkQ2xhc3MoInAtQ29tbWFuZFBhbGV0dGUiKSxpLnNldEZsYWcoZC5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5jb21tYW5kcz1uLmNvbW1hbmRzLGkucmVuZGVyZXI9bi5yZW5kZXJlcnx8ZS5kZWZhdWx0UmVuZGVyZXIsaS5jb21tYW5kcy5jb21tYW5kQ2hhbmdlZC5jb25uZWN0KGkuX29uR2VuZXJpY0NoYW5nZSxpKSxpLmNvbW1hbmRzLmtleUJpbmRpbmdDaGFuZ2VkLmNvbm5lY3QoaS5fb25HZW5lcmljQ2hhbmdlLGkpLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fcmVzdWx0cz1udWxsLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzZWFyY2hOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLUNvbW1hbmRQYWxldHRlLXNlYXJjaCIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaW5wdXROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLUNvbW1hbmRQYWxldHRlLWlucHV0IilbMF19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1Db21tYW5kUGFsZXR0ZS1jb250ZW50IilbMF19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJpdGVtcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXMuY3JlYXRlSXRlbSh0aGlzLmNvbW1hbmRzLHQpO3JldHVybiB0aGlzLl9pdGVtcy5wdXNoKGUpLHRoaXMucmVmcmVzaCgpLGV9LGUucHJvdG90eXBlLnJlbW92ZUl0ZW09ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVJdGVtQXQodGhpcy5faXRlbXMuaW5kZXhPZih0KSl9LGUucHJvdG90eXBlLnJlbW92ZUl0ZW1BdD1mdW5jdGlvbih0KXthLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLHQpJiZ0aGlzLnJlZnJlc2goKX0sZS5wcm90b3R5cGUuY2xlYXJJdGVtcz1mdW5jdGlvbigpezAhPT10aGlzLl9pdGVtcy5sZW5ndGgmJih0aGlzLl9pdGVtcy5sZW5ndGg9MCx0aGlzLnJlZnJlc2goKSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHRzPW51bGwsdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJjbGljayI6dGhpcy5fZXZ0Q2xpY2sodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiaW5wdXQiOnRoaXMucmVmcmVzaCgpO2JyZWFrO2Nhc2UiZm9jdXMiOmNhc2UiYmx1ciI6dGhpcy5fdG9nZ2xlRm9jdXNlZCgpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMsITApLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLCEwKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcywhMCksdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMsITApfSxlLnByb3RvdHlwZS5vbkFjdGl2YXRlUmVxdWVzdD1mdW5jdGlvbih0KXtpZih0aGlzLmlzQXR0YWNoZWQpe3ZhciBlPXRoaXMuaW5wdXROb2RlO2UuZm9jdXMoKSxlLnNlbGVjdCgpfX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5wdXROb2RlLnZhbHVlLG49dGhpcy5jb250ZW50Tm9kZSxpPXRoaXMuX3Jlc3VsdHM7aWYoaXx8KGk9dGhpcy5fcmVzdWx0cz1zLnNlYXJjaCh0aGlzLl9pdGVtcyxlKSx0aGlzLl9hY3RpdmVJbmRleD1lP2EuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgoaSxzLmNhbkFjdGl2YXRlKTotMSksZXx8MCE9PWkubGVuZ3RoKWlmKGUmJjA9PT1pLmxlbmd0aCl7dmFyIHI9dGhpcy5yZW5kZXJlci5yZW5kZXJFbXB0eU1lc3NhZ2Uoe3F1ZXJ5OmV9KTtsLlZpcnR1YWxET00ucmVuZGVyKHIsbil9ZWxzZXtmb3IodmFyIG89dGhpcy5yZW5kZXJlcix1PXRoaXMuX2FjdGl2ZUluZGV4LGM9bmV3IEFycmF5KGkubGVuZ3RoKSxkPTAsZj1pLmxlbmd0aDtkPGY7KytkKXt2YXIgcD1pW2RdO2lmKCJoZWFkZXIiPT09cC50eXBlKXt2YXIgbT1wLmluZGljZXMsZz1wLmNhdGVnb3J5O2NbZF09by5yZW5kZXJIZWFkZXIoe2NhdGVnb3J5OmcsaW5kaWNlczptfSl9ZWxzZXt2YXIgdj1wLml0ZW0sYj0obT1wLmluZGljZXMsZD09PXUpO2NbZF09by5yZW5kZXJJdGVtKHtpdGVtOnYsaW5kaWNlczptLGFjdGl2ZTpifSl9fWlmKGwuVmlydHVhbERPTS5yZW5kZXIoYyxuKSx1PDB8fHU+PWkubGVuZ3RoKW4uc2Nyb2xsVG9wPTA7ZWxzZXt2YXIgeT1uLmNoaWxkcmVuW3VdO2guRWxlbWVudEV4dC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKG4seSl9fWVsc2UgbC5WaXJ0dWFsRE9NLnJlbmRlcihudWxsLG4pfSxlLnByb3RvdHlwZS5fZXZ0Q2xpY2s9ZnVuY3Rpb24odCl7aWYoMD09PXQuYnV0dG9uKXt2YXIgZT1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuY29udGVudE5vZGUuY2hpbGRyZW4sZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFpbnModC50YXJnZXQpfSk7LTEhPT1lJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fZXhlY3V0ZShlKSl9fSxlLnByb3RvdHlwZS5fZXZ0S2V5RG93bj1mdW5jdGlvbih0KXtpZighKHQuYWx0S2V5fHx0LmN0cmxLZXl8fHQubWV0YUtleXx8dC5zaGlmdEtleSkpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSAxMzp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9leGVjdXRlKHRoaXMuX2FjdGl2ZUluZGV4KTticmVhaztjYXNlIDM4OnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2FjdGl2YXRlUHJldmlvdXNJdGVtKCk7YnJlYWs7Y2FzZSA0MDp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hY3RpdmF0ZU5leHRJdGVtKCl9fSxlLnByb3RvdHlwZS5fYWN0aXZhdGVOZXh0SXRlbT1mdW5jdGlvbigpe2lmKHRoaXMuX3Jlc3VsdHMmJjAhPT10aGlzLl9yZXN1bHRzLmxlbmd0aCl7dmFyIHQ9dGhpcy5fYWN0aXZlSW5kZXgsZT10aGlzLl9yZXN1bHRzLmxlbmd0aCxuPXQ8ZS0xP3QrMTowLGk9MD09PW4/ZS0xOm4tMTt0aGlzLl9hY3RpdmVJbmRleD1hLkFycmF5RXh0LmZpbmRGaXJzdEluZGV4KHRoaXMuX3Jlc3VsdHMscy5jYW5BY3RpdmF0ZSxuLGkpLHRoaXMudXBkYXRlKCl9fSxlLnByb3RvdHlwZS5fYWN0aXZhdGVQcmV2aW91c0l0ZW09ZnVuY3Rpb24oKXtpZih0aGlzLl9yZXN1bHRzJiYwIT09dGhpcy5fcmVzdWx0cy5sZW5ndGgpe3ZhciB0PXRoaXMuX2FjdGl2ZUluZGV4LGU9dGhpcy5fcmVzdWx0cy5sZW5ndGgsbj10PD0wP2UtMTp0LTEsaT1uPT09ZS0xPzA6bisxO3RoaXMuX2FjdGl2ZUluZGV4PWEuQXJyYXlFeHQuZmluZExhc3RJbmRleCh0aGlzLl9yZXN1bHRzLHMuY2FuQWN0aXZhdGUsbixpKSx0aGlzLnVwZGF0ZSgpfX0sZS5wcm90b3R5cGUuX2V4ZWN1dGU9ZnVuY3Rpb24odCl7aWYodGhpcy5fcmVzdWx0cyl7dmFyIGU9dGhpcy5fcmVzdWx0c1t0XTtpZihlKXtpZigiaGVhZGVyIj09PWUudHlwZSl7dmFyIG49dGhpcy5pbnB1dE5vZGU7cmV0dXJuIG4udmFsdWU9ZS5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpKyIgIixuLmZvY3VzKCksdm9pZCB0aGlzLnJlZnJlc2goKX1lLml0ZW0uaXNFbmFibGVkJiYodGhpcy5jb21tYW5kcy5leGVjdXRlKGUuaXRlbS5jb21tYW5kLGUuaXRlbS5hcmdzKSx0aGlzLmlucHV0Tm9kZS52YWx1ZT0iIix0aGlzLnJlZnJlc2goKSl9fX0sZS5wcm90b3R5cGUuX3RvZ2dsZUZvY3VzZWQ9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dGhpcy5pbnB1dE5vZGU7dGhpcy50b2dnbGVDbGFzcygicC1tb2QtZm9jdXNlZCIsdCl9LGUucHJvdG90eXBlLl9vbkdlbmVyaWNDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sZX0oZC5XaWRnZXQpO2UuQ29tbWFuZFBhbGV0dGU9ZixmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckhlYWRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdEhlYWRlcih0KTtyZXR1cm4gbC5oLmxpKHtjbGFzc05hbWU6InAtQ29tbWFuZFBhbGV0dGUtaGVhZGVyIn0sZSl9LHQucHJvdG90eXBlLnJlbmRlckl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJdGVtQ2xhc3ModCksbj10aGlzLmNyZWF0ZUl0ZW1EYXRhc2V0KHQpO3JldHVybiBsLmgubGkoe2NsYXNzTmFtZTplLGRhdGFzZXQ6bn0sdGhpcy5yZW5kZXJJdGVtSWNvbih0KSx0aGlzLnJlbmRlckl0ZW1Db250ZW50KHQpLHRoaXMucmVuZGVySXRlbVNob3J0Y3V0KHQpKX0sdC5wcm90b3R5cGUucmVuZGVyRW1wdHlNZXNzYWdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZm9ybWF0RW1wdHlNZXNzYWdlKHQpO3JldHVybiBsLmgubGkoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1lbXB0eU1lc3NhZ2UifSxlKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUljb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJY29uQ2xhc3ModCk7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZTplfSx0Lml0ZW0uaWNvbkxhYmVsKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUNvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1pdGVtQ29udGVudCJ9LHRoaXMucmVuZGVySXRlbUxhYmVsKHQpLHRoaXMucmVuZGVySXRlbUNhcHRpb24odCkpfSx0LnByb3RvdHlwZS5yZW5kZXJJdGVtTGFiZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRJdGVtTGFiZWwodCk7cmV0dXJuIGwuaC5kaXYoe2NsYXNzTmFtZToicC1Db21tYW5kUGFsZXR0ZS1pdGVtTGFiZWwifSxlKX0sdC5wcm90b3R5cGUucmVuZGVySXRlbUNhcHRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb3JtYXRJdGVtQ2FwdGlvbih0KTtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLUNvbW1hbmRQYWxldHRlLWl0ZW1DYXB0aW9uIn0sZSl9LHQucHJvdG90eXBlLnJlbmRlckl0ZW1TaG9ydGN1dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvcm1hdEl0ZW1TaG9ydGN1dCh0KTtyZXR1cm4gbC5oLmRpdih7Y2xhc3NOYW1lOiJwLUNvbW1hbmRQYWxldHRlLWl0ZW1TaG9ydGN1dCJ9LGUpfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtQ29tbWFuZFBhbGV0dGUtaXRlbSI7dC5pdGVtLmlzRW5hYmxlZHx8KGUrPSIgcC1tb2QtZGlzYWJsZWQiKSx0Lml0ZW0uaXNUb2dnbGVkJiYoZSs9IiBwLW1vZC10b2dnbGVkIiksdC5hY3RpdmUmJihlKz0iIHAtbW9kLWFjdGl2ZSIpO3ZhciBuPXQuaXRlbS5jbGFzc05hbWU7cmV0dXJuIG4mJihlKz0iICIrbiksZX0sdC5wcm90b3R5cGUuY3JlYXRlSXRlbURhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8oe30sdC5pdGVtLmRhdGFzZXQse2NvbW1hbmQ6dC5pdGVtLmNvbW1hbmR9KX0sdC5wcm90b3R5cGUuY3JlYXRlSWNvbkNsYXNzPWZ1bmN0aW9uKHQpe3ZhciBlPSJwLUNvbW1hbmRQYWxldHRlLWl0ZW1JY29uIixuPXQuaXRlbS5pY29uQ2xhc3M7cmV0dXJuIG4/ZSsiICIrbjplfSx0LnByb3RvdHlwZS5mb3JtYXRIZWFkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5kaWNlcyYmMCE9PXQuaW5kaWNlcy5sZW5ndGg/YS5TdHJpbmdFeHQuaGlnaGxpZ2h0KHQuY2F0ZWdvcnksdC5pbmRpY2VzLGwuaC5tYXJrKTp0LmNhdGVnb3J5fSx0LnByb3RvdHlwZS5mb3JtYXRFbXB0eU1lc3NhZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIk5vIGNvbW1hbmRzIGZvdW5kIHRoYXQgbWF0Y2ggJyIrdC5xdWVyeSsiJyJ9LHQucHJvdG90eXBlLmZvcm1hdEl0ZW1TaG9ydGN1dD1mdW5jdGlvbih0KXt2YXIgZT10Lml0ZW0ua2V5QmluZGluZztyZXR1cm4gZT9lLmtleXMubWFwKHMuZm9ybWF0S2V5c3Ryb2tlKS5qb2luKCIsICIpOm51bGx9LHQucHJvdG90eXBlLmZvcm1hdEl0ZW1MYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbmRpY2VzJiYwIT09dC5pbmRpY2VzLmxlbmd0aD9hLlN0cmluZ0V4dC5oaWdobGlnaHQodC5pdGVtLmxhYmVsLHQuaW5kaWNlcyxsLmgubWFyayk6dC5pdGVtLmxhYmVsfSx0LnByb3RvdHlwZS5mb3JtYXRJdGVtQ2FwdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdC5pdGVtLmNhcHRpb259LHR9KCk7dC5SZW5kZXJlcj1lLHQuZGVmYXVsdFJlbmRlcmVyPW5ldyBlfShmPWUuQ29tbWFuZFBhbGV0dGV8fChlLkNvbW1hbmRQYWxldHRlPXt9KSksZS5Db21tYW5kUGFsZXR0ZT1mLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtmb3IodmFyIG49dC5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpLGk9bisiICIrdC5sYWJlbC50b0xvd2VyQ2FzZSgpLHI9MS8wLG89bnVsbCxzPS9cYlx3L2c7Oyl7dmFyIHU9cy5leGVjKGkpO2lmKCF1KWJyZWFrO3ZhciBjPWEuU3RyaW5nRXh0Lm1hdGNoU3VtT2ZEZWx0YXMoaSxlLHUuaW5kZXgpO2lmKCFjKWJyZWFrO2MmJmMuc2NvcmU8PXImJihyPWMuc2NvcmUsbz1jLmluZGljZXMpfWlmKCFvfHxyPT09MS8wKXJldHVybiBudWxsO2Zvcih2YXIgaD1uLmxlbmd0aCsxLGw9YS5BcnJheUV4dC5sb3dlckJvdW5kKG8saCxmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSxkPW8uc2xpY2UoMCxsKSxmPW8uc2xpY2UobCkscD0wLG09Zi5sZW5ndGg7cDxtOysrcClmW3BdLT1oO3JldHVybiAwPT09ZC5sZW5ndGg/e21hdGNoVHlwZTowLGNhdGVnb3J5SW5kaWNlczpudWxsLGxhYmVsSW5kaWNlczpmLHNjb3JlOnIsaXRlbTp0fTowPT09Zi5sZW5ndGg/e21hdGNoVHlwZToxLGNhdGVnb3J5SW5kaWNlczpkLGxhYmVsSW5kaWNlczpudWxsLHNjb3JlOnIsaXRlbTp0fTp7bWF0Y2hUeXBlOjIsY2F0ZWdvcnlJbmRpY2VzOmQsbGFiZWxJbmRpY2VzOmYsc2NvcmU6cixpdGVtOnR9fWZ1bmN0aW9uIG4odCxlKXt2YXIgbj10Lm1hdGNoVHlwZS1lLm1hdGNoVHlwZTtpZigwIT09bilyZXR1cm4gbjt2YXIgaT10LnNjb3JlLWUuc2NvcmU7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIHI9MCxvPTA7c3dpdGNoKHQubWF0Y2hUeXBlKXtjYXNlIDA6cj10LmxhYmVsSW5kaWNlc1swXSxvPWUubGFiZWxJbmRpY2VzWzBdO2JyZWFrO2Nhc2UgMTpjYXNlIDI6cj10LmNhdGVnb3J5SW5kaWNlc1swXSxvPWUuY2F0ZWdvcnlJbmRpY2VzWzBdfWlmKHIhPT1vKXJldHVybiByLW87dmFyIHM9dC5pdGVtLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoZS5pdGVtLmNhdGVnb3J5KTtpZigwIT09cylyZXR1cm4gczt2YXIgYT10Lml0ZW0ucmFuayx1PWUuaXRlbS5yYW5rO3JldHVybiBhIT09dT9hPHU/LTE6MTp0Lml0ZW0ubGFiZWwubG9jYWxlQ29tcGFyZShlLml0ZW0ubGFiZWwpfXQuY3JlYXRlTm9kZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpO3JldHVybiBlLmNsYXNzTmFtZT0icC1Db21tYW5kUGFsZXR0ZS1zZWFyY2giLG4uY2xhc3NOYW1lPSJwLUNvbW1hbmRQYWxldHRlLXdyYXBwZXIiLGkuY2xhc3NOYW1lPSJwLUNvbW1hbmRQYWxldHRlLWlucHV0IixyLmNsYXNzTmFtZT0icC1Db21tYW5kUGFsZXR0ZS1jb250ZW50IixpLnNwZWxsY2hlY2s9ITEsbi5hcHBlbmRDaGlsZChpKSxlLmFwcGVuZENoaWxkKG4pLHQuYXBwZW5kQ2hpbGQoZSksdC5hcHBlbmRDaGlsZChyKSx0fSx0LmNyZWF0ZUl0ZW09ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0sdC5mb3JtYXRLZXlzdHJva2U9ZnVuY3Rpb24odCl7dmFyIGU9IiIsbj1jLkNvbW1hbmRSZWdpc3RyeS5wYXJzZUtleXN0cm9rZSh0KTtyZXR1cm4gaC5QbGF0Zm9ybS5JU19NQUM/KG4uY3RybCYmKGUrPSLijIMgIiksbi5hbHQmJihlKz0i4oylICIpLG4uc2hpZnQmJihlKz0i4oenICIpLG4uY21kJiYoZSs9IuKMmCAiKSk6KG4uY3RybCYmKGUrPSJDdHJsKyIpLG4uYWx0JiYoZSs9IkFsdCsiKSxuLnNoaWZ0JiYoZSs9IlNoaWZ0KyIpKSxlK24ua2V5fSx0LnNlYXJjaD1mdW5jdGlvbih0LGkpe3ZhciByPWZ1bmN0aW9uKHQsbil7bj1uLnJlcGxhY2UoL1xzKy9nLCIiKS50b0xvd2VyQ2FzZSgpO2Zvcih2YXIgaT1bXSxyPTAsbz10Lmxlbmd0aDtyPG87KytyKXt2YXIgcz10W3JdO2lmKHMuaXNWaXNpYmxlKWlmKG4pe3ZhciBhPWUocyxuKTthJiYocy5pc0VuYWJsZWR8fChhLnNjb3JlKz0xZTMpLGkucHVzaChhKSl9ZWxzZSBpLnB1c2goe21hdGNoVHlwZTozLGNhdGVnb3J5SW5kaWNlczpudWxsLGxhYmVsSW5kaWNlczpudWxsLHNjb3JlOjAsaXRlbTpzfSl9cmV0dXJuIGl9KHQsaSk7cmV0dXJuIHIuc29ydChuKSxmdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpO2EuQXJyYXlFeHQuZmlsbChlLCExKTtmb3IodmFyIG49W10saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZighZVtpXSl7dmFyIG89dFtpXSxzPW8uaXRlbSx1PW8uY2F0ZWdvcnlJbmRpY2VzLGM9cy5jYXRlZ29yeTtuLnB1c2goe3R5cGU6ImhlYWRlciIsY2F0ZWdvcnk6YyxpbmRpY2VzOnV9KTtmb3IodmFyIGg9aTtoPHI7KytoKWlmKCFlW2hdKXt2YXIgbD10W2hdLGQ9bC5pdGVtLGY9bC5sYWJlbEluZGljZXM7ZC5jYXRlZ29yeT09PWMmJihuLnB1c2goe3R5cGU6Iml0ZW0iLGl0ZW06ZCxpbmRpY2VzOmZ9KSxlW2hdPSEwKX19cmV0dXJuIG59KHIpfSx0LmNhbkFjdGl2YXRlPWZ1bmN0aW9uKHQpe3JldHVybiJpdGVtIj09PXQudHlwZSYmdC5pdGVtLmlzRW5hYmxlZH07dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY29tbWFuZHM9dCx0aGlzLmNhdGVnb3J5PWUuY2F0ZWdvcnkudHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIiksdGhpcy5jb21tYW5kPWUuY29tbWFuZCx0aGlzLmFyZ3M9ZS5hcmdzfHx1LkpTT05FeHQuZW1wdHlPYmplY3QsdGhpcy5yYW5rPXZvaWQgMCE9PWUucmFuaz9lLnJhbms6MS8wfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImxhYmVsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmxhYmVsKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaWNvbkNsYXNzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmljb25DbGFzcyh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImljb25MYWJlbCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5pY29uTGFiZWwodGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjYXB0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmNhcHRpb24odGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjbGFzc05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbWFuZHMuY2xhc3NOYW1lKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGF0YXNldCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5kYXRhc2V0KHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNFbmFibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzLmlzRW5hYmxlZCh0aGlzLmNvbW1hbmQsdGhpcy5hcmdzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzVG9nZ2xlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tYW5kcy5pc1RvZ2dsZWQodGhpcy5jb21tYW5kLHRoaXMuYXJncyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpc1Zpc2libGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbWFuZHMuaXNWaXNpYmxlKHRoaXMuY29tbWFuZCx0aGlzLmFyZ3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwia2V5QmluZGluZyIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29tbWFuZCxlPXRoaXMuYXJncztyZXR1cm4gYS5BcnJheUV4dC5maW5kTGFzdFZhbHVlKHRoaXMuX2NvbW1hbmRzLmtleUJpbmRpbmdzLGZ1bmN0aW9uKG4pe3JldHVybiBuLmNvbW1hbmQ9PT10JiZ1LkpTT05FeHQuZGVlcEVxdWFsKG4uYXJncyxlKX0pfHxudWxsfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9KCl9KHN8fChzPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGk9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHIsbz1uKDIpLHM9big3OCksYT1uKDkpLHU9bigxMzEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2lkVGljaz0wLHRoaXMuX2l0ZW1zPVtdLHRoaXMubWVudT1uZXcgdS5NZW51KHQpfXJldHVybiB0LnByb3RvdHlwZS5hZGRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1yLmNyZWF0ZUl0ZW0odCx0aGlzLl9pZFRpY2srKyk7cmV0dXJuIHRoaXMuX2l0ZW1zLnB1c2gobiksbmV3IHMuRGlzcG9zYWJsZURlbGVnYXRlKGZ1bmN0aW9uKCl7by5BcnJheUV4dC5yZW1vdmVGaXJzdE9mKGUuX2l0ZW1zLG4pfSl9LHQucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLm1lbnUuY2xlYXJJdGVtcygpLDA9PT10aGlzLl9pdGVtcy5sZW5ndGgpcmV0dXJuITE7dmFyIG49ci5tYXRjaEl0ZW1zKHRoaXMuX2l0ZW1zLHQpO3JldHVybiEoIW58fDA9PT1uLmxlbmd0aCkmJihvLmVhY2gobixmdW5jdGlvbih0KXtlLm1lbnUuYWRkSXRlbSh0KX0pLHRoaXMubWVudS5vcGVuKHQuY2xpZW50WCx0LmNsaWVudFkpLCEwKX0sdH0oKTtlLkNvbnRleHRNZW51PWMsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciBuPWEuU2VsZWN0b3IuY2FsY3VsYXRlU3BlY2lmaWNpdHkodC5zZWxlY3RvciksaT1hLlNlbGVjdG9yLmNhbGN1bGF0ZVNwZWNpZmljaXR5KGUuc2VsZWN0b3IpO2lmKG4hPT1pKXJldHVybiBpLW47dmFyIHI9dC5yYW5rLG89ZS5yYW5rO3JldHVybiByIT09bz9yPG8/LTE6MTp0LmlkLWUuaWR9dC5jcmVhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoLTEhPT10LmluZGV4T2YoIiwiKSl0aHJvdyBuZXcgRXJyb3IoIlNlbGVjdG9yIGNhbm5vdCBjb250YWluIGNvbW1hczogIit0KTtpZighYS5TZWxlY3Rvci5pc1ZhbGlkKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZWxlY3RvcjogIit0KTtyZXR1cm4gdH0odC5zZWxlY3Rvcikscj12b2lkIDAhPT10LnJhbms/dC5yYW5rOjEvMDtyZXR1cm4gaSh7fSx0LHtzZWxlY3RvcjpuLHJhbms6cixpZDplfSl9LHQubWF0Y2hJdGVtcz1mdW5jdGlvbih0LG4pe3ZhciBpPW4udGFyZ2V0O2lmKCFpKXJldHVybiBudWxsO3ZhciByPW4uY3VycmVudFRhcmdldDtpZighcilyZXR1cm4gbnVsbDtpZighKHIuY29udGFpbnMoaSl8fChpPWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQobi5jbGllbnRYLG4uY2xpZW50WSkpJiZyLmNvbnRhaW5zKGkpKSlyZXR1cm4gbnVsbDtmb3IodmFyIG89W10scz10LnNsaWNlKCk7bnVsbCE9PWk7KXtmb3IodmFyIHU9W10sYz0wLGg9cy5sZW5ndGg7YzxoOysrYyl7dmFyIGw9c1tjXTtsJiZhLlNlbGVjdG9yLm1hdGNoZXMoaSxsLnNlbGVjdG9yKSYmKHUucHVzaChsKSxzW2NdPW51bGwpfWlmKDAhPT11Lmxlbmd0aCYmKHUuc29ydChlKSxvLnB1c2guYXBwbHkobyx1KSksaT09PXIpYnJlYWs7aT1pLnBhcmVudEVsZW1lbnR9cmV0dXJuIG99fShyfHwocj17fSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbyxzPW4oMiksYT1uKDI2KSx1PW4oOSksYz1uKDU2KSxoPW4oNSksbD1uKDMwKSxkPW4oMTEpLGY9bigxMzIpLHA9big4MCksbT1uKDcpLGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO2kuX2RyYWc9bnVsbCxpLl9wcmVzc0RhdGE9bnVsbCxpLl9sYXlvdXRNb2RpZmllZD1uZXcgZC5TaWduYWwoaSksaS5hZGRDbGFzcygicC1Eb2NrUGFuZWwiKSxpLl9tb2RlPW4ubW9kZXx8Im11bHRpcGxlLWRvY3VtZW50IixpLl9yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpLmRhdGFzZXQubW9kZT1pLl9tb2RlO3ZhciByPXtjcmVhdGVUYWJCYXI6ZnVuY3Rpb24oKXtyZXR1cm4gaS5fY3JlYXRlVGFiQmFyKCl9LGNyZWF0ZUhhbmRsZTpmdW5jdGlvbigpe3JldHVybiBpLl9jcmVhdGVIYW5kbGUoKX19O3JldHVybiBpLmxheW91dD1uZXcgZi5Eb2NrTGF5b3V0KHtyZW5kZXJlcjpyLHNwYWNpbmc6bi5zcGFjaW5nfSksaS5vdmVybGF5PW4ub3ZlcmxheXx8bmV3IGUuT3ZlcmxheSxpLm5vZGUuYXBwZW5kQ2hpbGQoaS5vdmVybGF5Lm5vZGUpLGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5vdmVybGF5LmhpZGUoMCksdGhpcy5fZHJhZyYmdGhpcy5fZHJhZy5kaXNwb3NlKCksdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dE1vZGlmaWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheW91dE1vZGlmaWVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicmVuZGVyZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQucmVuZGVyZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnNwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5zcGFjaW5nPXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGV9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl9tb2RlIT09dCl7dGhpcy5fbW9kZT10LHRoaXMuZGF0YXNldC5tb2RlPXQ7dmFyIGU9dGhpcy5sYXlvdXQ7c3dpdGNoKHQpe2Nhc2UibXVsdGlwbGUtZG9jdW1lbnQiOnMuZWFjaChlLnRhYkJhcnMoKSxmdW5jdGlvbih0KXt0LnNob3coKX0pO2JyZWFrO2Nhc2Uic2luZ2xlLWRvY3VtZW50IjplLnJlc3RvcmVMYXlvdXQoby5jcmVhdGVTaW5nbGVEb2N1bWVudENvbmZpZyh0aGlzKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9aC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImlzRW1wdHkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuaXNFbXB0eX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS53aWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LndpZGdldHMoKX0sZS5wcm90b3R5cGUuc2VsZWN0ZWRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnNlbGVjdGVkV2lkZ2V0cygpfSxlLnByb3RvdHlwZS50YWJCYXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnRhYkJhcnMoKX0sZS5wcm90b3R5cGUuaGFuZGxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5oYW5kbGVzKCl9LGUucHJvdG90eXBlLnNlbGVjdFdpZGdldD1mdW5jdGlvbih0KXt2YXIgZT1zLmZpbmQodGhpcy50YWJCYXJzKCksZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1lLnRpdGxlcy5pbmRleE9mKHQudGl0bGUpfSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgZG9jayBwYW5lbC4iKTtlLmN1cnJlbnRUaXRsZT10LnRpdGxlfSxlLnByb3RvdHlwZS5hY3RpdmF0ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnNlbGVjdFdpZGdldCh0KSx0LmFjdGl2YXRlKCl9LGUucHJvdG90eXBlLnNhdmVMYXlvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc2F2ZUxheW91dCgpfSxlLnByb3RvdHlwZS5yZXN0b3JlTGF5b3V0PWZ1bmN0aW9uKHQpe3RoaXMuX21vZGU9Im11bHRpcGxlLWRvY3VtZW50Iix0aGlzLmxheW91dC5yZXN0b3JlTGF5b3V0KHQpLCh1LlBsYXRmb3JtLklTX0VER0V8fHUuUGxhdGZvcm0uSVNfSUUpJiZoLk1lc3NhZ2VMb29wLmZsdXNoKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSksInNpbmdsZS1kb2N1bWVudCI9PT10aGlzLl9tb2RlP3RoaXMubGF5b3V0LmFkZFdpZGdldCh0KTp0aGlzLmxheW91dC5hZGRXaWRnZXQodCxlKSxoLk1lc3NhZ2VMb29wLnBvc3RNZXNzYWdlKHRoaXMsby5MYXlvdXRNb2RpZmllZCl9LGUucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlPWZ1bmN0aW9uKGUpeyJsYXlvdXQtbW9kaWZpZWQiPT09ZS50eXBlP3RoaXMuX2xheW91dE1vZGlmaWVkLmVtaXQodm9pZCAwKTp0LnByb3RvdHlwZS5wcm9jZXNzTWVzc2FnZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UicC1kcmFnZW50ZXIiOnRoaXMuX2V2dERyYWdFbnRlcih0KTticmVhaztjYXNlInAtZHJhZ2xlYXZlIjp0aGlzLl9ldnREcmFnTGVhdmUodCk7YnJlYWs7Y2FzZSJwLWRyYWdvdmVyIjp0aGlzLl9ldnREcmFnT3Zlcih0KTticmVhaztjYXNlInAtZHJvcCI6dGhpcy5fZXZ0RHJvcCh0KTticmVhaztjYXNlIm1vdXNlZG93biI6dGhpcy5fZXZ0TW91c2VEb3duKHQpO2JyZWFrO2Nhc2UibW91c2Vtb3ZlIjp0aGlzLl9ldnRNb3VzZU1vdmUodCk7YnJlYWs7Y2FzZSJtb3VzZXVwIjp0aGlzLl9ldnRNb3VzZVVwKHQpO2JyZWFrO2Nhc2Uia2V5ZG93biI6dGhpcy5fZXZ0S2V5RG93bih0KTticmVhaztjYXNlImNvbnRleHRtZW51Ijp0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19LGUucHJvdG90eXBlLm9uQmVmb3JlQXR0YWNoPWZ1bmN0aW9uKHQpe3RoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJwLWRyYWdlbnRlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoInAtZHJhZ2xlYXZlIix0aGlzKSx0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigicC1kcmFnb3ZlciIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoInAtZHJvcCIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInAtZHJhZ2VudGVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicC1kcmFnbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJwLWRyYWdvdmVyIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicC1kcm9wIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25DaGlsZEFkZGVkPWZ1bmN0aW9uKHQpe28uaXNHZW5lcmF0ZWRUYWJCYXJQcm9wZXJ0eS5nZXQodC5jaGlsZCl8fHQuY2hpbGQuYWRkQ2xhc3MoInAtRG9ja1BhbmVsLXdpZGdldCIpfSxlLnByb3RvdHlwZS5vbkNoaWxkUmVtb3ZlZD1mdW5jdGlvbih0KXtvLmlzR2VuZXJhdGVkVGFiQmFyUHJvcGVydHkuZ2V0KHQuY2hpbGQpfHwodC5jaGlsZC5yZW1vdmVDbGFzcygicC1Eb2NrUGFuZWwtd2lkZ2V0IiksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpKX0sZS5wcm90b3R5cGUuX2V2dERyYWdFbnRlcj1mdW5jdGlvbih0KXt0Lm1pbWVEYXRhLmhhc0RhdGEoImFwcGxpY2F0aW9uL3ZuZC5waG9zcGhvci53aWRnZXQtZmFjdG9yeSIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxlLnByb3RvdHlwZS5fZXZ0RHJhZ0xlYXZlPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXQucmVsYXRlZFRhcmdldDtlJiZ0aGlzLm5vZGUuY29udGFpbnMoZSl8fHRoaXMub3ZlcmxheS5oaWRlKDApfSxlLnByb3RvdHlwZS5fZXZ0RHJhZ092ZXI9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksImludmFsaWQiPT09dGhpcy5fc2hvd092ZXJsYXkodC5jbGllbnRYLHQuY2xpZW50WSk/dC5kcm9wQWN0aW9uPSJub25lIjp0LmRyb3BBY3Rpb249dC5wcm9wb3NlZEFjdGlvbn0sZS5wcm90b3R5cGUuX2V2dERyb3A9ZnVuY3Rpb24odCl7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vdmVybGF5LmhpZGUoMCksIm5vbmUiIT09dC5wcm9wb3NlZEFjdGlvbil7dmFyIGU9dC5jbGllbnRYLG49dC5jbGllbnRZLGk9by5maW5kRHJvcFRhcmdldCh0aGlzLGUsbikscj1pLnpvbmUscz1pLnRhcmdldDtpZigiaW52YWxpZCIhPT1yKXt2YXIgYT10Lm1pbWVEYXRhLmdldERhdGEoImFwcGxpY2F0aW9uL3ZuZC5waG9zcGhvci53aWRnZXQtZmFjdG9yeSIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXt2YXIgdT1hKCk7aWYodSBpbnN0YW5jZW9mIG0uV2lkZ2V0KWlmKHUuY29udGFpbnModGhpcykpdC5kcm9wQWN0aW9uPSJub25lIjtlbHNle3ZhciBjPXM/by5nZXREcm9wUmVmKHMudGFiQmFyKTpudWxsO3N3aXRjaChyKXtjYXNlInJvb3QtYWxsIjp0aGlzLmFkZFdpZGdldCh1KTticmVhaztjYXNlInJvb3QtdG9wIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC10b3AifSk7YnJlYWs7Y2FzZSJyb290LWxlZnQiOnRoaXMuYWRkV2lkZ2V0KHUse21vZGU6InNwbGl0LWxlZnQifSk7YnJlYWs7Y2FzZSJyb290LXJpZ2h0Ijp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1yaWdodCJ9KTticmVhaztjYXNlInJvb3QtYm90dG9tIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1ib3R0b20ifSk7YnJlYWs7Y2FzZSJ3aWRnZXQtYWxsIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJ0YWItYWZ0ZXIiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtdG9wIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC10b3AiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtbGVmdCI6dGhpcy5hZGRXaWRnZXQodSx7bW9kZToic3BsaXQtbGVmdCIscmVmOmN9KTticmVhaztjYXNlIndpZGdldC1yaWdodCI6dGhpcy5hZGRXaWRnZXQodSx7bW9kZToic3BsaXQtcmlnaHQiLHJlZjpjfSk7YnJlYWs7Y2FzZSJ3aWRnZXQtYm90dG9tIjp0aGlzLmFkZFdpZGdldCh1LHttb2RlOiJzcGxpdC1ib3R0b20iLHJlZjpjfSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9dC5kcm9wQWN0aW9uPXQucHJvcG9zZWRBY3Rpb24sdGhpcy5hY3RpdmF0ZVdpZGdldCh1KX1lbHNlIHQuZHJvcEFjdGlvbj0ibm9uZSJ9ZWxzZSB0LmRyb3BBY3Rpb249Im5vbmUifWVsc2UgdC5kcm9wQWN0aW9uPSJub25lIn1lbHNlIHQuZHJvcEFjdGlvbj0ibm9uZSJ9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiYodGhpcy5fcmVsZWFzZU1vdXNlKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24pe3ZhciBlPXRoaXMubGF5b3V0LG49dC50YXJnZXQsaT1zLmZpbmQoZS5oYW5kbGVzKCksZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udGFpbnMobil9KTtpZihpKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKTt2YXIgcj1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dC5jbGllbnRYLXIubGVmdCxhPXQuY2xpZW50WS1yLnRvcCx1PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLGg9Yy5EcmFnLm92ZXJyaWRlQ3Vyc29yKHUuY3Vyc29yKTt0aGlzLl9wcmVzc0RhdGE9e2hhbmRsZTppLGRlbHRhWDpvLGRlbHRhWTphLG92ZXJyaWRlOmh9fX19LGUucHJvdG90eXBlLl9ldnRNb3VzZU1vdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5fcHJlc3NEYXRhKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj10LmNsaWVudFgtZS5sZWZ0LXRoaXMuX3ByZXNzRGF0YS5kZWx0YVgsaT10LmNsaWVudFktZS50b3AtdGhpcy5fcHJlc3NEYXRhLmRlbHRhWTt0aGlzLmxheW91dC5tb3ZlSGFuZGxlKHRoaXMuX3ByZXNzRGF0YS5oYW5kbGUsbixpKX19LGUucHJvdG90eXBlLl9ldnRNb3VzZVVwPWZ1bmN0aW9uKHQpezA9PT10LmJ1dHRvbiYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3JlbGVhc2VNb3VzZSgpLGguTWVzc2FnZUxvb3AucG9zdE1lc3NhZ2UodGhpcyxvLkxheW91dE1vZGlmaWVkKSl9LGUucHJvdG90eXBlLl9yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9wcmVzc0RhdGEmJih0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApKX0sZS5wcm90b3R5cGUuX3Nob3dPdmVybGF5PWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLHMsYT1vLmZpbmREcm9wVGFyZ2V0KHRoaXMsdCxlKSxjPWEuem9uZSxoPWEudGFyZ2V0O2lmKCJpbnZhbGlkIj09PWMpcmV0dXJuIHRoaXMub3ZlcmxheS5oaWRlKDEwMCksYzt2YXIgbD11LkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMubm9kZSksZD10aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7c3dpdGNoKGMpe2Nhc2Uicm9vdC1hbGwiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9bC5wYWRkaW5nQm90dG9tO2JyZWFrO2Nhc2Uicm9vdC10b3AiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9ZC5oZWlnaHQqby5HT0xERU5fUkFUSU87YnJlYWs7Y2FzZSJyb290LWxlZnQiOm49bC5wYWRkaW5nVG9wLGk9bC5wYWRkaW5nTGVmdCxyPWQud2lkdGgqby5HT0xERU5fUkFUSU8scz1sLnBhZGRpbmdCb3R0b207YnJlYWs7Y2FzZSJyb290LXJpZ2h0IjpuPWwucGFkZGluZ1RvcCxpPWQud2lkdGgqby5HT0xERU5fUkFUSU8scj1sLnBhZGRpbmdSaWdodCxzPWwucGFkZGluZ0JvdHRvbTticmVhaztjYXNlInJvb3QtYm90dG9tIjpuPWQuaGVpZ2h0Km8uR09MREVOX1JBVElPLGk9bC5wYWRkaW5nTGVmdCxyPWwucGFkZGluZ1JpZ2h0LHM9bC5wYWRkaW5nQm90dG9tO2JyZWFrO2Nhc2Uid2lkZ2V0LWFsbCI6bj1oLnRvcCxpPWgubGVmdCxyPWgucmlnaHQscz1oLmJvdHRvbTticmVhaztjYXNlIndpZGdldC10b3AiOm49aC50b3AsaT1oLmxlZnQscj1oLnJpZ2h0LHM9aC5ib3R0b20raC5oZWlnaHQvMjticmVhaztjYXNlIndpZGdldC1sZWZ0IjpuPWgudG9wLGk9aC5sZWZ0LHI9aC5yaWdodCtoLndpZHRoLzIscz1oLmJvdHRvbTticmVhaztjYXNlIndpZGdldC1yaWdodCI6bj1oLnRvcCxpPWgubGVmdCtoLndpZHRoLzIscj1oLnJpZ2h0LHM9aC5ib3R0b207YnJlYWs7Y2FzZSJ3aWRnZXQtYm90dG9tIjpuPWgudG9wK2guaGVpZ2h0LzIsaT1oLmxlZnQscj1oLnJpZ2h0LHM9aC5ib3R0b207YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJuIHRoaXMub3ZlcmxheS5zaG93KHt0b3A6bixsZWZ0OmkscmlnaHQ6cixib3R0b206c30pLGN9LGUucHJvdG90eXBlLl9jcmVhdGVUYWJCYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZW5kZXJlci5jcmVhdGVUYWJCYXIoKTtyZXR1cm4gby5pc0dlbmVyYXRlZFRhYkJhclByb3BlcnR5LnNldCh0LCEwKSwic2luZ2xlLWRvY3VtZW50Ij09PXRoaXMuX21vZGUmJnQuaGlkZSgpLHQudGFic01vdmFibGU9ITAsdC5hbGxvd0Rlc2VsZWN0PSExLHQucmVtb3ZlQmVoYXZpb3I9InNlbGVjdC1wcmV2aW91cy10YWIiLHQuaW5zZXJ0QmVoYXZpb3I9InNlbGVjdC10YWItaWYtbmVlZGVkIix0LnRhYk1vdmVkLmNvbm5lY3QodGhpcy5fb25UYWJNb3ZlZCx0aGlzKSx0LmN1cnJlbnRDaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25DdXJyZW50Q2hhbmdlZCx0aGlzKSx0LnRhYkNsb3NlUmVxdWVzdGVkLmNvbm5lY3QodGhpcy5fb25UYWJDbG9zZVJlcXVlc3RlZCx0aGlzKSx0LnRhYkRldGFjaFJlcXVlc3RlZC5jb25uZWN0KHRoaXMuX29uVGFiRGV0YWNoUmVxdWVzdGVkLHRoaXMpLHQudGFiQWN0aXZhdGVSZXF1ZXN0ZWQuY29ubmVjdCh0aGlzLl9vblRhYkFjdGl2YXRlUmVxdWVzdGVkLHRoaXMpLHR9LGUucHJvdG90eXBlLl9jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXIuY3JlYXRlSGFuZGxlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKCl7aC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5fb25DdXJyZW50Q2hhbmdlZD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldmlvdXNUaXRsZSxpPWUuY3VycmVudFRpdGxlO24mJm4ub3duZXIuaGlkZSgpLGkmJmkub3duZXIuc2hvdygpLCh1LlBsYXRmb3JtLklTX0VER0V8fHUuUGxhdGZvcm0uSVNfSUUpJiZoLk1lc3NhZ2VMb29wLmZsdXNoKCksaC5NZXNzYWdlTG9vcC5wb3N0TWVzc2FnZSh0aGlzLG8uTGF5b3V0TW9kaWZpZWQpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYkRldGFjaFJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIXRoaXMuX2RyYWcpe3QucmVsZWFzZU1vdXNlKCk7dmFyIGk9ZS50aXRsZSxyPWUudGFiLG89ZS5jbGllbnRYLHM9ZS5jbGllbnRZLHU9bmV3IGEuTWltZURhdGE7dS5zZXREYXRhKCJhcHBsaWNhdGlvbi92bmQucGhvc3Bob3Iud2lkZ2V0LWZhY3RvcnkiLGZ1bmN0aW9uKCl7cmV0dXJuIGkub3duZXJ9KTt2YXIgaD1yLmNsb25lTm9kZSghMCk7dGhpcy5fZHJhZz1uZXcgYy5EcmFnKHttaW1lRGF0YTp1LGRyYWdJbWFnZTpoLHByb3Bvc2VkQWN0aW9uOiJtb3ZlIixzdXBwb3J0ZWRBY3Rpb25zOiJtb3ZlIn0pLHIuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIik7dGhpcy5fZHJhZy5zdGFydChvLHMpLnRoZW4oZnVuY3Rpb24oKXtuLl9kcmFnPW51bGwsci5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1oaWRkZW4iKX0pfX0sZX0obS5XaWRnZXQpO2UuRG9ja1BhbmVsPWcsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fdGltZXI9LTEsdGhpcy5faGlkZGVuPSEwLHRoaXMubm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgicC1Eb2NrUGFuZWwtb3ZlcmxheSIpLHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCJwLW1vZC1oaWRkZW4iKSx0aGlzLm5vZGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIn1yZXR1cm4gdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm5vZGUuc3R5bGU7ZS50b3A9dC50b3ArInB4IixlLmxlZnQ9dC5sZWZ0KyJweCIsZS5yaWdodD10LnJpZ2h0KyJweCIsZS5ib3R0b209dC5ib3R0b20rInB4IixjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPS0xLHRoaXMuX2hpZGRlbiYmKHRoaXMuX2hpZGRlbj0hMSx0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtaGlkZGVuIikpfSx0LnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2hpZGRlbilyZXR1cm4gdDw9MD8oY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj0tMSx0aGlzLl9oaWRkZW49ITAsdm9pZCB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgicC1tb2QtaGlkZGVuIikpOnZvaWQoLTE9PT10aGlzLl90aW1lciYmKHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl90aW1lcj0tMSxlLl9oaWRkZW49ITAsZS5ub2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWhpZGRlbiIpfSx0KSkpfSx0fSgpO3QuT3ZlcmxheT1lO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlVGFiQmFyPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHAuVGFiQmFyO3JldHVybiB0LmFkZENsYXNzKCJwLURvY2tQYW5lbC10YWJCYXIiKSx0fSx0LnByb3RvdHlwZS5jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9InAtRG9ja1BhbmVsLWhhbmRsZSIsdH0sdH0oKTt0LlJlbmRlcmVyPW4sdC5kZWZhdWx0UmVuZGVyZXI9bmV3IG59KGc9ZS5Eb2NrUGFuZWx8fChlLkRvY2tQYW5lbD17fSkpLGUuRG9ja1BhbmVsPWcsZnVuY3Rpb24odCl7dC5HT0xERU5fUkFUSU89LjYxOCx0LkVER0VfU0laRT00MCx0LkxheW91dE1vZGlmaWVkPW5ldyBoLkNvbmZsYXRhYmxlTWVzc2FnZSgibGF5b3V0LW1vZGlmaWVkIiksdC5pc0dlbmVyYXRlZFRhYkJhclByb3BlcnR5PW5ldyBsLkF0dGFjaGVkUHJvcGVydHkoe25hbWU6ImlzR2VuZXJhdGVkVGFiQmFyIixjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX19KSx0LmNyZWF0ZVNpbmdsZURvY3VtZW50Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKHQuaXNFbXB0eSlyZXR1cm57bWFpbjpudWxsfTt2YXIgZT1zLnRvQXJyYXkodC53aWRnZXRzKCkpLG49dC5zZWxlY3RlZFdpZGdldHMoKS5uZXh0KCksaT1uP2UuaW5kZXhPZihuKTotMTtyZXR1cm57bWFpbjp7dHlwZToidGFiLWFyZWEiLHdpZGdldHM6ZSxjdXJyZW50SW5kZXg6aX19fSx0LmZpbmREcm9wVGFyZ2V0PWZ1bmN0aW9uKGUsbixpKXtpZighdS5FbGVtZW50RXh0LmhpdFRlc3QoZS5ub2RlLG4saSkpcmV0dXJue3pvbmU6ImludmFsaWQiLHRhcmdldDpudWxsfTt2YXIgcj1lLmxheW91dDtpZihyLmlzRW1wdHkpcmV0dXJue3pvbmU6InJvb3QtYWxsIix0YXJnZXQ6bnVsbH07aWYoIm11bHRpcGxlLWRvY3VtZW50Ij09PWUubW9kZSl7dmFyIG89ZS5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9bi1vLmxlZnQrMSxhPWktby50b3ArMSxjPW8ucmlnaHQtbixoPW8uYm90dG9tLWksbD1NYXRoLm1pbihzLGEsYyxoKTtpZihsPD10LkVER0VfU0laRSl7dmFyIGQ7c3dpdGNoKGwpe2Nhc2UgczpkPSJyb290LWxlZnQiO2JyZWFrO2Nhc2UgYTpkPSJyb290LXRvcCI7YnJlYWs7Y2FzZSBjOmQ9InJvb3QtcmlnaHQiO2JyZWFrO2Nhc2UgaDpkPSJyb290LWJvdHRvbSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJue3pvbmU6ZCx0YXJnZXQ6bnVsbH19fXZhciBmPXIuaGl0VGVzdFRhYkFyZWFzKG4saSk7aWYoIWYpcmV0dXJue3pvbmU6ImludmFsaWQiLHRhcmdldDpudWxsfTtpZigic2luZ2xlLWRvY3VtZW50Ij09PWUubW9kZSlyZXR1cm57em9uZToid2lkZ2V0LWFsbCIsdGFyZ2V0OmZ9O3ZhciBwLG09Zi54LWYubGVmdCsxLGc9Zi55LWYudG9wKzEsdj1mLmxlZnQrZi53aWR0aC1mLngsYj1mLnRvcCtmLmhlaWdodC1mLnkseT1NYXRoLnJvdW5kKGYud2lkdGgvMyksXz1NYXRoLnJvdW5kKGYuaGVpZ2h0LzMpO2lmKG0+eSYmdj55JiZnPl8mJmI+XylyZXR1cm57em9uZToid2lkZ2V0LWFsbCIsdGFyZ2V0OmZ9O3N3aXRjaChtLz15LGcvPV8sdi89eSxiLz1fLE1hdGgubWluKG0sZyx2LGIpKXtjYXNlIG06cD0id2lkZ2V0LWxlZnQiO2JyZWFrO2Nhc2UgZzpwPSJ3aWRnZXQtdG9wIjticmVhaztjYXNlIHY6cD0id2lkZ2V0LXJpZ2h0IjticmVhaztjYXNlIGI6cD0id2lkZ2V0LWJvdHRvbSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9cmV0dXJue3pvbmU6cCx0YXJnZXQ6Zn19LHQuZ2V0RHJvcFJlZj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQudGl0bGVzLmxlbmd0aD9udWxsOnQuY3VycmVudFRpdGxlP3QuY3VycmVudFRpdGxlLm93bmVyOnQudGl0bGVzW3QudGl0bGVzLmxlbmd0aC0xXS5vd25lcn19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMikscj1uKDExKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2NvdW50ZXI9MCx0aGlzLl93aWRnZXRzPVtdLHRoaXMuX2FjdGl2ZVdpZGdldD1udWxsLHRoaXMuX2N1cnJlbnRXaWRnZXQ9bnVsbCx0aGlzLl9udW1iZXJzPW5ldyBNYXAsdGhpcy5fbm9kZXM9bmV3IE1hcCx0aGlzLl9hY3RpdmVDaGFuZ2VkPW5ldyByLlNpZ25hbCh0aGlzKSx0aGlzLl9jdXJyZW50Q2hhbmdlZD1uZXcgci5TaWduYWwodGhpcyl9cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2NvdW50ZXI8MHx8KHRoaXMuX2NvdW50ZXI9LTEsci5TaWduYWwuY2xlYXJEYXRhKHRoaXMpLGkuZWFjaCh0aGlzLl93aWRnZXRzLGZ1bmN0aW9uKGUpe2Uubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdCwhMCksZS5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHQsITApfSksdGhpcy5fYWN0aXZlV2lkZ2V0PW51bGwsdGhpcy5fY3VycmVudFdpZGdldD1udWxsLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fbnVtYmVycy5jbGVhcigpLHRoaXMuX3dpZGdldHMubGVuZ3RoPTApfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImN1cnJlbnRDaGFuZ2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZlQ2hhbmdlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNEaXNwb3NlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb3VudGVyPDB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjdXJyZW50V2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRXaWRnZXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhY3RpdmVXaWRnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlV2lkZ2V0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZvY3VzTnVtYmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX251bWJlcnMuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1lPy0xOmV9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbnVtYmVycy5oYXModCl9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZighdGhpcy5fbnVtYmVycy5oYXModCkpe3ZhciBlPXQubm9kZS5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSxuPWU/dGhpcy5fY291bnRlcisrOi0xO3RoaXMuX3dpZGdldHMucHVzaCh0KSx0aGlzLl9udW1iZXJzLnNldCh0LG4pLHRoaXMuX25vZGVzLnNldCh0Lm5vZGUsdCksdC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLCEwKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcywhMCksdC5kaXNwb3NlZC5jb25uZWN0KHRoaXMuX29uV2lkZ2V0RGlzcG9zZWQsdGhpcyksZSYmdGhpcy5fc2V0V2lkZ2V0cyh0LHQpfX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodGhpcy5fbnVtYmVycy5oYXModCkmJih0LmRpc3Bvc2VkLmRpc2Nvbm5lY3QodGhpcy5fb25XaWRnZXREaXNwb3NlZCx0aGlzKSx0Lm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMsITApLHQubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLCEwKSxpLkFycmF5RXh0LnJlbW92ZUZpcnN0T2YodGhpcy5fd2lkZ2V0cyx0KSx0aGlzLl9ub2Rlcy5kZWxldGUodC5ub2RlKSx0aGlzLl9udW1iZXJzLmRlbGV0ZSh0KSx0aGlzLl9jdXJyZW50V2lkZ2V0PT09dCkpe3ZhciBuPWkuZmlsdGVyKHRoaXMuX3dpZGdldHMsZnVuY3Rpb24odCl7cmV0dXJuLTEhPT1lLl9udW1iZXJzLmdldCh0KX0pLHI9aS5tYXgobixmdW5jdGlvbih0LG4pe3JldHVybiBlLl9udW1iZXJzLmdldCh0KS1lLl9udW1iZXJzLmdldChuKX0pfHxudWxsO3RoaXMuX3NldFdpZGdldHMocixudWxsKX19LHQucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiZm9jdXMiOnRoaXMuX2V2dEZvY3VzKHQpO2JyZWFrO2Nhc2UiYmx1ciI6dGhpcy5fZXZ0Qmx1cih0KX19LHQucHJvdG90eXBlLl9zZXRXaWRnZXRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY3VycmVudFdpZGdldDt0aGlzLl9jdXJyZW50V2lkZ2V0PXQ7dmFyIGk9dGhpcy5fYWN0aXZlV2lkZ2V0O3RoaXMuX2FjdGl2ZVdpZGdldD1lLG4hPT10JiZ0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtvbGRWYWx1ZTpuLG5ld1ZhbHVlOnR9KSxpIT09ZSYmdGhpcy5fYWN0aXZlQ2hhbmdlZC5lbWl0KHtvbGRWYWx1ZTppLG5ld1ZhbHVlOmV9KX0sdC5wcm90b3R5cGUuX2V2dEZvY3VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVzLmdldCh0LmN1cnJlbnRUYXJnZXQpO2UhPT10aGlzLl9jdXJyZW50V2lkZ2V0JiZ0aGlzLl9udW1iZXJzLnNldChlLHRoaXMuX2NvdW50ZXIrKyksdGhpcy5fc2V0V2lkZ2V0cyhlLGUpfSx0LnByb3RvdHlwZS5fZXZ0Qmx1cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2Rlcy5nZXQodC5jdXJyZW50VGFyZ2V0KSxuPXQucmVsYXRlZFRhcmdldDtuJiYoZS5ub2RlLmNvbnRhaW5zKG4pfHxpLmZpbmQodGhpcy5fd2lkZ2V0cyxmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlLmNvbnRhaW5zKG4pfSkpfHx0aGlzLl9zZXRXaWRnZXRzKHRoaXMuX2N1cnJlbnRXaWRnZXQsbnVsbCl9LHQucHJvdG90eXBlLl9vbldpZGdldERpc3Bvc2VkPWZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlKHQpfSx0fSgpO2UuRm9jdXNUcmFja2VyPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDUpLGM9bigzMCksaD1uKDQwKSxsPW4oMjIpLGQ9big3KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9kaXJ0eT0hMSxuLl9yb3dTcGFjaW5nPTQsbi5fY29sdW1uU3BhY2luZz00LG4uX2l0ZW1zPVtdLG4uX3Jvd1N0YXJ0cz1bXSxuLl9jb2x1bW5TdGFydHM9W10sbi5fcm93U2l6ZXJzPVtuZXcgaC5Cb3hTaXplcl0sbi5fY29sdW1uU2l6ZXJzPVtuZXcgaC5Cb3hTaXplcl0sbi5fYm94PW51bGwsdm9pZCAwIT09ZS5yb3dDb3VudCYmby5yZWFsbG9jU2l6ZXJzKG4uX3Jvd1NpemVycyxlLnJvd0NvdW50KSx2b2lkIDAhPT1lLmNvbHVtbkNvdW50JiZvLnJlYWxsb2NTaXplcnMobi5fY29sdW1uU2l6ZXJzLGUuY29sdW1uQ291bnQpLHZvaWQgMCE9PWUucm93U3BhY2luZyYmKG4uX3Jvd1NwYWNpbmc9by5jbGFtcFZhbHVlKGUucm93U3BhY2luZykpLHZvaWQgMCE9PWUuY29sdW1uU3BhY2luZyYmKG4uX2NvbHVtblNwYWNpbmc9by5jbGFtcFZhbHVlKGUuY29sdW1uU3BhY2luZykpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cy5lYWNoKHRoaXMuX2l0ZW1zLGZ1bmN0aW9uKHQpe3ZhciBlPXQud2lkZ2V0O3QuZGlzcG9zZSgpLGUuZGlzcG9zZSgpfSksdGhpcy5fYm94PW51bGwsdGhpcy5faXRlbXMubGVuZ3RoPTAsdGhpcy5fcm93U3RhcnRzLmxlbmd0aD0wLHRoaXMuX3Jvd1NpemVycy5sZW5ndGg9MCx0aGlzLl9jb2x1bW5TdGFydHMubGVuZ3RoPTAsdGhpcy5fY29sdW1uU2l6ZXJzLmxlbmd0aD0wLHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJyb3dDb3VudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3dTaXplcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMucm93Q291bnQmJihvLnJlYWxsb2NTaXplcnModGhpcy5fcm93U2l6ZXJzLHQpLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2x1bW5Db3VudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2x1bW5TaXplcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMuY29sdW1uQ291bnQmJihvLnJlYWxsb2NTaXplcnModGhpcy5fY29sdW1uU2l6ZXJzLHQpLHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maXQoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJyb3dTcGFjaW5nIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvd1NwYWNpbmd9LHNldDpmdW5jdGlvbih0KXt0PW8uY2xhbXBWYWx1ZSh0KSx0aGlzLl9yb3dTcGFjaW5nIT09dCYmKHRoaXMuX3Jvd1NwYWNpbmc9dCx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZml0KCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY29sdW1uU3BhY2luZyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2x1bW5TcGFjaW5nfSxzZXQ6ZnVuY3Rpb24odCl7dD1vLmNsYW1wVmFsdWUodCksdGhpcy5fY29sdW1uU3BhY2luZyE9PXQmJih0aGlzLl9jb2x1bW5TcGFjaW5nPXQsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpdCgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yb3dTdHJldGNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Jvd1NpemVyc1t0XTtyZXR1cm4gZT9lLnN0cmV0Y2g6LTF9LGUucHJvdG90eXBlLnNldFJvd1N0cmV0Y2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9yb3dTaXplcnNbdF07biYmKGU9by5jbGFtcFZhbHVlKGUpLG4uc3RyZXRjaCE9PWUmJihuLnN0cmV0Y2g9ZSx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQudXBkYXRlKCkpKX0sZS5wcm90b3R5cGUuY29sdW1uU3RyZXRjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb2x1bW5TaXplcnNbdF07cmV0dXJuIGU/ZS5zdHJldGNoOi0xfSxlLnByb3RvdHlwZS5zZXRDb2x1bW5TdHJldGNoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY29sdW1uU2l6ZXJzW3RdO24mJihlPW8uY2xhbXBWYWx1ZShlKSxuLnN0cmV0Y2ghPT1lJiYobi5zdHJldGNoPWUsdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnVwZGF0ZSgpKSl9LGUucHJvdG90eXBlLml0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcy5tYXAodGhpcy5faXRlbXMsZnVuY3Rpb24odCl7cmV0dXJuIHQud2lkZ2V0fSl9LGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbih0KXstMT09PXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5faXRlbXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUud2lkZ2V0PT09dH0pJiYodGhpcy5faXRlbXMucHVzaChuZXcgbC5MYXlvdXRJdGVtKHQpKSx0aGlzLnBhcmVudCYmdGhpcy5hdHRhY2hXaWRnZXQodCkpfSxlLnByb3RvdHlwZS5yZW1vdmVXaWRnZXQ9ZnVuY3Rpb24odCl7dmFyIGU9cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleCh0aGlzLl9pdGVtcyxmdW5jdGlvbihlKXtyZXR1cm4gZS53aWRnZXQ9PT10fSk7aWYoLTE9PT1lKXt2YXIgbj1zLkFycmF5RXh0LnJlbW92ZUF0KHRoaXMuX2l0ZW1zLGUpO3RoaXMucGFyZW50JiZ0aGlzLmRldGFjaFdpZGdldCh0KSxuLmRpc3Bvc2UoKX19LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKSxzLmVhY2godGhpcyxmdW5jdGlvbih0KXtlLmF0dGFjaFdpZGdldCh0KX0pfSxlLnByb3RvdHlwZS5hdHRhY2hXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGQuV2lkZ2V0Lk1zZy5CZWZvcmVBdHRhY2gpLHRoaXMucGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsZC5XaWRnZXQuTXNnLkFmdGVyQXR0YWNoKSx0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUuZGV0YWNoV2lkZ2V0PWZ1bmN0aW9uKHQpe3RoaXMucGFyZW50LmlzQXR0YWNoZWQmJnUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCxkLldpZGdldC5Nc2cuQmVmb3JlRGV0YWNoKSx0aGlzLnBhcmVudC5ub2RlLnJlbW92ZUNoaWxkKHQubm9kZSksdGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LGQuV2lkZ2V0Lk1zZy5BZnRlckRldGFjaCksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQmVmb3JlU2hvdz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZVNob3cuY2FsbCh0aGlzLGUpLHRoaXMucGFyZW50LnVwZGF0ZSgpfSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnQuZml0KCl9LGUucHJvdG90eXBlLm9uQ2hpbGRTaG93bj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25DaGlsZEhpZGRlbj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5maXQoKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNWaXNpYmxlJiZ0aGlzLl91cGRhdGUodC53aWR0aCx0LmhlaWdodCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc1Zpc2libGUmJnRoaXMuX3VwZGF0ZSgtMSwtMSl9LGUucHJvdG90eXBlLm9uRml0UmVxdWVzdD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZ0aGlzLl9maXQoKX0sZS5wcm90b3R5cGUuX2ZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLG49dGhpcy5yb3dDb3VudDt0PG47Kyt0KXRoaXMuX3Jvd1NpemVyc1t0XS5taW5TaXplPTA7Zm9yKHQ9MCxuPXRoaXMuY29sdW1uQ291bnQ7dDxuOysrdCl0aGlzLl9jb2x1bW5TaXplcnNbdF0ubWluU2l6ZT0wO3ZhciBpPXRoaXMuX2l0ZW1zLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5pc0hpZGRlbn0pO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KWlbdF0uZml0KCk7dmFyIHI9dGhpcy5yb3dDb3VudC0xLHM9dGhpcy5jb2x1bW5Db3VudC0xO2kuc29ydChvLnJvd1NwYW5DbXApO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KXt2YXIgYz1pW3RdLGg9ZS5nZXRDZWxsQ29uZmlnKGMud2lkZ2V0KSxsPU1hdGgubWluKGgucm93LHIpLGY9TWF0aC5taW4oaC5yb3craC5yb3dTcGFuLTEscik7by5kaXN0cmlidXRlTWluKHRoaXMuX3Jvd1NpemVycyxsLGYsYy5taW5IZWlnaHQpfWkuc29ydChvLmNvbHVtblNwYW5DbXApO2Zvcih0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KXtjPWlbdF0saD1lLmdldENlbGxDb25maWcoYy53aWRnZXQpO3ZhciBwPU1hdGgubWluKGguY29sdW1uLHMpLG09TWF0aC5taW4oaC5jb2x1bW4raC5jb2x1bW5TcGFuLTEscyk7by5kaXN0cmlidXRlTWluKHRoaXMuX2NvbHVtblNpemVycyxwLG0sYy5taW5XaWR0aCl9aWYoInNldC1uby1jb25zdHJhaW50IiE9PXRoaXMuZml0UG9saWN5KXt2YXIgZz1yKnRoaXMuX3Jvd1NwYWNpbmcsdj1zKnRoaXMuX2NvbHVtblNwYWNpbmc7Zm9yKHQ9MCxuPXRoaXMucm93Q291bnQ7dDxuOysrdClnKz10aGlzLl9yb3dTaXplcnNbdF0ubWluU2l6ZTtmb3IodD0wLG49dGhpcy5jb2x1bW5Db3VudDt0PG47Kyt0KXYrPXRoaXMuX2NvbHVtblNpemVyc1t0XS5taW5TaXplO3ZhciBiPXRoaXMuX2JveD1hLkVsZW1lbnRFeHQuYm94U2l6aW5nKHRoaXMucGFyZW50Lm5vZGUpO3YrPWIuaG9yaXpvbnRhbFN1bSxnKz1iLnZlcnRpY2FsU3VtO3ZhciB5PXRoaXMucGFyZW50Lm5vZGUuc3R5bGU7eS5taW5XaWR0aD12KyJweCIseS5taW5IZWlnaHQ9ZysicHgiLHRoaXMuX2RpcnR5PSEwLHRoaXMucGFyZW50LnBhcmVudCYmdS5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0aGlzLnBhcmVudC5wYXJlbnQsZC5XaWRnZXQuTXNnLkZpdFJlcXVlc3QpLHRoaXMuX2RpcnR5JiZ1Lk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMucGFyZW50LGQuV2lkZ2V0Lk1zZy5VcGRhdGVSZXF1ZXN0KX1lbHNlIHUuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodGhpcy5wYXJlbnQsZC5XaWRnZXQuTXNnLlVwZGF0ZVJlcXVlc3QpfSxlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQsbil7dGhpcy5fZGlydHk9ITEsdDwwJiYodD10aGlzLnBhcmVudC5ub2RlLm9mZnNldFdpZHRoKSxuPDAmJihuPXRoaXMucGFyZW50Lm5vZGUub2Zmc2V0SGVpZ2h0KSx0aGlzLl9ib3h8fCh0aGlzLl9ib3g9YS5FbGVtZW50RXh0LmJveFNpemluZyh0aGlzLnBhcmVudC5ub2RlKSk7dmFyIGk9dGhpcy5fYm94LnBhZGRpbmdUb3Ascj10aGlzLl9ib3gucGFkZGluZ0xlZnQsbz10LXRoaXMuX2JveC5ob3Jpem9udGFsU3VtLHM9bi10aGlzLl9ib3gudmVydGljYWxTdW0sdT10aGlzLnJvd0NvdW50LTEsYz10aGlzLmNvbHVtbkNvdW50LTEsbD11KnRoaXMuX3Jvd1NwYWNpbmcsZD1jKnRoaXMuX2NvbHVtblNwYWNpbmc7aC5Cb3hFbmdpbmUuY2FsYyh0aGlzLl9yb3dTaXplcnMsTWF0aC5tYXgoMCxzLWwpKSxoLkJveEVuZ2luZS5jYWxjKHRoaXMuX2NvbHVtblNpemVycyxNYXRoLm1heCgwLG8tZCkpO2Zvcih2YXIgZj0wLHA9aSxtPXRoaXMucm93Q291bnQ7ZjxtOysrZil0aGlzLl9yb3dTdGFydHNbZl09cCxwKz10aGlzLl9yb3dTaXplcnNbZl0uc2l6ZSt0aGlzLl9yb3dTcGFjaW5nO2ZvcihmPTAscD1yLG09dGhpcy5jb2x1bW5Db3VudDtmPG07KytmKXRoaXMuX2NvbHVtblN0YXJ0c1tmXT1wLHArPXRoaXMuX2NvbHVtblNpemVyc1tmXS5zaXplK3RoaXMuX2NvbHVtblNwYWNpbmc7Zm9yKGY9MCxtPXRoaXMuX2l0ZW1zLmxlbmd0aDtmPG07KytmKXt2YXIgZz10aGlzLl9pdGVtc1tmXTtpZighZy5pc0hpZGRlbil7dmFyIHY9ZS5nZXRDZWxsQ29uZmlnKGcud2lkZ2V0KSxiPU1hdGgubWluKHYucm93LHUpLHk9TWF0aC5taW4odi5jb2x1bW4sYyksXz1NYXRoLm1pbih2LnJvdyt2LnJvd1NwYW4tMSx1KSx3PU1hdGgubWluKHYuY29sdW1uK3YuY29sdW1uU3Bhbi0xLGMpLHg9dGhpcy5fY29sdW1uU3RhcnRzW3ldLE09dGhpcy5fcm93U3RhcnRzW2JdLFM9dGhpcy5fY29sdW1uU3RhcnRzW3ddK3RoaXMuX2NvbHVtblNpemVyc1t3XS5zaXplLXgsRT10aGlzLl9yb3dTdGFydHNbX10rdGhpcy5fcm93U2l6ZXJzW19dLnNpemUtTTtnLnVwZGF0ZSh4LE0sUyxFKX19fSxlfShsLkxheW91dCk7ZS5HcmlkTGF5b3V0PWYsZnVuY3Rpb24odCl7dC5nZXRDZWxsQ29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNlbGxDb25maWdQcm9wZXJ0eS5nZXQodCl9LHQuc2V0Q2VsbENvbmZpZz1mdW5jdGlvbih0LGUpe28uY2VsbENvbmZpZ1Byb3BlcnR5LnNldCh0LG8ubm9ybWFsaXplQ29uZmlnKGUpKX19KGY9ZS5HcmlkTGF5b3V0fHwoZS5HcmlkTGF5b3V0PXt9KSksZS5HcmlkTGF5b3V0PWYsZnVuY3Rpb24odCl7dC5jZWxsQ29uZmlnUHJvcGVydHk9bmV3IGMuQXR0YWNoZWRQcm9wZXJ0eSh7bmFtZToiY2VsbENvbmZpZyIsY3JlYXRlOmZ1bmN0aW9uKCl7cmV0dXJue3JvdzowLGNvbHVtbjowLHJvd1NwYW46MSxjb2x1bW5TcGFuOjF9fSxjaGFuZ2VkOmZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5sYXlvdXQgaW5zdGFuY2VvZiBmJiZ0LnBhcmVudC5maXQoKX19KSx0Lm5vcm1hbGl6ZUNvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm57cm93Ok1hdGgubWF4KDAsTWF0aC5mbG9vcih0LnJvd3x8MCkpLGNvbHVtbjpNYXRoLm1heCgwLE1hdGguZmxvb3IodC5jb2x1bW58fDApKSxyb3dTcGFuOk1hdGgubWF4KDEsTWF0aC5mbG9vcih0LnJvd1NwYW58fDApKSxjb2x1bW5TcGFuOk1hdGgubWF4KDEsTWF0aC5mbG9vcih0LmNvbHVtblNwYW58fDApKX19LHQuY2xhbXBWYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKHQpKX0sdC5yb3dTcGFuQ21wPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5jZWxsQ29uZmlnUHJvcGVydHkuZ2V0KGUud2lkZ2V0KSxyPXQuY2VsbENvbmZpZ1Byb3BlcnR5LmdldChuLndpZGdldCk7cmV0dXJuIGkucm93U3Bhbi1yLnJvd1NwYW59LHQuY29sdW1uU3BhbkNtcD1mdW5jdGlvbihlLG4pe3ZhciBpPXQuY2VsbENvbmZpZ1Byb3BlcnR5LmdldChlLndpZGdldCkscj10LmNlbGxDb25maWdQcm9wZXJ0eS5nZXQobi53aWRnZXQpO3JldHVybiBpLmNvbHVtblNwYW4tci5jb2x1bW5TcGFufSx0LnJlYWxsb2NTaXplcnM9ZnVuY3Rpb24odCxlKXtmb3IoZT1NYXRoLm1heCgxLE1hdGguZmxvb3IoZSkpO3QubGVuZ3RoPGU7KXQucHVzaChuZXcgaC5Cb3hTaXplcik7dC5sZW5ndGg8ZSYmKHQubGVuZ3RoPWUpfSx0LmRpc3RyaWJ1dGVNaW49ZnVuY3Rpb24odCxlLG4saSl7aWYoIShuPGUpKWlmKGUhPT1uKXtmb3IodmFyIHI9MCxvPWU7bzw9bjsrK28pcis9dFtvXS5taW5TaXplO2lmKCEocj49aSkpe3ZhciBzPShpLXIpLyhuLWUrMSk7Zm9yKG89ZTtvPD1uOysrbyl0W29dLm1pblNpemUrPXN9fWVsc2V7dmFyIGE9dFtlXTthLm1pblNpemU9TWF0aC5tYXgoYS5taW5TaXplLGkpfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oOSksdT1uKDc5KSxjPW4oNSksaD1uKDU1KSxsPW4oNyksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgaT10LmNhbGwodGhpcyx7bm9kZTpvLmNyZWF0ZU5vZGUoKX0pfHx0aGlzO3JldHVybiBpLl9hY3RpdmVJbmRleD0tMSxpLl9tZW51cz1bXSxpLl9jaGlsZE1lbnU9bnVsbCxpLmFkZENsYXNzKCJwLU1lbnVCYXIiKSxpLnNldEZsYWcobC5XaWRnZXQuRmxhZy5EaXNhbGxvd0xheW91dCksaS5yZW5kZXJlcj1uLnJlbmRlcmVyfHxlLmRlZmF1bHRSZW5kZXJlcixpfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCksdGhpcy5fbWVudXMubGVuZ3RoPTAsdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImNoaWxkTWVudSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZE1lbnV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb250ZW50Tm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicC1NZW51QmFyLWNvbnRlbnQiKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFjdGl2ZU1lbnUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVudXNbdGhpcy5fYWN0aXZlSW5kZXhdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmVJbmRleD10P3RoaXMuX21lbnVzLmluZGV4T2YodCk6LTF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhY3RpdmVJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVJbmRleH0sc2V0OmZ1bmN0aW9uKHQpeyh0PDB8fHQ+PXRoaXMuX21lbnVzLmxlbmd0aCkmJih0PS0xKSx0aGlzLl9hY3RpdmVJbmRleCE9PXQmJih0aGlzLl9hY3RpdmVJbmRleD10LHRoaXMudXBkYXRlKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibWVudXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVudXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUub3BlbkFjdGl2ZU1lbnU9ZnVuY3Rpb24oKXstMSE9PXRoaXMuX2FjdGl2ZUluZGV4JiYodGhpcy5fb3BlbkNoaWxkTWVudSgpLHRoaXMuX2NoaWxkTWVudSYmKHRoaXMuX2NoaWxkTWVudS5hY3RpdmVJbmRleD0tMSx0aGlzLl9jaGlsZE1lbnUuYWN0aXZhdGVOZXh0SXRlbSgpKSl9LGUucHJvdG90eXBlLmFkZE1lbnU9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRNZW51KHRoaXMuX21lbnVzLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0TWVudT1mdW5jdGlvbih0LGUpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCk7dmFyIG49dGhpcy5fbWVudXMuaW5kZXhPZihlKSxpPU1hdGgubWF4KDAsTWF0aC5taW4odCx0aGlzLl9tZW51cy5sZW5ndGgpKTtpZigtMT09PW4pcmV0dXJuIHMuQXJyYXlFeHQuaW5zZXJ0KHRoaXMuX21lbnVzLGksZSksZS5hZGRDbGFzcygicC1NZW51QmFyLW1lbnUiKSxlLmFib3V0VG9DbG9zZS5jb25uZWN0KHRoaXMuX29uTWVudUFib3V0VG9DbG9zZSx0aGlzKSxlLm1lbnVSZXF1ZXN0ZWQuY29ubmVjdCh0aGlzLl9vbk1lbnVNZW51UmVxdWVzdGVkLHRoaXMpLGUudGl0bGUuY2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLHZvaWQgdGhpcy51cGRhdGUoKTtpPT09dGhpcy5fbWVudXMubGVuZ3RoJiZpLS0sbiE9PWkmJihzLkFycmF5RXh0Lm1vdmUodGhpcy5fbWVudXMsbixpKSx0aGlzLnVwZGF0ZSgpKX0sZS5wcm90b3R5cGUucmVtb3ZlTWVudT1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZU1lbnVBdCh0aGlzLl9tZW51cy5pbmRleE9mKHQpKX0sZS5wcm90b3R5cGUucmVtb3ZlTWVudUF0PWZ1bmN0aW9uKHQpe3RoaXMuX2Nsb3NlQ2hpbGRNZW51KCk7dmFyIGU9cy5BcnJheUV4dC5yZW1vdmVBdCh0aGlzLl9tZW51cyx0KTtlJiYoZS5hYm91dFRvQ2xvc2UuZGlzY29ubmVjdCh0aGlzLl9vbk1lbnVBYm91dFRvQ2xvc2UsdGhpcyksZS5tZW51UmVxdWVzdGVkLmRpc2Nvbm5lY3QodGhpcy5fb25NZW51TWVudVJlcXVlc3RlZCx0aGlzKSxlLnRpdGxlLmNoYW5nZWQuZGlzY29ubmVjdCh0aGlzLl9vblRpdGxlQ2hhbmdlZCx0aGlzKSxlLnJlbW92ZUNsYXNzKCJwLU1lbnVCYXItbWVudSIpLHRoaXMudXBkYXRlKCkpfSxlLnByb3RvdHlwZS5jbGVhck1lbnVzPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuX21lbnVzLmxlbmd0aCl7dGhpcy5fY2xvc2VDaGlsZE1lbnUoKTtmb3IodmFyIHQ9MCxlPXRoaXMuX21lbnVzO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO24uYWJvdXRUb0Nsb3NlLmRpc2Nvbm5lY3QodGhpcy5fb25NZW51QWJvdXRUb0Nsb3NlLHRoaXMpLG4ubWVudVJlcXVlc3RlZC5kaXNjb25uZWN0KHRoaXMuX29uTWVudU1lbnVSZXF1ZXN0ZWQsdGhpcyksbi50aXRsZS5jaGFuZ2VkLmRpc2Nvbm5lY3QodGhpcy5fb25UaXRsZUNoYW5nZWQsdGhpcyksbi5yZW1vdmVDbGFzcygicC1NZW51QmFyLW1lbnUiKX10aGlzLl9tZW51cy5sZW5ndGg9MCx0aGlzLnVwZGF0ZSgpfX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNlbGVhdmUiOnRoaXMuX2V2dE1vdXNlTGVhdmUodCk7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxlLnByb3RvdHlwZS5vbkJlZm9yZUF0dGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcyksdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRoaXMpLHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMpLHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzKSx0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMpLHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9LGUucHJvdG90eXBlLm9uQWN0aXZhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5ub2RlLmZvY3VzKCl9LGUucHJvdG90eXBlLm9uVXBkYXRlUmVxdWVzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fbWVudXMsbj10aGlzLnJlbmRlcmVyLGk9dGhpcy5fYWN0aXZlSW5kZXgscj1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MCxzPWUubGVuZ3RoO288czsrK28pe3ZhciBhPWVbb10udGl0bGUsdT1vPT09aTtyW29dPW4ucmVuZGVySXRlbSh7dGl0bGU6YSxhY3RpdmU6dX0pfWguVmlydHVhbERPTS5yZW5kZXIocix0aGlzLmNvbnRlbnROb2RlKX0sZS5wcm90b3R5cGUuX2V2dEtleURvd249ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dC5rZXlDb2RlO2lmKDEzIT09ZSYmMzghPT1lJiY0MCE9PWUpe2lmKDI3PT09ZSlyZXR1cm4gdGhpcy5fY2xvc2VDaGlsZE1lbnUoKSx0aGlzLmFjdGl2ZUluZGV4PS0xLHZvaWQgdGhpcy5ub2RlLmJsdXIoKTtpZigzNyE9PWUpaWYoMzkhPT1lKXt2YXIgbj11LmdldEtleWJvYXJkTGF5b3V0KCkua2V5Rm9yS2V5ZG93bkV2ZW50KHQpO2lmKG4pe3ZhciBpPXRoaXMuX2FjdGl2ZUluZGV4KzEscj1vLmZpbmRNbmVtb25pYyh0aGlzLl9tZW51cyxuLGkpOy0xPT09ci5pbmRleHx8ci5tdWx0aXBsZT8tMSE9PXIuaW5kZXg/dGhpcy5hY3RpdmVJbmRleD1yLmluZGV4Oi0xIT09ci5hdXRvJiYodGhpcy5hY3RpdmVJbmRleD1yLmF1dG8pOih0aGlzLmFjdGl2ZUluZGV4PXIuaW5kZXgsdGhpcy5vcGVuQWN0aXZlTWVudSgpKX19ZWxzZXtzPXRoaXMuX2FjdGl2ZUluZGV4LGE9dGhpcy5fbWVudXMubGVuZ3RoO3RoaXMuYWN0aXZlSW5kZXg9cz09PWEtMT8wOnMrMX1lbHNle3ZhciBzPXRoaXMuX2FjdGl2ZUluZGV4LGE9dGhpcy5fbWVudXMubGVuZ3RoO3RoaXMuYWN0aXZlSW5kZXg9MD09PXM/YS0xOnMtMX19ZWxzZSB0aGlzLm9wZW5BY3RpdmVNZW51KCl9LGUucHJvdG90eXBlLl9ldnRNb3VzZURvd249ZnVuY3Rpb24odCl7aWYoYS5FbGVtZW50RXh0LmhpdFRlc3QodGhpcy5ub2RlLHQuY2xpZW50WCx0LmNsaWVudFkpKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3ZhciBlPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pOy0xIT09ZT8wPT09dC5idXR0b24mJih0aGlzLl9jaGlsZE1lbnU/KHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCksdGhpcy5hY3RpdmVJbmRleD1lKToodGhpcy5hY3RpdmVJbmRleD1lLHRoaXMuX29wZW5DaGlsZE1lbnUoKSkpOnRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXMuQXJyYXlFeHQuZmluZEZpcnN0SW5kZXgodGhpcy5jb250ZW50Tm9kZS5jaGlsZHJlbixmdW5jdGlvbihlKXtyZXR1cm4gYS5FbGVtZW50RXh0LmhpdFRlc3QoZSx0LmNsaWVudFgsdC5jbGllbnRZKX0pO2UhPT10aGlzLl9hY3RpdmVJbmRleCYmKC0xPT09ZSYmdGhpcy5fY2hpbGRNZW51fHwodGhpcy5hY3RpdmVJbmRleD1lLHRoaXMuX2NoaWxkTWVudSYmdGhpcy5fb3BlbkNoaWxkTWVudSgpKSl9LGUucHJvdG90eXBlLl9ldnRNb3VzZUxlYXZlPWZ1bmN0aW9uKHQpe3RoaXMuX2NoaWxkTWVudXx8KHRoaXMuYWN0aXZlSW5kZXg9LTEpfSxlLnByb3RvdHlwZS5fb3BlbkNoaWxkTWVudT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWN0aXZlTWVudTtpZih0KXt2YXIgZT10aGlzLl9jaGlsZE1lbnU7aWYoZSE9PXQpe3RoaXMuX2NoaWxkTWVudT10LGU/ZS5jbG9zZSgpOih0aGlzLmFkZENsYXNzKCJwLW1vZC1hY3RpdmUiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApKSxjLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHRoaXMsbC5XaWRnZXQuTXNnLlVwZGF0ZVJlcXVlc3QpO3ZhciBuPXRoaXMuY29udGVudE5vZGUuY2hpbGRyZW5bdGhpcy5fYWN0aXZlSW5kZXhdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bi5sZWZ0LHI9bi5ib3R0b207dC5vcGVuKGkscix7Zm9yY2VYOiEwLGZvcmNlWTohMH0pfX1lbHNlIHRoaXMuX2Nsb3NlQ2hpbGRNZW51KCl9LGUucHJvdG90eXBlLl9jbG9zZUNoaWxkTWVudT1mdW5jdGlvbigpe2lmKHRoaXMuX2NoaWxkTWVudSl7dGhpcy5yZW1vdmVDbGFzcygicC1tb2QtYWN0aXZlIiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLCEwKTt2YXIgdD10aGlzLl9jaGlsZE1lbnU7dGhpcy5fY2hpbGRNZW51PW51bGwsdC5jbG9zZSgpLHRoaXMuYWN0aXZlSW5kZXg9LTF9fSxlLnByb3RvdHlwZS5fb25NZW51QWJvdXRUb0Nsb3NlPWZ1bmN0aW9uKHQpe3Q9PT10aGlzLl9jaGlsZE1lbnUmJih0aGlzLnJlbW92ZUNsYXNzKCJwLW1vZC1hY3RpdmUiKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMsITApLHRoaXMuX2NoaWxkTWVudT1udWxsLHRoaXMuYWN0aXZlSW5kZXg9LTEpfSxlLnByb3RvdHlwZS5fb25NZW51TWVudVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2lmKHQ9PT10aGlzLl9jaGlsZE1lbnUpe3ZhciBuPXRoaXMuX2FjdGl2ZUluZGV4LGk9dGhpcy5fbWVudXMubGVuZ3RoO3N3aXRjaChlKXtjYXNlIm5leHQiOnRoaXMuYWN0aXZlSW5kZXg9bj09PWktMT8wOm4rMTticmVhaztjYXNlInByZXZpb3VzIjp0aGlzLmFjdGl2ZUluZGV4PTA9PT1uP2ktMTpuLTF9dGhpcy5vcGVuQWN0aXZlTWVudSgpfX0sZS5wcm90b3R5cGUuX29uVGl0bGVDaGFuZ2VkPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sZX0obC5XaWRnZXQpO2UuTWVudUJhcj1kLGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNyZWF0ZUl0ZW1DbGFzcyh0KSxuPXRoaXMuY3JlYXRlSXRlbURhdGFzZXQodCk7cmV0dXJuIGguaC5saSh7Y2xhc3NOYW1lOmUsZGF0YXNldDpufSx0aGlzLnJlbmRlckljb24odCksdGhpcy5yZW5kZXJMYWJlbCh0KSl9LHQucHJvdG90eXBlLnJlbmRlckljb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jcmVhdGVJY29uQ2xhc3ModCk7cmV0dXJuIGguaC5kaXYoe2NsYXNzTmFtZTplfSx0LnRpdGxlLmljb25MYWJlbCl9LHQucHJvdG90eXBlLnJlbmRlckxhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZm9ybWF0TGFiZWwodCk7cmV0dXJuIGguaC5kaXYoe2NsYXNzTmFtZToicC1NZW51QmFyLWl0ZW1MYWJlbCJ9LGUpfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtTWVudUJhci1pdGVtIjtyZXR1cm4gdC50aXRsZS5jbGFzc05hbWUmJihlKz0iICIrdC50aXRsZS5jbGFzc05hbWUpLHQuYWN0aXZlJiYoZSs9IiBwLW1vZC1hY3RpdmUiKSxlfSx0LnByb3RvdHlwZS5jcmVhdGVJdGVtRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gdC50aXRsZS5kYXRhc2V0fSx0LnByb3RvdHlwZS5jcmVhdGVJY29uQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU9InAtTWVudUJhci1pdGVtSWNvbiIsbj10LnRpdGxlLmljb25DbGFzcztyZXR1cm4gbj9lKyIgIituOmV9LHQucHJvdG90eXBlLmZvcm1hdExhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGl0bGUsbj1lLmxhYmVsLGk9ZS5tbmVtb25pYztpZihpPDB8fGk+PW4ubGVuZ3RoKXJldHVybiBuO3ZhciByPW4uc2xpY2UoMCxpKSxvPW4uc2xpY2UoaSsxKSxzPW5baV07cmV0dXJuW3IsaC5oLnNwYW4oe2NsYXNzTmFtZToicC1NZW51QmFyLWl0ZW1NbmVtb25pYyJ9LHMpLG9dfSx0fSgpO3QuUmVuZGVyZXI9ZSx0LmRlZmF1bHRSZW5kZXJlcj1uZXcgZX0oZD1lLk1lbnVCYXJ8fChlLk1lbnVCYXI9e30pKSxlLk1lbnVCYXI9ZCxmdW5jdGlvbih0KXt0LmNyZWF0ZU5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJwLU1lbnVCYXItY29udGVudCIsdC5hcHBlbmRDaGlsZChlKSx0LnRhYkluZGV4PS0xLHR9LHQuZmluZE1uZW1vbmljPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9LTEscj0tMSxvPSExLHM9ZS50b1VwcGVyQ2FzZSgpLGE9MCx1PXQubGVuZ3RoO2E8dTsrK2Epe3ZhciBjPShhK24pJXUsaD10W2NdLnRpdGxlO2lmKDAhPT1oLmxhYmVsLmxlbmd0aCl7dmFyIGw9aC5tbmVtb25pYztsPj0wJiZsPGgubGFiZWwubGVuZ3RoP2gubGFiZWxbbF0udG9VcHBlckNhc2UoKT09PXMmJigtMT09PWk/aT1jOm89ITApOi0xPT09ciYmaC5sYWJlbFswXS50b1VwcGVyQ2FzZSgpPT09cyYmKHI9Yyl9fXJldHVybntpbmRleDppLG11bHRpcGxlOm8sYXV0bzpyfX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9big5KSxhPW4oNTYpLHU9bigxMSksYz1uKDcpLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dC5jYWxsKHRoaXMse25vZGU6by5jcmVhdGVOb2RlKCl9KXx8dGhpcztyZXR1cm4gbi5fb25SZXBlYXQ9ZnVuY3Rpb24oKXtpZihuLl9yZXBlYXRUaW1lcj0tMSxuLl9wcmVzc0RhdGEpe3ZhciB0PW4uX3ByZXNzRGF0YS5wYXJ0O2lmKCJ0aHVtYiIhPT10KXtuLl9yZXBlYXRUaW1lcj1zZXRUaW1lb3V0KG4uX29uUmVwZWF0LDIwKTt2YXIgZT1uLl9wcmVzc0RhdGEubW91c2VYLGk9bi5fcHJlc3NEYXRhLm1vdXNlWTtpZigiZGVjcmVtZW50IiE9PXQpaWYoImluY3JlbWVudCIhPT10KXtpZigidHJhY2siPT09dCl7aWYoIXMuRWxlbWVudEV4dC5oaXRUZXN0KG4udHJhY2tOb2RlLGUsaSkpcmV0dXJuO3ZhciByPW4udGh1bWJOb2RlO2lmKHMuRWxlbWVudEV4dC5oaXRUZXN0KHIsZSxpKSlyZXR1cm47dmFyIG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXZvaWQgMDtyZXR1cm4gYT0iaG9yaXpvbnRhbCI9PT1uLl9vcmllbnRhdGlvbj9lPG8ubGVmdD8iZGVjcmVtZW50IjoiaW5jcmVtZW50IjppPG8udG9wPyJkZWNyZW1lbnQiOiJpbmNyZW1lbnQiLHZvaWQgbi5fcGFnZVJlcXVlc3RlZC5lbWl0KGEpfX1lbHNle2lmKCFzLkVsZW1lbnRFeHQuaGl0VGVzdChuLmluY3JlbWVudE5vZGUsZSxpKSlyZXR1cm47bi5fc3RlcFJlcXVlc3RlZC5lbWl0KCJpbmNyZW1lbnQiKX1lbHNle2lmKCFzLkVsZW1lbnRFeHQuaGl0VGVzdChuLmRlY3JlbWVudE5vZGUsZSxpKSlyZXR1cm47bi5fc3RlcFJlcXVlc3RlZC5lbWl0KCJkZWNyZW1lbnQiKX19fX0sbi5fdmFsdWU9MCxuLl9wYWdlPTEwLG4uX21heGltdW09MTAwLG4uX3JlcGVhdFRpbWVyPS0xLG4uX3ByZXNzRGF0YT1udWxsLG4uX3RodW1iTW92ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uX3N0ZXBSZXF1ZXN0ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uX3BhZ2VSZXF1ZXN0ZWQ9bmV3IHUuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtU2Nyb2xsQmFyIiksbi5zZXRGbGFnKGMuV2lkZ2V0LkZsYWcuRGlzYWxsb3dMYXlvdXQpLG4uX29yaWVudGF0aW9uPWUub3JpZW50YXRpb258fCJ2ZXJ0aWNhbCIsbi5kYXRhc2V0Lm9yaWVudGF0aW9uPW4uX29yaWVudGF0aW9uLHZvaWQgMCE9PWUubWF4aW11bSYmKG4uX21heGltdW09TWF0aC5tYXgoMCxlLm1heGltdW0pKSx2b2lkIDAhPT1lLnBhZ2UmJihuLl9wYWdlPU1hdGgubWF4KDAsZS5wYWdlKSksdm9pZCAwIT09ZS52YWx1ZSYmKG4uX3ZhbHVlPU1hdGgubWF4KDAsTWF0aC5taW4oZS52YWx1ZSxuLl9tYXhpbXVtKSkpLG59cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRodW1iTW92ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGh1bWJNb3ZlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInN0ZXBSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcFJlcXVlc3RlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInBhZ2VSZXF1ZXN0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZVJlcXVlc3RlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fcmVsZWFzZU1vdXNlKCksdGhpcy5fb3JpZW50YXRpb249dCx0aGlzLmRhdGFzZXQub3JpZW50YXRpb249dCx0aGlzLnVwZGF0ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInZhbHVlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dD1NYXRoLm1heCgwLE1hdGgubWluKHQsdGhpcy5fbWF4aW11bSkpLHRoaXMuX3ZhbHVlIT09dCYmKHRoaXMuX3ZhbHVlPXQsdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2V9LHNldDpmdW5jdGlvbih0KXt0PU1hdGgubWF4KDAsdCksdGhpcy5fcGFnZSE9PXQmJih0aGlzLl9wYWdlPXQsdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJtYXhpbXVtIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW19LHNldDpmdW5jdGlvbih0KXt0PU1hdGgubWF4KDAsdCksdGhpcy5fbWF4aW11bSE9PXQmJih0aGlzLl9tYXhpbXVtPXQsdGhpcy5fdmFsdWU9TWF0aC5taW4odGhpcy5fdmFsdWUsdCksdGhpcy51cGRhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJkZWNyZW1lbnROb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci1idXR0b24iKVswXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImluY3JlbWVudE5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInAtU2Nyb2xsQmFyLWJ1dHRvbiIpWzFdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidHJhY2tOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci10cmFjayIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGh1bWJOb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwLVNjcm9sbEJhci10aHVtYiIpWzBdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNldXAiOnRoaXMuX2V2dE1vdXNlVXAodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUub25BZnRlckRldGFjaD1mdW5jdGlvbih0KXt0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25VcGRhdGVSZXF1ZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPTEwMCp0aGlzLl92YWx1ZS90aGlzLl9tYXhpbXVtLG49MTAwKnRoaXMuX3BhZ2UvKHRoaXMuX3BhZ2UrdGhpcy5fbWF4aW11bSk7ZT1NYXRoLm1heCgwLE1hdGgubWluKGUsMTAwKSksbj1NYXRoLm1heCgwLE1hdGgubWluKG4sMTAwKSk7dmFyIGk9dGhpcy50aHVtYk5vZGUuc3R5bGU7Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/KGkudG9wPSIiLGkuaGVpZ2h0PSIiLGkubGVmdD1lKyIlIixpLndpZHRoPW4rIiUiLGkudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIistZSsiJSwgMCUpIik6KGkubGVmdD0iIixpLndpZHRoPSIiLGkudG9wPWUrIiUiLGkuaGVpZ2h0PW4rIiUiLGkudHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCUsICIrLWUrIiUpIil9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe2lmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlKXt2YXIgZT10aGlzLl9wcmVzc0RhdGE/dGhpcy5fcHJlc3NEYXRhLnZhbHVlOi0xO3RoaXMuX3JlbGVhc2VNb3VzZSgpLC0xIT09ZSYmdGhpcy5fbW92ZVRodW1iKGUpfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24mJiF0aGlzLl9wcmVzc0RhdGEpe3ZhciBlPW8uZmluZFBhcnQodGhpcyx0LnRhcmdldCk7aWYoZSl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIG49YS5EcmFnLm92ZXJyaWRlQ3Vyc29yKCJkZWZhdWx0Iik7aWYodGhpcy5fcHJlc3NEYXRhPXtwYXJ0OmUsb3ZlcnJpZGU6bixkZWx0YTotMSx2YWx1ZTotMSxtb3VzZVg6dC5jbGllbnRYLG1vdXNlWTp0LmNsaWVudFl9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLCJ0aHVtYiI9PT1lKXt2YXIgaT10aGlzLnRodW1iTm9kZSxyPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/dGhpcy5fcHJlc3NEYXRhLmRlbHRhPXQuY2xpZW50WC1yLmxlZnQ6dGhpcy5fcHJlc3NEYXRhLmRlbHRhPXQuY2xpZW50WS1yLnRvcCxpLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHZvaWQodGhpcy5fcHJlc3NEYXRhLnZhbHVlPXRoaXMuX3ZhbHVlKX1pZigidHJhY2siPT09ZSl7cj10aGlzLnRodW1iTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgcz12b2lkIDA7cmV0dXJuIHM9Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50YXRpb24/dC5jbGllbnRYPHIubGVmdD8iZGVjcmVtZW50IjoiaW5jcmVtZW50Ijp0LmNsaWVudFk8ci50b3A/ImRlY3JlbWVudCI6ImluY3JlbWVudCIsdGhpcy5fcmVwZWF0VGltZXI9c2V0VGltZW91dCh0aGlzLl9vblJlcGVhdCwzNTApLHZvaWQgdGhpcy5fcGFnZVJlcXVlc3RlZC5lbWl0KHMpfXJldHVybiJkZWNyZW1lbnQiPT09ZT8odGhpcy5kZWNyZW1lbnROb2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHRoaXMuX3JlcGVhdFRpbWVyPXNldFRpbWVvdXQodGhpcy5fb25SZXBlYXQsMzUwKSx2b2lkIHRoaXMuX3N0ZXBSZXF1ZXN0ZWQuZW1pdCgiZGVjcmVtZW50IikpOiJpbmNyZW1lbnQiPT09ZT8odGhpcy5pbmNyZW1lbnROb2RlLmNsYXNzTGlzdC5hZGQoInAtbW9kLWFjdGl2ZSIpLHRoaXMuX3JlcGVhdFRpbWVyPXNldFRpbWVvdXQodGhpcy5fb25SZXBlYXQsMzUwKSx2b2lkIHRoaXMuX3N0ZXBSZXF1ZXN0ZWQuZW1pdCgiaW5jcmVtZW50IikpOnZvaWQgMH19fSxlLnByb3RvdHlwZS5fZXZ0TW91c2VNb3ZlPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3ByZXNzRGF0YSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3ByZXNzRGF0YS5tb3VzZVg9dC5jbGllbnRYLHRoaXMuX3ByZXNzRGF0YS5tb3VzZVk9dC5jbGllbnRZLCJ0aHVtYiI9PT10aGlzLl9wcmVzc0RhdGEucGFydCkpe3ZhciBlLG4saT10aGlzLnRodW1iTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXRoaXMudHJhY2tOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyJob3Jpem9udGFsIj09PXRoaXMuX29yaWVudGF0aW9uPyhlPXQuY2xpZW50WC1yLmxlZnQtdGhpcy5fcHJlc3NEYXRhLmRlbHRhLG49ci53aWR0aC1pLndpZHRoKTooZT10LmNsaWVudFktci50b3AtdGhpcy5fcHJlc3NEYXRhLmRlbHRhLG49ci5oZWlnaHQtaS5oZWlnaHQpO3ZhciBvPTA9PT1uPzA6ZSp0aGlzLl9tYXhpbXVtL247dGhpcy5fbW92ZVRodW1iKG8pfX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlVXA9ZnVuY3Rpb24odCl7MD09PXQuYnV0dG9uJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fcmVsZWFzZU1vdXNlKCkpfSxlLnByb3RvdHlwZS5fcmVsZWFzZU1vdXNlPWZ1bmN0aW9uKCl7dGhpcy5fcHJlc3NEYXRhJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3JlcGVhdFRpbWVyKSx0aGlzLl9yZXBlYXRUaW1lcj0tMSx0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApLHRoaXMudGh1bWJOb2RlLmNsYXNzTGlzdC5yZW1vdmUoInAtbW9kLWFjdGl2ZSIpLHRoaXMuZGVjcmVtZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJwLW1vZC1hY3RpdmUiKSx0aGlzLmluY3JlbWVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgicC1tb2QtYWN0aXZlIikpfSxlLnByb3RvdHlwZS5fbW92ZVRodW1iPWZ1bmN0aW9uKHQpe3Q9TWF0aC5tYXgoMCxNYXRoLm1pbih0LHRoaXMuX21heGltdW0pKSx0aGlzLl92YWx1ZSE9PXQmJih0aGlzLl92YWx1ZT10LHRoaXMudXBkYXRlKCksdGhpcy5fdGh1bWJNb3ZlZC5lbWl0KHQpKX0sZX0oYy5XaWRnZXQpO2UuU2Nyb2xsQmFyPWgsZnVuY3Rpb24odCl7dC5jcmVhdGVOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLWJ1dHRvbiIsbi5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLWJ1dHRvbiIsZS5kYXRhc2V0LmFjdGlvbj0iZGVjcmVtZW50IixuLmRhdGFzZXQuYWN0aW9uPSJpbmNyZW1lbnQiLGkuY2xhc3NOYW1lPSJwLVNjcm9sbEJhci10cmFjayIsci5jbGFzc05hbWU9InAtU2Nyb2xsQmFyLXRodW1iIixpLmFwcGVuZENoaWxkKHIpLHQuYXBwZW5kQ2hpbGQoZSksdC5hcHBlbmRDaGlsZChpKSx0LmFwcGVuZENoaWxkKG4pLHR9LHQuZmluZFBhcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aHVtYk5vZGUuY29udGFpbnMoZSk/InRodW1iIjp0LnRyYWNrTm9kZS5jb250YWlucyhlKT8idHJhY2siOnQuZGVjcmVtZW50Tm9kZS5jb250YWlucyhlKT8iZGVjcmVtZW50Ijp0LmluY3JlbWVudE5vZGUuY29udGFpbnMoZSk/ImluY3JlbWVudCI6bnVsbH19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMikscz1uKDUpLGE9bigyMiksdT1uKDcpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fd2lkZ2V0PW51bGwsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl93aWRnZXQpe3ZhciBlPXRoaXMuX3dpZGdldDt0aGlzLl93aWRnZXQ9bnVsbCxlLmRpc3Bvc2UoKX10LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZGdldH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3dpZGdldCE9PXQmJih0aGlzLl93aWRnZXQmJnRoaXMuX3dpZGdldC5kaXNwb3NlKCksdGhpcy5fd2lkZ2V0PXQsdGhpcy5wYXJlbnQmJnQmJnRoaXMuYXR0YWNoV2lkZ2V0KHQpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZGdldD9vLm9uY2UodGhpcy5fd2lkZ2V0KTpvLmVtcHR5KCl9LGUucHJvdG90eXBlLnJlbW92ZVdpZGdldD1mdW5jdGlvbih0KXt0aGlzLl93aWRnZXQ9PT10JiYodGhpcy5fd2lkZ2V0PW51bGwsdGhpcy5wYXJlbnQmJnRoaXMuZGV0YWNoV2lkZ2V0KHQpKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpLG8uZWFjaCh0aGlzLGZ1bmN0aW9uKHQpe2UuYXR0YWNoV2lkZ2V0KHQpfSl9LGUucHJvdG90eXBlLmF0dGFjaFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuTXNnLkJlZm9yZUF0dGFjaCksdGhpcy5wYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0Lm5vZGUpLHRoaXMucGFyZW50LmlzQXR0YWNoZWQmJnMuTWVzc2FnZUxvb3Auc2VuZE1lc3NhZ2UodCx1LldpZGdldC5Nc2cuQWZ0ZXJBdHRhY2gpfSxlLnByb3RvdHlwZS5kZXRhY2hXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5wYXJlbnQuaXNBdHRhY2hlZCYmcy5NZXNzYWdlTG9vcC5zZW5kTWVzc2FnZSh0LHUuV2lkZ2V0Lk1zZy5CZWZvcmVEZXRhY2gpLHRoaXMucGFyZW50Lm5vZGUucmVtb3ZlQ2hpbGQodC5ub2RlKSx0aGlzLnBhcmVudC5pc0F0dGFjaGVkJiZzLk1lc3NhZ2VMb29wLnNlbmRNZXNzYWdlKHQsdS5XaWRnZXQuTXNnLkFmdGVyRGV0YWNoKX0sZX0oYS5MYXlvdXQpO2UuU2luZ2xldG9uTGF5b3V0PWN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9bigyKSxhPW4oNTYpLHU9big1NCksYz1uKDEzMyksaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyx7bGF5b3V0Om8uY3JlYXRlTGF5b3V0KGUpfSl8fHRoaXM7cmV0dXJuIG4uX3ByZXNzRGF0YT1udWxsLG4uYWRkQ2xhc3MoInAtU3BsaXRQYW5lbCIpLG59cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fcmVsZWFzZU1vdXNlKCksdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0Lm9yaWVudGF0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXQub3JpZW50YXRpb249dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWdubWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5hbGlnbm1lbnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxheW91dC5hbGlnbm1lbnQ9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNwYWNpbmciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQuc3BhY2luZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNwYWNpbmc9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInJlbmRlcmVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0LnJlbmRlcmVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaGFuZGxlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dC5oYW5kbGVzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbGF0aXZlU2l6ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQucmVsYXRpdmVTaXplcygpfSxlLnByb3RvdHlwZS5zZXRSZWxhdGl2ZVNpemVzPWZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0LnNldFJlbGF0aXZlU2l6ZXModCl9LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UibW91c2Vkb3duIjp0aGlzLl9ldnRNb3VzZURvd24odCk7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOnRoaXMuX2V2dE1vdXNlTW92ZSh0KTticmVhaztjYXNlIm1vdXNldXAiOnRoaXMuX2V2dE1vdXNlVXAodCk7YnJlYWs7Y2FzZSJrZXlkb3duIjp0aGlzLl9ldnRLZXlEb3duKHQpO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX0sZS5wcm90b3R5cGUub25CZWZvcmVBdHRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyl9LGUucHJvdG90eXBlLm9uQWZ0ZXJEZXRhY2g9ZnVuY3Rpb24odCl7dGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcyksdGhpcy5fcmVsZWFzZU1vdXNlKCl9LGUucHJvdG90eXBlLm9uQ2hpbGRBZGRlZD1mdW5jdGlvbih0KXt0LmNoaWxkLmFkZENsYXNzKCJwLVNwbGl0UGFuZWwtY2hpbGQiKSx0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUub25DaGlsZFJlbW92ZWQ9ZnVuY3Rpb24odCl7dC5jaGlsZC5yZW1vdmVDbGFzcygicC1TcGxpdFBhbmVsLWNoaWxkIiksdGhpcy5fcmVsZWFzZU1vdXNlKCl9LGUucHJvdG90eXBlLl9ldnRLZXlEb3duPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLDI3PT09dC5rZXlDb2RlJiZ0aGlzLl9yZWxlYXNlTW91c2UoKX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlRG93bj1mdW5jdGlvbih0KXtpZigwPT09dC5idXR0b24pe3ZhciBlPXRoaXMubGF5b3V0LG49cy5BcnJheUV4dC5maW5kRmlyc3RJbmRleChlLmhhbmRsZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFpbnModC50YXJnZXQpfSk7aWYoLTEhPT1uKXt2YXIgaTt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLCEwKTt2YXIgcj1lLmhhbmRsZXNbbl0sbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2k9Imhvcml6b250YWwiPT09ZS5vcmllbnRhdGlvbj90LmNsaWVudFgtby5sZWZ0OnQuY2xpZW50WS1vLnRvcDt2YXIgdT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKSxjPWEuRHJhZy5vdmVycmlkZUN1cnNvcih1LmN1cnNvcik7dGhpcy5fcHJlc3NEYXRhPXtpbmRleDpuLGRlbHRhOmksb3ZlcnJpZGU6Y319fX0sZS5wcm90b3R5cGUuX2V2dE1vdXNlTW92ZT1mdW5jdGlvbih0KXt2YXIgZTt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgbj10aGlzLmxheW91dCxpPXRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPSJob3Jpem9udGFsIj09PW4ub3JpZW50YXRpb24/dC5jbGllbnRYLWkubGVmdC10aGlzLl9wcmVzc0RhdGEuZGVsdGE6dC5jbGllbnRZLWkudG9wLXRoaXMuX3ByZXNzRGF0YS5kZWx0YSxuLm1vdmVIYW5kbGUodGhpcy5fcHJlc3NEYXRhLmluZGV4LGUpfSxlLnByb3RvdHlwZS5fZXZ0TW91c2VVcD1mdW5jdGlvbih0KXswPT09dC5idXR0b24mJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9yZWxlYXNlTW91c2UoKSl9LGUucHJvdG90eXBlLl9yZWxlYXNlTW91c2U9ZnVuY3Rpb24oKXt0aGlzLl9wcmVzc0RhdGEmJih0aGlzLl9wcmVzc0RhdGEub3ZlcnJpZGUuZGlzcG9zZSgpLHRoaXMuX3ByZXNzRGF0YT1udWxsLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcywhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMsITApKX0sZX0odS5QYW5lbCk7ZS5TcGxpdFBhbmVsPWgsZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jcmVhdGVIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9InAtU3BsaXRQYW5lbC1oYW5kbGUiLHR9LHR9KCk7dC5SZW5kZXJlcj1lLHQuZGVmYXVsdFJlbmRlcmVyPW5ldyBlLHQuZ2V0U3RyZXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gYy5TcGxpdExheW91dC5nZXRTdHJldGNoKHQpfSx0LnNldFN0cmV0Y2g9ZnVuY3Rpb24odCxlKXtjLlNwbGl0TGF5b3V0LnNldFN0cmV0Y2godCxlKX19KGg9ZS5TcGxpdFBhbmVsfHwoZS5TcGxpdFBhbmVsPXt9KSksZS5TcGxpdFBhbmVsPWgsZnVuY3Rpb24odCl7dC5jcmVhdGVMYXlvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQubGF5b3V0fHxuZXcgYy5TcGxpdExheW91dCh7cmVuZGVyZXI6dC5yZW5kZXJlcnx8aC5kZWZhdWx0UmVuZGVyZXIsb3JpZW50YXRpb246dC5vcmllbnRhdGlvbixhbGlnbm1lbnQ6dC5hbGlnbm1lbnQsc3BhY2luZzp0LnNwYWNpbmd9KX19KG98fChvPXt9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvLHM9big5KSxhPW4oNSksdT1uKDExKSxjPW4oNzYpLGg9bigxMzUpLGw9big4MCksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fY3VycmVudENoYW5nZWQ9bmV3IHUuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtVGFiUGFuZWwiKSxuLnRhYkJhcj1uZXcgbC5UYWJCYXIoZSksbi50YWJCYXIuYWRkQ2xhc3MoInAtVGFiUGFuZWwtdGFiQmFyIiksbi5zdGFja2VkUGFuZWw9bmV3IGguU3RhY2tlZFBhbmVsLG4uc3RhY2tlZFBhbmVsLmFkZENsYXNzKCJwLVRhYlBhbmVsLXN0YWNrZWRQYW5lbCIpLG4udGFiQmFyLnRhYk1vdmVkLmNvbm5lY3Qobi5fb25UYWJNb3ZlZCxuKSxuLnRhYkJhci5jdXJyZW50Q2hhbmdlZC5jb25uZWN0KG4uX29uQ3VycmVudENoYW5nZWQsbiksbi50YWJCYXIudGFiQ2xvc2VSZXF1ZXN0ZWQuY29ubmVjdChuLl9vblRhYkNsb3NlUmVxdWVzdGVkLG4pLG4udGFiQmFyLnRhYkFjdGl2YXRlUmVxdWVzdGVkLmNvbm5lY3Qobi5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZCxuKSxuLnN0YWNrZWRQYW5lbC53aWRnZXRSZW1vdmVkLmNvbm5lY3Qobi5fb25XaWRnZXRSZW1vdmVkLG4pLG4uX3RhYlBsYWNlbWVudD1lLnRhYlBsYWNlbWVudHx8InRvcCI7dmFyIGk9by5kaXJlY3Rpb25Gcm9tUGxhY2VtZW50KG4uX3RhYlBsYWNlbWVudCkscj1vLm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudChuLl90YWJQbGFjZW1lbnQpO24udGFiQmFyLm9yaWVudGF0aW9uPXIsbi50YWJCYXIuZGF0YXNldC5wbGFjZW1lbnQ9bi5fdGFiUGxhY2VtZW50O3ZhciBzPW5ldyBjLkJveExheW91dCh7ZGlyZWN0aW9uOmksc3BhY2luZzowfSk7cmV0dXJuIGMuQm94TGF5b3V0LnNldFN0cmV0Y2gobi50YWJCYXIsMCksYy5Cb3hMYXlvdXQuc2V0U3RyZXRjaChuLnN0YWNrZWRQYW5lbCwxKSxzLmFkZFdpZGdldChuLnRhYkJhcikscy5hZGRXaWRnZXQobi5zdGFja2VkUGFuZWwpLG4ubGF5b3V0PXMsbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJCYXIuY3VycmVudEluZGV4fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy50YWJCYXIuY3VycmVudEluZGV4PXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50V2lkZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50YWJCYXIuY3VycmVudFRpdGxlO3JldHVybiB0P3Qub3duZXI6bnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLmN1cnJlbnRUaXRsZT10P3QudGl0bGU6bnVsbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYnNNb3ZhYmxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiQmFyLnRhYnNNb3ZhYmxlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy50YWJCYXIudGFic01vdmFibGU9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhYlBsYWNlbWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90YWJQbGFjZW1lbnR9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl90YWJQbGFjZW1lbnQhPT10KXt0aGlzLl90YWJQbGFjZW1lbnQ9dDt2YXIgZT1vLmRpcmVjdGlvbkZyb21QbGFjZW1lbnQodCksbj1vLm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudCh0KTt0aGlzLnRhYkJhci5vcmllbnRhdGlvbj1uLHRoaXMudGFiQmFyLmRhdGFzZXQucGxhY2VtZW50PXQsdGhpcy5sYXlvdXQuZGlyZWN0aW9uPWV9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrZWRQYW5lbC53aWRnZXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbih0KXt0aGlzLmluc2VydFdpZGdldCh0aGlzLndpZGdldHMubGVuZ3RoLHQpfSxlLnByb3RvdHlwZS5pbnNlcnRXaWRnZXQ9ZnVuY3Rpb24odCxlKXtlIT09dGhpcy5jdXJyZW50V2lkZ2V0JiZlLmhpZGUoKSx0aGlzLnN0YWNrZWRQYW5lbC5pbnNlcnRXaWRnZXQodCxlKSx0aGlzLnRhYkJhci5pbnNlcnRUYWIodCxlLnRpdGxlKX0sZS5wcm90b3R5cGUuX29uQ3VycmVudENoYW5nZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnByZXZpb3VzSW5kZXgsaT1lLnByZXZpb3VzVGl0bGUscj1lLmN1cnJlbnRJbmRleCxvPWUuY3VycmVudFRpdGxlLHU9aT9pLm93bmVyOm51bGwsYz1vP28ub3duZXI6bnVsbDt1JiZ1LmhpZGUoKSxjJiZjLnNob3coKSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNXaWRnZXQ6dSxjdXJyZW50SW5kZXg6cixjdXJyZW50V2lkZ2V0OmN9KSwocy5QbGF0Zm9ybS5JU19FREdFfHxzLlBsYXRmb3JtLklTX0lFKSYmYS5NZXNzYWdlTG9vcC5mbHVzaCgpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdGFja2VkUGFuZWwuaW5zZXJ0V2lkZ2V0KGUudG9JbmRleCxlLnRpdGxlLm93bmVyKX0sZS5wcm90b3R5cGUuX29uV2lkZ2V0UmVtb3ZlZD1mdW5jdGlvbih0LGUpe3RoaXMudGFiQmFyLnJlbW92ZVRhYihlLnRpdGxlKX0sZX0obig3KS5XaWRnZXQpO2UuVGFiUGFuZWw9ZCxmdW5jdGlvbih0KXt0Lm9yaWVudGF0aW9uRnJvbVBsYWNlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0sdC5kaXJlY3Rpb25Gcm9tUGxhY2VtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfTt2YXIgZT17dG9wOiJob3Jpem9udGFsIixsZWZ0OiJ2ZXJ0aWNhbCIscmlnaHQ6InZlcnRpY2FsIixib3R0b206Imhvcml6b250YWwifSxuPXt0b3A6InRvcC10by1ib3R0b20iLGxlZnQ6ImxlZnQtdG8tcmlnaHQiLHJpZ2h0OiJyaWdodC10by1sZWZ0Iixib3R0b206ImJvdHRvbS10by10b3AifX0ob3x8KG89e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyNSkscz1uKDc1KSxhPXthbGlnbl9jb250ZW50Om51bGwsYWxpZ25faXRlbXM6bnVsbCxhbGlnbl9zZWxmOm51bGwsYm9yZGVyOm51bGwsYm90dG9tOm51bGwsZGlzcGxheTpudWxsLGZsZXg6bnVsbCxmbGV4X2Zsb3c6bnVsbCxoZWlnaHQ6bnVsbCxqdXN0aWZ5X2NvbnRlbnQ6bnVsbCxsZWZ0Om51bGwsbWFyZ2luOm51bGwsbWF4X2hlaWdodDpudWxsLG1heF93aWR0aDpudWxsLG1pbl9oZWlnaHQ6bnVsbCxtaW5fd2lkdGg6bnVsbCxvdmVyZmxvdzpudWxsLG92ZXJmbG93X3g6bnVsbCxvdmVyZmxvd195Om51bGwsb3JkZXI6bnVsbCxwYWRkaW5nOm51bGwscmlnaHQ6bnVsbCx0b3A6bnVsbCx2aXNpYmlsaXR5Om51bGwsd2lkdGg6bnVsbCxncmlkX2F1dG9fY29sdW1uczpudWxsLGdyaWRfYXV0b19mbG93Om51bGwsZ3JpZF9hdXRvX3Jvd3M6bnVsbCxncmlkX2dhcDpudWxsLGdyaWRfdGVtcGxhdGVfcm93czpudWxsLGdyaWRfdGVtcGxhdGVfY29sdW1uczpudWxsLGdyaWRfdGVtcGxhdGVfYXJlYXM6bnVsbCxncmlkX3JvdzpudWxsLGdyaWRfY29sdW1uOm51bGwsZ3JpZF9hcmVhOm51bGx9LHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvLmFzc2lnbih0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiTGF5b3V0TW9kZWwiLF92aWV3X25hbWU6IkxheW91dFZpZXcifSxhKX0sZX0ocy5XaWRnZXRNb2RlbCk7ZS5MYXlvdXRNb2RlbD11O3ZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0aGlzLl90cmFpdE5hbWVzPVtdLHQucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUpO2Zvcih2YXIgbj0wLGk9T2JqZWN0LmtleXMoYSk7bjxpLmxlbmd0aDtuKyspe3ZhciByPWlbbl07dGhpcy5yZWdpc3RlclRyYWl0KHIpfX0sZS5wcm90b3R5cGUucmVnaXN0ZXJUcmFpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3RyYWl0TmFtZXMucHVzaCh0KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZToiK3QsZnVuY3Rpb24obixpKXtlLmhhbmRsZUNoYW5nZSh0LGkpfSksdGhpcy5oYW5kbGVDaGFuZ2UodCx0aGlzLm1vZGVsLmdldCh0KSl9LGUucHJvdG90eXBlLmNzc19uYW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL18vZywiLSIpfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm9wdGlvbnMucGFyZW50O24/bnVsbD09PWU/bi5lbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0aGlzLmNzc19uYW1lKHQpKTpuLmVsLnN0eWxlW3RoaXMuY3NzX25hbWUodCldPWU6Y29uc29sZS53YXJuKCJTdHlsZSBub3QgYXBwbGllZCBiZWNhdXNlIGEgcGFyZW50IHZpZXcgZG9lcyBub3QgZXhpc3QiKX0sZS5wcm90b3R5cGUudW5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5vcHRpb25zLnBhcmVudDt0aGlzLl90cmFpdE5hbWVzLmZvckVhY2goZnVuY3Rpb24obil7ZT9lLmVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQuY3NzX25hbWUobikpOmNvbnNvbGUud2FybigiU3R5bGUgbm90IHJlbW92ZWQgYmVjYXVzZSBhIHBhcmVudCB2aWV3IGRvZXMgbm90IGV4aXN0Iil9LHRoaXMpfSxlfShzLldpZGdldFZpZXcpO2UuTGF5b3V0Vmlldz1jfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDI1KSxzPW4oNzUpLGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIG8uYXNzaWduKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJTdHlsZU1vZGVsIixfdmlld19uYW1lOiJTdHlsZVZpZXcifSxPYmplY3Qua2V5cyhlLnN0eWxlUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl09ZS5zdHlsZVByb3BlcnRpZXNbbl0uZGVmYXVsdCx0fSx7fSkpfSxlLnN0eWxlUHJvcGVydGllcz17fSxlfShzLldpZGdldE1vZGVsKTtlLlN0eWxlTW9kZWw9YTt2YXIgdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dGhpcy5fdHJhaXROYW1lcz1bXSx0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKTtmb3IodmFyIG49dGhpcy5tb2RlbC5jb25zdHJ1Y3RvcixpPTAscj1PYmplY3Qua2V5cyhuLnN0eWxlUHJvcGVydGllcyk7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07dGhpcy5yZWdpc3RlclRyYWl0KG8pfXRoaXMuc3R5bGUoKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJUcmFpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3RyYWl0TmFtZXMucHVzaCh0KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZToiK3QsZnVuY3Rpb24obixpKXtlLmhhbmRsZUNoYW5nZSh0LGkpfSl9LGUucHJvdG90eXBlLmhhbmRsZUNoYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9ucy5wYXJlbnQ7aWYobil7dmFyIGk9dGhpcy5tb2RlbC5jb25zdHJ1Y3Rvci5zdHlsZVByb3BlcnRpZXMscj1pW3RdLmF0dHJpYnV0ZSxvPWlbdF0uc2VsZWN0b3Iscz1vP24uZWwucXVlcnlTZWxlY3RvckFsbChvKTpbbi5lbF07aWYobnVsbD09PWUpZm9yKHZhciBhPTA7YSE9PXMubGVuZ3RoOysrYSlzW2FdLnN0eWxlLnJlbW92ZVByb3BlcnR5KHIpO2Vsc2UgZm9yKGE9MDthIT09cy5sZW5ndGg7KythKXNbYV0uc3R5bGVbcl09ZX1lbHNlIGNvbnNvbGUud2FybigiU3R5bGUgbm90IGFwcGxpZWQgYmVjYXVzZSBhIHBhcmVudCB2aWV3IGRvZXMgbm90IGV4aXN0Iil9LGUucHJvdG90eXBlLnN0eWxlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLl90cmFpdE5hbWVzO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO3RoaXMuaGFuZGxlQ2hhbmdlKG4sdGhpcy5tb2RlbC5nZXQobikpfX0sZS5wcm90b3R5cGUudW5zdHlsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5wYXJlbnQsZT10aGlzLm1vZGVsLmNvbnN0cnVjdG9yLnN0eWxlUHJvcGVydGllczt0aGlzLl90cmFpdE5hbWVzLmZvckVhY2goZnVuY3Rpb24obil7aWYodClmb3IodmFyIGk9ZVtuXS5hdHRyaWJ1dGUscj1lW25dLnNlbGVjdG9yLG89cj90LmVsLnF1ZXJ5U2VsZWN0b3JBbGwocik6W3QuZWxdLHM9MDtzIT09by5sZW5ndGg7KytzKW9bc10uc3R5bGUucmVtb3ZlUHJvcGVydHkoaSk7ZWxzZSBjb25zb2xlLndhcm4oIlN0eWxlIG5vdCByZW1vdmVkIGJlY2F1c2UgYSBwYXJlbnQgdmlldyBkb2VzIG5vdCBleGlzdCIpfSx0aGlzKX0sZX0ocy5XaWRnZXRWaWV3KTtlLlN0eWxlVmlldz11fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKShmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHModCl7dHJ5e3UoaS5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBhKHQpe3RyeXt1KGkudGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHUodCl7dC5kb25lP3IodC52YWx1ZSk6bmV3IG4oZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pLnRoZW4ocyxhKX11KChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KX0scj10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6YSgwKSx0aHJvdzphKDEpLHJldHVybjphKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIGEobyl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihvKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3M7KXRyeXtpZihuPTEsaSYmKHI9MiZvWzBdP2kucmV0dXJuOm9bMF0/aS50aHJvd3x8KChyPWkucmV0dXJuKSYmci5jYWxsKGkpLDApOmkubmV4dCkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVsyJm9bMF0sci52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6cj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKyssaT1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocj0ocj1zLnRyeXMpLmxlbmd0aD4wJiZyW3IubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFyfHxvWzFdPnJbMF0mJm9bMV08clszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxyWzFdKXtzLmxhYmVsPXJbMV0scj1vO2JyZWFrfWlmKHImJnMubGFiZWw8clsyXSl7cy5sYWJlbD1yWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9clsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89ZS5jYWxsKHQscyl9Y2F0Y2godCl7bz1bNix0XSxpPTB9ZmluYWxseXtuPXI9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28sYV0pfX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudGFyZ2V0cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtlcm5lbD1udWxsLHRoaXMuanNTZXJ2aWNlc0tlcm5lbD1udWxsLHRoaXMuaW5pdF9rZXJuZWwodCl9cmV0dXJuIHQucHJvdG90eXBlLmluaXRfa2VybmVsPWZ1bmN0aW9uKHQpe3RoaXMua2VybmVsPXQsdGhpcy5qc1NlcnZpY2VzS2VybmVsPXR9LHQucHJvdG90eXBlLm5ld19jb21tPWZ1bmN0aW9uKHQsZSxvLHMsYSx1KXtyZXR1cm4gaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgaSxjO3JldHVybiByKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCxQcm9taXNlLnJlc29sdmUodGhpcy5qc1NlcnZpY2VzS2VybmVsLmNvbm5lY3RUb0NvbW0odCxhKSldO2Nhc2UgMTpyZXR1cm4gaT1yLnNlbnQoKSxjPW5ldyBuKGkpLHRoaXMucmVnaXN0ZXJfY29tbShjKSxjLm9wZW4oZSxvLHMsdSksWzIsY119fSl9KX0sdC5wcm90b3R5cGUucmVnaXN0ZXJfdGFyZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxyPXRoaXMuanNTZXJ2aWNlc0tlcm5lbC5yZWdpc3RlckNvbW1UYXJnZXQodCxmdW5jdGlvbih0LHIpe3ZhciBvPW5ldyBuKHQpO2kucmVnaXN0ZXJfY29tbShvKTt0cnl7cmV0dXJuIGUobyxyKX1jYXRjaCh0KXtvLmNsb3NlKCksY29uc29sZS5lcnJvcih0KSxjb25zb2xlLmVycm9yKG5ldyBFcnJvcigiRXhjZXB0aW9uIG9wZW5pbmcgbmV3IGNvbW0iKSl9fSk7dGhpcy50YXJnZXRzW3RdPXJ9LHQucHJvdG90eXBlLnVucmVnaXN0ZXJfdGFyZ2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy50YXJnZXRzW3RdLmRpc3Bvc2UoKSxkZWxldGUgdGhpcy50YXJnZXRzW3RdfSx0LnByb3RvdHlwZS5yZWdpc3Rlcl9jb21tPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbW1zW3QuY29tbV9pZF09UHJvbWlzZS5yZXNvbHZlKHQpLHQua2VybmVsPXRoaXMua2VybmVsLHQuY29tbV9pZH0sdH0oKTt0LkNvbW1NYW5hZ2VyPWU7dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuanNTZXJ2aWNlc0NvbW09bnVsbCx0aGlzLmpzU2VydmljZXNDb21tPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29tbV9pZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpzU2VydmljZXNDb21tLmNvbW1JZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInRhcmdldF9uYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanNTZXJ2aWNlc0NvbW0udGFyZ2V0TmFtZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMuanNTZXJ2aWNlc0NvbW0ub3Blbih0LG4saSk7cmV0dXJuIHRoaXMuX2hvb2t1cENhbGxiYWNrcyhyLGUpLHIubXNnLmhlYWRlci5tc2dfaWR9LHQucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5qc1NlcnZpY2VzQ29tbS5zZW5kKHQsbixpKTtyZXR1cm4gdGhpcy5faG9va3VwQ2FsbGJhY2tzKHIsZSksci5tc2cuaGVhZGVyLm1zZ19pZH0sdC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5qc1NlcnZpY2VzQ29tbS5jbG9zZSh0LG4saSk7cmV0dXJuIHRoaXMuX2hvb2t1cENhbGxiYWNrcyhyLGUpLHIubXNnLmhlYWRlci5tc2dfaWR9LHQucHJvdG90eXBlLm9uX21zZz1mdW5jdGlvbih0KXt0aGlzLmpzU2VydmljZXNDb21tLm9uTXNnPXQuYmluZCh0aGlzKX0sdC5wcm90b3R5cGUub25fY2xvc2U9ZnVuY3Rpb24odCl7dGhpcy5qc1NlcnZpY2VzQ29tbS5vbkNsb3NlPXQuYmluZCh0aGlzKX0sdC5wcm90b3R5cGUuX2hvb2t1cENhbGxiYWNrcz1mdW5jdGlvbih0LGUpe2UmJih0Lm9uUmVwbHk9ZnVuY3Rpb24odCl7ZS5zaGVsbCYmZS5zaGVsbC5yZXBseSYmZS5zaGVsbC5yZXBseSh0KX0sdC5vblN0ZGluPWZ1bmN0aW9uKHQpe2UuaW5wdXQmJmUuaW5wdXQodCl9LHQub25JT1B1Yj1mdW5jdGlvbih0KXtpZihlLmlvcHViKWlmKGUuaW9wdWIuc3RhdHVzJiYic3RhdHVzIj09PXQuaGVhZGVyLm1zZ190eXBlKWUuaW9wdWIuc3RhdHVzKHQpO2Vsc2UgaWYoZS5pb3B1Yi5jbGVhcl9vdXRwdXQmJiJjbGVhcl9vdXRwdXQiPT09dC5oZWFkZXIubXNnX3R5cGUpZS5pb3B1Yi5jbGVhcl9vdXRwdXQodCk7ZWxzZSBpZihlLmlvcHViLm91dHB1dClzd2l0Y2godC5oZWFkZXIubXNnX3R5cGUpe2Nhc2UiZGlzcGxheV9kYXRhIjpjYXNlImV4ZWN1dGVfcmVzdWx0IjplLmlvcHViLm91dHB1dCh0KX19KX0sdH0oKTt0LkNvbW09bn0odC5zZXJ2aWNlc3x8KHQuc2VydmljZXM9e30pKX0oZS5zaGltc3x8KGUuc2hpbXM9e30pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmluaXRpYWxpemUodCxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9oYW5kbGVyX2NvbnRleHQ9bnx8dGhpcyx0aGlzLl9tb2RlbHM9W10sdGhpcy52aWV3cz1bXSx0aGlzLl9jcmVhdGVfdmlldz10LHRoaXMuX3JlbW92ZV92aWV3PWV8fGZ1bmN0aW9uKHQpe3QucmVtb3ZlKCl9fSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bnx8dGhpcy5fcmVtb3ZlX3ZpZXcsbz1lfHx0aGlzLl9jcmVhdGVfdmlldztpPWl8fHRoaXMuX2hhbmRsZXJfY29udGV4dDtmb3IodmFyIHM9MDtzPHQubGVuZ3RoJiYhKHM+PXRoaXMuX21vZGVscy5sZW5ndGh8fHRbc10hPT10aGlzLl9tb2RlbHNbc10pO3MrKyk7Zm9yKHZhciBhPXMsdT10aGlzLnZpZXdzLnNwbGljZShhLHRoaXMudmlld3MubGVuZ3RoLWEpLGM9MDtjPHUubGVuZ3RoO2MrKyl1W2NdLnRoZW4oZnVuY3Rpb24odCl7ci5jYWxsKGksdCl9KTtmb3IoO3M8dC5sZW5ndGg7cysrKXRoaXMudmlld3MucHVzaChQcm9taXNlLnJlc29sdmUoby5jYWxsKGksdFtzXSxzKSkpO3JldHVybiB0aGlzLl9tb2RlbHM9dC5zbGljZSgpLFByb21pc2UuYWxsKHRoaXMudmlld3MpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBQcm9taXNlLmFsbCh0aGlzLnZpZXdzKS50aGVuKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdC5fcmVtb3ZlX3ZpZXcuY2FsbCh0Ll9oYW5kbGVyX2NvbnRleHQsZSl9KSx0LnZpZXdzPVtdLHQuX21vZGVscz1bXX0pfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52aWV3cz1udWxsLHRoaXMuX21vZGVscz1udWxsfSx0fSgpO2UuVmlld0xpc3Q9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyNik7ZS5JSnVweXRlcldpZGdldFJlZ2lzdHJ5PW5ldyBpLlRva2VuKCJqdXB5dGVyLmV4dGVuc2lvbnMuanVweXRlcldpZGdldFJlZ2lzdHJ5Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksaShuKDE2KSksaShuKDU3KSksaShuKDMzOSkpLGkobigzNDApKSxpKG4oMzQxKSksaShuKDEzNikpLGkobigzNDIpKSxpKG4oMzQzKSksaShuKDM0NCkpLGkobigzNDUpKSxpKG4oMzQ2KSksaShuKDEzNykpLGkobigzNTEpKSxpKG4oMzUyKSksaShuKDM1MykpLGkobigzNTQpKSxpKG4oMzU4KSksaShuKDIzKSksZS52ZXJzaW9uPW4oMzU5KS52ZXJzaW9ufSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9big2KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7dGFyZ2V0OnZvaWQgMCxzb3VyY2U6dm9pZCAwLF9tb2RlbF9uYW1lOiJEaXJlY3Rpb25hbExpbmtNb2RlbCJ9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlIix0aGlzLnVwZGF0ZUJpbmRpbmdzLHRoaXMpLHRoaXMudXBkYXRlQmluZGluZ3MoKX0sZS5wcm90b3R5cGUudXBkYXRlVmFsdWU9ZnVuY3Rpb24odCxlLG4saSl7aWYoIXRoaXMuX3VwZGF0aW5nKXt0aGlzLl91cGRhdGluZz0hMDt0cnl7biYmKG4uc2V0KGksdC5nZXQoZSkpLG4uc2F2ZV9jaGFuZ2VzKCkpfWZpbmFsbHl7dGhpcy5fdXBkYXRpbmc9ITF9fX0sZS5wcm90b3R5cGUudXBkYXRlQmluZGluZ3M9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpczt0aGlzLmNsZWFudXAoKSx0PXRoaXMuZ2V0KCJzb3VyY2UiKXx8W251bGwsbnVsbF0sdGhpcy5zb3VyY2VNb2RlbD10WzBdLHRoaXMuc291cmNlQXR0cj10WzFdLGU9dGhpcy5nZXQoInRhcmdldCIpfHxbbnVsbCxudWxsXSx0aGlzLnRhcmdldE1vZGVsPWVbMF0sdGhpcy50YXJnZXRBdHRyPWVbMV0sdGhpcy5zb3VyY2VNb2RlbCYmKHRoaXMubGlzdGVuVG8odGhpcy5zb3VyY2VNb2RlbCwiY2hhbmdlOiIrdGhpcy5zb3VyY2VBdHRyLGZ1bmN0aW9uKCl7bi51cGRhdGVWYWx1ZShuLnNvdXJjZU1vZGVsLG4uc291cmNlQXR0cixuLnRhcmdldE1vZGVsLG4udGFyZ2V0QXR0cil9KSx0aGlzLnVwZGF0ZVZhbHVlKHRoaXMuc291cmNlTW9kZWwsdGhpcy5zb3VyY2VBdHRyLHRoaXMudGFyZ2V0TW9kZWwsdGhpcy50YXJnZXRBdHRyKSx0aGlzLmxpc3RlblRvT25jZSh0aGlzLnNvdXJjZU1vZGVsLCJkZXN0cm95Iix0aGlzLmNsZWFudXApKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLmxpc3RlblRvT25jZSh0aGlzLnRhcmdldE1vZGVsLCJkZXN0cm95Iix0aGlzLmNsZWFudXApfSxlLnByb3RvdHlwZS5jbGVhbnVwPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2VNb2RlbCYmKHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLnNvdXJjZU1vZGVsLCJjaGFuZ2U6Iit0aGlzLnNvdXJjZUF0dHIsbnVsbCksdGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuc291cmNlTW9kZWwsImRlc3Ryb3kiLG51bGwpKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy50YXJnZXRNb2RlbCwiZGVzdHJveSIsbnVsbCl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVXaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dGFyZ2V0OntkZXNlcmlhbGl6ZTpzLnVucGFja19tb2RlbHN9LHNvdXJjZTp7ZGVzZXJpYWxpemU6cy51bnBhY2tfbW9kZWxzfX0pLGV9KGEuQ29yZVdpZGdldE1vZGVsKTtlLkRpcmVjdGlvbmFsTGlua01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiTGlua01vZGVsIn0pfSxlLnByb3RvdHlwZS51cGRhdGVCaW5kaW5ncz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUudXBkYXRlQmluZGluZ3MuY2FsbCh0aGlzKSx0aGlzLnRhcmdldE1vZGVsJiZ0aGlzLmxpc3RlblRvKHRoaXMudGFyZ2V0TW9kZWwsImNoYW5nZToiK3RoaXMudGFyZ2V0QXR0cixmdW5jdGlvbigpe2UudXBkYXRlVmFsdWUoZS50YXJnZXRNb2RlbCxlLnRhcmdldEF0dHIsZS5zb3VyY2VNb2RlbCxlLnNvdXJjZUF0dHIpfSl9LGUucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5jbGVhbnVwLmNhbGwodGhpcyksdGhpcy50YXJnZXRNb2RlbCYmdGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMudGFyZ2V0TW9kZWwsImNoYW5nZToiK3RoaXMudGFyZ2V0QXR0cixudWxsKX0sZX0oYyk7ZS5MaW5rTW9kZWw9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxMikscz1uKDIzKSxhPW4oOCksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZTohMSxkaXNhYmxlZDohMSxfbW9kZWxfbmFtZToiQm9vbE1vZGVsIn0pfSxlfShvLkNvcmVEZXNjcmlwdGlvbk1vZGVsKTtlLkJvb2xNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7aW5kZW50OiEwLF92aWV3X25hbWU6IkNoZWNrYm94VmlldyIsX21vZGVsX25hbWU6IkNoZWNrYm94TW9kZWwifSl9LGV9KG8uQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuQ2hlY2tib3hNb2RlbD1oO3ZhciBsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWNoZWNrYm94IiksdGhpcy5sYWJlbC5pbm5lckhUTUw9IiYjODIwMzsiLHRoaXMuY2hlY2tib3hMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLHRoaXMuY2hlY2tib3hMYWJlbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtbGFiZWwtYmFzaWMiKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuY2hlY2tib3hMYWJlbCksdGhpcy5jaGVja2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJ0eXBlIiwiY2hlY2tib3giKSx0aGlzLmNoZWNrYm94TGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5jaGVja2JveCksdGhpcy5kZXNjcmlwdGlvblNwYW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHRoaXMuY2hlY2tib3hMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLmRlc2NyaXB0aW9uU3BhbiksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6aW5kZW50Iix0aGlzLnVwZGF0ZUluZGVudCksdGhpcy51cGRhdGUoKSx0aGlzLnVwZGF0ZURlc2NyaXB0aW9uKCksdGhpcy51cGRhdGVJbmRlbnQoKX0sZS5wcm90b3R5cGUudXBkYXRlRGVzY3JpcHRpb249ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLmNoZWNrYm94TGFiZWwpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJkZXNjcmlwdGlvbiIpO3RoaXMuZGVzY3JpcHRpb25TcGFuLmlubmVySFRNTD10LHRoaXMudHlwZXNldCh0aGlzLmRlc2NyaXB0aW9uU3BhbiksdGhpcy5kZXNjcmlwdGlvblNwYW4udGl0bGU9dCx0aGlzLmNoZWNrYm94LnRpdGxlPXR9fSxlLnByb3RvdHlwZS51cGRhdGVJbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiaW5kZW50Iik7dGhpcy5sYWJlbC5zdHlsZS5kaXNwbGF5PXQ/IiI6Im5vbmUifSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NsaWNrIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nOiJfaGFuZGxlX2NsaWNrIn19LGUucHJvdG90eXBlLl9oYW5kbGVfY2xpY2s9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgidmFsdWUiKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLCF0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNoZWNrYm94LmNoZWNrZWQ9dGhpcy5tb2RlbC5nZXQoInZhbHVlIiksdm9pZCAwIT09ZSYmZS51cGRhdGVkX3ZpZXc9PXRoaXN8fCh0aGlzLmNoZWNrYm94LmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuQ2hlY2tib3hWaWV3PWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJUb2dnbGVCdXR0b25WaWV3IixfbW9kZWxfbmFtZToiVG9nZ2xlQnV0dG9uTW9kZWwiLHRvb2x0aXA6IiIsaWNvbjoiIixidXR0b25fc3R5bGU6IiJ9KX0sZX0oYyk7ZS5Ub2dnbGVCdXR0b25Nb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItYnV0dG9uIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtdG9nZ2xlLWJ1dHRvbiIpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmJ1dHRvbl9zdHlsZSIsdGhpcy51cGRhdGVfYnV0dG9uX3N0eWxlKSx0aGlzLnNldF9idXR0b25fc3R5bGUoKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGVfYnV0dG9uX3N0eWxlPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc19tYXAsImJ1dHRvbl9zdHlsZSIpfSxlLnByb3RvdHlwZS5zZXRfYnV0dG9uX3N0eWxlPWZ1bmN0aW9uKCl7dGhpcy5zZXRfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc19tYXAsImJ1dHRvbl9zdHlsZSIpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5tb2RlbC5nZXQoInZhbHVlIik/dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJtb2QtYWN0aXZlIik6dGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtYWN0aXZlIiksdm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPT10aGlzKXt0aGlzLmVsLmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpLHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdGhpcy5tb2RlbC5nZXQoInRvb2x0aXAiKSk7dmFyIG49dGhpcy5tb2RlbC5nZXQoImRlc2NyaXB0aW9uIiksaT10aGlzLm1vZGVsLmdldCgiaWNvbiIpO2lmKDA9PT1uLnRyaW0oKS5sZW5ndGgmJjA9PT1pLnRyaW0oKS5sZW5ndGgpdGhpcy5lbC5pbm5lckhUTUw9IiZuYnNwOyI7ZWxzZXtpZih0aGlzLmVsLnRleHRDb250ZW50PSIiLGkudHJpbSgpLmxlbmd0aCl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaSIpO3RoaXMuZWwuYXBwZW5kQ2hpbGQociksci5jbGFzc0xpc3QuYWRkKCJmYSIpLHIuY2xhc3NMaXN0LmFkZCgiZmEtIitpKX10aGlzLmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57Y2xpY2s6Il9oYW5kbGVfY2xpY2sifX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jbGljaz1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7dGhpcy5tb2RlbC5zZXQoInZhbHVlIiwhZSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFnTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiJidXR0b24ifSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUuY2xhc3NfbWFwPXtwcmltYXJ5OlsibW9kLXByaW1hcnkiXSxzdWNjZXNzOlsibW9kLXN1Y2Nlc3MiXSxpbmZvOlsibW9kLWluZm8iXSx3YXJuaW5nOlsibW9kLXdhcm5pbmciXSxkYW5nZXI6WyJtb2QtZGFuZ2VyIl19LGV9KGEuRE9NV2lkZ2V0Vmlldyk7ZS5Ub2dnbGVCdXR0b25WaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtyZWFkb3V0OiJJbnZhbGlkIixfdmlld19uYW1lOiJWYWxpZFZpZXciLF9tb2RlbF9uYW1lOiJWYWxpZE1vZGVsIn0pfSxlfShjKTtlLlZhbGlkTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtdmFsaWQiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKTt0aGlzLmVsLmFwcGVuZENoaWxkKGUpLHRoaXMucmVhZG91dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksdGhpcy5yZWFkb3V0LmNsYXNzTGlzdC5hZGQoIndpZGdldC12YWxpZC1yZWFkb3V0IiksdGhpcy5yZWFkb3V0LmNsYXNzTGlzdC5hZGQoIndpZGdldC1yZWFkb3V0IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgibW9kLXZhbGlkIiksdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJtb2QtaW52YWxpZCIpLHRoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgicmVhZG91dCIpLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpP3RoaXMuZWwuY2xhc3NMaXN0LmFkZCgibW9kLXZhbGlkIik6dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJtb2QtaW52YWxpZCIpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5WYWxpZFZpZXc9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big4KSxzPW4oMTIpLGE9big1NyksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQnV0dG9uU3R5bGVNb2RlbCIsX21vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9jb250cm9scyIsX21vZGVsX21vZHVsZV92ZXJzaW9uOmEuSlVQWVRFUl9DT05UUk9MU19WRVJTSU9OfSl9LGUuc3R5bGVQcm9wZXJ0aWVzPXtidXR0b25fY29sb3I6e3NlbGVjdG9yOiIiLGF0dHJpYnV0ZToiYmFja2dyb3VuZC1jb2xvciIsZGVmYXVsdDpudWxsfSxmb250X3dlaWdodDp7c2VsZWN0b3I6IiIsYXR0cmlidXRlOiJmb250LXdlaWdodCIsZGVmYXVsdDoiIn19LGV9KG8uU3R5bGVNb2RlbCk7ZS5CdXR0b25TdHlsZU1vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtkZXNjcmlwdGlvbjoiIix0b29sdGlwOiIiLGRpc2FibGVkOiExLGljb246IiIsYnV0dG9uX3N0eWxlOiIiLF92aWV3X25hbWU6IkJ1dHRvblZpZXciLF9tb2RlbF9uYW1lOiJCdXR0b25Nb2RlbCIsc3R5bGU6bnVsbH0pfSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5CdXR0b25Nb2RlbD1oO3ZhciBsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItYnV0dG9uIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtYnV0dG9uIiksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6YnV0dG9uX3N0eWxlIix0aGlzLnVwZGF0ZV9idXR0b25fc3R5bGUpLHRoaXMuc2V0X2J1dHRvbl9zdHlsZSgpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZWwuZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIiksdGhpcy5lbC5zZXRBdHRyaWJ1dGUoInRpdGxlIix0aGlzLm1vZGVsLmdldCgidG9vbHRpcCIpKTt2YXIgZT10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb24iKSxuPXRoaXMubW9kZWwuZ2V0KCJpY29uIik7aWYoZS5sZW5ndGh8fG4ubGVuZ3RoKXtpZih0aGlzLmVsLnRleHRDb250ZW50PSIiLG4ubGVuZ3RoKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpIik7aS5jbGFzc0xpc3QuYWRkKCJmYSIpLGkuY2xhc3NMaXN0LmFkZCgiZmEtIituKSwwPT09ZS5sZW5ndGgmJmkuY2xhc3NMaXN0LmFkZCgiY2VudGVyIiksdGhpcy5lbC5hcHBlbmRDaGlsZChpKX10aGlzLmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnVwZGF0ZV9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZV9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzX21hcCwiYnV0dG9uX3N0eWxlIil9LGUucHJvdG90eXBlLnNldF9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXt0aGlzLnNldF9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzX21hcCwiYnV0dG9uX3N0eWxlIil9LGUucHJvdG90eXBlLmV2ZW50cz1mdW5jdGlvbigpe3JldHVybntjbGljazoiX2hhbmRsZV9jbGljayJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NsaWNrPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLnNlbmQoe2V2ZW50OiJjbGljayJ9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWdOYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImJ1dHRvbiJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5jbGFzc19tYXA9e3ByaW1hcnk6WyJtb2QtcHJpbWFyeSJdLHN1Y2Nlc3M6WyJtb2Qtc3VjY2VzcyJdLGluZm86WyJtb2QtaW5mbyJdLHdhcm5pbmc6WyJtb2Qtd2FybmluZyJdLGRhbmdlcjpbIm1vZC1kYW5nZXIiXX0sZX0oby5ET01XaWRnZXRWaWV3KTtlLkJ1dHRvblZpZXc9bH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oOCksYT1uKDEyKSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJJbWFnZU1vZGVsIixfdmlld19uYW1lOiJJbWFnZVZpZXciLGZvcm1hdDoicG5nIix3aWR0aDoiIixoZWlnaHQ6IiIsdmFsdWU6bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigwKSl9KX0sZS5zZXJpYWxpemVycz1vKHt9LGEuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHt2YWx1ZTp7c2VyaWFsaXplOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBEYXRhVmlldyh0LmJ1ZmZlci5zbGljZSgwKSl9fX0pLGV9KGEuQ29yZURPTVdpZGdldE1vZGVsKTtlLkltYWdlTW9kZWw9Yzt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMucFdpZGdldC5hZGRDbGFzcygianVweXRlci13aWRnZXRzIiksdGhpcy5wV2lkZ2V0LmFkZENsYXNzKCJ3aWRnZXQtaW1hZ2UiKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgZSxuPXRoaXMubW9kZWwuZ2V0KCJmb3JtYXQiKSxpPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO2lmKCJ1cmwiIT09bil7dmFyIHI9bmV3IEJsb2IoW2ldLHt0eXBlOiJpbWFnZS8iK3RoaXMubW9kZWwuZ2V0KCJmb3JtYXQiKX0pO2U9VVJMLmNyZWF0ZU9iamVjdFVSTChyKX1lbHNlIGU9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLmRlY29kZShpLmJ1ZmZlcik7dmFyIG89dGhpcy5lbC5zcmM7dGhpcy5lbC5zcmM9ZSxvJiYic3RyaW5nIiE9dHlwZW9mIG8mJlVSTC5yZXZva2VPYmplY3RVUkwobyk7dmFyIHM9dGhpcy5tb2RlbC5nZXQoIndpZHRoIik7dm9pZCAwIT09cyYmcy5sZW5ndGg+MD90aGlzLmVsLnNldEF0dHJpYnV0ZSgid2lkdGgiLHMpOnRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKCJ3aWR0aCIpO3ZhciBhPXRoaXMubW9kZWwuZ2V0KCJoZWlnaHQiKTtyZXR1cm4gdm9pZCAwIT09YSYmYS5sZW5ndGg+MD90aGlzLmVsLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixhKTp0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0IiksdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZWwuc3JjJiZVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuZWwuc3JjKSx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWdOYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuImltZyJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZX0ocy5ET01XaWRnZXRWaWV3KTtlLkltYWdlVmlldz1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9big4KSxhPW4oMTIpLHU9big2KSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlZpZGVvTW9kZWwiLF92aWV3X25hbWU6IlZpZGVvVmlldyIsZm9ybWF0OiJtcDQiLHdpZHRoOiIiLGhlaWdodDoiIixhdXRvcGxheTohMCxsb29wOiEwLGNvbnRyb2xzOiEwLHZhbHVlOm5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpfSl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVET01XaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgRGF0YVZpZXcodC5idWZmZXIuc2xpY2UoMCkpfX19KSxlfShhLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5WaWRlb01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMucFdpZGdldC5hZGRDbGFzcygid2lkZ2V0LWltYWdlIiksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGUsbj10aGlzLm1vZGVsLmdldCgiZm9ybWF0IiksaT10aGlzLm1vZGVsLmdldCgidmFsdWUiKTtpZigidXJsIiE9PW4pe3ZhciByPW5ldyBCbG9iKFtpXSx7dHlwZToidmlkZW8vIit0aGlzLm1vZGVsLmdldCgiZm9ybWF0Iil9KTtlPVVSTC5jcmVhdGVPYmplY3RVUkwocil9ZWxzZSBlPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKS5kZWNvZGUoaS5idWZmZXIpO3ZhciBvPXRoaXMuZWwuc3JjO3RoaXMuZWwuc3JjPWUsbyYmInN0cmluZyIhPXR5cGVvZiBvJiZVUkwucmV2b2tlT2JqZWN0VVJMKG8pO3ZhciBzPXRoaXMubW9kZWwuZ2V0KCJ3aWR0aCIpO3ZvaWQgMCE9PXMmJnMubGVuZ3RoPjA/dGhpcy5lbC5zZXRBdHRyaWJ1dGUoIndpZHRoIixzKTp0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKTt2YXIgYT10aGlzLm1vZGVsLmdldCgiaGVpZ2h0Iik7cmV0dXJuIHZvaWQgMCE9PWEmJmEubGVuZ3RoPjA/dGhpcy5lbC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsYSk6dGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoImhlaWdodCIpLHRoaXMuZWwubG9vcD10aGlzLm1vZGVsLmdldCgibG9vcCIpLHRoaXMuZWwuYXV0b3BsYXk9dGhpcy5tb2RlbC5nZXQoImF1dG9wbGF5IiksdGhpcy5lbC5jb250cm9scz10aGlzLm1vZGVsLmdldCgiY29udHJvbHMiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5lbC5zcmMmJlVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5lbC5zcmMpLHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInRhZ05hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW8ifSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KHMuRE9NV2lkZ2V0Vmlldyk7ZS5WaWRlb1ZpZXc9aH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oOCksYT1uKDEyKSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJBdWRpb01vZGVsIixfdmlld19uYW1lOiJBdWRpb1ZpZXciLGZvcm1hdDoibXAzIixhdXRvcGxheTohMCxsb29wOiEwLGNvbnRyb2xzOiEwLHZhbHVlOm5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpfSl9LGUuc2VyaWFsaXplcnM9byh7fSxhLkNvcmVET01XaWRnZXRNb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgRGF0YVZpZXcodC5idWZmZXIuc2xpY2UoMCkpfX19KSxlfShhLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5BdWRpb01vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLnBXaWRnZXQuYWRkQ2xhc3MoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBlLG49dGhpcy5tb2RlbC5nZXQoImZvcm1hdCIpLGk9dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7aWYoInVybCIhPT1uKXt2YXIgcj1uZXcgQmxvYihbaV0se3R5cGU6ImF1ZGlvLyIrdGhpcy5tb2RlbC5nZXQoImZvcm1hdCIpfSk7ZT1VUkwuY3JlYXRlT2JqZWN0VVJMKHIpfWVsc2UgZT1uZXcgVGV4dERlY29kZXIoInV0Zi04IikuZGVjb2RlKGkuYnVmZmVyKTt2YXIgbz10aGlzLmVsLnNyYztyZXR1cm4gdGhpcy5lbC5zcmM9ZSxvJiYic3RyaW5nIiE9dHlwZW9mIG8mJlVSTC5yZXZva2VPYmplY3RVUkwobyksdGhpcy5lbC5sb29wPXRoaXMubW9kZWwuZ2V0KCJsb29wIiksdGhpcy5lbC5hdXRvcGxheT10aGlzLm1vZGVsLmdldCgiYXV0b3BsYXkiKSx0aGlzLmVsLmNvbnRyb2xzPXRoaXMubW9kZWwuZ2V0KCJjb250cm9scyIpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmVsLnNyYyYmVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmVsLnNyYyksdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidGFnTmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiJhdWRpbyJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZX0ocy5ET01XaWRnZXRWaWV3KTtlLkF1ZGlvVmlldz1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEyKSxzPW4oMjMpLGE9bigxNiksdT1uKDYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZToiYmxhY2siLGNvbmNpc2U6ITEsX21vZGVsX25hbWU6IkNvbG9yUGlja2VyTW9kZWwiLF92aWV3X25hbWU6IkNvbG9yUGlja2VyVmlldyJ9KX0sZX0oby5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5Db2xvclBpY2tlck1vZGVsPWM7dmFyIGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtY29sb3JwaWNrZXIiKSx0aGlzLl9jb2xvcl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY29sb3JfY29udGFpbmVyLmNsYXNzTmFtZT0id2lkZ2V0LWlubGluZS1oYm94IHdpZGdldC1jb2xvcnBpY2tlci1pbnB1dCIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLl9jb2xvcl9jb250YWluZXIpLHRoaXMuX3RleHRib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSx0aGlzLl90ZXh0Ym94LnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQiKSx0aGlzLl90ZXh0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj1hLnV1aWQoKSx0aGlzLl9jb2xvcl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdGV4dGJveCksdGhpcy5fdGV4dGJveC52YWx1ZT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0aGlzLl9jb2xvcnBpY2tlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuX2NvbG9ycGlja2VyLnNldEF0dHJpYnV0ZSgidHlwZSIsImNvbG9yIiksdGhpcy5fY29sb3JfY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbG9ycGlja2VyKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTp2YWx1ZSIsdGhpcy5fdXBkYXRlX3ZhbHVlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpjb25jaXNlIix0aGlzLl91cGRhdGVfY29uY2lzZSksdGhpcy5fdXBkYXRlX2NvbmNpc2UoKSx0aGlzLl91cGRhdGVfdmFsdWUoKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZXx8ZS51cGRhdGVkX3ZpZXchPXRoaXMpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMuX3RleHRib3guZGlzYWJsZWQ9bix0aGlzLl9jb2xvcnBpY2tlci5kaXNhYmxlZD1ufXJldHVybiB0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJueydjaGFuZ2UgW3R5cGU9ImNvbG9yIl0nOiJfcGlja2VyX2NoYW5nZSIsJ2NoYW5nZSBbdHlwZT0idGV4dCJdJzoiX3RleHRfY2hhbmdlIn19LGUucHJvdG90eXBlLl91cGRhdGVfdmFsdWU9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcy5tb2RlbC5nZXQoInZhbHVlIik7dGhpcy5fY29sb3JwaWNrZXIudmFsdWU9bFsodD1uKS50b0xvd2VyQ2FzZSgpXXx8KDc9PT0oZT10KS5sZW5ndGg/ZToiIyIrZS5jaGFyQXQoMSkrZS5jaGFyQXQoMSkrZS5jaGFyQXQoMikrZS5jaGFyQXQoMikrZS5jaGFyQXQoMykrZS5jaGFyQXQoMykpLHRoaXMuX3RleHRib3gudmFsdWU9bn0sZS5wcm90b3R5cGUuX3VwZGF0ZV9jb25jaXNlPWZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5nZXQoImNvbmNpc2UiKT8odGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJjb25jaXNlIiksdGhpcy5fdGV4dGJveC5zdHlsZS5kaXNwbGF5PSJub25lIik6KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgiY29uY2lzZSIpLHRoaXMuX3RleHRib3guc3R5bGUuZGlzcGxheT0iIil9LGUucHJvdG90eXBlLl9waWNrZXJfY2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5zZXQoInZhbHVlIix0aGlzLl9jb2xvcnBpY2tlci52YWx1ZSksdGhpcy50b3VjaCgpfSxlLnByb3RvdHlwZS5fdGV4dF9jaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl92YWxpZGF0ZV9jb2xvcih0aGlzLl90ZXh0Ym94LnZhbHVlLHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKTt0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQpLHRoaXMudG91Y2goKX0sZS5wcm90b3R5cGUuX3ZhbGlkYXRlX2NvbG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubWF0Y2goLyNbYS1mQS1GMC05XXszfSg/OlthLWZBLUYwLTldezN9KT8kLyl8fGxbdC50b0xvd2VyQ2FzZSgpXT90OmV9LGV9KHMuRGVzY3JpcHRpb25WaWV3KTtlLkNvbG9yUGlja2VyVmlldz1oO3ZhciBsPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmVlbjoiIzkwZWU5MCIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9bigyMyksYT1uKDEyKSx1PW4oMTYpLGM9big2KTtmdW5jdGlvbiBoKHQpe3JldHVybiBudWxsPT09dD9udWxsOnt5ZWFyOnQuZ2V0VVRDRnVsbFllYXIoKSxtb250aDp0LmdldFVUQ01vbnRoKCksZGF0ZTp0LmdldFVUQ0RhdGUoKX19ZnVuY3Rpb24gbCh0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aCx0LmRhdGUpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCksZX1lLnNlcmlhbGl6ZV9kYXRlPWgsZS5kZXNlcmlhbGl6ZV9kYXRlPWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHt2YWx1ZTpudWxsLF9tb2RlbF9uYW1lOiJEYXRlUGlja2VyTW9kZWwiLF92aWV3X25hbWU6IkRhdGVQaWNrZXJWaWV3In0pfSxlLnNlcmlhbGl6ZXJzPW8oe30sYS5Db3JlRGVzY3JpcHRpb25Nb2RlbC5zZXJpYWxpemVycyx7dmFsdWU6e3NlcmlhbGl6ZTpoLGRlc2VyaWFsaXplOmx9fSksZX0oYS5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5EYXRlUGlja2VyTW9kZWw9ZDt2YXIgZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1kYXRlcGlja2VyIiksdGhpcy5fZGF0ZXBpY2tlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHRoaXMuX2RhdGVwaWNrZXIuc2V0QXR0cmlidXRlKCJ0eXBlIiwiZGF0ZSIpLHRoaXMuX2RhdGVwaWNrZXIuaWQ9dGhpcy5sYWJlbC5odG1sRm9yPXUudXVpZCgpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5fZGF0ZXBpY2tlciksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6dmFsdWUiLHRoaXMuX3VwZGF0ZV92YWx1ZSksdGhpcy5fdXBkYXRlX3ZhbHVlKCksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiZlLnVwZGF0ZWRfdmlldz09dGhpc3x8KHRoaXMuX2RhdGVwaWNrZXIuZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIikpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NoYW5nZSBbdHlwZT0iZGF0ZSJdJzoiX3BpY2tlcl9jaGFuZ2UifX0sZS5wcm90b3R5cGUuX3VwZGF0ZV92YWx1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuX2RhdGVwaWNrZXIudmFsdWVBc0RhdGU9dH0sZS5wcm90b3R5cGUuX3BpY2tlcl9jaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9kYXRlcGlja2VyLnZhbGlkaXR5LmJhZElucHV0fHwodGhpcy5tb2RlbC5zZXQoInZhbHVlIix0aGlzLl9kYXRlcGlja2VyLnZhbHVlQXNEYXRlKSx0aGlzLnRvdWNoKCkpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5EYXRlUGlja2VyVmlldz1mfSxmdW5jdGlvbih0LGUsbil7dmFyIGkscixvOwovKiEKICogalF1ZXJ5IFVJIFNsaWRlciAxLjEyLjEKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovcj1bbigxNSksbigzNDgpLG4oMzUwKSxuKDQyKSxuKDEzOCldLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3JldHVybiB0LndpZGdldCgidWkuc2xpZGVyIix0LnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjEyLjEiLHdpZGdldEV2ZW50UHJlZml4OiJzbGlkZSIsb3B0aW9uczp7YW5pbWF0ZTohMSxjbGFzc2VzOnsidWktc2xpZGVyIjoidWktY29ybmVyLWFsbCIsInVpLXNsaWRlci1oYW5kbGUiOiJ1aS1jb3JuZXItYWxsIiwidWktc2xpZGVyLXJhbmdlIjoidWktY29ybmVyLWFsbCB1aS13aWRnZXQtaGVhZGVyIn0sZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbCxjaGFuZ2U6bnVsbCxzbGlkZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxudW1QYWdlczo1LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9hZGRDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24sInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLHRoaXMuX3JlZnJlc2goKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJhbmdlKCksdGhpcy5fY3JlYXRlSGFuZGxlcygpLHRoaXMuX3NldHVwRXZlbnRzKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9jcmVhdGVIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIGUsbixpPXRoaXMub3B0aW9ucyxyPXRoaXMuZWxlbWVudC5maW5kKCIudWktc2xpZGVyLWhhbmRsZSIpLG89W107Zm9yKG49aS52YWx1ZXMmJmkudmFsdWVzLmxlbmd0aHx8MSxyLmxlbmd0aD5uJiYoci5zbGljZShuKS5yZW1vdmUoKSxyPXIuc2xpY2UoMCxuKSksZT1yLmxlbmd0aDtlPG47ZSsrKW8ucHVzaCgiPHNwYW4gdGFiaW5kZXg9JzAnPjwvc3Bhbj4iKTt0aGlzLmhhbmRsZXM9ci5hZGQodChvLmpvaW4oIiIpKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpKSx0aGlzLl9hZGRDbGFzcyh0aGlzLmhhbmRsZXMsInVpLXNsaWRlci1oYW5kbGUiLCJ1aS1zdGF0ZS1kZWZhdWx0IiksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGUpe3QodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsZSkuYXR0cigidGFiSW5kZXgiLDApfSl9LF9jcmVhdGVSYW5nZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztlLnJhbmdlPyghMD09PWUucmFuZ2UmJihlLnZhbHVlcz9lLnZhbHVlcy5sZW5ndGgmJjIhPT1lLnZhbHVlcy5sZW5ndGg/ZS52YWx1ZXM9W2UudmFsdWVzWzBdLGUudmFsdWVzWzBdXTp0LmlzQXJyYXkoZS52YWx1ZXMpJiYoZS52YWx1ZXM9ZS52YWx1ZXMuc2xpY2UoMCkpOmUudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSx0aGlzLnJhbmdlJiZ0aGlzLnJhbmdlLmxlbmd0aD8odGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5yYW5nZSwidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IiksdGhpcy5yYW5nZS5jc3Moe2xlZnQ6IiIsYm90dG9tOiIifSkpOih0aGlzLnJhbmdlPXQoIjxkaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLl9hZGRDbGFzcyh0aGlzLnJhbmdlLCJ1aS1zbGlkZXItcmFuZ2UiKSksIm1pbiIhPT1lLnJhbmdlJiYibWF4IiE9PWUucmFuZ2V8fHRoaXMuX2FkZENsYXNzKHRoaXMucmFuZ2UsInVpLXNsaWRlci1yYW5nZS0iK2UucmFuZ2UpKToodGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLnJhbmdlPW51bGwpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl9vZmYodGhpcy5oYW5kbGVzKSx0aGlzLl9vbih0aGlzLmhhbmRsZXMsdGhpcy5faGFuZGxlRXZlbnRzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oYW5kbGVzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oYW5kbGVzKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlKXt2YXIgbixpLHIsbyxzLGEsdSxjPXRoaXMsaD10aGlzLm9wdGlvbnM7cmV0dXJuIWguZGlzYWJsZWQmJih0aGlzLmVsZW1lbnRTaXplPXt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX0sdGhpcy5lbGVtZW50T2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSxuPXt4OmUucGFnZVgseTplLnBhZ2VZfSxpPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShuKSxyPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSsxLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPU1hdGguYWJzKGktYy52YWx1ZXMoZSkpOyhyPm58fHI9PT1uJiYoZT09PWMuX2xhc3RDaGFuZ2VkVmFsdWV8fGMudmFsdWVzKGUpPT09aC5taW4pKSYmKHI9bixvPXQodGhpcykscz1lKX0pLCExIT09dGhpcy5fc3RhcnQoZSxzKSYmKHRoaXMuX21vdXNlU2xpZGluZz0hMCx0aGlzLl9oYW5kbGVJbmRleD1zLHRoaXMuX2FkZENsYXNzKG8sbnVsbCwidWktc3RhdGUtYWN0aXZlIiksby50cmlnZ2VyKCJmb2N1cyIpLGE9by5vZmZzZXQoKSx1PSF0KGUudGFyZ2V0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmlzKCIudWktc2xpZGVyLWhhbmRsZSIpLHRoaXMuX2NsaWNrT2Zmc2V0PXU/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6ZS5wYWdlWC1hLmxlZnQtby53aWR0aCgpLzIsdG9wOmUucGFnZVktYS50b3Atby5oZWlnaHQoKS8yLShwYXJzZUludChvLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChvLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChvLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfHx0aGlzLl9zbGlkZShlLHMsaSksdGhpcy5fYW5pbWF0ZU9mZj0hMCwhMCkpfSxfbW91c2VTdGFydDpmdW5jdGlvbigpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe3ZhciBlPXt4OnQucGFnZVgseTp0LnBhZ2VZfSxuPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShlKTtyZXR1cm4gdGhpcy5fc2xpZGUodCx0aGlzLl9oYW5kbGVJbmRleCxuKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGVzLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKHQsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZSh0LHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj0idmVydGljYWwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLG87cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj8oZT10aGlzLmVsZW1lbnRTaXplLndpZHRoLG49dC54LXRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC5sZWZ0OjApKTooZT10aGlzLmVsZW1lbnRTaXplLmhlaWdodCxuPXQueS10aGlzLmVsZW1lbnRPZmZzZXQudG9wLSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC50b3A6MCkpLChpPW4vZSk+MSYmKGk9MSksaTwwJiYoaT0wKSwidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmKGk9MS1pKSxyPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxvPXRoaXMuX3ZhbHVlTWluKCkraSpyLHRoaXMuX3RyaW1BbGlnblZhbHVlKG8pfSxfdWlIYXNoOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSxoYW5kbGVJbmRleDp0LHZhbHVlOnZvaWQgMCE9PWU/ZTp0aGlzLnZhbHVlKCl9O3JldHVybiB0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpJiYoaS52YWx1ZT12b2lkIDAhPT1lP2U6dGhpcy52YWx1ZXModCksaS52YWx1ZXM9bnx8dGhpcy52YWx1ZXMoKSksaX0sX2hhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RofSxfc3RhcnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQsdGhpcy5fdWlIYXNoKGUpKX0sX3NsaWRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyPXRoaXMudmFsdWUoKSxvPXRoaXMudmFsdWVzKCk7dGhpcy5faGFzTXVsdGlwbGVWYWx1ZXMoKSYmKGk9dGhpcy52YWx1ZXMoZT8wOjEpLHI9dGhpcy52YWx1ZXMoZSksMj09PXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYhMD09PXRoaXMub3B0aW9ucy5yYW5nZSYmKG49MD09PWU/TWF0aC5taW4oaSxuKTpNYXRoLm1heChpLG4pKSxvW2VdPW4pLG4hPT1yJiYhMSE9PXRoaXMuX3RyaWdnZXIoInNsaWRlIix0LHRoaXMuX3VpSGFzaChlLG4sbykpJiYodGhpcy5faGFzTXVsdGlwbGVWYWx1ZXMoKT90aGlzLnZhbHVlcyhlLG4pOnRoaXMudmFsdWUobikpfSxfc3RvcDpmdW5jdGlvbih0LGUpe3RoaXMuX3RyaWdnZXIoInN0b3AiLHQsdGhpcy5fdWlIYXNoKGUpKX0sX2NoYW5nZTpmdW5jdGlvbih0LGUpe3RoaXMuX2tleVNsaWRpbmd8fHRoaXMuX21vdXNlU2xpZGluZ3x8KHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9ZSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKGUpKSl9LHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdHJpbUFsaWduVmFsdWUodCksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCB0aGlzLl9jaGFuZ2UobnVsbCwwKSk6dGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGUsbil7dmFyIGkscixvO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc1tlXT10aGlzLl90cmltQWxpZ25WYWx1ZShuKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx2b2lkIHRoaXMuX2NoYW5nZShudWxsLGUpO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighdC5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy5fdmFsdWVzKGUpOnRoaXMudmFsdWUoKTtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLHI9YXJndW1lbnRzWzBdLG89MDtvPGkubGVuZ3RoO28rPTEpaVtvXT10aGlzLl90cmltQWxpZ25WYWx1ZShyW29dKSx0aGlzLl9jaGFuZ2UobnVsbCxvKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLG4pe3ZhciBpLHI9MDtzd2l0Y2goInJhbmdlIj09PWUmJiEwPT09dGhpcy5vcHRpb25zLnJhbmdlJiYoIm1pbiI9PT1uPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1uJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSx0LmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihyPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSx0aGlzLl9zdXBlcihlLG4pLGUpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fcmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLl9hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5vcHRpb25zLnJhbmdlJiZ0aGlzLl9yZWZyZXNoUmFuZ2UobiksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1uPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxpPXItMTtpPj0wO2ktLSl0aGlzLl9jaGFuZ2UobnVsbCxpKTt0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2Uic3RlcCI6Y2FzZSJtaW4iOmNhc2UibWF4Ijp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2NhbGN1bGF0ZU5ld01heCgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJyYW5nZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLl90b2dnbGVDbGFzcyhudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KX0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnZhbHVlO3JldHVybiB0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpfSxfdmFsdWVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saTtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPXRoaXMub3B0aW9ucy52YWx1ZXNbdF0sZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKTtpZih0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpKXtmb3Iobj10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCksaT0wO2k8bi5sZW5ndGg7aSs9MSluW2ldPXRoaXMuX3RyaW1BbGlnblZhbHVlKG5baV0pO3JldHVybiBufXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24odCl7aWYodDw9dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZih0Pj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBlPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxuPSh0LXRoaXMuX3ZhbHVlTWluKCkpJWUsaT10LW47cmV0dXJuIDIqTWF0aC5hYnMobik+PWUmJihpKz1uPjA/ZTotZSkscGFyc2VGbG9hdChpLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm1heCxlPXRoaXMuX3ZhbHVlTWluKCksbj10aGlzLm9wdGlvbnMuc3RlcCxpPU1hdGgucm91bmQoKHQtZSkvbikqbjsodD1pK2UpPnRoaXMub3B0aW9ucy5tYXgmJih0LT1uKSx0aGlzLm1heD1wYXJzZUZsb2F0KHQudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpfSxfcHJlY2lzaW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLnN0ZXApO3JldHVybiBudWxsIT09dGhpcy5vcHRpb25zLm1pbiYmKHQ9TWF0aC5tYXgodCx0aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMubWluKSkpLHR9LF9wcmVjaXNpb25PZjpmdW5jdGlvbih0KXt2YXIgZT10LnRvU3RyaW5nKCksbj1lLmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PW4/MDplLmxlbmd0aC1uLTF9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9LF9yZWZyZXNoUmFuZ2U6ZnVuY3Rpb24odCl7InZlcnRpY2FsIj09PXQmJnRoaXMucmFuZ2UuY3NzKHt3aWR0aDoiIixsZWZ0OiIifSksImhvcml6b250YWwiPT09dCYmdGhpcy5yYW5nZS5jc3Moe2hlaWdodDoiIixib3R0b206IiJ9KX0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBlLG4saSxyLG8scz10aGlzLm9wdGlvbnMucmFuZ2UsYT10aGlzLm9wdGlvbnMsdT10aGlzLGM9IXRoaXMuX2FuaW1hdGVPZmYmJmEuYW5pbWF0ZSxoPXt9O3RoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oaSl7bj0odS52YWx1ZXMoaSktdS5fdmFsdWVNaW4oKSkvKHUuX3ZhbHVlTWF4KCktdS5fdmFsdWVNaW4oKSkqMTAwLGhbImhvcml6b250YWwiPT09dS5vcmllbnRhdGlvbj8ibGVmdCI6ImJvdHRvbSJdPW4rIiUiLHQodGhpcykuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXShoLGEuYW5pbWF0ZSksITA9PT11Lm9wdGlvbnMucmFuZ2UmJigiaG9yaXpvbnRhbCI9PT11Lm9yaWVudGF0aW9uPygwPT09aSYmdS5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtsZWZ0Om4rIiUifSxhLmFuaW1hdGUpLDE9PT1pJiZ1LnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6bi1lKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmEuYW5pbWF0ZX0pKTooMD09PWkmJnUucmFuZ2Uuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXSh7Ym90dG9tOm4rIiUifSxhLmFuaW1hdGUpLDE9PT1pJiZ1LnJhbmdlW2M/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0Om4tZSsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjphLmFuaW1hdGV9KSkpLGU9bn0pOihpPXRoaXMudmFsdWUoKSxyPXRoaXMuX3ZhbHVlTWluKCksbz10aGlzLl92YWx1ZU1heCgpLG49byE9PXI/KGktcikvKG8tcikqMTAwOjAsaFsiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09bisiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2M/ImFuaW1hdGUiOiJjc3MiXShoLGEuYW5pbWF0ZSksIm1pbiI9PT1zJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtjPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOm4rIiUifSxhLmFuaW1hdGUpLCJtYXgiPT09cyYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtbisiJSJ9LGEuYW5pbWF0ZSksIm1pbiI9PT1zJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6bisiJSJ9LGEuYW5pbWF0ZSksIm1heCI9PT1zJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbYz8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLW4rIiUifSxhLmFuaW1hdGUpKX0sX2hhbmRsZUV2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgbixpLHIsbz10KGUudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTpjYXNlIHQudWkua2V5Q29kZS5FTkQ6Y2FzZSB0LnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSB0LnVpLmtleUNvZGUuVVA6Y2FzZSB0LnVpLmtleUNvZGUuUklHSFQ6Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpjYXNlIHQudWkua2V5Q29kZS5MRUZUOmlmKGUucHJldmVudERlZmF1bHQoKSwhdGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITAsdGhpcy5fYWRkQ2xhc3ModChlLnRhcmdldCksbnVsbCwidWktc3RhdGUtYWN0aXZlIiksITE9PT10aGlzLl9zdGFydChlLG8pKSlyZXR1cm59c3dpdGNoKHI9dGhpcy5vcHRpb25zLnN0ZXAsbj1pPXRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy52YWx1ZXMobyk6dGhpcy52YWx1ZSgpLGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTppPXRoaXMuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5EOmk9dGhpcy5fdmFsdWVNYXgoKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX1VQOmk9dGhpcy5fdHJpbUFsaWduVmFsdWUobisodGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046aT10aGlzLl90cmltQWxpZ25WYWx1ZShuLSh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL3RoaXMubnVtUGFnZXMpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLlVQOmNhc2UgdC51aS5rZXlDb2RlLlJJR0hUOmlmKG49PT10aGlzLl92YWx1ZU1heCgpKXJldHVybjtpPXRoaXMuX3RyaW1BbGlnblZhbHVlKG4rcik7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpjYXNlIHQudWkua2V5Q29kZS5MRUZUOmlmKG49PT10aGlzLl92YWx1ZU1pbigpKXJldHVybjtpPXRoaXMuX3RyaW1BbGlnblZhbHVlKG4tcil9dGhpcy5fc2xpZGUoZSxvLGkpfSxrZXl1cDpmdW5jdGlvbihlKXt2YXIgbj10KGUudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7dGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fc3RvcChlLG4pLHRoaXMuX2NoYW5nZShlLG4pLHRoaXMuX3JlbW92ZUNsYXNzKHQoZS50YXJnZXQpLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpKX19fSl9KT9pLmFwcGx5KGUscik6aSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG87Ci8qIQogKiBqUXVlcnkgVUkgTW91c2UgMS4xMi4xCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqL3I9W24oMTUpLG4oMzQ5KSxuKDQyKSxuKDEzOCldLHZvaWQgMD09PShvPSJmdW5jdGlvbiI9PXR5cGVvZihpPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiB0KGRvY3VtZW50KS5vbigibW91c2V1cCIsZnVuY3Rpb24oKXtlPSExfSksdC53aWRnZXQoInVpLm1vdXNlIix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOntjYW5jZWw6ImlucHV0LCB0ZXh0YXJlYSwgYnV0dG9uLCBzZWxlY3QsIG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmVsZW1lbnQub24oIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbih0KXtyZXR1cm4gZS5fbW91c2VEb3duKHQpfSkub24oImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKG4pe2lmKCEwPT09dC5kYXRhKG4udGFyZ2V0LGUud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikpcmV0dXJuIHQucmVtb3ZlRGF0YShuLnRhcmdldCxlLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITF9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQub2ZmKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50Lm9mZigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vZmYoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbihuKXtpZighZSl7dGhpcy5fbW91c2VNb3ZlZD0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAobiksdGhpcy5fbW91c2VEb3duRXZlbnQ9bjt2YXIgaT10aGlzLHI9MT09PW4ud2hpY2gsbz0hKCJzdHJpbmciIT10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbHx8IW4udGFyZ2V0Lm5vZGVOYW1lKSYmdChuLnRhcmdldCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuY2FuY2VsKS5sZW5ndGg7cmV0dXJuIShyJiYhbyYmdGhpcy5fbW91c2VDYXB0dXJlKG4pJiYodGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXksdGhpcy5tb3VzZURlbGF5TWV0fHwodGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLm1vdXNlRGVsYXlNZXQ9ITB9LHRoaXMub3B0aW9ucy5kZWxheSkpLHRoaXMuX21vdXNlRGlzdGFuY2VNZXQobikmJnRoaXMuX21vdXNlRGVsYXlNZXQobikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEhPT10aGlzLl9tb3VzZVN0YXJ0KG4pLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpPyhuLnByZXZlbnREZWZhdWx0KCksMCk6KCEwPT09dC5kYXRhKG4udGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJnQucmVtb3ZlRGF0YShuLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tb3VzZU1vdmUodCl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbW91c2VVcCh0KX0sdGhpcy5kb2N1bWVudC5vbigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vbigibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLG4ucHJldmVudERlZmF1bHQoKSxlPSEwLDApKSl9fSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX21vdXNlTW92ZWQpe2lmKHQudWkuaWUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8OSkmJiFlLmJ1dHRvbilyZXR1cm4gdGhpcy5fbW91c2VVcChlKTtpZighZS53aGljaClpZihlLm9yaWdpbmFsRXZlbnQuYWx0S2V5fHxlLm9yaWdpbmFsRXZlbnQuY3RybEtleXx8ZS5vcmlnaW5hbEV2ZW50Lm1ldGFLZXl8fGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSl0aGlzLmlnbm9yZU1pc3NpbmdXaGljaD0hMDtlbHNlIGlmKCF0aGlzLmlnbm9yZU1pc3NpbmdXaGljaClyZXR1cm4gdGhpcy5fbW91c2VVcChlKX1yZXR1cm4oZS53aGljaHx8ZS5idXR0b24pJiYodGhpcy5fbW91c2VNb3ZlZD0hMCksdGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcoZSksZS5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldChlKSYmdGhpcy5fbW91c2VEZWxheU1ldChlKSYmKHRoaXMuX21vdXNlU3RhcnRlZD0hMSE9PXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsZSksdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyhlKTp0aGlzLl9tb3VzZVVwKGUpKSwhdGhpcy5fbW91c2VTdGFydGVkKX0sX21vdXNlVXA6ZnVuY3Rpb24obil7dGhpcy5kb2N1bWVudC5vZmYoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkub2ZmKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLG4udGFyZ2V0PT09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZ0LmRhdGEobi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AobikpLHRoaXMuX21vdXNlRGVsYXlUaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLl9tb3VzZURlbGF5VGltZXIpLGRlbGV0ZSB0aGlzLl9tb3VzZURlbGF5VGltZXIpLHRoaXMuaWdub3JlTWlzc2luZ1doaWNoPSExLGU9ITEsbi5wcmV2ZW50RGVmYXVsdCgpfSxfbW91c2VEaXN0YW5jZU1ldDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVgtdC5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktdC5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pP2kuYXBwbHkoZSxyKTppKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbztyPVtuKDE1KSxuKDQyKV0sdm9pZCAwPT09KG89ImZ1bmN0aW9uIj09dHlwZW9mKGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudWkuaWU9ISEvbXNpZSBbXHcuXSsvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKX0pP2kuYXBwbHkoZSxyKTppKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbzsKLyohCiAqIGpRdWVyeSBVSSBLZXljb2RlIDEuMTIuMQogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKi9yPVtuKDE1KSxuKDQyKV0sdm9pZCAwPT09KG89ImZ1bmN0aW9uIj09dHlwZW9mKGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudWkua2V5Q29kZT17QkFDS1NQQUNFOjgsQ09NTUE6MTg4LERFTEVURTo0NixET1dOOjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixMRUZUOjM3LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU1BBQ0U6MzIsVEFCOjksVVA6Mzh9fSk/aS5hcHBseShlLHIpOmkpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEyKSxzPW4oNiksYT1uKDEzNyksdT1uKDEzOSksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJGbG9hdE1vZGVsIix2YWx1ZTowfSl9LGV9KG8uQ29yZURlc2NyaXB0aW9uTW9kZWwpO2UuRmxvYXRNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkJvdW5kZWRGbG9hdE1vZGVsIixtYXg6MTAwLG1pbjowfSl9LGV9KGMpO2UuQm91bmRlZEZsb2F0TW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJGbG9hdFNsaWRlck1vZGVsIixfdmlld19uYW1lOiJGbG9hdFNsaWRlclZpZXciLHN0ZXA6MSxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsX3JhbmdlOiExLHJlYWRvdXQ6ITAscmVhZG91dF9mb3JtYXQ6Ii4yZiIsc2xpZGVyX2NvbG9yOm51bGwsY29udGludW91c191cGRhdGU6ITAsZGlzYWJsZWQ6ITF9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPXUuZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0oaCk7ZS5GbG9hdFNsaWRlck1vZGVsPWw7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiRmxvYXRMb2dTbGlkZXJNb2RlbCIsX3ZpZXdfbmFtZToiRmxvYXRMb2dTbGlkZXJWaWV3IixzdGVwOi4xLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixfcmFuZ2U6ITEscmVhZG91dDohMCxyZWFkb3V0X2Zvcm1hdDoiLjNnIixzbGlkZXJfY29sb3I6bnVsbCxjb250aW51b3VzX3VwZGF0ZTohMCxkaXNhYmxlZDohMSxiYXNlOjEwLHZhbHVlOjEsbWluOjAsbWF4OjR9KX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGUsbiksdGhpcy5vbigiY2hhbmdlOnJlYWRvdXRfZm9ybWF0Iix0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCx0aGlzKSx0aGlzLnVwZGF0ZV9yZWFkb3V0X2Zvcm1hdCgpfSxlLnByb3RvdHlwZS51cGRhdGVfcmVhZG91dF9mb3JtYXQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRvdXRfZm9ybWF0dGVyPXUuZm9ybWF0KHRoaXMuZ2V0KCJyZWFkb3V0X2Zvcm1hdCIpKX0sZX0oaCk7ZS5GbG9hdExvZ1NsaWRlck1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShsKTtlLkZsb2F0UmFuZ2VTbGlkZXJNb2RlbD1mO3ZhciBwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlRmxvYXQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl92YWxpZGF0ZV9zbGlkZV92YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZX0oYS5JbnRTbGlkZXJWaWV3KTtlLkZsb2F0U2xpZGVyVmlldz1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX3BhcnNlX3ZhbHVlPXBhcnNlRmxvYXQsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJtaW4iKSxpPXRoaXMubW9kZWwuZ2V0KCJtYXgiKSxyPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpLG89dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxzPU1hdGgubG9nKHIpL01hdGgubG9nKG8pO3M+aT9zPWk6czxuJiYocz1uKSx0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIscyksdGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyhyKSx0aGlzLm1vZGVsLmdldCgidmFsdWUiKSE9PXImJih0aGlzLm1vZGVsLnNldCgidmFsdWUiLHIse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpKX0sZS5wcm90b3R5cGUudmFsdWVUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4oMCx0aGlzLm1vZGVsLnJlYWRvdXRfZm9ybWF0dGVyKSh0KX0sZS5wcm90b3R5cGUuc3RyaW5nVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyc2VfdmFsdWUodCl9LGUucHJvdG90eXBlLmhhbmRsZVRleHRDaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0cmluZ1RvVmFsdWUodGhpcy5yZWFkb3V0LnRleHRDb250ZW50KSxlPXRoaXMubW9kZWwuZ2V0KCJtaW4iKSxuPXRoaXMubW9kZWwuZ2V0KCJtYXgiKSxpPXRoaXMubW9kZWwuZ2V0KCJiYXNlIik7aXNOYU4odCk/dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0aGlzLm1vZGVsLmdldCgidmFsdWUiKSk6KHQ9TWF0aC5tYXgoTWF0aC5taW4odCxNYXRoLnBvdyhpLG4pKSxNYXRoLnBvdyhpLGUpKSkhPT10aGlzLm1vZGVsLmdldCgidmFsdWUiKT8odGhpcy5yZWFkb3V0LnRleHRDb250ZW50PXRoaXMudmFsdWVUb1N0cmluZyh0KSx0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpKTp0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9dGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpKX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxpPU1hdGgucG93KG4sdGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSkpO3RoaXMucmVhZG91dC50ZXh0Q29udGVudD10aGlzLnZhbHVlVG9TdHJpbmcoaSksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoImJhc2UiKSxpPU1hdGgucG93KG4sdGhpcy5fdmFsaWRhdGVfc2xpZGVfdmFsdWUoZS52YWx1ZSkpO3RoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsaSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCl9LGUucHJvdG90eXBlLl92YWxpZGF0ZV9zbGlkZV92YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZX0oYS5CYXNlSW50U2xpZGVyVmlldyk7ZS5GbG9hdExvZ1NsaWRlclZpZXc9bTt2YXIgZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl9wYXJzZV92YWx1ZT1wYXJzZUZsb2F0LGUuX3JhbmdlX3JlZ2V4PS9eXHMqKFsrLV0/KD86XGQqXC4/XGQrfFxkK1wuKSg/OltlRV1bLTpdP1xkKyk/KVxzKlstOuKAk11ccyooWystXT8oPzpcZCpcLj9cZCt8XGQrXC4pKD86W2VFXVsrLV0/XGQrKT8pLyxlfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuX3ZhbGlkYXRlX3NsaWRlX3ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlfShhLkludFJhbmdlU2xpZGVyVmlldyk7ZS5GbG9hdFJhbmdlU2xpZGVyVmlldz1nO3ZhciB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkZsb2F0VGV4dE1vZGVsIixfdmlld19uYW1lOiJGbG9hdFRleHRWaWV3IixkaXNhYmxlZDohMSxjb250aW51b3VzX3VwZGF0ZTohMX0pfSxlfShjKTtlLkZsb2F0VGV4dE1vZGVsPXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBzLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQm91bmRlZEZsb2F0VGV4dE1vZGVsIixfdmlld19uYW1lOiJGbG9hdFRleHRWaWV3IixkaXNhYmxlZDohMSxjb250aW51b3VzX3VwZGF0ZTohMSxzdGVwOi4xfSl9LGV9KGgpO2UuQm91bmRlZEZsb2F0VGV4dE1vZGVsPWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fcGFyc2VfdmFsdWU9cGFyc2VGbG9hdCxlLl9kZWZhdWx0X3N0ZXA9ImFueSIsZX1yZXR1cm4gcihlLHQpLGV9KGEuSW50VGV4dFZpZXcpO2UuRmxvYXRUZXh0Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkZsb2F0UHJvZ3Jlc3NNb2RlbCIsX3ZpZXdfbmFtZToiUHJvZ3Jlc3NWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsYmFyX3N0eWxlOiIiLHN0eWxlOm51bGx9KX0sZX0oaCk7ZS5GbG9hdFByb2dyZXNzTW9kZWw9X30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9big4KSx1PW4oNiksYz1uKDE2KSxoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IkNvbnRyb2xsZXJCdXR0b25Nb2RlbCIsX3ZpZXdfbmFtZToiQ29udHJvbGxlckJ1dHRvblZpZXciLHZhbHVlOjAscHJlc3NlZDohMX0pfSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5Db250cm9sbGVyQnV0dG9uTW9kZWw9aDt2YXIgbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtY29udHJvbGxlci1idXR0b24iKSx0aGlzLnN1cHBvcnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5zdXBwb3J0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5zdXBwb3J0LnN0eWxlLm1hcmdpbj0iMXB4Iix0aGlzLnN1cHBvcnQuc3R5bGUud2lkdGg9IjE2cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5oZWlnaHQ9IjE2cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCBibGFjayIsdGhpcy5zdXBwb3J0LnN0eWxlLmJhY2tncm91bmQ9ImxpZ2h0Z3JheSIsdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnN1cHBvcnQpLHRoaXMuYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuYmFyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5iYXIuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuYmFyLnN0eWxlLmJvdHRvbT0iMHB4Iix0aGlzLmJhci5zdHlsZS5iYWNrZ3JvdW5kPSJncmF5Iix0aGlzLnN1cHBvcnQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpLHRoaXMudXBkYXRlKCksdGhpcy5sYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmxhYmVsLnRleHRDb250ZW50PXRoaXMubW9kZWwuZ2V0KCJkZXNjcmlwdGlvbiIpLHRoaXMubGFiZWwuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5sYWJlbCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYmFyLnN0eWxlLmhlaWdodD0xMDAqdGhpcy5tb2RlbC5nZXQoInZhbHVlIikrIiUifSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlckJ1dHRvblZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJDb250cm9sbGVyQXhpc01vZGVsIixfdmlld19uYW1lOiJDb250cm9sbGVyQXhpc1ZpZXciLHZhbHVlOjB9KX0sZX0ocy5Db3JlRE9NV2lkZ2V0TW9kZWwpO2UuQ29udHJvbGxlckF4aXNNb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1jb250cm9sbGVyLWF4aXMiKSx0aGlzLmVsLnN0eWxlLndpZHRoPSIxNnB4Iix0aGlzLmVsLnN0eWxlLnBhZGRpbmc9IjRweCIsdGhpcy5zdXBwb3J0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc3VwcG9ydC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3VwcG9ydC5zdHlsZS5tYXJnaW49IjFweCIsdGhpcy5zdXBwb3J0LnN0eWxlLndpZHRoPSI0cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5oZWlnaHQ9IjY0cHgiLHRoaXMuc3VwcG9ydC5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCBibGFjayIsdGhpcy5zdXBwb3J0LnN0eWxlLmJhY2tncm91bmQ9ImxpZ2h0Z3JheSIsdGhpcy5idWxsZXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5idWxsZXQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmJ1bGxldC5zdHlsZS5tYXJnaW49Ii00cHgiLHRoaXMuYnVsbGV0LnN0eWxlLndpZHRoPSIxMHB4Iix0aGlzLmJ1bGxldC5zdHlsZS5oZWlnaHQ9IjEwcHgiLHRoaXMuYnVsbGV0LnN0eWxlLmJhY2tncm91bmQ9ImdyYXkiLHRoaXMubGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5sYWJlbC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgiZGVzY3JpcHRpb24iKSx0aGlzLmxhYmVsLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIix0aGlzLnN1cHBvcnQuYXBwZW5kQ2hpbGQodGhpcy5idWxsZXQpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zdXBwb3J0KSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYnVsbGV0LnN0eWxlLnRvcD01MCoodGhpcy5tb2RlbC5nZXQoInZhbHVlIikrMSkrIiUifSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlckF4aXNWaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQ29udHJvbGxlck1vZGVsIixfdmlld19uYW1lOiJDb250cm9sbGVyVmlldyIsaW5kZXg6MCxuYW1lOiIiLG1hcHBpbmc6IiIsY29ubmVjdGVkOiExLHRpbWVzdGFtcDowLGJ1dHRvbnM6W10sYXhlczpbXX0pfSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUsbil7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSxuKSx2b2lkIDA9PT1uYXZpZ2F0b3IuZ2V0R2FtZXBhZHM/KHRoaXMucmVhZG91dD0iVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZ2FtZXBhZHMuIixjb25zb2xlLmVycm9yKHRoaXMucmVhZG91dCkpOih0aGlzLnJlYWRvdXQ9IkNvbm5lY3QgZ2FtZXBhZCBhbmQgcHJlc3MgYW55IGJ1dHRvbi4iLHRoaXMuZ2V0KCJjb25uZWN0ZWQiKT90aGlzLnVwZGF0ZV9sb29wKCk6dGhpcy53YWl0X2xvb3AoKSl9LGUucHJvdG90eXBlLndhaXRfbG9vcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KCJpbmRleCIpLGU9bmF2aWdhdG9yLmdldEdhbWVwYWRzKClbdF07aWYoZSl7dmFyIG49dGhpczt0aGlzLnNldHVwKGUpLnRoZW4oZnVuY3Rpb24odCl7bi5zZXQodCksbi5zYXZlX2NoYW5nZXMoKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4udXBkYXRlX2xvb3AuYmluZChuKSl9KX1lbHNlIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy53YWl0X2xvb3AuYmluZCh0aGlzKSl9LGUucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHtuYW1lOnQuaWQsbWFwcGluZzp0Lm1hcHBpbmcsY29ubmVjdGVkOnQuY29ubmVjdGVkLHRpbWVzdGFtcDp0LnRpbWVzdGFtcH0pO3ZhciBlPXRoaXM7cmV0dXJuIGMucmVzb2x2ZVByb21pc2VzRGljdCh7YnV0dG9uczpQcm9taXNlLmFsbCh0LmJ1dHRvbnMubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2NyZWF0ZV9idXR0b25fbW9kZWwobil9KSksYXhlczpQcm9taXNlLmFsbCh0LmF4ZXMubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2NyZWF0ZV9heGlzX21vZGVsKG4pfSkpfSl9LGUucHJvdG90eXBlLnVwZGF0ZV9sb29wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImluZGV4IiksZT10aGlzLmdldCgibmFtZSIpLG49bmF2aWdhdG9yLmdldEdhbWVwYWRzKClbdF07biYmdD09PW4uaW5kZXgmJmU9PT1uLmlkPyh0aGlzLnNldCh7dGltZXN0YW1wOm4udGltZXN0YW1wLGNvbm5lY3RlZDpuLmNvbm5lY3RlZH0pLHRoaXMuc2F2ZV9jaGFuZ2VzKCksdGhpcy5nZXQoImJ1dHRvbnMiKS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dC5zZXQoe3ZhbHVlOm4uYnV0dG9uc1tlXS52YWx1ZSxwcmVzc2VkOm4uYnV0dG9uc1tlXS5wcmVzc2VkfSksdC5zYXZlX2NoYW5nZXMoKX0pLHRoaXMuZ2V0KCJheGVzIikuZm9yRWFjaChmdW5jdGlvbih0LGUpe3Quc2V0KCJ2YWx1ZSIsbi5heGVzW2VdKSx0LnNhdmVfY2hhbmdlcygpfSksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZV9sb29wLmJpbmQodGhpcykpKTp0aGlzLnJlc2V0X2dhbWVwYWQoKX0sZS5wcm90b3R5cGUucmVzZXRfZ2FtZXBhZD1mdW5jdGlvbigpe3RoaXMuZ2V0KCJidXR0b25zIikuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNsb3NlKCl9KSx0aGlzLmdldCgiYXhlcyIpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jbG9zZSgpfSksdGhpcy5zZXQoe25hbWU6IiIsbWFwcGluZzoiIixjb25uZWN0ZWQ6ITEsdGltZXN0YW1wOjAsYnV0dG9uczpbXSxheGVzOltdfSksdGhpcy5zYXZlX2NoYW5nZXMoKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMud2FpdF9sb29wLmJpbmQodGhpcykpfSxlLnByb3RvdHlwZS5fY3JlYXRlX2J1dHRvbl9tb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWRnZXRfbWFuYWdlci5uZXdfd2lkZ2V0KHttb2RlbF9uYW1lOiJDb250cm9sbGVyQnV0dG9uTW9kZWwiLG1vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9jb250cm9scyIsbW9kZWxfbW9kdWxlX3ZlcnNpb246dGhpcy5nZXQoIl9tb2RlbF9tb2R1bGVfdmVyc2lvbiIpLHZpZXdfbmFtZToiQ29udHJvbGxlckJ1dHRvblZpZXciLHZpZXdfbW9kdWxlOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIix2aWV3X21vZHVsZV92ZXJzaW9uOnRoaXMuZ2V0KCJfdmlld19tb2R1bGVfdmVyc2lvbiIpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXQoImRlc2NyaXB0aW9uIix0KSxlfSl9LGUucHJvdG90eXBlLl9jcmVhdGVfYXhpc19tb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWRnZXRfbWFuYWdlci5uZXdfd2lkZ2V0KHttb2RlbF9uYW1lOiJDb250cm9sbGVyQXhpc01vZGVsIixtb2RlbF9tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLG1vZGVsX21vZHVsZV92ZXJzaW9uOnRoaXMuZ2V0KCJfbW9kZWxfbW9kdWxlX3ZlcnNpb24iKSx2aWV3X25hbWU6IkNvbnRyb2xsZXJBeGlzVmlldyIsdmlld19tb2R1bGU6IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHMiLHZpZXdfbW9kdWxlX3ZlcnNpb246dGhpcy5nZXQoIl92aWV3X21vZHVsZV92ZXJzaW9uIil9KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNldCgiZGVzY3JpcHRpb24iLHQpLGV9KX0sZS5zZXJpYWxpemVycz1vKHt9LHMuQ29yZURPTVdpZGdldE1vZGVsLnNlcmlhbGl6ZXJzLHtidXR0b25zOntkZXNlcmlhbGl6ZTphLnVucGFja19tb2RlbHN9LGF4ZXM6e2Rlc2VyaWFsaXplOmEudW5wYWNrX21vZGVsc319KSxlfShzLkNvcmVET01XaWRnZXRNb2RlbCk7ZS5Db250cm9sbGVyTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5idXR0b25fdmlld3M9bmV3IGEuVmlld0xpc3QodGhpcy5hZGRfYnV0dG9uLG51bGwsdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6YnV0dG9ucyIsZnVuY3Rpb24odCxlKXt0aGlzLmJ1dHRvbl92aWV3cy51cGRhdGUoZSl9KSx0aGlzLmF4aXNfdmlld3M9bmV3IGEuVmlld0xpc3QodGhpcy5hZGRfYXhpcyxudWxsLHRoaXMpLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOmF4ZXMiLGZ1bmN0aW9uKHQsZSl7dGhpcy5heGlzX3ZpZXdzLnVwZGF0ZShlKX0pLHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwiY2hhbmdlOm5hbWUiLHRoaXMudXBkYXRlX2xhYmVsKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1jb250cm9sbGVyIiksdGhpcy5ib3g9dGhpcy5lbCx0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuYm94LmFwcGVuZENoaWxkKHRoaXMubGFiZWwpLHRoaXMuYXhpc19ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5heGlzX2JveC5zdHlsZS5kaXNwbGF5PSJmbGV4Iix0aGlzLmJveC5hcHBlbmRDaGlsZCh0aGlzLmF4aXNfYm94KSx0aGlzLmJ1dHRvbl9ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5idXR0b25fYm94LnN0eWxlLmRpc3BsYXk9ImZsZXgiLHRoaXMuYm94LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uX2JveCksdGhpcy5idXR0b25fdmlld3MudXBkYXRlKHRoaXMubW9kZWwuZ2V0KCJidXR0b25zIikpLHRoaXMuYXhpc192aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImF4ZXMiKSksdGhpcy51cGRhdGVfbGFiZWwoKX0sZS5wcm90b3R5cGUudXBkYXRlX2xhYmVsPWZ1bmN0aW9uKCl7dGhpcy5sYWJlbC50ZXh0Q29udGVudD10aGlzLm1vZGVsLmdldCgibmFtZSIpfHx0aGlzLm1vZGVsLnJlYWRvdXR9LGUucHJvdG90eXBlLmFkZF9idXR0b249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmJ1dHRvbl9ib3guYXBwZW5kQ2hpbGQobiksdGhpcy5jcmVhdGVfY2hpbGRfdmlldyh0KS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBlLmJ1dHRvbl9ib3gucmVwbGFjZUNoaWxkKHQuZWwsbiksZS5kaXNwbGF5ZWQudGhlbihmdW5jdGlvbigpe3QudHJpZ2dlcigiZGlzcGxheWVkIixlKX0pLHR9KS5jYXRjaChjLnJlamVjdCgiQ291bGQgbm90IGFkZCBidXR0b24gdmlldyIsITApKX0sZS5wcm90b3R5cGUuYWRkX2F4aXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmF4aXNfYm94LmFwcGVuZENoaWxkKG4pLHRoaXMuY3JlYXRlX2NoaWxkX3ZpZXcodCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gZS5heGlzX2JveC5yZXBsYWNlQ2hpbGQodC5lbCxuKSxlLmRpc3BsYXllZC50aGVuKGZ1bmN0aW9uKCl7dC50cmlnZ2VyKCJkaXNwbGF5ZWQiLGUpfSksdH0pLmNhdGNoKGMucmVqZWN0KCJDb3VsZCBub3QgYWRkIGF4aXMgdmlldyIsITApKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyksdGhpcy5idXR0b25fdmlld3MucmVtb3ZlKCksdGhpcy5heGlzX3ZpZXdzLnJlbW92ZSgpfSxlfShhLkRPTVdpZGdldFZpZXcpO2UuQ29udHJvbGxlclZpZXc9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fE9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTIpLGE9bigyMyksdT1uKDE2KSxjPW4oNiksaD1uKDE2KSxsPW4oMTUpO3ZhciBkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0aW9uTW9kZWwiLGluZGV4OiIiLF9vcHRpb25zX2xhYmVsczpbXSxkaXNhYmxlZDohMX0pfSxlfShzLkNvcmVEZXNjcmlwdGlvbk1vZGVsKTtlLlNlbGVjdGlvbk1vZGVsPWQ7dmFyIGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJEcm9wZG93bk1vZGVsIixfdmlld19uYW1lOiJEcm9wZG93blZpZXciLGJ1dHRvbl9zdHlsZToiIn0pfSxlfShkKTtlLkRyb3Bkb3duTW9kZWw9Zjt2YXIgcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfb3B0aW9uc19sYWJlbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uX3VwZGF0ZU9wdGlvbnMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtZHJvcGRvd24iKSx0aGlzLmxpc3Rib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksdGhpcy5saXN0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj11LnV1aWQoKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMubGlzdGJveCksdGhpcy5fdXBkYXRlT3B0aW9ucygpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlzdGJveC5kaXNhYmxlZD10aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKTt2YXIgZT10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTtyZXR1cm4gdGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXg9bnVsbD09PWU/LTE6ZSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuX3VwZGF0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmxpc3Rib3gudGV4dENvbnRlbnQ9IiI7Zm9yKHZhciB0PXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0saT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnRleHRDb250ZW50PW4ucmVwbGFjZSgvIC9nLCLCoCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIixlbmNvZGVVUklDb21wb25lbnQobikpLGkudmFsdWU9bix0aGlzLmxpc3Rib3guYXBwZW5kQ2hpbGQoaSl9fSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNoYW5nZSBzZWxlY3QiOiJfaGFuZGxlX2NoYW5nZSJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NoYW5nZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuc2V0KCJpbmRleCIsLTE9PT10aGlzLmxpc3Rib3guc2VsZWN0ZWRJbmRleD9udWxsOnRoaXMubGlzdGJveC5zZWxlY3RlZEluZGV4KSx0aGlzLnRvdWNoKCl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLkRyb3Bkb3duVmlldz1wO3ZhciBtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbyh7fSx0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0TW9kZWwiLF92aWV3X25hbWU6IlNlbGVjdFZpZXciLHJvd3M6NX0pfSxlfShkKTtlLlNlbGVjdE1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X29wdGlvbnNfbGFiZWxzIixmdW5jdGlvbigpe3JldHVybiBuLl91cGRhdGVPcHRpb25zKCl9KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTppbmRleCIsZnVuY3Rpb24odCxlLGkpe3JldHVybiBuLnVwZGF0ZVNlbGVjdGlvbihpKX0pLHRoaXMubGlzdGJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXNlbGVjdCIpLHRoaXMubGlzdGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9dS51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmxpc3Rib3gpLHRoaXMuX3VwZGF0ZU9wdGlvbnMoKSx0aGlzLnVwZGF0ZSgpLHRoaXMudXBkYXRlU2VsZWN0aW9uKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpLHRoaXMubGlzdGJveC5kaXNhYmxlZD10aGlzLm1vZGVsLmdldCgiZGlzYWJsZWQiKTt2YXIgZT10aGlzLm1vZGVsLmdldCgicm93cyIpO251bGw9PT1lJiYoZT0iIiksdGhpcy5saXN0Ym94LnNldEF0dHJpYnV0ZSgic2l6ZSIsZSl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10JiYodD17fSksdC51cGRhdGVkX3ZpZXchPT10aGlzKXt2YXIgZT10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTt0aGlzLmxpc3Rib3guc2VsZWN0ZWRJbmRleD1udWxsPT09ZT8tMTplfX0sZS5wcm90b3R5cGUuX3VwZGF0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmxpc3Rib3gudGV4dENvbnRlbnQ9IiI7Zm9yKHZhciB0PXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0saT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtpLnRleHRDb250ZW50PW4ucmVwbGFjZSgvIC9nLCLCoCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIixlbmNvZGVVUklDb21wb25lbnQobikpLGkudmFsdWU9bix0aGlzLmxpc3Rib3guYXBwZW5kQ2hpbGQoaSl9fSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNoYW5nZSBzZWxlY3QiOiJfaGFuZGxlX2NoYW5nZSJ9fSxlLnByb3RvdHlwZS5faGFuZGxlX2NoYW5nZT1mdW5jdGlvbigpe3RoaXMubW9kZWwuc2V0KCJpbmRleCIsdGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXgse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5TZWxlY3RWaWV3PWc7dmFyIHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJSYWRpb0J1dHRvbnNNb2RlbCIsX3ZpZXdfbmFtZToiUmFkaW9CdXR0b25zVmlldyIsdG9vbHRpcHM6W10saWNvbnM6W10sYnV0dG9uX3N0eWxlOiIifSl9LGV9KGQpO2UuUmFkaW9CdXR0b25zTW9kZWw9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1yYWRpbyIpLHRoaXMuY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpLHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndpZGdldC1yYWRpby1ib3giKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxpPXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKSxyPWMucGx1Y2sodGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0icmFkaW8iXScpLCJ2YWx1ZSIpLG89aS5sZW5ndGghPXIubGVuZ3RoO2lmKCFvKWZvcih2YXIgcz0wLGE9aS5sZW5ndGg7czxhOysrcylpZihyW3NdIT09aVtzXSl7bz0hMDticmVha31yZXR1cm4hb3x8dm9pZCAwIT09ZSYmZS51cGRhdGVkX3ZpZXc9PT10aGlzfHwodGhpcy5jb250YWluZXIudGV4dENvbnRlbnQ9IiIsaS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtpLnRleHRDb250ZW50PXQsbi5jb250YWluZXIuYXBwZW5kQ2hpbGQoaSk7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksci52YWx1ZT1lLnRvU3RyaW5nKCksci5zZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiLGVuY29kZVVSSUNvbXBvbmVudCh0KSksaS5hcHBlbmRDaGlsZChyKX0pKSxpLmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgaT0naW5wdXRbZGF0YS12YWx1ZT0iJytlbmNvZGVVUklDb21wb25lbnQodCkrJyJdJyxyPW4uY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7aWYoci5sZW5ndGg+MCl7dmFyIG89clswXTtvLmNoZWNrZWQ9bi5tb2RlbC5nZXQoImluZGV4Iik9PT1lLG8uZGlzYWJsZWQ9bi5tb2RlbC5nZXQoImRpc2FibGVkIil9fSksc2V0VGltZW91dCh0aGlzLmFkanVzdFBhZGRpbmcsMCx0aGlzKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5hZGp1c3RQYWRkaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuZWwpLG49cGFyc2VJbnQoZS5tYXJnaW5Ub3ApK3BhcnNlSW50KGUubWFyZ2luQm90dG9tKSxpPXQubGFiZWwub2Zmc2V0SGVpZ2h0K24scj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmNvbnRhaW5lciksbz1wYXJzZUludChyLm1hcmdpbkJvdHRvbSkscz0odC5lbC5vZmZzZXRIZWlnaHQrbi1vKSVpLGE9MD09cz8wOmktczt0LmNvbnRhaW5lci5zdHlsZS5tYXJnaW5Cb3R0b209YSsicHgifSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57J2NsaWNrIGlucHV0W3R5cGU9InJhZGlvIl0nOiJfaGFuZGxlX2NsaWNrIn19LGUucHJvdG90eXBlLl9oYW5kbGVfY2xpY2s9ZnVuY3Rpb24odCl7dGhpcy5tb2RlbC5zZXQoImluZGV4IixwYXJzZUludCh0LnRhcmdldC52YWx1ZSkse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5SYWRpb0J1dHRvbnNWaWV3PWI7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiVG9nZ2xlQnV0dG9uc1N0eWxlTW9kZWwifSl9LGUuc3R5bGVQcm9wZXJ0aWVzPW8oe30sYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwuc3R5bGVQcm9wZXJ0aWVzLHtidXR0b25fd2lkdGg6e3NlbGVjdG9yOiIud2lkZ2V0LXRvZ2dsZS1idXR0b24iLGF0dHJpYnV0ZToid2lkdGgiLGRlZmF1bHQ6bnVsbH0sZm9udF93ZWlnaHQ6e3NlbGVjdG9yOiIud2lkZ2V0LXRvZ2dsZS1idXR0b24iLGF0dHJpYnV0ZToiZm9udC13ZWlnaHQiLGRlZmF1bHQ6IiJ9fSksZX0oYS5EZXNjcmlwdGlvblN0eWxlTW9kZWwpO2UuVG9nZ2xlQnV0dG9uc1N0eWxlTW9kZWw9eTt2YXIgXz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlRvZ2dsZUJ1dHRvbnNNb2RlbCIsX3ZpZXdfbmFtZToiVG9nZ2xlQnV0dG9uc1ZpZXcifSl9LGV9KGQpO2UuVG9nZ2xlQnV0dG9uc01vZGVsPV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3RoaXMuX2Nzc19zdGF0ZT17fSx0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpidXR0b25fc3R5bGUiLHRoaXMudXBkYXRlX2J1dHRvbl9zdHlsZSl9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10b2dnbGUtYnV0dG9ucyIpLHRoaXMuYnV0dG9uZ3JvdXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvbmdyb3VwKSx0aGlzLnVwZGF0ZSgpLHRoaXMuc2V0X2J1dHRvbl9zdHlsZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24obil7Zm9yKHZhciBpPXRoaXMscj10aGlzLm1vZGVsLmdldCgiX29wdGlvbnNfbGFiZWxzIiksbz10aGlzLm1vZGVsLmdldCgiaWNvbnMiKXx8W10scz10aGlzLm1vZGVsLnByZXZpb3VzKCJpY29ucyIpfHxbXSxhPWUuY2xhc3NNYXBbdGhpcy5tb2RlbC5wcmV2aW91cygiYnV0dG9uX3N0eWxlIildfHwiIix1PWkubW9kZWwuZ2V0KCJ0b29sdGlwcyIpfHxbXSxsPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpLGQ9dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSxmPWMucGx1Y2soZCwidmFsdWUiKSxwPSExLG09MCxnPXIubGVuZ3RoO208ZzsrK20paWYoZlttXSE9PXJbbV18fG9bbV0hPT1zW21dKXtwPSEwO2JyZWFrfXJldHVybiFwfHx2b2lkIDAhPT1uJiZuLnVwZGF0ZWRfdmlldz09PXRoaXN8fCh0aGlzLmJ1dHRvbmdyb3VwLnRleHRDb250ZW50PSIiLHIuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuO249MD09PXQudHJpbSgpLmxlbmd0aCYmKCFvW2VdfHwwPT09b1tlXS50cmltKCkubGVuZ3RoKT8iJm5ic3A7IjpoLmVzY2FwZV9odG1sKHQpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImkiKSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO29bZV0mJihyLmNsYXNzTmFtZT0iZmEgZmEtIitvW2VdKSxzLnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpLHMuY2xhc3NOYW1lPSJ3aWRnZXQtdG9nZ2xlLWJ1dHRvbiBqdXB5dGVyLWJ1dHRvbiIsYSYmcy5jbGFzc0xpc3QuYWRkKGEpLHMuaW5uZXJIVE1MPW4scy5zZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiLGVuY29kZVVSSUNvbXBvbmVudCh0KSkscy5zZXRBdHRyaWJ1dGUoInZhbHVlIixlLnRvU3RyaW5nKCkpLHMuYXBwZW5kQ2hpbGQocikscy5kaXNhYmxlZD1sLHVbZV0mJnMuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdVtlXSksaS51cGRhdGVfc3R5bGVfdHJhaXRzKHMpLGkuYnV0dG9uZ3JvdXAuYXBwZW5kQ2hpbGQocyl9KSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49J1tkYXRhLXZhbHVlPSInK2VuY29kZVVSSUNvbXBvbmVudCh0KSsnIl0nLHI9aS5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yKG4pO2kubW9kZWwuZ2V0KCJpbmRleCIpPT09ZT9yLmNsYXNzTGlzdC5hZGQoIm1vZC1hY3RpdmUiKTpyLmNsYXNzTGlzdC5yZW1vdmUoIm1vZC1hY3RpdmUiKX0pLHRoaXMuc3R5bGVQcm9taXNlLnRoZW4oZnVuY3Rpb24odCl7dCYmdC5zdHlsZSgpfSksdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxuKX0sZS5wcm90b3R5cGUudXBkYXRlX3N0eWxlX3RyYWl0cz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fY3NzX3N0YXRlKWlmKHRoaXMuX2Nzc19zdGF0ZS5oYXNPd25Qcm9wZXJ0eShlKSlpZigibWFyZ2luIj09PWUpdGhpcy5idXR0b25ncm91cC5zdHlsZVtlXT10aGlzLl9jc3Nfc3RhdGVbZV07ZWxzZSBpZigid2lkdGgiIT09ZSlpZih0KXQuc3R5bGVbZV09dGhpcy5fY3NzX3N0YXRlW2VdO2Vsc2V7dmFyIG49dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKTtuLmxlbmd0aCYmKG5bMF0uc3R5bGVbZV09dGhpcy5fY3NzX3N0YXRlW2VdKX19LGUucHJvdG90eXBlLnVwZGF0ZV9idXR0b25fc3R5bGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idXR0b25ncm91cC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSxuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy51cGRhdGVfbWFwcGVkX2NsYXNzZXMoZS5jbGFzc01hcCwiYnV0dG9uX3N0eWxlIix0W25dKX0sZS5wcm90b3R5cGUuc2V0X2J1dHRvbl9zdHlsZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1dHRvbmdyb3VwLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbiIpLG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLnNldF9tYXBwZWRfY2xhc3NlcyhlLmNsYXNzTWFwLCJidXR0b25fc3R5bGUiLHRbbl0pfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImNsaWNrIGJ1dHRvbiI6Il9oYW5kbGVfY2xpY2sifX0sZS5wcm90b3R5cGUuX2hhbmRsZV9jbGljaz1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLnNldCgiaW5kZXgiLHBhcnNlSW50KHQudGFyZ2V0LnZhbHVlKSx7dXBkYXRlZF92aWV3OnRoaXN9KSx0aGlzLnRvdWNoKCksdGhpcy5zZW5kKHtldmVudDoiY2xpY2sifSl9LGV9KGEuRGVzY3JpcHRpb25WaWV3KTtlLlRvZ2dsZUJ1dHRvbnNWaWV3PXcsZnVuY3Rpb24odCl7dC5jbGFzc01hcD17cHJpbWFyeTpbIm1vZC1wcmltYXJ5Il0sc3VjY2VzczpbIm1vZC1zdWNjZXNzIl0saW5mbzpbIm1vZC1pbmZvIl0sd2FybmluZzpbIm1vZC13YXJuaW5nIl0sZGFuZ2VyOlsibW9kLWRhbmdlciJdfX0odz1lLlRvZ2dsZUJ1dHRvbnNWaWV3fHwoZS5Ub2dnbGVCdXR0b25zVmlldz17fSkpLGUuVG9nZ2xlQnV0dG9uc1ZpZXc9dzt2YXIgeD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdGlvblNsaWRlck1vZGVsIixfdmlld19uYW1lOiJTZWxlY3Rpb25TbGlkZXJWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmVhZG91dDohMCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShkKTtlLlNlbGVjdGlvblNsaWRlck1vZGVsPXg7dmFyIE09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1oc2xpZGVyIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtc2xpZGVyIiksKHRoaXMuJHNsaWRlcj1sKCI8ZGl2IC8+IikpLnNsaWRlcih7c2xpZGU6dGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UuYmluZCh0aGlzKSxzdG9wOnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZC5iaW5kKHRoaXMpfSkuYWRkQ2xhc3MoInNsaWRlciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWRlcl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgic2xpZGVyLWNvbnRhaW5lciIpLHRoaXMuc2xpZGVyX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzbGlkZXJbMF0pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJfY29udGFpbmVyKSx0aGlzLnJlYWRvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnJlYWRvdXQpLHRoaXMucmVhZG91dC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtcmVhZG91dCIpLHRoaXMucmVhZG91dC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpzbGlkZXJfY29sb3IiLGZ1bmN0aW9uKHQsbil7ZS4kc2xpZGVyLmZpbmQoImEiKS5jc3MoImJhY2tncm91bmQiLG4pfSksdGhpcy4kc2xpZGVyLmZpbmQoImEiKS5jc3MoImJhY2tncm91bmQiLHRoaXMubW9kZWwuZ2V0KCJzbGlkZXJfY29sb3IiKSksdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWV8fGUudXBkYXRlZF92aWV3IT09dGhpcyl7dmFyIG49dGhpcy5tb2RlbC5nZXQoIl9vcHRpb25zX2xhYmVscyIpLmxlbmd0aC0xO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInN0ZXAiLDEpLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsIm1heCIsbiksdGhpcy4kc2xpZGVyLnNsaWRlcigib3B0aW9uIiwibWluIiwwKTt2YXIgaT10aGlzLm1vZGVsLmdldCgib3JpZW50YXRpb24iKTt0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIsMCksdGhpcy4kc2xpZGVyLnNsaWRlcigib3B0aW9uIiwib3JpZW50YXRpb24iLGkpO3ZhciByPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsImRpc2FibGVkIixyKSx0aGlzLnJlYWRvdXQuY29udGVudEVkaXRhYmxlPXI/ImZhbHNlIjoidHJ1ZSIsInZlcnRpY2FsIj09PWk/KHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWhzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXZzbGlkZXIiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtdmJveCIpKToodGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCJ3aWRnZXQtdnNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgid2lkZ2V0LWlubGluZS12Ym94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHNsaWRlciIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IikpO3ZhciBvPXRoaXMubW9kZWwuZ2V0KCJyZWFkb3V0Iik7dGhpcy5yZWFkb3V0LnN0eWxlLmRpc3BsYXk9bz8iIjoibm9uZSIsdGhpcy51cGRhdGVTZWxlY3Rpb24oKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlOiJoYW5kbGVTbGlkZXJDaGFuZ2UiLHNsaWRlc3RvcDoiaGFuZGxlU2xpZGVyQ2hhbmdlZCJ9fSxlLnByb3RvdHlwZS51cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiaW5kZXgiKTt0aGlzLiRzbGlkZXIuc2xpZGVyKCJvcHRpb24iLCJ2YWx1ZSIsdCksdGhpcy51cGRhdGVSZWFkb3V0KHQpfSxlLnByb3RvdHlwZS51cGRhdGVSZWFkb3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWwuZ2V0KCJfb3B0aW9uc19sYWJlbHMiKVt0XTt0aGlzLnJlYWRvdXQudGV4dENvbnRlbnQ9ZX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlPWZ1bmN0aW9uKHQsZSl7dGhpcy51cGRhdGVSZWFkb3V0KGUudmFsdWUpLHRoaXMubW9kZWwuZ2V0KCJjb250aW51b3VzX3VwZGF0ZSIpJiZ0aGlzLmhhbmRsZVNsaWRlckNoYW5nZWQodCxlKX0sZS5wcm90b3R5cGUuaGFuZGxlU2xpZGVyQ2hhbmdlZD1mdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlUmVhZG91dChlLnZhbHVlKSx0aGlzLm1vZGVsLnNldCgiaW5kZXgiLGUudmFsdWUse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShhLkRlc2NyaXB0aW9uVmlldyk7ZS5TZWxlY3Rpb25TbGlkZXJWaWV3PU07dmFyIFM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJNdWx0aXBsZVNlbGVjdGlvbk1vZGVsIn0pfSxlfShkKTtlLk11bHRpcGxlU2VsZWN0aW9uTW9kZWw9Uzt2YXIgRT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdE11bHRpcGxlTW9kZWwiLF92aWV3X25hbWU6IlNlbGVjdE11bHRpcGxlVmlldyIscm93czpudWxsfSl9LGV9KFMpO2UuU2VsZWN0TXVsdGlwbGVNb2RlbD1FO3ZhciBBPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmxpc3Rib3gubXVsdGlwbGU9ITB9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LXNlbGVjdC1tdWx0aXBsZSIpfSxlLnByb3RvdHlwZS51cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9e30pLHQudXBkYXRlZF92aWV3IT09dGhpcyl7dmFyIGU9dGhpcy5tb2RlbC5nZXQoImluZGV4Iil8fFtdLG49dGhpcy5saXN0Ym94Lm9wdGlvbnM7dGhpcy5saXN0Ym94LnNlbGVjdGVkSW5kZXg9LTEsZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF0uc2VsZWN0ZWQ9ITB9KX19LGUucHJvdG90eXBlLl9oYW5kbGVfY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHRoaXMubGlzdGJveC5zZWxlY3RlZE9wdGlvbnN8fFtdLGZ1bmN0aW9uKHQpe3JldHVybiB0LmluZGV4fSk7dGhpcy5tb2RlbC5zZXQoImluZGV4Iix0LHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0oZyk7ZS5TZWxlY3RNdWx0aXBsZVZpZXc9QTt2YXIgQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8oe30sdC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlNlbGVjdGlvblNsaWRlck1vZGVsIixfdmlld19uYW1lOiJTZWxlY3Rpb25TbGlkZXJWaWV3IixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmVhZG91dDohMCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShTKTtlLlNlbGVjdGlvblJhbmdlU2xpZGVyTW9kZWw9Qzt2YXIgaz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInJhbmdlIiwhMCl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0KCJpbmRleCIpO3RoaXMuJHNsaWRlci5zbGlkZXIoIm9wdGlvbiIsInZhbHVlcyIsdC5zbGljZSgpKSx0aGlzLnVwZGF0ZVJlYWRvdXQodCl9LGUucHJvdG90eXBlLnVwZGF0ZVJlYWRvdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbC5nZXQoIl9vcHRpb25zX2xhYmVscyIpLG49ZVt0WzBdXSxpPWVbdFsxXV07dGhpcy5yZWFkb3V0LnRleHRDb250ZW50PW4rIi0iK2l9LGUucHJvdG90eXBlLmhhbmRsZVNsaWRlckNoYW5nZT1mdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlUmVhZG91dChlLnZhbHVlcyksdGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlZCh0LGUpfSxlLnByb3RvdHlwZS5oYW5kbGVTbGlkZXJDaGFuZ2VkPWZ1bmN0aW9uKHQsZSl7dGhpcy51cGRhdGVSZWFkb3V0KGUudmFsdWVzKSx0aGlzLm1vZGVsLnNldCgiaW5kZXgiLGUudmFsdWVzLnNsaWNlKCkse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShNKTtlLlNlbGVjdGlvblJhbmdlU2xpZGVyVmlldz1rfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDgpLHM9bigxMzYpLGE9bigzNTUpLHU9bigzNTYpLGM9bigzOSksaD1uKDIpLGw9big1KSxkPW4oNiksZj1uKDE2KSxwPW4oMTUpLG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiU2VsZWN0aW9uQ29udGFpbmVyTW9kZWwiLHNlbGVjdGVkX2luZGV4OjAsX3RpdGxlczp7fX0pfSxlfShzLkJveE1vZGVsKTtlLlNlbGVjdGlvbkNvbnRhaW5lck1vZGVsPW07dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBkLmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfbW9kZWxfbmFtZToiQWNjb3JkaW9uTW9kZWwiLF92aWV3X25hbWU6IkFjY29yZGlvblZpZXcifSl9LGV9KG0pO2UuQWNjb3JkaW9uTW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXRoaXMsaT1lLnZpZXc7cmV0dXJuIGRlbGV0ZSBlLnZpZXcsKG49dC5jYWxsKHRoaXMsZSl8fHRoaXMpLl92aWV3PWksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnByb2Nlc3NNZXNzYWdlLmNhbGwodGhpcyxlKSx0aGlzLl92aWV3LnByb2Nlc3NQaG9zcGhvck1lc3NhZ2UoZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlfSh1LkFjY29yZGlvbik7ZS5KdXB5dGVyUGhvc3Bob3JBY2NvcmRpb25XaWRnZXQ9djt2YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBXaWRnZXQ9bmV3IHYoe3ZpZXc6dGhpc30pLHRoaXMucFdpZGdldC5ub2RlfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLmVsfHx0IT09dGhpcy5wV2lkZ2V0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzZXQgdGhlIERPTSBlbGVtZW50LiIpO3RoaXMuZWw9dGhpcy5wV2lkZ2V0Lm5vZGUsdGhpcy4kZWw9cCh0aGlzLnBXaWRnZXQubm9kZSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuX3ZpZXdzPW5ldyBvLlZpZXdMaXN0KHRoaXMuYWRkX2NoaWxkX3ZpZXcsdGhpcy5yZW1vdmVfY2hpbGRfdmlldyx0aGlzKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpjaGlsZHJlbiIsZnVuY3Rpb24oKXtyZXR1cm4gbi51cGRhdGVDaGlsZHJlbigpfSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6c2VsZWN0ZWRfaW5kZXgiLGZ1bmN0aW9uKCl7cmV0dXJuIG4udXBkYXRlX3NlbGVjdGVkX2luZGV4KCl9KSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpfdGl0bGVzIixmdW5jdGlvbigpe3JldHVybiBuLnVwZGF0ZV90aXRsZXMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpO3ZhciBuPXRoaXMucFdpZGdldDtuLmFkZENsYXNzKCJqdXB5dGVyLXdpZGdldHMiKSxuLmFkZENsYXNzKCJ3aWRnZXQtYWNjb3JkaW9uIiksbi5hZGRDbGFzcygid2lkZ2V0LWNvbnRhaW5lciIpLG4uc2VsZWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQuY29ubmVjdChmdW5jdGlvbih0KXtlLnVwZGF0aW5nQ2hpbGRyZW58fChlLm1vZGVsLnNldCgic2VsZWN0ZWRfaW5kZXgiLG4uc2VsZWN0aW9uLmluZGV4KSxlLnRvdWNoKCkpfSksdGhpcy5jaGlsZHJlbl92aWV3cy51cGRhdGUodGhpcy5tb2RlbC5nZXQoImNoaWxkcmVuIikpLHRoaXMudXBkYXRlX3RpdGxlcygpLHRoaXMudXBkYXRlX3NlbGVjdGVkX2luZGV4KCl9LGUucHJvdG90eXBlLnVwZGF0ZUNoaWxkcmVuPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGluZ0NoaWxkcmVuPSEwLHRoaXMucFdpZGdldC5zZWxlY3Rpb24uaW5kZXg9bnVsbCx0aGlzLmNoaWxkcmVuX3ZpZXdzLnVwZGF0ZSh0aGlzLm1vZGVsLmdldCgiY2hpbGRyZW4iKSksdGhpcy51cGRhdGVfc2VsZWN0ZWRfaW5kZXgoKSx0aGlzLnVwZGF0aW5nQ2hpbGRyZW49ITF9LGUucHJvdG90eXBlLnVwZGF0ZV90aXRsZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5wV2lkZ2V0LmNvbGxhcHNlV2lkZ2V0cyxlPXRoaXMubW9kZWwuZ2V0KCJfdGl0bGVzIiksbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMCE9PWVbbl0mJih0W25dLndpZGdldC50aXRsZS5sYWJlbD1lW25dKX0sZS5wcm90b3R5cGUudXBkYXRlX3NlbGVjdGVkX2luZGV4PWZ1bmN0aW9uKCl7dGhpcy5wV2lkZ2V0LnNlbGVjdGlvbi5pbmRleD10aGlzLm1vZGVsLmdldCgic2VsZWN0ZWRfaW5kZXgiKX0sZS5wcm90b3R5cGUucmVtb3ZlX2NoaWxkX3ZpZXc9ZnVuY3Rpb24odCl7dGhpcy5wV2lkZ2V0LnJlbW92ZVdpZGdldCh0LnBXaWRnZXQpLHQucmVtb3ZlKCl9LGUucHJvdG90eXBlLmFkZF9jaGlsZF92aWV3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wV2lkZ2V0LGk9bmV3IGMuV2lkZ2V0O3JldHVybiBpLnRpdGxlLmxhYmVsPXRoaXMubW9kZWwuZ2V0KCJfdGl0bGVzIilbZV18fCIiLG4uYWRkV2lkZ2V0KGkpLHRoaXMuY3JlYXRlX2NoaWxkX3ZpZXcodCkudGhlbihmdW5jdGlvbih0KXt2YXIgZT10LnBXaWRnZXQ7cmV0dXJuIGUudGl0bGUubGFiZWw9aS50aXRsZS5sYWJlbCxuLmNvbGxhcHNlV2lkZ2V0c1tuLmluZGV4T2YoaSldLndpZGdldD1lLGkuZGlzcG9zZSgpLHR9KS5jYXRjaChmLnJlamVjdCgiQ291bGQgbm90IGFkZCBjaGlsZCB2aWV3IHRvIGJveCIsITApKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbl92aWV3cz1udWxsLHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpfSxlfShvLkRPTVdpZGdldFZpZXcpO2UuQWNjb3JkaW9uVmlldz1iO3ZhciB5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X21vZGVsX25hbWU6IlRhYk1vZGVsIixfdmlld19uYW1lOiJUYWJWaWV3In0pfSxlfShtKTtlLlRhYk1vZGVsPXk7dmFyIF89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10aGlzLGk9ZS52aWV3O3JldHVybiBkZWxldGUgZS52aWV3LChuPXQuY2FsbCh0aGlzLGUpfHx0aGlzKS5fdmlldz1pLGwuTWVzc2FnZUxvb3AuaW5zdGFsbE1lc3NhZ2VIb29rKG4udGFiQ29udGVudHMsZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5fdmlldy5wcm9jZXNzUGhvc3Bob3JNZXNzYWdlKGUpLCEwfSksbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdmlldyYmdGhpcy5fdmlldy5yZW1vdmUoKSx0aGlzLl92aWV3PW51bGwpfSxlfShhLlRhYlBhbmVsKTtlLkp1cHl0ZXJQaG9zcGhvclRhYlBhbmVsV2lkZ2V0PV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS51cGRhdGluZ1RhYnM9ITEsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBXaWRnZXQ9bmV3IF8oe3ZpZXc6dGhpc30pLHRoaXMucFdpZGdldC5ub2RlfSxlLnByb3RvdHlwZS5fc2V0RWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLmVsfHx0IT09dGhpcy5wV2lkZ2V0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzZXQgdGhlIERPTSBlbGVtZW50LiIpO3RoaXMuZWw9dGhpcy5wV2lkZ2V0Lm5vZGUsdGhpcy4kZWw9cCh0aGlzLnBXaWRnZXQubm9kZSl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxlKSx0aGlzLmNoaWxkcmVuVmlld3M9bmV3IG8uVmlld0xpc3QodGhpcy5hZGRDaGlsZFZpZXcsZnVuY3Rpb24odCl7dC5yZW1vdmUoKX0sdGhpcyksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6Y2hpbGRyZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4udXBkYXRlVGFicygpfSksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6X3RpdGxlcyIsZnVuY3Rpb24oKXtyZXR1cm4gbi51cGRhdGVUaXRsZXMoKX0pfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKTt2YXIgZT10aGlzLnBXaWRnZXQ7ZS5hZGRDbGFzcygianVweXRlci13aWRnZXRzIiksZS5hZGRDbGFzcygid2lkZ2V0LWNvbnRhaW5lciIpLGUuYWRkQ2xhc3MoIndpZGdldC10YWIiKSxlLnRhYnNNb3ZhYmxlPSEwLGUudGFiQmFyLmluc2VydEJlaGF2aW9yPSJub25lIixlLnRhYkJhci5jdXJyZW50Q2hhbmdlZC5jb25uZWN0KHRoaXMuX29uVGFiQ2hhbmdlZCx0aGlzKSxlLnRhYkJhci50YWJNb3ZlZC5jb25uZWN0KHRoaXMuX29uVGFiTW92ZWQsdGhpcyksZS50YWJCYXIuYWRkQ2xhc3MoIndpZGdldC10YWItYmFyIiksZS50YWJDb250ZW50cy5hZGRDbGFzcygid2lkZ2V0LXRhYi1jb250ZW50cyIpLGUudGFiQmFyLnRhYnNNb3ZhYmxlPSExLHRoaXMudXBkYXRlVGFicygpLHRoaXMudXBkYXRlKCl9LGUucHJvdG90eXBlLnVwZGF0ZVRhYnM9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0aW5nVGFicz0hMCx0aGlzLnBXaWRnZXQuY3VycmVudEluZGV4PW51bGwsdGhpcy5jaGlsZHJlblZpZXdzLnVwZGF0ZSh0aGlzLm1vZGVsLmdldCgiY2hpbGRyZW4iKSksdGhpcy5wV2lkZ2V0LmN1cnJlbnRJbmRleD10aGlzLm1vZGVsLmdldCgic2VsZWN0ZWRfaW5kZXgiKSx0aGlzLnVwZGF0aW5nVGFicz0hMX0sZS5wcm90b3R5cGUuYWRkQ2hpbGRWaWV3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5tb2RlbC5nZXQoIl90aXRsZXMiKVtlXXx8IiIsaT10aGlzLnBXaWRnZXQscj1uZXcgYy5XaWRnZXQ7cmV0dXJuIHIudGl0bGUubGFiZWw9bixpLmFkZFdpZGdldChyKSx0aGlzLmNyZWF0ZV9jaGlsZF92aWV3KHQpLnRoZW4oZnVuY3Rpb24odCl7dmFyIGU9dC5wV2lkZ2V0O2UudGl0bGUubGFiZWw9ci50aXRsZS5sYWJlbCxlLnRpdGxlLmNsb3NhYmxlPSExO3ZhciBuPWguQXJyYXlFeHQuZmlyc3RJbmRleE9mKGkud2lkZ2V0cyxyKTtyZXR1cm4gaS5pbnNlcnRXaWRnZXQobisxLGUpLHIuZGlzcG9zZSgpLHR9KS5jYXRjaChmLnJlamVjdCgiQ291bGQgbm90IGFkZCBjaGlsZCB2aWV3IHRvIGJveCIsITApKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleCgpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS51cGRhdGVUaXRsZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLmdldCgiX3RpdGxlcyIpfHx7fTtoLmVhY2godGhpcy5wV2lkZ2V0LndpZGdldHMsZnVuY3Rpb24oZSxuKXtlLnRpdGxlLmxhYmVsPXRbbl18fCIifSl9LGUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24oKXt0aGlzLnBXaWRnZXQuY3VycmVudEluZGV4PXRoaXMubW9kZWwuZ2V0KCJzZWxlY3RlZF9pbmRleCIpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkcmVuVmlld3M9bnVsbCx0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuX29uVGFiQ2hhbmdlZD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLnVwZGF0aW5nVGFicyl7dmFyIG49ZS5jdXJyZW50SW5kZXg7dGhpcy5tb2RlbC5zZXQoInNlbGVjdGVkX2luZGV4IiwtMT09PW4/bnVsbDpuKSx0aGlzLnRvdWNoKCl9fSxlLnByb3RvdHlwZS5fb25UYWJNb3ZlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJjaGlsZHJlbiIpLnNsaWNlKCk7aC5BcnJheUV4dC5tb3ZlKG4sZS5mcm9tSW5kZXgsZS50b0luZGV4KSx0aGlzLm1vZGVsLnNldCgiY2hpbGRyZW4iLG4pLHRoaXMudG91Y2goKX0sZX0oby5ET01XaWRnZXRWaWV3KTtlLlRhYlZpZXc9d30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big1KSxzPW4oMTEpLGE9big5KSx1PW4oMzkpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fd2lkZ2V0UmVtb3ZlZD1uZXcgcy5TaWduYWwoZSksZX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwid2lkZ2V0UmVtb3ZlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWRnZXRSZW1vdmVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm9uQ2hpbGRSZW1vdmVkPWZ1bmN0aW9uKHQpe3RoaXMuX3dpZGdldFJlbW92ZWQuZW1pdCh0LmNoaWxkKX0sZX0odS5QYW5lbCk7ZS5FdmVudGVkUGFuZWw9Yzt2YXIgaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fY3VycmVudENoYW5nZWQ9bmV3IHMuU2lnbmFsKG4pLG4uYWRkQ2xhc3MoInAtVGFiUGFuZWwiKSxuLnRhYkJhcj1uZXcgdS5UYWJCYXIoZSksbi50YWJCYXIuYWRkQ2xhc3MoInAtVGFiUGFuZWwtdGFiQmFyIiksbi50YWJDb250ZW50cz1uZXcgYyxuLnRhYkNvbnRlbnRzLmFkZENsYXNzKCJwLVRhYlBhbmVsLXRhYkNvbnRlbnRzIiksbi50YWJCYXIudGFiTW92ZWQuY29ubmVjdChuLl9vblRhYk1vdmVkLG4pLG4udGFiQmFyLmN1cnJlbnRDaGFuZ2VkLmNvbm5lY3Qobi5fb25DdXJyZW50Q2hhbmdlZCxuKSxuLnRhYkJhci50YWJDbG9zZVJlcXVlc3RlZC5jb25uZWN0KG4uX29uVGFiQ2xvc2VSZXF1ZXN0ZWQsbiksbi50YWJCYXIudGFiQWN0aXZhdGVSZXF1ZXN0ZWQuY29ubmVjdChuLl9vblRhYkFjdGl2YXRlUmVxdWVzdGVkLG4pLG4udGFiQ29udGVudHMud2lkZ2V0UmVtb3ZlZC5jb25uZWN0KG4uX29uV2lkZ2V0UmVtb3ZlZCxuKTt2YXIgaT1uZXcgdS5QYW5lbExheW91dDtyZXR1cm4gaS5hZGRXaWRnZXQobi50YWJCYXIpLGkuYWRkV2lkZ2V0KG4udGFiQ29udGVudHMpLG4ubGF5b3V0PWksbn1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudENoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjdXJyZW50SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRhYkJhci5jdXJyZW50SW5kZXg7cmV0dXJuLTE9PT10P251bGw6dH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLmN1cnJlbnRJbmRleD1udWxsPT09dD8tMTp0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudFdpZGdldCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudGFiQmFyLmN1cnJlbnRUaXRsZTtyZXR1cm4gdD90Lm93bmVyOm51bGx9LHNldDpmdW5jdGlvbih0KXt0aGlzLnRhYkJhci5jdXJyZW50VGl0bGU9dD90LnRpdGxlOm51bGx9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ0YWJzTW92YWJsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYkJhci50YWJzTW92YWJsZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudGFiQmFyLnRhYnNNb3ZhYmxlPXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ3aWRnZXRzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiQ29udGVudHMud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5hZGRXaWRnZXQ9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRXaWRnZXQodGhpcy53aWRnZXRzLmxlbmd0aCx0KX0sZS5wcm90b3R5cGUuaW5zZXJ0V2lkZ2V0PWZ1bmN0aW9uKHQsZSl7ZSE9PXRoaXMuY3VycmVudFdpZGdldCYmZS5oaWRlKCksdGhpcy50YWJDb250ZW50cy5pbnNlcnRXaWRnZXQodCxlKSx0aGlzLnRhYkJhci5pbnNlcnRUYWIodCxlLnRpdGxlKX0sZS5wcm90b3R5cGUuX29uQ3VycmVudENoYW5nZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnByZXZpb3VzSW5kZXgsaT1lLnByZXZpb3VzVGl0bGUscj1lLmN1cnJlbnRJbmRleCxzPWUuY3VycmVudFRpdGxlLHU9aT9pLm93bmVyOm51bGwsYz1zP3Mub3duZXI6bnVsbDt1JiZ1LmhpZGUoKSxjJiZjLnNob3coKSx0aGlzLl9jdXJyZW50Q2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNXaWRnZXQ6dSxjdXJyZW50SW5kZXg6cixjdXJyZW50V2lkZ2V0OmN9KSwoYS5QbGF0Zm9ybS5JU19FREdFfHxhLlBsYXRmb3JtLklTX0lFKSYmby5NZXNzYWdlTG9vcC5mbHVzaCgpfSxlLnByb3RvdHlwZS5fb25UYWJBY3RpdmF0ZVJlcXVlc3RlZD1mdW5jdGlvbih0LGUpe2UudGl0bGUub3duZXIuYWN0aXZhdGUoKX0sZS5wcm90b3R5cGUuX29uVGFiQ2xvc2VSZXF1ZXN0ZWQ9ZnVuY3Rpb24odCxlKXtlLnRpdGxlLm93bmVyLmNsb3NlKCl9LGUucHJvdG90eXBlLl9vblRhYk1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy50YWJDb250ZW50cy5pbnNlcnRXaWRnZXQoZS50b0luZGV4LGUudGl0bGUub3duZXIpfSxlLnByb3RvdHlwZS5fb25XaWRnZXRSZW1vdmVkPWZ1bmN0aW9uKHQsZSl7dGhpcy50YWJCYXIucmVtb3ZlVGFiKGUudGl0bGUpfSxlfSh1LldpZGdldCk7ZS5UYWJQYW5lbD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDIpLHM9bigxMSksYT1uKDM5KSx1PW4oMzU3KSxjPSJwLUNvbGxhcHNlIixoPSJwLUNvbGxhcHNlLWhlYWRlciIsbD0icC1Db2xsYXBzZS1jb250ZW50cyIsZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24uX2NvbGxhcHNlQ2hhbmdlZD1uZXcgcy5TaWduYWwobiksbi5hZGRDbGFzcyhjKSxuLl9oZWFkZXI9bmV3IGEuV2lkZ2V0LG4uX2hlYWRlci5hZGRDbGFzcyhoKSxuLl9oZWFkZXIubm9kZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsbiksbi5fY29udGVudD1uZXcgYS5QYW5lbCxuLl9jb250ZW50LmFkZENsYXNzKGwpO3ZhciBpPW5ldyBhLlBhbmVsTGF5b3V0O3JldHVybiBuLmxheW91dD1pLGkuYWRkV2lkZ2V0KG4uX2hlYWRlciksaS5hZGRXaWRnZXQobi5fY29udGVudCksZS53aWRnZXQmJihuLndpZGdldD1lLndpZGdldCksbi5jb2xsYXBzZWQ9ITEsbn1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5faGVhZGVyPW51bGwsdGhpcy5fd2lkZ2V0PW51bGwsdGhpcy5fY29udGVudD1udWxsKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ3aWRnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkZ2V0fSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fd2lkZ2V0O2UmJihlLmRpc3Bvc2VkLmRpc2Nvbm5lY3QodGhpcy5fb25DaGlsZERpc3Bvc2VkLHRoaXMpLGUudGl0bGUuY2hhbmdlZC5kaXNjb25uZWN0KHRoaXMuX29uVGl0bGVDaGFuZ2VkLHRoaXMpLGUucGFyZW50PW51bGwpLHRoaXMuX3dpZGdldD10LHQuZGlzcG9zZWQuY29ubmVjdCh0aGlzLl9vbkNoaWxkRGlzcG9zZWQsdGhpcyksdC50aXRsZS5jaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25UaXRsZUNoYW5nZWQsdGhpcyksdGhpcy5fb25UaXRsZUNoYW5nZWQodC50aXRsZSksdGhpcy5fY29udGVudC5hZGRXaWRnZXQodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sbGFwc2VkfSxzZXQ6ZnVuY3Rpb24odCl7dCE9PXRoaXMuX2NvbGxhcHNlZCYmKHQ/dGhpcy5fY29sbGFwc2UoKTp0aGlzLl91bmNvbGxhcHNlKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbigpe3RoaXMuY29sbGFwc2VkPSF0aGlzLmNvbGxhcHNlZH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZUNoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sbGFwc2VDaGFuZ2VkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9jb2xsYXBzZT1mdW5jdGlvbigpe3RoaXMuX2NvbGxhcHNlZD0hMCx0aGlzLl9jb250ZW50JiZ0aGlzLl9jb250ZW50LmhpZGUoKSx0aGlzLnJlbW92ZUNsYXNzKCJwLUNvbGxhcHNlLW9wZW4iKSx0aGlzLl9jb2xsYXBzZUNoYW5nZWQuZW1pdCh2b2lkIDApfSxlLnByb3RvdHlwZS5fdW5jb2xsYXBzZT1mdW5jdGlvbigpe3RoaXMuX2NvbGxhcHNlZD0hMSx0aGlzLl9jb250ZW50JiZ0aGlzLl9jb250ZW50LnNob3coKSx0aGlzLmFkZENsYXNzKCJwLUNvbGxhcHNlLW9wZW4iKSx0aGlzLl9jb2xsYXBzZUNoYW5nZWQuZW1pdCh2b2lkIDApfSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtzd2l0Y2godC50eXBlKXtjYXNlImNsaWNrIjp0aGlzLl9ldnRDbGljayh0KX19LGUucHJvdG90eXBlLl9ldnRDbGljaz1mdW5jdGlvbih0KXt0aGlzLnRvZ2dsZSgpfSxlLnByb3RvdHlwZS5fb25UaXRsZUNoYW5nZWQ9ZnVuY3Rpb24odCl7dGhpcy5faGVhZGVyLm5vZGUudGV4dENvbnRlbnQ9dGhpcy5fd2lkZ2V0LnRpdGxlLmxhYmVsfSxlLnByb3RvdHlwZS5fb25DaGlsZERpc3Bvc2VkPWZ1bmN0aW9uKHQpe3RoaXMuZGlzcG9zZSgpfSxlfShhLldpZGdldCk7ZS5Db2xsYXBzZT1kO3ZhciBmPSJwLUFjY29yZGlvbiIscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9zZWxlY3Rpb249bmV3IHUuU2VsZWN0aW9uKG4ud2lkZ2V0cyksbi5fc2VsZWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQuY29ubmVjdChuLl9vblNlbGVjdGlvbkNoYW5nZWQsbiksbi5hZGRDbGFzcyhmKSxufXJldHVybiByKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb2xsYXBzZVdpZGdldHMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXQud2lkZ2V0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNlbGVjdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb259LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gby5BcnJheUV4dC5maW5kRmlyc3RJbmRleCh0aGlzLmNvbGxhcHNlV2lkZ2V0cyxmdW5jdGlvbihlKXtyZXR1cm4gZS53aWRnZXQ9PT10fSl9LGUucHJvdG90eXBlLmFkZFdpZGdldD1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl93cmFwV2lkZ2V0KGUpO3JldHVybiBuLmNvbGxhcHNlZD0hMCx0LnByb3RvdHlwZS5hZGRXaWRnZXQuY2FsbCh0aGlzLG4pLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQodGhpcy53aWRnZXRzLmxlbmd0aC0xLG4pLG59LGUucHJvdG90eXBlLmluc2VydFdpZGdldD1mdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMuX3dyYXBXaWRnZXQobik7aS5jb2xsYXBzZWQ9ITAsdC5wcm90b3R5cGUuaW5zZXJ0V2lkZ2V0LmNhbGwodGhpcyxlLGkpLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQoZSxpKX0sZS5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5kZXhPZih0KTtpZihlPj0wKXt2YXIgbj10aGlzLmNvbGxhcHNlV2lkZ2V0c1tlXTt0LnBhcmVudD1udWxsLG4uZGlzcG9zZSgpLHRoaXMuX3NlbGVjdGlvbi5hZGp1c3RTZWxlY3Rpb25Gb3JSZW1vdmUoZSxudWxsKX19LGUucHJvdG90eXBlLl93cmFwV2lkZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBkKHt3aWRnZXQ6dH0pO3JldHVybiBlLmFkZENsYXNzKCJwLUFjY29yZGlvbi1jaGlsZCIpLGUuY29sbGFwc2VDaGFuZ2VkLmNvbm5lY3QodGhpcy5fb25Db2xsYXBzZUNoYW5nZSx0aGlzKSxlfSxlLnByb3RvdHlwZS5fb25Db2xsYXBzZUNoYW5nZT1mdW5jdGlvbih0KXt0LmNvbGxhcHNlZD90aGlzLl9zZWxlY3Rpb24udmFsdWU9PT10JiZ0LmNvbGxhcHNlZCYmKHRoaXMuX3NlbGVjdGlvbi52YWx1ZT1udWxsKTp0aGlzLl9zZWxlY3Rpb24udmFsdWU9dH0sZS5wcm90b3R5cGUuX29uU2VsZWN0aW9uQ2hhbmdlZD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldmlvdXNWYWx1ZSxpPWUuY3VycmVudFZhbHVlO24mJihuLmNvbGxhcHNlZD0hMCxuLnJlbW92ZUNsYXNzKCJwLUFjY29yZGlvbi1jaGlsZC1hY3RpdmUiKSksaSYmKGkuY29sbGFwc2VkPSExLGkuYWRkQ2xhc3MoInAtQWNjb3JkaW9uLWNoaWxkLWFjdGl2ZSIpKX0sZX0oYS5QYW5lbCk7ZS5BY2NvcmRpb249cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigyKSxyPW4oMTEpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pLHRoaXMuX2FycmF5PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZD1uZXcgci5TaWduYWwodGhpcyksdGhpcy5fYXJyYXk9dCx0aGlzLl9pbnNlcnRCZWhhdmlvcj1lLmluc2VydEJlaGF2aW9yfHwic2VsZWN0LWl0ZW0taWYtbmVlZGVkIix0aGlzLl9yZW1vdmVCZWhhdmlvcj1lLnJlbW92ZUJlaGF2aW9yfHwic2VsZWN0LWl0ZW0tYWZ0ZXIifXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInNlbGVjdGlvbkNoYW5nZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JTZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbmRleCxuPXRoaXMudmFsdWU7aWYodD09PWUpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKTt2YXIgaT10aGlzLnZhbHVlO3RoaXMuX3ByZXZpb3VzVmFsdWU9bnVsbCxuIT09aSYmdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OmUscHJldmlvdXNWYWx1ZTpuLGN1cnJlbnRJbmRleDplLGN1cnJlbnRWYWx1ZTppfSl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInZhbHVlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pbmRleD1udWxsPT09dD9udWxsOmkuQXJyYXlFeHQuZmlyc3RJbmRleE9mKHRoaXMuX2FycmF5LHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kZXh9LHNldDpmdW5jdGlvbih0KXt2YXIgZTtpZihudWxsIT09dD8oKGU9TWF0aC5mbG9vcih0KSk8MHx8ZT49dGhpcy5fYXJyYXkubGVuZ3RoKSYmKGU9bnVsbCk6ZT1udWxsLHRoaXMuX2luZGV4IT09ZSl7dmFyIG49dGhpcy5faW5kZXgsaT10aGlzLl92YWx1ZTt0aGlzLl9pbmRleD1lLHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKSx0aGlzLl9wcmV2aW91c1ZhbHVlPWksdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4Om4scHJldmlvdXNWYWx1ZTppLGN1cnJlbnRJbmRleDplLGN1cnJlbnRWYWx1ZTp0aGlzLl92YWx1ZX0pfX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImluc2VydEJlaGF2aW9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luc2VydEJlaGF2aW9yfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5zZXJ0QmVoYXZpb3I9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJlbW92ZUJlaGF2aW9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbW92ZUJlaGF2aW9yfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlQmVoYXZpb3I9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JJbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl92YWx1ZSxpPXRoaXMuX2luZGV4LHI9dGhpcy5faW5zZXJ0QmVoYXZpb3I7aWYoInNlbGVjdC1pdGVtIj09PXJ8fCJzZWxlY3QtaXRlbS1pZi1uZWVkZWQiPT09ciYmbnVsbD09PWkpcmV0dXJuIHRoaXMuX2luZGV4PXQsdGhpcy5fdmFsdWU9ZSx0aGlzLl9wcmV2aW91c1ZhbHVlPW4sdm9pZCB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6aSxwcmV2aW91c1ZhbHVlOm4sY3VycmVudEluZGV4OnQsY3VycmVudFZhbHVlOmV9KTtpPj10JiZ0aGlzLl9pbmRleCsrfSx0LnByb3RvdHlwZS5hZGp1c3RTZWxlY3Rpb25Gb3JNb3ZlPWZ1bmN0aW9uKHQsZSl7dGhpcy5faW5kZXg9PT10P3RoaXMuX2luZGV4PWU6dGhpcy5faW5kZXg8dCYmdGhpcy5faW5kZXg+PWU/dGhpcy5faW5kZXgrKzp0aGlzLl9pbmRleD50JiZ0aGlzLl9pbmRleDw9ZSYmdGhpcy5faW5kZXgtLX0sdC5wcm90b3R5cGUuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRleCxlPXRoaXMuX3ZhbHVlO3RoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsbnVsbCE9PXQmJnRoaXMuX3NlbGVjdGlvbkNoYW5nZWQuZW1pdCh7cHJldmlvdXNJbmRleDp0LHByZXZpb3VzVmFsdWU6ZSxjdXJyZW50SW5kZXg6dGhpcy5faW5kZXgsY3VycmVudFZhbHVlOnRoaXMuX3ZhbHVlfSl9LHQucHJvdG90eXBlLmFkanVzdFNlbGVjdGlvbkZvclJlbW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2luZGV4LGk9dGhpcy5fcmVtb3ZlQmVoYXZpb3I7aWYobj09PXQpe2lmKDA9PT10aGlzLl9hcnJheS5sZW5ndGgpcmV0dXJuIHRoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdm9pZCB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoe3ByZXZpb3VzSW5kZXg6dCxwcmV2aW91c1ZhbHVlOmUsY3VycmVudEluZGV4OnRoaXMuX2luZGV4LGN1cnJlbnRWYWx1ZTp0aGlzLl92YWx1ZX0pO2lmKCJzZWxlY3QtaXRlbS1hZnRlciI9PT1pKXJldHVybiB0aGlzLl9pbmRleD1NYXRoLm1pbih0LHRoaXMuX2FycmF5Lmxlbmd0aC0xKSx0aGlzLl91cGRhdGVTZWxlY3RlZFZhbHVlKCksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KTtpZigic2VsZWN0LWl0ZW0tYmVmb3JlIj09PWkpcmV0dXJuIHRoaXMuX2luZGV4PU1hdGgubWF4KDAsdC0xKSx0aGlzLl91cGRhdGVTZWxlY3RlZFZhbHVlKCksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KTtpZigic2VsZWN0LXByZXZpb3VzLWl0ZW0iPT09aSlyZXR1cm4gdGhpcy5fcHJldmlvdXNWYWx1ZT90aGlzLnZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsdWU6KHRoaXMuX2luZGV4PU1hdGgubWluKHQsdGhpcy5fYXJyYXkubGVuZ3RoLTEpLHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmFsdWUoKSksdGhpcy5fcHJldmlvdXNWYWx1ZT1udWxsLHZvaWQgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy52YWx1ZX0pO3RoaXMuX2luZGV4PW51bGwsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl9wcmV2aW91c1ZhbHVlPW51bGwsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHtwcmV2aW91c0luZGV4OnQscHJldmlvdXNWYWx1ZTplLGN1cnJlbnRJbmRleDp0aGlzLl9pbmRleCxjdXJyZW50VmFsdWU6dGhpcy5fdmFsdWV9KX1lbHNlIG4+dCYmdGhpcy5faW5kZXgtLX0sdC5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGVkVmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbmRleDt0aGlzLl92YWx1ZT1udWxsIT09dD90aGlzLl9hcnJheVt0XTpudWxsfSx0fSgpO2UuU2VsZWN0aW9uPW99LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTIpLHM9bigyMyksYT1uKDE2KSx1PW4oNiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse3ZhbHVlOiIiLGRpc2FibGVkOiExLHBsYWNlaG9sZGVyOiLigIsiLF9tb2RlbF9uYW1lOiJTdHJpbmdNb2RlbCJ9KX0sZX0oby5Db3JlRGVzY3JpcHRpb25Nb2RlbCk7ZS5TdHJpbmdNb2RlbD1jO3ZhciBoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiSFRNTFZpZXciLF9tb2RlbF9uYW1lOiJIVE1MTW9kZWwifSl9LGV9KGMpO2UuSFRNTE1vZGVsPWg7dmFyIGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoImp1cHl0ZXItd2lkZ2V0cyIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWlubGluZS1oYm94IiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHRtbCIpLHRoaXMuY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWh0bWwtY29udGVudCIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50LmlubmVySFRNTD10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuSFRNTFZpZXc9bDt2YXIgZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IkhUTUxNYXRoVmlldyIsX21vZGVsX25hbWU6IkhUTUxNYXRoTW9kZWwifSl9LGV9KGMpO2UuSFRNTE1hdGhNb2RlbD1kO3ZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJqdXB5dGVyLXdpZGdldHMiKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC1pbmxpbmUtaGJveCIpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgid2lkZ2V0LWh0bWxtYXRoIiksdGhpcy5jb250ZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29udGVudC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaHRtbG1hdGgtY29udGVudCIpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50LmlubmVySFRNTD10aGlzLm1vZGVsLmdldCgidmFsdWUiKSx0aGlzLnR5cGVzZXQodGhpcy5jb250ZW50KSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuSFRNTE1hdGhWaWV3PWY7dmFyIHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJMYWJlbFZpZXciLF9tb2RlbF9uYW1lOiJMYWJlbE1vZGVsIn0pfSxlfShjKTtlLkxhYmVsTW9kZWw9cDt2YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtbGFiZWwiKSx0aGlzLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlc2V0KHRoaXMuZWwsdGhpcy5tb2RlbC5nZXQoInZhbHVlIikpLHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5MYWJlbFZpZXc9bTt2YXIgZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmRlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHUuZXh0ZW5kKHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse192aWV3X25hbWU6IlRleHRhcmVhVmlldyIsX21vZGVsX25hbWU6IlRleHRhcmVhTW9kZWwiLHJvd3M6bnVsbCxjb250aW51b3VzX3VwZGF0ZTohMH0pfSxlfShjKTtlLlRleHRhcmVhTW9kZWw9Zzt2YXIgdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0YXJlYSIpLHRoaXMudGV4dGJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMudGV4dGJveC5zZXRBdHRyaWJ1dGUoInJvd3MiLCI1IiksdGhpcy50ZXh0Ym94LmlkPXRoaXMubGFiZWwuaHRtbEZvcj1hLnV1aWQoKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMudGV4dGJveCksdGhpcy51cGRhdGUoKSx0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsImNoYW5nZTpwbGFjZWhvbGRlciIsZnVuY3Rpb24odCxlLG4pe3RoaXMudXBkYXRlX3BsYWNlaG9sZGVyKGUpfSksdGhpcy51cGRhdGVfcGxhY2Vob2xkZXIoKX0sZS5wcm90b3R5cGUudXBkYXRlX3BsYWNlaG9sZGVyPWZ1bmN0aW9uKHQpe3Q9dHx8dGhpcy5tb2RlbC5nZXQoInBsYWNlaG9sZGVyIiksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiLHQudG9TdHJpbmcoKSl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lfHxlLnVwZGF0ZWRfdmlldyE9dGhpcyl7dGhpcy50ZXh0Ym94LnZhbHVlPXRoaXMubW9kZWwuZ2V0KCJ2YWx1ZSIpO3ZhciBuPXRoaXMubW9kZWwuZ2V0KCJyb3dzIik7bnVsbD09PW4mJihuPSIiKSx0aGlzLnRleHRib3guc2V0QXR0cmlidXRlKCJyb3dzIixuKSx0aGlzLnRleHRib3guZGlzYWJsZWQ9dGhpcy5tb2RlbC5nZXQoImRpc2FibGVkIil9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm57ImtleWRvd24gaW5wdXQiOiJoYW5kbGVLZXlEb3duIiwia2V5cHJlc3MgaW5wdXQiOiJoYW5kbGVLZXlwcmVzcyIsImlucHV0IHRleHRhcmVhIjoiaGFuZGxlQ2hhbmdpbmciLCJjaGFuZ2UgdGV4dGFyZWEiOiJoYW5kbGVDaGFuZ2VkIn19LGUucHJvdG90eXBlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5cHJlc3M9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdpbmc9ZnVuY3Rpb24odCl7dGhpcy5tb2RlbC5nZXQoImNvbnRpbnVvdXNfdXBkYXRlIikmJnRoaXMuaGFuZGxlQ2hhbmdlZCh0KX0sZS5wcm90b3R5cGUuaGFuZGxlQ2hhbmdlZD1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLnNldCgidmFsdWUiLHQudGFyZ2V0LnZhbHVlLHt1cGRhdGVkX3ZpZXc6dGhpc30pLHRoaXMudG91Y2goKX0sZX0ocy5EZXNjcmlwdGlvblZpZXcpO2UuVGV4dGFyZWFWaWV3PXY7dmFyIGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiB1LmV4dGVuZCh0LnByb3RvdHlwZS5kZWZhdWx0cy5jYWxsKHRoaXMpLHtfdmlld19uYW1lOiJUZXh0VmlldyIsX21vZGVsX25hbWU6IlRleHRNb2RlbCIsY29udGludW91c191cGRhdGU6ITB9KX0sZX0oYyk7ZS5UZXh0TW9kZWw9Yjt2YXIgeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmlucHV0VHlwZT0idGV4dCIsZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpLHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgianVweXRlci13aWRnZXRzIiksdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJ3aWRnZXQtaW5saW5lLWhib3giKSx0aGlzLmVsLmNsYXNzTGlzdC5hZGQoIndpZGdldC10ZXh0IiksdGhpcy50ZXh0Ym94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgidHlwZSIsdGhpcy5pbnB1dFR5cGUpLHRoaXMudGV4dGJveC5pZD10aGlzLmxhYmVsLmh0bWxGb3I9YS51dWlkKCksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRib3gpLHRoaXMudXBkYXRlKCksdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCJjaGFuZ2U6cGxhY2Vob2xkZXIiLGZ1bmN0aW9uKHQsZSxuKXt0aGlzLnVwZGF0ZV9wbGFjZWhvbGRlcihlKX0pLHRoaXMudXBkYXRlX3BsYWNlaG9sZGVyKCl9LGUucHJvdG90eXBlLnVwZGF0ZV9wbGFjZWhvbGRlcj1mdW5jdGlvbih0KXt0fHwodD10aGlzLm1vZGVsLmdldCgicGxhY2Vob2xkZXIiKSksdGhpcy50ZXh0Ym94LnNldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiLHQpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJmUudXBkYXRlZF92aWV3PT10aGlzfHwodGhpcy50ZXh0Ym94LnZhbHVlIT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSYmKHRoaXMudGV4dGJveC52YWx1ZT10aGlzLm1vZGVsLmdldCgidmFsdWUiKSksdGhpcy50ZXh0Ym94LmRpc2FibGVkPXRoaXMubW9kZWwuZ2V0KCJkaXNhYmxlZCIpKSx0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJueyJrZXlkb3duIGlucHV0IjoiaGFuZGxlS2V5RG93biIsImtleXByZXNzIGlucHV0IjoiaGFuZGxlS2V5cHJlc3MiLCJpbnB1dCBpbnB1dCI6ImhhbmRsZUNoYW5naW5nIiwiY2hhbmdlIGlucHV0IjoiaGFuZGxlQ2hhbmdlZCJ9fSxlLnByb3RvdHlwZS5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleXByZXNzPWZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksMTM9PXQua2V5Q29kZSYmdGhpcy5zZW5kKHtldmVudDoic3VibWl0In0pfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2luZz1mdW5jdGlvbih0KXt0aGlzLm1vZGVsLmdldCgiY29udGludW91c191cGRhdGUiKSYmdGhpcy5oYW5kbGVDaGFuZ2VkKHQpfSxlLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2VkPWZ1bmN0aW9uKHQpe3RoaXMubW9kZWwuc2V0KCJ2YWx1ZSIsdC50YXJnZXQudmFsdWUse3VwZGF0ZWRfdmlldzp0aGlzfSksdGhpcy50b3VjaCgpfSxlfShzLkRlc2NyaXB0aW9uVmlldyk7ZS5UZXh0Vmlldz15O3ZhciBfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZGVmYXVsdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdS5leHRlbmQodC5wcm90b3R5cGUuZGVmYXVsdHMuY2FsbCh0aGlzKSx7X3ZpZXdfbmFtZToiUGFzc3dvcmRWaWV3IixfbW9kZWxfbmFtZToiUGFzc3dvcmRNb2RlbCJ9KX0sZX0oYik7ZS5QYXNzd29yZE1vZGVsPV87dmFyIHc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5pbnB1dFR5cGU9InBhc3N3b3JkIixlfXJldHVybiByKGUsdCksZX0oeSk7ZS5QYXNzd29yZFZpZXc9d30sZnVuY3Rpb24odCl7dC5leHBvcnRzPXtuYW1lOiJAanVweXRlci13aWRnZXRzL2NvbnRyb2xzIix2ZXJzaW9uOiIxLjQuMiIsZGVzY3JpcHRpb246Ikp1cHl0ZXIgaW50ZXJhY3RpdmUgd2lkZ2V0cyIsYXV0aG9yOiJQcm9qZWN0IEp1cHl0ZXIiLGxpY2Vuc2U6IkJTRC0zLUNsYXVzZSIsbWFpbjoibGliL2luZGV4LmpzIix0eXBpbmdzOiJsaWIvaW5kZXguZC50cyIscmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6Imh0dHBzOi8vZ2l0aHViLmNvbS9qdXB5dGVyLXdpZGdldHMvaXB5d2lkZ2V0cy5naXQifSxmaWxlczpbImxpYi8qKi8qLmQudHMiLCJsaWIvKiovKi5qcyIsImNzcy8qLmNzcyIsImRpc3QvIl0sc2NyaXB0czp7ImNsZWFuOnNyYyI6InJpbXJhZiBsaWIiLGNsZWFuOiJucG0gcnVuIGNsZWFuOnNyYyIsImJ1aWxkOnRlc3QiOiJ0c2MgLS1wcm9qZWN0IHRlc3Qvc3JjICYmIHdlYnBhY2sgLS1jb25maWcgdGVzdC93ZWJwYWNrLmNvbmYuanMiLCJidWlsZDpzcmMiOiJ0c2MgLS1wcm9qZWN0IHNyYyIsImJ1aWxkOmNzcyI6InBvc3Rjc3MgLS11c2UgcG9zdGNzcy1pbXBvcnQgLS11c2UgcG9zdGNzcy1jc3NuZXh0IC1vIGNzcy93aWRnZXRzLmJ1aWx0LmNzcyBjc3Mvd2lkZ2V0cy5jc3MiLGJ1aWxkOiJucG0gcnVuIGJ1aWxkOnNyYyAmJiBucG0gcnVuIGJ1aWxkOmNzcyIsbGludDoidHNsaW50IC0tcHJvamVjdCB0c2xpbnQuanNvbiAtLWZvcm1hdCBzdHlsaXNoIix0ZXN0OiJucG0gcnVuIHRlc3Q6dW5pdCIsInRlc3Q6Y292ZXJhZ2UiOiJucG0gcnVuIGJ1aWxkOnRlc3QgJiYgd2VicGFjayAtLWNvbmZpZyB0ZXN0L3dlYnBhY2stY292LmNvbmYuanMgJiYga2FybWEgc3RhcnQgdGVzdC9rYXJtYS1jb3YuY29uZi5qcyIsInRlc3Q6dW5pdCI6Im5wbSBydW4gdGVzdDp1bml0OmZpcmVmb3ggJiYgbnBtIHJ1biB0ZXN0OnVuaXQ6Y2hyb21lIiwidGVzdDp1bml0OmRlZmF1bHQiOiJucG0gcnVuIGJ1aWxkOnRlc3QgJiYga2FybWEgc3RhcnQgdGVzdC9rYXJtYS5jb25mLmpzIC0tbG9nLWxldmVsIGRlYnVnIiwidGVzdDp1bml0OmZpcmVmb3giOiJucG0gcnVuIHRlc3Q6dW5pdDpkZWZhdWx0IC0tIC0tYnJvd3NlcnM9RmlyZWZveCIsInRlc3Q6dW5pdDpjaHJvbWUiOiJucG0gcnVuIHRlc3Q6dW5pdDpkZWZhdWx0IC0tIC0tYnJvd3NlcnM9Q2hyb21lIiwidGVzdDp1bml0OmllIjoibnBtIHJ1biB0ZXN0OnVuaXQ6ZGVmYXVsdCAtLSAtLWJyb3dzZXJzPUlFIixwcmVwdWJsaXNoOiJucG0gcnVuIGNsZWFuICYmIG5wbSBydW4gYnVpbGQifSxkZXZEZXBlbmRlbmNpZXM6eyJAanVweXRlcmxhYi9zZXJ2aWNlcyI6Il4yLjAuMCB8fCBeMy4wLjAiLCJAdHlwZXMvZXhwZWN0LmpzIjoiXjAuMy4yOSIsIkB0eXBlcy9tYXRoamF4IjoiMC4wLjMxIiwiQHR5cGVzL21vY2hhIjoiXjIuMi40MSIsIkB0eXBlcy9ub2RlIjoiXjguMC4xIixjaGFpOiJeNC4wLjAiLCJjc3MtbG9hZGVyIjoiXjAuMjguNCIsImV4cGVjdC5qcyI6Il4wLjMuMSIsImZpbGUtbG9hZGVyIjoiXjAuMTEuMiIsImlzdGFuYnVsLWluc3RydW1lbnRlci1sb2FkZXIiOiJeMi4wLjAiLCJqc29uLWxvYWRlciI6Il4wLjUuNCIsa2FybWE6Il4xLjYuMCIsImthcm1hLWNocm9tZS1sYXVuY2hlciI6Il4yLjAuMCIsImthcm1hLWNvdmVyYWdlIjoiXjEuMC4wIiwia2FybWEtZmlyZWZveC1sYXVuY2hlciI6Il4xLjAuMSIsImthcm1hLWllLWxhdW5jaGVyIjoiXjEuMC4wIiwia2FybWEtbW9jaGEiOiJeMS4zLjAiLCJrYXJtYS1tb2NoYS1yZXBvcnRlciI6Il4yLjIuMyIsImthcm1hLXdlYnBhY2siOiJeMi4wLjMiLG1vY2hhOiJeMy4zLjAiLCJucG0tcnVuLWFsbCI6Il4xLjUuMSIsInBvc3Rjc3MtY2xpIjoiXjQuMS4wIiwicG9zdGNzcy1jc3NuZXh0IjoiXjMuMC4yIiwicG9zdGNzcy1pbXBvcnQiOiJeMTAuMC4wIiwicG9zdGNzcy1sb2FkZXIiOiJeMi4wLjYiLHJpbXJhZjoiXjIuNi4xIixzaW5vbjoiXjIuMS4wIiwic2lub24tY2hhaSI6Il4yLjExLjAiLCJzdHlsZS1sb2FkZXIiOiJeMC4xOC4xIix0c2xpbnQ6Il41LjguMCIsdHlwZXNjcmlwdDoifjIuOS4yIiwidXJsLWxvYWRlciI6Il4wLjUuOSIsd2VicGFjazoiXjMuNS41In0sZGVwZW5kZW5jaWVzOnsiQGp1cHl0ZXItd2lkZ2V0cy9iYXNlIjoiXjEuMi4yIiwiQHBob3NwaG9yL2FsZ29yaXRobSI6Il4xLjEuMCIsIkBwaG9zcGhvci9kb211dGlscyI6Il4xLjEuMCIsIkBwaG9zcGhvci9tZXNzYWdpbmciOiJeMS4yLjEiLCJAcGhvc3Bob3Ivc2lnbmFsaW5nIjoiXjEuMi4wIiwiQHBob3NwaG9yL3dpZGdldHMiOiJeMS4zLjAiLCJkMy1mb3JtYXQiOiJeMS4zLjAiLGpxdWVyeToiXjMuMS4xIiwianF1ZXJ5LXVpIjoiXjEuMTIuMSIsdW5kZXJzY29yZToiXjEuOC4zIn0sZ2l0SGVhZDoiN2ZkMTVjMDZmMGE2MTEzOGVhYzQ0YWMzNGQwMTQ4YmU2N2IzYWQ2ZiIsX3Jlc29sdmVkOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AanVweXRlci13aWRnZXRzL2NvbnRyb2xzLy0vY29udHJvbHMtMS40LjIudGd6IixfaW50ZWdyaXR5OiJzaGE1MTItd2o5Nk5UMW1ONCs3enpMMzRoTkhNTFlkYkRzSG0yVVh4a1FKcjdVb2xlUytVMnp6Z3ZSU2tCNmlqRDl0aTI1ZjlDWCtQblhUZU9RN2lSSEdQOERCaHc9PSIsX2Zyb206IkBqdXB5dGVyLXdpZGdldHMvY29udHJvbHNAMS40LjIifX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9KG4oMzYxKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxPYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDgpO2UuT1VUUFVUX1dJREdFVF9WRVJTSU9OPSIxLjAuMCI7dmFyIGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIobix0KSxuLnByb3RvdHlwZS5kZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBvKHt9LHQucHJvdG90eXBlLmRlZmF1bHRzLmNhbGwodGhpcykse19tb2RlbF9uYW1lOiJPdXRwdXRNb2RlbCIsX3ZpZXdfbmFtZToiT3V0cHV0VmlldyIsX21vZGVsX21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9vdXRwdXQiLF92aWV3X21vZHVsZToiQGp1cHl0ZXItd2lkZ2V0cy9vdXRwdXQiLF9tb2RlbF9tb2R1bGVfdmVyc2lvbjplLk9VVFBVVF9XSURHRVRfVkVSU0lPTixfdmlld19tb2R1bGVfdmVyc2lvbjplLk9VVFBVVF9XSURHRVRfVkVSU0lPTn0pfSxufShzLkRPTVdpZGdldE1vZGVsKTtlLk91dHB1dE1vZGVsPWE7dmFyIHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIoZSx0KSxlfShzLkRPTVdpZGdldFZpZXcpO2UuT3V0cHV0Vmlldz11fV0pLmRlZmF1bHQpOw==",
|
|
"ok": true,
|
|
"headers": [
|
|
[
|
|
"content-type",
|
|
"application/javascript"
|
|
]
|
|
],
|
|
"status": 200,
|
|
"status_text": ""
|
|
}
|
|
},
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 18109
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# Model Evaluation using Cross validation\n",
|
|
"\n",
|
|
"cv_params = model.get_params()\n",
|
|
"cv_params.update({\n",
|
|
" 'loss_function': 'Logloss'\n",
|
|
"})\n",
|
|
"cv_data = cv(\n",
|
|
" Pool(X, y, cat_features=categorical_features_indices),\n",
|
|
" cv_params,\n",
|
|
" logging_level='Verbose', \n",
|
|
" plot=True\n",
|
|
")\n",
|
|
"\n",
|
|
"print('Best validation accuracy score: {:.2f}±{:.2f} on step {}'.format(\n",
|
|
" np.max(cv_data['test-Accuracy-mean']),\n",
|
|
" cv_data['test-Accuracy-std'][np.argmax(cv_data['test-Accuracy-mean'])],\n",
|
|
" np.argmax(cv_data['test-Accuracy-mean'])\n",
|
|
"))\n",
|
|
"\n",
|
|
"print('Precise validation accuracy score: {}'.format(np.max(cv_data['test-Accuracy-mean'])))"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/html": [
|
|
"\n",
|
|
" <style>\n",
|
|
" .highcharts-tooltip {\n",
|
|
" display: none !important;\n",
|
|
"}\n",
|
|
".highcharts-halo {\n",
|
|
" display: none !important;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost {\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel {\n",
|
|
" position: absolute;\n",
|
|
" height: 100%;\n",
|
|
" width: 280px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls {\n",
|
|
" margin-left: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls_label {\n",
|
|
" padding: 5px 0 0 8px;\n",
|
|
" cursor: pointer;\n",
|
|
" width: 80px;\n",
|
|
" box-sizing: content-box;\n",
|
|
"}\n",
|
|
".catboost-panel__controls_label_time {\n",
|
|
" width: inherit;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls2 {\n",
|
|
" margin-top: 10px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls2_label {\n",
|
|
" padding: 5px 11px 0 8px;\n",
|
|
" cursor: pointer;\n",
|
|
" width: 90px;\n",
|
|
" box-sizing: content-box;\n",
|
|
"}\n",
|
|
".catboost-panel__controls2_label-long {\n",
|
|
" width: 170px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series {\n",
|
|
" height: 340px;\n",
|
|
" overflow-y: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph {\n",
|
|
" margin-left: 290px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tabs {\n",
|
|
" padding: 0 0 0 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab {\n",
|
|
" display: inline-block;\n",
|
|
" padding: 5px 10px 0 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab {\n",
|
|
" color: #999;\n",
|
|
" cursor: pointer;\n",
|
|
" transition: color 0.1s linear;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab:hover {\n",
|
|
" color: #333;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__tab_active {\n",
|
|
" color: #000;\n",
|
|
" cursor: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__charts {\n",
|
|
" padding-top: 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__chart {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-graph__chart_active {\n",
|
|
" display: block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie {\n",
|
|
" padding-bottom: 5px;\n",
|
|
" border-bottom: 1px solid rgba(0, 0, 0, 0.3);\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_bottom,\n",
|
|
".catboost-panel__serie_middle,\n",
|
|
".catboost-panel__serie_top {\n",
|
|
" white-space: nowrap;\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#catboost-control-test {\n",
|
|
" margin-left: 11px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_label {\n",
|
|
" padding: 0 0 0 8px;\n",
|
|
" width: 200px;\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" box-sizing: border-box;\n",
|
|
" cursor: pointer;\n",
|
|
" margin-bottom: 0;\n",
|
|
" overflow: hidden;\n",
|
|
" position: relative;\n",
|
|
" top: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_hint {\n",
|
|
" position: absolute;\n",
|
|
" font-size: 9px;\n",
|
|
" left: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie__learn_hint {\n",
|
|
" top: 56px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie__test_hint {\n",
|
|
" top: 82px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_bottom {\n",
|
|
" padding-bottom: 6px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time {\n",
|
|
" position: absolute;\n",
|
|
" top: 5px;\n",
|
|
" right: 2px;\n",
|
|
" height: 20px;\n",
|
|
" padding: 0 0 0 20px;\n",
|
|
" margin-bottom: 3px;\n",
|
|
" overflow: hidden;\n",
|
|
"\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" box-sizing: border-box;\n",
|
|
" text-align: left;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__serie_test_pic {\n",
|
|
" width: 13px;\n",
|
|
" height: 1px;\n",
|
|
" border-top-width: 1px;\n",
|
|
" position: relative;\n",
|
|
" top: -3px;\n",
|
|
" margin-right: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic {\n",
|
|
" border-top-style: dashed;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_test_pic {\n",
|
|
" border-top-style: solid;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie-value {\n",
|
|
" display: inline-block;\n",
|
|
" min-width: 30px;\n",
|
|
" margin-right: 2px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__controls_label .catboost-panel__serie_learn_pic {\n",
|
|
" padding-left: 4px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_names {\n",
|
|
" white-space: nowrap;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_scroll {\n",
|
|
" width: 240px;\n",
|
|
" overflow-x: auto;\n",
|
|
" margin-left: 20px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__serie_best_learn_value,\n",
|
|
".catboost-panel__serie_best_test_value {\n",
|
|
" width: 85px;\n",
|
|
" position: relative;\n",
|
|
" padding: 0 8px 0 0;\n",
|
|
" box-sizing: content-box;\n",
|
|
" overflow: hidden;\n",
|
|
" text-overflow: ellipsis;\n",
|
|
" top: 5px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_iteration,\n",
|
|
".catboost-panel__serie_best_iteration {\n",
|
|
" display: inline-block;\n",
|
|
" position: absolute;\n",
|
|
" box-sizing: content-box;\n",
|
|
" overflow: hidden;\n",
|
|
" right: 2px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_iteration {\n",
|
|
" top: 55px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_best_iteration {\n",
|
|
" top: 80px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__control_slider {\n",
|
|
" width: 100px !important;\n",
|
|
" margin-left: 0;\n",
|
|
" position: relative;\n",
|
|
" display: inline-block !important;\n",
|
|
" top: 3px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__control_slidervalue {\n",
|
|
" width: 50px;\n",
|
|
" padding: 2px 3px;\n",
|
|
" margin-left: 4px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time_spend,\n",
|
|
".catboost-panel__serie_time_left {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_time_left {\n",
|
|
" margin-left: 10px;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__serie_best_learn_value {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
".catboost-panel__serie_test_pic,\n",
|
|
".catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__serie_best_test_value {\n",
|
|
" display: inline-block;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_pic,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_name,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_best_learn_value {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_pic,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_name,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_test_value {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/*\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_test_value,\n",
|
|
".catboost-panel__series_learn_disabled .catboost-panel__serie_best_test_value {\n",
|
|
" width: 216px;\n",
|
|
"}\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_learn_value,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_learn_value {\n",
|
|
" width: 216px;\n",
|
|
"}\n",
|
|
"*/\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie__test_hint,\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_best_iteration {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_test_disabled.catboost-panel__series_learn_disabled .catboost-panel__serie_middle {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
".catboost-panel__series_test_disabled .catboost-panel__serie_bottom {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
" </style>\n",
|
|
" <script>\n",
|
|
" window.__define = window.define;window.__require = window.require;window.define = undefined;window.require = undefined;/**\n",
|
|
"* plotly.js (basic - minified) v1.27.1\n",
|
|
"* Copyright 2012-2017, Plotly, Inc.\n",
|
|
"* All rights reserved.\n",
|
|
"* Licensed under the MIT license\n",
|
|
"*/\n",
|
|
"!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var e;e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,e.Plotly=t()}}(function(){var t;return function t(e,r,n){function a(i,l){if(!r[i]){if(!e[i]){var s=\"function\"==typeof require&&require;if(!l&&s)return s(i,!0);if(o)return o(i,!0);var c=new Error(\"Cannot find module '\"+i+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var u=r[i]={exports:{}};e[i][0].call(u.exports,function(t){var r=e[i][1][t];return a(r||t)},u,u.exports,t,e,r,n)}return r[i].exports}for(var o=\"function\"==typeof require&&require,i=0;i<n.length;i++)a(n[i]);return a}({1:[function(t,e,r){\"use strict\";var n=t(\"../src/lib\"),a={\"X,X div\":\"font-family:'Open Sans', verdana, arial, sans-serif;margin:0;padding:0;\",\"X input,X button\":\"font-family:'Open Sans', verdana, arial, sans-serif;\",\"X input:focus,X button:focus\":\"outline:none;\",\"X a\":\"text-decoration:none;\",\"X a:hover\":\"text-decoration:none;\",\"X .crisp\":\"shape-rendering:crispEdges;\",\"X .user-select-none\":\"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;\",\"X svg\":\"overflow:hidden;\",\"X svg a\":\"fill:#447adb;\",\"X svg a:hover\":\"fill:#3c6dc5;\",\"X .main-svg\":\"position:absolute;top:0;left:0;pointer-events:none;\",\"X .main-svg .draglayer\":\"pointer-events:all;\",\"X .cursor-default\":\"cursor:default;\",\"X .cursor-pointer\":\"cursor:pointer;\",\"X .cursor-crosshair\":\"cursor:crosshair;\",\"X .cursor-move\":\"cursor:move;\",\"X .cursor-col-resize\":\"cursor:col-resize;\",\"X .cursor-row-resize\":\"cursor:row-resize;\",\"X .cursor-ns-resize\":\"cursor:ns-resize;\",\"X .cursor-ew-resize\":\"cursor:ew-resize;\",\"X .cursor-sw-resize\":\"cursor:sw-resize;\",\"X .cursor-s-resize\":\"cursor:s-resize;\",\"X .cursor-se-resize\":\"cursor:se-resize;\",\"X .cursor-w-resize\":\"cursor:w-resize;\",\"X .cursor-e-resize\":\"cursor:e-resize;\",\"X .cursor-nw-resize\":\"cursor:nw-resize;\",\"X .cursor-n-resize\":\"cursor:n-resize;\",\"X .cursor-ne-resize\":\"cursor:ne-resize;\",\"X .modebar\":\"position:absolute;top:2px;right:2px;z-index:1001;background:rgba(255,255,255,0.7);\",\"X .modebar--hover\":\"opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;\",\"X:hover .modebar--hover\":\"opacity:1;\",\"X .modebar-group\":\"float:left;display:inline-block;box-sizing:border-box;margin-left:8px;position:relative;vertical-align:middle;white-space:nowrap;\",\"X .modebar-group:first-child\":\"margin-left:0px;\",\"X .modebar-btn\":\"position:relative;font-size:16px;padding:3px 4px;cursor:pointer;line-height:normal;box-sizing:border-box;\",\"X .modebar-btn svg\":\"position:relative;top:2px;\",\"X .modebar-btn path\":\"fill:rgba(0,31,95,0.3);\",\"X .modebar-btn.active path,X .modebar-btn:hover path\":\"fill:rgba(0,22,72,0.5);\",\"X .modebar-btn.modebar-btn--logo\":\"padding:3px 1px;\",\"X .modebar-btn.modebar-btn--logo path\":\"fill:#447adb !important;\",\"X [data-title]:before,X [data-title]:after\":\"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;\",\"X [data-title]:hover:before,X [data-title]:hover:after\":\"display:block;opacity:1;\",\"X [data-title]:before\":\"content:'';position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;\",\"X [data-title]:after\":\"content:attr(data-title);background:#69738a;color:white;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;\",\"X .select-outline\":\"fill:none;stroke-width:1;shape-rendering:crispEdges;\",\"X .select-outline-1\":\"stroke:white;\",\"X .select-outline-2\":\"stroke:black;stroke-dasharray:2px 2px;\",Y:\"font-family:'Open Sans';position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;\",\"Y p\":\"margin:0;\",\"Y .notifier-note\":\"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,0.9);color:#fff;padding:10px;\",\"Y .notifier-close\":\"color:#fff;opacity:0.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;\",\"Y .notifier-close:hover\":\"color:#444;text-decoration:none;cursor:pointer;\"};for(var o in a){var i=o.replace(/^,/,\" ,\").replace(/X/g,\".js-plotly-plot .plotly\").replace(/Y/g,\".plotly-notifier\");n.addStyleRule(i,a[o])}},{\"../src/lib\":136}],2:[function(t,e,r){\"use strict\";e.exports={undo:{width:857.1,path:\"m857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z\",ascent:850,descent:-150},home:{width:928.6,path:\"m786 296v-267q0-15-11-26t-25-10h-214v214h-143v-214h-214q-15 0-25 10t-11 26v267q0 1 0 2t0 2l321 264 321-264q1-1 1-4z m124 39l-34-41q-5-5-12-6h-2q-7 0-12 3l-386 322-386-322q-7-4-13-4-7 2-12 7l-35 41q-4 5-3 13t6 12l401 334q18 15 42 15t43-15l136-114v109q0 8 5 13t13 5h107q8 0 13-5t5-13v-227l122-102q5-5 6-12t-4-13z\",ascent:850,descent:-150},\"camera-retro\":{width:1e3,path:\"m518 386q0 8-5 13t-13 5q-37 0-63-27t-26-63q0-8 5-13t13-5 12 5 5 13q0 23 16 38t38 16q8 0 13 5t5 13z m125-73q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m-572-320h858v71h-858v-71z m643 320q0 89-62 152t-152 62-151-62-63-152 63-151 151-63 152 63 62 151z m-571 358h214v72h-214v-72z m-72-107h858v143h-462l-36-71h-360v-72z m929 143v-714q0-30-21-51t-50-21h-858q-29 0-50 21t-21 51v714q0 30 21 51t50 21h858q29 0 50-21t21-51z\",ascent:850,descent:-150},zoombox:{width:1e3,path:\"m1000-25l-250 251c40 63 63 138 63 218 0 224-182 406-407 406-224 0-406-182-406-406s183-406 407-406c80 0 155 22 218 62l250-250 125 125z m-812 250l0 438 437 0 0-438-437 0z m62 375l313 0 0-312-313 0 0 312z\",ascent:850,descent:-150},pan:{width:1e3,path:\"m1000 350l-187 188 0-125-250 0 0 250 125 0-188 187-187-187 125 0 0-250-250 0 0 125-188-188 186-187 0 125 252 0 0-250-125 0 187-188 188 188-125 0 0 250 250 0 0-126 187 188z\",ascent:850,descent:-150},zoom_plus:{width:1e3,path:\"m1 787l0-875 875 0 0 875-875 0z m687-500l-187 0 0-187-125 0 0 187-188 0 0 125 188 0 0 187 125 0 0-187 187 0 0-125z\",ascent:850,descent:-150},zoom_minus:{width:1e3,path:\"m0 788l0-876 875 0 0 876-875 0z m688-500l-500 0 0 125 500 0 0-125z\",ascent:850,descent:-150},autoscale:{width:1e3,path:\"m250 850l-187 0-63 0 0-62 0-188 63 0 0 188 187 0 0 62z m688 0l-188 0 0-62 188 0 0-188 62 0 0 188 0 62-62 0z m-875-938l0 188-63 0 0-188 0-62 63 0 187 0 0 62-187 0z m875 188l0-188-188 0 0-62 188 0 62 0 0 62 0 188-62 0z m-125 188l-1 0-93-94-156 156 156 156 92-93 2 0 0 250-250 0 0-2 93-92-156-156-156 156 94 92 0 2-250 0 0-250 0 0 93 93 157-156-157-156-93 94 0 0 0-250 250 0 0 0-94 93 156 157 156-157-93-93 0 0 250 0 0 250z\",ascent:850,descent:-150},tooltip_basic:{width:1500,path:\"m375 725l0 0-375-375 375-374 0-1 1125 0 0 750-1125 0z\",ascent:850,descent:-150},tooltip_compare:{width:1125,path:\"m187 786l0 2-187-188 188-187 0 0 937 0 0 373-938 0z m0-499l0 1-187-188 188-188 0 0 937 0 0 376-938-1z\",ascent:850,descent:-150},plotlylogo:{width:1542,path:\"m0-10h182v-140h-182v140z m228 146h183v-286h-183v286z m225 714h182v-1000h-182v1000z m225-285h182v-715h-182v715z m225 142h183v-857h-183v857z m231-428h182v-429h-182v429z m225-291h183v-138h-183v138z\",ascent:850,descent:-150},\"z-axis\":{width:1e3,path:\"m833 5l-17 108v41l-130-65 130-66c0 0 0 38 0 39 0-1 36-14 39-25 4-15-6-22-16-30-15-12-39-16-56-20-90-22-187-23-279-23-261 0-341 34-353 59 3 60 228 110 228 110-140-8-351-35-351-116 0-120 293-142 474-142 155 0 477 22 477 142 0 50-74 79-163 96z m-374 94c-58-5-99-21-99-40 0-24 65-43 144-43 79 0 143 19 143 43 0 19-42 34-98 40v216h87l-132 135-133-135h88v-216z m167 515h-136v1c16 16 31 34 46 52l84 109v54h-230v-71h124v-1c-16-17-28-32-44-51l-89-114v-51h245v72z\",ascent:850,descent:-150},\"3d_rotate\":{width:1e3,path:\"m922 660c-5 4-9 7-14 11-359 263-580-31-580-31l-102 28 58-400c0 1 1 1 2 2 118 108 351 249 351 249s-62 27-100 42c88 83 222 183 347 122 16-8 30-17 44-27-2 1-4 2-6 4z m36-329c0 0 64 229-88 296-62 27-124 14-175-11 157-78 225-208 249-266 8-19 11-31 11-31 2 5 6 15 11 32-5-13-8-20-8-20z m-775-239c70-31 117-50 198-32-121 80-199 346-199 346l-96-15-58-12c0 0 55-226 155-287z m603 133l-317-139c0 0 4-4 19-14 7-5 24-15 24-15s-177-147-389 4c235-287 536-112 536-112l31-22 100 299-4-1z m-298-153c6-4 14-9 24-15 0 0-17 10-24 15z\",ascent:850,descent:-150},camera:{width:1e3,path:\"m500 450c-83 0-150-67-150-150 0-83 67-150 150-150 83 0 150 67 150 150 0 83-67 150-150 150z m400 150h-120c-16 0-34 13-39 29l-31 93c-6 15-23 28-40 28h-340c-16 0-34-13-39-28l-31-94c-6-15-23-28-40-28h-120c-55 0-100-45-100-100v-450c0-55 45-100 100-100h800c55 0 100 45 100 100v450c0 55-45 100-100 100z m-400-550c-138 0-250 112-250 250 0 138 112 250 250 250 138 0 250-112 250-250 0-138-112-250-250-250z m365 380c-19 0-35 16-35 35 0 19 16 35 35 35 19 0 35-16 35-35 0-19-16-35-35-35z\",ascent:850,descent:-150},movie:{width:1e3,path:\"m938 413l-188-125c0 37-17 71-44 94 64 38 107 107 107 187 0 121-98 219-219 219-121 0-219-98-219-219 0-61 25-117 66-156h-115c30 33 49 76 49 125 0 103-84 187-187 187s-188-84-188-187c0-57 26-107 65-141-38-22-65-62-65-109v-250c0-70 56-126 125-126h500c69 0 125 56 125 126l188-126c34 0 62 28 62 63v375c0 35-28 63-62 63z m-750 0c-69 0-125 56-125 125s56 125 125 125 125-56 125-125-56-125-125-125z m406-1c-87 0-157 70-157 157 0 86 70 156 157 156s156-70 156-156-70-157-156-157z\",ascent:850,descent:-150},question:{width:857.1,path:\"m500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-14 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-16-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z\",ascent:850,descent:-150},disk:{width:857.1,path:\"m214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-8 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z\",ascent:850,descent:-150},lasso:{width:1031,path:\"m1018 538c-36 207-290 336-568 286-277-48-473-256-436-463 10-57 36-108 76-151-13-66 11-137 68-183 34-28 75-41 114-42l-55-70 0 0c-2-1-3-2-4-3-10-14-8-34 5-45 14-11 34-8 45 4 1 1 2 3 2 5l0 0 113 140c16 11 31 24 45 40 4 3 6 7 8 11 48-3 100 0 151 9 278 48 473 255 436 462z m-624-379c-80 14-149 48-197 96 42 42 109 47 156 9 33-26 47-66 41-105z m-187-74c-19 16-33 37-39 60 50-32 109-55 174-68-42-25-95-24-135 8z m360 75c-34-7-69-9-102-8 8 62-16 128-68 170-73 59-175 54-244-5-9 20-16 40-20 61-28 159 121 317 333 354s407-60 434-217c28-159-121-318-333-355z\",ascent:850,descent:-150},selectbox:{width:1e3,path:\"m0 850l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-285l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z\",ascent:850,descent:-150},spikeline:{width:1e3,path:\"M512 409c0-57-46-104-103-104-57 0-104 47-104 104 0 57 47 103 104 103 57 0 103-46 103-103z m-327-39l92 0 0 92-92 0z m-185 0l92 0 0 92-92 0z m370-186l92 0 0 93-92 0z m0-184l92 0 0 92-92 0z\",ascent:850,descent:-150}}},{}],3:[function(t,e,r){\"use strict\";e.exports=t(\"../src/traces/bar\")},{\"../src/traces/bar\":220}],4:[function(t,e,r){\"use strict\";e.exports=t(\"../src/core\")},{\"../src/core\":125}],5:[function(t,e,r){\"use strict\";var n=t(\"./core\");n.register([t(\"./bar\"),t(\"./pie\")]),e.exports=n},{\"./bar\":3,\"./core\":4,\"./pie\":6}],6:[function(t,e,r){\"use strict\";e.exports=t(\"../src/traces/pie\")},{\"../src/traces/pie\":233}],7:[function(e,r,n){!function(){function e(t){return t&&(t.ownerDocument||t.document||t).documentElement}function n(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}function a(t,e){return t<e?-1:t>e?1:t>=e?0:0/0}function o(t){return null===t?0/0:+t}function i(t){return!isNaN(t)}function l(t){return{left:function(e,r,n,a){for(arguments.length<3&&(n=0),arguments.length<4&&(a=e.length);n<a;){var o=n+a>>>1;t(e[o],r)<0?n=o+1:a=o}return n},right:function(e,r,n,a){for(arguments.length<3&&(n=0),arguments.length<4&&(a=e.length);n<a;){var o=n+a>>>1;t(e[o],r)>0?a=o:n=o+1}return n}}}function s(t){return t.length}function c(t){for(var e=1;t*e%1;)e*=10;return e}function u(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function f(){this._=Object.create(null)}function d(t){return(t+=\"\")===_i||t[0]===wi?wi+t:t}function h(t){return(t+=\"\")[0]===wi?t.slice(1):t}function p(t){return d(t)in this._}function g(t){return(t=d(t))in this._&&delete this._[t]}function v(){var t=[];for(var e in this._)t.push(h(e));return t}function m(){var t=0;for(var e in this._)++t;return t}function y(){for(var t in this._)return!1;return!0}function x(){this._=Object.create(null)}function b(t){return t}function _(t,e,r){return function(){var n=r.apply(e,arguments);return n===e?t:n}}function w(t,e){if(e in t)return e;e=e.charAt(0).toUpperCase()+e.slice(1);for(var r=0,n=ki.length;r<n;++r){var a=ki[r]+e;if(a in t)return a}}function k(){}function M(){}function A(t){function e(){for(var e,n=r,a=-1,o=n.length;++a<o;)(e=n[a].on)&&e.apply(this,arguments);return t}var r=[],n=new f;return e.on=function(e,a){var o,i=n.get(e);return arguments.length<2?i&&i.on:(i&&(i.on=null,r=r.slice(0,o=r.indexOf(i)).concat(r.slice(o+1)),n.remove(e)),a&&r.push(n.set(e,{on:a})),t)},e}function T(){ui.event.preventDefault()}function L(){for(var t,e=ui.event;t=e.sourceEvent;)e=t;return e}function C(t){for(var e=new M,r=0,n=arguments.length;++r<n;)e[arguments[r]]=A(e);return e.of=function(r,n){return function(a){try{var o=a.sourceEvent=ui.event;a.target=t,ui.event=a,e[a.type].apply(r,n)}finally{ui.event=o}}},e}function S(t){return Ai(t,Si),t}function z(t){return\"function\"==typeof t?t:function(){return Ti(t,this)}}function O(t){return\"function\"==typeof t?t:function(){return Li(t,this)}}function D(t,e){function r(){this.removeAttribute(t)}function n(){this.removeAttributeNS(t.space,t.local)}function a(){this.setAttribute(t,e)}function o(){this.setAttributeNS(t.space,t.local,e)}function i(){var r=e.apply(this,arguments);null==r?this.removeAttribute(t):this.setAttribute(t,r)}function l(){var r=e.apply(this,arguments);null==r?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}return t=ui.ns.qualify(t),null==e?t.local?n:r:\"function\"==typeof e?t.local?l:i:t.local?o:a}function P(t){return t.trim().replace(/\\s+/g,\" \")}function E(t){return new RegExp(\"(?:^|\\\\s+)\"+ui.requote(t)+\"(?:\\\\s+|$)\",\"g\")}function N(t){return(t+\"\").trim().split(/^|\\s+/)}function I(t,e){function r(){for(var r=-1;++r<a;)t[r](this,e)}function n(){for(var r=-1,n=e.apply(this,arguments);++r<a;)t[r](this,n)}t=N(t).map(R);var a=t.length;return\"function\"==typeof e?n:r}function R(t){var e=E(t);return function(r,n){if(a=r.classList)return n?a.add(t):a.remove(t);var a=r.getAttribute(\"class\")||\"\";n?(e.lastIndex=0,e.test(a)||r.setAttribute(\"class\",P(a+\" \"+t))):r.setAttribute(\"class\",P(a.replace(e,\" \")))}}function F(t,e,r){function n(){this.style.removeProperty(t)}function a(){this.style.setProperty(t,e,r)}function o(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,r)}return null==e?n:\"function\"==typeof e?o:a}function j(t,e){function r(){delete this[t]}function n(){this[t]=e}function a(){var r=e.apply(this,arguments);null==r?delete this[t]:this[t]=r}return null==e?r:\"function\"==typeof e?a:n}function B(t){function e(){var e=this.ownerDocument,r=this.namespaceURI;return r===zi&&e.documentElement.namespaceURI===zi?e.createElement(t):e.createElementNS(r,t)}function r(){return this.ownerDocument.createElementNS(t.space,t.local)}return\"function\"==typeof t?t:(t=ui.ns.qualify(t)).local?r:e}function q(){var t=this.parentNode;t&&t.removeChild(this)}function H(t){return{__data__:t}}function V(t){return function(){return Ci(this,t)}}function U(t){return arguments.length||(t=a),function(e,r){return e&&r?t(e.__data__,r.__data__):!e-!r}}function X(t,e){for(var r=0,n=t.length;r<n;r++)for(var a,o=t[r],i=0,l=o.length;i<l;i++)(a=o[i])&&e(a,i,r);return t}function G(t){return Ai(t,Di),t}function Y(t){var e,r;return function(n,a,o){var i,l=t[o].update,s=l.length;for(o!=r&&(r=o,e=0),a>=e&&(e=a+1);!(i=l[e])&&++e<s;);return i}}function Z(t,e,r){function n(){var e=this[i];e&&(this.removeEventListener(t,e,e.$),delete this[i])}function a(){var a=s(e,di(arguments));n.call(this),this.addEventListener(t,this[i]=a,a.$=r),a._=e}function o(){var e,r=new RegExp(\"^__on([^.]+)\"+ui.requote(t)+\"$\");for(var n in this)if(e=n.match(r)){var a=this[n];this.removeEventListener(e[1],a,a.$),delete this[n]}}var i=\"__on\"+t,l=t.indexOf(\".\"),s=W;l>0&&(t=t.slice(0,l));var c=Pi.get(t);return c&&(t=c,s=$),l?e?a:n:e?k:o}function W(t,e){return function(r){var n=ui.event;ui.event=r,e[0]=this.__data__;try{t.apply(this,e)}finally{ui.event=n}}}function $(t,e){var r=W(t,e);return function(t){var e=this,n=t.relatedTarget;n&&(n===e||8&n.compareDocumentPosition(e))||r.call(e,t)}}function Q(t){var r=\".dragsuppress-\"+ ++Ni,a=\"click\"+r,o=ui.select(n(t)).on(\"touchmove\"+r,T).on(\"dragstart\"+r,T).on(\"selectstart\"+r,T);if(null==Ei&&(Ei=!(\"onselectstart\"in t)&&w(t.style,\"userSelect\")),Ei){var i=e(t).style,l=i[Ei];i[Ei]=\"none\"}return function(t){if(o.on(r,null),Ei&&(i[Ei]=l),t){var e=function(){o.on(a,null)};o.on(a,function(){T(),e()},!0),setTimeout(e,0)}}}function J(t,e){e.changedTouches&&(e=e.changedTouches[0]);var r=t.ownerSVGElement||t;if(r.createSVGPoint){var a=r.createSVGPoint();if(Ii<0){var o=n(t);if(o.scrollX||o.scrollY){r=ui.select(\"body\").append(\"svg\").style({position:\"absolute\",top:0,left:0,margin:0,padding:0,border:\"none\"},\"important\");var i=r[0][0].getScreenCTM();Ii=!(i.f||i.e),r.remove()}}return Ii?(a.x=e.pageX,a.y=e.pageY):(a.x=e.clientX,a.y=e.clientY),a=a.matrixTransform(t.getScreenCTM().inverse()),[a.x,a.y]}var l=t.getBoundingClientRect();return[e.clientX-l.left-t.clientLeft,e.clientY-l.top-t.clientTop]}function K(){return ui.event.changedTouches[0].identifier}function tt(t){return t>0?1:t<0?-1:0}function et(t,e,r){return(e[0]-t[0])*(r[1]-t[1])-(e[1]-t[1])*(r[0]-t[0])}function rt(t){return t>1?0:t<-1?ji:Math.acos(t)}function nt(t){return t>1?Hi:t<-1?-Hi:Math.asin(t)}function at(t){return((t=Math.exp(t))-1/t)/2}function ot(t){return((t=Math.exp(t))+1/t)/2}function it(t){return((t=Math.exp(2*t))-1)/(t+1)}function lt(t){return(t=Math.sin(t/2))*t}function st(){}function ct(t,e,r){return this instanceof ct?(this.h=+t,this.s=+e,void(this.l=+r)):arguments.length<2?t instanceof ct?new ct(t.h,t.s,t.l):kt(\"\"+t,Mt,ct):new ct(t,e,r)}function ut(t,e,r){function n(t){return t>360?t-=360:t<0&&(t+=360),t<60?o+(i-o)*t/60:t<180?i:t<240?o+(i-o)*(240-t)/60:o}function a(t){return Math.round(255*n(t))}var o,i;return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)?0:e<0?0:e>1?1:e,r=r<0?0:r>1?1:r,i=r<=.5?r*(1+e):r+e-r*e,o=2*r-i,new xt(a(t+120),a(t),a(t-120))}function ft(t,e,r){return this instanceof ft?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof ft?new ft(t.h,t.c,t.l):t instanceof ht?gt(t.l,t.a,t.b):gt((t=At((t=ui.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new ft(t,e,r)}function dt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new ht(r,Math.cos(t*=Vi)*e,Math.sin(t)*e)}function ht(t,e,r){return this instanceof ht?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof ht?new ht(t.l,t.a,t.b):t instanceof ft?dt(t.h,t.c,t.l):At((t=xt(t)).r,t.g,t.b):new ht(t,e,r)}function pt(t,e,r){var n=(t+16)/116,a=n+e/500,o=n-r/200;return a=vt(a)*Ji,n=vt(n)*Ki,o=vt(o)*tl,new xt(yt(3.2404542*a-1.5371385*n-.4985314*o),yt(-.969266*a+1.8760108*n+.041556*o),yt(.0556434*a-.2040259*n+1.0572252*o))}function gt(t,e,r){return t>0?new ft(Math.atan2(r,e)*Ui,Math.sqrt(e*e+r*r),t):new ft(0/0,0/0,t)}function vt(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function mt(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function yt(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function xt(t,e,r){return this instanceof xt?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof xt?new xt(t.r,t.g,t.b):kt(\"\"+t,xt,ut):new xt(t,e,r)}function bt(t){return new xt(t>>16,t>>8&255,255&t)}function _t(t){return bt(t)+\"\"}function wt(t){return t<16?\"0\"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function kt(t,e,r){var n,a,o,i=0,l=0,s=0;if(n=/([a-z]+)\\((.*)\\)/.exec(t=t.toLowerCase()))switch(a=n[2].split(\",\"),n[1]){case\"hsl\":return r(parseFloat(a[0]),parseFloat(a[1])/100,parseFloat(a[2])/100);case\"rgb\":return e(Lt(a[0]),Lt(a[1]),Lt(a[2]))}return(o=nl.get(t))?e(o.r,o.g,o.b):(null==t||\"#\"!==t.charAt(0)||isNaN(o=parseInt(t.slice(1),16))||(4===t.length?(i=(3840&o)>>4,i|=i>>4,l=240&o,l|=l>>4,s=15&o,s|=s<<4):7===t.length&&(i=(16711680&o)>>16,l=(65280&o)>>8,s=255&o)),e(i,l,s))}function Mt(t,e,r){var n,a,o=Math.min(t/=255,e/=255,r/=255),i=Math.max(t,e,r),l=i-o,s=(i+o)/2;return l?(a=s<.5?l/(i+o):l/(2-i-o),n=t==i?(e-r)/l+(e<r?6:0):e==i?(r-t)/l+2:(t-e)/l+4,n*=60):(n=0/0,a=s>0&&s<1?0:n),new ct(n,a,s)}function At(t,e,r){t=Tt(t),e=Tt(e),r=Tt(r);var n=mt((.4124564*t+.3575761*e+.1804375*r)/Ji),a=mt((.2126729*t+.7151522*e+.072175*r)/Ki);return ht(116*a-16,500*(n-a),200*(a-mt((.0193339*t+.119192*e+.9503041*r)/tl)))}function Tt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Lt(t){var e=parseFloat(t);return\"%\"===t.charAt(t.length-1)?Math.round(2.55*e):e}function Ct(t){return\"function\"==typeof t?t:function(){return t}}function St(t){return function(e,r,n){return 2===arguments.length&&\"function\"==typeof r&&(n=r,r=null),zt(e,r,t,n)}}function zt(t,e,r,n){function a(){var t,e=s.status;if(!e&&Dt(s)||e>=200&&e<300||304===e){try{t=r.call(o,s)}catch(t){return void i.error.call(o,t)}i.load.call(o,t)}else i.error.call(o,s)}var o={},i=ui.dispatch(\"beforesend\",\"progress\",\"load\",\"error\"),l={},s=new XMLHttpRequest,c=null;return!this.XDomainRequest||\"withCredentials\"in s||!/^(http(s)?:)?\\/\\//.test(t)||(s=new XDomainRequest),\"onload\"in s?s.onload=s.onerror=a:s.onreadystatechange=function(){s.readyState>3&&a()},s.onprogress=function(t){var e=ui.event;ui.event=t;try{i.progress.call(o,s)}finally{ui.event=e}},o.header=function(t,e){return t=(t+\"\").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+\"\",o)},o.mimeType=function(t){return arguments.length?(e=null==t?null:t+\"\",o):e},o.responseType=function(t){return arguments.length?(c=t,o):c},o.response=function(t){return r=t,o},[\"get\",\"post\"].forEach(function(t){o[t]=function(){return o.send.apply(o,[t].concat(di(arguments)))}}),o.send=function(r,n,a){if(2===arguments.length&&\"function\"==typeof n&&(a=n,n=null),s.open(r,t,!0),null==e||\"accept\"in l||(l.accept=e+\",*/*\"),s.setRequestHeader)for(var u in l)s.setRequestHeader(u,l[u]);return null!=e&&s.overrideMimeType&&s.overrideMimeType(e),null!=c&&(s.responseType=c),null!=a&&o.on(\"error\",a).on(\"load\",function(t){a(null,t)}),i.beforesend.call(o,s),s.send(null==n?null:n),o},o.abort=function(){return s.abort(),o},ui.rebind(o,i,\"on\"),null==n?o:o.get(Ot(n))}function Ot(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}function Dt(t){var e=t.responseType;return e&&\"text\"!==e?t.response:t.responseText}function Pt(t,e,r){var n=arguments.length;n<2&&(e=0),n<3&&(r=Date.now());var a=r+e,o={c:t,t:a,n:null};return ol?ol.n=o:al=o,ol=o,il||(ll=clearTimeout(ll),il=1,sl(Et)),o}function Et(){var t=Nt(),e=It()-t;e>24?(isFinite(e)&&(clearTimeout(ll),ll=setTimeout(Et,e)),il=0):(il=1,sl(Et))}function Nt(){for(var t=Date.now(),e=al;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function It(){for(var t,e=al,r=1/0;e;)e.c?(e.t<r&&(r=e.t),e=(t=e).n):e=t?t.n=e.n:al=e.n;return ol=t,r}function Rt(t,e){return e-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function Ft(t,e){var r=Math.pow(10,3*bi(8-e));return{scale:e>8?function(t){return t/r}:function(t){return t*r},symbol:t}}function jt(t){var e=t.decimal,r=t.thousands,n=t.grouping,a=t.currency,o=n&&r?function(t,e){for(var a=t.length,o=[],i=0,l=n[0],s=0;a>0&&l>0&&(s+l+1>e&&(l=Math.max(1,e-s)),o.push(t.substring(a-=l,a+l)),!((s+=l+1)>e));)l=n[i=(i+1)%n.length];return o.reverse().join(r)}:b;return function(t){var r=ul.exec(t),n=r[1]||\" \",i=r[2]||\">\",l=r[3]||\"-\",s=r[4]||\"\",c=r[5],u=+r[6],f=r[7],d=r[8],h=r[9],p=1,g=\"\",v=\"\",m=!1,y=!0;switch(d&&(d=+d.substring(1)),(c||\"0\"===n&&\"=\"===i)&&(c=n=\"0\",i=\"=\"),h){case\"n\":f=!0,h=\"g\";break;case\"%\":p=100,v=\"%\",h=\"f\";break;case\"p\":p=100,v=\"%\",h=\"r\";break;case\"b\":case\"o\":case\"x\":case\"X\":\"#\"===s&&(g=\"0\"+h.toLowerCase());case\"c\":y=!1;case\"d\":m=!0,d=0;break;case\"s\":p=-1,h=\"r\"}\"$\"===s&&(g=a[0],v=a[1]),\"r\"!=h||d||(h=\"g\"),null!=d&&(\"g\"==h?d=Math.max(1,Math.min(21,d)):\"e\"!=h&&\"f\"!=h||(d=Math.max(0,Math.min(20,d)))),h=fl.get(h)||Bt;var x=c&&f;return function(t){var r=v;if(m&&t%1)return\"\";var a=t<0||0===t&&1/t<0?(t=-t,\"-\"):\"-\"===l?\"\":l;if(p<0){var s=ui.formatPrefix(t,d);t=s.scale(t),r=s.symbol+v}else t*=p;t=h(t,d);var b,_,w=t.lastIndexOf(\".\");if(w<0){var k=y?t.lastIndexOf(\"e\"):-1;k<0?(b=t,_=\"\"):(b=t.substring(0,k),_=t.substring(k))}else b=t.substring(0,w),_=e+t.substring(w+1);!c&&f&&(b=o(b,1/0));var M=g.length+b.length+_.length+(x?0:a.length),A=M<u?new Array(M=u-M+1).join(n):\"\";return x&&(b=o(A+b,A.length?u-_.length:1/0)),a+=g,t=b+_,(\"<\"===i?a+t+A:\">\"===i?A+a+t:\"^\"===i?A.substring(0,M>>=1)+a+t+A.substring(M):a+(x?t:A+t))+r}}}function Bt(t){return t+\"\"}function qt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ht(t,e,r){function n(e){var r=t(e),n=o(r,1);return e-r<n-e?r:n}function a(r){return e(r=t(new hl(r-1)),1),r}function o(t,r){return e(t=new hl(+t),r),t}function i(t,n,o){var i=a(t),l=[];if(o>1)for(;i<n;)r(i)%o||l.push(new Date(+i)),e(i,1);else for(;i<n;)l.push(new Date(+i)),e(i,1);return l}function l(t,e,r){try{hl=qt;var n=new qt;return n._=t,i(n,e,r)}finally{hl=Date}}t.floor=t,t.round=n,t.ceil=a,t.offset=o,t.range=i;var s=t.utc=Vt(t);return s.floor=s,s.round=Vt(n),s.ceil=Vt(a),s.offset=Vt(o),s.range=l,t}function Vt(t){return function(e,r){try{hl=qt;var n=new qt;return n._=e,t(n,r)._}finally{hl=Date}}}function Ut(t){function e(t){function e(e){for(var r,a,o,i=[],l=-1,s=0;++l<n;)37===t.charCodeAt(l)&&(i.push(t.slice(s,l)),null!=(a=gl[r=t.charAt(++l)])&&(r=t.charAt(++l)),(o=C[r])&&(r=o(e,null==a?\"e\"===r?\" \":\"0\":a)),i.push(r),s=l+1);return i.push(t.slice(s,l)),i.join(\"\")}var n=t.length;return e.parse=function(e){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null};if(r(n,t,e,0)!=e.length)return null;\"p\"in n&&(n.H=n.H%12+12*n.p);var a=null!=n.Z&&hl!==qt,o=new(a?qt:hl);return\"j\"in n?o.setFullYear(n.y,0,n.j):\"W\"in n||\"U\"in n?(\"w\"in n||(n.w=\"W\"in n?1:0),o.setFullYear(n.y,0,1),o.setFullYear(n.y,0,\"W\"in n?(n.w+6)%7+7*n.W-(o.getDay()+5)%7:n.w+7*n.U-(o.getDay()+6)%7)):o.setFullYear(n.y,n.m,n.d),o.setHours(n.H+(n.Z/100|0),n.M+n.Z%100,n.S,n.L),a?o._:o},e.toString=function(){return t},e}function r(t,e,r,n){for(var a,o,i,l=0,s=e.length,c=r.length;l<s;){if(n>=c)return-1;if(37===(a=e.charCodeAt(l++))){if(i=e.charAt(l++),!(o=S[i in gl?e.charAt(l++):i])||(n=o(t,r,n))<0)return-1}else if(a!=r.charCodeAt(n++))return-1}return n}function n(t,e,r){w.lastIndex=0;var n=w.exec(e.slice(r));return n?(t.w=k.get(n[0].toLowerCase()),r+n[0].length):-1}function a(t,e,r){b.lastIndex=0;var n=b.exec(e.slice(r));return n?(t.w=_.get(n[0].toLowerCase()),r+n[0].length):-1}function o(t,e,r){T.lastIndex=0;var n=T.exec(e.slice(r));return n?(t.m=L.get(n[0].toLowerCase()),r+n[0].length):-1}function i(t,e,r){M.lastIndex=0;var n=M.exec(e.slice(r));return n?(t.m=A.get(n[0].toLowerCase()),r+n[0].length):-1}function l(t,e,n){return r(t,C.c.toString(),e,n)}function s(t,e,n){return r(t,C.x.toString(),e,n)}function c(t,e,n){return r(t,C.X.toString(),e,n)}function u(t,e,r){var n=x.get(e.slice(r,r+=2).toLowerCase());return null==n?-1:(t.p=n,r)}var f=t.dateTime,d=t.date,h=t.time,p=t.periods,g=t.days,v=t.shortDays,m=t.months,y=t.shortMonths;e.utc=function(t){function r(t){try{hl=qt;var e=new hl;return e._=t,n(e)}finally{hl=Date}}var n=e(t);return r.parse=function(t){try{hl=qt;var e=n.parse(t);return e&&e._}finally{hl=Date}},r.toString=n.toString,r},e.multi=e.utc.multi=ue;var x=ui.map(),b=Gt(g),_=Yt(g),w=Gt(v),k=Yt(v),M=Gt(m),A=Yt(m),T=Gt(y),L=Yt(y);p.forEach(function(t,e){x.set(t.toLowerCase(),e)});var C={a:function(t){return v[t.getDay()]},A:function(t){return g[t.getDay()]},b:function(t){return y[t.getMonth()]},B:function(t){return m[t.getMonth()]},c:e(f),d:function(t,e){return Xt(t.getDate(),e,2)},e:function(t,e){return Xt(t.getDate(),e,2)},H:function(t,e){return Xt(t.getHours(),e,2)},I:function(t,e){return Xt(t.getHours()%12||12,e,2)},j:function(t,e){return Xt(1+dl.dayOfYear(t),e,3)},L:function(t,e){return Xt(t.getMilliseconds(),e,3)},m:function(t,e){return Xt(t.getMonth()+1,e,2)},M:function(t,e){return Xt(t.getMinutes(),e,2)},p:function(t){return p[+(t.getHours()>=12)]},S:function(t,e){return Xt(t.getSeconds(),e,2)},U:function(t,e){return Xt(dl.sundayOfYear(t),e,2)},w:function(t){return t.getDay()},W:function(t,e){return Xt(dl.mondayOfYear(t),e,2)},x:e(d),X:e(h),y:function(t,e){return Xt(t.getFullYear()%100,e,2)},Y:function(t,e){return Xt(t.getFullYear()%1e4,e,4)},Z:se,\"%\":function(){return\"%\"}},S={a:n,A:a,b:o,B:i,c:l,d:re,e:re,H:ae,I:ae,j:ne,L:le,m:ee,M:oe,p:u,S:ie,U:Wt,w:Zt,W:$t,x:s,X:c,y:Jt,Y:Qt,Z:Kt,\"%\":ce};return e}function Xt(t,e,r){var n=t<0?\"-\":\"\",a=(n?-t:t)+\"\",o=a.length;return n+(o<r?new Array(r-o+1).join(e)+a:a)}function Gt(t){return new RegExp(\"^(?:\"+t.map(ui.requote).join(\"|\")+\")\",\"i\")}function Yt(t){for(var e=new f,r=-1,n=t.length;++r<n;)e.set(t[r].toLowerCase(),r);return e}function Zt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function Wt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r));return n?(t.U=+n[0],r+n[0].length):-1}function $t(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r));return n?(t.W=+n[0],r+n[0].length):-1}function Qt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function Jt(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.y=te(+n[0]),r+n[0].length):-1}function Kt(t,e,r){return/^[+-]\\d{4}$/.test(e=e.slice(r,r+5))?(t.Z=-e,r+5):-1}function te(t){return t+(t>68?1900:2e3)}function ee(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function re(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function ne(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+3));return n?(t.j=+n[0],r+n[0].length):-1}function ae(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function oe(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function ie(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function le(t,e,r){vl.lastIndex=0;var n=vl.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function se(t){var e=t.getTimezoneOffset(),r=e>0?\"-\":\"+\",n=bi(e)/60|0,a=bi(e)%60;return r+Xt(n,\"0\",2)+Xt(a,\"0\",2)}function ce(t,e,r){ml.lastIndex=0;var n=ml.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function ue(t){\n",
|
|
"for(var e=t.length,r=-1;++r<e;)t[r][0]=this(t[r][0]);return function(e){for(var r=0,n=t[r];!n[1](e);)n=t[++r];return n[0](e)}}function fe(){}function de(t,e,r){var n=r.s=t+e,a=n-t,o=n-a;r.t=t-o+(e-a)}function he(t,e){t&&_l.hasOwnProperty(t.type)&&_l[t.type](t,e)}function pe(t,e,r){var n,a=-1,o=t.length-r;for(e.lineStart();++a<o;)n=t[a],e.point(n[0],n[1],n[2]);e.lineEnd()}function ge(t,e){var r=-1,n=t.length;for(e.polygonStart();++r<n;)pe(t[r],e,1);e.polygonEnd()}function ve(){function t(t,e){t*=Vi,e=e*Vi/2+ji/4;var r=t-n,i=r>=0?1:-1,l=i*r,s=Math.cos(e),c=Math.sin(e),u=o*c,f=a*s+u*Math.cos(l),d=u*i*Math.sin(l);kl.add(Math.atan2(d,f)),n=t,a=s,o=c}var e,r,n,a,o;Ml.point=function(i,l){Ml.point=t,n=(e=i)*Vi,a=Math.cos(l=(r=l)*Vi/2+ji/4),o=Math.sin(l)},Ml.lineEnd=function(){t(e,r)}}function me(t){var e=t[0],r=t[1],n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}function ye(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function xe(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function be(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function _e(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function we(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function ke(t){return[Math.atan2(t[1],t[0]),nt(t[2])]}function Me(t,e){return bi(t[0]-e[0])<Ri&&bi(t[1]-e[1])<Ri}function Ae(t,e){t*=Vi;var r=Math.cos(e*=Vi);Te(r*Math.cos(t),r*Math.sin(t),Math.sin(e))}function Te(t,e,r){++Al,Ll+=(t-Ll)/Al,Cl+=(e-Cl)/Al,Sl+=(r-Sl)/Al}function Le(){function t(t,a){t*=Vi;var o=Math.cos(a*=Vi),i=o*Math.cos(t),l=o*Math.sin(t),s=Math.sin(a),c=Math.atan2(Math.sqrt((c=r*s-n*l)*c+(c=n*i-e*s)*c+(c=e*l-r*i)*c),e*i+r*l+n*s);Tl+=c,zl+=c*(e+(e=i)),Ol+=c*(r+(r=l)),Dl+=c*(n+(n=s)),Te(e,r,n)}var e,r,n;Il.point=function(a,o){a*=Vi;var i=Math.cos(o*=Vi);e=i*Math.cos(a),r=i*Math.sin(a),n=Math.sin(o),Il.point=t,Te(e,r,n)}}function Ce(){Il.point=Ae}function Se(){function t(t,e){t*=Vi;var r=Math.cos(e*=Vi),i=r*Math.cos(t),l=r*Math.sin(t),s=Math.sin(e),c=a*s-o*l,u=o*i-n*s,f=n*l-a*i,d=Math.sqrt(c*c+u*u+f*f),h=n*i+a*l+o*s,p=d&&-rt(h)/d,g=Math.atan2(d,h);Pl+=p*c,El+=p*u,Nl+=p*f,Tl+=g,zl+=g*(n+(n=i)),Ol+=g*(a+(a=l)),Dl+=g*(o+(o=s)),Te(n,a,o)}var e,r,n,a,o;Il.point=function(i,l){e=i,r=l,Il.point=t,i*=Vi;var s=Math.cos(l*=Vi);n=s*Math.cos(i),a=s*Math.sin(i),o=Math.sin(l),Te(n,a,o)},Il.lineEnd=function(){t(e,r),Il.lineEnd=Ce,Il.point=Ae}}function ze(t,e){function r(r,n){return r=t(r,n),e(r[0],r[1])}return t.invert&&e.invert&&(r.invert=function(r,n){return(r=e.invert(r,n))&&t.invert(r[0],r[1])}),r}function Oe(){return!0}function De(t,e,r,n,a){var o=[],i=[];if(t.forEach(function(t){if(!((e=t.length-1)<=0)){var e,r=t[0],n=t[e];if(Me(r,n)){a.lineStart();for(var l=0;l<e;++l)a.point((r=t[l])[0],r[1]);return void a.lineEnd()}var s=new Ee(r,t,null,!0),c=new Ee(r,null,s,!1);s.o=c,o.push(s),i.push(c),s=new Ee(n,t,null,!1),c=new Ee(n,null,s,!0),s.o=c,o.push(s),i.push(c)}}),i.sort(e),Pe(o),Pe(i),o.length){for(var l=0,s=r,c=i.length;l<c;++l)i[l].e=s=!s;for(var u,f,d=o[0];;){for(var h=d,p=!0;h.v;)if((h=h.n)===d)return;u=h.z,a.lineStart();do{if(h.v=h.o.v=!0,h.e){if(p)for(var l=0,c=u.length;l<c;++l)a.point((f=u[l])[0],f[1]);else n(h.x,h.n.x,1,a);h=h.n}else{if(p){u=h.p.z;for(var l=u.length-1;l>=0;--l)a.point((f=u[l])[0],f[1])}else n(h.x,h.p.x,-1,a);h=h.p}h=h.o,u=h.z,p=!p}while(!h.v);a.lineEnd()}}}function Pe(t){if(e=t.length){for(var e,r,n=0,a=t[0];++n<e;)a.n=r=t[n],r.p=a,a=r;a.n=r=t[0],r.p=a}}function Ee(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function Ne(t,e,r,n){return function(a,o){function i(e,r){var n=a(e,r);t(e=n[0],r=n[1])&&o.point(e,r)}function l(t,e){var r=a(t,e);v.point(r[0],r[1])}function s(){y.point=l,v.lineStart()}function c(){y.point=i,v.lineEnd()}function u(t,e){g.push([t,e]);var r=a(t,e);b.point(r[0],r[1])}function f(){b.lineStart(),g=[]}function d(){u(g[0][0],g[0][1]),b.lineEnd();var t,e=b.clean(),r=x.buffer(),n=r.length;if(g.pop(),p.push(g),g=null,n)if(1&e){t=r[0];var a,n=t.length-1,i=-1;if(n>0){for(_||(o.polygonStart(),_=!0),o.lineStart();++i<n;)o.point((a=t[i])[0],a[1]);o.lineEnd()}}else n>1&&2&e&&r.push(r.pop().concat(r.shift())),h.push(r.filter(Ie))}var h,p,g,v=e(o),m=a.invert(n[0],n[1]),y={point:i,lineStart:s,lineEnd:c,polygonStart:function(){y.point=u,y.lineStart=f,y.lineEnd=d,h=[],p=[]},polygonEnd:function(){y.point=i,y.lineStart=s,y.lineEnd=c,h=ui.merge(h);var t=He(m,p);h.length?(_||(o.polygonStart(),_=!0),De(h,Fe,t,r,o)):t&&(_||(o.polygonStart(),_=!0),o.lineStart(),r(null,null,1,o),o.lineEnd()),_&&(o.polygonEnd(),_=!1),h=p=null},sphere:function(){o.polygonStart(),o.lineStart(),r(null,null,1,o),o.lineEnd(),o.polygonEnd()}},x=Re(),b=e(x),_=!1;return y}}function Ie(t){return t.length>1}function Re(){var t,e=[];return{lineStart:function(){e.push(t=[])},point:function(e,r){t.push([e,r])},lineEnd:k,buffer:function(){var r=e;return e=[],t=null,r},rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))}}}function Fe(t,e){return((t=t.x)[0]<0?t[1]-Hi-Ri:Hi-t[1])-((e=e.x)[0]<0?e[1]-Hi-Ri:Hi-e[1])}function je(t){var e,r=0/0,n=0/0,a=0/0;return{lineStart:function(){t.lineStart(),e=1},point:function(o,i){var l=o>0?ji:-ji,s=bi(o-r);bi(s-ji)<Ri?(t.point(r,n=(n+i)/2>0?Hi:-Hi),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),t.point(o,n),e=0):a!==l&&s>=ji&&(bi(r-a)<Ri&&(r-=a*Ri),bi(o-l)<Ri&&(o-=l*Ri),n=Be(r,n,o,i),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),e=0),t.point(r=o,n=i),a=l},lineEnd:function(){t.lineEnd(),r=n=0/0},clean:function(){return 2-e}}}function Be(t,e,r,n){var a,o,i=Math.sin(t-r);return bi(i)>Ri?Math.atan((Math.sin(e)*(o=Math.cos(n))*Math.sin(r)-Math.sin(n)*(a=Math.cos(e))*Math.sin(t))/(a*o*i)):(e+n)/2}function qe(t,e,r,n){var a;if(null==t)a=r*Hi,n.point(-ji,a),n.point(0,a),n.point(ji,a),n.point(ji,0),n.point(ji,-a),n.point(0,-a),n.point(-ji,-a),n.point(-ji,0),n.point(-ji,a);else if(bi(t[0]-e[0])>Ri){var o=t[0]<e[0]?ji:-ji;a=r*o/2,n.point(-o,a),n.point(0,a),n.point(o,a)}else n.point(e[0],e[1])}function He(t,e){var r=t[0],n=t[1],a=[Math.sin(r),-Math.cos(r),0],o=0,i=0;kl.reset();for(var l=0,s=e.length;l<s;++l){var c=e[l],u=c.length;if(u)for(var f=c[0],d=f[0],h=f[1]/2+ji/4,p=Math.sin(h),g=Math.cos(h),v=1;;){v===u&&(v=0),t=c[v];var m=t[0],y=t[1]/2+ji/4,x=Math.sin(y),b=Math.cos(y),_=m-d,w=_>=0?1:-1,k=w*_,M=k>ji,A=p*x;if(kl.add(Math.atan2(A*w*Math.sin(k),g*b+A*Math.cos(k))),o+=M?_+w*Bi:_,M^d>=r^m>=r){var T=xe(me(f),me(t));we(T);var L=xe(a,T);we(L);var C=(M^_>=0?-1:1)*nt(L[2]);(n>C||n===C&&(T[0]||T[1]))&&(i+=M^_>=0?1:-1)}if(!v++)break;d=m,p=x,g=b,f=t}}return(o<-Ri||o<Ri&&kl<-Ri)^1&i}function Ve(t){function e(t,e){return Math.cos(t)*Math.cos(e)>o}function r(t){var r,o,s,c,u;return{lineStart:function(){c=s=!1,u=1},point:function(f,d){var h,p=[f,d],g=e(f,d),v=i?g?0:a(f,d):g?a(f+(f<0?ji:-ji),d):0;if(!r&&(c=s=g)&&t.lineStart(),g!==s&&(h=n(r,p),(Me(r,h)||Me(p,h))&&(p[0]+=Ri,p[1]+=Ri,g=e(p[0],p[1]))),g!==s)u=0,g?(t.lineStart(),h=n(p,r),t.point(h[0],h[1])):(h=n(r,p),t.point(h[0],h[1]),t.lineEnd()),r=h;else if(l&&r&&i^g){var m;v&o||!(m=n(p,r,!0))||(u=0,i?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1])))}!g||r&&Me(r,p)||t.point(p[0],p[1]),r=p,s=g,o=v},lineEnd:function(){s&&t.lineEnd(),r=null},clean:function(){return u|(c&&s)<<1}}}function n(t,e,r){var n=me(t),a=me(e),i=[1,0,0],l=xe(n,a),s=ye(l,l),c=l[0],u=s-c*c;if(!u)return!r&&t;var f=o*s/u,d=-o*c/u,h=xe(i,l),p=_e(i,f);be(p,_e(l,d));var g=h,v=ye(p,g),m=ye(g,g),y=v*v-m*(ye(p,p)-1);if(!(y<0)){var x=Math.sqrt(y),b=_e(g,(-v-x)/m);if(be(b,p),b=ke(b),!r)return b;var _,w=t[0],k=e[0],M=t[1],A=e[1];k<w&&(_=w,w=k,k=_);var T=k-w,L=bi(T-ji)<Ri,C=L||T<Ri;if(!L&&A<M&&(_=M,M=A,A=_),C?L?M+A>0^b[1]<(bi(b[0]-w)<Ri?M:A):M<=b[1]&&b[1]<=A:T>ji^(w<=b[0]&&b[0]<=k)){var S=_e(g,(-v+x)/m);return be(S,p),[b,ke(S)]}}}function a(e,r){var n=i?t:ji-t,a=0;return e<-n?a|=1:e>n&&(a|=2),r<-n?a|=4:r>n&&(a|=8),a}var o=Math.cos(t),i=o>0,l=bi(o)>Ri;return Ne(e,r,vr(t,6*Vi),i?[0,-t]:[-ji,t-ji])}function Ue(t,e,r,n){return function(a){var o,i=a.a,l=a.b,s=i.x,c=i.y,u=l.x,f=l.y,d=0,h=1,p=u-s,g=f-c;if(o=t-s,p||!(o>0)){if(o/=p,p<0){if(o<d)return;o<h&&(h=o)}else if(p>0){if(o>h)return;o>d&&(d=o)}if(o=r-s,p||!(o<0)){if(o/=p,p<0){if(o>h)return;o>d&&(d=o)}else if(p>0){if(o<d)return;o<h&&(h=o)}if(o=e-c,g||!(o>0)){if(o/=g,g<0){if(o<d)return;o<h&&(h=o)}else if(g>0){if(o>h)return;o>d&&(d=o)}if(o=n-c,g||!(o<0)){if(o/=g,g<0){if(o>h)return;o>d&&(d=o)}else if(g>0){if(o<d)return;o<h&&(h=o)}return d>0&&(a.a={x:s+d*p,y:c+d*g}),h<1&&(a.b={x:s+h*p,y:c+h*g}),a}}}}}}function Xe(t,e,r,n){function a(n,a){return bi(n[0]-t)<Ri?a>0?0:3:bi(n[0]-r)<Ri?a>0?2:1:bi(n[1]-e)<Ri?a>0?1:0:a>0?3:2}function o(t,e){return i(t.x,e.x)}function i(t,e){var r=a(t,1),n=a(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}return function(l){function s(t){for(var e=0,r=v.length,n=t[1],a=0;a<r;++a)for(var o,i=1,l=v[a],s=l.length,c=l[0];i<s;++i)o=l[i],c[1]<=n?o[1]>n&&et(c,o,t)>0&&++e:o[1]<=n&&et(c,o,t)<0&&--e,c=o;return 0!==e}function c(o,l,s,c){var u=0,f=0;if(null==o||(u=a(o,s))!==(f=a(l,s))||i(o,l)<0^s>0)do{c.point(0===u||3===u?t:r,u>1?n:e)}while((u=(u+s+4)%4)!==f);else c.point(l[0],l[1])}function u(a,o){return t<=a&&a<=r&&e<=o&&o<=n}function f(t,e){u(t,e)&&l.point(t,e)}function d(){S.point=p,v&&v.push(m=[]),M=!0,k=!1,_=w=0/0}function h(){g&&(p(y,x),b&&k&&L.rejoin(),g.push(L.buffer())),S.point=f,k&&l.lineEnd()}function p(t,e){t=Math.max(-Fl,Math.min(Fl,t)),e=Math.max(-Fl,Math.min(Fl,e));var r=u(t,e);if(v&&m.push([t,e]),M)y=t,x=e,b=r,M=!1,r&&(l.lineStart(),l.point(t,e));else if(r&&k)l.point(t,e);else{var n={a:{x:_,y:w},b:{x:t,y:e}};C(n)?(k||(l.lineStart(),l.point(n.a.x,n.a.y)),l.point(n.b.x,n.b.y),r||l.lineEnd(),A=!1):r&&(l.lineStart(),l.point(t,e),A=!1)}_=t,w=e,k=r}var g,v,m,y,x,b,_,w,k,M,A,T=l,L=Re(),C=Ue(t,e,r,n),S={point:f,lineStart:d,lineEnd:h,polygonStart:function(){l=L,g=[],v=[],A=!0},polygonEnd:function(){l=T,g=ui.merge(g);var e=s([t,n]),r=A&&e,a=g.length;(r||a)&&(l.polygonStart(),r&&(l.lineStart(),c(null,null,1,l),l.lineEnd()),a&&De(g,o,e,c,l),l.polygonEnd()),g=v=m=null}};return S}}function Ge(t){var e=0,r=ji/3,n=sr(t),a=n(e,r);return a.parallels=function(t){return arguments.length?n(e=t[0]*ji/180,r=t[1]*ji/180):[e/ji*180,r/ji*180]},a}function Ye(t,e){function r(t,e){var r=Math.sqrt(o-2*a*Math.sin(e))/a;return[r*Math.sin(t*=a),i-r*Math.cos(t)]}var n=Math.sin(t),a=(n+Math.sin(e))/2,o=1+n*(2*a-n),i=Math.sqrt(o)/a;return r.invert=function(t,e){var r=i-e;return[Math.atan2(t,r)/a,nt((o-(t*t+r*r)*a*a)/(2*a))]},r}function Ze(){function t(t,e){Bl+=a*t-n*e,n=t,a=e}var e,r,n,a;Xl.point=function(o,i){Xl.point=t,e=n=o,r=a=i},Xl.lineEnd=function(){t(e,r)}}function We(t,e){t<ql&&(ql=t),t>Vl&&(Vl=t),e<Hl&&(Hl=e),e>Ul&&(Ul=e)}function $e(){function t(t,e){i.push(\"M\",t,\",\",e,o)}function e(t,e){i.push(\"M\",t,\",\",e),l.point=r}function r(t,e){i.push(\"L\",t,\",\",e)}function n(){l.point=t}function a(){i.push(\"Z\")}var o=Qe(4.5),i=[],l={point:t,lineStart:function(){l.point=e},lineEnd:n,polygonStart:function(){l.lineEnd=a},polygonEnd:function(){l.lineEnd=n,l.point=t},pointRadius:function(t){return o=Qe(t),l},result:function(){if(i.length){var t=i.join(\"\");return i=[],t}}};return l}function Qe(t){return\"m0,\"+t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+-2*t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+2*t+\"z\"}function Je(t,e){Ll+=t,Cl+=e,++Sl}function Ke(){function t(t,n){var a=t-e,o=n-r,i=Math.sqrt(a*a+o*o);zl+=i*(e+t)/2,Ol+=i*(r+n)/2,Dl+=i,Je(e=t,r=n)}var e,r;Yl.point=function(n,a){Yl.point=t,Je(e=n,r=a)}}function tr(){Yl.point=Je}function er(){function t(t,e){var r=t-n,o=e-a,i=Math.sqrt(r*r+o*o);zl+=i*(n+t)/2,Ol+=i*(a+e)/2,Dl+=i,i=a*t-n*e,Pl+=i*(n+t),El+=i*(a+e),Nl+=3*i,Je(n=t,a=e)}var e,r,n,a;Yl.point=function(o,i){Yl.point=t,Je(e=n=o,r=a=i)},Yl.lineEnd=function(){t(e,r)}}function rr(t){function e(e,r){t.moveTo(e+i,r),t.arc(e,r,i,0,Bi)}function r(e,r){t.moveTo(e,r),l.point=n}function n(e,r){t.lineTo(e,r)}function a(){l.point=e}function o(){t.closePath()}var i=4.5,l={point:e,lineStart:function(){l.point=r},lineEnd:a,polygonStart:function(){l.lineEnd=o},polygonEnd:function(){l.lineEnd=a,l.point=e},pointRadius:function(t){return i=t,l},result:k};return l}function nr(t){function e(t){return(l?n:r)(t)}function r(e){return ir(e,function(r,n){r=t(r,n),e.point(r[0],r[1])})}function n(e){function r(r,n){r=t(r,n),e.point(r[0],r[1])}function n(){x=0/0,M.point=o,e.lineStart()}function o(r,n){var o=me([r,n]),i=t(r,n);a(x,b,y,_,w,k,x=i[0],b=i[1],y=r,_=o[0],w=o[1],k=o[2],l,e),e.point(x,b)}function i(){M.point=r,e.lineEnd()}function s(){n(),M.point=c,M.lineEnd=u}function c(t,e){o(f=t,d=e),h=x,p=b,g=_,v=w,m=k,M.point=o}function u(){a(x,b,y,_,w,k,h,p,f,g,v,m,l,e),M.lineEnd=i,i()}var f,d,h,p,g,v,m,y,x,b,_,w,k,M={point:r,lineStart:n,lineEnd:i,polygonStart:function(){e.polygonStart(),M.lineStart=s},polygonEnd:function(){e.polygonEnd(),M.lineStart=n}};return M}function a(e,r,n,l,s,c,u,f,d,h,p,g,v,m){var y=u-e,x=f-r,b=y*y+x*x;if(b>4*o&&v--){var _=l+h,w=s+p,k=c+g,M=Math.sqrt(_*_+w*w+k*k),A=Math.asin(k/=M),T=bi(bi(k)-1)<Ri||bi(n-d)<Ri?(n+d)/2:Math.atan2(w,_),L=t(T,A),C=L[0],S=L[1],z=C-e,O=S-r,D=x*z-y*O;(D*D/b>o||bi((y*z+x*O)/b-.5)>.3||l*h+s*p+c*g<i)&&(a(e,r,n,l,s,c,C,S,T,_/=M,w/=M,k,v,m),m.point(C,S),a(C,S,T,_,w,k,u,f,d,h,p,g,v,m))}}var o=.5,i=Math.cos(30*Vi),l=16;return e.precision=function(t){return arguments.length?(l=(o=t*t)>0&&16,e):Math.sqrt(o)},e}function ar(t){var e=nr(function(e,r){return t([e*Ui,r*Ui])});return function(t){return cr(e(t))}}function or(t){this.stream=t}function ir(t,e){return{point:e,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function lr(t){return sr(function(){return t})()}function sr(t){function e(t){return t=l(t[0]*Vi,t[1]*Vi),[t[0]*d+s,c-t[1]*d]}function r(t){return(t=l.invert((t[0]-s)/d,(c-t[1])/d))&&[t[0]*Ui,t[1]*Ui]}function n(){l=ze(i=dr(m,y,x),o);var t=o(g,v);return s=h-t[0]*d,c=p+t[1]*d,a()}function a(){return u&&(u.valid=!1,u=null),e}var o,i,l,s,c,u,f=nr(function(t,e){return t=o(t,e),[t[0]*d+s,c-t[1]*d]}),d=150,h=480,p=250,g=0,v=0,m=0,y=0,x=0,_=Rl,w=b,k=null,M=null;return e.stream=function(t){return u&&(u.valid=!1),u=cr(_(i,f(w(t)))),u.valid=!0,u},e.clipAngle=function(t){return arguments.length?(_=null==t?(k=t,Rl):Ve((k=+t)*Vi),a()):k},e.clipExtent=function(t){return arguments.length?(M=t,w=t?Xe(t[0][0],t[0][1],t[1][0],t[1][1]):b,a()):M},e.scale=function(t){return arguments.length?(d=+t,n()):d},e.translate=function(t){return arguments.length?(h=+t[0],p=+t[1],n()):[h,p]},e.center=function(t){return arguments.length?(g=t[0]%360*Vi,v=t[1]%360*Vi,n()):[g*Ui,v*Ui]},e.rotate=function(t){return arguments.length?(m=t[0]%360*Vi,y=t[1]%360*Vi,x=t.length>2?t[2]%360*Vi:0,n()):[m*Ui,y*Ui,x*Ui]},ui.rebind(e,f,\"precision\"),function(){return o=t.apply(this,arguments),e.invert=o.invert&&r,n()}}function cr(t){return ir(t,function(e,r){t.point(e*Vi,r*Vi)})}function ur(t,e){return[t,e]}function fr(t,e){return[t>ji?t-Bi:t<-ji?t+Bi:t,e]}function dr(t,e,r){return t?e||r?ze(pr(t),gr(e,r)):pr(t):e||r?gr(e,r):fr}function hr(t){return function(e,r){return e+=t,[e>ji?e-Bi:e<-ji?e+Bi:e,r]}}function pr(t){var e=hr(t);return e.invert=hr(-t),e}function gr(t,e){function r(t,e){var r=Math.cos(e),l=Math.cos(t)*r,s=Math.sin(t)*r,c=Math.sin(e),u=c*n+l*a;return[Math.atan2(s*o-u*i,l*n-c*a),nt(u*o+s*i)]}var n=Math.cos(t),a=Math.sin(t),o=Math.cos(e),i=Math.sin(e);return r.invert=function(t,e){var r=Math.cos(e),l=Math.cos(t)*r,s=Math.sin(t)*r,c=Math.sin(e),u=c*o-s*i;return[Math.atan2(s*o+c*i,l*n+u*a),nt(u*n-l*a)]},r}function vr(t,e){var r=Math.cos(t),n=Math.sin(t);return function(a,o,i,l){var s=i*e;null!=a?(a=mr(r,a),o=mr(r,o),(i>0?a<o:a>o)&&(a+=i*Bi)):(a=t+i*Bi,o=t-.5*s);for(var c,u=a;i>0?u>o:u<o;u-=s)l.point((c=ke([r,-n*Math.cos(u),-n*Math.sin(u)]))[0],c[1])}}function mr(t,e){var r=me(e);r[0]-=t,we(r);var n=rt(-r[1]);return((-r[2]<0?-n:n)+2*Math.PI-Ri)%(2*Math.PI)}function yr(t,e,r){var n=ui.range(t,e-Ri,r).concat(e);return function(t){return n.map(function(e){return[t,e]})}}function xr(t,e,r){var n=ui.range(t,e-Ri,r).concat(e);return function(t){return n.map(function(e){return[e,t]})}}function br(t){return t.source}function _r(t){return t.target}function wr(t,e,r,n){var a=Math.cos(e),o=Math.sin(e),i=Math.cos(n),l=Math.sin(n),s=a*Math.cos(t),c=a*Math.sin(t),u=i*Math.cos(r),f=i*Math.sin(r),d=2*Math.asin(Math.sqrt(lt(n-e)+a*i*lt(r-t))),h=1/Math.sin(d),p=d?function(t){var e=Math.sin(t*=d)*h,r=Math.sin(d-t)*h,n=r*s+e*u,a=r*c+e*f,i=r*o+e*l;return[Math.atan2(a,n)*Ui,Math.atan2(i,Math.sqrt(n*n+a*a))*Ui]}:function(){return[t*Ui,e*Ui]};return p.distance=d,p}function kr(){function t(t,a){var o=Math.sin(a*=Vi),i=Math.cos(a),l=bi((t*=Vi)-e),s=Math.cos(l);Zl+=Math.atan2(Math.sqrt((l=i*Math.sin(l))*l+(l=n*o-r*i*s)*l),r*o+n*i*s),e=t,r=o,n=i}var e,r,n;Wl.point=function(a,o){e=a*Vi,r=Math.sin(o*=Vi),n=Math.cos(o),Wl.point=t},Wl.lineEnd=function(){Wl.point=Wl.lineEnd=k}}function Mr(t,e){function r(e,r){var n=Math.cos(e),a=Math.cos(r),o=t(n*a);return[o*a*Math.sin(e),o*Math.sin(r)]}return r.invert=function(t,r){var n=Math.sqrt(t*t+r*r),a=e(n),o=Math.sin(a),i=Math.cos(a);return[Math.atan2(t*o,n*i),Math.asin(n&&r*o/n)]},r}function Ar(t,e){function r(t,e){i>0?e<-Hi+Ri&&(e=-Hi+Ri):e>Hi-Ri&&(e=Hi-Ri);var r=i/Math.pow(a(e),o);return[r*Math.sin(o*t),i-r*Math.cos(o*t)]}var n=Math.cos(t),a=function(t){return Math.tan(ji/4+t/2)},o=t===e?Math.sin(t):Math.log(n/Math.cos(e))/Math.log(a(e)/a(t)),i=n*Math.pow(a(t),o)/o;return o?(r.invert=function(t,e){var r=i-e,n=tt(o)*Math.sqrt(t*t+r*r);return[Math.atan2(t,r)/o,2*Math.atan(Math.pow(i/n,1/o))-Hi]},r):Lr}function Tr(t,e){function r(t,e){var r=o-e;return[r*Math.sin(a*t),o-r*Math.cos(a*t)]}var n=Math.cos(t),a=t===e?Math.sin(t):(n-Math.cos(e))/(e-t),o=n/a+t;return bi(a)<Ri?ur:(r.invert=function(t,e){var r=o-e;return[Math.atan2(t,r)/a,o-tt(a)*Math.sqrt(t*t+r*r)]},r)}function Lr(t,e){return[t,Math.log(Math.tan(ji/4+e/2))]}function Cr(t){var e,r=lr(t),n=r.scale,a=r.translate,o=r.clipExtent;return r.scale=function(){var t=n.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.translate=function(){var t=a.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.clipExtent=function(t){var i=o.apply(r,arguments);if(i===r){if(e=null==t){var l=ji*n(),s=a();o([[s[0]-l,s[1]-l],[s[0]+l,s[1]+l]])}}else e&&(i=null);return i},r.clipExtent(null)}function Sr(t,e){return[Math.log(Math.tan(ji/4+e/2)),-t]}function zr(t){return t[0]}function Or(t){return t[1]}function Dr(t){for(var e=t.length,r=[0,1],n=2,a=2;a<e;a++){for(;n>1&&et(t[r[n-2]],t[r[n-1]],t[a])<=0;)--n;r[n++]=a}return r.slice(0,n)}function Pr(t,e){return t[0]-e[0]||t[1]-e[1]}function Er(t,e,r){return(r[0]-e[0])*(t[1]-e[1])<(r[1]-e[1])*(t[0]-e[0])}function Nr(t,e,r,n){var a=t[0],o=r[0],i=e[0]-a,l=n[0]-o,s=t[1],c=r[1],u=e[1]-s,f=n[1]-c,d=(l*(s-c)-f*(a-o))/(f*i-l*u);return[a+d*i,s+d*u]}function Ir(t){var e=t[0],r=t[t.length-1];return!(e[0]-r[0]||e[1]-r[1])}function Rr(){an(this),this.edge=this.site=this.circle=null}function Fr(t){var e=ls.pop()||new Rr;return e.site=t,e}function jr(t){Wr(t),as.remove(t),ls.push(t),an(t)}function Br(t){var e=t.circle,r=e.x,n=e.cy,a={x:r,y:n},o=t.P,i=t.N,l=[t];jr(t);for(var s=o;s.circle&&bi(r-s.circle.x)<Ri&&bi(n-s.circle.cy)<Ri;)o=s.P,l.unshift(s),jr(s),s=o;l.unshift(s),Wr(s);for(var c=i;c.circle&&bi(r-c.circle.x)<Ri&&bi(n-c.circle.cy)<Ri;)i=c.N,l.push(c),jr(c),c=i;l.push(c),Wr(c);var u,f=l.length;for(u=1;u<f;++u)c=l[u],s=l[u-1],en(c.edge,s.site,c.site,a);s=l[0],c=l[f-1],c.edge=Kr(s.site,c.site,null,a),Zr(s),Zr(c)}function qr(t){for(var e,r,n,a,o=t.x,i=t.y,l=as._;l;)if((n=Hr(l,i)-o)>Ri)l=l.L;else{if(!((a=o-Vr(l,i))>Ri)){n>-Ri?(e=l.P,r=l):a>-Ri?(e=l,r=l.N):e=r=l;break}if(!l.R){e=l;break}l=l.R}var s=Fr(t);if(as.insert(e,s),e||r){if(e===r)return Wr(e),r=Fr(e.site),as.insert(s,r),s.edge=r.edge=Kr(e.site,s.site),Zr(e),void Zr(r);if(!r)return void(s.edge=Kr(e.site,s.site));Wr(e),Wr(r);var c=e.site,u=c.x,f=c.y,d=t.x-u,h=t.y-f,p=r.site,g=p.x-u,v=p.y-f,m=2*(d*v-h*g),y=d*d+h*h,x=g*g+v*v,b={x:(v*y-h*x)/m+u,y:(d*x-g*y)/m+f};en(r.edge,c,p,b),s.edge=Kr(c,t,null,b),r.edge=Kr(t,p,null,b),Zr(e),Zr(r)}}function Hr(t,e){var r=t.site,n=r.x,a=r.y,o=a-e;if(!o)return n;var i=t.P;if(!i)return-1/0;r=i.site;var l=r.x,s=r.y,c=s-e;if(!c)return l;var u=l-n,f=1/o-1/c,d=u/c;return f?(-d+Math.sqrt(d*d-2*f*(u*u/(-2*c)-s+c/2+a-o/2)))/f+n:(n+l)/2}function Vr(t,e){var r=t.N;if(r)return Hr(r,e);var n=t.site;return n.y===e?n.x:1/0}function Ur(t){this.site=t,this.edges=[]}function Xr(t){for(var e,r,n,a,o,i,l,s,c,u,f=t[0][0],d=t[1][0],h=t[0][1],p=t[1][1],g=ns,v=g.length;v--;)if((o=g[v])&&o.prepare())for(l=o.edges,s=l.length,i=0;i<s;)u=l[i].end(),n=u.x,a=u.y,c=l[++i%s].start(),e=c.x,r=c.y,(bi(n-e)>Ri||bi(a-r)>Ri)&&(l.splice(i,0,new rn(tn(o.site,u,bi(n-f)<Ri&&p-a>Ri?{x:f,y:bi(e-f)<Ri?r:p}:bi(a-p)<Ri&&d-n>Ri?{x:bi(r-p)<Ri?e:d,y:p}:bi(n-d)<Ri&&a-h>Ri?{x:d,y:bi(e-d)<Ri?r:h}:bi(a-h)<Ri&&n-f>Ri?{x:bi(r-h)<Ri?e:f,y:h}:null),o.site,null)),++s)}function Gr(t,e){return e.angle-t.angle}function Yr(){an(this),this.x=this.y=this.arc=this.site=this.cy=null}function Zr(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,a=t.site,o=r.site;if(n!==o){var i=a.x,l=a.y,s=n.x-i,c=n.y-l,u=o.x-i,f=o.y-l,d=2*(s*f-c*u);if(!(d>=-Fi)){var h=s*s+c*c,p=u*u+f*f,g=(f*h-c*p)/d,v=(s*p-u*h)/d,f=v+l,m=ss.pop()||new Yr;m.arc=t,m.site=a,m.x=g+i,m.y=f+Math.sqrt(g*g+v*v),m.cy=f,t.circle=m;for(var y=null,x=is._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}is.insert(y,m),y||(os=m)}}}}function Wr(t){var e=t.circle;e&&(e.P||(os=e.N),is.remove(e),ss.push(e),an(e),t.circle=null)}function $r(t){for(var e,r=rs,n=Ue(t[0][0],t[0][1],t[1][0],t[1][1]),a=r.length;a--;)e=r[a],(!Qr(e,t)||!n(e)||bi(e.a.x-e.b.x)<Ri&&bi(e.a.y-e.b.y)<Ri)&&(e.a=e.b=null,r.splice(a,1))}function Qr(t,e){var r=t.b;if(r)return!0;var n,a,o=t.a,i=e[0][0],l=e[1][0],s=e[0][1],c=e[1][1],u=t.l,f=t.r,d=u.x,h=u.y,p=f.x,g=f.y,v=(d+p)/2,m=(h+g)/2;if(g===h){if(v<i||v>=l)return;if(d>p){if(o){if(o.y>=c)return}else o={x:v,y:s};r={x:v,y:c}}else{if(o){if(o.y<s)return}else o={x:v,y:c};r={x:v,y:s}}}else if(n=(d-p)/(g-h),a=m-n*v,n<-1||n>1)if(d>p){if(o){if(o.y>=c)return}else o={x:(s-a)/n,y:s};r={x:(c-a)/n,y:c}}else{if(o){if(o.y<s)return}else o={x:(c-a)/n,y:c};r={x:(s-a)/n,y:s}}else if(h<g){if(o){if(o.x>=l)return}else o={x:i,y:n*i+a};r={x:l,y:n*l+a}}else{if(o){if(o.x<i)return}else o={x:l,y:n*l+a};r={x:i,y:n*i+a}}return t.a=o,t.b=r,!0}function Jr(t,e){this.l=t,this.r=e,this.a=this.b=null}function Kr(t,e,r,n){var a=new Jr(t,e);return rs.push(a),r&&en(a,t,e,r),n&&en(a,e,t,n),ns[t.i].edges.push(new rn(a,t,e)),ns[e.i].edges.push(new rn(a,e,t)),a}function tn(t,e,r){var n=new Jr(t,null);return n.a=e,n.b=r,rs.push(n),n}function en(t,e,r,n){t.a||t.b?t.l===r?t.b=n:t.a=n:(t.a=n,t.l=e,t.r=r)}function rn(t,e,r){var n=t.a,a=t.b;this.edge=t,this.site=e,this.angle=r?Math.atan2(r.y-e.y,r.x-e.x):t.l===e?Math.atan2(a.x-n.x,n.y-a.y):Math.atan2(n.x-a.x,a.y-n.y)}function nn(){this._=null}function an(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function on(t,e){var r=e,n=e.R,a=r.U;a?a.L===r?a.L=n:a.R=n:t._=n,n.U=a,r.U=n,r.R=n.L,r.R&&(r.R.U=r),n.L=r}function ln(t,e){var r=e,n=e.L,a=r.U;a?a.L===r?a.L=n:a.R=n:t._=n,n.U=a,r.U=n,r.L=n.R,r.L&&(r.L.U=r),n.R=r}function sn(t){for(;t.L;)t=t.L;return t}function cn(t,e){var r,n,a,o=t.sort(un).pop();for(rs=[],ns=new Array(t.length),as=new nn,is=new nn;;)if(a=os,o&&(!a||o.y<a.y||o.y===a.y&&o.x<a.x))o.x===r&&o.y===n||(ns[o.i]=new Ur(o),qr(o),r=o.x,n=o.y),o=t.pop();else{if(!a)break;Br(a.arc)}e&&($r(e),Xr(e));var i={cells:ns,edges:rs};return as=is=rs=ns=null,i}function un(t,e){return e.y-t.y||e.x-t.x}function fn(t,e,r){return(t.x-r.x)*(e.y-t.y)-(t.x-e.x)*(r.y-t.y)}function dn(t){return t.x}function hn(t){return t.y}function pn(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function gn(t,e,r,n,a,o){if(!t(e,r,n,a,o)){var i=.5*(r+a),l=.5*(n+o),s=e.nodes;s[0]&&gn(t,s[0],r,n,i,l),s[1]&&gn(t,s[1],i,n,a,l),s[2]&&gn(t,s[2],r,l,i,o),s[3]&&gn(t,s[3],i,l,a,o)}}function vn(t,e,r,n,a,o,i){var l,s=1/0;return function t(c,u,f,d,h){if(!(u>o||f>i||d<n||h<a)){if(p=c.point){var p,g=e-c.x,v=r-c.y,m=g*g+v*v;if(m<s){var y=Math.sqrt(s=m);n=e-y,a=r-y,o=e+y,i=r+y,l=p}}for(var x=c.nodes,b=.5*(u+d),_=.5*(f+h),w=e>=b,k=r>=_,M=k<<1|w,A=M+4;M<A;++M)if(c=x[3&M])switch(3&M){case 0:t(c,u,f,b,_);break;case 1:t(c,b,f,d,_);break;case 2:t(c,u,_,b,h);break;case 3:t(c,b,_,d,h)}}}(t,n,a,o,i),l}function mn(t,e){t=ui.rgb(t),e=ui.rgb(e);var r=t.r,n=t.g,a=t.b,o=e.r-r,i=e.g-n,l=e.b-a;return function(t){return\"#\"+wt(Math.round(r+o*t))+wt(Math.round(n+i*t))+wt(Math.round(a+l*t))}}function yn(t,e){var r,n={},a={};for(r in t)r in e?n[r]=_n(t[r],e[r]):a[r]=t[r];for(r in e)r in t||(a[r]=e[r]);return function(t){for(r in n)a[r]=n[r](t);return a}}function xn(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}function bn(t,e){var r,n,a,o=us.lastIndex=fs.lastIndex=0,i=-1,l=[],s=[];for(t+=\"\",e+=\"\";(r=us.exec(t))&&(n=fs.exec(e));)(a=n.index)>o&&(a=e.slice(o,a),l[i]?l[i]+=a:l[++i]=a),(r=r[0])===(n=n[0])?l[i]?l[i]+=n:l[++i]=n:(l[++i]=null,s.push({i:i,x:xn(r,n)})),o=fs.lastIndex;return o<e.length&&(a=e.slice(o),l[i]?l[i]+=a:l[++i]=a),l.length<2?s[0]?(e=s[0].x,function(t){return e(t)+\"\"}):function(){return e}:(e=s.length,function(t){for(var r,n=0;n<e;++n)l[(r=s[n]).i]=r.x(t);return l.join(\"\")})}function _n(t,e){for(var r,n=ui.interpolators.length;--n>=0&&!(r=ui.interpolators[n](t,e)););return r}function wn(t,e){var r,n=[],a=[],o=t.length,i=e.length,l=Math.min(t.length,e.length);for(r=0;r<l;++r)n.push(_n(t[r],e[r]));for(;r<o;++r)a[r]=t[r];for(;r<i;++r)a[r]=e[r];return function(t){for(r=0;r<l;++r)a[r]=n[r](t);return a}}function kn(t){return function(e){return e<=0?0:e>=1?1:t(e)}}function Mn(t){return function(e){return 1-t(1-e)}}function An(t){return function(e){return.5*(e<.5?t(2*e):2-t(2-2*e))}}function Tn(t){return t*t}function Ln(t){return t*t*t}function Cn(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function Sn(t){return function(e){return Math.pow(e,t)}}function zn(t){return 1-Math.cos(t*Hi)}function On(t){return Math.pow(2,10*(t-1))}function Dn(t){return 1-Math.sqrt(1-t*t)}function Pn(t,e){var r;return arguments.length<2&&(e=.45),arguments.length?r=e/Bi*Math.asin(1/t):(t=1,r=e/4),function(n){return 1+t*Math.pow(2,-10*n)*Math.sin((n-r)*Bi/e)}}function En(t){return t||(t=1.70158),function(e){return e*e*((t+1)*e-t)}}function Nn(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function In(t,e){t=ui.hcl(t),e=ui.hcl(e);var r=t.h,n=t.c,a=t.l,o=e.h-r,i=e.c-n,l=e.l-a;return isNaN(i)&&(i=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return dt(r+o*t,n+i*t,a+l*t)+\"\"}}function Rn(t,e){t=ui.hsl(t),e=ui.hsl(e);var r=t.h,n=t.s,a=t.l,o=e.h-r,i=e.s-n,l=e.l-a;return isNaN(i)&&(i=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return ut(r+o*t,n+i*t,a+l*t)+\"\"}}function Fn(t,e){t=ui.lab(t),e=ui.lab(e);var r=t.l,n=t.a,a=t.b,o=e.l-r,i=e.a-n,l=e.b-a;return function(t){return pt(r+o*t,n+i*t,a+l*t)+\"\"}}function jn(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Bn(t){var e=[t.a,t.b],r=[t.c,t.d],n=Hn(e),a=qn(e,r),o=Hn(Vn(r,e,-a))||0;e[0]*r[1]<r[0]*e[1]&&(e[0]*=-1,e[1]*=-1,n*=-1,a*=-1),this.rotate=(n?Math.atan2(e[1],e[0]):Math.atan2(-r[0],r[1]))*Ui,this.translate=[t.e,t.f],this.scale=[n,o],this.skew=o?Math.atan2(a,o)*Ui:0}function qn(t,e){return t[0]*e[0]+t[1]*e[1]}function Hn(t){var e=Math.sqrt(qn(t,t));return e&&(t[0]/=e,t[1]/=e),e}function Vn(t,e,r){return t[0]+=r*e[0],t[1]+=r*e[1],t}function Un(t){return t.length?t.pop()+\",\":\"\"}function Xn(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var a=r.push(\"translate(\",null,\",\",null,\")\");n.push({i:a-4,x:xn(t[0],e[0])},{i:a-2,x:xn(t[1],e[1])})}else(e[0]||e[1])&&r.push(\"translate(\"+e+\")\")}function Gn(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Un(r)+\"rotate(\",null,\")\")-2,x:xn(t,e)})):e&&r.push(Un(r)+\"rotate(\"+e+\")\")}function Yn(t,e,r,n){t!==e?n.push({i:r.push(Un(r)+\"skewX(\",null,\")\")-2,x:xn(t,e)}):e&&r.push(Un(r)+\"skewX(\"+e+\")\")}function Zn(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var a=r.push(Un(r)+\"scale(\",null,\",\",null,\")\");n.push({i:a-4,x:xn(t[0],e[0])},{i:a-2,x:xn(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Un(r)+\"scale(\"+e+\")\")}function Wn(t,e){var r=[],n=[];return t=ui.transform(t),e=ui.transform(e),Xn(t.translate,e.translate,r,n),Gn(t.rotate,e.rotate,r,n),Yn(t.skew,e.skew,r,n),Zn(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,a=-1,o=n.length;++a<o;)r[(e=n[a]).i]=e.x(t);return r.join(\"\")}}function $n(t,e){return e=(e-=t=+t)||1/e,function(r){return(r-t)/e}}function Qn(t,e){return e=(e-=t=+t)||1/e,function(r){return Math.max(0,Math.min(1,(r-t)/e))}}function Jn(t){for(var e=t.source,r=t.target,n=ta(e,r),a=[e];e!==n;)e=e.parent,a.push(e);for(var o=a.length;r!==n;)a.splice(o,0,r),r=r.parent;return a}function Kn(t){for(var e=[],r=t.parent;null!=r;)e.push(t),t=r,r=r.parent;return e.push(t),e}function ta(t,e){if(t===e)return t;for(var r=Kn(t),n=Kn(e),a=r.pop(),o=n.pop(),i=null;a===o;)i=a,a=r.pop(),o=n.pop();return i}function ea(t){t.fixed|=2}function ra(t){t.fixed&=-7}function na(t){t.fixed|=4,t.px=t.x,t.py=t.y}function aa(t){t.fixed&=-5}function oa(t,e,r){var n=0,a=0;if(t.charge=0,!t.leaf)for(var o,i=t.nodes,l=i.length,s=-1;++s<l;)null!=(o=i[s])&&(oa(o,e,r),t.charge+=o.charge,n+=o.charge*o.cx,a+=o.charge*o.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var c=e*r[t.point.index];t.charge+=t.pointCharge=c,n+=c*t.point.x,a+=c*t.point.y}t.cx=n/t.charge,t.cy=a/t.charge}function ia(t,e){return ui.rebind(t,e,\"sort\",\"children\",\"value\"),t.nodes=t,t.links=da,t}function la(t,e){for(var r=[t];null!=(t=r.pop());)if(e(t),(a=t.children)&&(n=a.length))for(var n,a;--n>=0;)r.push(a[n])}function sa(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(o=t.children)&&(a=o.length))for(var a,o,i=-1;++i<a;)r.push(o[i]);for(;null!=(t=n.pop());)e(t)}function ca(t){return t.children}function ua(t){return t.value}function fa(t,e){return e.value-t.value}function da(t){return ui.merge(t.map(function(t){return(t.children||[]).map(function(e){return{source:t,target:e}})}))}function ha(t){return t.x}function pa(t){return t.y}function ga(t,e,r){t.y0=e,t.y=r}function va(t){return ui.range(t.length)}function ma(t){for(var e=-1,r=t[0].length,n=[];++e<r;)n[e]=0;return n}function ya(t){for(var e,r=1,n=0,a=t[0][1],o=t.length;r<o;++r)(e=t[r][1])>a&&(n=r,a=e);return n}function xa(t){return t.reduce(ba,0)}function ba(t,e){return t+e[1]}function _a(t,e){return wa(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function wa(t,e){for(var r=-1,n=+t[0],a=(t[1]-n)/e,o=[];++r<=e;)o[r]=a*r+n;return o}function ka(t){return[ui.min(t),ui.max(t)]}function Ma(t,e){return t.value-e.value}function Aa(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function Ta(t,e){t._pack_next=e,e._pack_prev=t}function La(t,e){var r=e.x-t.x,n=e.y-t.y,a=t.r+e.r;return.999*a*a>r*r+n*n}function Ca(t){function e(t){u=Math.min(t.x-t.r,u),f=Math.max(t.x+t.r,f),d=Math.min(t.y-t.r,d),h=Math.max(t.y+t.r,h)}if((r=t.children)&&(c=r.length)){var r,n,a,o,i,l,s,c,u=1/0,f=-1/0,d=1/0,h=-1/0;if(r.forEach(Sa),n=r[0],n.x=-n.r,n.y=0,e(n),c>1&&(a=r[1],a.x=a.r,a.y=0,e(a),c>2))for(o=r[2],Da(n,a,o),e(o),Aa(n,o),n._pack_prev=o,Aa(o,a),a=n._pack_next,i=3;i<c;i++){Da(n,a,o=r[i]);var p=0,g=1,v=1;for(l=a._pack_next;l!==a;l=l._pack_next,g++)if(La(l,o)){p=1;break}if(1==p)for(s=n._pack_prev;s!==l._pack_prev&&!La(s,o);s=s._pack_prev,v++);p?(g<v||g==v&&a.r<n.r?Ta(n,a=l):Ta(n=s,a),i--):(Aa(n,o),a=o,e(o))}var m=(u+f)/2,y=(d+h)/2,x=0;for(i=0;i<c;i++)o=r[i],o.x-=m,o.y-=y,x=Math.max(x,o.r+Math.sqrt(o.x*o.x+o.y*o.y));t.r=x,r.forEach(za)}}function Sa(t){t._pack_next=t._pack_prev=t}function za(t){delete t._pack_next,delete t._pack_prev}function Oa(t,e,r,n){var a=t.children;if(t.x=e+=n*t.x,t.y=r+=n*t.y,t.r*=n,\n",
|
|
"a)for(var o=-1,i=a.length;++o<i;)Oa(a[o],e,r,n)}function Da(t,e,r){var n=t.r+r.r,a=e.x-t.x,o=e.y-t.y;if(n&&(a||o)){var i=e.r+r.r,l=a*a+o*o;i*=i,n*=n;var s=.5+(n-i)/(2*l),c=Math.sqrt(Math.max(0,2*i*(n+l)-(n-=l)*n-i*i))/(2*l);r.x=t.x+s*a+c*o,r.y=t.y+s*o-c*a}else r.x=t.x+n,r.y=t.y}function Pa(t,e){return t.parent==e.parent?1:2}function Ea(t){var e=t.children;return e.length?e[0]:t.t}function Na(t){var e,r=t.children;return(e=r.length)?r[e-1]:t.t}function Ia(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function Ra(t){for(var e,r=0,n=0,a=t.children,o=a.length;--o>=0;)e=a[o],e.z+=r,e.m+=r,r+=e.s+(n+=e.c)}function Fa(t,e,r){return t.a.parent===e.parent?t.a:r}function ja(t){return 1+ui.max(t,function(t){return t.y})}function Ba(t){return t.reduce(function(t,e){return t+e.x},0)/t.length}function qa(t){var e=t.children;return e&&e.length?qa(e[0]):t}function Ha(t){var e,r=t.children;return r&&(e=r.length)?Ha(r[e-1]):t}function Va(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Ua(t,e){var r=t.x+e[3],n=t.y+e[0],a=t.dx-e[1]-e[3],o=t.dy-e[0]-e[2];return a<0&&(r+=a/2,a=0),o<0&&(n+=o/2,o=0),{x:r,y:n,dx:a,dy:o}}function Xa(t){var e=t[0],r=t[t.length-1];return e<r?[e,r]:[r,e]}function Ga(t){return t.rangeExtent?t.rangeExtent():Xa(t.range())}function Ya(t,e,r,n){var a=r(t[0],t[1]),o=n(e[0],e[1]);return function(t){return o(a(t))}}function Za(t,e){var r,n=0,a=t.length-1,o=t[n],i=t[a];return i<o&&(r=n,n=a,a=r,r=o,o=i,i=r),t[n]=e.floor(o),t[a]=e.ceil(i),t}function Wa(t){return t?{floor:function(e){return Math.floor(e/t)*t},ceil:function(e){return Math.ceil(e/t)*t}}:ws}function $a(t,e,r,n){var a=[],o=[],i=0,l=Math.min(t.length,e.length)-1;for(t[l]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++i<=l;)a.push(r(t[i-1],t[i])),o.push(n(e[i-1],e[i]));return function(e){var r=ui.bisect(t,e,1,l)-1;return o[r](a[r](e))}}function Qa(t,e,r,n){function a(){var a=Math.min(t.length,e.length)>2?$a:Ya,s=n?Qn:$n;return i=a(t,e,s,r),l=a(e,t,s,_n),o}function o(t){return i(t)}var i,l;return o.invert=function(t){return l(t)},o.domain=function(e){return arguments.length?(t=e.map(Number),a()):t},o.range=function(t){return arguments.length?(e=t,a()):e},o.rangeRound=function(t){return o.range(t).interpolate(jn)},o.clamp=function(t){return arguments.length?(n=t,a()):n},o.interpolate=function(t){return arguments.length?(r=t,a()):r},o.ticks=function(e){return eo(t,e)},o.tickFormat=function(e,r){return ro(t,e,r)},o.nice=function(e){return Ka(t,e),a()},o.copy=function(){return Qa(t,e,r,n)},a()}function Ja(t,e){return ui.rebind(t,e,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function Ka(t,e){return Za(t,Wa(to(t,e)[2])),Za(t,Wa(to(t,e)[2])),t}function to(t,e){null==e&&(e=10);var r=Xa(t),n=r[1]-r[0],a=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),o=e/n*a;return o<=.15?a*=10:o<=.35?a*=5:o<=.75&&(a*=2),r[0]=Math.ceil(r[0]/a)*a,r[1]=Math.floor(r[1]/a)*a+.5*a,r[2]=a,r}function eo(t,e){return ui.range.apply(ui,to(t,e))}function ro(t,e,r){var n=to(t,e);if(r){var a=ul.exec(r);if(a.shift(),\"s\"===a[8]){var o=ui.formatPrefix(Math.max(bi(n[0]),bi(n[1])));return a[7]||(a[7]=\".\"+no(o.scale(n[2]))),a[8]=\"f\",r=ui.format(a.join(\"\")),function(t){return r(o.scale(t))+o.symbol}}a[7]||(a[7]=\".\"+ao(a[8],n)),r=a.join(\"\")}else r=\",.\"+no(n[2])+\"f\";return ui.format(r)}function no(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}function ao(t,e){var r=no(e[2]);return t in ks?Math.abs(r-no(Math.max(bi(e[0]),bi(e[1]))))+ +(\"e\"!==t):r-2*(\"%\"===t)}function oo(t,e,r,n){function a(t){return(r?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function o(t){return r?Math.pow(e,t):-Math.pow(e,-t)}function i(e){return t(a(e))}return i.invert=function(e){return o(t.invert(e))},i.domain=function(e){return arguments.length?(r=e[0]>=0,t.domain((n=e.map(Number)).map(a)),i):n},i.base=function(r){return arguments.length?(e=+r,t.domain(n.map(a)),i):e},i.nice=function(){var e=Za(n.map(a),r?Math:As);return t.domain(e),n=e.map(o),i},i.ticks=function(){var t=Xa(n),i=[],l=t[0],s=t[1],c=Math.floor(a(l)),u=Math.ceil(a(s)),f=e%1?2:e;if(isFinite(u-c)){if(r){for(;c<u;c++)for(var d=1;d<f;d++)i.push(o(c)*d);i.push(o(c))}else for(i.push(o(c));c++<u;)for(var d=f-1;d>0;d--)i.push(o(c)*d);for(c=0;i[c]<l;c++);for(u=i.length;i[u-1]>s;u--);i=i.slice(c,u)}return i},i.tickFormat=function(t,r){if(!arguments.length)return Ms;arguments.length<2?r=Ms:\"function\"!=typeof r&&(r=ui.format(r));var n=Math.max(1,e*t/i.ticks().length);return function(t){var i=t/o(Math.round(a(t)));return i*e<e-.5&&(i*=e),i<=n?r(t):\"\"}},i.copy=function(){return oo(t.copy(),e,r,n)},Ja(i,t)}function io(t,e,r){function n(e){return t(a(e))}var a=lo(e),o=lo(1/e);return n.invert=function(e){return o(t.invert(e))},n.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(a)),n):r},n.ticks=function(t){return eo(r,t)},n.tickFormat=function(t,e){return ro(r,t,e)},n.nice=function(t){return n.domain(Ka(r,t))},n.exponent=function(i){return arguments.length?(a=lo(e=i),o=lo(1/e),t.domain(r.map(a)),n):e},n.copy=function(){return io(t.copy(),e,r)},Ja(n,t)}function lo(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function so(t,e){function r(r){return o[((a.get(r)||(\"range\"===e.t?a.set(r,t.push(r)):0/0))-1)%o.length]}function n(e,r){return ui.range(t.length).map(function(t){return e+r*t})}var a,o,i;return r.domain=function(n){if(!arguments.length)return t;t=[],a=new f;for(var o,i=-1,l=n.length;++i<l;)a.has(o=n[i])||a.set(o,t.push(o));return r[e.t].apply(r,e.a)},r.range=function(t){return arguments.length?(o=t,i=0,e={t:\"range\",a:arguments},r):o},r.rangePoints=function(a,l){arguments.length<2&&(l=0);var s=a[0],c=a[1],u=t.length<2?(s=(s+c)/2,0):(c-s)/(t.length-1+l);return o=n(s+u*l/2,u),i=0,e={t:\"rangePoints\",a:arguments},r},r.rangeRoundPoints=function(a,l){arguments.length<2&&(l=0);var s=a[0],c=a[1],u=t.length<2?(s=c=Math.round((s+c)/2),0):(c-s)/(t.length-1+l)|0;return o=n(s+Math.round(u*l/2+(c-s-(t.length-1+l)*u)/2),u),i=0,e={t:\"rangeRoundPoints\",a:arguments},r},r.rangeBands=function(a,l,s){arguments.length<2&&(l=0),arguments.length<3&&(s=l);var c=a[1]<a[0],u=a[c-0],f=a[1-c],d=(f-u)/(t.length-l+2*s);return o=n(u+d*s,d),c&&o.reverse(),i=d*(1-l),e={t:\"rangeBands\",a:arguments},r},r.rangeRoundBands=function(a,l,s){arguments.length<2&&(l=0),arguments.length<3&&(s=l);var c=a[1]<a[0],u=a[c-0],f=a[1-c],d=Math.floor((f-u)/(t.length-l+2*s));return o=n(u+Math.round((f-u-(t.length-l)*d)/2),d),c&&o.reverse(),i=Math.round(d*(1-l)),e={t:\"rangeRoundBands\",a:arguments},r},r.rangeBand=function(){return i},r.rangeExtent=function(){return Xa(e.a[0])},r.copy=function(){return so(t,e)},r.domain(t)}function co(t,e){function r(){var r=0,a=e.length;for(l=[];++r<a;)l[r-1]=ui.quantile(t,r/a);return n}function n(t){if(!isNaN(t=+t))return e[ui.bisect(l,t)]}var l;return n.domain=function(e){return arguments.length?(t=e.map(o).filter(i).sort(a),r()):t},n.range=function(t){return arguments.length?(e=t,r()):e},n.quantiles=function(){return l},n.invertExtent=function(r){return r=e.indexOf(r),r<0?[0/0,0/0]:[r>0?l[r-1]:t[0],r<l.length?l[r]:t[t.length-1]]},n.copy=function(){return co(t,e)},r()}function uo(t,e,r){function n(e){return r[Math.max(0,Math.min(i,Math.floor(o*(e-t))))]}function a(){return o=r.length/(e-t),i=r.length-1,n}var o,i;return n.domain=function(r){return arguments.length?(t=+r[0],e=+r[r.length-1],a()):[t,e]},n.range=function(t){return arguments.length?(r=t,a()):r},n.invertExtent=function(e){return e=r.indexOf(e),e=e<0?0/0:e/o+t,[e,e+1/o]},n.copy=function(){return uo(t,e,r)},a()}function fo(t,e){function r(r){if(r<=r)return e[ui.bisect(t,r)]}return r.domain=function(e){return arguments.length?(t=e,r):t},r.range=function(t){return arguments.length?(e=t,r):e},r.invertExtent=function(r){return r=e.indexOf(r),[t[r-1],t[r]]},r.copy=function(){return fo(t,e)},r}function ho(t){function e(t){return+t}return e.invert=e,e.domain=e.range=function(r){return arguments.length?(t=r.map(e),e):t},e.ticks=function(e){return eo(t,e)},e.tickFormat=function(e,r){return ro(t,e,r)},e.copy=function(){return ho(t)},e}function po(){return 0}function go(t){return t.innerRadius}function vo(t){return t.outerRadius}function mo(t){return t.startAngle}function yo(t){return t.endAngle}function xo(t){return t&&t.padAngle}function bo(t,e,r,n){return(t-r)*e-(e-n)*t>0?0:1}function _o(t,e,r,n,a){var o=t[0]-e[0],i=t[1]-e[1],l=(a?n:-n)/Math.sqrt(o*o+i*i),s=l*i,c=-l*o,u=t[0]+s,f=t[1]+c,d=e[0]+s,h=e[1]+c,p=(u+d)/2,g=(f+h)/2,v=d-u,m=h-f,y=v*v+m*m,x=r-n,b=u*h-d*f,_=(m<0?-1:1)*Math.sqrt(Math.max(0,x*x*y-b*b)),w=(b*m-v*_)/y,k=(-b*v-m*_)/y,M=(b*m+v*_)/y,A=(-b*v+m*_)/y,T=w-p,L=k-g,C=M-p,S=A-g;return T*T+L*L>C*C+S*S&&(w=M,k=A),[[w-s,k-c],[w*r/x,k*r/x]]}function wo(t){function e(e){function i(){c.push(\"M\",o(t(u),l))}for(var s,c=[],u=[],f=-1,d=e.length,h=Ct(r),p=Ct(n);++f<d;)a.call(this,s=e[f],f)?u.push([+h.call(this,s,f),+p.call(this,s,f)]):u.length&&(i(),u=[]);return u.length&&i(),c.length?c.join(\"\"):null}var r=zr,n=Or,a=Oe,o=ko,i=o.key,l=.7;return e.x=function(t){return arguments.length?(r=t,e):r},e.y=function(t){return arguments.length?(n=t,e):n},e.defined=function(t){return arguments.length?(a=t,e):a},e.interpolate=function(t){return arguments.length?(i=\"function\"==typeof t?o=t:(o=Os.get(t)||ko).key,e):i},e.tension=function(t){return arguments.length?(l=t,e):l},e}function ko(t){return t.length>1?t.join(\"L\"):t+\"Z\"}function Mo(t){return t.join(\"L\")+\"Z\"}function Ao(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"H\",(n[0]+(n=t[e])[0])/2,\"V\",n[1]);return r>1&&a.push(\"H\",n[0]),a.join(\"\")}function To(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"V\",(n=t[e])[1],\"H\",n[0]);return a.join(\"\")}function Lo(t){for(var e=0,r=t.length,n=t[0],a=[n[0],\",\",n[1]];++e<r;)a.push(\"H\",(n=t[e])[0],\"V\",n[1]);return a.join(\"\")}function Co(t,e){return t.length<4?ko(t):t[1]+Oo(t.slice(1,-1),Do(t,e))}function So(t,e){return t.length<3?Mo(t):t[0]+Oo((t.push(t[0]),t),Do([t[t.length-2]].concat(t,[t[1]]),e))}function zo(t,e){return t.length<3?ko(t):t[0]+Oo(t,Do(t,e))}function Oo(t,e){if(e.length<1||t.length!=e.length&&t.length!=e.length+2)return ko(t);var r=t.length!=e.length,n=\"\",a=t[0],o=t[1],i=e[0],l=i,s=1;if(r&&(n+=\"Q\"+(o[0]-2*i[0]/3)+\",\"+(o[1]-2*i[1]/3)+\",\"+o[0]+\",\"+o[1],a=t[1],s=2),e.length>1){l=e[1],o=t[s],s++,n+=\"C\"+(a[0]+i[0])+\",\"+(a[1]+i[1])+\",\"+(o[0]-l[0])+\",\"+(o[1]-l[1])+\",\"+o[0]+\",\"+o[1];for(var c=2;c<e.length;c++,s++)o=t[s],l=e[c],n+=\"S\"+(o[0]-l[0])+\",\"+(o[1]-l[1])+\",\"+o[0]+\",\"+o[1]}if(r){var u=t[s];n+=\"Q\"+(o[0]+2*l[0]/3)+\",\"+(o[1]+2*l[1]/3)+\",\"+u[0]+\",\"+u[1]}return n}function Do(t,e){for(var r,n=[],a=(1-e)/2,o=t[0],i=t[1],l=1,s=t.length;++l<s;)r=o,o=i,i=t[l],n.push([a*(i[0]-r[0]),a*(i[1]-r[1])]);return n}function Po(t){if(t.length<3)return ko(t);var e=1,r=t.length,n=t[0],a=n[0],o=n[1],i=[a,a,a,(n=t[1])[0]],l=[o,o,o,n[1]],s=[a,\",\",o,\"L\",Ro(Es,i),\",\",Ro(Es,l)];for(t.push(t[r-1]);++e<=r;)n=t[e],i.shift(),i.push(n[0]),l.shift(),l.push(n[1]),Fo(s,i,l);return t.pop(),s.push(\"L\",n),s.join(\"\")}function Eo(t){if(t.length<4)return ko(t);for(var e,r=[],n=-1,a=t.length,o=[0],i=[0];++n<3;)e=t[n],o.push(e[0]),i.push(e[1]);for(r.push(Ro(Es,o)+\",\"+Ro(Es,i)),--n;++n<a;)e=t[n],o.shift(),o.push(e[0]),i.shift(),i.push(e[1]),Fo(r,o,i);return r.join(\"\")}function No(t){for(var e,r,n=-1,a=t.length,o=a+4,i=[],l=[];++n<4;)r=t[n%a],i.push(r[0]),l.push(r[1]);for(e=[Ro(Es,i),\",\",Ro(Es,l)],--n;++n<o;)r=t[n%a],i.shift(),i.push(r[0]),l.shift(),l.push(r[1]),Fo(e,i,l);return e.join(\"\")}function Io(t,e){var r=t.length-1;if(r)for(var n,a,o=t[0][0],i=t[0][1],l=t[r][0]-o,s=t[r][1]-i,c=-1;++c<=r;)n=t[c],a=c/r,n[0]=e*n[0]+(1-e)*(o+a*l),n[1]=e*n[1]+(1-e)*(i+a*s);return Po(t)}function Ro(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function Fo(t,e,r){t.push(\"C\",Ro(Ds,e),\",\",Ro(Ds,r),\",\",Ro(Ps,e),\",\",Ro(Ps,r),\",\",Ro(Es,e),\",\",Ro(Es,r))}function jo(t,e){return(e[1]-t[1])/(e[0]-t[0])}function Bo(t){for(var e=0,r=t.length-1,n=[],a=t[0],o=t[1],i=n[0]=jo(a,o);++e<r;)n[e]=(i+(i=jo(a=o,o=t[e+1])))/2;return n[e]=i,n}function qo(t){for(var e,r,n,a,o=[],i=Bo(t),l=-1,s=t.length-1;++l<s;)e=jo(t[l],t[l+1]),bi(e)<Ri?i[l]=i[l+1]=0:(r=i[l]/e,n=i[l+1]/e,(a=r*r+n*n)>9&&(a=3*e/Math.sqrt(a),i[l]=a*r,i[l+1]=a*n));for(l=-1;++l<=s;)a=(t[Math.min(s,l+1)][0]-t[Math.max(0,l-1)][0])/(6*(1+i[l]*i[l])),o.push([a||0,i[l]*a||0]);return o}function Ho(t){return t.length<3?ko(t):t[0]+Oo(t,qo(t))}function Vo(t){for(var e,r,n,a=-1,o=t.length;++a<o;)e=t[a],r=e[0],n=e[1]-Hi,e[0]=r*Math.cos(n),e[1]=r*Math.sin(n);return t}function Uo(t){function e(e){function s(){g.push(\"M\",l(t(m),f),u,c(t(v.reverse()),f),\"Z\")}for(var d,h,p,g=[],v=[],m=[],y=-1,x=e.length,b=Ct(r),_=Ct(a),w=r===n?function(){return h}:Ct(n),k=a===o?function(){return p}:Ct(o);++y<x;)i.call(this,d=e[y],y)?(v.push([h=+b.call(this,d,y),p=+_.call(this,d,y)]),m.push([+w.call(this,d,y),+k.call(this,d,y)])):v.length&&(s(),v=[],m=[]);return v.length&&s(),g.length?g.join(\"\"):null}var r=zr,n=zr,a=0,o=Or,i=Oe,l=ko,s=l.key,c=l,u=\"L\",f=.7;return e.x=function(t){return arguments.length?(r=n=t,e):n},e.x0=function(t){return arguments.length?(r=t,e):r},e.x1=function(t){return arguments.length?(n=t,e):n},e.y=function(t){return arguments.length?(a=o=t,e):o},e.y0=function(t){return arguments.length?(a=t,e):a},e.y1=function(t){return arguments.length?(o=t,e):o},e.defined=function(t){return arguments.length?(i=t,e):i},e.interpolate=function(t){return arguments.length?(s=\"function\"==typeof t?l=t:(l=Os.get(t)||ko).key,c=l.reverse||l,u=l.closed?\"M\":\"L\",e):s},e.tension=function(t){return arguments.length?(f=t,e):f},e}function Xo(t){return t.radius}function Go(t){return[t.x,t.y]}function Yo(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-Hi;return[r*Math.cos(n),r*Math.sin(n)]}}function Zo(){return 64}function Wo(){return\"circle\"}function $o(t){var e=Math.sqrt(t/ji);return\"M0,\"+e+\"A\"+e+\",\"+e+\" 0 1,1 0,\"+-e+\"A\"+e+\",\"+e+\" 0 1,1 0,\"+e+\"Z\"}function Qo(t){return function(){var e,r,n;(e=this[t])&&(n=e[r=e.active])&&(n.timer.c=null,n.timer.t=0/0,--e.count?delete e[r]:delete this[t],e.active+=.5,n.event&&n.event.interrupt.call(this,this.__data__,n.index))}}function Jo(t,e,r){return Ai(t,qs),t.namespace=e,t.id=r,t}function Ko(t,e,r,n){var a=t.id,o=t.namespace;return X(t,\"function\"==typeof r?function(t,i,l){t[o][a].tween.set(e,n(r.call(t,t.__data__,i,l)))}:(r=n(r),function(t){t[o][a].tween.set(e,r)}))}function ti(t){return null==t&&(t=\"\"),function(){this.textContent=t}}function ei(t){return null==t?\"__transition__\":\"__transition_\"+t+\"__\"}function ri(t,e,r,n,a){function o(t){var e=g.delay;if(c.t=e+s,e<=t)return i(t-e);c.c=i}function i(r){var a=p.active,o=p[a];o&&(o.timer.c=null,o.timer.t=0/0,--p.count,delete p[a],o.event&&o.event.interrupt.call(t,t.__data__,o.index));for(var i in p)if(+i<n){var f=p[i];f.timer.c=null,f.timer.t=0/0,--p.count,delete p[i]}c.c=l,Pt(function(){return c.c&&l(r||1)&&(c.c=null,c.t=0/0),1},0,s),p.active=n,g.event&&g.event.start.call(t,t.__data__,e),h=[],g.tween.forEach(function(r,n){(n=n.call(t,t.__data__,e))&&h.push(n)}),d=g.ease,u=g.duration}function l(a){for(var o=a/u,i=d(o),l=h.length;l>0;)h[--l].call(t,i);if(o>=1)return g.event&&g.event.end.call(t,t.__data__,e),--p.count?delete p[n]:delete t[r],1}var s,c,u,d,h,p=t[r]||(t[r]={active:0,count:0}),g=p[n];g||(s=a.time,c=Pt(o,0,s),g=p[n]={tween:new f,time:s,timer:c,delay:a.delay,duration:a.duration,ease:a.ease,index:e},a=null,++p.count)}function ni(t,e,r){t.attr(\"transform\",function(t){var n=e(t);return\"translate(\"+(isFinite(n)?n:r(t))+\",0)\"})}function ai(t,e,r){t.attr(\"transform\",function(t){var n=e(t);return\"translate(0,\"+(isFinite(n)?n:r(t))+\")\"})}function oi(t){return t.toISOString()}function ii(t,e,r){function n(e){return t(e)}function a(t,r){var n=t[1]-t[0],a=n/r,o=ui.bisect($s,a);return o==$s.length?[e.year,to(t.map(function(t){return t/31536e6}),r)[2]]:o?e[a/$s[o-1]<$s[o]/a?o-1:o]:[Ks,to(t,r)[2]]}return n.invert=function(e){return li(t.invert(e))},n.domain=function(e){return arguments.length?(t.domain(e),n):t.domain().map(li)},n.nice=function(t,e){function r(r){return!isNaN(r)&&!t.range(r,li(+r+1),e).length}var o=n.domain(),i=Xa(o),l=null==t?a(i,10):\"number\"==typeof t&&a(i,t);return l&&(t=l[0],e=l[1]),n.domain(Za(o,e>1?{floor:function(e){for(;r(e=t.floor(e));)e=li(e-1);return e},ceil:function(e){for(;r(e=t.ceil(e));)e=li(+e+1);return e}}:t))},n.ticks=function(t,e){var r=Xa(n.domain()),o=null==t?a(r,10):\"number\"==typeof t?a(r,t):!t.range&&[{range:t},e];return o&&(t=o[0],e=o[1]),t.range(r[0],li(+r[1]+1),e<1?1:e)},n.tickFormat=function(){return r},n.copy=function(){return ii(t.copy(),e,r)},Ja(n,t)}function li(t){return new Date(t)}function si(t){return JSON.parse(t.responseText)}function ci(t){var e=hi.createRange();return e.selectNode(hi.body),e.createContextualFragment(t.responseText)}var ui={version:\"3.5.17\"},fi=[].slice,di=function(t){return fi.call(t)},hi=this.document;if(hi)try{di(hi.documentElement.childNodes)[0].nodeType}catch(t){di=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),hi)try{hi.createElement(\"DIV\").style.setProperty(\"opacity\",0,\"\")}catch(t){var pi=this.Element.prototype,gi=pi.setAttribute,vi=pi.setAttributeNS,mi=this.CSSStyleDeclaration.prototype,yi=mi.setProperty;pi.setAttribute=function(t,e){gi.call(this,t,e+\"\")},pi.setAttributeNS=function(t,e,r){vi.call(this,t,e,r+\"\")},mi.setProperty=function(t,e,r){yi.call(this,t,e+\"\",r)}}ui.ascending=a,ui.descending=function(t,e){return e<t?-1:e>t?1:e>=t?0:0/0},ui.min=function(t,e){var r,n,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(n=t[a])&&n>=n){r=n;break}for(;++a<o;)null!=(n=t[a])&&r>n&&(r=n)}else{for(;++a<o;)if(null!=(n=e.call(t,t[a],a))&&n>=n){r=n;break}for(;++a<o;)null!=(n=e.call(t,t[a],a))&&r>n&&(r=n)}return r},ui.max=function(t,e){var r,n,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(n=t[a])&&n>=n){r=n;break}for(;++a<o;)null!=(n=t[a])&&n>r&&(r=n)}else{for(;++a<o;)if(null!=(n=e.call(t,t[a],a))&&n>=n){r=n;break}for(;++a<o;)null!=(n=e.call(t,t[a],a))&&n>r&&(r=n)}return r},ui.extent=function(t,e){var r,n,a,o=-1,i=t.length;if(1===arguments.length){for(;++o<i;)if(null!=(n=t[o])&&n>=n){r=a=n;break}for(;++o<i;)null!=(n=t[o])&&(r>n&&(r=n),a<n&&(a=n))}else{for(;++o<i;)if(null!=(n=e.call(t,t[o],o))&&n>=n){r=a=n;break}for(;++o<i;)null!=(n=e.call(t,t[o],o))&&(r>n&&(r=n),a<n&&(a=n))}return[r,a]},ui.sum=function(t,e){var r,n=0,a=t.length,o=-1;if(1===arguments.length)for(;++o<a;)i(r=+t[o])&&(n+=r);else for(;++o<a;)i(r=+e.call(t,t[o],o))&&(n+=r);return n},ui.mean=function(t,e){var r,n=0,a=t.length,l=-1,s=a;if(1===arguments.length)for(;++l<a;)i(r=o(t[l]))?n+=r:--s;else for(;++l<a;)i(r=o(e.call(t,t[l],l)))?n+=r:--s;if(s)return n/s},ui.quantile=function(t,e){var r=(t.length-1)*e+1,n=Math.floor(r),a=+t[n-1],o=r-n;return o?a+o*(t[n]-a):a},ui.median=function(t,e){var r,n=[],l=t.length,s=-1;if(1===arguments.length)for(;++s<l;)i(r=o(t[s]))&&n.push(r);else for(;++s<l;)i(r=o(e.call(t,t[s],s)))&&n.push(r);if(n.length)return ui.quantile(n.sort(a),.5)},ui.variance=function(t,e){var r,n,a=t.length,l=0,s=0,c=-1,u=0;if(1===arguments.length)for(;++c<a;)i(r=o(t[c]))&&(n=r-l,l+=n/++u,s+=n*(r-l));else for(;++c<a;)i(r=o(e.call(t,t[c],c)))&&(n=r-l,l+=n/++u,s+=n*(r-l));if(u>1)return s/(u-1)},ui.deviation=function(){var t=ui.variance.apply(this,arguments);return t?Math.sqrt(t):t};var xi=l(a);ui.bisectLeft=xi.left,ui.bisect=ui.bisectRight=xi.right,ui.bisector=function(t){return l(1===t.length?function(e,r){return a(t(e),r)}:t)},ui.shuffle=function(t,e,r){(o=arguments.length)<3&&(r=t.length,o<2&&(e=0));for(var n,a,o=r-e;o;)a=Math.random()*o--|0,n=t[o+e],t[o+e]=t[a+e],t[a+e]=n;return t},ui.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},ui.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],a=new Array(r<0?0:r);e<r;)a[e]=[n,n=t[++e]];return a},ui.transpose=function(t){if(!(a=t.length))return[];for(var e=-1,r=ui.min(t,s),n=new Array(r);++e<r;)for(var a,o=-1,i=n[e]=new Array(a);++o<a;)i[o]=t[o][e];return n},ui.zip=function(){return ui.transpose(arguments)},ui.keys=function(t){var e=[];for(var r in t)e.push(r);return e},ui.values=function(t){var e=[];for(var r in t)e.push(t[r]);return e},ui.entries=function(t){var e=[];for(var r in t)e.push({key:r,value:t[r]});return e},ui.merge=function(t){for(var e,r,n,a=t.length,o=-1,i=0;++o<a;)i+=t[o].length;for(r=new Array(i);--a>=0;)for(n=t[a],e=n.length;--e>=0;)r[--i]=n[e];return r};var bi=Math.abs;ui.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r===1/0)throw new Error(\"infinite range\");var n,a=[],o=c(bi(r)),i=-1;if(t*=o,e*=o,r*=o,r<0)for(;(n=t+r*++i)>e;)a.push(n/o);else for(;(n=t+r*++i)<e;)a.push(n/o);return a},ui.map=function(t,e){var r=new f;if(t instanceof f)t.forEach(function(t,e){r.set(t,e)});else if(Array.isArray(t)){var n,a=-1,o=t.length;if(1===arguments.length)for(;++a<o;)r.set(a,t[a]);else for(;++a<o;)r.set(e.call(t,n=t[a],a),n)}else for(var i in t)r.set(i,t[i]);return r};var _i=\"__proto__\",wi=\"\\0\";u(f,{has:p,get:function(t){return this._[d(t)]},set:function(t,e){return this._[d(t)]=e},remove:g,keys:v,values:function(){var t=[];for(var e in this._)t.push(this._[e]);return t},entries:function(){var t=[];for(var e in this._)t.push({key:h(e),value:this._[e]});return t},size:m,empty:y,forEach:function(t){for(var e in this._)t.call(this,h(e),this._[e])}}),ui.nest=function(){function t(e,i,l){if(l>=o.length)return n?n.call(a,i):r?i.sort(r):i;for(var s,c,u,d,h=-1,p=i.length,g=o[l++],v=new f;++h<p;)(d=v.get(s=g(c=i[h])))?d.push(c):v.set(s,[c]);return e?(c=e(),u=function(r,n){c.set(r,t(e,n,l))}):(c={},u=function(r,n){c[r]=t(e,n,l)}),v.forEach(u),c}function e(t,r){if(r>=o.length)return t;var n=[],a=i[r++];return t.forEach(function(t,a){n.push({key:t,values:e(a,r)})}),a?n.sort(function(t,e){return a(t.key,e.key)}):n}var r,n,a={},o=[],i=[];return a.map=function(e,r){return t(r,e,0)},a.entries=function(r){return e(t(ui.map,r,0),0)},a.key=function(t){return o.push(t),a},a.sortKeys=function(t){return i[o.length-1]=t,a},a.sortValues=function(t){return r=t,a},a.rollup=function(t){return n=t,a},a},ui.set=function(t){var e=new x;if(t)for(var r=0,n=t.length;r<n;++r)e.add(t[r]);return e},u(x,{has:p,add:function(t){return this._[d(t+=\"\")]=!0,t},remove:g,values:v,size:m,empty:y,forEach:function(t){for(var e in this._)t.call(this,h(e))}}),ui.behavior={},ui.rebind=function(t,e){for(var r,n=1,a=arguments.length;++n<a;)t[r=arguments[n]]=_(t,e,e[r]);return t};var ki=[\"webkit\",\"ms\",\"moz\",\"Moz\",\"o\",\"O\"];ui.dispatch=function(){for(var t=new M,e=-1,r=arguments.length;++e<r;)t[arguments[e]]=A(t);return t},M.prototype.on=function(t,e){var r=t.indexOf(\".\"),n=\"\";if(r>=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},ui.event=null,ui.requote=function(t){return t.replace(Mi,\"\\\\$&\")};var Mi=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,Ai={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]},Ti=function(t,e){return e.querySelector(t)},Li=function(t,e){return e.querySelectorAll(t)},Ci=function(t,e){var r=t.matches||t[w(t,\"matchesSelector\")];return(Ci=function(t,e){return r.call(t,e)})(t,e)};\"function\"==typeof Sizzle&&(Ti=function(t,e){return Sizzle(t,e)[0]||null},Li=Sizzle,Ci=Sizzle.matchesSelector),ui.selection=function(){return ui.select(hi.documentElement)};var Si=ui.selection.prototype=[];Si.select=function(t){var e,r,n,a,o=[];t=z(t);for(var i=-1,l=this.length;++i<l;){o.push(e=[]),e.parentNode=(n=this[i]).parentNode;for(var s=-1,c=n.length;++s<c;)(a=n[s])?(e.push(r=t.call(a,a.__data__,s,i)),r&&\"__data__\"in a&&(r.__data__=a.__data__)):e.push(null)}return S(o)},Si.selectAll=function(t){var e,r,n=[];t=O(t);for(var a=-1,o=this.length;++a<o;)for(var i=this[a],l=-1,s=i.length;++l<s;)(r=i[l])&&(n.push(e=di(t.call(r,r.__data__,l,a))),e.parentNode=r);return S(n)};var zi=\"http://www.w3.org/1999/xhtml\",Oi={svg:\"http://www.w3.org/2000/svg\",xhtml:zi,xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\"};ui.ns={prefix:Oi,qualify:function(t){var e=t.indexOf(\":\"),r=t;return e>=0&&\"xmlns\"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),Oi.hasOwnProperty(r)?{space:Oi[r],local:t}:t}},Si.attr=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node();return t=ui.ns.qualify(t),t.local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(D(e,t[e]));return this}return this.each(D(t,e))},Si.classed=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node(),n=(t=N(t)).length,a=-1;if(e=r.classList){for(;++a<n;)if(!e.contains(t[a]))return!1}else for(e=r.getAttribute(\"class\");++a<n;)if(!E(t[a]).test(e))return!1;return!0}for(e in t)this.each(I(e,t[e]));return this}return this.each(I(t,e))},Si.style=function(t,e,r){var a=arguments.length;if(a<3){if(\"string\"!=typeof t){a<2&&(e=\"\");for(r in t)this.each(F(r,t[r],e));return this}if(a<2){var o=this.node();return n(o).getComputedStyle(o,null).getPropertyValue(t)}r=\"\"}return this.each(F(t,e,r))},Si.property=function(t,e){if(arguments.length<2){if(\"string\"==typeof t)return this.node()[t];for(e in t)this.each(j(e,t[e]));return this}return this.each(j(t,e))},Si.text=function(t){return arguments.length?this.each(\"function\"==typeof t?function(){var e=t.apply(this,arguments);this.textContent=null==e?\"\":e}:null==t?function(){this.textContent=\"\"}:function(){this.textContent=t}):this.node().textContent},Si.html=function(t){return arguments.length?this.each(\"function\"==typeof t?function(){var e=t.apply(this,arguments);this.innerHTML=null==e?\"\":e}:null==t?function(){this.innerHTML=\"\"}:function(){this.innerHTML=t}):this.node().innerHTML},Si.append=function(t){return t=B(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Si.insert=function(t,e){return t=B(t),e=z(e),this.select(function(){return this.insertBefore(t.apply(this,arguments),e.apply(this,arguments)||null)})},Si.remove=function(){return this.each(q)},Si.data=function(t,e){function r(t,r){var n,a,o,i=t.length,u=r.length,d=Math.min(i,u),h=new Array(u),p=new Array(u),g=new Array(i);if(e){var v,m=new f,y=new Array(i);for(n=-1;++n<i;)(a=t[n])&&(m.has(v=e.call(a,a.__data__,n))?g[n]=a:m.set(v,a),y[n]=v);for(n=-1;++n<u;)(a=m.get(v=e.call(r,o=r[n],n)))?a!==!0&&(h[n]=a,a.__data__=o):p[n]=H(o),m.set(v,!0);for(n=-1;++n<i;)n in y&&m.get(y[n])!==!0&&(g[n]=t[n])}else{for(n=-1;++n<d;)a=t[n],o=r[n],a?(a.__data__=o,h[n]=a):p[n]=H(o);for(;n<u;++n)p[n]=H(r[n]);for(;n<i;++n)g[n]=t[n]}p.update=h,p.parentNode=h.parentNode=g.parentNode=t.parentNode,l.push(p),s.push(h),c.push(g)}var n,a,o=-1,i=this.length;if(!arguments.length){for(t=new Array(i=(n=this[0]).length);++o<i;)(a=n[o])&&(t[o]=a.__data__);return t}var l=G([]),s=S([]),c=S([]);if(\"function\"==typeof t)for(;++o<i;)r(n=this[o],t.call(n,n.parentNode.__data__,o));else for(;++o<i;)r(n=this[o],t);return s.enter=function(){return l},s.exit=function(){return c},s},Si.datum=function(t){return arguments.length?this.property(\"__data__\",t):this.property(\"__data__\")},Si.filter=function(t){var e,r,n,a=[];\"function\"!=typeof t&&(t=V(t));for(var o=0,i=this.length;o<i;o++){a.push(e=[]),e.parentNode=(r=this[o]).parentNode;for(var l=0,s=r.length;l<s;l++)(n=r[l])&&t.call(n,n.__data__,l,o)&&e.push(n)}return S(a)},Si.order=function(){for(var t=-1,e=this.length;++t<e;)for(var r,n=this[t],a=n.length-1,o=n[a];--a>=0;)(r=n[a])&&(o&&o!==r.nextSibling&&o.parentNode.insertBefore(r,o),o=r);return this},Si.sort=function(t){t=U.apply(this,arguments);for(var e=-1,r=this.length;++e<r;)this[e].sort(t);return this.order()},Si.each=function(t){return X(this,function(e,r,n){t.call(e,e.__data__,r,n)})},Si.call=function(t){var e=di(arguments);return t.apply(e[0]=this,e),this},Si.empty=function(){return!this.node()},Si.node=function(){for(var t=0,e=this.length;t<e;t++)for(var r=this[t],n=0,a=r.length;n<a;n++){var o=r[n];if(o)return o}return null},Si.size=function(){var t=0;return X(this,function(){++t}),t};var Di=[];ui.selection.enter=G,ui.selection.enter.prototype=Di,Di.append=Si.append,Di.empty=Si.empty,Di.node=Si.node,Di.call=Si.call,Di.size=Si.size,Di.select=function(t){for(var e,r,n,a,o,i=[],l=-1,s=this.length;++l<s;){n=(a=this[l]).update,i.push(e=[]),e.parentNode=a.parentNode;for(var c=-1,u=a.length;++c<u;)(o=a[c])?(e.push(n[c]=r=t.call(a.parentNode,o.__data__,c,l)),r.__data__=o.__data__):e.push(null)}return S(i)},Di.insert=function(t,e){return arguments.length<2&&(e=Y(this)),Si.insert.call(this,t,e)},ui.select=function(t){var r;return\"string\"==typeof t?(r=[Ti(t,hi)],r.parentNode=hi.documentElement):(r=[t],r.parentNode=e(t)),S([r])},ui.selectAll=function(t){var e;return\"string\"==typeof t?(e=di(Li(t,hi)),e.parentNode=hi.documentElement):(e=di(t),e.parentNode=null),S([e])},Si.on=function(t,e,r){var n=arguments.length;if(n<3){if(\"string\"!=typeof t){n<2&&(e=!1);for(r in t)this.each(Z(r,t[r],e));return this}if(n<2)return(n=this.node()[\"__on\"+t])&&n._;r=!1}return this.each(Z(t,e,r))};var Pi=ui.map({mouseenter:\"mouseover\",mouseleave:\"mouseout\"});hi&&Pi.forEach(function(t){\"on\"+t in hi&&Pi.remove(t)});var Ei,Ni=0;ui.mouse=function(t){return J(t,L())};var Ii=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ui.touch=function(t,e,r){if(arguments.length<3&&(r=e,e=L().changedTouches),e)for(var n,a=0,o=e.length;a<o;++a)if((n=e[a]).identifier===r)return J(t,n)},ui.behavior.drag=function(){function t(){this.on(\"mousedown.drag\",o).on(\"touchstart.drag\",i)}function e(t,e,n,o,i){return function(){function l(){var t,r,n=e(d,g);n&&(t=n[0]-x[0],r=n[1]-x[1],p|=t|r,x=n,h({type:\"drag\",x:n[0]+c[0],y:n[1]+c[1],dx:t,dy:r}))}function s(){e(d,g)&&(m.on(o+v,null).on(i+v,null),y(p),h({type:\"dragend\"}))}var c,u=this,f=ui.event.target.correspondingElement||ui.event.target,d=u.parentNode,h=r.of(u,arguments),p=0,g=t(),v=\".drag\"+(null==g?\"\":\"-\"+g),m=ui.select(n(f)).on(o+v,l).on(i+v,s),y=Q(f),x=e(d,g);a?(c=a.apply(u,arguments),c=[c.x-x[0],c.y-x[1]]):c=[0,0],h({type:\"dragstart\"})}}var r=C(t,\"drag\",\"dragstart\",\"dragend\"),a=null,o=e(k,ui.mouse,n,\"mousemove\",\"mouseup\"),i=e(K,ui.touch,b,\"touchmove\",\"touchend\");return t.origin=function(e){return arguments.length?(a=e,t):a},ui.rebind(t,r,\"on\")},ui.touches=function(t,e){return arguments.length<2&&(e=L().touches),e?di(e).map(function(e){var r=J(t,e);return r.identifier=e.identifier,r}):[]};var Ri=1e-6,Fi=Ri*Ri,ji=Math.PI,Bi=2*ji,qi=Bi-Ri,Hi=ji/2,Vi=ji/180,Ui=180/ji,Xi=Math.SQRT2;ui.interpolateZoom=function(t,e){var r,n,a=t[0],o=t[1],i=t[2],l=e[0],s=e[1],c=e[2],u=l-a,f=s-o,d=u*u+f*f;if(d<Fi)n=Math.log(c/i)/Xi,r=function(t){return[a+t*u,o+t*f,i*Math.exp(Xi*t*n)]};else{var h=Math.sqrt(d),p=(c*c-i*i+4*d)/(2*i*2*h),g=(c*c-i*i-4*d)/(2*c*2*h),v=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(g*g+1)-g);n=(m-v)/Xi,r=function(t){var e=t*n,r=ot(v),l=i/(2*h)*(r*it(Xi*e+v)-at(v));return[a+l*u,o+l*f,i*r/ot(Xi*e+v)]}}return r.duration=1e3*n,r},ui.behavior.zoom=function(){function t(t){t.on(O,f).on(Yi+\".zoom\",h).on(\"dblclick.zoom\",p).on(E,d)}function e(t){return[(t[0]-M.x)/M.k,(t[1]-M.y)/M.k]}function r(t){return[t[0]*M.k+M.x,t[1]*M.k+M.y]}function a(t){M.k=Math.max(L[0],Math.min(L[1],t))}function o(t,e){e=r(e),M.x+=t[0]-e[0],M.y+=t[1]-e[1]}function i(e,r,n,i){e.__chart__={x:M.x,y:M.y,k:M.k},a(Math.pow(2,i)),o(v=r,n),e=ui.select(e),S>0&&(e=e.transition().duration(S)),e.call(t.event)}function l(){_&&_.domain(b.range().map(function(t){return(t-M.x)/M.k}).map(b.invert)),k&&k.domain(w.range().map(function(t){return(t-M.y)/M.k}).map(w.invert))}function s(t){z++||t({type:\"zoomstart\"})}function c(t){l(),t({type:\"zoom\",scale:M.k,translate:[M.x,M.y]})}function u(t){--z||(t({type:\"zoomend\"}),v=null)}function f(){function t(){l=1,o(ui.mouse(a),d),c(i)}function r(){f.on(D,null).on(P,null),h(l),u(i)}var a=this,i=N.of(a,arguments),l=0,f=ui.select(n(a)).on(D,t).on(P,r),d=e(ui.mouse(a)),h=Q(a);Bs.call(a),s(i)}function d(){function t(){var t=ui.touches(p);return h=M.k,t.forEach(function(t){\n",
|
|
"t.identifier in v&&(v[t.identifier]=e(t))}),t}function r(){var e=ui.event.target;ui.select(e).on(b,n).on(_,l),w.push(e);for(var r=ui.event.changedTouches,a=0,o=r.length;a<o;++a)v[r[a].identifier]=null;var s=t(),c=Date.now();if(1===s.length){if(c-x<500){var u=s[0];i(p,u,v[u.identifier],Math.floor(Math.log(M.k)/Math.LN2)+1),T()}x=c}else if(s.length>1){var u=s[0],f=s[1],d=u[0]-f[0],h=u[1]-f[1];m=d*d+h*h}}function n(){var t,e,r,n,i=ui.touches(p);Bs.call(p);for(var l=0,s=i.length;l<s;++l,n=null)if(r=i[l],n=v[r.identifier]){if(e)break;t=r,e=n}if(n){var u=(u=r[0]-t[0])*u+(u=r[1]-t[1])*u,f=m&&Math.sqrt(u/m);t=[(t[0]+r[0])/2,(t[1]+r[1])/2],e=[(e[0]+n[0])/2,(e[1]+n[1])/2],a(f*h)}x=null,o(t,e),c(g)}function l(){if(ui.event.touches.length){for(var e=ui.event.changedTouches,r=0,n=e.length;r<n;++r)delete v[e[r].identifier];for(var a in v)return void t()}ui.selectAll(w).on(y,null),k.on(O,f).on(E,d),A(),u(g)}var h,p=this,g=N.of(p,arguments),v={},m=0,y=\".zoom-\"+ui.event.changedTouches[0].identifier,b=\"touchmove\"+y,_=\"touchend\"+y,w=[],k=ui.select(p),A=Q(p);r(),s(g),k.on(O,null).on(E,r)}function h(){var t=N.of(this,arguments);y?clearTimeout(y):(Bs.call(this),g=e(v=m||ui.mouse(this)),s(t)),y=setTimeout(function(){y=null,u(t)},50),T(),a(Math.pow(2,.002*Gi())*M.k),o(v,g),c(t)}function p(){var t=ui.mouse(this),r=Math.log(M.k)/Math.LN2;i(this,t,e(t),ui.event.shiftKey?Math.ceil(r)-1:Math.floor(r)+1)}var g,v,m,y,x,b,_,w,k,M={x:0,y:0,k:1},A=[960,500],L=Zi,S=250,z=0,O=\"mousedown.zoom\",D=\"mousemove.zoom\",P=\"mouseup.zoom\",E=\"touchstart.zoom\",N=C(t,\"zoomstart\",\"zoom\",\"zoomend\");return Yi||(Yi=\"onwheel\"in hi?(Gi=function(){return-ui.event.deltaY*(ui.event.deltaMode?120:1)},\"wheel\"):\"onmousewheel\"in hi?(Gi=function(){return ui.event.wheelDelta},\"mousewheel\"):(Gi=function(){return-ui.event.detail},\"MozMousePixelScroll\")),t.event=function(t){t.each(function(){var t=N.of(this,arguments),e=M;Fs?ui.select(this).transition().each(\"start.zoom\",function(){M=this.__chart__||{x:0,y:0,k:1},s(t)}).tween(\"zoom:zoom\",function(){var r=A[0],n=A[1],a=v?v[0]:r/2,o=v?v[1]:n/2,i=ui.interpolateZoom([(a-M.x)/M.k,(o-M.y)/M.k,r/M.k],[(a-e.x)/e.k,(o-e.y)/e.k,r/e.k]);return function(e){var n=i(e),l=r/n[2];this.__chart__=M={x:a-n[0]*l,y:o-n[1]*l,k:l},c(t)}}).each(\"interrupt.zoom\",function(){u(t)}).each(\"end.zoom\",function(){u(t)}):(this.__chart__=M,s(t),c(t),u(t))})},t.translate=function(e){return arguments.length?(M={x:+e[0],y:+e[1],k:M.k},l(),t):[M.x,M.y]},t.scale=function(e){return arguments.length?(M={x:M.x,y:M.y,k:null},a(+e),l(),t):M.k},t.scaleExtent=function(e){return arguments.length?(L=null==e?Zi:[+e[0],+e[1]],t):L},t.center=function(e){return arguments.length?(m=e&&[+e[0],+e[1]],t):m},t.size=function(e){return arguments.length?(A=e&&[+e[0],+e[1]],t):A},t.duration=function(e){return arguments.length?(S=+e,t):S},t.x=function(e){return arguments.length?(_=e,b=e.copy(),M={x:0,y:0,k:1},t):_},t.y=function(e){return arguments.length?(k=e,w=e.copy(),M={x:0,y:0,k:1},t):k},ui.rebind(t,N,\"on\")};var Gi,Yi,Zi=[0,1/0];ui.color=st,st.prototype.toString=function(){return this.rgb()+\"\"},ui.hsl=ct;var Wi=ct.prototype=new st;Wi.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new ct(this.h,this.s,this.l/t)},Wi.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new ct(this.h,this.s,t*this.l)},Wi.rgb=function(){return ut(this.h,this.s,this.l)},ui.hcl=ft;var $i=ft.prototype=new st;$i.brighter=function(t){return new ft(this.h,this.c,Math.min(100,this.l+Qi*(arguments.length?t:1)))},$i.darker=function(t){return new ft(this.h,this.c,Math.max(0,this.l-Qi*(arguments.length?t:1)))},$i.rgb=function(){return dt(this.h,this.c,this.l).rgb()},ui.lab=ht;var Qi=18,Ji=.95047,Ki=1,tl=1.08883,el=ht.prototype=new st;el.brighter=function(t){return new ht(Math.min(100,this.l+Qi*(arguments.length?t:1)),this.a,this.b)},el.darker=function(t){return new ht(Math.max(0,this.l-Qi*(arguments.length?t:1)),this.a,this.b)},el.rgb=function(){return pt(this.l,this.a,this.b)},ui.rgb=xt;var rl=xt.prototype=new st;rl.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,a=30;return e||r||n?(e&&e<a&&(e=a),r&&r<a&&(r=a),n&&n<a&&(n=a),new xt(Math.min(255,e/t),Math.min(255,r/t),Math.min(255,n/t))):new xt(a,a,a)},rl.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new xt(t*this.r,t*this.g,t*this.b)},rl.hsl=function(){return Mt(this.r,this.g,this.b)},rl.toString=function(){return\"#\"+wt(this.r)+wt(this.g)+wt(this.b)};var nl=ui.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});nl.forEach(function(t,e){nl.set(t,bt(e))}),ui.functor=Ct,ui.xhr=St(b),ui.dsv=function(t,e){function r(t,r,o){arguments.length<3&&(o=r,r=null);var i=zt(t,e,null==r?n:a(r),o);return i.row=function(t){return arguments.length?i.response(null==(r=t)?n:a(t)):r},i}function n(t){return r.parse(t.responseText)}function a(t){return function(e){return r.parse(e.responseText,t)}}function o(e){return e.map(i).join(t)}function i(t){return l.test(t)?'\"'+t.replace(/\\\"/g,'\"\"')+'\"':t}var l=new RegExp('[\"'+t+\"\\n]\"),s=t.charCodeAt(0);return r.parse=function(t,e){var n;return r.parseRows(t,function(t,r){if(n)return n(t,r-1);var a=new Function(\"d\",\"return {\"+t.map(function(t,e){return JSON.stringify(t)+\": d[\"+e+\"]\"}).join(\",\")+\"}\");n=e?function(t,r){return e(a(t),r)}:a})},r.parseRows=function(t,e){function r(){if(u>=c)return i;if(a)return a=!1,o;var e=u;if(34===t.charCodeAt(e)){for(var r=e;r++<c;)if(34===t.charCodeAt(r)){if(34!==t.charCodeAt(r+1))break;++r}u=r+2;var n=t.charCodeAt(r+1);return 13===n?(a=!0,10===t.charCodeAt(r+2)&&++u):10===n&&(a=!0),t.slice(e+1,r).replace(/\"\"/g,'\"')}for(;u<c;){var n=t.charCodeAt(u++),l=1;if(10===n)a=!0;else if(13===n)a=!0,10===t.charCodeAt(u)&&(++u,++l);else if(n!==s)continue;return t.slice(e,u-l)}return t.slice(e)}for(var n,a,o={},i={},l=[],c=t.length,u=0,f=0;(n=r())!==i;){for(var d=[];n!==o&&n!==i;)d.push(n),n=r();e&&null==(d=e(d,f++))||l.push(d)}return l},r.format=function(e){if(Array.isArray(e[0]))return r.formatRows(e);var n=new x,a=[];return e.forEach(function(t){for(var e in t)n.has(e)||a.push(n.add(e))}),[a.map(i).join(t)].concat(e.map(function(e){return a.map(function(t){return i(e[t])}).join(t)})).join(\"\\n\")},r.formatRows=function(t){return t.map(o).join(\"\\n\")},r},ui.csv=ui.dsv(\",\",\"text/csv\"),ui.tsv=ui.dsv(\"\\t\",\"text/tab-separated-values\");var al,ol,il,ll,sl=this[w(this,\"requestAnimationFrame\")]||function(t){setTimeout(t,17)};ui.timer=function(){Pt.apply(this,arguments)},ui.timer.flush=function(){Nt(),It()},ui.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)};var cl=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"\\xb5\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"].map(Ft);ui.formatPrefix=function(t,e){var r=0;return(t=+t)&&(t<0&&(t*=-1),e&&(t=ui.round(t,Rt(t,e))),r=1+Math.floor(1e-12+Math.log(t)/Math.LN10),r=Math.max(-24,Math.min(24,3*Math.floor((r-1)/3)))),cl[8+r/3]};var ul=/(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i,fl=ui.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,e){return t.toPrecision(e)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},r:function(t,e){return(t=ui.round(t,Rt(t,e))).toFixed(Math.max(0,Math.min(20,Rt(t*(1+1e-15),e))))}}),dl=ui.time={},hl=Date;qt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){pl.setUTCDate.apply(this._,arguments)},setDay:function(){pl.setUTCDay.apply(this._,arguments)},setFullYear:function(){pl.setUTCFullYear.apply(this._,arguments)},setHours:function(){pl.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){pl.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){pl.setUTCMinutes.apply(this._,arguments)},setMonth:function(){pl.setUTCMonth.apply(this._,arguments)},setSeconds:function(){pl.setUTCSeconds.apply(this._,arguments)},setTime:function(){pl.setTime.apply(this._,arguments)}};var pl=Date.prototype;dl.year=Ht(function(t){return t=dl.day(t),t.setMonth(0,1),t},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t){return t.getFullYear()}),dl.years=dl.year.range,dl.years.utc=dl.year.utc.range,dl.day=Ht(function(t){var e=new hl(2e3,0);return e.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),e},function(t,e){t.setDate(t.getDate()+e)},function(t){return t.getDate()-1}),dl.days=dl.day.range,dl.days.utc=dl.day.utc.range,dl.dayOfYear=function(t){var e=dl.year(t);return Math.floor((t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/864e5)},[\"sunday\",\"monday\",\"tuesday\",\"wednesday\",\"thursday\",\"friday\",\"saturday\"].forEach(function(t,e){e=7-e;var r=dl[t]=Ht(function(t){return(t=dl.day(t)).setDate(t.getDate()-(t.getDay()+e)%7),t},function(t,e){t.setDate(t.getDate()+7*Math.floor(e))},function(t){var r=dl.year(t).getDay();return Math.floor((dl.dayOfYear(t)+(r+e)%7)/7)-(r!==e)});dl[t+\"s\"]=r.range,dl[t+\"s\"].utc=r.utc.range,dl[t+\"OfYear\"]=function(t){var r=dl.year(t).getDay();return Math.floor((dl.dayOfYear(t)+(r+e)%7)/7)}}),dl.week=dl.sunday,dl.weeks=dl.sunday.range,dl.weeks.utc=dl.sunday.utc.range,dl.weekOfYear=dl.sundayOfYear;var gl={\"-\":\"\",_:\" \",0:\"0\"},vl=/^\\s*\\d+/,ml=/^%/;ui.locale=function(t){return{numberFormat:jt(t),timeFormat:Ut(t)}};var yl=ui.locale({decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],dateTime:\"%a %b %e %X %Y\",date:\"%m/%d/%Y\",time:\"%H:%M:%S\",periods:[\"AM\",\"PM\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]});ui.format=yl.numberFormat,ui.geo={},fe.prototype={s:0,t:0,add:function(t){de(t,this.t,xl),de(xl.s,this.s,this),this.s?this.t+=xl.t:this.s=xl.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xl=new fe;ui.geo.stream=function(t,e){t&&bl.hasOwnProperty(t.type)?bl[t.type](t,e):he(t,e)};var bl={Feature:function(t,e){he(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,n=-1,a=r.length;++n<a;)he(r[n].geometry,e)}},_l={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)t=r[n],e.point(t[0],t[1],t[2])},LineString:function(t,e){pe(t.coordinates,e,0)},MultiLineString:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)pe(r[n],e,0)},Polygon:function(t,e){ge(t.coordinates,e)},MultiPolygon:function(t,e){for(var r=t.coordinates,n=-1,a=r.length;++n<a;)ge(r[n],e)},GeometryCollection:function(t,e){for(var r=t.geometries,n=-1,a=r.length;++n<a;)he(r[n],e)}};ui.geo.area=function(t){return wl=0,ui.geo.stream(t,Ml),wl};var wl,kl=new fe,Ml={sphere:function(){wl+=4*ji},point:k,lineStart:k,lineEnd:k,polygonStart:function(){kl.reset(),Ml.lineStart=ve},polygonEnd:function(){var t=2*kl;wl+=t<0?4*ji+t:t,Ml.lineStart=Ml.lineEnd=Ml.point=k}};ui.geo.bounds=function(){function t(t,e){x.push(b=[u=t,d=t]),e<f&&(f=e),e>h&&(h=e)}function e(e,r){var n=me([e*Vi,r*Vi]);if(m){var a=xe(m,n),o=[a[1],-a[0],0],i=xe(o,a);we(i),i=ke(i);var s=e-p,c=s>0?1:-1,g=i[0]*Ui*c,v=bi(s)>180;if(v^(c*p<g&&g<c*e)){var y=i[1]*Ui;y>h&&(h=y)}else if(g=(g+360)%360-180,v^(c*p<g&&g<c*e)){var y=-i[1]*Ui;y<f&&(f=y)}else r<f&&(f=r),r>h&&(h=r);v?e<p?l(u,e)>l(u,d)&&(d=e):l(e,d)>l(u,d)&&(u=e):d>=u?(e<u&&(u=e),e>d&&(d=e)):e>p?l(u,e)>l(u,d)&&(d=e):l(e,d)>l(u,d)&&(u=e)}else t(e,r);m=n,p=e}function r(){_.point=e}function n(){b[0]=u,b[1]=d,_.point=t,m=null}function a(t,r){if(m){var n=t-p;y+=bi(n)>180?n+(n>0?360:-360):n}else g=t,v=r;Ml.point(t,r),e(t,r)}function o(){Ml.lineStart()}function i(){a(g,v),Ml.lineEnd(),bi(y)>Ri&&(u=-(d=180)),b[0]=u,b[1]=d,m=null}function l(t,e){return(e-=t)<0?e+360:e}function s(t,e){return t[0]-e[0]}function c(t,e){return e[0]<=e[1]?e[0]<=t&&t<=e[1]:t<e[0]||e[1]<t}var u,f,d,h,p,g,v,m,y,x,b,_={point:t,lineStart:r,lineEnd:n,polygonStart:function(){_.point=a,_.lineStart=o,_.lineEnd=i,y=0,Ml.polygonStart()},polygonEnd:function(){Ml.polygonEnd(),_.point=t,_.lineStart=r,_.lineEnd=n,kl<0?(u=-(d=180),f=-(h=90)):y>Ri?h=90:y<-Ri&&(f=-90),b[0]=u,b[1]=d}};return function(t){h=d=-(u=f=1/0),x=[],ui.geo.stream(t,_);var e=x.length;if(e){x.sort(s);for(var r,n=1,a=x[0],o=[a];n<e;++n)r=x[n],c(r[0],a)||c(r[1],a)?(l(a[0],r[1])>l(a[0],a[1])&&(a[1]=r[1]),l(r[0],a[1])>l(a[0],a[1])&&(a[0]=r[0])):o.push(a=r);for(var i,r,p=-1/0,e=o.length-1,n=0,a=o[e];n<=e;a=r,++n)r=o[n],(i=l(a[1],r[0]))>p&&(p=i,u=r[0],d=a[1])}return x=b=null,1/0===u||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[u,f],[d,h]]}}(),ui.geo.centroid=function(t){Al=Tl=Ll=Cl=Sl=zl=Ol=Dl=Pl=El=Nl=0,ui.geo.stream(t,Il);var e=Pl,r=El,n=Nl,a=e*e+r*r+n*n;return a<Fi&&(e=zl,r=Ol,n=Dl,Tl<Ri&&(e=Ll,r=Cl,n=Sl),(a=e*e+r*r+n*n)<Fi)?[0/0,0/0]:[Math.atan2(r,e)*Ui,nt(n/Math.sqrt(a))*Ui]};var Al,Tl,Ll,Cl,Sl,zl,Ol,Dl,Pl,El,Nl,Il={sphere:k,point:Ae,lineStart:Le,lineEnd:Ce,polygonStart:function(){Il.lineStart=Se},polygonEnd:function(){Il.lineStart=Le}},Rl=Ne(Oe,je,qe,[-ji,-ji/2]),Fl=1e9;ui.geo.clipExtent=function(){var t,e,r,n,a,o,i={stream:function(t){return a&&(a.valid=!1),a=o(t),a.valid=!0,a},extent:function(l){return arguments.length?(o=Xe(t=+l[0][0],e=+l[0][1],r=+l[1][0],n=+l[1][1]),a&&(a.valid=!1,a=null),i):[[t,e],[r,n]]}};return i.extent([[0,0],[960,500]])},(ui.geo.conicEqualArea=function(){return Ge(Ye)}).raw=Ye,ui.geo.albers=function(){return ui.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ui.geo.albersUsa=function(){function t(t){var o=t[0],i=t[1];return e=null,r(o,i),e||(n(o,i),e)||a(o,i),e}var e,r,n,a,o=ui.geo.albers(),i=ui.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),l=ui.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),s={point:function(t,r){e=[t,r]}};return t.invert=function(t){var e=o.scale(),r=o.translate(),n=(t[0]-r[0])/e,a=(t[1]-r[1])/e;return(a>=.12&&a<.234&&n>=-.425&&n<-.214?i:a>=.166&&a<.234&&n>=-.214&&n<-.115?l:o).invert(t)},t.stream=function(t){var e=o.stream(t),r=i.stream(t),n=l.stream(t);return{point:function(t,a){e.point(t,a),r.point(t,a),n.point(t,a)},sphere:function(){e.sphere(),r.sphere(),n.sphere()},lineStart:function(){e.lineStart(),r.lineStart(),n.lineStart()},lineEnd:function(){e.lineEnd(),r.lineEnd(),n.lineEnd()},polygonStart:function(){e.polygonStart(),r.polygonStart(),n.polygonStart()},polygonEnd:function(){e.polygonEnd(),r.polygonEnd(),n.polygonEnd()}}},t.precision=function(e){return arguments.length?(o.precision(e),i.precision(e),l.precision(e),t):o.precision()},t.scale=function(e){return arguments.length?(o.scale(e),i.scale(.35*e),l.scale(e),t.translate(o.translate())):o.scale()},t.translate=function(e){if(!arguments.length)return o.translate();var c=o.scale(),u=+e[0],f=+e[1];return r=o.translate(e).clipExtent([[u-.455*c,f-.238*c],[u+.455*c,f+.238*c]]).stream(s).point,n=i.translate([u-.307*c,f+.201*c]).clipExtent([[u-.425*c+Ri,f+.12*c+Ri],[u-.214*c-Ri,f+.234*c-Ri]]).stream(s).point,a=l.translate([u-.205*c,f+.212*c]).clipExtent([[u-.214*c+Ri,f+.166*c+Ri],[u-.115*c-Ri,f+.234*c-Ri]]).stream(s).point,t},t.scale(1070)};var jl,Bl,ql,Hl,Vl,Ul,Xl={point:k,lineStart:k,lineEnd:k,polygonStart:function(){Bl=0,Xl.lineStart=Ze},polygonEnd:function(){Xl.lineStart=Xl.lineEnd=Xl.point=k,jl+=bi(Bl/2)}},Gl={point:We,lineStart:k,lineEnd:k,polygonStart:k,polygonEnd:k},Yl={point:Je,lineStart:Ke,lineEnd:tr,polygonStart:function(){Yl.lineStart=er},polygonEnd:function(){Yl.point=Je,Yl.lineStart=Ke,Yl.lineEnd=tr}};ui.geo.path=function(){function t(t){return t&&(\"function\"==typeof l&&o.pointRadius(+l.apply(this,arguments)),i&&i.valid||(i=a(o)),ui.geo.stream(t,i)),o.result()}function e(){return i=null,t}var r,n,a,o,i,l=4.5;return t.area=function(t){return jl=0,ui.geo.stream(t,a(Xl)),jl},t.centroid=function(t){return Ll=Cl=Sl=zl=Ol=Dl=Pl=El=Nl=0,ui.geo.stream(t,a(Yl)),Nl?[Pl/Nl,El/Nl]:Dl?[zl/Dl,Ol/Dl]:Sl?[Ll/Sl,Cl/Sl]:[0/0,0/0]},t.bounds=function(t){return Vl=Ul=-(ql=Hl=1/0),ui.geo.stream(t,a(Gl)),[[ql,Hl],[Vl,Ul]]},t.projection=function(t){return arguments.length?(a=(r=t)?t.stream||ar(t):b,e()):r},t.context=function(t){return arguments.length?(o=null==(n=t)?new $e:new rr(t),\"function\"!=typeof l&&o.pointRadius(l),e()):n},t.pointRadius=function(e){return arguments.length?(l=\"function\"==typeof e?e:(o.pointRadius(+e),+e),t):l},t.projection(ui.geo.albersUsa()).context(null)},ui.geo.transform=function(t){return{stream:function(e){var r=new or(e);for(var n in t)r[n]=t[n];return r}}},or.prototype={point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ui.geo.projection=lr,ui.geo.projectionMutator=sr,(ui.geo.equirectangular=function(){return lr(ur)}).raw=ur.invert=ur,ui.geo.rotation=function(t){function e(e){return e=t(e[0]*Vi,e[1]*Vi),e[0]*=Ui,e[1]*=Ui,e}return t=dr(t[0]%360*Vi,t[1]*Vi,t.length>2?t[2]*Vi:0),e.invert=function(e){return e=t.invert(e[0]*Vi,e[1]*Vi),e[0]*=Ui,e[1]*=Ui,e},e},fr.invert=ur,ui.geo.circle=function(){function t(){var t=\"function\"==typeof n?n.apply(this,arguments):n,e=dr(-t[0]*Vi,-t[1]*Vi,0).invert,a=[];return r(null,null,1,{point:function(t,r){a.push(t=e(t,r)),t[0]*=Ui,t[1]*=Ui}}),{type:\"Polygon\",coordinates:[a]}}var e,r,n=[0,0],a=6;return t.origin=function(e){return arguments.length?(n=e,t):n},t.angle=function(n){return arguments.length?(r=vr((e=+n)*Vi,a*Vi),t):e},t.precision=function(n){return arguments.length?(r=vr(e*Vi,(a=+n)*Vi),t):a},t.angle(90)},ui.geo.distance=function(t,e){var r,n=(e[0]-t[0])*Vi,a=t[1]*Vi,o=e[1]*Vi,i=Math.sin(n),l=Math.cos(n),s=Math.sin(a),c=Math.cos(a),u=Math.sin(o),f=Math.cos(o);return Math.atan2(Math.sqrt((r=f*i)*r+(r=c*u-s*f*l)*r),s*u+c*f*l)},ui.geo.graticule=function(){function t(){return{type:\"MultiLineString\",coordinates:e()}}function e(){return ui.range(Math.ceil(o/v)*v,a,v).map(d).concat(ui.range(Math.ceil(c/m)*m,s,m).map(h)).concat(ui.range(Math.ceil(n/p)*p,r,p).filter(function(t){return bi(t%v)>Ri}).map(u)).concat(ui.range(Math.ceil(l/g)*g,i,g).filter(function(t){return bi(t%m)>Ri}).map(f))}var r,n,a,o,i,l,s,c,u,f,d,h,p=10,g=p,v=90,m=360,y=2.5;return t.lines=function(){return e().map(function(t){return{type:\"LineString\",coordinates:t}})},t.outline=function(){return{type:\"Polygon\",coordinates:[d(o).concat(h(s).slice(1),d(a).reverse().slice(1),h(c).reverse().slice(1))]}},t.extent=function(e){return arguments.length?t.majorExtent(e).minorExtent(e):t.minorExtent()},t.majorExtent=function(e){return arguments.length?(o=+e[0][0],a=+e[1][0],c=+e[0][1],s=+e[1][1],o>a&&(e=o,o=a,a=e),c>s&&(e=c,c=s,s=e),t.precision(y)):[[o,c],[a,s]]},t.minorExtent=function(e){return arguments.length?(n=+e[0][0],r=+e[1][0],l=+e[0][1],i=+e[1][1],n>r&&(e=n,n=r,r=e),l>i&&(e=l,l=i,i=e),t.precision(y)):[[n,l],[r,i]]},t.step=function(e){return arguments.length?t.majorStep(e).minorStep(e):t.minorStep()},t.majorStep=function(e){return arguments.length?(v=+e[0],m=+e[1],t):[v,m]},t.minorStep=function(e){return arguments.length?(p=+e[0],g=+e[1],t):[p,g]},t.precision=function(e){return arguments.length?(y=+e,u=yr(l,i,90),f=xr(n,r,y),d=yr(c,s,90),h=xr(o,a,y),t):y},t.majorExtent([[-180,-90+Ri],[180,90-Ri]]).minorExtent([[-180,-80-Ri],[180,80+Ri]])},ui.geo.greatArc=function(){function t(){return{type:\"LineString\",coordinates:[e||n.apply(this,arguments),r||a.apply(this,arguments)]}}var e,r,n=br,a=_r;return t.distance=function(){return ui.geo.distance(e||n.apply(this,arguments),r||a.apply(this,arguments))},t.source=function(r){return arguments.length?(n=r,e=\"function\"==typeof r?null:r,t):n},t.target=function(e){return arguments.length?(a=e,r=\"function\"==typeof e?null:e,t):a},t.precision=function(){return arguments.length?t:0},t},ui.geo.interpolate=function(t,e){return wr(t[0]*Vi,t[1]*Vi,e[0]*Vi,e[1]*Vi)},ui.geo.length=function(t){return Zl=0,ui.geo.stream(t,Wl),Zl};var Zl,Wl={sphere:k,point:k,lineStart:kr,lineEnd:k,polygonStart:k,polygonEnd:k},$l=Mr(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(ui.geo.azimuthalEqualArea=function(){return lr($l)}).raw=$l;var Ql=Mr(function(t){var e=Math.acos(t);return e&&e/Math.sin(e)},b);(ui.geo.azimuthalEquidistant=function(){return lr(Ql)}).raw=Ql,(ui.geo.conicConformal=function(){return Ge(Ar)}).raw=Ar,(ui.geo.conicEquidistant=function(){return Ge(Tr)}).raw=Tr;var Jl=Mr(function(t){return 1/t},Math.atan);(ui.geo.gnomonic=function(){return lr(Jl)}).raw=Jl,Lr.invert=function(t,e){return[t,2*Math.atan(Math.exp(e))-Hi]},(ui.geo.mercator=function(){return Cr(Lr)}).raw=Lr;var Kl=Mr(function(){return 1},Math.asin);(ui.geo.orthographic=function(){return lr(Kl)}).raw=Kl;var ts=Mr(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(ui.geo.stereographic=function(){return lr(ts)}).raw=ts,Sr.invert=function(t,e){return[-e,2*Math.atan(Math.exp(t))-Hi]},(ui.geo.transverseMercator=function(){var t=Cr(Sr),e=t.center,r=t.rotate;return t.center=function(t){return t?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])},t.rotate=function(t){return t?r([t[0],t[1],t.length>2?t[2]+90:90]):(t=r(),[t[0],t[1],t[2]-90])},r([0,0,90])}).raw=Sr,ui.geom={},ui.geom.hull=function(t){function e(t){if(t.length<3)return[];var e,a=Ct(r),o=Ct(n),i=t.length,l=[],s=[];for(e=0;e<i;e++)l.push([+a.call(this,t[e],e),+o.call(this,t[e],e),e]);for(l.sort(Pr),e=0;e<i;e++)s.push([l[e][0],-l[e][1]]);var c=Dr(l),u=Dr(s),f=u[0]===c[0],d=u[u.length-1]===c[c.length-1],h=[];for(e=c.length-1;e>=0;--e)h.push(t[l[c[e]][2]]);for(e=+f;e<u.length-d;++e)h.push(t[l[u[e]][2]]);return h}var r=zr,n=Or;return arguments.length?e(t):(e.x=function(t){return arguments.length?(r=t,e):r},e.y=function(t){return arguments.length?(n=t,e):n},e)},ui.geom.polygon=function(t){return Ai(t,es),t};var es=ui.geom.polygon.prototype=[];es.area=function(){for(var t,e=-1,r=this.length,n=this[r-1],a=0;++e<r;)t=n,n=this[e],a+=t[1]*n[0]-t[0]*n[1];return.5*a},es.centroid=function(t){var e,r,n=-1,a=this.length,o=0,i=0,l=this[a-1];for(arguments.length||(t=-1/(6*this.area()));++n<a;)e=l,l=this[n],r=e[0]*l[1]-l[0]*e[1],o+=(e[0]+l[0])*r,i+=(e[1]+l[1])*r;return[o*t,i*t]},es.clip=function(t){for(var e,r,n,a,o,i,l=Ir(t),s=-1,c=this.length-Ir(this),u=this[c-1];++s<c;){for(e=t.slice(),t.length=0,a=this[s],o=e[(n=e.length-l)-1],r=-1;++r<n;)i=e[r],Er(i,u,a)?(Er(o,u,a)||t.push(Nr(o,i,u,a)),t.push(i)):Er(o,u,a)&&t.push(Nr(o,i,u,a)),o=i;l&&t.push(t[0]),u=a}return t};var rs,ns,as,os,is,ls=[],ss=[];Ur.prototype.prepare=function(){for(var t,e=this.edges,r=e.length;r--;)t=e[r].edge,t.b&&t.a||e.splice(r,1);return e.sort(Gr),e.length},rn.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nn.prototype={insert:function(t,e){var r,n,a;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;r=t}else this._?(t=sn(this._),e.P=null,e.N=t,t.P=t.L=e,r=t):(e.P=e.N=null,this._=e,r=null);for(e.L=e.R=null,e.U=r,e.C=!0,t=e;r&&r.C;)n=r.U,r===n.L?(a=n.R,a&&a.C?(r.C=a.C=!1,n.C=!0,t=n):(t===r.R&&(on(this,r),t=r,r=t.U),r.C=!1,n.C=!0,ln(this,n))):(a=n.L,a&&a.C?(r.C=a.C=!1,n.C=!0,t=n):(t===r.L&&(ln(this,r),t=r,r=t.U),r.C=!1,n.C=!0,on(this,n))),r=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,r,n,a=t.U,o=t.L,i=t.R;if(r=o?i?sn(i):o:i,a?a.L===t?a.L=r:a.R=r:this._=r,o&&i?(n=r.C,r.C=t.C,r.L=o,o.U=r,r!==i?(a=r.U,r.U=t.U,t=r.R,a.L=t,r.R=i,i.U=r):(r.U=a,a=r,t=r.R)):(n=t.C,t=r),t&&(t.U=a),!n){if(t&&t.C)return void(t.C=!1);do{if(t===this._)break;if(t===a.L){if(e=a.R,e.C&&(e.C=!1,a.C=!0,on(this,a),e=a.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,ln(this,e),e=a.R),e.C=a.C,a.C=e.R.C=!1,on(this,a),t=this._;break}}else if(e=a.L,e.C&&(e.C=!1,a.C=!0,ln(this,a),e=a.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,on(this,e),e=a.L),e.C=a.C,a.C=e.L.C=!1,ln(this,a),t=this._;break}e.C=!0,t=a,a=a.U}while(!t.C);t&&(t.C=!1)}}},ui.geom.voronoi=function(t){function e(t){var e=new Array(t.length),n=l[0][0],a=l[0][1],o=l[1][0],i=l[1][1];return cn(r(t),l).cells.forEach(function(r,l){var s=r.edges,c=r.site;(e[l]=s.length?s.map(function(t){var e=t.start();return[e.x,e.y]}):c.x>=n&&c.x<=o&&c.y>=a&&c.y<=i?[[n,i],[o,i],[o,a],[n,a]]:[]).point=t[l]}),e}function r(t){return t.map(function(t,e){return{x:Math.round(o(t,e)/Ri)*Ri,y:Math.round(i(t,e)/Ri)*Ri,i:e}})}var n=zr,a=Or,o=n,i=a,l=cs;return t?e(t):(e.links=function(t){return cn(r(t)).edges.filter(function(t){return t.l&&t.r}).map(function(e){return{source:t[e.l.i],target:t[e.r.i]}})},e.triangles=function(t){var e=[];return cn(r(t)).cells.forEach(function(r,n){for(var a,o=r.site,i=r.edges.sort(Gr),l=-1,s=i.length,c=i[s-1].edge,u=c.l===o?c.r:c.l;++l<s;)c,a=u,c=i[l].edge,u=c.l===o?c.r:c.l,n<a.i&&n<u.i&&fn(o,a,u)<0&&e.push([t[n],t[a.i],t[u.i]])}),e},e.x=function(t){return arguments.length?(o=Ct(n=t),e):n},e.y=function(t){return arguments.length?(i=Ct(a=t),e):a},e.clipExtent=function(t){return arguments.length?(l=null==t?cs:t,e):l===cs?null:l},e.size=function(t){return arguments.length?e.clipExtent(t&&[[0,0],t]):l===cs?null:l&&l[1]},e)};var cs=[[-1e6,-1e6],[1e6,1e6]];ui.geom.delaunay=function(t){return ui.geom.voronoi().triangles(t)},ui.geom.quadtree=function(t,e,r,n,a){function o(t){function o(t,e,r,n,a,o,i,l){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var s=t.x,u=t.y;if(null!=s)if(bi(s-r)+bi(u-n)<.01)c(t,e,r,n,a,o,i,l);else{var f=t.point;t.x=t.y=t.point=null,c(t,f,s,u,a,o,i,l),c(t,e,r,n,a,o,i,l)}else t.x=r,t.y=n,t.point=e}else c(t,e,r,n,a,o,i,l)}function c(t,e,r,n,a,i,l,s){var c=.5*(a+l),u=.5*(i+s),f=r>=c,d=n>=u,h=d<<1|f;t.leaf=!1,t=t.nodes[h]||(t.nodes[h]=pn()),f?a=c:l=c,d?i=u:s=u,o(t,e,r,n,a,i,l,s)}var u,f,d,h,p,g,v,m,y,x=Ct(l),b=Ct(s);if(null!=e)g=e,v=r,m=n,y=a;else if(m=y=-(g=v=1/0),f=[],d=[],p=t.length,i)for(h=0;h<p;++h)u=t[h],u.x<g&&(g=u.x),u.y<v&&(v=u.y),u.x>m&&(m=u.x),u.y>y&&(y=u.y),f.push(u.x),d.push(u.y);else for(h=0;h<p;++h){var _=+x(u=t[h],h),w=+b(u,h);_<g&&(g=_),w<v&&(v=w),_>m&&(m=_),w>y&&(y=w),f.push(_),d.push(w)}var k=m-g,M=y-v;k>M?y=v+k:m=g+M;var A=pn();if(A.add=function(t){o(A,t,+x(t,++h),+b(t,h),g,v,m,y)},A.visit=function(t){gn(t,A,g,v,m,y)},A.find=function(t){return vn(A,t[0],t[1],g,v,m,y)},h=-1,null==e){for(;++h<p;)o(A,t[h],f[h],d[h],g,v,m,y);--h}else t.forEach(A.add);return f=d=t=u=null,A}var i,l=zr,s=Or;return(i=arguments.length)?(l=dn,s=hn,3===i&&(a=r,n=e,r=e=0),o(t)):(o.x=function(t){return arguments.length?(l=t,o):l},o.y=function(t){return arguments.length?(s=t,o):s},o.extent=function(t){return arguments.length?(null==t?e=r=n=a=null:(e=+t[0][0],r=+t[0][1],n=+t[1][0],a=+t[1][1]),o):null==e?null:[[e,r],[n,a]]},o.size=function(t){return arguments.length?(null==t?e=r=n=a=null:(e=r=0,n=+t[0],a=+t[1]),o):null==e?null:[n-e,a-r]},o)},ui.interpolateRgb=mn,ui.interpolateObject=yn,ui.interpolateNumber=xn,ui.interpolateString=bn;var us=/[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,fs=new RegExp(us.source,\"g\");ui.interpolate=_n,ui.interpolators=[function(t,e){var r=typeof e;return(\"string\"===r?nl.has(e.toLowerCase())||/^(#|rgb\\(|hsl\\()/i.test(e)?mn:bn:e instanceof st?mn:Array.isArray(e)?wn:\"object\"===r&&isNaN(e)?yn:xn)(t,e)}],ui.interpolateArray=wn;var ds=function(){return b},hs=ui.map({linear:ds,poly:Sn,quad:function(){return Tn},cubic:function(){return Ln},sin:function(){return zn},exp:function(){return On},circle:function(){return Dn},elastic:Pn,back:En,bounce:function(){return Nn}}),ps=ui.map({in:b,out:Mn,\"in-out\":An,\"out-in\":function(t){return An(Mn(t))}});ui.ease=function(t){var e=t.indexOf(\"-\"),r=e>=0?t.slice(0,e):t,n=e>=0?t.slice(e+1):\"in\";return r=hs.get(r)||ds,n=ps.get(n)||b,kn(n(r.apply(null,fi.call(arguments,1))))},ui.interpolateHcl=In,ui.interpolateHsl=Rn,ui.interpolateLab=Fn,ui.interpolateRound=jn,ui.transform=function(t){var e=hi.createElementNS(ui.ns.prefix.svg,\"g\");return(ui.transform=function(t){if(null!=t){e.setAttribute(\"transform\",t);var r=e.transform.baseVal.consolidate()}return new Bn(r?r.matrix:gs)})(t)},Bn.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var gs={a:1,b:0,c:0,d:1,e:0,f:0};ui.interpolateTransform=Wn,ui.layout={},ui.layout.bundle=function(){return function(t){for(var e=[],r=-1,n=t.length;++r<n;)e.push(Jn(t[r]));return e}},ui.layout.chord=function(){function t(){var t,c,f,d,h,p={},g=[],v=ui.range(o),m=[];for(r=[],n=[],t=0,d=-1;++d<o;){for(c=0,h=-1;++h<o;)c+=a[d][h];g.push(c),m.push(ui.range(o)),t+=c}for(i&&v.sort(function(t,e){return i(g[t],g[e])}),l&&m.forEach(function(t,e){t.sort(function(t,r){return l(a[e][t],a[e][r])})}),t=(Bi-u*o)/t,c=0,d=-1;++d<o;){for(f=c,h=-1;++h<o;){\n",
|
|
"var y=v[d],x=m[y][h],b=a[y][x],_=c,w=c+=b*t;p[y+\"-\"+x]={index:y,subindex:x,startAngle:_,endAngle:w,value:b}}n[y]={index:y,startAngle:f,endAngle:c,value:g[y]},c+=u}for(d=-1;++d<o;)for(h=d-1;++h<o;){var k=p[d+\"-\"+h],M=p[h+\"-\"+d];(k.value||M.value)&&r.push(k.value<M.value?{source:M,target:k}:{source:k,target:M})}s&&e()}function e(){r.sort(function(t,e){return s((t.source.value+t.target.value)/2,(e.source.value+e.target.value)/2)})}var r,n,a,o,i,l,s,c={},u=0;return c.matrix=function(t){return arguments.length?(o=(a=t)&&a.length,r=n=null,c):a},c.padding=function(t){return arguments.length?(u=t,r=n=null,c):u},c.sortGroups=function(t){return arguments.length?(i=t,r=n=null,c):i},c.sortSubgroups=function(t){return arguments.length?(l=t,r=null,c):l},c.sortChords=function(t){return arguments.length?(s=t,r&&e(),c):s},c.chords=function(){return r||t(),r},c.groups=function(){return n||t(),n},c},ui.layout.force=function(){function t(t){return function(e,r,n,a){if(e.point!==t){var o=e.cx-t.x,i=e.cy-t.y,l=a-r,s=o*o+i*i;if(l*l/m<s){if(s<g){var c=e.charge/s;t.px-=o*c,t.py-=i*c}return!0}if(e.point&&s&&s<g){var c=e.pointCharge/s;t.px-=o*c,t.py-=i*c}}return!e.charge}}function e(t){t.px=ui.event.x,t.py=ui.event.y,s.resume()}var r,n,a,o,i,l,s={},c=ui.dispatch(\"start\",\"tick\",\"end\"),u=[1,1],f=.9,d=vs,h=ms,p=-30,g=ys,v=.1,m=.64,y=[],x=[];return s.tick=function(){if((a*=.99)<.005)return r=null,c.end({type:\"end\",alpha:a=0}),!0;var e,n,s,d,h,g,m,b,_,w=y.length,k=x.length;for(n=0;n<k;++n)s=x[n],d=s.source,h=s.target,b=h.x-d.x,_=h.y-d.y,(g=b*b+_*_)&&(g=a*i[n]*((g=Math.sqrt(g))-o[n])/g,b*=g,_*=g,h.x-=b*(m=d.weight+h.weight?d.weight/(d.weight+h.weight):.5),h.y-=_*m,d.x+=b*(m=1-m),d.y+=_*m);if((m=a*v)&&(b=u[0]/2,_=u[1]/2,n=-1,m))for(;++n<w;)s=y[n],s.x+=(b-s.x)*m,s.y+=(_-s.y)*m;if(p)for(oa(e=ui.geom.quadtree(y),a,l),n=-1;++n<w;)(s=y[n]).fixed||e.visit(t(s));for(n=-1;++n<w;)s=y[n],s.fixed?(s.x=s.px,s.y=s.py):(s.x-=(s.px-(s.px=s.x))*f,s.y-=(s.py-(s.py=s.y))*f);c.tick({type:\"tick\",alpha:a})},s.nodes=function(t){return arguments.length?(y=t,s):y},s.links=function(t){return arguments.length?(x=t,s):x},s.size=function(t){return arguments.length?(u=t,s):u},s.linkDistance=function(t){return arguments.length?(d=\"function\"==typeof t?t:+t,s):d},s.distance=s.linkDistance,s.linkStrength=function(t){return arguments.length?(h=\"function\"==typeof t?t:+t,s):h},s.friction=function(t){return arguments.length?(f=+t,s):f},s.charge=function(t){return arguments.length?(p=\"function\"==typeof t?t:+t,s):p},s.chargeDistance=function(t){return arguments.length?(g=t*t,s):Math.sqrt(g)},s.gravity=function(t){return arguments.length?(v=+t,s):v},s.theta=function(t){return arguments.length?(m=t*t,s):Math.sqrt(m)},s.alpha=function(t){return arguments.length?(t=+t,a?t>0?a=t:(r.c=null,r.t=0/0,r=null,c.end({type:\"end\",alpha:a=0})):t>0&&(c.start({type:\"start\",alpha:a=t}),r=Pt(s.tick)),s):a},s.start=function(){function t(t,n){if(!r){for(r=new Array(a),s=0;s<a;++s)r[s]=[];for(s=0;s<c;++s){var o=x[s];r[o.source.index].push(o.target),r[o.target.index].push(o.source)}}for(var i,l=r[e],s=-1,u=l.length;++s<u;)if(!isNaN(i=l[s][t]))return i;return Math.random()*n}var e,r,n,a=y.length,c=x.length,f=u[0],g=u[1];for(e=0;e<a;++e)(n=y[e]).index=e,n.weight=0;for(e=0;e<c;++e)n=x[e],\"number\"==typeof n.source&&(n.source=y[n.source]),\"number\"==typeof n.target&&(n.target=y[n.target]),++n.source.weight,++n.target.weight;for(e=0;e<a;++e)n=y[e],isNaN(n.x)&&(n.x=t(\"x\",f)),isNaN(n.y)&&(n.y=t(\"y\",g)),isNaN(n.px)&&(n.px=n.x),isNaN(n.py)&&(n.py=n.y);if(o=[],\"function\"==typeof d)for(e=0;e<c;++e)o[e]=+d.call(this,x[e],e);else for(e=0;e<c;++e)o[e]=d;if(i=[],\"function\"==typeof h)for(e=0;e<c;++e)i[e]=+h.call(this,x[e],e);else for(e=0;e<c;++e)i[e]=h;if(l=[],\"function\"==typeof p)for(e=0;e<a;++e)l[e]=+p.call(this,y[e],e);else for(e=0;e<a;++e)l[e]=p;return s.resume()},s.resume=function(){return s.alpha(.1)},s.stop=function(){return s.alpha(0)},s.drag=function(){if(n||(n=ui.behavior.drag().origin(b).on(\"dragstart.force\",ea).on(\"drag.force\",e).on(\"dragend.force\",ra)),!arguments.length)return n;this.on(\"mouseover.force\",na).on(\"mouseout.force\",aa).call(n)},ui.rebind(s,c,\"on\")};var vs=20,ms=1,ys=1/0;ui.layout.hierarchy=function(){function t(a){var o,i=[a],l=[];for(a.depth=0;null!=(o=i.pop());)if(l.push(o),(c=r.call(t,o,o.depth))&&(s=c.length)){for(var s,c,u;--s>=0;)i.push(u=c[s]),u.parent=o,u.depth=o.depth+1;n&&(o.value=0),o.children=c}else n&&(o.value=+n.call(t,o,o.depth)||0),delete o.children;return sa(a,function(t){var r,a;e&&(r=t.children)&&r.sort(e),n&&(a=t.parent)&&(a.value+=t.value)}),l}var e=fa,r=ca,n=ua;return t.sort=function(r){return arguments.length?(e=r,t):e},t.children=function(e){return arguments.length?(r=e,t):r},t.value=function(e){return arguments.length?(n=e,t):n},t.revalue=function(e){return n&&(la(e,function(t){t.children&&(t.value=0)}),sa(e,function(e){var r;e.children||(e.value=+n.call(t,e,e.depth)||0),(r=e.parent)&&(r.value+=e.value)})),e},t},ui.layout.partition=function(){function t(e,r,n,a){var o=e.children;if(e.x=r,e.y=e.depth*a,e.dx=n,e.dy=a,o&&(i=o.length)){var i,l,s,c=-1;for(n=e.value?n/e.value:0;++c<i;)t(l=o[c],r,s=l.value*n,a),r+=s}}function e(t){var r=t.children,n=0;if(r&&(a=r.length))for(var a,o=-1;++o<a;)n=Math.max(n,e(r[o]));return 1+n}function r(r,o){var i=n.call(this,r,o);return t(i[0],0,a[0],a[1]/e(i[0])),i}var n=ui.layout.hierarchy(),a=[1,1];return r.size=function(t){return arguments.length?(a=t,r):a},ia(r,n)},ui.layout.pie=function(){function t(i){var l,s=i.length,c=i.map(function(r,n){return+e.call(t,r,n)}),u=+(\"function\"==typeof n?n.apply(this,arguments):n),f=(\"function\"==typeof a?a.apply(this,arguments):a)-u,d=Math.min(Math.abs(f)/s,+(\"function\"==typeof o?o.apply(this,arguments):o)),h=d*(f<0?-1:1),p=ui.sum(c),g=p?(f-s*h)/p:0,v=ui.range(s),m=[];return null!=r&&v.sort(r===xs?function(t,e){return c[e]-c[t]}:function(t,e){return r(i[t],i[e])}),v.forEach(function(t){m[t]={data:i[t],value:l=c[t],startAngle:u,endAngle:u+=l*g+h,padAngle:d}}),m}var e=Number,r=xs,n=0,a=Bi,o=0;return t.value=function(r){return arguments.length?(e=r,t):e},t.sort=function(e){return arguments.length?(r=e,t):r},t.startAngle=function(e){return arguments.length?(n=e,t):n},t.endAngle=function(e){return arguments.length?(a=e,t):a},t.padAngle=function(e){return arguments.length?(o=e,t):o},t};var xs={};ui.layout.stack=function(){function t(l,s){if(!(d=l.length))return l;var c=l.map(function(r,n){return e.call(t,r,n)}),u=c.map(function(e){return e.map(function(e,r){return[o.call(t,e,r),i.call(t,e,r)]})}),f=r.call(t,u,s);c=ui.permute(c,f),u=ui.permute(u,f);var d,h,p,g,v=n.call(t,u,s),m=c[0].length;for(p=0;p<m;++p)for(a.call(t,c[0][p],g=v[p],u[0][p][1]),h=1;h<d;++h)a.call(t,c[h][p],g+=u[h-1][p][1],u[h][p][1]);return l}var e=b,r=va,n=ma,a=ga,o=ha,i=pa;return t.values=function(r){return arguments.length?(e=r,t):e},t.order=function(e){return arguments.length?(r=\"function\"==typeof e?e:bs.get(e)||va,t):r},t.offset=function(e){return arguments.length?(n=\"function\"==typeof e?e:_s.get(e)||ma,t):n},t.x=function(e){return arguments.length?(o=e,t):o},t.y=function(e){return arguments.length?(i=e,t):i},t.out=function(e){return arguments.length?(a=e,t):a},t};var bs=ui.map({\"inside-out\":function(t){var e,r,n=t.length,a=t.map(ya),o=t.map(xa),i=ui.range(n).sort(function(t,e){return a[t]-a[e]}),l=0,s=0,c=[],u=[];for(e=0;e<n;++e)r=i[e],l<s?(l+=o[r],c.push(r)):(s+=o[r],u.push(r));return u.reverse().concat(c)},reverse:function(t){return ui.range(t.length).reverse()},default:va}),_s=ui.map({silhouette:function(t){var e,r,n,a=t.length,o=t[0].length,i=[],l=0,s=[];for(r=0;r<o;++r){for(e=0,n=0;e<a;e++)n+=t[e][r][1];n>l&&(l=n),i.push(n)}for(r=0;r<o;++r)s[r]=(l-i[r])/2;return s},wiggle:function(t){var e,r,n,a,o,i,l,s,c,u=t.length,f=t[0],d=f.length,h=[];for(h[0]=s=c=0,r=1;r<d;++r){for(e=0,a=0;e<u;++e)a+=t[e][r][1];for(e=0,o=0,l=f[r][0]-f[r-1][0];e<u;++e){for(n=0,i=(t[e][r][1]-t[e][r-1][1])/(2*l);n<e;++n)i+=(t[n][r][1]-t[n][r-1][1])/l;o+=i*t[e][r][1]}h[r]=s-=a?o/a*l:0,s<c&&(c=s)}for(r=0;r<d;++r)h[r]-=c;return h},expand:function(t){var e,r,n,a=t.length,o=t[0].length,i=1/a,l=[];for(r=0;r<o;++r){for(e=0,n=0;e<a;e++)n+=t[e][r][1];if(n)for(e=0;e<a;e++)t[e][r][1]/=n;else for(e=0;e<a;e++)t[e][r][1]=i}for(r=0;r<o;++r)l[r]=0;return l},zero:ma});ui.layout.histogram=function(){function t(t,o){for(var i,l,s=[],c=t.map(r,this),u=n.call(this,c,o),f=a.call(this,u,c,o),o=-1,d=c.length,h=f.length-1,p=e?1:1/d;++o<h;)i=s[o]=[],i.dx=f[o+1]-(i.x=f[o]),i.y=0;if(h>0)for(o=-1;++o<d;)(l=c[o])>=u[0]&&l<=u[1]&&(i=s[ui.bisect(f,l,1,h)-1],i.y+=p,i.push(t[o]));return s}var e=!0,r=Number,n=ka,a=_a;return t.value=function(e){return arguments.length?(r=e,t):r},t.range=function(e){return arguments.length?(n=Ct(e),t):n},t.bins=function(e){return arguments.length?(a=\"number\"==typeof e?function(t){return wa(t,e)}:Ct(e),t):a},t.frequency=function(r){return arguments.length?(e=!!r,t):e},t},ui.layout.pack=function(){function t(t,o){var i=r.call(this,t,o),l=i[0],s=a[0],c=a[1],u=null==e?Math.sqrt:\"function\"==typeof e?e:function(){return e};if(l.x=l.y=0,sa(l,function(t){t.r=+u(t.value)}),sa(l,Ca),n){var f=n*(e?1:Math.max(2*l.r/s,2*l.r/c))/2;sa(l,function(t){t.r+=f}),sa(l,Ca),sa(l,function(t){t.r-=f})}return Oa(l,s/2,c/2,e?1:1/Math.max(2*l.r/s,2*l.r/c)),i}var e,r=ui.layout.hierarchy().sort(Ma),n=0,a=[1,1];return t.size=function(e){return arguments.length?(a=e,t):a},t.radius=function(r){return arguments.length?(e=null==r||\"function\"==typeof r?r:+r,t):e},t.padding=function(e){return arguments.length?(n=+e,t):n},ia(t,r)},ui.layout.tree=function(){function t(t,a){var u=i.call(this,t,a),f=u[0],d=e(f);if(sa(d,r),d.parent.m=-d.z,la(d,n),c)la(f,o);else{var h=f,p=f,g=f;la(f,function(t){t.x<h.x&&(h=t),t.x>p.x&&(p=t),t.depth>g.depth&&(g=t)});var v=l(h,p)/2-h.x,m=s[0]/(p.x+l(p,h)/2+v),y=s[1]/(g.depth||1);la(f,function(t){t.x=(t.x+v)*m,t.y=t.depth*y})}return u}function e(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var a,o=e.children,i=0,l=o.length;i<l;++i)n.push((o[i]=a={_:o[i],parent:e,children:(a=o[i].children)&&a.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:i}).a=a);return r.children[0]}function r(t){var e=t.children,r=t.parent.children,n=t.i?r[t.i-1]:null;if(e.length){Ra(t);var o=(e[0].z+e[e.length-1].z)/2;n?(t.z=n.z+l(t._,n._),t.m=t.z-o):t.z=o}else n&&(t.z=n.z+l(t._,n._));t.parent.A=a(t,n,t.parent.A||r[0])}function n(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function a(t,e,r){if(e){for(var n,a=t,o=t,i=e,s=a.parent.children[0],c=a.m,u=o.m,f=i.m,d=s.m;i=Na(i),a=Ea(a),i&&a;)s=Ea(s),o=Na(o),o.a=t,n=i.z+f-a.z-c+l(i._,a._),n>0&&(Ia(Fa(i,t,r),t,n),c+=n,u+=n),f+=i.m,c+=a.m,d+=s.m,u+=o.m;i&&!Na(o)&&(o.t=i,o.m+=f-u),a&&!Ea(s)&&(s.t=a,s.m+=c-d,r=t)}return r}function o(t){t.x*=s[0],t.y=t.depth*s[1]}var i=ui.layout.hierarchy().sort(null).value(null),l=Pa,s=[1,1],c=null;return t.separation=function(e){return arguments.length?(l=e,t):l},t.size=function(e){return arguments.length?(c=null==(s=e)?o:null,t):c?null:s},t.nodeSize=function(e){return arguments.length?(c=null==(s=e)?null:o,t):c?s:null},ia(t,i)},ui.layout.cluster=function(){function t(t,o){var i,l=e.call(this,t,o),s=l[0],c=0;sa(s,function(t){var e=t.children;e&&e.length?(t.x=Ba(e),t.y=ja(e)):(t.x=i?c+=r(t,i):0,t.y=0,i=t)});var u=qa(s),f=Ha(s),d=u.x-r(u,f)/2,h=f.x+r(f,u)/2;return sa(s,a?function(t){t.x=(t.x-s.x)*n[0],t.y=(s.y-t.y)*n[1]}:function(t){t.x=(t.x-d)/(h-d)*n[0],t.y=(1-(s.y?t.y/s.y:1))*n[1]}),l}var e=ui.layout.hierarchy().sort(null).value(null),r=Pa,n=[1,1],a=!1;return t.separation=function(e){return arguments.length?(r=e,t):r},t.size=function(e){return arguments.length?(a=null==(n=e),t):a?null:n},t.nodeSize=function(e){return arguments.length?(a=null!=(n=e),t):a?n:null},ia(t,e)},ui.layout.treemap=function(){function t(t,e){for(var r,n,a=-1,o=t.length;++a<o;)n=(r=t[a]).value*(e<0?0:e),r.area=isNaN(n)||n<=0?0:n}function e(r){var o=r.children;if(o&&o.length){var i,l,s,c=f(r),u=[],d=o.slice(),p=1/0,g=\"slice\"===h?c.dx:\"dice\"===h?c.dy:\"slice-dice\"===h?1&r.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(t(d,c.dx*c.dy/r.value),u.area=0;(s=d.length)>0;)u.push(i=d[s-1]),u.area+=i.area,\"squarify\"!==h||(l=n(u,g))<=p?(d.pop(),p=l):(u.area-=u.pop().area,a(u,g,c,!1),g=Math.min(c.dx,c.dy),u.length=u.area=0,p=1/0);u.length&&(a(u,g,c,!0),u.length=u.area=0),o.forEach(e)}}function r(e){var n=e.children;if(n&&n.length){var o,i=f(e),l=n.slice(),s=[];for(t(l,i.dx*i.dy/e.value),s.area=0;o=l.pop();)s.push(o),s.area+=o.area,null!=o.z&&(a(s,o.z?i.dx:i.dy,i,!l.length),s.length=s.area=0);n.forEach(r)}}function n(t,e){for(var r,n=t.area,a=0,o=1/0,i=-1,l=t.length;++i<l;)(r=t[i].area)&&(r<o&&(o=r),r>a&&(a=r));return n*=n,e*=e,n?Math.max(e*a*p/n,n/(e*o*p)):1/0}function a(t,e,r,n){var a,o=-1,i=t.length,l=r.x,c=r.y,u=e?s(t.area/e):0;if(e==r.dx){for((n||u>r.dy)&&(u=r.dy);++o<i;)a=t[o],a.x=l,a.y=c,a.dy=u,l+=a.dx=Math.min(r.x+r.dx-l,u?s(a.area/u):0);a.z=!0,a.dx+=r.x+r.dx-l,r.y+=u,r.dy-=u}else{for((n||u>r.dx)&&(u=r.dx);++o<i;)a=t[o],a.x=l,a.y=c,a.dx=u,c+=a.dy=Math.min(r.y+r.dy-c,u?s(a.area/u):0);a.z=!1,a.dy+=r.y+r.dy-c,r.x+=u,r.dx-=u}}function o(n){var a=i||l(n),o=a[0];return o.x=o.y=0,o.value?(o.dx=c[0],o.dy=c[1]):o.dx=o.dy=0,i&&l.revalue(o),t([o],o.dx*o.dy/o.value),(i?r:e)(o),d&&(i=a),a}var i,l=ui.layout.hierarchy(),s=Math.round,c=[1,1],u=null,f=Va,d=!1,h=\"squarify\",p=.5*(1+Math.sqrt(5));return o.size=function(t){return arguments.length?(c=t,o):c},o.padding=function(t){function e(e){var r=t.call(o,e,e.depth);return null==r?Va(e):Ua(e,\"number\"==typeof r?[r,r,r,r]:r)}function r(e){return Ua(e,t)}if(!arguments.length)return u;var n;return f=null==(u=t)?Va:\"function\"==(n=typeof t)?e:\"number\"===n?(t=[t,t,t,t],r):r,o},o.round=function(t){return arguments.length?(s=t?Math.round:Number,o):s!=Number},o.sticky=function(t){return arguments.length?(d=t,i=null,o):d},o.ratio=function(t){return arguments.length?(p=t,o):p},o.mode=function(t){return arguments.length?(h=t+\"\",o):h},ia(o,l)},ui.random={normal:function(t,e){var r=arguments.length;return r<2&&(e=1),r<1&&(t=0),function(){var r,n,a;do{r=2*Math.random()-1,n=2*Math.random()-1,a=r*r+n*n}while(!a||a>1);return t+e*r*Math.sqrt(-2*Math.log(a)/a)}},logNormal:function(){var t=ui.random.normal.apply(ui,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=ui.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;r<t;r++)e+=Math.random();return e}}},ui.scale={};var ws={floor:b,ceil:b};ui.scale.linear=function(){return Qa([0,1],[0,1],_n,!1)};var ks={s:1,g:1,p:1,r:1,e:1};ui.scale.log=function(){return oo(ui.scale.linear().domain([0,1]),10,!0,[1,10])};var Ms=ui.format(\".0e\"),As={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};ui.scale.pow=function(){return io(ui.scale.linear(),1,[0,1])},ui.scale.sqrt=function(){return ui.scale.pow().exponent(.5)},ui.scale.ordinal=function(){return so([],{t:\"range\",a:[[]]})},ui.scale.category10=function(){return ui.scale.ordinal().range(Ts)},ui.scale.category20=function(){return ui.scale.ordinal().range(Ls)},ui.scale.category20b=function(){return ui.scale.ordinal().range(Cs)},ui.scale.category20c=function(){return ui.scale.ordinal().range(Ss)};var Ts=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(_t),Ls=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(_t),Cs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(_t),Ss=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(_t);ui.scale.quantile=function(){return co([],[])},ui.scale.quantize=function(){return uo(0,1,[0,1])},ui.scale.threshold=function(){return fo([.5],[0,1])},ui.scale.identity=function(){return ho([0,1])},ui.svg={},ui.svg.arc=function(){function t(){var t=Math.max(0,+r.apply(this,arguments)),c=Math.max(0,+n.apply(this,arguments)),u=i.apply(this,arguments)-Hi,f=l.apply(this,arguments)-Hi,d=Math.abs(f-u),h=u>f?0:1;if(c<t&&(p=c,c=t,t=p),d>=qi)return e(c,h)+(t?e(t,1-h):\"\")+\"Z\";var p,g,v,m,y,x,b,_,w,k,M,A,T=0,L=0,C=[];if((m=(+s.apply(this,arguments)||0)/2)&&(v=o===zs?Math.sqrt(t*t+c*c):+o.apply(this,arguments),h||(L*=-1),c&&(L=nt(v/c*Math.sin(m))),t&&(T=nt(v/t*Math.sin(m)))),c){y=c*Math.cos(u+L),x=c*Math.sin(u+L),b=c*Math.cos(f-L),_=c*Math.sin(f-L);var S=Math.abs(f-u-2*L)<=ji?0:1;if(L&&bo(y,x,b,_)===h^S){var z=(u+f)/2;y=c*Math.cos(z),x=c*Math.sin(z),b=_=null}}else y=x=0;if(t){w=t*Math.cos(f-T),k=t*Math.sin(f-T),M=t*Math.cos(u+T),A=t*Math.sin(u+T);var O=Math.abs(u-f+2*T)<=ji?0:1;if(T&&bo(w,k,M,A)===1-h^O){var D=(u+f)/2;w=t*Math.cos(D),k=t*Math.sin(D),M=A=null}}else w=k=0;if(d>Ri&&(p=Math.min(Math.abs(c-t)/2,+a.apply(this,arguments)))>.001){g=t<c^h?0:1;var P=p,E=p;if(d<ji){var N=null==M?[w,k]:null==b?[y,x]:Nr([y,x],[M,A],[b,_],[w,k]),I=y-N[0],R=x-N[1],F=b-N[0],j=_-N[1],B=1/Math.sin(Math.acos((I*F+R*j)/(Math.sqrt(I*I+R*R)*Math.sqrt(F*F+j*j)))/2),q=Math.sqrt(N[0]*N[0]+N[1]*N[1]);E=Math.min(p,(t-q)/(B-1)),P=Math.min(p,(c-q)/(B+1))}if(null!=b){var H=_o(null==M?[w,k]:[M,A],[y,x],c,P,h),V=_o([b,_],[w,k],c,P,h);p===P?C.push(\"M\",H[0],\"A\",P,\",\",P,\" 0 0,\",g,\" \",H[1],\"A\",c,\",\",c,\" 0 \",1-h^bo(H[1][0],H[1][1],V[1][0],V[1][1]),\",\",h,\" \",V[1],\"A\",P,\",\",P,\" 0 0,\",g,\" \",V[0]):C.push(\"M\",H[0],\"A\",P,\",\",P,\" 0 1,\",g,\" \",V[0])}else C.push(\"M\",y,\",\",x);if(null!=M){var U=_o([y,x],[M,A],t,-E,h),X=_o([w,k],null==b?[y,x]:[b,_],t,-E,h);p===E?C.push(\"L\",X[0],\"A\",E,\",\",E,\" 0 0,\",g,\" \",X[1],\"A\",t,\",\",t,\" 0 \",h^bo(X[1][0],X[1][1],U[1][0],U[1][1]),\",\",1-h,\" \",U[1],\"A\",E,\",\",E,\" 0 0,\",g,\" \",U[0]):C.push(\"L\",X[0],\"A\",E,\",\",E,\" 0 0,\",g,\" \",U[0])}else C.push(\"L\",w,\",\",k)}else C.push(\"M\",y,\",\",x),null!=b&&C.push(\"A\",c,\",\",c,\" 0 \",S,\",\",h,\" \",b,\",\",_),C.push(\"L\",w,\",\",k),null!=M&&C.push(\"A\",t,\",\",t,\" 0 \",O,\",\",1-h,\" \",M,\",\",A);return C.push(\"Z\"),C.join(\"\")}function e(t,e){return\"M0,\"+t+\"A\"+t+\",\"+t+\" 0 1,\"+e+\" 0,\"+-t+\"A\"+t+\",\"+t+\" 0 1,\"+e+\" 0,\"+t}var r=go,n=vo,a=po,o=zs,i=mo,l=yo,s=xo;return t.innerRadius=function(e){return arguments.length?(r=Ct(e),t):r},t.outerRadius=function(e){return arguments.length?(n=Ct(e),t):n},t.cornerRadius=function(e){return arguments.length?(a=Ct(e),t):a},t.padRadius=function(e){return arguments.length?(o=e==zs?zs:Ct(e),t):o},t.startAngle=function(e){return arguments.length?(i=Ct(e),t):i},t.endAngle=function(e){return arguments.length?(l=Ct(e),t):l},t.padAngle=function(e){return arguments.length?(s=Ct(e),t):s},t.centroid=function(){var t=(+r.apply(this,arguments)+ +n.apply(this,arguments))/2,e=(+i.apply(this,arguments)+ +l.apply(this,arguments))/2-Hi;return[Math.cos(e)*t,Math.sin(e)*t]},t};var zs=\"auto\";ui.svg.line=function(){return wo(b)};var Os=ui.map({linear:ko,\"linear-closed\":Mo,step:Ao,\"step-before\":To,\"step-after\":Lo,basis:Po,\"basis-open\":Eo,\"basis-closed\":No,bundle:Io,cardinal:zo,\"cardinal-open\":Co,\"cardinal-closed\":So,monotone:Ho});Os.forEach(function(t,e){e.key=t,e.closed=/-closed$/.test(t)});var Ds=[0,2/3,1/3,0],Ps=[0,1/3,2/3,0],Es=[0,1/6,2/3,1/6];ui.svg.line.radial=function(){var t=wo(Vo);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},To.reverse=Lo,Lo.reverse=To,ui.svg.area=function(){return Uo(b)},ui.svg.area.radial=function(){var t=Uo(Vo);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},ui.svg.chord=function(){function t(t,l){var s=e(this,o,t,l),c=e(this,i,t,l);return\"M\"+s.p0+n(s.r,s.p1,s.a1-s.a0)+(r(s,c)?a(s.r,s.p1,s.r,s.p0):a(s.r,s.p1,c.r,c.p0)+n(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,s.r,s.p0))+\"Z\"}function e(t,e,r,n){var a=e.call(t,r,n),o=l.call(t,a,n),i=s.call(t,a,n)-Hi,u=c.call(t,a,n)-Hi;return{r:o,a0:i,a1:u,p0:[o*Math.cos(i),o*Math.sin(i)],p1:[o*Math.cos(u),o*Math.sin(u)]}}function r(t,e){return t.a0==e.a0&&t.a1==e.a1}function n(t,e,r){return\"A\"+t+\",\"+t+\" 0 \"+ +(r>ji)+\",1 \"+e}function a(t,e,r,n){return\"Q 0,0 \"+n}var o=br,i=_r,l=Xo,s=mo,c=yo;return t.radius=function(e){return arguments.length?(l=Ct(e),t):l},t.source=function(e){return arguments.length?(o=Ct(e),t):o},t.target=function(e){return arguments.length?(i=Ct(e),t):i},t.startAngle=function(e){return arguments.length?(s=Ct(e),t):s},t.endAngle=function(e){return arguments.length?(c=Ct(e),t):c},t},ui.svg.diagonal=function(){function t(t,a){var o=e.call(this,t,a),i=r.call(this,t,a),l=(o.y+i.y)/2,s=[o,{x:o.x,y:l},{x:i.x,y:l},i];return s=s.map(n),\"M\"+s[0]+\"C\"+s[1]+\" \"+s[2]+\" \"+s[3]}var e=br,r=_r,n=Go;return t.source=function(r){return arguments.length?(e=Ct(r),t):e},t.target=function(e){return arguments.length?(r=Ct(e),t):r},t.projection=function(e){return arguments.length?(n=e,t):n},t},ui.svg.diagonal.radial=function(){var t=ui.svg.diagonal(),e=Go,r=t.projection;return t.projection=function(t){return arguments.length?r(Yo(e=t)):e},t},ui.svg.symbol=function(){function t(t,n){return(Ns.get(e.call(this,t,n))||$o)(r.call(this,t,n))}var e=Wo,r=Zo;return t.type=function(r){return arguments.length?(e=Ct(r),t):e},t.size=function(e){return arguments.length?(r=Ct(e),t):r},t};var Ns=ui.map({circle:$o,cross:function(t){var e=Math.sqrt(t/5)/2;return\"M\"+-3*e+\",\"+-e+\"H\"+-e+\"V\"+-3*e+\"H\"+e+\"V\"+-e+\"H\"+3*e+\"V\"+e+\"H\"+e+\"V\"+3*e+\"H\"+-e+\"V\"+e+\"H\"+-3*e+\"Z\"},diamond:function(t){var e=Math.sqrt(t/(2*Rs)),r=e*Rs;return\"M0,\"+-e+\"L\"+r+\",0 0,\"+e+\" \"+-r+\",0Z\"},square:function(t){var e=Math.sqrt(t)/2;return\"M\"+-e+\",\"+-e+\"L\"+e+\",\"+-e+\" \"+e+\",\"+e+\" \"+-e+\",\"+e+\"Z\"},\"triangle-down\":function(t){var e=Math.sqrt(t/Is),r=e*Is/2;return\"M0,\"+r+\"L\"+e+\",\"+-r+\" \"+-e+\",\"+-r+\"Z\"},\"triangle-up\":function(t){var e=Math.sqrt(t/Is),r=e*Is/2;return\"M0,\"+-r+\"L\"+e+\",\"+r+\" \"+-e+\",\"+r+\"Z\"}});ui.svg.symbolTypes=Ns.keys();var Is=Math.sqrt(3),Rs=Math.tan(30*Vi);Si.transition=function(t){for(var e,r,n=Fs||++Hs,a=ei(t),o=[],i=js||{time:Date.now(),ease:Cn,delay:0,duration:250},l=-1,s=this.length;++l<s;){o.push(e=[]);for(var c=this[l],u=-1,f=c.length;++u<f;)(r=c[u])&&ri(r,u,a,n,i),e.push(r)}return Jo(o,a,n)},Si.interrupt=function(t){return this.each(null==t?Bs:Qo(ei(t)))};var Fs,js,Bs=Qo(ei()),qs=[],Hs=0;qs.call=Si.call,qs.empty=Si.empty,qs.node=Si.node,qs.size=Si.size,ui.transition=function(t,e){return t&&t.transition?Fs?t.transition(e):t:ui.selection().transition(t)},ui.transition.prototype=qs,qs.select=function(t){var e,r,n,a=this.id,o=this.namespace,i=[];t=z(t);for(var l=-1,s=this.length;++l<s;){i.push(e=[]);for(var c=this[l],u=-1,f=c.length;++u<f;)(n=c[u])&&(r=t.call(n,n.__data__,u,l))?(\"__data__\"in n&&(r.__data__=n.__data__),ri(r,u,o,a,n[o][a]),e.push(r)):e.push(null)}return Jo(i,o,a)},qs.selectAll=function(t){var e,r,n,a,o,i=this.id,l=this.namespace,s=[];t=O(t);for(var c=-1,u=this.length;++c<u;)for(var f=this[c],d=-1,h=f.length;++d<h;)if(n=f[d]){o=n[l][i],r=t.call(n,n.__data__,d,c),s.push(e=[]);for(var p=-1,g=r.length;++p<g;)(a=r[p])&&ri(a,p,l,i,o),e.push(a)}return Jo(s,l,i)},qs.filter=function(t){var e,r,n,a=[];\"function\"!=typeof t&&(t=V(t));for(var o=0,i=this.length;o<i;o++){a.push(e=[]);for(var r=this[o],l=0,s=r.length;l<s;l++)(n=r[l])&&t.call(n,n.__data__,l,o)&&e.push(n)}return Jo(a,this.namespace,this.id)},qs.tween=function(t,e){var r=this.id,n=this.namespace;return arguments.length<2?this.node()[n][r].tween.get(t):X(this,null==e?function(e){e[n][r].tween.remove(t)}:function(a){a[n][r].tween.set(t,e)})},qs.attr=function(t,e){function r(){this.removeAttribute(l)}function n(){this.removeAttributeNS(l.space,l.local)}function a(t){return null==t?r:(t+=\"\",function(){var e,r=this.getAttribute(l);return r!==t&&(e=i(r,t),function(t){this.setAttribute(l,e(t))})})}function o(t){return null==t?n:(t+=\"\",function(){var e,r=this.getAttributeNS(l.space,l.local);return r!==t&&(e=i(r,t),function(t){this.setAttributeNS(l.space,l.local,e(t))})})}if(arguments.length<2){for(e in t)this.attr(e,t[e]);return this}var i=\"transform\"==t?Wn:_n,l=ui.ns.qualify(t);return Ko(this,\"attr.\"+t,e,l.local?o:a)},qs.attrTween=function(t,e){function r(t,r){var n=e.call(this,t,r,this.getAttribute(a));return n&&function(t){this.setAttribute(a,n(t))}}function n(t,r){var n=e.call(this,t,r,this.getAttributeNS(a.space,a.local));return n&&function(t){this.setAttributeNS(a.space,a.local,n(t))}}var a=ui.ns.qualify(t);return this.tween(\"attr.\"+t,a.local?n:r)},qs.style=function(t,e,r){function a(){this.style.removeProperty(t)}function o(e){return null==e?a:(e+=\"\",function(){var a,o=n(this).getComputedStyle(this,null).getPropertyValue(t);return o!==e&&(a=_n(o,e),function(e){this.style.setProperty(t,a(e),r)})})}var i=arguments.length;if(i<3){if(\"string\"!=typeof t){i<2&&(e=\"\");for(r in t)this.style(r,t[r],e);return this}r=\"\"}return Ko(this,\"style.\"+t,e,o)},qs.styleTween=function(t,e,r){function a(a,o){var i=e.call(this,a,o,n(this).getComputedStyle(this,null).getPropertyValue(t));return i&&function(e){this.style.setProperty(t,i(e),r)}}return arguments.length<3&&(r=\"\"),this.tween(\"style.\"+t,a)},qs.text=function(t){return Ko(this,\"text\",t,ti)},qs.remove=function(){var t=this.namespace;return this.each(\"end.transition\",function(){var e;this[t].count<2&&(e=this.parentNode)&&e.removeChild(this)})},qs.ease=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].ease:(\"function\"!=typeof t&&(t=ui.ease.apply(ui,arguments)),X(this,function(n){n[r][e].ease=t}))},qs.delay=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].delay:X(this,\"function\"==typeof t?function(n,a,o){n[r][e].delay=+t.call(n,n.__data__,a,o)}:(t=+t,function(n){n[r][e].delay=t}))},qs.duration=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].duration:X(this,\"function\"==typeof t?function(n,a,o){n[r][e].duration=Math.max(1,t.call(n,n.__data__,a,o))}:(t=Math.max(1,t),function(n){n[r][e].duration=t}))},qs.each=function(t,e){var r=this.id,n=this.namespace;if(arguments.length<2){var a=js,o=Fs;try{Fs=r,X(this,function(e,a,o){js=e[n][r],t.call(e,e.__data__,a,o)})}finally{js=a,Fs=o}}else X(this,function(a){var o=a[n][r];(o.event||(o.event=ui.dispatch(\"start\",\"end\",\"interrupt\"))).on(t,e)});return this},qs.transition=function(){for(var t,e,r,n,a=this.id,o=++Hs,i=this.namespace,l=[],s=0,c=this.length;s<c;s++){l.push(t=[]);for(var e=this[s],u=0,f=e.length;u<f;u++)(r=e[u])&&(n=r[i][a],ri(r,u,i,o,{time:n.time,ease:n.ease,delay:n.delay+n.duration,duration:n.duration})),t.push(r)}return Jo(l,i,o)},ui.svg.axis=function(){function t(t){t.each(function(){var t,c=ui.select(this),u=this.__chart__||r,f=this.__chart__=r.copy(),d=null==s?f.ticks?f.ticks.apply(f,l):f.domain():s,h=null==e?f.tickFormat?f.tickFormat.apply(f,l):b:e,p=c.selectAll(\".tick\").data(d,f),g=p.enter().insert(\"g\",\".domain\").attr(\"class\",\"tick\").style(\"opacity\",Ri),v=ui.transition(p.exit()).style(\"opacity\",Ri).remove(),m=ui.transition(p.order()).style(\"opacity\",1),y=Math.max(a,0)+i,x=Ga(f),_=c.selectAll(\".domain\").data([0]),w=(_.enter().append(\"path\").attr(\"class\",\"domain\"),ui.transition(_));g.append(\"line\"),g.append(\"text\");var k,M,A,T,L=g.select(\"line\"),C=m.select(\"line\"),S=p.select(\"text\").text(h),z=g.select(\"text\"),O=m.select(\"text\"),D=\"top\"===n||\"left\"===n?-1:1;if(\"bottom\"===n||\"top\"===n?(t=ni,k=\"x\",A=\"y\",M=\"x2\",T=\"y2\",S.attr(\"dy\",D<0?\"0em\":\".71em\").style(\"text-anchor\",\"middle\"),w.attr(\"d\",\"M\"+x[0]+\",\"+D*o+\"V0H\"+x[1]+\"V\"+D*o)):(t=ai,k=\"y\",A=\"x\",M=\"y2\",T=\"x2\",S.attr(\"dy\",\".32em\").style(\"text-anchor\",D<0?\"end\":\"start\"),w.attr(\"d\",\"M\"+D*o+\",\"+x[0]+\"H0V\"+x[1]+\"H\"+D*o)),L.attr(T,D*a),z.attr(A,D*y),C.attr(M,0).attr(T,D*a),O.attr(k,0).attr(A,D*y),f.rangeBand){var P=f,E=P.rangeBand()/2;u=f=function(t){return P(t)+E}}else u.rangeBand?u=f:v.call(t,f,u);g.call(t,u,f),m.call(t,f,f)})}var e,r=ui.scale.linear(),n=Vs,a=6,o=6,i=3,l=[10],s=null;return t.scale=function(e){return arguments.length?(r=e,t):r},t.orient=function(e){return arguments.length?(n=e in Us?e+\"\":Vs,t):n},t.ticks=function(){return arguments.length?(l=di(arguments),t):l},t.tickValues=function(e){return arguments.length?(s=e,t):s},t.tickFormat=function(r){return arguments.length?(e=r,t):e},t.tickSize=function(e){var r=arguments.length;return r?(a=+e,o=+arguments[r-1],t):a},t.innerTickSize=function(e){return arguments.length?(a=+e,t):a},t.outerTickSize=function(e){return arguments.length?(o=+e,t):o},t.tickPadding=function(e){return arguments.length?(i=+e,t):i},t.tickSubdivide=function(){return arguments.length&&t},t};var Vs=\"bottom\",Us={top:1,right:1,bottom:1,left:1};ui.svg.brush=function(){function t(n){n.each(function(){var n=ui.select(this).style(\"pointer-events\",\"all\").style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\").on(\"mousedown.brush\",o).on(\"touchstart.brush\",o),i=n.selectAll(\".background\").data([0]);i.enter().append(\"rect\").attr(\"class\",\"background\").style(\"visibility\",\"hidden\").style(\"cursor\",\"crosshair\"),n.selectAll(\".extent\").data([0]).enter().append(\"rect\").attr(\"class\",\"extent\").style(\"cursor\",\"move\");var l=n.selectAll(\".resize\").data(g,b);l.exit().remove(),l.enter().append(\"g\").attr(\"class\",function(t){return\"resize \"+t}).style(\"cursor\",function(t){return Xs[t]}).append(\"rect\").attr(\"x\",function(t){return/[ew]$/.test(t)?-3:null}).attr(\"y\",function(t){return/^[ns]/.test(t)?-3:null}).attr(\"width\",6).attr(\"height\",6).style(\"visibility\",\"hidden\"),l.style(\"display\",t.empty()?\"none\":null);var s,f=ui.transition(n),d=ui.transition(i);c&&(s=Ga(c),d.attr(\"x\",s[0]).attr(\"width\",s[1]-s[0]),r(f)),u&&(s=Ga(u),d.attr(\"y\",s[0]).attr(\"height\",s[1]-s[0]),a(f)),e(f)})}function e(t){t.selectAll(\".resize\").attr(\"transform\",function(t){return\"translate(\"+f[+/e$/.test(t)]+\",\"+d[+/^s/.test(t)]+\")\"})}function r(t){t.select(\".extent\").attr(\"x\",f[0]),t.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\",f[1]-f[0])}function a(t){t.select(\".extent\").attr(\"y\",d[0]),t.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",d[1]-d[0])}function o(){function o(){32==ui.event.keyCode&&(S||(x=null,O[0]-=f[1],O[1]-=d[1],S=2),T())}function g(){32==ui.event.keyCode&&2==S&&(O[0]+=f[1],O[1]+=d[1],S=0,T())}function v(){var t=ui.mouse(_),n=!1;b&&(t[0]+=b[0],t[1]+=b[1]),S||(ui.event.altKey?(x||(x=[(f[0]+f[1])/2,(d[0]+d[1])/2]),O[0]=f[+(t[0]<x[0])],O[1]=d[+(t[1]<x[1])]):x=null),L&&m(t,c,0)&&(r(M),n=!0),C&&m(t,u,1)&&(a(M),n=!0),n&&(e(M),k({type:\"brush\",mode:S?\"move\":\"resize\"}))}function m(t,e,r){var n,a,o=Ga(e),s=o[0],c=o[1],u=O[r],g=r?d:f,v=g[1]-g[0];if(S&&(s-=u,c-=v+u),n=(r?p:h)?Math.max(s,Math.min(c,t[r])):t[r],S?a=(n+=u)+v:(x&&(u=Math.max(s,Math.min(c,2*x[r]-n))),u<n?(a=n,n=u):a=u),g[0]!=n||g[1]!=a)return r?l=null:i=null,g[0]=n,g[1]=a,!0}function y(){v(),M.style(\"pointer-events\",\"all\").selectAll(\".resize\").style(\"display\",t.empty()?\"none\":null),ui.select(\"body\").style(\"cursor\",null),D.on(\"mousemove.brush\",null).on(\"mouseup.brush\",null).on(\"touchmove.brush\",null).on(\"touchend.brush\",null).on(\"keydown.brush\",null).on(\"keyup.brush\",null),z(),k({type:\"brushend\"})}var x,b,_=this,w=ui.select(ui.event.target),k=s.of(_,arguments),M=ui.select(_),A=w.datum(),L=!/^(n|s)$/.test(A)&&c,C=!/^(e|w)$/.test(A)&&u,S=w.classed(\"extent\"),z=Q(_),O=ui.mouse(_),D=ui.select(n(_)).on(\"keydown.brush\",o).on(\"keyup.brush\",g);if(ui.event.changedTouches?D.on(\"touchmove.brush\",v).on(\"touchend.brush\",y):D.on(\"mousemove.brush\",v).on(\"mouseup.brush\",y),M.interrupt().selectAll(\"*\").interrupt(),S)O[0]=f[0]-O[0],O[1]=d[0]-O[1];else if(A){var P=+/w$/.test(A),E=+/^n/.test(A);b=[f[1-P]-O[0],d[1-E]-O[1]],O[0]=f[P],O[1]=d[E]}else ui.event.altKey&&(x=O.slice());M.style(\"pointer-events\",\"none\").selectAll(\".resize\").style(\"display\",null),ui.select(\"body\").style(\"cursor\",w.style(\"cursor\")),k({type:\"brushstart\"}),v()}var i,l,s=C(t,\"brushstart\",\"brush\",\"brushend\"),c=null,u=null,f=[0,0],d=[0,0],h=!0,p=!0,g=Gs[0];return t.event=function(t){t.each(function(){var t=s.of(this,arguments),e={x:f,y:d,i:i,j:l},r=this.__chart__||e;this.__chart__=e,Fs?ui.select(this).transition().each(\"start.brush\",function(){i=r.i,l=r.j,f=r.x,d=r.y,t({\n",
|
|
"type:\"brushstart\"})}).tween(\"brush:brush\",function(){var r=wn(f,e.x),n=wn(d,e.y);return i=l=null,function(a){f=e.x=r(a),d=e.y=n(a),t({type:\"brush\",mode:\"resize\"})}}).each(\"end.brush\",function(){i=e.i,l=e.j,t({type:\"brush\",mode:\"resize\"}),t({type:\"brushend\"})}):(t({type:\"brushstart\"}),t({type:\"brush\",mode:\"resize\"}),t({type:\"brushend\"}))})},t.x=function(e){return arguments.length?(c=e,g=Gs[!c<<1|!u],t):c},t.y=function(e){return arguments.length?(u=e,g=Gs[!c<<1|!u],t):u},t.clamp=function(e){return arguments.length?(c&&u?(h=!!e[0],p=!!e[1]):c?h=!!e:u&&(p=!!e),t):c&&u?[h,p]:c?h:u?p:null},t.extent=function(e){var r,n,a,o,s;return arguments.length?(c&&(r=e[0],n=e[1],u&&(r=r[0],n=n[0]),i=[r,n],c.invert&&(r=c(r),n=c(n)),n<r&&(s=r,r=n,n=s),r==f[0]&&n==f[1]||(f=[r,n])),u&&(a=e[0],o=e[1],c&&(a=a[1],o=o[1]),l=[a,o],u.invert&&(a=u(a),o=u(o)),o<a&&(s=a,a=o,o=s),a==d[0]&&o==d[1]||(d=[a,o])),t):(c&&(i?(r=i[0],n=i[1]):(r=f[0],n=f[1],c.invert&&(r=c.invert(r),n=c.invert(n)),n<r&&(s=r,r=n,n=s))),u&&(l?(a=l[0],o=l[1]):(a=d[0],o=d[1],u.invert&&(a=u.invert(a),o=u.invert(o)),o<a&&(s=a,a=o,o=s))),c&&u?[[r,a],[n,o]]:c?[r,n]:u&&[a,o])},t.clear=function(){return t.empty()||(f=[0,0],d=[0,0],i=l=null),t},t.empty=function(){return!!c&&f[0]==f[1]||!!u&&d[0]==d[1]},ui.rebind(t,s,\"on\")};var Xs={n:\"ns-resize\",e:\"ew-resize\",s:\"ns-resize\",w:\"ew-resize\",nw:\"nwse-resize\",ne:\"nesw-resize\",se:\"nwse-resize\",sw:\"nesw-resize\"},Gs=[[\"n\",\"e\",\"s\",\"w\",\"nw\",\"ne\",\"se\",\"sw\"],[\"e\",\"w\"],[\"n\",\"s\"],[]],Ys=dl.format=yl.timeFormat,Zs=Ys.utc,Ws=Zs(\"%Y-%m-%dT%H:%M:%S.%LZ\");Ys.iso=Date.prototype.toISOString&&+new Date(\"2000-01-01T00:00:00.000Z\")?oi:Ws,oi.parse=function(t){var e=new Date(t);return isNaN(e)?null:e},oi.toString=Ws.toString,dl.second=Ht(function(t){return new hl(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(t.getTime()+1e3*Math.floor(e))},function(t){return t.getSeconds()}),dl.seconds=dl.second.range,dl.seconds.utc=dl.second.utc.range,dl.minute=Ht(function(t){return new hl(6e4*Math.floor(t/6e4))},function(t,e){t.setTime(t.getTime()+6e4*Math.floor(e))},function(t){return t.getMinutes()}),dl.minutes=dl.minute.range,dl.minutes.utc=dl.minute.utc.range,dl.hour=Ht(function(t){var e=t.getTimezoneOffset()/60;return new hl(36e5*(Math.floor(t/36e5-e)+e))},function(t,e){t.setTime(t.getTime()+36e5*Math.floor(e))},function(t){return t.getHours()}),dl.hours=dl.hour.range,dl.hours.utc=dl.hour.utc.range,dl.month=Ht(function(t){return t=dl.day(t),t.setDate(1),t},function(t,e){t.setMonth(t.getMonth()+e)},function(t){return t.getMonth()}),dl.months=dl.month.range,dl.months.utc=dl.month.utc.range;var $s=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qs=[[dl.second,1],[dl.second,5],[dl.second,15],[dl.second,30],[dl.minute,1],[dl.minute,5],[dl.minute,15],[dl.minute,30],[dl.hour,1],[dl.hour,3],[dl.hour,6],[dl.hour,12],[dl.day,1],[dl.day,2],[dl.week,1],[dl.month,1],[dl.month,3],[dl.year,1]],Js=Ys.multi([[\".%L\",function(t){return t.getMilliseconds()}],[\":%S\",function(t){return t.getSeconds()}],[\"%I:%M\",function(t){return t.getMinutes()}],[\"%I %p\",function(t){return t.getHours()}],[\"%a %d\",function(t){return t.getDay()&&1!=t.getDate()}],[\"%b %d\",function(t){return 1!=t.getDate()}],[\"%B\",function(t){return t.getMonth()}],[\"%Y\",Oe]]),Ks={range:function(t,e,r){return ui.range(Math.ceil(t/r)*r,+e,r).map(li)},floor:b,ceil:b};Qs.year=dl.year,dl.scale=function(){return ii(ui.scale.linear(),Qs,Js)};var tc=Qs.map(function(t){return[t[0].utc,t[1]]}),ec=Zs.multi([[\".%L\",function(t){return t.getUTCMilliseconds()}],[\":%S\",function(t){return t.getUTCSeconds()}],[\"%I:%M\",function(t){return t.getUTCMinutes()}],[\"%I %p\",function(t){return t.getUTCHours()}],[\"%a %d\",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[\"%b %d\",function(t){return 1!=t.getUTCDate()}],[\"%B\",function(t){return t.getUTCMonth()}],[\"%Y\",Oe]]);tc.year=dl.year.utc,dl.scale.utc=function(){return ii(ui.scale.linear(),tc,ec)},ui.text=St(function(t){return t.responseText}),ui.json=function(t,e){return zt(t,\"application/json\",si,e)},ui.html=function(t,e){return zt(t,\"text/html\",ci,e)},ui.xml=St(function(t){return t.responseXML}),\"function\"==typeof t&&t.amd?(this.d3=ui,t(ui)):\"object\"==typeof r&&r.exports?r.exports=ui:this.d3=ui}()},{}],8:[function(e,r,n){(function(a,o){!function(e,a){\"object\"==typeof n&&void 0!==r?r.exports=a():\"function\"==typeof t&&t.amd?t(a):e.ES6Promise=a()}(this,function(){\"use strict\";function t(t){return\"function\"==typeof t||\"object\"==typeof t&&null!==t}function r(t){return\"function\"==typeof t}function n(t){X=t}function i(t){G=t}function l(){return function(){U(c)}}function s(){var t=setTimeout;return function(){return t(c,1)}}function c(){for(var t=0;t<V;t+=2){(0,J[t])(J[t+1]),J[t]=void 0,J[t+1]=void 0}V=0}function u(t,e){var r=arguments,n=this,a=new this.constructor(d);void 0===a[tt]&&O(a);var o=n._state;return o?function(){var t=r[o-1];G(function(){return C(o,a,t,n._result)})}():M(n,a,t,e),a}function f(t){var e=this;if(t&&\"object\"==typeof t&&t.constructor===e)return t;var r=new e(d);return b(r,t),r}function d(){}function h(){return new TypeError(\"You cannot resolve a promise with itself\")}function p(){return new TypeError(\"A promises callback cannot return that same promise.\")}function g(t){try{return t.then}catch(t){return at.error=t,at}}function v(t,e,r,n){try{t.call(e,r,n)}catch(t){return t}}function m(t,e,r){G(function(t){var n=!1,a=v(r,e,function(r){n||(n=!0,e!==r?b(t,r):w(t,r))},function(e){n||(n=!0,k(t,e))},\"Settle: \"+(t._label||\" unknown promise\"));!n&&a&&(n=!0,k(t,a))},t)}function y(t,e){e._state===rt?w(t,e._result):e._state===nt?k(t,e._result):M(e,void 0,function(e){return b(t,e)},function(e){return k(t,e)})}function x(t,e,n){e.constructor===t.constructor&&n===u&&e.constructor.resolve===f?y(t,e):n===at?k(t,at.error):void 0===n?w(t,e):r(n)?m(t,e,n):w(t,e)}function b(e,r){e===r?k(e,h()):t(r)?x(e,r,g(r)):w(e,r)}function _(t){t._onerror&&t._onerror(t._result),A(t)}function w(t,e){t._state===et&&(t._result=e,t._state=rt,0!==t._subscribers.length&&G(A,t))}function k(t,e){t._state===et&&(t._state=nt,t._result=e,G(_,t))}function M(t,e,r,n){var a=t._subscribers,o=a.length;t._onerror=null,a[o]=e,a[o+rt]=r,a[o+nt]=n,0===o&&t._state&&G(A,t)}function A(t){var e=t._subscribers,r=t._state;if(0!==e.length){for(var n=void 0,a=void 0,o=t._result,i=0;i<e.length;i+=3)n=e[i],a=e[i+r],n?C(r,n,a,o):a(o);t._subscribers.length=0}}function T(){this.error=null}function L(t,e){try{return t(e)}catch(t){return ot.error=t,ot}}function C(t,e,n,a){var o=r(n),i=void 0,l=void 0,s=void 0,c=void 0;if(o){if(i=L(n,a),i===ot?(c=!0,l=i.error,i=null):s=!0,e===i)return void k(e,p())}else i=a,s=!0;e._state!==et||(o&&s?b(e,i):c?k(e,l):t===rt?w(e,i):t===nt&&k(e,i))}function S(t,e){try{e(function(e){b(t,e)},function(e){k(t,e)})}catch(e){k(t,e)}}function z(){return it++}function O(t){t[tt]=it++,t._state=void 0,t._result=void 0,t._subscribers=[]}function D(t,e){this._instanceConstructor=t,this.promise=new t(d),this.promise[tt]||O(this.promise),H(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?w(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&w(this.promise,this._result))):k(this.promise,P())}function P(){return new Error(\"Array Methods must be provided an Array\")}function E(t){return new D(this,t).promise}function N(t){var e=this;return new e(H(t)?function(r,n){for(var a=t.length,o=0;o<a;o++)e.resolve(t[o]).then(r,n)}:function(t,e){return e(new TypeError(\"You must pass an array to race.\"))})}function I(t){var e=this,r=new e(d);return k(r,t),r}function R(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}function F(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}function j(t){this[tt]=z(),this._result=this._state=void 0,this._subscribers=[],d!==t&&(\"function\"!=typeof t&&R(),this instanceof j?S(this,t):F())}function B(){var t=void 0;if(void 0!==o)t=o;else if(\"undefined\"!=typeof self)t=self;else try{t=Function(\"return this\")()}catch(t){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var e=t.Promise;if(e){var r=null;try{r=Object.prototype.toString.call(e.resolve())}catch(t){}if(\"[object Promise]\"===r&&!e.cast)return}t.Promise=j}var q=void 0;q=Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)};var H=q,V=0,U=void 0,X=void 0,G=function(t,e){J[V]=t,J[V+1]=e,2===(V+=2)&&(X?X(c):K())},Y=\"undefined\"!=typeof window?window:void 0,Z=Y||{},W=Z.MutationObserver||Z.WebKitMutationObserver,$=\"undefined\"==typeof self&&void 0!==a&&\"[object process]\"==={}.toString.call(a),Q=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel,J=new Array(1e3),K=void 0;K=$?function(){return function(){return a.nextTick(c)}}():W?function(){var t=0,e=new W(c),r=document.createTextNode(\"\");return e.observe(r,{characterData:!0}),function(){r.data=t=++t%2}}():Q?function(){var t=new MessageChannel;return t.port1.onmessage=c,function(){return t.port2.postMessage(0)}}():void 0===Y&&\"function\"==typeof e?function(){try{var t=e,r=t(\"vertx\");return U=r.runOnLoop||r.runOnContext,l()}catch(t){return s()}}():s();var tt=Math.random().toString(36).substring(16),et=void 0,rt=1,nt=2,at=new T,ot=new T,it=0;return D.prototype._enumerate=function(){for(var t=this.length,e=this._input,r=0;this._state===et&&r<t;r++)this._eachEntry(e[r],r)},D.prototype._eachEntry=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===f){var a=g(t);if(a===u&&t._state!==et)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(r===j){var o=new r(d);x(o,t,a),this._willSettleAt(o,e)}else this._willSettleAt(new r(function(e){return e(t)}),e)}else this._willSettleAt(n(t),e)},D.prototype._settledAt=function(t,e,r){var n=this.promise;n._state===et&&(this._remaining--,t===nt?k(n,r):this._result[e]=r),0===this._remaining&&w(n,this._result)},D.prototype._willSettleAt=function(t,e){var r=this;M(t,void 0,function(t){return r._settledAt(rt,e,t)},function(t){return r._settledAt(nt,e,t)})},j.all=E,j.race=N,j.resolve=f,j.reject=I,j._setScheduler=n,j._setAsap=i,j._asap=G,j.prototype={constructor:j,then:u,catch:function(t){return this.then(null,t)}},B(),j.polyfill=B,j.Promise=j,j})}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{_process:12}],9:[function(t,e,r){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function a(t){return\"function\"==typeof t}function o(t){return\"number\"==typeof t}function i(t){return\"object\"==typeof t&&null!==t}function l(t){return void 0===t}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(t){if(!o(t)||t<0||isNaN(t))throw TypeError(\"n must be a positive number\");return this._maxListeners=t,this},n.prototype.emit=function(t){var e,r,n,o,s,c;if(this._events||(this._events={}),\"error\"===t&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var u=new Error('Uncaught, unspecified \"error\" event. ('+e+\")\");throw u.context=e,u}if(r=this._events[t],l(r))return!1;if(a(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),r.apply(this,o)}else if(i(r))for(o=Array.prototype.slice.call(arguments,1),c=r.slice(),n=c.length,s=0;s<n;s++)c[s].apply(this,o);return!0},n.prototype.addListener=function(t,e){var r;if(!a(e))throw TypeError(\"listener must be a function\");return this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",t,a(e.listener)?e.listener:e),this._events[t]?i(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,i(this._events[t])&&!this._events[t].warned&&(r=l(this._maxListeners)?n.defaultMaxListeners:this._maxListeners)&&r>0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[t].length),\"function\"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){function r(){this.removeListener(t,r),n||(n=!0,e.apply(this,arguments))}if(!a(e))throw TypeError(\"listener must be a function\");var n=!1;return r.listener=e,this.on(t,r),this},n.prototype.removeListener=function(t,e){var r,n,o,l;if(!a(e))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[t])return this;if(r=this._events[t],o=r.length,n=-1,r===e||a(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit(\"removeListener\",t,e);else if(i(r)){for(l=o;l-- >0;)if(r[l]===e||r[l].listener&&r[l].listener===e){n=l;break}if(n<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(n,1),this._events.removeListener&&this.emit(\"removeListener\",t,e)}return this},n.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)\"removeListener\"!==e&&this.removeAllListeners(e);return this.removeAllListeners(\"removeListener\"),this._events={},this}if(r=this._events[t],a(r))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},n.prototype.listeners=function(t){return this._events&&this._events[t]?a(this._events[t])?[this._events[t]]:this._events[t].slice():[]},n.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(a(e))return 1;if(e)return e.length}return 0},n.listenerCount=function(t,e){return t.listenerCount(e)}},{}],10:[function(t,e,r){\"use strict\";function n(t){for(var e,r=t.length,n=0;n<r;n++)if(((e=t.charCodeAt(n))<9||e>13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}e.exports=function(t){var e=typeof t;if(\"string\"===e){var r=t;if(0===(t=+t)&&n(r))return!1}else if(\"number\"!==e)return!1;return t-t<1}},{}],11:[function(t,e,r){function n(t,e){var r=e[0],n=e[1],a=e[2],o=e[3],i=r+r,l=n+n,s=a+a,c=r*i,u=n*i,f=n*l,d=a*i,h=a*l,p=a*s,g=o*i,v=o*l,m=o*s;return t[0]=1-f-p,t[1]=u+m,t[2]=d-v,t[3]=0,t[4]=u-m,t[5]=1-c-p,t[6]=h+g,t[7]=0,t[8]=d+v,t[9]=h-g,t[10]=1-c-f,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}e.exports=n},{}],12:[function(t,e,r){function n(){throw new Error(\"setTimeout has not been defined\")}function a(){throw new Error(\"clearTimeout has not been defined\")}function o(t){if(f===setTimeout)return setTimeout(t,0);if((f===n||!f)&&setTimeout)return f=setTimeout,setTimeout(t,0);try{return f(t,0)}catch(e){try{return f.call(null,t,0)}catch(e){return f.call(this,t,0)}}}function i(t){if(d===clearTimeout)return clearTimeout(t);if((d===a||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(t);try{return d(t)}catch(e){try{return d.call(null,t)}catch(e){return d.call(this,t)}}}function l(){v&&p&&(v=!1,p.length?g=p.concat(g):m=-1,g.length&&s())}function s(){if(!v){var t=o(l);v=!0;for(var e=g.length;e;){for(p=g,g=[];++m<e;)p&&p[m].run();m=-1,e=g.length}p=null,v=!1,i(t)}}function c(t,e){this.fun=t,this.array=e}function u(){}var f,d,h=e.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:n}catch(t){f=n}try{d=\"function\"==typeof clearTimeout?clearTimeout:a}catch(t){d=a}}();var p,g=[],v=!1,m=-1;h.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];g.push(new c(t,e)),1!==g.length||v||o(s)},c.prototype.run=function(){this.fun.apply(null,this.array)},h.title=\"browser\",h.browser=!0,h.env={},h.argv=[],h.version=\"\",h.versions={},h.on=u,h.addListener=u,h.once=u,h.off=u,h.removeListener=u,h.removeAllListeners=u,h.emit=u,h.binding=function(t){throw new Error(\"process.binding is not supported\")},h.cwd=function(){return\"/\"},h.chdir=function(t){throw new Error(\"process.chdir is not supported\")},h.umask=function(){return 0}},{}],13:[function(e,r,n){!function(e){function n(t,e){if(t=t||\"\",e=e||{},t instanceof n)return t;if(!(this instanceof n))return new n(t,e);var r=a(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=H(100*this._a)/100,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=H(this._r)),this._g<1&&(this._g=H(this._g)),this._b<1&&(this._b=H(this._b)),this._ok=r.ok,this._tc_id=q++}function a(t){var e={r:0,g:0,b:0},r=1,n=null,a=null,i=null,s=!1,u=!1;return\"string\"==typeof t&&(t=R(t)),\"object\"==typeof t&&(I(t.r)&&I(t.g)&&I(t.b)?(e=o(t.r,t.g,t.b),s=!0,u=\"%\"===String(t.r).substr(-1)?\"prgb\":\"rgb\"):I(t.h)&&I(t.s)&&I(t.v)?(n=P(t.s),a=P(t.v),e=c(t.h,n,a),s=!0,u=\"hsv\"):I(t.h)&&I(t.s)&&I(t.l)&&(n=P(t.s),i=P(t.l),e=l(t.h,n,i),s=!0,u=\"hsl\"),t.hasOwnProperty(\"a\")&&(r=t.a)),r=T(r),{ok:s,format:t.format||u,r:V(255,U(e.r,0)),g:V(255,U(e.g,0)),b:V(255,U(e.b,0)),a:r}}function o(t,e,r){return{r:255*L(t,255),g:255*L(e,255),b:255*L(r,255)}}function i(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,a,o=U(t,e,r),i=V(t,e,r),l=(o+i)/2;if(o==i)n=a=0;else{var s=o-i;switch(a=l>.5?s/(2-o-i):s/(o+i),o){case t:n=(e-r)/s+(e<r?6:0);break;case e:n=(r-t)/s+2;break;case r:n=(t-e)/s+4}n/=6}return{h:n,s:a,l:l}}function l(t,e,r){function n(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}var a,o,i;if(t=L(t,360),e=L(e,100),r=L(r,100),0===e)a=o=i=r;else{var l=r<.5?r*(1+e):r+e-r*e,s=2*r-l;a=n(s,l,t+1/3),o=n(s,l,t),i=n(s,l,t-1/3)}return{r:255*a,g:255*o,b:255*i}}function s(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,a,o=U(t,e,r),i=V(t,e,r),l=o,s=o-i;if(a=0===o?0:s/o,o==i)n=0;else{switch(o){case t:n=(e-r)/s+(e<r?6:0);break;case e:n=(r-t)/s+2;break;case r:n=(t-e)/s+4}n/=6}return{h:n,s:a,v:l}}function c(t,r,n){t=6*L(t,360),r=L(r,100),n=L(n,100);var a=e.floor(t),o=t-a,i=n*(1-r),l=n*(1-o*r),s=n*(1-(1-o)*r),c=a%6;return{r:255*[n,l,i,i,s,n][c],g:255*[s,n,n,l,i,i][c],b:255*[i,i,s,n,n,l][c]}}function u(t,e,r,n){var a=[D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16))];return n&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0):a.join(\"\")}function f(t,e,r,n,a){var o=[D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16)),D(E(n))];return a&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1)?o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0):o.join(\"\")}function d(t,e,r,n){return[D(E(n)),D(H(t).toString(16)),D(H(e).toString(16)),D(H(r).toString(16))].join(\"\")}function h(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.s-=e/100,r.s=C(r.s),n(r)}function p(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.s+=e/100,r.s=C(r.s),n(r)}function g(t){return n(t).desaturate(100)}function v(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.l+=e/100,r.l=C(r.l),n(r)}function m(t,e){e=0===e?0:e||10;var r=n(t).toRgb();return r.r=U(0,V(255,r.r-H(-e/100*255))),r.g=U(0,V(255,r.g-H(-e/100*255))),r.b=U(0,V(255,r.b-H(-e/100*255))),n(r)}function y(t,e){e=0===e?0:e||10;var r=n(t).toHsl();return r.l-=e/100,r.l=C(r.l),n(r)}function x(t,e){var r=n(t).toHsl(),a=(r.h+e)%360;return r.h=a<0?360+a:a,n(r)}function b(t){var e=n(t).toHsl();return e.h=(e.h+180)%360,n(e)}function _(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+120)%360,s:e.s,l:e.l}),n({h:(r+240)%360,s:e.s,l:e.l})]}function w(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+90)%360,s:e.s,l:e.l}),n({h:(r+180)%360,s:e.s,l:e.l}),n({h:(r+270)%360,s:e.s,l:e.l})]}function k(t){var e=n(t).toHsl(),r=e.h;return[n(t),n({h:(r+72)%360,s:e.s,l:e.l}),n({h:(r+216)%360,s:e.s,l:e.l})]}function M(t,e,r){e=e||6,r=r||30;var a=n(t).toHsl(),o=360/r,i=[n(t)];for(a.h=(a.h-(o*e>>1)+720)%360;--e;)a.h=(a.h+o)%360,i.push(n(a));return i}function A(t,e){e=e||6;for(var r=n(t).toHsv(),a=r.h,o=r.s,i=r.v,l=[],s=1/e;e--;)l.push(n({h:a,s:o,v:i})),i=(i+s)%1;return l}function T(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function L(t,r){z(t)&&(t=\"100%\");var n=O(t);return t=V(r,U(0,parseFloat(t))),n&&(t=parseInt(t*r,10)/100),e.abs(t-r)<1e-6?1:t%r/parseFloat(r)}function C(t){return V(1,U(0,t))}function S(t){return parseInt(t,16)}function z(t){return\"string\"==typeof t&&t.indexOf(\".\")!=-1&&1===parseFloat(t)}function O(t){return\"string\"==typeof t&&t.indexOf(\"%\")!=-1}function D(t){return 1==t.length?\"0\"+t:\"\"+t}function P(t){return t<=1&&(t=100*t+\"%\"),t}function E(t){return e.round(255*parseFloat(t)).toString(16)}function N(t){return S(t)/255}function I(t){return!!Z.CSS_UNIT.exec(t)}function R(t){t=t.replace(j,\"\").replace(B,\"\").toLowerCase();var e=!1;if(G[t])t=G[t],e=!0;else if(\"transparent\"==t)return{r:0,g:0,b:0,a:0,format:\"name\"};var r;return(r=Z.rgb.exec(t))?{r:r[1],g:r[2],b:r[3]}:(r=Z.rgba.exec(t))?{r:r[1],g:r[2],b:r[3],a:r[4]}:(r=Z.hsl.exec(t))?{h:r[1],s:r[2],l:r[3]}:(r=Z.hsla.exec(t))?{h:r[1],s:r[2],l:r[3],a:r[4]}:(r=Z.hsv.exec(t))?{h:r[1],s:r[2],v:r[3]}:(r=Z.hsva.exec(t))?{h:r[1],s:r[2],v:r[3],a:r[4]}:(r=Z.hex8.exec(t))?{r:S(r[1]),g:S(r[2]),b:S(r[3]),a:N(r[4]),format:e?\"name\":\"hex8\"}:(r=Z.hex6.exec(t))?{r:S(r[1]),g:S(r[2]),b:S(r[3]),format:e?\"name\":\"hex\"}:(r=Z.hex4.exec(t))?{r:S(r[1]+\"\"+r[1]),g:S(r[2]+\"\"+r[2]),b:S(r[3]+\"\"+r[3]),a:N(r[4]+\"\"+r[4]),format:e?\"name\":\"hex8\"}:!!(r=Z.hex3.exec(t))&&{r:S(r[1]+\"\"+r[1]),g:S(r[2]+\"\"+r[2]),b:S(r[3]+\"\"+r[3]),format:e?\"name\":\"hex\"}}function F(t){var e,r;return t=t||{level:\"AA\",size:\"small\"},e=(t.level||\"AA\").toUpperCase(),r=(t.size||\"small\").toLowerCase(),\"AA\"!==e&&\"AAA\"!==e&&(e=\"AA\"),\"small\"!==r&&\"large\"!==r&&(r=\"small\"),{level:e,size:r}}var j=/^\\s+/,B=/\\s+$/,q=0,H=e.round,V=e.min,U=e.max,X=e.random;n.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,r,n,a,o,i,l=this.toRgb();return t=l.r/255,r=l.g/255,n=l.b/255,a=t<=.03928?t/12.92:e.pow((t+.055)/1.055,2.4),o=r<=.03928?r/12.92:e.pow((r+.055)/1.055,2.4),i=n<=.03928?n/12.92:e.pow((n+.055)/1.055,2.4),.2126*a+.7152*o+.0722*i},setAlpha:function(t){return this._a=T(t),this._roundA=H(100*this._a)/100,this},toHsv:function(){var t=s(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=s(this._r,this._g,this._b),e=H(360*t.h),r=H(100*t.s),n=H(100*t.v);return 1==this._a?\"hsv(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsva(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHsl:function(){var t=i(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=i(this._r,this._g,this._b),e=H(360*t.h),r=H(100*t.s),n=H(100*t.l);return 1==this._a?\"hsl(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsla(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHex:function(t){return u(this._r,this._g,this._b,t)},toHexString:function(t){return\"#\"+this.toHex(t)},toHex8:function(t){return f(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return\"#\"+this.toHex8(t)},toRgb:function(){return{r:H(this._r),g:H(this._g),b:H(this._b),a:this._a}},toRgbString:function(){return 1==this._a?\"rgb(\"+H(this._r)+\", \"+H(this._g)+\", \"+H(this._b)+\")\":\"rgba(\"+H(this._r)+\", \"+H(this._g)+\", \"+H(this._b)+\", \"+this._roundA+\")\"},toPercentageRgb:function(){return{r:H(100*L(this._r,255))+\"%\",g:H(100*L(this._g,255))+\"%\",b:H(100*L(this._b,255))+\"%\",a:this._a}},toPercentageRgbString:function(){return 1==this._a?\"rgb(\"+H(100*L(this._r,255))+\"%, \"+H(100*L(this._g,255))+\"%, \"+H(100*L(this._b,255))+\"%)\":\"rgba(\"+H(100*L(this._r,255))+\"%, \"+H(100*L(this._g,255))+\"%, \"+H(100*L(this._b,255))+\"%, \"+this._roundA+\")\"},toName:function(){return 0===this._a?\"transparent\":!(this._a<1)&&(Y[u(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e=\"#\"+d(this._r,this._g,this._b,this._a),r=e,a=this._gradientType?\"GradientType = 1, \":\"\";if(t){var o=n(t);r=\"#\"+d(o._r,o._g,o._b,o._a)}return\"progid:DXImageTransform.Microsoft.gradient(\"+a+\"startColorstr=\"+e+\",endColorstr=\"+r+\")\"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||\"hex\"!==t&&\"hex6\"!==t&&\"hex3\"!==t&&\"hex4\"!==t&&\"hex8\"!==t&&\"name\"!==t?(\"rgb\"===t&&(r=this.toRgbString()),\"prgb\"===t&&(r=this.toPercentageRgbString()),\"hex\"!==t&&\"hex6\"!==t||(r=this.toHexString()),\"hex3\"===t&&(r=this.toHexString(!0)),\"hex4\"===t&&(r=this.toHex8String(!0)),\"hex8\"===t&&(r=this.toHex8String()),\"name\"===t&&(r=this.toName()),\"hsl\"===t&&(r=this.toHslString()),\"hsv\"===t&&(r=this.toHsvString()),r||this.toHexString()):\"name\"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return n(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(v,arguments)},brighten:function(){return this._applyModification(m,arguments)},darken:function(){return this._applyModification(y,arguments)},desaturate:function(){return this._applyModification(h,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(g,arguments)},spin:function(){return this._applyModification(x,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(M,arguments)},complement:function(){return this._applyCombination(b,arguments)},monochromatic:function(){return this._applyCombination(A,arguments)},splitcomplement:function(){return this._applyCombination(k,arguments)},triad:function(){return this._applyCombination(_,arguments)},tetrad:function(){return this._applyCombination(w,arguments)}},n.fromRatio=function(t,e){if(\"object\"==typeof t){var r={};for(var a in t)t.hasOwnProperty(a)&&(r[a]=\"a\"===a?t[a]:P(t[a]));t=r}return n(t,e)},n.equals=function(t,e){return!(!t||!e)&&n(t).toRgbString()==n(e).toRgbString()},n.random=function(){return n.fromRatio({r:X(),g:X(),b:X()})},n.mix=function(t,e,r){r=0===r?0:r||50;var a=n(t).toRgb(),o=n(e).toRgb(),i=r/100;return n({r:(o.r-a.r)*i+a.r,g:(o.g-a.g)*i+a.g,b:(o.b-a.b)*i+a.b,a:(o.a-a.a)*i+a.a})},n.readability=function(t,r){var a=n(t),o=n(r);return(e.max(a.getLuminance(),o.getLuminance())+.05)/(e.min(a.getLuminance(),o.getLuminance())+.05)},n.isReadable=function(t,e,r){var a,o,i=n.readability(t,e);switch(o=!1,a=F(r),a.level+a.size){case\"AAsmall\":case\"AAAlarge\":o=i>=4.5;break;case\"AAlarge\":o=i>=3;break;case\"AAAsmall\":o=i>=7}return o},n.mostReadable=function(t,e,r){var a,o,i,l,s=null,c=0;r=r||{},o=r.includeFallbackColors,i=r.level,l=r.size;for(var u=0;u<e.length;u++)(a=n.readability(t,e[u]))>c&&(c=a,s=n(e[u]));return n.isReadable(t,s,{level:i,size:l})||!o?s:(r.includeFallbackColors=!1,n.mostReadable(t,[\"#fff\",\"#000\"],r))};var G=n.names={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"0ff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000\",blanchedalmond:\"ffebcd\",blue:\"00f\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",burntsienna:\"ea7e5d\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"0ff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkgrey:\"a9a9a9\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkslategrey:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dimgrey:\"696969\",dodgerblue:\"1e90ff\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"f0f\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",grey:\"808080\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgray:\"d3d3d3\",lightgreen:\"90ee90\",lightgrey:\"d3d3d3\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslategray:\"789\",lightslategrey:\"789\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"0f0\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"f0f\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370db\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"db7093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"f00\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",slategrey:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",wheat:\"f5deb3\",white:\"fff\",whitesmoke:\"f5f5f5\",yellow:\"ff0\",yellowgreen:\"9acd32\"},Y=n.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(G),Z=function(){var t=\"(?:[-\\\\+]?\\\\d*\\\\.\\\\d+%?)|(?:[-\\\\+]?\\\\d+%?)\",e=\"[\\\\s|\\\\(]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")\\\\s*\\\\)?\",r=\"[\\\\s|\\\\(]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")[,|\\\\s]+(\"+t+\")\\\\s*\\\\)?\";return{CSS_UNIT:new RegExp(t),rgb:new RegExp(\"rgb\"+e),rgba:new RegExp(\"rgba\"+r),hsl:new RegExp(\"hsl\"+e),hsla:new RegExp(\"hsla\"+r),hsv:new RegExp(\"hsv\"+e),hsva:new RegExp(\"hsva\"+r),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();void 0!==r&&r.exports?r.exports=n:\"function\"==typeof t&&t.amd?t(function(){return n}):window.tinycolor=n}(Math)},{}],14:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../color\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./attributes\");e.exports=function(t,e,r,l,s){function c(r,a){return n.coerce(t,e,i,r,a)}l=l||{},s=s||{};var u=c(\"visible\",!s.itemIsNotPlainObject),f=c(\"clicktoshow\");if(!u&&!f)return e;c(\"opacity\");var d=c(\"bgcolor\"),h=c(\"bordercolor\"),p=a.opacity(h);c(\"borderpad\");var g=c(\"borderwidth\"),v=c(\"showarrow\");c(\"text\",v?\" \":\"new text\"),c(\"textangle\"),n.coerceFont(c,\"font\",r.font),c(\"width\"),c(\"align\"),c(\"height\")&&c(\"valign\");for(var m=[\"x\",\"y\"],y=[-10,-30],x={_fullLayout:r},b=0;b<2;b++){var _=m[b],w=o.coerceRef(t,e,x,_,\"\",\"paper\");if(o.coercePosition(e,x,c,w,_,.5),v){var k=\"a\"+_,M=o.coerceRef(t,e,x,k,\"pixel\");\"pixel\"!==M&&M!==w&&(M=e[k]=\"pixel\");var A=\"pixel\"===M?y[b]:.4;o.coercePosition(e,x,c,M,k,A)}c(_+\"anchor\"),c(_+\"shift\")}if(n.noneOrAll(t,e,[\"x\",\"y\"]),\n",
|
|
"v&&(c(\"arrowcolor\",p?e.bordercolor:a.defaultLine),c(\"arrowhead\"),c(\"arrowsize\"),c(\"arrowwidth\",2*(p&&g||1)),c(\"standoff\"),n.noneOrAll(t,e,[\"ax\",\"ay\"])),f){var T=c(\"xclick\"),L=c(\"yclick\");e._xclick=void 0===T?e.x:T,e._yclick=void 0===L?e.y:L}var C=c(\"hovertext\"),S=r.hoverlabel||{};if(C){var z=c(\"hoverlabel.bgcolor\",S.bgcolor||(a.opacity(d)?a.rgb(d):a.defaultLine)),O=c(\"hoverlabel.bordercolor\",S.bordercolor||a.contrast(z));n.coerceFont(c,\"hoverlabel.font\",{family:S.font.family,size:S.font.size,color:S.font.color||O})}return c(\"captureevents\",!!C),e}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"../color\":25,\"./attributes\":16}],15:[function(t,e,r){\"use strict\";e.exports=[{path:\"\",backoff:0},{path:\"M-2.4,-3V3L0.6,0Z\",backoff:.6},{path:\"M-3.7,-2.5V2.5L1.3,0Z\",backoff:1.3},{path:\"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z\",backoff:1.55},{path:\"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z\",backoff:1.6},{path:\"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z\",backoff:2},{path:\"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z\",backoff:0},{path:\"M2,2V-2H-2V2Z\",backoff:0}]},{}],16:[function(t,e,r){\"use strict\";var n=t(\"./arrow_paths\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../plots/cartesian/constants\"),i=t(\"../../lib/extend\").extendFlat;e.exports={_isLinkedToArray:\"annotation\",visible:{valType:\"boolean\",dflt:!0},text:{valType:\"string\"},textangle:{valType:\"angle\",dflt:0},font:i({},a,{}),width:{valType:\"number\",min:1,dflt:null},height:{valType:\"number\",min:1,dflt:null},opacity:{valType:\"number\",min:0,max:1,dflt:1},align:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"center\"},valign:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\"},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},bordercolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},borderpad:{valType:\"number\",min:0,dflt:1},borderwidth:{valType:\"number\",min:0,dflt:1},showarrow:{valType:\"boolean\",dflt:!0},arrowcolor:{valType:\"color\"},arrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1},arrowsize:{valType:\"number\",min:.3,dflt:1},arrowwidth:{valType:\"number\",min:.1},standoff:{valType:\"number\",min:0,dflt:0},ax:{valType:\"any\"},ay:{valType:\"any\"},axref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",o.idRegex.x.toString()]},ayref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",o.idRegex.y.toString()]},xref:{valType:\"enumerated\",values:[\"paper\",o.idRegex.x.toString()]},x:{valType:\"any\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\"},xshift:{valType:\"number\",dflt:0},yref:{valType:\"enumerated\",values:[\"paper\",o.idRegex.y.toString()]},y:{valType:\"any\"},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\"},yshift:{valType:\"number\",dflt:0},clicktoshow:{valType:\"enumerated\",values:[!1,\"onoff\",\"onout\"],dflt:!1},xclick:{valType:\"any\"},yclick:{valType:\"any\"},hovertext:{valType:\"string\"},hoverlabel:{bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\"},font:i({},a,{})},captureevents:{valType:\"boolean\"},_deprecated:{ref:{valType:\"string\"}}}},{\"../../lib/extend\":132,\"../../plots/cartesian/constants\":176,\"../../plots/font_attributes\":195,\"./arrow_paths\":15}],17:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;a.filterVisible(e.annotations).forEach(function(e){var r,n,a=o.getFromId(t,e.xref),i=o.getFromId(t,e.yref),l=3*e.arrowsize*e.arrowwidth||0;a&&a.autorange&&(r=l+e.xshift,n=l-e.xshift,e.axref===e.xref?(o.expand(a,[a.r2c(e.x)],{ppadplus:r,ppadminus:n}),o.expand(a,[a.r2c(e.ax)],{ppadplus:e._xpadplus,ppadminus:e._xpadminus})):o.expand(a,[a.r2c(e.x)],{ppadplus:Math.max(e._xpadplus,r),ppadminus:Math.max(e._xpadminus,n)})),i&&i.autorange&&(r=l-e.yshift,n=l+e.yshift,e.ayref===e.yref?(o.expand(i,[i.r2c(e.y)],{ppadplus:r,ppadminus:n}),o.expand(i,[i.r2c(e.ay)],{ppadplus:e._ypadplus,ppadminus:e._ypadminus})):o.expand(i,[i.r2c(e.y)],{ppadplus:Math.max(e._ypadplus,r),ppadminus:Math.max(e._ypadminus,n)}))})}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./draw\").draw;e.exports=function(t){var e=t._fullLayout,r=a.filterVisible(e.annotations);if(r.length&&t._fullData.length){var l={};r.forEach(function(t){l[t.xref]=!0,l[t.yref]=!0});if(o.list(t).filter(function(t){return t.autorange&&l[t._id]}).length)return a.syncOrAsync([i,n],t)}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./draw\":21}],18:[function(t,e,r){\"use strict\";function n(t,e){var r=o(t,e);return r.on.length>0||r.explicitOff.length>0}function a(t,e){var r,n=o(t,e),a=n.on,l=n.off.concat(n.explicitOff),s={};if(a.length||l.length){for(r=0;r<a.length;r++)s[\"annotations[\"+a[r]+\"].visible\"]=!0;for(r=0;r<l.length;r++)s[\"annotations[\"+l[r]+\"].visible\"]=!1;return i.update(t,{},s)}}function o(t,e){var r,n,a,o,i,l,s=t._fullLayout.annotations,c=[],u=[],f=[],d=(e||[]).length;for(r=0;r<s.length;r++)if(a=s[r],o=a.clicktoshow){for(n=0;n<d;n++)if(i=e[n],i.xaxis._id===a.xref&&i.yaxis._id===a.yref&&i.xaxis.d2r(i.x)===a._xclick&&i.yaxis.d2r(i.y)===a._yclick){l=a.visible?\"onout\"===o?u:f:c,l.push(r);break}n===d&&a.visible&&\"onout\"===o&&u.push(r)}return{on:c,off:u,explicitOff:f}}var i=t(\"../../plotly\");e.exports={hasClickToShow:n,onClick:a}},{\"../../plotly\":166}],19:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib/to_log_range\");e.exports=function(t,e,r,o){function i(t){var r=c[t],i=null;i=l?a(r,e.range):Math.pow(10,r),n(i)||(i=null),o(u+t,i)}e=e||{};var l=\"log\"===r&&\"linear\"===e.type,s=\"linear\"===r&&\"log\"===e.type;if(l||s)for(var c,u,f=t._fullLayout.annotations,d=e._id.charAt(0),h=0;h<f.length;h++)c=f[h],u=\"annotations[\"+h+\"].\",c[d+\"ref\"]===e._id&&i(d),c[\"a\"+d+\"ref\"]===e._id&&i(\"a\"+d)}},{\"../../lib/to_log_range\":154,\"fast-isnumeric\":10}],20:[function(t,e,r){\"use strict\";var n=t(\"../../plots/array_container_defaults\"),a=t(\"./annotation_defaults\");e.exports=function(t,e){n(t,e,{name:\"annotations\",handleItemDefaults:a})}},{\"../../plots/array_container_defaults\":168,\"./annotation_defaults\":14}],21:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;e._infolayer.selectAll(\".annotation\").remove();for(var r=0;r<e.annotations.length;r++)e.annotations[r].visible&&a(t,r);return s.previousPromises(t)}function a(t,e){function r(t){return t.call(d.font,N).attr({\"text-anchor\":{left:\"start\",right:\"end\"}[b.align]||\"middle\"}),p.convertToTspans(t,n),t}function n(){function r(t,e){return\"auto\"===e&&(e=t<1/3?\"left\":t>2/3?\"right\":\"center\"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}var n=I.selectAll(\"a\");if(1===n.size()&&n.text()===I.text()){C.insert(\"a\",\":first-child\").attr({\"xlink:xlink:href\":n.attr(\"xlink:href\"),\"xlink:xlink:show\":n.attr(\"xlink:show\")}).style({cursor:\"pointer\"}).node().appendChild(D.node())}I.selectAll(\"tspan.line\").attr({y:0,x:0});var a=C.select(\".annotation-math-group\"),h=!a.empty(),p=d.bBox((h?a:I).node()),x=p.width,z=p.height,N=b.width||x,R=b.height||z,F=Math.round(N+2*O),j=Math.round(R+2*O);b._w=N,b._h=R;var B=!1;if([\"x\",\"y\"].forEach(function(e){var n,a,o,i,l,f=b[e+\"ref\"]||e,d=b[\"a\"+e+\"ref\"],h=u.getFromId(t,f),p=(A+(\"x\"===e?0:-90))*Math.PI/180,g=F*Math.cos(p),v=j*Math.sin(p),m=Math.abs(g)+Math.abs(v),x=b[e+\"anchor\"],_=b[e+\"shift\"]*(\"x\"===e?1:-1),w=M[e];if(h){var k=h.r2fraction(b[e]);if((t._dragging||!h.autorange)&&(k<0||k>1)&&(d===f?((k=h.r2fraction(b[\"a\"+e]))<0||k>1)&&(B=!0):B=!0,B))return;n=h._offset+h.r2p(b[e]),i=.5}else\"x\"===e?(o=b[e],n=y.l+y.w*o):(o=1-b[e],n=y.t+y.h*o),i=b.showarrow?.5:o;if(b.showarrow){w.head=n;var T=b[\"a\"+e];l=g*r(.5,b.xanchor)-v*r(.5,b.yanchor),d===f?(w.tail=h._offset+h.r2p(T),a=l):(w.tail=n+T,a=l+T),w.text=w.tail+l;var L=s[\"x\"===e?\"width\":\"height\"];if(\"paper\"===f&&(w.head=c.constrain(w.head,1,L-1)),\"pixel\"===d){var C=-Math.max(w.tail-3,w.text),S=Math.min(w.tail+3,w.text)-L;C>0?(w.tail+=C,w.text+=C):S>0&&(w.tail-=S,w.text-=S)}w.tail+=_,w.head+=_}else l=m*r(i,x),a=l,w.text=n+l;w.text+=_,l+=_,a+=_,b[\"_\"+e+\"padplus\"]=m/2+a,b[\"_\"+e+\"padminus\"]=m/2-a,b[\"_\"+e+\"size\"]=m,b[\"_\"+e+\"shift\"]=l}),B)return void C.remove();var q=0,H=0;if(\"left\"!==b.align&&(q=(N-x)*(\"center\"===b.align?.5:1)),\"top\"!==b.valign&&(H=(R-z)*(\"middle\"===b.valign?.5:1)),h)a.select(\"svg\").attr({x:O+q-1,y:O+H}).call(d.setClipUrl,P?_:null);else{var V=O+H-p.top,U=O+q-p.left;I.attr({x:U,y:V}).call(d.setClipUrl,P?_:null),I.selectAll(\"tspan.line\").attr({y:V,x:U})}E.select(\"rect\").call(d.setRect,O,O,N,R),D.call(d.setRect,S/2,S/2,F-S,j-S),C.call(d.setTranslate,Math.round(M.x.text-F/2),Math.round(M.y.text-j/2)),L.attr({transform:\"rotate(\"+A+\",\"+M.x.text+\",\"+M.y.text+\")\"});var X=\"annotations[\"+e+\"]\",G=function(r,n){i.select(t).selectAll('.annotation-arrow-g[data-index=\"'+e+'\"]').remove();var a=M.x.head,s=M.y.head,u=M.x.tail+r,h=M.y.tail+n,p=M.x.text+r,g=M.y.text+n,x=c.rotationXYMatrix(A,p,g),_=c.apply2DTransform(x),S=c.apply2DTransform2(x),z=+D.attr(\"width\"),O=+D.attr(\"height\"),P=p-.5*z,E=P+z,N=g-.5*O,I=N+O,R=[[P,N,P,I],[P,I,E,I],[E,I,E,N],[E,N,P,N]].map(S);if(!R.reduce(function(t,e){return t^!!o(a,s,a+1e6,s+1e6,e[0],e[1],e[2],e[3])},!1)){R.forEach(function(t){var e=o(u,h,a,s,t[0],t[1],t[2],t[3]);e&&(u=e.x,h=e.y)});var F=b.arrowwidth,j=b.arrowcolor,B=T.append(\"g\").style({opacity:f.opacity(j)}).classed(\"annotation-arrow-g\",!0).attr(\"data-index\",String(e)),q=B.append(\"path\").attr(\"d\",\"M\"+u+\",\"+h+\"L\"+a+\",\"+s).style(\"stroke-width\",F+\"px\").call(f.stroke,f.rgb(j));if(m(q,b.arrowhead,\"end\",b.arrowsize,b.standoff),t._context.editable&&q.node().parentNode){var H=a,V=s;if(b.standoff){var U=Math.sqrt(Math.pow(a-u,2)+Math.pow(s-h,2));H+=b.standoff*(u-a)/U,V+=b.standoff*(h-s)/U}var G,Y,Z,W=B.append(\"path\").classed(\"annotation\",!0).classed(\"anndrag\",!0).attr({\"data-index\":String(e),d:\"M3,3H-3V-3H3ZM0,0L\"+(u-H)+\",\"+(h-V),transform:\"translate(\"+H+\",\"+V+\")\"}).style(\"stroke-width\",F+6+\"px\").call(f.stroke,\"rgba(0,0,0,0)\").call(f.fill,\"rgba(0,0,0,0)\");v.init({element:W.node(),prepFn:function(){var t=d.getTranslate(C);Y=t.x,Z=t.y,G={},w&&w.autorange&&(G[w._name+\".autorange\"]=!0),k&&k.autorange&&(G[k._name+\".autorange\"]=!0)},moveFn:function(t,e){var r=_(Y,Z),n=r[0]+t,a=r[1]+e;C.call(d.setTranslate,n,a),G[X+\".x\"]=w?w.p2r(w.r2p(b.x)+t):b.x+t/y.w,G[X+\".y\"]=k?k.p2r(k.r2p(b.y)+e):b.y-e/y.h,b.axref===b.xref&&(G[X+\".ax\"]=w.p2r(w.r2p(b.ax)+t)),b.ayref===b.yref&&(G[X+\".ay\"]=k.p2r(k.r2p(b.ay)+e)),B.attr(\"transform\",\"translate(\"+t+\",\"+e+\")\"),L.attr({transform:\"rotate(\"+A+\",\"+n+\",\"+a+\")\"})},doneFn:function(e){if(e){l.relayout(t,G);var r=document.querySelector(\".js-notes-box-panel\");r&&r.redraw(r.selectedObj)}}})}}};if(b.showarrow&&G(0,0),t._context.editable){var Y,Z;v.init({element:C.node(),prepFn:function(){Z=L.attr(\"transform\"),Y={}},moveFn:function(t,e){var r=\"pointer\";if(b.showarrow)b.axref===b.xref?Y[X+\".ax\"]=w.p2r(w.r2p(b.ax)+t):Y[X+\".ax\"]=b.ax+t,b.ayref===b.yref?Y[X+\".ay\"]=k.p2r(k.r2p(b.ay)+e):Y[X+\".ay\"]=b.ay+e,G(t,e);else{if(w)Y[X+\".x\"]=b.x+t/w._m;else{var n=b._xsize/y.w,a=b.x+(b._xshift-b.xshift)/y.w-n/2;Y[X+\".x\"]=v.align(a+t/y.w,n,0,1,b.xanchor)}if(k)Y[X+\".y\"]=b.y+e/k._m;else{var o=b._ysize/y.h,i=b.y-(b._yshift+b.yshift)/y.h-o/2;Y[X+\".y\"]=v.align(i-e/y.h,o,0,1,b.yanchor)}w&&k||(r=v.getCursor(w?.5:Y[X+\".x\"],k?.5:Y[X+\".y\"],b.xanchor,b.yanchor))}L.attr({transform:\"translate(\"+t+\",\"+e+\")\"+Z}),g(C,r)},doneFn:function(e){if(g(C),e){l.relayout(t,Y);var r=document.querySelector(\".js-notes-box-panel\");r&&r.redraw(r.selectedObj)}}})}}var a=t.layout,s=t._fullLayout,y=t._fullLayout._size;s._infolayer.selectAll('.annotation[data-index=\"'+e+'\"]').remove();var x=(a.annotations||[])[e],b=s.annotations[e],_=\"clip\"+s._uid+\"_ann\"+e;if(!x||b.visible===!1)return void i.selectAll(\"#\"+_).remove();var w=u.getFromId(t,b.xref),k=u.getFromId(t,b.yref),M={x:{},y:{}},A=+b.textangle||0,T=s._infolayer.append(\"g\").classed(\"annotation\",!0).attr(\"data-index\",String(e)).style(\"opacity\",b.opacity),L=T.append(\"g\").classed(\"annotation-text-g\",!0).attr(\"data-index\",String(e)),C=L.append(\"g\").style(\"pointer-events\",b.captureevents?\"all\":null).call(g,\"default\").on(\"click\",function(){t._dragging=!1,t.emit(\"plotly_clickannotation\",{index:e,annotation:x,fullAnnotation:b,event:i.event})});b.hovertext&&C.on(\"mouseover\",function(){var e=b.hoverlabel,r=e.font,n=this.getBoundingClientRect(),a=t.getBoundingClientRect();h.loneHover({x0:n.left-a.left,x1:n.right-a.left,y:(n.top+n.bottom)/2-a.top,text:b.hovertext,color:e.bgcolor,borderColor:e.bordercolor,fontFamily:r.family,fontSize:r.size,fontColor:r.color},{container:s._hoverlayer.node(),outerContainer:s._paper.node()})}).on(\"mouseout\",function(){h.loneUnhover(s._hoverlayer.node())});var S=b.borderwidth,z=b.borderpad,O=S+z,D=C.append(\"rect\").attr(\"class\",\"bg\").style(\"stroke-width\",S+\"px\").call(f.stroke,b.bordercolor).call(f.fill,b.bgcolor),P=b.width||b.height,E=s._defs.select(\".clips\").selectAll(\"#\"+_).data(P?[0]:[]);E.enter().append(\"clipPath\").classed(\"annclip\",!0).attr(\"id\",_).append(\"rect\"),E.exit().remove();var N=b.font,I=C.append(\"text\").classed(\"annotation\",!0).attr(\"data-unformatted\",b.text).text(b.text);t._context.editable?I.call(p.makeEditable,C).call(r).on(\"edit\",function(n){b.text=n,this.attr({\"data-unformatted\":b.text}),this.call(r);var a={};a[\"annotations[\"+e+\"].text\"]=b.text,w&&w.autorange&&(a[w._name+\".autorange\"]=!0),k&&k.autorange&&(a[k._name+\".autorange\"]=!0),l.relayout(t,a)}):I.call(r)}function o(t,e,r,n,a,o,i,l){var s=r-t,c=a-t,u=i-a,f=n-e,d=o-e,h=l-o,p=s*h-u*f;if(0===p)return null;var g=(c*h-u*d)/p,v=(c*f-s*d)/p;return v<0||v>1||g<0||g>1?null:{x:t+s*g,y:e+f*g}}var i=t(\"d3\"),l=t(\"../../plotly\"),s=t(\"../../plots/plots\"),c=t(\"../../lib\"),u=t(\"../../plots/cartesian/axes\"),f=t(\"../color\"),d=t(\"../drawing\"),h=t(\"../fx\"),p=t(\"../../lib/svg_text_utils\"),g=t(\"../../lib/setcursor\"),v=t(\"../dragelement\"),m=t(\"./draw_arrow_head\");e.exports={draw:n,drawOne:a}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"../fx\":66,\"./draw_arrow_head\":22,d3:7}],22:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=t(\"../color\"),i=t(\"../drawing\"),l=t(\"./arrow_paths\");e.exports=function(t,e,r,s,c){function u(){t.style(\"stroke-dasharray\",\"0px,100px\")}function f(r,a){h.path&&(e>5&&(a=0),n.select(d.parentElement).append(\"path\").attr({class:t.attr(\"class\"),d:h.path,transform:\"translate(\"+r.x+\",\"+r.y+\")rotate(\"+180*a/Math.PI+\")scale(\"+y+\")\"}).style({fill:x,opacity:b,\"stroke-width\":0}))}a(s)||(s=1);var d=t.node(),h=l[e||0];\"string\"==typeof r&&r||(r=\"end\");var p,g,v,m,y=(i.getPx(t,\"stroke-width\")||1)*s,x=t.style(\"stroke\")||o.defaultLine,b=t.style(\"stroke-opacity\")||1,_=r.indexOf(\"start\")>=0,w=r.indexOf(\"end\")>=0,k=h.backoff*y+c;if(\"line\"===d.nodeName){p={x:+t.attr(\"x1\"),y:+t.attr(\"y1\")},g={x:+t.attr(\"x2\"),y:+t.attr(\"y2\")};var M=p.x-g.x,A=p.y-g.y;if(v=Math.atan2(A,M),m=v+Math.PI,k){if(k*k>M*M+A*A)return void u();var T=k*Math.cos(v),L=k*Math.sin(v);_&&(p.x-=T,p.y-=L,t.attr({x1:p.x,y1:p.y})),w&&(g.x+=T,g.y+=L,t.attr({x2:g.x,y2:g.y}))}}else if(\"path\"===d.nodeName){var C=d.getTotalLength(),S=\"\";if(C<k)return void u();if(_){var z=d.getPointAtLength(0),O=d.getPointAtLength(.1);v=Math.atan2(z.y-O.y,z.x-O.x),p=d.getPointAtLength(Math.min(k,C)),k&&(S=\"0px,\"+k+\"px,\")}if(w){var D=d.getPointAtLength(C),P=d.getPointAtLength(C-.1);if(m=Math.atan2(D.y-P.y,D.x-P.x),g=d.getPointAtLength(Math.max(0,C-k)),k){var E=S?2*k:k;S+=C-E+\"px,\"+C+\"px\"}}else S&&(S+=C+\"px\");S&&t.style(\"stroke-dasharray\",S)}_&&f(p,v),w&&f(g,m)}},{\"../color\":25,\"../drawing\":49,\"./arrow_paths\":15,d3:7,\"fast-isnumeric\":10}],23:[function(t,e,r){\"use strict\";var n=t(\"./draw\"),a=t(\"./click\");e.exports={moduleType:\"component\",name:\"annotations\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:n.draw,drawOne:n.drawOne,hasClickToShow:a.hasClickToShow,onClick:a.onClick,convertCoords:t(\"./convert_coords\")}},{\"./attributes\":16,\"./calc_autorange\":17,\"./click\":18,\"./convert_coords\":19,\"./defaults\":20,\"./draw\":21}],24:[function(t,e,r){\"use strict\";r.defaults=[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\",\"#8c564b\",\"#e377c2\",\"#7f7f7f\",\"#bcbd22\",\"#17becf\"],r.defaultLine=\"#444\",r.lightLine=\"#eee\",r.background=\"#fff\",r.borderLine=\"#BEC8D9\",r.lightFraction=1e3/11},{}],25:[function(t,e,r){\"use strict\";function n(t){if(o(t)||\"string\"!=typeof t)return t;var e=t.trim();if(\"rgb\"!==e.substr(0,3))return t;var r=e.match(/^rgba?\\s*\\(([^()]*)\\)$/);if(!r)return t;var n=r[1].trim().split(/\\s*[\\s,]\\s*/),a=\"a\"===e.charAt(3)&&4===n.length;if(!a&&3!==n.length)return t;for(var i=0;i<n.length;i++){if(!n[i].length)return t;if(n[i]=Number(n[i]),!(n[i]>=0))return t;if(3===i)n[i]>1&&(n[i]=1);else if(n[i]>=1)return t}var l=Math.round(255*n[0])+\", \"+Math.round(255*n[1])+\", \"+Math.round(255*n[2]);return a?\"rgba(\"+l+\", \"+n[3]+\")\":\"rgb(\"+l+\")\"}var a=t(\"tinycolor2\"),o=t(\"fast-isnumeric\"),i=e.exports={},l=t(\"./attributes\");i.defaults=l.defaults;var s=i.defaultLine=l.defaultLine;i.lightLine=l.lightLine;var c=i.background=l.background;i.tinyRGB=function(t){var e=t.toRgb();return\"rgb(\"+Math.round(e.r)+\", \"+Math.round(e.g)+\", \"+Math.round(e.b)+\")\"},i.rgb=function(t){return i.tinyRGB(a(t))},i.opacity=function(t){return t?a(t).getAlpha():0},i.addOpacity=function(t,e){var r=a(t).toRgb();return\"rgba(\"+Math.round(r.r)+\", \"+Math.round(r.g)+\", \"+Math.round(r.b)+\", \"+e+\")\"},i.combine=function(t,e){var r=a(t).toRgb();if(1===r.a)return a(t).toRgbString();var n=a(e||c).toRgb(),o=1===n.a?n:{r:255*(1-n.a)+n.r*n.a,g:255*(1-n.a)+n.g*n.a,b:255*(1-n.a)+n.b*n.a},i={r:o.r*(1-r.a)+r.r*r.a,g:o.g*(1-r.a)+r.g*r.a,b:o.b*(1-r.a)+r.b*r.a};return a(i).toRgbString()},i.contrast=function(t,e,r){var n=a(t);return 1!==n.getAlpha()&&(n=a(i.combine(t,c))),(n.isDark()?e?n.lighten(e):c:r?n.darken(r):s).toString()},i.stroke=function(t,e){var r=a(e);t.style({stroke:i.tinyRGB(r),\"stroke-opacity\":r.getAlpha()})},i.fill=function(t,e){var r=a(e);t.style({fill:i.tinyRGB(r),\"fill-opacity\":r.getAlpha()})},i.clean=function(t){if(t&&\"object\"==typeof t){var e,r,a,o,l=Object.keys(t);for(e=0;e<l.length;e++)if(a=l[e],o=t[a],\"color\"===a.substr(a.length-5))if(Array.isArray(o))for(r=0;r<o.length;r++)o[r]=n(o[r]);else t[a]=n(o);else if(\"colorscale\"===a.substr(a.length-10)&&Array.isArray(o))for(r=0;r<o.length;r++)Array.isArray(o[r])&&(o[r][1]=n(o[r][1]));else if(Array.isArray(o)){var s=o[0];if(!Array.isArray(s)&&s&&\"object\"==typeof s)for(r=0;r<o.length;r++)i.clean(o[r])}else o&&\"object\"==typeof o&&i.clean(o)}}},{\"./attributes\":24,\"fast-isnumeric\":10,tinycolor2:13}],26:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/layout_attributes\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../lib/extend\").extendFlat;e.exports={thicknessmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"pixels\"},thickness:{valType:\"number\",min:0,dflt:30},lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",dflt:1.02,min:-2,max:3},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},xpad:{valType:\"number\",min:0,dflt:10},y:{valType:\"number\",dflt:.5,min:-2,max:3},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\"},ypad:{valType:\"number\",min:0,dflt:10},outlinecolor:n.linecolor,outlinewidth:n.linewidth,bordercolor:n.linecolor,borderwidth:{valType:\"number\",min:0,dflt:0},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"},tickmode:n.tickmode,nticks:n.nticks,tick0:n.tick0,dtick:n.dtick,tickvals:n.tickvals,ticktext:n.ticktext,ticks:o({},n.ticks,{dflt:\"\"}),ticklen:n.ticklen,tickwidth:n.tickwidth,tickcolor:n.tickcolor,showticklabels:n.showticklabels,tickfont:n.tickfont,tickangle:n.tickangle,tickformat:n.tickformat,tickprefix:n.tickprefix,showtickprefix:n.showtickprefix,ticksuffix:n.ticksuffix,showticksuffix:n.showticksuffix,separatethousands:n.separatethousands,exponentformat:n.exponentformat,showexponent:n.showexponent,title:{valType:\"string\",dflt:\"Click to enter colorscale title\"},titlefont:o({},a,{}),titleside:{valType:\"enumerated\",values:[\"right\",\"top\",\"bottom\"],dflt:\"top\"}}},{\"../../lib/extend\":132,\"../../plots/cartesian/layout_attributes\":182,\"../../plots/font_attributes\":195}],27:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../plots/cartesian/tick_value_defaults\"),o=t(\"../../plots/cartesian/tick_mark_defaults\"),i=t(\"../../plots/cartesian/tick_label_defaults\"),l=t(\"./attributes\");e.exports=function(t,e,r){function s(t,e){return n.coerce(u,c,l,t,e)}var c=e.colorbar={},u=t.colorbar||{};s(\"thickness\",\"fraction\"===s(\"thicknessmode\")?30/(r.width-r.margin.l-r.margin.r):30),s(\"len\",\"fraction\"===s(\"lenmode\")?1:r.height-r.margin.t-r.margin.b),s(\"x\"),s(\"xanchor\"),s(\"xpad\"),s(\"y\"),s(\"yanchor\"),s(\"ypad\"),n.noneOrAll(u,c,[\"x\",\"y\"]),s(\"outlinecolor\"),s(\"outlinewidth\"),s(\"bordercolor\"),s(\"borderwidth\"),s(\"bgcolor\"),a(u,c,s,\"linear\"),i(u,c,s,\"linear\",{outerTicks:!1,font:r.font,noHover:!0}),o(u,c,s,\"linear\",{outerTicks:!1,font:r.font,noHover:!0}),s(\"title\"),n.coerceFont(s,\"titlefont\",r.font),s(\"titleside\")}},{\"../../lib\":136,\"../../plots/cartesian/tick_label_defaults\":189,\"../../plots/cartesian/tick_mark_defaults\":190,\"../../plots/cartesian/tick_value_defaults\":191,\"./attributes\":26}],28:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"tinycolor2\"),o=t(\"../../plotly\"),i=t(\"../../plots/plots\"),l=t(\"../../registry\"),s=t(\"../../plots/cartesian/axes\"),c=t(\"../dragelement\"),u=t(\"../../lib\"),f=t(\"../../lib/extend\").extendFlat,d=t(\"../../lib/setcursor\"),h=t(\"../drawing\"),p=t(\"../color\"),g=t(\"../titles\"),v=t(\"../../plots/cartesian/axis_defaults\"),m=t(\"../../plots/cartesian/position_defaults\"),y=t(\"../../plots/cartesian/layout_attributes\"),x=t(\"./attributes\");e.exports=function(t,e){function r(){function x(t,e){return u.coerce(J,K,y,t,e)}function w(){if([\"top\",\"bottom\"].indexOf(_.titleside)!==-1){var e=ot.select(\".cbtitle\"),r=e.select(\"text\"),o=[-_.outlinewidth/2,_.outlinewidth/2],i=e.select(\".h\"+K._id+\"title-math-group\").node(),l=15.6;if(r.node()&&(l=1.3*parseInt(r.style(\"font-size\"),10)),i?(lt=h.bBox(i).height)>l&&(o[1]-=(lt-l)/2):r.node()&&!r.classed(\"js-placeholder\")&&(lt=h.bBox(e.node()).height),lt){if(lt+=5,\"top\"===_.titleside)K.domain[1]-=lt/T.h,o[1]*=-1;else{K.domain[0]+=lt/T.h;var c=Math.max(1,r.selectAll(\"tspan.line\").size());o[1]+=(1-c)*l}e.attr(\"transform\",\"translate(\"+o+\")\"),K.setScale()}}ot.selectAll(\".cbfills,.cblines,.cbaxis\").attr(\"transform\",\"translate(0,\"+Math.round(T.h*(1-K.domain[1]))+\")\");var f=ot.select(\".cbfills\").selectAll(\"rect.cbfill\").data(z);f.enter().append(\"rect\").classed(\"cbfill\",!0).style(\"stroke\",\"none\"),f.exit().remove(),f.each(function(t,e){var r=[0===e?C[0]:(z[e]+z[e-1])/2,e===z.length-1?C[1]:(z[e]+z[e+1])/2].map(K.c2p).map(Math.round);e!==z.length-1&&(r[1]+=r[1]>r[0]?1:-1);var o=D(t).replace(\"e-\",\"\"),i=a(o).toHexString();n.select(this).attr({x:Y,width:Math.max(B,2),y:n.min(r),height:Math.max(n.max(r)-n.min(r),2),fill:i})});var d=ot.select(\".cblines\").selectAll(\"path.cbline\").data(_.line.color&&_.line.width?S:[]);return d.enter().append(\"path\").classed(\"cbline\",!0),d.exit().remove(),d.each(function(t){n.select(this).attr(\"d\",\"M\"+Y+\",\"+(Math.round(K.c2p(t))+_.line.width/2%1)+\"h\"+B).call(h.lineGroupStyle,_.line.width,O(t),_.line.dash)}),K._axislayer.selectAll(\"g.\"+K._id+\"tick,path\").remove(),K._pos=Y+B+(_.outlinewidth||0)/2-(\"outside\"===_.ticks?1:0),K.side=\"right\",u.syncOrAsync([function(){return s.doTicks(t,K,!0)},function(){if([\"top\",\"bottom\"].indexOf(_.titleside)===-1){var e=K.titlefont.size,r=K._offset+K._length/2,a=T.l+(K.position||0)*T.w+(\"right\"===K.side?10+e*(K.showticklabels?1:.5):-10-e*(K.showticklabels?.5:0));k(\"h\"+K._id+\"title\",{avoid:{selection:n.select(t).selectAll(\"g.\"+K._id+\"tick\"),side:_.titleside,offsetLeft:T.l,offsetTop:T.t,maxShift:A.width},attributes:{x:a,y:r,\"text-anchor\":\"middle\"},transform:{rotate:\"-90\",offset:0}})}}])}function k(e,r){var n,a=b();n=l.traceIs(a,\"markerColorscale\")?\"marker.colorbar.title\":\"colorbar.title\";var o={propContainer:K,propName:n,traceIndex:a.index,dfltName:\"colorscale\",containerGroup:ot.select(\".cbtitle\")},i=\"h\"===e.charAt(0)?e.substr(1):\"h\"+e;ot.selectAll(\".\"+i+\",.\"+i+\"-math-group\").remove(),g.draw(t,e,f(o,r||{}))}function M(){var r=B+_.outlinewidth/2+h.bBox(K._axislayer.node()).width;if(R=it.select(\"text\"),R.node()&&!R.classed(\"js-placeholder\")){var n,a=it.select(\".h\"+K._id+\"title-math-group\").node();n=a&&[\"top\",\"bottom\"].indexOf(_.titleside)!==-1?h.bBox(a).width:h.bBox(it.node()).right-Y-T.l,r=Math.max(r,n)}var o=2*_.xpad+r+_.borderwidth+_.outlinewidth/2,l=$-Q;ot.select(\".cbbg\").attr({x:Y-_.xpad-(_.borderwidth+_.outlinewidth)/2,y:Q-X,width:Math.max(o,2),height:Math.max(l+2*X,2)}).call(p.fill,_.bgcolor).call(p.stroke,_.bordercolor).style({\"stroke-width\":_.borderwidth}),ot.selectAll(\".cboutline\").attr({x:Y,y:Q+_.ypad+(\"top\"===_.titleside?lt:0),width:Math.max(B,2),height:Math.max(l-2*_.ypad-lt,2)}).call(p.stroke,_.outlinecolor).style({fill:\"None\",\"stroke-width\":_.outlinewidth});var s=({center:.5,right:1}[_.xanchor]||0)*o;ot.attr(\"transform\",\"translate(\"+(T.l-s)+\",\"+T.t+\")\"),i.autoMargin(t,e,{x:_.x,y:_.y,l:o*({right:1,center:.5}[_.xanchor]||0),r:o*({left:1,center:.5}[_.xanchor]||0),t:l*({bottom:1,middle:.5}[_.yanchor]||0),b:l*({top:1,middle:.5}[_.yanchor]||0)})}var A=t._fullLayout,T=A._size;if(\"function\"!=typeof _.fillcolor&&\"function\"!=typeof _.line.color)return void A._infolayer.selectAll(\"g.\"+e).remove();var L,C=n.extent((\"function\"==typeof _.fillcolor?_.fillcolor:_.line.color).domain()),S=[],z=[],O=\"function\"==typeof _.line.color?_.line.color:function(){return _.line.color},D=\"function\"==typeof _.fillcolor?_.fillcolor:function(){return _.fillcolor},P=_.levels.end+_.levels.size/100,E=_.levels.size,N=1.001*C[0]-.001*C[1],I=1.001*C[1]-.001*C[0];for(L=_.levels.start;(L-P)*E<0;L+=E)L>N&&L<I&&S.push(L);if(\"function\"==typeof _.fillcolor)if(_.filllevels)for(P=_.filllevels.end+_.filllevels.size/100,E=_.filllevels.size,L=_.filllevels.start;(L-P)*E<0;L+=E)L>C[0]&&L<C[1]&&z.push(L);else z=S.map(function(t){return t-_.levels.size/2}),z.push(z[z.length-1]+_.levels.size);else _.fillcolor&&\"string\"==typeof _.fillcolor&&(z=[0]);_.levels.size<0&&(S.reverse(),z.reverse());var R,F=A.height-A.margin.t-A.margin.b,j=A.width-A.margin.l-A.margin.r,B=Math.round(_.thickness*(\"fraction\"===_.thicknessmode?j:1)),q=B/T.w,H=Math.round(_.len*(\"fraction\"===_.lenmode?F:1)),V=H/T.h,U=_.xpad/T.w,X=(_.borderwidth+_.outlinewidth)/2,G=_.ypad/T.h,Y=Math.round(_.x*T.w+_.xpad),Z=_.x-q*({middle:.5,right:1}[_.xanchor]||0),W=_.y+V*(({top:-.5,bottom:.5}[_.yanchor]||0)-.5),$=Math.round(T.h*(1-W)),Q=$-H,J={type:\"linear\",range:C,tickmode:_.tickmode,nticks:_.nticks,tick0:_.tick0,dtick:_.dtick,tickvals:_.tickvals,ticktext:_.ticktext,ticks:_.ticks,ticklen:_.ticklen,tickwidth:_.tickwidth,tickcolor:_.tickcolor,showticklabels:_.showticklabels,tickfont:_.tickfont,tickangle:_.tickangle,tickformat:_.tickformat,exponentformat:_.exponentformat,separatethousands:_.separatethousands,showexponent:_.showexponent,showtickprefix:_.showtickprefix,tickprefix:_.tickprefix,showticksuffix:_.showticksuffix,ticksuffix:_.ticksuffix,title:_.title,titlefont:_.titlefont,anchor:\"free\",position:1},K={type:\"linear\",_id:\"y\"+e},tt={letter:\"y\",font:A.font,noHover:!0,calendar:A.calendar};if(v(J,K,x,tt,A),m(J,K,x,tt),K.position=_.x+U+q,r.axis=K,[\"top\",\"bottom\"].indexOf(_.titleside)!==-1&&(K.titleside=_.titleside,K.titlex=_.x+U,K.titley=W+(\"top\"===_.titleside?V-G:G)),_.line.color&&\"auto\"===_.tickmode){K.tickmode=\"linear\",K.tick0=_.levels.start;var et=_.levels.size,rt=u.constrain(($-Q)/50,4,15)+1,nt=(C[1]-C[0])/((_.nticks||rt)*et);if(nt>1){var at=Math.pow(10,Math.floor(Math.log(nt)/Math.LN10));et*=at*u.roundUp(nt/at,[2,5,10]),(Math.abs(_.levels.start)/_.levels.size+1e-6)%1<2e-6&&(K.tick0=0)}K.dtick=et}K.domain=[W+G,W+V-G],K.setScale();var ot=A._infolayer.selectAll(\"g.\"+e).data([0]);ot.enter().append(\"g\").classed(e,!0).each(function(){var t=n.select(this);t.append(\"rect\").classed(\"cbbg\",!0),t.append(\"g\").classed(\"cbfills\",!0),t.append(\"g\").classed(\"cblines\",!0),t.append(\"g\").classed(\"cbaxis\",!0).classed(\"crisp\",!0),t.append(\"g\").classed(\"cbtitleunshift\",!0).append(\"g\").classed(\"cbtitle\",!0),t.append(\"rect\").classed(\"cboutline\",!0),t.select(\".cbtitle\").datum(0)}),ot.attr(\"transform\",\"translate(\"+Math.round(T.l)+\",\"+Math.round(T.t)+\")\");var it=ot.select(\".cbtitleunshift\").attr(\"transform\",\"translate(-\"+Math.round(T.l)+\",-\"+Math.round(T.t)+\")\");K._axislayer=ot.select(\".cbaxis\");var lt=0;if([\"top\",\"bottom\"].indexOf(_.titleside)!==-1){var st,ct=T.l+(_.x+U)*T.w,ut=K.titlefont.size;st=\"top\"===_.titleside?(1-(W+V-G))*T.h+T.t+3+.75*ut:(1-(W+G))*T.h+T.t-3-.25*ut,k(K._id+\"title\",{attributes:{x:ct,y:st,\"text-anchor\":\"start\"}})}var ft=u.syncOrAsync([i.previousPromises,w,i.previousPromises,M],t);if(ft&&ft.then&&(t._promises||[]).push(ft),t._context.editable){var dt,ht,pt;c.init({element:ot.node(),prepFn:function(){dt=ot.attr(\"transform\"),d(ot)},moveFn:function(t,e){ot.attr(\"transform\",dt+\" translate(\"+t+\",\"+e+\")\"),ht=c.align(Z+t/T.w,q,0,1,_.xanchor),pt=c.align(W-e/T.h,V,0,1,_.yanchor);var r=c.getCursor(ht,pt,_.xanchor,_.yanchor);d(ot,r)},doneFn:function(e){d(ot),e&&void 0!==ht&&void 0!==pt&&o.restyle(t,{\"colorbar.x\":ht,\"colorbar.y\":pt},b().index)}})}return ft}function b(){var r,n,a=e.substr(2);for(r=0;r<t._fullData.length;r++)if(n=t._fullData[r],n.uid===a)return n}var _={};return Object.keys(x).forEach(function(t){_[t]=null}),_.fillcolor=null,_.line={color:null,width:null,dash:null},_.levels={start:null,end:null,size:null},_.filllevels=null,Object.keys(_).forEach(function(t){r[t]=function(e){return arguments.length?(_[t]=u.isPlainObject(_[t])?u.extendFlat(_[t],e):e,r):_[t]}}),r.options=function(t){return Object.keys(t).forEach(function(e){\"function\"==typeof r[e]&&r[e](t[e])}),r},r._opts=_,r}},{\"../../lib\":136,\"../../lib/extend\":132,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/cartesian/axis_defaults\":173,\"../../plots/cartesian/layout_attributes\":182,\"../../plots/cartesian/position_defaults\":185,\"../../plots/plots\":199,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"../titles\":114,\"./attributes\":26,d3:7,tinycolor2:13}],29:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t){return n.isPlainObject(t.colorbar)}},{\"../../lib\":136}],30:[function(t,e,r){\"use strict\";e.exports={zauto:{valType:\"boolean\",dflt:!0},zmin:{valType:\"number\",dflt:null},zmax:{valType:\"number\",dflt:null},colorscale:{valType:\"colorscale\"},autocolorscale:{valType:\"boolean\",dflt:!0},reversescale:{valType:\"boolean\",dflt:!1},showscale:{valType:\"boolean\",dflt:!0}}},{}],31:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./scales\"),o=t(\"./flip_scale\");e.exports=function(t,e,r,i){var l,s;r?(l=n.nestedProperty(t,r).get(),s=n.nestedProperty(t._input,r).get()):(l=t,s=t._input);var c=i+\"auto\",u=i+\"min\",f=i+\"max\",d=l[c],h=l[u],p=l[f],g=l.colorscale;d===!1&&void 0!==h||(h=n.aggNums(Math.min,null,e)),d===!1&&void 0!==p||(p=n.aggNums(Math.max,null,e)),h===p&&(h-=.5,p+=.5),l[u]=h,l[f]=p,s[u]=h,s[f]=p,s[c]=d!==!1||void 0===h&&void 0===p,l.autocolorscale&&(g=h*p<0?a.RdBu:h>=0?a.Reds:a.Blues,s.colorscale=g,l.reversescale&&(g=o(g)),l.colorscale=g)}},{\"../../lib\":136,\"./flip_scale\":36,\"./scales\":43}],32:[function(t,e,r){\"use strict\";var n=t(\"./attributes\"),a=t(\"../../lib/extend\").extendDeep;t(\"./scales.js\");e.exports=function(t){return{color:{valType:\"color\",arrayOk:!0},colorscale:a({},n.colorscale,{}),cauto:a({},n.zauto,{}),cmax:a({},n.zmax,{}),cmin:a({},n.zmin,{}),autocolorscale:a({},n.autocolorscale,{}),reversescale:a({},n.reversescale,{})}}},{\"../../lib/extend\":132,\"./attributes\":30,\"./scales.js\":43}],33:[function(t,e,r){\"use strict\";var n=t(\"./scales\");e.exports=n.RdBu},{\"./scales\":43}],34:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../colorbar/has_colorbar\"),i=t(\"../colorbar/defaults\"),l=t(\"./is_valid_scale\"),s=t(\"./flip_scale\");e.exports=function(t,e,r,c,u){var f=u.prefix,d=u.cLetter,h=f.slice(0,f.length-1),p=f?a.nestedProperty(t,h).get()||{}:t,g=f?a.nestedProperty(e,h).get()||{}:e,v=p[d+\"min\"],m=p[d+\"max\"],y=p.colorscale;c(f+d+\"auto\",!(n(v)&&n(m)&&v<m)),\n",
|
|
"c(f+d+\"min\"),c(f+d+\"max\");var x;void 0!==y&&(x=!l(y)),c(f+\"autocolorscale\",x);var b=c(f+\"colorscale\");if(c(f+\"reversescale\")&&(g.colorscale=s(b)),\"marker.line.\"!==f){var _;f&&(_=o(p)),c(f+\"showscale\",_)&&i(p,g,r)}}},{\"../../lib\":136,\"../colorbar/defaults\":27,\"../colorbar/has_colorbar\":29,\"./flip_scale\":36,\"./is_valid_scale\":40,\"fast-isnumeric\":10}],35:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){for(var n=t.length,a=new Array(n),o=new Array(n),i=0;i<n;i++){var l=t[i];a[i]=e+l[0]*(r-e),o[i]=l[1]}return{domain:a,range:o}}},{}],36:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e,r=t.length,n=new Array(r),a=r-1,o=0;a>=0;a--,o++)e=t[a],n[o]=[1-e[0],e[1]];return n}},{}],37:[function(t,e,r){\"use strict\";var n=t(\"./scales\"),a=t(\"./default_scale\"),o=t(\"./is_valid_scale_array\");e.exports=function(t,e){function r(){try{t=n[t]||JSON.parse(t)}catch(r){t=e}}return e||(e=a),t?(\"string\"==typeof t&&(r(),\"string\"==typeof t&&r()),o(t)?t:e):e}},{\"./default_scale\":33,\"./is_valid_scale_array\":41,\"./scales\":43}],38:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"./is_valid_scale\");e.exports=function(t,e){var r=e?a.nestedProperty(t,e).get()||{}:t,i=r.color,l=!1;if(Array.isArray(i))for(var s=0;s<i.length;s++)if(n(i[s])){l=!0;break}return a.isPlainObject(r)&&(l||r.showscale===!0||n(r.cmin)&&n(r.cmax)||o(r.colorscale)||a.isPlainObject(r.colorbar))}},{\"../../lib\":136,\"./is_valid_scale\":40,\"fast-isnumeric\":10}],39:[function(t,e,r){\"use strict\";r.scales=t(\"./scales\"),r.defaultScale=t(\"./default_scale\"),r.attributes=t(\"./attributes\"),r.handleDefaults=t(\"./defaults\"),r.calc=t(\"./calc\"),r.hasColorscale=t(\"./has_colorscale\"),r.isValidScale=t(\"./is_valid_scale\"),r.getScale=t(\"./get_scale\"),r.flipScale=t(\"./flip_scale\"),r.extractScale=t(\"./extract_scale\"),r.makeColorScaleFunc=t(\"./make_color_scale_func\")},{\"./attributes\":30,\"./calc\":31,\"./default_scale\":33,\"./defaults\":34,\"./extract_scale\":35,\"./flip_scale\":36,\"./get_scale\":37,\"./has_colorscale\":38,\"./is_valid_scale\":40,\"./make_color_scale_func\":42,\"./scales\":43}],40:[function(t,e,r){\"use strict\";var n=t(\"./scales\"),a=t(\"./is_valid_scale_array\");e.exports=function(t){return void 0!==n[t]||a(t)}},{\"./is_valid_scale_array\":41,\"./scales\":43}],41:[function(t,e,r){\"use strict\";var n=t(\"tinycolor2\");e.exports=function(t){var e=0;if(!Array.isArray(t)||t.length<2)return!1;if(!t[0]||!t[t.length-1])return!1;if(0!=+t[0][0]||1!=+t[t.length-1][0])return!1;for(var r=0;r<t.length;r++){var a=t[r];if(2!==a.length||+a[0]<e||!n(a[1]).isValid())return!1;e=+a[0]}return!0}},{tinycolor2:13}],42:[function(t,e,r){\"use strict\";function n(t){var e={r:t[0],g:t[1],b:t[2],a:t[3]};return o(e).toRgbString()}var a=t(\"d3\"),o=t(\"tinycolor2\"),i=t(\"fast-isnumeric\"),l=t(\"../color\");e.exports=function(t,e){e=e||{};for(var r=t.domain,s=t.range,c=s.length,u=new Array(c),f=0;f<c;f++){var d=o(s[f]).toRgb();u[f]=[d.r,d.g,d.b,d.a]}var h,p=a.scale.linear().domain(r).range(u).clamp(!0),g=e.noNumericCheck,v=e.returnArray;return h=g&&v?p:g?function(t){return n(p(t))}:v?function(t){return i(t)?p(t):o(t).isValid()?t:l.defaultLine}:function(t){return i(t)?n(p(t)):o(t).isValid()?t:l.defaultLine},h.domain=p.domain,h.range=function(){return s},h}},{\"../color\":25,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],43:[function(t,e,r){\"use strict\";e.exports={Greys:[[0,\"rgb(0,0,0)\"],[1,\"rgb(255,255,255)\"]],YlGnBu:[[0,\"rgb(8,29,88)\"],[.125,\"rgb(37,52,148)\"],[.25,\"rgb(34,94,168)\"],[.375,\"rgb(29,145,192)\"],[.5,\"rgb(65,182,196)\"],[.625,\"rgb(127,205,187)\"],[.75,\"rgb(199,233,180)\"],[.875,\"rgb(237,248,217)\"],[1,\"rgb(255,255,217)\"]],Greens:[[0,\"rgb(0,68,27)\"],[.125,\"rgb(0,109,44)\"],[.25,\"rgb(35,139,69)\"],[.375,\"rgb(65,171,93)\"],[.5,\"rgb(116,196,118)\"],[.625,\"rgb(161,217,155)\"],[.75,\"rgb(199,233,192)\"],[.875,\"rgb(229,245,224)\"],[1,\"rgb(247,252,245)\"]],YlOrRd:[[0,\"rgb(128,0,38)\"],[.125,\"rgb(189,0,38)\"],[.25,\"rgb(227,26,28)\"],[.375,\"rgb(252,78,42)\"],[.5,\"rgb(253,141,60)\"],[.625,\"rgb(254,178,76)\"],[.75,\"rgb(254,217,118)\"],[.875,\"rgb(255,237,160)\"],[1,\"rgb(255,255,204)\"]],Bluered:[[0,\"rgb(0,0,255)\"],[1,\"rgb(255,0,0)\"]],RdBu:[[0,\"rgb(5,10,172)\"],[.35,\"rgb(106,137,247)\"],[.5,\"rgb(190,190,190)\"],[.6,\"rgb(220,170,132)\"],[.7,\"rgb(230,145,90)\"],[1,\"rgb(178,10,28)\"]],Reds:[[0,\"rgb(220,220,220)\"],[.2,\"rgb(245,195,157)\"],[.4,\"rgb(245,160,105)\"],[1,\"rgb(178,10,28)\"]],Blues:[[0,\"rgb(5,10,172)\"],[.35,\"rgb(40,60,190)\"],[.5,\"rgb(70,100,245)\"],[.6,\"rgb(90,120,245)\"],[.7,\"rgb(106,137,247)\"],[1,\"rgb(220,220,220)\"]],Picnic:[[0,\"rgb(0,0,255)\"],[.1,\"rgb(51,153,255)\"],[.2,\"rgb(102,204,255)\"],[.3,\"rgb(153,204,255)\"],[.4,\"rgb(204,204,255)\"],[.5,\"rgb(255,255,255)\"],[.6,\"rgb(255,204,255)\"],[.7,\"rgb(255,153,255)\"],[.8,\"rgb(255,102,204)\"],[.9,\"rgb(255,102,102)\"],[1,\"rgb(255,0,0)\"]],Rainbow:[[0,\"rgb(150,0,90)\"],[.125,\"rgb(0,0,200)\"],[.25,\"rgb(0,25,255)\"],[.375,\"rgb(0,152,255)\"],[.5,\"rgb(44,255,150)\"],[.625,\"rgb(151,255,0)\"],[.75,\"rgb(255,234,0)\"],[.875,\"rgb(255,111,0)\"],[1,\"rgb(255,0,0)\"]],Portland:[[0,\"rgb(12,51,131)\"],[.25,\"rgb(10,136,186)\"],[.5,\"rgb(242,211,56)\"],[.75,\"rgb(242,143,56)\"],[1,\"rgb(217,30,30)\"]],Jet:[[0,\"rgb(0,0,131)\"],[.125,\"rgb(0,60,170)\"],[.375,\"rgb(5,255,255)\"],[.625,\"rgb(255,255,0)\"],[.875,\"rgb(250,0,0)\"],[1,\"rgb(128,0,0)\"]],Hot:[[0,\"rgb(0,0,0)\"],[.3,\"rgb(230,0,0)\"],[.6,\"rgb(255,210,0)\"],[1,\"rgb(255,255,255)\"]],Blackbody:[[0,\"rgb(0,0,0)\"],[.2,\"rgb(230,0,0)\"],[.4,\"rgb(230,210,0)\"],[.7,\"rgb(255,255,255)\"],[1,\"rgb(160,200,255)\"]],Earth:[[0,\"rgb(0,0,130)\"],[.1,\"rgb(0,180,180)\"],[.2,\"rgb(40,210,40)\"],[.4,\"rgb(230,230,50)\"],[.6,\"rgb(120,70,20)\"],[1,\"rgb(255,255,255)\"]],Electric:[[0,\"rgb(0,0,0)\"],[.15,\"rgb(30,0,100)\"],[.4,\"rgb(120,0,100)\"],[.6,\"rgb(160,90,0)\"],[.8,\"rgb(230,200,0)\"],[1,\"rgb(255,250,220)\"]],Viridis:[[0,\"#440154\"],[.06274509803921569,\"#48186a\"],[.12549019607843137,\"#472d7b\"],[.18823529411764706,\"#424086\"],[.25098039215686274,\"#3b528b\"],[.3137254901960784,\"#33638d\"],[.3764705882352941,\"#2c728e\"],[.4392156862745098,\"#26828e\"],[.5019607843137255,\"#21918c\"],[.5647058823529412,\"#1fa088\"],[.6274509803921569,\"#28ae80\"],[.6901960784313725,\"#3fbc73\"],[.7529411764705882,\"#5ec962\"],[.8156862745098039,\"#84d44b\"],[.8784313725490196,\"#addc30\"],[.9411764705882353,\"#d8e219\"],[1,\"#fde725\"]]}},{}],44:[function(t,e,r){\"use strict\";e.exports=function(t,e,r,n,a){var o=(t-r)/(n-r),i=o+e/(n-r),l=(o+i)/2;return\"left\"===a||\"bottom\"===a?o:\"center\"===a||\"middle\"===a?l:\"right\"===a||\"top\"===a?i:o<2/3-l?o:i>4/3-l?i:l}},{}],45:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=[[\"sw-resize\",\"s-resize\",\"se-resize\"],[\"w-resize\",\"move\",\"e-resize\"],[\"nw-resize\",\"n-resize\",\"ne-resize\"]];e.exports=function(t,e,r,o){return t=\"left\"===r?0:\"center\"===r?1:\"right\"===r?2:n.constrain(Math.floor(3*t),0,2),e=\"bottom\"===o?0:\"middle\"===o?1:\"top\"===o?2:n.constrain(Math.floor(3*e),0,2),a[e][t]}},{\"../../lib\":136}],46:[function(t,e,r){\"use strict\";function n(){var t=document.createElement(\"div\");t.className=\"dragcover\";var e=t.style;return e.position=\"fixed\",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background=\"none\",document.body.appendChild(t),t}function a(t){t._dragging=!1,t._replotPending&&o.plot(t)}var o=t(\"../../plotly\"),i=t(\"../../lib\"),l=t(\"../../plots/cartesian/constants\"),s=t(\"../../constants/interactions\"),c=e.exports={};c.align=t(\"./align\"),c.getCursor=t(\"./cursor\");var u=t(\"./unhover\");c.unhover=u.wrapped,c.unhoverRaw=u.raw,c.init=function(t){function e(e){return t.element.onmousemove=g,v._dragged=!1,v._dragging=!0,u=e.clientX,f=e.clientY,p=e.target,d=(new Date).getTime(),d-v._mouseDownTime<y?m+=1:(m=1,v._mouseDownTime=d),t.prepFn&&t.prepFn(e,u,f),h=n(),h.onmousemove=r,h.onmouseup=o,h.onmouseout=o,h.style.cursor=window.getComputedStyle(t.element).cursor,i.pauseEvent(e)}function r(e){var r=e.clientX-u,n=e.clientY-f,a=t.minDrag||l.MINDRAG;return Math.abs(r)<a&&(r=0),Math.abs(n)<a&&(n=0),(r||n)&&(v._dragged=!0,c.unhover(v)),t.moveFn&&t.moveFn(r,n,v._dragged),i.pauseEvent(e)}function o(e){if(g=t.element.onmousemove,t.setCursor&&(t.element.onmousemove=t.setCursor),h.onmousemove=null,h.onmouseup=null,h.onmouseout=null,i.removeElement(h),!v._dragging)return void(v._dragged=!1);if(v._dragging=!1,(new Date).getTime()-v._mouseDownTime>y&&(m=Math.max(m-1,1)),t.doneFn&&t.doneFn(v._dragged,m,e),!v._dragged){var r;try{r=new MouseEvent(\"click\",e)}catch(t){r=document.createEvent(\"MouseEvents\"),r.initMouseEvent(\"click\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}p.dispatchEvent(r)}return a(v),v._dragged=!1,i.pauseEvent(e)}var u,f,d,h,p,g,v=i.getPlotDiv(t.element)||{},m=1,y=s.DBLCLICKDELAY;v._mouseDownTime||(v._mouseDownTime=0),g=t.element.onmousemove,t.setCursor&&(t.element.onmousemove=t.setCursor),t.element.onmousedown=e,t.element.style.pointerEvents=\"all\"},c.coverSlip=n},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../plotly\":166,\"../../plots/cartesian/constants\":176,\"./align\":44,\"./cursor\":45,\"./unhover\":47}],47:[function(t,e,r){\"use strict\";var n=t(\"../../lib/events\"),a=e.exports={};a.wrapped=function(t,e,r){\"string\"==typeof t&&(t=document.getElementById(t)),t._hoverTimer&&(clearTimeout(t._hoverTimer),t._hoverTimer=void 0),a.raw(t,e,r)},a.raw=function(t,e){var r=t._fullLayout,a=t._hoverdata;e||(e={}),e.target&&n.triggerHandler(t,\"plotly_beforehover\",e)===!1||(r._hoverlayer.selectAll(\"g\").remove(),r._hoverlayer.selectAll(\"line\").remove(),r._hoverlayer.selectAll(\"circle\").remove(),t._hoverdata=void 0,e.target&&a&&t.emit(\"plotly_unhover\",{event:e,points:a}))}},{\"../../lib/events\":131}],48:[function(t,e,r){\"use strict\";r.dash={valType:\"string\",values:[\"solid\",\"dot\",\"dash\",\"longdash\",\"dashdot\",\"longdashdot\"],dflt:\"solid\"}},{}],49:[function(t,e,r){\"use strict\";function n(t,e,r,n,a,o,i,l){if(s.traceIs(r,\"symbols\")){var u=g(r);e.attr(\"d\",function(t){var e;e=\"various\"===t.ms||\"various\"===o.size?3:p.isBubble(r)?u(t.ms):(o.size||6)/2,t.mrc=e;var n=v.symbolNumber(t.mx||o.symbol)||0,a=n%100;return t.om=n%200>=100,v.symbolFuncs[a](e)+(n>=200?x:\"\")}).style(\"opacity\",function(t){return(t.mo+1||o.opacity+1)-1})}var f,d,h,m=!1;if(t.so?(h=i.outlierwidth,d=i.outliercolor,f=o.outliercolor):(h=(t.mlw+1||i.width+1||(t.trace?t.trace.marker.line.width:0)+1)-1,d=\"mlc\"in t?t.mlcc=a(t.mlc):Array.isArray(i.color)?c.defaultLine:i.color,Array.isArray(o.color)&&(f=c.defaultLine,m=!0),f=\"mc\"in t?t.mcc=n(t.mc):o.color||\"rgba(0,0,0,0)\"),t.om)e.call(c.stroke,f).style({\"stroke-width\":(h||1)+\"px\",fill:\"none\"});else{e.style(\"stroke-width\",h+\"px\");var y=o.gradient,b=t.mgt;if(b?m=!0:b=y&&y.type,b&&\"none\"!==b){var _=t.mgc;_?m=!0:_=y.color;var w=\"g\"+l._fullLayout._uid+\"-\"+r.uid;m&&(w+=\"-\"+t.i),e.call(v.gradient,l,w,b,f,_)}else e.call(c.fill,f);h&&e.call(c.stroke,d)}}function a(t,e,r,n){var a=t[0]-e[0],i=t[1]-e[1],l=r[0]-e[0],s=r[1]-e[1],c=Math.pow(a*a+i*i,k/2),u=Math.pow(l*l+s*s,k/2),f=(u*u*a-c*c*l)*n,d=(u*u*i-c*c*s)*n,h=3*u*(c+u),p=3*c*(c+u);return[[o.round(e[0]+(h&&f/h),2),o.round(e[1]+(h&&d/h),2)],[o.round(e[0]-(p&&f/p),2),o.round(e[1]-(p&&d/p),2)]]}var o=t(\"d3\"),i=t(\"fast-isnumeric\"),l=t(\"tinycolor2\"),s=t(\"../../registry\"),c=t(\"../color\"),u=t(\"../colorscale\"),f=t(\"../../lib\"),d=t(\"../../lib/svg_text_utils\"),h=t(\"../../constants/xmlns_namespaces\"),p=t(\"../../traces/scatter/subtypes\"),g=t(\"../../traces/scatter/make_bubble_size_func\"),v=e.exports={};v.font=function(t,e,r,n){e&&e.family&&(n=e.color,r=e.size,e=e.family),e&&t.style(\"font-family\",e),r+1&&t.style(\"font-size\",r+\"px\"),n&&t.call(c.fill,n)},v.setPosition=function(t,e,r){t.attr(\"x\",e).attr(\"y\",r)},v.setSize=function(t,e,r){t.attr(\"width\",e).attr(\"height\",r)},v.setRect=function(t,e,r,n,a){t.call(v.setPosition,e,r).call(v.setSize,n,a)},v.translatePoint=function(t,e,r,n){var a=t.xp||r.c2p(t.x),o=t.yp||n.c2p(t.y);return i(a)&&i(o)&&e.node()?(\"text\"===e.node().nodeName?e.attr(\"x\",a).attr(\"y\",o):e.attr(\"transform\",\"translate(\"+a+\",\"+o+\")\"),!0):(e.remove(),!1)},v.translatePoints=function(t,e,r,n){t.each(function(t){var a=o.select(this);v.translatePoint(t,a,e,r,n)})},v.getPx=function(t,e){return Number(t.style(e).replace(/px$/,\"\"))},v.crispRound=function(t,e,r){return e&&i(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},v.singleLineStyle=function(t,e,r,n,a){e.style(\"fill\",\"none\");var o=(((t||[])[0]||{}).trace||{}).line||{},i=r||o.width||0,l=a||o.dash||\"\";c.stroke(e,n||o.color),v.dashLine(e,l,i)},v.lineGroupStyle=function(t,e,r,n){t.style(\"fill\",\"none\").each(function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},i=e||a.width||0,l=n||a.dash||\"\";o.select(this).call(c.stroke,r||a.color).call(v.dashLine,l,i)})},v.dashLine=function(t,e,r){r=+r||0,e=v.dashStyle(e,r),t.style({\"stroke-dasharray\":e,\"stroke-width\":r+\"px\"})},v.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return\"solid\"===t?t=\"\":\"dot\"===t?t=r+\"px,\"+r+\"px\":\"dash\"===t?t=3*r+\"px,\"+3*r+\"px\":\"longdash\"===t?t=5*r+\"px,\"+5*r+\"px\":\"dashdot\"===t?t=3*r+\"px,\"+r+\"px,\"+r+\"px,\"+r+\"px\":\"longdashdot\"===t&&(t=5*r+\"px,\"+2*r+\"px,\"+r+\"px,\"+2*r+\"px\"),t},v.fillGroupStyle=function(t){t.style(\"stroke-width\",0).each(function(e){var r=o.select(this);try{r.call(c.fill,e[0].trace.fillcolor)}catch(e){f.error(e,t),r.remove()}})};var m=t(\"./symbol_defs\");v.symbolNames=[],v.symbolFuncs=[],v.symbolNeedLines={},v.symbolNoDot={},v.symbolList=[],Object.keys(m).forEach(function(t){var e=m[t];v.symbolList=v.symbolList.concat([e.n,t,e.n+100,t+\"-open\"]),v.symbolNames[e.n]=t,v.symbolFuncs[e.n]=e.f,e.needLine&&(v.symbolNeedLines[e.n]=!0),e.noDot?v.symbolNoDot[e.n]=!0:v.symbolList=v.symbolList.concat([e.n+200,t+\"-dot\",e.n+300,t+\"-open-dot\"])});var y=v.symbolNames.length,x=\"M0,0.5L0.5,0L0,-0.5L-0.5,0Z\";v.symbolNumber=function(t){if(\"string\"==typeof t){var e=0;t.indexOf(\"-open\")>0&&(e=100,t=t.replace(\"-open\",\"\")),t.indexOf(\"-dot\")>0&&(e+=200,t=t.replace(\"-dot\",\"\")),t=v.symbolNames.indexOf(t),t>=0&&(t+=e)}return t%100>=y||t>=400?0:Math.floor(Math.max(t,0))};var b={x1:1,x2:0,y1:0,y2:0},_={x1:0,x2:0,y1:1,y2:0};v.gradient=function(t,e,r,n,a,i){var s=e._fullLayout._defs.select(\".gradients\").selectAll(\"#\"+r).data([n+a+i],f.identity);s.exit().remove(),s.enter().append(\"radial\"===n?\"radialGradient\":\"linearGradient\").each(function(){var t=o.select(this);\"horizontal\"===n?t.attr(b):\"vertical\"===n&&t.attr(_),t.attr(\"id\",r);var e=l(a),s=l(i);t.append(\"stop\").attr({offset:\"0%\",\"stop-color\":c.tinyRGB(s),\"stop-opacity\":s.getAlpha()}),t.append(\"stop\").attr({offset:\"100%\",\"stop-color\":c.tinyRGB(e),\"stop-opacity\":e.getAlpha()})}),t.style({fill:\"url(#\"+r+\")\",\"fill-opacity\":null})},v.initGradients=function(t){var e=t._fullLayout._defs.selectAll(\".gradients\").data([0]);e.enter().append(\"g\").classed(\"gradients\",!0),e.selectAll(\"linearGradient,radialGradient\").remove()},v.singlePointStyle=function(t,e,r,a,o,i){var l=r.marker;n(t,e,r,a,o,l,l.line,i)},v.pointStyle=function(t,e){if(t.size()){var r=e.marker,n=v.tryColorscale(r,\"\"),a=v.tryColorscale(r,\"line\"),i=f.getPlotDiv(t.node());t.each(function(t){v.singlePointStyle(t,o.select(this),e,n,a,i)})}},v.tryColorscale=function(t,e){var r=e?f.nestedProperty(t,e).get():t,n=r.colorscale,a=r.color;return n&&Array.isArray(a)?u.makeColorScaleFunc(u.extractScale(n,r.cmin,r.cmax)):f.identity};var w={start:1,end:-1,middle:0,bottom:1,top:-1};v.textPointStyle=function(t,e){t.each(function(t){var r=o.select(this),n=t.tx||e.text;if(!n||Array.isArray(n))return void r.remove();var a=t.tp||e.textposition,l=a.indexOf(\"top\")!==-1?\"top\":a.indexOf(\"bottom\")!==-1?\"bottom\":\"middle\",s=a.indexOf(\"left\")!==-1?\"end\":a.indexOf(\"right\")!==-1?\"start\":\"middle\",c=t.ts||e.textfont.size,u=t.mrc?t.mrc/.8+1:0;c=i(c)&&c>0?c:0,r.call(v.font,t.tf||e.textfont.family,c,t.tc||e.textfont.color).attr(\"text-anchor\",s).text(n).call(d.convertToTspans);var f=o.select(this.parentNode),h=r.selectAll(\"tspan.line\"),p=1.3*((h[0].length||1)-1)+1,g=w[s]*u,m=.75*c+w[l]*u+(w[l]-1)*p*c/2;f.attr(\"transform\",\"translate(\"+g+\",\"+m+\")\"),p>1&&h.attr({x:r.attr(\"x\"),y:r.attr(\"y\")})})};var k=.5;v.smoothopen=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\");var r,n=\"M\"+t[0],o=[];for(r=1;r<t.length-1;r++)o.push(a(t[r-1],t[r],t[r+1],e));for(n+=\"Q\"+o[0][0]+\" \"+t[1],r=2;r<t.length-1;r++)n+=\"C\"+o[r-2][1]+\" \"+o[r-1][0]+\" \"+t[r];return n+=\"Q\"+o[t.length-3][1]+\" \"+t[t.length-1]},v.smoothclosed=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\")+\"Z\";var r,n=\"M\"+t[0],o=t.length-1,i=[a(t[o],t[0],t[1],e)];for(r=1;r<o;r++)i.push(a(t[r-1],t[r],t[r+1],e));for(i.push(a(t[o-1],t[o],t[0],e)),r=1;r<=o;r++)n+=\"C\"+i[r-1][1]+\" \"+i[r][0]+\" \"+t[r];return n+=\"C\"+i[o][1]+\" \"+i[0][0]+\" \"+t[0]+\"Z\"};var M={hv:function(t,e){return\"H\"+o.round(e[0],2)+\"V\"+o.round(e[1],2)},vh:function(t,e){return\"V\"+o.round(e[1],2)+\"H\"+o.round(e[0],2)},hvh:function(t,e){return\"H\"+o.round((t[0]+e[0])/2,2)+\"V\"+o.round(e[1],2)+\"H\"+o.round(e[0],2)},vhv:function(t,e){return\"V\"+o.round((t[1]+e[1])/2,2)+\"H\"+o.round(e[0],2)+\"V\"+o.round(e[1],2)}},A=function(t,e){return\"L\"+o.round(e[0],2)+\",\"+o.round(e[1],2)};v.steps=function(t){var e=M[t]||A;return function(t){for(var r=\"M\"+o.round(t[0][0],2)+\",\"+o.round(t[0][1],2),n=1;n<t.length;n++)r+=e(t[n-1],t[n]);return r}},v.makeTester=function(){var t=o.select(\"body\").selectAll(\"#js-plotly-tester\").data([0]);t.enter().append(\"svg\").attr(\"id\",\"js-plotly-tester\").attr(h.svgAttrs).style({position:\"absolute\",left:\"-10000px\",top:\"-10000px\",width:\"9000px\",height:\"9000px\",\"z-index\":\"1\"});var e=t.selectAll(\".js-reference-point\").data([0]);e.enter().append(\"path\").classed(\"js-reference-point\",!0).attr(\"d\",\"M0,0H1V1H0Z\").style({\"stroke-width\":0,fill:\"black\"}),t.node()._cache||(t.node()._cache={}),v.tester=t,v.testref=e};var T=[];v.bBox=function(t){var e=t.attributes[\"data-bb\"];if(e&&e.value)return f.extendFlat({},T[e.value]);var r=v.tester,n=r.node(),a=t.cloneNode(!0);n.appendChild(a),o.select(a).attr({x:0,y:0,transform:\"\"});var i=a.getBoundingClientRect(),l=v.testref.node().getBoundingClientRect();n.removeChild(a);var s={height:i.height,width:i.width,left:i.left-l.left,top:i.top-l.top,right:i.right-l.left,bottom:i.bottom-l.top};return T.length>=1e4&&(o.selectAll(\"[data-bb]\").attr(\"data-bb\",null),T=[]),t.setAttribute(\"data-bb\",T.length),T.push(s),f.extendFlat({},s)},v.setClipUrl=function(t,e){if(!e)return void t.attr(\"clip-path\",null);var r=\"#\"+e,n=o.select(\"base\");n.size()&&n.attr(\"href\")&&(r=window.location.href.split(\"#\")[0]+r),t.attr(\"clip-path\",\"url(\"+r+\")\")},v.getTranslate=function(t){var e=t.attr?\"attr\":\"getAttribute\",r=t[e](\"transform\")||\"\",n=r.replace(/.*\\btranslate\\((-?\\d*\\.?\\d*)[^-\\d]*(-?\\d*\\.?\\d*)[^\\d].*/,function(t,e,r){return[e,r].join(\" \")}).split(\" \");return{x:+n[0]||0,y:+n[1]||0}},v.setTranslate=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",a=t.attr?\"attr\":\"setAttribute\",o=t[n](\"transform\")||\"\";return e=e||0,r=r||0,o=o.replace(/(\\btranslate\\(.*?\\);?)/,\"\").trim(),o+=\" translate(\"+e+\", \"+r+\")\",o=o.trim(),t[a](\"transform\",o),o},v.getScale=function(t){var e=t.attr?\"attr\":\"getAttribute\",r=t[e](\"transform\")||\"\",n=r.replace(/.*\\bscale\\((\\d*\\.?\\d*)[^\\d]*(\\d*\\.?\\d*)[^\\d].*/,function(t,e,r){return[e,r].join(\" \")}).split(\" \");return{x:+n[0]||1,y:+n[1]||1}},v.setScale=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",a=t.attr?\"attr\":\"setAttribute\",o=t[n](\"transform\")||\"\";return e=e||1,r=r||1,o=o.replace(/(\\bscale\\(.*?\\);?)/,\"\").trim(),o+=\" scale(\"+e+\", \"+r+\")\",o=o.trim(),t[a](\"transform\",o),o},v.setPointGroupScale=function(t,e,r){var n,a,o;return e=e||1,r=r||1,a=1===e&&1===r?\"\":\" scale(\"+e+\",\"+r+\")\",o=/\\s*sc.*/,t.each(function(){n=(this.getAttribute(\"transform\")||\"\").replace(o,\"\"),n+=a,n=n.trim(),this.setAttribute(\"transform\",n)}),a};v.setTextPointsScale=function(t,e,r){t.each(function(){var t,n=o.select(this),a=n.select(\"text\"),i=parseFloat(a.attr(\"x\")||0),l=parseFloat(a.attr(\"y\")||0),s=(n.attr(\"transform\")||\"\").match(/translate\\([^)]*\\)\\s*$/);t=1===e&&1===r?[]:[\"translate(\"+i+\",\"+l+\")\",\"scale(\"+e+\",\"+r+\")\",\"translate(\"+-i+\",\"+-l+\")\"],s&&t.push(s),n.attr(\"transform\",t.join(\" \"))})},v.measureText=function(t,e,r){var n=t.append(\"text\").text(e).call(v.font,r),a=v.bBox(n.node());return n.remove(),a}},{\"../../constants/xmlns_namespaces\":124,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../registry\":206,\"../../traces/scatter/make_bubble_size_func\":255,\"../../traces/scatter/subtypes\":260,\"../color\":25,\"../colorscale\":39,\"./symbol_defs\":50,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],50:[function(t,e,r){\"use strict\";var n=t(\"d3\");e.exports={circle:{n:0,f:function(t){var e=n.round(t,2);return\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"}},square:{n:1,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"}},diamond:{n:2,f:function(t){var e=n.round(1.3*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"Z\"}},cross:{n:3,f:function(t){var e=n.round(.4*t,2),r=n.round(1.2*t,2);return\"M\"+r+\",\"+e+\"H\"+e+\"V\"+r+\"H-\"+e+\"V\"+e+\"H-\"+r+\"V-\"+e+\"H-\"+e+\"V-\"+r+\"H\"+e+\"V-\"+e+\"H\"+r+\"Z\"}},x:{n:4,f:function(t){var e=n.round(.8*t/Math.sqrt(2),2),r=\"l\"+e+\",\"+e,a=\"l\"+e+\",-\"+e,o=\"l-\"+e+\",-\"+e,i=\"l-\"+e+\",\"+e;return\"M0,\"+e+r+a+o+a+o+i+o+i+r+i+r+\"Z\"}},\"triangle-up\":{n:5,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+e+\",\"+n.round(t/2,2)+\"H\"+e+\"L0,-\"+n.round(t,2)+\"Z\"}},\"triangle-down\":{n:6,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+e+\",-\"+n.round(t/2,2)+\"H\"+e+\"L0,\"+n.round(t,2)+\"Z\"}},\"triangle-left\":{n:7,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M\"+n.round(t/2,2)+\",-\"+e+\"V\"+e+\"L-\"+n.round(t,2)+\",0Z\"}},\"triangle-right\":{n:8,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return\"M-\"+n.round(t/2,2)+\",-\"+e+\"V\"+e+\"L\"+n.round(t,2)+\",0Z\"}},\"triangle-ne\":{n:9,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M-\"+r+\",-\"+e+\"H\"+e+\"V\"+r+\"Z\"}},\"triangle-se\":{n:10,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M\"+e+\",-\"+r+\"V\"+e+\"H-\"+r+\"Z\"}},\"triangle-sw\":{n:11,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M\"+r+\",\"+e+\"H-\"+e+\"V-\"+r+\"Z\"}},\"triangle-nw\":{n:12,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return\"M-\"+e+\",\"+r+\"V-\"+e+\"H\"+r+\"Z\"}},pentagon:{n:13,f:function(t){var e=n.round(.951*t,2),r=n.round(.588*t,2),a=n.round(-t,2),o=n.round(t*-.309,2);return\"M\"+e+\",\"+o+\"L\"+r+\",\"+n.round(.809*t,2)+\"H-\"+r+\"L-\"+e+\",\"+o+\"L0,\"+a+\"Z\"}},hexagon:{n:14,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),a=n.round(t*Math.sqrt(3)/2,2);return\"M\"+a+\",-\"+r+\"V\"+r+\"L0,\"+e+\"L-\"+a+\",\"+r+\"V-\"+r+\"L0,-\"+e+\"Z\"}},hexagon2:{n:15,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),a=n.round(t*Math.sqrt(3)/2,2);return\"M-\"+r+\",\"+a+\"H\"+r+\"L\"+e+\",0L\"+r+\",-\"+a+\"H-\"+r+\"L-\"+e+\",0Z\"}},octagon:{n:16,f:function(t){var e=n.round(.924*t,2),r=n.round(.383*t,2);return\"M-\"+r+\",-\"+e+\"H\"+r+\"L\"+e+\",-\"+r+\"V\"+r+\"L\"+r+\",\"+e+\"H-\"+r+\"L-\"+e+\",\"+r+\"V-\"+r+\"Z\"}},star:{n:17,f:function(t){var e=1.4*t,r=n.round(.225*e,2),a=n.round(.951*e,2),o=n.round(.363*e,2),i=n.round(.588*e,2),l=n.round(-e,2),s=n.round(e*-.309,2),c=n.round(.118*e,2),u=n.round(.809*e,2);return\"M\"+r+\",\"+s+\"H\"+a+\"L\"+o+\",\"+c+\"L\"+i+\",\"+u+\"L0,\"+n.round(.382*e,2)+\"L-\"+i+\",\"+u+\"L-\"+o+\",\"+c+\"L-\"+a+\",\"+s+\"H-\"+r+\"L0,\"+l+\"Z\"}},hexagram:{n:18,f:function(t){var e=n.round(.66*t,2),r=n.round(.38*t,2),a=n.round(.76*t,2);return\"M-\"+a+\",0l-\"+r+\",-\"+e+\"h\"+a+\"l\"+r+\",-\"+e+\"l\"+r+\",\"+e+\"h\"+a+\"l-\"+r+\",\"+e+\"l\"+r+\",\"+e+\"h-\"+a+\"l-\"+r+\",\"+e+\"l-\"+r+\",-\"+e+\"h-\"+a+\"Z\"}},\"star-triangle-up\":{n:19,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),a=n.round(1.6*t,2),o=n.round(4*t,2),i=\"A \"+o+\",\"+o+\" 0 0 1 \";return\"M-\"+e+\",\"+r+i+e+\",\"+r+i+\"0,-\"+a+i+\"-\"+e+\",\"+r+\"Z\"}},\"star-triangle-down\":{n:20,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),a=n.round(1.6*t,2),o=n.round(4*t,2),i=\"A \"+o+\",\"+o+\" 0 0 1 \";return\"M\"+e+\",-\"+r+i+\"-\"+e+\",-\"+r+i+\"0,\"+a+i+e+\",-\"+r+\"Z\"}},\"star-square\":{n:21,f:function(t){var e=n.round(1.1*t,2),r=n.round(2*t,2),a=\"A \"+r+\",\"+r+\" 0 0 1 \";return\"M-\"+e+\",-\"+e+a+\"-\"+e+\",\"+e+a+e+\",\"+e+a+e+\",-\"+e+a+\"-\"+e+\",-\"+e+\"Z\"}},\"star-diamond\":{n:22,f:function(t){var e=n.round(1.4*t,2),r=n.round(1.9*t,2),a=\"A \"+r+\",\"+r+\" 0 0 1 \";return\"M-\"+e+\",0\"+a+\"0,\"+e+a+e+\",0\"+a+\"0,-\"+e+a+\"-\"+e+\",0Z\"}},\"diamond-tall\":{n:23,f:function(t){var e=n.round(.7*t,2),r=n.round(1.4*t,2);return\"M0,\"+r+\"L\"+e+\",0L0,-\"+r+\"L-\"+e+\",0Z\"}},\"diamond-wide\":{n:24,f:function(t){var e=n.round(1.4*t,2),r=n.round(.7*t,2);return\"M0,\"+r+\"L\"+e+\",0L0,-\"+r+\"L-\"+e+\",0Z\"}},hourglass:{n:25,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"H-\"+e+\"L\"+e+\",-\"+e+\"H-\"+e+\"Z\"},noDot:!0},bowtie:{n:26,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"V-\"+e+\"L-\"+e+\",\"+e+\"V-\"+e+\"Z\"},noDot:!0},\"circle-cross\":{n:27,f:function(t){var e=n.round(t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"},needLine:!0,noDot:!0},\"circle-x\":{n:28,f:function(t){var e=n.round(t,2),r=n.round(t/Math.sqrt(2),2);return\"M\"+r+\",\"+r+\"L-\"+r+\",-\"+r+\"M\"+r+\",-\"+r+\"L-\"+r+\",\"+r+\"M\"+e+\",0A\"+e+\",\"+e+\" 0 1,1 0,-\"+e+\"A\"+e+\",\"+e+\" 0 0,1 \"+e+\",0Z\"},needLine:!0,noDot:!0},\"square-cross\":{n:29,f:function(t){var e=n.round(t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"},needLine:!0,noDot:!0},\"square-x\":{n:30,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e+\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e+\"M\"+e+\",\"+e+\"H-\"+e+\"V-\"+e+\"H\"+e+\"Z\"},needLine:!0,noDot:!0},\"diamond-cross\":{n:31,f:function(t){var e=n.round(1.3*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"ZM0,-\"+e+\"V\"+e+\"M-\"+e+\",0H\"+e},needLine:!0,noDot:!0},\"diamond-x\":{n:32,f:function(t){var e=n.round(1.3*t,2),r=n.round(.65*t,2);return\"M\"+e+\",0L0,\"+e+\"L-\"+e+\",0L0,-\"+e+\"ZM-\"+r+\",-\"+r+\"L\"+r+\",\"+r+\"M-\"+r+\",\"+r+\"L\"+r+\",-\"+r},needLine:!0,noDot:!0},\"cross-thin\":{n:33,f:function(t){var e=n.round(1.4*t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e},needLine:!0,noDot:!0},\"x-thin\":{n:34,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e+\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e},needLine:!0,noDot:!0},asterisk:{n:35,f:function(t){var e=n.round(1.2*t,2),r=n.round(.85*t,2);return\"M0,\"+e+\"V-\"+e+\"M\"+e+\",0H-\"+e+\"M\"+r+\",\"+r+\"L-\"+r+\",-\"+r+\"M\"+r+\",-\"+r+\"L-\"+r+\",\"+r},needLine:!0,noDot:!0},hash:{n:36,f:function(t){var e=n.round(t/2,2),r=n.round(t,2);return\"M\"+e+\",\"+r+\"V-\"+r+\"m-\"+r+\",0V\"+r+\"M\"+r+\",\"+e+\"H-\"+r+\"m0,-\"+r+\"H\"+r},needLine:!0},\"y-up\":{n:37,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+e+\",\"+a+\"L0,0M\"+e+\",\"+a+\"L0,0M0,-\"+r+\"L0,0\"},needLine:!0,noDot:!0},\"y-down\":{n:38,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+e+\",-\"+a+\"L0,0M\"+e+\",-\"+a+\"L0,0M0,\"+r+\"L0,0\"},needLine:!0,noDot:!0},\"y-left\":{n:39,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M\"+a+\",\"+e+\"L0,0M\"+a+\",-\"+e+\"L0,0M-\"+r+\",0L0,0\"},needLine:!0,noDot:!0},\"y-right\":{n:40,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),a=n.round(.8*t,2);return\"M-\"+a+\",\"+e+\"L0,0M-\"+a+\",-\"+e+\"L0,0M\"+r+\",0L0,0\"},needLine:!0,noDot:!0},\"line-ew\":{n:41,f:function(t){var e=n.round(1.4*t,2);return\"M\"+e+\",0H-\"+e},needLine:!0,noDot:!0},\"line-ns\":{n:42,f:function(t){var e=n.round(1.4*t,2);return\"M0,\"+e+\"V-\"+e},needLine:!0,noDot:!0},\"line-ne\":{n:43,f:function(t){var e=n.round(t,2);return\"M\"+e+\",-\"+e+\"L-\"+e+\",\"+e},needLine:!0,noDot:!0},\"line-nw\":{n:44,f:function(t){var e=n.round(t,2);return\"M\"+e+\",\"+e+\"L-\"+e+\",-\"+e},needLine:!0,noDot:!0}}},{d3:7}],51:[function(t,e,r){\"use strict\";e.exports={visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"percent\",\"constant\",\"sqrt\",\"data\"]},symmetric:{valType:\"boolean\"},array:{valType:\"data_array\"},arrayminus:{valType:\"data_array\"},value:{valType:\"number\",min:0,dflt:10},valueminus:{valType:\"number\",min:0,dflt:10},traceref:{valType:\"integer\",min:0,dflt:0},tracerefminus:{valType:\"integer\",min:0,dflt:0},copy_ystyle:{valType:\"boolean\"},copy_zstyle:{valType:\"boolean\"},color:{valType:\"color\"},thickness:{valType:\"number\",min:0,dflt:2},width:{valType:\"number\",min:0},_deprecated:{opacity:{valType:\"number\"}}}},{}],52:[function(t,e,r){\"use strict\";function n(t,e,r,n){var o=e[\"error_\"+n]||{},s=o.visible&&[\"linear\",\"log\"].indexOf(r.type)!==-1,c=[];if(s){for(var u=l(o),f=0;f<t.length;f++){var d=t[f],h=d[n];if(a(r.c2l(h))){var p=u(h,f);if(a(p[0])&&a(p[1])){var g=d[n+\"s\"]=h-p[0],v=d[n+\"h\"]=h+p[1];c.push(g,v)}}}i.expand(r,c,{padded:!0})}}var a=t(\"fast-isnumeric\"),o=t(\"../../registry\"),i=t(\"../../plots/cartesian/axes\"),l=t(\"./compute_error\");e.exports=function(t){for(var e=t.calcdata,r=0;r<e.length;r++){var a=e[r],l=a[0].trace;if(o.traceIs(l,\"errorBarsOK\")){var s=i.getFromId(t,l.xaxis),c=i.getFromId(t,l.yaxis);n(a,l,s,\"x\"),n(a,l,c,\"y\")}}}},{\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./compute_error\":53,\"fast-isnumeric\":10}],53:[function(t,e,r){\"use strict\";function n(t,e){return\"percent\"===t?function(t){return Math.abs(t*e/100)}:\"constant\"===t?function(){return Math.abs(e)}:\"sqrt\"===t?function(t){return Math.sqrt(Math.abs(t))}:void 0}e.exports=function(t){var e=t.type,r=t.symmetric;if(\"data\"===e){var a=t.array,o=t.arrayminus;return r||void 0===o?function(t,e){var r=+a[e];return[r,r]}:function(t,e){return[+o[e],+a[e]]}}var i=n(e,t.value),l=n(e,t.valueminus);return r||void 0===t.valueminus?function(t){var e=i(t);return[e,e]}:function(t){return[l(t),i(t)]}}},{}],54:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../registry\"),o=t(\"../../lib\"),i=t(\"./attributes\");e.exports=function(t,e,r,l){function s(t,e){return o.coerce(f,u,i,t,e)}var c=\"error_\"+l.axis,u=e[c]={},f=t[c]||{};if(s(\"visible\",void 0!==f.array||void 0!==f.value||\"sqrt\"===f.type)!==!1){var d=s(\"type\",\"array\"in f?\"data\":\"percent\"),h=!0;\"sqrt\"!==d&&(h=s(\"symmetric\",!((\"data\"===d?\"arrayminus\":\"valueminus\")in f))),\"data\"===d?(s(\"array\")||(u.array=[]),s(\"traceref\"),h||(s(\"arrayminus\")||(u.arrayminus=[]),s(\"tracerefminus\"))):\"percent\"!==d&&\"constant\"!==d||(s(\"value\"),h||s(\"valueminus\"));var p=\"copy_\"+l.inherit+\"style\";l.inherit&&(e[\"error_\"+l.inherit]||{}).visible&&s(p,!(f.color||n(f.thickness)||n(f.width))),l.inherit&&u[p]||(s(\"color\",r),s(\"thickness\"),s(\"width\",a.traceIs(e,\"gl3d\")?0:4))}}},{\"../../lib\":136,\"../../registry\":206,\"./attributes\":51,\"fast-isnumeric\":10}],55:[function(t,e,r){\"use strict\";var n=e.exports={};n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.calc=t(\"./calc\"),n.calcFromTrace=function(t,e){for(var r=t.x||[],a=t.y||[],o=r.length||a.length,i=new Array(o),l=0;l<o;l++)i[l]={x:r[l],y:a[l]};return i[0].trace=t,n.calc({calcdata:[i],_fullLayout:e}),i},n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.hoverInfo=function(t,e,r){(e.error_y||{}).visible&&(r.yerr=t.yh-t.y,e.error_y.symmetric||(r.yerrneg=t.y-t.ys)),(e.error_x||{}).visible&&(r.xerr=t.xh-t.x,e.error_x.symmetric||(r.xerrneg=t.x-t.xs))}},{\"./attributes\":51,\"./calc\":52,\"./defaults\":54,\"./plot\":56,\"./style\":57}],56:[function(t,e,r){\"use strict\";function n(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),o(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),o(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}var a=t(\"d3\"),o=t(\"fast-isnumeric\"),i=t(\"../../traces/scatter/subtypes\");e.exports=function(t,e,r){var l,s=e.xaxis,c=e.yaxis,u=r&&r.duration>0;t.each(function(t){var e,f=t[0].trace,d=f.error_x||{},h=f.error_y||{};f.ids&&(e=function(t){return t.id});var p=i.hasMarkers(f)&&f.marker.maxdisplayed>0;if(h.visible||d.visible){var g=a.select(this).selectAll(\"g.errorbar\").data(t,e);g.exit().remove(),g.style(\"opacity\",1);var v=g.enter().append(\"g\").classed(\"errorbar\",!0);u&&v.style(\"opacity\",0).transition().duration(r.duration).style(\"opacity\",1),g.each(function(t){var e=a.select(this),i=n(t,s,c);if(!p||t.vis){var f;if(h.visible&&o(i.x)&&o(i.yh)&&o(i.ys)){var g=h.width;f=\"M\"+(i.x-g)+\",\"+i.yh+\"h\"+2*g+\"m-\"+g+\",0V\"+i.ys,i.noYS||(f+=\"m-\"+g+\",0h\"+2*g);var v=e.select(\"path.yerror\");l=!v.size(),l?v=e.append(\"path\").classed(\"yerror\",!0):u&&(v=v.transition().duration(r.duration).ease(r.easing)),v.attr(\"d\",f)}if(d.visible&&o(i.y)&&o(i.xh)&&o(i.xs)){var m=(d.copy_ystyle?h:d).width;f=\"M\"+i.xh+\",\"+(i.y-m)+\"v\"+2*m+\"m0,-\"+m+\"H\"+i.xs,i.noXS||(f+=\"m0,-\"+m+\"v\"+2*m);var y=e.select(\"path.xerror\");l=!y.size(),l?y=e.append(\"path\").classed(\"xerror\",!0):u&&(y=y.transition().duration(r.duration).ease(r.easing)),y.attr(\"d\",f)}}})}})}},{\"../../traces/scatter/subtypes\":260,d3:7,\n",
|
|
"\"fast-isnumeric\":10}],57:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../color\");e.exports=function(t){t.each(function(t){var e=t[0].trace,r=e.error_y||{},o=e.error_x||{},i=n.select(this);i.selectAll(\"path.yerror\").style(\"stroke-width\",r.thickness+\"px\").call(a.stroke,r.color),o.copy_ystyle&&(o=r),i.selectAll(\"path.xerror\").style(\"stroke-width\",o.thickness+\"px\").call(a.stroke,o.color)})}},{\"../color\":25,d3:7}],58:[function(t,e,r){\"use strict\";var n=t(\"../../lib/extend\").extendFlat,a=t(\"../../plots/font_attributes\");e.exports={hoverlabel:{bgcolor:{valType:\"color\",arrayOk:!0},bordercolor:{valType:\"color\",arrayOk:!0},font:{family:n({},a.family,{arrayOk:!0}),size:n({},a.size,{arrayOk:!0}),color:n({},a.color,{arrayOk:!0})}}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195}],59:[function(t,e,r){\"use strict\";function n(t,e,r){Array.isArray(t)&&(e[0][r]=t)}var a=t(\"../../lib\"),o=t(\"../../registry\");e.exports=function(t){for(var e=t.calcdata,r=0;r<e.length;r++){var i=e[r],l=i[0].trace;if(l.hoverlabel){var s=o.traceIs(l,\"2dMap\")?n:a.mergeArray;s(l.hoverlabel.bgcolor,i,\"hbg\"),s(l.hoverlabel.bordercolor,i,\"hbc\"),s(l.hoverlabel.font.size,i,\"hts\"),s(l.hoverlabel.font.color,i,\"htc\"),s(l.hoverlabel.font.family,i,\"htf\")}}}},{\"../../lib\":136,\"../../registry\":206}],60:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");e.exports=function(t,e){function r(){t.emit(\"plotly_click\",{points:t._hoverdata,event:e})}var a=n.getComponentMethod(\"annotations\",\"onClick\")(t,t._hoverdata);t._hoverdata&&e&&e.target&&(a&&a.then?a.then(r):r(),e.stopImmediatePropagation&&e.stopImmediatePropagation())}},{\"../../registry\":206}],61:[function(t,e,r){\"use strict\";e.exports={MAXDIST:20,YANGLE:60,HOVERARROWSIZE:6,HOVERTEXTPAD:3,HOVERFONTSIZE:13,HOVERFONT:\"Arial, sans-serif\",HOVERMINTIME:50}},{}],62:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\"),o=t(\"./hoverlabel_defaults\");e.exports=function(t,e,r,i){function l(r,o){return n.coerce(t,e,a,r,o)}o(t,e,l,i.hoverlabel)}},{\"../../lib\":136,\"./attributes\":58,\"./hoverlabel_defaults\":65}],63:[function(t,e,r){\"use strict\";function n(t,e){return function(r){var n=t(r),a=e(r);return Math.sqrt(n*n+a*a)}}var a=t(\"./constants\");r.getSubplot=function(t){return t.subplot||t.xaxis+t.yaxis||t.geo},r.flat=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=e;return r},r.p2c=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=t[n].p2c(e);return r},r.getDistanceFunction=function(t,e,r,a){return\"closest\"===t?a||n(e,r):\"x\"===t?e:r},r.getClosest=function(t,e,r){if(r.index!==!1)r.index>=0&&r.index<t.length?r.distance=0:r.index=!1;else for(var n=0;n<t.length;n++){var a=e(t[n]);a<=r.distance&&(r.index=n,r.distance=a)}return r},r.inbox=function(t,e){return t*e<0||0===t?a.MAXDIST*(.6-.3/Math.max(3,Math.abs(t-e))):1/0}},{\"./constants\":61}],64:[function(t,e,r){\"use strict\";function n(t,e,r){if(\"pie\"===r||\"sankey\"===r)return void t.emit(\"plotly_hover\",{event:e.originalEvent,points:[e]});r||(r=\"xy\");var n=Array.isArray(r)?r:[r],d=t._fullLayout,g=d._plots||[],m=g[r];if(m){var M=m.overlays.map(function(t){return t.id});n=n.concat(M)}for(var A=n.length,T=new Array(A),L=new Array(A),C=0;C<A;C++){var S=n[C],z=g[S];if(z)T[C]=b.getFromId(t,z.xaxis._id),L[C]=b.getFromId(t,z.yaxis._id);else{var O=d[S]._subplot;T[C]=O.xaxis,L[C]=O.yaxis}}var D=e.hovermode||d.hovermode;if([\"x\",\"y\",\"closest\"].indexOf(D)===-1||!t.calcdata||t.querySelector(\".zoombox\")||t._dragging)return x.unhoverRaw(t,e);var P,E,N,I,R,F,j,B,q,H,V,U,X,G=[],Y=[];if(Array.isArray(e))for(D=\"array\",N=0;N<e.length;N++)R=t.calcdata[e[N].curveNumber||0],\"skip\"!==R[0].trace.hoverinfo&&Y.push(R);else{for(I=0;I<t.calcdata.length;I++)R=t.calcdata[I],F=R[0].trace,\"skip\"!==F.hoverinfo&&n.indexOf(w.getSubplot(F))!==-1&&Y.push(R);var Z,W,$=!e.target;if($)Z=\"xpx\"in e?e.xpx:T[0]._length/2,W=\"ypx\"in e?e.ypx:L[0]._length/2;else{if(p.triggerHandler(t,\"plotly_beforehover\",e)===!1)return;var Q=e.target.getBoundingClientRect();if(Z=e.clientX-Q.left,W=e.clientY-Q.top,Z<0||Z>Q.width||W<0||W>Q.height)return x.unhoverRaw(t,e)}if(P=\"xval\"in e?w.flat(n,e.xval):w.p2c(T,Z),E=\"yval\"in e?w.flat(n,e.yval):w.p2c(L,W),!f(P[0])||!f(E[0]))return h.warn(\"Fx.hover failed\",e,t),x.unhoverRaw(t,e)}var J=1/0;for(I=0;I<Y.length;I++)if((R=Y[I])&&R[0]&&R[0].trace&&R[0].trace.visible===!0&&(F=R[0].trace,[\"carpet\",\"contourcarpet\"].indexOf(F._module.name)===-1)){if(j=w.getSubplot(F),B=n.indexOf(j),q=D,U={cd:R,trace:F,xa:T[B],ya:L[B],name:t.data.length>1||F.hoverinfo.indexOf(\"name\")!==-1?F.name:void 0,index:!1,distance:Math.min(J,k.MAXDIST),color:y.defaultLine,x0:void 0,x1:void 0,y0:void 0,y1:void 0,xLabelVal:void 0,yLabelVal:void 0,zLabelVal:void 0,text:void 0},d[j]&&(U.subplot=d[j]._subplot),X=G.length,\"array\"===q){var K=e[I];\"pointNumber\"in K?(U.index=K.pointNumber,q=\"closest\"):(q=\"\",\"xval\"in K&&(H=K.xval,q=\"x\"),\"yval\"in K&&(V=K.yval,q=q?\"closest\":\"y\"))}else H=P[B],V=E[B];if(F._module&&F._module.hoverPoints){var tt=F._module.hoverPoints(U,H,V,q);if(tt)for(var et,rt=0;rt<tt.length;rt++)et=tt[rt],f(et.x0)&&f(et.y0)&&G.push(l(et,D))}else h.log(\"Unrecognized trace type in hover:\",F);\"closest\"===D&&G.length>X&&(G.splice(0,X),J=G[0].distance)}if(0===G.length)return x.unhoverRaw(t,e);G.sort(function(t,e){return t.distance-e.distance});var nt=t._hoverdata,at=[];for(N=0;N<G.length;N++){var ot=G[N],it={data:ot.trace._input,fullData:ot.trace,curveNumber:ot.trace.index,pointNumber:ot.index};ot.trace._module.eventData?it=ot.trace._module.eventData(it,ot):(it.x=ot.xVal,it.y=ot.yVal,it.xaxis=ot.xa,it.yaxis=ot.ya,void 0!==ot.zLabelVal&&(it.z=ot.zLabelVal)),at.push(it)}if(t._hoverdata=at,c(t,e,nt)&&d._hasCartesian){s(G,{hovermode:D,fullLayout:d,container:d._hoverlayer,outerContainer:d._paperdiv})}var lt=\"y\"===D&&Y.length>1,st=y.combine(d.plot_bgcolor||y.background,d.paper_bgcolor),ct={hovermode:D,rotateLabels:lt,bgColor:st,container:d._hoverlayer,outerContainer:d._paperdiv,commonLabelOpts:d.hoverlabel},ut=a(G,ct);if(o(G,lt?\"xa\":\"ya\"),i(ut,lt),e.target&&e.target.tagName){var ft=_.getComponentMethod(\"annotations\",\"hasClickToShow\")(t,at);v(u.select(e.target),ft?\"pointer\":\"\")}e.target&&c(t,e,nt)&&(nt&&t.emit(\"plotly_unhover\",{event:e,points:nt}),t.emit(\"plotly_hover\",{event:e,points:t._hoverdata,xaxes:T,yaxes:L,xvals:P,yvals:E}))}function a(t,e){var r,n,a=e.hovermode,o=e.rotateLabels,i=e.bgColor,l=e.container,s=e.outerContainer,c=e.commonLabelOpts||{},f=e.fontFamily||k.HOVERFONT,d=e.fontSize||k.HOVERFONTSIZE,h=t[0],p=h.xa,v=h.ya,x=\"y\"===a?\"yLabel\":\"xLabel\",b=h[x],_=(String(b)||\"\").split(\" \")[0],w=s.node().getBoundingClientRect(),A=w.top,T=w.width,L=w.height,C=h.distance<=k.MAXDIST&&(\"x\"===a||\"y\"===a);for(r=0;r<t.length;r++){n=t[r].trace.hoverinfo;var O=n.split(\"+\");if(O.indexOf(\"all\")===-1&&O.indexOf(a)===-1){C=!1;break}}var D=l.selectAll(\"g.axistext\").data(C?[0]:[]);D.enter().append(\"g\").classed(\"axistext\",!0),D.exit().remove(),D.each(function(){var e=u.select(this),r=e.selectAll(\"path\").data([0]),n=e.selectAll(\"text\").data([0]);r.enter().append(\"path\").style({fill:c.bgcolor||y.defaultLine,stroke:c.bordercolor||y.background,\"stroke-width\":\"1px\"}),n.enter().append(\"text\").call(m.font,c.font.family||f,c.font.size||d,c.font.color||y.background).attr(\"data-notex\",1),n.text(b).call(g.convertToTspans).call(m.setPosition,0,0).selectAll(\"tspan.line\").call(m.setPosition,0,0),e.attr(\"transform\",\"\");var o=n.node().getBoundingClientRect();if(\"x\"===a){n.attr(\"text-anchor\",\"middle\").call(m.setPosition,0,\"top\"===p.side?A-o.bottom-S-z:A-o.top+S+z).selectAll(\"tspan.line\").attr({x:n.attr(\"x\"),y:n.attr(\"y\")});var i=\"top\"===p.side?\"-\":\"\";r.attr(\"d\",\"M0,0L\"+S+\",\"+i+S+\"H\"+(z+o.width/2)+\"v\"+i+(2*z+o.height)+\"H-\"+(z+o.width/2)+\"V\"+i+S+\"H-\"+S+\"Z\"),e.attr(\"transform\",\"translate(\"+(p._offset+(h.x0+h.x1)/2)+\",\"+(v._offset+(\"top\"===p.side?0:v._length))+\")\")}else{n.attr(\"text-anchor\",\"right\"===v.side?\"start\":\"end\").call(m.setPosition,(\"right\"===v.side?1:-1)*(z+S),A-o.top-o.height/2).selectAll(\"tspan.line\").attr({x:n.attr(\"x\"),y:n.attr(\"y\")});var l=\"right\"===v.side?\"\":\"-\";r.attr(\"d\",\"M0,0L\"+l+S+\",\"+S+\"V\"+(z+o.height/2)+\"h\"+l+(2*z+o.width)+\"V-\"+(z+o.height/2)+\"H\"+l+S+\"V-\"+S+\"Z\"),e.attr(\"transform\",\"translate(\"+(p._offset+(\"right\"===v.side?p._length:0))+\",\"+(v._offset+(h.y0+h.y1)/2)+\")\")}t=t.filter(function(t){return void 0!==t.zLabelVal||(t[x]||\"\").split(\" \")[0]===_})});var P=l.selectAll(\"g.hovertext\").data(t,function(t){return[t.trace.index,t.index,t.x0,t.y0,t.name,t.attr,t.xa,t.ya||\"\"].join(\",\")});return P.enter().append(\"g\").classed(\"hovertext\",!0).each(function(){var t=u.select(this);t.append(\"rect\").call(y.fill,y.addOpacity(i,.8)),t.append(\"text\").classed(\"name\",!0),t.append(\"path\").style(\"stroke-width\",\"1px\"),t.append(\"text\").classed(\"nums\",!0).call(m.font,f,d)}),P.exit().remove(),P.each(function(t){var e=u.select(this).attr(\"transform\",\"\"),r=\"\",n=\"\",l=y.opacity(t.color)?t.color:y.defaultLine,s=y.combine(l,i),c=t.borderColor||y.contrast(s);void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(r=g.plainText(t.name||\"\"),r.length>15&&(r=r.substr(0,12)+\"...\")),void 0!==t.extraText&&(n+=t.extraText),void 0!==t.zLabel?(void 0!==t.xLabel&&(n+=\"x: \"+t.xLabel+\"<br>\"),void 0!==t.yLabel&&(n+=\"y: \"+t.yLabel+\"<br>\"),n+=(n?\"z: \":\"\")+t.zLabel):C&&t[a+\"Label\"]===b?n=t[(\"x\"===a?\"y\":\"x\")+\"Label\"]||\"\":void 0===t.xLabel?void 0!==t.yLabel&&(n=t.yLabel):n=void 0===t.yLabel?t.xLabel:\"(\"+t.xLabel+\", \"+t.yLabel+\")\",t.text&&!Array.isArray(t.text)&&(n+=(n?\"<br>\":\"\")+t.text),\"\"===n&&(\"\"===r&&e.remove(),n=r);var h=e.select(\"text.nums\").call(m.font,t.fontFamily||f,t.fontSize||d,t.fontColor||c).call(m.setPosition,0,0).text(n).attr(\"data-notex\",1).call(g.convertToTspans);h.selectAll(\"tspan.line\").call(m.setPosition,0,0);var p=e.select(\"text.name\"),v=0;r&&r!==n?(p.call(m.font,t.fontFamily||f,t.fontSize||d,s).text(r).call(m.setPosition,0,0).attr(\"data-notex\",1).call(g.convertToTspans),p.selectAll(\"tspan.line\").call(m.setPosition,0,0),v=p.node().getBoundingClientRect().width+2*z):(p.remove(),e.select(\"rect\").remove()),e.select(\"path\").style({fill:s,stroke:c});var x,_,w=h.node().getBoundingClientRect(),k=t.xa._offset+(t.x0+t.x1)/2,O=t.ya._offset+(t.y0+t.y1)/2,D=Math.abs(t.x1-t.x0),P=Math.abs(t.y1-t.y0),E=w.width+S+z+v;t.ty0=A-w.top,t.bx=w.width+2*z,t.by=w.height+2*z,t.anchor=\"start\",t.txwidth=w.width,t.tx2width=v,t.offset=0,o?(t.pos=k,x=O+P/2+E<=L,_=O-P/2-E>=0,\"top\"!==t.idealAlign&&x||!_?x?(O+=P/2,t.anchor=\"start\"):t.anchor=\"middle\":(O-=P/2,t.anchor=\"end\")):(t.pos=O,x=k+D/2+E<=T,_=k-D/2-E>=0,\"left\"!==t.idealAlign&&x||!_?x?(k+=D/2,t.anchor=\"start\"):t.anchor=\"middle\":(k-=D/2,t.anchor=\"end\")),h.attr(\"text-anchor\",t.anchor),v&&p.attr(\"text-anchor\",t.anchor),e.attr(\"transform\",\"translate(\"+k+\",\"+O+\")\"+(o?\"rotate(\"+M+\")\":\"\"))}),P}function o(t,e){function r(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;n=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;n=!1}if(n){var c=0;for(i=0;i<t.length;i++)s=t[i],s.pos+s.dp+s.size>e.pmax&&c++;for(i=t.length-1;i>=0&&!(c<=0);i--)s=t[i],s.pos>e.pmax-1&&(s.del=!0,c--);for(i=0;i<t.length&&!(c<=0);i++)if(s=t[i],s.pos<e.pmin+1)for(s.del=!0,c--,o=2*s.size,l=t.length-1;l>=0;l--)t[l].dp-=o;for(i=t.length-1;i>=0&&!(c<=0);i--)s=t[i],s.pos+s.dp+s.size>e.pmax&&(s.del=!0,c--)}}}for(var n,a,o,i,l,s,c,u=0,f=t.map(function(t,r){var n=t[e];return[{i:r,dp:0,pos:t.pos,posref:t.posref,size:t.by*(\"x\"===n._id.charAt(0)?T:1)/2,pmin:n._offset,pmax:n._offset+n._length}]}).sort(function(t,e){return t[0].posref-e[0].posref});!n&&u<=t.length;){for(u++,n=!0,i=0;i<f.length-1;){var d=f[i],h=f[i+1],p=d[d.length-1],g=h[0];if((a=p.pos+p.dp+p.size-g.pos-g.dp+g.size)>.01&&p.pmin===g.pmin&&p.pmax===g.pmax){for(l=h.length-1;l>=0;l--)h[l].dp+=a;for(d.push.apply(d,h),f.splice(i+1,1),c=0,l=d.length-1;l>=0;l--)c+=d[l].dp;for(o=c/d.length,l=d.length-1;l>=0;l--)d[l].dp-=o;n=!1}else i++}f.forEach(r)}for(i=f.length-1;i>=0;i--){var v=f[i];for(l=v.length-1;l>=0;l--){var m=v[l],y=t[m.i];y.offset=m.dp,y.del=m.del}}}function i(t,e){t.each(function(t){var r=u.select(this);if(t.del)return void r.remove();var n=\"end\"===t.anchor?-1:1,a=r.select(\"text.nums\"),o={start:1,end:-1,middle:0}[t.anchor],i=o*(S+z),l=i+o*(t.txwidth+z),s=0,c=t.offset;\"middle\"===t.anchor&&(i-=t.tx2width/2,l-=t.tx2width/2),e&&(c*=-C,s=t.offset*L),r.select(\"path\").attr(\"d\",\"middle\"===t.anchor?\"M-\"+t.bx/2+\",-\"+t.by/2+\"h\"+t.bx+\"v\"+t.by+\"h-\"+t.bx+\"Z\":\"M0,0L\"+(n*S+s)+\",\"+(S+c)+\"v\"+(t.by/2-S)+\"h\"+n*t.bx+\"v-\"+t.by+\"H\"+(n*S+s)+\"V\"+(c-S)+\"Z\"),a.call(m.setPosition,i+s,c+t.ty0-t.by/2+z).selectAll(\"tspan.line\").attr({x:a.attr(\"x\"),y:a.attr(\"y\")}),t.tx2width&&(r.select(\"text.name, text.name tspan.line\").call(m.setPosition,l+o*z+s,c+t.ty0-t.by/2+z),r.select(\"rect\").call(m.setRect,l+(o-1)*t.tx2width/2+s,c-t.by/2-1,t.tx2width,t.by+2))})}function l(t,e){function r(e,r,i){var l;if(o[r])l=o[r];else if(a[r]){var s=a[r];Array.isArray(s)&&Array.isArray(s[t.index[0]])&&(l=s[t.index[0]][t.index[1]])}else l=h.nestedProperty(n,i).get();l&&(t[e]=l)}var n=t.trace||{},a=t.cd[0],o=t.cd[t.index]||{};t.posref=\"y\"===e?(t.x0+t.x1)/2:(t.y0+t.y1)/2,t.x0=h.constrain(t.x0,0,t.xa._length),t.x1=h.constrain(t.x1,0,t.xa._length),t.y0=h.constrain(t.y0,0,t.ya._length),t.y1=h.constrain(t.y1,0,t.ya._length);var i;if(void 0!==t.xLabelVal){i=\"log\"===t.xa.type&&t.xLabelVal<=0;var l=b.tickText(t.xa,t.xa.c2l(i?-t.xLabelVal:t.xLabelVal),\"hover\");i?0===t.xLabelVal?t.xLabel=\"0\":t.xLabel=\"-\"+l.text:t.xLabel=l.text,t.xVal=t.xa.c2d(t.xLabelVal)}if(void 0!==t.yLabelVal){i=\"log\"===t.ya.type&&t.yLabelVal<=0;var s=b.tickText(t.ya,t.ya.c2l(i?-t.yLabelVal:t.yLabelVal),\"hover\");i?0===t.yLabelVal?t.yLabel=\"0\":t.yLabel=\"-\"+s.text:t.yLabel=s.text,t.yVal=t.ya.c2d(t.yLabelVal)}if(void 0!==t.zLabelVal&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||\"log\"===t.xa.type&&t.xerr<=0)){var c=b.tickText(t.xa,t.xa.c2l(t.xerr),\"hover\").text;void 0!==t.xerrneg?t.xLabel+=\" +\"+c+\" / -\"+b.tickText(t.xa,t.xa.c2l(t.xerrneg),\"hover\").text:t.xLabel+=\" \\xb1 \"+c,\"x\"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||\"log\"===t.ya.type&&t.yerr<=0)){var u=b.tickText(t.ya,t.ya.c2l(t.yerr),\"hover\").text;void 0!==t.yerrneg?t.yLabel+=\" +\"+u+\" / -\"+b.tickText(t.ya,t.ya.c2l(t.yerrneg),\"hover\").text:t.yLabel+=\" \\xb1 \"+u,\"y\"===e&&(t.distance+=1)}var f=t.trace.hoverinfo;return\"all\"!==f&&(f=f.split(\"+\"),f.indexOf(\"x\")===-1&&(t.xLabel=void 0),f.indexOf(\"y\")===-1&&(t.yLabel=void 0),f.indexOf(\"z\")===-1&&(t.zLabel=void 0),f.indexOf(\"text\")===-1&&(t.text=void 0),f.indexOf(\"name\")===-1&&(t.name=void 0)),r(\"color\",\"hbg\",\"hoverlabel.bgcolor\"),r(\"borderColor\",\"hbc\",\"hoverlabel.bordercolor\"),r(\"fontFamily\",\"htf\",\"hoverlabel.font.family\"),r(\"fontSize\",\"hts\",\"hoverlabel.font.size\"),r(\"fontColor\",\"htc\",\"hoverlabel.font.color\"),t}function s(t,e){var r=e.hovermode,n=e.container,a=t[0],o=a.xa,i=a.ya,l=o.showspikes,s=i.showspikes;if(n.selectAll(\".spikeline\").remove(),\"closest\"===r&&(l||s)){var c=e.fullLayout,u=o._offset+(a.x0+a.x1)/2,f=i._offset+(a.y0+a.y1)/2,h=y.combine(c.plot_bgcolor,c.paper_bgcolor),p=d.readability(a.color,h)<1.5?y.contrast(h):a.color;if(s){var g=i.spikemode,v=i.spikethickness,x=i.spikecolor||p,b=i._boundingBox,_=(b.left+b.right)/2<u?b.right:b.left;if(g.indexOf(\"toaxis\")!==-1||g.indexOf(\"across\")!==-1){var w=_,k=u;g.indexOf(\"across\")!==-1&&(w=i._counterSpan[0],k=i._counterSpan[1]),n.append(\"line\").attr({x1:w,x2:k,y1:f,y2:f,\"stroke-width\":v+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0),n.append(\"line\").attr({x1:w,x2:k,y1:f,y2:f,\"stroke-width\":v,stroke:x,\"stroke-dasharray\":m.dashStyle(i.spikedash,v)}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}g.indexOf(\"marker\")!==-1&&n.append(\"circle\").attr({cx:_+(\"right\"!==i.side?v:-v),cy:f,r:v,fill:x}).classed(\"spikeline\",!0)}if(l){var M=o.spikemode,A=o.spikethickness,T=o.spikecolor||p,L=o._boundingBox,C=(L.top+L.bottom)/2<f?L.bottom:L.top;if(M.indexOf(\"toaxis\")!==-1||M.indexOf(\"across\")!==-1){var S=C,z=f;M.indexOf(\"across\")!==-1&&(S=o._counterSpan[0],z=o._counterSpan[1]),n.append(\"line\").attr({x1:u,x2:u,y1:S,y2:z,\"stroke-width\":A+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0),n.append(\"line\").attr({x1:u,x2:u,y1:S,y2:z,\"stroke-width\":A,stroke:T,\"stroke-dasharray\":m.dashStyle(o.spikedash,A)}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}M.indexOf(\"marker\")!==-1&&n.append(\"circle\").attr({cx:u,cy:C-(\"top\"!==o.side?A:-A),r:A,fill:T}).classed(\"spikeline\",!0)}}}function c(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var a=r[n],o=t._hoverdata[n];if(a.curveNumber!==o.curveNumber||String(a.pointNumber)!==String(o.pointNumber))return!0}return!1}var u=t(\"d3\"),f=t(\"fast-isnumeric\"),d=t(\"tinycolor2\"),h=t(\"../../lib\"),p=t(\"../../lib/events\"),g=t(\"../../lib/svg_text_utils\"),v=t(\"../../lib/override_cursor\"),m=t(\"../drawing\"),y=t(\"../color\"),x=t(\"../dragelement\"),b=t(\"../../plots/cartesian/axes\"),_=t(\"../../registry\"),w=t(\"./helpers\"),k=t(\"./constants\"),M=k.YANGLE,A=Math.PI*M/180,T=1/Math.sin(A),L=Math.cos(A),C=Math.sin(A),S=k.HOVERARROWSIZE,z=k.HOVERTEXTPAD;r.hover=function(t,e,r){if(\"string\"==typeof t&&(t=document.getElementById(t)),void 0===t._lastHoverTime&&(t._lastHoverTime=0),void 0!==t._hoverTimer&&(clearTimeout(t._hoverTimer),t._hoverTimer=void 0),Date.now()>t._lastHoverTime+k.HOVERMINTIME)return n(t,e,r),void(t._lastHoverTime=Date.now());t._hoverTimer=setTimeout(function(){n(t,e,r),t._lastHoverTime=Date.now(),t._hoverTimer=void 0},k.HOVERMINTIME)},r.loneHover=function(t,e){var r={color:t.color||y.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,trace:{index:0,hoverinfo:\"\"},xa:{_offset:0},ya:{_offset:0},index:0},n=u.select(e.container),o=e.outerContainer?u.select(e.outerContainer):n,l={hovermode:\"closest\",rotateLabels:!1,bgColor:e.bgColor||y.background,container:n,outerContainer:o},s=a([r],l);return i(s,l.rotateLabels),s.node()}},{\"../../lib\":136,\"../../lib/events\":131,\"../../lib/override_cursor\":145,\"../../lib/svg_text_utils\":153,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":61,\"./helpers\":63,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],65:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e,r,a){a=a||{},r(\"hoverlabel.bgcolor\",a.bgcolor),r(\"hoverlabel.bordercolor\",a.bordercolor),n.coerceFont(r,\"hoverlabel.font\",a.font)}},{\"../../lib\":136}],66:[function(t,e,r){\"use strict\";function n(t){var e=i.isD3Selection(t)?t:o.select(t);e.selectAll(\"g.hovertext\").remove(),e.selectAll(\".spikeline\").remove()}function a(t,e,r){var n=t.hoverlabel||{},a=i.nestedProperty(n,r).get();return Array.isArray(a)?Array.isArray(e)&&Array.isArray(a[e[0]])?a[e[0]][e[1]]:a[e]:a}var o=t(\"d3\"),i=t(\"../../lib\"),l=t(\"../dragelement\"),s=t(\"./helpers\"),c=t(\"./layout_attributes\");e.exports={moduleType:\"component\",name:\"fx\",constants:t(\"./constants\"),schema:{layout:c},attributes:t(\"./attributes\"),layoutAttributes:c,supplyLayoutGlobalDefaults:t(\"./layout_global_defaults\"),supplyDefaults:t(\"./defaults\"),supplyLayoutDefaults:t(\"./layout_defaults\"),calc:t(\"./calc\"),getDistanceFunction:s.getDistanceFunction,getClosest:s.getClosest,inbox:s.inbox,castHoverOption:a,hover:t(\"./hover\").hover,unhover:l.unhover,loneHover:t(\"./hover\").loneHover,loneUnhover:n,click:t(\"./click\")}},{\"../../lib\":136,\"../dragelement\":46,\"./attributes\":58,\"./calc\":59,\"./click\":60,\"./constants\":61,\"./defaults\":62,\"./helpers\":63,\"./hover\":64,\"./layout_attributes\":67,\"./layout_defaults\":68,\"./layout_global_defaults\":69,d3:7}],67:[function(t,e,r){\"use strict\";var n=t(\"../../lib/extend\").extendFlat,a=t(\"../../plots/font_attributes\"),o=t(\"./constants\");e.exports={dragmode:{valType:\"enumerated\",values:[\"zoom\",\"pan\",\"select\",\"lasso\",\"orbit\",\"turntable\"],dflt:\"zoom\"},hovermode:{valType:\"enumerated\",values:[\"x\",\"y\",\"closest\",!1]},hoverlabel:{bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\"},font:{family:n({},a.family,{dflt:o.HOVERFONT}),size:n({},a.size,{dflt:o.HOVERFONTSIZE}),color:n({},a.color)}}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"./constants\":61}],68:[function(t,e,r){\"use strict\";function n(t){for(var e=!0,r=0;r<t.length;r++){if(\"h\"!==t[r].orientation){e=!1;break}}return e}var a=t(\"../../lib\"),o=t(\"./layout_attributes\");e.exports=function(t,e,r){function i(r,n){return a.coerce(t,e,o,r,n)}i(\"dragmode\");var l;e._has(\"cartesian\")?(e._isHoriz=n(r),l=e._isHoriz?\"y\":\"x\"):l=\"closest\",i(\"hovermode\",l)}},{\"../../lib\":136,\"./layout_attributes\":67}],69:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./hoverlabel_defaults\"),o=t(\"./layout_attributes\");e.exports=function(t,e){function r(r,a){return n.coerce(t,e,o,r,a)}a(t,e,r)}},{\"../../lib\":136,\"./hoverlabel_defaults\":65,\"./layout_attributes\":67}],70:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/constants\");e.exports={_isLinkedToArray:\"image\",visible:{valType:\"boolean\",dflt:!0},source:{valType:\"string\"},layer:{valType:\"enumerated\",values:[\"below\",\"above\"],dflt:\"above\"},sizex:{valType:\"number\",dflt:0},sizey:{valType:\"number\",dflt:0},sizing:{valType:\"enumerated\",values:[\"fill\",\"contain\",\"stretch\"],dflt:\"contain\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},x:{valType:\"any\",dflt:0},y:{valType:\"any\",dflt:0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"top\"},xref:{valType:\"enumerated\",values:[\"paper\",n.idRegex.x.toString()],dflt:\"paper\"},yref:{valType:\"enumerated\",values:[\"paper\",n.idRegex.y.toString()],dflt:\"paper\"}}},{\"../../plots/cartesian/constants\":176}],71:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib/to_log_range\");e.exports=function(t,e,r,o){e=e||{};var i=\"log\"===r&&\"linear\"===e.type,l=\"linear\"===r&&\"log\"===e.type;if(i||l)for(var s,c,u=t._fullLayout.images,f=e._id.charAt(0),d=0;d<u.length;d++)if(s=u[d],c=\"images[\"+d+\"].\",s[f+\"ref\"]===e._id){var h=s[f],p=s[\"size\"+f],g=null,v=null;if(i){g=a(h,e.range);var m=p/Math.pow(10,g)/2;v=2*Math.log(m+Math.sqrt(1+m*m))/Math.LN10}else g=Math.pow(10,h),v=g*(Math.pow(10,p/2)-Math.pow(10,-p/2));n(g)?n(v)||(v=null):(g=null,v=null),o(c+f,g),o(c+\"size\"+f,v)}}},{\"../../lib/to_log_range\":154,\"fast-isnumeric\":10}],72:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return a.coerce(t,e,l,r,n)}if(!n(\"visible\",!!n(\"source\")))return e;n(\"layer\"),n(\"xanchor\"),n(\"yanchor\"),n(\"sizex\"),n(\"sizey\"),n(\"sizing\"),n(\"opacity\");for(var i={_fullLayout:r},s=[\"x\",\"y\"],c=0;c<2;c++){var u=s[c],f=o.coerceRef(t,e,i,u,\"paper\");o.coercePosition(e,i,n,f,u,0)}return e}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\");e.exports=function(t,e){i(t,e,{name:\"images\",handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"../../plots/cartesian/axes\":171,\"./attributes\":70}],73:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../drawing\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"../../constants/xmlns_namespaces\");e.exports=function(t){function e(e){var r=n.select(this);if(!this.img||this.img.src!==e.source){r.attr(\"xmlns\",i.svg);var a=new Promise(function(t){function n(){r.remove(),t()}var a=new Image;this.img=a,a.setAttribute(\"crossOrigin\",\"anonymous\"),a.onerror=n,a.onload=function(){var e=document.createElement(\"canvas\");e.width=this.width,e.height=this.height,e.getContext(\"2d\").drawImage(this,0,0);var n=e.toDataURL(\"image/png\");r.attr(\"xlink:href\",n),t()},r.on(\"error\",n),a.src=e.source}.bind(this));t._promises.push(a)}}function r(e){var r=n.select(this),i=o.getFromId(t,e.xref),l=o.getFromId(t,e.yref),s=c._size,u=i?Math.abs(i.l2p(e.sizex)-i.l2p(0)):e.sizex*s.w,f=l?Math.abs(l.l2p(e.sizey)-l.l2p(0)):e.sizey*s.h,d=u*g.x[e.xanchor].offset,h=f*g.y[e.yanchor].offset,p=g.x[e.xanchor].sizing+g.y[e.yanchor].sizing,v=(i?i.r2p(e.x)+i._offset:e.x*s.w+s.l)+d,m=(l?l.r2p(e.y)+l._offset:s.h-e.y*s.h+s.t)+h;switch(e.sizing){case\"fill\":p+=\" slice\";break;case\"stretch\":p=\"none\"}r.attr({x:v,y:m,width:u,height:f,preserveAspectRatio:p,opacity:e.opacity});var y=i?i._id:\"\",x=l?l._id:\"\",b=y+x;r.call(a.setClipUrl,b?\"clip\"+c._uid+b:null)}var l,s,c=t._fullLayout,u=[],f={},d=[];for(s=0;s<c.images.length;s++){var h=c.images[s];if(h.visible)if(\"below\"===h.layer&&\"paper\"!==h.xref&&\"paper\"!==h.yref){l=h.xref+h.yref;var p=c._plots[l];if(!p){d.push(h);continue}p.mainplot&&(l=p.mainplot.id),f[l]||(f[l]=[]),f[l].push(h)}else\"above\"===h.layer?u.push(h):d.push(h)}var g={x:{left:{sizing:\"xMin\",offset:0},center:{sizing:\"xMid\",offset:-.5},right:{sizing:\"xMax\",offset:-1}},y:{top:{sizing:\"YMin\",offset:0},middle:{sizing:\"YMid\",offset:-.5},bottom:{sizing:\"YMax\",offset:-1}}},v=c._imageLowerLayer.selectAll(\"image\").data(d),m=c._imageUpperLayer.selectAll(\"image\").data(u);v.enter().append(\"image\"),m.enter().append(\"image\"),v.exit().remove(),m.exit().remove(),v.each(function(t){e.bind(this)(t),r.bind(this)(t)}),m.each(function(t){e.bind(this)(t),r.bind(this)(t)});var y=Object.keys(c._plots);for(s=0;s<y.length;s++){l=y[s];var x=c._plots[l];if(x.imagelayer){var b=x.imagelayer.selectAll(\"image\").data(f[l]||[]);b.enter().append(\"image\"),b.exit().remove(),b.each(function(t){e.bind(this)(t),r.bind(this)(t)})}}}},{\"../../constants/xmlns_namespaces\":124,\"../../plots/cartesian/axes\":171,\"../drawing\":49,d3:7}],74:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"images\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\"),convertCoords:t(\"./convert_coords\")}},{\"./attributes\":70,\"./convert_coords\":71,\"./defaults\":72,\"./draw\":73}],75:[function(t,e,r){\"use strict\";r.isRightAnchor=function(t){return\"right\"===t.xanchor||\"auto\"===t.xanchor&&t.x>=2/3},r.isCenterAnchor=function(t){return\"center\"===t.xanchor||\"auto\"===t.xanchor&&t.x>1/3&&t.x<2/3},r.isBottomAnchor=function(t){return\"bottom\"===t.yanchor||\"auto\"===t.yanchor&&t.y<=1/3},r.isMiddleAnchor=function(t){return\"middle\"===t.yanchor||\"auto\"===t.yanchor&&t.y>1/3&&t.y<2/3}},{}],76:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat;e.exports={bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.defaultLine},borderwidth:{valType:\"number\",min:0,dflt:0},font:o({},n,{}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"v\"},traceorder:{valType:\"flaglist\",flags:[\"reversed\",\"grouped\"],extras:[\"normal\"]},tracegroupgap:{valType:\"number\",min:0,dflt:10},x:{valType:\"number\",min:-2,max:3,dflt:1.02},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\"}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../color/attributes\":24}],77:[function(t,e,r){\"use strict\";e.exports={scrollBarWidth:4,scrollBarHeight:20,scrollBarColor:\"#808BA4\",scrollBarMargin:4}},{}],78:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../lib\"),o=t(\"./attributes\"),i=t(\"../../plots/layout_attributes\"),l=t(\"./helpers\");e.exports=function(t,e,r){function s(t,e){return a.coerce(h,p,o,t,e)}for(var c,u,f,d,h=t.legend||{},p=e.legend={},g=0,v=\"normal\",m=0;m<r.length;m++){var y=r[m];l.legendGetsTrace(y)&&(g++,n.traceIs(y,\"pie\")&&g++),(n.traceIs(y,\"bar\")&&\"stack\"===e.barmode||[\"tonextx\",\"tonexty\"].indexOf(y.fill)!==-1)&&(v=l.isGrouped({traceorder:v})?\"grouped+reversed\":\"reversed\"),void 0!==y.legendgroup&&\"\"!==y.legendgroup&&(v=l.isReversed({traceorder:v})?\"reversed+grouped\":\"grouped\")}if(a.coerce(t,e,i,\"showlegend\",g>1)!==!1){if(s(\"bgcolor\",e.paper_bgcolor),s(\"bordercolor\"),s(\"borderwidth\"),a.coerceFont(s,\"font\",e.font),s(\"orientation\"),\"h\"===p.orientation){var x=t.xaxis;x&&x.rangeslider&&x.rangeslider.visible?(c=0,f=\"left\",u=1.1,d=\"bottom\"):(c=0,f=\"left\",u=-.1,d=\"top\")}s(\"traceorder\",v),l.isGrouped(e.legend)&&s(\"tracegroupgap\"),s(\"x\",c),s(\"xanchor\",f),s(\"y\",u),s(\"yanchor\",d),a.noneOrAll(h,p,[\"x\",\"y\"])}}},{\"../../lib\":136,\"../../plots/layout_attributes\":197,\"../../registry\":206,\"./attributes\":76,\"./helpers\":81}],79:[function(t,e,r){\"use strict\";function n(t,e){function r(r){y.convertToTspans(r,function(){r.selectAll(\"tspan.line\").attr({x:r.attr(\"x\")}),t.call(i,e)})}var n=t.data()[0][0],a=e._fullLayout,o=n.trace,l=p.traceIs(o,\"pie\"),s=o.index,c=l?n.label:o.name,u=t.selectAll(\"text.legendtext\").data([0]);u.enter().append(\"text\").classed(\"legendtext\",!0),u.attr({x:40,y:0,\"data-unformatted\":c}).style(\"text-anchor\",\"start\").classed(\"user-select-none\",!0).call(v.font,a.legend.font).text(c),e._context.editable&&!l?u.call(y.makeEditable).call(r).on(\"edit\",function(t){this.attr({\"data-unformatted\":t}),this.text(t).call(r),this.text()||(t=\" \");var a,o=n.trace._fullInput||{};if([\"ohlc\",\"candlestick\"].indexOf(o.type)!==-1){var i=n.trace.transforms;a=i[i.length-1].direction+\".name\"}else a=\"name\";f.restyle(e,a,t,s)}):u.call(r)}function a(t,e){var r,n=1,a=t.selectAll(\"rect\").data([0]);a.enter().append(\"rect\").classed(\"legendtoggle\",!0).style(\"cursor\",\"pointer\").attr(\"pointer-events\",\"all\").call(m.fill,\"rgba(0,0,0,0)\"),a.on(\"mousedown\",function(){r=(new Date).getTime(),r-e._legendMouseDownTime<T?n+=1:(n=1,e._legendMouseDownTime=r)}),a.on(\"mouseup\",function(){if(!e._dragged&&!e._editing){var r=e._fullLayout.legend;(new Date).getTime()-e._legendMouseDownTime>T&&(n=Math.max(n-1,1)),1===n?r._clickTimeout=setTimeout(function(){o(t,e,n)},T):2===n&&(r._clickTimeout&&clearTimeout(r._clickTimeout),e._legendMouseDownTime=0,o(t,e,n))}})}function o(t,e,r){if(!e._dragged&&!e._editing){var n,a,o=e._fullLayout.hiddenlabels?e._fullLayout.hiddenlabels.slice():[],i=t.data()[0][0],l=e._fullData,s=i.trace,c=s.legendgroup,u=[];if(1===r&&A&&e.data&&e._context.showTips?(d.notifier(\"Double click on legend to isolate individual trace\",\"long\"),A=!1):A=!1,p.traceIs(s,\"pie\")){var h=i.label,g=o.indexOf(h);1===r?g===-1?o.push(h):o.splice(g,1):2===r&&(o=[],e.calcdata[0].forEach(function(t){h!==t.label&&o.push(t.label)}),e._fullLayout.hiddenlabels&&e._fullLayout.hiddenlabels.length===o.length&&g===-1&&(o=[])),f.relayout(e,\"hiddenlabels\",o)}else{var v,m=[],y=[];for(v=0;v<l.length;v++)m.push(v),y.push(!!p.traceIs(l[v],\"notLegendIsolatable\")||\"legendonly\");if(\"\"===c)u=[s.index],y[s.index]=!0;else for(v=0;v<l.length;v++)n=l[v],n.legendgroup===c&&(u.push(n.index),y[m.indexOf(v)]=!0);if(1===r)a=s.visible!==!0||\"legendonly\",f.restyle(e,\"visible\",a,u);else if(2===r){var x=!0;for(v=0;v<l.length;v++)if(l[v].visible!==y[v]){x=!1;break}x&&(y=!0);var b=[];for(v=0;v<l.length;v++)b.push(m[v]);f.restyle(e,\"visible\",y,b)}}}}function i(t,e){var r,n,a=t.data()[0][0],o=t.select(\"g[class*=math-group]\"),i=e._fullLayout.legend,l=1.3*i.font.size;if(!a.trace.showlegend)return void t.remove();if(o.node()){var s=v.bBox(o.node());r=s.height,n=s.width,v.setTranslate(o,0,r/4)}else{var c=t.selectAll(\".legendtext\"),u=t.selectAll(\".legendtext>tspan\"),f=u[0].length||1;r=l*f,n=c.node()&&v.bBox(c.node()).width;var d=l*(.3+(1-f)/2);c.attr(\"y\",d),u.attr(\"y\",d)}r=Math.max(r,16)+3,a.height=r,a.width=n}function l(t,e,r){var n=t._fullLayout,a=n.legend,o=a.borderwidth,i=k.isGrouped(a);if(k.isVertical(a))i&&e.each(function(t,e){v.setTranslate(this,0,e*a.tracegroupgap)}),a.width=0,a.height=0,r.each(function(t){var e=t[0],r=e.height,n=e.width;v.setTranslate(this,o,5+o+a.height+r/2),a.height+=r,a.width=Math.max(a.width,n)}),a.width+=45+2*o,a.height+=10+2*o,i&&(a.height+=(a._lgroupsLength-1)*a.tracegroupgap),a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,(t._context.editable?0:a.width)+40,r.height)});else if(i){a.width=0,a.height=0;for(var l=[a.width],s=e.data(),c=0,f=s.length;c<f;c++){var d=s[c].map(function(t){return t[0].width}),h=40+Math.max.apply(null,d);a.width+=a.tracegroupgap+h,l.push(a.width)}e.each(function(t,e){v.setTranslate(this,l[e],0)}),e.each(function(){\n",
|
|
"var t=u.select(this),e=t.selectAll(\"g.traces\"),r=0;e.each(function(t){var e=t[0],n=e.height;v.setTranslate(this,0,5+o+r+n/2),r+=n}),a.height=Math.max(a.height,r)}),a.height+=10+2*o,a.width+=2*o,a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,t._context.editable?0:a.width,r.height)})}else{a.width=0,a.height=0;var p=0,g=0,m=0,y=0;r.each(function(t){m=Math.max(40+t[0].width,m)}),r.each(function(t){var e=t[0],r=m,i=a.tracegroupgap||5;o+y+i+r>n.width-(n.margin.r+n.margin.l)&&(y=0,p+=g,a.height=a.height+g,g=0),v.setTranslate(this,o+y,5+o+e.height/2+p),a.width+=i+r,a.height=Math.max(a.height,e.height),y+=i+r,g=Math.max(e.height,g)}),a.width+=2*o,a.height+=10+2*o,a.width=Math.ceil(a.width),a.height=Math.ceil(a.height),r.each(function(e){var r=e[0];u.select(this).select(\".legendtoggle\").call(v.setRect,0,-r.height/2,t._context.editable?0:a.width,r.height)})}}function s(t){var e=t._fullLayout,r=e.legend,n=\"left\";M.isRightAnchor(r)?n=\"right\":M.isCenterAnchor(r)&&(n=\"center\");var a=\"top\";M.isBottomAnchor(r)?a=\"bottom\":M.isMiddleAnchor(r)&&(a=\"middle\"),h.autoMargin(t,\"legend\",{x:r.x,y:r.y,l:r.width*({right:1,center:.5}[n]||0),r:r.width*({left:1,center:.5}[n]||0),b:r.height*({top:1,middle:.5}[a]||0),t:r.height*({bottom:1,middle:.5}[a]||0)})}function c(t){var e=t._fullLayout,r=e.legend,n=\"left\";M.isRightAnchor(r)?n=\"right\":M.isCenterAnchor(r)&&(n=\"center\"),h.autoMargin(t,\"legend\",{x:r.x,y:.5,l:r.width*({right:1,center:.5}[n]||0),r:r.width*({left:1,center:.5}[n]||0),b:0,t:0})}var u=t(\"d3\"),f=t(\"../../plotly\"),d=t(\"../../lib\"),h=t(\"../../plots/plots\"),p=t(\"../../registry\"),g=t(\"../dragelement\"),v=t(\"../drawing\"),m=t(\"../color\"),y=t(\"../../lib/svg_text_utils\"),x=t(\"./constants\"),b=t(\"../../constants/interactions\"),_=t(\"./get_legend_data\"),w=t(\"./style\"),k=t(\"./helpers\"),M=t(\"./anchor_utils\"),A=!0,T=b.DBLCLICKDELAY;e.exports=function(t){function e(t,e){S.attr(\"data-scroll\",e).call(v.setTranslate,0,e),z.call(v.setRect,j,t,x.scrollBarWidth,x.scrollBarHeight),L.select(\"rect\").attr({y:y.borderwidth-e})}var r=t._fullLayout,i=\"legend\"+r._uid;if(r._infolayer&&t.calcdata){t._legendMouseDownTime||(t._legendMouseDownTime=0);var y=r.legend,b=r.showlegend&&_(t.calcdata,y),k=r.hiddenlabels||[];if(!r.showlegend||!b.length)return r._infolayer.selectAll(\".legend\").remove(),r._topdefs.select(\"#\"+i).remove(),void h.autoMargin(t,\"legend\");var A=r._infolayer.selectAll(\"g.legend\").data([0]);A.enter().append(\"g\").attr({class:\"legend\",\"pointer-events\":\"all\"});var L=r._topdefs.selectAll(\"#\"+i).data([0]);L.enter().append(\"clipPath\").attr(\"id\",i).append(\"rect\");var C=A.selectAll(\"rect.bg\").data([0]);C.enter().append(\"rect\").attr({class:\"bg\",\"shape-rendering\":\"crispEdges\"}),C.call(m.stroke,y.bordercolor),C.call(m.fill,y.bgcolor),C.style(\"stroke-width\",y.borderwidth+\"px\");var S=A.selectAll(\"g.scrollbox\").data([0]);S.enter().append(\"g\").attr(\"class\",\"scrollbox\");var z=A.selectAll(\"rect.scrollbar\").data([0]);z.enter().append(\"rect\").attr({class:\"scrollbar\",rx:20,ry:2,width:0,height:0}).call(m.fill,\"#808BA4\");var O=S.selectAll(\"g.groups\").data(b);O.enter().append(\"g\").attr(\"class\",\"groups\"),O.exit().remove();var D=O.selectAll(\"g.traces\").data(d.identity);D.enter().append(\"g\").attr(\"class\",\"traces\"),D.exit().remove(),D.call(w).style(\"opacity\",function(t){var e=t[0].trace;return p.traceIs(e,\"pie\")?k.indexOf(t[0].label)!==-1?.5:1:\"legendonly\"===e.visible?.5:1}).each(function(){u.select(this).call(n,t).call(a,t)});var P=0!==A.enter().size();P&&(l(t,O,D),s(t));var E=r.width,N=r.height;l(t,O,D),y.height>N?c(t):s(t);var I=r._size,R=I.l+I.w*y.x,F=I.t+I.h*(1-y.y);M.isRightAnchor(y)?R-=y.width:M.isCenterAnchor(y)&&(R-=y.width/2),M.isBottomAnchor(y)?F-=y.height:M.isMiddleAnchor(y)&&(F-=y.height/2);var j=y.width,B=I.w;j>B?(R=I.l,j=B):(R+j>E&&(R=E-j),R<0&&(R=0),j=Math.min(E-R,y.width));var q=y.height,H=I.h;q>H?(F=I.t,q=H):(F+q>N&&(F=N-q),F<0&&(F=0),q=Math.min(N-F,y.height)),v.setTranslate(A,R,F);var V,U,X=q-x.scrollBarHeight-2*x.scrollBarMargin,G=y.height-q;if(y.height<=q||t._context.staticPlot)C.attr({width:j-y.borderwidth,height:q-y.borderwidth,x:y.borderwidth/2,y:y.borderwidth/2}),v.setTranslate(S,0,0),L.select(\"rect\").attr({width:j-2*y.borderwidth,height:q-2*y.borderwidth,x:y.borderwidth,y:y.borderwidth}),S.call(v.setClipUrl,i);else{V=x.scrollBarMargin,U=S.attr(\"data-scroll\")||0,C.attr({width:j-2*y.borderwidth+x.scrollBarWidth+x.scrollBarMargin,height:q-y.borderwidth,x:y.borderwidth/2,y:y.borderwidth/2}),L.select(\"rect\").attr({width:j-2*y.borderwidth+x.scrollBarWidth+x.scrollBarMargin,height:q-2*y.borderwidth,x:y.borderwidth,y:y.borderwidth-U}),S.call(v.setClipUrl,i),P&&e(V,U),A.on(\"wheel\",null),A.on(\"wheel\",function(){U=d.constrain(S.attr(\"data-scroll\")-u.event.deltaY/X*G,-G,0),V=x.scrollBarMargin-U/G*X,e(V,U),0!==U&&U!==-G&&u.event.preventDefault()}),z.on(\".drag\",null),S.on(\".drag\",null);var Y=u.behavior.drag().on(\"drag\",function(){V=d.constrain(u.event.y-x.scrollBarHeight/2,x.scrollBarMargin,x.scrollBarMargin+X),U=-(V-x.scrollBarMargin)/X*G,e(V,U)});z.call(Y),S.call(Y)}if(t._context.editable){var Z,W,$,Q;A.classed(\"cursor-move\",!0),g.init({element:A.node(),prepFn:function(){var t=v.getTranslate(A);$=t.x,Q=t.y},moveFn:function(t,e){var r=$+t,n=Q+e;v.setTranslate(A,r,n),Z=g.align(r,0,I.l,I.l+I.w,y.xanchor),W=g.align(n,0,I.t+I.h,I.t,y.yanchor)},doneFn:function(e,n,a){if(e&&void 0!==Z&&void 0!==W)f.relayout(t,{\"legend.x\":Z,\"legend.y\":W});else{var i=r._infolayer.selectAll(\"g.traces\").filter(function(){var t=this.getBoundingClientRect();return a.clientX>=t.left&&a.clientX<=t.right&&a.clientY>=t.top&&a.clientY<=t.bottom});i.size()>0&&(1===n?A._clickTimeout=setTimeout(function(){o(i,t,n)},T):2===n&&(A._clickTimeout&&clearTimeout(A._clickTimeout),o(i,t,n)))}}})}}}},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/plots\":199,\"../../registry\":206,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./anchor_utils\":75,\"./constants\":77,\"./get_legend_data\":80,\"./helpers\":81,\"./style\":83,d3:7}],80:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"./helpers\");e.exports=function(t,e){function r(t,r){if(\"\"!==t&&a.isGrouped(e))s.indexOf(t)===-1?(s.push(t),c=!0,l[t]=[[r]]):l[t].push([r]);else{var n=\"~~i\"+f;s.push(n),l[n]=[[r]],f++}}var o,i,l={},s=[],c=!1,u={},f=0;for(o=0;o<t.length;o++){var d=t[o],h=d[0],p=h.trace,g=p.legendgroup;if(a.legendGetsTrace(p)&&p.showlegend)if(n.traceIs(p,\"pie\"))for(u[g]||(u[g]={}),i=0;i<d.length;i++){var v=d[i].label;u[g][v]||(r(g,{label:v,color:d[i].color,i:d[i].i,trace:p}),u[g][v]=!0)}else r(g,h)}if(!s.length)return[];var m,y,x=s.length;if(c&&a.isGrouped(e))for(y=new Array(x),o=0;o<x;o++)m=l[s[o]],y[o]=a.isReversed(e)?m.reverse():m;else{for(y=[new Array(x)],o=0;o<x;o++)m=l[s[o]][0],y[0][a.isReversed(e)?x-o-1:o]=m;x=1}return e._lgroupsLength=x,y}},{\"../../registry\":206,\"./helpers\":81}],81:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");r.legendGetsTrace=function(t){return t.visible&&n.traceIs(t,\"showLegend\")},r.isGrouped=function(t){return(t.traceorder||\"\").indexOf(\"grouped\")!==-1},r.isVertical=function(t){return\"h\"!==t.orientation},r.isReversed=function(t){return(t.traceorder||\"\").indexOf(\"reversed\")!==-1}},{\"../../registry\":206}],82:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"legend\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\"),style:t(\"./style\")}},{\"./attributes\":76,\"./defaults\":78,\"./draw\":79,\"./style\":83}],83:[function(t,e,r){\"use strict\";function n(t){var e=t[0].trace,r=e.visible&&e.fill&&\"none\"!==e.fill,n=h.hasLines(e);e&&e._module&&\"contourcarpet\"===e._module.name&&(n=e.contours.showlines,r=\"fill\"===e.contours.coloring);var a=s.select(this).select(\".legendfill\").selectAll(\"path\").data(r?[t]:[]);a.enter().append(\"path\").classed(\"js-fill\",!0),a.exit().remove(),a.attr(\"d\",\"M5,0h30v6h-30z\").call(f.fillGroupStyle);var o=s.select(this).select(\".legendlines\").selectAll(\"path\").data(n?[t]:[]);o.enter().append(\"path\").classed(\"js-line\",!0).attr(\"d\",\"M5,0h30\"),o.exit().remove(),o.call(f.lineGroupStyle)}function a(t){function e(t,e,r){var n=u.nestedProperty(i,t).get(),a=Array.isArray(n)&&e?e(n):n;if(r){if(a<r[0])return r[0];if(a>r[1])return r[1]}return a}function r(t){return t[0]}var n,a,o=t[0],i=o.trace,l=h.hasMarkers(i),c=h.hasText(i),d=h.hasLines(i);if(l||c||d){var p={},g={};l&&(p.mc=e(\"marker.color\",r),p.mo=e(\"marker.opacity\",u.mean,[.2,1]),p.ms=e(\"marker.size\",u.mean,[2,16]),p.mlc=e(\"marker.line.color\",r),p.mlw=e(\"marker.line.width\",u.mean,[0,5]),g.marker={sizeref:1,sizemin:1,sizemode:\"diameter\"}),d&&(g.line={width:e(\"line.width\",r,[0,10])}),c&&(p.tx=\"Aa\",p.tp=e(\"textposition\",r),p.ts=10,p.tc=e(\"textfont.color\",r),p.tf=e(\"textfont.family\",r)),n=[u.minExtend(o,p)],a=u.minExtend(i,g)}var v=s.select(this).select(\"g.legendpoints\"),m=v.selectAll(\"path.scatterpts\").data(l?n:[]);m.enter().append(\"path\").classed(\"scatterpts\",!0).attr(\"transform\",\"translate(20,0)\"),m.exit().remove(),m.call(f.pointStyle,a),l&&(n[0].mrc=3);var y=v.selectAll(\"g.pointtext\").data(c?n:[]);y.enter().append(\"g\").classed(\"pointtext\",!0).append(\"text\").attr(\"transform\",\"translate(20,0)\"),y.exit().remove(),y.selectAll(\"text\").call(f.textPointStyle,a)}function o(t){var e=t[0].trace,r=e.marker||{},n=r.line||{},a=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbar\").data(c.traceIs(e,\"bar\")?[t]:[]);a.enter().append(\"path\").classed(\"legendbar\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),a.exit().remove(),a.each(function(t){var e=s.select(this),a=t[0],o=(a.mlw+1||n.width+1)-1;e.style(\"stroke-width\",o+\"px\").call(d.fill,a.mc||r.color),o&&e.call(d.stroke,a.mlc||n.color)})}function i(t){var e=t[0].trace,r=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbox\").data(c.traceIs(e,\"box\")&&e.visible?[t]:[]);r.enter().append(\"path\").classed(\"legendbox\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),r.exit().remove(),r.each(function(){var t=e.line.width,r=s.select(this);r.style(\"stroke-width\",t+\"px\").call(d.fill,e.fillcolor),t&&r.call(d.stroke,e.line.color)})}function l(t){var e=t[0].trace,r=s.select(this).select(\"g.legendpoints\").selectAll(\"path.legendpie\").data(c.traceIs(e,\"pie\")&&e.visible?[t]:[]);r.enter().append(\"path\").classed(\"legendpie\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",\"translate(20,0)\"),r.exit().remove(),r.size()&&r.call(p,t[0],e)}var s=t(\"d3\"),c=t(\"../../registry\"),u=t(\"../../lib\"),f=t(\"../drawing\"),d=t(\"../color\"),h=t(\"../../traces/scatter/subtypes\"),p=t(\"../../traces/pie/style_one\");e.exports=function(t){t.each(function(t){var e=s.select(this),r=e.selectAll(\"g.layers\").data([0]);r.enter().append(\"g\").classed(\"layers\",!0),r.style(\"opacity\",t[0].trace.opacity),r.selectAll(\"g.legendfill\").data([t]).enter().append(\"g\").classed(\"legendfill\",!0),r.selectAll(\"g.legendlines\").data([t]).enter().append(\"g\").classed(\"legendlines\",!0);var n=r.selectAll(\"g.legendsymbols\").data([t]);n.enter().append(\"g\").classed(\"legendsymbols\",!0),n.selectAll(\"g.legendpoints\").data([t]).enter().append(\"g\").classed(\"legendpoints\",!0)}).each(o).each(i).each(l).each(n).each(a)}},{\"../../lib\":136,\"../../registry\":206,\"../../traces/pie/style_one\":238,\"../../traces/scatter/subtypes\":260,\"../color\":25,\"../drawing\":49,d3:7}],84:[function(t,e,r){\"use strict\";function n(t,e){var r,n,a=e.currentTarget,o=a.getAttribute(\"data-attr\"),i=a.getAttribute(\"data-val\")||!0,l=t._fullLayout,s={},c=d.list(t,null,!0),f=\"on\";if(\"zoom\"===o){var h,p=\"in\"===i?.5:2,g=(1+p)/2,v=(1-p)/2;for(n=0;n<c.length;n++)if(r=c[n],!r.fixedrange)if(h=r._name,\"auto\"===i)s[h+\".autorange\"]=!0;else if(\"reset\"===i){if(void 0===r._rangeInitial)s[h+\".autorange\"]=!0;else{var m=r._rangeInitial.slice();s[h+\".range[0]\"]=m[0],s[h+\".range[1]\"]=m[1]}void 0!==r._showSpikeInitial&&(s[h+\".showspikes\"]=r._showSpikeInitial,\"on\"!==f||r._showSpikeInitial||(f=\"off\"))}else{var y=[r.r2l(r.range[0]),r.r2l(r.range[1])],x=[g*y[0]+v*y[1],g*y[1]+v*y[0]];s[h+\".range[0]\"]=r.l2r(x[0]),s[h+\".range[1]\"]=r.l2r(x[1])}l._cartesianSpikesEnabled=f}else{if(\"hovermode\"!==o||\"x\"!==i&&\"y\"!==i){if(\"hovermode\"===o&&\"closest\"===i){for(n=0;n<c.length;n++)r=c[n],\"on\"!==f||r.showspikes||(f=\"off\");l._cartesianSpikesEnabled=f}}else i=l._isHoriz?\"y\":\"x\",a.setAttribute(\"data-val\",i),\"closest\"!==i&&(l._cartesianSpikesEnabled=\"off\");s[o]=i}u.relayout(t,s)}function a(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=r.getAttribute(\"data-val\")||!0,o=t._fullLayout,i=f.getSubplotIds(o,\"gl3d\"),l={},s=n.split(\".\"),c=0;c<i.length;c++)l[i[c]+\".\"+s[1]]=a;u.relayout(t,l)}function o(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=t._fullLayout,o=f.getSubplotIds(a,\"gl3d\"),i={},l=0;l<o.length;l++){var s=o[l],c=s+\".camera\",d=a[s]._scene;\"resetDefault\"===n?i[c]=null:\"resetLastSave\"===n&&(i[c]=h.extendDeep({},d.cameraInitial))}u.relayout(t,i)}function i(t,e){var r=e.currentTarget,n=r._previousVal||!1,a=t.layout,o=t._fullLayout,i=f.getSubplotIds(o,\"gl3d\"),l=[\"xaxis\",\"yaxis\",\"zaxis\"],s=[\"showspikes\",\"spikesides\",\"spikethickness\",\"spikecolor\"],c={},d={},p={};if(n)p=h.extendDeep(a,n),r._previousVal=null;else{p={\"allaxes.showspikes\":!1};for(var g=0;g<i.length;g++){var v=i[g],m=o[v],y=c[v]={};y.hovermode=m.hovermode,p[v+\".hovermode\"]=!1;for(var x=0;x<3;x++){var b=l[x];d=y[b]={};for(var _=0;_<s.length;_++){var w=s[_];d[w]=m[b][w]}}}r._previousVal=h.extendDeep({},c)}u.relayout(t,p)}function l(t,e){for(var r=e.currentTarget,n=r.getAttribute(\"data-attr\"),a=r.getAttribute(\"data-val\")||!0,o=t._fullLayout,i=f.getSubplotIds(o,\"geo\"),l=0;l<i.length;l++){var s=o[i[l]]._subplot;if(\"zoom\"===n){var c=s.projection.scale(),u=\"in\"===a?2*c:.5*c;s.projection.scale(u),s.zoom.scale(u),s.render()}else\"reset\"===n&&s.zoomReset()}}function s(t){var e,r=t._fullLayout;e=r._has(\"cartesian\")?r._isHoriz?\"y\":\"x\":\"closest\";var n=!t._fullLayout.hovermode&&e;u.relayout(t,\"hovermode\",n)}function c(t){for(var e,r,n=t._fullLayout,a=d.list(t,null,!0),o={},i=0;i<a.length;i++)e=a[i],r=e._name,o[r+\".showspikes\"]=\"on\"===n._cartesianSpikesEnabled;return o}var u=t(\"../../plotly\"),f=t(\"../../plots/plots\"),d=t(\"../../plots/cartesian/axes\"),h=t(\"../../lib\"),p=t(\"../../snapshot/download\"),g=t(\"../../../build/ploticon\"),v=e.exports={};v.toImage={name:\"toImage\",title:\"Download plot as a png\",icon:g.camera,click:function(t){var e=\"png\";h.notifier(\"Taking snapshot - this may take a few seconds\",\"long\"),h.isIE()&&(h.notifier(\"IE only supports svg. Changing format to svg.\",\"long\"),e=\"svg\"),p(t,{format:e}).then(function(t){h.notifier(\"Snapshot succeeded - \"+t,\"long\")}).catch(function(){h.notifier(\"Sorry there was a problem downloading your snapshot!\",\"long\")})}},v.sendDataToCloud={name:\"sendDataToCloud\",title:\"Save and edit plot in cloud\",icon:g.disk,click:function(t){f.sendDataToCloud(t)}},v.zoom2d={name:\"zoom2d\",title:\"Zoom\",attr:\"dragmode\",val:\"zoom\",icon:g.zoombox,click:n},v.pan2d={name:\"pan2d\",title:\"Pan\",attr:\"dragmode\",val:\"pan\",icon:g.pan,click:n},v.select2d={name:\"select2d\",title:\"Box Select\",attr:\"dragmode\",val:\"select\",icon:g.selectbox,click:n},v.lasso2d={name:\"lasso2d\",title:\"Lasso Select\",attr:\"dragmode\",val:\"lasso\",icon:g.lasso,click:n},v.zoomIn2d={name:\"zoomIn2d\",title:\"Zoom in\",attr:\"zoom\",val:\"in\",icon:g.zoom_plus,click:n},v.zoomOut2d={name:\"zoomOut2d\",title:\"Zoom out\",attr:\"zoom\",val:\"out\",icon:g.zoom_minus,click:n},v.autoScale2d={name:\"autoScale2d\",title:\"Autoscale\",attr:\"zoom\",val:\"auto\",icon:g.autoscale,click:n},v.resetScale2d={name:\"resetScale2d\",title:\"Reset axes\",attr:\"zoom\",val:\"reset\",icon:g.home,click:n},v.hoverClosestCartesian={name:\"hoverClosestCartesian\",title:\"Show closest data on hover\",attr:\"hovermode\",val:\"closest\",icon:g.tooltip_basic,gravity:\"ne\",click:n},v.hoverCompareCartesian={name:\"hoverCompareCartesian\",title:\"Compare data on hover\",attr:\"hovermode\",val:function(t){return t._fullLayout._isHoriz?\"y\":\"x\"},icon:g.tooltip_compare,gravity:\"ne\",click:n},v.zoom3d={name:\"zoom3d\",title:\"Zoom\",attr:\"scene.dragmode\",val:\"zoom\",icon:g.zoombox,click:a},v.pan3d={name:\"pan3d\",title:\"Pan\",attr:\"scene.dragmode\",val:\"pan\",icon:g.pan,click:a},v.orbitRotation={name:\"orbitRotation\",title:\"orbital rotation\",attr:\"scene.dragmode\",val:\"orbit\",icon:g[\"3d_rotate\"],click:a},v.tableRotation={name:\"tableRotation\",title:\"turntable rotation\",attr:\"scene.dragmode\",val:\"turntable\",icon:g[\"z-axis\"],click:a},v.resetCameraDefault3d={name:\"resetCameraDefault3d\",title:\"Reset camera to default\",attr:\"resetDefault\",icon:g.home,click:o},v.resetCameraLastSave3d={name:\"resetCameraLastSave3d\",title:\"Reset camera to last save\",attr:\"resetLastSave\",icon:g.movie,click:o},v.hoverClosest3d={name:\"hoverClosest3d\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:i},v.zoomInGeo={name:\"zoomInGeo\",title:\"Zoom in\",attr:\"zoom\",val:\"in\",icon:g.zoom_plus,click:l},v.zoomOutGeo={name:\"zoomOutGeo\",title:\"Zoom out\",attr:\"zoom\",val:\"out\",icon:g.zoom_minus,click:l},v.resetGeo={name:\"resetGeo\",title:\"Reset\",attr:\"reset\",val:null,icon:g.autoscale,click:l},v.hoverClosestGeo={name:\"hoverClosestGeo\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:s},v.hoverClosestGl2d={name:\"hoverClosestGl2d\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:s},v.hoverClosestPie={name:\"hoverClosestPie\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:\"closest\",icon:g.tooltip_basic,gravity:\"ne\",click:s},v.toggleHover={name:\"toggleHover\",title:\"Toggle show closest data on hover\",attr:\"hovermode\",val:null,toggle:!0,icon:g.tooltip_basic,gravity:\"ne\",click:function(t,e){s(t),i(t,e)}},v.resetViews={name:\"resetViews\",title:\"Reset views\",icon:g.home,click:function(t,e){var r=e.currentTarget;r.setAttribute(\"data-attr\",\"zoom\"),r.setAttribute(\"data-val\",\"reset\"),n(t,e),r.setAttribute(\"data-attr\",\"resetLastSave\"),o(t,e)}},v.toggleSpikelines={name:\"toggleSpikelines\",title:\"Toggle Spike Lines\",icon:g.spikeline,attr:\"_cartesianSpikesEnabled\",val:\"on\",click:function(t){var e=t._fullLayout;e._cartesianSpikesEnabled=\"closest\"===e.hovermode&&\"on\"===e._cartesianSpikesEnabled?\"off\":\"on\";var r=c(t);r.hovermode=\"closest\",u.relayout(t,r)}}},{\"../../../build/ploticon\":2,\"../../lib\":136,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../../snapshot/download\":208}],85:[function(t,e,r){\"use strict\";r.manage=t(\"./manage\")},{\"./manage\":86}],86:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t){for(var r=[],n=0;n<t.length;n++){var a=t[n];e.indexOf(a)===-1&&r.push(f[a])}v.push(r)}var l=t._fullLayout,s=t._fullData,c=l._has(\"cartesian\"),u=l._has(\"gl3d\"),d=l._has(\"geo\"),h=l._has(\"pie\"),p=l._has(\"gl2d\"),g=l._has(\"ternary\"),v=[];if(n([\"toImage\",\"sendDataToCloud\"]),(c||p||h||g)+d+u>1)return n([\"resetViews\",\"toggleHover\"]),i(v,r);u&&(n([\"zoom3d\",\"pan3d\",\"orbitRotation\",\"tableRotation\"]),n([\"resetCameraDefault3d\",\"resetCameraLastSave3d\"]),n([\"hoverClosest3d\"])),d&&(n([\"zoomInGeo\",\"zoomOutGeo\",\"resetGeo\"]),n([\"hoverClosestGeo\"]));var m=a(l),y=[];return((c||p)&&!m||g)&&(y=[\"zoom2d\",\"pan2d\"]),(c||g)&&o(s)&&(y.push(\"select2d\"),y.push(\"lasso2d\")),y.length&&n(y),!c&&!p||m||g||n([\"zoomIn2d\",\"zoomOut2d\",\"autoScale2d\",\"resetScale2d\"]),c&&h?n([\"toggleHover\"]):p?n([\"hoverClosestGl2d\"]):c?n([\"toggleSpikelines\",\"hoverClosestCartesian\",\"hoverCompareCartesian\"]):h&&n([\"hoverClosestPie\"]),i(v,r)}function a(t){for(var e=s.list({_fullLayout:t},null,!0),r=!0,n=0;n<e.length;n++)if(!e[n].fixedrange){r=!1;break}return r}function o(t){for(var e=!1,r=0;r<t.length&&!e;r++){var n=t[r];n._module&&n._module.selectPoints&&(\"scatter\"===n.type||\"scatterternary\"===n.type?(c.hasMarkers(n)||c.hasText(n))&&(e=!0):e=!0)}return e}function i(t,e){if(e.length)if(Array.isArray(e[0]))for(var r=0;r<e.length;r++)t.push(e[r]);else t.push(e);return t}function l(t){for(var e=0;e<t.length;e++)for(var r=t[e],n=0;n<r.length;n++){var a=r[n];if(\"string\"==typeof a){if(void 0===f[a])throw new Error([\"*modeBarButtons* configuration options\",\"invalid button name\"].join(\" \"));t[e][n]=f[a]}}return t}var s=t(\"../../plots/cartesian/axes\"),c=t(\"../../traces/scatter/subtypes\"),u=t(\"./modebar\"),f=t(\"./buttons\");e.exports=function(t){var e=t._fullLayout,r=t._context,a=e._modeBar;if(!r.displayModeBar)return void(a&&(a.destroy(),delete e._modeBar));if(!Array.isArray(r.modeBarButtonsToRemove))throw new Error([\"*modeBarButtonsToRemove* configuration options\",\"must be an array.\"].join(\" \"));if(!Array.isArray(r.modeBarButtonsToAdd))throw new Error([\"*modeBarButtonsToAdd* configuration options\",\"must be an array.\"].join(\" \"));var o,i=r.modeBarButtons;o=Array.isArray(i)&&i.length?l(i):n(t,r.modeBarButtonsToRemove,r.modeBarButtonsToAdd),a?a.update(t,o):e._modeBar=u(t,o)}},{\"../../plots/cartesian/axes\":171,\"../../traces/scatter/subtypes\":260,\"./buttons\":84,\"./modebar\":87}],87:[function(t,e,r){\"use strict\";function n(t){this.container=t.container,this.element=document.createElement(\"div\"),this.update(t.graphInfo,t.buttons),this.container.appendChild(this.element)}function a(t,e){var r=t._fullLayout,a=new n({graphInfo:t,container:r._paperdiv.node(),buttons:e});return r._privateplot&&o.select(a.element).append(\"span\").classed(\"badge-private float--left\",!0).text(\"PRIVATE\"),a}var o=t(\"d3\"),i=t(\"../../lib\"),l=t(\"../../../build/ploticon\"),s=n.prototype;s.update=function(t,e){this.graphInfo=t;var r=this.graphInfo._context;\"hover\"===r.displayModeBar?this.element.className=\"modebar modebar--hover\":this.element.className=\"modebar\";var n=!this.hasButtons(e),a=this.hasLogo!==r.displaylogo;(n||a)&&(this.removeAllButtons(),this.updateButtons(e),r.displaylogo&&(this.element.appendChild(this.getLogo()),this.hasLogo=!0)),this.updateActiveButton()},s.updateButtons=function(t){var e=this;this.buttons=t,this.buttonElements=[],this.buttonsNames=[],this.buttons.forEach(function(t){var r=e.createGroup();t.forEach(function(t){var n=t.name;if(!n)throw new Error(\"must provide button 'name' in button config\");if(e.buttonsNames.indexOf(n)!==-1)throw new Error(\"button name '\"+n+\"' is taken\");e.buttonsNames.push(n);var a=e.createButton(t);e.buttonElements.push(a),r.appendChild(a)}),e.element.appendChild(r)})},s.createGroup=function(){var t=document.createElement(\"div\");return t.className=\"modebar-group\",t},s.createButton=function(t){var e=this,r=document.createElement(\"a\");r.setAttribute(\"rel\",\"tooltip\"),r.className=\"modebar-btn\";var n=t.title;void 0===n&&(n=t.name),(n||0===n)&&r.setAttribute(\"data-title\",n),void 0!==t.attr&&r.setAttribute(\"data-attr\",t.attr);var a=t.val;if(void 0!==a&&(\"function\"==typeof a&&(a=a(this.graphInfo)),r.setAttribute(\"data-val\",a)),\"function\"!=typeof t.click)throw new Error(\"must provide button 'click' function in button config\");return r.addEventListener(\"click\",function(r){t.click(e.graphInfo,r),e.updateActiveButton(r.currentTarget)}),r.setAttribute(\"data-toggle\",t.toggle||!1),t.toggle&&o.select(r).classed(\"active\",!0),r.appendChild(this.createIcon(t.icon||l.question,t.name)),r.setAttribute(\"data-gravity\",t.gravity||\"n\"),r},s.createIcon=function(t,e){var r=t.ascent-t.descent,n=\"http://www.w3.org/2000/svg\",a=document.createElementNS(n,\"svg\"),o=document.createElementNS(n,\"path\");a.setAttribute(\"height\",\"1em\"),a.setAttribute(\"width\",t.width/r+\"em\"),a.setAttribute(\"viewBox\",[0,0,t.width,r].join(\" \"));var i=\"toggleSpikelines\"===e?\"matrix(1.5 0 0 -1.5 0 \"+t.ascent+\")\":\"matrix(1 0 0 -1 0 \"+t.ascent+\")\";return o.setAttribute(\"d\",t.path),o.setAttribute(\"transform\",i),a.appendChild(o),a},s.updateActiveButton=function(t){var e=this.graphInfo._fullLayout,r=void 0!==t?t.getAttribute(\"data-attr\"):null;this.buttonElements.forEach(function(t){var n=t.getAttribute(\"data-val\")||!0,a=t.getAttribute(\"data-attr\"),l=\"true\"===t.getAttribute(\"data-toggle\"),s=o.select(t);if(l)a===r&&s.classed(\"active\",!s.classed(\"active\"));else{var c=null===a?a:i.nestedProperty(e,a).get();s.classed(\"active\",c===n)}})},s.hasButtons=function(t){var e=this.buttons;if(!e)return!1;if(t.length!==e.length)return!1;for(var r=0;r<t.length;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;n<t[r].length;n++)if(t[r][n].name!==e[r][n].name)return!1}return!0},s.getLogo=function(){var t=this.createGroup(),e=document.createElement(\"a\");return e.href=\"https://plot.ly/\",e.target=\"_blank\",e.setAttribute(\"data-title\",\"Produced with Plotly\"),e.className=\"modebar-btn plotlyjsicon modebar-btn--logo\",e.appendChild(this.createIcon(l.plotlylogo)),t.appendChild(e),t},s.removeAllButtons=function(){for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.hasLogo=!1},s.destroy=function(){i.removeElement(this.container.querySelector(\".modebar\"))},e.exports=a},{\"../../../build/ploticon\":2,\"../../lib\":136,d3:7}],88:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"./button_attributes\");i=o(i,{_isLinkedToArray:\"button\"}),e.exports={visible:{valType:\"boolean\"},buttons:i,x:{valType:\"number\",min:-2,max:3},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"bottom\"},font:o({},n,{}),bgcolor:{valType:\"color\",dflt:a.lightLine},activecolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.defaultLine},borderwidth:{valType:\"number\",min:0,dflt:0}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../color/attributes\":24,\"./button_attributes\":89}],89:[function(t,e,r){\"use strict\";e.exports={step:{valType:\"enumerated\",values:[\"month\",\"year\",\"day\",\"hour\",\"minute\",\"second\",\"all\"],dflt:\"month\"},stepmode:{valType:\"enumerated\",values:[\"backward\",\"todate\"],dflt:\"backward\"},count:{valType:\"number\",min:0,dflt:1},label:{valType:\"string\"}}},{}],90:[function(t,e,r){\"use strict\";e.exports={yPad:.02,minButtonWidth:30,rx:3,ry:3,lightAmount:25,darkAmount:10}},{}],91:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t,e){return o.coerce(a,i,s,t,e)}for(var a,i,l=t.buttons||[],c=e.buttons=[],u=0;u<l.length;u++)if(a=l[u],i={},o.isPlainObject(a)){var f=n(\"step\");\"all\"!==f&&(!r||\"gregorian\"===r||\"month\"!==f&&\"year\"!==f?n(\"stepmode\"):i.stepmode=\"backward\",n(\"count\")),n(\"label\"),i._index=u,c.push(i)}return c}function a(t,e,r){for(var n=r.filter(function(r){return e[r].anchor===t._id}),a=0,o=0;o<n.length;o++){var i=e[n[o]].domain;i&&(a=Math.max(i[1],a))}return[t.domain[0],a+c.yPad]}var o=t(\"../../lib\"),i=t(\"../color\"),l=t(\"./attributes\"),s=t(\"./button_attributes\"),c=t(\"./constants\");e.exports=function(t,e,r,s,u){function f(t,e){return o.coerce(d,h,l,t,e)}var d=t.rangeselector||{},h=e.rangeselector={};if(f(\"visible\",n(d,h,u).length>0)){var p=a(e,r,s);f(\"x\",p[0]),f(\"y\",p[1]),o.noneOrAll(t,e,[\"x\",\"y\"]),f(\"xanchor\"),f(\"yanchor\"),o.coerceFont(f,\"font\",r.font);var g=f(\"bgcolor\");f(\"activecolor\",i.contrast(g,c.lightAmount,c.darkAmount)),f(\"bordercolor\"),f(\"borderwidth\")}}},{\"../../lib\":136,\"../color\":25,\"./attributes\":88,\"./button_attributes\":89,\"./constants\":90}],92:[function(t,e,r){\"use strict\";function n(t){for(var e=m.list(t,\"x\",!0),r=[],n=0;n<e.length;n++){var a=e[n];a.rangeselector&&a.rangeselector.visible&&r.push(a)}return r}function a(t){return t._id}function o(t,e,r){if(\"all\"===e.step)return t.autorange===!0;var n=Object.keys(r);return t.range[0]===r[n[0]]&&t.range[1]===r[n[1]]}function i(t,e,r){var n=t.selectAll(\"rect\").data([0]);n.enter().append(\"rect\").classed(\"selector-rect\",!0),n.attr(\"shape-rendering\",\"crispEdges\"),n.attr({rx:x.rx,ry:x.ry}),n.call(p.stroke,e.bordercolor).call(p.fill,l(e,r)).style(\"stroke-width\",e.borderwidth+\"px\")}function l(t,e){return e.isActive||e.isHovered?t.activecolor:t.bgcolor}function s(t,e,r){function n(t){v.convertToTspans(t)}var a=t.selectAll(\"text\").data([0]);a.enter().append(\"text\").classed(\"selector-text\",!0).classed(\"user-select-none\",!0),a.attr(\"text-anchor\",\"middle\"),a.call(g.font,e.font).text(c(r)).call(n)}function c(t){return t.label?t.label:\"all\"===t.step?\"all\":t.count+t.step.charAt(0)}function u(t,e,r,n){r.width=0,r.height=0;var a=r.borderwidth;e.each(function(){var t=f.select(this),e=t.select(\".selector-text\"),n=e.selectAll(\"tspan\"),a=1.3*r.font.size,o=n[0].length||1,i=Math.max(a*o,16)+3;r.height=Math.max(r.height,i)}),e.each(function(){var t=f.select(this),e=t.select(\".selector-rect\"),n=t.select(\".selector-text\"),o=n.selectAll(\"tspan\"),i=n.node()&&g.bBox(n.node()).width,l=1.3*r.font.size,s=o[0].length||1,c=Math.max(i+10,x.minButtonWidth);t.attr(\"transform\",\"translate(\"+(a+r.width)+\",\"+a+\")\"),e.attr({x:0,y:0,width:c,height:r.height});var u={x:c/2,y:r.height/2-(s-1)*l/2+3};n.attr(u),o.attr(u),r.width+=c+5}),e.selectAll(\"rect\").attr(\"height\",r.height);var o=t._fullLayout._size;r.lx=o.l+o.w*r.x,r.ly=o.t+o.h*(1-r.y);var i=\"left\";y.isRightAnchor(r)&&(r.lx-=r.width,i=\"right\"),y.isCenterAnchor(r)&&(r.lx-=r.width/2,i=\"center\");var l=\"top\";y.isBottomAnchor(r)&&(r.ly-=r.height,l=\"bottom\"),y.isMiddleAnchor(r)&&(r.ly-=r.height/2,l=\"middle\"),r.width=Math.ceil(r.width),r.height=Math.ceil(r.height),r.lx=Math.round(r.lx),r.ly=Math.round(r.ly),h.autoMargin(t,n+\"-range-selector\",{x:r.x,y:r.y,l:r.width*({right:1,center:.5}[i]||0),r:r.width*({left:1,center:.5}[i]||0),b:r.height*({top:1,middle:.5}[l]||0),t:r.height*({bottom:1,middle:.5}[l]||0)})}var f=t(\"d3\"),d=t(\"../../plotly\"),h=t(\"../../plots/plots\"),p=t(\"../color\"),g=t(\"../drawing\"),v=t(\"../../lib/svg_text_utils\"),m=t(\"../../plots/cartesian/axis_ids\"),y=t(\"../legend/anchor_utils\"),x=t(\"./constants\"),b=t(\"./get_update_object\");e.exports=function(t){var e=t._fullLayout,r=e._infolayer.selectAll(\".rangeselector\").data(n(t),a);r.enter().append(\"g\").classed(\"rangeselector\",!0),r.exit().remove(),r.style({cursor:\"pointer\",\"pointer-events\":\"all\"}),r.each(function(e){var r=f.select(this),n=e,a=n.rangeselector,l=r.selectAll(\"g.button\").data(a.buttons);l.enter().append(\"g\").classed(\"button\",!0),l.exit().remove(),l.each(function(e){var r=f.select(this),l=b(n,e);e.isActive=o(n,e,l),r.call(i,a,e),r.call(s,a,e),r.on(\"click\",function(){t._dragged||d.relayout(t,l)}),r.on(\"mouseover\",function(){e.isHovered=!0,r.call(i,a,e)}),r.on(\"mouseout\",function(){e.isHovered=!1,r.call(i,a,e)})}),u(t,l,a,n._name),r.attr(\"transform\",\"translate(\"+a.lx+\",\"+a.ly+\")\")})}},{\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/cartesian/axis_ids\":174,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":90,\"./get_update_object\":93,d3:7}],93:[function(t,e,r){\"use strict\";function n(t,e){var r,n=t.range,o=new Date(t.r2l(n[1])),i=e.step,l=e.count;switch(e.stepmode){case\"backward\":r=t.l2r(+a.time[i].utc.offset(o,-l));break;case\"todate\":var s=a.time[i].utc.offset(o,-l);r=t.l2r(+a.time[i].utc.ceil(s))}return[r,n[1]]}var a=t(\"d3\");e.exports=function(t,e){var r=t._name,a={};if(\"all\"===e.step)a[r+\".autorange\"]=!0;else{var o=n(t,e);a[r+\".range[0]\"]=o[0],a[r+\".range[1]\"]=o[1]}return a}},{d3:7}],94:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"rangeselector\",schema:{layout:{\"xaxis.rangeselector\":t(\"./attributes\")}},layoutAttributes:t(\"./attributes\"),handleDefaults:t(\"./defaults\"),draw:t(\"./draw\")}},{\"./attributes\":88,\"./defaults\":91,\"./draw\":92}],95:[function(t,e,r){\"use strict\";var n=t(\"../color/attributes\");e.exports={bgcolor:{valType:\"color\",dflt:n.background},bordercolor:{valType:\"color\",dflt:n.defaultLine},borderwidth:{valType:\"integer\",dflt:0,min:0},autorange:{valType:\"boolean\",dflt:!0},range:{valType:\"info_array\",items:[{valType:\"any\"},{valType:\"any\"}]},thickness:{valType:\"number\",dflt:.15,min:0,max:1},visible:{valType:\"boolean\",dflt:!0}}},{\"../color/attributes\":24}],96:[function(t,e,r){\"use strict\";var n=t(\"../../plots/cartesian/axes\"),a=t(\"./constants\");e.exports=function(t){for(var e=n.list(t,\"x\",!0),r=0;r<e.length;r++){var o=e[r],i=o[a.name];i&&i.visible&&i.autorange&&o._min.length&&o._max.length&&(i._input.autorange=!0,\n",
|
|
"i._input.range=i.range=n.getAutoRange(o))}}},{\"../../plots/cartesian/axes\":171,\"./constants\":97}],97:[function(t,e,r){\"use strict\";e.exports={name:\"rangeslider\",containerClassName:\"rangeslider-container\",bgClassName:\"rangeslider-bg\",rangePlotClassName:\"rangeslider-rangeplot\",maskMinClassName:\"rangeslider-mask-min\",maskMaxClassName:\"rangeslider-mask-max\",slideBoxClassName:\"rangeslider-slidebox\",grabberMinClassName:\"rangeslider-grabber-min\",grabAreaMinClassName:\"rangeslider-grabarea-min\",handleMinClassName:\"rangeslider-handle-min\",grabberMaxClassName:\"rangeslider-grabber-max\",grabAreaMaxClassName:\"rangeslider-grabarea-max\",handleMaxClassName:\"rangeslider-handle-max\",maskColor:\"rgba(0,0,0,0.4)\",slideBoxFill:\"transparent\",slideBoxCursor:\"ew-resize\",grabAreaFill:\"transparent\",grabAreaCursor:\"col-resize\",grabAreaWidth:10,handleWidth:4,handleRadius:1,handleStrokeWidth:1,extraPad:15}},{}],98:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\");e.exports=function(t,e,r){function o(t,e){return n.coerce(i,s,a,t,e)}if(t[r].rangeslider){n.isPlainObject(t[r].rangeslider)||(t[r].rangeslider={});var i=t[r].rangeslider,l=e[r],s=l.rangeslider={};if(o(\"visible\")){if(o(\"bgcolor\",e.plot_bgcolor),o(\"bordercolor\"),o(\"borderwidth\"),o(\"thickness\"),o(\"autorange\",!l.isValidRange(i.range)),o(\"range\"),s.range){var c=s.range,u=l.range;c[0]=l.l2r(Math.min(l.r2l(c[0]),l.r2l(u[0]))),c[1]=l.l2r(Math.max(l.r2l(c[1]),l.r2l(u[1])))}l.cleanRange(\"rangeslider.range\"),s._input=i}}}},{\"../../lib\":136,\"./attributes\":95}],99:[function(t,e,r){\"use strict\";function n(t){var e=w.list({_fullLayout:t},\"x\",!0),r=A.name,n=[];if(t._has(\"gl2d\"))return n;for(var a=0;a<e.length;a++){var o=e[a];o[r]&&o[r].visible&&n.push(o)}return n}function a(t,e,r,n){var a=t.select(\"rect.\"+A.slideBoxClassName).node(),i=t.select(\"rect.\"+A.grabAreaMinClassName).node(),l=t.select(\"rect.\"+A.grabAreaMaxClassName).node();t.on(\"mousedown\",function(){function s(s){var c,u,y,x=+s.clientX-d;switch(f){case a:y=\"ew-resize\",c=p+x,u=v+x;break;case i:y=\"col-resize\",c=p+x,u=v;break;case l:y=\"col-resize\",c=p,u=v+x;break;default:y=\"ew-resize\",c=h,u=h+x}if(u<c){var b=u;u=c,c=b}n._pixelMin=c,n._pixelMax=u,M(g.select(m),y),o(t,e,r,n)}function c(){m.removeEventListener(\"mousemove\",s),m.removeEventListener(\"mouseup\",c),y.removeElement(m)}var u=g.event,f=u.target,d=u.clientX,h=d-t.node().getBoundingClientRect().left,p=n.d2p(r._rl[0]),v=n.d2p(r._rl[1]),m=k.coverSlip();m.addEventListener(\"mousemove\",s),m.addEventListener(\"mouseup\",c)})}function o(t,e,r,n){function a(t){return r.l2r(y.constrain(t,n._rl[0],n._rl[1]))}var o=a(n.p2d(n._pixelMin)),i=a(n.p2d(n._pixelMax));window.requestAnimationFrame(function(){v.relayout(e,r._name+\".range\",[o,i])})}function i(t,e,r,n){function a(t){return y.constrain(t,0,n._width)}function o(t){return y.constrain(t,-i,n._width+i)}var i=A.handleWidth/2,l=a(n.d2p(r._rl[0])),s=a(n.d2p(r._rl[1]));t.select(\"rect.\"+A.slideBoxClassName).attr(\"x\",l).attr(\"width\",s-l),t.select(\"rect.\"+A.maskMinClassName).attr(\"width\",l),t.select(\"rect.\"+A.maskMaxClassName).attr(\"x\",s).attr(\"width\",n._width-s);var c=Math.round(o(l-i))-.5,u=Math.round(o(s-i))+.5;t.select(\"g.\"+A.grabberMinClassName).attr(\"transform\",\"translate(\"+c+\",0.5)\"),t.select(\"g.\"+A.grabberMaxClassName).attr(\"transform\",\"translate(\"+u+\",0.5)\")}function l(t,e,r,n){var a=t.selectAll(\"rect.\"+A.bgClassName).data([0]);a.enter().append(\"rect\").classed(A.bgClassName,!0).attr({x:0,y:0,\"shape-rendering\":\"crispEdges\"});var o=n.borderwidth%2==0?n.borderwidth:n.borderwidth-1,i=-n._offsetShift,l=x.crispRound(e,n.borderwidth);a.attr({width:n._width+o,height:n._height+o,transform:\"translate(\"+i+\",\"+i+\")\",fill:n.bgcolor,stroke:n.bordercolor,\"stroke-width\":l})}function s(t,e,r,n){var a=e._fullLayout,o=a._topdefs.selectAll(\"#\"+n._clipId).data([0]);o.enter().append(\"clipPath\").attr(\"id\",n._clipId).append(\"rect\").attr({x:0,y:0}),o.select(\"rect\").attr({width:n._width,height:n._height})}function c(t,e,r,n){var a=w.getSubplots(e,r),o=e.calcdata,i=t.selectAll(\"g.\"+A.rangePlotClassName).data(a,y.identity);i.enter().append(\"g\").attr(\"class\",function(t){return A.rangePlotClassName+\" \"+t}).call(x.setClipUrl,n._clipId),i.order(),i.exit().remove();var l;i.each(function(t,a){var i=g.select(this),s=0===a,c=w.getFromId(e,t,\"y\"),f=c._name,d={data:[],layout:{xaxis:{type:r.type,domain:[0,1],range:n.range.slice(),calendar:r.calendar},width:n._width,height:n._height,margin:{t:0,b:0,l:0,r:0}}};d.layout[f]={type:c.type,domain:[0,1],range:c.range.slice(),calendar:c.calendar},m.supplyDefaults(d);var h=d._fullLayout.xaxis,p=d._fullLayout[f],v={id:t,plotgroup:i,xaxis:h,yaxis:p};s?l=v:(v.mainplot=\"xy\",v.mainplotinfo=l),_.rangePlot(e,v,u(o,t))})}function u(t,e){for(var r=[],n=0;n<t.length;n++){var a=t[n],o=a[0].trace;o.xaxis+o.yaxis===e&&r.push(a)}return r}function f(t,e,r,n){var a=t.selectAll(\"rect.\"+A.maskMinClassName).data([0]);a.enter().append(\"rect\").classed(A.maskMinClassName,!0).attr({x:0,y:0}).attr(\"shape-rendering\",\"crispEdges\"),a.attr(\"height\",n._height).call(b.fill,A.maskColor);var o=t.selectAll(\"rect.\"+A.maskMaxClassName).data([0]);o.enter().append(\"rect\").classed(A.maskMaxClassName,!0).attr(\"y\",0).attr(\"shape-rendering\",\"crispEdges\"),o.attr(\"height\",n._height).call(b.fill,A.maskColor)}function d(t,e,r,n){if(!e._context.staticPlot){var a=t.selectAll(\"rect.\"+A.slideBoxClassName).data([0]);a.enter().append(\"rect\").classed(A.slideBoxClassName,!0).attr(\"y\",0).attr(\"cursor\",A.slideBoxCursor).attr(\"shape-rendering\",\"crispEdges\"),a.attr({height:n._height,fill:A.slideBoxFill})}}function h(t,e,r,n){var a=t.selectAll(\"g.\"+A.grabberMinClassName).data([0]);a.enter().append(\"g\").classed(A.grabberMinClassName,!0);var o=t.selectAll(\"g.\"+A.grabberMaxClassName).data([0]);o.enter().append(\"g\").classed(A.grabberMaxClassName,!0);var i={x:0,width:A.handleWidth,rx:A.handleRadius,fill:b.background,stroke:b.defaultLine,\"stroke-width\":A.handleStrokeWidth,\"shape-rendering\":\"crispEdges\"},l={y:Math.round(n._height/4),height:Math.round(n._height/2)},s=a.selectAll(\"rect.\"+A.handleMinClassName).data([0]);s.enter().append(\"rect\").classed(A.handleMinClassName,!0).attr(i),s.attr(l);var c=o.selectAll(\"rect.\"+A.handleMaxClassName).data([0]);if(c.enter().append(\"rect\").classed(A.handleMaxClassName,!0).attr(i),c.attr(l),!e._context.staticPlot){var u={width:A.grabAreaWidth,x:0,y:0,fill:A.grabAreaFill,cursor:A.grabAreaCursor},f=a.selectAll(\"rect.\"+A.grabAreaMinClassName).data([0]);f.enter().append(\"rect\").classed(A.grabAreaMinClassName,!0).attr(u),f.attr(\"height\",n._height);var d=o.selectAll(\"rect.\"+A.grabAreaMaxClassName).data([0]);d.enter().append(\"rect\").classed(A.grabAreaMaxClassName,!0).attr(u),d.attr(\"height\",n._height)}}function p(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(A.name)!==-1&&m.autoMargin(t,a)}}var g=t(\"d3\"),v=t(\"../../plotly\"),m=t(\"../../plots/plots\"),y=t(\"../../lib\"),x=t(\"../drawing\"),b=t(\"../color\"),_=t(\"../../plots/cartesian\"),w=t(\"../../plots/cartesian/axes\"),k=t(\"../dragelement\"),M=t(\"../../lib/setcursor\"),A=t(\"./constants\");e.exports=function(t){function e(t){return t._name}var r=t._fullLayout,o=n(r),u=r._infolayer.selectAll(\"g.\"+A.containerClassName).data(o,e);u.enter().append(\"g\").classed(A.containerClassName,!0).attr(\"pointer-events\",\"all\"),u.exit().each(function(t){var e=g.select(this),n=t[A.name];e.remove(),r._topdefs.select(\"#\"+n._clipId).remove()}),u.exit().size()&&p(t),0!==o.length&&u.each(function(e){var n=g.select(this),o=e[A.name],u=r[w.id2name(e.anchor)],p=r.margin,v=r._size,y=e.domain,x=u.domain,b=(e._boundingBox||{}).height||0;o._id=A.name+e._id,o._clipId=o._id+\"-\"+r._uid,o._width=v.w*(y[1]-y[0]),o._height=(r.height-p.b-p.t)*o.thickness,o._offsetShift=Math.floor(o.borderwidth/2);var _=Math.round(p.l+v.w*y[0]),k=Math.round(p.t+v.h*(1-x[0])+b+o._offsetShift+A.extraPad);n.attr(\"transform\",\"translate(\"+_+\",\"+k+\")\");var M=e.r2l(o.range[0]),T=e.r2l(o.range[1]),L=T-M;o.p2d=function(t){return t/o._width*L+M},o.d2p=function(t){return(t-M)/L*o._width},o._rl=[M,T],n.call(l,t,e,o).call(s,t,e,o).call(c,t,e,o).call(f,t,e,o).call(d,t,e,o).call(h,t,e,o),a(n,t,e,o),i(n,t,e,o),m.autoMargin(t,o._id,{x:y[0],y:x[0],l:0,r:0,t:0,b:o._height+p.b+b,pad:A.extraPad+2*o._offsetShift})})}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian\":181,\"../../plots/cartesian/axes\":171,\"../../plots/plots\":199,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":97,d3:7}],100:[function(t,e,r){\"use strict\";e.exports={moduleType:\"component\",name:\"rangeslider\",schema:{layout:{\"xaxis.rangeslider\":t(\"./attributes\")}},layoutAttributes:t(\"./attributes\"),handleDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:t(\"./draw\")}},{\"./attributes\":95,\"./calc_autorange\":96,\"./defaults\":98,\"./draw\":99}],101:[function(t,e,r){\"use strict\";var n=t(\"../annotations/attributes\"),a=t(\"../../traces/scatter/attributes\").line,o=t(\"../drawing/attributes\").dash,i=t(\"../../lib/extend\").extendFlat;e.exports={_isLinkedToArray:\"shape\",visible:{valType:\"boolean\",dflt:!0},type:{valType:\"enumerated\",values:[\"circle\",\"rect\",\"path\",\"line\"]},layer:{valType:\"enumerated\",values:[\"below\",\"above\"],dflt:\"above\"},xref:i({},n.xref,{}),x0:{valType:\"any\"},x1:{valType:\"any\"},yref:i({},n.yref,{}),y0:{valType:\"any\"},y1:{valType:\"any\"},path:{valType:\"string\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},line:{color:a.color,width:a.width,dash:o},fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\"}}},{\"../../lib/extend\":132,\"../../traces/scatter/attributes\":240,\"../annotations/attributes\":16,\"../drawing/attributes\":48}],102:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){var o=\"category\"===t.type?Number:t.d2c;if(void 0!==e)return[o(e),o(r)];if(n){var s,c,u,f,d,h=1/0,p=-1/0,g=n.match(i.segmentRE);for(\"date\"===t.type&&(o=l.decodeDate(o)),s=0;s<g.length;s++)c=g[s],void 0!==(u=a[c.charAt(0)].drawn)&&(!(f=g[s].substr(1).match(i.paramRE))||f.length<u||(d=o(f[u]),d<h&&(h=d),d>p&&(p=d)));return p>=h?[h,p]:void 0}}var a=t(\"../../lib\"),o=t(\"../../plots/cartesian/axes\"),i=t(\"./constants\"),l=t(\"./helpers\");e.exports=function(t){var e=t._fullLayout,r=a.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var l=0;l<r.length;l++){var s,c,u=r[l],f=u.line.width/2;\"paper\"!==u.xref&&(s=o.getFromId(t,u.xref),(c=n(s,u.x0,u.x1,u.path,i.paramIsX))&&o.expand(s,c,{ppad:f})),\"paper\"!==u.yref&&(s=o.getFromId(t,u.yref),(c=n(s,u.y0,u.y1,u.path,i.paramIsY))&&o.expand(s,c,{ppad:f}))}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./constants\":103,\"./helpers\":106}],103:[function(t,e,r){\"use strict\";e.exports={segmentRE:/[MLHVQCTSZ][^MLHVQCTSZ]*/g,paramRE:/[^\\s,]+/g,paramIsX:{M:{0:!0,drawn:0},L:{0:!0,drawn:0},H:{0:!0,drawn:0},V:{},Q:{0:!0,2:!0,drawn:2},C:{0:!0,2:!0,4:!0,drawn:4},T:{0:!0,drawn:0},S:{0:!0,2:!0,drawn:2},Z:{}},paramIsY:{M:{1:!0,drawn:1},L:{1:!0,drawn:1},H:{},V:{0:!0,drawn:0},Q:{1:!0,3:!0,drawn:3},C:{1:!0,3:!0,5:!0,drawn:5},T:{1:!0,drawn:1},S:{1:!0,3:!0,drawn:5},Z:{}},numParams:{M:2,L:2,H:1,V:1,Q:4,C:6,T:2,S:4,Z:0}}},{}],104:[function(t,e,r){\"use strict\";var n=t(\"../../plots/array_container_defaults\"),a=t(\"./shape_defaults\");e.exports=function(t,e){n(t,e,{name:\"shapes\",handleItemDefaults:a})}},{\"../../plots/array_container_defaults\":168,\"./shape_defaults\":108}],105:[function(t,e,r){\"use strict\";function n(t){var e=t._fullLayout;e._shapeUpperLayer.selectAll(\"path\").remove(),e._shapeLowerLayer.selectAll(\"path\").remove(),e._shapeSubplotLayers.selectAll(\"path\").remove();for(var r=0;r<e.shapes.length;r++)e.shapes[r].visible&&a(t,r)}function a(t,e){function r(r){var n={\"data-index\":e,\"fill-rule\":\"evenodd\",d:i(t,a)},l=a.line.width?a.line.color:\"rgba(0,0,0,0)\",s=r.append(\"path\").attr(n).style(\"opacity\",a.opacity).call(d.stroke,l).call(d.fill,a.fillcolor).call(h.dashLine,a.line.dash,a.line.width),c=(a.xref+a.yref).replace(/paper/g,\"\");s.call(h.setClipUrl,c?\"clip\"+t._fullLayout._uid+c:null),t._context.editable&&o(t,s,a,e)}t._fullLayout._paper.selectAll('.shapelayer [data-index=\"'+e+'\"]').remove();var n=(t.layout.shapes||[])[e],a=t._fullLayout.shapes[e];if(n&&a.visible!==!1)if(\"below\"!==a.layer)r(t._fullLayout._shapeUpperLayer);else if(\"paper\"===a.xref||\"paper\"===a.yref)r(t._fullLayout._shapeLowerLayer);else{var l=t._fullLayout._plots[a.xref+a.yref];if(l){var s=l.mainplot||l;r(s.shapelayer)}else r(t._fullLayout._shapeLowerLayer)}}function o(t,e,r,n){function a(t){var r=W.right-W.left,n=W.bottom-W.top,a=t.clientX-W.left,o=t.clientY-W.top,i=r>G&&n>Y&&!t.shiftKey?p.getCursor(a/r,1-o/n):\"move\";g(e,i),X=i.split(\"-\")[0]}function o(e){j=f.getFromId(t,r.xref),B=f.getFromId(t,r.yref),q=m.getDataToPixel(t,j),H=m.getDataToPixel(t,B,!0),V=m.getPixelToData(t,j),U=m.getPixelToData(t,B,!0);var o=\"shapes[\"+n+\"]\";\"path\"===r.type?(R=r.path,F=o+\".path\"):(v=q(r.x0),y=H(r.y0),x=q(r.x1),b=H(r.y1),_=o+\".x0\",w=o+\".y0\",k=o+\".x1\",M=o+\".y1\"),v<x?(L=v,O=o+\".x0\",N=\"x0\",C=x,D=o+\".x1\",I=\"x1\"):(L=x,O=o+\".x1\",N=\"x1\",C=v,D=o+\".x0\",I=\"x0\"),y<b?(A=y,S=o+\".y0\",P=\"y0\",T=b,z=o+\".y1\",E=\"y1\"):(A=b,S=o+\".y1\",P=\"y1\",T=y,z=o+\".y0\",E=\"y0\"),h={},a(e),Z.moveFn=\"move\"===X?u:d}function l(r){g(e),r&&c.relayout(t,h)}function u(n,a){if(\"path\"===r.type){var o=function(t){return V(q(t)+n)};j&&\"date\"===j.type&&(o=m.encodeDate(o));var l=function(t){return U(H(t)+a)};B&&\"date\"===B.type&&(l=m.encodeDate(l)),r.path=s(R,o,l),h[F]=r.path}else h[_]=r.x0=V(v+n),h[w]=r.y0=U(y+a),h[k]=r.x1=V(x+n),h[M]=r.y1=U(b+a);e.attr(\"d\",i(t,r))}function d(n,a){if(\"path\"===r.type){var o=function(t){return V(q(t)+n)};j&&\"date\"===j.type&&(o=m.encodeDate(o));var l=function(t){return U(H(t)+a)};B&&\"date\"===B.type&&(l=m.encodeDate(l)),r.path=s(R,o,l),h[F]=r.path}else{var c=~X.indexOf(\"n\")?A+a:A,u=~X.indexOf(\"s\")?T+a:T,f=~X.indexOf(\"w\")?L+n:L,d=~X.indexOf(\"e\")?C+n:C;u-c>Y&&(h[S]=r[P]=U(c),h[z]=r[E]=U(u)),d-f>G&&(h[O]=r[N]=V(f),h[D]=r[I]=V(d))}e.attr(\"d\",i(t,r))}var h,v,y,x,b,_,w,k,M,A,T,L,C,S,z,O,D,P,E,N,I,R,F,j,B,q,H,V,U,X,G=10,Y=10,Z={setCursor:a,element:e.node(),prepFn:o,doneFn:l},W=Z.element.getBoundingClientRect();p.init(Z)}function i(t,e){var r,n,a,o,i=e.type,s=f.getFromId(t,e.xref),c=f.getFromId(t,e.yref),u=t._fullLayout._size;if(s?(r=m.shapePositionToRange(s),n=function(t){return s._offset+s.r2p(r(t,!0))}):n=function(t){return u.l+u.w*t},c?(a=m.shapePositionToRange(c),o=function(t){return c._offset+c.r2p(a(t,!0))}):o=function(t){return u.t+u.h*(1-t)},\"path\"===i)return s&&\"date\"===s.type&&(n=m.decodeDate(n)),c&&\"date\"===c.type&&(o=m.decodeDate(o)),l(e.path,n,o);var d=n(e.x0),h=n(e.x1),p=o(e.y0),g=o(e.y1);if(\"line\"===i)return\"M\"+d+\",\"+p+\"L\"+h+\",\"+g;if(\"rect\"===i)return\"M\"+d+\",\"+p+\"H\"+h+\"V\"+g+\"H\"+d+\"Z\";var v=(d+h)/2,y=(p+g)/2,x=Math.abs(v-d),b=Math.abs(y-p),_=\"A\"+x+\",\"+b,w=v+x+\",\"+y;return\"M\"+w+_+\" 0 1,1 \"+v+\",\"+(y-b)+_+\" 0 0,1 \"+w+\"Z\"}function l(t,e,r){return t.replace(v.segmentRE,function(t){var n=0,a=t.charAt(0),o=v.paramIsX[a],i=v.paramIsY[a],l=v.numParams[a],s=t.substr(1).replace(v.paramRE,function(t){return o[n]?t=e(t):i[n]&&(t=r(t)),n++,n>l&&(t=\"X\"),t});return n>l&&(s=s.replace(/[\\s,]*X.*/,\"\"),u.log(\"Ignoring extra params in segment \"+t)),a+s})}function s(t,e,r){return t.replace(v.segmentRE,function(t){var n=0,a=t.charAt(0),o=v.paramIsX[a],i=v.paramIsY[a],l=v.numParams[a];return a+t.substr(1).replace(v.paramRE,function(t){return n>=l?t:(o[n]?t=e(t):i[n]&&(t=r(t)),n++,t)})})}var c=t(\"../../plotly\"),u=t(\"../../lib\"),f=t(\"../../plots/cartesian/axes\"),d=t(\"../color\"),h=t(\"../drawing\"),p=t(\"../dragelement\"),g=t(\"../../lib/setcursor\"),v=t(\"./constants\"),m=t(\"./helpers\");e.exports={draw:n,drawOne:a}},{\"../../lib\":136,\"../../lib/setcursor\":151,\"../../plotly\":166,\"../../plots/cartesian/axes\":171,\"../color\":25,\"../dragelement\":46,\"../drawing\":49,\"./constants\":103,\"./helpers\":106}],106:[function(t,e,r){\"use strict\";r.rangeToShapePosition=function(t){return\"log\"===t.type?t.r2d:function(t){return t}},r.shapePositionToRange=function(t){return\"log\"===t.type?t.d2r:function(t){return t}},r.decodeDate=function(t){return function(e){return e.replace&&(e=e.replace(\"_\",\" \")),t(e)}},r.encodeDate=function(t){return function(e){return t(e).replace(\" \",\"_\")}},r.getDataToPixel=function(t,e,n){var a,o=t._fullLayout._size;if(e){var i=r.shapePositionToRange(e);a=function(t){return e._offset+e.r2p(i(t,!0))},\"date\"===e.type&&(a=r.decodeDate(a))}else a=n?function(t){return o.t+o.h*(1-t)}:function(t){return o.l+o.w*t};return a},r.getPixelToData=function(t,e,n){var a,o=t._fullLayout._size;if(e){var i=r.rangeToShapePosition(e);a=function(t){return i(e.p2r(t-e._offset))}}else a=n?function(t){return 1-(t-o.t)/o.h}:function(t){return(t-o.l)/o.w};return a}},{}],107:[function(t,e,r){\"use strict\";var n=t(\"./draw\");e.exports={moduleType:\"component\",name:\"shapes\",layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),calcAutorange:t(\"./calc_autorange\"),draw:n.draw,drawOne:n.drawOne}},{\"./attributes\":101,\"./calc_autorange\":102,\"./defaults\":104,\"./draw\":105}],108:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"./attributes\"),i=t(\"./helpers\");e.exports=function(t,e,r,l,s){function c(r,a){return n.coerce(t,e,o,r,a)}if(l=l||{},s=s||{},!c(\"visible\",!s.itemIsNotPlainObject))return e;c(\"layer\"),c(\"opacity\"),c(\"fillcolor\"),c(\"line.color\"),c(\"line.width\"),c(\"line.dash\");for(var u=t.path?\"path\":\"rect\",f=c(\"type\",u),d=[\"x\",\"y\"],h=0;h<2;h++){var p=d[h],g={_fullLayout:r},v=a.coerceRef(t,e,g,p,\"\",\"paper\");if(\"path\"!==f){var m,y,x;\"paper\"!==v?(m=a.getFromId(g,v),x=i.rangeToShapePosition(m),y=i.shapePositionToRange(m)):y=x=n.identity;var b=p+\"0\",_=p+\"1\",w=t[b],k=t[_];t[b]=y(t[b],!0),t[_]=y(t[_],!0),a.coercePosition(e,g,c,v,b,.25),a.coercePosition(e,g,c,v,_,.75),e[b]=x(e[b]),e[_]=x(e[_]),t[b]=w,t[_]=k}}return\"path\"===f?c(\"path\"):n.noneOrAll(t,e,[\"x0\",\"x1\",\"y0\",\"y1\"]),e}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"./attributes\":101,\"./helpers\":106}],109:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../../plots/pad_attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"../../lib/extend\").extendDeep,l=t(\"../../plots/animation_attributes\"),s=t(\"./constants\"),c={_isLinkedToArray:\"step\",method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\"},value:{valType:\"string\"}};e.exports={_isLinkedToArray:\"slider\",visible:{valType:\"boolean\",dflt:!0},active:{valType:\"number\",min:0,dflt:0},steps:c,lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",min:-2,max:3,dflt:0},pad:i({},a,{},{t:{dflt:20}}),xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:0},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},transition:{duration:{valType:\"number\",min:0,dflt:150},easing:{valType:\"enumerated\",values:l.transition.easing.values,dflt:\"cubic-in-out\"}},currentvalue:{visible:{valType:\"boolean\",dflt:!0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},offset:{valType:\"number\",dflt:10},prefix:{valType:\"string\"},suffix:{valType:\"string\"},font:o({},n,{})},font:o({},n,{}),activebgcolor:{valType:\"color\",dflt:s.gripBgActiveColor},bgcolor:{valType:\"color\",dflt:s.railBgColor},bordercolor:{valType:\"color\",dflt:s.railBorderColor},borderwidth:{valType:\"number\",min:0,dflt:s.railBorderWidth},ticklen:{valType:\"number\",min:0,dflt:s.tickLength},tickcolor:{valType:\"color\",dflt:s.tickColor},tickwidth:{valType:\"number\",min:0,dflt:1},minorticklen:{valType:\"number\",min:0,dflt:s.minorTickLength}}},{\"../../lib/extend\":132,\"../../plots/animation_attributes\":167,\"../../plots/font_attributes\":195,\"../../plots/pad_attributes\":198,\"./constants\":110}],110:[function(t,e,r){\"use strict\";e.exports={name:\"sliders\",containerClassName:\"slider-container\",groupClassName:\"slider-group\",inputAreaClass:\"slider-input-area\",railRectClass:\"slider-rail-rect\",railTouchRectClass:\"slider-rail-touch-rect\",gripRectClass:\"slider-grip-rect\",tickRectClass:\"slider-tick-rect\",inputProxyClass:\"slider-input-proxy\",labelsClass:\"slider-labels\",labelGroupClass:\"slider-label-group\",labelClass:\"slider-label\",currentValueClass:\"slider-current-value\",railHeight:5,menuIndexAttrName:\"slider-active-index\",autoMarginIdRoot:\"slider-\",minWidth:30,minHeight:30,textPadX:40,fontSizeToHeight:1.3,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:\"#bec8d9\",railBgColor:\"#f8fafc\",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:\"#bec8d9\",gripBgColor:\"#f6f8fa\",gripBgActiveColor:\"#dbdde0\",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:\"#333\",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:\"#333\",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},{}],111:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return o.coerce(t,e,l,r,n)}n(\"visible\",a(t,e).length>0)&&(n(\"active\"),n(\"x\"),n(\"y\"),o.noneOrAll(t,e,[\"x\",\"y\"]),n(\"xanchor\"),n(\"yanchor\"),n(\"len\"),n(\"lenmode\"),n(\"pad.t\"),n(\"pad.r\"),n(\"pad.b\"),n(\"pad.l\"),o.coerceFont(n,\"font\",r.font),n(\"currentvalue.visible\")&&(n(\"currentvalue.xanchor\"),n(\"currentvalue.prefix\"),n(\"currentvalue.suffix\"),n(\"currentvalue.offset\"),o.coerceFont(n,\"currentvalue.font\",e.font)),n(\"transition.duration\"),n(\"transition.easing\"),n(\"bgcolor\"),n(\"activebgcolor\"),n(\"bordercolor\"),n(\"borderwidth\"),n(\"ticklen\"),n(\"tickwidth\"),n(\"tickcolor\"),n(\"minorticklen\"))}function a(t,e){function r(t,e){return o.coerce(n,a,u,t,e)}for(var n,a,i=t.steps||[],l=e.steps=[],s=0;s<i.length;s++)n=i[s],a={},o.isPlainObject(n)&&Array.isArray(n.args)&&(r(\"method\"),r(\"args\"),r(\"label\",\"step-\"+s),r(\"value\",a.label),l.push(a));return l}var o=t(\"../../lib\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\"),s=t(\"./constants\"),c=s.name,u=l.steps;e.exports=function(t,e){i(t,e,{name:c,handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"./attributes\":109,\"./constants\":110}],112:[function(t,e,r){\"use strict\";function n(t){for(var e=t[C.name],r=[],n=0;n<e.length;n++){var a=e[n];a.visible&&a.steps.length&&r.push(a)}return r}function a(t){return t._index}function o(t,e){var r=A.tester.selectAll(\"g.\"+C.labelGroupClass).data(e.steps);r.enter().append(\"g\").classed(C.labelGroupClass,!0);var n=0,a=0;if(r.each(function(t){var r=w.select(this),o=c(r,{step:t},e),i=o.node()&&A.bBox(o.node()).width||0;a=o.node()&&A.bBox(o.node()).height||0,n=Math.max(n,i)}),r.remove(),e.inputAreaWidth=Math.max(C.railWidth,C.gripHeight),e.currentValueMaxWidth=0,e.currentValueHeight=0,e.currentValueTotalHeight=0,e.currentvalue.visible){var o=A.tester.append(\"g\");r.each(function(t){var r=l(o,e,t.label),n=r.node()&&A.bBox(r.node())||{width:0,height:0};e.currentValueMaxWidth=Math.max(e.currentValueMaxWidth,Math.ceil(n.width)),e.currentValueHeight=Math.max(e.currentValueHeight,Math.ceil(n.height))}),e.currentValueTotalHeight=e.currentValueHeight+e.currentvalue.offset,o.remove()}var i=t._fullLayout._size;e.lx=i.l+i.w*e.x,e.ly=i.t+i.h*(1-e.y),\"fraction\"===e.lenmode?e.outerLength=Math.round(i.w*e.len):e.outerLength=e.len,e.lenPad=Math.round(.5*C.gripWidth),e.inputAreaStart=0,e.inputAreaLength=Math.round(e.outerLength-e.pad.l-e.pad.r);var s=e.inputAreaLength-2*C.stepInset,u=s/(e.steps.length-1),f=n+C.labelPadding;e.labelStride=Math.max(1,Math.ceil(f/u)),e.labelHeight=a,e.height=e.currentValueTotalHeight+C.tickOffset+e.ticklen+C.labelOffset+e.labelHeight+e.pad.t+e.pad.b;var d=\"left\";L.isRightAnchor(e)&&(e.lx-=e.outerLength,d=\"right\"),L.isCenterAnchor(e)&&(e.lx-=e.outerLength/2,d=\"center\");var h=\"top\";L.isBottomAnchor(e)&&(e.ly-=e.height,h=\"bottom\"),L.isMiddleAnchor(e)&&(e.ly-=e.height/2,h=\"middle\"),e.outerLength=Math.ceil(e.outerLength),e.height=Math.ceil(e.height),e.lx=Math.round(e.lx),e.ly=Math.round(e.ly),k.autoMargin(t,C.autoMarginIdRoot+e._index,{x:e.x,y:e.y,l:e.outerLength*({right:1,center:.5}[d]||0),r:e.outerLength*({left:1,center:.5}[d]||0),b:e.height*({top:1,middle:.5}[h]||0),t:e.height*({bottom:1,middle:.5}[h]||0)})}function i(t,e,r){r.active>=r.steps.length&&(r.active=0),e.call(l,r).call(b,r).call(u,r).call(p,r).call(x,t,r).call(s,t,r),A.setTranslate(e,r.lx+r.pad.l,r.ly+r.pad.t),e.call(v,r,r.active/(r.steps.length-1),!1),e.call(l,r)}function l(t,e,r){if(e.currentvalue.visible){var n,a,o=t.selectAll(\"text\").data([0]);switch(e.currentvalue.xanchor){case\"right\":n=e.inputAreaLength-C.currentValueInset-e.currentValueMaxWidth,a=\"left\";break;case\"center\":n=.5*e.inputAreaLength,a=\"middle\";break;default:n=C.currentValueInset,a=\"left\"}o.enter().append(\"text\").classed(C.labelClass,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",a);var i=e.currentvalue.prefix?e.currentvalue.prefix:\"\";if(\"string\"==typeof r)i+=r;else{i+=e.steps[e.active].label}return e.currentvalue.suffix&&(i+=e.currentvalue.suffix),o.call(A.font,e.currentvalue.font).text(i).call(T.convertToTspans),A.setTranslate(o,n,e.currentValueHeight),o}}function s(t,e,r){var n=t.selectAll(\"rect.\"+C.gripRectClass).data([0]);n.enter().append(\"rect\").classed(C.gripRectClass,!0).call(h,e,t,r).style(\"pointer-events\",\"all\"),n.attr({width:C.gripWidth,height:C.gripHeight,rx:C.gripRadius,ry:C.gripRadius}).call(M.stroke,r.bordercolor).call(M.fill,r.bgcolor).style(\"stroke-width\",r.borderwidth+\"px\")}function c(t,e,r){var n=t.selectAll(\"text\").data([0]);return n.enter().append(\"text\").classed(C.labelClass,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"middle\"),n.call(A.font,r.font).text(e.step.label).call(T.convertToTspans),n}function u(t,e){var r=t.selectAll(\"g.\"+C.labelsClass).data([0]);r.enter().append(\"g\").classed(C.labelsClass,!0);var n=r.selectAll(\"g.\"+C.labelGroupClass).data(e.labelSteps);n.enter().append(\"g\").classed(C.labelGroupClass,!0),n.exit().remove(),n.each(function(t){var r=w.select(this);r.call(c,t,e),A.setTranslate(r,m(e,t.fraction),C.tickOffset+e.ticklen+e.labelHeight+C.labelOffset+e.currentValueTotalHeight)})}function f(t,e,r,n,a){var o=Math.round(n*(r.steps.length-1));o!==r.active&&d(t,e,r,o,!0,a)}function d(t,e,r,n,a,o){var i=r.active;r._input.active=r.active=n;var s=r.steps[r.active];e.call(v,r,r.active/(r.steps.length-1),o),e.call(l,r),t.emit(\"plotly_sliderchange\",{slider:r,step:r.steps[r.active],interaction:a,previousActive:i}),s&&s.method&&a&&(e._nextMethod?(e._nextMethod.step=s,e._nextMethod.doCallback=a,e._nextMethod.doTransition=o):(e._nextMethod={step:s,doCallback:a,doTransition:o},e._nextMethodRaf=window.requestAnimationFrame(function(){var r=e._nextMethod.step;r.method&&(k.executeAPICommand(t,r.method,r.args),e._nextMethod=null,e._nextMethodRaf=null)})))}function h(t,e,r){function n(){return r.data()[0]}var a=r.node(),o=w.select(e);t.on(\"mousedown\",function(){var t=n();e.emit(\"plotly_sliderstart\",{slider:t});var i=r.select(\".\"+C.gripRectClass);w.event.stopPropagation(),w.event.preventDefault(),i.call(M.fill,t.activebgcolor);var l=y(t,w.mouse(a)[0]);f(e,r,t,l,!0),t._dragging=!0,o.on(\"mousemove\",function(){var t=n(),o=y(t,w.mouse(a)[0]);f(e,r,t,o,!1)}),o.on(\"mouseup\",function(){var t=n();t._dragging=!1,i.call(M.fill,t.bgcolor),o.on(\"mouseup\",null),o.on(\"mousemove\",null),e.emit(\"plotly_sliderend\",{slider:t,step:t.steps[t.active]})})})}function p(t,e){var r=t.selectAll(\"rect.\"+C.tickRectClass).data(e.steps);r.enter().append(\"rect\").classed(C.tickRectClass,!0),r.exit().remove(),r.attr({width:e.tickwidth+\"px\",\"shape-rendering\":\"crispEdges\"}),r.each(function(t,r){var n=r%e.labelStride==0,a=w.select(this);a.attr({height:n?e.ticklen:e.minorticklen}).call(M.fill,e.tickcolor),A.setTranslate(a,m(e,r/(e.steps.length-1))-.5*e.tickwidth,(n?C.tickOffset:C.minorTickOffset)+e.currentValueTotalHeight)})}function g(t){t.labelSteps=[];for(var e=t.steps.length,r=0;r<e;r+=t.labelStride)t.labelSteps.push({fraction:r/(e-1),step:t.steps[r]})}function v(t,e,r,n){var a=t.select(\"rect.\"+C.gripRectClass),o=m(e,r);if(!e._invokingCommand){var i=a;n&&e.transition.duration>0&&(i=i.transition().duration(e.transition.duration).ease(e.transition.easing)),i.attr(\"transform\",\"translate(\"+(o-.5*C.gripWidth)+\",\"+e.currentValueTotalHeight+\")\")}}function m(t,e){return t.inputAreaStart+C.stepInset+(t.inputAreaLength-2*C.stepInset)*Math.min(1,Math.max(0,e))}function y(t,e){return Math.min(1,Math.max(0,(e-C.stepInset-t.inputAreaStart)/(t.inputAreaLength-2*C.stepInset-2*t.inputAreaStart)))}function x(t,e,r){var n=t.selectAll(\"rect.\"+C.railTouchRectClass).data([0]);n.enter().append(\"rect\").classed(C.railTouchRectClass,!0).call(h,e,t,r).style(\"pointer-events\",\"all\"),n.attr({width:r.inputAreaLength,height:Math.max(r.inputAreaWidth,C.tickOffset+r.ticklen+r.labelHeight)}).call(M.fill,r.bgcolor).attr(\"opacity\",0),A.setTranslate(n,0,r.currentValueTotalHeight)}function b(t,e){var r=t.selectAll(\"rect.\"+C.railRectClass).data([0]);r.enter().append(\"rect\").classed(C.railRectClass,!0);var n=e.inputAreaLength-2*C.railInset;r.attr({width:n,height:C.railWidth,rx:C.railRadius,ry:C.railRadius,\"shape-rendering\":\"crispEdges\"}).call(M.stroke,e.bordercolor).call(M.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\"),A.setTranslate(r,C.railInset,.5*(e.inputAreaWidth-C.railWidth)+e.currentValueTotalHeight)}function _(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(C.autoMarginIdRoot)!==-1&&k.autoMargin(t,a)}}var w=t(\"d3\"),k=t(\"../../plots/plots\"),M=t(\"../color\"),A=t(\"../drawing\"),T=t(\"../../lib/svg_text_utils\"),L=t(\"../legend/anchor_utils\"),C=t(\"./constants\");e.exports=function(t){var e=t._fullLayout,r=n(e),l=e._infolayer.selectAll(\"g.\"+C.containerClassName).data(r.length>0?[0]:[]);if(l.enter().append(\"g\").classed(C.containerClassName,!0).style(\"cursor\",\"ew-resize\"),l.exit().remove(),l.exit().size()&&_(t),0!==r.length){var s=l.selectAll(\"g.\"+C.groupClassName).data(r,a);s.enter().append(\"g\").classed(C.groupClassName,!0),s.exit().each(function(e){w.select(this).remove(),e._commandObserver.remove(),delete e._commandObserver,k.autoMargin(t,C.autoMarginIdRoot+e._index)});for(var c=0;c<r.length;c++){var u=r[c];o(t,u)}s.each(function(e){if(!(e.steps.length<2)){var r=w.select(this);g(e),k.manageCommandObserver(t,e,e.steps,function(e){var n=r.data()[0];n.active!==e.index&&(n._dragging||d(t,r,n,e.index,!1,!0))}),i(t,w.select(this),e)}})}}},{\"../../lib/svg_text_utils\":153,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":110,d3:7}],113:[function(t,e,r){\"use strict\";var n=t(\"./constants\");e.exports={moduleType:\"component\",name:n.name,layoutAttributes:t(\"./attributes\"),supplyLayoutDefaults:t(\"./defaults\"),draw:t(\"./draw\")}},{\"./attributes\":109,\"./constants\":110,\"./defaults\":111,\"./draw\":112}],114:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=t(\"../../plotly\"),i=t(\"../../plots/plots\"),l=t(\"../../lib\"),s=t(\"../drawing\"),c=t(\"../color\"),u=t(\"../../lib/svg_text_utils\"),f=t(\"../../constants/interactions\");(e.exports={}).draw=function(t,e,r){function d(t){l.syncOrAsync([h,p],t)}function h(e){return e.attr(\"transform\",_?\"rotate(\"+[_.rotate,b.x,b.y]+\") translate(0, \"+_.offset+\")\":null),e.style({\"font-family\":M,\"font-size\":n.round(A,2)+\"px\",fill:c.rgb(T),opacity:L*c.opacity(T),\"font-weight\":i.fontWeight}).attr(b).call(u.convertToTspans).attr(b),e.selectAll(\"tspan.line\").attr(b),i.previousPromises(t)}function p(t){var e=n.select(t.node().parentNode);if(x&&x.selection&&x.side&&S){e.attr(\"transform\",null);var r=0,o={left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\"}[x.side],i=[\"left\",\"top\"].indexOf(x.side)!==-1?-1:1,c=a(x.pad)?x.pad:2,u=s.bBox(e.node()),f={left:0,top:0,right:k.width,bottom:k.height},d=x.maxShift||(f[x.side]-u[x.side])*(\"left\"===x.side||\"top\"===x.side?-1:1);if(d<0)r=d;else{var h=x.offsetLeft||0,p=x.offsetTop||0;u.left-=h,u.right-=h,u.top-=p,u.bottom-=p,x.selection.each(function(){var t=s.bBox(this);l.bBoxIntersect(u,t,c)&&(r=Math.max(r,i*(t[x.side]-u[o])+c))}),r=Math.min(d,r)}if(r>0||d<0){var g={left:[-r,0],right:[r,0],top:[0,-r],bottom:[0,r]\n",
|
|
"}[x.side];e.attr(\"transform\",\"translate(\"+g+\")\")}}}var g=r.propContainer,v=r.propName,m=r.traceIndex,y=r.dfltName,x=r.avoid||{},b=r.attributes,_=r.transform,w=r.containerGroup,k=t._fullLayout,M=g.titlefont.family,A=g.titlefont.size,T=g.titlefont.color,L=1,C=!1,S=g.title.trim();\"\"===S&&(L=0),S.match(/Click to enter .+ title/)&&(L=.2,C=!0),w||(w=k._infolayer.selectAll(\".g-\"+e).data([0]),w.enter().append(\"g\").classed(\"g-\"+e,!0));var z=w.selectAll(\"text\").data([0]);z.enter().append(\"text\"),z.text(S).attr(\"class\",e),z.attr({\"data-unformatted\":S}).call(d);var O=\"Click to enter \"+y+\" title\";t._context.editable?(S?z.on(\".opacity\",null):function(){L=0,C=!0,S=O,z.attr({\"data-unformatted\":S}).text(S).on(\"mouseover.opacity\",function(){n.select(this).transition().duration(f.SHOW_PLACEHOLDER).style(\"opacity\",1)}).on(\"mouseout.opacity\",function(){n.select(this).transition().duration(f.HIDE_PLACEHOLDER).style(\"opacity\",0)})}(),z.call(u.makeEditable).on(\"edit\",function(e){void 0!==m?o.restyle(t,v,e,m):o.relayout(t,v,e)}).on(\"cancel\",function(){this.text(this.attr(\"data-unformatted\")).call(d)}).on(\"input\",function(t){this.text(t||\" \").attr(b).selectAll(\"tspan.line\").attr(b)})):S&&!S.match(/Click to enter .+ title/)||z.remove(),z.classed(\"js-placeholder\",C)}},{\"../../constants/interactions\":121,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,d3:7,\"fast-isnumeric\":10}],115:[function(t,e,r){\"use strict\";var n=t(\"../../plots/font_attributes\"),a=t(\"../color/attributes\"),o=t(\"../../lib/extend\").extendFlat,i=t(\"../../plots/pad_attributes\"),l={_isLinkedToArray:\"button\",method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\",dflt:\"\"}};e.exports={_isLinkedToArray:\"updatemenu\",_arrayAttrRegexps:[/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"dropdown\",\"buttons\"],dflt:\"dropdown\"},direction:{valType:\"enumerated\",values:[\"left\",\"right\",\"up\",\"down\"],dflt:\"down\"},active:{valType:\"integer\",min:-1,dflt:0},showactive:{valType:\"boolean\",dflt:!0},buttons:l,x:{valType:\"number\",min:-2,max:3,dflt:-.05},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"right\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},pad:o({},i,{}),font:o({},n,{}),bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:a.borderLine},borderwidth:{valType:\"number\",min:0,dflt:1}}},{\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../../plots/pad_attributes\":198,\"../color/attributes\":24}],116:[function(t,e,r){\"use strict\";e.exports={name:\"updatemenus\",containerClassName:\"updatemenu-container\",headerGroupClassName:\"updatemenu-header-group\",headerClassName:\"updatemenu-header\",headerArrowClassName:\"updatemenu-header-arrow\",dropdownButtonGroupClassName:\"updatemenu-dropdown-button-group\",dropdownButtonClassName:\"updatemenu-dropdown-button\",buttonClassName:\"updatemenu-button\",itemRectClassName:\"updatemenu-item-rect\",itemTextClassName:\"updatemenu-item-text\",menuIndexAttrName:\"updatemenu-active-index\",autoMarginIdRoot:\"updatemenu-\",blankHeaderOpts:{label:\" \"},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,fontSizeToHeight:1.3,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:\"#F4FAFF\",hoverColor:\"#F4FAFF\"}},{}],117:[function(t,e,r){\"use strict\";function n(t,e,r){function n(r,n){return o.coerce(t,e,l,r,n)}n(\"visible\",a(t,e).length>0)&&(n(\"active\"),n(\"direction\"),n(\"type\"),n(\"showactive\"),n(\"x\"),n(\"y\"),o.noneOrAll(t,e,[\"x\",\"y\"]),n(\"xanchor\"),n(\"yanchor\"),n(\"pad.t\"),n(\"pad.r\"),n(\"pad.b\"),n(\"pad.l\"),o.coerceFont(n,\"font\",r.font),n(\"bgcolor\",r.paper_bgcolor),n(\"bordercolor\"),n(\"borderwidth\"))}function a(t,e){function r(t,e){return o.coerce(n,a,u,t,e)}for(var n,a,i=t.buttons||[],l=e.buttons=[],s=0;s<i.length;s++)n=i[s],a={},o.isPlainObject(n)&&Array.isArray(n.args)&&(r(\"method\"),r(\"args\"),r(\"label\"),a._index=s,l.push(a));return l}var o=t(\"../../lib\"),i=t(\"../../plots/array_container_defaults\"),l=t(\"./attributes\"),s=t(\"./constants\"),c=s.name,u=l.buttons;e.exports=function(t,e){i(t,e,{name:c,handleItemDefaults:n})}},{\"../../lib\":136,\"../../plots/array_container_defaults\":168,\"./attributes\":115,\"./constants\":116}],118:[function(t,e,r){\"use strict\";function n(t){for(var e=t[C.name],r=[],n=0;n<e.length;n++){var a=e[n];a.visible&&r.push(a)}return r}function a(t){return t._index}function o(t){return+t.attr(C.menuIndexAttrName)==-1}function i(t,e){return+t.attr(C.menuIndexAttrName)===e._index}function l(t,e,r,n,a,o,i,l){e._input.active=e.active=i,\"buttons\"===e.type?c(t,n,null,null,e):\"dropdown\"===e.type&&(a.attr(C.menuIndexAttrName,\"-1\"),s(t,n,a,o,e),l||c(t,n,a,o,e))}function s(t,e,r,n,a){var o=e.selectAll(\"g.\"+C.headerClassName).data([0]);o.enter().append(\"g\").classed(C.headerClassName,!0).style(\"pointer-events\",\"all\");var l=a.active,s=a.buttons[l]||C.blankHeaderOpts,u={y:a.pad.t,yPad:0,x:a.pad.l,xPad:0,index:0},f={width:a.headerWidth,height:a.headerHeight};o.call(d,a,s).call(x,a,u,f);var h=e.selectAll(\"text.\"+C.headerArrowClassName).data([0]);h.enter().append(\"text\").classed(C.headerArrowClassName,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"end\").call(A.font,a.font).text(\"\\u25bc\"),h.attr({x:a.headerWidth-C.arrowOffsetX+a.pad.l,y:a.headerHeight/2+C.textOffsetY+a.pad.t}),o.on(\"click\",function(){r.call(b),r.attr(C.menuIndexAttrName,i(r,a)?-1:String(a._index)),c(t,e,r,n,a)}),o.on(\"mouseover\",function(){o.call(v)}),o.on(\"mouseout\",function(){o.call(m,a)}),A.setTranslate(e,a.lx,a.ly)}function c(t,e,r,n,a){r||(r=e,r.attr(\"pointer-events\",\"all\"));var i=o(r)&&\"buttons\"!==a.type?[]:a.buttons,s=\"dropdown\"===a.type?C.dropdownButtonClassName:C.buttonClassName,c=r.selectAll(\"g.\"+s).data(i),h=c.enter().append(\"g\").classed(s,!0),p=c.exit();\"dropdown\"===a.type?(h.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),p.transition().attr(\"opacity\",\"0\").remove()):p.remove();var y=0,b=0,_=[\"up\",\"down\"].indexOf(a.direction)!==-1;\"dropdown\"===a.type&&(_?b=a.headerHeight+C.gapButtonHeader:y=a.headerWidth+C.gapButtonHeader),\"dropdown\"===a.type&&\"up\"===a.direction&&(b=-C.gapButtonHeader+C.gapButton-a.openHeight),\"dropdown\"===a.type&&\"left\"===a.direction&&(y=-C.gapButtonHeader+C.gapButton-a.openWidth);var M={x:a.lx+y+a.pad.l,y:a.ly+b+a.pad.t,yPad:C.gapButton,xPad:C.gapButton,index:0},A={l:M.x+a.borderwidth,t:M.y+a.borderwidth};c.each(function(o,i){var s=w.select(this);s.call(d,a,o).call(x,a,M),s.on(\"click\",function(){w.event.defaultPrevented||(l(t,a,o,e,r,n,i),k.executeAPICommand(t,o.method,o.args),t.emit(\"plotly_buttonclicked\",{menu:a,button:o,active:a.active}))}),s.on(\"mouseover\",function(){s.call(v)}),s.on(\"mouseout\",function(){s.call(m,a),c.call(g,a)})}),c.call(g,a),_?(A.w=Math.max(a.openWidth,a.headerWidth),A.h=M.y-A.t):(A.w=M.x-A.l,A.h=Math.max(a.openHeight,a.headerHeight)),A.direction=a.direction,n&&(c.size()?u(t,e,r,n,a,A):f(n))}function u(t,e,r,n,a,o){var i,l,s,c=a.direction,u=\"up\"===c||\"down\"===c,f=a.active;if(u)for(l=0,s=0;s<f;s++)l+=a.heights[s]+C.gapButton;else for(i=0,s=0;s<f;s++)i+=a.widths[s]+C.gapButton;n.enable(o,i,l),n.hbar&&n.hbar.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),n.vbar&&n.vbar.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\")}function f(t){var e=!!t.hbar,r=!!t.vbar;e&&t.hbar.transition().attr(\"opacity\",\"0\").each(\"end\",function(){e=!1,r||t.disable()}),r&&t.vbar.transition().attr(\"opacity\",\"0\").each(\"end\",function(){r=!1,e||t.disable()})}function d(t,e,r){t.call(h,e).call(p,e,r)}function h(t,e){var r=t.selectAll(\"rect\").data([0]);r.enter().append(\"rect\").classed(C.itemRectClassName,!0).attr({rx:C.rx,ry:C.ry,\"shape-rendering\":\"crispEdges\"}),r.call(M.stroke,e.bordercolor).call(M.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\")}function p(t,e,r){var n=t.selectAll(\"text\").data([0]);n.enter().append(\"text\").classed(C.itemTextClassName,!0).classed(\"user-select-none\",!0).attr(\"text-anchor\",\"start\"),n.call(A.font,e.font).text(r.label).call(T.convertToTspans)}function g(t,e){var r=e.active;t.each(function(t,n){var a=w.select(this);n===r&&e.showactive&&a.select(\"rect.\"+C.itemRectClassName).call(M.fill,C.activeColor)})}function v(t){t.select(\"rect.\"+C.itemRectClassName).call(M.fill,C.hoverColor)}function m(t,e){t.select(\"rect.\"+C.itemRectClassName).call(M.fill,e.bgcolor)}function y(t,e){e.width1=0,e.height1=0,e.heights=[],e.widths=[],e.totalWidth=0,e.totalHeight=0,e.openWidth=0,e.openHeight=0,e.lx=0,e.ly=0;var r=A.tester.selectAll(\"g.\"+C.dropdownButtonClassName).data(e.buttons);r.enter().append(\"g\").classed(C.dropdownButtonClassName,!0);var n=[\"up\",\"down\"].indexOf(e.direction)!==-1;r.each(function(t,r){var a=w.select(this);a.call(d,e,t);var o=a.select(\".\"+C.itemTextClassName),i=o.selectAll(\"tspan\"),l=o.node()&&A.bBox(o.node()).width,s=Math.max(l+C.textPadX,C.minWidth),c=e.font.size*C.fontSizeToHeight,u=i[0].length||1,f=Math.max(c*u,C.minHeight)+C.textOffsetY;f=Math.ceil(f),s=Math.ceil(s),e.widths[r]=s,e.heights[r]=f,e.height1=Math.max(e.height1,f),e.width1=Math.max(e.width1,s),n?(e.totalWidth=Math.max(e.totalWidth,s),e.openWidth=e.totalWidth,e.totalHeight+=f+C.gapButton,e.openHeight+=f+C.gapButton):(e.totalWidth+=s+C.gapButton,e.openWidth+=s+C.gapButton,e.totalHeight=Math.max(e.totalHeight,f),e.openHeight=e.totalHeight)}),n?e.totalHeight-=C.gapButton:e.totalWidth-=C.gapButton,e.headerWidth=e.width1+C.arrowPadX,e.headerHeight=e.height1,\"dropdown\"===e.type&&(n?(e.width1+=C.arrowPadX,e.totalHeight=e.height1):e.totalWidth=e.width1,e.totalWidth+=C.arrowPadX),r.remove();var a=e.totalWidth+e.pad.l+e.pad.r,o=e.totalHeight+e.pad.t+e.pad.b,i=t._fullLayout._size;e.lx=i.l+i.w*e.x,e.ly=i.t+i.h*(1-e.y);var l=\"left\";L.isRightAnchor(e)&&(e.lx-=a,l=\"right\"),L.isCenterAnchor(e)&&(e.lx-=a/2,l=\"center\");var s=\"top\";L.isBottomAnchor(e)&&(e.ly-=o,s=\"bottom\"),L.isMiddleAnchor(e)&&(e.ly-=o/2,s=\"middle\"),e.totalWidth=Math.ceil(e.totalWidth),e.totalHeight=Math.ceil(e.totalHeight),e.lx=Math.round(e.lx),e.ly=Math.round(e.ly),k.autoMargin(t,C.autoMarginIdRoot+e._index,{x:e.x,y:e.y,l:a*({right:1,center:.5}[l]||0),r:a*({left:1,center:.5}[l]||0),b:o*({top:1,middle:.5}[s]||0),t:o*({bottom:1,middle:.5}[s]||0)})}function x(t,e,r,n){n=n||{};var a=t.select(\".\"+C.itemRectClassName),o=t.select(\".\"+C.itemTextClassName),i=o.selectAll(\"tspan\"),l=e.borderwidth,s=r.index;A.setTranslate(t,l+r.x,l+r.y);var c=[\"up\",\"down\"].indexOf(e.direction)!==-1;a.attr({x:0,y:0,width:n.width||(c?e.width1:e.widths[s]),height:n.height||(c?e.heights[s]:e.height1)});var u=e.font.size*C.fontSizeToHeight,f=i[0].length||1,d=(f-1)*u/4,h={x:C.textOffsetX,y:e.heights[s]/2-d+C.textOffsetY};o.attr(h),i.attr(h),c?r.y+=e.heights[s]+r.yPad:r.x+=e.widths[s]+r.xPad,r.index++}function b(t){t.selectAll(\"g.\"+C.dropdownButtonClassName).remove()}function _(t){for(var e=t._fullLayout._pushmargin||{},r=Object.keys(e),n=0;n<r.length;n++){var a=r[n];a.indexOf(C.autoMarginIdRoot)!==-1&&k.autoMargin(t,a)}}var w=t(\"d3\"),k=t(\"../../plots/plots\"),M=t(\"../color\"),A=t(\"../drawing\"),T=t(\"../../lib/svg_text_utils\"),L=t(\"../legend/anchor_utils\"),C=t(\"./constants\"),S=t(\"./scrollbox\");e.exports=function(t){var e=t._fullLayout,r=n(e),o=e._infolayer.selectAll(\"g.\"+C.containerClassName).data(r.length>0?[0]:[]);if(o.enter().append(\"g\").classed(C.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().remove(),o.exit().size()&&_(t),0!==r.length){var u=o.selectAll(\"g.\"+C.headerGroupClassName).data(r,a);u.enter().append(\"g\").classed(C.headerGroupClassName,!0);var f=o.selectAll(\"g.\"+C.dropdownButtonGroupClassName).data([0]);f.enter().append(\"g\").classed(C.dropdownButtonGroupClassName,!0).style(\"pointer-events\",\"all\");for(var d=0;d<r.length;d++){var h=r[d];y(t,h)}var p=\"updatemenus\"+e._uid,g=new S(t,f,p);u.enter().size()&&f.call(b).attr(C.menuIndexAttrName,\"-1\"),u.exit().each(function(e){w.select(this).remove(),f.call(b).attr(C.menuIndexAttrName,\"-1\"),k.autoMargin(t,C.autoMarginIdRoot+e._index)}),u.each(function(e){var r=w.select(this),n=\"dropdown\"===e.type?f:null;k.manageCommandObserver(t,e,e.buttons,function(a){l(t,e,e.buttons[a.index],r,n,g,a.index,!0)}),\"dropdown\"===e.type?(s(t,r,f,g,e),i(f,e)&&c(t,r,f,g,e)):c(t,r,null,null,e)})}}},{\"../../lib/svg_text_utils\":153,\"../../plots/plots\":199,\"../color\":25,\"../drawing\":49,\"../legend/anchor_utils\":75,\"./constants\":116,\"./scrollbox\":120,d3:7}],119:[function(t,e,r){arguments[4][113][0].apply(r,arguments)},{\"./attributes\":115,\"./constants\":116,\"./defaults\":117,\"./draw\":118,dup:113}],120:[function(t,e,r){\"use strict\";function n(t,e,r){this.gd=t,this.container=e,this.id=r,this.position=null,this.translateX=null,this.translateY=null,this.hbar=null,this.vbar=null,this.bg=this.container.selectAll(\"rect.scrollbox-bg\").data([0]),this.bg.exit().on(\".drag\",null).on(\"wheel\",null).remove(),this.bg.enter().append(\"rect\").classed(\"scrollbox-bg\",!0).style(\"pointer-events\",\"all\").attr({opacity:0,x:0,y:0,width:0,height:0})}e.exports=n;var a=t(\"d3\"),o=t(\"../color\"),i=t(\"../drawing\"),l=t(\"../../lib\");n.barWidth=2,n.barLength=20,n.barRadius=2,n.barPad=1,n.barColor=\"#808BA4\",n.prototype.enable=function(t,e,r){var l=this.gd._fullLayout,s=l.width,c=l.height;this.position=t;var u,f,d,h,p=this.position.l,g=this.position.w,v=this.position.t,m=this.position.h,y=this.position.direction,x=\"down\"===y,b=\"left\"===y,_=\"right\"===y,w=\"up\"===y,k=g,M=m;x||b||_||w||(this.position.direction=\"down\",x=!0),x||w?(u=p,f=u+k,x?(d=v,h=Math.min(d+M,c),M=h-d):(h=v+M,d=Math.max(h-M,0),M=h-d)):(d=v,h=d+M,b?(f=p+k,u=Math.max(f-k,0),k=f-u):(u=p,f=Math.min(u+k,s),k=f-u)),this._box={l:u,t:d,w:k,h:M};var A=g>k,T=n.barLength+2*n.barPad,L=n.barWidth+2*n.barPad,C=p,S=v+m;S+L>c&&(S=c-L);var z=this.container.selectAll(\"rect.scrollbar-horizontal\").data(A?[0]:[]);z.exit().on(\".drag\",null).remove(),z.enter().append(\"rect\").classed(\"scrollbar-horizontal\",!0).call(o.fill,n.barColor),A?(this.hbar=z.attr({rx:n.barRadius,ry:n.barRadius,x:C,y:S,width:T,height:L}),this._hbarXMin=C+T/2,this._hbarTranslateMax=k-T):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var O=m>M,D=n.barWidth+2*n.barPad,P=n.barLength+2*n.barPad,E=p+g,N=v;E+D>s&&(E=s-D);var I=this.container.selectAll(\"rect.scrollbar-vertical\").data(O?[0]:[]);I.exit().on(\".drag\",null).remove(),I.enter().append(\"rect\").classed(\"scrollbar-vertical\",!0).call(o.fill,n.barColor),O?(this.vbar=I.attr({rx:n.barRadius,ry:n.barRadius,x:E,y:N,width:D,height:P}),this._vbarYMin=N+P/2,this._vbarTranslateMax=M-P):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=u-.5,j=O?f+D+.5:f+.5,B=d-.5,q=A?h+L+.5:h+.5,H=l._topdefs.selectAll(\"#\"+R).data(A||O?[0]:[]);if(H.exit().remove(),H.enter().append(\"clipPath\").attr(\"id\",R).append(\"rect\"),A||O?(this._clipRect=H.select(\"rect\").attr({x:Math.floor(F),y:Math.floor(B),width:Math.ceil(j)-Math.floor(F),height:Math.ceil(q)-Math.floor(B)}),this.container.call(i.setClipUrl,R),this.bg.attr({x:p,y:v,width:g,height:m})):(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(i.setClipUrl,null),delete this._clipRect),A||O){var V=a.behavior.drag().on(\"dragstart\",function(){a.event.sourceEvent.preventDefault()}).on(\"drag\",this._onBoxDrag.bind(this));this.container.on(\"wheel\",null).on(\"wheel\",this._onBoxWheel.bind(this)).on(\".drag\",null).call(V);var U=a.behavior.drag().on(\"dragstart\",function(){a.event.sourceEvent.preventDefault(),a.event.sourceEvent.stopPropagation()}).on(\"drag\",this._onBarDrag.bind(this));A&&this.hbar.on(\".drag\",null).call(U),O&&this.vbar.on(\".drag\",null).call(U)}this.setTranslate(e,r)},n.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(i.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(\".drag\",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(\".drag\",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},n.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=a.event.dx),this.vbar&&(e-=a.event.dy),this.setTranslate(t,e)},n.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=a.event.deltaY),this.vbar&&(e+=a.event.deltaY),this.setTranslate(t,e)},n.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,n=r+this._hbarTranslateMax;t=(l.constrain(a.event.x,r,n)-r)/(n-r)*(this.position.w-this._box.w)}if(this.vbar){var o=e+this._vbarYMin,i=o+this._vbarTranslateMax;e=(l.constrain(a.event.y,o,i)-o)/(i-o)*(this.position.h-this._box.h)}this.setTranslate(t,e)},n.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=l.constrain(t||0,0,r),e=l.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(i.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var a=t/r;this.hbar.call(i.setTranslate,t+a*this._hbarTranslateMax,e)}if(this.vbar){var o=e/n;this.vbar.call(i.setTranslate,t,e+o*this._vbarTranslateMax)}}},{\"../../lib\":136,\"../color\":25,\"../drawing\":49,d3:7}],121:[function(t,e,r){\"use strict\";e.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DBLCLICKDELAY:300}},{}],122:[function(t,e,r){\"use strict\";e.exports={BADNUM:void 0,FP_SAFE:Number.MAX_VALUE/1e4,ONEAVGYEAR:315576e5,ONEAVGMONTH:26298e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:1-1e-6}},{}],123:[function(t,e,r){\"use strict\";e.exports={entityToUnicode:{mu:\"\\u03bc\",amp:\"&\",lt:\"<\",gt:\">\",nbsp:\"\\xa0\",times:\"\\xd7\",plusmn:\"\\xb1\",deg:\"\\xb0\"},unicodeToEntity:{\"&\":\"amp\",\"<\":\"lt\",\">\":\"gt\",'\"':\"quot\",\"'\":\"#x27\",\"/\":\"#x2F\"}}},{}],124:[function(t,e,r){\"use strict\";r.xmlns=\"http://www.w3.org/2000/xmlns/\",r.svg=\"http://www.w3.org/2000/svg\",r.xlink=\"http://www.w3.org/1999/xlink\",r.svgAttrs={xmlns:r.svg,\"xmlns:xlink\":r.xlink}},{}],125:[function(t,e,r){\"use strict\";var n=t(\"./plotly\");/*export for widget*/window.Plotly=n;r.version=\"1.27.1\",t(\"es6-promise\").polyfill(),t(\"../build/plotcss\"),t(\"./fonts/mathjax_config\"),r.plot=n.plot,r.newPlot=n.newPlot,r.restyle=n.restyle,r.relayout=n.relayout,r.redraw=n.redraw,r.update=n.update,r.extendTraces=n.extendTraces,r.prependTraces=n.prependTraces,r.addTraces=n.addTraces,r.deleteTraces=n.deleteTraces,r.moveTraces=n.moveTraces,r.purge=n.purge,r.setPlotConfig=t(\"./plot_api/set_plot_config\"),r.register=t(\"./plot_api/register\"),r.toImage=t(\"./plot_api/to_image\"),r.downloadImage=t(\"./snapshot/download\"),r.validate=t(\"./plot_api/validate\"),r.addFrames=n.addFrames,r.deleteFrames=n.deleteFrames,r.animate=n.animate,r.register(t(\"./traces/scatter\")),r.register([t(\"./components/fx\"),t(\"./components/legend\"),t(\"./components/annotations\"),t(\"./components/shapes\"),t(\"./components/images\"),t(\"./components/updatemenus\"),t(\"./components/sliders\"),t(\"./components/rangeslider\"),t(\"./components/rangeselector\")]),r.Icons=t(\"../build/ploticon\"),r.Plots=n.Plots,r.Fx=t(\"./components/fx\"),r.Snapshot=t(\"./snapshot\"),r.PlotSchema=t(\"./plot_api/plot_schema\"),r.Queue=t(\"./lib/queue\"),r.d3=t(\"d3\")},{\"../build/plotcss\":1,\"../build/ploticon\":2,\"./components/annotations\":23,\"./components/fx\":66,\"./components/images\":74,\"./components/legend\":82,\"./components/rangeselector\":94,\"./components/rangeslider\":100,\"./components/shapes\":107,\"./components/sliders\":113,\"./components/updatemenus\":119,\"./fonts/mathjax_config\":126,\"./lib/queue\":148,\"./plot_api/plot_schema\":160,\"./plot_api/register\":161,\"./plot_api/set_plot_config\":162,\"./plot_api/to_image\":164,\"./plot_api/validate\":165,\"./plotly\":166,\"./snapshot\":211,\"./snapshot/download\":208,\"./traces/scatter\":250,d3:7,\"es6-promise\":8}],126:[function(t,e,r){\"use strict\";\"undefined\"!=typeof MathJax?(r.MathJax=!0,MathJax.Hub.Config({messageStyle:\"none\",skipStartupTypeset:!0,displayAlign:\"left\",tex2jax:{inlineMath:[[\"$\",\"$\"],[\"\\\\(\",\"\\\\)\"]]}}),MathJax.Hub.Configured()):r.MathJax=!1},{}],127:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../constants/numerical\").BADNUM;e.exports=function(t){return\"string\"==typeof t&&(t=t.replace(/^['\"%,$#\\s']+|[, ]|['\"%,$#\\s']+$/g,\"\")),n(t)?Number(t):a}},{\"../constants/numerical\":122,\"fast-isnumeric\":10}],128:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"tinycolor2\"),o=t(\"../components/colorscale/get_scale\"),i=(Object.keys(t(\"../components/colorscale/scales\")),t(\"./nested_property\")),l=/^([2-9]|[1-9][0-9]+)$/;r.valObjects={data_array:{coerceFunction:function(t,e,r){Array.isArray(t)?e.set(t):void 0!==r&&e.set(r)}},enumerated:{coerceFunction:function(t,e,r,n){n.coerceNumber&&(t=+t),n.values.indexOf(t)===-1?e.set(r):e.set(t)}},boolean:{coerceFunction:function(t,e,r){t===!0||t===!1?e.set(t):e.set(r)}},number:{coerceFunction:function(t,e,r,a){!n(t)||void 0!==a.min&&t<a.min||void 0!==a.max&&t>a.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,a){t%1||!n(t)||void 0!==a.min&&t<a.min||void 0!==a.max&&t>a.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t){var a=\"number\"==typeof t;n.strict!==!0&&a?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){a(t).isValid()?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o(t,r))}},angle:{coerceFunction:function(t,e,r){\"auto\"===t?e.set(\"auto\"):n(t)?(Math.abs(t)>180&&(t-=360*Math.round(t/360)),e.set(+t)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r){var n=r.length;if(\"string\"==typeof t&&t.substr(0,n)===r&&l.test(t.substr(n)))return void e.set(t);e.set(r)},validateFunction:function(t,e){var r=e.dflt,n=r.length;return t===r||\"string\"==typeof t&&!(t.substr(0,n)!==r||!l.test(t.substr(n)))}},flaglist:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t)return void e.set(r);if((n.extras||[]).indexOf(t)!==-1)return void e.set(t);for(var a=t.split(\"+\"),o=0;o<a.length;){var i=a[o];n.flags.indexOf(i)===-1||a.indexOf(i)<o?a.splice(o,1):o++}a.length?e.set(a.join(\"+\")):e.set(r)}},any:{coerceFunction:function(t,e,r){void 0===t?e.set(r):e.set(t)}},info_array:{coerceFunction:function(t,e,n,a){if(!Array.isArray(t))return void e.set(n);var o=a.items,i=[];n=Array.isArray(n)?n:[];for(var l=0;l<o.length;l++)r.coerce(t,i,o,\"[\"+l+\"]\",n[l]);e.set(i)},validateFunction:function(t,e){if(!Array.isArray(t))return!1;var n=e.items;if(!e.freeLength&&t.length!==n.length)return!1;for(var a=0;a<t.length;a++){if(!r.validate(t[a],e.items[a]))return!1}return!0}}},r.coerce=function(t,e,n,a,o){var l=i(n,a).get(),s=i(t,a),c=i(e,a),u=s.get();return void 0===o&&(o=l.dflt),l.arrayOk&&Array.isArray(u)?(c.set(u),u):(r.valObjects[l.valType].coerceFunction(u,c,o,l),c.get())},r.coerce2=function(t,e,n,a,o){var l=i(t,a),s=r.coerce(t,e,n,a,o),c=l.get();return void 0!==c&&null!==c&&s},r.coerceFont=function(t,e,r){var n={};return r=r||{},n.family=t(e+\".family\",r.family),n.size=t(e+\".size\",r.size),n.color=t(e+\".color\",r.color),n},r.validate=function(t,e){var n=r.valObjects[e.valType];if(e.arrayOk&&Array.isArray(t))return!0;if(n.validateFunction)return n.validateFunction(t,e);var a={},o=a,i={set:function(t){o=t}};return n.coerceFunction(t,i,a,e),o!==a}},{\"../components/colorscale/get_scale\":37,\"../components/colorscale/scales\":43,\"./nested_property\":142,\"fast-isnumeric\":10,tinycolor2:13}],129:[function(t,e,r){\"use strict\";function n(t){return t&&k.componentsRegistry.calendars&&\"string\"==typeof t&&\"gregorian\"!==t}function a(t,e){return String(t+Math.pow(10,e)).substr(1)}function o(t,e,r,n,o){if((e||r||n||o)&&(t+=\" \"+a(e,2)+\":\"+a(r,2),(n||o)&&(t+=\":\"+a(n,2),o))){for(var i=4;o%10==0;)i-=1,o/=10;t+=\".\"+a(o,i)}return t}function i(t,e,r){t=t.replace(O,function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,\"\")||\"0\"});var a=new Date(Math.floor(e+.05));if(n(r))try{t=k.getComponentMethod(\"calendars\",\"worldCalFmt\")(t,e,r)}catch(t){return\"Invalid\"}return M(t)(a)}function l(t,e){var r=g(t+.05,y),n=a(Math.floor(r/x),2)+\":\"+a(g(Math.floor(r/b),60),2);if(\"M\"!==e){h(e)||(e=0);var o=Math.min(g(t/_,60),D[e]),i=(100+o).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,\"\").replace(/[\\.]$/,\"\")),n+=\":\"+i}return n}function s(t){return t.formatDate(\"yyyy\")}function c(t){return t.formatDate(\"M yyyy\")}function u(t){return t.formatDate(\"M d\")}function f(t){return t.formatDate(\"M d, yyyy\")}var d=t(\"d3\"),h=t(\"fast-isnumeric\"),p=t(\"./loggers\").error,g=t(\"./mod\"),v=t(\"../constants/numerical\"),m=v.BADNUM,y=v.ONEDAY,x=v.ONEHOUR,b=v.ONEMIN,_=v.ONESEC,w=v.EPOCHJD,k=t(\"../registry\"),M=d.time.format.utc,A=(new Date).getFullYear()-70;r.dateTick0=function(t,e){return n(t)?e?k.getComponentMethod(\"calendars\",\"CANONICAL_SUNDAY\")[t]:k.getComponentMethod(\"calendars\",\"CANONICAL_TICK\")[t]:e?\"2000-01-02\":\"2000-01-01\"},r.dfltRange=function(t){return n(t)?k.getComponentMethod(\"calendars\",\"DFLTRANGE\")[t]:[\"2000-01-01\",\"2001-01-01\"]},r.isJSDate=function(t){return\"object\"==typeof t&&null!==t&&\"function\"==typeof t.getTime};var T,L;r.dateTime2ms=function(t,e){if(r.isJSDate(t))return t=Number(t)-t.getTimezoneOffset()*b,t>=T&&t<=L?t:m;if(\"string\"!=typeof t&&\"number\"!=typeof t)return m;t=String(t);var a=n(e),o=t.charAt(0);!a||\"G\"!==o&&\"g\"!==o||(t=t.substr(1),e=\"\");var i=a&&\"chinese\"===e.substr(0,7),l=t.match(i?/^\\s*(-?\\d\\d\\d\\d|\\d\\d)(-(\\d?\\di?)(-(\\d?\\d)([ Tt]([01]?\\d|2[0-3])(:([0-5]\\d)(:([0-5]\\d(\\.\\d+)?))?(Z|z|[+\\-]\\d\\d:?\\d\\d)?)?)?)?)?\\s*$/m:/^\\s*(-?\\d\\d\\d\\d|\\d\\d)(-(\\d?\\d)(-(\\d?\\d)([ Tt]([01]?\\d|2[0-3])(:([0-5]\\d)(:([0-5]\\d(\\.\\d+)?))?(Z|z|[+\\-]\\d\\d:?\\d\\d)?)?)?)?)?\\s*$/m);if(!l)return m;var s=l[1],c=l[3]||\"1\",u=Number(l[5]||1),f=Number(l[7]||0),d=Number(l[9]||0),h=Number(l[11]||0);if(a){if(2===s.length)return m;s=Number(s);var p;try{var g=k.getComponentMethod(\"calendars\",\"getCal\")(e);if(i){var v=\"i\"===c.charAt(c.length-1);c=parseInt(c,10),p=g.newDate(s,g.toMonthIndex(s,c,v),u)}else p=g.newDate(s,Number(c),u)}catch(t){return m}return p?(p.toJD()-w)*y+f*x+d*b+h*_:m}s=2===s.length?(Number(s)+2e3-A)%100+A:Number(s),c-=1;var M=new Date(Date.UTC(2e3,c,u,f,d));return M.setUTCFullYear(s),M.getUTCMonth()!==c?m:M.getUTCDate()!==u?m:M.getTime()+h*_},T=r.MIN_MS=r.dateTime2ms(\"-9999\"),L=r.MAX_MS=r.dateTime2ms(\"9999-12-31 23:59:59.9999\"),r.isDateTime=function(t,e){return r.dateTime2ms(t,e)!==m};var C=90*y,S=3*x,z=5*b;r.ms2DateTime=function(t,e,r){if(\"number\"!=typeof t||!(t>=T&&t<=L))return m;e||(e=0);var a,i,l,s,c,u,f=Math.floor(10*g(t+.05,1)),d=Math.round(t-f/10);if(n(r)){var h=Math.floor(d/y)+w,p=Math.floor(g(t,y));try{a=k.getComponentMethod(\"calendars\",\"getCal\")(r).fromJD(h).formatDate(\"yyyy-mm-dd\")}catch(t){a=M(\"G%Y-%m-%d\")(new Date(d))}if(\"-\"===a.charAt(0))for(;a.length<11;)a=\"-0\"+a.substr(1);else for(;a.length<10;)a=\"0\"+a;i=e<C?Math.floor(p/x):0,l=e<C?Math.floor(p%x/b):0,s=e<S?Math.floor(p%b/_):0,c=e<z?p%_*10+f:0}else u=new Date(d),a=M(\"%Y-%m-%d\")(u),i=e<C?u.getUTCHours():0,l=e<C?u.getUTCMinutes():0,s=e<S?u.getUTCSeconds():0,c=e<z?10*u.getUTCMilliseconds()+f:0;return o(a,i,l,s,c)},r.ms2DateTimeLocal=function(t){if(!(t>=T+y&&t<=L-y))return m;var e=Math.floor(10*g(t+.05,1)),r=new Date(Math.round(t-e/10));return o(d.time.format(\"%Y-%m-%d\")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},r.cleanDate=function(t,e,a){if(r.isJSDate(t)||\"number\"==typeof t){if(n(a))return p(\"JS Dates and milliseconds are incompatible with world calendars\",t),e;if(!(t=r.ms2DateTimeLocal(+t))&&void 0!==e)return e}else if(!r.isDateTime(t,a))return p(\"unrecognized date\",t),e;return t};var O=/%\\d?f/g,D=[59,59.9,59.99,59.999,59.9999],P=M(\"%Y\"),E=M(\"%b %Y\"),N=M(\"%b %-d\"),I=M(\"%b %-d, %Y\");r.formatDate=function(t,e,r,a){var o,d;if(a=n(a)&&a,e)return i(e,t,a);if(a)try{var h=Math.floor((t+.05)/y)+w,p=k.getComponentMethod(\"calendars\",\"getCal\")(a).fromJD(h);\"y\"===r?d=s(p):\"m\"===r?d=c(p):\"d\"===r?(o=s(p),d=u(p)):(o=f(p),d=l(t,r))}catch(t){return\"Invalid\"}else{var g=new Date(Math.floor(t+.05));\"y\"===r?d=P(g):\"m\"===r?d=E(g):\"d\"===r?(o=P(g),d=N(g)):(o=I(g),d=l(t,r))}return d+(o?\"\\n\"+o:\"\")};var R=3*y;r.incrementMonth=function(t,e,r){r=n(r)&&r;var a=g(t,y);if(t=Math.round(t-a),r)try{var o=Math.round(t/y)+w,i=k.getComponentMethod(\"calendars\",\"getCal\")(r),l=i.fromJD(o);return e%12?i.add(l,e,\"m\"):i.add(l,e/12,\"y\"),(l.toJD()-w)*y+a}catch(e){p(\"invalid ms \"+t+\" in calendar \"+r)}var s=new Date(t+R);return s.setUTCMonth(s.getUTCMonth()+e)+a-R},r.findExactDates=function(t,e){for(var r,a,o=0,i=0,l=0,s=0,c=n(e)&&k.getComponentMethod(\"calendars\",\"getCal\")(e),u=0;u<t.length;u++)if(a=t[u],h(a)){if(!(a%y))if(c)try{r=c.fromJD(a/y+w),1===r.day()?1===r.month()?o++:i++:l++}catch(t){}else r=new Date(a),1===r.getUTCDate()?0===r.getUTCMonth()?o++:i++:l++}else s++;i+=o,l+=i;var f=t.length-s;return{exactYears:o/f,exactMonths:i/f,exactDays:l/f}}},{\"../constants/numerical\":122,\"../registry\":206,\"./loggers\":139,\"./mod\":141,d3:7,\"fast-isnumeric\":10}],130:[function(t,e,r){\"use strict\";e.exports=function(t,e){return Array.isArray(t)||(t=[]),t.length=e,t}},{}],131:[function(t,e,r){\"use strict\";var n=t(\"events\").EventEmitter,a={init:function(t){if(t._ev instanceof n)return t;var e=new n,r=new n;return t._ev=e,t._internalEv=r,t.on=e.on.bind(e),t.once=e.once.bind(e),t.removeListener=e.removeListener.bind(e),t.removeAllListeners=e.removeAllListeners.bind(e),t._internalOn=r.on.bind(r),t._internalOnce=r.once.bind(r),t._removeInternalListener=r.removeListener.bind(r),t._removeAllInternalListeners=r.removeAllListeners.bind(r),t.emit=function(n,a){\"undefined\"!=typeof jQuery&&jQuery(t).trigger(n,a),e.emit(n,a),r.emit(n,a)},t},triggerHandler:function(t,e,r){var n,a;\"undefined\"!=typeof jQuery&&(n=jQuery(t).triggerHandler(e,r));var o=t._ev;if(!o)return n;var i=o._events[e];if(!i)return n;\"function\"==typeof i&&(i=[i]);for(var l=i.pop(),s=0;s<i.length;s++)i[s](r);return a=l(r),void 0!==n?n:a},purge:function(t){return delete t._ev,delete t.on,delete t.once,delete t.removeListener,delete t.removeAllListeners,delete t.emit,delete t._ev,delete t._internalEv,delete t._internalOn,delete t._internalOnce,delete t._removeInternalListener,delete t._removeAllInternalListeners,t}};e.exports=a},{events:9}],132:[function(t,e,r){\"use strict\";function n(t,e){var r,n;for(r=0;r<t.length;r++){if(null!==(n=t[r])&&\"object\"==typeof n)return!1;void 0!==n&&(e[r]=n)}return!0}function a(t,e,r,l){var s,c,u,f,d,h,p=t[0],g=t.length;if(2===g&&i(p)&&i(t[1])&&0===p.length){if(n(t[1],p))return p;p.splice(0,p.length)}for(var v=1;v<g;v++){s=t[v];for(c in s)u=p[c],f=s[c],l&&i(f)?p[c]=f:e&&f&&(o(f)||(d=i(f)))?(d?(d=!1,h=u&&i(u)?u:[]):h=u&&o(u)?u:{},p[c]=a([h,f],e,r,l)):(void 0!==f||r)&&(p[c]=f)}return p}var o=t(\"./is_plain_object.js\"),i=Array.isArray;r.extendFlat=function(){return a(arguments,!1,!1,!1)},r.extendDeep=function(){return a(arguments,!0,!1,!1)},r.extendDeepAll=function(){return a(arguments,!0,!0,!1)},r.extendDeepNoArrays=function(){return a(arguments,!0,!1,!0)}},{\"./is_plain_object.js\":138}],133:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e={},r=[],n=0,a=0;a<t.length;a++){var o=t[a];1!==e[o]&&(e[o]=1,r[n++]=o)}return r}},{}],134:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];n.visible===!0&&e.push(n)}return e}},{}],135:[function(t,e,r){\"use strict\";e.exports=function(t){return t}},{}],136:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=e.exports={};a.nestedProperty=t(\"./nested_property\"),a.isPlainObject=t(\"./is_plain_object\"),a.isArray=t(\"./is_array\"),a.mod=t(\"./mod\"),a.toLogRange=t(\"./to_log_range\"),a.relinkPrivateKeys=t(\"./relink_private\"),a.ensureArray=t(\"./ensure_array\");var o=t(\"./coerce\");a.valObjects=o.valObjects,a.coerce=o.coerce,a.coerce2=o.coerce2,a.coerceFont=o.coerceFont,a.validate=o.validate;var i=t(\"./dates\");a.dateTime2ms=i.dateTime2ms,a.isDateTime=i.isDateTime,a.ms2DateTime=i.ms2DateTime,\n",
|
|
"a.ms2DateTimeLocal=i.ms2DateTimeLocal,a.cleanDate=i.cleanDate,a.isJSDate=i.isJSDate,a.formatDate=i.formatDate,a.incrementMonth=i.incrementMonth,a.dateTick0=i.dateTick0,a.dfltRange=i.dfltRange,a.findExactDates=i.findExactDates,a.MIN_MS=i.MIN_MS,a.MAX_MS=i.MAX_MS;var l=t(\"./search\");a.findBin=l.findBin,a.sorterAsc=l.sorterAsc,a.sorterDes=l.sorterDes,a.distinctVals=l.distinctVals,a.roundUp=l.roundUp;var s=t(\"./stats\");a.aggNums=s.aggNums,a.len=s.len,a.mean=s.mean,a.variance=s.variance,a.stdev=s.stdev,a.interp=s.interp;var c=t(\"./matrix\");a.init2dArray=c.init2dArray,a.transposeRagged=c.transposeRagged,a.dot=c.dot,a.translationMatrix=c.translationMatrix,a.rotationMatrix=c.rotationMatrix,a.rotationXYMatrix=c.rotationXYMatrix,a.apply2DTransform=c.apply2DTransform,a.apply2DTransform2=c.apply2DTransform2;var u=t(\"./extend\");a.extendFlat=u.extendFlat,a.extendDeep=u.extendDeep,a.extendDeepAll=u.extendDeepAll,a.extendDeepNoArrays=u.extendDeepNoArrays;var f=t(\"./loggers\");a.log=f.log,a.warn=f.warn,a.error=f.error,a.notifier=t(\"./notifier\"),a.filterUnique=t(\"./filter_unique\"),a.filterVisible=t(\"./filter_visible\"),a.pushUnique=t(\"./push_unique\"),a.cleanNumber=t(\"./clean_number\"),a.noop=t(\"./noop\"),a.identity=t(\"./identity\"),a.swapAttrs=function(t,e,r,n){r||(r=\"x\"),n||(n=\"y\");for(var o=0;o<e.length;o++){var i=e[o],l=a.nestedProperty(t,i.replace(\"?\",r)),s=a.nestedProperty(t,i.replace(\"?\",n)),c=l.get();l.set(s.get()),s.set(c)}},a.pauseEvent=function(t){return t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1},a.constrain=function(t,e,r){return e>r?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},a.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},a.simpleMap=function(t,e,r,n){for(var a=t.length,o=new Array(a),i=0;i<a;i++)o[i]=e(t[i],r,n);return o},a.randstr=function t(e,r,n){if(n||(n=16),void 0===r&&(r=24),r<=0)return\"0\";var a,o,i,l=Math.log(Math.pow(2,r))/Math.log(n),s=\"\";for(a=2;1/0===l;a*=2)l=Math.log(Math.pow(2,r/a))/Math.log(n)*a;var c=l-Math.floor(l);for(a=0;a<Math.floor(l);a++)i=Math.floor(Math.random()*n).toString(n),s=i+s;c&&(o=Math.pow(n,c),i=Math.floor(Math.random()*o).toString(n),s=i+s);var u=parseInt(s,n);return e&&e.indexOf(s)>-1||1/0!==u&&u>=Math.pow(2,r)?t(e,r,n):s},a.OptionControl=function(t,e){t||(t={}),e||(e=\"opt\");var r={};return r.optionList=[],r._newoption=function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)},r[\"_\"+e]=t,r},a.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,a,o,i=t.length,l=2*i,s=2*e-1,c=new Array(s),u=new Array(i);for(r=0;r<s;r++)c[r]=(1-Math.cos(Math.PI*(r+1)/e))/(2*e);for(r=0;r<i;r++){for(o=0,n=0;n<s;n++)a=r+n+1-e,a<-i?a-=l*Math.round(a/l):a>=l&&(a-=l*Math.floor(a/l)),a<0?a=-1-a:a>=i&&(a=l-1-a),o+=t[a]*c[n];u[r]=o}return u},a.syncOrAsync=function(t,e,r){function n(){return a.syncOrAsync(t,e,r)}for(var o,i;t.length;)if(i=t.splice(0,1)[0],(o=i(e))&&o.then)return o.then(n).then(void 0,a.promiseError);return r&&r(e)},a.stripTrailingSlash=function(t){return\"/\"===t.substr(-1)?t.substr(0,t.length-1):t},a.noneOrAll=function(t,e,r){if(t){var n,a,o=!1,i=!0;for(n=0;n<r.length;n++)a=t[r[n]],void 0!==a&&null!==a?o=!0:i=!1;if(o&&!i)for(n=0;n<r.length;n++)t[r[n]]=e[r[n]]}},a.mergeArray=function(t,e,r){if(Array.isArray(t))for(var n=Math.min(t.length,e.length),a=0;a<n;a++)e[a][r]=t[a]},a.getTargetArray=function(t,e){var r=e.target;if(\"string\"==typeof r&&r){var n=a.nestedProperty(t,r).get();return!!Array.isArray(n)&&n}return!!Array.isArray(r)&&r},a.minExtend=function(t,e){var r={};\"object\"!=typeof e&&(e={});var n,o,i,l=Object.keys(t);for(n=0;n<l.length;n++)o=l[n],i=t[o],\"_\"!==o.charAt(0)&&\"function\"!=typeof i&&(\"module\"===o?r[o]=i:Array.isArray(i)?r[o]=i.slice(0,3):r[o]=i&&\"object\"==typeof i?a.minExtend(t[o],e[o]):i);for(l=Object.keys(e),n=0;n<l.length;n++)o=l[n],\"object\"==typeof(i=e[o])&&o in r&&\"object\"==typeof r[o]||(r[o]=i);return r},a.titleCase=function(t){return t.charAt(0).toUpperCase()+t.substr(1)},a.containsAny=function(t,e){for(var r=0;r<e.length;r++)if(t.indexOf(e[r])!==-1)return!0;return!1},a.getPlotDiv=function(t){for(;t&&t.removeAttribute;t=t.parentNode)if(a.isPlotDiv(t))return t},a.isPlotDiv=function(t){var e=n.select(t);return e.node()instanceof HTMLElement&&e.size()&&e.classed(\"js-plotly-plot\")},a.removeElement=function(t){var e=t&&t.parentNode;e&&e.removeChild(t)},a.addStyleRule=function(t,e){if(!a.styleSheet){var r=document.createElement(\"style\");r.appendChild(document.createTextNode(\"\")),document.head.appendChild(r),a.styleSheet=r.sheet}var n=a.styleSheet;n.insertRule?n.insertRule(t+\"{\"+e+\"}\",0):n.addRule?n.addRule(t,e,0):a.warn(\"addStyleRule failed\")},a.isIE=function(){return void 0!==window.navigator.msSaveBlob},a.isD3Selection=function(t){return t&&\"function\"==typeof t.classed},a.objectFromPath=function(t,e){for(var r,n=t.split(\".\"),a=r={},o=0;o<n.length;o++){var i=n[o],l=null,s=n[o].match(/(.*)\\[([0-9]+)\\]/);s?(i=s[1],l=s[2],r=r[i]=[],o===n.length-1?r[l]=e:r[l]={},r=r[l]):(o===n.length-1?r[i]=e:r[i]={},r=r[i])}return a};a.expandObjectPaths=function(t){var e,r,n,o,i,l,s;if(\"object\"==typeof t&&!Array.isArray(t))for(r in t)t.hasOwnProperty(r)&&((e=r.match(/^([^\\[\\.]+)\\.(.+)?/))?(o=t[r],n=e[1],delete t[r],t[n]=a.extendDeepNoArrays(t[n]||{},a.objectFromPath(r,a.expandObjectPaths(o))[n])):(e=r.match(/^([^\\.]+)\\[([0-9]+)\\](\\.)?(.+)?/))?(o=t[r],n=e[1],i=parseInt(e[2]),delete t[r],t[n]=t[n]||[],\".\"===e[3]?(s=e[4],l=t[n][i]=t[n][i]||{},a.extendDeepNoArrays(l,a.objectFromPath(s,a.expandObjectPaths(o)))):t[n][i]=a.expandObjectPaths(o)):t[r]=a.expandObjectPaths(t[r]));return t},a.numSeparate=function(t,e,r){if(r||(r=!1),\"string\"!=typeof e||0===e.length)throw new Error(\"Separator string required for formatting!\");\"number\"==typeof t&&(t=String(t));var n=/(\\d+)(\\d{3})/,a=e.charAt(0),o=e.charAt(1),i=t.split(\".\"),l=i[0],s=i.length>1?a+i[1]:\"\";if(o&&(i.length>1||l.length>4||r))for(;n.test(l);)l=l.replace(n,\"$1\"+o+\"$2\");return l+s}},{\"./clean_number\":127,\"./coerce\":128,\"./dates\":129,\"./ensure_array\":130,\"./extend\":132,\"./filter_unique\":133,\"./filter_visible\":134,\"./identity\":135,\"./is_array\":137,\"./is_plain_object\":138,\"./loggers\":139,\"./matrix\":140,\"./mod\":141,\"./nested_property\":142,\"./noop\":143,\"./notifier\":144,\"./push_unique\":147,\"./relink_private\":149,\"./search\":150,\"./stats\":152,\"./to_log_range\":154,d3:7}],137:[function(t,e,r){\"use strict\";var n=\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer:{isView:function(){return!1}};e.exports=function(t){return Array.isArray(t)||n.isView(t)}},{}],138:[function(t,e,r){\"use strict\";e.exports=function(t){return window&&window.process&&window.process.versions?\"[object Object]\"===Object.prototype.toString.call(t):\"[object Object]\"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t)===Object.prototype}},{}],139:[function(t,e,r){\"use strict\";function n(t,e){if(t.apply)t.apply(t,e);else for(var r=0;r<e.length;r++)t(e[r])}var a=t(\"../plot_api/plot_config\"),o=e.exports={};o.log=function(){if(a.logging>1){for(var t=[\"LOG:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.trace||console.log,t)}},o.warn=function(){if(a.logging>0){for(var t=[\"WARN:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.trace||console.log,t)}},o.error=function(){if(a.logging>0){for(var t=[\"ERROR:\"],e=0;e<arguments.length;e++)t.push(arguments[e]);n(console.error,t)}}},{\"../plot_api/plot_config\":159}],140:[function(t,e,r){\"use strict\";r.init2dArray=function(t,e){for(var r=new Array(t),n=0;n<t;n++)r[n]=new Array(e);return r},r.transposeRagged=function(t){var e,r,n=0,a=t.length;for(e=0;e<a;e++)n=Math.max(n,t[e].length);var o=new Array(n);for(e=0;e<n;e++)for(o[e]=new Array(a),r=0;r<a;r++)o[e][r]=t[r][e];return o},r.dot=function(t,e){if(!t.length||!e.length||t.length!==e.length)return null;var n,a,o=t.length;if(t[0].length)for(n=new Array(o),a=0;a<o;a++)n[a]=r.dot(t[a],e);else if(e[0].length){var i=r.transposeRagged(e);for(n=new Array(i.length),a=0;a<i.length;a++)n[a]=r.dot(t,i[a])}else for(n=0,a=0;a<o;a++)n+=t[a]*e[a];return n},r.translationMatrix=function(t,e){return[[1,0,t],[0,1,e],[0,0,1]]},r.rotationMatrix=function(t){var e=t*Math.PI/180;return[[Math.cos(e),-Math.sin(e),0],[Math.sin(e),Math.cos(e),0],[0,0,1]]},r.rotationXYMatrix=function(t,e,n){return r.dot(r.dot(r.translationMatrix(e,n),r.rotationMatrix(t)),r.translationMatrix(-e,-n))},r.apply2DTransform=function(t){return function(){var e=arguments;3===e.length&&(e=e[0]);var n=1===arguments.length?e[0]:[e[0],e[1]];return r.dot(t,[n[0],n[1],1]).slice(0,2)}},r.apply2DTransform2=function(t){var e=r.apply2DTransform(t);return function(t){return e(t.slice(0,2)).concat(e(t.slice(2,4)))}}},{}],141:[function(t,e,r){\"use strict\";e.exports=function(t,e){var r=t%e;return r<0?r+e:r}},{}],142:[function(t,e,r){\"use strict\";function n(t,e){return function(){var r,a,o,i,l,s=t;for(i=0;i<e.length-1;i++){if((r=e[i])===-1){for(a=!0,o=[],l=0;l<s.length;l++)o[l]=n(s[l],e.slice(i+1))(),o[l]!==o[0]&&(a=!1);return a?o[0]:o}if(\"number\"==typeof r&&!h(s))return;if(\"object\"!=typeof(s=s[r])||null===s)return}if(\"object\"==typeof s&&null!==s&&null!==(o=s[e[i]]))return o}}function a(t,e){if(!u(t)||p(t)&&\"]\"===e.charAt(e.length-1)||e.match(m)&&void 0!==t)return!1;if(!h(t))return!0;if(e.match(v))return!0;var r=g(e);return r&&\"\"===r.index}function o(t,e,r){return function(n){var o,u,f=t,d=\"\",p=[[t,d]],g=a(n,r);for(u=0;u<e.length-1;u++){if(\"number\"==typeof(o=e[u])&&!h(f))throw\"array index but container is not an array\";if(o===-1){if(g=!l(f,e.slice(u+1),n,r))break;return}if(!s(f,o,e[u+1],g))break;if(\"object\"!=typeof(f=f[o])||null===f)throw\"container is not an object\";d=i(d,o),p.push([f,d])}g?(u===e.length-1&&delete f[e[u]],c(p)):f[e[u]]=n}}function i(t,e){var r=e;return d(e)?r=\"[\"+e+\"]\":t&&(r=\".\"+e),t+r}function l(t,e,r,n){var i,l=h(r),c=!0,u=r,f=n.replace(\"-1\",0),d=!l&&a(r,f),p=e[0];for(i=0;i<t.length;i++)f=n.replace(\"-1\",i),l&&(u=r[i%r.length],d=a(u,f)),d&&(c=!1),s(t,i,p,d)&&o(t[i],e,n.replace(\"-1\",i))(u);return c}function s(t,e,r,n){if(void 0===t[e]){if(n)return!1;t[e]=\"number\"==typeof r?[]:{}}return!0}function c(t){var e,r,n,o,l,s;for(e=t.length-1;e>=0;e--){if(n=t[e][0],o=t[e][1],s=!1,h(n))for(r=n.length-1;r>=0;r--)a(n[r],i(o,r))?s?n[r]=void 0:n.pop():s=!0;else if(\"object\"==typeof n&&null!==n)for(l=Object.keys(n),s=!1,r=l.length-1;r>=0;r--)a(n[l[r]],i(o,l[r]))?delete n[l[r]]:s=!0;if(s)return}}function u(t){return void 0===t||null===t||\"object\"==typeof t&&(h(t)?!t.length:!Object.keys(t).length)}function f(t,e,r){return{set:function(){throw\"bad container\"},get:function(){},astr:e,parts:r,obj:t}}var d=t(\"fast-isnumeric\"),h=t(\"./is_array\"),p=t(\"./is_plain_object\"),g=t(\"../plot_api/container_array_match\");e.exports=function(t,e){if(d(e))e=String(e);else if(\"string\"!=typeof e||\"[-1]\"===e.substr(e.length-4))throw\"bad property string\";for(var r,a,i,l=0,s=e.split(\".\");l<s.length;){if(r=String(s[l]).match(/^([^\\[\\]]*)((\\[\\-?[0-9]*\\])+)$/)){if(r[1])s[l]=r[1];else{if(0!==l)throw\"bad property string\";s.splice(0,1)}for(a=r[2].substr(1,r[2].length-2).split(\"][\"),i=0;i<a.length;i++)l++,s.splice(l,0,Number(a[i]))}l++}return\"object\"!=typeof t?f(t,e,s):{set:o(t,s,e),get:n(t,s),astr:e,parts:s,obj:t}};var v=/(^|\\.)((domain|range)(\\.[xy])?|args|parallels)$/,m=/(^|\\.)args\\[/},{\"../plot_api/container_array_match\":155,\"./is_array\":137,\"./is_plain_object\":138,\"fast-isnumeric\":10}],143:[function(t,e,r){\"use strict\";e.exports=function(){}},{}],144:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"fast-isnumeric\"),o=[];e.exports=function(t,e){function r(t){t.duration(700).style(\"opacity\",0).each(\"end\",function(t){var e=o.indexOf(t);e!==-1&&o.splice(e,1),n.select(this).remove()})}if(o.indexOf(t)===-1){o.push(t);var i=1e3;a(e)?i=e:\"long\"===e&&(i=3e3);var l=n.select(\"body\").selectAll(\".plotly-notifier\").data([0]);l.enter().append(\"div\").classed(\"plotly-notifier\",!0);l.selectAll(\".notifier-note\").data(o).enter().append(\"div\").classed(\"notifier-note\",!0).style(\"opacity\",0).each(function(t){var e=n.select(this);e.append(\"button\").classed(\"notifier-close\",!0).html(\"×\").on(\"click\",function(){e.transition().call(r)});for(var a=e.append(\"p\"),o=t.split(/<br\\s*\\/?>/g),l=0;l<o.length;l++)l&&a.append(\"br\"),a.append(\"span\").text(o[l]);e.transition().duration(700).style(\"opacity\",1).transition().delay(i).call(r)})}}},{d3:7,\"fast-isnumeric\":10}],145:[function(t,e,r){\"use strict\";var n=t(\"./setcursor\"),a=\"data-savedcursor\";e.exports=function(t,e){var r=t.attr(a);if(e){if(!r){for(var o=(t.attr(\"class\")||\"\").split(\" \"),i=0;i<o.length;i++){var l=o[i];0===l.indexOf(\"cursor-\")&&t.attr(a,l.substr(7)).classed(l,!1)}t.attr(a)||t.attr(a,\"!!\")}n(t,e)}else r&&(t.attr(a,null),\"!!\"===r?n(t):n(t,r))}},{\"./setcursor\":151}],146:[function(t,e,r){\"use strict\";var n=t(\"./matrix\").dot,a=t(\"../constants/numerical\").BADNUM,o=e.exports={};o.tester=function(t){function e(t,e){var r=t[0],n=t[1];return!(r===a||r<o||r>i||n===a||n<l||n>s)&&(!e||!u(t))}function r(t,e){var r=t[0],c=t[1];if(r===a||r<o||r>i||c===a||c<l||c>s)return!1;var u,f,d,h,p,g=n.length,v=n[0][0],m=n[0][1],y=0;for(u=1;u<g;u++)if(f=v,d=m,v=n[u][0],m=n[u][1],h=Math.min(f,v),!(r<h||r>Math.max(f,v)||c>Math.max(d,m)))if(c<Math.min(d,m))r!==h&&y++;else{if(p=v===f?c:d+(r-f)*(m-d)/(v-f),c===p)return 1!==u||!e;c<=p&&r!==h&&y++}return y%2==1}var n=t.slice(),o=n[0][0],i=o,l=n[0][1],s=l;n.push(n[0]);for(var c=1;c<n.length;c++)o=Math.min(o,n[c][0]),i=Math.max(i,n[c][0]),l=Math.min(l,n[c][1]),s=Math.max(s,n[c][1]);var u,f=!1;return 5===n.length&&(n[0][0]===n[1][0]?n[2][0]===n[3][0]&&n[0][1]===n[3][1]&&n[1][1]===n[2][1]&&(f=!0,u=function(t){return t[0]===n[0][0]}):n[0][1]===n[1][1]&&n[2][1]===n[3][1]&&n[0][0]===n[3][0]&&n[1][0]===n[2][0]&&(f=!0,u=function(t){return t[1]===n[0][1]})),{xmin:o,xmax:i,ymin:l,ymax:s,pts:n,contains:f?e:r,isRect:f}};var i=o.isSegmentBent=function(t,e,r,a){var o,i,l,s=t[e],c=[t[r][0]-s[0],t[r][1]-s[1]],u=n(c,c),f=Math.sqrt(u),d=[-c[1]/f,c[0]/f];for(o=e+1;o<r;o++)if(i=[t[o][0]-s[0],t[o][1]-s[1]],(l=n(i,c))<0||l>u||Math.abs(n(i,d))>a)return!0;return!1};o.filter=function(t,e){function r(r){t.push(r);var l=n.length,s=a;n.splice(o+1);for(var c=s+1;c<t.length;c++)(c===t.length-1||i(t,s,c+1,e))&&(n.push(t[c]),n.length<l-2&&(a=c,o=n.length-1),s=c)}var n=[t[0]],a=0,o=0;if(t.length>1){r(t.pop())}return{addPt:r,raw:t,filtered:n}}},{\"../constants/numerical\":122,\"./matrix\":140}],147:[function(t,e,r){\"use strict\";e.exports=function(t,e){if(e instanceof RegExp){var r,n=e.toString();for(r=0;r<t.length;r++)if(t[r]instanceof RegExp&&t[r].toString()===n)return t;t.push(e)}else e&&t.indexOf(e)===-1&&t.push(e);return t}},{}],148:[function(t,e,r){\"use strict\";function n(t,e){for(var r,n=[],o=0;o<e.length;o++)r=e[o],n[o]=r===t?r:\"object\"==typeof r?Array.isArray(r)?a.extendDeep([],r):a.extendDeepAll({},r):r;return n}var a=t(\"../lib\"),o=t(\"../plot_api/plot_config\"),i={};i.add=function(t,e,r,n,a){var i,l;if(t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},l=t.undoQueue.index,t.autoplay)return void(t.undoQueue.inSequence||(t.autoplay=!1));!t.undoQueue.sequence||t.undoQueue.beginSequence?(i={undo:{calls:[],args:[]},redo:{calls:[],args:[]}},t.undoQueue.queue.splice(l,t.undoQueue.queue.length-l,i),t.undoQueue.index+=1):i=t.undoQueue.queue[l-1],t.undoQueue.beginSequence=!1,i&&(i.undo.calls.unshift(e),i.undo.args.unshift(r),i.redo.calls.push(n),i.redo.args.push(a)),t.undoQueue.queue.length>o.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--)},i.startSequence=function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},i.stopSequence=function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},i.undo=function(t){var e,r;if(t.framework&&t.framework.isPolar)return void t.framework.undo();if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.undo.calls.length;r++)i.plotDo(t,e.undo.calls[r],e.undo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1}},i.redo=function(t){var e,r;if(t.framework&&t.framework.isPolar)return void t.framework.redo();if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index>=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.redo.calls.length;r++)i.plotDo(t,e.redo.calls[r],e.redo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1,t.undoQueue.index++}},i.plotDo=function(t,e,r){t.autoplay=!0,r=n(t,r),e.apply(null,r)},e.exports=i},{\"../lib\":136,\"../plot_api/plot_config\":159}],149:[function(t,e,r){\"use strict\";var n=t(\"./is_array\"),a=t(\"./is_plain_object\");e.exports=function t(e,r){for(var o=Object.keys(r||{}),i=0;i<o.length;i++){var l=o[i],s=r[l],c=e[l];if(\"_\"===l.charAt(0)||\"function\"==typeof s){if(l in e)continue;e[l]=s}else if(n(s)&&n(c)&&a(s[0]))for(var u=0;u<s.length;u++)a(s[u])&&a(c[u])&&t(c[u],s[u]);else a(s)&&a(c)&&(t(c,s),Object.keys(c).length||delete e[l])}}},{\"./is_array\":137,\"./is_plain_object\":138}],150:[function(t,e,r){\"use strict\";function n(t,e){return t<e}function a(t,e){return t<=e}function o(t,e){return t>e}function i(t,e){return t>=e}var l=t(\"fast-isnumeric\"),s=t(\"./loggers\");r.findBin=function(t,e,r){if(l(e.start))return r?Math.ceil((t-e.start)/e.size)-1:Math.floor((t-e.start)/e.size);var c,u,f=0,d=e.length,h=0;for(u=e[e.length-1]>=e[0]?r?n:a:r?i:o;f<d&&h++<100;)c=Math.floor((f+d)/2),u(e[c],t)?f=c+1:d=c;return h>90&&s.log(\"Long binary search...\"),f-1},r.sorterAsc=function(t,e){return t-e},r.sorterDes=function(t,e){return e-t},r.distinctVals=function(t){var e=t.slice();e.sort(r.sorterAsc);for(var n=e.length-1,a=e[n]-e[0]||1,o=a/(n||1)/1e4,i=[e[0]],l=0;l<n;l++)e[l+1]>e[l]+o&&(a=Math.min(a,e[l+1]-e[l]),i.push(e[l+1]));return{vals:i,minDiff:a}},r.roundUp=function(t,e,r){for(var n,a=0,o=e.length-1,i=0,l=r?0:1,s=r?1:0,c=r?Math.ceil:Math.floor;a<o&&i++<100;)n=c((a+o)/2),e[n]<=t?a=n+l:o=n-s;return e[a]}},{\"./loggers\":139,\"fast-isnumeric\":10}],151:[function(t,e,r){\"use strict\";e.exports=function(t,e){(t.attr(\"class\")||\"\").split(\" \").forEach(function(e){0===e.indexOf(\"cursor-\")&&t.classed(e,!1)}),e&&t.classed(\"cursor-\"+e,!0)}},{}],152:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");r.aggNums=function(t,e,a,o){var i,l;if(o||(o=a.length),n(e)||(e=!1),Array.isArray(a[0])){for(l=new Array(o),i=0;i<o;i++)l[i]=r.aggNums(t,e,a[i]);a=l}for(i=0;i<o;i++)n(e)?n(a[i])&&(e=t(+e,+a[i])):e=a[i];return e},r.len=function(t){return r.aggNums(function(t){return t+1},0,t)},r.mean=function(t,e){return e||(e=r.len(t)),r.aggNums(function(t,e){return t+e},0,t)/e},r.variance=function(t,e,a){return e||(e=r.len(t)),n(a)||(a=r.mean(t,e)),r.aggNums(function(t,e){return t+Math.pow(e-a,2)},0,t)/e},r.stdev=function(t,e,n){return Math.sqrt(r.variance(t,e,n))},r.interp=function(t,e){if(!n(e))throw\"n should be a finite number\";if((e=e*t.length-.5)<0)return t[0];if(e>t.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},{\"fast-isnumeric\":10}],153:[function(t,e,r){\"use strict\";function n(t,e){return t.node().getBoundingClientRect()[e]}function a(t){return t.replace(/(<|<|<)/g,\"\\\\lt \").replace(/(>|>|>)/g,\"\\\\gt \")}function o(t,e,r){var n=\"math-output-\"+h.randstr([],64),o=d.select(\"body\").append(\"div\").attr({id:n}).style({visibility:\"hidden\",position:\"absolute\"}).style({\"font-size\":e.fontSize+\"px\"}).text(a(t));MathJax.Hub.Queue([\"Typeset\",MathJax.Hub,o.node()],function(){var e=d.select(\"body\").select(\"#MathJax_SVG_glyphs\");if(o.select(\".MathJax_SVG\").empty()||!o.select(\"svg\").node())h.log(\"There was an error in the tex syntax.\",t),r();else{var n=o.select(\"svg\").node().getBoundingClientRect();r(o.select(\".MathJax_SVG\"),e,n)}o.remove()})}function i(t,e){for(var r=t||\"\",n=0;n<e.length;n++){var a=e[n];r=r.replace(a.regExp,a.sub)}return r}function l(t){return i(t,b)}function s(t){return i(t,_)}function c(t){t=l(t).replace(w,\" \");for(var e=t.split(k).map(function(t){var e=t.match(M),n=e&&e[2].toLowerCase(),a=v[n];if(void 0!==a){if(e[1])return(\"a\"===n?\"</a>\":\"</tspan>\")+(m[n]||\"\");if(\"br\"===n)return\"<br>\";var o,i=e[4];if(\"a\"===n){var l=i&&i.match(T),c=l&&(l[3]||l[4]);if(o=\"<a\",c){var u=document.createElement(\"a\");u.href=c,y.indexOf(u.protocol)!==-1&&(o+=' xlink:show=\"new\" xlink:href=\"'+s(c)+'\"')}}else o=\"<tspan\",\"sup\"!==n&&\"sub\"!==n||(o=\"​\"+o);var f=i&&i.match(A),d=f&&(f[3]||f[4]);return d?(d=s(d.replace(L,\"$1 fill:\")),a&&(d+=\";\"+a)):a&&(d=a),d?o+' style=\"'+d+'\">':o+\">\"}return r.xml_entity_encode(t).replace(/</g,\"<\")}),n=[],a=e.indexOf(\"<br>\");a>0;a=e.indexOf(\"<br>\",a+1))n.push(a);var o=0;n.forEach(function(t){for(var r=t+o,n=e.slice(0,r),a=\"\",i=n.length-1;i>=0;i--){var l=n[i].match(/<(\\/?).*>/i);if(l&&\"<br>\"!==n[i]){l[1]||(a=n[i]);break}}a&&(e.splice(r+1,0,a),e.splice(r,0,\"</tspan>\"),o+=2)});var i=e.join(\"\"),c=i.split(/<br>/gi);return c.length>1&&(e=c.map(function(t,e){return'<tspan class=\"line\" dy=\"'+1.3*e+'em\">'+t+\"</tspan>\"})),e.join(\"\")}function u(t,e,r){var n,a,o,i=r.horizontalAlign,l=r.verticalAlign||\"top\",s=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return a=\"bottom\"===l?function(){return s.bottom-n.height}:\"middle\"===l?function(){return s.top+(s.height-n.height)/2}:function(){return s.top},o=\"right\"===i?function(){return s.right-n.width}:\"center\"===i?function(){return s.left+(s.width-n.width)/2}:function(){return s.left},function(){return n=this.node().getBoundingClientRect(),this.style({top:a()-c.top+\"px\",left:o()-c.left+\"px\",\"z-index\":1e3}),this}}var f,d=t(\"d3\"),h=t(\"../lib\"),p=t(\"../constants/xmlns_namespaces\"),g=t(\"../constants/string_mappings\");r.getDOMParser=function(){if(f)return f;if(window.DOMParser)return f=new window.DOMParser;throw new Error(\"Cannot initialize DOMParser\")},d.selection.prototype.appendSVG=function(t){for(var e=['<svg xmlns=\"',p.svg,'\" ','xmlns:xlink=\"',p.xlink,'\">',t,\"</svg>\"].join(\"\"),n=r.getDOMParser(),a=n.parseFromString(e,\"application/xml\"),o=a.documentElement.firstChild;o;)this.node().appendChild(this.node().ownerDocument.importNode(o,!0)),o=o.nextSibling;return a.querySelector(\"parsererror\")?(h.log(a.querySelector(\"parsererror div\").textContent),null):d.select(this.node().lastChild)},r.html_entity_decode=function(t){var e=d.select(\"body\").append(\"div\").style({display:\"none\"}).html(\"\"),r=t.replace(/(&[^;]*;)/gi,function(t){return\"<\"===t?\"<\":\"&rt;\"===t?\">\":t.indexOf(\"<\")!==-1||t.indexOf(\">\")!==-1?\"\":e.html(t).text()});return e.remove(),r},r.xml_entity_encode=function(t){return t.replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g,\"&\")},r.convertToTspans=function(t,e){function r(){f.empty()||(p=l.attr(\"class\")+\"-math\",f.select(\"svg.\"+p).remove()),t.text(\"\").style({visibility:\"inherit\",\"white-space\":\"pre\"}),u=t.appendSVG(i),u||t.text(a),t.select(\"a\").size()&&t.style(\"pointer-events\",\"all\"),e&&e.call(l)}var a=t.text(),i=c(a),l=t,s=!l.attr(\"data-notex\")&&i.match(/([^$]*)([$]+[^$]*[$]+)([^$]*)/),u=a,f=d.select(l.node().parentNode);if(!f.empty()){var p=l.attr(\"class\")?l.attr(\"class\").split(\" \")[0]:\"text\";p+=\"-math\",f.selectAll(\"svg.\"+p).remove(),f.selectAll(\"g.\"+p+\"-group\").remove(),t.style({visibility:null});for(var g=t.node();g&&g.removeAttribute;g=g.parentNode)g.removeAttribute(\"data-bb\");if(s){var v=h.getPlotDiv(l.node());(v&&v._promises||[]).push(new Promise(function(t){l.style({visibility:\"hidden\"});var a={fontSize:parseInt(l.style(\"font-size\"),10)};o(s[2],a,function(a,o,i){f.selectAll(\"svg.\"+p).remove(),f.selectAll(\"g.\"+p+\"-group\").remove();var s=a&&a.select(\"svg\");if(!s||!s.node())return r(),void t();var c=f.append(\"g\").classed(p+\"-group\",!0).attr({\"pointer-events\":\"none\"});c.node().appendChild(s.node()),o&&o.node()&&s.node().insertBefore(o.node().cloneNode(!0),s.node().firstChild),s.attr({class:p,height:i.height,preserveAspectRatio:\"xMinYMin meet\"}).style({overflow:\"visible\",\"pointer-events\":\"none\"});var u=l.style(\"fill\")||\"black\";s.select(\"g\").attr({fill:u,stroke:u});var d=n(s,\"width\"),h=n(s,\"height\"),g=+l.attr(\"x\")-d*{start:0,middle:.5,end:1}[l.attr(\"text-anchor\")||\"start\"],v=parseInt(l.style(\"font-size\"),10)||n(l,\"height\"),m=-v/4;\"y\"===p[0]?(c.attr({transform:\"rotate(\"+[-90,+l.attr(\"x\"),+l.attr(\"y\")]+\") translate(\"+[-d/2,m-h/2]+\")\"}),s.attr({x:+l.attr(\"x\"),y:+l.attr(\"y\")})):\"l\"===p[0]?s.attr({x:l.attr(\"x\"),y:m-h/2}):\"a\"===p[0]?s.attr({x:0,y:m}):s.attr({x:g,y:+l.attr(\"y\")+m-h/2}),e&&e.call(l,c),t(c)})}))}else r();return t}};var v={sup:'font-size:70%\" dy=\"-0.6em',sub:'font-size:70%\" dy=\"0.3em',b:\"font-weight:bold\",i:\"font-style:italic\",a:\"cursor:pointer\",span:\"\",br:\"\",em:\"font-style:italic;font-weight:bold\"},m={sup:'<tspan dy=\"0.42em\">​</tspan>',sub:'<tspan dy=\"-0.21em\">​</tspan>'},y=[\"http:\",\"https:\",\"mailto:\"],x=new RegExp(\"</?(\"+Object.keys(v).join(\"|\")+\")( [^>]*)?/?>\",\"g\"),b=Object.keys(g.entityToUnicode).map(function(t){return{regExp:new RegExp(\"&\"+t+\";\",\"g\"),sub:g.entityToUnicode[t]}}),_=Object.keys(g.unicodeToEntity).map(function(t){return{regExp:new RegExp(t,\"g\"),sub:\"&\"+g.unicodeToEntity[t]+\";\"}}),w=/(\\r\\n?|\\n)/g,k=/(<[^<>]*>)/,M=/<(\\/?)([^ >]*)(\\s+(.*))?>/i,A=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,T=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,L=/(^|;)\\s*color:/;r.plainText=function(t){return(t||\"\").replace(x,\" \")},r.makeEditable=function(t,e,r){function n(){o(),i.style({opacity:0});var t,e=c.attr(\"class\");(t=e?\".\"+e.split(\" \")[0]+\"-math-group\":\"[class*=-math-group]\")&&d.select(i.node().parentNode).select(t).style({opacity:0})}function a(t){var e=t.node(),r=document.createRange();r.selectNodeContents(e);var n=window.getSelection();n.removeAllRanges(),n.addRange(r),e.focus()}function o(){var t=h.getPlotDiv(i.node()),e=d.select(t),n=e.select(\".svg-container\"),o=n.append(\"div\");o.classed(\"plugin-editable editable\",!0).style({position:\"absolute\",\"font-family\":i.style(\"font-family\")||\"Arial\",\"font-size\":i.style(\"font-size\")||12,color:r.fill||i.style(\"fill\")||\"black\",opacity:1,\"background-color\":r.background||\"transparent\",outline:\"#ffffff33 1px solid\",margin:[-parseFloat(i.style(\"font-size\"))/8+1,0,0,-1].join(\"px \")+\"px\",padding:\"0\",\"box-sizing\":\"border-box\"}).attr({contenteditable:!0}).text(r.text||i.attr(\"data-unformatted\")).call(u(i,n,r)).on(\"blur\",function(){t._editing=!1,i.text(this.textContent).style({opacity:1});var e,r=d.select(this).attr(\"class\");(e=r?\".\"+r.split(\" \")[0]+\"-math-group\":\"[class*=-math-group]\")&&d.select(i.node().parentNode).select(e).style({opacity:0});var n=this.textContent;d.select(this).transition().duration(0).remove(),d.select(document).on(\"mouseup\",null),l.edit.call(i,n)}).on(\"focus\",function(){var e=this;t._editing=!0,d.select(document).on(\"mouseup\",function(){if(d.event.target===e)return!1;document.activeElement===o.node()&&o.node().blur()})}).on(\"keyup\",function(){27===d.event.which?(t._editing=!1,i.style({opacity:1}),d.select(this).style({opacity:0}).on(\"blur\",function(){return!1}).transition().remove(),l.cancel.call(i,this.textContent)):(l.input.call(i,this.textContent),d.select(this).call(u(i,n,r)))}).on(\"keydown\",function(){13===d.event.which&&this.blur()}).call(a)}r||(r={});var i=this,l=d.dispatch(\"edit\",\"input\",\"cancel\"),s=d.select(this.node()).style({\"pointer-events\":\"all\"}),c=e||s;return e&&s.style({\"pointer-events\":\"none\"}),r.immediate?n():c.on(\"click\",n),d.rebind(this,l,\"on\")}},{\"../constants/string_mappings\":123,\"../constants/xmlns_namespaces\":124,\"../lib\":136,d3:7}],154:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");e.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},{\"fast-isnumeric\":10}],155:[function(t,e,r){\"use strict\";var n=t(\"../registry\");e.exports=function(t){for(var e,r,a=n.layoutArrayContainers,o=n.layoutArrayRegexes,i=t.split(\"[\")[0],l=0;l<o.length;l++)if((r=t.match(o[l]))&&0===r.index){e=r[0];break}if(e||(e=a[a.indexOf(i)]),!e)return!1;var s=t.substr(e.length);return s?!!(r=s.match(/^\\[(0|[1-9][0-9]*)\\](\\.(.+))?$/))&&{array:e,index:Number(r[1]),property:r[3]||\"\"}:{array:e,index:\"\",property:\"\"}}},{\"../registry\":206}],156:[function(t,e,r){\"use strict\";function n(t,e){var r=t[e],n=e.charAt(0);r&&\"paper\"!==r&&(t[e]=d.cleanId(r,n))}function a(t){var e=\"middle\",r=\"center\";return t.indexOf(\"top\")!==-1?e=\"top\":t.indexOf(\"bottom\")!==-1&&(e=\"bottom\"),t.indexOf(\"left\")!==-1?r=\"left\":t.indexOf(\"right\")!==-1&&(r=\"right\"),e+\" \"+r}function o(t,e){return e in t&&\"object\"==typeof t[e]&&0===Object.keys(t[e]).length}function i(t){var e=t.search(p);if(e>0)return t.substr(0,e)}var l=t(\"fast-isnumeric\"),s=t(\"gl-mat4/fromQuat\"),c=t(\"../registry\"),u=t(\"../lib\"),f=t(\"../plots/plots\"),d=t(\"../plots/cartesian/axes\"),h=t(\"../components/color\");r.getGraphDiv=function(t){var e;if(\"string\"==typeof t){if(null===(e=document.getElementById(t)))throw new Error(\"No DOM element with id '\"+t+\"' exists on the page.\");return e}if(null===t||void 0===t)throw new Error(\"DOM element provided is null or undefined\");return t},r.clearPromiseQueue=function(t){Array.isArray(t._promises)&&t._promises.length>0&&u.log(\"Clearing previous rejected promises from queue.\"),t._promises=[]},r.cleanLayout=function(t){var e,r;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1);var a=d.list({_fullLayout:t});for(e=0;e<a.length;e++){var i=a[e];i.anchor&&\"free\"!==i.anchor&&(i.anchor=d.cleanId(i.anchor)),i.overlaying&&(i.overlaying=d.cleanId(i.overlaying)),i.type||(i.isdate?i.type=\"date\":i.islog?i.type=\"log\":i.isdate===!1&&i.islog===!1&&(i.type=\"linear\")),\"withzero\"!==i.autorange&&\"tozero\"!==i.autorange||(i.autorange=!0,i.rangemode=\"tozero\"),delete i.islog,delete i.isdate,delete i.categories,o(i,\"domain\")&&delete i.domain,void 0!==i.autotick&&(void 0===i.tickmode&&(i.tickmode=i.autotick?\"auto\":\"linear\"),delete i.autotick)}var l=Array.isArray(t.annotations)?t.annotations.length:0;for(e=0;e<l;e++){var c=t.annotations[e];u.isPlainObject(c)&&(c.ref&&(\"paper\"===c.ref?(c.xref=\"paper\",c.yref=\"paper\"):\"data\"===c.ref&&(c.xref=\"x\",c.yref=\"y\"),delete c.ref),n(c,\"xref\"),n(c,\"yref\"))}var p=Array.isArray(t.shapes)?t.shapes.length:0;for(e=0;e<p;e++){var g=t.shapes[e];u.isPlainObject(g)&&(n(g,\"xref\"),n(g,\"yref\"))}var v=t.legend;v&&(v.x>3?(v.x=1.02,v.xanchor=\"left\"):v.x<-2&&(v.x=-.02,v.xanchor=\"right\"),v.y>3?(v.y=1.02,v.yanchor=\"bottom\"):v.y<-2&&(v.y=-.02,v.yanchor=\"top\")),\"rotate\"===t.dragmode&&(t.dragmode=\"orbit\"),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var m=f.getSubplotIds(t,\"gl3d\");for(e=0;e<m.length;e++){var y=t[m[e]],x=y.cameraposition;if(Array.isArray(x)&&4===x[0].length){var b=x[0],_=x[1],w=x[2],k=s([],b),M=[];for(r=0;r<3;++r)M[r]=_[e]+w*k[2+4*r];y.camera={eye:{x:M[0],y:M[1],z:M[2]},center:{x:_[0],y:_[1],z:_[2]},up:{x:k[1],y:k[5],z:k[9]}},delete y.cameraposition}}return h.clean(t),t},r.cleanData=function(t,e){for(var n=[],i=(t.concat(Array.isArray(e)?e:[]).filter(function(t){return\"uid\"in t}).map(function(t){return t.uid})),l=0;l<t.length;l++){var s,p=t[l];if(!(\"uid\"in p)||n.indexOf(p.uid)!==-1){var g;for(s=0;s<100&&(g=u.randstr(i),n.indexOf(g)!==-1);s++);p.uid=u.randstr(i),i.push(p.uid)}if(n.push(p.uid),\"histogramy\"===p.type&&\"xbins\"in p&&!(\"ybins\"in p)&&(p.ybins=p.xbins,delete p.xbins),p.error_y&&\"opacity\"in p.error_y){var v=h.defaults,m=p.error_y.color||(c.traceIs(p,\"bar\")?h.defaultLine:v[l%v.length]);p.error_y.color=h.addOpacity(h.rgb(m),h.opacity(m)*p.error_y.opacity),delete p.error_y.opacity}if(\"bardir\"in p&&(\"h\"!==p.bardir||!c.traceIs(p,\"bar\")&&\"histogram\"!==p.type.substr(0,9)||(p.orientation=\"h\",r.swapXYData(p)),delete p.bardir),\"histogramy\"===p.type&&r.swapXYData(p),\"histogramx\"!==p.type&&\"histogramy\"!==p.type||(p.type=\"histogram\"),\"scl\"in p&&(p.colorscale=p.scl,delete p.scl),\"reversescl\"in p&&(p.reversescale=p.reversescl,delete p.reversescl),p.xaxis&&(p.xaxis=d.cleanId(p.xaxis,\"x\")),p.yaxis&&(p.yaxis=d.cleanId(p.yaxis,\"y\")),c.traceIs(p,\"gl3d\")&&p.scene&&(p.scene=f.subplotsRegistry.gl3d.cleanId(p.scene)),\n",
|
|
"c.traceIs(p,\"pie\")||c.traceIs(p,\"bar\")||(Array.isArray(p.textposition)?p.textposition=p.textposition.map(a):p.textposition&&(p.textposition=a(p.textposition))),c.traceIs(p,\"2dMap\")&&(\"YIGnBu\"===p.colorscale&&(p.colorscale=\"YlGnBu\"),\"YIOrRd\"===p.colorscale&&(p.colorscale=\"YlOrRd\")),c.traceIs(p,\"markerColorscale\")&&p.marker){var y=p.marker;\"YIGnBu\"===y.colorscale&&(y.colorscale=\"YlGnBu\"),\"YIOrRd\"===y.colorscale&&(y.colorscale=\"YlOrRd\")}if(\"surface\"===p.type&&u.isPlainObject(p.contours)){var x=[\"x\",\"y\",\"z\"];for(s=0;s<x.length;s++){var b=p.contours[x[s]];u.isPlainObject(b)&&(b.highlightColor&&(b.highlightcolor=b.highlightColor,delete b.highlightColor),b.highlightWidth&&(b.highlightwidth=b.highlightWidth,delete b.highlightWidth))}}if(Array.isArray(p.transforms)){var _=p.transforms;for(s=0;s<_.length;s++){var w=_[s];u.isPlainObject(w)&&(\"filter\"===w.type&&(w.filtersrc&&(w.target=w.filtersrc,delete w.filtersrc),w.calendar&&(w.valuecalendar||(w.valuecalendar=w.calendar),delete w.calendar)))}}o(p,\"line\")&&delete p.line,\"marker\"in p&&(o(p.marker,\"line\")&&delete p.marker.line,o(p,\"marker\")&&delete p.marker),h.clean(p)}},r.swapXYData=function(t){var e;if(u.swapAttrs(t,[\"?\",\"?0\",\"d?\",\"?bins\",\"nbins?\",\"autobin?\",\"?src\",\"error_?\"]),Array.isArray(t.z)&&Array.isArray(t.z[0])&&(t.transpose?delete t.transpose:t.transpose=!0),t.error_x&&t.error_y){var r=t.error_y,n=\"copy_ystyle\"in r?r.copy_ystyle:!(r.color||r.thickness||r.width);u.swapAttrs(t,[\"error_?.copy_ystyle\"]),n&&u.swapAttrs(t,[\"error_?.color\",\"error_?.thickness\",\"error_?.width\"])}if(t.hoverinfo){var a=t.hoverinfo.split(\"+\");for(e=0;e<a.length;e++)\"x\"===a[e]?a[e]=\"y\":\"y\"===a[e]&&(a[e]=\"x\");t.hoverinfo=a.join(\"+\")}},r.coerceTraceIndices=function(t,e){return l(e)?[e]:Array.isArray(e)&&e.length?e:t.data.map(function(t,e){return e})},r.manageArrayContainers=function(t,e,r){var n=t.obj,a=t.parts,o=a.length,i=a[o-1],s=l(i);if(s&&null===e){var c=a.slice(0,o-1).join(\".\");u.nestedProperty(n,c).get().splice(i,1)}else s&&void 0===t.get()?(void 0===t.get()&&(r[t.astr]=null),t.set(e)):t.set(e)};var p=/(\\.[^\\[\\]\\.]+|\\[[^\\[\\]\\.]+\\])$/;r.hasParent=function(t,e){for(var r=i(e);r;){if(r in t)return!0;r=i(r)}return!1}},{\"../components/color\":25,\"../lib\":136,\"../plots/cartesian/axes\":171,\"../plots/plots\":199,\"../registry\":206,\"fast-isnumeric\":10,\"gl-mat4/fromQuat\":11}],157:[function(t,e,r){\"use strict\";var n=t(\"../lib/nested_property\"),a=t(\"../lib/is_plain_object\"),o=t(\"../lib/noop\"),i=t(\"../lib/loggers\"),l=t(\"../lib/search\").sorterAsc,s=t(\"../registry\");r.containerArrayMatch=t(\"./container_array_match\");var c=r.isAddVal=function(t){return\"add\"===t||a(t)},u=r.isRemoveVal=function(t){return null===t||\"remove\"===t};r.applyContainerArrayChanges=function(t,e,r,a){var f=e.astr,d=s.getComponentMethod(f,\"supplyLayoutDefaults\"),h=s.getComponentMethod(f,\"draw\"),p=s.getComponentMethod(f,\"drawOne\"),g=a.replot||a.recalc||d===o||h===o,v=t.layout,m=t._fullLayout;if(r[\"\"]){Object.keys(r).length>1&&i.warn(\"Full array edits are incompatible with other edits\",f);var y=r[\"\"][\"\"];if(u(y))e.set(null);else{if(!Array.isArray(y))return i.warn(\"Unrecognized full array edit value\",f,y),!0;e.set(y)}return!g&&(d(v,m),h(t),!0)}var x,b,_,w,k,M,A,T=Object.keys(r).map(Number).sort(l),L=e.get(),C=L||[],S=n(m,f).get(),z=[],O=-1,D=C.length;for(x=0;x<T.length;x++)if(_=T[x],w=r[_],k=Object.keys(w),M=w[\"\"],A=c(M),_<0||_>C.length-(A?0:1))i.warn(\"index out of range\",f,_);else if(void 0!==M)k.length>1&&i.warn(\"Insertion & removal are incompatible with edits to the same index.\",f,_),u(M)?z.push(_):A?(\"add\"===M&&(M={}),C.splice(_,0,M),S&&S.splice(_,0,{})):i.warn(\"Unrecognized full object edit value\",f,_,M),O===-1&&(O=_);else for(b=0;b<k.length;b++)n(C[_],k[b]).set(w[k[b]]);for(x=z.length-1;x>=0;x--)C.splice(z[x],1),S&&S.splice(z[x],1);if(C.length?L||e.set(C):e.set(null),g)return!1;if(d(v,m),p!==o){var P;if(O===-1)P=T;else{for(D=Math.max(C.length,D),P=[],x=0;x<T.length&&!((_=T[x])>=O);x++)P.push(_);for(x=O;x<D;x++)P.push(x)}for(x=0;x<P.length;x++)p(t,P[x])}else h(t);return!0}},{\"../lib/is_plain_object\":138,\"../lib/loggers\":139,\"../lib/nested_property\":142,\"../lib/noop\":143,\"../lib/search\":150,\"../registry\":206,\"./container_array_match\":155}],158:[function(t,e,r){\"use strict\";function n(t,e){t._fullLayout._paperdiv.style(\"background\",\"white\"),y.defaultConfig.setBackground(t,e)}function a(t,e){t._context||(t._context=x.extendFlat({},y.defaultConfig));var r=t._context;e&&(Object.keys(e).forEach(function(t){t in r&&(\"setBackground\"===t&&\"opaque\"===e[t]?r[t]=n:r[t]=e[t])}),e.plot3dPixelRatio&&!r.plotGlPixelRatio&&(r.plotGlPixelRatio=r.plot3dPixelRatio)),r.staticPlot&&(r.editable=!1,r.autosizable=!1,r.scrollZoom=!1,r.doubleClick=!1,r.showTips=!1,r.showLink=!1,r.displayModeBar=!1)}function o(t,e,r){var n=v.select(t).selectAll(\".plot-container\").data([0]);n.enter().insert(\"div\",\":first-child\").classed(\"plot-container plotly\",!0);var a=n.selectAll(\".svg-container\").data([0]);a.enter().append(\"div\").classed(\"svg-container\",!0).style(\"position\",\"relative\"),a.html(\"\"),e&&(t.data=e),r&&(t.layout=r),M.manager.fillLayout(t),a.style({width:t._fullLayout.width+\"px\",height:t._fullLayout.height+\"px\"}),t.framework=M.manager.framework(t),t.framework({data:t.data,layout:t.layout},a.node()),t.framework.setUndoPoint();var o=t.framework.svg(),i=1,l=t._fullLayout.title;\"\"!==l&&l||(i=0);var s=function(){this.call(S.convertToTspans)},c=o.select(\".title-group text\").call(s);if(t._context.editable){c.attr({\"data-unformatted\":l}),l&&\"Click to enter title\"!==l||(i=.2,c.attr({\"data-unformatted\":\"Click to enter title\"}).text(\"Click to enter title\").style({opacity:i}).on(\"mouseover.opacity\",function(){v.select(this).transition().duration(100).style(\"opacity\",1)}).on(\"mouseout.opacity\",function(){v.select(this).transition().duration(1e3).style(\"opacity\",0)}));var u=function(){this.call(S.makeEditable).on(\"edit\",function(e){t.framework({layout:{title:e}}),this.attr({\"data-unformatted\":e}).text(e).call(s),this.call(u)}).on(\"cancel\",function(){var t=this.attr(\"data-unformatted\");this.text(t).call(s)})};c.call(u)}return t._context.setBackground(t,t._fullLayout.paper_bgcolor),k.addLinks(t),Promise.resolve()}function i(t,e){var r,n,a=e+1,o=[];for(r=0;r<t.length;r++)n=t[r],n<0?o.push(a+n):o.push(n);return o}function l(t,e,r){var n,a;for(n=0;n<e.length;n++){if((a=e[n])!==parseInt(a,10))throw new Error(\"all values in \"+r+\" must be integers\");if(a>=t.data.length||a<-t.data.length)throw new Error(r+\" must be valid indices for gd.data.\");if(e.indexOf(a,n+1)>-1||a>=0&&e.indexOf(-t.data.length+a)>-1||a<0&&e.indexOf(t.data.length+a)>-1)throw new Error(\"each index in \"+r+\" must be unique.\")}}function s(t,e,r){if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"currentIndices is a required argument.\");if(Array.isArray(e)||(e=[e]),l(t,e,\"currentIndices\"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&l(t,r,\"newIndices\"),void 0!==r&&e.length!==r.length)throw new Error(\"current and new indices must be of equal length.\")}function c(t,e,r){var n,a;if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"traces must be defined.\");for(Array.isArray(e)||(e=[e]),n=0;n<e.length;n++)if(\"object\"!=typeof(a=e[n])||Array.isArray(a)||null===a)throw new Error(\"all values in traces array must be non-array objects\");if(void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&r.length!==e.length)throw new Error(\"if indices is specified, traces.length must equal indices.length\")}function u(t,e,r,n){var a=x.isPlainObject(n);if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array\");if(!x.isPlainObject(e))throw new Error(\"update must be a key:value object\");if(void 0===r)throw new Error(\"indices must be an integer or array of integers\");l(t,r,\"indices\");for(var o in e){if(!Array.isArray(e[o])||e[o].length!==r.length)throw new Error(\"attribute \"+o+\" must be an array of length equal to indices array length\");if(a&&(!(o in n)||!Array.isArray(n[o])||n[o].length!==e[o].length))throw new Error(\"when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object\")}}function f(t,e,r,n){var a,o,l,s,c,u=x.isPlainObject(n),f=[];Array.isArray(r)||(r=[r]),r=i(r,t.data.length-1);for(var d in e)for(var h=0;h<r.length;h++){if(a=t.data[r[h]],l=x.nestedProperty(a,d),o=l.get(),s=e[d][h],!Array.isArray(s))throw new Error(\"attribute: \"+d+\" index: \"+h+\" must be an array\");if(!Array.isArray(o))throw new Error(\"cannot extend missing or non-array attribute: \"+d);c=u?n[d][h]:n,m(c)||(c=-1),f.push({prop:l,target:o,insert:s,maxp:Math.floor(c)})}return f}function d(t,e,r,n,a,o){u(t,e,r,n);for(var i,l,s,c=f(t,e,r,n),d=[],h={},p={},g=0;g<c.length;g++)l=c[g].prop,s=c[g].maxp,i=a(c[g].target,c[g].insert),s>=0&&s<i.length&&(d=o(i,s)),s=c[g].target.length,l.set(i),Array.isArray(h[l.astr])||(h[l.astr]=[]),Array.isArray(p[l.astr])||(p[l.astr]=[]),h[l.astr].push(d),p[l.astr].push(s);return{update:h,maxPoints:p}}function h(t,e,r){function n(){return h.map(function(){})}function a(t){var e=y.Axes.id2name(t);c.indexOf(e)===-1&&c.push(e)}function o(t){return\"LAYOUT\"+t+\".autorange\"}function i(t){return\"LAYOUT\"+t+\".range\"}function l(r,a,o){if(Array.isArray(r))return void r.forEach(function(t){l(t,a,o)});if(!(r in e||O.hasParent(e,r))){var i;i=\"LAYOUT\"===r.substr(0,6)?x.nestedProperty(t.layout,r.replace(\"LAYOUT\",\"\")):x.nestedProperty(d[h[o]],r),r in v||(v[r]=n()),void 0===v[r][o]&&(v[r][o]=i.get()),void 0!==a&&i.set(a)}}var s,c,u=t._fullLayout,f=t._fullData,d=t.data,h=O.coerceTraceIndices(t,r),p={docalc:!1,docalcAutorange:!1,doplot:!1,dostyle:!1,docolorbars:!1,autorangeOn:!1,clearCalc:!1,fullReplot:!1},g={},v={},m={},b=[\"mode\",\"visible\",\"type\",\"orientation\",\"fill\",\"histfunc\",\"histnorm\",\"text\",\"x\",\"y\",\"z\",\"a\",\"b\",\"c\",\"open\",\"high\",\"low\",\"close\",\"base\",\"width\",\"offset\",\"xtype\",\"x0\",\"dx\",\"ytype\",\"y0\",\"dy\",\"xaxis\",\"yaxis\",\"line.width\",\"connectgaps\",\"transpose\",\"zsmooth\",\"showscale\",\"marker.showscale\",\"zauto\",\"marker.cauto\",\"autocolorscale\",\"marker.autocolorscale\",\"colorscale\",\"marker.colorscale\",\"reversescale\",\"marker.reversescale\",\"autobinx\",\"nbinsx\",\"xbins\",\"xbins.start\",\"xbins.end\",\"xbins.size\",\"autobiny\",\"nbinsy\",\"ybins\",\"ybins.start\",\"ybins.end\",\"ybins.size\",\"autocontour\",\"ncontours\",\"contours\",\"contours.coloring\",\"contours.operation\",\"contours.value\",\"contours.type\",\"contours.value[0]\",\"contours.value[1]\",\"error_y\",\"error_y.visible\",\"error_y.value\",\"error_y.type\",\"error_y.traceref\",\"error_y.array\",\"error_y.symmetric\",\"error_y.arrayminus\",\"error_y.valueminus\",\"error_y.tracerefminus\",\"error_x\",\"error_x.visible\",\"error_x.value\",\"error_x.type\",\"error_x.traceref\",\"error_x.array\",\"error_x.symmetric\",\"error_x.arrayminus\",\"error_x.valueminus\",\"error_x.tracerefminus\",\"swapxy\",\"swapxyaxes\",\"orientationaxes\",\"marker.colors\",\"values\",\"labels\",\"label0\",\"dlabel\",\"sort\",\"textinfo\",\"textposition\",\"textfont.size\",\"textfont.family\",\"textfont.color\",\"insidetextfont.size\",\"insidetextfont.family\",\"insidetextfont.color\",\"outsidetextfont.size\",\"outsidetextfont.family\",\"outsidetextfont.color\",\"hole\",\"scalegroup\",\"domain\",\"domain.x\",\"domain.y\",\"domain.x[0]\",\"domain.x[1]\",\"domain.y[0]\",\"domain.y[1]\",\"tilt\",\"tiltaxis\",\"depth\",\"direction\",\"rotation\",\"pull\",\"line.showscale\",\"line.cauto\",\"line.autocolorscale\",\"line.reversescale\",\"marker.line.showscale\",\"marker.line.cauto\",\"marker.line.autocolorscale\",\"marker.line.reversescale\",\"xcalendar\",\"ycalendar\",\"cumulative\",\"cumulative.enabled\",\"cumulative.direction\",\"cumulative.currentbin\",\"a0\",\"da\",\"b0\",\"db\",\"atype\",\"btype\",\"cheaterslope\",\"carpet\",\"sum\"],_=[\"color\",\"smoothing\",\"title\",\"titlefont\",\"titlefont.size\",\"titlefont.family\",\"titlefont.color\",\"titleoffset\",\"type\",\"autorange\",\"rangemode\",\"range\",\"fixedrange\",\"cheatertype\",\"tickmode\",\"nticks\",\"tickvals\",\"ticktext\",\"ticks\",\"mirror\",\"ticklen\",\"tickwidth\",\"tickcolor\",\"showticklabels\",\"tickfont\",\"tickfont.size\",\"tickfont.family\",\"tickfont.color\",\"tickprefix\",\"showtickprefix\",\"ticksuffix\",\"showticksuffix\",\"showexponent\",\"exponentformat\",\"separatethousands\",\"tickformat\",\"categoryorder\",\"categoryarray\",\"labelpadding\",\"labelprefix\",\"labelsuffix\",\"labelfont\",\"labelfont.family\",\"labelfont.size\",\"labelfont.color\",\"showline\",\"linecolor\",\"linewidth\",\"gridcolor\",\"gridwidth\",\"showgrid\",\"minorgridcount\",\"minorgridwidth\",\"minorgridcolor\",\"startline\",\"startlinecolor\",\"startlinewidth\",\"endline\",\"endlinewidth\",\"endlinecolor\",\"tick0\",\"dtick\",\"arraytick0\",\"arraydtick\",\"hoverformat\",\"tickangle\"];for(s=0;s<_.length;s++)b.push(\"aaxis.\"+_[s]),b.push(\"baxis.\"+_[s]);for(s=0;s<h.length;s++)if(w.traceIs(f[h[s]],\"box\")){b.push(\"name\");break}var M=[\"marker\",\"marker.size\",\"textfont\",\"boxpoints\",\"jitter\",\"pointpos\",\"whiskerwidth\",\"boxmean\",\"tickwidth\"],A=[\"zmin\",\"zmax\",\"zauto\",\"xgap\",\"ygap\",\"marker.cmin\",\"marker.cmax\",\"marker.cauto\",\"line.cmin\",\"line.cmax\",\"marker.line.cmin\",\"marker.line.cmax\",\"contours.start\",\"contours.end\",\"contours.size\",\"contours.showlines\",\"line\",\"line.smoothing\",\"line.shape\",\"error_y.width\",\"error_x.width\",\"error_x.copy_ystyle\",\"marker.maxdisplayed\"],T=[\"type\",\"x\",\"y\",\"x0\",\"y0\",\"orientation\",\"xaxis\",\"yaxis\"],L=[\"zmin\",\"zmax\"],C=[\"xbins.start\",\"xbins.end\",\"xbins.size\"],S=[\"ybins.start\",\"ybins.end\",\"ybins.size\"],z=[\"contours.start\",\"contours.end\",\"contours.size\"],D=[\"cartesian\",\"pie\",\"ternary\"];u._basePlotModules.forEach(function(t){D.indexOf(t.name)===-1&&(p.docalc=!0)});for(var P in e){if(O.hasParent(e,P))throw new Error(\"cannot set \"+P+\"and a parent attribute simultaneously\");var E,N,I,R,F,j=e[P];if(g[P]=j,\"LAYOUT\"!==P.substr(0,6)){for(v[P]=n(),s=0;s<h.length;s++)if(E=d[h[s]],N=f[h[s]],I=x.nestedProperty(E,P),R=I.get(),void 0!==(F=Array.isArray(j)?j[s%j.length]:j)){if(L.indexOf(P)!==-1)l(\"zauto\",!1,s);else if(\"colorscale\"===P)l(\"autocolorscale\",!1,s);else if(\"autocolorscale\"===P)l(\"colorscale\",void 0,s);else if(\"marker.colorscale\"===P)l(\"marker.autocolorscale\",!1,s);else if(\"marker.autocolorscale\"===P)l(\"marker.colorscale\",void 0,s);else if(\"zauto\"===P)l(L,void 0,s);else if(C.indexOf(P)!==-1)l(\"autobinx\",!1,s);else if(\"autobinx\"===P)l(C,void 0,s);else if(S.indexOf(P)!==-1)l(\"autobiny\",!1,s);else if(\"autobiny\"===P)l(S,void 0,s);else if(z.indexOf(P)!==-1)l(\"autocontour\",!1,s);else if(\"autocontour\"===P)l(z,void 0,s);else if([\"x0\",\"dx\"].indexOf(P)!==-1&&N.x&&\"scaled\"!==N.xtype)l(\"xtype\",\"scaled\",s);else if([\"y0\",\"dy\"].indexOf(P)!==-1&&N.y&&\"scaled\"!==N.ytype)l(\"ytype\",\"scaled\",s);else if(\"colorbar.thicknessmode\"===P&&I.get()!==F&&[\"fraction\",\"pixels\"].indexOf(F)!==-1&&N.colorbar){var B=[\"top\",\"bottom\"].indexOf(N.colorbar.orient)!==-1?u.height-u.margin.t-u.margin.b:u.width-u.margin.l-u.margin.r;l(\"colorbar.thickness\",N.colorbar.thickness*(\"fraction\"===F?1/B:B),s)}else if(\"colorbar.lenmode\"===P&&I.get()!==F&&[\"fraction\",\"pixels\"].indexOf(F)!==-1&&N.colorbar){var q=[\"top\",\"bottom\"].indexOf(N.colorbar.orient)!==-1?u.width-u.margin.l-u.margin.r:u.height-u.margin.t-u.margin.b;l(\"colorbar.len\",N.colorbar.len*(\"fraction\"===F?1/q:q),s)}else\"colorbar.tick0\"===P||\"colorbar.dtick\"===P?l(\"colorbar.tickmode\",\"linear\",s):\"colorbar.tickmode\"===P&&l([\"colorbar.tick0\",\"colorbar.dtick\"],void 0,s);if(\"type\"===P&&\"pie\"===F!=(\"pie\"===R)){var H=\"x\",V=\"y\";\"bar\"!==F&&\"bar\"!==R||\"h\"!==E.orientation||(H=\"y\",V=\"x\"),x.swapAttrs(E,[\"?\",\"?src\"],\"labels\",H),x.swapAttrs(E,[\"d?\",\"?0\"],\"label\",H),x.swapAttrs(E,[\"?\",\"?src\"],\"values\",V),\"pie\"===R?(x.nestedProperty(E,\"marker.color\").set(x.nestedProperty(E,\"marker.colors\").get()),u._pielayer.selectAll(\"g.trace\").remove()):w.traceIs(E,\"cartesian\")&&(x.nestedProperty(E,\"marker.colors\").set(x.nestedProperty(E,\"marker.color\").get()),m[E.xaxis||\"x\"]=!0,m[E.yaxis||\"y\"]=!0)}v[P][s]=R;var U=[\"swapxy\",\"swapxyaxes\",\"orientation\",\"orientationaxes\"];if(U.indexOf(P)!==-1){if(\"orientation\"===P){if(I.set(F),I.get()===v[P][s])continue}else\"orientationaxes\"===P&&(E.orientation={v:\"h\",h:\"v\"}[N.orientation]);O.swapXYData(E)}else if(k.dataArrayContainers.indexOf(I.parts[0])!==-1)O.manageArrayContainers(I,F,v),p.docalc=!0;else{var X=(N._module||{}).attributes||{},G=x.nestedProperty(X,P).get()||x.nestedProperty(k.attributes,P).get()||{};G.valType||(p.docalc=!0),G.arrayOk&&(Array.isArray(F)||Array.isArray(R))&&(p.docalc=!0),\"docalc\"===G.editType&&(p.docalc=!0),I.set(F)}}if([\"swapxyaxes\",\"orientationaxes\"].indexOf(P)!==-1&&y.Axes.swap(t,h),\"orientationaxes\"===P){var Y=x.nestedProperty(t.layout,\"hovermode\");\"x\"===Y.get()?Y.set(\"y\"):\"y\"===Y.get()&&Y.set(\"x\")}h.indexOf(0)!==-1&&T.indexOf(P)!==-1&&(y.Axes.clearTypes(t,h),p.docalc=!0),[\"autobinx\",\"autobiny\",\"zauto\"].indexOf(P)!==-1&&F===!1||(p.dostyle=!0),([\"colorbar\",\"line\"].indexOf(I.parts[0])!==-1||\"marker\"===I.parts[0]&&\"colorbar\"===I.parts[1])&&(p.docolorbars=!0);var Z=P.indexOf(\"[\"),W=Z===-1?P:P.substr(0,Z);if(b.indexOf(W)!==-1){if([\"orientation\",\"type\"].indexOf(P)!==-1){for(c=[],s=0;s<h.length;s++){var $=d[h[s]];w.traceIs($,\"cartesian\")&&(a($.xaxis||\"x\"),a($.yaxis||\"y\"),\"type\"===P&&l([\"autobinx\",\"autobiny\"],!0,s))}l(c.map(o),!0,0),l(c.map(i),[0,1],0)}p.docalc=!0}else A.indexOf(W)!==-1?p.doplot=!0:0===W.indexOf(\"aaxis\")||0===W.indexOf(\"baxis\")?p.doplot=!0:M.indexOf(W)!==-1&&(p.docalcAutorange=!0)}else I=x.nestedProperty(t.layout,P.replace(\"LAYOUT\",\"\")),v[P]=[I.get()],I.set(Array.isArray(j)?j[0]:j),p.docalc=!0}y.Axes.list(t).forEach(function(t){t.autorange&&(p.autorangeOn=!0)});var Q=Object.keys(m);t:for(s=0;s<Q.length;s++){for(var J=Q[s],K=J.charAt(0),tt=K+\"axis\",et=0;et<d.length;et++)if(w.traceIs(d[et],\"cartesian\")&&(d[et][tt]||K)===J)continue t;l(\"LAYOUT\"+y.Axes.id2name(J),null,0)}return(p.docalc||p.docalcAutorange&&p.autorangeOn)&&(p.clearCalc=!0),(p.docalc||p.doplot||p.docalcAutorange)&&(p.fullReplot=!0),{flags:p,undoit:v,redoit:g,traces:h,eventData:x.extendDeepNoArrays([],[g,h])}}function p(t,e){function r(t,n){if(Array.isArray(t))return void t.forEach(function(t){r(t,n)});if(!(t in e||O.hasParent(e,t))){var a=x.nestedProperty(s,t);t in b||(b[t]=a.get()),void 0!==n&&a.set(n)}}function n(e,r){if(!x.isPlainObject(e))return!1;var n=e[r+\"ref\"]||r,a=y.Axes.getFromId(t,n);return a||n.charAt(0)!==r||(a=y.Axes.getFromId(t,r)),(a||{}).autorange}function a(t){var e=N.name2id(t.split(\".\")[0]);_[e]=1}var o,i,l,s=t.layout,c=t._fullLayout,u=Object.keys(e),f=y.Axes.list(t),d={};for(i=0;i<u.length;i++)if(0===u[i].indexOf(\"allaxes\")){for(l=0;l<f.length;l++){var h=f[l]._id.substr(1),p=h.indexOf(\"scene\")!==-1?h+\".\":\"\",g=u[i].replace(\"allaxes\",p+f[l]._name);e[g]||(e[g]=e[u[i]])}delete e[u[i]]}var v={dolegend:!1,doticks:!1,dolayoutstyle:!1,doplot:!1,docalc:!1,domodebar:!1,docamera:!1,layoutReplot:!1},m={},b={},_={};for(var M in e){if(O.hasParent(e,M))throw new Error(\"cannot set \"+M+\"and a parent attribute simultaneously\");var A=x.nestedProperty(s,M),T=e[M],L=A.parts.length,C=\"string\"==typeof A.parts[L-1]?L-1:L-2,S=A.parts[0],D=A.parts[C],E=A.parts[C-1]+\".\"+D,I=A.parts.slice(0,C).join(\".\"),R=x.nestedProperty(t.layout,I).get(),F=x.nestedProperty(c,I).get();if(void 0!==T){if(m[M]=T,b[M]=\"reverse\"===D?T:A.get(),[\"width\",\"height\"].indexOf(M)!==-1&&null===T?c[M]=t._initialAutoSize[M]:E.match(/^[xyz]axis[0-9]*\\.range(\\[[0|1]\\])?$/)?(r(I+\".autorange\",!1),a(E)):E.match(/^[xyz]axis[0-9]*\\.autorange$/)?(r([I+\".range[0]\",I+\".range[1]\"],void 0),a(E)):E.match(/^aspectratio\\.[xyz]$/)?r(S+\".aspectmode\",\"manual\"):E.match(/^aspectmode$/)?r([I+\".x\",I+\".y\",I+\".z\"],void 0):\"tick0\"===D||\"dtick\"===D?r(I+\".tickmode\",\"linear\"):\"tickmode\"===D?r([I+\".tick0\",I+\".dtick\"],void 0):/[xy]axis[0-9]*?$/.test(D)&&!Object.keys(T||{}).length?v.docalc=!0:/[xy]axis[0-9]*\\.categoryorder$/.test(E)?v.docalc=!0:/[xy]axis[0-9]*\\.categoryarray/.test(E)&&(v.docalc=!0),E.indexOf(\"rangeslider\")!==-1&&(v.docalc=!0),\"type\"===D){var j=R,B=\"linear\"===F.type&&\"log\"===T,q=\"log\"===F.type&&\"linear\"===T;if(B||q){if(j&&j.range)if(F.autorange)B&&(j.range=j.range[1]>j.range[0]?[1,2]:[2,1]);else{var H=j.range[0],V=j.range[1];B?(H<=0&&V<=0&&r(I+\".autorange\",!0),H<=0?H=V/1e6:V<=0&&(V=H/1e6),r(I+\".range[0]\",Math.log(H)/Math.LN10),r(I+\".range[1]\",Math.log(V)/Math.LN10)):(r(I+\".range[0]\",Math.pow(10,H)),r(I+\".range[1]\",Math.pow(10,V)))}else r(I+\".autorange\",!0);w.getComponentMethod(\"annotations\",\"convertCoords\")(t,F,T,r),w.getComponentMethod(\"images\",\"convertCoords\")(t,F,T,r)}else r(I+\".autorange\",!0)}else if(D.match(P.AX_NAME_PATTERN)){var U=x.nestedProperty(c,M).get(),X=(T||{}).type;X&&\"-\"!==X||(X=\"linear\"),w.getComponentMethod(\"annotations\",\"convertCoords\")(t,U,X,r),w.getComponentMethod(\"images\",\"convertCoords\")(t,U,X,r)}var G=z.containerArrayMatch(M);if(G){o=G.array,i=G.index;var Y=G.property,Z=x.nestedProperty(s,o),W=(Z||[])[i]||{};if(\"\"===i)M.indexOf(\"updatemenus\")===-1&&(v.docalc=!0);else if(\"\"===Y){var $=T;z.isAddVal(T)?b[M]=null:z.isRemoveVal(T)?(b[M]=W,$=W):x.warn(\"unrecognized full object value\",e),(n($,\"x\")||n($,\"y\")&&M.indexOf(\"updatemenus\")===-1)&&(v.docalc=!0)}else!n(W,\"x\")&&!n(W,\"y\")||x.containsAny(M,[\"color\",\"opacity\",\"align\",\"dash\",\"updatemenus\"])||(v.docalc=!0);d[o]||(d[o]={});var Q=d[o][i];Q||(Q=d[o][i]={}),Q[Y]=T,delete e[M]}else if(\"reverse\"===D)R.range?R.range.reverse():(r(I+\".autorange\",!0),R.range=[1,0]),F.autorange?v.docalc=!0:v.doplot=!0;else{var J=String(A.parts[1]||\"\");0===S.indexOf(\"scene\")?\"camera\"===A.parts[1]?v.docamera=!0:v.doplot=!0:0===S.indexOf(\"geo\")?v.doplot=!0:0===S.indexOf(\"ternary\")?v.doplot=!0:\"paper_bgcolor\"===M?v.doplot=!0:\"margin\"===S||\"autorange\"===J||\"rangemode\"===J||\"type\"===J||\"domain\"===J||\"fixedrange\"===J||\"scaleanchor\"===J||\"scaleratio\"===J||M.indexOf(\"calendar\")!==-1||M.match(/^(bar|box|font)/)?v.docalc=!0:!c._has(\"gl2d\")||M.indexOf(\"axis\")===-1&&\"plot_bgcolor\"!==M?\"hiddenlabels\"===M?v.docalc=!0:S.indexOf(\"legend\")!==-1?v.dolegend=!0:M.indexOf(\"title\")!==-1?v.doticks=!0:S.indexOf(\"bgcolor\")!==-1?v.dolayoutstyle=!0:L>1&&x.containsAny(J,[\"tick\",\"exponent\",\"grid\",\"zeroline\"])?v.doticks=!0:M.indexOf(\".linewidth\")!==-1&&M.indexOf(\"axis\")!==-1?v.doticks=v.dolayoutstyle=!0:L>1&&J.indexOf(\"line\")!==-1?v.dolayoutstyle=!0:L>1&&\"mirror\"===J?v.doticks=v.dolayoutstyle=!0:\"margin.pad\"===M?v.doticks=v.dolayoutstyle=!0:[\"hovermode\",\"dragmode\"].indexOf(M)!==-1||M.indexOf(\"spike\")!==-1?v.domodebar=!0:[\"height\",\"width\",\"autosize\"].indexOf(M)===-1&&(v.doplot=!0):v.doplot=!0,A.set(T)}}}for(o in d){z.applyContainerArrayChanges(t,x.nestedProperty(s,o),d[o],v)||(v.doplot=!0)}var K=c._axisConstraintGroups;for(var tt in _)for(i=0;i<K.length;i++){var et=K[i];if(et[tt]){v.docalc=!0;for(var rt in et)_[rt]||(N.getFromId(t,rt)._constraintShrinkable=!0)}}var nt=c.width,at=c.height;return t.layout.autosize&&k.plotAutoSize(t,t.layout,c),(e.height||e.width||c.width!==nt||c.height!==at)&&(v.docalc=!0),(v.doplot||v.docalc)&&(v.layoutReplot=!0),{flags:v,undoit:b,redoit:m,eventData:x.extendDeep({},m)}}function g(t){var e=v.select(t),r=t._fullLayout;if(r._container=e.selectAll(\".plot-container\").data([0]),r._container.enter().insert(\"div\",\":first-child\").classed(\"plot-container\",!0).classed(\"plotly\",!0),r._paperdiv=r._container.selectAll(\".svg-container\").data([0]),r._paperdiv.enter().append(\"div\").classed(\"svg-container\",!0).style(\"position\",\"relative\"),r._glcontainer=r._paperdiv.selectAll(\".gl-container\").data([0]),r._glcontainer.enter().append(\"div\").classed(\"gl-container\",!0),r._paperdiv.selectAll(\".main-svg\").remove(),r._paper=r._paperdiv.insert(\"svg\",\":first-child\").classed(\"main-svg\",!0),r._toppaper=r._paperdiv.append(\"svg\").classed(\"main-svg\",!0),!r._uid){var n=[];v.selectAll(\"defs\").each(function(){this.id&&n.push(this.id.split(\"-\")[1])}),r._uid=x.randstr(n)}r._paperdiv.selectAll(\".main-svg\").attr(C.svgAttrs),r._defs=r._paper.append(\"defs\").attr(\"id\",\"defs-\"+r._uid),r._topdefs=r._toppaper.append(\"defs\").attr(\"id\",\"topdefs-\"+r._uid),r._bgLayer=r._paper.append(\"g\").classed(\"bglayer\",!0),r._draggers=r._paper.append(\"g\").classed(\"draglayer\",!0);var a=r._paper.append(\"g\").classed(\"layer-below\",!0);r._imageLowerLayer=a.append(\"g\").classed(\"imagelayer\",!0),r._shapeLowerLayer=a.append(\"g\").classed(\"shapelayer\",!0),r._cartesianlayer=r._paper.append(\"g\").classed(\"cartesianlayer\",!0),r._ternarylayer=r._paper.append(\"g\").classed(\"ternarylayer\",!0),r._geolayer=r._paper.append(\"g\").classed(\"geolayer\",!0);var o=r._paper.append(\"g\").classed(\"layer-above\",!0);r._imageUpperLayer=o.append(\"g\").classed(\"imagelayer\",!0),r._shapeUpperLayer=o.append(\"g\").classed(\"shapelayer\",!0),r._pielayer=r._paper.append(\"g\").classed(\"pielayer\",!0),r._glimages=r._paper.append(\"g\").classed(\"glimages\",!0),r._infolayer=r._toppaper.append(\"g\").classed(\"infolayer\",!0),r._zoomlayer=r._toppaper.append(\"g\").classed(\"zoomlayer\",!0),r._hoverlayer=r._toppaper.append(\"g\").classed(\"hoverlayer\",!0),t.emit(\"plotly_framework\")}var v=t(\"d3\"),m=t(\"fast-isnumeric\"),y=t(\"../plotly\"),x=t(\"../lib\"),b=t(\"../lib/events\"),_=t(\"../lib/queue\"),w=t(\"../registry\"),k=t(\"../plots/plots\"),M=t(\"../plots/polar\"),A=t(\"../plots/cartesian/graph_interact\"),T=t(\"../components/drawing\"),L=t(\"../components/errorbars\"),C=t(\"../constants/xmlns_namespaces\"),S=t(\"../lib/svg_text_utils\"),z=t(\"./manage_arrays\"),O=t(\"./helpers\"),D=t(\"./subroutines\"),P=t(\"../plots/cartesian/constants\"),E=t(\"../plots/cartesian/constraints\"),N=t(\"../plots/cartesian/axis_ids\");y.plot=function(t,e,r,n){function i(){if(m)return y.addFrames(t,m)}function l(){for(var e=C._basePlotModules,r=0;r<e.length;r++)e[r].drawFramework&&e[r].drawFramework(t);return x.syncOrAsync([D.layoutStyles,d,A],t)}function s(){var e,r,n,a=t.calcdata;for(w.getComponentMethod(\"legend\",\"draw\")(t),w.getComponentMethod(\"rangeselector\",\"draw\")(t),w.getComponentMethod(\"sliders\",\"draw\")(t),w.getComponentMethod(\"updatemenus\",\"draw\")(t),e=0;e<a.length;e++)r=a[e],n=r[0].trace,n.visible===!0&&n._module.colorbar?n._module.colorbar(t,r):k.autoMargin(t,\"cb\"+n.uid);return k.doAutoMargin(t),k.previousPromises(t)}function c(){var e=JSON.stringify(C._size)===P?[]:[s,D.layoutStyles];return e=e.concat(A),x.syncOrAsync(e,t)}function u(){if(S){for(var e,r,n=k.getSubplotIds(C,\"cartesian\"),a=C._modules,o=0;o<n.length;o++){e=C._plots[n[o]];for(var i=0;i<a.length;i++)r=a[i],r.setPositions&&r.setPositions(t,e)}return L.calc(t),x.syncOrAsync([w.getComponentMethod(\"shapes\",\"calcAutorange\"),w.getComponentMethod(\"annotations\",\"calcAutorange\"),f,w.getComponentMethod(\"rangeslider\",\"calcAutorange\")],t)}}function f(){if(!t._transitioning){for(var e=y.Axes.list(t,\"\",!0),r=0;r<e.length;r++)y.Axes.doAutoRange(e[r]);E(t),M&&y.Axes.saveRangeInitial(t)}}function d(){return y.Axes.doTicks(t,\"redraw\")}function h(){var e,r=t.calcdata,n=C._infolayer.selectAll(\"g.rangeslider-container\");for(e=0;e<r.length;e++){var a=r[e][0].trace,o=a.visible===!0,i=a.uid;if(!o||!w.traceIs(a,\"2dMap\")){var l=\".hm\"+i+\",.contour\"+i+\",#clip\"+i;C._paper.selectAll(l).remove(),n.selectAll(l).remove()}o&&a._module.colorbar||C._infolayer.selectAll(\".cb\"+i).remove()}var s=C._basePlotModules;for(e=0;e<s.length;e++)s[e].plot(t);var c=C._paper.selectAll(\".layer-subplot\");return C._shapeSubplotLayers=c.selectAll(\".shapelayer\"),k.style(t),w.getComponentMethod(\"shapes\",\"draw\")(t),w.getComponentMethod(\"annotations\",\"draw\")(t),k.addLinks(t),C._replotting=!1,k.previousPromises(t)}function p(){w.getComponentMethod(\"shapes\",\"draw\")(t),w.getComponentMethod(\"images\",\"draw\")(t),w.getComponentMethod(\"annotations\",\"draw\")(t),w.getComponentMethod(\"legend\",\"draw\")(t),w.getComponentMethod(\"rangeslider\",\"draw\")(t),w.getComponentMethod(\"rangeselector\",\"draw\")(t),w.getComponentMethod(\"sliders\",\"draw\")(t),w.getComponentMethod(\"updatemenus\",\"draw\")(t)}var m;if(t=O.getGraphDiv(t),b.init(t),x.isPlainObject(e)){var _=e;e=_.data,r=_.layout,n=_.config,m=_.frames}if(b.triggerHandler(t,\"plotly_beforeplot\",[e,r,n])===!1)return Promise.reject();e||r||x.isPlotDiv(t)||x.warn(\"Calling Plotly.plot as if redrawing but this container doesn't yet have a plot.\",t),a(t,n),r||(r={}),v.select(t).classed(\"js-plotly-plot\",!0),T.makeTester(),t._promises=[];var M=0===(t.data||[]).length&&Array.isArray(e);if(Array.isArray(e)&&(O.cleanData(e,t.data),M?t.data=e:t.data.push.apply(t.data,e),t.empty=!1),t.layout&&!M||(t.layout=O.cleanLayout(r)),t._dragging&&!t._transitioning)return t._replotPending=!0,Promise.reject();t._replotPending=!1,k.supplyDefaults(t);var C=t._fullLayout;if(e&&e[0]&&e[0].r)return o(t,e,r);C._replotting=!0,M&&g(t),t.framework!==g&&(t.framework=g,g(t)),T.initGradients(t),M&&y.Axes.saveShowSpikeInitial(t);var S=!t.calcdata||t.calcdata.length!==(t._fullData||[]).length;S&&k.doCalcdata(t);for(var z=0;z<t.calcdata.length;z++)t.calcdata[z][0].trace=t._fullData[z];var P=JSON.stringify(C._size),N=[k.previousPromises,i,l,s,c,u,D.layoutStyles,d,h,p,k.rehover];return x.syncOrAsync(N,t),Promise.all(t._promises).then(function(){return t.emit(\"plotly_afterplot\"),t})},y.redraw=function(t){if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t);return O.cleanData(t.data,t.data),O.cleanLayout(t.layout),t.calcdata=void 0,y.plot(t).then(function(){return t.emit(\"plotly_redraw\"),t})},y.newPlot=function(t,e,r,n){return t=O.getGraphDiv(t),k.cleanPlot([],{},t._fullData||{},t._fullLayout||{}),k.purge(t),y.plot(t,e,r,n)},y.extendTraces=function t(e,r,n,a){e=O.getGraphDiv(e);var o=d(e,r,n,a,function(t,e){return t.concat(e)},function(t,e){return t.splice(0,t.length-e)}),i=y.redraw(e),l=[e,o.update,n,o.maxPoints];return _.add(e,y.prependTraces,l,t,arguments),i},y.prependTraces=function t(e,r,n,a){e=O.getGraphDiv(e);var o=d(e,r,n,a,function(t,e){return e.concat(t)},function(t,e){return t.splice(e,t.length)}),i=y.redraw(e),l=[e,o.update,n,o.maxPoints];return _.add(e,y.extendTraces,l,t,arguments),i},y.addTraces=function t(e,r,n){e=O.getGraphDiv(e);var a,o,i=[],l=y.deleteTraces,u=t,f=[e,i],d=[e,r];for(c(e,r,n),Array.isArray(r)||(r=[r]),r=r.map(function(t){return x.extendFlat({},t)}),O.cleanData(r,e.data),a=0;a<r.length;a++)e.data.push(r[a]);for(a=0;a<r.length;a++)i.push(-r.length+a);if(void 0===n)return o=y.redraw(e),_.add(e,l,f,u,d),o;Array.isArray(n)||(n=[n]);try{s(e,i,n)}catch(t){throw e.data.splice(e.data.length-r.length,r.length),t}return _.startSequence(e),_.add(e,l,f,u,d),o=y.moveTraces(e,i,n),_.stopSequence(e),o},y.deleteTraces=function t(e,r){e=O.getGraphDiv(e);var n,a,o=[],s=y.addTraces,c=t,u=[e,o,r],f=[e,r];if(void 0===r)throw new Error(\"indices must be an integer or array of integers.\");for(Array.isArray(r)||(r=[r]),l(e,r,\"indices\"),r=i(r,e.data.length-1),r.sort(x.sorterDes),n=0;n<r.length;n+=1)a=e.data.splice(r[n],1)[0],o.push(a);var d=y.redraw(e);return _.add(e,s,u,c,f),d},y.moveTraces=function t(e,r,n){e=O.getGraphDiv(e);var a,o=[],l=[],c=t,u=t,f=[e,n,r],d=[e,r,n];if(s(e,r,n),r=Array.isArray(r)?r:[r],void 0===n)for(n=[],a=0;a<r.length;a++)n.push(-r.length+a);for(n=Array.isArray(n)?n:[n],r=i(r,e.data.length-1),n=i(n,e.data.length-1),a=0;a<e.data.length;a++)r.indexOf(a)===-1&&o.push(e.data[a]);for(a=0;a<r.length;a++)l.push({newIndex:n[a],trace:e.data[r[a]]});for(l.sort(function(t,e){return t.newIndex-e.newIndex}),a=0;a<l.length;a+=1)o.splice(l[a].newIndex,0,l[a].trace);e.data=o;var h=y.redraw(e);return _.add(e,c,f,u,d),h},y.restyle=function t(e,r,n,a){e=O.getGraphDiv(e),O.clearPromiseQueue(e);var o={};if(\"string\"==typeof r)o[r]=n;else{if(!x.isPlainObject(r))return x.warn(\"Restyle fail.\",r,n,a),Promise.reject();o=x.extendFlat({},r),void 0===a&&(a=n)}Object.keys(o).length&&(e.changed=!0);var i=h(e,o,a),l=i.flags;l.clearCalc&&(e.calcdata=void 0);var s=[];l.fullReplot?s.push(y.plot):(s.push(k.previousPromises),k.supplyDefaults(e),l.dostyle&&s.push(D.doTraceStyle),l.docolorbars&&s.push(D.doColorBars)),s.push(k.rehover),_.add(e,t,[e,i.undoit,i.traces],t,[e,i.redoit,i.traces]);var c=x.syncOrAsync(s,e);return c&&c.then||(c=Promise.resolve()),c.then(function(){return e.emit(\"plotly_restyle\",i.eventData),e})},y.relayout=function t(e,r,n){if(e=O.getGraphDiv(e),O.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);var a={};if(\"string\"==typeof r)a[r]=n;else{if(!x.isPlainObject(r))return x.warn(\"Relayout fail.\",r,n),Promise.reject();a=x.extendFlat({},r)}Object.keys(a).length&&(e.changed=!0);var o=p(e,a),i=o.flags\n",
|
|
";i.docalc&&(e.calcdata=void 0);var l=[k.previousPromises];i.layoutReplot?l.push(D.layoutReplot):Object.keys(a).length&&(k.supplyDefaults(e),i.dolegend&&l.push(D.doLegend),i.dolayoutstyle&&l.push(D.layoutStyles),i.doticks&&l.push(D.doTicksRelayout),i.domodebar&&l.push(D.doModeBar),i.docamera&&l.push(D.doCamera)),l.push(k.rehover),_.add(e,t,[e,o.undoit],t,[e,o.redoit]);var s=x.syncOrAsync(l,e);return s&&s.then||(s=Promise.resolve(e)),s.then(function(){return e.emit(\"plotly_relayout\",o.eventData),e})},y.update=function t(e,r,n,a){if(e=O.getGraphDiv(e),O.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);x.isPlainObject(r)||(r={}),x.isPlainObject(n)||(n={}),Object.keys(r).length&&(e.changed=!0),Object.keys(n).length&&(e.changed=!0);var o=h(e,x.extendFlat({},r),a),i=o.flags,l=p(e,x.extendFlat({},n)),s=l.flags;(i.clearCalc||s.docalc)&&(e.calcdata=void 0);var c=[];if(i.fullReplot&&s.layoutReplot){var u=e.data,f=e.layout;e.data=void 0,e.layout=void 0,c.push(function(){return y.plot(e,u,f)})}else i.fullReplot?c.push(y.plot):s.layoutReplot?c.push(D.layoutReplot):(c.push(k.previousPromises),k.supplyDefaults(e),i.dostyle&&c.push(D.doTraceStyle),i.docolorbars&&c.push(D.doColorBars),s.dolegend&&c.push(D.doLegend),s.dolayoutstyle&&c.push(D.layoutStyles),s.doticks&&c.push(D.doTicksRelayout),s.domodebar&&c.push(D.doModeBar),s.doCamera&&c.push(D.doCamera));c.push(k.rehover),_.add(e,t,[e,o.undoit,l.undoit,o.traces],t,[e,o.redoit,l.redoit,o.traces]);var d=x.syncOrAsync(c,e);return d&&d.then||(d=Promise.resolve(e)),d.then(function(){return e.emit(\"plotly_update\",{data:o.eventData,layout:l.eventData}),e})},y.animate=function(t,e,r){function n(t){return Array.isArray(l)?t>=l.length?l[0]:l[t]:l}function a(t){return Array.isArray(s)?t>=s.length?s[0]:s[t]:s}function o(t,e){var r=0;return function(){if(t&&++r===e)return t()}}if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t+\". It's likely that you've failed to create a plot before animating it. For more details, see https://plot.ly/javascript/animations/\");var i=t._transitionData;i._frameQueue||(i._frameQueue=[]),r=k.supplyAnimationDefaults(r);var l=r.transition,s=r.frame;return void 0===i._frameWaitingCnt&&(i._frameWaitingCnt=0),new Promise(function(s,c){function u(){t.emit(\"plotly_animated\"),window.cancelAnimationFrame(i._animationRaf),i._animationRaf=null}function f(){i._currentFrame&&i._currentFrame.onComplete&&i._currentFrame.onComplete();var e=i._currentFrame=i._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,i._lastFrameAt=Date.now(),i._timeToNext=e.frameOpts.duration,k.transition(t,e.frame.data,e.frame.layout,O.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then(function(){e.onComplete&&e.onComplete()}),t.emit(\"plotly_animatingframe\",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else u()}function d(){t.emit(\"plotly_animating\"),i._lastFrameAt=-1/0,i._timeToNext=0,i._runningTransitions=0,i._currentFrame=null;var e=function(){i._animationRaf=window.requestAnimationFrame(e),Date.now()-i._lastFrameAt>i._timeToNext&&f()};e()}function h(t){return Array.isArray(l)?v>=l.length?t.transitionOpts=l[v]:t.transitionOpts=l[0]:t.transitionOpts=l,v++,t}var p,g,v=0,m=[],y=void 0===e||null===e,b=Array.isArray(e);if(y||b||!x.isPlainObject(e)){if(y||[\"string\",\"number\"].indexOf(typeof e)!==-1)for(p=0;p<i._frames.length;p++)(g=i._frames[p])&&(y||String(g.group)===String(e))&&m.push({type:\"byname\",name:String(g.name),data:h({name:g.name})});else if(b)for(p=0;p<e.length;p++){var _=e[p];[\"number\",\"string\"].indexOf(typeof _)!==-1?(_=String(_),m.push({type:\"byname\",name:_,data:h({name:_})})):x.isPlainObject(_)&&m.push({type:\"object\",data:h(x.extendFlat({},_))})}}else m.push({type:\"object\",data:h(x.extendFlat({},e))});for(p=0;p<m.length;p++)if(g=m[p],\"byname\"===g.type&&!i._frameHash[g.data.name])return x.warn('animate failure: frame not found: \"'+g.data.name+'\"'),void c();[\"next\",\"immediate\"].indexOf(r.mode)!==-1&&function(){if(0!==i._frameQueue.length){for(;i._frameQueue.length;){var e=i._frameQueue.pop();e.onInterrupt&&e.onInterrupt()}t.emit(\"plotly_animationinterrupted\",[])}}(),\"reverse\"===r.direction&&m.reverse();var w=t._fullLayout._currentFrame;if(w&&r.fromcurrent){var M=-1;for(p=0;p<m.length;p++)if(g=m[p],\"byname\"===g.type&&g.name===w){M=p;break}if(M>0&&M<m.length-1){var A=[];for(p=0;p<m.length;p++)g=m[p],(\"byname\"!==m[p].type||p>M)&&A.push(g);m=A}}m.length>0?function(e){if(0!==e.length){for(var l=0;l<e.length;l++){var u;u=\"byname\"===e[l].type?k.computeFrame(t,e[l].name):e[l].data;var f=a(l),h=n(l);h.duration=Math.min(h.duration,f.duration);var p={frame:u,name:e[l].name,frameOpts:f,transitionOpts:h};l===e.length-1&&(p.onComplete=o(s,2),p.onInterrupt=c),i._frameQueue.push(p)}\"immediate\"===r.mode&&(i._lastFrameAt=-1/0),i._animationRaf||d()}}(m):(t.emit(\"plotly_animated\"),s())})},y.addFrames=function(t,e,r){t=O.getGraphDiv(t);var n=0;if(null===e||void 0===e)return Promise.resolve();if(!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t+\". It's likely that you've failed to create a plot before adding frames. For more details, see https://plot.ly/javascript/animations/\");var a,o,i,l,s=t._transitionData._frames,c=t._transitionData._frameHash;if(!Array.isArray(e))throw new Error(\"addFrames failure: frameList must be an Array of frame definitions\"+e);var u=s.length+2*e.length,f=[];for(a=e.length-1;a>=0;a--)if(x.isPlainObject(e[a])){var d=(c[e[a].name]||{}).name,h=e[a].name;d&&h&&\"number\"==typeof h&&c[d]&&(n++,x.warn('addFrames: overwriting frame \"'+c[d].name+'\" with a frame whose name of type \"number\" also equates to \"'+d+'\". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),n>5&&x.warn(\"addFrames: This API call has yielded too many warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.\")),f.push({frame:k.supplyFrameDefaults(e[a]),index:r&&void 0!==r[a]&&null!==r[a]?r[a]:u+a})}f.sort(function(t,e){return t.index>e.index?-1:t.index<e.index?1:0});var p=[],g=[],v=s.length;for(a=f.length-1;a>=0;a--){if(o=f[a].frame,\"number\"==typeof o.name&&x.warn(\"Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings\"),!o.name)for(;c[o.name=\"frame \"+t._transitionData._counter++];);if(c[o.name]){for(i=0;i<s.length&&(s[i]||{}).name!==o.name;i++);p.push({type:\"replace\",index:i,value:o}),g.unshift({type:\"replace\",index:i,value:s[i]})}else l=Math.max(0,Math.min(f[a].index,v)),p.push({type:\"insert\",index:l,value:o}),g.unshift({type:\"delete\",index:l}),v++}var m=k.modifyFrames,y=k.modifyFrames,b=[t,g],w=[t,p];return _&&_.add(t,m,b,y,w),k.modifyFrames(t,p)},y.deleteFrames=function(t,e){if(t=O.getGraphDiv(t),!x.isPlotDiv(t))throw new Error(\"This element is not a Plotly plot: \"+t);var r,n,a=t._transitionData._frames,o=[],i=[];if(!e)for(e=[],r=0;r<a.length;r++)e.push(r);for(e=e.slice(0),e.sort(),r=e.length-1;r>=0;r--)n=e[r],o.push({type:\"delete\",index:n}),i.unshift({type:\"insert\",index:n,value:a[n]});var l=k.modifyFrames,s=k.modifyFrames,c=[t,i],u=[t,o];return _&&_.add(t,l,c,s,u),k.modifyFrames(t,o)},y.purge=function(t){t=O.getGraphDiv(t);var e=t._fullLayout||{},r=t._fullData||[];return k.cleanPlot([],{},r,e),k.purge(t),b.purge(t),e._container&&e._container.remove(),delete t._context,delete t._replotPending,delete t._mouseDownTime,delete t._legendMouseDownTime,delete t._hmpixcount,delete t._hmlumcount,t}},{\"../components/drawing\":49,\"../components/errorbars\":55,\"../constants/xmlns_namespaces\":124,\"../lib\":136,\"../lib/events\":131,\"../lib/queue\":148,\"../lib/svg_text_utils\":153,\"../plotly\":166,\"../plots/cartesian/axis_ids\":174,\"../plots/cartesian/constants\":176,\"../plots/cartesian/constraints\":178,\"../plots/cartesian/graph_interact\":180,\"../plots/plots\":199,\"../plots/polar\":202,\"../registry\":206,\"./helpers\":156,\"./manage_arrays\":157,\"./subroutines\":163,d3:7,\"fast-isnumeric\":10}],159:[function(t,e,r){\"use strict\";function n(t,r){try{t._fullLayout._paper.style(\"background\",r)}catch(t){e.exports.logging>0&&console.error(t)}}e.exports={staticPlot:!1,editable:!1,autosizable:!1,queueLength:0,fillFrame:!1,frameMargins:0,scrollZoom:!1,doubleClick:\"reset+autosize\",showTips:!0,showAxisDragHandles:!0,showAxisRangeEntryBoxes:!0,showLink:!1,sendData:!0,linkText:\"Edit chart\",showSources:!1,displayModeBar:\"hover\",modeBarButtonsToRemove:[],modeBarButtonsToAdd:[],modeBarButtons:!1,displaylogo:!0,plotGlPixelRatio:2,setBackground:n,topojsonURL:\"https://cdn.plot.ly/\",mapboxAccessToken:null,logging:!1,globalTransforms:[]}},{}],160:[function(t,e,r){\"use strict\";function n(t){var e,r;\"area\"===t?(e={attributes:x},r={}):(e=h.modules[t]._module,r=e.basePlotModule);var n={};n.type=null,w(n,g),w(n,e.attributes),r.attributes&&w(n,r.attributes),Object.keys(h.componentsRegistry).forEach(function(e){var r=h.componentsRegistry[e];r.schema&&r.schema.traces&&r.schema.traces[t]&&Object.keys(r.schema.traces[t]).forEach(function(e){d(n,r.schema.traces[t][e],e)})}),n.type=t;var a={meta:e.meta||{},attributes:l(n)};if(e.layoutAttributes){var o={};w(o,e.layoutAttributes),a.layoutAttributes=l(o)}return a}function a(){var t={};return w(t,v),Object.keys(h.subplotsRegistry).forEach(function(e){var r=h.subplotsRegistry[e];if(r.layoutAttributes)if(\"cartesian\"===r.name)f(t,r,\"xaxis\"),f(t,r,\"yaxis\");else{var n=\"subplot\"===r.attr?r.name:r.attr;f(t,r,n)}}),t=u(t),Object.keys(h.componentsRegistry).forEach(function(e){var r=h.componentsRegistry[e];r.layoutAttributes&&(r.schema&&r.schema.layout?Object.keys(r.schema.layout).forEach(function(e){d(t,r.schema.layout[e],e)}):d(t,r.layoutAttributes,r.name))}),{layoutAttributes:l(t)}}function o(t){var e=h.transformsRegistry[t],r=w({},e.attributes);return Object.keys(h.componentsRegistry).forEach(function(e){var n=h.componentsRegistry[e];n.schema&&n.schema.transforms&&n.schema.transforms[t]&&Object.keys(n.schema.transforms[t]).forEach(function(e){d(r,n.schema.transforms[t][e],e)})}),{attributes:l(r)}}function i(){var t={frames:p.extendDeep({},m)};return l(t),t.frames}function l(t){return s(t),c(t),t}function s(t){function e(t){return{valType:\"string\"}}function n(t,n,a){r.isValObject(t)?\"data_array\"===t.valType?(t.role=\"data\",a[n+\"src\"]=e(n)):t.arrayOk===!0&&(a[n+\"src\"]=e(n)):p.isPlainObject(t)&&(t.role=\"object\")}r.crawl(t,n)}function c(t){function e(t,e,r){if(t){var n=t[M];n&&(delete t[M],r[e]={items:{}},r[e].items[n]=t,r[e].role=\"object\")}}r.crawl(t,e)}function u(t){return _(t,{radialaxis:b.radialaxis,angularaxis:b.angularaxis}),_(t,b.layout),t}function f(t,e,r){var n=p.nestedProperty(t,r),a=w({},e.layoutAttributes);a[k]=!0,n.set(a)}function d(t,e,r){var n=p.nestedProperty(t,r);n.set(w(n.get()||{},e))}var h=t(\"../registry\"),p=t(\"../lib\"),g=t(\"../plots/attributes\"),v=t(\"../plots/layout_attributes\"),m=t(\"../plots/frame_attributes\"),y=t(\"../plots/animation_attributes\"),x=t(\"../plots/polar/area_attributes\"),b=t(\"../plots/polar/axis_attributes\"),_=p.extendFlat,w=p.extendDeep,k=\"_isSubplotObj\",M=\"_isLinkedToArray\",A=[k,M,\"_arrayAttrRegexps\",\"_deprecated\"];r.IS_SUBPLOT_OBJ=k,r.IS_LINKED_TO_ARRAY=M,r.DEPRECATED=\"_deprecated\",r.UNDERSCORE_ATTRS=A,r.get=function(){var t={};h.allTypes.concat(\"area\").forEach(function(e){t[e]=n(e)});var e={};return Object.keys(h.transformsRegistry).forEach(function(t){e[t]=o(t)}),{defs:{valObjects:p.valObjects,metaKeys:A.concat([\"description\",\"role\"])},traces:t,layout:a(),transforms:e,frames:i(),animation:l(y)}},r.crawl=function(t,e,n){var a=n||0;Object.keys(t).forEach(function(n){var o=t[n];A.indexOf(n)===-1&&(e(o,n,t,a),r.isValObject(o)||p.isPlainObject(o)&&r.crawl(o,e,a+1))})},r.isValObject=function(t){return t&&void 0!==t.valType},r.findArrayAttributes=function(t){function e(e,r,i,l){if(o=o.slice(0,l).concat([r]),e&&(\"data_array\"===e.valType||e.arrayOk===!0)){var s=n(o),c=p.nestedProperty(t,s).get();Array.isArray(c)&&a.push(s)}}function n(t){return t.join(\".\")}var a=[],o=[];if(r.crawl(t._module.attributes,e),t.transforms)for(var i=t.transforms,l=0;l<i.length;l++){var s=i[l];o=[\"transforms[\"+l+\"]\"],r.crawl(s._module.attributes,e,1)}return t._fullInput&&(r.crawl(t._fullInput._module.attributes,e),a=p.filterUnique(a)),a}},{\"../lib\":136,\"../plots/animation_attributes\":167,\"../plots/attributes\":169,\"../plots/frame_attributes\":196,\"../plots/layout_attributes\":197,\"../plots/polar/area_attributes\":200,\"../plots/polar/axis_attributes\":201,\"../registry\":206}],161:[function(t,e,r){\"use strict\";function n(t){i.register(t,t.name,t.categories,t.meta),i.subplotsRegistry[t.basePlotModule.name]||i.registerSubplot(t.basePlotModule)}function a(t){if(\"string\"!=typeof t.name)throw new Error(\"Transform module *name* must be a string.\");var e=\"Transform module \"+t.name,r=\"function\"==typeof t.transform,n=\"function\"==typeof t.calcTransform;if(!r&&!n)throw new Error(e+\" is missing a *transform* or *calcTransform* method.\");r&&n&&l.log([e+\" has both a *transform* and *calcTransform* methods.\",\"Please note that all *transform* methods are executed\",\"before all *calcTransform* methods.\"].join(\" \")),l.isPlainObject(t.attributes)||l.log(e+\" registered without an *attributes* object.\"),\"function\"!=typeof t.supplyDefaults&&l.log(e+\" registered without a *supplyDefaults* method.\"),i.transformsRegistry[t.name]=t}function o(t){if(\"string\"!=typeof t.name)throw new Error(\"Component module *name* must be a string.\");i.registerComponent(t)}var i=t(\"../registry\"),l=t(\"../lib\");e.exports=function(t){if(!t)throw new Error(\"No argument passed to Plotly.register.\");t&&!Array.isArray(t)&&(t=[t]);for(var e=0;e<t.length;e++){var r=t[e];if(!r)throw new Error(\"Invalid module was attempted to be registered!\");switch(r.moduleType){case\"trace\":n(r);break;case\"transform\":a(r);break;case\"component\":o(r);break;default:throw new Error(\"Invalid module was attempted to be registered!\")}}}},{\"../lib\":136,\"../registry\":206}],162:[function(t,e,r){\"use strict\";var n=t(\"../plotly\"),a=t(\"../lib\");e.exports=function(t){return a.extendFlat(n.defaultConfig,t)}},{\"../lib\":136,\"../plotly\":166}],163:[function(t,e,r){\"use strict\";function n(t,e,r){for(var n=0;n<r.length;n++){var a=r[n][0],o=r[n][1];if(!(a[0]>=t[1]||a[1]<=t[0])&&(o[0]<e[1]&&o[1]>e[0]))return!0}return!1}var a=t(\"d3\"),o=t(\"../plotly\"),i=t(\"../registry\"),l=t(\"../plots/plots\"),s=t(\"../lib\"),c=t(\"../components/color\"),u=t(\"../components/drawing\"),f=t(\"../components/titles\"),d=t(\"../components/modebar\"),h=t(\"../plots/cartesian/graph_interact\");r.layoutStyles=function(t){return s.syncOrAsync([l.doAutoMargin,r.lsInner],t)},r.lsInner=function(t){var e,i=t._fullLayout,l=i._size,s=o.Axes.list(t);for(e=0;e<s.length;e++)s[e]._linepositions={};i._paperdiv.style({width:i.width+\"px\",height:i.height+\"px\"}).selectAll(\".main-svg\").call(u.setSize,i.width,i.height),t._context.setBackground(t,i.paper_bgcolor);var f=i._paper.selectAll(\"g.subplot\"),h=[],p=[];f.each(function(e){var r=i._plots[e];if(r.mainplot)return r.bg&&r.bg.remove(),void(r.bg=void 0);var a=o.Axes.getFromId(t,e,\"x\"),l=o.Axes.getFromId(t,e,\"y\"),s=a.domain,c=l.domain,u=[];n(s,c,p)?u=[0]:(h.push(e),p.push([s,c]));var f=r.plotgroup.selectAll(\".bg\").data(u);f.enter().append(\"rect\").classed(\"bg\",!0),f.exit().remove(),f.each(function(){r.bg=f;var t=r.plotgroup.node();t.insertBefore(this,t.childNodes[0])})});var g=i._bgLayer.selectAll(\".bg\").data(h);g.enter().append(\"rect\").classed(\"bg\",!0),g.exit().remove(),g.each(function(t){i._plots[t].bg=a.select(this)});var v=[];return f.each(function(e){var r=i._plots[e],n=o.Axes.getFromId(t,e,\"x\"),a=o.Axes.getFromId(t,e,\"y\");n.setScale(),a.setScale(),r.bg&&r.bg.call(u.setRect,n._offset-l.p,a._offset-l.p,n._length+2*l.p,a._length+2*l.p).call(c.fill,i.plot_bgcolor).style(\"stroke-width\",0),r.clipId=\"clip\"+i._uid+e+\"plot\";var s=i._defs.selectAll(\"g.clips\").selectAll(\"#\"+r.clipId).data([0]);s.enter().append(\"clipPath\").attr({class:\"plotclip\",id:r.clipId}).append(\"rect\"),s.selectAll(\"rect\").attr({width:n._length,height:a._length}),r.plot.call(u.setTranslate,n._offset,a._offset),r.plot.call(u.setClipUrl,r.clipId);var f=u.crispRound(t,n.linewidth,1),d=u.crispRound(t,a.linewidth,1),h=l.p+d,p=\"M\"+-h+\",\",g=\"h\"+(n._length+2*h),m=\"free\"===n.anchor&&v.indexOf(n._id)===-1,y=l.h*(1-(n.position||0))+f/2%1,x=n.anchor===a._id&&(n.mirror||\"top\"!==n.side)||\"all\"===n.mirror||\"allticks\"===n.mirror||n.mirrors&&n.mirrors[a._id+\"bottom\"],b=a._length+l.p+f/2,_=n.anchor===a._id&&(n.mirror||\"top\"===n.side)||\"all\"===n.mirror||\"allticks\"===n.mirror||n.mirrors&&n.mirrors[a._id+\"top\"],w=-l.p-f/2,k=l.p,M=x?0:f,A=_?0:f,T=\",\"+(-k-A)+\"v\"+(a._length+2*k+A+M),L=\"free\"===a.anchor&&v.indexOf(a._id)===-1,C=l.w*(a.position||0)+d/2%1,S=a.anchor===n._id&&(a.mirror||\"right\"!==a.side)||\"all\"===a.mirror||\"allticks\"===a.mirror||a.mirrors&&a.mirrors[n._id+\"left\"],z=-l.p-d/2,O=a.anchor===n._id&&(a.mirror||\"right\"===a.side)||\"all\"===a.mirror||\"allticks\"===a.mirror||a.mirrors&&a.mirrors[n._id+\"right\"],D=n._length+l.p+d/2;n._linepositions[e]=[x?b:void 0,_?w:void 0,m?y:void 0],n.anchor===a._id?n._linepositions[e][3]=\"top\"===n.side?w:b:m&&(n._linepositions[e][3]=y),a._linepositions[e]=[S?z:void 0,O?D:void 0,L?C:void 0],a.anchor===n._id?a._linepositions[e][3]=\"right\"===a.side?D:z:L&&(a._linepositions[e][3]=C);var P=\"translate(\"+n._offset+\",\"+a._offset+\")\",E=P,N=P;m&&(E=\"translate(\"+n._offset+\",\"+l.t+\")\",w+=a._offset-l.t,b+=a._offset-l.t),L&&(N=\"translate(\"+l.l+\",\"+a._offset+\")\",z+=n._offset-l.l,D+=n._offset-l.l),r.xlines.attr(\"transform\",E).attr(\"d\",(x?p+b+g:\"\")+(_?p+w+g:\"\")+(m?p+y+g:\"\")||\"M0,0\").style(\"stroke-width\",f+\"px\").call(c.stroke,n.showline?n.linecolor:\"rgba(0,0,0,0)\"),r.ylines.attr(\"transform\",N).attr(\"d\",(S?\"M\"+z+T:\"\")+(O?\"M\"+D+T:\"\")+(L?\"M\"+C+T:\"\")||\"M0,0\").attr(\"stroke-width\",d+\"px\").call(c.stroke,a.showline?a.linecolor:\"rgba(0,0,0,0)\"),r.xaxislayer.attr(\"transform\",E),r.yaxislayer.attr(\"transform\",N),r.gridlayer.attr(\"transform\",P),r.zerolinelayer.attr(\"transform\",P),r.draglayer.attr(\"transform\",P),m&&v.push(n._id),L&&v.push(a._id)}),o.Axes.makeClipPaths(t),r.drawMainTitle(t),d.manage(t),t._promises.length&&Promise.all(t._promises)},r.drawMainTitle=function(t){var e=t._fullLayout;f.draw(t,\"gtitle\",{propContainer:e,propName:\"title\",dfltName:\"Plot\",attributes:{x:e.width/2,y:e._size.t/2,\"text-anchor\":\"middle\"}})},r.doTraceStyle=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e],n=((r[0]||{}).trace||{})._module||{},a=n.arraysToCalcdata;a&&a(r,r[0].trace)}return l.style(t),i.getComponentMethod(\"legend\",\"draw\")(t),l.previousPromises(t)},r.doColorBars=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e][0];if((r.t||{}).cb){var n=r.trace,a=r.t.cb;i.traceIs(n,\"contour\")&&a.line({width:n.contours.showlines!==!1?n.line.width:0,dash:n.line.dash,color:\"line\"===n.contours.coloring?a._opts.line.color:n.line.color}),i.traceIs(n,\"markerColorscale\")?a.options(n.marker.colorbar)():a.options(n.colorbar)()}}return l.previousPromises(t)},r.layoutReplot=function(t){var e=t.layout;return t.layout=void 0,o.plot(t,\"\",e)},r.doLegend=function(t){return i.getComponentMethod(\"legend\",\"draw\")(t),l.previousPromises(t)},r.doTicksRelayout=function(t){return o.Axes.doTicks(t,\"redraw\"),r.drawMainTitle(t),l.previousPromises(t)},r.doModeBar=function(t){var e,r,n=t._fullLayout;for(d.manage(t),h(t),e=l.getSubplotIds(n,\"gl3d\"),r=0;r<e.length;r++){n[e[r]]._scene.updateFx(n.dragmode,n.hovermode)}return l.previousPromises(t)},r.doCamera=function(t){for(var e=t._fullLayout,r=l.getSubplotIds(e,\"gl3d\"),n=0;n<r.length;n++){var a=e[r[n]];a._scene.setCamera(a.camera)}}},{\"../components/color\":25,\"../components/drawing\":49,\"../components/modebar\":85,\"../components/titles\":114,\"../lib\":136,\"../plotly\":166,\"../plots/cartesian/graph_interact\":180,\"../plots/plots\":199,\"../registry\":206,d3:7}],164:[function(t,e,r){\"use strict\";function n(t,e){return new Promise(function(r,n){function f(){var t=l.getDelay(p._fullLayout);return new Promise(function(r,n){setTimeout(function(){var t=c(p),a=document.createElement(\"canvas\");a.id=i.randstr(),u({format:e.format,width:p._fullLayout.width,height:p._fullLayout.height,canvas:a,svg:t,promise:!0}).then(function(t){p&&document.body.removeChild(p),r(t)}).catch(function(t){n(t)})},t)})}e=e||{},e.format=e.format||\"png\";var d=function(t){return void 0===t||null===t||!!(a(t)&&t>1)};d(e.width)&&d(e.height)||n(new Error(\"Height and width should be pixel values.\"));var h=s(t,{format:\"png\",height:e.height,width:e.width}),p=h.gd;p.style.position=\"absolute\",p.style.left=\"-5000px\",document.body.appendChild(p);var g=l.getRedrawFunc(p);o.plot(p,h.data,h.layout,h.config).then(g).then(f).then(function(t){r(t)}).catch(function(t){n(t)})})}var a=t(\"fast-isnumeric\"),o=t(\"../plotly\"),i=t(\"../lib\"),l=t(\"../snapshot/helpers\"),s=t(\"../snapshot/cloneplot\"),c=t(\"../snapshot/tosvg\"),u=t(\"../snapshot/svgtoimg\");e.exports=n},{\"../lib\":136,\"../plotly\":166,\"../snapshot/cloneplot\":207,\"../snapshot/helpers\":210,\"../snapshot/svgtoimg\":212,\"../snapshot/tosvg\":214,\"fast-isnumeric\":10}],165:[function(t,e,r){\"use strict\";function n(t,e,r,a,o,c){c=c||[];for(var u=Object.keys(t),d=0;d<u.length;d++){var h=u[d];if(\"transforms\"!==h){var v=c.slice();v.push(h);var m=t[h],y=e[h],x=s(r,h),b=\"info_array\"===(x||{}).valType,_=\"colorscale\"===(x||{}).valType;if(l(r,h))if(p(m)&&p(y))n(m,y,x,a,o,v);else if(x.items&&!b&&g(m)){var w,k,M=x.items,A=M[Object.keys(M)[0]],T=[];for(w=0;w<y.length;w++){var L=y[w]._index||w;k=v.slice(),k.push(L),p(m[L])&&p(y[w])&&(T.push(L),n(m[L],y[w],A,a,o,k))}for(w=0;w<m.length;w++)k=v.slice(),k.push(w),p(m[w])?T.indexOf(w)===-1&&a.push(i(\"unused\",o,k)):a.push(i(\"object\",o,k,m[w]))}else!p(m)&&p(y)?a.push(i(\"object\",o,v,m)):g(m)||!g(y)||b||_?h in e?f.validate(m,x)||a.push(i(\"value\",o,v,m)):a.push(i(\"unused\",o,v,m)):a.push(i(\"array\",o,v,m));else a.push(i(\"schema\",o,v))}}return a}function a(t,e){for(var r=0;r<e.length;r++){var n=e[r].type,a=t.traces[n].layoutAttributes;a&&f.extendFlat(t.layout.layoutAttributes,a)}return t.layout.layoutAttributes}function o(t){return g(t)?\"In data trace \"+t[1]+\", \":\"In \"+t+\", \"}function i(t,e,r,n){r=r||\"\";var a,o;g(e)?(a=e[0],o=e[1]):(a=e,o=null);var i=u(r),l=v[t](e,i,n);return f.log(l),{code:t,container:a,trace:o,path:r,astr:i,msg:l}}function l(t,e){var r=c(e),n=r.keyMinusId,a=r.id;return!!(n in t&&t[n]._isSubplotObj&&a)||e in t}function s(t,e){return t[c(e).keyMinusId]}function c(t){var e=t.split(/([2-9]|[1-9][0-9]+)$/)[0];return{keyMinusId:e,id:t.substr(e.length,t.length)}}function u(t){if(!g(t))return String(t);for(var e=\"\",r=0;r<t.length;r++){var n=t[r];\"number\"==typeof n?e=e.substr(0,e.length-1)+\"[\"+n+\"]\":e+=n,r<t.length-1&&(e+=\".\")}return e}var f=t(\"../lib\"),d=t(\"../plots/plots\"),h=t(\"./plot_schema\"),p=f.isPlainObject,g=Array.isArray;e.exports=function(t,e){var r,o,l=h.get(),s=[],c={};g(t)?(c.data=f.extendDeep([],t),r=t):(c.data=[],r=[],s.push(i(\"array\",\"data\"))),p(e)?(c.layout=f.extendDeep({},e),o=e):(c.layout={},o={},arguments.length>1&&s.push(i(\"object\",\"layout\"))),d.supplyDefaults(c);for(var u=c._fullData,v=r.length,m=0;m<v;m++){var y=r[m],x=[\"data\",m];if(p(y)){var b=u[m],_=b.type,w=l.traces[_].attributes;w.type={valType:\"enumerated\",values:[_]},b.visible===!1&&y.visible!==!1&&s.push(i(\"invisible\",x)),n(y,b,w,s,x);var k=y.transforms,M=b.transforms;if(k){g(k)||s.push(i(\"array\",x,[\"transforms\"])),x.push(\"transforms\");for(var A=0;A<k.length;A++){var T=[\"transforms\",A],L=k[A].type;if(p(k[A])){var C=l.transforms[L]?l.transforms[L].attributes:{};C.type={valType:\"enumerated\",values:Object.keys(l.transforms)},n(k[A],M[A],C,s,x,T)}else s.push(i(\"object\",x,T))}}}else s.push(i(\"object\",x))}return n(o,c._fullLayout,a(l,u),s,\"layout\"),0===s.length?void 0:s};var v={object:function(t,e){return(\"layout\"===t&&\"\"===e?\"The layout argument\":\"data\"===t[0]&&\"\"===e?\"Trace \"+t[1]+\" in the data argument\":o(t)+\"key \"+e)+\" must be linked to an object container\"},array:function(t,e){return(\"data\"===t?\"The data argument\":o(t)+\"key \"+e)+\" must be linked to an array container\"},schema:function(t,e){return o(t)+\"key \"+e+\" is not part of the schema\"},unused:function(t,e,r){var n=p(r)?\"container\":\"key\";return o(t)+n+\" \"+e+\" did not get coerced\"},invisible:function(t){return\"Trace \"+t[1]+\" got defaulted to be not visible\"},value:function(t,e,r){return[o(t)+\"key \"+e,\"is set to an invalid value (\"+r+\")\"].join(\" \")}}},{\"../lib\":136,\"../plots/plots\":199,\"./plot_schema\":160}],166:[function(t,e,r){\"use strict\";r.defaultConfig=t(\"./plot_api/plot_config\"),r.Plots=t(\"./plots/plots\"),r.Axes=t(\"./plots/cartesian/axes\"),r.ModeBar=t(\"./components/modebar\"),t(\"./plot_api/plot_api\")},{\"./components/modebar\":85,\"./plot_api/plot_api\":158,\"./plot_api/plot_config\":159,\"./plots/cartesian/axes\":171,\"./plots/plots\":199}],167:[function(t,e,r){\"use strict\";e.exports={mode:{valType:\"enumerated\",dflt:\"afterall\",values:[\"immediate\",\"next\",\"afterall\"]},direction:{valType:\"enumerated\",values:[\"forward\",\"reverse\"],dflt:\"forward\"},fromcurrent:{valType:\"boolean\",dflt:!1},frame:{duration:{valType:\"number\",min:0,dflt:500},redraw:{valType:\"boolean\",dflt:!0}},transition:{duration:{valType:\"number\",min:0,dflt:500},easing:{valType:\"enumerated\",dflt:\"cubic-in-out\",values:[\"linear\",\"quad\",\"cubic\",\"sin\",\"exp\",\"circle\",\"elastic\",\"back\",\"bounce\",\"linear-in\",\"quad-in\",\"cubic-in\",\"sin-in\",\"exp-in\",\"circle-in\",\"elastic-in\",\"back-in\",\"bounce-in\",\"linear-out\",\"quad-out\",\"cubic-out\",\"sin-out\",\"exp-out\",\"circle-out\",\"elastic-out\",\"back-out\",\"bounce-out\",\"linear-in-out\",\"quad-in-out\",\"cubic-in-out\",\"sin-in-out\",\"exp-in-out\",\"circle-in-out\",\"elastic-in-out\",\"back-in-out\",\"bounce-in-out\"]}}}},{}],168:[function(t,e,r){\"use strict\";var n=t(\"../lib\");e.exports=function(t,e,r){var a,o=r.name,i=e[o],l=n.isArray(t[o])?t[o]:[],s=e[o]=[];for(a=0;a<l.length;a++){var c=l[a],u={},f={};n.isPlainObject(c)||(f.itemIsNotPlainObject=!0,c={}),r.handleItemDefaults(c,u,e,r,f),u._input=c,u._index=a,s.push(u)}if(n.isArray(i)){var d=Math.min(i.length,s.length);for(a=0;a<d;a++)n.relinkPrivateKeys(s[a],i[a])}}},{\"../lib\":136}],169:[function(t,e,r){\"use strict\";var n=t(\"../components/fx/attributes\");e.exports={type:{valType:\"enumerated\",values:[],dflt:\"scatter\"},visible:{valType:\"enumerated\",values:[!0,!1,\"legendonly\"],dflt:!0},showlegend:{valType:\"boolean\",dflt:!0},legendgroup:{valType:\"string\",dflt:\"\"},opacity:{valType:\"number\",min:0,max:1,dflt:1},name:{valType:\"string\"},uid:{valType:\"string\",dflt:\"\"},hoverinfo:{valType:\"flaglist\",flags:[\"x\",\"y\",\"z\",\"text\",\"name\"],extras:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:n.hoverlabel,stream:{token:{valType:\"string\",noBlank:!0,strict:!0},maxpoints:{valType:\"number\",min:0,max:1e4,dflt:500}}}},{\"../components/fx/attributes\":58}],170:[function(t,e,r){\"use strict\";e.exports={xaxis:{valType:\"subplotid\",dflt:\"x\"},yaxis:{valType:\"subplotid\",dflt:\"y\"}}},{}],171:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){function o(e){return(1+100*(e-t)/r.dtick)%100<2}for(var i=0,l=0,s=0,c=0,u=0;u<e.length;u++)e[u]%1==0?s++:x(e[u])||c++,o(e[u])&&i++,o(e[u]+r.dtick/2)&&l++;var f=e.length-c;if(s===f&&\"date\"!==r.type)r.dtick<1?t=n-.5*r.dtick:(t-=.5)+r.dtick<n&&(t+=r.dtick);else if(l<.1*f&&(i>.3*f||o(n)||o(a))){var d=r.dtick/2;t+=t+d<n?d:-d}return t}function a(t,e,r,n,a){var o=_.findExactDates(e,a);if(o.exactDays>.8){var i=Number(r.substr(1));o.exactYears>.8&&i%12==0?t=N.tickIncrement(t,\"M6\",\"reverse\")+1.5*z:o.exactMonths>.8?t=N.tickIncrement(t,\"M1\",\"reverse\")+15.5*z:t-=z/2;var l=N.tickIncrement(t,r);if(l<=n)return l}return t}function o(t){var e,r,n=t.tickvals,a=t.ticktext,o=new Array(n.length),i=_.simpleMap(t.range,t.r2l),l=1.0001*i[0]-1e-4*i[1],c=1.0001*i[1]-1e-4*i[0],u=Math.min(l,c),f=Math.max(l,c),d=0;Array.isArray(a)||(a=[]);var h=\"category\"===t.type?t.d2l_noadd:t.d2l;for(\"log\"===t.type&&\"L\"!==String(t.dtick).charAt(0)&&(t.dtick=\"L\"+Math.pow(10,Math.floor(Math.min(t.range[0],t.range[1]))-1)),r=0;r<n.length;r++)(e=h(n[r]))>u&&e<f&&(void 0===a[r]?o[d]=N.tickText(t,e):o[d]=s(t,e,String(a[r])),d++);return d<n.length&&o.splice(d,n.length-d),o}function i(t,e,r){return e*_.roundUp(t/e,r)}function l(t){var e=t.dtick;if(t._tickexponent=0,x(e)||\"string\"==typeof e||(e=1),\"category\"===t.type&&(t._tickround=null),\"date\"===t.type){var r=t.r2l(t.tick0),n=t.l2r(r).replace(/(^-|i)/g,\"\"),a=n.length;if(\"M\"===String(e).charAt(0))a>10||\"01-01\"!==n.substr(5)?t._tickround=\"d\":t._tickround=+e.substr(1)%12==0?\"y\":\"m\";else if(e>=z&&a<=10||e>=15*z)t._tickround=\"d\";else if(e>=D&&a<=16||e>=O)t._tickround=\"M\";else if(e>=P&&a<=19||e>=D)t._tickround=\"S\";else{var o=t.l2r(r+e).replace(/^-/,\"\").length;t._tickround=Math.max(a,o)-20}}else if(x(e)||\"L\"===e.charAt(0)){var i=t.range.map(t.r2d||Number);x(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(i[0]),Math.abs(i[1])),s=Math.floor(Math.log(l)/Math.LN10+.01);Math.abs(s)>3&&(\"SI\"===t.exponentformat||\"B\"===t.exponentformat?t._tickexponent=3*Math.round((s-1)/3):t._tickexponent=s)}else t._tickround=null}function s(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||\"\",fontSize:n.size,font:n.family,fontColor:n.color}}function c(t,e,r,n){var a=t._tickround,o=r&&t.hoverformat||t.tickformat;n&&(a=x(a)?4:{y:\"m\",m:\"d\",d:\"M\",M:\"S\",S:4}[a]);var i,l=_.formatDate(e.x,o,a,t.calendar),s=l.indexOf(\"\\n\");s!==-1&&(i=l.substr(s+1),l=l.substr(0,s)),n&&(\"00:00:00\"===l||\"00:00\"===l?(l=i,i=\"\"):8===l.length&&(l=l.replace(/:00$/,\"\"))),i&&(r?\"d\"===a?l+=\", \"+i:l=i+(l?\", \"+l:\"\"):t._inCalcTicks&&i===t._prevDateHead||(l+=\"<br>\"+i,t._prevDateHead=i)),e.text=l}function u(t,e,r,n,a){var o=t.dtick,i=e.x;if(!n||\"string\"==typeof o&&\"L\"===o.charAt(0)||(o=\"L3\"),t.tickformat||\"string\"==typeof o&&\"L\"===o.charAt(0))e.text=h(Math.pow(10,i),t,a,n);else if(x(o)||\"D\"===o.charAt(0)&&_.mod(i+.01,1)<.1)if([\"e\",\"E\",\"power\"].indexOf(t.exponentformat)!==-1){var l=Math.round(i);e.text=0===l?1:1===l?\"10\":l>1?\"10<sup>\"+l+\"</sup>\":\"10<sup>\\u2212\"+-l+\"</sup>\",e.fontSize*=1.25}else e.text=h(Math.pow(10,i),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6);else{if(\"D\"!==o.charAt(0))throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,_.mod(i,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var s=String(e.text).charAt(0);\"0\"!==s&&\"1\"!==s||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(i<0?.5:.25)))}}function f(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}function d(t,e,r,n,a){\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(a=\"hide\"),e.text=h(e.x,t,a,n)}function h(t,e,r,n){var a=t<0,o=e._tickround,i=r||e.exponentformat||\"B\",s=e._tickexponent,c=e.tickformat,u=e.separatethousands;if(n){var f={exponentformat:e.exponentformat,dtick:\"none\"===e.showexponent?e.dtick:x(t)?Math.abs(t)||1:1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};l(f),o=(Number(f._tickround)||0)+4,s=f._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return y.format(c)(t).replace(/-/g,\"\\u2212\");var d=Math.pow(10,-o)/2;if(\"none\"===i&&(s=0),(t=Math.abs(t))<d)t=\"0\",a=!1;else{if(t+=d,s&&(t*=Math.pow(10,-s),o+=s),0===o)t=String(Math.floor(t));else if(o<0){t=String(Math.round(t)),t=t.substr(0,t.length+o);for(var h=o;h<0;h++)t+=\"0\"}else{t=String(t);var p=t.indexOf(\".\")+1;p&&(t=t.substr(0,p+o).replace(/\\.?0+$/,\"\"))}t=_.numSeparate(t,e._separators,u)}if(s&&\"hide\"!==i){var g;g=s<0?\"\\u2212\"+-s:\"power\"!==i?\"+\"+s:String(s),\"e\"===i||(\"SI\"===i||\"B\"===i)&&(s>12||s<-15)?t+=\"e\"+g:\"E\"===i?t+=\"E\"+g:\"power\"===i?t+=\"\\xd710<sup>\"+g+\"</sup>\":\"B\"===i&&9===s?t+=\"B\":\"SI\"!==i&&\"B\"!==i||(t+=U[s/3+5])}return a?\"\\u2212\"+t:t}function p(t,e){var r,n,a=[];for(r=0;r<e.length;r++){var o=[],i=t._fullData[e[r]].xaxis,l=t._fullData[e[r]].yaxis;if(i&&l){for(n=0;n<a.length;n++)a[n].x.indexOf(i)===-1&&a[n].y.indexOf(l)===-1||o.push(n);if(o.length){var s,c=a[o[0]];if(o.length>1)for(n=1;n<o.length;n++)s=a[o[n]],g(c.x,s.x),g(c.y,s.y);g(c.x,[i]),g(c.y,[l])}else a.push({x:[i],y:[l]})}}return a}function g(t,e){for(var r=0;r<e.length;r++)t.indexOf(e[r])===-1&&t.push(e[r])}function v(t,e,r){\n",
|
|
"var n,a,o=[],i=[],l=t.layout;for(n=0;n<e.length;n++)o.push(N.getFromId(t,e[n]));for(n=0;n<r.length;n++)i.push(N.getFromId(t,r[n]));var s=Object.keys(o[0]),c=[\"anchor\",\"domain\",\"overlaying\",\"position\",\"side\",\"tickangle\"],u=[\"linear\",\"log\"];for(n=0;n<s.length;n++){var f=s[n],d=o[0][f],h=i[0][f],p=!0,g=!1,v=!1;if(\"_\"!==f.charAt(0)&&\"function\"!=typeof d&&c.indexOf(f)===-1){for(a=1;a<o.length&&p;a++){var y=o[a][f];\"type\"===f&&u.indexOf(d)!==-1&&u.indexOf(y)!==-1&&d!==y?g=!0:y!==d&&(p=!1)}for(a=1;a<i.length&&p;a++){var x=i[a][f];\"type\"===f&&u.indexOf(h)!==-1&&u.indexOf(x)!==-1&&h!==x?v=!0:i[a][f]!==h&&(p=!1)}p&&(g&&(l[o[0]._name].type=\"linear\"),v&&(l[i[0]._name].type=\"linear\"),m(l,f,o,i))}}for(n=0;n<t._fullLayout.annotations.length;n++){var b=t._fullLayout.annotations[n];e.indexOf(b.xref)!==-1&&r.indexOf(b.yref)!==-1&&_.swapAttrs(l.annotations[n],[\"?\"])}}function m(t,e,r,n){var a,o=_.nestedProperty,i=o(t[r[0]._name],e).get(),l=o(t[n[0]._name],e).get();for(\"title\"===e&&(\"Click to enter X axis title\"===i&&(i=\"Click to enter Y axis title\"),\"Click to enter Y axis title\"===l&&(l=\"Click to enter X axis title\")),a=0;a<r.length;a++)o(t,r[a]._name+\".\"+e).set(l);for(a=0;a<n.length;a++)o(t,n[a]._name+\".\"+e).set(i)}var y=t(\"d3\"),x=t(\"fast-isnumeric\"),b=t(\"../../registry\"),_=t(\"../../lib\"),w=t(\"../../lib/svg_text_utils\"),k=t(\"../../components/titles\"),M=t(\"../../components/color\"),A=t(\"../../components/drawing\"),T=t(\"../../constants/numerical\"),L=T.FP_SAFE,C=T.ONEAVGYEAR,S=T.ONEAVGMONTH,z=T.ONEDAY,O=T.ONEHOUR,D=T.ONEMIN,P=T.ONESEC,E=T.BADNUM,N=e.exports={};N.layoutAttributes=t(\"./layout_attributes\"),N.supplyLayoutDefaults=t(\"./layout_defaults\"),N.setConvert=t(\"./set_convert\");var I=t(\"./axis_autotype\"),R=t(\"./axis_ids\");N.id2name=R.id2name,N.cleanId=R.cleanId,N.list=R.list,N.listIds=R.listIds,N.getFromId=R.getFromId,N.getFromTrace=R.getFromTrace,N.coerceRef=function(t,e,r,n,a,o){var i=n.charAt(n.length-1),l=N.listIds(r,i),s=n+\"ref\",c={};return a||(a=l[0]||o),o||(o=a),c[s]={valType:\"enumerated\",values:l.concat(o?[o]:[]),dflt:a},_.coerce(t,e,c,s)},N.coercePosition=function(t,e,r,n,a,o){var i,l;if(\"paper\"===n||\"pixel\"===n)i=r(a,o);else{var s=N.getFromId(e,n);if(o=s.fraction2r(o),i=r(a,o),\"category\"===s.type){if(\"string\"==typeof i&&(s._categories||[]).length)return l=s._categories.indexOf(i),void(t[a]=l===-1?o:l)}else if(\"date\"===s.type)return void(t[a]=_.cleanDate(i,E,s.calendar))}t[a]=x(i)?Number(i):o},N.getDataToCoordFunc=function(t,e,r,n){var a,o=\"x\"===r||\"y\"===r||\"z\"===r?r:n;if(Array.isArray(o)){if(a={type:I(n),_categories:[]},N.setConvert(a),\"category\"===a.type)for(var i=0;i<n.length;i++)a.d2c(n[i])}else a=N.getFromTrace(t,e,o);return a?a.d2c:\"ids\"===o?function(t){return String(t)}:function(t){return+t}},N.clearTypes=function(t,e){Array.isArray(e)&&e.length||(e=t._fullData.map(function(t,e){return e})),e.forEach(function(e){var r=t.data[e];delete(N.getFromId(t,r.xaxis)||{}).type,delete(N.getFromId(t,r.yaxis)||{}).type})},N.counterLetter=function(t){var e=t.charAt(0);return\"x\"===e?\"y\":\"y\"===e?\"x\":void 0},N.minDtick=function(t,e,r,n){[\"log\",\"category\"].indexOf(t.type)===-1&&n?void 0===t._minDtick?(t._minDtick=e,t._forceTick0=r):t._minDtick&&((t._minDtick/e+1e-6)%1<2e-6&&((r-t._forceTick0)/e%1+1.000001)%1<2e-6?(t._minDtick=e,t._forceTick0=r):((e/t._minDtick+1e-6)%1>2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},N.getAutoRange=function(t){var e,r=[],n=t._min[0].val,a=t._max[0].val;for(e=1;e<t._min.length&&n===a;e++)n=Math.min(n,t._min[e].val);for(e=1;e<t._max.length&&n===a;e++)a=Math.max(a,t._max[e].val);var o,i,l,s,c,u,f,d=0,h=!1;if(t.range){var p=_.simpleMap(t.range,t.r2l);h=p[1]<p[0]}for(\"reversed\"===t.autorange&&(h=!0,t.autorange=!0),e=0;e<t._min.length;e++)for(i=t._min[e],o=0;o<t._max.length;o++)l=t._max[o],f=l.val-i.val,u=t._length-i.pad-l.pad,f>0&&u>0&&f/u>d&&(s=i,c=l,d=f/u);if(n===a){var g=n-1,v=n+1;r=\"tozero\"===t.rangemode?n<0?[g,0]:[0,v]:\"nonnegative\"===t.rangemode?[Math.max(0,g),Math.max(0,v)]:[g,v]}else d&&(\"linear\"!==t.type&&\"-\"!==t.type||(\"tozero\"===t.rangemode?(s.val>=0&&(s={val:0,pad:0}),c.val<=0&&(c={val:0,pad:0})):\"nonnegative\"===t.rangemode&&(s.val-d*s.pad<0&&(s={val:0,pad:0}),c.val<0&&(c={val:1,pad:0})),d=(c.val-s.val)/(t._length-s.pad-c.pad)),r=[s.val-d*s.pad,c.val+d*c.pad]);return r[0]===r[1]&&(\"tozero\"===t.rangemode?r=r[0]<0?[r[0],0]:r[0]>0?[0,r[0]]:[0,1]:(r=[r[0]-1,r[0]+1],\"nonnegative\"===t.rangemode&&(r[0]=Math.max(0,r[0])))),h&&r.reverse(),_.simpleMap(r,t.l2r||Number)},N.doAutoRange=function(t){t._length||t.setScale();var e=t._min&&t._max&&t._min.length&&t._max.length;if(t.autorange&&e){t.range=N.getAutoRange(t);var r=t._input;r.range=t.range.slice(),r.autorange=t.autorange}},N.saveRangeInitial=function(t,e){for(var r=N.list(t,\"\",!0),n=!1,a=0;a<r.length;a++){var o=r[a],i=void 0===o._rangeInitial,l=i||!(o.range[0]===o._rangeInitial[0]&&o.range[1]===o._rangeInitial[1]);(i&&o.autorange===!1||e&&l)&&(o._rangeInitial=o.range.slice(),n=!0)}return n},N.saveShowSpikeInitial=function(t,e){for(var r=N.list(t,\"\",!0),n=!1,a=\"on\",o=0;o<r.length;o++){var i=r[o],l=void 0===i._showSpikeInitial,s=l||!(i.showspikes===i._showspikes);(l||e&&s)&&(i._showSpikeInitial=i.showspikes,n=!0),\"on\"!==a||i.showspikes||(a=\"off\")}return t._fullLayout._cartesianSpikesEnabled=a,n},N.expand=function(t,e,r){function n(t){if(Array.isArray(t))return function(e){return Math.max(Number(t[e]||0),0)};var e=Math.max(Number(t||0),0);return function(){return e}}function a(r){function n(t){return x(t)&&Math.abs(t)<L}if(s=e[r],x(s)){if(f=b(r)+m,d=w(r)+m,p=s-M(r),g=s+k(r),\"log\"===t.type&&p<g/10&&(p=g/10),c=t.c2l(p),u=t.c2l(g),y&&(c=Math.min(0,c),u=Math.max(0,u)),n(c)){for(h=!0,i=0;i<t._min.length&&h;i++)l=t._min[i],l.val<=c&&l.pad>=d?h=!1:l.val>=c&&l.pad<=d&&(t._min.splice(i,1),i--);h&&t._min.push({val:c,pad:y&&0===c?0:d})}if(n(u)){for(h=!0,i=0;i<t._max.length&&h;i++)l=t._max[i],l.val>=u&&l.pad>=f?h=!1:l.val<=u&&l.pad<=f&&(t._max.splice(i,1),i--);h&&t._max.push({val:u,pad:y&&0===u?0:f})}}}if((t.autorange||!!_.nestedProperty(t,\"rangeslider.autorange\").get())&&e){t._min||(t._min=[]),t._max||(t._max=[]),r||(r={}),t._m||t.setScale();var o,i,l,s,c,u,f,d,h,p,g,v=e.length,m=r.padded?.05*t._length:0,y=r.tozero&&(\"linear\"===t.type||\"-\"===t.type),b=n((t._m>0?r.ppadplus:r.ppadminus)||r.ppad||0),w=n((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),k=n(r.vpadplus||r.vpad),M=n(r.vpadminus||r.vpad);for(o=0;o<6;o++)a(o);for(o=v-1;o>5;o--)a(o)}},N.autoBin=function(t,e,r,o,i){var l=_.aggNums(Math.min,null,t),s=_.aggNums(Math.max,null,t);if(i||(i=e.calendar),\"category\"===e.type)return{start:l-.5,end:s+.5,size:1};var c;if(r)c=(s-l)/r;else{var u=_.distinctVals(t),f=Math.pow(10,Math.floor(Math.log(u.minDiff)/Math.LN10)),d=f*_.roundUp(u.minDiff/f,[.9,1.9,4.9,9.9],!0);c=Math.max(d,2*_.stdev(t)/Math.pow(t.length,o?.25:.4)),x(c)||(c=1)}var h;h=\"log\"===e.type?{type:\"linear\",range:[l,s]}:{type:e.type,range:_.simpleMap([l,s],e.c2r,0,i),calendar:i},N.setConvert(h),N.autoTicks(h,c);var p,g=N.tickIncrement(N.tickFirst(h),h.dtick,\"reverse\",i);if(\"number\"==typeof h.dtick){g=n(g,t,h,l,s);p=g+(1+Math.floor((s-g)/h.dtick))*h.dtick}else for(\"M\"===h.dtick.charAt(0)&&(g=a(g,t,h.dtick,l,i)),p=g;p<=s;)p=N.tickIncrement(p,h.dtick,!1,i);return{start:e.c2r(g,0,i),end:e.c2r(p,0,i),size:h.dtick}},N.calcTicks=function(t){var e=_.simpleMap(t.range,t.r2l);if(\"auto\"===t.tickmode||!t.dtick){var r,n=t.nticks;n||(\"category\"===t.type?(r=t.tickfont?1.2*(t.tickfont.size||12):15,n=t._length/r):(r=\"y\"===t._id.charAt(0)?40:80,n=_.constrain(t._length/r,4,9)+1)),\"array\"===t.tickmode&&(n*=100),N.autoTicks(t,Math.abs(e[1]-e[0])/n),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}if(t.tick0||(t.tick0=\"date\"===t.type?\"2000-01-01\":0),l(t),\"array\"===t.tickmode)return o(t);t._tmin=N.tickFirst(t);var a=e[1]<e[0],i=[],s=1.0001*e[1]-1e-4*e[0];\"category\"===t.type&&(s=a?Math.max(-.5,s):Math.min(t._categories.length-.5,s));for(var c=t._tmin;(a?c>=s:c<=s)&&(i.push(c),!(i.length>1e3));c=N.tickIncrement(c,t.dtick,a,t.calendar));t._tmax=i[i.length-1],t._prevDateHead=\"\",t._inCalcTicks=!0;for(var u=new Array(i.length),f=0;f<i.length;f++)u[f]=N.tickText(t,i[f]);return t._inCalcTicks=!1,u};var F=[2,5,10],j=[1,2,3,6,12],B=[1,2,5,10,15,30],q=[1,2,3,7,14],H=[-.046,0,.301,.477,.602,.699,.778,.845,.903,.954,1],V=[-.301,0,.301,.699,1];N.autoTicks=function(t,e){var r;if(\"date\"===t.type){t.tick0=_.dateTick0(t.calendar);var n=2*e;n>C?(e/=C,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=\"M\"+12*i(e,r,F)):n>S?(e/=S,t.dtick=\"M\"+i(e,1,j)):n>z?(t.dtick=i(e,z,q),t.tick0=_.dateTick0(t.calendar,!0)):n>O?t.dtick=i(e,O,j):n>D?t.dtick=i(e,D,B):n>P?t.dtick=i(e,P,B):(r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=i(e,r,F))}else if(\"log\"===t.type){t.tick0=0;var a=_.simpleMap(t.range,t.r2l);if(e>.7)t.dtick=Math.ceil(e);else if(Math.abs(a[1]-a[0])<1){var o=1.5*Math.abs((a[1]-a[0])/e);e=Math.abs(Math.pow(10,a[1])-Math.pow(10,a[0]))/o,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=\"L\"+i(e,r,F)}else t.dtick=e>.3?\"D2\":\"D1\"}else\"category\"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):(t.tick0=0,r=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),t.dtick=i(e,r,F));if(0===t.dtick&&(t.dtick=1),!x(t.dtick)&&\"string\"!=typeof t.dtick){var l=t.dtick;throw t.dtick=1,\"ax.dtick error: \"+String(l)}},N.tickIncrement=function(t,e,r,n){var a=r?-1:1;if(x(e))return t+a*e;var o=e.charAt(0),i=a*Number(e.substr(1));if(\"M\"===o)return _.incrementMonth(t,i,n);if(\"L\"===o)return Math.log(Math.pow(10,t)+i)/Math.LN10;if(\"D\"===o){var l=\"D2\"===e?V:H,s=t+.01*a,c=_.roundUp(_.mod(s,1),l,r);return Math.floor(s)+Math.log(y.round(Math.pow(10,c),1))/Math.LN10}throw\"unrecognized dtick \"+String(e)},N.tickFirst=function(t){var e=t.r2l||Number,r=_.simpleMap(t.range,e),n=r[1]<r[0],a=n?Math.floor:Math.ceil,o=1.0001*r[0]-1e-4*r[1],i=t.dtick,l=e(t.tick0);if(x(i)){var s=a((o-l)/i)*i+l;return\"category\"===t.type&&(s=_.constrain(s,0,t._categories.length-1)),s}var c=i.charAt(0),u=Number(i.substr(1));if(\"M\"===c){for(var f,d,h,p=0,g=l;p<10;){if(((f=N.tickIncrement(g,i,n,t.calendar))-o)*(g-o)<=0)return n?Math.min(g,f):Math.max(g,f);d=(o-(g+f)/2)/(f-g),h=c+(Math.abs(Math.round(d))||1)*u,g=N.tickIncrement(g,h,d<0?!n:n,t.calendar),p++}return _.error(\"tickFirst did not converge\",t),g}if(\"L\"===c)return Math.log(a((Math.pow(10,o)-l)/u)*u+l)/Math.LN10;if(\"D\"===c){var v=\"D2\"===i?V:H,m=_.roundUp(_.mod(o,1),v,n);return Math.floor(o)+Math.log(y.round(Math.pow(10,m),1))/Math.LN10}throw\"unrecognized dtick \"+String(i)},N.tickText=function(t,e,r){function n(n){var a;return void 0===n||(r?\"none\"===n:(a={first:t._tmin,last:t._tmax}[n],\"all\"!==n&&e!==a))}var a,o,i=s(t,e),l=\"array\"===t.tickmode,h=r||l,p=\"category\"===t.type?t.d2l_noadd:t.d2l;if(l&&Array.isArray(t.ticktext)){var g=_.simpleMap(t.range,t.r2l),v=Math.abs(g[1]-g[0])/1e4;for(o=0;o<t.ticktext.length&&!(Math.abs(e-p(t.tickvals[o]))<v);o++);if(o<t.ticktext.length)return i.text=String(t.ticktext[o]),i}return a=\"none\"!==t.exponentformat&&n(t.showexponent)?\"hide\":\"\",\"date\"===t.type?c(t,i,r,h):\"log\"===t.type?u(t,i,r,h,a):\"category\"===t.type?f(t,i):d(t,i,r,h,a),t.tickprefix&&!n(t.showtickprefix)&&(i.text=t.tickprefix+i.text),t.ticksuffix&&!n(t.showticksuffix)&&(i.text+=t.ticksuffix),i};var U=[\"f\",\"p\",\"n\",\"\\u03bc\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];N.subplotMatch=/^x([0-9]*)y([0-9]*)$/,N.getSubplots=function(t,e){var r,n,a,o=[],i=t._fullData||t.data||[];for(r=0;r<i.length;r++){var l=i[r];if(l.visible!==!1&&\"legendonly\"!==l.visible&&(b.traceIs(l,\"cartesian\")||b.traceIs(l,\"gl2d\"))){a=(l.xaxis||\"x\")+(l.yaxis||\"y\"),o.indexOf(a)===-1&&o.push(a)}}var s=N.list(t,\"\",!0);for(r=0;r<s.length;r++){var c=s[r],u=c._id.charAt(0),f=\"free\"===c.anchor?\"x\"===u?\"y\":\"x\":c.anchor,d=N.getFromId(t,f),h=!1;for(n=0;n<o.length;n++)if(function(t,e){return t.indexOf(e._id)!==-1}(o[n],c)){h=!0;break}\"free\"===c.anchor&&h||d&&(a=\"x\"===u?c._id+d._id:d._id+c._id,o.indexOf(a)===-1&&o.push(a))}var p=N.subplotMatch,g=[];for(r=0;r<o.length;r++)a=o[r],p.test(a)&&g.push(a);return g.sort(function(t,e){var r=t.match(p),n=e.match(p);return r[1]===n[1]?+(r[2]||1)-(n[2]||1):+(r[1]||0)-(n[1]||0)}),e?N.findSubplotsWithAxis(g,e):g},N.findSubplotsWithAxis=function(t,e){for(var r=new RegExp(\"x\"===e._id.charAt(0)?\"^\"+e._id+\"y\":e._id+\"$\"),n=[],a=0;a<t.length;a++){var o=t[a];r.test(o)&&n.push(o)}return n},N.makeClipPaths=function(t){var e,r,n=t._fullLayout,a=n._defs,o={_offset:0,_length:n.width,_id:\"\"},i={_offset:0,_length:n.height,_id:\"\"},l=N.list(t,\"x\",!0),s=N.list(t,\"y\",!0),c=[];for(e=0;e<l.length;e++)for(c.push({x:l[e],y:i}),r=0;r<s.length;r++)0===e&&c.push({x:o,y:s[r]}),c.push({x:l[e],y:s[r]});var u=a.selectAll(\"g.clips\").data([0]);u.enter().append(\"g\").classed(\"clips\",!0);var f=u.selectAll(\".axesclip\").data(c,function(t){return t.x._id+t.y._id});f.enter().append(\"clipPath\").classed(\"axesclip\",!0).attr(\"id\",function(t){return\"clip\"+n._uid+t.x._id+t.y._id}).append(\"rect\"),f.exit().remove(),f.each(function(t){y.select(this).select(\"rect\").attr({x:t.x._offset||0,y:t.y._offset||0,width:t.x._length||1,height:t.y._length||1})})},N.doTicks=function(t,e,r){function n(t){var e=c.l2p(t.x);return e>1&&e<c._length-1}function a(t,e){var r=t.selectAll(\"path.\"+S).data(\"inside\"===c.ticks?V:L,C);e&&c.ticks?(r.enter().append(\"path\").classed(S,1).classed(\"ticks\",1).classed(\"crisp\",1).call(M.stroke,c.tickcolor).style(\"stroke-width\",j+\"px\").attr(\"d\",e),r.attr(\"transform\",h),r.exit().remove()):r.remove()}function o(r,n){function a(t,e){t.each(function(t){var r=b(e),n=y.select(this),a=n.select(\".text-math-group\"),o=h(t)+(x(e)&&0!=+e?\" rotate(\"+e+\",\"+d(t)+\",\"+(p(t)-t.fontSize/2)+\")\":\"\");if(a.empty()){var i=n.select(\"text\").attr({transform:o,\"text-anchor\":r});i.empty()||i.selectAll(\"tspan.line\").attr({x:i.attr(\"x\"),y:i.attr(\"y\")})}else{var l=A.bBox(a.node()).width*{end:-.5,start:.5}[r];a.attr(\"transform\",o+(l?\"translate(\"+l+\",0)\":\"\"))}})}function o(){return O.length&&Promise.all(O)}function l(){if(a(f,c.tickangle),\"x\"===m&&!x(c.tickangle)&&(\"log\"!==c.type||\"D\"!==String(c.dtick).charAt(0))){var t=[];for(f.each(function(e){var r=y.select(this),n=r.select(\".text-math-group\"),a=c.l2p(e.x);n.empty()&&(n=r.select(\"text\"));var o=A.bBox(n.node());t.push({top:0,bottom:10,height:10,left:a-o.width/2,right:a+o.width/2+2,width:o.width+2})}),v=0;v<t.length-1;v++)if(_.bBoxIntersect(t[v],t[v+1])){z=30;break}if(z){Math.abs((L[L.length-1].x-L[0].x)*c._m)/(L.length-1)<2.5*T&&(z=90),a(f,z)}c._lastangle=z}return i(),e+\" done\"}function s(){function e(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.max(t[1],e[1])}var n=r.node().getBoundingClientRect(),a=t.getBoundingClientRect();if(c._boundingBox={width:n.width,height:n.height,left:n.left-a.left,right:n.right-a.left,top:n.top-a.top,bottom:n.bottom-a.top},g){var o=c._counterSpan=[1/0,-1/0];for(v=0;v<g.length;v++){var i=u._plots[g[v]],l=i[\"x\"===m?\"yaxis\":\"xaxis\"];e(o,[l._offset,l._offset+l._length])}\"free\"===c.anchor&&e(o,\"x\"===m?[c._boundingBox.bottom,c._boundingBox.top]:[c._boundingBox.right,c._boundingBox.left])}}var f=r.selectAll(\"g.\"+S).data(L,C);if(!c.showticklabels||!x(n))return f.remove(),void i();var d,p,b,k,M;\"x\"===m?(M=\"bottom\"===q?1:-1,d=function(t){return t.dx+E*M},k=n+(P+D)*M,p=function(t){return t.dy+k+t.fontSize*(\"bottom\"===q?1:-.5)},b=function(t){return x(t)&&0!==t&&180!==t?t*M<0?\"end\":\"start\":\"middle\"}):(M=\"right\"===q?1:-1,p=function(t){return t.dy+t.fontSize/2-E*M},d=function(t){return t.dx+n+(P+D+(90===Math.abs(c.tickangle)?t.fontSize/2:0))*M},b=function(t){return x(t)&&90===Math.abs(t)?\"middle\":\"right\"===q?\"start\":\"end\"});var T=0,z=0,O=[];f.enter().append(\"g\").classed(S,1).append(\"text\").attr(\"text-anchor\",\"middle\").each(function(e){var r=y.select(this),n=t._promises.length;r.call(A.setPosition,d(e),p(e)).call(A.font,e.font,e.fontSize,e.fontColor).text(e.text).call(w.convertToTspans),n=t._promises[n],n?O.push(t._promises.pop().then(function(){a(r,c.tickangle)})):a(r,c.tickangle)}),f.exit().remove(),f.each(function(t){T=Math.max(T,t.fontSize)}),a(f,c._lastangle||c.tickangle);var N=_.syncOrAsync([o,l,s]);return N&&N.then&&t._promises.push(N),N}function i(){if(!r){var n,a,o,i,l=R.getFromId(t,e),s=y.select(t).selectAll(\"g.\"+e+\"tick\"),c={selection:s,side:l.side},f=e.charAt(0),d=t._fullLayout._size,h=l.titlefont.size;if(s.size()){var p=A.getTranslate(s.node().parentNode);c.offsetLeft=p.x,c.offsetTop=p.y}\"x\"===f?(a=\"free\"===l.anchor?{_offset:d.t+(1-(l.position||0))*d.h,_length:0}:R.getFromId(t,l.anchor),o=l._offset+l._length/2,i=a._offset+(\"top\"===l.side?-10-h*(1.5+(l.showticklabels?1:0)):a._length+10+h*(1.5+(l.showticklabels?1.5:.5))),l.rangeslider&&l.rangeslider.visible&&l._boundingBox&&(i+=(u.height-u.margin.b-u.margin.t)*l.rangeslider.thickness+l._boundingBox.height),c.side||(c.side=\"bottom\")):(a=\"free\"===l.anchor?{_offset:d.l+(l.position||0)*d.w,_length:0}:R.getFromId(t,l.anchor),i=l._offset+l._length/2,o=a._offset+(\"right\"===l.side?a._length+10+h*(1.5+(l.showticklabels?1:.5)):-10-h*(1.5+(l.showticklabels?.5:0))),n={rotate:\"-90\",offset:0},c.side||(c.side=\"left\")),k.draw(t,e+\"title\",{propContainer:l,propName:l._name+\".title\",dfltName:f.toUpperCase()+\" axis\",avoid:c,transform:n,attributes:{x:o,y:i,\"text-anchor\":\"middle\"}})}}function l(t,e){return t.visible===!0&&t.xaxis+t.yaxis===e&&(!(!b.traceIs(t,\"bar\")||t.orientation!=={x:\"h\",y:\"v\"}[m])||t.fill&&t.fill.charAt(t.fill.length-1)===m)}function s(e,r,a){var o=e.gridlayer,i=e.zerolinelayer,s=e[\"hidegrid\"+m]?[]:V,u=c._gridpath||\"M0,0\"+(\"x\"===m?\"v\":\"h\")+r._length,f=o.selectAll(\"path.\"+z).data(c.showgrid===!1?[]:s,C);if(f.enter().append(\"path\").classed(z,1).classed(\"crisp\",1).attr(\"d\",u).each(function(t){c.zeroline&&(\"linear\"===c.type||\"-\"===c.type)&&Math.abs(t.x)<c.dtick/100&&y.select(this).remove()}),f.attr(\"transform\",h).call(M.stroke,c.gridcolor||\"#ddd\").style(\"stroke-width\",I+\"px\"),f.exit().remove(),i){for(var d=!1,p=0;p<t._fullData.length;p++)if(l(t._fullData[p],a)){d=!0;break}var g=_.simpleMap(c.range,c.r2l),v=g[0]*g[1]<=0&&c.zeroline&&(\"linear\"===c.type||\"-\"===c.type)&&s.length&&(d||n({x:0})||!c.showline),x=i.selectAll(\"path.\"+O).data(v?[{x:0}]:[]);x.enter().append(\"path\").classed(O,1).classed(\"zl\",1).classed(\"crisp\",1).attr(\"d\",u),x.attr(\"transform\",h).call(M.stroke,c.zerolinecolor||M.defaultLine).style(\"stroke-width\",F+\"px\"),x.exit().remove()}}var c,u=t._fullLayout,f=!1;if(\"object\"==typeof e)c=e,e=c._id,f=!0;else if(c=N.getFromId(t,e),\"redraw\"===e&&u._paper.selectAll(\"g.subplot\").each(function(t){var e=u._plots[t],r=e.xaxis,n=e.yaxis;e.xaxislayer.selectAll(\".\"+r._id+\"tick\").remove(),e.yaxislayer.selectAll(\".\"+n._id+\"tick\").remove(),e.gridlayer.selectAll(\"path\").remove(),e.zerolinelayer.selectAll(\"path\").remove()}),!e||\"redraw\"===e)return _.syncOrAsync(N.list(t,\"\",!0).map(function(r){return function(){if(r._id){var n=N.doTicks(t,r._id);return\"redraw\"===e&&(r._r=r.range.slice(),r._rl=_.simpleMap(r._r,r.r2l)),n}}}));c.tickformat||([\"none\",\"e\",\"E\",\"power\",\"SI\",\"B\"].indexOf(c.exponentformat)===-1&&(c.exponentformat=\"e\"),[\"all\",\"first\",\"last\",\"none\"].indexOf(c.showexponent)===-1&&(c.showexponent=\"all\")),c.setScale();var d,h,p,g,v,m=e.charAt(0),T=N.counterLetter(e),L=N.calcTicks(c),C=function(t){return[t.text,t.x,c.mirror].join(\"_\")},S=e+\"tick\",z=e+\"grid\",O=e+\"zl\",D=(c.linewidth||1)/2,P=(\"outside\"===c.ticks?c.ticklen:1)+(c.linewidth||0),E=0,I=A.crispRound(t,c.gridwidth,1),F=A.crispRound(t,c.zerolinewidth,I),j=A.crispRound(t,c.tickwidth,1);if(c._counterangle&&\"outside\"===c.ticks){var B=c._counterangle*Math.PI/180;P=c.ticklen*Math.cos(B)+(c.linewidth||0),E=c.ticklen*Math.sin(B)}if(\"x\"===m)d=[\"bottom\",\"top\"],h=function(t){return\"translate(\"+c.l2p(t.x)+\",0)\"},p=function(t,e){if(c._counterangle){var r=c._counterangle*Math.PI/180;return\"M0,\"+t+\"l\"+Math.sin(r)*e+\",\"+Math.cos(r)*e}return\"M0,\"+t+\"v\"+e};else{if(\"y\"!==m)return void _.warn(\"Unrecognized doTicks axis:\",e);d=[\"left\",\"right\"],h=function(t){return\"translate(0,\"+c.l2p(t.x)+\")\"},p=function(t,e){if(c._counterangle){var r=c._counterangle*Math.PI/180;return\"M\"+t+\",0l\"+Math.cos(r)*e+\",\"+-Math.sin(r)*e}return\"M\"+t+\",0h\"+e}}var q=c.side||d[0],H=[-1,1,q===d[1]?1:-1];if(\"inside\"!==c.ticks==(\"x\"===m)&&(H=H.map(function(t){return-t})),c.visible){var V=L.filter(n);if(f){if(a(c._axislayer,p(c._pos+D*H[2],H[2]*c.ticklen)),c._counteraxis){s({gridlayer:c._gridlayer,zerolinelayer:c._zerolinelayer},c._counteraxis)}return o(c._axislayer,c._pos)}g=N.getSubplots(t,c);var U=g.map(function(t){var e=u._plots[t];if(u._has(\"cartesian\")){var r=e[m+\"axislayer\"],n=c._linepositions[t]||[],i=e[T+\"axis\"],l=i._id===c.anchor,f=[!1,!1,!1],h=\"\";if(\"allticks\"===c.mirror?f=[!0,!0,!1]:l&&(\"ticks\"===c.mirror?f=[!0,!0,!1]:f[d.indexOf(q)]=!0),c.mirrors)for(v=0;v<2;v++){var g=c.mirrors[i._id+d[v]];\"ticks\"!==g&&\"labels\"!==g||(f[v]=!0)}return void 0!==n[2]&&(f[2]=!0),f.forEach(function(t,e){var r=n[e],a=H[e];t&&x(r)&&(h+=p(r+D*a,a*c.ticklen))}),a(r,h),s(e,i,t),o(r,n[3])}}).filter(function(t){return t&&t.then});return U.length?Promise.all(U):0}},N.swap=function(t,e){for(var r=p(t,e),n=0;n<r.length;n++)v(t,r[n].x,r[n].y)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/titles\":114,\"../../constants/numerical\":122,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"../../registry\":206,\"./axis_autotype\":172,\"./axis_ids\":174,\"./layout_attributes\":182,\"./layout_defaults\":183,\"./set_convert\":188,d3:7,\"fast-isnumeric\":10}],172:[function(t,e,r){\"use strict\";function n(t){if(!t)return!1;for(var e=0;e<t.length;e++)if(i(t[e]))return!0;return!1}function a(t,e){for(var r,n=0,a=0,o=Math.max(1,(t.length-1)/1e3),s=0;s<t.length;s+=o)r=t[Math.round(s)],l.isDateTime(r,e)&&(n+=1),i(r)&&(a+=1);return n>2*a}function o(t){for(var e,r=Math.max(1,(t.length-1)/1e3),n=0,a=0,o=0;o<t.length;o+=r)e=t[Math.round(o)],l.cleanNumber(e)!==s?n++:\"string\"==typeof e&&\"\"!==e&&\"None\"!==e&&a++;return a>2*n}var i=t(\"fast-isnumeric\"),l=t(\"../../lib\"),s=t(\"../../constants/numerical\").BADNUM;e.exports=function(t,e){return a(t,e)?\"date\":o(t)?\"category\":n(t)?\"linear\":\"-\"}},{\"../../constants/numerical\":122,\"../../lib\":136,\"fast-isnumeric\":10}],173:[function(t,e,r){\"use strict\";var n=t(\"tinycolor2\").mix,a=t(\"../../registry\"),o=t(\"../../lib\"),i=t(\"../../components/color/attributes\").lightFraction,l=t(\"./layout_attributes\"),s=t(\"./tick_value_defaults\"),c=t(\"./tick_mark_defaults\"),u=t(\"./tick_label_defaults\"),f=t(\"./category_order_defaults\"),d=t(\"./set_convert\"),h=t(\"./ordered_categories\");e.exports=function(t,e,r,p,g){function v(r,n){return o.coerce2(t,e,l,r,n)}var m=p.letter,y=p.font||{},x=\"Click to enter \"+(p.title||m.toUpperCase()+\" axis\")+\" title\",b=r(\"visible\",!p.cheateronly),_=e.type;if(\"date\"===_){a.getComponentMethod(\"calendars\",\"handleDefaults\")(t,e,\"calendar\",p.calendar)}if(d(e,g),r(\"autorange\",!e.isValidRange(t.range))&&r(\"rangemode\"),r(\"range\"),e.cleanRange(),f(t,e,r),e._initialCategories=\"category\"===_?h(m,e.categoryorder,e.categoryarray,p.data):[],!b)return e;var w=r(\"color\"),k=w===t.color?w:y.color;r(\"title\",x),o.coerceFont(r,\"titlefont\",{family:y.family,size:Math.round(1.2*y.size),color:k}),s(t,e,r,_),u(t,e,r,_,p),c(t,e,r,p);var M=v(\"linecolor\",w),A=v(\"linewidth\"),T=r(\"showline\",!!M||!!A);T||(delete e.linecolor,delete e.linewidth),(T||e.ticks)&&r(\"mirror\");var L=v(\"gridcolor\",n(w,p.bgColor,i).toRgbString()),C=v(\"gridwidth\");r(\"showgrid\",p.showGrid||!!L||!!C)||(delete e.gridcolor,delete e.gridwidth);var S=v(\"zerolinecolor\",w),z=v(\"zerolinewidth\");return r(\"zeroline\",p.showGrid||!!S||!!z)||(delete e.zerolinecolor,delete e.zerolinewidth),e}},{\"../../components/color/attributes\":24,\"../../lib\":136,\"../../registry\":206,\"./category_order_defaults\":175,\"./layout_attributes\":182,\"./ordered_categories\":184,\"./set_convert\":188,\"./tick_label_defaults\":189,\"./tick_mark_defaults\":190,\"./tick_value_defaults\":191,tinycolor2:13}],174:[function(t,e,r){\"use strict\";function n(t,e,r){function n(t,r){for(var n=Object.keys(t),a=/^[xyz]axis[0-9]*/,o=[],i=0;i<n.length;i++){var l=n[i];e&&l.charAt(0)!==e||a.test(l)&&o.push(r+l)}return o.sort()}var a=t._fullLayout;if(!a)return[];var i=n(a,\"\");if(r)return i;for(var l=o.getSubplotIds(a,\"gl3d\")||[],s=0;s<l.length;s++){var c=l[s];i=i.concat(n(a[c],c+\".\"))}return i}var a=t(\"../../registry\"),o=t(\"../plots\"),i=t(\"../../lib\"),l=t(\"./constants\");r.id2name=function(t){if(\"string\"==typeof t&&t.match(l.AX_ID_PATTERN)){var e=t.substr(1);return\"1\"===e&&(e=\"\"),t.charAt(0)+\"axis\"+e}},r.name2id=function(t){if(t.match(l.AX_NAME_PATTERN)){var e=t.substr(5);return\"1\"===e&&(e=\"\"),t.charAt(0)+e}},r.cleanId=function(t,e){if(t.match(l.AX_ID_PATTERN)&&(!e||t.charAt(0)===e)){var r=t.substr(1).replace(/^0+/,\"\");return\"1\"===r&&(r=\"\"),t.charAt(0)+r}},r.list=function(t,e,r){return n(t,e,r).map(function(e){return i.nestedProperty(t._fullLayout,e).get()})},r.listIds=function(t,e){return n(t,e,!0).map(r.name2id)},r.getFromId=function(t,e,n){var a=t._fullLayout;return\"x\"===n?e=e.replace(/y[0-9]*/,\"\"):\"y\"===n&&(e=e.replace(/x[0-9]*/,\"\")),a[r.id2name(e)]},r.getFromTrace=function(t,e,n){var o=t._fullLayout,i=null;if(a.traceIs(e,\"gl3d\")){var l=e.scene;\"scene\"===l.substr(0,5)&&(i=o[l][n+\"axis\"])}else i=r.getFromId(t,e[n+\"axis\"]||n);return i}},{\"../../lib\":136,\"../../registry\":206,\"../plots\":199,\"./constants\":176}],175:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){if(\"category\"===e.type){var n,a=t.categoryarray,o=Array.isArray(a)&&a.length>0;o&&(n=\"array\");var i=r(\"categoryorder\",n);\"array\"===i&&r(\"categoryarray\"),o||\"array\"!==i||(e.categoryorder=\"trace\")}}},{}],176:[function(t,e,r){\"use strict\";e.exports={idRegex:{x:/^x([2-9]|[1-9][0-9]+)?$/,y:/^y([2-9]|[1-9][0-9]+)?$/},attrRegex:{x:/^xaxis([2-9]|[1-9][0-9]+)?$/,y:/^yaxis([2-9]|[1-9][0-9]+)?$/},xAxisMatch:/^xaxis[0-9]*$/,yAxisMatch:/^yaxis[0-9]*$/,AX_ID_PATTERN:/^[xyz][0-9]*$/,AX_NAME_PATTERN:/^[xyz]axis[0-9]*$/,MINDRAG:8,MINSELECT:12,MINZOOM:20,DRAGGERSIZE:20,BENDPX:1.5,REDRAWDELAY:50,DFLTRANGEX:[-1,6],DFLTRANGEY:[-1,4]}},{}],177:[function(t,e,r){\"use strict\";function n(t,e,r,n){var a,o,l,s,c=n[i(e)].type,u=[];for(o=0;o<r.length;o++)(l=r[o])!==e&&(s=n[i(l)],s.type!==c||s.fixedrange||u.push(l));for(a=0;a<t.length;a++)if(t[a][e]){var f=t[a],d=[];for(o=0;o<u.length;o++)l=u[o],f[l]||d.push(l);return{linkableAxes:d,thisGroup:f}}return{linkableAxes:u,thisGroup:null}}function a(t,e,r,n,a){var o,i,l,s,c;null===e?(e={},e[r]=1,c=t.length,t.push(e)):c=t.indexOf(e);var u=Object.keys(e);for(o=0;o<t.length;o++)if(l=t[o],o!==c&&l[n]){var f=l[n];for(i=0;i<u.length;i++)s=u[i],l[s]=f*a*e[s];return void t.splice(c,1)}if(1!==a)for(i=0;i<u.length;i++)e[u[i]]*=a;e[n]=1}var o=t(\"../../lib\"),i=t(\"./axis_ids\").id2name;e.exports=function(t,e,r,i,l){var s=l._axisConstraintGroups;if(!e.fixedrange&&t.scaleanchor){var c=n(s,e._id,i,l),u=o.coerce(t,e,{scaleanchor:{valType:\"enumerated\",values:c.linkableAxes}},\"scaleanchor\");if(u){var f=r(\"scaleratio\");f||(f=e.scaleratio=1),a(s,c.thisGroup,e._id,u,f)}else i.indexOf(t.scaleanchor)!==-1&&o.warn(\"ignored \"+e._name+'.scaleanchor: \"'+t.scaleanchor+'\" to avoid either an infinite loop and possibly inconsistent scaleratios, or because the targetaxis has fixed range.')}}},{\"../../lib\":136,\"./axis_ids\":174}],178:[function(t,e,r){\"use strict\";var n=t(\"./axis_ids\").id2name,a=t(\"./scale_zoom\"),o=t(\"../../constants/numerical\").ALMOST_EQUAL;e.exports=function(t){var e,r,i,l,s,c=t._fullLayout,u=c._axisConstraintGroups;for(e=0;e<u.length;e++){var f=u[e],d=Object.keys(f),h=1/0,p=0,g=1/0,v={},m={};for(r=0;r<d.length;r++)i=d[r],m[i]=l=c[n(i)],l.setScale(),v[i]=s=Math.abs(l._m)/f[i],h=Math.min(h,s),l._constraintShrinkable?delete l._constraintShrinkable:g=Math.min(g,s),p=Math.max(p,s);if(!(h>o*p))for(r=0;r<d.length;r++)i=d[r],(s=v[i])!==g&&a(m[i],s/g)}}},{\"../../constants/numerical\":122,\"./axis_ids\":174,\"./scale_zoom\":186}],179:[function(t,e,r){\"use strict\";function n(t,e,r,n,a,o,i){var l=t.draglayer.selectAll(\".\"+e).data([0]);return l.enter().append(\"rect\").classed(\"drag\",!0).classed(e,!0).style({fill:\"transparent\",\"stroke-width\":0}).attr(\"data-subplot\",t.id),l.call(L.setRect,n,a,o,i).call(C,r),l.node()}function a(t,e){for(var r=0;r<t.length;r++)if(!t[r].fixedrange)return e;return\"\"}function o(t,e){var r,n=t.range[e],a=Math.abs(n-t.range[1-e]);return\"date\"===t.type?n:\"log\"===t.type?(r=Math.ceil(Math.max(0,-Math.log(a)/Math.LN10))+3,b.format(\".\"+r+\"g\")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(a)/Math.LN10)+4,b.format(\".\"+String(r)+\"g\")(n))}function i(t,e,r,n){var a,o,l,s;for(a=0;a<t.length;a++)o=t[a],o.fixedrange||(l=o._rl[0],s=o._rl[1]-l,o.range=[o.l2r(l+s*e),o.l2r(l+s*r)]);if(n&&n.length){var c=(e+(1-r))/2;i(n,c,1-c)}}function l(t,e){for(var r=0;r<t.length;r++){var n=t[r];n.fixedrange||(n.range=[n.l2r(n._rl[0]-e/n._m),n.l2r(n._rl[1]-e/n._m)])}}function s(t){return 1-(t>=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function c(t,e){return t?\"nsew\"===t?\"pan\"===e?\"move\":\"crosshair\":t.toLowerCase()+\"-resize\":\"pointer\"}function u(t,e,r,n,a){return t.append(\"path\").attr(\"class\",\"zoombox\").style({fill:e>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"transform\",\"translate(\"+r+\", \"+n+\")\").attr(\"d\",a+\"Z\")}function f(t,e,r){return t.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:T.background,stroke:T.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"transform\",\"translate(\"+e+\", \"+r+\")\").attr(\"d\",\"M0,0Z\")}function d(t){t.selectAll(\".select-outline\").remove()}function h(t,e,r,n,a,o){t.attr(\"d\",n+\"M\"+r.l+\",\"+r.t+\"v\"+r.h+\"h\"+r.w+\"v-\"+r.h+\"h-\"+r.w+\"Z\"),a||(t.transition().style(\"fill\",o>.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),e.transition().style(\"opacity\",1).duration(200))}function p(t){b.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}function g(t){return[\"lasso\",\"select\"].indexOf(t)!==-1}function v(t,e){return\"M\"+(t.l-.5)+\",\"+(e-I-.5)+\"h-3v\"+(2*I+1)+\"h3ZM\"+(t.r+.5)+\",\"+(e-I-.5)+\"h3v\"+(2*I+1)+\"h-3Z\"}function m(t,e){return\"M\"+(e-I-.5)+\",\"+(t.t-.5)+\"v-3h\"+(2*I+1)+\"v3ZM\"+(e-I-.5)+\",\"+(t.b+.5)+\"v3h\"+(2*I+1)+\"v-3Z\"}function y(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,I)/2);return\"M\"+(t.l-3.5)+\",\"+(t.t-.5+e)+\"h3v\"+-e+\"h\"+e+\"v-3h-\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.t-.5+e)+\"h-3v\"+-e+\"h\"+-e+\"v-3h\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.b+.5-e)+\"h-3v\"+e+\"h\"+-e+\"v3h\"+(e+3)+\"ZM\"+(t.l-3.5)+\",\"+(t.b+.5-e)+\"h3v\"+e+\"h\"+e+\"v3h-\"+(e+3)+\"Z\"}function x(t,e,r){var n,a,o,i,l,s,c=!1,u={},f={};for(n=0;n<t.length;n++){for(i=t[n],a=0;a<e.length;a++)if(i[e[a]]){for(l in i)(\"x\"===l.charAt(0)?e:r).indexOf(l)===-1&&(u[l]=1);for(o=0;o<r.length;o++)i[r[o]]&&(c=!0)}for(a=0;a<r.length;a++)if(i[r[a]])for(s in i)(\"x\"===s.charAt(0)?e:r).indexOf(s)===-1&&(f[s]=1)}return c&&(M.extendFlat(u,f),f={}),{x:u,y:f,xy:c}}var b=t(\"d3\"),_=t(\"tinycolor2\"),w=t(\"../../plotly\"),k=t(\"../../registry\"),M=t(\"../../lib\"),A=t(\"../../lib/svg_text_utils\"),T=t(\"../../components/color\"),L=t(\"../../components/drawing\"),C=t(\"../../lib/setcursor\"),S=t(\"../../components/dragelement\"),z=t(\"./axes\").doTicks,O=t(\"./axis_ids\").getFromId,D=t(\"./select\"),P=t(\"./scale_zoom\"),E=t(\"./constants\"),N=E.MINDRAG,I=E.MINZOOM,R=!0;e.exports=function(t,e,r,T,C,F,j,B){function q(){K=[e.xaxis],tt=[e.yaxis];var r=K[0],n=tt[0];nt=r._length,at=n._length;var o=ft._axisConstraintGroups,i=[r._id],l=[n._id];J=[e].concat(j&&B?e.overlays:[]);for(var s=1;s<J.length;s++){var u=J[s].xaxis,f=J[s].yaxis;K.indexOf(u)===-1&&(K.push(u),i.push(u._id)),tt.indexOf(f)===-1&&(tt.push(f),l.push(f._id))}ot=a(K,B),it=a(tt,j),lt=c(it+ot,ft.dragmode),et=r._offset,rt=n._offset;var d=x(o,i,l);st=d.xy,ct=[];for(var h in d.x)ct.push(O(t,h));ut=[];for(var p in d.y)ut.push(O(t,p))}function H(e,r,n){var a=pt.getBoundingClientRect();vt=r-a.left,mt=n-a.top,yt={l:vt,r:vt,w:0,t:mt,b:mt,h:0},xt=t._hmpixcount?t._hmlumcount/t._hmpixcount:_(t._fullLayout.plot_bgcolor).getLuminance(),bt=\"M0,0H\"+nt+\"V\"+at+\"H0V0\",_t=!1,wt=\"xy\",kt=u(dt,xt,et,rt,bt),Mt=f(dt,et,rt),d(dt)}function V(e,r){function n(){wt=\"\",yt.r=yt.l,yt.t=yt.b,Mt.attr(\"d\",\"M0,0Z\")}if(t._transitioningWithDuration)return!1;var a=Math.max(0,Math.min(nt,e+vt)),o=Math.max(0,Math.min(at,r+mt)),i=Math.abs(a-vt),l=Math.abs(o-mt);yt.l=Math.min(vt,a),\n",
|
|
"yt.r=Math.max(vt,a),yt.t=Math.min(mt,o),yt.b=Math.max(mt,o),st?i>I||l>I?(wt=\"xy\",i/nt>l/at?(l=i*at/nt,mt>o?yt.t=mt-l:yt.b=mt+l):(i=l*nt/at,vt>a?yt.l=vt-i:yt.r=vt+i),Mt.attr(\"d\",y(yt))):n():!it||l<Math.min(Math.max(.6*i,N),I)?i<N?n():(yt.t=0,yt.b=at,wt=\"x\",Mt.attr(\"d\",v(yt,mt))):!ot||i<Math.min(.6*l,I)?(yt.l=0,yt.r=nt,wt=\"y\",Mt.attr(\"d\",m(yt,vt))):(wt=\"xy\",Mt.attr(\"d\",y(yt))),yt.w=yt.r-yt.l,yt.h=yt.b-yt.t,h(kt,Mt,yt,bt,_t,xt),_t=!0}function U(e,r){if(Math.min(yt.h,yt.w)<2*N)return 2===r&&W(),p(t);\"xy\"!==wt&&\"x\"!==wt||i(K,yt.l/nt,yt.r/nt,ct),\"xy\"!==wt&&\"y\"!==wt||i(tt,(at-yt.b)/at,(at-yt.t)/at,ut),p(t),$(wt),R&&t.data&&t._context.showTips&&(M.notifier(\"Double-click to<br>zoom back out\",\"long\"),R=!1)}function X(e,r){var n=1===(j+B).length;if(e)$();else if(2!==r||n){if(1===r&&n){var a=j?tt[0]:K[0],i=\"s\"===j||\"w\"===B?0:1,l=a._name+\".range[\"+i+\"]\",s=o(a,i),c=\"left\",u=\"middle\";if(a.fixedrange)return;j?(u=\"n\"===j?\"top\":\"bottom\",\"right\"===a.side&&(c=\"right\")):\"e\"===B&&(c=\"right\"),t._context.showAxisRangeEntryBoxes&&b.select(pt).call(A.makeEditable,null,{immediate:!0,background:ft.paper_bgcolor,text:String(s),fill:a.tickfont?a.tickfont.color:\"#444\",horizontalAlign:c,verticalAlign:u}).on(\"edit\",function(e){var r=a.d2r(e);void 0!==r&&w.relayout(t,l,r)})}}else W()}function G(e){function r(t,e,r){function n(e){return t.l2r(o+(e-o)*r)}if(!t.fixedrange){var a=M.simpleMap(t.range,t.r2l),o=a[0]+(a[1]-a[0])*e;t.range=a.map(n)}}if(t._context.scrollZoom||ft._enablescrollzoom){if(t._transitioningWithDuration)return M.pauseEvent(e);var n=t.querySelector(\".plotly\");if(q(),!(n.scrollHeight-n.clientHeight>10||n.scrollWidth-n.clientWidth>10)){clearTimeout(Tt);var a=-e.deltaY;if(isFinite(a)||(a=e.wheelDelta/10),!isFinite(a))return void M.log(\"Did not find wheel motion attributes: \",e);var o,i=Math.exp(-Math.min(Math.max(a,-20),20)/100),l=Ct.draglayer.select(\".nsewdrag\").node().getBoundingClientRect(),s=(e.clientX-l.left)/l.width,c=(l.bottom-e.clientY)/l.height;if(B||st){for(B||(s=.5),o=0;o<K.length;o++)r(K[o],s,i);At[2]*=i,At[0]+=At[2]*s*(1/i-1)}if(j||st){for(j||(c=.5),o=0;o<tt.length;o++)r(tt[o],c,i);At[3]*=i,At[1]+=At[3]*(1-c)*(1/i-1)}return Q(At),Z(j,B),Tt=setTimeout(function(){At=[0,0,nt,at];var t;t=st?\"xy\":(B?\"x\":\"\")+(j?\"y\":\"\"),$(t)},Lt),M.pauseEvent(e)}}}function Y(e,r){function n(t,e,r){for(var n,a,o=1-e,i=0;i<t.length;i++){var l=t[i];if(!l.fixedrange){n=l,a=l._rl[o]+(l._rl[e]-l._rl[o])/s(r/l._length);var c=l.l2r(a);c!==!1&&void 0!==c&&(l.range[e]=c)}}return n._length*(n._rl[e]-a)/(n._rl[e]-n._rl[o])}if(!t._transitioningWithDuration){if(q(),\"ew\"===ot||\"ns\"===it)return ot&&l(K,e),it&&l(tt,r),Q([ot?-e:0,it?-r:0,nt,at]),void Z(it,ot);if(st&&ot&&it){var a=\"w\"===ot==(\"n\"===it)?1:-1,o=(e/nt+a*r/at)/2;e=o*nt,r=a*o*at}\"w\"===ot?e=n(K,0,e):\"e\"===ot?e=n(K,1,-e):ot||(e=0),\"n\"===it?r=n(tt,1,r):\"s\"===it?r=n(tt,0,-r):it||(r=0);var i=\"w\"===ot?e:0,c=\"n\"===it?r:0;if(st){var u;if(!ot&&1===it.length){for(u=0;u<K.length;u++)K[u].range=K[u]._r.slice(),P(K[u],1-r/at);e=r*nt/at,i=e/2}if(!it&&1===ot.length){for(u=0;u<tt.length;u++)tt[u].range=tt[u]._r.slice(),P(tt[u],1-e/nt);r=e*at/nt,c=r/2}}Q([i,c,nt-e,at-r]),Z(it,ot)}}function Z(e,r){function n(t){for(o=0;o<t.length;o++)t[o].fixedrange||i.push(t[o]._id)}function a(n,a,l){for(o=0;o<n.length;o++){var s=n[o];if((r&&i.indexOf(s.xref)!==-1||e&&i.indexOf(s.yref)!==-1)&&(a(t,o),l))return}}var o,i=[];for((r||st)&&(n(K),n(ct)),(e||st)&&(n(tt),n(ut)),o=0;o<i.length;o++)z(t,i[o],!0);a(ft.annotations||[],k.getComponentMethod(\"annotations\",\"drawOne\")),a(ft.shapes||[],k.getComponentMethod(\"shapes\",\"drawOne\")),a(ft.images||[],k.getComponentMethod(\"images\",\"draw\"),!0)}function W(){if(!t._transitioningWithDuration){var e,r,n,a=t._context.doubleClick,o=(ot?K:[]).concat(it?tt:[]),i={};if(\"reset+autosize\"===a)for(a=\"autosize\",r=0;r<o.length;r++)if(e=o[r],e._rangeInitial&&(e.range[0]!==e._rangeInitial[0]||e.range[1]!==e._rangeInitial[1])||!e._rangeInitial&&!e.autorange){a=\"reset\";break}if(\"autosize\"===a)for(r=0;r<o.length;r++)e=o[r],e.fixedrange||(i[e._name+\".autorange\"]=!0);else if(\"reset\"===a)for((ot||st)&&(o=o.concat(ct)),it&&!st&&(o=o.concat(ut)),st&&(ot?it||(o=o.concat(tt)):o=o.concat(K)),r=0;r<o.length;r++)e=o[r],e._rangeInitial?(n=e._rangeInitial,i[e._name+\".range[0]\"]=n[0],i[e._name+\".range[1]\"]=n[1]):i[e._name+\".autorange\"]=!0;t.emit(\"plotly_doubleclick\",null),w.relayout(t,i)}}function $(e){void 0===e&&(e=(B?\"x\":\"\")+(j?\"y\":\"\"));var r,n={};\"xy\"===e?r=K.concat(tt):\"x\"===e?r=K:\"y\"===e&&(r=tt);for(var a=0;a<r.length;a++){var o=r[a];o._r[0]!==o.range[0]&&(n[o._name+\".range[0]\"]=o.range[0]),o._r[1]!==o.range[1]&&(n[o._name+\".range[1]\"]=o.range[1]),o.range=o._input.range=o._r.slice()}Q([0,0,nt,at]),w.relayout(t,n)}function Q(t){function e(t){return t.fixedrange?0:d&&ct.indexOf(t)!==-1?u:h&&(st?ct:ut).indexOf(t)!==-1?f:0}function r(t,e){return e?(t.range=t._r.slice(),P(t,e),t._length*(1-e)/2):0}var n,a,o,i,l,s=ft._plots,c=Object.keys(s),u=t[2]/K[0]._length,f=t[3]/tt[0]._length,d=B||st,h=j||st;for(n=0;n<c.length;n++){var p=s[c[n]],g=p.xaxis,v=p.yaxis,m=d&&!g.fixedrange&&K.indexOf(g)!==-1,y=h&&!v.fixedrange&&tt.indexOf(v)!==-1;if(m?(a=u,i=t[0]):(a=e(g),i=r(g,a)),y?(o=f,l=t[1]):(o=e(v),l=r(v,o)),a||o){a||(a=1),o||(o=1);var x=g._offset-i/a,b=v._offset-l/o;ft._defs.selectAll(\"#\"+p.clipId).call(L.setTranslate,i,l).call(L.setScale,a,o),p.plot.call(L.setTranslate,x,b).call(L.setScale,1/a,1/o).select(\".scatterlayer\").selectAll(\".points\").selectAll(\".point\").call(L.setPointGroupScale,a,o),p.plot.select(\".scatterlayer\").selectAll(\".points\").selectAll(\".textpoint\").call(L.setTextPointsScale,a,o)}}}var J,K,tt,et,rt,nt,at,ot,it,lt,st,ct,ut,ft=t._fullLayout,dt=t._fullLayout._zoomlayer,ht=j+B===\"nsew\";q();var pt=n(e,j+B+\"drag\",lt,r,T,C,F);if(!it&&!ot&&!g(ft.dragmode))return pt.onmousedown=null,pt.style.pointerEvents=ht?\"all\":\"none\",pt;var gt={element:pt,gd:t,plotinfo:e,doubleclick:W,prepFn:function(e,r,n){var a=t._fullLayout.dragmode;ht?e.shiftKey&&(a=\"pan\"===a?\"zoom\":\"pan\"):a=\"pan\",gt.minDrag=\"lasso\"===a?1:void 0,\"zoom\"===a?(gt.moveFn=V,gt.doneFn=U,gt.minDrag=1,H(e,r,n)):\"pan\"===a?(gt.moveFn=Y,gt.doneFn=X,d(dt)):g(a)&&(gt.xaxes=K,gt.yaxes=tt,D(e,r,n,gt,a))}};S.init(gt);var vt,mt,yt,xt,bt,_t,wt,kt,Mt,At=[0,0,nt,at],Tt=null,Lt=E.REDRAWDELAY,Ct=e.mainplot?ft._plots[e.mainplot]:e;return j.length*B.length!=1&&(void 0!==pt.onwheel?pt.onwheel=G:void 0!==pt.onmousewheel&&(pt.onmousewheel=G)),pt}},{\"../../components/color\":25,\"../../components/dragelement\":46,\"../../components/drawing\":49,\"../../lib\":136,\"../../lib/setcursor\":151,\"../../lib/svg_text_utils\":153,\"../../plotly\":166,\"../../registry\":206,\"./axes\":171,\"./axis_ids\":174,\"./constants\":176,\"./scale_zoom\":186,\"./select\":187,d3:7,tinycolor2:13}],180:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../components/fx\"),o=t(\"../../components/dragelement\"),i=t(\"./constants\"),l=t(\"./dragbox\");e.exports=function(t){var e=t._fullLayout;if(e._has(\"cartesian\")&&!t._context.staticPlot){Object.keys(e._plots||{}).sort(function(t,r){if((e._plots[t].mainplot&&!0)===(e._plots[r].mainplot&&!0)){var n=t.split(\"y\"),a=r.split(\"y\");return n[0]===a[0]?Number(n[1]||1)-Number(a[1]||1):Number(n[0]||1)-Number(a[0]||1)}return e._plots[t].mainplot?1:-1}).forEach(function(r){var s=e._plots[r];if(e._has(\"cartesian\")){var c=s.xaxis,u=s.yaxis,f=(c._linepositions[r]||[])[3],d=(u._linepositions[r]||[])[3],h=i.DRAGGERSIZE;if(n(f)&&\"top\"===c.side&&(f-=h),n(d)&&\"right\"!==u.side&&(d-=h),!s.mainplot){var p=l(t,s,0,0,c._length,u._length,\"ns\",\"ew\");p.onmousemove=function(e){t._fullLayout._rehover=function(){t._fullLayout._hoversubplot===r&&a.hover(t,e,r)},a.hover(t,e,r),t._fullLayout._lasthover=p,t._fullLayout._hoversubplot=r},p.onmouseout=function(e){t._dragging||(t._fullLayout._hoversubplot=null,o.unhover(t,e))},p.onclick=function(e){a.click(t,e)},t._context.showAxisDragHandles&&(l(t,s,-h,-h,h,h,\"n\",\"w\"),l(t,s,c._length,-h,h,h,\"n\",\"e\"),l(t,s,-h,u._length,h,h,\"s\",\"w\"),l(t,s,c._length,u._length,h,h,\"s\",\"e\"))}t._context.showAxisDragHandles&&(n(f)&&(\"free\"===c.anchor&&(f-=e._size.h*(1-u.domain[1])),l(t,s,.1*c._length,f,.8*c._length,h,\"\",\"ew\"),l(t,s,0,f,.1*c._length,h,\"\",\"w\"),l(t,s,.9*c._length,f,.1*c._length,h,\"\",\"e\")),n(d)&&(\"free\"===u.anchor&&(d-=e._size.w*c.domain[0]),l(t,s,d,.1*u._length,h,.8*u._length,\"ns\",\"\"),l(t,s,d,.9*u._length,h,.1*u._length,\"s\",\"\"),l(t,s,d,0,h,.1*u._length,\"n\",\"\")))}});var r=e._hoverlayer.node();r.onmousemove=function(r){r.target=e._lasthover,a.hover(t,r,e._hoversubplot)},r.onclick=function(r){r.target=e._lasthover,a.click(t,r)},r.onmousedown=function(t){e._lasthover.onmousedown(t)}}}},{\"../../components/dragelement\":46,\"../../components/fx\":66,\"./constants\":176,\"./dragbox\":179,\"fast-isnumeric\":10}],181:[function(t,e,r){\"use strict\";function n(t,e,r,n,a){var o=t._fullLayout,i=o._modules;e.plot&&e.plot.selectAll(\"g:not(.scatterlayer)\").selectAll(\"g.trace\").remove();for(var l=0;l<i.length;l++){var s=i[l];if(\"cartesian\"===s.basePlotModule.name){for(var c=[],u=0;u<r.length;u++){var f=r[u],d=f[0].trace;d._module===s&&d.visible===!0&&c.push(f)}s.plot(t,e,c,n,a)}}}function a(t){for(var e=t._fullLayout,r=Object.keys(e._plots),n=[],a=[],o=0;o<r.length;o++){var i=r[o],l=e._plots[i],s=l.xaxis,c=l.yaxis,u=f.getFromId(t,s.overlaying)||s;u!==s&&u.overlaying&&(u=s,s.overlaying=!1);var d=f.getFromId(t,c.overlaying)||c;d!==c&&d.overlaying&&(d=c,c.overlaying=!1);var h=u._id+d._id;h!==i&&r.indexOf(h)!==-1?(l.mainplot=h,l.mainplotinfo=e._plots[h],a.push(i),s.domain=u.domain.slice(),c.domain=d.domain.slice()):n.push(i)}return n=n.concat(a)}function o(t){function e(t){l(t,\"g\",\"imagelayer\"),l(t,\"g\",\"maplayer\"),l(t,\"g\",\"barlayer\"),l(t,\"g\",\"carpetlayer\"),l(t,\"g\",\"boxlayer\"),l(t,\"g\",\"scatterlayer\")}var r=t.plotgroup,n=t.id;if(t.mainplot){var a=t.mainplotinfo;t.gridlayer=l(a.overgrid,\"g\",n),t.zerolinelayer=l(a.overzero,\"g\",n),t.plot=l(a.overplot,\"g\",n),t.xlines=l(a.overlines,\"path\",n),t.ylines=l(a.overlines,\"path\",n),t.xaxislayer=l(a.overaxes,\"g\",n),t.yaxislayer=l(a.overaxes,\"g\",n)}else{var o=l(r,\"g\",\"layer-subplot\");t.shapelayer=l(o,\"g\",\"shapelayer\"),t.imagelayer=l(o,\"g\",\"imagelayer\"),t.gridlayer=l(r,\"g\",\"gridlayer\"),t.overgrid=l(r,\"g\",\"overgrid\"),t.zerolinelayer=l(r,\"g\",\"zerolinelayer\"),t.overzero=l(r,\"g\",\"overzero\"),t.plot=l(r,\"g\",\"plot\"),t.overplot=l(r,\"g\",\"overplot\"),t.xlines=l(r,\"path\",\"xlines\"),t.ylines=l(r,\"path\",\"ylines\"),t.overlines=l(r,\"g\",\"overlines\"),t.xaxislayer=l(r,\"g\",\"xaxislayer\"),t.yaxislayer=l(r,\"g\",\"yaxislayer\"),t.overaxes=l(r,\"g\",\"overaxes\")}t.plot.call(e),t.xlines.style(\"fill\",\"none\").classed(\"crisp\",!0),t.ylines.style(\"fill\",\"none\").classed(\"crisp\",!0)}function i(t,e){t&&t.each(function(t){var r=s.select(this),n=\"clip\"+e._uid+t+\"plot\";r.remove(),e._draggers.selectAll(\"g.\"+t).remove(),e._defs.select(\"#\"+n).remove()})}function l(t,e,r){var n=t.selectAll(\".\"+r).data([0]);return n.enter().append(e).classed(r,!0),n}var s=t(\"d3\"),c=t(\"../../lib\"),u=t(\"../plots\"),f=t(\"./axis_ids\"),d=t(\"./constants\");r.name=\"cartesian\",r.attr=[\"xaxis\",\"yaxis\"],r.idRoot=[\"x\",\"y\"],r.idRegex=d.idRegex,r.attrRegex=d.attrRegex,r.attributes=t(\"./attributes\"),r.layoutAttributes=t(\"./layout_attributes\"),r.transitionAxes=t(\"./transition_axes\"),r.plot=function(t,e,r,a){var o,i=t._fullLayout,l=u.getSubplotIds(i,\"cartesian\"),s=t.calcdata;if(!Array.isArray(e))for(e=[],o=0;o<s.length;o++)e.push(o);for(o=0;o<l.length;o++){for(var c,f=l[o],d=i._plots[f],h=[],p=0;p<s.length;p++){var g=s[p],v=g[0].trace;v.xaxis+v.yaxis===f&&((e.indexOf(v.index)!==-1||v.carpet)&&(c&&c[0].trace.xaxis+c[0].trace.yaxis===f&&[\"tonextx\",\"tonexty\",\"tonext\"].indexOf(v.fill)!==-1&&h.indexOf(c)===-1&&h.push(c),h.push(g)),c=g)}n(t,d,h,r,a)}},r.clean=function(t,e,r,n){var a,o,l,s=n._modules||[],c=e._modules||[];for(l=0;l<s.length;l++)if(\"scatter\"===s[l].name){a=!0;break}for(l=0;l<c.length;l++)if(\"scatter\"===c[l].name){o=!0;break}if(a&&!o){var u=n._plots,d=Object.keys(u||{});for(l=0;l<d.length;l++){var h=u[d[l]];h.plot&&h.plot.select(\"g.scatterlayer\").selectAll(\"g.trace\").remove()}n._infolayer.selectAll(\"g.rangeslider-container\").select(\"g.scatterlayer\").selectAll(\"g.trace\").remove()}var p=n._has&&n._has(\"cartesian\"),g=e._has&&e._has(\"cartesian\");if(p&&!g){var v=n._cartesianlayer.selectAll(\".subplot\"),m=f.listIds({_fullLayout:n});for(v.call(i,n),n._defs.selectAll(\".axesclip\").remove(),l=0;l<m.length;l++)n._infolayer.select(\".\"+m[l]+\"title\").remove()}},r.drawFramework=function(t){var e=t._fullLayout,r=a(t),n=e._cartesianlayer.selectAll(\".subplot\").data(r,c.identity);n.enter().append(\"g\").attr(\"class\",function(t){return\"subplot \"+t}),n.order(),n.exit().call(i,e),n.each(function(t){var r=e._plots[t];if(r.plotgroup=s.select(this),r.overlays=[],o(r),r.mainplot){e._plots[r.mainplot].overlays.push(r)}r.draglayer=l(e._draggers,\"g\",t)})},r.rangePlot=function(t,e,r){o(e),n(t,e,r),u.style(t)}},{\"../../lib\":136,\"../plots\":199,\"./attributes\":170,\"./axis_ids\":174,\"./constants\":176,\"./layout_attributes\":182,\"./transition_axes\":192,d3:7}],182:[function(t,e,r){\"use strict\";var n=t(\"../font_attributes\"),a=t(\"../../components/color/attributes\"),o=t(\"../../components/drawing/attributes\").dash,i=t(\"../../lib/extend\").extendFlat,l=t(\"./constants\");e.exports={visible:{valType:\"boolean\"},color:{valType:\"color\",dflt:a.defaultLine},title:{valType:\"string\"},titlefont:i({},n,{}),type:{valType:\"enumerated\",values:[\"-\",\"linear\",\"log\",\"date\",\"category\"],dflt:\"-\"},autorange:{valType:\"enumerated\",values:[!0,!1,\"reversed\"],dflt:!0},rangemode:{valType:\"enumerated\",values:[\"normal\",\"tozero\",\"nonnegative\"],dflt:\"normal\"},range:{valType:\"info_array\",items:[{valType:\"any\"},{valType:\"any\"}]},fixedrange:{valType:\"boolean\",dflt:!1},scaleanchor:{valType:\"enumerated\",values:[l.idRegex.x.toString(),l.idRegex.y.toString()]},scaleratio:{valType:\"number\",min:0,dflt:1},tickmode:{valType:\"enumerated\",values:[\"auto\",\"linear\",\"array\"]},nticks:{valType:\"integer\",min:0,dflt:0},tick0:{valType:\"any\"},dtick:{valType:\"any\"},tickvals:{valType:\"data_array\"},ticktext:{valType:\"data_array\"},ticks:{valType:\"enumerated\",values:[\"outside\",\"inside\",\"\"]},mirror:{valType:\"enumerated\",values:[!0,\"ticks\",!1,\"all\",\"allticks\"],dflt:!1},ticklen:{valType:\"number\",min:0,dflt:5},tickwidth:{valType:\"number\",min:0,dflt:1},tickcolor:{valType:\"color\",dflt:a.defaultLine},showticklabels:{valType:\"boolean\",dflt:!0},showspikes:{valType:\"boolean\",dflt:!1},spikecolor:{valType:\"color\",dflt:null},spikethickness:{valType:\"number\",dflt:3},spikedash:i({},o,{dflt:\"dash\"}),spikemode:{valType:\"flaglist\",flags:[\"toaxis\",\"across\",\"marker\"],dflt:\"toaxis\"},tickfont:i({},n,{}),tickangle:{valType:\"angle\",dflt:\"auto\"},tickprefix:{valType:\"string\",dflt:\"\"},showtickprefix:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},ticksuffix:{valType:\"string\",dflt:\"\"},showticksuffix:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},showexponent:{valType:\"enumerated\",values:[\"all\",\"first\",\"last\",\"none\"],dflt:\"all\"},exponentformat:{valType:\"enumerated\",values:[\"none\",\"e\",\"E\",\"power\",\"SI\",\"B\"],dflt:\"B\"},separatethousands:{valType:\"boolean\",dflt:!1},tickformat:{valType:\"string\",dflt:\"\"},hoverformat:{valType:\"string\",dflt:\"\"},showline:{valType:\"boolean\",dflt:!1},linecolor:{valType:\"color\",dflt:a.defaultLine},linewidth:{valType:\"number\",min:0,dflt:1},showgrid:{valType:\"boolean\"},gridcolor:{valType:\"color\",dflt:a.lightLine},gridwidth:{valType:\"number\",min:0,dflt:1},zeroline:{valType:\"boolean\"},zerolinecolor:{valType:\"color\",dflt:a.defaultLine},zerolinewidth:{valType:\"number\",dflt:1},anchor:{valType:\"enumerated\",values:[\"free\",l.idRegex.x.toString(),l.idRegex.y.toString()]},side:{valType:\"enumerated\",values:[\"top\",\"bottom\",\"left\",\"right\"]},overlaying:{valType:\"enumerated\",values:[\"free\",l.idRegex.x.toString(),l.idRegex.y.toString()]},domain:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]},position:{valType:\"number\",min:0,max:1,dflt:0},categoryorder:{valType:\"enumerated\",values:[\"trace\",\"category ascending\",\"category descending\",\"array\"],dflt:\"trace\"},categoryarray:{valType:\"data_array\"},_deprecated:{autotick:{valType:\"boolean\"}}}},{\"../../components/color/attributes\":24,\"../../components/drawing/attributes\":48,\"../../lib/extend\":132,\"../font_attributes\":195,\"./constants\":176}],183:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../lib\"),o=t(\"../../components/color\"),i=t(\"../layout_attributes\"),l=t(\"./constants\"),s=t(\"./layout_attributes\"),c=t(\"./type_defaults\"),u=t(\"./axis_defaults\"),f=t(\"./constraint_defaults\"),d=t(\"./position_defaults\"),h=t(\"./axis_ids\");e.exports=function(t,e,r){function p(t,e){return Number(t.substr(5)||1)-Number(e.substr(5)||1)}function g(t,e){return a.coerce(j,B,s,t,e)}function v(t){var e={x:E,y:P}[t];return a.simpleMap(e,h.name2id)}var m,y=Object.keys(t),x=[],b=[],_=[],w=[],k=[],M=[],A={},T={};for(m=0;m<r.length;m++){var L,C,S=r[m];if(n.traceIs(S,\"cartesian\"))L=x,C=b;else{if(!n.traceIs(S,\"gl2d\"))continue;L=_,C=w}var z=h.id2name(S.xaxis),O=h.id2name(S.yaxis);if(n.traceIs(S,\"carpet\")&&(\"carpet\"!==S.type||S._cheater)||z&&a.pushUnique(M,z),\"carpet\"===S.type&&S._cheater&&z&&a.pushUnique(k,z),z&&L.indexOf(z)===-1&&L.push(z),O&&C.indexOf(O)===-1&&C.push(O),n.traceIs(S,\"2dMap\")&&(A[z]=!0,A[O]=!0),n.traceIs(S,\"oriented\")){T[\"h\"===S.orientation?O:z]=!0}}if(!e._has(\"gl3d\")&&!e._has(\"geo\"))for(m=0;m<y.length;m++){var D=y[m];_.indexOf(D)===-1&&x.indexOf(D)===-1&&l.xAxisMatch.test(D)?x.push(D):w.indexOf(D)===-1&&b.indexOf(D)===-1&&l.yAxisMatch.test(D)&&b.push(D)}x.length&&b.length&&a.pushUnique(e._basePlotModules,n.subplotsRegistry.cartesian);var P=x.concat(_).sort(p),E=b.concat(w).sort(p),N=P.concat(E),I=o.background;P.length&&E.length&&(I=a.coerce(t,e,i,\"plot_bgcolor\"));var R,F,j,B,q=o.combine(I,e.paper_bgcolor),H={x:v(\"x\"),y:v(\"y\")};for(m=0;m<N.length;m++){R=N[m],a.isPlainObject(t[R])||(t[R]={}),j=t[R],B=e[R]={},c(j,B,g,r,R),F=R.charAt(0);var V=function(e,r){for(var n={x:P,y:E}[e],a=[],o=0;o<n.length;o++){var i=n[o];i===r||(t[i]||{}).overlaying||a.push(h.name2id(i))}return a}(F,R),U={letter:F,font:e.font,outerTicks:A[R],showGrid:!T[R],data:r,bgColor:q,calendar:e.calendar,cheateronly:\"x\"===F&&k.indexOf(R)!==-1&&M.indexOf(R)===-1};u(j,B,g,U,e);g(\"showspikes\")&&(g(\"spikecolor\"),g(\"spikethickness\"),g(\"spikedash\"),g(\"spikemode\"));var X={letter:F,counterAxes:H[F],overlayableAxes:V};d(j,B,g,X),B._input=j}var G=n.getComponentMethod(\"rangeslider\",\"handleDefaults\"),Y=n.getComponentMethod(\"rangeselector\",\"handleDefaults\");for(m=0;m<P.length;m++)R=P[m],j=t[R],B=e[R],G(t,e,R),\"date\"===B.type&&Y(j,B,e,E,B.calendar),g(\"fixedrange\");for(m=0;m<E.length;m++){R=E[m],j=t[R],B=e[R];var Z=e[h.id2name(B.anchor)];g(\"fixedrange\",Z&&Z.rangeslider&&Z.rangeslider.visible)}e._axisConstraintGroups=[];var W=H.x.concat(H.y);for(m=0;m<N.length;m++)R=N[m],F=R.charAt(0),j=t[R],B=e[R],f(j,B,g,W,e)}},{\"../../components/color\":25,\"../../lib\":136,\"../../registry\":206,\"../layout_attributes\":197,\"./axis_defaults\":173,\"./axis_ids\":174,\"./constants\":176,\"./constraint_defaults\":177,\"./layout_attributes\":182,\"./position_defaults\":185,\"./type_defaults\":193}],184:[function(t,e,r){\"use strict\";function n(t,e,r){var n,o,i,l,s,c=[],u=r.map(function(e){return e[t]}),f=a.bisector(e).left;for(n=0;n<u.length;n++)for(i=u[n],o=0;o<i.length;o++)null!==(l=i[o])&&void 0!==l&&((s=f(c,l))<c.length&&c[s]===l||c.splice(s,0,l));return c}var a=t(\"d3\");e.exports=function(t,e,r,o){switch(e){case\"array\":return Array.isArray(r)?r.slice():[];case\"category ascending\":return n(t,a.ascending,o);case\"category descending\":return n(t,a.descending,o);case\"trace\":default:return[]}}},{d3:7}],185:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\");e.exports=function(t,e,r,o){var i=o.counterAxes||[],l=o.overlayableAxes||[],s=o.letter;\"free\"===a.coerce(t,e,{anchor:{valType:\"enumerated\",values:[\"free\"].concat(i),dflt:n(t.position)?\"free\":i[0]||\"free\"}},\"anchor\")&&r(\"position\"),a.coerce(t,e,{side:{valType:\"enumerated\",values:\"x\"===s?[\"bottom\",\"top\"]:[\"left\",\"right\"],dflt:\"x\"===s?\"bottom\":\"left\"}},\"side\");var c=!1;if(l.length&&(c=a.coerce(t,e,{overlaying:{valType:\"enumerated\",values:[!1].concat(l),dflt:!1}},\"overlaying\")),!c){var u=r(\"domain\");u[0]>u[1]-.01&&(e.domain=[0,1]),a.noneOrAll(t.domain,e.domain,[0,1])}return e}},{\"../../lib\":136,\"fast-isnumeric\":10}],186:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){void 0===r&&(r=.5);var n=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=n[0]+(n[1]-n[0])*r,o=(a-n[0])*e;t.range=t._input.range=[t.l2r(a-o),t.l2r(a+o)]}},{}],187:[function(t,e,r){\"use strict\";function n(t){return t._id}var a=t(\"../../lib/polygon\"),o=t(\"../../components/color\"),i=t(\"./axes\"),l=t(\"./constants\"),s=a.filter,c=a.tester,u=l.MINSELECT;e.exports=function(t,e,r,a,f){function d(t){var e=\"y\"===t._id.charAt(0)?1:0;return function(r){return t.p2d(r[e])}}function h(t,e){return t-e}var p,g=a.gd._fullLayout._zoomlayer,v=a.element.getBoundingClientRect(),m=a.plotinfo.xaxis._offset,y=a.plotinfo.yaxis._offset,x=e-v.left,b=r-v.top,_=x,w=b,k=\"M\"+x+\",\"+b,M=a.xaxes[0]._length,A=a.yaxes[0]._length,T=a.xaxes.map(n),L=a.yaxes.map(n),C=a.xaxes.concat(a.yaxes);\"lasso\"===f&&(p=s([[x,b]],l.BENDPX));var S=g.selectAll(\"path.select-outline\").data([1,2]);S.enter().append(\"path\").attr(\"class\",function(t){return\"select-outline select-outline-\"+t}).attr(\"transform\",\"translate(\"+m+\", \"+y+\")\").attr(\"d\",k+\"Z\");var z,O,D,P,E,N=g.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:o.background,stroke:o.defaultLine,\"stroke-width\":1}).attr(\"transform\",\"translate(\"+m+\", \"+y+\")\").attr(\"d\",\"M0,0Z\"),I=[],R=a.gd,F=[];for(z=0;z<R.calcdata.length;z++)if(O=R.calcdata[z],D=O[0].trace,D._module&&D._module.selectPoints)if(a.subplot){if(D.subplot!==a.subplot)continue;I.push({selectPoints:D._module.selectPoints,cd:O,xaxis:a.xaxes[0],yaxis:a.yaxes[0]})}else{if(T.indexOf(D.xaxis)===-1)continue;if(L.indexOf(D.yaxis)===-1)continue;I.push({selectPoints:D._module.selectPoints,cd:O,xaxis:i.getFromId(R,D.xaxis),yaxis:i.getFromId(R,D.yaxis)})}a.moveFn=function(t,e){var r,n;_=Math.max(0,Math.min(M,t+x)),w=Math.max(0,Math.min(A,e+b));var o=Math.abs(_-x),i=Math.abs(w-b);for(\"select\"===f?(i<Math.min(.6*o,u)?(r=c([[x,0],[x,A],[_,A],[_,0]]),N.attr(\"d\",\"M\"+r.xmin+\",\"+(b-u)+\"h-4v\"+2*u+\"h4ZM\"+(r.xmax-1)+\",\"+(b-u)+\"h4v\"+2*u+\"h-4Z\")):o<Math.min(.6*i,u)?(r=c([[0,b],[0,w],[M,w],[M,b]]),N.attr(\"d\",\"M\"+(x-u)+\",\"+r.ymin+\"v-4h\"+2*u+\"v4ZM\"+(x-u)+\",\"+(r.ymax-1)+\"v4h\"+2*u+\"v-4Z\")):(r=c([[x,b],[x,w],[_,w],[_,b]]),N.attr(\"d\",\"M0,0Z\")),S.attr(\"d\",\"M\"+r.xmin+\",\"+r.ymin+\"H\"+(r.xmax-1)+\"V\"+(r.ymax-1)+\"H\"+r.xmin+\"Z\")):\"lasso\"===f&&(p.addPt([_,w]),r=c(p.filtered),S.attr(\"d\",\"M\"+p.filtered.join(\"L\")+\"Z\")),F=[],z=0;z<I.length;z++)P=I[z],[].push.apply(F,P.selectPoints(P,r));if(E={points:F},\"select\"===f){var l,s=E.range={};for(z=0;z<C.length;z++)n=C[z],l=n._id.charAt(0),s[n._id]=[n.p2d(r[l+\"min\"]),n.p2d(r[l+\"max\"])].sort(h)}else{var g=E.lassoPoints={};for(z=0;z<C.length;z++)n=C[z],g[n._id]=p.filtered.map(d(n))}a.gd.emit(\"plotly_selecting\",E)},a.doneFn=function(t,e){if(N.remove(),t||2!==e)a.gd.emit(\"plotly_selected\",E);else{for(S.remove(),z=0;z<I.length;z++)P=I[z],P.selectPoints(P,!1);R.emit(\"plotly_deselect\",null)}}}},{\"../../components/color\":25,\"../../lib/polygon\":146,\"./axes\":171,\"./constants\":176}],188:[function(t,e,r){\"use strict\";function n(t){return Math.pow(10,t)}function a(t){return i(t)?(t=Number(t),t<-d||t>d?h:i(t)?Number(t):h):h}var o=t(\"d3\"),i=t(\"fast-isnumeric\"),l=t(\"../../lib\"),s=l.cleanNumber,c=l.ms2DateTime,u=l.dateTime2ms,f=t(\"../../constants/numerical\"),d=f.FP_SAFE,h=f.BADNUM,p=t(\"./constants\"),g=t(\"./axis_ids\");e.exports=function(t,e){function r(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],a=t.range[1];return.5*(n+a-3*w*Math.abs(n-a))}return h}function f(e,r,n){var a=u(e,n||t.calendar);if(a===h){if(!i(e))return h;a=u(new Date(+e))}return a}function v(e,r,n){return c(e,r,n||t.calendar)}function m(e){return t._categories[Math.round(e)]}function y(e){if(null!==e&&void 0!==e){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return h}function x(e){if(t._categoriesMap){var r=t._categoriesMap[e];if(void 0!==r)return r}if(\"number\"==typeof e)return e}function b(e){return i(e)?o.round(t._b+t._m*e,2):h}function _(e){return(e-t._b)/t._m}e=e||{};var w=10;t.c2l=\"log\"===t.type?r:a,t.l2c=\"log\"===t.type?n:a,t.l2p=b,t.p2l=_,t.c2p=\"log\"===t.type?function(t,e){return b(r(t,e))}:b,t.p2c=\"log\"===t.type?function(t){return n(_(t))}:_,[\"linear\",\"-\"].indexOf(t.type)!==-1?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=s,t.c2d=t.c2r=t.l2d=t.l2r=a,t.d2p=t.r2p=function(t){return b(s(t))},t.p2d=t.p2r=_):\"log\"===t.type?(t.d2r=t.d2l=function(t,e){return r(s(t),e)},t.r2d=t.r2c=function(t){return n(s(t))},t.d2c=t.r2l=s,t.c2d=t.l2r=a,t.c2r=r,t.l2d=n,t.d2p=function(e,r){return b(t.d2r(e,r))},t.p2d=function(t){return n(_(t))},t.r2p=function(t){return b(s(t))},t.p2r=_):\"date\"===t.type?(t.d2r=t.r2d=l.identity,t.d2c=t.r2c=t.d2l=t.r2l=f,t.c2d=t.c2r=t.l2d=t.l2r=v,t.d2p=t.r2p=function(t,e,r){return b(f(t,0,r))},t.p2d=t.p2r=function(t,e,r){return v(_(t),e,r)}):\"category\"===t.type&&(t.d2r=t.d2c=t.d2l=y,t.r2d=t.c2d=t.l2d=m,t.d2l_noadd=x,t.r2l=t.l2r=t.r2c=t.c2r=a,t.d2p=function(t){return b(x(t))},t.p2d=function(t){return m(_(t))},t.r2p=b,t.p2r=_),t.fraction2r=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return t.l2r(r+e*(n-r))},t.r2fraction=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return(t.r2l(e)-r)/(n-r)},t.cleanRange=function(e){e||(e=\"range\");var r,n,a=l.nestedProperty(t,e).get(),o=(t._id||\"x\").charAt(0);if(n=\"date\"===t.type?l.dfltRange(t.calendar):\"y\"===o?p.DFLTRANGEY:p.DFLTRANGEX,n=n.slice(),!a||2!==a.length)return void l.nestedProperty(t,e).set(n);for(\"date\"===t.type&&(a[0]=l.cleanDate(a[0],h,t.calendar),a[1]=l.cleanDate(a[1],h,t.calendar)),r=0;r<2;r++)if(\"date\"===t.type){if(!l.isDateTime(a[r],t.calendar)){t[e]=n;break}if(t.r2l(a[0])===t.r2l(a[1])){var s=l.constrain(t.r2l(a[0]),l.MIN_MS+1e3,l.MAX_MS-1e3);a[0]=t.l2r(s-1e3),a[1]=t.l2r(s+1e3);break}}else{if(!i(a[r])){if(!i(a[1-r])){t[e]=n;break}a[r]=a[1-r]*(r?10:.1)}if(a[r]<-d?a[r]=-d:a[r]>d&&(a[r]=d),a[0]===a[1]){var c=Math.max(1,Math.abs(1e-6*a[0]));a[0]-=c,a[1]+=c}}},t.setScale=function(r){var n=e._size,a=t._id.charAt(0);if(t._categories||(t._categories=[]),t._categoriesMap||(t._categoriesMap={}),t.overlaying){var o=g.getFromId({_fullLayout:e},t.overlaying);t.domain=o.domain}var i=r&&t._r?\"_r\":\"range\",s=t.calendar;t.cleanRange(i);var c=t.r2l(t[i][0],s),u=t.r2l(t[i][1],s);if(\"y\"===a?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c),!isFinite(t._m)||!isFinite(t._b))throw l.notifier(\"Something went wrong with axis scaling\",\"long\"),e._replotting=!1,new Error(\"axis scaling\")},t.makeCalcdata=function(e,r){var n,a,o,i=\"date\"===t.type&&e[r+\"calendar\"];if(r in e)for(n=e[r],a=new Array(n.length),o=0;o<n.length;o++)a[o]=t.d2c(n[o],0,i);else{var l=r+\"0\"in e?t.d2c(e[r+\"0\"],0,i):0,s=e[\"d\"+r]?Number(e[\"d\"+r]):1;for(n=e[{x:\"y\",y:\"x\"}[r]],a=new Array(n.length),o=0;o<n.length;o++)a[o]=l+o*s}return a},t.isValidRange=function(e){return Array.isArray(e)&&2===e.length&&i(t.r2l(e[0]))&&i(t.r2l(e[1]))},t._min=[],t._max=[],t._separators=e.separators,delete t._minDtick,delete t._forceTick0}},{\"../../constants/numerical\":122,\"../../lib\":136,\"./axis_ids\":174,\"./constants\":176,d3:7,\"fast-isnumeric\":10}],189:[function(t,e,r){\"use strict\";function n(t){var e=[\"showexponent\",\"showtickprefix\",\"showticksuffix\"],r=e.filter(function(e){return void 0!==t[e]}),n=function(e){return t[e]===t[r[0]]};if(r.every(n)||1===r.length)return t[r[0]]}var a=t(\"../../lib\");e.exports=function(t,e,r,o,i){var l=n(t);if(r(\"tickprefix\")&&r(\"showtickprefix\",l),r(\"ticksuffix\")&&r(\"showticksuffix\",l),r(\"showticklabels\")){var s=i.font||{},c=e.color===t.color?e.color:s.color;a.coerceFont(r,\"tickfont\",{family:s.family,size:s.size,color:c}),r(\"tickangle\"),\"category\"!==o&&(r(\"tickformat\")||\"date\"===o||(r(\"showexponent\",l),r(\"exponentformat\"),r(\"separatethousands\")))}\"category\"===o||i.noHover||r(\"hoverformat\")}},{\"../../lib\":136}],190:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./layout_attributes\");e.exports=function(t,e,r,o){var i=n.coerce2(t,e,a,\"ticklen\"),l=n.coerce2(t,e,a,\"tickwidth\"),s=n.coerce2(t,e,a,\"tickcolor\",e.color);r(\"ticks\",o.outerTicks||i||l||s?\"outside\":\"\")||(delete e.ticklen,delete e.tickwidth,delete e.tickcolor)}},{\"../../lib\":136,\"./layout_attributes\":182}],191:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../../constants/numerical\").ONEDAY;e.exports=function(t,e,r,i){var l=\"auto\";\"array\"!==t.tickmode||\"log\"!==i&&\"date\"!==i||(t.tickmode=\"auto\"),Array.isArray(t.tickvals)?l=\"array\":t.dtick&&(l=\"linear\");var s=r(\"tickmode\",l);if(\"auto\"===s)r(\"nticks\");else if(\"linear\"===s){var c=\"date\"===i?o:1,u=r(\"dtick\",c);if(n(u))e.dtick=u>0?Number(u):c;else if(\"string\"!=typeof u)e.dtick=c;else{var f=u.charAt(0),d=u.substr(1);d=n(d)?Number(d):0,(d<=0||!(\"date\"===i&&\"M\"===f&&d===Math.round(d)||\"log\"===i&&\"L\"===f||\"log\"===i&&\"D\"===f&&(1===d||2===d)))&&(e.dtick=c)}var h=\"date\"===i?a.dateTick0(e.calendar):0,p=r(\"tick0\",h);\"date\"===i?e.tick0=a.cleanDate(p,h):n(p)&&\"D1\"!==u&&\"D2\"!==u?e.tick0=Number(p):e.tick0=h}else{var g=r(\"tickvals\");void 0===g?e.tickmode=\"auto\":r(\"ticktext\")}}},{\"../../constants/numerical\":122,\"../../lib\":136,\"fast-isnumeric\":10}],192:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../plotly\"),o=t(\"../../registry\"),i=t(\"../../components/drawing\"),l=t(\"./axes\"),s=/((x|y)([2-9]|[1-9][0-9]+)?)axis$/;e.exports=function(t,e,r,c){function u(e,r){function n(e,r){for(a=0;a<e.length;a++){var n=e[a];i.indexOf(n.xref)===-1&&i.indexOf(n.yref)===-1||r(t,a)}}var a,i=[];for(i=[e._id,r._id],a=0;a<i.length;a++)l.doTicks(t,i[a],!0);n(v.annotations||[],o.getComponentMethod(\"annotations\",\"drawOne\")),n(v.shapes||[],o.getComponentMethod(\"shapes\",\"drawOne\")),n(v.images||[],o.getComponentMethod(\"images\",\"draw\"))}function f(t){var e=t.xaxis,r=t.yaxis;v._defs.selectAll(\"#\"+t.clipId).call(i.setTranslate,0,0).call(i.setScale,1,1),t.plot.call(i.setTranslate,e._offset,r._offset).call(i.setScale,1,1).select(\".scatterlayer\").selectAll(\".points\").selectAll(\".point\").call(i.setPointGroupScale,1,1),t.plot.select(\".scatterlayer\").selectAll(\".points\").selectAll(\".textpoint\").call(i.setTextPointsScale,1,1)}function d(e,r){var n,a,o,l=y[e.xaxis._id],s=y[e.yaxis._id],c=[];if(l){n=t._fullLayout[l.axisName],a=n._r,o=l.to,c[0]=(a[0]*(1-r)+r*o[0]-a[0])/(a[1]-a[0])*e.xaxis._length;var f=a[1]-a[0],d=o[1]-o[0];n.range[0]=a[0]*(1-r)+r*o[0],n.range[1]=a[1]*(1-r)+r*o[1],c[2]=e.xaxis._length*(1-r+r*d/f)}else c[0]=0,c[2]=e.xaxis._length;if(s){n=t._fullLayout[s.axisName],a=n._r,o=s.to,c[1]=(a[1]*(1-r)+r*o[1]-a[1])/(a[0]-a[1])*e.yaxis._length;var h=a[1]-a[0],p=o[1]-o[0];n.range[0]=a[0]*(1-r)+r*o[0],n.range[1]=a[1]*(1-r)+r*o[1],c[3]=e.yaxis._length*(1-r+r*p/h)}else c[1]=0,c[3]=e.yaxis._length;u(e.xaxis,e.yaxis);var g=e.xaxis,m=e.yaxis,x=!!l,b=!!s,_=x?g._length/c[2]:1,w=b?m._length/c[3]:1,k=x?c[0]:0,M=b?c[1]:0,A=x?c[0]/c[2]*g._length:0,T=b?c[1]/c[3]*m._length:0,L=g._offset-A,C=m._offset-T;v._defs.selectAll(\"#\"+e.clipId).call(i.setTranslate,k,M).call(i.setScale,1/_,1/w),e.plot.call(i.setTranslate,L,C).call(i.setScale,_,w).selectAll(\".points\").selectAll(\".point\").call(i.setPointGroupScale,1/_,1/w),e.plot.selectAll(\".points\").selectAll(\".textpoint\").call(i.setTextPointsScale,1/_,1/w)}function h(){for(var e={},r=0;r<x.length;r++){var n=t._fullLayout[y[x[r]].axisName],o=y[x[r]].to;e[n._name+\".range[0]\"]=o[0],e[n._name+\".range[1]\"]=o[1],n.range=o.slice()}return _&&_(),a.relayout(t,e).then(function(){for(var t=0;t<b.length;t++)f(b[t])})}function p(){for(var e={},r=0;r<x.length;r++){var n=t._fullLayout[x[r]+\"axis\"];e[n._name+\".range[0]\"]=n.range[0],e[n._name+\".range[1]\"]=n.range[1],n.range=n._r.slice()}\n",
|
|
"return a.relayout(t,e).then(function(){for(var t=0;t<b.length;t++)f(b[t])})}function g(){k=Date.now();for(var t=Math.min(1,(k-w)/r.duration),e=A(t),n=0;n<b.length;n++)d(b[n],e);k-w>r.duration?(h(),M=window.cancelAnimationFrame(g)):M=window.requestAnimationFrame(g)}var v=t._fullLayout,m=[],y=function(t){var e,r,n,a,o,i={};for(e in t)if(r=e.split(\".\"),n=r[0].match(s)){var l=n[1],c=l+\"axis\";if(a=v[c],o={},Array.isArray(t[e])?o.to=t[e].slice(0):Array.isArray(t[e].range)&&(o.to=t[e].range.slice(0)),!o.to)continue;o.axisName=c,o.length=a._length,m.push(l),i[l]=o}return i}(e),x=Object.keys(y),b=function(t,e,r){var n,a,o,i=t._plots,l=[];for(n in i){var s=i[n];if(l.indexOf(s)===-1){var c=s.xaxis._id,u=s.yaxis._id,f=s.xaxis.range,d=s.yaxis.range;s.xaxis._r=s.xaxis.range.slice(),s.yaxis._r=s.yaxis.range.slice(),a=r[c]?r[c].to:f,o=r[u]?r[u].to:d,f[0]===a[0]&&f[1]===a[1]&&d[0]===o[0]&&d[1]===o[1]||e.indexOf(c)===-1&&e.indexOf(u)===-1||l.push(s)}}return l}(v,x,y);if(!b.length)return!1;var _;c&&(_=c());var w,k,M,A=n.ease(r.easing);return t._transitionData._interruptCallbacks.push(function(){return window.cancelAnimationFrame(M),M=null,p()}),w=Date.now(),M=window.requestAnimationFrame(g),Promise.resolve()}},{\"../../components/drawing\":49,\"../../plotly\":166,\"../../registry\":206,\"./axes\":171,d3:7}],193:[function(t,e,r){\"use strict\";function n(t,e){if(\"-\"===t.type){var r=t._id,n=r.charAt(0);r.indexOf(\"scene\")!==-1&&(r=n);var c=a(e,r,n);if(c){if(\"histogram\"===c.type&&n==={v:\"y\",h:\"x\"}[c.orientation||\"v\"])return void(t.type=\"linear\");var u=n+\"calendar\",f=c[u];if(i(c,n)){for(var d,h=o(c),p=[],g=0;g<e.length;g++)d=e[g],l.traceIs(d,\"box\")&&(d[n+\"axis\"]||n)===r&&(void 0!==d[h]?p.push(d[h][0]):void 0!==d.name?p.push(d.name):p.push(\"text\"),d[u]!==f&&(f=void 0));t.type=s(p,f)}else t.type=s(c[n]||[c[n+\"0\"]],f)}}}function a(t,e,r){for(var n=0;n<t.length;n++){var a=t[n];if((a[r+\"axis\"]||r)===e){if(i(a,r))return a;if((a[r]||[]).length||a[r+\"0\"])return a}}}function o(t){return{v:\"x\",h:\"y\"}[t.orientation||\"v\"]}function i(t,e){var r=o(t),n=l.traceIs(t,\"box\"),a=l.traceIs(t._fullInput||{},\"candlestick\");return n&&!a&&e===r&&void 0===t[r]&&void 0===t[r+\"0\"]}var l=t(\"../../registry\"),s=t(\"./axis_autotype\"),c=t(\"./axis_ids\").name2id;e.exports=function(t,e,r,a,o){o&&(e._name=o,e._id=c(o)),\"-\"===r(\"type\")&&(n(e,a),\"-\"===e.type?e.type=\"linear\":t.type=e.type)}},{\"../../registry\":206,\"./axis_autotype\":172,\"./axis_ids\":174}],194:[function(t,e,r){\"use strict\";function n(t,e,r){var n,a,o,i=!1;if(\"data\"===e.type)n=t._fullData[null!==e.traces?e.traces[0]:0];else{if(\"layout\"!==e.type)return!1;n=t._fullLayout}return a=c.nestedProperty(n,e.prop).get(),o=r[e.type]=r[e.type]||{},o.hasOwnProperty(e.prop)&&o[e.prop]!==a&&(i=!0),o[e.prop]=a,{changed:i,value:a}}function a(t,e){return Array.isArray(e[0])&&1===e[0].length&&[\"string\",\"number\"].indexOf(typeof e[0][0])!==-1?[{type:\"layout\",prop:\"_currentFrame\",value:e[0][0].toString()}]:[]}function o(t,e){var r=[],n=e[0],a={};if(\"string\"==typeof n)a[n]=e[1];else{if(!c.isPlainObject(n))return r;a=n}return l(a,function(t,e,n){r.push({type:\"layout\",prop:t,value:n})},\"\",0),r}function i(t,e){var r,n,a,o,i=[];if(n=e[0],a=e[1],r=e[2],o={},\"string\"==typeof n)o[n]=a;else{if(!c.isPlainObject(n))return i;o=n,void 0===r&&(r=a)}return void 0===r&&(r=null),l(o,function(e,n,a){var o;if(Array.isArray(a)){var l=Math.min(a.length,t.data.length);r&&(l=Math.min(l,r.length)),o=[];for(var s=0;s<l;s++)o[s]=r?r[s]:s}else o=r?r.slice(0):null;if(null===o)Array.isArray(a)&&(a=a[0]);else if(Array.isArray(o)){if(!Array.isArray(a)){var c=a;a=[];for(var u=0;u<o.length;u++)a[u]=c}a.length=Math.min(o.length,a.length)}i.push({type:\"data\",prop:e,traces:o,value:a})},\"\",0),i}function l(t,e,r,n){Object.keys(t).forEach(function(a){var o=t[a];if(\"_\"!==a[0]){var i=r+(n>0?\".\":\"\")+a;c.isPlainObject(o)?l(o,e,i,n+1):e(i,a,o)}})}var s=t(\"../plotly\"),c=t(\"../lib\");r.manageCommandObserver=function(t,e,a,o){var i={},l=!0;e&&e._commandObserver&&(i=e._commandObserver),i.cache||(i.cache={}),i.lookupTable={};var s=r.hasSimpleAPICommandBindings(t,a,i.lookupTable);if(e&&e._commandObserver){if(s)return i;if(e._commandObserver.remove)return e._commandObserver.remove(),e._commandObserver=null,i}if(s){n(t,s,i.cache),i.check=function(){if(l){var e=n(t,s,i.cache);return e.changed&&o&&void 0!==i.lookupTable[e.value]&&(i.disable(),Promise.resolve(o({value:e.value,type:s.type,prop:s.prop,traces:s.traces,index:i.lookupTable[e.value]})).then(i.enable,i.enable)),e.changed}};for(var u=[\"plotly_relayout\",\"plotly_redraw\",\"plotly_restyle\",\"plotly_update\",\"plotly_animatingframe\",\"plotly_afterplot\"],f=0;f<u.length;f++)t._internalOn(u[f],i.check);i.remove=function(){for(var e=0;e<u.length;e++)t._removeInternalListener(u[e],i.check)}}else c.warn(\"Unable to automatically bind plot updates to API command\"),i.lookupTable={},i.remove=function(){};return i.disable=function(){l=!1},i.enable=function(){l=!0},e&&(e._commandObserver=i),i},r.hasSimpleAPICommandBindings=function(t,e,n){var a,o,i=e.length;for(a=0;a<i;a++){var l,s=e[a],c=s.method,u=s.args;if(Array.isArray(u)||(u=[]),!c)return!1;var f=r.computeAPICommandBindings(t,c,u);if(1!==f.length)return!1;if(o){if(l=f[0],l.type!==o.type)return!1;if(l.prop!==o.prop)return!1;if(Array.isArray(o.traces)){if(!Array.isArray(l.traces))return!1;l.traces.sort();for(var d=0;d<o.traces.length;d++)if(o.traces[d]!==l.traces[d])return!1}else if(l.prop!==o.prop)return!1}else o=f[0],Array.isArray(o.traces)&&o.traces.sort();l=f[0];var h=l.value;if(Array.isArray(h)){if(1!==h.length)return!1;h=h[0]}n&&(n[h]=a)}return o},r.executeAPICommand=function(t,e,r){var n=s[e],a=[t];Array.isArray(r)||(r=[]);for(var o=0;o<r.length;o++)a.push(r[o]);return n.apply(null,a).catch(function(t){return c.warn(\"API call to Plotly.\"+e+\" rejected.\",t),Promise.reject(t)})},r.computeAPICommandBindings=function(t,e,r){var n;switch(Array.isArray(r)||(r=[]),e){case\"restyle\":n=i(t,r);break;case\"relayout\":n=o(t,r);break;case\"update\":n=i(t,[r[0],r[2]]).concat(o(t,[r[1]]));break;case\"animate\":n=a(t,r);break;default:n=[]}return n}},{\"../lib\":136,\"../plotly\":166}],195:[function(t,e,r){\"use strict\";e.exports={family:{valType:\"string\",noBlank:!0,strict:!0},size:{valType:\"number\",min:1},color:{valType:\"color\"}}},{}],196:[function(t,e,r){\"use strict\";e.exports={_isLinkedToArray:\"frames_entry\",group:{valType:\"string\"},name:{valType:\"string\"},traces:{valType:\"any\"},baseframe:{valType:\"string\"},data:{valType:\"any\"},layout:{valType:\"any\"}}},{}],197:[function(t,e,r){\"use strict\";var n=t(\"../lib\"),a=n.extendFlat,o=t(\"./font_attributes\"),i=t(\"../components/color/attributes\");e.exports={font:{family:a({},o.family,{dflt:'\"Open Sans\", verdana, arial, sans-serif'}),size:a({},o.size,{dflt:12}),color:a({},o.color,{dflt:i.defaultLine})},title:{valType:\"string\",dflt:\"Click to enter Plot title\"},titlefont:a({},o,{}),autosize:{valType:\"boolean\",dflt:!1},width:{valType:\"number\",min:10,dflt:700},height:{valType:\"number\",min:10,dflt:450},margin:{l:{valType:\"number\",min:0,dflt:80},r:{valType:\"number\",min:0,dflt:80},t:{valType:\"number\",min:0,dflt:100},b:{valType:\"number\",min:0,dflt:80},pad:{valType:\"number\",min:0,dflt:0},autoexpand:{valType:\"boolean\",dflt:!0}},paper_bgcolor:{valType:\"color\",dflt:i.background},plot_bgcolor:{valType:\"color\",dflt:i.background},separators:{valType:\"string\",dflt:\".,\"},hidesources:{valType:\"boolean\",dflt:!1},smith:{valType:\"enumerated\",values:[!1],dflt:!1},showlegend:{valType:\"boolean\"}}},{\"../components/color/attributes\":24,\"../lib\":136,\"./font_attributes\":195}],198:[function(t,e,r){\"use strict\";e.exports={t:{valType:\"number\",dflt:0},r:{valType:\"number\",dflt:0},b:{valType:\"number\",dflt:0},l:{valType:\"number\",dflt:0}}},{}],199:[function(t,e,r){\"use strict\";function n(t,e){e.text(\"\");var r=e.append(\"a\").attr({\"xlink:xlink:href\":\"#\",class:\"link--impt link--embedview\",\"font-weight\":\"bold\"}).text(t._context.linkText+\" \"+String.fromCharCode(187));if(t._context.sendData)r.on(\"click\",function(){p.sendDataToCloud(t)});else{var n=window.location.pathname.split(\"/\"),a=window.location.search;r.attr({\"xlink:xlink:show\":\"new\",\"xlink:xlink:href\":\"/\"+n[2].split(\".\")[0]+\"/\"+n[1]+a})}}function a(t,e,r,n){for(var a=t.transforms,o=[t],i=0;i<a.length;i++){var l=a[i],s=x[l.type];s&&s.transform&&(o=s.transform(o,{transform:l,fullTrace:t,fullData:e,layout:r,fullLayout:n,transformIndex:i}))}return o}function o(t){var e,r={left:0,right:0,bottom:0,top:0};if(t)for(e in t)t.hasOwnProperty(e)&&(r.left+=t[e].left||0,r.right+=t[e].right||0,r.bottom+=t[e].bottom||0,r.top+=t[e].top||0);return r}function i(t){for(var e=!1,r=0;r<t.length;r++){t[r]._categories=t[r]._initialCategories.slice(),t[r]._categoriesMap={};for(var n=0;n<t[r]._categories.length;n++)t[r]._categoriesMap[t[r]._categories[n]]=n;\"category\"===t[r].type&&(e=!0)}return e}var l=t(\"d3\"),s=t(\"fast-isnumeric\"),c=t(\"../plotly\"),u=t(\"../registry\"),f=t(\"../lib\"),d=t(\"../components/color\"),h=t(\"../constants/numerical\").BADNUM,p=e.exports={},g=t(\"./animation_attributes\"),v=t(\"./frame_attributes\"),m=f.relinkPrivateKeys;f.extendFlat(p,u),p.attributes=t(\"./attributes\"),p.attributes.type.values=p.allTypes,p.fontAttrs=t(\"./font_attributes\"),p.layoutAttributes=t(\"./layout_attributes\"),p.fontWeight=\"normal\";var y=p.subplotsRegistry,x=p.transformsRegistry,b=t(\"../components/errorbars\"),_=t(\"./command\");p.executeAPICommand=_.executeAPICommand,p.computeAPICommandBindings=_.computeAPICommandBindings,p.manageCommandObserver=_.manageCommandObserver,p.hasSimpleAPICommandBindings=_.hasSimpleAPICommandBindings,p.findSubplotIds=function(t,e){var r=[];if(!p.subplotsRegistry[e])return r;for(var n=p.subplotsRegistry[e].attr,a=0;a<t.length;a++){var o=t[a];p.traceIs(o,e)&&r.indexOf(o[n])===-1&&r.push(o[n])}return r},p.getSubplotIds=function(t,e){var r=p.subplotsRegistry[e];if(!r)return[];if(!(\"cartesian\"!==e||t._has&&t._has(\"cartesian\")))return[];if(!(\"gl2d\"!==e||t._has&&t._has(\"gl2d\")))return[];if(\"cartesian\"===e||\"gl2d\"===e)return Object.keys(t._plots||{});for(var n=r.idRegex,a=Object.keys(t),o=[],i=0;i<a.length;i++){var l=a[i];n.test(l)&&o.push(l)}var s=r.idRoot.length;return o.sort(function(t,e){return+(t.substr(s)||1)-+(e.substr(s)||1)}),o},p.getSubplotData=function(t,e,r){if(!p.subplotsRegistry[e])return[];for(var n,a=p.subplotsRegistry[e].attr,o=[],i=0;i<t.length;i++)if(n=t[i],\"gl2d\"===e&&p.traceIs(n,\"gl2d\")){var l=c.Axes.subplotMatch,s=\"x\"+r.match(l)[1],u=\"y\"+r.match(l)[2];n[a[0]]===s&&n[a[1]]===u&&o.push(n)}else n[a]===r&&o.push(n);return o},p.getSubplotCalcData=function(t,e,r){if(!p.subplotsRegistry[e])return[];for(var n=p.subplotsRegistry[e].attr,a=[],o=0;o<t.length;o++){var i=t[o];i[0].trace[n]===r&&a.push(i)}return a},p.redrawText=function(t){if(!(t.data&&t.data[0]&&t.data[0].r))return new Promise(function(e){setTimeout(function(){u.getComponentMethod(\"annotations\",\"draw\")(t),u.getComponentMethod(\"legend\",\"draw\")(t),(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()}),e(p.previousPromises(t))},300)})},p.resize=function(t){return new Promise(function(e,r){t&&\"none\"!==l.select(t).style(\"display\")||r(new Error(\"Resize must be passed a plot div element.\")),t._redrawTimer&&clearTimeout(t._redrawTimer),t._redrawTimer=setTimeout(function(){if(t.layout.width&&t.layout.height)return void e(t);delete t.layout.width,delete t.layout.height;var r=t.changed;t.autoplay=!0,c.relayout(t,{autosize:!0}).then(function(){t.changed=r,e(t)})},100)})},p.previousPromises=function(t){if((t._promises||[]).length)return Promise.all(t._promises).then(function(){t._promises=[]})},p.addLinks=function(t){if(t._context.showLink||t._context.showSources){var e=t._fullLayout,r=e._paper.selectAll(\"text.js-plot-link-container\").data([0]);r.enter().append(\"text\").classed(\"js-plot-link-container\",!0).style({\"font-family\":'\"Open Sans\", Arial, sans-serif',\"font-size\":\"12px\",fill:d.defaultLine,\"pointer-events\":\"all\"}).each(function(){var t=l.select(this);t.append(\"tspan\").classed(\"js-link-to-tool\",!0),t.append(\"tspan\").classed(\"js-link-spacer\",!0),t.append(\"tspan\").classed(\"js-sourcelinks\",!0)});var a=r.node(),o={y:e._paper.attr(\"height\")-9};document.body.contains(a)&&a.getComputedTextLength()>=e.width-20?(o[\"text-anchor\"]=\"start\",o.x=5):(o[\"text-anchor\"]=\"end\",o.x=e._paper.attr(\"width\")-7),r.attr(o);var i=r.select(\".js-link-to-tool\"),s=r.select(\".js-link-spacer\"),c=r.select(\".js-sourcelinks\");t._context.showSources&&t._context.showSources(t),t._context.showLink&&n(t,i),s.text(i.text()&&c.text()?\" - \":\"\")}},p.sendDataToCloud=function(t){t.emit(\"plotly_beforeexport\");var e=window.PLOTLYENV&&window.PLOTLYENV.BASE_URL||\"https://plot.ly\",r=l.select(t).append(\"div\").attr(\"id\",\"hiddenform\").style(\"display\",\"none\"),n=r.append(\"form\").attr({action:e+\"/external\",method:\"post\",target:\"_blank\"});return n.append(\"input\").attr({type:\"text\",name:\"data\"}).node().value=p.graphJson(t,!1,\"keepdata\"),n.node().submit(),r.remove(),t.emit(\"plotly_afterexport\"),!1},p.supplyDefaults=function(t){var e,r=t._fullLayout||{},n=t._fullLayout={},a=t.layout||{},o=t._fullData||[],i=t._fullData=[],l=t.data||[];if(t._transitionData||p.createTransitionData(t),r._initialAutoSizeIsDone){var s=r.width,u=r.height;p.supplyLayoutGlobalDefaults(a,n),a.width||(n.width=s),a.height||(n.height=u)}else{p.supplyLayoutGlobalDefaults(a,n);var f=!a.width||!a.height,d=n.autosize,h=t._context&&t._context.autosizable;f&&(d||h)?p.plotAutoSize(t,a,n):f&&p.sanitizeMargins(t),!d&&f&&(a.width=n.width,a.height=n.height)}n._initialAutoSizeIsDone=!0,n._dataLength=l.length,n._globalTransforms=(t._context||{}).globalTransforms,p.supplyDataDefaults(l,i,a,n),n._has=p._hasPlotType.bind(n);var g=n._modules;for(e=0;e<g.length;e++){var v=g[e];v.cleanData&&v.cleanData(i)}if(o.length===l.length)for(e=0;e<i.length;e++)m(i[e],o[e]);p.supplyLayoutModuleDefaults(a,n,i,t._transitionData),n._hasCartesian=n._has(\"cartesian\"),n._hasGeo=n._has(\"geo\"),n._hasGL3D=n._has(\"gl3d\"),n._hasGL2D=n._has(\"gl2d\"),n._hasTernary=n._has(\"ternary\"),n._hasPie=n._has(\"pie\"),p.cleanPlot(i,n,o,r),p.linkSubplots(i,n,o,r),m(n,r),p.doAutoMargin(t);var y=c.Axes.list(t);for(e=0;e<y.length;e++){y[e].setScale()}if((t.calcdata||[]).length===i.length)for(e=0;e<i.length;e++){var x=i[e];(t.calcdata[e][0]||{}).trace=x}},p.createTransitionData=function(t){t._transitionData||(t._transitionData={}),t._transitionData._frames||(t._transitionData._frames=[]),t._transitionData._frameHash||(t._transitionData._frameHash={}),t._transitionData._counter||(t._transitionData._counter=0),t._transitionData._interruptCallbacks||(t._transitionData._interruptCallbacks=[])},p._hasPlotType=function(t){for(var e=this._basePlotModules||[],r=0;r<e.length;r++){if(e[r].name===t)return!0}return!1},p.cleanPlot=function(t,e,r,n){var a,o,i=n._basePlotModules||[];for(a=0;a<i.length;a++){var l=i[a];l.clean&&l.clean(t,e,r,n)}var s=!!n._paper,c=!!n._infolayer;t:for(a=0;a<r.length;a++){var u=r[a],f=u.uid;for(o=0;o<t.length;o++){var d=t[o];if(f===d.uid)continue t}var h=\".hm\"+f+\",.contour\"+f+\",.carpet\"+f+\",#clip\"+f+\",.trace\"+f;s&&n._paper.selectAll(h).remove(),c&&(n._infolayer.selectAll(\".cb\"+f).remove(),n._infolayer.selectAll(\"g.rangeslider-container\").selectAll(h).remove())}},p.linkSubplots=function(t,e,r,n){for(var a=n._plots||{},o=e._plots={},i={_fullData:t,_fullLayout:e},l=c.Axes.getSubplots(i),s=0;s<l.length;s++){var u,f=l[s],d=a[f];d?(u=o[f]=d,u._scene2d&&u._scene2d.updateRefs(e)):(u=o[f]={},u.id=f),u.xaxis=c.Axes.getFromId(i,f,\"x\"),u.yaxis=c.Axes.getFromId(i,f,\"y\")}},p.supplyDataDefaults=function(t,e,r,n){function o(t){e.push(t);var r=t._module;r&&(f.pushUnique(c,r),f.pushUnique(d,t._module.basePlotModule),h++)}var i,l,s,c=n._modules=[],d=n._basePlotModules=[],h=0;n._transformModules=[];var g={},v=[];for(i=0;i<t.length;i++){if(s=t[i],l=p.supplyTraceDefaults(s,h,n,i),l.index=i,l._input=s,l._expandedIndex=h,l.transforms&&l.transforms.length)for(var m=a(l,e,r,n),y=0;y<m.length;y++){var x=m[y],b=p.supplyTraceDefaults(x,h,n,i);x.uid=b.uid=l.uid+y,b.index=i,b._input=s,b._fullInput=l,b._expandedIndex=h,b._expandedInput=x,o(b)}else l._fullInput=l,l._expandedInput=l,o(l);u.traceIs(l,\"carpetAxis\")&&(g[l.carpet]=l),u.traceIs(l,\"carpetDependent\")&&v.push(i)}for(i=0;i<v.length;i++)if(l=e[v[i]],l.visible){var _=g[l.carpet];l._carpet=_,_&&_.visible?(l.xaxis=_.xaxis,l.yaxis=_.yaxis):l.visible=!1}},p.supplyAnimationDefaults=function(t){function e(e,r){return f.coerce(t||{},n,g,e,r)}t=t||{};var r,n={};if(e(\"mode\"),e(\"direction\"),e(\"fromcurrent\"),Array.isArray(t.frame))for(n.frame=[],r=0;r<t.frame.length;r++)n.frame[r]=p.supplyAnimationFrameDefaults(t.frame[r]||{});else n.frame=p.supplyAnimationFrameDefaults(t.frame||{});if(Array.isArray(t.transition))for(n.transition=[],r=0;r<t.transition.length;r++)n.transition[r]=p.supplyAnimationTransitionDefaults(t.transition[r]||{});else n.transition=p.supplyAnimationTransitionDefaults(t.transition||{});return n},p.supplyAnimationFrameDefaults=function(t){function e(e,n){return f.coerce(t||{},r,g.frame,e,n)}var r={};return e(\"duration\"),e(\"redraw\"),r},p.supplyAnimationTransitionDefaults=function(t){function e(e,n){return f.coerce(t||{},r,g.transition,e,n)}var r={};return e(\"duration\"),e(\"easing\"),r},p.supplyFrameDefaults=function(t){function e(e,n){return f.coerce(t,r,v,e,n)}var r={};return e(\"group\"),e(\"name\"),e(\"traces\"),e(\"baseframe\"),e(\"data\"),e(\"layout\"),r},p.supplyTraceDefaults=function(t,e,r,n){function a(e,r){return f.coerce(t,i,p.attributes,e,r)}function o(e,r){if(p.traceIs(i,e))return f.coerce(t,i,p.subplotsRegistry[e].attributes,r)}var i={},l=d.defaults[e%d.defaults.length],s=a(\"visible\");a(\"type\"),a(\"uid\"),a(\"name\",\"trace \"+n);for(var c=Object.keys(y),h=0;h<c.length;h++){var g=c[h];if([\"cartesian\",\"gl2d\"].indexOf(g)===-1){var v=y[g].attr;v&&o(g,v)}}if(s){var m=p.getModule(i);i._module=m,a(\"hoverinfo\",1===r._dataLength?\"x+y+z+text\":void 0),p.traceIs(i,\"showLegend\")&&(a(\"showlegend\"),a(\"legendgroup\")),u.getComponentMethod(\"fx\",\"supplyDefaults\")(t,i,l,r),m&&m.supplyDefaults(t,i,l,r),p.traceIs(i,\"noOpacity\")||a(\"opacity\"),o(\"cartesian\",\"xaxis\"),o(\"cartesian\",\"yaxis\"),o(\"gl2d\",\"xaxis\"),o(\"gl2d\",\"yaxis\"),p.traceIs(i,\"notLegendIsolatable\")&&(i.visible=!!i.visible),p.supplyTransformDefaults(t,i,r)}return i},p.supplyTransformDefaults=function(t,e,r){var n=r._globalTransforms||[],a=r._transformModules||[];if(Array.isArray(t.transforms)||0!==n.length)for(var o=t.transforms||[],i=n.concat(o),l=e.transforms=[],s=0;s<i.length;s++){var c,u=i[s],d=u.type,h=x[d];h||f.warn(\"Unrecognized transform type \"+d+\".\"),h&&h.supplyDefaults?(c=h.supplyDefaults(u,e,r,t),c.type=d,c._module=h,f.pushUnique(a,h)):c=f.extendFlat({},u),l.push(c)}},p.supplyLayoutGlobalDefaults=function(t,e){function r(r,n){return f.coerce(t,e,p.layoutAttributes,r,n)}var n=f.coerceFont(r,\"font\");r(\"title\"),f.coerceFont(r,\"titlefont\",{family:n.family,size:Math.round(1.4*n.size),color:n.color}),r(\"autosize\",!(t.width&&t.height)),r(\"width\"),r(\"height\"),r(\"margin.l\"),r(\"margin.r\"),r(\"margin.t\"),r(\"margin.b\"),r(\"margin.pad\"),r(\"margin.autoexpand\"),t.width&&t.height&&p.sanitizeMargins(e),r(\"paper_bgcolor\"),r(\"separators\"),r(\"hidesources\"),r(\"smith\"),u.getComponentMethod(\"calendars\",\"handleDefaults\")(t,e,\"calendar\"),u.getComponentMethod(\"fx\",\"supplyLayoutGlobalDefaults\")(t,e,r)},p.plotAutoSize=function(t,e,r){var n,a,i=t._context||{},l=i.frameMargins,c=f.isPlotDiv(t);if(c&&t.emit(\"plotly_autosize\"),i.fillFrame)n=window.innerWidth,a=window.innerHeight,document.body.style.overflow=\"hidden\";else if(s(l)&&l>0){var u=o(t._boundingBoxMargins),d=u.left+u.right,h=u.bottom+u.top,g=1-2*l,v=r._container&&r._container.node?r._container.node().getBoundingClientRect():{width:r.width,height:r.height};n=Math.round(g*(v.width-d)),a=Math.round(g*(v.height-h))}else{var m=c?window.getComputedStyle(t):{};n=parseFloat(m.width)||r.width,a=parseFloat(m.height)||r.height}var y=p.layoutAttributes.width.min,x=p.layoutAttributes.height.min;n<y&&(n=y),a<x&&(a=x);var b=!e.width&&Math.abs(r.width-n)>1,_=!e.height&&Math.abs(r.height-a)>1;(_||b)&&(b&&(r.width=n),_&&(r.height=a)),t._initialAutoSize||(t._initialAutoSize={width:n,height:a}),p.sanitizeMargins(r)},p.supplyLayoutModuleDefaults=function(t,e,r,n){var a,o;c.Axes.supplyLayoutDefaults(t,e,r);var i=e._basePlotModules;for(a=0;a<i.length;a++)o=i[a],\"cartesian\"!==o.name&&o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r);var l=e._modules;for(a=0;a<l.length;a++)o=l[a],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r);var s=e._transformModules;for(a=0;a<s.length;a++)o=s[a],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r,n);var f=Object.keys(u.componentsRegistry);for(a=0;a<f.length;a++)o=u.componentsRegistry[f[a]],o.supplyLayoutDefaults&&o.supplyLayoutDefaults(t,e,r)},p.purge=function(t){var e=t._fullLayout||{};void 0!==e._glcontainer&&e._glcontainer.remove(),void 0!==e._geocontainer&&e._geocontainer.remove(),e._modeBar&&e._modeBar.destroy(),t._transitionData&&(t._transitionData._interruptCallbacks&&(t._transitionData._interruptCallbacks.length=0),t._transitionData._animationRaf&&window.cancelAnimationFrame(t._transitionData._animationRaf)),delete t.data,delete t.layout,delete t._fullData,delete t._fullLayout,delete t.calcdata,delete t.framework,delete t.empty,delete t.fid,delete t.undoqueue,delete t.undonum,delete t.autoplay,delete t.changed,delete t._promises,delete t._redrawTimer,delete t.firstscatter,delete t.hmlumcount,delete t.hmpixcount,delete t.numboxes,delete t._hoverTimer,delete t._lastHoverTime,delete t._transitionData,delete t._transitioning,delete t._initialAutoSize,t.removeAllListeners&&t.removeAllListeners()},p.style=function(t){for(var e=t._fullLayout._modules,r=0;r<e.length;r++){var n=e[r];n.style&&n.style(t)}},p.sanitizeMargins=function(t){if(t&&t.margin){var e,r=t.width,n=t.height,a=t.margin,o=r-(a.l+a.r),i=n-(a.t+a.b);o<0&&(e=(r-1)/(a.l+a.r),a.l=Math.floor(e*a.l),a.r=Math.floor(e*a.r)),i<0&&(e=(n-1)/(a.t+a.b),a.t=Math.floor(e*a.t),a.b=Math.floor(e*a.b))}},p.autoMargin=function(t,e,r){var n=t._fullLayout;if(n._pushmargin||(n._pushmargin={}),n.margin.autoexpand!==!1){if(r){var a=void 0===r.pad?12:r.pad;r.l+r.r>.5*n.width&&(r.l=r.r=0),r.b+r.t>.5*n.height&&(r.b=r.t=0),n._pushmargin[e]={l:{val:r.x,size:r.l+a},r:{val:r.x,size:r.r+a},b:{val:r.y,size:r.b+a},t:{val:r.y,size:r.t+a}}}else delete n._pushmargin[e];n._replotting||p.doAutoMargin(t)}},p.doAutoMargin=function(t){var e=t._fullLayout;e._size||(e._size={}),e._pushmargin||(e._pushmargin={});var r=e._size,n=JSON.stringify(r),a=Math.max(e.margin.l||0,0),o=Math.max(e.margin.r||0,0),i=Math.max(e.margin.t||0,0),l=Math.max(e.margin.b||0,0),u=e._pushmargin;if(e.margin.autoexpand!==!1){u.base={l:{val:0,size:a},r:{val:1,size:o},t:{val:1,size:i},b:{val:0,size:l}};for(var f=Object.keys(u),d=0;d<f.length;d++)for(var h=f[d],p=u[h].l||{},g=u[h].b||{},v=p.val,m=p.size,y=g.val,x=g.size,b=0;b<f.length;b++){var _=f[b];if(s(m)&&u[_].r){var w=u[_].r.val,k=u[_].r.size;if(w>v){var M=(m*w+(k-e.width)*v)/(w-v),A=(k*(1-v)+(m-e.width)*(1-w))/(w-v);M>=0&&A>=0&&M+A>a+o&&(a=M,o=A)}}if(s(x)&&u[_].t){var T=u[_].t.val,L=u[_].t.size;if(T>y){var C=(x*T+(L-e.height)*y)/(T-y),S=(L*(1-y)+(x-e.height)*(1-T))/(T-y);C>=0&&S>=0&&C+S>l+i&&(l=C,i=S)}}}}if(r.l=Math.round(a),r.r=Math.round(o),r.t=Math.round(i),r.b=Math.round(l),r.p=Math.round(e.margin.pad),r.w=Math.round(e.width)-r.l-r.r,r.h=Math.round(e.height)-r.t-r.b,!e._replotting&&\"{}\"!==n&&n!==JSON.stringify(e._size))return c.plot(t)},p.graphJson=function(t,e,r,n,a){function o(t){if(\"function\"==typeof t)return null;if(f.isPlainObject(t)){var e,n,a={};for(e in t)if(\"function\"!=typeof t[e]&&[\"_\",\"[\"].indexOf(e.charAt(0))===-1){if(\"keepdata\"===r){if(\"src\"===e.substr(e.length-3))continue}else if(\"keepstream\"===r){if(\"string\"==typeof(n=t[e+\"src\"])&&n.indexOf(\":\")>0&&!f.isPlainObject(t.stream))continue}else if(\"keepall\"!==r&&\"string\"==typeof(n=t[e+\"src\"])&&n.indexOf(\":\")>0)continue;a[e]=o(t[e])}return a}return Array.isArray(t)?t.map(o):f.isJSDate(t)?f.ms2DateTimeLocal(+t):t}(a&&e&&!t._fullData||a&&!e&&!t._fullLayout)&&p.supplyDefaults(t);var i=a?t._fullData:t.data,l=a?t._fullLayout:t.layout,s=(t._transitionData||{})._frames,c={data:(i||[]).map(function(t){var r=o(t);return e&&delete r.fit,r})};return e||(c.layout=o(l)),t.framework&&t.framework.isPolar&&(c=t.framework.getConfig()),s&&(c.frames=o(s)),\"object\"===n?c:JSON.stringify(c)},p.modifyFrames=function(t,e){var r,n,a,o=t._transitionData._frames,i=t._transitionData._frameHash;for(r=0;r<e.length;r++)switch(n=e[r],n.type){case\"replace\":a=n.value;var l=(o[n.index]||{}).name,s=a.name;o[n.index]=i[s]=a,s!==l&&(delete i[l],i[s]=a);break;case\"insert\":a=n.value,i[a.name]=a,o.splice(n.index,0,a);break;case\"delete\":a=o[n.index],delete i[a.name],o.splice(n.index,1)}return Promise.resolve()},p.computeFrame=function(t,e){var r,n,a,o,i=t._transitionData._frameHash;if(!e)throw new Error(\"computeFrame must be given a string frame name\");var l=i[e.toString()];if(!l)return!1;for(var s=[l],c=[l.name];l.baseframe&&(l=i[l.baseframe.toString()])&&c.indexOf(l.name)===-1;)s.push(l),c.push(l.name);for(var u={};l=s.pop();)if(l.layout&&(u.layout=p.extendLayout(u.layout,l.layout)),l.data){if(u.data||(u.data=[]),!(n=l.traces))for(n=[],r=0;r<l.data.length;r++)n[r]=r;for(u.traces||(u.traces=[]),r=0;r<l.data.length;r++)void 0!==(a=n[r])&&null!==a&&(o=u.traces.indexOf(a),o===-1&&(o=u.data.length,u.traces[o]=a),u.data[o]=p.extendTrace(u.data[o],l.data[r]))}return u},p.recomputeFrameHash=function(t){for(var e=t._transitionData._frameHash={},r=t._transitionData._frames,n=0;n<r.length;n++){var a=r[n];a&&a.name&&(e[a.name]=a)}},p.extendObjectWithContainers=function(t,e,r){var n,a,o,i,l,s,c,u,d=f.extendDeepNoArrays({},e||{}),h=f.expandObjectPaths(d),g={};if(r&&r.length)for(o=0;o<r.length;o++)n=f.nestedProperty(h,r[o]),a=n.get(),void 0===a?f.nestedProperty(g,r[o]).set(null):(n.set(null),f.nestedProperty(g,r[o]).set(a));if(t=f.extendDeepNoArrays(t||{},h),r&&r.length)for(o=0;o<r.length;o++)if(l=f.nestedProperty(g,r[o]),c=l.get()){for(s=f.nestedProperty(t,r[o]),u=s.get(),Array.isArray(u)||(u=[],s.set(u)),i=0;i<c.length;i++){var v=c[i];u[i]=null===v?null:p.extendObjectWithContainers(u[i],v)}s.set(u)}return t},p.dataArrayContainers=[\"transforms\"],p.layoutArrayContainers=u.layoutArrayContainers,p.extendTrace=function(t,e){return p.extendObjectWithContainers(t,e,p.dataArrayContainers)},p.extendLayout=function(t,e){return p.extendObjectWithContainers(t,e,p.layoutArrayContainers)},p.transition=function(t,e,r,n,a,o){function i(){var n;for(n=0;n<y.length;n++){var a=y[n],o=t._fullData[a],i=o._module;i&&(i.animatable&&x.push(a),t.data[y[n]]=p.extendTrace(t.data[y[n]],e[n]))}var l=f.expandObjectPaths(f.extendDeepNoArrays({},r)),s=/^[xy]axis[0-9]*$/;for(var c in l)s.test(c)&&delete l[c].range;return p.extendLayout(t.layout,l),p.supplyDefaults(t),p.doCalcdata(t),b.calc(t),Promise.resolve()}function l(t){var e=Promise.resolve();if(!t)return e;for(;t.length;)e=e.then(t.shift());return e}function s(t){if(t)for(;t.length;)t.shift()}function u(){return t.emit(\"plotly_transitioning\",[]),new Promise(function(e){function n(){return s++,function(){u++,_||u!==s||d(e)}}t._transitioning=!0,o.duration>0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push(function(){_=!0}),a.redraw&&t._transitionData._interruptCallbacks.push(function(){return c.redraw(t)}),t._transitionData._interruptCallbacks.push(function(){t.emit(\"plotly_transitioninterrupted\",[])});var i,l,s=0,u=0,h=t._fullLayout._basePlotModules,p=!1;if(r)for(l=0;l<h.length;l++)if(h[l].transitionAxes){var g=f.expandObjectPaths(r);p=h[l].transitionAxes(t,g,o,n)||p}for(p?(i=f.extendFlat({},o),i.duration=0):i=o,l=0;l<h.length;l++)h[l].plot(t,x,i,n);setTimeout(n())})}function d(e){if(t._transitionData)return s(t._transitionData._interruptCallbacks),Promise.resolve().then(function(){if(a.redraw)return c.redraw(t)}).then(function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit(\"plotly_transitioned\",[])}).then(e)}function h(){if(t._transitionData)return t._transitioning=!1,l(t._transitionData._interruptCallbacks)}var g,v,m=Array.isArray(e)?e.length:0,y=n.slice(0,m),x=[],_=!1;for(g=0;g<y.length;g++){v=y[g];var w=t._fullData[v],k=w._module;if(k&&!k.animatable){var M={};for(var A in e[g])M[A]=[e[g][A]]}}var T=[p.previousPromises,h,i,p.rehover,u],L=f.syncOrAsync(T,t);return L&&L.then||(L=Promise.resolve()),L.then(function(){return t})},p.doCalcdata=function(t,e){var r,n,a,o,l=c.Axes.list(t),s=t._fullData,f=t._fullLayout,d=new Array(s.length),p=(t.calcdata||[]).slice(0);for(t.calcdata=d,t.firstscatter=!0,t.numboxes=0,t._hmpixcount=0,t._hmlumcount=0,f._piecolormap={},f._piedefaultcolorcount=0,a=0;a<s.length;a++)Array.isArray(e)&&e.indexOf(a)===-1&&(d[a]=p[a]);var g=i(l),v=!1;for(a=0;a<s.length;a++)if(r=s[a],r.visible===!0&&r.transforms)for(n=r._module,n&&n.calc&&n.calc(t,r),o=0;o<r.transforms.length;o++){var m=r.transforms[o];n=x[m.type],n&&n.calcTransform&&(v=!0,n.calcTransform(t,r,m))}if(v){for(a=0;a<l.length;a++)l[a]._min=[],l[a]._max=[],l[a]._categories=[],l[a]._categoriesMap={};i(l)}for(a=0;a<s.length;a++){var y=[];r=s[a],r.visible===!0&&(n=r._module)&&n.calc&&(y=n.calc(t,r)),Array.isArray(y)&&y[0]||(y=[{x:h,y:h}]),y[0].t||(y[0].t={}),y[0].trace=r,d[a]=y}if(u.getComponentMethod(\"fx\",\"calc\")(t),g){var b=[\"annotations\",\"shapes\",\"images\"];for(a=0;a<b.length;a++)u.getComponentMethod(b[a],\"supplyLayoutDefaults\")(t.layout,f,s)}},p.rehover=function(t){t._fullLayout._rehover&&t._fullLayout._rehover()},p.generalUpdatePerTraceModule=function(t,e,r){var n,a=t.traceHash,o={};for(n=0;n<e.length;n++){var i=e[n],l=i[0].trace;l.visible&&(o[l.type]=o[l.type]||[],o[l.type].push(i))}var s=Object.keys(a),c=Object.keys(o);for(n=0;n<s.length;n++){var u=s[n];if(c.indexOf(u)===-1){var f=a[u][0];f[0].trace.visible=!1,o[u]=[f]}}for(c=Object.keys(o),n=0;n<c.length;n++){var d=o[c[n]];d[0][0].trace._module.plot(t,function(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];n[0].trace.visible===!0&&e.push(n)}return e}(d),r)}t.traceHash=o}},{\"../components/color\":25,\"../components/errorbars\":55,\"../constants/numerical\":122,\"../lib\":136,\"../plotly\":166,\"../registry\":206,\"./animation_attributes\":167,\"./attributes\":169,\"./command\":194,\"./font_attributes\":195,\"./frame_attributes\":196,\"./layout_attributes\":197,d3:7,\"fast-isnumeric\":10}],200:[function(t,e,r){\"use strict\";var n=t(\"../../traces/scatter/attributes\"),a=n.marker;e.exports={r:n.r,t:n.t,marker:{color:a.color,size:a.size,symbol:a.symbol,opacity:a.opacity}}},{\"../../traces/scatter/attributes\":240}],201:[function(t,e,r){\"use strict\";function n(t,e){return o({},e,{showline:{valType:\"boolean\"},showticklabels:{valType:\"boolean\"},tickorientation:{valType:\"enumerated\",values:[\"horizontal\",\"vertical\"]},ticklen:{valType:\"number\",min:0},tickcolor:{valType:\"color\"},ticksuffix:{valType:\"string\"},endpadding:{valType:\"number\"},visible:{valType:\"boolean\"}})}var a=t(\"../cartesian/layout_attributes\"),o=t(\"../../lib/extend\").extendFlat,i=o({},a.domain,{});e.exports={radialaxis:n(\"radial\",{range:{valType:\"info_array\",items:[{valType:\"number\"},{valType:\"number\"}]},domain:i,orientation:{valType:\"number\"}}),angularaxis:n(\"angular\",{range:{valType:\"info_array\",items:[{valType:\"number\",dflt:0},{valType:\"number\",dflt:360}]},domain:i}),layout:{direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"]},orientation:{valType:\"angle\"}}}},{\"../../lib/extend\":132,\"../cartesian/layout_attributes\":182}],202:[function(t,e,r){\"use strict\";(e.exports=t(\"./micropolar\")).manager=t(\"./micropolar_manager\")},{\"./micropolar\":203,\"./micropolar_manager\":204}],203:[function(t,e,r){var n=t(\"d3\"),a=t(\"../../lib\"),o=a.extendDeepAll,i=e.exports={version:\"0.2.2\"};i.Axis=function(){function t(t){r=t||r;var c=s.data,f=s.layout;return(\"string\"==typeof r||r.nodeName)&&(r=n.select(r)),r.datum(c).each(function(t,r){function s(t,e){return l(t)%360+f.orientation}var c=t.slice();u={data:i.util.cloneJson(c),layout:i.util.cloneJson(f)};var d=0;c.forEach(function(t,e){t.color||(t.color=f.defaultColorRange[d],d=(d+1)%f.defaultColorRange.length),\n",
|
|
"t.strokeColor||(t.strokeColor=\"LinePlot\"===t.geometry?t.color:n.rgb(t.color).darker().toString()),u.data[e].color=t.color,u.data[e].strokeColor=t.strokeColor,u.data[e].strokeDash=t.strokeDash,u.data[e].strokeSize=t.strokeSize});var h=c.filter(function(t,e){var r=t.visible;return void 0===r||r===!0}),p=!1,g=h.map(function(t,e){return p=p||void 0!==t.groupId,t});if(p){var v=n.nest().key(function(t,e){return void 0!==t.groupId?t.groupId:\"unstacked\"}).entries(g),m=[],y=v.map(function(t,e){if(\"unstacked\"===t.key)return t.values;var r=t.values[0].r.map(function(t,e){return 0});return t.values.forEach(function(t,e,n){t.yStack=[r],m.push(r),r=i.util.sumArrays(t.r,r)}),t.values});h=n.merge(y)}h.forEach(function(t,e){t.t=Array.isArray(t.t[0])?t.t:[t.t],t.r=Array.isArray(t.r[0])?t.r:[t.r]});var x=Math.min(f.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2;x=Math.max(10,x);var b,_=[f.margin.left+x,f.margin.top+x];if(p){b=[0,n.max(i.util.sumArrays(i.util.arrayLast(h).r[0],i.util.arrayLast(m)))]}else b=n.extent(i.util.flattenArray(h.map(function(t,e){return t.r})));f.radialAxis.domain!=i.DATAEXTENT&&(b[0]=0),a=n.scale.linear().domain(f.radialAxis.domain!=i.DATAEXTENT&&f.radialAxis.domain?f.radialAxis.domain:b).range([0,x]),u.layout.radialAxis.domain=a.domain();var w,k=i.util.flattenArray(h.map(function(t,e){return t.t})),M=\"string\"==typeof k[0];M&&(k=i.util.deduplicate(k),w=k.slice(),k=n.range(k.length),h=h.map(function(t,e){var r=t;return t.t=[k],p&&(r.yStack=t.yStack),r}));var A=h.filter(function(t,e){return\"LinePlot\"===t.geometry||\"DotPlot\"===t.geometry}).length===h.length,T=null===f.needsEndSpacing?M||!A:f.needsEndSpacing,L=f.angularAxis.domain&&f.angularAxis.domain!=i.DATAEXTENT&&!M&&f.angularAxis.domain[0]>=0,C=L?f.angularAxis.domain:n.extent(k),S=Math.abs(k[1]-k[0]);A&&!M&&(S=0);var z=C.slice();T&&M&&(z[1]+=S);var O=f.angularAxis.ticksCount||4;O>8&&(O=O/(O/8)+O%8),f.angularAxis.ticksStep&&(O=(z[1]-z[0])/O);var D=f.angularAxis.ticksStep||(z[1]-z[0])/(O*(f.minorTicks+1));w&&(D=Math.max(Math.round(D),1)),z[2]||(z[2]=D);var P=n.range.apply(this,z);if(P=P.map(function(t,e){return parseFloat(t.toPrecision(12))}),l=n.scale.linear().domain(z.slice(0,2)).range(\"clockwise\"===f.direction?[0,360]:[360,0]),u.layout.angularAxis.domain=l.domain(),u.layout.angularAxis.endPadding=T?S:0,void 0===(e=n.select(this).select(\"svg.chart-root\"))||e.empty()){var E=(new DOMParser).parseFromString(\"<svg xmlns='http://www.w3.org/2000/svg' class='chart-root'>' + '<g class='outer-group'>' + '<g class='chart-group'>' + '<circle class='background-circle'></circle>' + '<g class='geometry-group'></g>' + '<g class='radial axis-group'>' + '<circle class='outside-circle'></circle>' + '</g>' + '<g class='angular axis-group'></g>' + '<g class='guides-group'><line></line><circle r='0'></circle></g>' + '</g>' + '<g class='legend-group'></g>' + '<g class='tooltips-group'></g>' + '<g class='title-group'><text></text></g>' + '</g>' + '</svg>\",\"application/xml\"),N=this.appendChild(this.ownerDocument.importNode(E.documentElement,!0));e=n.select(N)}e.select(\".guides-group\").style({\"pointer-events\":\"none\"}),e.select(\".angular.axis-group\").style({\"pointer-events\":\"none\"}),e.select(\".radial.axis-group\").style({\"pointer-events\":\"none\"});var I,R=e.select(\".chart-group\"),F={fill:\"none\",stroke:f.tickColor},j={\"font-size\":f.font.size,\"font-family\":f.font.family,fill:f.font.color,\"text-shadow\":[\"-1px 0px\",\"1px -1px\",\"-1px 1px\",\"1px 1px\"].map(function(t,e){return\" \"+t+\" 0 \"+f.font.outlineColor}).join(\",\")};if(f.showLegend){I=e.select(\".legend-group\").attr({transform:\"translate(\"+[x,f.margin.top]+\")\"}).style({display:\"block\"});var B=h.map(function(t,e){var r=i.util.cloneJson(t);return r.symbol=\"DotPlot\"===t.geometry?t.dotType||\"circle\":\"LinePlot\"!=t.geometry?\"square\":\"line\",r.visibleInLegend=void 0===t.visibleInLegend||t.visibleInLegend,r.color=\"LinePlot\"===t.geometry?t.strokeColor:t.color,r});i.Legend().config({data:h.map(function(t,e){return t.name||\"Element\"+e}),legendConfig:o({},i.Legend.defaultConfig().legendConfig,{container:I,elements:B,reverseOrder:f.legend.reverseOrder})})();var q=I.node().getBBox();x=Math.min(f.width-q.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2,x=Math.max(10,x),_=[f.margin.left+x,f.margin.top+x],a.range([0,x]),u.layout.radialAxis.domain=a.domain(),I.attr(\"transform\",\"translate(\"+[_[0]+x,_[1]-x]+\")\")}else I=e.select(\".legend-group\").style({display:\"none\"});e.attr({width:f.width,height:f.height}).style({opacity:f.opacity}),R.attr(\"transform\",\"translate(\"+_+\")\").style({cursor:\"crosshair\"});var H=[(f.width-(f.margin.left+f.margin.right+2*x+(q?q.width:0)))/2,(f.height-(f.margin.top+f.margin.bottom+2*x))/2];if(H[0]=Math.max(0,H[0]),H[1]=Math.max(0,H[1]),e.select(\".outer-group\").attr(\"transform\",\"translate(\"+H+\")\"),f.title){var V=e.select(\"g.title-group text\").style(j).text(f.title),U=V.node().getBBox();V.attr({x:_[0]-U.width/2,y:_[1]-x-20})}var X=e.select(\".radial.axis-group\");if(f.radialAxis.gridLinesVisible){var G=X.selectAll(\"circle.grid-circle\").data(a.ticks(5));G.enter().append(\"circle\").attr({class:\"grid-circle\"}).style(F),G.attr(\"r\",a),G.exit().remove()}X.select(\"circle.outside-circle\").attr({r:x}).style(F);var Y=e.select(\"circle.background-circle\").attr({r:x}).style({fill:f.backgroundColor,stroke:f.stroke});if(f.radialAxis.visible){var Z=n.svg.axis().scale(a).ticks(5).tickSize(5);X.call(Z).attr({transform:\"rotate(\"+f.radialAxis.orientation+\")\"}),X.selectAll(\".domain\").style(F),X.selectAll(\"g>text\").text(function(t,e){return this.textContent+f.radialAxis.ticksSuffix}).style(j).style({\"text-anchor\":\"start\"}).attr({x:0,y:0,dx:0,dy:0,transform:function(t,e){return\"horizontal\"===f.radialAxis.tickOrientation?\"rotate(\"+-f.radialAxis.orientation+\") translate(\"+[0,j[\"font-size\"]]+\")\":\"translate(\"+[0,j[\"font-size\"]]+\")\"}}),X.selectAll(\"g>line\").style({stroke:\"black\"})}var W=e.select(\".angular.axis-group\").selectAll(\"g.angular-tick\").data(P),$=W.enter().append(\"g\").classed(\"angular-tick\",!0);W.attr({transform:function(t,e){return\"rotate(\"+s(t,e)+\")\"}}).style({display:f.angularAxis.visible?\"block\":\"none\"}),W.exit().remove(),$.append(\"line\").classed(\"grid-line\",!0).classed(\"major\",function(t,e){return e%(f.minorTicks+1)==0}).classed(\"minor\",function(t,e){return!(e%(f.minorTicks+1)==0)}).style(F),$.selectAll(\".minor\").style({stroke:f.minorTickColor}),W.select(\"line.grid-line\").attr({x1:f.tickLength?x-f.tickLength:0,x2:x}).style({display:f.angularAxis.gridLinesVisible?\"block\":\"none\"}),$.append(\"text\").classed(\"axis-text\",!0).style(j);var Q=W.select(\"text.axis-text\").attr({x:x+f.labelOffset,dy:\".35em\",transform:function(t,e){var r=s(t,e),n=x+f.labelOffset,a=f.angularAxis.tickOrientation;return\"horizontal\"==a?\"rotate(\"+-r+\" \"+n+\" 0)\":\"radial\"==a?r<270&&r>90?\"rotate(180 \"+n+\" 0)\":null:\"rotate(\"+(r<=180&&r>0?-90:90)+\" \"+n+\" 0)\"}}).style({\"text-anchor\":\"middle\",display:f.angularAxis.labelsVisible?\"block\":\"none\"}).text(function(t,e){return e%(f.minorTicks+1)!=0?\"\":w?w[t]+f.angularAxis.ticksSuffix:t+f.angularAxis.ticksSuffix}).style(j);f.angularAxis.rewriteTicks&&Q.text(function(t,e){return e%(f.minorTicks+1)!=0?\"\":f.angularAxis.rewriteTicks(this.textContent,e)});var J=n.max(R.selectAll(\".angular-tick text\")[0].map(function(t,e){return t.getCTM().e+t.getBBox().width}));I.attr({transform:\"translate(\"+[x+J,f.margin.top]+\")\"});var K=e.select(\"g.geometry-group\").selectAll(\"g\").size()>0,tt=e.select(\"g.geometry-group\").selectAll(\"g.geometry\").data(h);if(tt.enter().append(\"g\").attr({class:function(t,e){return\"geometry geometry\"+e}}),tt.exit().remove(),h[0]||K){var et=[];h.forEach(function(t,e){var r={};r.radialScale=a,r.angularScale=l,r.container=tt.filter(function(t,r){return r==e}),r.geometry=t.geometry,r.orientation=f.orientation,r.direction=f.direction,r.index=e,et.push({data:t,geometryConfig:r})});var rt=n.nest().key(function(t,e){return void 0!==t.data.groupId||\"unstacked\"}).entries(et),nt=[];rt.forEach(function(t,e){\"unstacked\"===t.key?nt=nt.concat(t.values.map(function(t,e){return[t]})):nt.push(t.values)}),nt.forEach(function(t,e){var r;r=Array.isArray(t)?t[0].geometryConfig.geometry:t.geometryConfig.geometry;var n=t.map(function(t,e){return o(i[r].defaultConfig(),t)});i[r]().config(n)()})}var at,ot,it=e.select(\".guides-group\"),lt=e.select(\".tooltips-group\"),st=i.tooltipPanel().config({container:lt,fontSize:8})(),ct=i.tooltipPanel().config({container:lt,fontSize:8})(),ut=i.tooltipPanel().config({container:lt,hasTick:!0})();if(!M){var ft=it.select(\"line\").attr({x1:0,y1:0,y2:0}).style({stroke:\"grey\",\"pointer-events\":\"none\"});R.on(\"mousemove.angular-guide\",function(t,e){var r=i.util.getMousePos(Y).angle;ft.attr({x2:-x,transform:\"rotate(\"+r+\")\"}).style({opacity:.5});var n=(r+180+360-f.orientation)%360;at=l.invert(n);var a=i.util.convertToCartesian(x+12,r+180);st.text(i.util.round(at)).move([a[0]+_[0],a[1]+_[1]])}).on(\"mouseout.angular-guide\",function(t,e){it.select(\"line\").style({opacity:0})})}var dt=it.select(\"circle\").style({stroke:\"grey\",fill:\"none\"});R.on(\"mousemove.radial-guide\",function(t,e){var r=i.util.getMousePos(Y).radius;dt.attr({r:r}).style({opacity:.5}),ot=a.invert(i.util.getMousePos(Y).radius);var n=i.util.convertToCartesian(r,f.radialAxis.orientation);ct.text(i.util.round(ot)).move([n[0]+_[0],n[1]+_[1]])}).on(\"mouseout.radial-guide\",function(t,e){dt.style({opacity:0}),ut.hide(),st.hide(),ct.hide()}),e.selectAll(\".geometry-group .mark\").on(\"mouseover.tooltip\",function(t,r){var a=n.select(this),o=a.style(\"fill\"),l=\"black\",s=a.style(\"opacity\")||1;if(a.attr({\"data-opacity\":s}),\"none\"!=o){a.attr({\"data-fill\":o}),l=n.hsl(o).darker().toString(),a.style({fill:l,opacity:1});var c={t:i.util.round(t[0]),r:i.util.round(t[1])};M&&(c.t=w[t[0]]);var u=\"t: \"+c.t+\", r: \"+c.r,f=this.getBoundingClientRect(),d=e.node().getBoundingClientRect(),h=[f.left+f.width/2-H[0]-d.left,f.top+f.height/2-H[1]-d.top];ut.config({color:l}).text(u),ut.move(h)}else o=a.style(\"stroke\"),a.attr({\"data-stroke\":o}),l=n.hsl(o).darker().toString(),a.style({stroke:l,opacity:1})}).on(\"mousemove.tooltip\",function(t,e){if(0!=n.event.which)return!1;n.select(this).attr(\"data-fill\")&&ut.show()}).on(\"mouseout.tooltip\",function(t,e){ut.hide();var r=n.select(this),a=r.attr(\"data-fill\");a?r.style({fill:a,opacity:r.attr(\"data-opacity\")}):r.style({stroke:r.attr(\"data-stroke\"),opacity:r.attr(\"data-opacity\")})})}),d}var e,r,a,l,s={data:[],layout:{}},c={},u={},f=n.dispatch(\"hover\"),d={};return d.render=function(e){return t(e),this},d.config=function(t){if(!arguments.length)return s;var e=i.util.cloneJson(t);return e.data.forEach(function(t,e){s.data[e]||(s.data[e]={}),o(s.data[e],i.Axis.defaultConfig().data[0]),o(s.data[e],t)}),o(s.layout,i.Axis.defaultConfig().layout),o(s.layout,e.layout),this},d.getLiveConfig=function(){return u},d.getinputConfig=function(){return c},d.radialScale=function(t){return a},d.angularScale=function(t){return l},d.svg=function(){return e},n.rebind(d,f,\"on\"),d},i.Axis.defaultConfig=function(t,e){return{data:[{t:[1,2,3,4],r:[10,11,12,13],name:\"Line1\",geometry:\"LinePlot\",color:null,strokeDash:\"solid\",strokeColor:null,strokeSize:\"1\",visibleInLegend:!0,opacity:1}],layout:{defaultColorRange:n.scale.category10().range(),title:null,height:450,width:500,margin:{top:40,right:40,bottom:40,left:40},font:{size:12,color:\"gray\",outlineColor:\"white\",family:\"Tahoma, sans-serif\"},direction:\"clockwise\",orientation:0,labelOffset:10,radialAxis:{domain:null,orientation:-45,ticksSuffix:\"\",visible:!0,gridLinesVisible:!0,tickOrientation:\"horizontal\",rewriteTicks:null},angularAxis:{domain:[0,360],ticksSuffix:\"\",visible:!0,gridLinesVisible:!0,labelsVisible:!0,tickOrientation:\"horizontal\",rewriteTicks:null,ticksCount:null,ticksStep:null},minorTicks:0,tickLength:null,tickColor:\"silver\",minorTickColor:\"#eee\",backgroundColor:\"none\",needsEndSpacing:null,showLegend:!0,legend:{reverseOrder:!1},opacity:1}}},i.util={},i.DATAEXTENT=\"dataExtent\",i.AREA=\"AreaChart\",i.LINE=\"LinePlot\",i.DOT=\"DotPlot\",i.BAR=\"BarChart\",i.util._override=function(t,e){for(var r in t)r in e&&(e[r]=t[r])},i.util._extend=function(t,e){for(var r in t)e[r]=t[r]},i.util._rndSnd=function(){return 2*Math.random()-1+(2*Math.random()-1)+(2*Math.random()-1)},i.util.dataFromEquation2=function(t,e){var r=e||6;return n.range(0,360+r,r).map(function(e,r){var n=e*Math.PI/180;return[e,t(n)]})},i.util.dataFromEquation=function(t,e,r){var a=e||6,o=[],i=[];n.range(0,360+a,a).forEach(function(e,r){var n=e*Math.PI/180,a=t(n);o.push(e),i.push(a)});var l={t:o,r:i};return r&&(l.name=r),l},i.util.ensureArray=function(t,e){if(void 0===t)return null;var r=[].concat(t);return n.range(e).map(function(t,e){return r[e]||r[0]})},i.util.fillArrays=function(t,e,r){return e.forEach(function(e,n){t[e]=i.util.ensureArray(t[e],r)}),t},i.util.cloneJson=function(t){return JSON.parse(JSON.stringify(t))},i.util.validateKeys=function(t,e){\"string\"==typeof e&&(e=e.split(\".\"));var r=e.shift();return t[r]&&(!e.length||objHasKeys(t[r],e))},i.util.sumArrays=function(t,e){return n.zip(t,e).map(function(t,e){return n.sum(t)})},i.util.arrayLast=function(t){return t[t.length-1]},i.util.arrayEqual=function(t,e){for(var r=Math.max(t.length,e.length,1);r-- >=0&&t[r]===e[r];);return r===-2},i.util.flattenArray=function(t){for(var e=[];!i.util.arrayEqual(e,t);)e=t,t=[].concat.apply([],t);return t},i.util.deduplicate=function(t){return t.filter(function(t,e,r){return r.indexOf(t)==e})},i.util.convertToCartesian=function(t,e){var r=e*Math.PI/180;return[t*Math.cos(r),t*Math.sin(r)]},i.util.round=function(t,e){var r=e||2,n=Math.pow(10,r);return Math.round(t*n)/n},i.util.getMousePos=function(t){var e=n.mouse(t.node()),r=e[0],a=e[1],o={};return o.x=r,o.y=a,o.pos=e,o.angle=180*(Math.atan2(a,r)+Math.PI)/Math.PI,o.radius=Math.sqrt(r*r+a*a),o},i.util.duplicatesCount=function(t){for(var e,r={},n={},a=0,o=t.length;a<o;a++)e=t[a],e in r?(r[e]++,n[e]=r[e]):r[e]=1;return n},i.util.duplicates=function(t){return Object.keys(i.util.duplicatesCount(t))},i.util.translator=function(t,e,r,n){if(n){var a=r.slice();r=e,e=a}var o=e.reduce(function(t,e){if(void 0!==t)return t[e]},t);void 0!==o&&(e.reduce(function(t,r,n){if(void 0!==t)return n===e.length-1&&delete t[r],t[r]},t),r.reduce(function(t,e,n){return void 0===t[e]&&(t[e]={}),n===r.length-1&&(t[e]=o),t[e]},t))},i.PolyChart=function(){function t(){var t=e[0].geometryConfig,r=t.container;\"string\"==typeof r&&(r=n.select(r)),r.datum(e).each(function(e,r){function o(e,r){return{r:t.radialScale(e[1]),t:(t.angularScale(e[0])+t.orientation)*Math.PI/180}}function i(t){return{x:t.r*Math.cos(t.t),y:t.r*Math.sin(t.t)}}var l=!!e[0].data.yStack,s=e.map(function(t,e){return l?n.zip(t.data.t[0],t.data.r[0],t.data.yStack[0]):n.zip(t.data.t[0],t.data.r[0])}),c=t.angularScale,u=t.radialScale.domain()[0],f={};f.bar=function(r,a,o){var i=e[o].data,l=t.radialScale(r[1])-t.radialScale(0),s=t.radialScale(r[2]||0),u=i.barWidth;n.select(this).attr({class:\"mark bar\",d:\"M\"+[[l+s,-u/2],[l+s,u/2],[s,u/2],[s,-u/2]].join(\"L\")+\"Z\",transform:function(e,r){return\"rotate(\"+(t.orientation+c(e[0]))+\")\"}})},f.dot=function(t,r,a){var l=t[2]?[t[0],t[1]+t[2]]:t,s=n.svg.symbol().size(e[a].data.dotSize).type(e[a].data.dotType)(t,r);n.select(this).attr({class:\"mark dot\",d:s,transform:function(t,e){var r=i(o(l));return\"translate(\"+[r.x,r.y]+\")\"}})};var d=n.svg.line.radial().interpolate(e[0].data.lineInterpolation).radius(function(e){return t.radialScale(e[1])}).angle(function(e){return t.angularScale(e[0])*Math.PI/180});f.line=function(r,a,o){var i=r[2]?s[o].map(function(t,e){return[t[0],t[1]+t[2]]}):s[o];if(n.select(this).each(f.dot).style({opacity:function(t,r){return+e[o].data.dotVisible},fill:v.stroke(r,a,o)}).attr({class:\"mark dot\"}),!(a>0)){var l=n.select(this.parentNode).selectAll(\"path.line\").data([0]);l.enter().insert(\"path\"),l.attr({class:\"line\",d:d(i),transform:function(e,r){return\"rotate(\"+(t.orientation+90)+\")\"},\"pointer-events\":\"none\"}).style({fill:function(t,e){return v.fill(r,a,o)},\"fill-opacity\":0,stroke:function(t,e){return v.stroke(r,a,o)},\"stroke-width\":function(t,e){return v[\"stroke-width\"](r,a,o)},\"stroke-dasharray\":function(t,e){return v[\"stroke-dasharray\"](r,a,o)},opacity:function(t,e){return v.opacity(r,a,o)},display:function(t,e){return v.display(r,a,o)}})}};var h=t.angularScale.range(),p=Math.abs(h[1]-h[0])/s[0].length*Math.PI/180,g=n.svg.arc().startAngle(function(t){return-p/2}).endAngle(function(t){return p/2}).innerRadius(function(e){return t.radialScale(u+(e[2]||0))}).outerRadius(function(e){return t.radialScale(u+(e[2]||0))+t.radialScale(e[1])});f.arc=function(e,r,a){n.select(this).attr({class:\"mark arc\",d:g,transform:function(e,r){return\"rotate(\"+(t.orientation+c(e[0])+90)+\")\"}})};var v={fill:function(t,r,n){return e[n].data.color},stroke:function(t,r,n){return e[n].data.strokeColor},\"stroke-width\":function(t,r,n){return e[n].data.strokeSize+\"px\"},\"stroke-dasharray\":function(t,r,n){return a[e[n].data.strokeDash]},opacity:function(t,r,n){return e[n].data.opacity},display:function(t,r,n){return void 0===e[n].data.visible||e[n].data.visible?\"block\":\"none\"}},m=n.select(this).selectAll(\"g.layer\").data(s);m.enter().append(\"g\").attr({class:\"layer\"});var y=m.selectAll(\"path.mark\").data(function(t,e){return t});y.enter().append(\"path\").attr({class:\"mark\"}),y.style(v).each(f[t.geometryType]),y.exit().remove(),m.exit().remove()})}var e=[i.PolyChart.defaultConfig()],r=n.dispatch(\"hover\"),a={solid:\"none\",dash:[5,2],dot:[2,5]};return t.config=function(t){return arguments.length?(t.forEach(function(t,r){e[r]||(e[r]={}),o(e[r],i.PolyChart.defaultConfig()),o(e[r],t)}),this):e},t.getColorScale=function(){},n.rebind(t,r,\"on\"),t},i.PolyChart.defaultConfig=function(){return{data:{name:\"geom1\",t:[[1,2,3,4]],r:[[1,2,3,4]],dotType:\"circle\",dotSize:64,dotVisible:!1,barWidth:20,color:\"#ffa500\",strokeSize:1,strokeColor:\"silver\",strokeDash:\"solid\",opacity:1,index:0,visible:!0,visibleInLegend:!0},geometryConfig:{geometry:\"LinePlot\",geometryType:\"arc\",direction:\"clockwise\",orientation:0,container:\"body\",radialScale:null,angularScale:null,colorScale:n.scale.category20()}}},i.BarChart=function(){return i.PolyChart()},i.BarChart.defaultConfig=function(){return{geometryConfig:{geometryType:\"bar\"}}},i.AreaChart=function(){return i.PolyChart()},i.AreaChart.defaultConfig=function(){return{geometryConfig:{geometryType:\"arc\"}}},i.DotPlot=function(){return i.PolyChart()},i.DotPlot.defaultConfig=function(){return{geometryConfig:{geometryType:\"dot\",dotType:\"circle\"}}},i.LinePlot=function(){return i.PolyChart()},i.LinePlot.defaultConfig=function(){return{geometryConfig:{geometryType:\"line\"}}},i.Legend=function(){function t(){var r=e.legendConfig,a=e.data.map(function(t,e){return[].concat(t).map(function(t,n){var a=o({},r.elements[e]);return a.name=t,a.color=[].concat(r.elements[e].color)[n],a})}),i=n.merge(a);i=i.filter(function(t,e){return r.elements[e]&&(r.elements[e].visibleInLegend||void 0===r.elements[e].visibleInLegend)}),r.reverseOrder&&(i=i.reverse());var l=r.container;(\"string\"==typeof l||l.nodeName)&&(l=n.select(l));var s=i.map(function(t,e){return t.color}),c=r.fontSize,u=null==r.isContinuous?\"number\"==typeof i[0]:r.isContinuous,f=u?r.height:c*i.length,d=l.classed(\"legend-group\",!0),h=d.selectAll(\"svg\").data([0]),p=h.enter().append(\"svg\").attr({width:300,height:f+c,xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",version:\"1.1\"});p.append(\"g\").classed(\"legend-axis\",!0),p.append(\"g\").classed(\"legend-marks\",!0);var g=n.range(i.length),v=n.scale[u?\"linear\":\"ordinal\"]().domain(g).range(s),m=n.scale[u?\"linear\":\"ordinal\"]().domain(g)[u?\"range\":\"rangePoints\"]([0,f]),y=function(t,e){var r=3*e;return\"line\"===t?\"M\"+[[-e/2,-e/12],[e/2,-e/12],[e/2,e/12],[-e/2,e/12]]+\"Z\":n.svg.symbolTypes.indexOf(t)!=-1?n.svg.symbol().type(t).size(r)():n.svg.symbol().type(\"square\").size(r)()};if(u){var x=h.select(\".legend-marks\").append(\"defs\").append(\"linearGradient\").attr({id:\"grad1\",x1:\"0%\",y1:\"0%\",x2:\"0%\",y2:\"100%\"}).selectAll(\"stop\").data(s);x.enter().append(\"stop\"),x.attr({offset:function(t,e){return e/(s.length-1)*100+\"%\"}}).style({\"stop-color\":function(t,e){return t}}),h.append(\"rect\").classed(\"legend-mark\",!0).attr({height:r.height,width:r.colorBandWidth,fill:\"url(#grad1)\"})}else{var b=h.select(\".legend-marks\").selectAll(\"path.legend-mark\").data(i);b.enter().append(\"path\").classed(\"legend-mark\",!0),b.attr({transform:function(t,e){return\"translate(\"+[c/2,m(e)+c/2]+\")\"},d:function(t,e){var r=t.symbol;return y(r,c)},fill:function(t,e){return v(e)}}),b.exit().remove()}var _=n.svg.axis().scale(m).orient(\"right\"),w=h.select(\"g.legend-axis\").attr({transform:\"translate(\"+[u?r.colorBandWidth:c,c/2]+\")\"}).call(_);return w.selectAll(\".domain\").style({fill:\"none\",stroke:\"none\"}),w.selectAll(\"line\").style({fill:\"none\",stroke:u?r.textColor:\"none\"}),w.selectAll(\"text\").style({fill:r.textColor,\"font-size\":r.fontSize}).text(function(t,e){return i[e].name}),t}var e=i.Legend.defaultConfig(),r=n.dispatch(\"hover\");return t.config=function(t){return arguments.length?(o(e,t),this):e},n.rebind(t,r,\"on\"),t},i.Legend.defaultConfig=function(t,e){return{data:[\"a\",\"b\",\"c\"],legendConfig:{elements:[{symbol:\"line\",color:\"red\"},{symbol:\"square\",color:\"yellow\"},{symbol:\"diamond\",color:\"limegreen\"}],height:150,colorBandWidth:30,fontSize:12,container:\"body\",isContinuous:null,textColor:\"grey\",reverseOrder:!1}}},i.tooltipPanel=function(){var t,e,r,a={container:null,hasTick:!1,fontSize:12,color:\"white\",padding:5},l=\"tooltip-\"+i.tooltipPanel.uid++,s=function(){t=a.container.selectAll(\"g.\"+l).data([0]);var n=t.enter().append(\"g\").classed(l,!0).style({\"pointer-events\":\"none\",display:\"none\"});return r=n.append(\"path\").style({fill:\"white\",\"fill-opacity\":.9}).attr({d:\"M0 0\"}),e=n.append(\"text\").attr({dx:a.padding+10,dy:.3*+a.fontSize}),s};return s.text=function(o){var i=n.hsl(a.color).l,l=i>=.5?\"#aaa\":\"white\",c=i>=.5?\"black\":\"white\",u=o||\"\";e.style({fill:c,\"font-size\":a.fontSize+\"px\"}).text(u);var f=a.padding,d=e.node().getBBox(),h={fill:a.color,stroke:l,\"stroke-width\":\"2px\"},p=d.width+2*f+10,g=d.height+2*f;return r.attr({d:\"M\"+[[10,-g/2],[10,-g/4],[a.hasTick?0:10,0],[10,g/4],[10,g/2],[p,g/2],[p,-g/2]].join(\"L\")+\"Z\"}).style(h),t.attr({transform:\"translate(\"+[10,-g/2+2*f]+\")\"}),t.style({display:\"block\"}),s},s.move=function(e){if(t)return t.attr({transform:\"translate(\"+[e[0],e[1]]+\")\"}).style({display:\"block\"}),s},s.hide=function(){if(t)return t.style({display:\"none\"}),s},s.show=function(){if(t)return t.style({display:\"block\"}),s},s.config=function(t){return o(a,t),s},s},i.tooltipPanel.uid=1,i.adapter={},i.adapter.plotly=function(){var t={};return t.convert=function(t,e){var r={};if(t.data&&(r.data=t.data.map(function(t,r){var n=o({},t);return[[n,[\"marker\",\"color\"],[\"color\"]],[n,[\"marker\",\"opacity\"],[\"opacity\"]],[n,[\"marker\",\"line\",\"color\"],[\"strokeColor\"]],[n,[\"marker\",\"line\",\"dash\"],[\"strokeDash\"]],[n,[\"marker\",\"line\",\"width\"],[\"strokeSize\"]],[n,[\"marker\",\"symbol\"],[\"dotType\"]],[n,[\"marker\",\"size\"],[\"dotSize\"]],[n,[\"marker\",\"barWidth\"],[\"barWidth\"]],[n,[\"line\",\"interpolation\"],[\"lineInterpolation\"]],[n,[\"showlegend\"],[\"visibleInLegend\"]]].forEach(function(t,r){i.util.translator.apply(null,t.concat(e))}),e||delete n.marker,e&&delete n.groupId,e?(\"LinePlot\"===n.geometry?(n.type=\"scatter\",n.dotVisible===!0?(delete n.dotVisible,n.mode=\"lines+markers\"):n.mode=\"lines\"):\"DotPlot\"===n.geometry?(n.type=\"scatter\",n.mode=\"markers\"):\"AreaChart\"===n.geometry?n.type=\"area\":\"BarChart\"===n.geometry&&(n.type=\"bar\"),delete n.geometry):(\"scatter\"===n.type?\"lines\"===n.mode?n.geometry=\"LinePlot\":\"markers\"===n.mode?n.geometry=\"DotPlot\":\"lines+markers\"===n.mode&&(n.geometry=\"LinePlot\",n.dotVisible=!0):\"area\"===n.type?n.geometry=\"AreaChart\":\"bar\"===n.type&&(n.geometry=\"BarChart\"),delete n.mode,delete n.type),n}),!e&&t.layout&&\"stack\"===t.layout.barmode)){var a=i.util.duplicates(r.data.map(function(t,e){return t.geometry}));r.data.forEach(function(t,e){var n=a.indexOf(t.geometry);n!=-1&&(r.data[e].groupId=n)})}if(t.layout){var l=o({},t.layout);if([[l,[\"plot_bgcolor\"],[\"backgroundColor\"]],[l,[\"showlegend\"],[\"showLegend\"]],[l,[\"radialaxis\"],[\"radialAxis\"]],[l,[\"angularaxis\"],[\"angularAxis\"]],[l.angularaxis,[\"showline\"],[\"gridLinesVisible\"]],[l.angularaxis,[\"showticklabels\"],[\"labelsVisible\"]],[l.angularaxis,[\"nticks\"],[\"ticksCount\"]],[l.angularaxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.angularaxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.angularaxis,[\"range\"],[\"domain\"]],[l.angularaxis,[\"endpadding\"],[\"endPadding\"]],[l.radialaxis,[\"showline\"],[\"gridLinesVisible\"]],[l.radialaxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.radialaxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.radialaxis,[\"range\"],[\"domain\"]],[l.angularAxis,[\"showline\"],[\"gridLinesVisible\"]],[l.angularAxis,[\"showticklabels\"],[\"labelsVisible\"]],[l.angularAxis,[\"nticks\"],[\"ticksCount\"]],[l.angularAxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.angularAxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.angularAxis,[\"range\"],[\"domain\"]],[l.angularAxis,[\"endpadding\"],[\"endPadding\"]],[l.radialAxis,[\"showline\"],[\"gridLinesVisible\"]],[l.radialAxis,[\"tickorientation\"],[\"tickOrientation\"]],[l.radialAxis,[\"ticksuffix\"],[\"ticksSuffix\"]],[l.radialAxis,[\"range\"],[\"domain\"]],[l.font,[\"outlinecolor\"],[\"outlineColor\"]],[l.legend,[\"traceorder\"],[\"reverseOrder\"]],[l,[\"labeloffset\"],[\"labelOffset\"]],[l,[\"defaultcolorrange\"],[\"defaultColorRange\"]]].forEach(function(t,r){i.util.translator.apply(null,t.concat(e))}),e?(void 0!==l.tickLength&&(l.angularaxis.ticklen=l.tickLength,delete l.tickLength),l.tickColor&&(l.angularaxis.tickcolor=l.tickColor,delete l.tickColor)):(l.angularAxis&&void 0!==l.angularAxis.ticklen&&(l.tickLength=l.angularAxis.ticklen),l.angularAxis&&void 0!==l.angularAxis.tickcolor&&(l.tickColor=l.angularAxis.tickcolor)),l.legend&&\"boolean\"!=typeof l.legend.reverseOrder&&(l.legend.reverseOrder=\"normal\"!=l.legend.reverseOrder),l.legend&&\"boolean\"==typeof l.legend.traceorder&&(l.legend.traceorder=l.legend.traceorder?\"reversed\":\"normal\",delete l.legend.reverseOrder),l.margin&&void 0!==l.margin.t){var s=[\"t\",\"r\",\"b\",\"l\",\"pad\"],c=[\"top\",\"right\",\"bottom\",\"left\",\"pad\"],u={};n.entries(l.margin).forEach(function(t,e){u[c[s.indexOf(t.key)]]=t.value}),l.margin=u}e&&(delete l.needsEndSpacing,delete l.minorTickColor,delete l.minorTicks,delete l.angularaxis.ticksCount,delete l.angularaxis.ticksCount,delete l.angularaxis.ticksStep,delete l.angularaxis.rewriteTicks,delete l.angularaxis.nticks,delete l.radialaxis.ticksCount,delete l.radialaxis.ticksCount,delete l.radialaxis.ticksStep,delete l.radialaxis.rewriteTicks,delete l.radialaxis.nticks),r.layout=l}return r},t}},{\"../../lib\":136,d3:7}],204:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../lib\"),o=t(\"../../components/color\"),i=t(\"./micropolar\"),l=t(\"./undo_manager\"),s=a.extendDeepAll,c=e.exports={};c.framework=function(t){function e(e,a){return a&&(f=a),n.select(n.select(f).node().parentNode).selectAll(\".svg-container>*:not(.chart-root)\").remove(),r=r?s(r,e):e,o||(o=i.Axis()),u=i.adapter.plotly().convert(r),o.config(u).render(f),t.data=r.data,t.layout=r.layout,c.fillLayout(t),r}var r,a,o,u,f,d=new l;return e.isPolar=!0,e.svg=function(){return o.svg()},e.getConfig=function(){return r},e.getLiveConfig=function(){return i.adapter.plotly().convert(o.getLiveConfig(),!0)},e.getLiveScales=function(){return{t:o.angularScale(),r:o.radialScale()}},e.setUndoPoint=function(){var t=this,e=i.util.cloneJson(r);!function(e,r){d.add({undo:function(){r&&t(r)},redo:function(){t(e)}})}(e,a),a=i.util.cloneJson(e)},e.undo=function(){d.undo()},e.redo=function(){d.redo()},e},c.fillLayout=function(t){var e=n.select(t).selectAll(\".plot-container\"),r=e.selectAll(\".svg-container\"),a=t.framework&&t.framework.svg&&t.framework.svg(),i={width:800,height:600,paper_bgcolor:o.background,_container:e,_paperdiv:r,_paper:a};t._fullLayout=s(i,t.layout)}},{\"../../components/color\":25,\"../../lib\":136,\"./micropolar\":203,\"./undo_manager\":205,d3:7}],205:[function(t,e,r){\"use strict\";e.exports=function(){function t(t,e){return t?(a=!0,t[e](),a=!1,this):this}var e,r=[],n=-1,a=!1;return{add:function(t){return a?this:(r.splice(n+1,r.length-n),r.push(t),n=r.length-1,this)},setCallback:function(t){e=t},undo:function(){var a=r[n];return a?(t(a,\"undo\"),n-=1,e&&e(a.undo),this):this},redo:function(){var a=r[n+1];return a?(t(a,\"redo\"),n+=1,e&&e(a.redo),this):this},clear:function(){r=[],n=-1},hasUndo:function(){return n!==-1},hasRedo:function(){return n<r.length-1},getCommands:function(){return r},getPreviousCommand:function(){return r[n-1]},getIndex:function(){return n}}}},{}],206:[function(t,e,r){\"use strict\";function n(t){if(t.layoutAttributes){var e=t.layoutAttributes._arrayAttrRegexps;if(e)for(var n=0;n<e.length;n++)l(r.layoutArrayRegexes,e[n])}}function a(t){return\"object\"==typeof t&&(t=t.type),t}var o=t(\"./lib/loggers\"),i=t(\"./lib/noop\"),l=t(\"./lib/push_unique\"),s=t(\"./plots/attributes\");r.modules={},r.allCategories={},r.allTypes=[],r.subplotsRegistry={},r.transformsRegistry={},r.componentsRegistry={},r.layoutArrayContainers=[],r.layoutArrayRegexes=[],r.register=function(t,e,n,a){if(r.modules[e])return void o.log(\"Type \"+e+\" already registered\");for(var i={},l=0;l<n.length;l++)i[n[l]]=!0,r.allCategories[n[l]]=!0;r.modules[e]={_module:t,categories:i},a&&Object.keys(a).length&&(r.modules[e].meta=a),r.allTypes.push(e)},r.registerSubplot=function(t){var e=t.name;if(r.subplotsRegistry[e])return void o.log(\"Plot type \"+e+\" already registered.\");n(t),r.subplotsRegistry[e]=t},r.registerComponent=function(t){var e=t.name;r.componentsRegistry[e]=t,t.layoutAttributes&&(t.layoutAttributes._isLinkedToArray&&l(r.layoutArrayContainers,e),n(t))},r.getModule=function(t){if(void 0!==t.r)return o.warn(\"Tried to put a polar trace on an incompatible graph of cartesian data. Ignoring this dataset.\",t),!1;var e=r.modules[a(t)];return!!e&&e._module},r.traceIs=function(t,e){if(\"various\"===(t=a(t)))return!1;var n=r.modules[t];return n||(t&&\"area\"!==t&&o.log(\"Unrecognized trace type \"+t+\".\"),n=r.modules[s.type.dflt]),!!n.categories[e]},r.getComponentMethod=function(t,e){var n=r.componentsRegistry[t];return n?n[e]||i:i}},{\"./lib/loggers\":139,\"./lib/noop\":143,\"./lib/push_unique\":147,\"./plots/attributes\":169}],207:[function(t,e,r){\"use strict\";function n(t){var e;switch(t){case\"themes__thumb\":e={autosize:!0,width:150,height:150,title:\"\",showlegend:!1,margin:{l:5,r:5,t:5,b:5,pad:0},annotations:[]};break;case\"thumbnail\":e={title:\"\",hidesources:!0,showlegend:!1,borderwidth:0,bordercolor:\"\",margin:{l:1,r:1,t:1,b:1,pad:0},annotations:[]};break;default:e={}}return e}function a(t){return[\"xaxis\",\"yaxis\",\"zaxis\"].indexOf(t.slice(0,5))>-1}var o=t(\"../lib\"),i=t(\"../plots/plots\"),l=o.extendFlat,s=o.extendDeep;e.exports=function(t,e){t.framework&&t.framework.isPolar&&(t=t.framework.getConfig());var r,o=t.data,c=t.layout,u=s([],o),f=s({},c,n(e.tileClass)),d=t._context||{};if(e.width&&(f.width=e.width),e.height&&(f.height=e.height),\"thumbnail\"===e.tileClass||\"themes__thumb\"===e.tileClass){f.annotations=[];var h=Object.keys(f);for(r=0;r<h.length;r++)a(h[r])&&(f[h[r]].title=\"\");for(r=0;r<u.length;r++){var p=u[r];p.showscale=!1,p.marker&&(p.marker.showscale=!1),\"pie\"===p.type&&(p.textposition=\"none\")}}if(Array.isArray(e.annotations))for(r=0;r<e.annotations.length;r++)f.annotations.push(e.annotations[r]);var g=i.getSubplotIds(f,\"gl3d\");if(g.length){var v={};for(\"thumbnail\"===e.tileClass&&(v={title:\"\",showaxeslabels:!1,showticklabels:!1,linetickenable:!1}),r=0;r<g.length;r++){var m=f[g[r]];m.xaxis||(m.xaxis={}),m.yaxis||(m.yaxis={}),m.zaxis||(m.zaxis={}),l(m.xaxis,v),l(m.yaxis,v),l(m.zaxis,v),m._scene=null}}var y=document.createElement(\"div\");e.tileClass&&(y.className=e.tileClass);var x={gd:y,td:y,layout:f,data:u,config:{staticPlot:void 0===e.staticPlot||e.staticPlot,plotGlPixelRatio:void 0===e.plotGlPixelRatio?2:e.plotGlPixelRatio,displaylogo:e.displaylogo||!1,showLink:e.showLink||!1,showTips:e.showTips||!1,mapboxAccessToken:d.mapboxAccessToken}}\n",
|
|
";return\"transparent\"!==e.setBackground&&(x.config.setBackground=e.setBackground||\"opaque\"),x.gd.defaultLayout=n(e.tileClass),x}},{\"../lib\":136,\"../plots/plots\":199}],208:[function(t,e,r){\"use strict\";function n(t,e){return e=e||{},e.format=e.format||\"png\",new Promise(function(r,n){t._snapshotInProgress&&n(new Error(\"Snapshotting already in progress.\")),o.isIE()&&\"svg\"!==e.format&&n(new Error(\"Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.\")),t._snapshotInProgress=!0;var l=a(t,e),s=e.filename||t.fn||\"newplot\";s+=\".\"+e.format,l.then(function(e){return t._snapshotInProgress=!1,i(e,s)}).then(function(t){r(t)}).catch(function(e){t._snapshotInProgress=!1,n(e)})})}var a=t(\"../plot_api/to_image\"),o=t(\"../lib\"),i=t(\"./filesaver\");e.exports=n},{\"../lib\":136,\"../plot_api/to_image\":164,\"./filesaver\":209}],209:[function(t,e,r){\"use strict\";var n=function(t,e){var r=document.createElement(\"a\"),n=\"download\"in r,a=/Version\\/[\\d\\.]+.*Safari/.test(navigator.userAgent);return new Promise(function(o,i){\"undefined\"!=typeof navigator&&/MSIE [1-9]\\./.test(navigator.userAgent)&&i(new Error(\"IE < 10 unsupported\")),a&&(document.location.href=\"data:application/octet-stream\"+t.slice(t.search(/[,;]/)),o(e)),e||(e=\"download\"),n&&(r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),o(e)),\"undefined\"!=typeof navigator&&navigator.msSaveBlob&&(navigator.msSaveBlob(new Blob([t]),e),o(e)),i(new Error(\"download error\"))})};e.exports=n},{}],210:[function(t,e,r){\"use strict\";r.getDelay=function(t){return t._has&&(t._has(\"gl3d\")||t._has(\"gl2d\"))?500:0},r.getRedrawFunc=function(t){if(!(t.data&&t.data[0]&&t.data[0].r))return function(){(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()})}}},{}],211:[function(t,e,r){\"use strict\";var n=t(\"./helpers\"),a={getDelay:n.getDelay,getRedrawFunc:n.getRedrawFunc,clone:t(\"./cloneplot\"),toSVG:t(\"./tosvg\"),svgToImg:t(\"./svgtoimg\"),toImage:t(\"./toimage\"),downloadImage:t(\"./download\")};e.exports=a},{\"./cloneplot\":207,\"./download\":208,\"./helpers\":210,\"./svgtoimg\":212,\"./toimage\":213,\"./tosvg\":214}],212:[function(t,e,r){\"use strict\";function n(t){var e=t.emitter||new o,r=new Promise(function(n,o){var i=window.Image,l=t.svg,s=t.format||\"png\";if(a.isIE()&&(l=l.replace(/\"/gi,\"'\"),l=l.replace(/(\\('#)(.*)('\\))/gi,'(\"$2\")'),l=l.replace(/(\\\\')/gi,'\"'),\"svg\"!==s)){var c=new Error(\"Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.\");return o(c),t.promise?r:e.emit(\"error\",c)}var u=t.canvas,f=u.getContext(\"2d\"),d=new i,h=\"data:image/svg+xml,\"+encodeURIComponent(l);u.height=t.height||150,u.width=t.width||300,d.onload=function(){var r;switch(\"svg\"!==s&&f.drawImage(d,0,0),s){case\"jpeg\":r=u.toDataURL(\"image/jpeg\");break;case\"png\":r=u.toDataURL(\"image/png\");break;case\"webp\":r=u.toDataURL(\"image/webp\");break;case\"svg\":r=h;break;default:if(o(new Error(\"Image format is not jpeg, png or svg\")),!t.promise)return e.emit(\"error\",\"Image format is not jpeg, png or svg\")}n(r),t.promise||e.emit(\"success\",r)},d.onerror=function(r){if(o(r),!t.promise)return e.emit(\"error\",r)},d.src=h});return t.promise?r:e}var a=t(\"../lib\"),o=t(\"events\").EventEmitter;e.exports=n},{\"../lib\":136,events:9}],213:[function(t,e,r){\"use strict\";function n(t,e){function r(){var t=l.getDelay(d._fullLayout);setTimeout(function(){var t=c(d),r=document.createElement(\"canvas\");r.id=i.randstr(),n=u({format:e.format,width:d._fullLayout.width,height:d._fullLayout.height,canvas:r,emitter:n,svg:t}),n.clean=function(){d&&document.body.removeChild(d)}},t)}var n=new a,f=s(t,{format:\"png\"}),d=f.gd;d.style.position=\"absolute\",d.style.left=\"-5000px\",document.body.appendChild(d);var h=l.getRedrawFunc(d);return o.plot(d,f.data,f.layout,f.config).then(h).then(r).catch(function(t){n.emit(\"error\",t)}),n}var a=t(\"events\").EventEmitter,o=t(\"../plotly\"),i=t(\"../lib\"),l=t(\"./helpers\"),s=t(\"./cloneplot\"),c=t(\"./tosvg\"),u=t(\"./svgtoimg\");e.exports=n},{\"../lib\":136,\"../plotly\":166,\"./cloneplot\":207,\"./helpers\":210,\"./svgtoimg\":212,\"./tosvg\":214,events:9}],214:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../lib/svg_text_utils\"),o=t(\"../components/drawing\"),i=t(\"../components/color\"),l=t(\"../constants/xmlns_namespaces\");e.exports=function(t,e){var r,s=t._fullLayout,c=s._paper,u=s._toppaper;c.insert(\"rect\",\":first-child\").call(o.setRect,0,0,s.width,s.height).call(i.fill,s.paper_bgcolor);var f=s._basePlotModules||[];for(r=0;r<f.length;r++){var d=f[r];d.toSVG&&d.toSVG(t)}if(u){var h=u.node().childNodes,p=Array.prototype.slice.call(h);for(r=0;r<p.length;r++){var g=p[r];g.childNodes.length&&c.node().appendChild(g)}}s._draggers&&s._draggers.remove(),c.node().style.background=\"\",c.selectAll(\"text\").attr(\"data-unformatted\",null).each(function(){var t=n.select(this);if(\"hidden\"===t.style(\"visibility\"))return void t.remove();t.style(\"visibility\",\"visible\");var e=t.style(\"font-family\");e&&e.indexOf('\"')!==-1&&t.style(\"font-family\",e.replace(/\"/g,\"TOBESTRIPPED\"))}),\"pdf\"!==e&&\"eps\"!==e||c.selectAll(\"#MathJax_SVG_glyphs path\").attr(\"stroke-width\",0),c.node().setAttributeNS(l.xmlns,\"xmlns\",l.svg),c.node().setAttributeNS(l.xmlns,\"xmlns:xlink\",l.xlink);var v=(new window.XMLSerializer).serializeToString(c.node());return v=a.html_entity_decode(v),v=a.xml_entity_encode(v),v=v.replace(/(\"TOBESTRIPPED)|(TOBESTRIPPED\")/g,\"'\")}},{\"../components/color\":25,\"../components/drawing\":49,\"../constants/xmlns_namespaces\":124,\"../lib/svg_text_utils\":153,d3:7}],215:[function(t,e,r){\"use strict\";var n=t(\"../../lib\").mergeArray;e.exports=function(t,e){n(e.text,t,\"tx\"),n(e.hovertext,t,\"htx\");var r=e.marker;if(r){n(r.opacity,t,\"mo\"),n(r.color,t,\"mc\");var a=r.line;a&&(n(a.color,t,\"mlc\"),n(a.width,t,\"mlw\"))}}},{\"../../lib\":136}],216:[function(t,e,r){\"use strict\";var n=t(\"../scatter/attributes\"),a=t(\"../../components/colorscale/color_attributes\"),o=t(\"../../components/errorbars/attributes\"),i=t(\"../../components/colorbar/attributes\"),l=t(\"../../plots/font_attributes\"),s=t(\"../../lib/extend\").extendFlat,c=t(\"../../lib/extend\").extendDeep,u=c({},l);u.family.arrayOk=!0,u.size.arrayOk=!0,u.color.arrayOk=!0;var f=n.marker,d=f.line,h=s({},d.width,{dflt:0}),p=s({},{width:h},a(\"marker.line\")),g=s({},{line:p},a(\"marker\"),{showscale:f.showscale,colorbar:i});e.exports={x:n.x,x0:n.x0,dx:n.dx,y:n.y,y0:n.y0,dy:n.dy,text:n.text,hovertext:n.hovertext,textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"none\",arrayOk:!0},textfont:s({},u,{}),insidetextfont:s({},u,{}),outsidetextfont:s({},u,{}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"]},base:{valType:\"any\",dflt:null,arrayOk:!0},offset:{valType:\"number\",dflt:null,arrayOk:!0},width:{valType:\"number\",dflt:null,min:0,arrayOk:!0},marker:g,r:n.r,t:n.t,error_y:o,error_x:o,_deprecated:{bardir:{valType:\"enumerated\",values:[\"v\",\"h\"]}}}},{\"../../components/colorbar/attributes\":26,\"../../components/colorscale/color_attributes\":32,\"../../components/errorbars/attributes\":51,\"../../lib/extend\":132,\"../../plots/font_attributes\":195,\"../scatter/attributes\":240}],217:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../components/colorscale/has_colorscale\"),i=t(\"../../components/colorscale/calc\"),l=t(\"./arrays_to_calcdata\");e.exports=function(t,e){var r,s,c,u,f,d=a.getFromId(t,e.xaxis||\"x\"),h=a.getFromId(t,e.yaxis||\"y\"),p=e.orientation||(e.x&&!e.y?\"h\":\"v\");\"h\"===p?(r=d,c=d.makeCalcdata(e,\"x\"),s=h.makeCalcdata(e,\"y\"),f=e.xcalendar):(r=h,c=h.makeCalcdata(e,\"y\"),s=d.makeCalcdata(e,\"x\"),f=e.ycalendar);var g=Math.min(s.length,c.length),v=new Array(g);for(u=0;u<g;u++)v[u]={p:s[u],s:c[u]};var m,y=e.base;if(Array.isArray(y)){for(u=0;u<Math.min(y.length,v.length);u++)m=r.d2c(y[u],0,f),v[u].b=n(m)?m:0;for(;u<v.length;u++)v[u].b=0}else for(m=r.d2c(y,0,f),m=n(m)?m:0,u=0;u<v.length;u++)v[u].b=m;return o(e,\"marker\")&&i(e,e.marker.color,\"marker\",\"c\"),o(e,\"marker.line\")&&i(e,e.marker.line.color,\"marker.line\",\"c\"),l(v,e),v}},{\"../../components/colorscale/calc\":31,\"../../components/colorscale/has_colorscale\":38,\"../../plots/cartesian/axes\":171,\"./arrays_to_calcdata\":215,\"fast-isnumeric\":10}],218:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../components/color\"),o=t(\"../scatter/xy_defaults\"),i=t(\"../bar/style_defaults\"),l=t(\"../../components/errorbars/defaults\"),s=t(\"./attributes\");e.exports=function(t,e,r,c){function u(r,a){return n.coerce(t,e,s,r,a)}var f=n.coerceFont;if(!o(t,e,c,u))return void(e.visible=!1);u(\"orientation\",e.x&&!e.y?\"h\":\"v\"),u(\"base\"),u(\"offset\"),u(\"width\"),u(\"text\"),u(\"hovertext\");var d=u(\"textposition\"),h=Array.isArray(d)||\"auto\"===d,p=h||\"inside\"===d,g=h||\"outside\"===d;if(p||g){var v=f(u,\"textfont\",c.font);p&&f(u,\"insidetextfont\",v),g&&f(u,\"outsidetextfont\",v)}i(t,e,u,r,c),l(t,e,a.defaultLine,{axis:\"y\"}),l(t,e,a.defaultLine,{axis:\"x\",inherit:\"y\"})}},{\"../../components/color\":25,\"../../components/errorbars/defaults\":54,\"../../lib\":136,\"../bar/style_defaults\":227,\"../scatter/xy_defaults\":262,\"./attributes\":216}],219:[function(t,e,r){\"use strict\";var n=t(\"../../components/fx\"),a=t(\"../../components/errorbars\"),o=t(\"../../components/color\");e.exports=function(t,e,r,i){var l,s,c,u,f,d,h,p=t.cd,g=p[0].trace,v=p[0].t,m=t.xa,y=t.ya,x=function(t){return n.inbox(u(t)-l,f(t)-l)};\"h\"===g.orientation?(l=r,s=function(t){return t.y-t.w/2},c=function(t){return t.y+t.w/2},d=function(t){return n.inbox(t.b-e,t.x-e)+(t.x-e)/(t.x-t.b)},h=x):(l=e,s=function(t){return t.x-t.w/2},c=function(t){return t.x+t.w/2},h=function(t){return n.inbox(t.b-r,t.y-r)+(t.y-r)/(t.y-t.b)},d=x),u=\"closest\"===i?s:function(t){return Math.min(s(t),t.p-v.bargroupwidth/2)},f=\"closest\"===i?c:function(t){return Math.max(c(t),t.p+v.bargroupwidth/2)};var b=n.getDistanceFunction(i,d,h);if(n.getClosest(p,b,t),t.index!==!1){var _=t.index,w=p[_],k=w.mcc||g.marker.color,M=w.mlcc||g.marker.line.color,A=w.mlw||g.marker.line.width;o.opacity(k)?t.color=k:o.opacity(M)&&A&&(t.color=M);var T=g.base?w.b+w.s:w.s;return\"h\"===g.orientation?(t.x0=t.x1=m.c2p(w.x,!0),t.xLabelVal=T,t.y0=y.c2p(u(w),!0),t.y1=y.c2p(f(w),!0),t.yLabelVal=w.p):(t.y0=t.y1=y.c2p(w.y,!0),t.yLabelVal=T,t.x0=m.c2p(u(w),!0),t.x1=m.c2p(f(w),!0),t.xLabelVal=w.p),w.htx?t.text=w.htx:g.hovertext?t.text=g.hovertext:w.tx?t.text=w.tx:g.text&&(t.text=g.text),a.hoverInfo(w,g,t),[t]}}},{\"../../components/color\":25,\"../../components/errorbars\":55,\"../../components/fx\":66}],220:[function(t,e,r){\"use strict\";var n={};n.attributes=t(\"./attributes\"),n.layoutAttributes=t(\"./layout_attributes\"),n.supplyDefaults=t(\"./defaults\"),n.supplyLayoutDefaults=t(\"./layout_defaults\"),n.calc=t(\"./calc\"),n.setPositions=t(\"./set_positions\"),n.colorbar=t(\"../scatter/colorbar\"),n.arraysToCalcdata=t(\"./arrays_to_calcdata\"),n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.hoverPoints=t(\"./hover\"),n.moduleType=\"trace\",n.name=\"bar\",n.basePlotModule=t(\"../../plots/cartesian\"),n.categories=[\"cartesian\",\"bar\",\"oriented\",\"markerColorscale\",\"errorBarsOK\",\"showLegend\"],n.meta={},e.exports=n},{\"../../plots/cartesian\":181,\"../scatter/colorbar\":243,\"./arrays_to_calcdata\":215,\"./attributes\":216,\"./calc\":217,\"./defaults\":218,\"./hover\":219,\"./layout_attributes\":221,\"./layout_defaults\":222,\"./plot\":223,\"./set_positions\":224,\"./style\":226}],221:[function(t,e,r){\"use strict\";e.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\",\"relative\"],dflt:\"group\"},barnorm:{valType:\"enumerated\",values:[\"\",\"fraction\",\"percent\"],dflt:\"\"},bargap:{valType:\"number\",min:0,max:1},bargroupgap:{valType:\"number\",min:0,max:1,dflt:0}}},{}],222:[function(t,e,r){\"use strict\";var n=t(\"../../registry\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../lib\"),i=t(\"./layout_attributes\");e.exports=function(t,e,r){function l(r,n){return o.coerce(t,e,i,r,n)}for(var s=!1,c=!1,u=!1,f={},d=0;d<r.length;d++){var h=r[d];if(n.traceIs(h,\"bar\")){if(s=!0,\"overlay\"!==t.barmode&&\"stack\"!==t.barmode){var p=h.xaxis+h.yaxis;f[p]&&(u=!0),f[p]=!0}if(h.visible&&\"histogram\"===h.type){\"category\"!==a.getFromId({_fullLayout:e},h[\"v\"===h.orientation?\"xaxis\":\"yaxis\"]).type&&(c=!0)}}}if(s){\"overlay\"!==l(\"barmode\")&&l(\"barnorm\"),l(\"bargap\",c&&!u?0:.2),l(\"bargroupgap\")}}},{\"../../lib\":136,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./layout_attributes\":221}],223:[function(t,e,r){\"use strict\";function n(t,e,r,n,i,d,h,p){function g(t,e,r){var n=t.append(\"text\").attr(\"data-notex\",1).text(e).attr({class:\"bartext\",transform:\"\",\"data-bb\":\"\",\"text-anchor\":\"middle\",x:0,y:0}).call(M.font,r);return n.call(w.convertToTspans),n.selectAll(\"tspan.line\").attr({x:0,y:0}),n}var v=r[0].trace,m=v.orientation,y=l(v,n);if(y){var x=s(v,n);if(\"none\"!==x){var b,_,k,A,T=c(v,n,t._fullLayout.font),L=u(v,n,T),C=f(v,n,T),S=t._fullLayout.barmode,z=\"stack\"===S,O=\"relative\"===S,P=z||O,E=r[n],N=!P||E._outmost,I=Math.abs(d-i)-2*D,R=Math.abs(p-h)-2*D;if(\"outside\"===x&&(N||(x=\"inside\")),\"auto\"===x)if(N){b=g(e,y,L),_=M.bBox(b.node()),k=_.width,A=_.height;var F=k>0&&A>0,j=k<=I&&A<=R,B=k<=R&&A<=I,q=\"h\"===m?I>=k*(R/A):R>=A*(I/k);F&&(j||B||q)?x=\"inside\":(x=\"outside\",b.remove(),b=null)}else x=\"inside\";if(!b&&(b=g(e,y,\"outside\"===x?C:L),_=M.bBox(b.node()),k=_.width,A=_.height,k<=0||A<=0))return void b.remove();var H;H=\"outside\"===x?o(i,d,h,p,_,m):a(i,d,h,p,_,m),b.attr(\"transform\",H)}}}function a(t,e,r,n,a,o){var l,s,c,u,f,d=a.width,h=a.height,p=(a.left+a.right)/2,g=(a.top+a.bottom)/2,v=Math.abs(e-t),m=Math.abs(n-r);v>2*D&&m>2*D?(f=D,v-=2*f,m-=2*f):f=0;var y,x;return d<=v&&h<=m?(y=!1,x=1):d<=m&&h<=v?(y=!0,x=1):d<h==v<m?(y=!1,x=Math.min(v/d,m/h)):(y=!0,x=Math.min(m/d,v/h)),y&&(y=90),y?(l=x*h,s=x*d):(l=x*d,s=x*h),\"h\"===o?e<t?(c=e+f+l/2,u=(r+n)/2):(c=e-f-l/2,u=(r+n)/2):n>r?(c=(t+e)/2,u=n-f-s/2):(c=(t+e)/2,u=n+f+s/2),i(p,g,c,u,x,y)}function o(t,e,r,n,a,o){var l,s=\"h\"===o?Math.abs(n-r):Math.abs(e-t);s>2*D&&(l=D,s-=2*l);var c,u,f,d,h=\"h\"===o?Math.min(1,s/a.height):Math.min(1,s/a.width),p=(a.left+a.right)/2,g=(a.top+a.bottom)/2;return c=h*a.width,u=h*a.height,\"h\"===o?e<t?(f=e-l-c/2,d=(r+n)/2):(f=e+l+c/2,d=(r+n)/2):n>r?(f=(t+e)/2,d=n+l+u/2):(f=(t+e)/2,d=n-l-u/2),i(p,g,f,d,h,!1)}function i(t,e,r,n,a,o){var i,l;return a<1?i=\"scale(\"+a+\") \":(a=1,i=\"\"),l=o?\"rotate(\"+o+\" \"+t+\" \"+e+\") \":\"\",\"translate(\"+(r-a*t)+\" \"+(n-a*e)+\")\"+i+l}function l(t,e){var r=h(t.text,e);return p(L,r)}function s(t,e){var r=h(t.textposition,e);return g(C,r)}function c(t,e,r){return d(S,t.textfont,e,r)}function u(t,e,r){return d(z,t.insidetextfont,e,r)}function f(t,e,r){return d(O,t.outsidetextfont,e,r)}function d(t,e,r,n){e=e||{};var a=h(e.family,r),o=h(e.size,r),i=h(e.color,r);return{family:p(t.family,a,n.family),size:v(t.size,o,n.size),color:m(t.color,i,n.color)}}function h(t,e){var r;return Array.isArray(t)?e<t.length&&(r=t[e]):r=t,r}function p(t,e,r){if(\"string\"==typeof e){if(e||!t.noBlank)return e}else if(\"number\"==typeof e&&!t.strict)return String(e);return void 0!==r?r:t.dflt}function g(t,e,r){return t.coerceNumber&&(e=+e),t.values.indexOf(e)!==-1?e:void 0!==r?r:t.dflt}function v(t,e,r){if(x(e)){e=+e;var n=t.min,a=t.max;if(!(void 0!==n&&e<n||void 0!==a&&e>a))return e}return void 0!==r?r:t.dflt}function m(t,e,r){return b(e).isValid()?e:void 0!==r?r:t.dflt}var y=t(\"d3\"),x=t(\"fast-isnumeric\"),b=t(\"tinycolor2\"),_=t(\"../../lib\"),w=t(\"../../lib/svg_text_utils\"),k=t(\"../../components/color\"),M=t(\"../../components/drawing\"),A=t(\"../../components/errorbars\"),T=t(\"./attributes\"),L=T.text,C=T.textposition,S=T.textfont,z=T.insidetextfont,O=T.outsidetextfont,D=3;e.exports=function(t,e,r){var a=e.xaxis,o=e.yaxis,i=t._fullLayout,l=e.plot.select(\".barlayer\").selectAll(\"g.trace.bars\").data(r);l.enter().append(\"g\").attr(\"class\",\"trace bars\"),l.append(\"g\").attr(\"class\",\"points\").each(function(e){var r=e[0].t,l=e[0].trace,s=r.poffset,c=Array.isArray(s);y.select(this).selectAll(\"g.point\").data(_.identity).enter().append(\"g\").classed(\"point\",!0).each(function(r,u){function f(t){return 0===i.bargap&&0===i.bargroupgap?y.round(Math.round(t)-A,2):t}function d(t,e){return Math.abs(t-e)>=2?f(t):t>e?Math.ceil(t):Math.floor(t)}var h,p,g,v,m=r.p+(c?s[u]:s),b=m+r.w,_=r.b,w=_+r.s;if(\"h\"===l.orientation?(g=o.c2p(m,!0),v=o.c2p(b,!0),h=a.c2p(_,!0),p=a.c2p(w,!0)):(h=a.c2p(m,!0),p=a.c2p(b,!0),g=o.c2p(_,!0),v=o.c2p(w,!0)),!(x(h)&&x(p)&&x(g)&&x(v)&&h!==p&&g!==v))return void y.select(this).remove();var M=(r.mlw+1||l.marker.line.width+1||(r.trace?r.trace.marker.line.width:0)+1)-1,A=y.round(M/2%1,2);if(!t._context.staticPlot){var T=k.opacity(r.mc||l.marker.color),L=T<1||M>.01?f:d;h=L(h,p),p=L(p,h),g=L(g,v),v=L(v,g)}var C=y.select(this);C.append(\"path\").attr(\"d\",\"M\"+h+\",\"+g+\"V\"+v+\"H\"+p+\"V\"+g+\"Z\"),n(t,C,e,u,h,p,g,v)})}),l.call(A.plot,e)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/errorbars\":55,\"../../lib\":136,\"../../lib/svg_text_utils\":153,\"./attributes\":216,d3:7,\"fast-isnumeric\":10,tinycolor2:13}],224:[function(t,e,r){\"use strict\";function n(t,e,r,n){if(n.length){var l,s,c,u,f,d=t._fullLayout.barmode,h=\"overlay\"===d,p=\"group\"===d;if(h)a(t,e,r,n);else if(p){for(l=[],s=[],c=0;c<n.length;c++)u=n[c],f=u[0].trace,void 0===f.offset?s.push(u):l.push(u);s.length&&o(t,e,r,s),l.length&&a(t,e,r,l)}else{for(l=[],s=[],c=0;c<n.length;c++)u=n[c],f=u[0].trace,void 0===f.base?s.push(u):l.push(u);s.length&&i(t,e,r,s),l.length&&a(t,e,r,l)}}}function a(t,e,r,n){for(var a=t._fullLayout.barnorm,o=!a,i=0;i<n.length;i++){var s=n[i],c=new w([s],!1,o);l(t,e,c),a?(g(t,r,c),v(t,r,c)):h(t,r,c)}}function o(t,e,r,n){var a=t._fullLayout,o=a.barnorm,i=!o,l=new w(n,!1,i);s(t,e,l),o?(g(t,r,l),v(t,r,l)):h(t,r,l)}function i(t,e,r,n){var a=t._fullLayout,o=a.barmode,i=\"stack\"===o,s=\"relative\"===o,c=t._fullLayout.barnorm,u=s,f=!(c||i||s),d=new w(n,u,f);l(t,e,d),p(t,r,d);for(var h=0;h<n.length;h++)for(var g=n[h],m=0;m<g.length;m++){var y=g[m];if(y.s!==x){var b=y.b+y.s===d.get(y.p,y.s);b&&(y._outmost=!0)}}c&&v(t,r,d)}function l(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.bargap,d=l.bargroupgap,h=r.minDiff,p=r.traces,g=h*(1-s),v=g,m=v*(1-d),y=-m/2;for(n=0;n<p.length;n++)a=p[n],o=a[0],i=o.t,i.barwidth=m,i.poffset=y,i.bargroupwidth=g;r.binWidth=p[0][0].t.barwidth/100,c(r),u(t,e,r),f(t,e,r)}function s(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.bargap,d=l.bargroupgap,h=r.positions,p=r.distinctPositions,g=r.minDiff,v=r.traces,m=h.length!==p.length,y=v.length,x=g*(1-s),b=m?x/y:x,_=b*(1-d);for(n=0;n<y;n++){a=v[n],o=a[0];var w=m?((2*n+1-y)*b-_)/2:-_/2;i=o.t,i.barwidth=_,i.poffset=w,i.bargroupwidth=x}r.binWidth=v[0][0].t.barwidth/100,c(r),u(t,e,r),f(t,e,r,m)}function c(t){var e,r,n,a,o,i,l=t.traces;for(e=0;e<l.length;e++){r=l[e],n=r[0],a=n.trace,i=n.t;var s,c=a.offset,u=i.poffset;if(Array.isArray(c)){for(s=c.slice(0,r.length),o=0;o<s.length;o++)y(s[o])||(s[o]=u);for(o=s.length;o<r.length;o++)s.push(u);i.poffset=s}else void 0!==c&&(i.poffset=c);var f=a.width,d=i.barwidth;if(Array.isArray(f)){var h=f.slice(0,r.length);for(o=0;o<h.length;o++)y(h[o])||(h[o]=d);for(o=h.length;o<r.length;o++)h.push(d);if(i.barwidth=h,void 0===c){for(s=[],o=0;o<r.length;o++)s.push(u+(d-h[o])/2);i.poffset=s}}else void 0!==f&&(i.barwidth=f,void 0===c&&(i.poffset=u+(d-f)/2))}}function u(t,e,r){for(var n=r.traces,a=m(e),o=0;o<n.length;o++)for(var i=n[o],l=i[0].t,s=l.poffset,c=Array.isArray(s),u=l.barwidth,f=Array.isArray(u),d=0;d<i.length;d++){var h=i[d],p=h.w=f?u[d]:u;h[a]=h.p+(c?s[d]:s)+p/2}}function f(t,e,r,n){var a=r.traces,o=r.distinctPositions,i=o[0],l=r.minDiff,s=l/2;_.minDtick(e,l,i,n);for(var c=Math.min.apply(Math,o)-s,u=Math.max.apply(Math,o)+s,f=0;f<a.length;f++){var d=a[f],h=d[0],p=h.trace;if(void 0!==p.width||void 0!==p.offset)for(var g=h.t,v=g.poffset,m=g.barwidth,y=Array.isArray(v),x=Array.isArray(m),b=0;b<d.length;b++){var w=d[b],k=y?v[b]:v,M=x?m[b]:m,A=w.p,T=A+k,L=T+M;c=Math.min(c,T),u=Math.max(u,L)}}_.expand(e,[c,u],{padded:!1})}function d(t,e){y(t[0])?t[0]=Math.min(t[0],e):t[0]=e,y(t[1])?t[1]=Math.max(t[1],e):t[1]=e}function h(t,e,r){for(var n=r.traces,a=m(e),o=e.l2c(e.c2l(0)),i=[o,o],l=0;l<n.length;l++)for(var s=n[l],c=0;c<s.length;c++){var u=s[c],f=u.b,h=f+u.s;u[a]=h,y(e.c2l(h))&&d(i,h),y(e.c2l(f))&&d(i,f)}_.expand(e,i,{tozero:!0,padded:!0})}function p(t,e,r){var n,a,o,i,l=t._fullLayout,s=l.barnorm,c=m(e),u=r.traces,f=e.l2c(e.c2l(0)),h=[f,f];for(n=0;n<u.length;n++)for(a=u[n],o=0;o<a.length;o++)if(i=a[o],i.s!==x){var p=r.put(i.p,i.b+i.s),g=p+i.b+i.s;i.b=p,i[c]=g,s||(y(e.c2l(g))&&d(h,g),y(e.c2l(p))&&d(h,p))}s||_.expand(e,h,{tozero:!0,padded:!0})}function g(t,e,r){for(var n=r.traces,a=0;a<n.length;a++)for(var o=n[a],i=0;i<o.length;i++){var l=o[i];l.s!==x&&r.put(l.p,l.b+l.s)}}function v(t,e,r){function n(t){y(e.c2l(t))&&(t<s-l||t>c+l||!y(s))&&(f=!0,d(u,t))}for(var a=r.traces,o=m(e),i=\"fraction\"===t._fullLayout.barnorm?1:100,l=i/1e9,s=e.l2c(e.c2l(0)),c=\"stack\"===t._fullLayout.barmode?i:s,u=[s,c],f=!1,h=0;h<a.length;h++)for(var p=a[h],g=0;g<p.length;g++){var v=p[g];if(v.s!==x){var b=Math.abs(i/r.get(v.p,v.s));v.b*=b,v.s*=b;var w=v.b,k=w+v.s;v[o]=k,n(k),n(w)}}_.expand(e,u,{tozero:!0,padded:f})}function m(t){return t._id.charAt(0)}var y=t(\"fast-isnumeric\"),x=t(\"../../constants/numerical\").BADNUM,b=t(\"../../registry\"),_=t(\"../../plots/cartesian/axes\"),w=t(\"./sieve.js\");e.exports=function(t,e){var r,a=e.xaxis,o=e.yaxis,i=t._fullData,l=t.calcdata,s=[],c=[];for(r=0;r<i.length;r++){var u=i[r];u.visible===!0&&b.traceIs(u,\"bar\")&&u.xaxis===a._id&&u.yaxis===o._id&&(\"h\"===u.orientation?s.push(l[r]):c.push(l[r]))}n(t,a,o,c),n(t,o,a,s)}},{\"../../constants/numerical\":122,\"../../plots/cartesian/axes\":171,\"../../registry\":206,\"./sieve.js\":225,\"fast-isnumeric\":10}],225:[function(t,e,r){\"use strict\";function n(t,e,r){this.traces=t,this.separateNegativeValues=e,this.dontMergeOverlappingData=r;for(var n=[],i=0;i<t.length;i++)for(var l=t[i],s=0;s<l.length;s++){var c=l[s];c.p!==o&&n.push(c.p)}this.positions=n;var u=a.distinctVals(this.positions);this.distinctPositions=u.vals,this.minDiff=u.minDiff,this.binWidth=this.minDiff,this.bins={}}e.exports=n;var a=t(\"../../lib\"),o=t(\"../../constants/numerical\").BADNUM;n.prototype.put=function(t,e){var r=this.getLabel(t,e),n=this.bins[r]||0;return this.bins[r]=n+e,n},n.prototype.get=function(t,e){var r=this.getLabel(t,e);return this.bins[r]||0},n.prototype.getLabel=function(t,e){return(e<0&&this.separateNegativeValues?\"v\":\"^\")+(this.dontMergeOverlappingData?t:Math.round(t/this.binWidth))}},{\"../../constants/numerical\":122,\"../../lib\":136}],226:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../components/color\"),o=t(\"../../components/drawing\"),i=t(\"../../components/errorbars\");e.exports=function(t){var e=n.select(t).selectAll(\"g.trace.bars\"),r=e.size(),l=t._fullLayout;e.style(\"opacity\",function(t){return t[0].trace.opacity}).each(function(t){(\"stack\"===l.barmode&&r>1||0===l.bargap&&0===l.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr(\"shape-rendering\",\"crispEdges\")}),e.selectAll(\"g.points\").each(function(t){var e=t[0].trace,r=e.marker,i=r.line,l=o.tryColorscale(r,\"\"),s=o.tryColorscale(r,\"line\");n.select(this).selectAll(\"path\").each(function(t){var e,o,c=(t.mlw+1||i.width+1)-1,u=n.select(this);e=\"mc\"in t?t.mcc=l(t.mc):Array.isArray(r.color)?a.defaultLine:r.color,u.style(\"stroke-width\",c+\"px\").call(a.fill,e),c&&(o=\"mlc\"in t?t.mlcc=s(t.mlc):Array.isArray(i.color)?a.defaultLine:i.color,u.call(a.stroke,o))})}),e.call(i.style)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/errorbars\":55,d3:7}],227:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"../../components/colorscale/has_colorscale\"),o=t(\"../../components/colorscale/defaults\");e.exports=function(t,e,r,i,l){r(\"marker.color\",i),a(t,\"marker\")&&o(t,e,l,r,{prefix:\"marker.\",cLetter:\"c\"}),r(\"marker.line.color\",n.defaultLine),a(t,\"marker.line\")&&o(t,e,l,r,{prefix:\"marker.line.\",cLetter:\"c\"}),r(\"marker.line.width\")}},{\"../../components/color\":25,\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38}],228:[function(t,e,r){\"use strict\";var n=t(\"../../components/color/attributes\"),a=t(\"../../plots/font_attributes\"),o=t(\"../../plots/attributes\"),i=t(\"../../lib/extend\").extendFlat;e.exports={labels:{valType:\"data_array\"},label0:{valType:\"number\",dflt:0},dlabel:{valType:\"number\",dflt:1},values:{valType:\"data_array\"},marker:{colors:{valType:\"data_array\"},line:{color:{valType:\"color\",dflt:n.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0}}},text:{valType:\"data_array\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},scalegroup:{valType:\"string\",dflt:\"\"},textinfo:{valType:\"flaglist\",flags:[\"label\",\"text\",\"value\",\"percent\"],extras:[\"none\"]},hoverinfo:i({},o.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"auto\",arrayOk:!0},textfont:i({},a,{}),insidetextfont:i({},a,{}),outsidetextfont:i({},a,{}),domain:{x:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]},y:{valType:\"info_array\",items:[{valType:\"number\",min:0,max:1},{valType:\"number\",min:0,max:1}],dflt:[0,1]}},hole:{valType:\"number\",min:0,max:1,dflt:0},sort:{valType:\"boolean\",dflt:!0},direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"],dflt:\"counterclockwise\"},rotation:{valType:\"number\",min:-360,max:360,dflt:0},pull:{valType:\"number\",min:0,max:1,dflt:0,arrayOk:!0}}},{\"../../components/color/attributes\":24,\"../../lib/extend\":132,\"../../plots/attributes\":169,\"../../plots/font_attributes\":195}],229:[function(t,e,r){\"use strict\";function n(t,e){for(var r=[],n=0;n<t.length;n++){var a=t[n],o=a[0].trace;o._module===e&&o.visible===!0&&r.push(a)}return r}var a=t(\"../../registry\");r.name=\"pie\",r.plot=function(t){var e=a.getModule(\"pie\"),r=n(t.calcdata,e);r.length&&e.plot(t,r)},r.clean=function(t,e,r,n){var a=n._has&&n._has(\"pie\"),o=e._has&&e._has(\"pie\");a&&!o&&n._pielayer.selectAll(\"g.trace\").remove()}},{\"../../registry\":206}],230:[function(t,e,r){\"use strict\";function n(t){if(!s){var e=i.defaults;s=e.slice();var r;for(r=0;r<e.length;r++)s.push(o(e[r]).lighten(20).toHexString());for(r=0;r<i.defaults.length;r++)s.push(o(e[r]).darken(20).toHexString())}return s[t%s.length]}var a=t(\"fast-isnumeric\"),o=t(\"tinycolor2\"),i=t(\"../../components/color\"),l=t(\"./helpers\");e.exports=function(t,e){var r,s,c,u,f,d,h=e.values,p=e.labels,g=[],v=t._fullLayout,m=v._piecolormap,y={},x=!1,b=0,_=v.hiddenlabels||[];if(e.dlabel)for(p=new Array(h.length),r=0;r<h.length;r++)p[r]=String(e.label0+r*e.dlabel);for(r=0;r<h.length;r++)s=h[r],a(s)&&((s=+s)<0||(c=p[r],void 0!==c&&\"\"!==c||(c=r),c=String(c),void 0===y[c]&&(y[c]=!0,u=o(e.marker.colors[r]),u.isValid()?(u=i.addOpacity(u,u.getAlpha()),m[c]||(m[c]=u)):m[c]?u=m[c]:(u=!1,x=!0),f=_.indexOf(c)!==-1,f||(b+=s),g.push({v:s,label:c,color:u,i:r,hidden:f}))));if(e.sort&&g.sort(function(t,e){return e.v-t.v}),x)for(r=0;r<g.length;r++)d=g[r],d.color===!1&&(m[d.label]=d.color=n(v._piedefaultcolorcount),v._piedefaultcolorcount++);if(g[0]&&(g[0].vTotal=b),e.textinfo&&\"none\"!==e.textinfo){var w,k=e.textinfo.indexOf(\"label\")!==-1,M=e.textinfo.indexOf(\"text\")!==-1,A=e.textinfo.indexOf(\"value\")!==-1,T=e.textinfo.indexOf(\"percent\")!==-1,L=v.separators;for(r=0;r<g.length;r++)d=g[r],w=k?[d.label]:[],M&&e.text[d.i]&&w.push(e.text[d.i]),A&&w.push(l.formatPieValue(d.v,L)),T&&w.push(l.formatPiePercent(d.v/b,L)),d.text=w.join(\"<br>\")}return g};var s},{\"../../components/color\":25,\"./helpers\":232,\"fast-isnumeric\":10,tinycolor2:13}],231:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\");e.exports=function(t,e,r,o){function i(r,o){return n.coerce(t,e,a,r,o)}var l=n.coerceFont,s=i(\"values\");if(!Array.isArray(s)||!s.length)return void(e.visible=!1);var c=i(\"labels\");Array.isArray(c)||(i(\"label0\"),i(\"dlabel\")),i(\"marker.line.width\")&&i(\"marker.line.color\");var u=i(\"marker.colors\");Array.isArray(u)||(e.marker.colors=[]),i(\"scalegroup\");var f=i(\"text\"),d=i(\"textinfo\",Array.isArray(f)?\"text+percent\":\"percent\");if(i(\"hovertext\"),i(\"hoverinfo\",1===o._dataLength?\"label+text+value+percent\":void 0),d&&\"none\"!==d){var h=i(\"textposition\"),p=Array.isArray(h)||\"auto\"===h,g=p||\"inside\"===h,v=p||\"outside\"===h;if(g||v){var m=l(i,\"textfont\",o.font);g&&l(i,\"insidetextfont\",m),v&&l(i,\"outsidetextfont\",m)}}i(\"domain.x\"),i(\"domain.y\"),i(\"hole\"),i(\"sort\"),i(\"direction\"),i(\"rotation\"),i(\"pull\")}},{\"../../lib\":136,\"./attributes\":228}],232:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");r.formatPiePercent=function(t,e){var r=(100*t).toPrecision(3);return r.lastIndexOf(\".\")!==-1&&(r=r.replace(/[.]?0+$/,\"\")),n.numSeparate(r,e)+\"%\"},r.formatPieValue=function(t,e){var r=t.toPrecision(10);return r.lastIndexOf(\".\")!==-1&&(r=r.replace(/[.]?0+$/,\"\")),n.numSeparate(r,e)}},{\"../../lib\":136}],233:[function(t,e,r){\"use strict\";var n={};n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.supplyLayoutDefaults=t(\"./layout_defaults\"),n.layoutAttributes=t(\"./layout_attributes\"),n.calc=t(\"./calc\"),n.plot=t(\"./plot\"),n.style=t(\"./style\"),n.styleOne=t(\"./style_one\"),n.moduleType=\"trace\",n.name=\"pie\",n.basePlotModule=t(\"./base_plot\"),n.categories=[\"pie\",\"showLegend\"],n.meta={},e.exports=n},{\"./attributes\":228,\"./base_plot\":229,\"./calc\":230,\"./defaults\":231,\"./layout_attributes\":234,\"./layout_defaults\":235,\"./plot\":236,\"./style\":237,\"./style_one\":238}],234:[function(t,e,r){\"use strict\";e.exports={hiddenlabels:{valType:\"data_array\"}}},{}],235:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./layout_attributes\");e.exports=function(t,e){!function(r,o){n.coerce(t,e,a,r,o)}(\"hiddenlabels\")}},{\"../../lib\":136,\"./layout_attributes\":234}],236:[function(t,e,r){\"use strict\";function n(t,e,r){var n=Math.sqrt(t.width*t.width+t.height*t.height),o=t.width/t.height,i=Math.PI*Math.min(e.v/r.vTotal,.5),l=1-r.trace.hole,s=a(e,r),c={scale:s*r.r*2/n,rCenter:1-s,rotate:0};if(c.scale>=1)return c;var u=o+1/(2*Math.tan(i)),f=r.r*Math.min(1/(Math.sqrt(u*u+.5)+u),l/(Math.sqrt(o*o+l/2)+o)),d={scale:2*f/t.height,rCenter:Math.cos(f/r.r)-f*o/r.r,rotate:(180/Math.PI*e.midangle+720)%180-90},h=1/o,p=h+1/(2*Math.tan(i)),g=r.r*Math.min(1/(Math.sqrt(p*p+.5)+p),l/(Math.sqrt(h*h+l/2)+h)),v={scale:2*g/t.width,rCenter:Math.cos(g/r.r)-g/o/r.r,rotate:(180/Math.PI*e.midangle+810)%180-90},m=v.scale>d.scale?v:d;return c.scale<1&&m.scale>c.scale?m:c}function a(t,e){if(t.v===e.vTotal&&!e.trace.hole)return 1;var r=Math.PI*Math.min(t.v/e.vTotal,.5);return Math.min(1/(1+1/Math.sin(r)),(1-e.trace.hole)/2)}function o(t,e){var r=e.pxmid[0],n=e.pxmid[1],a=t.width/2,o=t.height/2;return r<0&&(a*=-1),n<0&&(o*=-1),{scale:1,rCenter:1,rotate:0,x:a+Math.abs(o)*(a>0?1:-1)/2,y:o/(1+r*r/(n*n)),outside:!0}}function i(t,e){function r(t,e){return t.pxmid[1]-e.pxmid[1]}function n(t,e){return e.pxmid[1]-t.pxmid[1]}var a,o,i,l,s,c,u,f,d,h,p,g,v;for(o=0;o<2;o++)for(i=o?r:n,s=o?Math.max:Math.min,u=o?1:-1,a=0;a<2;a++){for(l=a?Math.max:Math.min,c=a?1:-1,f=t[o][a],f.sort(i),d=t[1-o][a],h=d.concat(f),g=[],p=0;p<f.length;p++)void 0!==f[p].yLabelMid&&g.push(f[p]);for(v=!1,p=0;o&&p<d.length;p++)if(void 0!==d[p].yLabelMid){v=d[p];break}for(p=0;p<g.length;p++){var m=p&&g[p-1];v&&!p&&(m=v),function(t,r){r||(r={});var n,a,i,f,d,p,g=r.labelExtraY+(o?r.yLabelMax:r.yLabelMin),v=o?t.yLabelMin:t.yLabelMax,m=o?t.yLabelMax:t.yLabelMin,y=t.cyFinal+s(t.px0[1],t.px1[1]),x=g-v;if(x*u>0&&(t.labelExtraY=x),Array.isArray(e.pull))for(a=0;a<h.length;a++)(i=h[a])===t||(e.pull[t.i]||0)>=e.pull[i.i]||((t.pxmid[1]-i.pxmid[1])*u>0?(f=i.cyFinal+s(i.px0[1],i.px1[1]),(x=f-v-t.labelExtraY)*u>0&&(t.labelExtraY+=x)):(m+t.labelExtraY-y)*u>0&&(n=3*c*Math.abs(a-h.indexOf(t)),d=i.cxFinal+l(i.px0[0],i.px1[0]),(p=d+n-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*c>0&&(t.labelExtraX+=p)))}(g[p],m)}}}function l(t,e){var r,n,a,o,i,l,s,u,f,d,h=[];for(a=0;a<t.length;a++){if(i=t[a][0],l=i.trace,r=e.w*(l.domain.x[1]-l.domain.x[0]),n=e.h*(l.domain.y[1]-l.domain.y[0]),s=l.tiltaxis*Math.PI/180,u=l.pull,Array.isArray(u))for(u=0,o=0;o<l.pull.length;o++)l.pull[o]>u&&(u=l.pull[o]);i.r=Math.min(r/c(l.tilt,Math.sin(s),l.depth),n/c(l.tilt,Math.cos(s),l.depth))/(2+2*u),i.cx=e.l+e.w*(l.domain.x[1]+l.domain.x[0])/2,i.cy=e.t+e.h*(2-l.domain.y[1]-l.domain.y[0])/2,\n",
|
|
"l.scalegroup&&h.indexOf(l.scalegroup)===-1&&h.push(l.scalegroup)}for(o=0;o<h.length;o++){for(d=1/0,f=h[o],a=0;a<t.length;a++)i=t[a][0],i.trace.scalegroup===f&&(d=Math.min(d,i.r*i.r/i.vTotal));for(a=0;a<t.length;a++)i=t[a][0],i.trace.scalegroup===f&&(i.r=Math.sqrt(d*i.vTotal))}}function s(t){function e(t){var e=f.r*Math.sin(t),r=-f.r*Math.cos(t);return h?[e*(1-l*n*n)+r*i*l,e*i*l+r*(1-l*a*a),Math.sin(o)*(r*a-e*n)]:[e,r]}var r,n,a,o,i,l,s,c,u,f=t[0],d=f.trace,h=d.tilt,p=d.rotation*Math.PI/180,g=2*Math.PI/f.vTotal,v=\"px0\",m=\"px1\";if(\"counterclockwise\"===d.direction){for(s=0;s<t.length&&t[s].hidden;s++);if(s===t.length)return;p+=g*t[s].v,g*=-1,v=\"px1\",m=\"px0\"}for(h&&(o=h*Math.PI/180,r=d.tiltaxis*Math.PI/180,i=Math.sin(r)*Math.cos(r),l=1-Math.cos(o),n=Math.sin(r),a=Math.cos(r)),u=e(p),s=0;s<t.length;s++)c=t[s],c.hidden||(c[v]=u,p+=g*c.v/2,c.pxmid=e(p),c.midangle=p,p+=g*c.v/2,u=e(p),c[m]=u,c.largeArc=c.v>f.vTotal/2?1:0)}function c(t,e,r){if(!t)return 1;var n=Math.sin(t*Math.PI/180);return Math.max(.01,r*n*Math.abs(e)+2*Math.sqrt(1-n*n*e*e))}var u=t(\"d3\"),f=t(\"../../components/fx\"),d=t(\"../../components/color\"),h=t(\"../../components/drawing\"),p=t(\"../../lib/svg_text_utils\"),g=t(\"./helpers\");e.exports=function(t,e){var r=t._fullLayout;l(e,r._size);var c=r._pielayer.selectAll(\"g.trace\").data(e);c.enter().append(\"g\").attr({\"stroke-linejoin\":\"round\",class:\"trace\"}),c.exit().remove(),c.order(),c.each(function(e){var l=u.select(this),c=e[0],v=c.trace,m=(v.depth||0)*c.r*Math.sin(0)/2,y=v.tiltaxis||0,x=y*Math.PI/180,b=[m*Math.sin(x),m*Math.cos(x)],_=c.r*Math.cos(0),w=l.selectAll(\"g.part\").data(v.tilt?[\"top\",\"sides\"]:[\"top\"]);w.enter().append(\"g\").attr(\"class\",function(t){return t+\" part\"}),w.exit().remove(),w.order(),s(e),l.selectAll(\".top\").each(function(){var l=u.select(this).selectAll(\"g.slice\").data(e);l.enter().append(\"g\").classed(\"slice\",!0),l.exit().remove();var s=[[[],[]],[[],[]]],m=!1;l.each(function(e){function i(n){n.originalEvent=u.event;var o=t._fullLayout,i=t._fullData[v.index],l=i.hoverinfo;if(\"all\"===l&&(l=\"label+text+value+percent+name\"),t._dragging||o.hovermode===!1||\"none\"===l||\"skip\"===l||!l)return void f.hover(t,n,\"pie\");var s=a(e,c),d=w+e.pxmid[0]*(1-s),h=k+e.pxmid[1]*(1-s),p=r.separators,m=[];l.indexOf(\"label\")!==-1&&m.push(e.label),l.indexOf(\"text\")!==-1&&(i.hovertext?m.push(Array.isArray(i.hovertext)?i.hovertext[e.i]:i.hovertext):i.text&&i.text[e.i]&&m.push(i.text[e.i])),l.indexOf(\"value\")!==-1&&m.push(g.formatPieValue(e.v,p)),l.indexOf(\"percent\")!==-1&&m.push(g.formatPiePercent(e.v/c.vTotal,p));var y=i.hoverlabel;f.loneHover({x0:d-s*c.r,x1:d+s*c.r,y:h,text:m.join(\"<br>\"),name:l.indexOf(\"name\")!==-1?i.name:void 0,idealAlign:e.pxmid[0]<0?\"left\":\"right\",color:e.hbg||y.bgcolor||e.color,borderColor:e.hbc||y.bordercolor,fontFamily:e.htf||y.font.family,fontSize:e.hts||y.font.size,fontColor:e.htc||y.font.color},{container:o._hoverlayer.node(),outerContainer:o._paper.node()}),f.hover(t,n,\"pie\"),T=!0}function l(e){e.originalEvent=u.event,t.emit(\"plotly_unhover\",{event:u.event,points:[e]}),T&&(f.loneUnhover(r._hoverlayer.node()),T=!1)}function d(){t._hoverdata=[e],t._hoverdata.trace=c.trace,f.click(t,u.event)}function x(t,r,n,a){return\"a\"+a*c.r+\",\"+a*_+\" \"+y+\" \"+e.largeArc+(n?\" 1 \":\" 0 \")+a*(r[0]-t[0])+\",\"+a*(r[1]-t[1])}if(e.hidden)return void u.select(this).selectAll(\"path,g\").remove();s[e.pxmid[1]<0?0:1][e.pxmid[0]<0?0:1].push(e);var w=c.cx+b[0],k=c.cy+b[1],M=u.select(this),A=M.selectAll(\"path.surface\").data([e]),T=!1;if(A.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":\"all\"}),M.select(\"path.textline\").remove(),M.on(\"mouseover\",i).on(\"mouseout\",l).on(\"click\",d),v.pull){var L=+(Array.isArray(v.pull)?v.pull[e.i]:v.pull)||0;L>0&&(w+=L*e.pxmid[0],k+=L*e.pxmid[1])}e.cxFinal=w,e.cyFinal=k;var C=v.hole;if(e.v===c.vTotal){var S=\"M\"+(w+e.px0[0])+\",\"+(k+e.px0[1])+x(e.px0,e.pxmid,!0,1)+x(e.pxmid,e.px0,!0,1)+\"Z\";C?A.attr(\"d\",\"M\"+(w+C*e.px0[0])+\",\"+(k+C*e.px0[1])+x(e.px0,e.pxmid,!1,C)+x(e.pxmid,e.px0,!1,C)+\"Z\"+S):A.attr(\"d\",S)}else{var z=x(e.px0,e.px1,!0,1);if(C){var O=1-C;A.attr(\"d\",\"M\"+(w+C*e.px1[0])+\",\"+(k+C*e.px1[1])+x(e.px1,e.px0,!1,C)+\"l\"+O*e.px0[0]+\",\"+O*e.px0[1]+z+\"Z\")}else A.attr(\"d\",\"M\"+w+\",\"+k+\"l\"+e.px0[0]+\",\"+e.px0[1]+z+\"Z\")}var D=Array.isArray(v.textposition)?v.textposition[e.i]:v.textposition,P=M.selectAll(\"g.slicetext\").data(e.text&&\"none\"!==D?[0]:[]);P.enter().append(\"g\").classed(\"slicetext\",!0),P.exit().remove(),P.each(function(){var t=u.select(this).selectAll(\"text\").data([0]);t.enter().append(\"text\").attr(\"data-notex\",1),t.exit().remove(),t.text(e.text).attr({class:\"slicetext\",transform:\"\",\"data-bb\":\"\",\"text-anchor\":\"middle\",x:0,y:0}).call(h.font,\"outside\"===D?v.outsidetextfont:v.insidetextfont).call(p.convertToTspans),t.selectAll(\"tspan.line\").attr({x:0,y:0});var r,a=h.bBox(t.node());\"outside\"===D?r=o(a,e):(r=n(a,e,c),\"auto\"===D&&r.scale<1&&(t.call(h.font,v.outsidetextfont),v.outsidetextfont.family===v.insidetextfont.family&&v.outsidetextfont.size===v.insidetextfont.size||(t.attr({\"data-bb\":\"\"}),a=h.bBox(t.node())),r=o(a,e)));var i=w+e.pxmid[0]*r.rCenter+(r.x||0),l=k+e.pxmid[1]*r.rCenter+(r.y||0);r.outside&&(e.yLabelMin=l-a.height/2,e.yLabelMid=l,e.yLabelMax=l+a.height/2,e.labelExtraX=0,e.labelExtraY=0,m=!0),t.attr(\"transform\",\"translate(\"+i+\",\"+l+\")\"+(r.scale<1?\"scale(\"+r.scale+\")\":\"\")+(r.rotate?\"rotate(\"+r.rotate+\")\":\"\")+\"translate(\"+-(a.left+a.right)/2+\",\"+-(a.top+a.bottom)/2+\")\")})}),m&&i(s,v),l.each(function(t){if(t.labelExtraX||t.labelExtraY){var e=u.select(this),r=e.select(\"g.slicetext text\");r.attr(\"transform\",\"translate(\"+t.labelExtraX+\",\"+t.labelExtraY+\")\"+r.attr(\"transform\"));var n=t.cxFinal+t.pxmid[0],a=t.cyFinal+t.pxmid[1],o=\"M\"+n+\",\"+a,i=(t.yLabelMax-t.yLabelMin)*(t.pxmid[0]<0?-1:1)/4;if(t.labelExtraX){var l=t.labelExtraX*t.pxmid[1]/t.pxmid[0],s=t.yLabelMid+t.labelExtraY-(t.cyFinal+t.pxmid[1]);Math.abs(l)>Math.abs(s)?o+=\"l\"+s*t.pxmid[0]/t.pxmid[1]+\",\"+s+\"H\"+(n+t.labelExtraX+i):o+=\"l\"+t.labelExtraX+\",\"+l+\"v\"+(s-l)+\"h\"+i}else o+=\"V\"+(t.yLabelMid+t.labelExtraY)+\"h\"+i;e.append(\"path\").classed(\"textline\",!0).call(d.stroke,v.outsidetextfont.color).attr({\"stroke-width\":Math.min(2,v.outsidetextfont.size/8),d:o,fill:\"none\"})}})})}),setTimeout(function(){c.selectAll(\"tspan\").each(function(){var t=u.select(this);t.attr(\"dy\")&&t.attr(\"dy\",t.attr(\"dy\"))})},0)}},{\"../../components/color\":25,\"../../components/drawing\":49,\"../../components/fx\":66,\"../../lib/svg_text_utils\":153,\"./helpers\":232,d3:7}],237:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"./style_one\");e.exports=function(t){t._fullLayout._pielayer.selectAll(\".trace\").each(function(t){var e=t[0],r=e.trace,o=n.select(this);o.style({opacity:r.opacity}),o.selectAll(\".top path.surface\").each(function(t){n.select(this).call(a,t,r)})})}},{\"./style_one\":238,d3:7}],238:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\");e.exports=function(t,e,r){var a=r.marker.line.color;Array.isArray(a)&&(a=a[e.i]||n.defaultLine);var o=r.marker.line.width||0;Array.isArray(o)&&(o=o[e.i]||0),t.style({\"stroke-width\":o}).call(n.fill,e.color).call(n.stroke,a)}},{\"../../components/color\":25}],239:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e){for(var r=0;r<t.length;r++)t[r].i=r;n.mergeArray(e.text,t,\"tx\"),n.mergeArray(e.hovertext,t,\"htx\"),n.mergeArray(e.customdata,t,\"data\"),n.mergeArray(e.textposition,t,\"tp\"),e.textfont&&(n.mergeArray(e.textfont.size,t,\"ts\"),n.mergeArray(e.textfont.color,t,\"tc\"),n.mergeArray(e.textfont.family,t,\"tf\"));var a=e.marker;if(a){n.mergeArray(a.size,t,\"ms\"),n.mergeArray(a.opacity,t,\"mo\"),n.mergeArray(a.symbol,t,\"mx\"),n.mergeArray(a.color,t,\"mc\");var o=a.line;a.line&&(n.mergeArray(o.color,t,\"mlc\"),n.mergeArray(o.width,t,\"mlw\"));var i=a.gradient;i&&\"none\"!==i.type&&(n.mergeArray(i.type,t,\"mgt\"),n.mergeArray(i.color,t,\"mgc\"))}}},{\"../../lib\":136}],240:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/color_attributes\"),a=t(\"../../components/errorbars/attributes\"),o=t(\"../../components/colorbar/attributes\"),i=t(\"../../components/drawing/attributes\").dash,l=t(\"../../components/drawing\"),s=(t(\"./constants\"),t(\"../../lib/extend\").extendFlat);e.exports={x:{valType:\"data_array\"},x0:{valType:\"any\",dflt:0},dx:{valType:\"number\",dflt:1},y:{valType:\"data_array\"},y0:{valType:\"any\",dflt:0},customdata:{valType:\"data_array\"},dy:{valType:\"number\",dflt:1},ids:{valType:\"data_array\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},mode:{valType:\"flaglist\",flags:[\"lines\",\"markers\",\"text\"],extras:[\"none\"]},hoveron:{valType:\"flaglist\",flags:[\"points\",\"fills\"]},line:{color:{valType:\"color\"},width:{valType:\"number\",min:0,dflt:2},shape:{valType:\"enumerated\",values:[\"linear\",\"spline\",\"hv\",\"vh\",\"hvh\",\"vhv\"],dflt:\"linear\"},smoothing:{valType:\"number\",min:0,max:1.3,dflt:1},dash:i,simplify:{valType:\"boolean\",dflt:!0}},connectgaps:{valType:\"boolean\",dflt:!1},fill:{valType:\"enumerated\",values:[\"none\",\"tozeroy\",\"tozerox\",\"tonexty\",\"tonextx\",\"toself\",\"tonext\"],dflt:\"none\"},fillcolor:{valType:\"color\"},marker:s({},{symbol:{valType:\"enumerated\",values:l.symbolList,dflt:\"circle\",arrayOk:!0},opacity:{valType:\"number\",min:0,max:1,arrayOk:!0},size:{valType:\"number\",min:0,dflt:6,arrayOk:!0},maxdisplayed:{valType:\"number\",min:0,dflt:0},sizeref:{valType:\"number\",dflt:1},sizemin:{valType:\"number\",min:0,dflt:0},sizemode:{valType:\"enumerated\",values:[\"diameter\",\"area\"],dflt:\"diameter\"},showscale:{valType:\"boolean\",dflt:!1},colorbar:o,line:s({},{width:{valType:\"number\",min:0,arrayOk:!0}},n(\"marker.line\")),gradient:{type:{valType:\"enumerated\",values:[\"radial\",\"horizontal\",\"vertical\",\"none\"],arrayOk:!0,dflt:\"none\"},color:{valType:\"color\",arrayOk:!0}}},n(\"marker\")),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\"],dflt:\"middle center\",arrayOk:!0},textfont:{family:{valType:\"string\",noBlank:!0,strict:!0,arrayOk:!0},size:{valType:\"number\",min:1,arrayOk:!0},color:{valType:\"color\",arrayOk:!0}},r:{valType:\"data_array\"},t:{valType:\"data_array\"},error_y:a,error_x:a}},{\"../../components/colorbar/attributes\":26,\"../../components/colorscale/color_attributes\":32,\"../../components/drawing\":49,\"../../components/drawing/attributes\":48,\"../../components/errorbars/attributes\":51,\"../../lib/extend\":132,\"./constants\":245}],241:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../plots/cartesian/axes\"),o=t(\"../../constants/numerical\").BADNUM,i=t(\"./subtypes\"),l=t(\"./colorscale_calc\"),s=t(\"./arrays_to_calcdata\");e.exports=function(t,e){var r,c,u,f=a.getFromId(t,e.xaxis||\"x\"),d=a.getFromId(t,e.yaxis||\"y\"),h=f.makeCalcdata(e,\"x\"),p=d.makeCalcdata(e,\"y\"),g=Math.min(h.length,p.length);f._minDtick=0,d._minDtick=0,h.length>g&&h.splice(g,h.length-g),p.length>g&&p.splice(g,p.length-g);var v={padded:!0},m={padded:!0};if(i.hasMarkers(e)){if(r=e.marker,c=r.size,Array.isArray(c)){var y={type:\"linear\"};a.setConvert(y),c=y.makeCalcdata(e.marker,\"size\"),c.length>g&&c.splice(g,c.length-g)}var x,b=1.6*(e.marker.sizeref||1);x=\"area\"===e.marker.sizemode?function(t){return Math.max(Math.sqrt((t||0)/b),3)}:function(t){return Math.max((t||0)/b,3)},v.ppad=m.ppad=Array.isArray(c)?c.map(x):x(c)}l(e),!(\"tozerox\"===e.fill||\"tonextx\"===e.fill&&t.firstscatter)||h[0]===h[g-1]&&p[0]===p[g-1]?e.error_y.visible||[\"tonexty\",\"tozeroy\"].indexOf(e.fill)===-1&&(i.hasMarkers(e)||i.hasText(e))||(v.padded=!1,v.ppad=0):v.tozero=!0,!(\"tozeroy\"===e.fill||\"tonexty\"===e.fill&&t.firstscatter)||h[0]===h[g-1]&&p[0]===p[g-1]?[\"tonextx\",\"tozerox\"].indexOf(e.fill)!==-1&&(m.padded=!1):m.tozero=!0,a.expand(f,h,v),a.expand(d,p,m);var _=new Array(g);for(u=0;u<g;u++)_[u]=n(h[u])&&n(p[u])?{x:h[u],y:p[u]}:{x:o,y:o},e.ids&&(_[u].id=String(e.ids[u]));return s(_,e),t.firstscatter=!1,_}},{\"../../constants/numerical\":122,\"../../plots/cartesian/axes\":171,\"./arrays_to_calcdata\":239,\"./colorscale_calc\":244,\"./subtypes\":260,\"fast-isnumeric\":10}],242:[function(t,e,r){\"use strict\";e.exports=function(t){for(var e=0;e<t.length;e++){var r=t[e];if(\"scatter\"===r.type){var n=r.fill;if(\"none\"!==n&&\"toself\"!==n&&(r.opacity=void 0,\"tonexty\"===n||\"tonextx\"===n))for(var a=e-1;a>=0;a--){var o=t[a];if(\"scatter\"===o.type&&o.xaxis===r.xaxis&&o.yaxis===r.yaxis){o.opacity=void 0;break}}}}}},{}],243:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\"),a=t(\"../../lib\"),o=t(\"../../plots/plots\"),i=t(\"../../components/colorscale\"),l=t(\"../../components/colorbar/draw\");e.exports=function(t,e){var r=e[0].trace,s=r.marker,c=\"cb\"+r.uid;if(t._fullLayout._infolayer.selectAll(\".\"+c).remove(),void 0===s||!s.showscale)return void o.autoMargin(t,c);var u=s.color,f=s.cmin,d=s.cmax;n(f)||(f=a.aggNums(Math.min,null,u)),n(d)||(d=a.aggNums(Math.max,null,u));var h=e[0].t.cb=l(t,c),p=i.makeColorScaleFunc(i.extractScale(s.colorscale,f,d),{noNumericCheck:!0});h.fillcolor(p).filllevels({start:f,end:d,size:(d-f)/254}).options(s.colorbar)()}},{\"../../components/colorbar/draw\":28,\"../../components/colorscale\":39,\"../../lib\":136,\"../../plots/plots\":199,\"fast-isnumeric\":10}],244:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/has_colorscale\"),a=t(\"../../components/colorscale/calc\"),o=t(\"./subtypes\");e.exports=function(t){o.hasLines(t)&&n(t,\"line\")&&a(t,t.line.color,\"line\",\"c\"),o.hasMarkers(t)&&(n(t,\"marker\")&&a(t,t.marker.color,\"marker\",\"c\"),n(t,\"marker.line\")&&a(t,t.marker.line.color,\"marker.line\",\"c\"))}},{\"../../components/colorscale/calc\":31,\"../../components/colorscale/has_colorscale\":38,\"./subtypes\":260}],245:[function(t,e,r){\"use strict\";e.exports={PTS_LINESONLY:20}},{}],246:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"./attributes\"),o=t(\"./constants\"),i=t(\"./subtypes\"),l=t(\"./xy_defaults\"),s=t(\"./marker_defaults\"),c=t(\"./line_defaults\"),u=t(\"./line_shape_defaults\"),f=t(\"./text_defaults\"),d=t(\"./fillcolor_defaults\"),h=t(\"../../components/errorbars/defaults\");e.exports=function(t,e,r,p){function g(r,o){return n.coerce(t,e,a,r,o)}var v=l(t,e,p,g),m=v<o.PTS_LINESONLY?\"lines+markers\":\"lines\";if(!v)return void(e.visible=!1);g(\"customdata\"),g(\"text\"),g(\"hovertext\"),g(\"mode\",m),g(\"ids\"),i.hasLines(e)&&(c(t,e,r,p,g),u(t,e,g),g(\"connectgaps\"),g(\"line.simplify\")),i.hasMarkers(e)&&s(t,e,r,p,g,{gradient:!0}),i.hasText(e)&&f(t,e,p,g);var y=[];(i.hasMarkers(e)||i.hasText(e))&&(g(\"marker.maxdisplayed\"),y.push(\"points\")),g(\"fill\"),\"none\"!==e.fill&&(d(t,e,r,g),i.hasLines(e)||u(t,e,g)),\"tonext\"!==e.fill&&\"toself\"!==e.fill||y.push(\"fills\"),g(\"hoveron\",y.join(\"+\")||\"points\"),h(t,e,r,{axis:\"y\"}),h(t,e,r,{axis:\"x\",inherit:\"y\"})}},{\"../../components/errorbars/defaults\":54,\"../../lib\":136,\"./attributes\":240,\"./constants\":245,\"./fillcolor_defaults\":247,\"./line_defaults\":251,\"./line_shape_defaults\":253,\"./marker_defaults\":256,\"./subtypes\":260,\"./text_defaults\":261,\"./xy_defaults\":262}],247:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\");e.exports=function(t,e,r,a){var o=!1;if(e.marker){var i=e.marker.color,l=(e.marker.line||{}).color;i&&!Array.isArray(i)?o=i:l&&!Array.isArray(l)&&(o=l)}a(\"fillcolor\",n.addOpacity((e.line||{}).color||o||r,.5))}},{\"../../components/color\":25}],248:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"./subtypes\");e.exports=function(t,e){var r,o;if(\"lines\"===t.mode)return r=t.line.color,r&&n.opacity(r)?r:t.fillcolor;if(\"none\"===t.mode)return t.fill?t.fillcolor:\"\";var i=e.mcc||(t.marker||{}).color,l=e.mlcc||((t.marker||{}).line||{}).color;return o=i&&n.opacity(i)?i:l&&n.opacity(l)&&(e.mlw||((t.marker||{}).line||{}).width)?l:\"\",o?n.opacity(o)<.3?n.addOpacity(o,.3):o:(r=(t.line||{}).color,r&&n.opacity(r)&&a.hasLines(t)&&t.line.width?r:t.fillcolor)}},{\"../../components/color\":25,\"./subtypes\":260}],249:[function(t,e,r){\"use strict\";var n=t(\"../../lib\"),a=t(\"../../components/fx\"),o=t(\"../../components/errorbars\"),i=t(\"./get_trace_color\"),l=t(\"../../components/color\"),s=a.constants.MAXDIST;e.exports=function(t,e,r,c){var u=t.cd,f=u[0].trace,d=t.xa,h=t.ya,p=d.c2p(e),g=h.c2p(r),v=[p,g];if(f.hoveron.indexOf(\"points\")!==-1){var m=function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(d.c2p(t.x)-p)-e,1-3/e)},y=function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(h.c2p(t.y)-g)-e,1-3/e)},x=function(t){var e=Math.max(3,t.mrc||0),r=d.c2p(t.x)-p,n=h.c2p(t.y)-g;return Math.max(Math.sqrt(r*r+n*n)-e,1-3/e)},b=a.getDistanceFunction(c,m,y,x);if(a.getClosest(u,b,t),t.index!==!1){var _=u[t.index],w=d.c2p(_.x,!0),k=h.c2p(_.y,!0),M=_.mrc||1;return n.extendFlat(t,{color:i(f,_),x0:w-M,x1:w+M,xLabelVal:_.x,y0:k-M,y1:k+M,yLabelVal:_.y}),_.htx?t.text=_.htx:f.hovertext?t.text=f.hovertext:_.tx?t.text=_.tx:f.text&&(t.text=f.text),o.hoverInfo(_,f,t),[t]}}if(f.hoveron.indexOf(\"fills\")!==-1&&f._polygons){var A,T,L,C,S,z,O,D,P,E=f._polygons,N=[],I=!1,R=1/0,F=-1/0,j=1/0,B=-1/0;for(A=0;A<E.length;A++)L=E[A],L.contains(v)&&(I=!I,N.push(L),j=Math.min(j,L.ymin),B=Math.max(B,L.ymax));if(I){j=Math.max(j,0),B=Math.min(B,h._length);var q=(j+B)/2;for(A=0;A<N.length;A++)for(C=N[A].pts,T=1;T<C.length;T++)D=C[T-1][1],P=C[T][1],D>q!=P>=q&&(z=C[T-1][0],O=C[T][0],S=z+(O-z)*(q-D)/(P-D),R=Math.min(R,S),F=Math.max(F,S));R=Math.max(R,0),F=Math.min(F,d._length);var H=l.defaultLine;return l.opacity(f.fillcolor)?H=f.fillcolor:l.opacity((f.line||{}).color)&&(H=f.line.color),n.extendFlat(t,{distance:s+10,x0:R,x1:F,y0:q,y1:q,color:H}),delete t.index,f.text&&!Array.isArray(f.text)?t.text=String(f.text):t.text=f.name,[t]}}}},{\"../../components/color\":25,\"../../components/errorbars\":55,\"../../components/fx\":66,\"../../lib\":136,\"./get_trace_color\":248}],250:[function(t,e,r){\"use strict\";var n={},a=t(\"./subtypes\");n.hasLines=a.hasLines,n.hasMarkers=a.hasMarkers,n.hasText=a.hasText,n.isBubble=a.isBubble,n.attributes=t(\"./attributes\"),n.supplyDefaults=t(\"./defaults\"),n.cleanData=t(\"./clean_data\"),n.calc=t(\"./calc\"),n.arraysToCalcdata=t(\"./arrays_to_calcdata\"),n.plot=t(\"./plot\"),n.colorbar=t(\"./colorbar\"),n.style=t(\"./style\"),n.hoverPoints=t(\"./hover\"),n.selectPoints=t(\"./select\"),n.animatable=!0,n.moduleType=\"trace\",n.name=\"scatter\",n.basePlotModule=t(\"../../plots/cartesian\"),n.categories=[\"cartesian\",\"symbols\",\"markerColorscale\",\"errorBarsOK\",\"showLegend\"],n.meta={},e.exports=n},{\"../../plots/cartesian\":181,\"./arrays_to_calcdata\":239,\"./attributes\":240,\"./calc\":241,\"./clean_data\":242,\"./colorbar\":243,\"./defaults\":246,\"./hover\":249,\"./plot\":257,\"./select\":258,\"./style\":259,\"./subtypes\":260}],251:[function(t,e,r){\"use strict\";var n=t(\"../../components/colorscale/has_colorscale\"),a=t(\"../../components/colorscale/defaults\");e.exports=function(t,e,r,o,i,l){var s=(t.marker||{}).color;if(i(\"line.color\",r),n(t,\"line\"))a(t,e,o,i,{prefix:\"line.\",cLetter:\"c\"});else{i(\"line.color\",!Array.isArray(s)&&s||r)}i(\"line.width\"),(l||{}).noDash||i(\"line.dash\")}},{\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38}],252:[function(t,e,r){\"use strict\";var n=t(\"../../constants/numerical\").BADNUM;e.exports=function(t,e){function r(e){var r=_.c2p(t[e].x),a=w.c2p(t[e].y);return r!==n&&a!==n&&[r,a]}function a(t){var e=t[0]/_._length,r=t[1]/w._length;return(1+10*Math.max(0,-e,e-1,-r,r-1))*A}var o,i,l,s,c,u,f,d,h,p,g,v,m,y,x,b,_=e.xaxis,w=e.yaxis,k=e.simplify,M=e.connectGaps,A=e.baseTolerance,T=e.linear,L=[],C=.2,S=new Array(t.length),z=0;for(k||(A=C=-1),o=0;o<t.length;o++)if(i=r(o)){for(z=0,S[z++]=i,o++;o<t.length;o++){if(!(s=r(o))){if(M)continue;break}if(T){if(!((f=function(t,e){var r=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(r*r+n*n)}(s,i))<a(s)*C)){for(h=[(s[0]-i[0])/f,(s[1]-i[1])/f],c=i,g=f,v=y=x=0,d=!1,l=s,o++;o<t.length;o++){if(!(u=r(o))){if(M)continue;break}if(p=[u[0]-i[0],u[1]-i[1]],b=p[0]*h[1]-p[1]*h[0],y=Math.min(y,b),(x=Math.max(x,b))-y>a(u))break;l=u,m=p[0]*h[0]+p[1]*h[1],m>g?(g=m,s=u,d=!1):m<v&&(v=m,c=u,d=!0)}if(d?(S[z++]=s,l!==c&&(S[z++]=c)):(c!==i&&(S[z++]=c),l!==s&&(S[z++]=s)),S[z++]=l,o>=t.length||!u)break;S[z++]=u,i=u}}else S[z++]=s}L.push(S.slice(0,z))}return L}},{\"../../constants/numerical\":122}],253:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){\"spline\"===r(\"line.shape\")&&r(\"line.smoothing\")}},{}],254:[function(t,e,r){\"use strict\";e.exports=function(t,e,r){for(var n,a,o=null,i=0;i<r.length;++i)n=r[i],a=n[0].trace,a.visible===!0?(a._nexttrace=null,[\"tonextx\",\"tonexty\",\"tonext\"].indexOf(a.fill)!==-1&&(a._prevtrace=o,o&&(o._nexttrace=a)),o=a):a._prevtrace=a._nexttrace=null}},{}],255:[function(t,e,r){\"use strict\";var n=t(\"fast-isnumeric\");e.exports=function(t){var e=t.marker,r=e.sizeref||1,a=e.sizemin||0,o=\"area\"===e.sizemode?function(t){return Math.sqrt(t/r)}:function(t){return t/r};return function(t){var e=o(t/2);return n(e)&&e>0?Math.max(e,a):0}}},{\"fast-isnumeric\":10}],256:[function(t,e,r){\"use strict\";var n=t(\"../../components/color\"),a=t(\"../../components/colorscale/has_colorscale\"),o=t(\"../../components/colorscale/defaults\"),i=t(\"./subtypes\");e.exports=function(t,e,r,l,s,c){var u,f=i.isBubble(t),d=(t.line||{}).color;if(c=c||{},d&&(r=d),s(\"marker.symbol\"),s(\"marker.opacity\",f?.7:1),s(\"marker.size\"),s(\"marker.color\",r),a(t,\"marker\")&&o(t,e,l,s,{prefix:\"marker.\",cLetter:\"c\"}),c.noLine||(u=d&&!Array.isArray(d)&&e.marker.color!==d?d:f?n.background:n.defaultLine,s(\"marker.line.color\",u),a(t,\"marker.line\")&&o(t,e,l,s,{prefix:\"marker.line.\",cLetter:\"c\"}),s(\"marker.line.width\",f?1:0)),f&&(s(\"marker.sizeref\"),s(\"marker.sizemin\"),s(\"marker.sizemode\")),c.gradient){\"none\"!==s(\"marker.gradient.type\")&&s(\"marker.gradient.color\")}}},{\"../../components/color\":25,\"../../components/colorscale/defaults\":34,\"../../components/colorscale/has_colorscale\":38,\"./subtypes\":260}],257:[function(t,e,r){\"use strict\";function n(t,e){var r;e.selectAll(\"g.trace\").each(function(t){var e=i.select(this);if(r=t[0].trace,r._nexttrace){if(r._nextFill=e.select(\".js-fill.js-tonext\"),!r._nextFill.size()){var n=\":first-child\";e.select(\".js-fill.js-tozero\").size()&&(n+=\" + *\"),r._nextFill=e.insert(\"path\",n).attr(\"class\",\"js-fill js-tonext\")}}else e.selectAll(\".js-fill.js-tonext\").remove(),r._nextFill=null;r.fill&&(\"tozero\"===r.fill.substr(0,6)||\"toself\"===r.fill||\"to\"===r.fill.substr(0,2)&&!r._prevtrace)?(r._ownFill=e.select(\".js-fill.js-tozero\"),r._ownFill.size()||(r._ownFill=e.insert(\"path\",\":first-child\").attr(\"class\",\"js-fill js-tozero\"))):(e.selectAll(\".js-fill.js-tozero\").remove(),r._ownFill=null)})}function a(t,e,r,n,a,d,p){function g(t){return k?t.transition():t}function v(t){return t.filter(function(t){return t.vis})}function m(t){return t.id}function y(t){if(t.ids)return m}function x(){return!1}function b(e){var r,n,a,o=e[0].trace,c=i.select(this),f=u.hasMarkers(o),d=u.hasText(o),h=y(o),p=x,m=x;f&&(p=o.marker.maxdisplayed||o._needsCull?v:l.identity),d&&(m=o.marker.maxdisplayed||o._needsCull?v:l.identity),n=c.selectAll(\"path.point\"),r=n.data(p,h);var b=r.enter().append(\"path\").classed(\"point\",!0);b.call(s.pointStyle,o).call(s.translatePoints,M,A,o),k&&b.style(\"opacity\",0).transition().style(\"opacity\",1);var _=f&&s.tryColorscale(o.marker,\"\"),w=f&&s.tryColorscale(o.marker,\"line\");r.each(function(e){var r=i.select(this),n=g(r);(a=s.translatePoint(e,n,M,A))&&(s.singlePointStyle(e,n,o,_,w,t),o.customdata&&r.classed(\"plotly-customdata\",null!==e.data&&void 0!==e.data))}),k?r.exit().transition().style(\"opacity\",0).remove():r.exit().remove(),n=c.selectAll(\"g\"),r=n.data(m,h),r.enter().append(\"g\").classed(\"textpoint\",!0).append(\"text\"),r.each(function(t){var e=i.select(this),r=g(e.select(\"text\"));(a=s.translatePoint(t,r,M,A))||e.remove()}),r.selectAll(\"text\").call(s.textPointStyle,o).each(function(t){var e=t.xp||M.c2p(t.x),r=t.yp||A.c2p(t.y);i.select(this).selectAll(\"tspan.line\").each(function(){g(i.select(this)).attr({x:e,y:r})})}),r.exit().remove()}var _,w;o(t,e,r,n,a);var k=!!p&&p.duration>0,M=r.xaxis,A=r.yaxis,T=n[0].trace,L=T.line,C=i.select(d);if(C.call(c.plot,r,p),T.visible===!0){g(C).style(\"opacity\",T.opacity);var S,z,O=T.fill.charAt(T.fill.length-1);\"x\"!==O&&\"y\"!==O&&(O=\"\"),n[0].node3=C;var D=\"\",P=[],E=T._prevtrace;E&&(D=E._prevRevpath||\"\",z=E._nextFill,P=E._polygons);var N,I,R,F,j,B,q,H,V,U=\"\",X=\"\",G=[],Y=[],Z=l.noop;if(S=T._ownFill,u.hasLines(T)||\"none\"!==T.fill){for(z&&z.datum(n),[\"hv\",\"vh\",\"hvh\",\"vhv\"].indexOf(L.shape)!==-1?(R=s.steps(L.shape),F=s.steps(L.shape.split(\"\").reverse().join(\"\"))):R=F=\"spline\"===L.shape?function(t){var e=t[t.length-1];return t[0][0]===e[0]&&t[0][1]===e[1]?s.smoothclosed(t.slice(1),L.smoothing):s.smoothopen(t,L.smoothing)}:function(t){return\"M\"+t.join(\"L\")},j=function(t){return F(t.reverse())},G=f(n,{xaxis:M,yaxis:A,connectGaps:T.connectgaps,baseTolerance:Math.max(L.width||1,3)/4,linear:\"linear\"===L.shape,simplify:L.simplify}),V=T._polygons=new Array(G.length),w=0;w<G.length;w++)T._polygons[w]=h(G[w]);G.length&&(B=G[0][0],q=G[G.length-1],H=q[q.length-1]),Y=G.filter(function(t){return t.length>1}),Z=function(t){return function(e){if(N=R(e),I=j(e),U?O?(U+=\"L\"+N.substr(1),X=I+\"L\"+X.substr(1)):(U+=\"Z\"+N,X=I+\"Z\"+X):(U=N,X=I),u.hasLines(T)&&e.length>1){var r=i.select(this);if(r.datum(n),t)g(r.style(\"opacity\",0).attr(\"d\",N).call(s.lineGroupStyle)).style(\"opacity\",1);else{var a=g(r);a.attr(\"d\",N),s.singleLineStyle(n,a)}}}}}var W=C.selectAll(\".js-line\").data(Y);g(W.exit()).style(\"opacity\",0).remove(),W.each(Z(!1)),W.enter().append(\"path\").classed(\"js-line\",!0).style(\"vector-effect\",\"non-scaling-stroke\").call(s.lineGroupStyle).each(Z(!0)),G.length&&(S?B&&H&&(O?(\"y\"===O?B[1]=H[1]=A.c2p(0,!0):\"x\"===O&&(B[0]=H[0]=M.c2p(0,!0)),g(S).attr(\"d\",\"M\"+H+\"L\"+B+\"L\"+U.substr(1))):g(S).attr(\"d\",U+\"Z\")):\"tonext\"===T.fill.substr(0,6)&&U&&D&&(\"tonext\"===T.fill?g(z).attr(\"d\",U+\"Z\"+D+\"Z\"):g(z).attr(\"d\",U+\"L\"+D.substr(1)+\"Z\"),T._polygons=T._polygons.concat(P)),T._prevRevpath=X,T._prevPolygons=V);var $=C.selectAll(\".points\");_=$.data([n]),$.each(b),_.enter().append(\"g\").classed(\"points\",!0).each(b),_.exit().remove()}}function o(t,e,r,n,a){var o=r.xaxis,s=r.yaxis,c=i.extent(l.simpleMap(o.range,o.r2c)),f=i.extent(l.simpleMap(s.range,s.r2c)),d=n[0].trace;if(u.hasMarkers(d)){var h=d.marker.maxdisplayed;if(0!==h){var p=n.filter(function(t){return t.x>=c[0]&&t.x<=c[1]&&t.y>=f[0]&&t.y<=f[1]}),g=Math.ceil(p.length/h),v=0;a.forEach(function(t,r){var n=t[0].trace;u.hasMarkers(n)&&n.marker.maxdisplayed>0&&r<e&&v++});var m=Math.round(v*g/3+Math.floor(v/3)*g/7.1);n.forEach(function(t){delete t.vis}),p.forEach(function(t,e){0===Math.round((e+m)%g)&&(t.vis=!0)})}}}var i=t(\"d3\"),l=t(\"../../lib\"),s=t(\"../../components/drawing\"),c=t(\"../../components/errorbars\"),u=t(\"./subtypes\"),f=t(\"./line_points\"),d=t(\"./link_traces\"),h=t(\"../../lib/polygon\").tester;e.exports=function(t,e,r,o,l){var s,c,u,f,h,p=e.plot.select(\"g.scatterlayer\"),g=!o,v=!!o&&o.duration>0;for(u=p.selectAll(\"g.trace\"),f=u.data(r,function(t){return t[0].trace.uid}),f.enter().append(\"g\").attr(\"class\",function(t){return\"trace scatter trace\"+t[0].trace.uid}).style(\"stroke-miterlimit\",2),d(t,e,r),n(t,p),s=0,c={};s<r.length;s++)c[r[s][0].trace.uid]=s;if(p.selectAll(\"g.trace\").sort(function(t,e){return c[t[0].trace.uid]>c[e[0].trace.uid]?1:-1}),v){l&&(h=l());i.transition().duration(o.duration).ease(o.easing).each(\"end\",function(){h&&h()}).each(\"interrupt\",function(){h&&h()}).each(function(){p.selectAll(\"g.trace\").each(function(n,i){a(t,i,e,n,r,this,o)})})}else p.selectAll(\"g.trace\").each(function(n,i){a(t,i,e,n,r,this,o)});g&&f.exit().remove(),p.selectAll(\"path:not([d])\").remove()}},{\"../../components/drawing\":49,\"../../components/errorbars\":55,\"../../lib\":136,\"../../lib/polygon\":146,\"./line_points\":252,\"./link_traces\":254,\"./subtypes\":260,d3:7}],258:[function(t,e,r){\"use strict\";var n=t(\"./subtypes\");e.exports=function(t,e){var r,a,o,i,l=t.cd,s=t.xaxis,c=t.yaxis,u=[],f=l[0].trace,d=f.index,h=f.marker,p=!n.hasMarkers(f)&&!n.hasText(f);if(f.visible===!0&&!p){var g=Array.isArray(h.opacity)?1:h.opacity;if(e===!1)for(r=0;r<l.length;r++)l[r].dim=0;else for(r=0;r<l.length;r++)a=l[r],o=s.c2p(a.x),i=c.c2p(a.y),e.contains([o,i])?(u.push({curveNumber:d,pointNumber:r,x:a.x,y:a.y,id:a.id}),a.dim=0):a.dim=1;return l[0].node3.selectAll(\"path.point\").style(\"opacity\",function(t){return((t.mo+1||g+1)-1)*(t.dim?.2:1)}),l[0].node3.selectAll(\"text\").style(\"opacity\",function(t){return t.dim?.2:1}),u}}},{\"./subtypes\":260}],259:[function(t,e,r){\"use strict\";var n=t(\"d3\"),a=t(\"../../components/drawing\"),o=t(\"../../components/errorbars\");e.exports=function(t){var e=n.select(t).selectAll(\"g.trace.scatter\");e.style(\"opacity\",function(t){return t[0].trace.opacity}),e.selectAll(\"g.points\").each(function(t){var e=n.select(this),r=e.selectAll(\"path.point\"),o=t.trace||t[0].trace;r.call(a.pointStyle,o),e.selectAll(\"text\").call(a.textPointStyle,o)}),e.selectAll(\"g.trace path.js-line\").call(a.lineGroupStyle),e.selectAll(\"g.trace path.js-fill\").call(a.fillGroupStyle),e.call(o.style)}},{\"../../components/drawing\":49,\"../../components/errorbars\":55,d3:7}],260:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports={hasLines:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"lines\")!==-1},hasMarkers:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"markers\")!==-1},hasText:function(t){return t.visible&&t.mode&&t.mode.indexOf(\"text\")!==-1},isBubble:function(t){return n.isPlainObject(t.marker)&&Array.isArray(t.marker.size)}}},{\"../../lib\":136}],261:[function(t,e,r){\"use strict\";var n=t(\"../../lib\");e.exports=function(t,e,r,a){a(\"textposition\"),n.coerceFont(a,\"textfont\",r.font)}},{\"../../lib\":136}],262:[function(t,e,r){\"use strict\";var n=t(\"../../registry\");e.exports=function(t,e,r,a){var o,i=a(\"x\"),l=a(\"y\");if(n.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\"],r),i)l?(o=Math.min(i.length,l.length),o<i.length&&(e.x=i.slice(0,o)),o<l.length&&(e.y=l.slice(0,o))):(o=i.length,a(\"y0\"),a(\"dy\"));else{if(!l)return 0;o=e.y.length,a(\"x0\"),a(\"dx\")}return o}},{\"../../registry\":206}]},{},[5])(5)});window.define = window.__define;window.require = window.__require;window.__define = undefined; window.__require = undefined;/* global Highcharts, Plotly*/\n",
|
|
"/* eslint-disable */\n",
|
|
"function throttle(fn, timeout, invokeAsap, ctx) {\n",
|
|
" var typeofInvokeAsap = typeof invokeAsap;\n",
|
|
" if(typeofInvokeAsap === 'undefined') {\n",
|
|
" invokeAsap = true;\n",
|
|
" } else if(arguments.length === 3 && typeofInvokeAsap !== 'boolean') {\n",
|
|
" ctx = invokeAsap;\n",
|
|
" invokeAsap = true;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var timer, args, needInvoke,\n",
|
|
" wrapper = function() {\n",
|
|
" if(needInvoke) {\n",
|
|
" fn.apply(ctx, args);\n",
|
|
" needInvoke = false;\n",
|
|
" timer = setTimeout(wrapper, timeout);\n",
|
|
" } else {\n",
|
|
" timer = null;\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" return function() {\n",
|
|
" args = arguments;\n",
|
|
" ctx || (ctx = this);\n",
|
|
" needInvoke = true;\n",
|
|
"\n",
|
|
" if(!timer) {\n",
|
|
" invokeAsap?\n",
|
|
" wrapper() :\n",
|
|
" timer = setTimeout(wrapper, timeout);\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* eslint-enable */\n",
|
|
"function CatboostIpython() {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.init = function() {\n",
|
|
" this.charts = {};\n",
|
|
" /*\n",
|
|
" {\n",
|
|
" \"rmse_1\": {\n",
|
|
" ...\n",
|
|
" }\n",
|
|
" }\n",
|
|
" */\n",
|
|
" this.traces = {};\n",
|
|
" /*\n",
|
|
" {\n",
|
|
" \"rmse_1\": {\n",
|
|
" name: \"rmse\",\n",
|
|
" id: \"rmse_1\",\n",
|
|
" parent: \"div\",\n",
|
|
" traces: [\n",
|
|
" {\n",
|
|
" name: \"current;learn;0;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;0;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;1;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;learn;1;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;smoothed;;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;best_point;\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" },\n",
|
|
" {\n",
|
|
" name: \"current;test;0;;;best_value\",\n",
|
|
" x: [],\n",
|
|
" y: []\n",
|
|
" }\n",
|
|
" ]\n",
|
|
" }\n",
|
|
" }\n",
|
|
" */\n",
|
|
"\n",
|
|
" this.chartsToRedraw = {};\n",
|
|
" this.lastIndexes = {};\n",
|
|
" this.smoothness = -1;\n",
|
|
" this.layoutDisabled = {\n",
|
|
" series: {},\n",
|
|
" traces: {}\n",
|
|
" };\n",
|
|
" this.clickMode = false;\n",
|
|
" this.logarithmMode = 'linear';\n",
|
|
" this.lastSmooth = 0;\n",
|
|
" this.layout = null;\n",
|
|
" this.activeTab = '';\n",
|
|
" this.meta = {};\n",
|
|
" this.timeLeft = {};\n",
|
|
"\n",
|
|
" this.hasCVMode = false;\n",
|
|
" this.stddevEnabled = false;\n",
|
|
"\n",
|
|
" this.colors = [\n",
|
|
" '#68E256',\n",
|
|
" '#56AEE2',\n",
|
|
" '#CF56E2',\n",
|
|
" '#E28956',\n",
|
|
" '#56E289',\n",
|
|
" '#5668E2',\n",
|
|
" '#E256AE',\n",
|
|
" '#E2CF56',\n",
|
|
" '#56E2CF',\n",
|
|
" '#8A56E2',\n",
|
|
" '#E25668',\n",
|
|
" '#AEE256'\n",
|
|
" ];\n",
|
|
" this.colorsByPath = {};\n",
|
|
" this.colorIndex = 0;\n",
|
|
" this.lossFuncs = {};\n",
|
|
"\n",
|
|
" this.isCVinited = false;\n",
|
|
"};\n",
|
|
"\n",
|
|
"/* eslint-disable */\n",
|
|
"CatboostIpython.prototype.loadStyles = function(path, fn, scope) {\n",
|
|
" $('link[catboost=\"1\"]').remove();\n",
|
|
"\n",
|
|
" var head = document.getElementsByTagName('head')[0], // reference to document.head for appending/ removing link nodes\n",
|
|
" link = document.createElement('link'); // create the link node\n",
|
|
" link.setAttribute('href', path);\n",
|
|
" link.setAttribute('rel', 'stylesheet');\n",
|
|
" link.setAttribute('type', 'text/css');\n",
|
|
" link.setAttribute('catboost', '1');\n",
|
|
"\n",
|
|
" var sheet, cssRules;\n",
|
|
" // get the correct properties to check for depending on the browser\n",
|
|
" if ('sheet' in link) {\n",
|
|
" sheet = 'sheet'; cssRules = 'cssRules';\n",
|
|
" } else {\n",
|
|
" sheet = 'styleSheet'; cssRules = 'rules';\n",
|
|
" }\n",
|
|
"\n",
|
|
" var interval_id = setInterval(function() { // start checking whether the style sheet has successfully loaded\n",
|
|
" try {\n",
|
|
" if (link[sheet] && link[sheet][cssRules].length) { // SUCCESS! our style sheet has loaded\n",
|
|
" clearInterval(interval_id); // clear the counters\n",
|
|
" clearTimeout(timeout_id);\n",
|
|
" fn.call( scope || window, true, link); // fire the callback with success == true\n",
|
|
" }\n",
|
|
" } catch(e) {} finally {}\n",
|
|
" }, 50 ), // how often to check if the stylesheet is loaded\n",
|
|
" timeout_id = setTimeout( function() { // start counting down till fail\n",
|
|
" clearInterval( interval_id ); // clear the counters\n",
|
|
" clearTimeout( timeout_id );\n",
|
|
" head.removeChild( link ); // since the style sheet didn't load, remove the link node from the DOM\n",
|
|
" fn.call( scope || window, false, link ); // fire the callback with success == false\n",
|
|
" }, 15000 ); // how long to wait before failing\n",
|
|
"\n",
|
|
" head.appendChild( link ); // insert the link node into the DOM and start loading the style sheet\n",
|
|
"\n",
|
|
" return link; // return the link node;\n",
|
|
"};\n",
|
|
"/* eslint-enable */\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.resizeCharts = function() {\n",
|
|
" // width fix for development\n",
|
|
" $('.catboost-graph__charts', this.layout).css({width: $('.catboost-graph').width()});\n",
|
|
"\n",
|
|
" this.plotly.Plots.resize(this.traces[this.activeTab].parent);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addMeta = function(path, meta) {\n",
|
|
" this.meta[path] = meta;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addLayout = function(parent) {\n",
|
|
" if (this.layout) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var cvAreaControls = '';\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" cvAreaControls = '<div>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-cvstddev' + this.index + '\"' + (this.stddevEnabled ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control2-cvstddev' + this.index + '\" class=\"catboost-panel__controls2_label catboost-panel__controls2_label-long\">Standard Deviation</label>' +\n",
|
|
" '</div>';\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.layout = $('<div class=\"catboost\">' +\n",
|
|
" '<div class=\"catboost-panel\">' +\n",
|
|
" '<div class=\"catboost-panel__controls\">' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__controls_checkbox\" id=\"catboost-control-learn' + this.index + '\" ' + (!this.layoutDisabled.learn ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control-learn' + this.index + '\" class=\"catboost-panel__controls_label\"><div class=\"catboost-panel__serie_learn_pic\" style=\"border-color:#999\"></div>Learn</label>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__controls_checkbox\" id=\"catboost-control-test' + this.index + '\" ' + (!this.layoutDisabled.test ? ' checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label for=\"catboost-control-test' + this.index + '\" class=\"catboost-panel__controls_label\"><div class=\"catboost-panel__serie_test_pic\" style=\"border-color:#999\"></div>Eval</label>' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__series ' + (this.layoutDisabled.learn ? ' catboost-panel__series_learn_disabled' : '') + '\">' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__controls2\">' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-clickmode' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-clickmode' + this.index + '\" class=\"catboost-panel__controls2_label\">Click Mode</label>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-log' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-log' + this.index + '\" class=\"catboost-panel__controls2_label\">Logarithm</label>' +\n",
|
|
" '<div>' +\n",
|
|
" '<input type=\"checkbox\" class=\"catboost-panel__control_checkbox\" id=\"catboost-control2-smooth' + this.index + '\"></input>' +\n",
|
|
" '<label for=\"catboost-control2-smooth' + this.index + '\" class=\"catboost-panel__controls2_label\">Smooth</label>' +\n",
|
|
" '<input id=\"catboost-control2-slider' + this.index + '\" disabled=\"disabled\" class=\"catboost-panel__control_slider\" type =\"range\" value=\"0\" min=\"0\" max=\"1\" step =\"0.01\" for=\"rangeInputValue\" name=\"rangeInput\"/>' +\n",
|
|
" '<input id=\"catboost-control2-slidervalue' + this.index + '\" disabled=\"disabled\" class=\"catboost-panel__control_slidervalue\" value=\"0\" min=\"0\" max=\"1\" for=\"rangeInput\" name=\"rangeInputValue\"/>' +\n",
|
|
" '</div>' +\n",
|
|
" cvAreaControls +\n",
|
|
" '</div>' +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-graph\">' +\n",
|
|
" '<div class=\"catboost-graph__tabs\"></div>' +\n",
|
|
" '<div class=\"catboost-graph__charts\"></div>' +\n",
|
|
" '</div>' +\n",
|
|
" '</div>');\n",
|
|
" $(parent).append(this.layout);\n",
|
|
"\n",
|
|
" this.addTabEvents();\n",
|
|
" this.addControlEvents();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addTabEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('.catboost-graph__tabs', this.layout).click(function(e) {\n",
|
|
" if (!$(e.target).is('.catboost-graph__tab:not(.catboost-graph__tab_active)')) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var id = $(e.target).attr('tabid');\n",
|
|
"\n",
|
|
" self.activeTab = id;\n",
|
|
"\n",
|
|
" $('.catboost-graph__tab_active', self.layout).removeClass('catboost-graph__tab_active');\n",
|
|
" $('.catboost-graph__chart_active', self.layout).removeClass('catboost-graph__chart_active');\n",
|
|
"\n",
|
|
" $('.catboost-graph__tab[tabid=\"' + id + '\"]', self.layout).addClass('catboost-graph__tab_active');\n",
|
|
" $('.catboost-graph__chart[tabid=\"' + id + '\"]', self.layout).addClass('catboost-graph__chart_active');\n",
|
|
"\n",
|
|
" self.cleanSeries();\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" self.resizeCharts();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addControlEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('#catboost-control-learn' + this.index, this.layout).click(function() {\n",
|
|
" self.layoutDisabled.learn = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', self.layout).toggleClass('catboost-panel__series_learn_disabled', self.layoutDisabled.learn);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control-test' + this.index, this.layout).click(function() {\n",
|
|
" self.layoutDisabled.test = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', self.layout).toggleClass('catboost-panel__series_test_disabled', self.layoutDisabled.test);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-clickmode' + this.index, this.layout).click(function() {\n",
|
|
" self.clickMode = $(this)[0].checked;\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-log' + this.index, this.layout).click(function() {\n",
|
|
" self.logarithmMode = $(this)[0].checked ? 'log' : 'linear';\n",
|
|
"\n",
|
|
" self.forEveryLayout(function(layout) {\n",
|
|
" layout.yaxis = {type: self.logarithmMode};\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" var slider = $('#catboost-control2-slider' + this.index),\n",
|
|
" sliderValue = $('#catboost-control2-slidervalue' + this.index);\n",
|
|
"\n",
|
|
" $('#catboost-control2-smooth' + this.index, this.layout).click(function() {\n",
|
|
" var enabled = $(this)[0].checked;\n",
|
|
"\n",
|
|
" self.setSmoothness(enabled ? self.lastSmooth : -1);\n",
|
|
"\n",
|
|
" slider.prop('disabled', !enabled);\n",
|
|
" sliderValue.prop('disabled', !enabled);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" $('#catboost-control2-cvstddev' + this.index, this.layout).click(function() {\n",
|
|
" var enabled = $(this)[0].checked;\n",
|
|
"\n",
|
|
" self.setStddev(enabled);\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" slider.on('input change', function() {\n",
|
|
" var smooth = Number($(this).val());\n",
|
|
"\n",
|
|
" sliderValue.val(isNaN(smooth) ? 0 : smooth);\n",
|
|
"\n",
|
|
" self.setSmoothness(smooth);\n",
|
|
" self.lastSmooth = smooth;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"\n",
|
|
" sliderValue.on('input change', function() {\n",
|
|
" var smooth = Number($(this).val());\n",
|
|
"\n",
|
|
" slider.val(isNaN(smooth) ? 0 : smooth);\n",
|
|
"\n",
|
|
" self.setSmoothness(smooth);\n",
|
|
" self.lastSmooth = smooth;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setTraceVisibility = function(trace, visibility) {\n",
|
|
" if (trace) {\n",
|
|
" trace.visible = visibility;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesVisibility = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" traces,\n",
|
|
" smoothDisabled = this.getSmoothness() === -1,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train)) {\n",
|
|
" traces = tracesHash[train].traces;\n",
|
|
"\n",
|
|
" if (this.layoutDisabled.traces[train]) {\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" } else {\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" if (this.stddevEnabled) {\n",
|
|
" self.filterTracesOne(traces, {type: 'learn'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {type: 'test'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, best_point: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_first: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_last: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, true);\n",
|
|
" });\n",
|
|
" } else {\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_first: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesOne(traces, {cv_stddev_last: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'learn', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, smoothed: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
"\n",
|
|
" self.filterTracesEvery(traces, this.getTraceDefParams({type: 'test', cv_avg: true, best_point: true})).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (smoothDisabled) {\n",
|
|
" self.filterTracesOne(traces, {smoothed: true}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (this.layoutDisabled['learn']) {\n",
|
|
" self.filterTracesOne(traces, {type: 'learn'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (this.layoutDisabled['test']) {\n",
|
|
" self.filterTracesOne(traces, {type: 'test'}).forEach(function(trace) {\n",
|
|
" self.setTraceVisibility(trace, false);\n",
|
|
" });\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getSmoothness = function() {\n",
|
|
" return this.smoothness && this.smoothness > -1 ? this.smoothness : -1;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setSmoothness = function(weight) {\n",
|
|
" if (weight < 0 && weight !== -1 || weight > 1) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.smoothness = weight;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.setStddev = function(enabled) {\n",
|
|
" this.stddevEnabled = enabled;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redrawActiveChart = function() {\n",
|
|
" this.chartsToRedraw[this.activeTab] = true;\n",
|
|
"\n",
|
|
" this.redrawAll();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redraw = function() {\n",
|
|
" if (this.chartsToRedraw[this.activeTab]) {\n",
|
|
" this.chartsToRedraw[this.activeTab] = false;\n",
|
|
"\n",
|
|
" this.updateTracesVisibility();\n",
|
|
" this.updateTracesCV();\n",
|
|
" this.updateTracesBest();\n",
|
|
" this.updateTracesValues();\n",
|
|
" this.updateTracesSmoothness();\n",
|
|
"\n",
|
|
" this.plotly.redraw(this.traces[this.activeTab].parent);\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.drawTraces();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addRedrawFunc = function() {\n",
|
|
" this.redrawFunc = throttle(this.redraw, 400, false, this);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.redrawAll = function() {\n",
|
|
" if (!this.redrawFunc) {\n",
|
|
" this.addRedrawFunc();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.redrawFunc();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addPoints = function(parent, data) {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" data.chunks.forEach(function(item) {\n",
|
|
" if (typeof item.remaining_time !== 'undefined' && typeof item.passed_time !== 'undefined') {\n",
|
|
" if (!self.timeLeft[data.path]) {\n",
|
|
" self.timeLeft[data.path] = [];\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.timeLeft[data.path][item.iteration] = [item.remaining_time, item.passed_time];\n",
|
|
" }\n",
|
|
"\n",
|
|
" ['test', 'learn'].forEach(function(type) {\n",
|
|
" var sets = self.meta[data.path][type + '_sets'],\n",
|
|
" metrics = self.meta[data.path][type + '_metrics'];\n",
|
|
"\n",
|
|
" for (var i = 0; i < metrics.length; i++) {\n",
|
|
" var nameOfMetric = metrics[i].name,\n",
|
|
" cvAdded = false;\n",
|
|
"\n",
|
|
" self.lossFuncs[nameOfMetric] = metrics[i].best_value;\n",
|
|
"\n",
|
|
" for (var j = 0; j < sets.length; j++) {\n",
|
|
" var nameOfSet = sets[j],\n",
|
|
" params = {\n",
|
|
" chartName: nameOfMetric,\n",
|
|
" index: i,\n",
|
|
" train: data.train,\n",
|
|
" type: type,\n",
|
|
" path: data.path,\n",
|
|
" indexOfSet: j,\n",
|
|
" nameOfSet: nameOfSet\n",
|
|
" },\n",
|
|
" key = self.getKey(params),\n",
|
|
" launchMode = self.getLaunchMode(data.path);\n",
|
|
"\n",
|
|
" if (!self.activeTab) {\n",
|
|
" self.activeTab = key.chartId;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (launchMode === 'CV' ) {\n",
|
|
" // we need to set launch mode before first getTrace call\n",
|
|
" self.hasCVMode = true;\n",
|
|
"\n",
|
|
" if (!self.isCVinited) {\n",
|
|
" // and we don't need to reset setting for next iterations\n",
|
|
" self.layoutDisabled.learn = true;\n",
|
|
" self.setStddev(true);\n",
|
|
"\n",
|
|
" self.isCVinited = true;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" var valuesOfSet = item[nameOfSet],\n",
|
|
" pointValue = valuesOfSet[i],\n",
|
|
" pointIndex = item.iteration,\n",
|
|
" // traces\n",
|
|
" trace = self.getTrace(parent, params),\n",
|
|
" smoothedTrace = self.getTrace(parent, $.extend({smoothed: true}, params)),\n",
|
|
" bestValueTrace = null;\n",
|
|
"\n",
|
|
" if (type === 'test') {\n",
|
|
" if (launchMode !== 'CV') {\n",
|
|
" self.getTrace(parent, $.extend({best_point: true}, params));\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof self.lossFuncs[nameOfMetric] === 'number') {\n",
|
|
" bestValueTrace = self.getTrace(parent, $.extend({best_value: true}, params));\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (pointValue !== 'inf' && pointValue !== 'nan') {\n",
|
|
" trace.x[pointIndex] = pointIndex;\n",
|
|
" trace.y[pointIndex] = valuesOfSet[i];\n",
|
|
" trace.hovertext[pointIndex] = nameOfSet + ': ' + valuesOfSet[i].toPrecision(7);\n",
|
|
"\n",
|
|
" smoothedTrace.x[pointIndex] = pointIndex;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (bestValueTrace) {\n",
|
|
" bestValueTrace.x[pointIndex] = pointIndex;\n",
|
|
" bestValueTrace.y[pointIndex] = self.lossFuncs[nameOfMetric];\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (launchMode === 'CV' && !cvAdded) {\n",
|
|
" cvAdded = true;\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_first: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_last: true}, params));\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_first: true, smoothed: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_stddev_last: true, smoothed: true}, params));\n",
|
|
"\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true}, params));\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true, smoothed: true}, params));\n",
|
|
"\n",
|
|
" if (type === 'test') {\n",
|
|
" self.getTrace(parent, $.extend({cv_avg: true, best_point: true}, params));\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.chartsToRedraw[key.chartId] = true;\n",
|
|
"\n",
|
|
" self.redrawAll();\n",
|
|
" }\n",
|
|
" });\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getLaunchMode = function(path) {\n",
|
|
" return this.meta[path].launch_mode;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChartNode = function(params, active) {\n",
|
|
" var node = $('<div class=\"catboost-graph__chart\" tabid=\"' + params.id + '\"></div>');\n",
|
|
"\n",
|
|
" if (active) {\n",
|
|
" node.addClass('catboost-graph__chart_active');\n",
|
|
" }\n",
|
|
"\n",
|
|
" return node;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChartTab = function(params, active) {\n",
|
|
" var node = $('<div class=\"catboost-graph__tab\" tabid=\"' + params.id + '\">' + params.name + '</div>');\n",
|
|
"\n",
|
|
" if (active) {\n",
|
|
" node.addClass('catboost-graph__tab_active');\n",
|
|
" }\n",
|
|
"\n",
|
|
" return node;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.forEveryChart = function(callback) {\n",
|
|
" for (var name in this.traces) {\n",
|
|
" if (this.traces.hasOwnProperty(name)) {\n",
|
|
" callback(this.traces[name]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.forEveryLayout = function(callback) {\n",
|
|
" this.forEveryChart(function(chart) {\n",
|
|
" callback(chart.layout);\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getChart = function(parent, params) {\n",
|
|
" var id = params.id,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" if (this.charts[id]) {\n",
|
|
" return this.charts[id];\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.addLayout(parent);\n",
|
|
"\n",
|
|
" var active = this.activeTab === params.id,\n",
|
|
" chartNode = this.getChartNode(params, active),\n",
|
|
" chartTab = this.getChartTab(params, active);\n",
|
|
"\n",
|
|
" $('.catboost-graph__charts', this.layout).append(chartNode);\n",
|
|
" $('.catboost-graph__tabs', this.layout).append(chartTab);\n",
|
|
"\n",
|
|
" this.traces[id] = {\n",
|
|
" id: params.id,\n",
|
|
" name: params.name,\n",
|
|
" parent: chartNode[0],\n",
|
|
" traces: [],\n",
|
|
" layout: {\n",
|
|
" xaxis: {\n",
|
|
" range: [0, Number(this.meta[params.path].iteration_count)],\n",
|
|
" type: 'linear',\n",
|
|
" tickmode: 'auto',\n",
|
|
" showspikes: true,\n",
|
|
" spikethickness: 1,\n",
|
|
" spikedash: 'longdashdot',\n",
|
|
" spikemode: 'across',\n",
|
|
" zeroline: false,\n",
|
|
" showgrid: false\n",
|
|
" },\n",
|
|
" yaxis: {\n",
|
|
" zeroline: false\n",
|
|
" //showgrid: false\n",
|
|
" //hoverformat : '.7f'\n",
|
|
" },\n",
|
|
" separators: '. ',\n",
|
|
" //hovermode: 'x',\n",
|
|
" margin: {l: 38, r: 0, t: 35, b: 30},\n",
|
|
" autosize: true,\n",
|
|
" showlegend: false\n",
|
|
" },\n",
|
|
" options: {\n",
|
|
" scrollZoom: false,\n",
|
|
" modeBarButtonsToRemove: ['toggleSpikelines'],\n",
|
|
" displaylogo: false\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.charts[id] = this.plotly.plot(chartNode[0], this.traces[id].traces, this.traces[id].layout, this.traces[id].options);\n",
|
|
"\n",
|
|
" chartNode[0].on('plotly_hover', function(e) {\n",
|
|
" self.updateTracesValues(e.points[0].x);\n",
|
|
" });\n",
|
|
"\n",
|
|
" chartNode[0].on('plotly_click', function(e) {\n",
|
|
" self.updateTracesValues(e.points[0].x, true);\n",
|
|
" });\n",
|
|
"\n",
|
|
" return this.charts[id];\n",
|
|
"};\n",
|
|
"\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getTrace = function(parent, params) {\n",
|
|
" var key = this.getKey(params),\n",
|
|
" chartSeries = [];\n",
|
|
"\n",
|
|
" if (this.traces[key.chartId]) {\n",
|
|
" chartSeries = this.traces[key.chartId].traces.filter(function(trace) {\n",
|
|
" return trace.name === key.traceName;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (chartSeries.length) {\n",
|
|
" return chartSeries[0];\n",
|
|
" } else {\n",
|
|
" this.getChart(parent, {id: key.chartId, name: params.chartName, path: params.path});\n",
|
|
"\n",
|
|
" var plotParams = {\n",
|
|
" color: this.getNextColor(params.path, params.smoothed ? 0.2 : 1),\n",
|
|
" fillsmoothcolor: this.getNextColor(params.path, 0.1),\n",
|
|
" fillcolor: this.getNextColor(params.path, 0.4),\n",
|
|
" hoverinfo: params.cv_avg ? 'skip' : 'text+x',\n",
|
|
" width: params.cv_avg ? 2 : 1,\n",
|
|
" dash: params.type === 'test' ? 'solid' : 'dot'\n",
|
|
" },\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" hovertext: [],\n",
|
|
" hoverinfo: plotParams.hoverinfo,\n",
|
|
" line: {\n",
|
|
" width: plotParams.width,\n",
|
|
" dash: plotParams.dash,\n",
|
|
" color: plotParams.color\n",
|
|
" },\n",
|
|
" mode: 'lines',\n",
|
|
" hoveron: 'points',\n",
|
|
" connectgaps: true\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (params.best_point) {\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" marker: {\n",
|
|
" width: 2,\n",
|
|
" color: plotParams.color\n",
|
|
" },\n",
|
|
" hovertext: [],\n",
|
|
" hoverinfo: 'text',\n",
|
|
" mode: 'markers',\n",
|
|
" type: 'scatter'\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (params.best_value) {\n",
|
|
" trace = {\n",
|
|
" name: key.traceName,\n",
|
|
" _params: params,\n",
|
|
" x: [],\n",
|
|
" y: [],\n",
|
|
" line: {\n",
|
|
" width: 1,\n",
|
|
" dash: 'dash',\n",
|
|
" color: '#CCCCCC'\n",
|
|
" },\n",
|
|
" mode: 'lines',\n",
|
|
" connectgaps: true,\n",
|
|
" hoverinfo: 'skip'\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (params.cv_stddev_last) {\n",
|
|
" trace.fill = 'tonexty';\n",
|
|
" }\n",
|
|
"\n",
|
|
" trace._params.plotParams = plotParams;\n",
|
|
"\n",
|
|
" this.traces[key.chartId].traces.push(trace);\n",
|
|
"\n",
|
|
" return trace;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getKey = function(params) {\n",
|
|
" var traceName = [\n",
|
|
" params.train,\n",
|
|
" params.type,\n",
|
|
" params.indexOfSet,\n",
|
|
" (params.smoothed ? 'smoothed' : ''),\n",
|
|
" (params.best_point ? 'best_pount' : ''),\n",
|
|
" (params.best_value ? 'best_value' : ''),\n",
|
|
" (params.cv_avg ? 'cv_avg' : ''),\n",
|
|
" (params.cv_stddev_first ? 'cv_stddev_first' : ''),\n",
|
|
" (params.cv_stddev_last ? 'cv_stddev_last' : '')\n",
|
|
" ].join(';');\n",
|
|
"\n",
|
|
" return {\n",
|
|
" chartId: params.chartName,\n",
|
|
" traceName: traceName,\n",
|
|
" colorId: params.train\n",
|
|
" };\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.filterTracesEvery = function(traces, filter) {\n",
|
|
" traces = traces || this.traces[this.activeTab].traces;\n",
|
|
"\n",
|
|
" return traces.filter(function(trace) {\n",
|
|
" for (var prop in filter) {\n",
|
|
" if (filter.hasOwnProperty(prop)) {\n",
|
|
" if (filter[prop] !== trace._params[prop]) {\n",
|
|
" return false;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return true;\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.filterTracesOne = function(traces, filter) {\n",
|
|
" traces = traces || this.traces[this.activeTab].traces;\n",
|
|
"\n",
|
|
" return traces.filter(function(trace) {\n",
|
|
" for (var prop in filter) {\n",
|
|
" if (filter.hasOwnProperty(prop)) {\n",
|
|
" if (filter[prop] === trace._params[prop]) {\n",
|
|
" return true;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cleanSeries = function() {\n",
|
|
" $('.catboost-panel__series', this.layout).html('');\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.groupTraces = function() {\n",
|
|
" var traces = this.traces[this.activeTab].traces,\n",
|
|
" index = 0,\n",
|
|
" tracesHash = {};\n",
|
|
"\n",
|
|
" traces.map(function(trace) {\n",
|
|
" var train = trace._params.train;\n",
|
|
"\n",
|
|
" if (!tracesHash[train]) {\n",
|
|
" tracesHash[train] = {\n",
|
|
" index: index,\n",
|
|
" traces: [],\n",
|
|
" info: {\n",
|
|
" path: trace._params.path,\n",
|
|
" color: trace._params.plotParams.color\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" index++;\n",
|
|
" }\n",
|
|
"\n",
|
|
" tracesHash[train].traces.push(trace);\n",
|
|
" });\n",
|
|
"\n",
|
|
" return tracesHash;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.drawTraces = function() {\n",
|
|
" if ($('.catboost-panel__series .catboost-panel__serie', this.layout).length) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var html = '',\n",
|
|
" tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train)) {\n",
|
|
" html += this.drawTrace(train, tracesHash[train]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" $('.catboost-panel__series', this.layout).html(html);\n",
|
|
"\n",
|
|
" this.updateTracesValues();\n",
|
|
"\n",
|
|
" this.addTracesEvents();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getTraceDefParams = function(params) {\n",
|
|
" var defParams = {\n",
|
|
" smoothed: undefined,\n",
|
|
" best_point: undefined,\n",
|
|
" best_value: undefined,\n",
|
|
" cv_avg: undefined,\n",
|
|
" cv_stddev_first: undefined,\n",
|
|
" cv_stddev_last: undefined\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (params) {\n",
|
|
" return $.extend(defParams, params);\n",
|
|
" } else {\n",
|
|
" return defParams;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.drawTrace = function(train, hash) {\n",
|
|
" var info = hash.info,\n",
|
|
" id = 'catboost-serie-' + this.index + '-' + hash.index,\n",
|
|
" traces = {\n",
|
|
" learn: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'learn'})),\n",
|
|
" test: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'test'}))\n",
|
|
" },\n",
|
|
" items = {\n",
|
|
" learn: {\n",
|
|
" middle: '',\n",
|
|
" bottom: ''\n",
|
|
" },\n",
|
|
" test: {\n",
|
|
" middle: '',\n",
|
|
" bottom: ''\n",
|
|
" }\n",
|
|
" },\n",
|
|
" tracesNames = '';\n",
|
|
"\n",
|
|
" ['learn', 'test'].forEach(function(type) {\n",
|
|
" traces[type].forEach(function(trace) {\n",
|
|
" items[type].middle += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:' + info.color + '\"></div>' +\n",
|
|
" '<div data-index=\"' + trace._params.indexOfSet + '\" class=\"catboost-panel__serie_' + type + '_value\"></div>';\n",
|
|
"\n",
|
|
" items[type].bottom += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:transparent\"></div>' +\n",
|
|
" '<div data-index=\"' + trace._params.indexOfSet + '\" class=\"catboost-panel__serie_best_' + type + '_value\"></div>';\n",
|
|
"\n",
|
|
" tracesNames += '<div class=\"catboost-panel__serie_' + type + '_pic\" style=\"border-color:' + info.color + '\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_' + type + '_name\">' + trace._params.nameOfSet + '</div>';\n",
|
|
" });\n",
|
|
" });\n",
|
|
"\n",
|
|
" var timeSpendHtml = '<div class=\"catboost-panel__serie_time\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_time_spend\" title=\"Time spend\"></div>' +\n",
|
|
" '</div>';\n",
|
|
"\n",
|
|
" var html = '<div id=\"' + id + '\" class=\"catboost-panel__serie\" style=\"color:' + info.color + '\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_top\">' +\n",
|
|
" '<input type=\"checkbox\" data-seriename=\"' + train + '\" class=\"catboost-panel__serie_checkbox\" id=\"' + id + '-box\" ' + (!this.layoutDisabled.series[train] ? 'checked=\"checked\"' : '') + '></input>' +\n",
|
|
" '<label title=' + this.meta[info.path].name + ' for=\"' + id + '-box\" class=\"catboost-panel__serie_label\">' + train + '<div class=\"catboost-panel__serie_time_left\" title=\"Estimate time\"></div></label>' +\n",
|
|
" (this.getLaunchMode(info.path) !== 'Eval' ? timeSpendHtml : '') +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_hint catboost-panel__serie__learn_hint\">curr</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_hint catboost-panel__serie__test_hint\">best</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_iteration\" title=\"curr iteration\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_best_iteration\" title=\"best ' + (this.hasCVMode ? 'avg ' : '') + 'iteration\"></div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_scroll\">' +\n",
|
|
" '<div class=\"catboost-panel__serie_names\">' +\n",
|
|
" tracesNames +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_middle\">' +\n",
|
|
" items.learn.middle +\n",
|
|
" items.test.middle +\n",
|
|
" '</div>' +\n",
|
|
" '<div class=\"catboost-panel__serie_bottom\">' +\n",
|
|
" items.learn.bottom +\n",
|
|
" items.test.bottom +\n",
|
|
" '</div>' +\n",
|
|
" '</div>' +\n",
|
|
" '</div>';\n",
|
|
"\n",
|
|
" return html;\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesValues = function(iteration, click) {\n",
|
|
" var tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train) && !this.layoutDisabled.traces[train]) {\n",
|
|
" this.updateTraceValues(train, tracesHash[train], iteration, click);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesBest = function() {\n",
|
|
" var tracesHash = this.groupTraces();\n",
|
|
"\n",
|
|
" for (var train in tracesHash) {\n",
|
|
" if (tracesHash.hasOwnProperty(train) && !this.layoutDisabled.traces[train]) {\n",
|
|
" this.updateTraceBest(train, tracesHash[train]);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getBestValue = function(data) {\n",
|
|
" if (!data.length) {\n",
|
|
" return {\n",
|
|
" best: undefined,\n",
|
|
" index: -1\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" var best = data[0],\n",
|
|
" index = 0,\n",
|
|
" func = this.lossFuncs[this.traces[this.activeTab].name],\n",
|
|
" bestDiff = typeof func === 'number' ? Math.abs(data[0] - func) : 0;\n",
|
|
"\n",
|
|
" for (var i = 1, l = data.length; i < l; i++) {\n",
|
|
" if (func === 'Min' && data[i] < best) {\n",
|
|
" best = data[i];\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (func === 'Max' && data[i] > best) {\n",
|
|
" best = data[i];\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof func === 'number' && Math.abs(data[i] - func) < bestDiff) {\n",
|
|
" best = data[i];\n",
|
|
" bestDiff = Math.abs(data[i] - func);\n",
|
|
" index = i;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return {\n",
|
|
" best: best,\n",
|
|
" index: index,\n",
|
|
" func: func\n",
|
|
" };\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCV = function() {\n",
|
|
" this.updateTracesCVAvg();\n",
|
|
"\n",
|
|
" if (this.hasCVMode && this.stddevEnabled) {\n",
|
|
" this.updateTracesCVStdDev();\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCVAvg = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" avgTraces = this.filterTracesEvery(tracesHash.traces, this.getTraceDefParams({\n",
|
|
" cv_avg: true\n",
|
|
" })),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" avgTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (origTraces.length) {\n",
|
|
" self.cvAvgFunc(origTraces, trace);\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cvAvgFunc = function(origTraces, avgTrace) {\n",
|
|
" var maxCount = origTraces.length,\n",
|
|
" maxLength = -1,\n",
|
|
" count,\n",
|
|
" sum;\n",
|
|
"\n",
|
|
" origTraces.forEach(function(origTrace) {\n",
|
|
" if (origTrace.y.length > maxLength) {\n",
|
|
" maxLength = origTrace.y.length;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" for (var i = 0; i < maxLength; i++) {\n",
|
|
" sum = 0;\n",
|
|
" count = 0;\n",
|
|
"\n",
|
|
" for (var j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" sum += origTraces[j].y[i];\n",
|
|
" count++;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (count > 0) {\n",
|
|
" avgTrace.x[i] = i;\n",
|
|
" avgTrace.y[i] = sum / count;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesCVStdDev = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" firstTraces = this.filterTracesOne(tracesHash.traces, {cv_stddev_first: true}),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" firstTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed\n",
|
|
" })),\n",
|
|
" lastTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" smoothed: trace._params.smoothed,\n",
|
|
" cv_stddev_last: true\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (origTraces.length && lastTraces.length === 1) {\n",
|
|
" self.cvStdDevFunc(origTraces, trace, lastTraces[0]);\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.cvStdDevFunc = function(origTraces, firstTrace, lastTrace) {\n",
|
|
" var maxCount = origTraces.length,\n",
|
|
" maxLength = -1,\n",
|
|
" count,\n",
|
|
" sum,\n",
|
|
" i, j;\n",
|
|
"\n",
|
|
" origTraces.forEach(function(origTrace) {\n",
|
|
" if (origTrace.y.length > maxLength) {\n",
|
|
" maxLength = origTrace.y.length;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" for (i = 0; i < maxLength; i++) {\n",
|
|
" sum = 0;\n",
|
|
" count = 0;\n",
|
|
"\n",
|
|
" for (j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" sum += origTraces[j].y[i];\n",
|
|
" count++;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (count <= 0) {\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var std = 0,\n",
|
|
" avg = sum / count;\n",
|
|
"\n",
|
|
" for (j = 0; j < maxCount; j++) {\n",
|
|
" if (typeof origTraces[j].y[i] !== 'undefined') {\n",
|
|
" std += Math.pow(origTraces[j].y[i] - avg, 2);\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" std /= (count - 1);\n",
|
|
" std = Math.pow(std, 0.5);\n",
|
|
"\n",
|
|
" firstTrace.x[i] = i;\n",
|
|
" firstTrace.y[i] = avg - std;\n",
|
|
" firstTrace.hovertext[i] = firstTrace._params.type + ' std: ' + avg.toFixed(7) + '-' + std.toFixed(7);\n",
|
|
"\n",
|
|
" lastTrace.x[i] = i;\n",
|
|
" lastTrace.y[i] = avg + std;\n",
|
|
" lastTrace.hovertext[i] = lastTrace._params.type + ' std: ' + avg.toFixed(7) + '+' + std.toFixed(7);\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTracesSmoothness = function() {\n",
|
|
" var tracesHash = this.groupTraces(),\n",
|
|
" smoothedTraces = this.filterTracesOne(tracesHash.traces, {smoothed: true}),\n",
|
|
" enabled = this.getSmoothness() > -1,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" smoothedTraces.forEach(function(trace) {\n",
|
|
" var origTraces = self.filterTracesEvery(tracesHash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: trace._params.type,\n",
|
|
" indexOfSet: trace._params.indexOfSet,\n",
|
|
" cv_avg: trace._params.cv_avg,\n",
|
|
" cv_stddev_first: trace._params.cv_stddev_first,\n",
|
|
" cv_stddev_last: trace._params.cv_stddev_last\n",
|
|
" })),\n",
|
|
" colorFlag = false;\n",
|
|
"\n",
|
|
" if (origTraces.length === 1) {\n",
|
|
" origTraces = origTraces[0];\n",
|
|
"\n",
|
|
" if (origTraces.visible) {\n",
|
|
" if (enabled) {\n",
|
|
" self.smoothFunc(origTraces, trace);\n",
|
|
" colorFlag = true;\n",
|
|
" }\n",
|
|
"\n",
|
|
" self.highlightSmoothedTrace(origTraces, trace, colorFlag);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.highlightSmoothedTrace = function(trace, smoothedTrace, flag) {\n",
|
|
" if (flag) {\n",
|
|
" smoothedTrace.line.color = trace._params.plotParams.color;\n",
|
|
" trace.line.color = smoothedTrace._params.plotParams.color;\n",
|
|
" trace.hoverinfo = 'skip';\n",
|
|
"\n",
|
|
" if (trace._params.cv_stddev_last) {\n",
|
|
" trace.fillcolor = trace._params.plotParams.fillsmoothcolor;\n",
|
|
" }\n",
|
|
" } else {\n",
|
|
" trace.line.color = trace._params.plotParams.color;\n",
|
|
" trace.hoverinfo = trace._params.plotParams.hoverinfo;\n",
|
|
"\n",
|
|
" if (trace._params.cv_stddev_last) {\n",
|
|
" trace.fillcolor = trace._params.plotParams.fillcolor;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.smoothFunc = function(origTrace, smoothedTrace) {\n",
|
|
" var data = origTrace.y,\n",
|
|
" smoothedPoints = this.smooth(data, this.getSmoothness()),\n",
|
|
" smoothedIndex = 0;\n",
|
|
"\n",
|
|
" if (smoothedPoints.length) {\n",
|
|
" data.forEach(function (d, index) {\n",
|
|
" if (!smoothedTrace.x[index]) {\n",
|
|
" smoothedTrace.x[index] = index;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var nameOfSet = smoothedTrace._params.nameOfSet;\n",
|
|
"\n",
|
|
" if (smoothedTrace._params.cv_stddev_first || smoothedTrace._params.cv_stddev_last) {\n",
|
|
" nameOfSet = smoothedTrace._params.type + ' std';\n",
|
|
" }\n",
|
|
"\n",
|
|
" smoothedTrace.y[index] = smoothedPoints[smoothedIndex];\n",
|
|
" smoothedTrace.hovertext[index] = nameOfSet + '`: ' + smoothedPoints[smoothedIndex].toPrecision(7);\n",
|
|
"\n",
|
|
" smoothedIndex++;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.formatItemValue = function(value, index, suffix) {\n",
|
|
" if (typeof value === 'undefined') {\n",
|
|
" return '';\n",
|
|
" }\n",
|
|
"\n",
|
|
" suffix = suffix || '';\n",
|
|
"\n",
|
|
" return '<span title=\"' + suffix + 'value ' + value + '\">' + value + '</span>';\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTraceBest = function(train, hash) {\n",
|
|
" var traces = this.filterTracesOne(hash.traces, {best_point: true}),\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" traces.forEach(function(trace) {\n",
|
|
" var testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: 'test',\n",
|
|
" indexOfSet: trace._params.indexOfSet\n",
|
|
" }));\n",
|
|
"\n",
|
|
" if (self.hasCVMode) {\n",
|
|
" testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" train: trace._params.train,\n",
|
|
" type: 'test',\n",
|
|
" cv_avg: true\n",
|
|
" }));\n",
|
|
" }\n",
|
|
"\n",
|
|
" var bestValue = self.getBestValue(testTrace.length === 1 ? testTrace[0].y : []);\n",
|
|
"\n",
|
|
" if (bestValue.index !== -1) {\n",
|
|
" trace.x[0] = bestValue.index;\n",
|
|
" trace.y[0] = bestValue.best;\n",
|
|
" trace.hovertext[0] = bestValue.func + ' (' + (self.hasCVMode ? 'avg' : trace._params.nameOfSet) + '): ' + bestValue.index + ' ' + bestValue.best;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.updateTraceValues = function(name, hash, iteration, click) {\n",
|
|
" var id = 'catboost-serie-' + this.index + '-' + hash.index,\n",
|
|
" traces = {\n",
|
|
" learn: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'learn'})),\n",
|
|
" test: this.filterTracesEvery(hash.traces, this.getTraceDefParams({type: 'test'}))\n",
|
|
" },\n",
|
|
" path = hash.info.path,\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" ['learn', 'test'].forEach(function(type) {\n",
|
|
" traces[type].forEach(function(trace) {\n",
|
|
" var data = trace.y || [],\n",
|
|
" index = typeof iteration !== 'undefined' && iteration < data.length - 1 ? iteration : data.length - 1,\n",
|
|
" value = data.length ? data[index] : undefined,\n",
|
|
" testTrace = self.filterTracesEvery(hash.traces, self.getTraceDefParams({\n",
|
|
" type: 'test',\n",
|
|
" indexOfSet: trace._params.indexOfSet\n",
|
|
" })),\n",
|
|
" bestValue = self.getBestValue(testTrace.length === 1 ? testTrace[0].y : []),\n",
|
|
" timeLeft = '',\n",
|
|
" timeSpend = '';\n",
|
|
"\n",
|
|
" if (click || !self.clickMode) {\n",
|
|
" $('#' + id + ' .catboost-panel__serie_' + type + '_value[data-index=' + trace._params.indexOfSet + ']', self.layout)\n",
|
|
" .html(self.formatItemValue(value, index, type + ' '));\n",
|
|
" $('#' + id + ' .catboost-panel__serie_iteration', self.layout).html(index);\n",
|
|
"\n",
|
|
" if (self.timeLeft[path] && self.timeLeft[path][data.length - 1]) {\n",
|
|
" timeLeft = self.timeLeft[path][data.length - 1][0];\n",
|
|
" }\n",
|
|
" $('#' + id + ' .catboost-panel__serie_time_left', self.layout).html(timeLeft ? ('~' + self.convertTime(timeLeft)) : '');\n",
|
|
"\n",
|
|
" if (self.timeLeft[path] && self.timeLeft[path][index]) {\n",
|
|
" timeSpend = self.timeLeft[path][index][1];\n",
|
|
" }\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_time_spend', self.layout).html(self.convertTime(timeSpend));\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_iteration', self.layout).html(bestValue.index > -1 ? bestValue.index : '');\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_test_value[data-index=' + trace._params.indexOfSet + ']', self.layout)\n",
|
|
" .html(self.formatItemValue(bestValue.best, bestValue.index, 'best ' + trace._params.nameOfSet + ' '));\n",
|
|
" }\n",
|
|
" });\n",
|
|
" });\n",
|
|
"\n",
|
|
" if (this.hasCVMode) {\n",
|
|
" var testTrace = this.filterTracesEvery(hash.traces, this.getTraceDefParams({\n",
|
|
" type: 'test',\n",
|
|
" cv_avg: true\n",
|
|
" })),\n",
|
|
" bestValue = this.getBestValue(testTrace.length === 1 ? testTrace[0].y : []);\n",
|
|
"\n",
|
|
" $('#' + id + ' .catboost-panel__serie_best_iteration', this.layout).html(bestValue.index > -1 ? bestValue.index : '');\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (click) {\n",
|
|
" this.clickMode = true;\n",
|
|
"\n",
|
|
" $('#catboost-control2-clickmode' + this.index, this.layout)[0].checked = true;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.addTracesEvents = function() {\n",
|
|
" var self = this;\n",
|
|
"\n",
|
|
" $('.catboost-panel__serie_checkbox', this.layout).click(function() {\n",
|
|
" var name = $(this).data('seriename');\n",
|
|
"\n",
|
|
" self.layoutDisabled.traces[name] = !$(this)[0].checked;\n",
|
|
"\n",
|
|
" self.redrawActiveChart();\n",
|
|
" });\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.getNextColor = function(path, opacity) {\n",
|
|
" var color;\n",
|
|
"\n",
|
|
" if (this.colorsByPath[path]) {\n",
|
|
" color = this.colorsByPath[path];\n",
|
|
" } else {\n",
|
|
" color = this.colors[this.colorIndex];\n",
|
|
" this.colorsByPath[path] = color;\n",
|
|
"\n",
|
|
" this.colorIndex++;\n",
|
|
"\n",
|
|
" if (this.colorIndex > this.colors.length - 1) {\n",
|
|
" this.colorIndex = 0;\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" return this.hexToRgba(color, opacity);\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.hexToRgba = function(value, opacity) {\n",
|
|
" if (value.length < 6) {\n",
|
|
" var pattern = /^#?([a-f\\d])([a-f\\d])([a-f\\d])/i;\n",
|
|
" value = value.replace(pattern, function(m, r, g, b) {\n",
|
|
" return '#' + r + r + g + g + b + b;\n",
|
|
" });\n",
|
|
" }\n",
|
|
"\n",
|
|
" var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})/i.exec(value);\n",
|
|
" var rgb = {\n",
|
|
" r: parseInt(result[1], 16),\n",
|
|
" g: parseInt(result[2], 16),\n",
|
|
" b: parseInt(result[3], 16)\n",
|
|
" };\n",
|
|
"\n",
|
|
" return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + opacity + ')';\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.convertTime = function(time) {\n",
|
|
" if (!time) {\n",
|
|
" return '0s';\n",
|
|
" }\n",
|
|
"\n",
|
|
" time = Math.floor(time * 1000);\n",
|
|
"\n",
|
|
" var millis = time % 1000;\n",
|
|
" time = parseInt(time / 1000, 10);\n",
|
|
" var seconds = time % 60;\n",
|
|
" time = parseInt(time / 60, 10);\n",
|
|
" var minutes = time % 60;\n",
|
|
" time = parseInt(time / 60, 10);\n",
|
|
" var hours = time % 24;\n",
|
|
" var out = \"\";\n",
|
|
" if (hours && hours > 0) {\n",
|
|
" out += hours + 'h ';\n",
|
|
" seconds = 0;\n",
|
|
" millis = 0;\n",
|
|
" }\n",
|
|
" if (minutes && minutes > 0) {\n",
|
|
" out += minutes + 'm ';\n",
|
|
" millis = 0;\n",
|
|
" }\n",
|
|
" if (seconds && seconds > 0) {\n",
|
|
" out += seconds + 's ';\n",
|
|
" }\n",
|
|
" if (millis && millis > 0) {\n",
|
|
" out += millis + 'ms';\n",
|
|
" }\n",
|
|
"\n",
|
|
" return out.trim();\n",
|
|
"};\n",
|
|
"\n",
|
|
"CatboostIpython.prototype.mean = function(values, valueof) {\n",
|
|
" var n = values.length,\n",
|
|
" m = n,\n",
|
|
" i = -1,\n",
|
|
" value,\n",
|
|
" sum = 0,\n",
|
|
" number = function(x) {\n",
|
|
" return x === null ? NaN : +x;\n",
|
|
" };\n",
|
|
"\n",
|
|
" if (valueof === null) {\n",
|
|
" while (++i < n) {\n",
|
|
" if (!isNaN(value = number(values[i]))) {\n",
|
|
" sum += value;\n",
|
|
" } else {\n",
|
|
" --m;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" } else {\n",
|
|
" while (++i < n) {\n",
|
|
" if (!isNaN(value = number(valueof(values[i], i, values)))) {\n",
|
|
" sum += value;\n",
|
|
" } else {\n",
|
|
" --m;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (m) {\n",
|
|
" return sum / m;\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"// from TensorBoard\n",
|
|
"CatboostIpython.prototype.smooth = function(data, weight) {\n",
|
|
" // When increasing the smoothing window, it smoothes a lot with the first\n",
|
|
" // few points and then starts to gradually smooth slower, so using an\n",
|
|
" // exponential function makes the slider more consistent. 1000^x has a\n",
|
|
" // range of [1, 1000], so subtracting 1 and dividing by 999 results in a\n",
|
|
" // range of [0, 1], which can be used as the percentage of the data, so\n",
|
|
" // that the kernel size can be specified as a percentage instead of a\n",
|
|
" // hardcoded number, what would be bad with multiple series.\n",
|
|
" var factor = (Math.pow(1000, weight) - 1) / 999,\n",
|
|
" kernelRadius = Math.floor(data.length * factor / 2),\n",
|
|
" res = [],\n",
|
|
" self = this;\n",
|
|
"\n",
|
|
" data.forEach(function (d, i) {\n",
|
|
" var actualKernelRadius = Math.min(kernelRadius, i, data.length - i - 1);\n",
|
|
" var start = i - actualKernelRadius;\n",
|
|
" var end = i + actualKernelRadius + 1;\n",
|
|
" var point = d;\n",
|
|
" // Only smooth finite numbers.\n",
|
|
" if (!isFinite(point)) {\n",
|
|
" res.push(point);\n",
|
|
" } else {\n",
|
|
" res.push(self.mean(data.slice(start, end).filter(function(d) {\n",
|
|
" return isFinite(d);\n",
|
|
" }), null));\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" return res;\n",
|
|
"};\n",
|
|
"var debug = false;\n",
|
|
"\n",
|
|
"if (debug) {\n",
|
|
" require.config({\n",
|
|
" shim:{\n",
|
|
" \"custom/CatboostIpythonPlotly\":{\n",
|
|
" deps:[\"custom/plotly-basic.min\"]\n",
|
|
" }\n",
|
|
" }\n",
|
|
" })\n",
|
|
"\n",
|
|
" require.undef('catboost_module');\n",
|
|
" require.undef('custom/CatboostIpythonPlotly');\n",
|
|
"}\n",
|
|
"\n",
|
|
"var moduleBase = '@jupyter-widgets/base';\n",
|
|
"var modules = [moduleBase];\n",
|
|
"\n",
|
|
"if (debug) {\n",
|
|
" modules.push('custom/CatboostIpythonPlotly');\n",
|
|
"}\n",
|
|
"\n",
|
|
"define('catboost_module', modules, function(widgets) {\n",
|
|
" var getInstance = function(el) {\n",
|
|
" var id = $(el).attr('catboost-id');\n",
|
|
"\n",
|
|
" if (!id) {\n",
|
|
" return null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" id = id.replace('catboost_', '');\n",
|
|
"\n",
|
|
" if (!window.catboostIpythonInstances[id]) {\n",
|
|
" return null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" return window.catboostIpythonInstances[id];\n",
|
|
" },\n",
|
|
" addInstance = function(el) {\n",
|
|
" $(el).attr('catboost-id', 'catboost_' + window.catboostIpythonIndex);\n",
|
|
"\n",
|
|
" var catboostIpython = new CatboostIpython();\n",
|
|
" catboostIpython.index = window.catboostIpythonIndex;\n",
|
|
" catboostIpython.plotly = window.Plotly;\n",
|
|
" if (debug) {\n",
|
|
" catboostIpython.loadStyles('/custom/CatboostIpython.css', function(){catboostIpython.resizeCharts();})\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.catboostIpythonInstances[window.catboostIpythonIndex] = catboostIpython;\n",
|
|
"\n",
|
|
" window.catboostIpythonIndex++;\n",
|
|
"\n",
|
|
" return catboostIpython;\n",
|
|
" };\n",
|
|
"\n",
|
|
" var CatboostIpythonWidget = widgets.DOMWidgetView.extend({\n",
|
|
"\n",
|
|
" initialize: function() {\n",
|
|
" CatboostIpythonWidget.__super__.initialize.apply(this, arguments);\n",
|
|
"\n",
|
|
" if (!window.catboostIpythonInstances) {\n",
|
|
" window.catboostIpythonInstances = {};\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (typeof window.catboostIpythonIndex === 'undefined') {\n",
|
|
" window.catboostIpythonIndex = 0;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var catboostIpythonInstance = getInstance(this.el);\n",
|
|
"\n",
|
|
" if (!catboostIpythonInstance) {\n",
|
|
" catboostIpythonInstance = addInstance(this.el);\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpythonInstance.init();\n",
|
|
" },\n",
|
|
"\n",
|
|
" render: function() {\n",
|
|
" this.value_changed();\n",
|
|
" this.model.on('change:value', this.value_changed, this);\n",
|
|
" },\n",
|
|
"\n",
|
|
" update: function() {\n",
|
|
" this.value_changed();\n",
|
|
" },\n",
|
|
"\n",
|
|
" value_changed: function() {\n",
|
|
" this.el.style['width'] = this.model.get('width');\n",
|
|
" this.el.style['height'] = this.model.get('height');\n",
|
|
" this.displayed.then(_.bind(this.render_charts, this));\n",
|
|
" },\n",
|
|
"\n",
|
|
" process_all: function(parent, params) {\n",
|
|
" var data = params.data;\n",
|
|
"\n",
|
|
" for (var path in data) {\n",
|
|
" if (data.hasOwnProperty(path)) {\n",
|
|
" this.process_row(parent, data[path])\n",
|
|
" }\n",
|
|
" }\n",
|
|
" },\n",
|
|
"\n",
|
|
" process_row: function(parent, data) {\n",
|
|
" var catboostIpython = getInstance(parent),\n",
|
|
" path = data.path,\n",
|
|
" content = data.content,\n",
|
|
" items = content.data.iterations,\n",
|
|
" firstIndex = 0,\n",
|
|
" chunks = [];\n",
|
|
"\n",
|
|
" if (!items || !items.length) {\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (!catboostIpython.lastIndex) {\n",
|
|
" catboostIpython.lastIndex = {}\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (catboostIpython.lastIndex[path]) {\n",
|
|
" firstIndex = catboostIpython.lastIndex[path] + 1;\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpython.lastIndex[path] = items.length - 1;\n",
|
|
"\n",
|
|
" for (var i = firstIndex; i < items.length; i++) {\n",
|
|
" chunks.push(items[i]);\n",
|
|
" }\n",
|
|
"\n",
|
|
" catboostIpython.addMeta(data.path, content.data.meta);\n",
|
|
"\n",
|
|
" catboostIpython.addPoints(parent, {\n",
|
|
" chunks: chunks,\n",
|
|
" train: data.name,\n",
|
|
" path: data.path\n",
|
|
" });\n",
|
|
" },\n",
|
|
"\n",
|
|
" render_charts: function () {\n",
|
|
" this.process_all(this.el, {\n",
|
|
" data: this.model.get('data')\n",
|
|
" });\n",
|
|
"\n",
|
|
" return this;\n",
|
|
" }\n",
|
|
" });\n",
|
|
"\n",
|
|
" return {\n",
|
|
" CatboostIpythonWidgetView: CatboostIpythonWidget\n",
|
|
" };\n",
|
|
"});\n",
|
|
"\n",
|
|
" </script>\n",
|
|
" "
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "fa2ac234b74d427683180a6275cbc5a2",
|
|
"version_minor": 0,
|
|
"version_major": 2
|
|
},
|
|
"text/plain": [
|
|
"MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0:\tlearn: 0.6877197\ttest: 0.6885466\tbest: 0.6885466 (0)\n",
|
|
"1:\tlearn: 0.6836672\ttest: 0.6858547\tbest: 0.6858547 (1)\n",
|
|
"2:\tlearn: 0.6796547\ttest: 0.6826562\tbest: 0.6826562 (2)\n",
|
|
"3:\tlearn: 0.6756115\ttest: 0.6798279\tbest: 0.6798279 (3)\n",
|
|
"4:\tlearn: 0.6707369\ttest: 0.6754915\tbest: 0.6754915 (4)\n",
|
|
"5:\tlearn: 0.6660944\ttest: 0.6711549\tbest: 0.6711549 (5)\n",
|
|
"6:\tlearn: 0.6608529\ttest: 0.6667357\tbest: 0.6667357 (6)\n",
|
|
"7:\tlearn: 0.6568277\ttest: 0.6632553\tbest: 0.6632553 (7)\n",
|
|
"8:\tlearn: 0.6531329\ttest: 0.6603302\tbest: 0.6603302 (8)\n",
|
|
"9:\tlearn: 0.6503118\ttest: 0.6575187\tbest: 0.6575187 (9)\n",
|
|
"10:\tlearn: 0.6469771\ttest: 0.6550033\tbest: 0.6550033 (10)\n",
|
|
"11:\tlearn: 0.6434668\ttest: 0.6516829\tbest: 0.6516829 (11)\n",
|
|
"12:\tlearn: 0.6390280\ttest: 0.6484890\tbest: 0.6484890 (12)\n",
|
|
"13:\tlearn: 0.6363431\ttest: 0.6463419\tbest: 0.6463419 (13)\n",
|
|
"14:\tlearn: 0.6327999\ttest: 0.6436173\tbest: 0.6436173 (14)\n",
|
|
"15:\tlearn: 0.6294015\ttest: 0.6410232\tbest: 0.6410232 (15)\n",
|
|
"16:\tlearn: 0.6264663\ttest: 0.6383857\tbest: 0.6383857 (16)\n",
|
|
"17:\tlearn: 0.6228427\ttest: 0.6356767\tbest: 0.6356767 (17)\n",
|
|
"18:\tlearn: 0.6198057\ttest: 0.6335408\tbest: 0.6335408 (18)\n",
|
|
"19:\tlearn: 0.6175464\ttest: 0.6320648\tbest: 0.6320648 (19)\n",
|
|
"20:\tlearn: 0.6142396\ttest: 0.6292900\tbest: 0.6292900 (20)\n",
|
|
"21:\tlearn: 0.6107115\ttest: 0.6269847\tbest: 0.6269847 (21)\n",
|
|
"22:\tlearn: 0.6085432\ttest: 0.6252062\tbest: 0.6252062 (22)\n",
|
|
"23:\tlearn: 0.6056793\ttest: 0.6230441\tbest: 0.6230441 (23)\n",
|
|
"24:\tlearn: 0.6028690\ttest: 0.6211310\tbest: 0.6211310 (24)\n",
|
|
"25:\tlearn: 0.5998036\ttest: 0.6192732\tbest: 0.6192732 (25)\n",
|
|
"26:\tlearn: 0.5974414\ttest: 0.6170143\tbest: 0.6170143 (26)\n",
|
|
"27:\tlearn: 0.5949423\ttest: 0.6152453\tbest: 0.6152453 (27)\n",
|
|
"28:\tlearn: 0.5931837\ttest: 0.6137905\tbest: 0.6137905 (28)\n",
|
|
"29:\tlearn: 0.5909980\ttest: 0.6124972\tbest: 0.6124972 (29)\n",
|
|
"30:\tlearn: 0.5881447\ttest: 0.6103947\tbest: 0.6103947 (30)\n",
|
|
"31:\tlearn: 0.5850531\ttest: 0.6082700\tbest: 0.6082700 (31)\n",
|
|
"32:\tlearn: 0.5832203\ttest: 0.6069972\tbest: 0.6069972 (32)\n",
|
|
"33:\tlearn: 0.5812565\ttest: 0.6054007\tbest: 0.6054007 (33)\n",
|
|
"34:\tlearn: 0.5793586\ttest: 0.6038550\tbest: 0.6038550 (34)\n",
|
|
"35:\tlearn: 0.5772313\ttest: 0.6024892\tbest: 0.6024892 (35)\n",
|
|
"36:\tlearn: 0.5750288\ttest: 0.6008509\tbest: 0.6008509 (36)\n",
|
|
"37:\tlearn: 0.5721054\ttest: 0.5987623\tbest: 0.5987623 (37)\n",
|
|
"38:\tlearn: 0.5694708\ttest: 0.5970836\tbest: 0.5970836 (38)\n",
|
|
"39:\tlearn: 0.5674700\ttest: 0.5958722\tbest: 0.5958722 (39)\n",
|
|
"40:\tlearn: 0.5655543\ttest: 0.5946933\tbest: 0.5946933 (40)\n",
|
|
"41:\tlearn: 0.5632377\ttest: 0.5931824\tbest: 0.5931824 (41)\n",
|
|
"42:\tlearn: 0.5616371\ttest: 0.5921679\tbest: 0.5921679 (42)\n",
|
|
"43:\tlearn: 0.5600772\ttest: 0.5914594\tbest: 0.5914594 (43)\n",
|
|
"44:\tlearn: 0.5584745\ttest: 0.5905927\tbest: 0.5905927 (44)\n",
|
|
"45:\tlearn: 0.5563122\ttest: 0.5894839\tbest: 0.5894839 (45)\n",
|
|
"46:\tlearn: 0.5547580\ttest: 0.5882711\tbest: 0.5882711 (46)\n",
|
|
"47:\tlearn: 0.5521049\ttest: 0.5867363\tbest: 0.5867363 (47)\n",
|
|
"48:\tlearn: 0.5504749\ttest: 0.5858224\tbest: 0.5858224 (48)\n",
|
|
"49:\tlearn: 0.5489392\ttest: 0.5848565\tbest: 0.5848565 (49)\n",
|
|
"50:\tlearn: 0.5467439\ttest: 0.5837286\tbest: 0.5837286 (50)\n",
|
|
"51:\tlearn: 0.5449240\ttest: 0.5827712\tbest: 0.5827712 (51)\n",
|
|
"52:\tlearn: 0.5433563\ttest: 0.5816790\tbest: 0.5816790 (52)\n",
|
|
"53:\tlearn: 0.5414918\ttest: 0.5803961\tbest: 0.5803961 (53)\n",
|
|
"54:\tlearn: 0.5397823\ttest: 0.5791585\tbest: 0.5791585 (54)\n",
|
|
"55:\tlearn: 0.5380373\ttest: 0.5784374\tbest: 0.5784374 (55)\n",
|
|
"56:\tlearn: 0.5367799\ttest: 0.5776324\tbest: 0.5776324 (56)\n",
|
|
"57:\tlearn: 0.5356730\ttest: 0.5770091\tbest: 0.5770091 (57)\n",
|
|
"58:\tlearn: 0.5342852\ttest: 0.5759622\tbest: 0.5759622 (58)\n",
|
|
"59:\tlearn: 0.5328933\ttest: 0.5754297\tbest: 0.5754297 (59)\n",
|
|
"60:\tlearn: 0.5313088\ttest: 0.5743831\tbest: 0.5743831 (60)\n",
|
|
"61:\tlearn: 0.5299429\ttest: 0.5733913\tbest: 0.5733913 (61)\n",
|
|
"62:\tlearn: 0.5288679\ttest: 0.5726648\tbest: 0.5726648 (62)\n",
|
|
"63:\tlearn: 0.5279962\ttest: 0.5721482\tbest: 0.5721482 (63)\n",
|
|
"64:\tlearn: 0.5265374\ttest: 0.5710547\tbest: 0.5710547 (64)\n",
|
|
"65:\tlearn: 0.5252634\ttest: 0.5704123\tbest: 0.5704123 (65)\n",
|
|
"66:\tlearn: 0.5237023\ttest: 0.5697888\tbest: 0.5697888 (66)\n",
|
|
"67:\tlearn: 0.5225214\ttest: 0.5688265\tbest: 0.5688265 (67)\n",
|
|
"68:\tlearn: 0.5207554\ttest: 0.5679610\tbest: 0.5679610 (68)\n",
|
|
"69:\tlearn: 0.5198841\ttest: 0.5674214\tbest: 0.5674214 (69)\n",
|
|
"70:\tlearn: 0.5181825\ttest: 0.5667020\tbest: 0.5667020 (70)\n",
|
|
"71:\tlearn: 0.5167355\ttest: 0.5660841\tbest: 0.5660841 (71)\n",
|
|
"72:\tlearn: 0.5156721\ttest: 0.5658032\tbest: 0.5658032 (72)\n",
|
|
"73:\tlearn: 0.5144230\ttest: 0.5650474\tbest: 0.5650474 (73)\n",
|
|
"74:\tlearn: 0.5128928\ttest: 0.5642931\tbest: 0.5642931 (74)\n",
|
|
"75:\tlearn: 0.5118802\ttest: 0.5637275\tbest: 0.5637275 (75)\n",
|
|
"76:\tlearn: 0.5107085\ttest: 0.5631711\tbest: 0.5631711 (76)\n",
|
|
"77:\tlearn: 0.5094599\ttest: 0.5622925\tbest: 0.5622925 (77)\n",
|
|
"78:\tlearn: 0.5081495\ttest: 0.5616308\tbest: 0.5616308 (78)\n",
|
|
"79:\tlearn: 0.5071159\ttest: 0.5609401\tbest: 0.5609401 (79)\n",
|
|
"80:\tlearn: 0.5059730\ttest: 0.5604205\tbest: 0.5604205 (80)\n",
|
|
"81:\tlearn: 0.5052745\ttest: 0.5599553\tbest: 0.5599553 (81)\n",
|
|
"82:\tlearn: 0.5041053\ttest: 0.5594317\tbest: 0.5594317 (82)\n",
|
|
"83:\tlearn: 0.5034340\ttest: 0.5589824\tbest: 0.5589824 (83)\n",
|
|
"84:\tlearn: 0.5023373\ttest: 0.5586747\tbest: 0.5586747 (84)\n",
|
|
"85:\tlearn: 0.5012692\ttest: 0.5578499\tbest: 0.5578499 (85)\n",
|
|
"86:\tlearn: 0.5000019\ttest: 0.5573946\tbest: 0.5573946 (86)\n",
|
|
"87:\tlearn: 0.4989998\ttest: 0.5569096\tbest: 0.5569096 (87)\n",
|
|
"88:\tlearn: 0.4980005\ttest: 0.5563638\tbest: 0.5563638 (88)\n",
|
|
"89:\tlearn: 0.4969992\ttest: 0.5560321\tbest: 0.5560321 (89)\n",
|
|
"90:\tlearn: 0.4958554\ttest: 0.5555584\tbest: 0.5555584 (90)\n",
|
|
"91:\tlearn: 0.4950618\ttest: 0.5550772\tbest: 0.5550772 (91)\n",
|
|
"92:\tlearn: 0.4942663\ttest: 0.5548544\tbest: 0.5548544 (92)\n",
|
|
"93:\tlearn: 0.4930717\ttest: 0.5545086\tbest: 0.5545086 (93)\n",
|
|
"94:\tlearn: 0.4922124\ttest: 0.5543049\tbest: 0.5543049 (94)\n",
|
|
"95:\tlearn: 0.4911655\ttest: 0.5539354\tbest: 0.5539354 (95)\ttotal: 23.2s\tremaining: 3m 38s\n",
|
|
"96:\tlearn: 0.4898480\ttest: 0.5537432\tbest: 0.5537432 (96)\n",
|
|
"97:\tlearn: 0.4889808\ttest: 0.5533565\tbest: 0.5533565 (97)\n",
|
|
"98:\tlearn: 0.4881880\ttest: 0.5530615\tbest: 0.5530615 (98)\n",
|
|
"99:\tlearn: 0.4870238\ttest: 0.5526088\tbest: 0.5526088 (99)\n",
|
|
"100:\tlearn: 0.4859828\ttest: 0.5521305\tbest: 0.5521305 (100)\n",
|
|
"101:\tlearn: 0.4851498\ttest: 0.5519052\tbest: 0.5519052 (101)\n",
|
|
"102:\tlearn: 0.4841061\ttest: 0.5516408\tbest: 0.5516408 (102)\n",
|
|
"103:\tlearn: 0.4831666\ttest: 0.5513926\tbest: 0.5513926 (103)\n",
|
|
"104:\tlearn: 0.4821639\ttest: 0.5511151\tbest: 0.5511151 (104)\n",
|
|
"105:\tlearn: 0.4814207\ttest: 0.5508670\tbest: 0.5508670 (105)\n",
|
|
"106:\tlearn: 0.4807555\ttest: 0.5506870\tbest: 0.5506870 (106)\n",
|
|
"107:\tlearn: 0.4794091\ttest: 0.5502383\tbest: 0.5502383 (107)\n",
|
|
"108:\tlearn: 0.4787981\ttest: 0.5501583\tbest: 0.5501583 (108)\n",
|
|
"109:\tlearn: 0.4777249\ttest: 0.5500017\tbest: 0.5500017 (109)\n",
|
|
"110:\tlearn: 0.4769395\ttest: 0.5497681\tbest: 0.5497681 (110)\n",
|
|
"111:\tlearn: 0.4760702\ttest: 0.5495200\tbest: 0.5495200 (111)\n",
|
|
"112:\tlearn: 0.4752262\ttest: 0.5492673\tbest: 0.5492673 (112)\n",
|
|
"113:\tlearn: 0.4742682\ttest: 0.5489332\tbest: 0.5489332 (113)\n",
|
|
"114:\tlearn: 0.4735493\ttest: 0.5487081\tbest: 0.5487081 (114)\n",
|
|
"115:\tlearn: 0.4725229\ttest: 0.5485845\tbest: 0.5485845 (115)\n",
|
|
"116:\tlearn: 0.4717511\ttest: 0.5484130\tbest: 0.5484130 (116)\n",
|
|
"117:\tlearn: 0.4710454\ttest: 0.5480310\tbest: 0.5480310 (117)\n",
|
|
"118:\tlearn: 0.4702993\ttest: 0.5477570\tbest: 0.5477570 (118)\n",
|
|
"119:\tlearn: 0.4696658\ttest: 0.5476111\tbest: 0.5476111 (119)\n",
|
|
"120:\tlearn: 0.4690322\ttest: 0.5473046\tbest: 0.5473046 (120)\n",
|
|
"121:\tlearn: 0.4682353\ttest: 0.5468722\tbest: 0.5468722 (121)\n",
|
|
"122:\tlearn: 0.4676127\ttest: 0.5466972\tbest: 0.5466972 (122)\n",
|
|
"123:\tlearn: 0.4669183\ttest: 0.5465722\tbest: 0.5465722 (123)\n",
|
|
"124:\tlearn: 0.4660278\ttest: 0.5462931\tbest: 0.5462931 (124)\n",
|
|
"125:\tlearn: 0.4649703\ttest: 0.5460824\tbest: 0.5460824 (125)\n",
|
|
"126:\tlearn: 0.4639320\ttest: 0.5456575\tbest: 0.5456575 (126)\n",
|
|
"127:\tlearn: 0.4633010\ttest: 0.5454177\tbest: 0.5454177 (127)\n",
|
|
"128:\tlearn: 0.4625821\ttest: 0.5450320\tbest: 0.5450320 (128)\n",
|
|
"129:\tlearn: 0.4618753\ttest: 0.5448670\tbest: 0.5448670 (129)\n",
|
|
"130:\tlearn: 0.4613120\ttest: 0.5447562\tbest: 0.5447562 (130)\n",
|
|
"131:\tlearn: 0.4604346\ttest: 0.5445891\tbest: 0.5445891 (131)\n",
|
|
"132:\tlearn: 0.4596448\ttest: 0.5447121\tbest: 0.5445891 (131)\n",
|
|
"133:\tlearn: 0.4591132\ttest: 0.5443576\tbest: 0.5443576 (133)\n",
|
|
"134:\tlearn: 0.4584241\ttest: 0.5439928\tbest: 0.5439928 (134)\n",
|
|
"135:\tlearn: 0.4579918\ttest: 0.5438673\tbest: 0.5438673 (135)\n",
|
|
"136:\tlearn: 0.4572785\ttest: 0.5438445\tbest: 0.5438445 (136)\n",
|
|
"137:\tlearn: 0.4564051\ttest: 0.5438128\tbest: 0.5438128 (137)\n",
|
|
"138:\tlearn: 0.4557893\ttest: 0.5435681\tbest: 0.5435681 (138)\n",
|
|
"139:\tlearn: 0.4549755\ttest: 0.5432263\tbest: 0.5432263 (139)\n",
|
|
"140:\tlearn: 0.4544473\ttest: 0.5429272\tbest: 0.5429272 (140)\n",
|
|
"141:\tlearn: 0.4537677\ttest: 0.5429014\tbest: 0.5429014 (141)\n",
|
|
"142:\tlearn: 0.4532359\ttest: 0.5427797\tbest: 0.5427797 (142)\n",
|
|
"143:\tlearn: 0.4527598\ttest: 0.5426041\tbest: 0.5426041 (143)\n",
|
|
"144:\tlearn: 0.4520686\ttest: 0.5425521\tbest: 0.5425521 (144)\n",
|
|
"145:\tlearn: 0.4516502\ttest: 0.5423420\tbest: 0.5423420 (145)\n",
|
|
"146:\tlearn: 0.4509125\ttest: 0.5424737\tbest: 0.5423420 (145)\n",
|
|
"147:\tlearn: 0.4503471\ttest: 0.5424536\tbest: 0.5423420 (145)\n",
|
|
"148:\tlearn: 0.4497010\ttest: 0.5422587\tbest: 0.5422587 (148)\n",
|
|
"149:\tlearn: 0.4489322\ttest: 0.5420405\tbest: 0.5420405 (149)\n",
|
|
"150:\tlearn: 0.4482209\ttest: 0.5419704\tbest: 0.5419704 (150)\n",
|
|
"151:\tlearn: 0.4475782\ttest: 0.5418203\tbest: 0.5418203 (151)\n",
|
|
"152:\tlearn: 0.4470811\ttest: 0.5417953\tbest: 0.5417953 (152)\n",
|
|
"153:\tlearn: 0.4464769\ttest: 0.5416922\tbest: 0.5416922 (153)\n",
|
|
"154:\tlearn: 0.4457522\ttest: 0.5415206\tbest: 0.5415206 (154)\n",
|
|
"155:\tlearn: 0.4450265\ttest: 0.5414437\tbest: 0.5414437 (155)\n",
|
|
"156:\tlearn: 0.4443888\ttest: 0.5412343\tbest: 0.5412343 (156)\n",
|
|
"157:\tlearn: 0.4439134\ttest: 0.5410983\tbest: 0.5410983 (157)\n",
|
|
"158:\tlearn: 0.4433370\ttest: 0.5410338\tbest: 0.5410338 (158)\n",
|
|
"159:\tlearn: 0.4428908\ttest: 0.5407926\tbest: 0.5407926 (159)\n",
|
|
"160:\tlearn: 0.4423160\ttest: 0.5407991\tbest: 0.5407926 (159)\n",
|
|
"161:\tlearn: 0.4418092\ttest: 0.5407116\tbest: 0.5407116 (161)\n",
|
|
"162:\tlearn: 0.4413354\ttest: 0.5407258\tbest: 0.5407116 (161)\n",
|
|
"163:\tlearn: 0.4407442\ttest: 0.5407668\tbest: 0.5407116 (161)\n",
|
|
"164:\tlearn: 0.4403015\ttest: 0.5406522\tbest: 0.5406522 (164)\n",
|
|
"165:\tlearn: 0.4396910\ttest: 0.5402056\tbest: 0.5402056 (165)\n",
|
|
"166:\tlearn: 0.4391275\ttest: 0.5400219\tbest: 0.5400219 (166)\n",
|
|
"167:\tlearn: 0.4387731\ttest: 0.5397573\tbest: 0.5397573 (167)\n",
|
|
"168:\tlearn: 0.4383288\ttest: 0.5395765\tbest: 0.5395765 (168)\n",
|
|
"169:\tlearn: 0.4378835\ttest: 0.5394286\tbest: 0.5394286 (169)\n",
|
|
"170:\tlearn: 0.4374030\ttest: 0.5391547\tbest: 0.5391547 (170)\n",
|
|
"171:\tlearn: 0.4368741\ttest: 0.5389298\tbest: 0.5389298 (171)\n",
|
|
"172:\tlearn: 0.4363514\ttest: 0.5387904\tbest: 0.5387904 (172)\n",
|
|
"173:\tlearn: 0.4357184\ttest: 0.5389165\tbest: 0.5387904 (172)\n",
|
|
"174:\tlearn: 0.4352061\ttest: 0.5387511\tbest: 0.5387511 (174)\n",
|
|
"175:\tlearn: 0.4347146\ttest: 0.5386338\tbest: 0.5386338 (175)\n",
|
|
"176:\tlearn: 0.4342253\ttest: 0.5384986\tbest: 0.5384986 (176)\n",
|
|
"177:\tlearn: 0.4336573\ttest: 0.5385371\tbest: 0.5384986 (176)\n",
|
|
"178:\tlearn: 0.4333329\ttest: 0.5383834\tbest: 0.5383834 (178)\n",
|
|
"179:\tlearn: 0.4330193\ttest: 0.5381801\tbest: 0.5381801 (179)\n",
|
|
"180:\tlearn: 0.4325348\ttest: 0.5382014\tbest: 0.5381801 (179)\n",
|
|
"181:\tlearn: 0.4318676\ttest: 0.5379952\tbest: 0.5379952 (181)\n",
|
|
"182:\tlearn: 0.4313635\ttest: 0.5378103\tbest: 0.5378103 (182)\n",
|
|
"183:\tlearn: 0.4310561\ttest: 0.5377548\tbest: 0.5377548 (183)\n",
|
|
"184:\tlearn: 0.4304766\ttest: 0.5376085\tbest: 0.5376085 (184)\n",
|
|
"185:\tlearn: 0.4296235\ttest: 0.5375008\tbest: 0.5375008 (185)\n",
|
|
"186:\tlearn: 0.4288616\ttest: 0.5371790\tbest: 0.5371790 (186)\n",
|
|
"187:\tlearn: 0.4283431\ttest: 0.5370328\tbest: 0.5370328 (187)\n",
|
|
"188:\tlearn: 0.4276905\ttest: 0.5368726\tbest: 0.5368726 (188)\n",
|
|
"189:\tlearn: 0.4272135\ttest: 0.5367566\tbest: 0.5367566 (189)\n",
|
|
"190:\tlearn: 0.4267405\ttest: 0.5367266\tbest: 0.5367266 (190)\n",
|
|
"191:\tlearn: 0.4264255\ttest: 0.5366929\tbest: 0.5366929 (191)\n",
|
|
"192:\tlearn: 0.4259648\ttest: 0.5365129\tbest: 0.5365129 (192)\n",
|
|
"193:\tlearn: 0.4252151\ttest: 0.5363472\tbest: 0.5363472 (193)\n",
|
|
"194:\tlearn: 0.4247579\ttest: 0.5362298\tbest: 0.5362298 (194)\n",
|
|
"195:\tlearn: 0.4241940\ttest: 0.5363814\tbest: 0.5362298 (194)\n",
|
|
"196:\tlearn: 0.4236228\ttest: 0.5362529\tbest: 0.5362298 (194)\n",
|
|
"197:\tlearn: 0.4230981\ttest: 0.5360651\tbest: 0.5360651 (197)\n",
|
|
"198:\tlearn: 0.4227175\ttest: 0.5358738\tbest: 0.5358738 (198)\n",
|
|
"199:\tlearn: 0.4223102\ttest: 0.5356970\tbest: 0.5356970 (199)\n",
|
|
"200:\tlearn: 0.4218792\ttest: 0.5356515\tbest: 0.5356515 (200)\n",
|
|
"201:\tlearn: 0.4212463\ttest: 0.5354472\tbest: 0.5354472 (201)\n",
|
|
"202:\tlearn: 0.4208336\ttest: 0.5354719\tbest: 0.5354472 (201)\n",
|
|
"203:\tlearn: 0.4203585\ttest: 0.5353732\tbest: 0.5353732 (203)\n",
|
|
"204:\tlearn: 0.4200707\ttest: 0.5352456\tbest: 0.5352456 (204)\n",
|
|
"205:\tlearn: 0.4196117\ttest: 0.5351874\tbest: 0.5351874 (205)\n",
|
|
"206:\tlearn: 0.4192225\ttest: 0.5349686\tbest: 0.5349686 (206)\n",
|
|
"207:\tlearn: 0.4185816\ttest: 0.5348164\tbest: 0.5348164 (207)\n",
|
|
"208:\tlearn: 0.4180515\ttest: 0.5347886\tbest: 0.5347886 (208)\n",
|
|
"209:\tlearn: 0.4176907\ttest: 0.5346718\tbest: 0.5346718 (209)\n",
|
|
"210:\tlearn: 0.4174534\ttest: 0.5345771\tbest: 0.5345771 (210)\n",
|
|
"211:\tlearn: 0.4171044\ttest: 0.5343937\tbest: 0.5343937 (211)\n",
|
|
"212:\tlearn: 0.4166735\ttest: 0.5342904\tbest: 0.5342904 (212)\n",
|
|
"213:\tlearn: 0.4159676\ttest: 0.5341139\tbest: 0.5341139 (213)\n",
|
|
"214:\tlearn: 0.4154720\ttest: 0.5340165\tbest: 0.5340165 (214)\n",
|
|
"215:\tlearn: 0.4149121\ttest: 0.5340137\tbest: 0.5340137 (215)\n",
|
|
"216:\tlearn: 0.4145081\ttest: 0.5340928\tbest: 0.5340137 (215)\n",
|
|
"217:\tlearn: 0.4140988\ttest: 0.5340254\tbest: 0.5340137 (215)\n",
|
|
"218:\tlearn: 0.4137002\ttest: 0.5339338\tbest: 0.5339338 (218)\n",
|
|
"219:\tlearn: 0.4131501\ttest: 0.5340060\tbest: 0.5339338 (218)\n",
|
|
"220:\tlearn: 0.4126826\ttest: 0.5338133\tbest: 0.5338133 (220)\n",
|
|
"221:\tlearn: 0.4123165\ttest: 0.5336593\tbest: 0.5336593 (221)\n",
|
|
"222:\tlearn: 0.4117336\ttest: 0.5336527\tbest: 0.5336527 (222)\n",
|
|
"223:\tlearn: 0.4114686\ttest: 0.5336017\tbest: 0.5336017 (223)\n",
|
|
"224:\tlearn: 0.4111180\ttest: 0.5335852\tbest: 0.5335852 (224)\n",
|
|
"225:\tlearn: 0.4106998\ttest: 0.5336429\tbest: 0.5335852 (224)\n",
|
|
"226:\tlearn: 0.4103579\ttest: 0.5335751\tbest: 0.5335751 (226)\n",
|
|
"227:\tlearn: 0.4098760\ttest: 0.5335229\tbest: 0.5335229 (227)\n",
|
|
"228:\tlearn: 0.4092234\ttest: 0.5333725\tbest: 0.5333725 (228)\n",
|
|
"229:\tlearn: 0.4090149\ttest: 0.5332050\tbest: 0.5332050 (229)\n",
|
|
"230:\tlearn: 0.4086078\ttest: 0.5331984\tbest: 0.5331984 (230)\n",
|
|
"231:\tlearn: 0.4081731\ttest: 0.5330830\tbest: 0.5330830 (231)\n",
|
|
"232:\tlearn: 0.4076482\ttest: 0.5332379\tbest: 0.5330830 (231)\n",
|
|
"233:\tlearn: 0.4070674\ttest: 0.5331639\tbest: 0.5330830 (231)\n",
|
|
"234:\tlearn: 0.4066269\ttest: 0.5331561\tbest: 0.5330830 (231)\n",
|
|
"235:\tlearn: 0.4060895\ttest: 0.5330108\tbest: 0.5330108 (235)\n",
|
|
"236:\tlearn: 0.4053159\ttest: 0.5329078\tbest: 0.5329078 (236)\n",
|
|
"237:\tlearn: 0.4049776\ttest: 0.5328166\tbest: 0.5328166 (237)\n",
|
|
"238:\tlearn: 0.4047148\ttest: 0.5327411\tbest: 0.5327411 (238)\n",
|
|
"239:\tlearn: 0.4041542\ttest: 0.5327483\tbest: 0.5327411 (238)\n",
|
|
"240:\tlearn: 0.4039031\ttest: 0.5327424\tbest: 0.5327411 (238)\n",
|
|
"241:\tlearn: 0.4035407\ttest: 0.5326519\tbest: 0.5326519 (241)\n",
|
|
"242:\tlearn: 0.4034560\ttest: 0.5326155\tbest: 0.5326155 (242)\n",
|
|
"243:\tlearn: 0.4031283\ttest: 0.5325177\tbest: 0.5325177 (243)\n",
|
|
"244:\tlearn: 0.4026545\ttest: 0.5325537\tbest: 0.5325177 (243)\n",
|
|
"245:\tlearn: 0.4023918\ttest: 0.5324731\tbest: 0.5324731 (245)\n",
|
|
"246:\tlearn: 0.4021289\ttest: 0.5326188\tbest: 0.5324731 (245)\n",
|
|
"247:\tlearn: 0.4016577\ttest: 0.5325191\tbest: 0.5324731 (245)\n",
|
|
"248:\tlearn: 0.4011903\ttest: 0.5324617\tbest: 0.5324617 (248)\n",
|
|
"249:\tlearn: 0.4007092\ttest: 0.5324075\tbest: 0.5324075 (249)\n",
|
|
"250:\tlearn: 0.4003918\ttest: 0.5324019\tbest: 0.5324019 (250)\n",
|
|
"251:\tlearn: 0.3999702\ttest: 0.5324191\tbest: 0.5324019 (250)\n",
|
|
"252:\tlearn: 0.3994438\ttest: 0.5323511\tbest: 0.5323511 (252)\n",
|
|
"253:\tlearn: 0.3990730\ttest: 0.5323397\tbest: 0.5323397 (253)\n",
|
|
"254:\tlearn: 0.3986060\ttest: 0.5324180\tbest: 0.5323397 (253)\n",
|
|
"255:\tlearn: 0.3981075\ttest: 0.5323545\tbest: 0.5323397 (253)\n",
|
|
"256:\tlearn: 0.3974164\ttest: 0.5324554\tbest: 0.5323397 (253)\n",
|
|
"257:\tlearn: 0.3970483\ttest: 0.5324663\tbest: 0.5323397 (253)\n",
|
|
"258:\tlearn: 0.3967019\ttest: 0.5325475\tbest: 0.5323397 (253)\n",
|
|
"259:\tlearn: 0.3962886\ttest: 0.5323902\tbest: 0.5323397 (253)\n",
|
|
"260:\tlearn: 0.3959535\ttest: 0.5323370\tbest: 0.5323370 (260)\n",
|
|
"261:\tlearn: 0.3956226\ttest: 0.5323220\tbest: 0.5323220 (261)\n",
|
|
"262:\tlearn: 0.3949221\ttest: 0.5321133\tbest: 0.5321133 (262)\n",
|
|
"263:\tlearn: 0.3945406\ttest: 0.5321072\tbest: 0.5321072 (263)\n",
|
|
"264:\tlearn: 0.3940459\ttest: 0.5320065\tbest: 0.5320065 (264)\n",
|
|
"265:\tlearn: 0.3935521\ttest: 0.5320330\tbest: 0.5320065 (264)\n",
|
|
"266:\tlearn: 0.3928761\ttest: 0.5321864\tbest: 0.5320065 (264)\n",
|
|
"267:\tlearn: 0.3925462\ttest: 0.5321389\tbest: 0.5320065 (264)\n",
|
|
"268:\tlearn: 0.3921446\ttest: 0.5322127\tbest: 0.5320065 (264)\n",
|
|
"269:\tlearn: 0.3917499\ttest: 0.5321270\tbest: 0.5320065 (264)\n",
|
|
"270:\tlearn: 0.3913153\ttest: 0.5323096\tbest: 0.5320065 (264)\n",
|
|
"271:\tlearn: 0.3908853\ttest: 0.5323084\tbest: 0.5320065 (264)\n",
|
|
"272:\tlearn: 0.3903031\ttest: 0.5321285\tbest: 0.5320065 (264)\n",
|
|
"273:\tlearn: 0.3899838\ttest: 0.5321755\tbest: 0.5320065 (264)\n",
|
|
"274:\tlearn: 0.3897379\ttest: 0.5322434\tbest: 0.5320065 (264)\n",
|
|
"275:\tlearn: 0.3894800\ttest: 0.5320361\tbest: 0.5320065 (264)\n",
|
|
"276:\tlearn: 0.3890963\ttest: 0.5320364\tbest: 0.5320065 (264)\n",
|
|
"277:\tlearn: 0.3886138\ttest: 0.5321033\tbest: 0.5320065 (264)\n",
|
|
"278:\tlearn: 0.3884419\ttest: 0.5320756\tbest: 0.5320065 (264)\n",
|
|
"279:\tlearn: 0.3881382\ttest: 0.5320827\tbest: 0.5320065 (264)\n",
|
|
"280:\tlearn: 0.3878373\ttest: 0.5317915\tbest: 0.5317915 (280)\n",
|
|
"281:\tlearn: 0.3874944\ttest: 0.5318840\tbest: 0.5317915 (280)\n",
|
|
"282:\tlearn: 0.3871332\ttest: 0.5318614\tbest: 0.5317915 (280)\n",
|
|
"283:\tlearn: 0.3867666\ttest: 0.5318461\tbest: 0.5317915 (280)\n",
|
|
"284:\tlearn: 0.3866026\ttest: 0.5316801\tbest: 0.5316801 (284)\n",
|
|
"285:\tlearn: 0.3862344\ttest: 0.5315518\tbest: 0.5315518 (285)\n",
|
|
"286:\tlearn: 0.3856933\ttest: 0.5314656\tbest: 0.5314656 (286)\n",
|
|
"287:\tlearn: 0.3854747\ttest: 0.5314112\tbest: 0.5314112 (287)\n",
|
|
"288:\tlearn: 0.3849624\ttest: 0.5313050\tbest: 0.5313050 (288)\n",
|
|
"289:\tlearn: 0.3846948\ttest: 0.5313134\tbest: 0.5313050 (288)\n",
|
|
"290:\tlearn: 0.3840997\ttest: 0.5312990\tbest: 0.5312990 (290)\n",
|
|
"291:\tlearn: 0.3837353\ttest: 0.5310137\tbest: 0.5310137 (291)\n",
|
|
"292:\tlearn: 0.3833147\ttest: 0.5310454\tbest: 0.5310137 (291)\n",
|
|
"293:\tlearn: 0.3829743\ttest: 0.5310983\tbest: 0.5310137 (291)\n",
|
|
"294:\tlearn: 0.3825970\ttest: 0.5312409\tbest: 0.5310137 (291)\n",
|
|
"295:\tlearn: 0.3822887\ttest: 0.5311553\tbest: 0.5310137 (291)\n",
|
|
"296:\tlearn: 0.3820268\ttest: 0.5312332\tbest: 0.5310137 (291)\n",
|
|
"297:\tlearn: 0.3814951\ttest: 0.5310265\tbest: 0.5310137 (291)\n",
|
|
"298:\tlearn: 0.3811953\ttest: 0.5309205\tbest: 0.5309205 (298)\n",
|
|
"299:\tlearn: 0.3809549\ttest: 0.5307896\tbest: 0.5307896 (299)\n",
|
|
"300:\tlearn: 0.3806699\ttest: 0.5308620\tbest: 0.5307896 (299)\n",
|
|
"301:\tlearn: 0.3802713\ttest: 0.5308726\tbest: 0.5307896 (299)\n",
|
|
"302:\tlearn: 0.3798812\ttest: 0.5307911\tbest: 0.5307896 (299)\n",
|
|
"303:\tlearn: 0.3794444\ttest: 0.5306897\tbest: 0.5306897 (303)\n",
|
|
"304:\tlearn: 0.3790552\ttest: 0.5307636\tbest: 0.5306897 (303)\n",
|
|
"305:\tlearn: 0.3786999\ttest: 0.5307043\tbest: 0.5306897 (303)\n",
|
|
"306:\tlearn: 0.3784263\ttest: 0.5306165\tbest: 0.5306165 (306)\n",
|
|
"307:\tlearn: 0.3780526\ttest: 0.5304295\tbest: 0.5304295 (307)\n",
|
|
"308:\tlearn: 0.3777825\ttest: 0.5304247\tbest: 0.5304247 (308)\n",
|
|
"309:\tlearn: 0.3774856\ttest: 0.5304606\tbest: 0.5304247 (308)\n",
|
|
"310:\tlearn: 0.3772154\ttest: 0.5302139\tbest: 0.5302139 (310)\n",
|
|
"311:\tlearn: 0.3769509\ttest: 0.5302176\tbest: 0.5302139 (310)\n",
|
|
"312:\tlearn: 0.3766204\ttest: 0.5300564\tbest: 0.5300564 (312)\n",
|
|
"313:\tlearn: 0.3762338\ttest: 0.5300547\tbest: 0.5300547 (313)\n",
|
|
"314:\tlearn: 0.3760338\ttest: 0.5300479\tbest: 0.5300479 (314)\n",
|
|
"315:\tlearn: 0.3757706\ttest: 0.5300301\tbest: 0.5300301 (315)\n",
|
|
"316:\tlearn: 0.3755534\ttest: 0.5300401\tbest: 0.5300301 (315)\n",
|
|
"317:\tlearn: 0.3752325\ttest: 0.5300833\tbest: 0.5300301 (315)\n",
|
|
"318:\tlearn: 0.3749602\ttest: 0.5301916\tbest: 0.5300301 (315)\n",
|
|
"319:\tlearn: 0.3747125\ttest: 0.5302111\tbest: 0.5300301 (315)\n",
|
|
"320:\tlearn: 0.3741710\ttest: 0.5304750\tbest: 0.5300301 (315)\n",
|
|
"321:\tlearn: 0.3739686\ttest: 0.5305996\tbest: 0.5300301 (315)\n",
|
|
"322:\tlearn: 0.3735539\ttest: 0.5306257\tbest: 0.5300301 (315)\n",
|
|
"323:\tlearn: 0.3730897\ttest: 0.5305827\tbest: 0.5300301 (315)\n",
|
|
"324:\tlearn: 0.3727376\ttest: 0.5305520\tbest: 0.5300301 (315)\n",
|
|
"325:\tlearn: 0.3725280\ttest: 0.5305658\tbest: 0.5300301 (315)\n",
|
|
"326:\tlearn: 0.3722845\ttest: 0.5305888\tbest: 0.5300301 (315)\n",
|
|
"327:\tlearn: 0.3720647\ttest: 0.5305521\tbest: 0.5300301 (315)\n",
|
|
"328:\tlearn: 0.3715913\ttest: 0.5304727\tbest: 0.5300301 (315)\n",
|
|
"329:\tlearn: 0.3712397\ttest: 0.5305537\tbest: 0.5300301 (315)\n",
|
|
"330:\tlearn: 0.3709720\ttest: 0.5306278\tbest: 0.5300301 (315)\n",
|
|
"331:\tlearn: 0.3707784\ttest: 0.5306104\tbest: 0.5300301 (315)\n",
|
|
"332:\tlearn: 0.3704073\ttest: 0.5307775\tbest: 0.5300301 (315)\n",
|
|
"333:\tlearn: 0.3700865\ttest: 0.5307422\tbest: 0.5300301 (315)\n",
|
|
"334:\tlearn: 0.3698274\ttest: 0.5305609\tbest: 0.5300301 (315)\n",
|
|
"335:\tlearn: 0.3694787\ttest: 0.5303180\tbest: 0.5300301 (315)\n",
|
|
"336:\tlearn: 0.3691456\ttest: 0.5303379\tbest: 0.5300301 (315)\n",
|
|
"337:\tlearn: 0.3688614\ttest: 0.5304358\tbest: 0.5300301 (315)\n",
|
|
"338:\tlearn: 0.3686685\ttest: 0.5304244\tbest: 0.5300301 (315)\n",
|
|
"339:\tlearn: 0.3683993\ttest: 0.5304364\tbest: 0.5300301 (315)\n",
|
|
"340:\tlearn: 0.3681752\ttest: 0.5304188\tbest: 0.5300301 (315)\n",
|
|
"341:\tlearn: 0.3678477\ttest: 0.5303832\tbest: 0.5300301 (315)\n",
|
|
"342:\tlearn: 0.3675240\ttest: 0.5303173\tbest: 0.5300301 (315)\n",
|
|
"343:\tlearn: 0.3672605\ttest: 0.5301050\tbest: 0.5300301 (315)\n",
|
|
"344:\tlearn: 0.3668759\ttest: 0.5299403\tbest: 0.5299403 (344)\n",
|
|
"345:\tlearn: 0.3666127\ttest: 0.5299239\tbest: 0.5299239 (345)\n",
|
|
"346:\tlearn: 0.3663679\ttest: 0.5300370\tbest: 0.5299239 (345)\n",
|
|
"347:\tlearn: 0.3659196\ttest: 0.5300413\tbest: 0.5299239 (345)\n",
|
|
"348:\tlearn: 0.3656981\ttest: 0.5299386\tbest: 0.5299239 (345)\n",
|
|
"349:\tlearn: 0.3654314\ttest: 0.5300029\tbest: 0.5299239 (345)\n",
|
|
"350:\tlearn: 0.3651637\ttest: 0.5299029\tbest: 0.5299029 (350)\n",
|
|
"351:\tlearn: 0.3648941\ttest: 0.5298408\tbest: 0.5298408 (351)\n",
|
|
"352:\tlearn: 0.3645987\ttest: 0.5297651\tbest: 0.5297651 (352)\n",
|
|
"353:\tlearn: 0.3643406\ttest: 0.5297819\tbest: 0.5297651 (352)\n",
|
|
"354:\tlearn: 0.3639689\ttest: 0.5296422\tbest: 0.5296422 (354)\n",
|
|
"355:\tlearn: 0.3636510\ttest: 0.5295520\tbest: 0.5295520 (355)\n",
|
|
"356:\tlearn: 0.3632612\ttest: 0.5296350\tbest: 0.5295520 (355)\n",
|
|
"357:\tlearn: 0.3630646\ttest: 0.5296936\tbest: 0.5295520 (355)\n",
|
|
"358:\tlearn: 0.3628668\ttest: 0.5296350\tbest: 0.5295520 (355)\n",
|
|
"359:\tlearn: 0.3626498\ttest: 0.5296205\tbest: 0.5295520 (355)\n",
|
|
"360:\tlearn: 0.3622679\ttest: 0.5296143\tbest: 0.5295520 (355)\n",
|
|
"361:\tlearn: 0.3619756\ttest: 0.5295732\tbest: 0.5295520 (355)\n",
|
|
"362:\tlearn: 0.3615312\ttest: 0.5294546\tbest: 0.5294546 (362)\n",
|
|
"363:\tlearn: 0.3613031\ttest: 0.5294008\tbest: 0.5294008 (363)\n",
|
|
"364:\tlearn: 0.3610140\ttest: 0.5293487\tbest: 0.5293487 (364)\n",
|
|
"365:\tlearn: 0.3607610\ttest: 0.5293518\tbest: 0.5293487 (364)\n",
|
|
"366:\tlearn: 0.3604786\ttest: 0.5293643\tbest: 0.5293487 (364)\n",
|
|
"367:\tlearn: 0.3600640\ttest: 0.5292339\tbest: 0.5292339 (367)\n",
|
|
"368:\tlearn: 0.3596642\ttest: 0.5293379\tbest: 0.5292339 (367)\n",
|
|
"369:\tlearn: 0.3591769\ttest: 0.5292226\tbest: 0.5292226 (369)\n",
|
|
"370:\tlearn: 0.3588237\ttest: 0.5293253\tbest: 0.5292226 (369)\n",
|
|
"371:\tlearn: 0.3583702\ttest: 0.5292627\tbest: 0.5292226 (369)\n",
|
|
"372:\tlearn: 0.3579287\ttest: 0.5293083\tbest: 0.5292226 (369)\n",
|
|
"373:\tlearn: 0.3575411\ttest: 0.5291170\tbest: 0.5291170 (373)\n",
|
|
"374:\tlearn: 0.3571662\ttest: 0.5292526\tbest: 0.5291170 (373)\n",
|
|
"375:\tlearn: 0.3568792\ttest: 0.5292504\tbest: 0.5291170 (373)\n",
|
|
"376:\tlearn: 0.3567666\ttest: 0.5293110\tbest: 0.5291170 (373)\n",
|
|
"377:\tlearn: 0.3564038\ttest: 0.5293598\tbest: 0.5291170 (373)\n",
|
|
"378:\tlearn: 0.3561467\ttest: 0.5292740\tbest: 0.5291170 (373)\n",
|
|
"379:\tlearn: 0.3559142\ttest: 0.5292655\tbest: 0.5291170 (373)\n",
|
|
"380:\tlearn: 0.3556661\ttest: 0.5291062\tbest: 0.5291062 (380)\n",
|
|
"381:\tlearn: 0.3554443\ttest: 0.5291072\tbest: 0.5291062 (380)\n",
|
|
"382:\tlearn: 0.3552591\ttest: 0.5290761\tbest: 0.5290761 (382)\n",
|
|
"383:\tlearn: 0.3550037\ttest: 0.5289104\tbest: 0.5289104 (383)\n",
|
|
"384:\tlearn: 0.3546671\ttest: 0.5288708\tbest: 0.5288708 (384)\n",
|
|
"385:\tlearn: 0.3544518\ttest: 0.5289228\tbest: 0.5288708 (384)\n",
|
|
"386:\tlearn: 0.3541983\ttest: 0.5288134\tbest: 0.5288134 (386)\n",
|
|
"387:\tlearn: 0.3539141\ttest: 0.5287725\tbest: 0.5287725 (387)\n",
|
|
"388:\tlearn: 0.3536576\ttest: 0.5287586\tbest: 0.5287586 (388)\n",
|
|
"389:\tlearn: 0.3533729\ttest: 0.5286532\tbest: 0.5286532 (389)\n",
|
|
"390:\tlearn: 0.3531456\ttest: 0.5285952\tbest: 0.5285952 (390)\n",
|
|
"391:\tlearn: 0.3529104\ttest: 0.5285525\tbest: 0.5285525 (391)\n",
|
|
"392:\tlearn: 0.3525330\ttest: 0.5285258\tbest: 0.5285258 (392)\n",
|
|
"393:\tlearn: 0.3519014\ttest: 0.5284859\tbest: 0.5284859 (393)\n",
|
|
"394:\tlearn: 0.3516543\ttest: 0.5285480\tbest: 0.5284859 (393)\n",
|
|
"395:\tlearn: 0.3514938\ttest: 0.5284912\tbest: 0.5284859 (393)\n",
|
|
"396:\tlearn: 0.3512798\ttest: 0.5285241\tbest: 0.5284859 (393)\n",
|
|
"397:\tlearn: 0.3509506\ttest: 0.5286372\tbest: 0.5284859 (393)\n",
|
|
"398:\tlearn: 0.3507794\ttest: 0.5286036\tbest: 0.5284859 (393)\n",
|
|
"399:\tlearn: 0.3505723\ttest: 0.5285198\tbest: 0.5284859 (393)\n",
|
|
"400:\tlearn: 0.3500912\ttest: 0.5284894\tbest: 0.5284859 (393)\n",
|
|
"401:\tlearn: 0.3499465\ttest: 0.5285354\tbest: 0.5284859 (393)\n",
|
|
"402:\tlearn: 0.3497414\ttest: 0.5285857\tbest: 0.5284859 (393)\n",
|
|
"403:\tlearn: 0.3495912\ttest: 0.5285419\tbest: 0.5284859 (393)\n",
|
|
"404:\tlearn: 0.3491755\ttest: 0.5285936\tbest: 0.5284859 (393)\n",
|
|
"405:\tlearn: 0.3490637\ttest: 0.5286141\tbest: 0.5284859 (393)\n",
|
|
"406:\tlearn: 0.3487155\ttest: 0.5284451\tbest: 0.5284451 (406)\n",
|
|
"407:\tlearn: 0.3484655\ttest: 0.5284413\tbest: 0.5284413 (407)\n",
|
|
"408:\tlearn: 0.3482159\ttest: 0.5284792\tbest: 0.5284413 (407)\n",
|
|
"409:\tlearn: 0.3479868\ttest: 0.5285073\tbest: 0.5284413 (407)\n",
|
|
"410:\tlearn: 0.3478358\ttest: 0.5285405\tbest: 0.5284413 (407)\n",
|
|
"411:\tlearn: 0.3475334\ttest: 0.5285837\tbest: 0.5284413 (407)\n",
|
|
"412:\tlearn: 0.3471471\ttest: 0.5286628\tbest: 0.5284413 (407)\n",
|
|
"413:\tlearn: 0.3469435\ttest: 0.5285924\tbest: 0.5284413 (407)\n",
|
|
"414:\tlearn: 0.3466992\ttest: 0.5286917\tbest: 0.5284413 (407)\n",
|
|
"415:\tlearn: 0.3464852\ttest: 0.5287149\tbest: 0.5284413 (407)\n",
|
|
"416:\tlearn: 0.3463613\ttest: 0.5287542\tbest: 0.5284413 (407)\n",
|
|
"417:\tlearn: 0.3461558\ttest: 0.5287820\tbest: 0.5284413 (407)\n",
|
|
"418:\tlearn: 0.3459009\ttest: 0.5287759\tbest: 0.5284413 (407)\n",
|
|
"419:\tlearn: 0.3456643\ttest: 0.5287229\tbest: 0.5284413 (407)\n",
|
|
"420:\tlearn: 0.3453229\ttest: 0.5288428\tbest: 0.5284413 (407)\n",
|
|
"421:\tlearn: 0.3450476\ttest: 0.5289321\tbest: 0.5284413 (407)\n",
|
|
"422:\tlearn: 0.3447643\ttest: 0.5289573\tbest: 0.5284413 (407)\n",
|
|
"423:\tlearn: 0.3444446\ttest: 0.5288394\tbest: 0.5284413 (407)\n",
|
|
"424:\tlearn: 0.3441692\ttest: 0.5288213\tbest: 0.5284413 (407)\n",
|
|
"425:\tlearn: 0.3440322\ttest: 0.5288067\tbest: 0.5284413 (407)\n",
|
|
"426:\tlearn: 0.3438451\ttest: 0.5288547\tbest: 0.5284413 (407)\n",
|
|
"427:\tlearn: 0.3435900\ttest: 0.5288998\tbest: 0.5284413 (407)\n",
|
|
"428:\tlearn: 0.3433759\ttest: 0.5289137\tbest: 0.5284413 (407)\n",
|
|
"429:\tlearn: 0.3432227\ttest: 0.5289766\tbest: 0.5284413 (407)\n",
|
|
"430:\tlearn: 0.3430001\ttest: 0.5289071\tbest: 0.5284413 (407)\n",
|
|
"431:\tlearn: 0.3427350\ttest: 0.5287361\tbest: 0.5284413 (407)\n",
|
|
"432:\tlearn: 0.3425981\ttest: 0.5287270\tbest: 0.5284413 (407)\n",
|
|
"433:\tlearn: 0.3424770\ttest: 0.5288256\tbest: 0.5284413 (407)\n",
|
|
"434:\tlearn: 0.3421170\ttest: 0.5287705\tbest: 0.5284413 (407)\n",
|
|
"435:\tlearn: 0.3418705\ttest: 0.5287071\tbest: 0.5284413 (407)\n",
|
|
"436:\tlearn: 0.3415446\ttest: 0.5288288\tbest: 0.5284413 (407)\n",
|
|
"437:\tlearn: 0.3412033\ttest: 0.5289024\tbest: 0.5284413 (407)\n",
|
|
"438:\tlearn: 0.3409626\ttest: 0.5287771\tbest: 0.5284413 (407)\n",
|
|
"439:\tlearn: 0.3407809\ttest: 0.5288279\tbest: 0.5284413 (407)\n",
|
|
"440:\tlearn: 0.3404520\ttest: 0.5287909\tbest: 0.5284413 (407)\n",
|
|
"441:\tlearn: 0.3402065\ttest: 0.5288565\tbest: 0.5284413 (407)\n",
|
|
"442:\tlearn: 0.3398993\ttest: 0.5288764\tbest: 0.5284413 (407)\n",
|
|
"443:\tlearn: 0.3396215\ttest: 0.5288521\tbest: 0.5284413 (407)\n",
|
|
"444:\tlearn: 0.3393309\ttest: 0.5287789\tbest: 0.5284413 (407)\n",
|
|
"445:\tlearn: 0.3391830\ttest: 0.5288318\tbest: 0.5284413 (407)\n",
|
|
"446:\tlearn: 0.3389734\ttest: 0.5288055\tbest: 0.5284413 (407)\n",
|
|
"447:\tlearn: 0.3387662\ttest: 0.5287168\tbest: 0.5284413 (407)\n",
|
|
"448:\tlearn: 0.3385018\ttest: 0.5287463\tbest: 0.5284413 (407)\n",
|
|
"449:\tlearn: 0.3382614\ttest: 0.5287821\tbest: 0.5284413 (407)\n",
|
|
"450:\tlearn: 0.3378512\ttest: 0.5288852\tbest: 0.5284413 (407)\n",
|
|
"451:\tlearn: 0.3375146\ttest: 0.5288373\tbest: 0.5284413 (407)\n",
|
|
"452:\tlearn: 0.3373002\ttest: 0.5288654\tbest: 0.5284413 (407)\n",
|
|
"453:\tlearn: 0.3368785\ttest: 0.5288783\tbest: 0.5284413 (407)\n",
|
|
"454:\tlearn: 0.3365779\ttest: 0.5289642\tbest: 0.5284413 (407)\n",
|
|
"455:\tlearn: 0.3363724\ttest: 0.5289623\tbest: 0.5284413 (407)\n",
|
|
"456:\tlearn: 0.3362242\ttest: 0.5289988\tbest: 0.5284413 (407)\n",
|
|
"457:\tlearn: 0.3359765\ttest: 0.5290810\tbest: 0.5284413 (407)\n",
|
|
"458:\tlearn: 0.3356527\ttest: 0.5292128\tbest: 0.5284413 (407)\n",
|
|
"459:\tlearn: 0.3354864\ttest: 0.5292526\tbest: 0.5284413 (407)\n",
|
|
"460:\tlearn: 0.3352078\ttest: 0.5291732\tbest: 0.5284413 (407)\n",
|
|
"461:\tlearn: 0.3348574\ttest: 0.5293040\tbest: 0.5284413 (407)\n",
|
|
"462:\tlearn: 0.3346245\ttest: 0.5290916\tbest: 0.5284413 (407)\n",
|
|
"463:\tlearn: 0.3345164\ttest: 0.5290720\tbest: 0.5284413 (407)\n",
|
|
"464:\tlearn: 0.3342750\ttest: 0.5290784\tbest: 0.5284413 (407)\n",
|
|
"465:\tlearn: 0.3340824\ttest: 0.5291646\tbest: 0.5284413 (407)\n",
|
|
"466:\tlearn: 0.3337962\ttest: 0.5291393\tbest: 0.5284413 (407)\n",
|
|
"467:\tlearn: 0.3335703\ttest: 0.5291103\tbest: 0.5284413 (407)\n",
|
|
"468:\tlearn: 0.3333384\ttest: 0.5291170\tbest: 0.5284413 (407)\n",
|
|
"469:\tlearn: 0.3329078\ttest: 0.5290748\tbest: 0.5284413 (407)\n",
|
|
"470:\tlearn: 0.3325006\ttest: 0.5289343\tbest: 0.5284413 (407)\n",
|
|
"471:\tlearn: 0.3323014\ttest: 0.5290269\tbest: 0.5284413 (407)\n",
|
|
"472:\tlearn: 0.3320824\ttest: 0.5291273\tbest: 0.5284413 (407)\n",
|
|
"473:\tlearn: 0.3317844\ttest: 0.5291414\tbest: 0.5284413 (407)\n",
|
|
"474:\tlearn: 0.3315493\ttest: 0.5291596\tbest: 0.5284413 (407)\n",
|
|
"475:\tlearn: 0.3311653\ttest: 0.5294492\tbest: 0.5284413 (407)\n",
|
|
"476:\tlearn: 0.3309525\ttest: 0.5293730\tbest: 0.5284413 (407)\n",
|
|
"477:\tlearn: 0.3306174\ttest: 0.5292255\tbest: 0.5284413 (407)\n",
|
|
"478:\tlearn: 0.3302801\ttest: 0.5293641\tbest: 0.5284413 (407)\n",
|
|
"479:\tlearn: 0.3301670\ttest: 0.5292493\tbest: 0.5284413 (407)\n",
|
|
"480:\tlearn: 0.3298346\ttest: 0.5292413\tbest: 0.5284413 (407)\n",
|
|
"481:\tlearn: 0.3296313\ttest: 0.5293110\tbest: 0.5284413 (407)\n",
|
|
"482:\tlearn: 0.3293624\ttest: 0.5293318\tbest: 0.5284413 (407)\n",
|
|
"483:\tlearn: 0.3291653\ttest: 0.5292465\tbest: 0.5284413 (407)\n",
|
|
"484:\tlearn: 0.3288246\ttest: 0.5293520\tbest: 0.5284413 (407)\n",
|
|
"485:\tlearn: 0.3286833\ttest: 0.5292990\tbest: 0.5284413 (407)\n",
|
|
"486:\tlearn: 0.3284444\ttest: 0.5291796\tbest: 0.5284413 (407)\n",
|
|
"487:\tlearn: 0.3281810\ttest: 0.5291888\tbest: 0.5284413 (407)\n",
|
|
"488:\tlearn: 0.3276982\ttest: 0.5292114\tbest: 0.5284413 (407)\n",
|
|
"489:\tlearn: 0.3273537\ttest: 0.5292186\tbest: 0.5284413 (407)\n",
|
|
"490:\tlearn: 0.3270885\ttest: 0.5294038\tbest: 0.5284413 (407)\n",
|
|
"491:\tlearn: 0.3267704\ttest: 0.5295008\tbest: 0.5284413 (407)\n",
|
|
"492:\tlearn: 0.3264167\ttest: 0.5297091\tbest: 0.5284413 (407)\n",
|
|
"493:\tlearn: 0.3262710\ttest: 0.5296845\tbest: 0.5284413 (407)\n",
|
|
"494:\tlearn: 0.3258905\ttest: 0.5295977\tbest: 0.5284413 (407)\n",
|
|
"495:\tlearn: 0.3256798\ttest: 0.5295957\tbest: 0.5284413 (407)\n",
|
|
"496:\tlearn: 0.3255507\ttest: 0.5295598\tbest: 0.5284413 (407)\n",
|
|
"497:\tlearn: 0.3253656\ttest: 0.5295179\tbest: 0.5284413 (407)\n",
|
|
"498:\tlearn: 0.3251698\ttest: 0.5295569\tbest: 0.5284413 (407)\n",
|
|
"499:\tlearn: 0.3249192\ttest: 0.5295561\tbest: 0.5284413 (407)\n",
|
|
"500:\tlearn: 0.3245994\ttest: 0.5297099\tbest: 0.5284413 (407)\n",
|
|
"501:\tlearn: 0.3243534\ttest: 0.5296865\tbest: 0.5284413 (407)\n",
|
|
"502:\tlearn: 0.3241768\ttest: 0.5297184\tbest: 0.5284413 (407)\n",
|
|
"503:\tlearn: 0.3239837\ttest: 0.5297205\tbest: 0.5284413 (407)\n",
|
|
"504:\tlearn: 0.3236362\ttest: 0.5298422\tbest: 0.5284413 (407)\n",
|
|
"505:\tlearn: 0.3233620\ttest: 0.5298761\tbest: 0.5284413 (407)\n",
|
|
"506:\tlearn: 0.3230302\ttest: 0.5298820\tbest: 0.5284413 (407)\n",
|
|
"507:\tlearn: 0.3226439\ttest: 0.5299407\tbest: 0.5284413 (407)\n",
|
|
"508:\tlearn: 0.3223493\ttest: 0.5299716\tbest: 0.5284413 (407)\n",
|
|
"509:\tlearn: 0.3221339\ttest: 0.5300109\tbest: 0.5284413 (407)\n",
|
|
"510:\tlearn: 0.3218929\ttest: 0.5299713\tbest: 0.5284413 (407)\n",
|
|
"511:\tlearn: 0.3217686\ttest: 0.5299714\tbest: 0.5284413 (407)\n",
|
|
"512:\tlearn: 0.3215971\ttest: 0.5299924\tbest: 0.5284413 (407)\n",
|
|
"513:\tlearn: 0.3212691\ttest: 0.5300945\tbest: 0.5284413 (407)\n",
|
|
"514:\tlearn: 0.3209394\ttest: 0.5301342\tbest: 0.5284413 (407)\n",
|
|
"515:\tlearn: 0.3206716\ttest: 0.5301157\tbest: 0.5284413 (407)\n",
|
|
"516:\tlearn: 0.3204199\ttest: 0.5302252\tbest: 0.5284413 (407)\n",
|
|
"517:\tlearn: 0.3202073\ttest: 0.5302246\tbest: 0.5284413 (407)\n",
|
|
"518:\tlearn: 0.3200115\ttest: 0.5301338\tbest: 0.5284413 (407)\n",
|
|
"519:\tlearn: 0.3198364\ttest: 0.5303629\tbest: 0.5284413 (407)\n",
|
|
"520:\tlearn: 0.3196852\ttest: 0.5303855\tbest: 0.5284413 (407)\n",
|
|
"521:\tlearn: 0.3195308\ttest: 0.5303822\tbest: 0.5284413 (407)\n",
|
|
"522:\tlearn: 0.3191751\ttest: 0.5303830\tbest: 0.5284413 (407)\n",
|
|
"523:\tlearn: 0.3190054\ttest: 0.5304336\tbest: 0.5284413 (407)\n",
|
|
"524:\tlearn: 0.3187922\ttest: 0.5303241\tbest: 0.5284413 (407)\n",
|
|
"525:\tlearn: 0.3185481\ttest: 0.5302466\tbest: 0.5284413 (407)\n",
|
|
"526:\tlearn: 0.3183338\ttest: 0.5302913\tbest: 0.5284413 (407)\n",
|
|
"527:\tlearn: 0.3179480\ttest: 0.5304103\tbest: 0.5284413 (407)\n",
|
|
"528:\tlearn: 0.3175600\ttest: 0.5304683\tbest: 0.5284413 (407)\n",
|
|
"529:\tlearn: 0.3173647\ttest: 0.5305742\tbest: 0.5284413 (407)\n",
|
|
"530:\tlearn: 0.3171931\ttest: 0.5306498\tbest: 0.5284413 (407)\n",
|
|
"531:\tlearn: 0.3169263\ttest: 0.5307178\tbest: 0.5284413 (407)\n",
|
|
"532:\tlearn: 0.3166165\ttest: 0.5309290\tbest: 0.5284413 (407)\n",
|
|
"533:\tlearn: 0.3164253\ttest: 0.5309039\tbest: 0.5284413 (407)\n",
|
|
"534:\tlearn: 0.3160048\ttest: 0.5309418\tbest: 0.5284413 (407)\n",
|
|
"535:\tlearn: 0.3158088\ttest: 0.5309620\tbest: 0.5284413 (407)\n",
|
|
"536:\tlearn: 0.3156190\ttest: 0.5309280\tbest: 0.5284413 (407)\n",
|
|
"537:\tlearn: 0.3152587\ttest: 0.5309827\tbest: 0.5284413 (407)\n",
|
|
"538:\tlearn: 0.3148748\ttest: 0.5309524\tbest: 0.5284413 (407)\n",
|
|
"539:\tlearn: 0.3144106\ttest: 0.5307502\tbest: 0.5284413 (407)\n",
|
|
"540:\tlearn: 0.3142289\ttest: 0.5307919\tbest: 0.5284413 (407)\n",
|
|
"541:\tlearn: 0.3138725\ttest: 0.5308111\tbest: 0.5284413 (407)\n",
|
|
"542:\tlearn: 0.3137597\ttest: 0.5307734\tbest: 0.5284413 (407)\n",
|
|
"543:\tlearn: 0.3133716\ttest: 0.5308006\tbest: 0.5284413 (407)\n",
|
|
"544:\tlearn: 0.3130950\ttest: 0.5307005\tbest: 0.5284413 (407)\n",
|
|
"545:\tlearn: 0.3128159\ttest: 0.5309188\tbest: 0.5284413 (407)\n",
|
|
"546:\tlearn: 0.3125655\ttest: 0.5308808\tbest: 0.5284413 (407)\n",
|
|
"547:\tlearn: 0.3123001\ttest: 0.5309489\tbest: 0.5284413 (407)\n",
|
|
"548:\tlearn: 0.3121211\ttest: 0.5309774\tbest: 0.5284413 (407)\n",
|
|
"549:\tlearn: 0.3117132\ttest: 0.5310266\tbest: 0.5284413 (407)\n",
|
|
"550:\tlearn: 0.3114572\ttest: 0.5310832\tbest: 0.5284413 (407)\n",
|
|
"551:\tlearn: 0.3113315\ttest: 0.5310865\tbest: 0.5284413 (407)\n",
|
|
"552:\tlearn: 0.3110152\ttest: 0.5311159\tbest: 0.5284413 (407)\n",
|
|
"553:\tlearn: 0.3106031\ttest: 0.5310686\tbest: 0.5284413 (407)\n",
|
|
"554:\tlearn: 0.3103525\ttest: 0.5309904\tbest: 0.5284413 (407)\n",
|
|
"555:\tlearn: 0.3101051\ttest: 0.5311030\tbest: 0.5284413 (407)\n",
|
|
"556:\tlearn: 0.3095319\ttest: 0.5310676\tbest: 0.5284413 (407)\n",
|
|
"557:\tlearn: 0.3093739\ttest: 0.5311428\tbest: 0.5284413 (407)\n",
|
|
"558:\tlearn: 0.3091644\ttest: 0.5311263\tbest: 0.5284413 (407)\n",
|
|
"559:\tlearn: 0.3089595\ttest: 0.5311991\tbest: 0.5284413 (407)\n",
|
|
"560:\tlearn: 0.3086838\ttest: 0.5310674\tbest: 0.5284413 (407)\n",
|
|
"561:\tlearn: 0.3084190\ttest: 0.5311550\tbest: 0.5284413 (407)\n",
|
|
"562:\tlearn: 0.3082352\ttest: 0.5312104\tbest: 0.5284413 (407)\n",
|
|
"563:\tlearn: 0.3078537\ttest: 0.5311332\tbest: 0.5284413 (407)\n",
|
|
"564:\tlearn: 0.3076739\ttest: 0.5312663\tbest: 0.5284413 (407)\n",
|
|
"565:\tlearn: 0.3074354\ttest: 0.5312361\tbest: 0.5284413 (407)\n",
|
|
"566:\tlearn: 0.3071939\ttest: 0.5312452\tbest: 0.5284413 (407)\n",
|
|
"567:\tlearn: 0.3068461\ttest: 0.5311287\tbest: 0.5284413 (407)\n",
|
|
"568:\tlearn: 0.3066002\ttest: 0.5311594\tbest: 0.5284413 (407)\n",
|
|
"569:\tlearn: 0.3064046\ttest: 0.5311733\tbest: 0.5284413 (407)\n",
|
|
"570:\tlearn: 0.3061423\ttest: 0.5311418\tbest: 0.5284413 (407)\n",
|
|
"571:\tlearn: 0.3058679\ttest: 0.5310677\tbest: 0.5284413 (407)\n",
|
|
"572:\tlearn: 0.3054790\ttest: 0.5311452\tbest: 0.5284413 (407)\n",
|
|
"573:\tlearn: 0.3052236\ttest: 0.5310912\tbest: 0.5284413 (407)\n",
|
|
"574:\tlearn: 0.3049688\ttest: 0.5310872\tbest: 0.5284413 (407)\n",
|
|
"575:\tlearn: 0.3046959\ttest: 0.5310577\tbest: 0.5284413 (407)\n",
|
|
"576:\tlearn: 0.3045618\ttest: 0.5311669\tbest: 0.5284413 (407)\n",
|
|
"577:\tlearn: 0.3043337\ttest: 0.5310623\tbest: 0.5284413 (407)\n",
|
|
"578:\tlearn: 0.3039430\ttest: 0.5310801\tbest: 0.5284413 (407)\n",
|
|
"579:\tlearn: 0.3035477\ttest: 0.5311603\tbest: 0.5284413 (407)\n",
|
|
"580:\tlearn: 0.3033434\ttest: 0.5312402\tbest: 0.5284413 (407)\n",
|
|
"581:\tlearn: 0.3029700\ttest: 0.5310574\tbest: 0.5284413 (407)\n",
|
|
"582:\tlearn: 0.3024498\ttest: 0.5310525\tbest: 0.5284413 (407)\n",
|
|
"583:\tlearn: 0.3023466\ttest: 0.5310159\tbest: 0.5284413 (407)\n",
|
|
"584:\tlearn: 0.3020833\ttest: 0.5311059\tbest: 0.5284413 (407)\n",
|
|
"585:\tlearn: 0.3018310\ttest: 0.5311217\tbest: 0.5284413 (407)\n",
|
|
"586:\tlearn: 0.3015514\ttest: 0.5311106\tbest: 0.5284413 (407)\n",
|
|
"587:\tlearn: 0.3013214\ttest: 0.5311094\tbest: 0.5284413 (407)\n",
|
|
"588:\tlearn: 0.3011735\ttest: 0.5311249\tbest: 0.5284413 (407)\n",
|
|
"589:\tlearn: 0.3008968\ttest: 0.5311440\tbest: 0.5284413 (407)\n",
|
|
"590:\tlearn: 0.3005698\ttest: 0.5310804\tbest: 0.5284413 (407)\n",
|
|
"591:\tlearn: 0.3001270\ttest: 0.5310845\tbest: 0.5284413 (407)\n",
|
|
"592:\tlearn: 0.2998966\ttest: 0.5311770\tbest: 0.5284413 (407)\n",
|
|
"593:\tlearn: 0.2997121\ttest: 0.5311369\tbest: 0.5284413 (407)\n",
|
|
"594:\tlearn: 0.2992793\ttest: 0.5312689\tbest: 0.5284413 (407)\n",
|
|
"595:\tlearn: 0.2990093\ttest: 0.5312638\tbest: 0.5284413 (407)\n",
|
|
"596:\tlearn: 0.2987602\ttest: 0.5312965\tbest: 0.5284413 (407)\n",
|
|
"597:\tlearn: 0.2984793\ttest: 0.5312802\tbest: 0.5284413 (407)\n",
|
|
"598:\tlearn: 0.2983217\ttest: 0.5312578\tbest: 0.5284413 (407)\n",
|
|
"599:\tlearn: 0.2981045\ttest: 0.5312910\tbest: 0.5284413 (407)\n",
|
|
"600:\tlearn: 0.2978639\ttest: 0.5313597\tbest: 0.5284413 (407)\n",
|
|
"601:\tlearn: 0.2976658\ttest: 0.5313495\tbest: 0.5284413 (407)\n",
|
|
"602:\tlearn: 0.2973438\ttest: 0.5313036\tbest: 0.5284413 (407)\n",
|
|
"603:\tlearn: 0.2970071\ttest: 0.5313561\tbest: 0.5284413 (407)\n",
|
|
"604:\tlearn: 0.2965705\ttest: 0.5311443\tbest: 0.5284413 (407)\n",
|
|
"605:\tlearn: 0.2962635\ttest: 0.5312316\tbest: 0.5284413 (407)\n",
|
|
"606:\tlearn: 0.2959893\ttest: 0.5313444\tbest: 0.5284413 (407)\n",
|
|
"607:\tlearn: 0.2958300\ttest: 0.5313338\tbest: 0.5284413 (407)\n",
|
|
"608:\tlearn: 0.2955749\ttest: 0.5315201\tbest: 0.5284413 (407)\n",
|
|
"609:\tlearn: 0.2952970\ttest: 0.5315686\tbest: 0.5284413 (407)\n",
|
|
"610:\tlearn: 0.2949862\ttest: 0.5316825\tbest: 0.5284413 (407)\n",
|
|
"611:\tlearn: 0.2947853\ttest: 0.5318188\tbest: 0.5284413 (407)\n",
|
|
"612:\tlearn: 0.2945417\ttest: 0.5318320\tbest: 0.5284413 (407)\n",
|
|
"613:\tlearn: 0.2943299\ttest: 0.5317867\tbest: 0.5284413 (407)\n",
|
|
"614:\tlearn: 0.2940504\ttest: 0.5316951\tbest: 0.5284413 (407)\n",
|
|
"615:\tlearn: 0.2938150\ttest: 0.5316825\tbest: 0.5284413 (407)\n",
|
|
"616:\tlearn: 0.2935837\ttest: 0.5316992\tbest: 0.5284413 (407)\n",
|
|
"617:\tlearn: 0.2933353\ttest: 0.5315577\tbest: 0.5284413 (407)\n",
|
|
"618:\tlearn: 0.2932391\ttest: 0.5315666\tbest: 0.5284413 (407)\n",
|
|
"619:\tlearn: 0.2930415\ttest: 0.5315444\tbest: 0.5284413 (407)\n",
|
|
"620:\tlearn: 0.2927701\ttest: 0.5315540\tbest: 0.5284413 (407)\n",
|
|
"621:\tlearn: 0.2926642\ttest: 0.5315081\tbest: 0.5284413 (407)\n",
|
|
"622:\tlearn: 0.2924022\ttest: 0.5315403\tbest: 0.5284413 (407)\n",
|
|
"623:\tlearn: 0.2921360\ttest: 0.5315912\tbest: 0.5284413 (407)\n",
|
|
"624:\tlearn: 0.2918765\ttest: 0.5315419\tbest: 0.5284413 (407)\n",
|
|
"625:\tlearn: 0.2916579\ttest: 0.5314663\tbest: 0.5284413 (407)\n",
|
|
"626:\tlearn: 0.2914514\ttest: 0.5315123\tbest: 0.5284413 (407)\n",
|
|
"627:\tlearn: 0.2910266\ttest: 0.5315420\tbest: 0.5284413 (407)\n",
|
|
"628:\tlearn: 0.2906845\ttest: 0.5315956\tbest: 0.5284413 (407)\n",
|
|
"629:\tlearn: 0.2904618\ttest: 0.5315941\tbest: 0.5284413 (407)\n",
|
|
"630:\tlearn: 0.2902561\ttest: 0.5315420\tbest: 0.5284413 (407)\n",
|
|
"631:\tlearn: 0.2899831\ttest: 0.5314211\tbest: 0.5284413 (407)\n",
|
|
"632:\tlearn: 0.2897136\ttest: 0.5314346\tbest: 0.5284413 (407)\n",
|
|
"633:\tlearn: 0.2895579\ttest: 0.5314614\tbest: 0.5284413 (407)\n",
|
|
"634:\tlearn: 0.2892413\ttest: 0.5316266\tbest: 0.5284413 (407)\n",
|
|
"635:\tlearn: 0.2889528\ttest: 0.5317284\tbest: 0.5284413 (407)\n",
|
|
"636:\tlearn: 0.2885883\ttest: 0.5317300\tbest: 0.5284413 (407)\n",
|
|
"637:\tlearn: 0.2883770\ttest: 0.5318422\tbest: 0.5284413 (407)\n",
|
|
"638:\tlearn: 0.2880639\ttest: 0.5317480\tbest: 0.5284413 (407)\n",
|
|
"639:\tlearn: 0.2878039\ttest: 0.5317594\tbest: 0.5284413 (407)\n",
|
|
"640:\tlearn: 0.2875776\ttest: 0.5316490\tbest: 0.5284413 (407)\n",
|
|
"641:\tlearn: 0.2872650\ttest: 0.5316350\tbest: 0.5284413 (407)\n",
|
|
"642:\tlearn: 0.2870846\ttest: 0.5316000\tbest: 0.5284413 (407)\n",
|
|
"643:\tlearn: 0.2869224\ttest: 0.5314545\tbest: 0.5284413 (407)\n",
|
|
"644:\tlearn: 0.2867729\ttest: 0.5314731\tbest: 0.5284413 (407)\n",
|
|
"645:\tlearn: 0.2865073\ttest: 0.5314136\tbest: 0.5284413 (407)\n",
|
|
"646:\tlearn: 0.2862965\ttest: 0.5314589\tbest: 0.5284413 (407)\n",
|
|
"647:\tlearn: 0.2859018\ttest: 0.5317185\tbest: 0.5284413 (407)\n",
|
|
"648:\tlearn: 0.2857104\ttest: 0.5317538\tbest: 0.5284413 (407)\n",
|
|
"649:\tlearn: 0.2852264\ttest: 0.5316236\tbest: 0.5284413 (407)\n",
|
|
"650:\tlearn: 0.2850173\ttest: 0.5316156\tbest: 0.5284413 (407)\n",
|
|
"651:\tlearn: 0.2847764\ttest: 0.5317119\tbest: 0.5284413 (407)\n",
|
|
"652:\tlearn: 0.2845573\ttest: 0.5317973\tbest: 0.5284413 (407)\n",
|
|
"653:\tlearn: 0.2842548\ttest: 0.5318681\tbest: 0.5284413 (407)\n",
|
|
"654:\tlearn: 0.2839506\ttest: 0.5319106\tbest: 0.5284413 (407)\n",
|
|
"655:\tlearn: 0.2837515\ttest: 0.5319600\tbest: 0.5284413 (407)\n",
|
|
"656:\tlearn: 0.2835766\ttest: 0.5320623\tbest: 0.5284413 (407)\n",
|
|
"657:\tlearn: 0.2833608\ttest: 0.5320264\tbest: 0.5284413 (407)\n",
|
|
"658:\tlearn: 0.2830752\ttest: 0.5320023\tbest: 0.5284413 (407)\n",
|
|
"659:\tlearn: 0.2828405\ttest: 0.5320503\tbest: 0.5284413 (407)\n",
|
|
"660:\tlearn: 0.2826537\ttest: 0.5320838\tbest: 0.5284413 (407)\n",
|
|
"661:\tlearn: 0.2823245\ttest: 0.5320718\tbest: 0.5284413 (407)\n",
|
|
"662:\tlearn: 0.2821130\ttest: 0.5321244\tbest: 0.5284413 (407)\n",
|
|
"663:\tlearn: 0.2819213\ttest: 0.5320719\tbest: 0.5284413 (407)\n",
|
|
"664:\tlearn: 0.2816881\ttest: 0.5321045\tbest: 0.5284413 (407)\n",
|
|
"665:\tlearn: 0.2815704\ttest: 0.5321660\tbest: 0.5284413 (407)\n",
|
|
"666:\tlearn: 0.2812676\ttest: 0.5320439\tbest: 0.5284413 (407)\n",
|
|
"667:\tlearn: 0.2809743\ttest: 0.5323004\tbest: 0.5284413 (407)\n",
|
|
"668:\tlearn: 0.2808095\ttest: 0.5323559\tbest: 0.5284413 (407)\n",
|
|
"669:\tlearn: 0.2806234\ttest: 0.5324257\tbest: 0.5284413 (407)\n",
|
|
"670:\tlearn: 0.2803447\ttest: 0.5322725\tbest: 0.5284413 (407)\n",
|
|
"671:\tlearn: 0.2801009\ttest: 0.5324124\tbest: 0.5284413 (407)\n",
|
|
"672:\tlearn: 0.2798236\ttest: 0.5324868\tbest: 0.5284413 (407)\n",
|
|
"673:\tlearn: 0.2794151\ttest: 0.5324069\tbest: 0.5284413 (407)\n",
|
|
"674:\tlearn: 0.2791979\ttest: 0.5323837\tbest: 0.5284413 (407)\n",
|
|
"675:\tlearn: 0.2790360\ttest: 0.5323901\tbest: 0.5284413 (407)\n",
|
|
"676:\tlearn: 0.2787406\ttest: 0.5323628\tbest: 0.5284413 (407)\n",
|
|
"677:\tlearn: 0.2784569\ttest: 0.5325202\tbest: 0.5284413 (407)\n",
|
|
"678:\tlearn: 0.2783024\ttest: 0.5325817\tbest: 0.5284413 (407)\n",
|
|
"679:\tlearn: 0.2779667\ttest: 0.5326369\tbest: 0.5284413 (407)\n",
|
|
"680:\tlearn: 0.2777691\ttest: 0.5326369\tbest: 0.5284413 (407)\n",
|
|
"681:\tlearn: 0.2775230\ttest: 0.5325910\tbest: 0.5284413 (407)\n",
|
|
"682:\tlearn: 0.2771410\ttest: 0.5325908\tbest: 0.5284413 (407)\n",
|
|
"683:\tlearn: 0.2767973\ttest: 0.5325189\tbest: 0.5284413 (407)\n",
|
|
"684:\tlearn: 0.2765655\ttest: 0.5325786\tbest: 0.5284413 (407)\n",
|
|
"685:\tlearn: 0.2764398\ttest: 0.5326130\tbest: 0.5284413 (407)\n",
|
|
"686:\tlearn: 0.2759668\ttest: 0.5326955\tbest: 0.5284413 (407)\n",
|
|
"687:\tlearn: 0.2756147\ttest: 0.5330190\tbest: 0.5284413 (407)\n",
|
|
"688:\tlearn: 0.2753570\ttest: 0.5330483\tbest: 0.5284413 (407)\n",
|
|
"689:\tlearn: 0.2752041\ttest: 0.5330006\tbest: 0.5284413 (407)\n",
|
|
"690:\tlearn: 0.2750191\ttest: 0.5330328\tbest: 0.5284413 (407)\n",
|
|
"691:\tlearn: 0.2746526\ttest: 0.5330824\tbest: 0.5284413 (407)\n",
|
|
"692:\tlearn: 0.2743096\ttest: 0.5331009\tbest: 0.5284413 (407)\n",
|
|
"693:\tlearn: 0.2738806\ttest: 0.5329273\tbest: 0.5284413 (407)\n",
|
|
"694:\tlearn: 0.2737039\ttest: 0.5329539\tbest: 0.5284413 (407)\n",
|
|
"695:\tlearn: 0.2735318\ttest: 0.5329804\tbest: 0.5284413 (407)\n",
|
|
"696:\tlearn: 0.2733224\ttest: 0.5329351\tbest: 0.5284413 (407)\n",
|
|
"697:\tlearn: 0.2731544\ttest: 0.5329835\tbest: 0.5284413 (407)\n",
|
|
"698:\tlearn: 0.2729463\ttest: 0.5329846\tbest: 0.5284413 (407)\n",
|
|
"699:\tlearn: 0.2727788\ttest: 0.5331329\tbest: 0.5284413 (407)\n",
|
|
"700:\tlearn: 0.2725819\ttest: 0.5331752\tbest: 0.5284413 (407)\n",
|
|
"701:\tlearn: 0.2723623\ttest: 0.5332388\tbest: 0.5284413 (407)\n",
|
|
"702:\tlearn: 0.2722034\ttest: 0.5332290\tbest: 0.5284413 (407)\n",
|
|
"703:\tlearn: 0.2718344\ttest: 0.5332662\tbest: 0.5284413 (407)\n",
|
|
"704:\tlearn: 0.2717570\ttest: 0.5332219\tbest: 0.5284413 (407)\n",
|
|
"705:\tlearn: 0.2714187\ttest: 0.5332458\tbest: 0.5284413 (407)\n",
|
|
"706:\tlearn: 0.2710469\ttest: 0.5333432\tbest: 0.5284413 (407)\n",
|
|
"707:\tlearn: 0.2707478\ttest: 0.5333244\tbest: 0.5284413 (407)\n",
|
|
"708:\tlearn: 0.2705351\ttest: 0.5333594\tbest: 0.5284413 (407)\n",
|
|
"709:\tlearn: 0.2702628\ttest: 0.5335130\tbest: 0.5284413 (407)\n",
|
|
"710:\tlearn: 0.2698495\ttest: 0.5336131\tbest: 0.5284413 (407)\n",
|
|
"711:\tlearn: 0.2695409\ttest: 0.5335545\tbest: 0.5284413 (407)\n",
|
|
"712:\tlearn: 0.2693663\ttest: 0.5335083\tbest: 0.5284413 (407)\n",
|
|
"713:\tlearn: 0.2691495\ttest: 0.5336174\tbest: 0.5284413 (407)\n",
|
|
"714:\tlearn: 0.2689695\ttest: 0.5337027\tbest: 0.5284413 (407)\n",
|
|
"715:\tlearn: 0.2687307\ttest: 0.5337843\tbest: 0.5284413 (407)\n",
|
|
"716:\tlearn: 0.2686296\ttest: 0.5338305\tbest: 0.5284413 (407)\n",
|
|
"717:\tlearn: 0.2684282\ttest: 0.5338269\tbest: 0.5284413 (407)\n",
|
|
"718:\tlearn: 0.2682701\ttest: 0.5338228\tbest: 0.5284413 (407)\n",
|
|
"719:\tlearn: 0.2679509\ttest: 0.5338107\tbest: 0.5284413 (407)\n",
|
|
"720:\tlearn: 0.2677242\ttest: 0.5337581\tbest: 0.5284413 (407)\n",
|
|
"721:\tlearn: 0.2674363\ttest: 0.5338406\tbest: 0.5284413 (407)\n",
|
|
"722:\tlearn: 0.2672634\ttest: 0.5338566\tbest: 0.5284413 (407)\n",
|
|
"723:\tlearn: 0.2671019\ttest: 0.5339407\tbest: 0.5284413 (407)\n",
|
|
"724:\tlearn: 0.2668901\ttest: 0.5339280\tbest: 0.5284413 (407)\n",
|
|
"725:\tlearn: 0.2667016\ttest: 0.5339335\tbest: 0.5284413 (407)\n",
|
|
"726:\tlearn: 0.2664957\ttest: 0.5340215\tbest: 0.5284413 (407)\n",
|
|
"727:\tlearn: 0.2662164\ttest: 0.5339383\tbest: 0.5284413 (407)\n",
|
|
"728:\tlearn: 0.2660876\ttest: 0.5338867\tbest: 0.5284413 (407)\n",
|
|
"729:\tlearn: 0.2658447\ttest: 0.5340086\tbest: 0.5284413 (407)\n",
|
|
"730:\tlearn: 0.2656405\ttest: 0.5340682\tbest: 0.5284413 (407)\n",
|
|
"731:\tlearn: 0.2654055\ttest: 0.5340865\tbest: 0.5284413 (407)\n",
|
|
"732:\tlearn: 0.2652284\ttest: 0.5341202\tbest: 0.5284413 (407)\n",
|
|
"733:\tlearn: 0.2650717\ttest: 0.5340900\tbest: 0.5284413 (407)\n",
|
|
"734:\tlearn: 0.2649402\ttest: 0.5341169\tbest: 0.5284413 (407)\n",
|
|
"735:\tlearn: 0.2646975\ttest: 0.5340282\tbest: 0.5284413 (407)\n",
|
|
"736:\tlearn: 0.2643682\ttest: 0.5339582\tbest: 0.5284413 (407)\n",
|
|
"737:\tlearn: 0.2641876\ttest: 0.5339006\tbest: 0.5284413 (407)\n",
|
|
"738:\tlearn: 0.2640246\ttest: 0.5339523\tbest: 0.5284413 (407)\n",
|
|
"739:\tlearn: 0.2638250\ttest: 0.5339789\tbest: 0.5284413 (407)\n",
|
|
"740:\tlearn: 0.2635895\ttest: 0.5339169\tbest: 0.5284413 (407)\n",
|
|
"741:\tlearn: 0.2633619\ttest: 0.5340898\tbest: 0.5284413 (407)\n",
|
|
"742:\tlearn: 0.2631347\ttest: 0.5340346\tbest: 0.5284413 (407)\n",
|
|
"743:\tlearn: 0.2630226\ttest: 0.5340847\tbest: 0.5284413 (407)\n",
|
|
"744:\tlearn: 0.2629127\ttest: 0.5341078\tbest: 0.5284413 (407)\n",
|
|
"745:\tlearn: 0.2626265\ttest: 0.5338565\tbest: 0.5284413 (407)\n",
|
|
"746:\tlearn: 0.2624397\ttest: 0.5338284\tbest: 0.5284413 (407)\n",
|
|
"747:\tlearn: 0.2622704\ttest: 0.5338755\tbest: 0.5284413 (407)\n",
|
|
"748:\tlearn: 0.2620373\ttest: 0.5338433\tbest: 0.5284413 (407)\n",
|
|
"749:\tlearn: 0.2618587\ttest: 0.5339179\tbest: 0.5284413 (407)\n",
|
|
"750:\tlearn: 0.2616128\ttest: 0.5340465\tbest: 0.5284413 (407)\n",
|
|
"751:\tlearn: 0.2612931\ttest: 0.5339854\tbest: 0.5284413 (407)\n",
|
|
"752:\tlearn: 0.2610377\ttest: 0.5340478\tbest: 0.5284413 (407)\n",
|
|
"753:\tlearn: 0.2608895\ttest: 0.5340772\tbest: 0.5284413 (407)\n",
|
|
"754:\tlearn: 0.2606765\ttest: 0.5340761\tbest: 0.5284413 (407)\n",
|
|
"755:\tlearn: 0.2604671\ttest: 0.5341452\tbest: 0.5284413 (407)\n",
|
|
"756:\tlearn: 0.2601966\ttest: 0.5342443\tbest: 0.5284413 (407)\n",
|
|
"757:\tlearn: 0.2600286\ttest: 0.5342938\tbest: 0.5284413 (407)\n",
|
|
"758:\tlearn: 0.2598788\ttest: 0.5343269\tbest: 0.5284413 (407)\n",
|
|
"759:\tlearn: 0.2595449\ttest: 0.5344051\tbest: 0.5284413 (407)\n",
|
|
"760:\tlearn: 0.2593523\ttest: 0.5343241\tbest: 0.5284413 (407)\n",
|
|
"761:\tlearn: 0.2590717\ttest: 0.5341597\tbest: 0.5284413 (407)\n",
|
|
"762:\tlearn: 0.2587795\ttest: 0.5341929\tbest: 0.5284413 (407)\n",
|
|
"763:\tlearn: 0.2586000\ttest: 0.5343395\tbest: 0.5284413 (407)\n",
|
|
"764:\tlearn: 0.2584977\ttest: 0.5343982\tbest: 0.5284413 (407)\n",
|
|
"765:\tlearn: 0.2583917\ttest: 0.5345143\tbest: 0.5284413 (407)\n",
|
|
"766:\tlearn: 0.2581585\ttest: 0.5344778\tbest: 0.5284413 (407)\n",
|
|
"767:\tlearn: 0.2580127\ttest: 0.5344497\tbest: 0.5284413 (407)\n",
|
|
"768:\tlearn: 0.2578787\ttest: 0.5344784\tbest: 0.5284413 (407)\n",
|
|
"769:\tlearn: 0.2576645\ttest: 0.5346454\tbest: 0.5284413 (407)\n",
|
|
"770:\tlearn: 0.2575304\ttest: 0.5347660\tbest: 0.5284413 (407)\n",
|
|
"771:\tlearn: 0.2573188\ttest: 0.5347168\tbest: 0.5284413 (407)\n",
|
|
"772:\tlearn: 0.2571079\ttest: 0.5347934\tbest: 0.5284413 (407)\n",
|
|
"773:\tlearn: 0.2569208\ttest: 0.5347818\tbest: 0.5284413 (407)\n",
|
|
"774:\tlearn: 0.2568383\ttest: 0.5348566\tbest: 0.5284413 (407)\n",
|
|
"775:\tlearn: 0.2566105\ttest: 0.5348649\tbest: 0.5284413 (407)\n",
|
|
"776:\tlearn: 0.2565202\ttest: 0.5348128\tbest: 0.5284413 (407)\n",
|
|
"777:\tlearn: 0.2563744\ttest: 0.5348015\tbest: 0.5284413 (407)\n",
|
|
"778:\tlearn: 0.2559938\ttest: 0.5348286\tbest: 0.5284413 (407)\n",
|
|
"779:\tlearn: 0.2557637\ttest: 0.5348333\tbest: 0.5284413 (407)\n",
|
|
"780:\tlearn: 0.2555227\ttest: 0.5348821\tbest: 0.5284413 (407)\n",
|
|
"781:\tlearn: 0.2552230\ttest: 0.5348644\tbest: 0.5284413 (407)\n",
|
|
"782:\tlearn: 0.2549489\ttest: 0.5350013\tbest: 0.5284413 (407)\n",
|
|
"783:\tlearn: 0.2547981\ttest: 0.5350367\tbest: 0.5284413 (407)\n",
|
|
"784:\tlearn: 0.2545295\ttest: 0.5350505\tbest: 0.5284413 (407)\n",
|
|
"785:\tlearn: 0.2542704\ttest: 0.5350239\tbest: 0.5284413 (407)\n",
|
|
"786:\tlearn: 0.2540247\ttest: 0.5350349\tbest: 0.5284413 (407)\n",
|
|
"787:\tlearn: 0.2538591\ttest: 0.5350755\tbest: 0.5284413 (407)\n",
|
|
"788:\tlearn: 0.2536334\ttest: 0.5350197\tbest: 0.5284413 (407)\n",
|
|
"789:\tlearn: 0.2535279\ttest: 0.5350294\tbest: 0.5284413 (407)\n",
|
|
"790:\tlearn: 0.2533618\ttest: 0.5350131\tbest: 0.5284413 (407)\n",
|
|
"791:\tlearn: 0.2530337\ttest: 0.5349947\tbest: 0.5284413 (407)\n",
|
|
"792:\tlearn: 0.2528074\ttest: 0.5351886\tbest: 0.5284413 (407)\n",
|
|
"793:\tlearn: 0.2526388\ttest: 0.5352726\tbest: 0.5284413 (407)\n",
|
|
"794:\tlearn: 0.2522900\ttest: 0.5355259\tbest: 0.5284413 (407)\n",
|
|
"795:\tlearn: 0.2519829\ttest: 0.5357924\tbest: 0.5284413 (407)\n",
|
|
"796:\tlearn: 0.2517555\ttest: 0.5357210\tbest: 0.5284413 (407)\n",
|
|
"797:\tlearn: 0.2513971\ttest: 0.5357829\tbest: 0.5284413 (407)\n",
|
|
"798:\tlearn: 0.2512777\ttest: 0.5356881\tbest: 0.5284413 (407)\n",
|
|
"799:\tlearn: 0.2510551\ttest: 0.5357757\tbest: 0.5284413 (407)\n",
|
|
"800:\tlearn: 0.2507499\ttest: 0.5358744\tbest: 0.5284413 (407)\n",
|
|
"801:\tlearn: 0.2505471\ttest: 0.5358844\tbest: 0.5284413 (407)\n",
|
|
"802:\tlearn: 0.2502460\ttest: 0.5358115\tbest: 0.5284413 (407)\n",
|
|
"803:\tlearn: 0.2500620\ttest: 0.5359086\tbest: 0.5284413 (407)\n",
|
|
"804:\tlearn: 0.2499251\ttest: 0.5360298\tbest: 0.5284413 (407)\n",
|
|
"805:\tlearn: 0.2497872\ttest: 0.5359613\tbest: 0.5284413 (407)\n",
|
|
"806:\tlearn: 0.2496063\ttest: 0.5360141\tbest: 0.5284413 (407)\n",
|
|
"807:\tlearn: 0.2494985\ttest: 0.5360289\tbest: 0.5284413 (407)\n",
|
|
"808:\tlearn: 0.2493590\ttest: 0.5359380\tbest: 0.5284413 (407)\n",
|
|
"809:\tlearn: 0.2492236\ttest: 0.5358691\tbest: 0.5284413 (407)\n",
|
|
"810:\tlearn: 0.2489765\ttest: 0.5358442\tbest: 0.5284413 (407)\n",
|
|
"811:\tlearn: 0.2488102\ttest: 0.5358781\tbest: 0.5284413 (407)\n",
|
|
"812:\tlearn: 0.2485284\ttest: 0.5359271\tbest: 0.5284413 (407)\n",
|
|
"813:\tlearn: 0.2482373\ttest: 0.5359670\tbest: 0.5284413 (407)\n",
|
|
"814:\tlearn: 0.2480746\ttest: 0.5360794\tbest: 0.5284413 (407)\n",
|
|
"815:\tlearn: 0.2478944\ttest: 0.5361656\tbest: 0.5284413 (407)\n",
|
|
"816:\tlearn: 0.2476788\ttest: 0.5361991\tbest: 0.5284413 (407)\n",
|
|
"817:\tlearn: 0.2474910\ttest: 0.5361178\tbest: 0.5284413 (407)\n",
|
|
"818:\tlearn: 0.2472560\ttest: 0.5361128\tbest: 0.5284413 (407)\n",
|
|
"819:\tlearn: 0.2470127\ttest: 0.5361421\tbest: 0.5284413 (407)\n",
|
|
"820:\tlearn: 0.2467190\ttest: 0.5361095\tbest: 0.5284413 (407)\n",
|
|
"821:\tlearn: 0.2464512\ttest: 0.5362024\tbest: 0.5284413 (407)\n",
|
|
"822:\tlearn: 0.2462936\ttest: 0.5362134\tbest: 0.5284413 (407)\n",
|
|
"823:\tlearn: 0.2460582\ttest: 0.5363505\tbest: 0.5284413 (407)\n",
|
|
"824:\tlearn: 0.2457723\ttest: 0.5363388\tbest: 0.5284413 (407)\n",
|
|
"825:\tlearn: 0.2455268\ttest: 0.5363955\tbest: 0.5284413 (407)\n",
|
|
"826:\tlearn: 0.2453867\ttest: 0.5363481\tbest: 0.5284413 (407)\n",
|
|
"827:\tlearn: 0.2451900\ttest: 0.5362972\tbest: 0.5284413 (407)\n",
|
|
"828:\tlearn: 0.2448671\ttest: 0.5363963\tbest: 0.5284413 (407)\n",
|
|
"829:\tlearn: 0.2446707\ttest: 0.5364143\tbest: 0.5284413 (407)\n",
|
|
"830:\tlearn: 0.2444973\ttest: 0.5364759\tbest: 0.5284413 (407)\n",
|
|
"831:\tlearn: 0.2442825\ttest: 0.5364910\tbest: 0.5284413 (407)\n",
|
|
"832:\tlearn: 0.2441510\ttest: 0.5364347\tbest: 0.5284413 (407)\n",
|
|
"833:\tlearn: 0.2437815\ttest: 0.5364969\tbest: 0.5284413 (407)\n",
|
|
"834:\tlearn: 0.2436322\ttest: 0.5365062\tbest: 0.5284413 (407)\n",
|
|
"835:\tlearn: 0.2433728\ttest: 0.5365412\tbest: 0.5284413 (407)\n",
|
|
"836:\tlearn: 0.2432677\ttest: 0.5366261\tbest: 0.5284413 (407)\n",
|
|
"837:\tlearn: 0.2430425\ttest: 0.5366255\tbest: 0.5284413 (407)\n",
|
|
"838:\tlearn: 0.2428768\ttest: 0.5367406\tbest: 0.5284413 (407)\n",
|
|
"839:\tlearn: 0.2427409\ttest: 0.5366869\tbest: 0.5284413 (407)\n",
|
|
"840:\tlearn: 0.2426320\ttest: 0.5367385\tbest: 0.5284413 (407)\n",
|
|
"841:\tlearn: 0.2422021\ttest: 0.5366931\tbest: 0.5284413 (407)\n",
|
|
"842:\tlearn: 0.2420724\ttest: 0.5367111\tbest: 0.5284413 (407)\n",
|
|
"843:\tlearn: 0.2419155\ttest: 0.5367018\tbest: 0.5284413 (407)\n",
|
|
"844:\tlearn: 0.2417259\ttest: 0.5367388\tbest: 0.5284413 (407)\n",
|
|
"845:\tlearn: 0.2415638\ttest: 0.5367892\tbest: 0.5284413 (407)\n",
|
|
"846:\tlearn: 0.2412761\ttest: 0.5368266\tbest: 0.5284413 (407)\n",
|
|
"847:\tlearn: 0.2409359\ttest: 0.5368151\tbest: 0.5284413 (407)\n",
|
|
"848:\tlearn: 0.2407502\ttest: 0.5368573\tbest: 0.5284413 (407)\n",
|
|
"849:\tlearn: 0.2405990\ttest: 0.5369029\tbest: 0.5284413 (407)\n",
|
|
"850:\tlearn: 0.2404686\ttest: 0.5369997\tbest: 0.5284413 (407)\n",
|
|
"851:\tlearn: 0.2402277\ttest: 0.5369648\tbest: 0.5284413 (407)\n",
|
|
"852:\tlearn: 0.2400954\ttest: 0.5370236\tbest: 0.5284413 (407)\n",
|
|
"853:\tlearn: 0.2398868\ttest: 0.5370553\tbest: 0.5284413 (407)\n",
|
|
"854:\tlearn: 0.2395511\ttest: 0.5371623\tbest: 0.5284413 (407)\n",
|
|
"855:\tlearn: 0.2393453\ttest: 0.5372499\tbest: 0.5284413 (407)\n",
|
|
"856:\tlearn: 0.2390805\ttest: 0.5373446\tbest: 0.5284413 (407)\n",
|
|
"857:\tlearn: 0.2385824\ttest: 0.5376654\tbest: 0.5284413 (407)\n",
|
|
"858:\tlearn: 0.2384229\ttest: 0.5377392\tbest: 0.5284413 (407)\n",
|
|
"859:\tlearn: 0.2381896\ttest: 0.5379027\tbest: 0.5284413 (407)\n",
|
|
"860:\tlearn: 0.2378460\ttest: 0.5381212\tbest: 0.5284413 (407)\n",
|
|
"861:\tlearn: 0.2376353\ttest: 0.5381566\tbest: 0.5284413 (407)\n",
|
|
"862:\tlearn: 0.2374153\ttest: 0.5382001\tbest: 0.5284413 (407)\n",
|
|
"863:\tlearn: 0.2372235\ttest: 0.5382083\tbest: 0.5284413 (407)\n",
|
|
"864:\tlearn: 0.2369141\ttest: 0.5381939\tbest: 0.5284413 (407)\n",
|
|
"865:\tlearn: 0.2367663\ttest: 0.5381753\tbest: 0.5284413 (407)\n",
|
|
"866:\tlearn: 0.2365620\ttest: 0.5383035\tbest: 0.5284413 (407)\n",
|
|
"867:\tlearn: 0.2363998\ttest: 0.5382624\tbest: 0.5284413 (407)\n",
|
|
"868:\tlearn: 0.2362116\ttest: 0.5383151\tbest: 0.5284413 (407)\n",
|
|
"869:\tlearn: 0.2360289\ttest: 0.5383251\tbest: 0.5284413 (407)\n",
|
|
"870:\tlearn: 0.2356755\ttest: 0.5383835\tbest: 0.5284413 (407)\n",
|
|
"871:\tlearn: 0.2354830\ttest: 0.5383029\tbest: 0.5284413 (407)\n",
|
|
"872:\tlearn: 0.2352972\ttest: 0.5384125\tbest: 0.5284413 (407)\n",
|
|
"873:\tlearn: 0.2350675\ttest: 0.5383443\tbest: 0.5284413 (407)\n",
|
|
"874:\tlearn: 0.2349259\ttest: 0.5382278\tbest: 0.5284413 (407)\n",
|
|
"875:\tlearn: 0.2347221\ttest: 0.5382126\tbest: 0.5284413 (407)\n",
|
|
"876:\tlearn: 0.2345940\ttest: 0.5381175\tbest: 0.5284413 (407)\n",
|
|
"877:\tlearn: 0.2343176\ttest: 0.5383328\tbest: 0.5284413 (407)\n",
|
|
"878:\tlearn: 0.2341636\ttest: 0.5384026\tbest: 0.5284413 (407)\n",
|
|
"879:\tlearn: 0.2338766\ttest: 0.5384387\tbest: 0.5284413 (407)\n",
|
|
"880:\tlearn: 0.2336869\ttest: 0.5383876\tbest: 0.5284413 (407)\n",
|
|
"881:\tlearn: 0.2335037\ttest: 0.5384215\tbest: 0.5284413 (407)\n",
|
|
"882:\tlearn: 0.2333272\ttest: 0.5384477\tbest: 0.5284413 (407)\n",
|
|
"883:\tlearn: 0.2330960\ttest: 0.5383754\tbest: 0.5284413 (407)\n",
|
|
"884:\tlearn: 0.2329472\ttest: 0.5384907\tbest: 0.5284413 (407)\n",
|
|
"885:\tlearn: 0.2326997\ttest: 0.5384944\tbest: 0.5284413 (407)\n",
|
|
"886:\tlearn: 0.2325376\ttest: 0.5385190\tbest: 0.5284413 (407)\n",
|
|
"887:\tlearn: 0.2323114\ttest: 0.5387267\tbest: 0.5284413 (407)\n",
|
|
"888:\tlearn: 0.2321317\ttest: 0.5386419\tbest: 0.5284413 (407)\n",
|
|
"889:\tlearn: 0.2319826\ttest: 0.5386109\tbest: 0.5284413 (407)\n",
|
|
"890:\tlearn: 0.2318089\ttest: 0.5387264\tbest: 0.5284413 (407)\n",
|
|
"891:\tlearn: 0.2316643\ttest: 0.5388157\tbest: 0.5284413 (407)\n",
|
|
"892:\tlearn: 0.2314150\ttest: 0.5389181\tbest: 0.5284413 (407)\n",
|
|
"893:\tlearn: 0.2312488\ttest: 0.5389579\tbest: 0.5284413 (407)\n",
|
|
"894:\tlearn: 0.2310809\ttest: 0.5389711\tbest: 0.5284413 (407)\n",
|
|
"895:\tlearn: 0.2309195\ttest: 0.5388986\tbest: 0.5284413 (407)\n",
|
|
"896:\tlearn: 0.2307325\ttest: 0.5388702\tbest: 0.5284413 (407)\n",
|
|
"897:\tlearn: 0.2304809\ttest: 0.5388262\tbest: 0.5284413 (407)\n",
|
|
"898:\tlearn: 0.2302789\ttest: 0.5387933\tbest: 0.5284413 (407)\n",
|
|
"899:\tlearn: 0.2301143\ttest: 0.5387280\tbest: 0.5284413 (407)\n",
|
|
"900:\tlearn: 0.2300652\ttest: 0.5387681\tbest: 0.5284413 (407)\n",
|
|
"901:\tlearn: 0.2297435\ttest: 0.5390689\tbest: 0.5284413 (407)\n",
|
|
"902:\tlearn: 0.2295438\ttest: 0.5389988\tbest: 0.5284413 (407)\n",
|
|
"903:\tlearn: 0.2293540\ttest: 0.5390436\tbest: 0.5284413 (407)\n",
|
|
"904:\tlearn: 0.2292083\ttest: 0.5391064\tbest: 0.5284413 (407)\n",
|
|
"905:\tlearn: 0.2289542\ttest: 0.5391454\tbest: 0.5284413 (407)\n",
|
|
"906:\tlearn: 0.2287444\ttest: 0.5391673\tbest: 0.5284413 (407)\n",
|
|
"907:\tlearn: 0.2286757\ttest: 0.5391851\tbest: 0.5284413 (407)\n",
|
|
"908:\tlearn: 0.2284347\ttest: 0.5392298\tbest: 0.5284413 (407)\n",
|
|
"909:\tlearn: 0.2281884\ttest: 0.5392618\tbest: 0.5284413 (407)\n",
|
|
"910:\tlearn: 0.2280401\ttest: 0.5392953\tbest: 0.5284413 (407)\n",
|
|
"911:\tlearn: 0.2278006\ttest: 0.5394256\tbest: 0.5284413 (407)\n",
|
|
"912:\tlearn: 0.2276965\ttest: 0.5393747\tbest: 0.5284413 (407)\n",
|
|
"913:\tlearn: 0.2274208\ttest: 0.5394403\tbest: 0.5284413 (407)\n",
|
|
"914:\tlearn: 0.2271713\ttest: 0.5395029\tbest: 0.5284413 (407)\n",
|
|
"915:\tlearn: 0.2270583\ttest: 0.5395331\tbest: 0.5284413 (407)\n",
|
|
"916:\tlearn: 0.2269617\ttest: 0.5396202\tbest: 0.5284413 (407)\n",
|
|
"917:\tlearn: 0.2267387\ttest: 0.5395958\tbest: 0.5284413 (407)\n",
|
|
"918:\tlearn: 0.2264758\ttest: 0.5396062\tbest: 0.5284413 (407)\n",
|
|
"919:\tlearn: 0.2263093\ttest: 0.5398142\tbest: 0.5284413 (407)\n",
|
|
"920:\tlearn: 0.2260671\ttest: 0.5399365\tbest: 0.5284413 (407)\n",
|
|
"921:\tlearn: 0.2258219\ttest: 0.5399597\tbest: 0.5284413 (407)\n",
|
|
"922:\tlearn: 0.2256814\ttest: 0.5399695\tbest: 0.5284413 (407)\n",
|
|
"923:\tlearn: 0.2255226\ttest: 0.5400531\tbest: 0.5284413 (407)\n",
|
|
"924:\tlearn: 0.2252081\ttest: 0.5399987\tbest: 0.5284413 (407)\n",
|
|
"925:\tlearn: 0.2250404\ttest: 0.5400720\tbest: 0.5284413 (407)\n",
|
|
"926:\tlearn: 0.2248620\ttest: 0.5401453\tbest: 0.5284413 (407)\n",
|
|
"927:\tlearn: 0.2247027\ttest: 0.5402188\tbest: 0.5284413 (407)\n",
|
|
"928:\tlearn: 0.2244520\ttest: 0.5404223\tbest: 0.5284413 (407)\n",
|
|
"929:\tlearn: 0.2242601\ttest: 0.5405280\tbest: 0.5284413 (407)\n",
|
|
"930:\tlearn: 0.2241129\ttest: 0.5406682\tbest: 0.5284413 (407)\n",
|
|
"931:\tlearn: 0.2239818\ttest: 0.5407011\tbest: 0.5284413 (407)\n",
|
|
"932:\tlearn: 0.2238642\ttest: 0.5407202\tbest: 0.5284413 (407)\n",
|
|
"933:\tlearn: 0.2237309\ttest: 0.5407164\tbest: 0.5284413 (407)\n",
|
|
"934:\tlearn: 0.2235734\ttest: 0.5406891\tbest: 0.5284413 (407)\n",
|
|
"935:\tlearn: 0.2233808\ttest: 0.5405574\tbest: 0.5284413 (407)\n",
|
|
"936:\tlearn: 0.2231164\ttest: 0.5405893\tbest: 0.5284413 (407)\n",
|
|
"937:\tlearn: 0.2228965\ttest: 0.5407001\tbest: 0.5284413 (407)\n",
|
|
"938:\tlearn: 0.2227105\ttest: 0.5407695\tbest: 0.5284413 (407)\n",
|
|
"939:\tlearn: 0.2225239\ttest: 0.5408384\tbest: 0.5284413 (407)\n",
|
|
"940:\tlearn: 0.2223964\ttest: 0.5408741\tbest: 0.5284413 (407)\n",
|
|
"941:\tlearn: 0.2222624\ttest: 0.5409626\tbest: 0.5284413 (407)\n",
|
|
"942:\tlearn: 0.2221404\ttest: 0.5410042\tbest: 0.5284413 (407)\n",
|
|
"943:\tlearn: 0.2219551\ttest: 0.5409731\tbest: 0.5284413 (407)\n",
|
|
"944:\tlearn: 0.2217620\ttest: 0.5411054\tbest: 0.5284413 (407)\n",
|
|
"945:\tlearn: 0.2215633\ttest: 0.5412215\tbest: 0.5284413 (407)\n",
|
|
"946:\tlearn: 0.2213799\ttest: 0.5412869\tbest: 0.5284413 (407)\n",
|
|
"947:\tlearn: 0.2212568\ttest: 0.5413734\tbest: 0.5284413 (407)\n",
|
|
"948:\tlearn: 0.2211081\ttest: 0.5414374\tbest: 0.5284413 (407)\n",
|
|
"949:\tlearn: 0.2209169\ttest: 0.5415640\tbest: 0.5284413 (407)\n",
|
|
"950:\tlearn: 0.2207088\ttest: 0.5416315\tbest: 0.5284413 (407)\n",
|
|
"951:\tlearn: 0.2205394\ttest: 0.5415092\tbest: 0.5284413 (407)\n",
|
|
"952:\tlearn: 0.2202701\ttest: 0.5416335\tbest: 0.5284413 (407)\n",
|
|
"953:\tlearn: 0.2201676\ttest: 0.5416529\tbest: 0.5284413 (407)\n",
|
|
"954:\tlearn: 0.2199637\ttest: 0.5418349\tbest: 0.5284413 (407)\n",
|
|
"955:\tlearn: 0.2197179\ttest: 0.5419055\tbest: 0.5284413 (407)\n",
|
|
"956:\tlearn: 0.2195948\ttest: 0.5420314\tbest: 0.5284413 (407)\n",
|
|
"957:\tlearn: 0.2193385\ttest: 0.5420910\tbest: 0.5284413 (407)\n",
|
|
"958:\tlearn: 0.2191848\ttest: 0.5421513\tbest: 0.5284413 (407)\n",
|
|
"959:\tlearn: 0.2190149\ttest: 0.5420688\tbest: 0.5284413 (407)\n",
|
|
"960:\tlearn: 0.2188873\ttest: 0.5420404\tbest: 0.5284413 (407)\n",
|
|
"961:\tlearn: 0.2186395\ttest: 0.5420745\tbest: 0.5284413 (407)\n",
|
|
"962:\tlearn: 0.2185067\ttest: 0.5420601\tbest: 0.5284413 (407)\n",
|
|
"963:\tlearn: 0.2183354\ttest: 0.5420368\tbest: 0.5284413 (407)\n",
|
|
"964:\tlearn: 0.2180572\ttest: 0.5421382\tbest: 0.5284413 (407)\n",
|
|
"965:\tlearn: 0.2179154\ttest: 0.5422050\tbest: 0.5284413 (407)\n",
|
|
"966:\tlearn: 0.2177509\ttest: 0.5420858\tbest: 0.5284413 (407)\n",
|
|
"967:\tlearn: 0.2175239\ttest: 0.5422466\tbest: 0.5284413 (407)\n",
|
|
"968:\tlearn: 0.2172204\ttest: 0.5424453\tbest: 0.5284413 (407)\n",
|
|
"969:\tlearn: 0.2169659\ttest: 0.5426501\tbest: 0.5284413 (407)\n",
|
|
"970:\tlearn: 0.2168011\ttest: 0.5426145\tbest: 0.5284413 (407)\n",
|
|
"971:\tlearn: 0.2166712\ttest: 0.5426525\tbest: 0.5284413 (407)\n",
|
|
"972:\tlearn: 0.2163855\ttest: 0.5426135\tbest: 0.5284413 (407)\n",
|
|
"973:\tlearn: 0.2162989\ttest: 0.5426711\tbest: 0.5284413 (407)\n",
|
|
"974:\tlearn: 0.2159569\ttest: 0.5428127\tbest: 0.5284413 (407)\n",
|
|
"975:\tlearn: 0.2158102\ttest: 0.5429047\tbest: 0.5284413 (407)\n",
|
|
"976:\tlearn: 0.2155583\ttest: 0.5429102\tbest: 0.5284413 (407)\n",
|
|
"977:\tlearn: 0.2153716\ttest: 0.5429793\tbest: 0.5284413 (407)\n",
|
|
"978:\tlearn: 0.2152466\ttest: 0.5430432\tbest: 0.5284413 (407)\n",
|
|
"979:\tlearn: 0.2151898\ttest: 0.5430589\tbest: 0.5284413 (407)\n",
|
|
"980:\tlearn: 0.2150049\ttest: 0.5432127\tbest: 0.5284413 (407)\n",
|
|
"981:\tlearn: 0.2148898\ttest: 0.5432512\tbest: 0.5284413 (407)\n",
|
|
"982:\tlearn: 0.2146746\ttest: 0.5433025\tbest: 0.5284413 (407)\n",
|
|
"983:\tlearn: 0.2145431\ttest: 0.5433370\tbest: 0.5284413 (407)\n",
|
|
"984:\tlearn: 0.2144226\ttest: 0.5433868\tbest: 0.5284413 (407)\n",
|
|
"985:\tlearn: 0.2141219\ttest: 0.5433859\tbest: 0.5284413 (407)\n",
|
|
"986:\tlearn: 0.2140476\ttest: 0.5433190\tbest: 0.5284413 (407)\n",
|
|
"987:\tlearn: 0.2138147\ttest: 0.5433865\tbest: 0.5284413 (407)\n",
|
|
"988:\tlearn: 0.2136911\ttest: 0.5434854\tbest: 0.5284413 (407)\n",
|
|
"989:\tlearn: 0.2135201\ttest: 0.5435857\tbest: 0.5284413 (407)\n",
|
|
"990:\tlearn: 0.2132926\ttest: 0.5435964\tbest: 0.5284413 (407)\n",
|
|
"991:\tlearn: 0.2131544\ttest: 0.5436714\tbest: 0.5284413 (407)\n",
|
|
"992:\tlearn: 0.2129558\ttest: 0.5436935\tbest: 0.5284413 (407)\n",
|
|
"993:\tlearn: 0.2128108\ttest: 0.5436276\tbest: 0.5284413 (407)\n",
|
|
"994:\tlearn: 0.2126313\ttest: 0.5436708\tbest: 0.5284413 (407)\n",
|
|
"995:\tlearn: 0.2125365\ttest: 0.5436865\tbest: 0.5284413 (407)\n",
|
|
"996:\tlearn: 0.2124506\ttest: 0.5436623\tbest: 0.5284413 (407)\n",
|
|
"997:\tlearn: 0.2122978\ttest: 0.5435550\tbest: 0.5284413 (407)\n",
|
|
"998:\tlearn: 0.2120954\ttest: 0.5436704\tbest: 0.5284413 (407)\n",
|
|
"999:\tlearn: 0.2119329\ttest: 0.5436963\tbest: 0.5284413 (407)\ttotal: 3m 44s\tremaining: 0us\n",
|
|
"Best validation accuracy score: 0.72±0.01 on step 561\n",
|
|
"Precise validation accuracy score: 0.720874025845911\n"
|
|
],
|
|
"name": "stdout"
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py:52: FutureWarning: 'argmax' is deprecated. Use 'idxmax' instead. The behavior of 'argmax' will be corrected to return the positional maximum in the future. Use 'series.values.argmax' to get the position of the maximum now.\n",
|
|
" return getattr(obj, method)(*args, **kwds)\n"
|
|
],
|
|
"name": "stderr"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "f3En8DuIiEZV",
|
|
"colab_type": "code",
|
|
"colab": {}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# Get predictions\n",
|
|
"y_predict = model.predict(X_test)\n",
|
|
"\n",
|
|
"# Probability of malignant tissue produced by the model\n",
|
|
"y_prob = [probs[1] for probs in model.predict_proba(X_test)]"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "qUiUCvu_iO1v",
|
|
"colab_type": "code",
|
|
"outputId": "e9e4ede6-c680-48b9-e64c-f369f5bfbb97",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 129
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"#Accuracy on test set\n",
|
|
"print(\"Test accuracy: %s\"%(accuracy_score(y_test, y_predict).round(2)))\n",
|
|
"\n",
|
|
"# Confusion matrix test set\n",
|
|
"pd.DataFrame(\n",
|
|
" confusion_matrix(y_test, y_predict),\n",
|
|
" columns=['Predicted NO', 'Predicted YES'],\n",
|
|
" index=['Actual NO', 'Actual YES']\n",
|
|
")"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Test accuracy: 0.66\n"
|
|
],
|
|
"name": "stdout"
|
|
},
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>Predicted NO</th>\n",
|
|
" <th>Predicted YES</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>Actual NO</th>\n",
|
|
" <td>51</td>\n",
|
|
" <td>25</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Actual YES</th>\n",
|
|
" <td>14</td>\n",
|
|
" <td>26</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" Predicted NO Predicted YES\n",
|
|
"Actual NO 51 25\n",
|
|
"Actual YES 14 26"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"execution_count": 8
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "lUCK99fOiQmX",
|
|
"colab_type": "code",
|
|
"outputId": "34b3783e-951f-40c1-ca43-32daf0df42c8",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 512
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# Compute area under the curve\n",
|
|
"fpr, tpr, _ = roc_curve(y_test, y_prob)\n",
|
|
"roc_auc = auc(fpr, tpr)\n",
|
|
"\n",
|
|
"#Set default figure size\n",
|
|
"plt.rcParams['figure.figsize'] = (8,8)\n",
|
|
"\n",
|
|
"# Plot ROC curve\n",
|
|
"plt.figure()\n",
|
|
"lw = 2\n",
|
|
"plt.plot(fpr, tpr, color='darkorange',\n",
|
|
" lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)\n",
|
|
"plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
|
|
"plt.xlim([0.0, 1.0])\n",
|
|
"plt.ylim([0.0, 1.05])\n",
|
|
"plt.xlabel('False Positive Rate')\n",
|
|
"plt.ylabel('True Positive Rate')\n",
|
|
"plt.title(\"Title\")\n",
|
|
"plt.legend(loc=\"lower right\")\n",
|
|
"plt.show()"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAHvCAYAAACmMv3vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8zPfjB/DX5S5TEhK5GLFjJ7av\nFWrUqi1kEOFrttWhrRZVLYoUv6/WKK36okYiS6yYpaUUVapG7BUxsmSvS+7u8/sjdd+mFUeSz31u\nvJ6PRx91d/G5Vz7I696f8X7LBEEQQERERGbBSuoAREREVHFY7ERERGaExU5ERGRGWOxERERmhMVO\nRERkRljsREREZkQhdQAiMry5c+fi119/BQAkJCTA3d0dtra2AIBq1aphxowZ8PLyQmRkJPz9/QEA\nvXr1wtKlS9G+fXvJchORfix2Igs0f/583a9LK2yNRoOlS5fqip2ITAMPxRNRCb169cLZs2cxfvx4\nZGdno3///khISCjxNYcPH8bgwYPx6quvYsKECUhLS5MoLRH9HYudiJ4pJCQEcrkcBw4cQO3atXXP\nJyQkYMaMGVi2bBmOHDmCjh07Yt68edIFJaISeCieiF7Kzz//jA4dOqBx48YAgMDAQPj4+ECj0UAu\nl0ucjohY7ET0UrKzs3H27Fn0799f95yjoyMyMjJQtWpVCZMREcBiJ6KX5O7uji5dumDlypVSRyGi\nZ+A5diJ6Jmtra2i1WuTk5JR4vmvXrjh79qzugrqLFy9i4cKFUkQkomfgiJ2InkmpVKJdu3bo2bMn\n1q5dq3ve3d0dCxYswFtvvYWioiJUqlQJs2fPljApEf2VjOuxExERmQ8eiiciIjIjLHYiIiIzwmIn\nIiIyIyx2IiIiM8JiJyIiMiMmc7ubWq1Benqe1DHMmouLA/exAXA/i4/7WHzcx4ahVDq99O8xmRG7\nQsE5qMXGfWwY3M/i4z4WH/ex8TKZYiciIiL9WOxERERmhMVORERkRljsREREZoTFTkREZEZY7ERE\nRGaExU5ERGRGWOxERERmhMVORERkRljsREREZoTFTkREZEZY7ERERGaExU5ERGRGWOxERERmhMVO\nRERkRkQt9hs3bqB3797YunXrP147efIkRo4ciYCAAKxevVrMGERERBZDtGLPy8vDggUL0Llz52e+\nvnDhQqxatQrbtm3DL7/8glu3bokVhYiIyGKIVuw2NjZYt24d3N3d//FaQkICKleujBo1asDKygrd\nu3fHqVOnxIpCRERkUjQaLQRBKNPvVVRwlv9tWKGAQvHszaekpMDV1VX32NXVFQkJCWJFISIiM+F8\nZCRsHx6SOoao8gqt4b/FD53rJuCT/T+/9O8XrdjFoFQ6SR3B7HEfGwb3s/i4j8UnyT4281LPzLfF\n4A2jcfxuXZyOr4VPyrANSYrd3d0dqampusdJSUnPPGT/dykp2WLGsnhKpRP3sQFwP4uP+1h8Uu1j\n5Z//TxmbZfD3Fltyci4CA2Nw+W4KatRwRGTkuDJtR5Lb3WrVqoWcnBw8ePAAarUaP/30E3x8fKSI\nQkREZBTu3s3ArVtpaNCgCmJjA9GkSdUybUe0Efvly5exZMkSPHz4EAqFAgcPHkSvXr1Qq1Yt9OnT\nB/PmzcP06dMBAAMGDED9+vXFikJERGT0Onb0QGjocDRpUhXu7pXKvB2ZUNbL7iTAQ2vi4uFLw+B+\nFh/3sfgkOxS/2RmA+RyK/+OPRKSk5KFPnwbPfL0s1zGY1MVzRERE5uLEifsIDt4FtVqLfftGoUUL\n/deavQhOKUtERGRg+/bdwqhRO5CbW4SBAxuhadOynU9/FhY7ERGRAYWHx2HChD1QqTSYMKEV1qx5\nDdbW8grbPoudiIjIQL799hzeffcgtFoBH3zQEV980QtWVrIKfQ+eYyciItFZwoxx+jx6lI3Fi38B\nACxc2ANTprQV5X1Y7EREJLqKLHWVR98K25Yh1azphI0bhyA5OQ8BAc1Fex8WOxERGYy53Kb2ooqK\nNDh/PgkdOtQEAPTsWU/09+Q5diIiIhHk5RVh3LjdGD48Ej/9dM9g78sROxERUQXLzCzAmDG78Ouv\nD1G1qj1cXe0N9t4sdiIiogqUlFS8mEtcXApq1nREVNRINGrkqv83VhAWOxERUQWJj8+En1807t3L\nhKenC6KiRqBWLWeDZmCxExERVQCNRougoB24dy8TLVq4IzzcF0qlg8Fz8OI5IiKiCiCXW2Hp0lfR\ns2dd7NjhJ0mpAxyxExERlUtqah7c3IpLvEuX2ujcuRZksoqdTe5lsNiJiCxMRc0Cp6yALKZuz54b\neOedA1i7diD69fMEAElLHeCheCIiiyPV1K6mOmNcacLCLmPy5L3Iy1Pj1KkHUsfR4YidiMhClWcW\nOKXSCSkp2RWYxrSsXn0W8+f/DAD46KPO+PDDThIn+h8WOxER0QsSBAEhIb9gxYozAICQkJ6YNKmN\nxKlKYrETERG9oM8/P47Vq89CLpdh5cp+8PMTbzGXsuI5diIiohc0YEBDuLra4fvvhxhlqQMcsRMR\nET2XVivAyqr4Svd//asmzp6dBEdHG4lTlY4jdiIiolJkZBRg6NBI7N59Q/ecMZc6wBE7ERHRMyUl\n5cDfPwZXr6YiOTkX/ft7wsZGLnUsvVjsREREf3PvXgb8/LYjPj4TjRq5IjJyhEmUOsBiJyIiKuHq\n1VT4+29HUlIuWreuhm3bfFG1quHWUy8vFjsRUQWqqOlaSRpnzz7C6NE7kJGhgo9PLWzePBROTrZS\nx3opvHiOiKgCmUqpm9v0rhXF2loOtVpA//6e2LbN1+RKHeCInYhIFOWZrpWk06pVNezbF4iGDV2h\nUJjm2Nc0UxMREVWQLVsuIirqiu5x06ZuJlvqAEfsRERkwVauPIOFC09ALpehXbsaaNDARepI5cZi\nJyIiiyMIAhYsOI6vvz4LmQxYtKinWZQ6wGInIiILo9Fo8dFHh7F162UoFFb4+uv+8PVtKnWsCsNi\nJyIii6FSqTF16n7s2XMTdnZybNgwGL17N5A6VoVisRMRkcV4+DAbP/98H87Otti6dRg6dfKQOlKF\nY7ETEZHFaNDABWFhw2Fnp0CLFu5SxxEFi52I6Dk4k5zpS0zMwa+/PsTQoU0AFC+9as5Y7EREz1GW\nUuesbsbj7t0M+PlFIyEhC/b21ujb17zOpz8Li52I6AVwJjnTExeXgoCAGCQn56JNm2po166G1JEM\nwnSn1iEiIirFmTOPMGxYJJKTc9GtW21s3+5nUiu0lQeLnYiIzMqPP96Fn180MjNVGDCgIUJDh8PR\n0UbqWAbDYiciIrORn1+E9947hPx8NUaP9sJ//zsIdnaWddbZsr5bIiIya/b21tiyZRj27buFWbO6\nQCaTSR3J4FjsRERk0gRBwIULSWjdujqA4qVXW7WqJnEq6fBQPBERmSxBEDBv3s/o2zesxNKrlowj\ndiIiMklqtRYffvgDwsLioFBYwdpaLnUko8BiJ6IKY0yztCmlDkCiUqnUeOONfdi79xbs7RXYuHEw\nevWqL3Uso8BiJ6IKYyylXtE4k5xxyckpxLhxu3H8+H1Urly8mEvHjua3mEtZsdiJqMJJPUubUumE\nlJRsSTOQeKZO3Y/jx+9DqXRAZOQIeHnx+MxfsdiJiMikzJrVBY8eZeO77waiQQMXqeMYHRY7EREZ\nvawsFZydbQEAzZsr8cMPQRZ5j/qL4O1uRERk1C5dSkbnzhuxdesl3XMs9dKx2ImIyGidPv0Qw4dH\nISUlD7GxNyEIgtSRjB6LnYiIjNLhw3cQELAdWVkqDB7cCJs2DeFI/QWw2ImIyOhs334VY8fuRn6+\nGkFB3vjuu4GwteVlYS+CxU5EREYlPDwOU6fuh1qtxdtvt8eXX/aBXM66elH8+ENEREalXbsacHW1\nx5tvtsO773aQOo7JYbETWRhjmvaV6ClBEHTnzxs1csUvv/wbrq72EqcyTTy2QWRhxC51Tr9KL0ut\n1uLddw/iv/89r3uOpV52HLETWSipp30lAoCCAjWmTNmLAwduIzb2JoYObQKl0kHqWCaNxU5ERJLI\nzlZh3LjdOHEiAVWq2CI0dDhLvQKw2ImIyOCePMnHqFEx+OOPJFSrVgmRkSPQrJmb1LHMAoudiIgM\n6uHDbPj7b8fNm2moW7cyoqJGoF69KlLHMhssdiIiMqjCQg0yM1Vo1swNkZG+qFbNUepIZoXFTkRE\nBlW/fhXExIyEu3slVKliJ3Ucs8Pb3YiISHSnTj3AunW/6x43blyVpS4SjtiJiEhUhw7dwaRJe1BQ\noEHjxlXRvXtdqSOZNRY7kcieNdObUqIsRIYWHX0V77xzABqNgODgFujatbbUkcweD8UTicwYp2/l\n7HBkCOvXn8fUqfuh0QiYNq0D/vOf3lzMxQA4YicykKczvSmVTkhJyZY4DZF4BEHAsmWnsXTpKQDA\n3Lmv4K232kucynKw2ImIqEJlZBRg69ZLsLKSYdmy3ggKaiF1JIvCYiciogrl4mKPqKiRuHHjCQYO\nbCR1HIvDkx1ERFRu+flF2LXruu5xo0auLHWJcMRORETlkp2tQnDwLpw8+QCZmSqMHdtS6kgWjcVO\nRERllpqah8DAGFy8mIzq1SuhQ4eaUkeyeKIWe0hICC5cuACZTIbZs2ejZcv/fYoLDQ3F7t27YWVl\nBW9vb3zyySdiRiEiogr24EEW/P2349atdNSvXwVRUSNQp05lqWNZPNGK/cyZM4iPj0dERARu376N\n2bNnIyIiAgCQk5OD9evX49ChQ1AoFJgwYQL++OMPtG7dWqw4RERUga5dS8WgQeF49CgHXl5KRET4\nwt29ktSxCCJePHfq1Cn07t0bAODp6YnMzEzk5OQAAKytrWFtbY28vDyo1Wrk5+ejcmV+yiMiMgWC\nIODf/96JR49y0KFDTezc6cdSNyKijdhTU1Ph5eWle+zq6oqUlBQ4OjrC1tYWb731Fnr37g1bW1sM\nHDgQ9evX17tNpdJJrLj0J+5j8fx133I/i4/7WFyhob5YuPA4Vq8eAAcHa6nj0F8Y7OI5QRB0v87J\nycHatWtx4MABODo6Yty4cbh27RqaNm363G1wti5xcUY0cTydF/7pvuV+Fh/3sThu3HiCxo2rAgA8\nPV2xdGkv5OYWIDe3QOJk5qssH1BFOxTv7u6O1NRU3ePk5GQolcU/4m7fvo3atWvD1dUVNjY2aN++\nPS5fvixWFCIiKqeIiCvo3n0zVq8+K3UU0kO0Yvfx8cHBgwcBAHFxcXB3d4ejoyMAwMPDA7dv30ZB\nQfGnvMuXL6NevXpiRSEionL47rvfdSu0ZWerpI5Deoh2KL5t27bw8vJCYGAgZDIZ5s6di5iYGDg5\nOaFPnz6YOHEixo4dC7lcjjZt2qB9ey4QQERkTARBwJIlJ/Hll78CAD7/vDveeKOdxKlIH5nw15Pf\nRo7nzMTF85LiUG52BsDV3QyJ+7j8tFoBs2f/iA0bLsDKSobly/siMPB/F0RzHxtGWc6xc+Y5IiL6\nh5CQE9iw4QJsbOT47ruBGDCgodSR6AVxERgiIvqHceNaoXFjV2zbNpylbmI4YiciIgDFK7TZ2Skg\nk8lQu7Yzjh0bC7mc4z9Twz8xIiJCcnIuBg4M110oB4ClbqI4YieqQM5HRsL24SGpYxC9lISELPj5\nRePOnQzk56vx+utt4ehoI3UsKiN+HCOqQKWVusqjr4GTEL2Y69efYNCgcNy5kwFvbyV27w5gqZs4\njtiJRPD01jYiY/b7748xevQOpKUVoFMnD2zdOgzOzrZSx6Jy4oidiMgCnT79ECNGRCMtrQB9+tRH\nRIQvS91McMRORGSB6tWrjKpV7dGvnydWreoHa2u51JGogrDYiYgsUPXqjti7dxSUSgdYWcmkjkMV\niIfiiYgsxDffnENIyAnd42rVKrHUzRBH7EREZk4QBCxefBJffVV8j/qgQY3QsmU1iVORWFjsRERm\nTKPRYtasH7Fp00XI5TIsX96PpW7mWOxERGaqsFCDt98+gJ07r8PWVo516wahf39PqWORyFjsRGXA\nGebI2OXlFWHixD04cuQeHB1tsGXLUPj41JY6FhkAi52oDJ5X6pxljoxBXl4R7t3LRNWq9ggP90Wr\nVjz8bilY7ETlwBnmyFi5uTkgKmoE8vPVaNTIVeo4ZEC83Y2IyEzEx2di5cozEAQBAFCrljNL3QJx\nxE5EZAauXk2Fv/92JCXlwsXFDsHBLaWORBJhsRMRmbizZx9h9OgdyMhQoUuXWhg2rInUkUhCPBRP\nRGTCjh2Lx8iR25GRoUK/fg2wbdtwODlxMRdLxmInIjJRe/bcQFDQTuTlFcHPrxk2bBgMe3trqWOR\nxFjsREQmSK3WYtmy0ygs1GDy5DZYtao/V2gjADzHTkRkkhQKK2zbNhx79tzE5MltIJNxMRcqxhE7\nEZGJEAQB+/bd0t3OVqOGE6ZMactSpxI4YieLwqlgyVRpNFrMmHEEW7ZcwgcfdMSsWT5SRyIjxWIn\ni1KRpc6pY8lQCgs1mDp1P3bvvgE7Oznatq0hdSQyYix2skicCpZMRW5uEcaP342jR+Ph5GSDrVuH\noXPnWlLHIiPGYiciMlLp6fkICtqJs2cfw83NHhERI9CihbvUscjIsdiJiIzU7Nk/4ezZx6hVywlR\nUSPh6ekidSQyASx2IiIjNX9+d+TmFmHx4l6oWdNJ6jhkIni7GxGREXnwIAtabfHtbO7ulbB581CW\nOr0UFjsRkZH47bdH6NVrC+bOPaa7V53oZbHYiYiMwE8/3YOfXzQyMlSIj8+EWq2VOhKZKBY7EZHE\ndu++gTFjdiIvT43AQC9s2DCY875TmbHYiYgktGXLRUyeHIuiIi1ef70tli/vC4WCP5qp7HhVPBGR\nRCIjr2D69MMAgI8/9sF773XgvO9Ubix2IiKJ9O5dH82aueHf/26F8eNbSR2HzASLnYjIgDSa4ovi\n5HIruLra44cfgmBjw/PpVHF4IoeIyEBUKjUmT96LWbN+1N3OxlKnisZiJyIygJycQgQF7URs7E3E\nxFzD/ftciIjEwUPxREQiS0/Px+jRO3DuXCLc3BwQEeGLunUrSx2LzBSLnYhIRImJOfD3345r156g\ndm1nREWNQIMGXMyFxMNiJyISyf37mfD1jcL9+1lo0qQqIiN9UaMG530ncbHYiYhEUqWKHZydbdG2\nbXWEhQ2Hq6u91JHIArDYiYhE4uxsi4iIEbC3V8DR0UbqOGQheFU8EVEF+vHHu5gx44hu6VWl0oGl\nTgbFETsRUQXZseMa3nrrANRqLXx8amHo0CZSRyILxBE7EVEF+P77C3jjjX1Qq7WYOrUdhgxpLHUk\nslAcsRMRlYMgCFix4gxCQn4BAMyZ0xXvvPMvLuZCkmGxExGVkSAImDv3Z3z77TnIZMDSpb0xblxL\nqWORhWOxExGVUX6+GmfOPIS1tRVWr34Nw4bxnDpJj8VORFRGDg7WCAsbjitXUtC1ax2p4xAB4MVz\nREQvJSenECtXntEtv+rqas9SJ6PCETsR0QtKS8vHqFExOH8+CdnZhfjkk65SRyL6BxY7EdELePQo\nG/7+23HjRhrq1KmM0aO9pY5E9EwsdjI6zkdGwvbhIaljEOncuZMOP7/tSEjIQrNmVRERMQLVqztK\nHYvomVjsZHTELnWVR19Rt0/m5dKlZAQExCA1NQ/t2tVAWNgwuLhwMRcyXix2MlopY7OkjkCEJUtO\nIjU1Dz161MXGjUNQqZK11JGInotXxRMRPcfq1f0xbVoHbNkylKVOJoHFTkT0N7/8kgC1uvh2tsqV\n7fDJJ11ha8sDnGQaWOxERH+xfv0f8PWNwgcf/ABBEKSOQ/TS+BGUiAjF875/9dWvWLz4JACgYUMX\nLuRCJonFTkQWT6sVMHfuMaxd+zusrGT4v/97FcHBXMyFTNMLHYpPT0/HpUuXAABarVbUQEREhqRW\nazFt2kGsXfs7rK2tsG7dQJY6mTS9xR4bG4uAgAB8/PHHAIAFCxYgKipK9GBERIawYsUZRERcgYOD\nNUJDh2Pw4MZSRyIqF72H4jdu3Ihdu3ZhypQpAICZM2ciODgYfn5+oocj88YZ5sgYvP56W/z22yN8\n+GEntG9fU+o4ROWmt9idnJxgb/+/WZbs7Oxgbc17Oan8nlfqnB2OxJSWlg9HRxvY2Mjh6GiD8HBf\nqSMRVRi9xe7i4oIdO3ZApVIhLi4O+/btg6urqyGykYXgDHNkSA8fFi/m4u2txJo1r0Eu512/ZF70\n/o2eP38+Ll26hNzcXMyZMwcqlQqLFi0yRDYiogp161YaBg0Kx82babh27QmyslRSRyKqcHpH7MeP\nH8dnn31W4rlt27Zh1KhRooUiIqpoFy8mITAwBqmp+WjfvgbCwoajShU7qWMRVbhSi/3KlSuIi4vD\nhg0bkJ+fr3terVZj9erVLHYiMhknTyZgzJhdyMkpRM+edbFhAxdzIfNVarHb2triyZMnyM7Oxrlz\n53TPy2QyzJgxwyDhiIjK68yZRwgMjEFBgQbDhjXB11/3h42NXOpYRKIptdg9PT3h6emJTp06oXXr\n1iVeO3jwoOjBiIgqgre3Eq1aVUeTJlWxZEkvXixHZk/vOXZ3d3csXboU6enpAIDCwkL8+uuv6Nev\nn96Nh4SE4MKFC5DJZJg9ezZatvzfbE6PHz/GBx98gKKiIjRv3hyff/55Ob4NIqKSNBot5HIrODhY\nIyLCF/b2Cs79ThZB70fXGTNmoEqVKvjjjz/g7e2N9PR0LF26VO+Gz5w5g/j4eERERGDRokX/uJJ+\n8eLFmDBhAqKjoyGXy/Ho0aOyfxdERH8SBAHz5x/FxImxuqVXHRysWepkMfQWu1wux5QpU+Dm5oag\noCB88803CA0N1bvhU6dOoXfv3gCKD+tnZmYiJycHQPF88+fOnUOvXr0AAHPnzkXNmpzxiYjKR6sV\nMGfOUcybdwwHDtzGb79xwECWR++heJVKhcTERMhkMiQkJKBmzZp4+PCh3g2npqbCy8tL99jV1RUp\nKSlwdHREWloaKlWqhC+++AJxcXFo3749pk+frnebSqWT3q+h8pFiH1vin6slfs9iKyrSYMKE3di6\n9SJsbOTYtm0EhgxpJnUss8a/x8ZJb7FPmjQJp06dwsSJEzF06FDI5XIMGjTopd9IEIQSv05KSsLY\nsWPh4eGBKVOm4OjRo+jRo8dzt5GSkv3S70svTql0Mug+Vv75f0v7czX0frYE+flFmDx5Lw4dugMH\nB2vs3h2Ili2V3M8i4t9jwyjLhye9xf70cDpQfN48NzcXlStX1rthd3d3pKam6h4nJydDqSz+Ue7i\n4oKaNWuiTp06AIDOnTvj5s2beoudiOjvsrNVGDNmJ06deggXFzts2zYcr77agKVDFqvUc+xarRbh\n4eFYsGABYmNjAQAKhQI2NjaYP3++3g37+PjobouLi4uDu7s7HB0dddupXbs27t27p3u9fv365f1e\niMgCWVvLoVBYoXr1Sti9OwBt29aQOhKRpEodsS9YsACZmZlo3bo1wsPDkZ6ejoYNG+Kzzz4rMYov\nTdu2beHl5YXAwEDIZDLMnTsXMTExcHJyQp8+fTB79mzMmjULgiCgcePGugvpiIhehp2dAps2DUV6\negFq13aWOg6R5GTCX09+/0VgYCDCw8MBAHl5eejZsyc8PDzw+eefw9vb26Ahn+KhNXEZ/Bz75uIf\nwpa2uhvPTZbfzZtpWLPmLJYsefWZs8hxH4uP+9gwKvQc+1/XXHdwcED9+vURGhoKuZxTMRKRdP74\nIxGjRu3Akyf5qF3bGR980EnqSERGpdRi//tkDjY2Nix1IpLUiRP3ERy8C7m5Rejduz7eeKOd1JGI\njE6pxZ6cnIzo6Gjd45SUlBKPR44cKW4yIqK/2L//FqZM2QuVSgNf36ZYtaofrK052CD6u1KLvU2b\nNiVWdWvdunWJxyx2IjKUiIgreO+9g9BoBIwf3wpffNELVlacIpboWUot9i+++MKQOcgIOR8ZCduH\nh6SOQRZOEATs3n0dGo2ADz7oiJkzu3Ded6Ln0DtBDVkuQ5S6yqOv6O9Bpk0mk2HdukE4cOA2fH2b\nSh2HyOix2EkvS7sdjaSn1QrYuPEPBAW1gJ2dAg4O1ix1ohekd3U3IiJDKirSYOrUffj4458wbdpB\nqeMQmRy9xX7t2jX4+vqif//+AIDVq1fjwoULogcjIsuTl1eEceN2IybmOipVskZwcAupIxGZHL3F\n/vnnnyMkJES3gMuAAQN4YR0RVbjMzAIEBMTg8OG7cHW1Q0yMH7p2rSN1LCKTo/ccu0KhQNOm/zu3\nVb9+fSgUPDVPRBUnOTkXgYExuHw5BTVqOCIqagQaN64qdSwik/RCxZ6QkKC7veTYsWMoZXp5IqIy\nWbnyDC5fTkGDBlUQFTWSi7kQlYPeYp85cyamTp2Ku3fvol27dvDw8MDSpUsNkY2ILMScOd3+vE+9\nE5RKB6njEJk0vcVubW2NPXv2IC0tDTY2Nro11YmIyuPpCN3BwRp2dgp88QWXbiaqCHovnnvzzTcx\ncuRIxMbGorCw0BCZiMjMHTsWj0GDwjFpUiyKijRSxyEyK3pH7AcPHsTly5exf/9+BAYGon79+hg6\ndCgGDBhgiHxEZGZiY2/ijTf2obBQg8qVbaWOQ2R2XmiCGm9vb3z00UcIDQ1FzZo1MWPGDLFzEZEZ\nCgu7jEmTYlFYqMGkSa2xevVrXKGNqILpHbEnJyfj0KFDOHDgANLS0jBgwADs3bvXENmIyIysWXMW\n8+b9DAD48MNO+OijzlzMhUgEeot9xIgRGDBgAGbOnIkWLTgLFBG9vF27rutKfdGiHpg8ua3EiYjM\nV6nFnpycDHd3d2zevFk3IU1CQoLu9dq1a4ufjojMwmuvNUT//p4YNKgR/P2bSx2HyKyVWuxLlizB\nsmXLMHHiRMhkshKT0shkMhw5csQgAYnINBUWalBYqIGjow1sbOTYtGkID70TGUCpxb5s2TIAwLp1\n6+Dp6VnitfPnz4ubiohMWl5eESZM2IOiIi3CwobB1lbBUicykFKvis/KysL9+/cxe/ZsJCQk6P67\nc+cOZs2aZciMRGRCMjIK4OdtzSiFAAAgAElEQVS3HT/+eA9XrqQgISFL6khEFqXUEfv58+exadMm\nXL16FePGjdM9b2Vlha5duxokHBGZlqSkXAQEbMeVK6nw8HBCVNQINGzoKnUsIotSarF3794d3bt3\nx7Zt2zBq1ChDZiIDcz4yErYPDwEAlBJnIdMVH58JP79o3LuXiUaNXBEZOQIeHk5SxyKyOKUW+/bt\n2zFixAgkJSVhxYoV/3h92rRpogYjw3la6s+i8uhrwCRkqhISsjBoUDiSknLRqlU1bNs2HG5uXMyF\nSAqlFruVVfHpd669bkGmC0hJyZY6BZmgGjUc0aZNdWRnq7B581A4OXGqWCKpyIQXWFw9JycHjo6O\nSE1Nxb1799C2bVtd8RsSS0ccys1/rn3NYjcIpdLJbPazIAi6q90LCtQAADs76QcD5rSPjRX3sWEo\nlS9/OktvOy9YsAD79+9HRkYGAgMDsXXrVsybN68s+YjIjOzZcwMjR25HXl4RgOJCN4ZSJ7J0eov9\nypUr8PPzw/79+zF8+HAsX74c8fHxhshGREZq69ZLmDx5L44fv4+YmGtSxyGiv9Bb7E+P1B89ehS9\nevUCAK7LTmTBVq36DR988AO0WgEzZ3ZBUJC31JGI6C/0HjerX78+BgwYAFdXVzRr1gw7d+5E5cqV\nDZGNiIyIIAhYuPAEVq36DQDwxRe9MHFia4lTEdHf6S32hQsX4saNG7ppZRs2bIilS5eKHoyIjIdG\no8WMGUewZcslKBRWWLWqH0aMaCZ1LCJ6Br3FXlBQgB9//BErVqyATCZD69at0bBhQ0NkIyIjkp1d\nCDs7OdavH4w+fRpIHYeISqH3HPunn36KnJwcBAYGwt/fH6mpqZgzZ44hshGRkZDLrfD11/2xd+8o\nljqRkdM7Yk9NTcWXX36pe9yzZ08EBweLGoqIpJeeno+QkF8wd+4ruqVXW7RwlzoWEemht9jz8/OR\nn58Pe3t7AEBeXh5UKpXowYhIOomJOQgI2I6rV5+goECNVav6Sx2JiF6Q3mIPCAjAa6+9Bm/v4lta\n4uLiOE88kRm7ezcDfn7bcf9+8WIuH3/sI3UkInoJeot95MiR8PHxQVxcHGQyGT799FNUq1bNENmI\nyMCuXEmBv38MkpNz0bp1NWzb5ouqVe2ljkVEL+G5xX7s2DHcuXMH7dq1Q+/evQ2ViYgkcObMIwQF\n7UBmpgrdutXGpk1D4ehoI3UsInpJpV4Vv2rVKnzzzTdITk7GnDlzsHv3bkPmIiIDi46+isxMFV57\nzROhocNZ6kQmqtQR+4kTJxAaGgqFQoHs7Gy88847GDJkiCGzEZEBhYT0RNOmVTF2bEsoFIZfvZGI\nKkap/3ptbGx0a7E7OTlBo9EYLBQRGcauXdeRlVV8l4tCYYUJE1qz1IlMXKn/gp+usVzaYyIyXYIg\nYOXKM5g8eS/GjNkJtVordSQiqiClHoq/ffs2ZsyYUepjzhdPZJoEQcD8+T9jzZpzkMkAX9+mHKUT\nmZFSi/3DDz8s8bhz586ihyFxOR8ZCduHh6SOQRLSaLT48MPDCA29DIXCCqtX98fw4U2ljkVEFajU\nYh8+fLghc5ABPK/UVR59YWvALGR4KpUab765H7GxN2Fvr8CGDYPx6qv1pY5FRBVM7wQ1ZH5SxmY9\n83mlgXOQYW3ZcgmxsTfh7GyL0NBh6NjRQ+pIRCQCFjuRhRg/vhVu3UrDmDEt4e3Nj3FE5uqFij09\nPR0PHjxAixYtoNVqYWXFC22ITEFiYg5sbORwdbWHXG6FxYtflToSEYlMb0PHxsYiICAAH3/8MQBg\nwYIFiIqKEj0YEZXPnTvpGDQoHEFBO5CTUyh1HCIyEL3FvnHjRuzatQsuLi4AgJkzZyIyMlL0YERU\ndpcvp2Dw4Ajcv58FQQCKijjBFJGl0FvsTk5OurXYAcDOzg7W1taihiKisvv114cYNiwSKSl56Nat\nDqKjR8LFhSu0EVkKvefYXVxcsGPHDqhUKsTFxWHfvn1wdXU1RDYieklHjtzFhAl7kJ+vxsCBDfHt\ntwNga8trZIksid4R+/z583Hp0iXk5uZizpw5UKlUWLhwoSGyEdFLuHAhCcHBu5Cfr0ZQkDfWrRvE\nUieyQHr/1Ts7O+Ozzz4zRBYiKocWLdwxYkRTuLk54LPPunF9ByILpbfYu3fv/swfEEePHhUjDxG9\nBEEQkJtbBEdHG1hZybBiRT9YWbHQiSyZ3mIPCwvT/bqoqAinTp2CSqUSNRQR6ScIAubO/RknTtzH\nzp3+cHa2ZakTkf5z7B4eHrr/6tWrh1GjRuH48eOGyEZEpVCrtXjvvUP49ttzuH79CX7/PVHqSERk\nJPSO2E+dOlXicWJiIu7fvy9aICJ6voICNV5/fS/2778NBwcFNmwYgh496kodi4iMhN5iX7Nmje7X\nMpkMjo6OmD9/vqihiOjZcnIKMW7cLhw/noDKlW0RGjocHTrUlDoWERkRvcU+a9YseHl5GSILET1H\nTk4hRoyIwvnzSXB3r4SICF94eXExFyIqSe859iVLlhgiBxHpUamSNVq0qIa6dSsjNjaApU5Ez6R3\nxF6zZk0EBwejVatWJaaSnTZtmqjBiKgkmUyGJUt6ISNDhapVOUUsET2b3hF7rVq10LFjR9jZ2UEu\nl+v+IyLxXbqUDF/fKKSl5QMA5HIrljoRPVepI/bdu3djyJAhePvttw2Zh4j+dPr0AwQF7UR2diFW\nrDiD+fO7Sx2JiExAqSP26OhoQ+Ygor/44Yc78PffjuzsQgwZ0hizZ/tIHYmITITeQ/FEZFjR0Vcx\nbtxuFBRoEBzcAmvXcoU2Inpxpf60OH/+PHr06PGP5wVBgEwm41zxRCJYv/48Pv74JwDAu+/+C598\n0pWLuRDRSym12Js3b44vv/zSkFmILN69e5kAgE8/7YZ33vmXxGmIyBSVWuw2Njbw8PAwZBYiizd/\nfnf07+8JH5/aUkchIhNV6jn2li1bGjIHkUVSq7VYtOgEUlLyAABWVjKWOhGVS6nF/tFHHxkyB5HF\nKShQY8KEPVix4gwmTtwDQRCkjkREZkDUq+JDQkIQEBCAwMBAXLx48Zlfs2zZMgQHB4sZg8joZGer\nMGpUDA4cuI0qVWwxd+4rvEiOiCqEaPfQnDlzBvHx8YiIiMDt27cxe/ZsRERElPiaW7du4bfffisx\nVS2RuUtJyYWvbzQuXEhC9eqVEBk5Ak2bukkdi4jMhGgj9lOnTqF3794AAE9PT2RmZiInJ6fE1yxe\nvBjvv/++WBGIjM6DB1no1m0jLlxIQr16lbFnTyBLnYgqlGjFnpqaChcXF91jV1dXpKSk6B7HxMSg\nQ4cOvPKeLEpMzDVcv/4EzZu7Yc+eQNStW1nqSERkZgw2ndVfLwzKyMhATEwMNm7ciKSkpBfehlLp\nJEY0i/O8/ch9LK7PP+8FFxcHjB/fGi4uXMxFTPy7LD7uY+MkWrG7u7sjNTVV9zg5ORlKZfH60adP\nn0ZaWhqCgoJQWFiI+/fvIyQkBLNnz37uNlNSssWKaxGert5d2n5UKp24j0Vw+vRD1KtXGdWrOwIA\nPvigM1JSsrmvRcS/y+LjPjaMsnx4Eu1QvI+PDw4ePAgAiIuLg7u7Oxwdi3+w9e/fH/v27UNkZCS+\n/vpreHl56S11IlN04MBt+PlFw99/O7KyVFLHISILINqIvW3btvDy8kJgYCBkMhnmzp2LmJgYODk5\noU+fPmK9LZHRiIy8gmnTDkKjEdCxowcqVeLdH0QkPplgQrNi8LBP+Sg3OwMAUsZmPft1HlqrMN99\n9zvmzDkKAHj//Y6YNauL7j517mfxcR+Lj/vYMMpyKJ5rQRJVIEEQ8H//dwr/+c9pAMVzv7/5ZjuJ\nUxGRJWGxE1Wgn366h//85zSsrGT46qs+GDXKW+pIRGRhWOxEFahnz3p46632aN++BgYObCR1HCKy\nQCx2onLKzy9CZqYK1as7/nmh6CtSRyIiCybqIjBE5i4rS4WAgBgMHx6lW3qViEhKLHaiMkpOzsWw\nYZE4ffoh8vKKkJFRIHUkIiIeiicqi4SELPj5RePOnQzUr18FUVEjUKcO530nIumx2Ile0o0bT+Dv\nvx2PHuXA21uJ8HBfuLtXkjoWEREAFjvRS0lOzsWQIRFISytAx44e2Lp1KCpXtpM6FhGRDoud6CW4\nu1fCmDEtcOVKKv7730FwcOA0sURkXFjsRC9ApVLD1rb4n8snn3SFRiNAoeC1p0RkfPiTiUiP8PA4\ndO++GYmJOQAAmUzGUicio8WfTkTP8e235/Duuwdx504G9u27JXUcIiK9eCie6BkEQcDixSfx1Ve/\nAgAWLOiBCRNaS5yKiEg/FjvR32i1AmbN+hHff38BcrkMy5f3Q0BAc6ljERG9EBa7mXI+MhK2Dw9J\nHcPkaLUCpk7dh5iY67C1lWPdukHo399T6lhERC+MxW6mSit1lUdfAycxLVZWMjRs6ApHRxts2TIU\nPj61pY5ERPRSWOxmLmVsltQRTM706Z0QGOiFWrWcpY5CRPTSeFU8Wbzk5FyMGbMTDx4UfwiSyWQs\ndSIyWRyxk0W7fz8Tfn7bcfduBmQyYMuWYVJHIiIqFxY7Wazr15/Azy8aiYm5aNHCHV9+yesPiMj0\n8VA8WaTff3+MIUMikJiYi86dPbBjhx+USgepYxERlRuLnSzOsWPx8PWNRnp6Afr2bYDwcF84O9tK\nHYuIqEKw2MnixMWlIC+vCCNHNsPGjYNhb88V2ojIfPAcO1mcqVPbw9PTBX36NICVlUzqOEREFYrF\nbuI4w9yL2bDhD/TsWQ/161cBAPTrx9nkiMg88VC8iXteqXOWueLFXEJCTmDWrB8RELAdBQVqqSMR\nEYmKI3YzwRnm/kmj0WLmzB+xefNFyOUyfPRRZ9jZ8a88EZk3/pQjs1RYqMHbbx/Azp3XYWdXvJgL\nD78TkSVgsZPZyc0twoQJu/HTT/FwcrLB1q3D0LlzLaljEREZBIudzM7hw3fw00/xcHOzR3i4L1q2\nrCZ1JCIig2Gxk9kZOrQJkpJy0atXPTRs6Cp1HCIig2Kxk1mIj89EUZFGV+RTprSVOBERkTR4uxuZ\nvKtXUzFoUDj8/Lbj4cNsqeMQEUmKxU4m7ezZRxg6NAJJSbmoV68ynJ1tpI5ERCQpFjuZrKNH4zFy\nZDQyMlTo398T27b5wsmJi7kQkWVjsZNJ2rPnBoKCdiAvT42AgObYsGEwJ58hIgKLnUzQ7dvpmDx5\nL4qKtHj99bZYsaIfFAr+VSYiAnhVPJkgT08XzJnTFYWFGrz/fkfIZFyhjYjoKRY7mQRBEJCUlIvq\n1R0BAG+//S+JExERGScevySjp9FoMX36D+jdOxT37mVIHYeIyKix2MmoqVRqTJmyF1u3XkZWVgHu\n3cuUOhIRkVHjoXgyWjk5hRg/fg+OHStezCU0dBg6deJiLkREz8NiJ6OUnp6P0aN34ty5x3Bzc0BE\nhC9atHCXOhYRkdFjsZPRUanUGDYsClevpqJ2bWdERY1AgwYuUsciIjIJPMdORsfWVoHg4BZo3NgV\ne/YEsNSJiF4CR+xGxvnISNg+PCR1DEmo1VrdRDOTJrVBUJA37O2tJU5FRGRaOGI3MmUpdZVHXxGS\nGNaZM4/Qtev3uHkzTfccS52I6OVxxG6kUsZmSR3BYH788S7Gj9+D/Hw1/vvf81iy5FWpIxERmSyO\n2ElSO3deR3DwLuTnqzFqlBcWLeopdSQiIpPGYifJbNp0Ea+/XryYy5tvtsPy5X25mAsRUTnxUDxJ\nYuXKM1i48AQA4JNPuuLdd//FxVyIiCoAi50k4eJiBysrGRYv7oV//7uV1HGIiMwGi50kERzcEp06\n1UKjRq5SRyEiMis8oUkGoVKp8d57B3HlSoruOZY6EVHFY7GT6HJyCjF69E6EhcVhypS90Gi0Ukci\nIjJbPBQPy57tTWxpafkYPXoHfv89EUqlA779diDkcn6eJCISC4sdZZvtTUzmMJMcADx+nA1//xhc\nv/4Edeo4IzKSi7kQEYmNxf4XljTbm9ju3EmHn992JCRkoWnTqoiI8EWNGk5SxyIiMnssdhLFxYvJ\nSEjIQrt21REWNhwuLvZSRyIisggsdhLFsGFNYGMjxyuv1IGjo43UcYiILAavYqIKc+TIXVy4kKR7\nPGBAQ5Y6EZGBsdipQsTEXENw8C4EBsbg8eNsqeMQEVksFjuV28aNF/Dmm/ugVmsRGOiF6tUdpY5E\nRGSxeI6dykwQBCxffgZffPELAGDOnK54990OEqciIrJsLHYqE61WwNy5x7B27e+QyYD/+7/eGDu2\npdSxiIgsHoudyuSPPxLx3Xe/w9raCmvWvIahQ5tIHYmIiMBipzJq27YGvvqqL6pXd0SvXvWkjkNE\nRH9isdMLy8kpxL17mfD2VgIARo/2ljgRERH9Ha+Kpxfy5Ek+fH2j4OsbWWLpVSIiMi4sdtLr4cNs\nDBkSgT/+SELlynZwcLCWOhIREZWCh+LpuW7fToefXzQePMhGs2ZVERk5AtWq8T51IiJjxWKnUl28\nmITAwBikpuajffsaCAsbjipV7KSORUREz8Fip2fKylLBz2870tML0KNHXWzcOASVKvEQPBGRsRO1\n2ENCQnDhwgXIZDLMnj0bLVv+bwKT06dP48svv4SVlRXq16+PRYsWwcqKp/yNhbOzLRYs6IHDh+9i\n1ap+sLXlZ0AiIlMgWpOeOXMG8fHxiIiIwKJFi7Bo0aISr3/22WdYuXIlwsPDkZubi+PHj4sVhV7C\nkyf5ul/7+zfH2rUDWOpERCZEtGI/deoUevfuDQDw9PREZmYmcnJydK/HxMSgevXqAABXV1ekp6eL\nFYVe0KpVv6Jjxw24ePF/S6/KZDIJExER0csSbSiWmpoKLy8v3WNXV1ekpKTA0bH4iuqn/09OTsYv\nv/yCadOmiRVFx/nISNg+PCT6+5gaQRDwn/+cxv/93ykAwG+/PUbLltUkTkVERGVhsGOsgiD847kn\nT57gjTfewNy5c+Hi4qJ3G0qlU/lCPK/U6w8o//ZNkFYr4P33D2DlyjOwspLhu+8GYeLEtlLHMnuW\n+HfN0LiPxcd9bJxEK3Z3d3ekpqbqHicnJ0OpVOoe5+TkYPLkyXjvvffQtWvXF9pmSkp2uTI9ffeU\nsVmlvEH5tm9qioo0eO+9Q4iKugobGzm2bRuBbt1qlXs/0/MplU7cxyLjPhYf97FhlOXDk2jn2H18\nfHDw4EEAQFxcHNzd3XWH3wFg8eLFGDduHF555RWxItBzCIKAN97Yh6ioq3BwsEZo6DD4+jaTOhYR\nEZWTaCP2tm3bwsvLC4GBgZDJZJg7dy5iYmLg5OSErl27YufOnYiPj0d0dDQAYNCgQQgICBArDv2N\nTCbD0KFNcOrUA2zZMgzt2tWQOhIREVUAmfCsk99GqtyH4jc7F2+ntEPxFkAQhBJXumdnq+DkZAuA\nh9YMhftZfNzH4uM+NgyjOhRPxufBgyz06ROK3357pHvuaakTEZF5YLFbiFu30jB4cAQuXkxGSMiJ\nZ96lQEREpo9TilmAixeTEBAQgydP8tGhQ018//0QTjxDRGSmOGI3cydPJmDYsCg8eZKPV1+th8jI\nEahcmSu0ERGZK7McsXOGuWIHD97GpEmxUKk0GD68CVat6g8bG7nUsYiISERmOWJ/XqmrPPoaMIm0\nBAFQq7X4979bYc2a11jqREQWwCxH7E9Z8m1tANC/vycOHQqCt7eS59SJiCyEWY7YLZUgCFi27DRO\nnXqge65FC3eWOhGRBTHrEbsl0WoFfPLJT1i//g9UqWKLs2cnwdmZ96gTEVkaFrsZKCrS4N13D2L7\n9muwsZFj+fJ+LHUiIgvFYjdx+flFmDQpFj/8cBeVKllj8+ah6NatjtSxiIhIIix2E5aVpcKYMTtx\n+vRDuLraYds2X7RpU13qWEREJCEWuwmLi0vBuXOPUaOGIyIjR6BJk6pSRyIiIomx2E1Y5861sGHD\nYDRr5oY6dSpLHYeIiIwAi93EXL/+BMnJubrz6P36eUqciIiIjAnvYzch588nYujQCAQH78KlS8lS\nxyEiIiPEYjcRx4/fh69vFNLSCuDjUwueni5SRyIiIiPEYjcB+/bdwqhRO5CbWwRf36b4/vshcHCw\nljoWEREZIRa7kdu27TImTNiDwkINJk5sjTVrXoO1NRdzISKiZ+PFc0YsMTEHM2cegVYrYPr0Tpgx\nozPnfScioudisRux6tUdsXbtQCQkZGHKlLZSxyEiIhPAYjcyWq2AK1dS4e2tBAC89lpDiRMREZEp\n4Tl2I1JYqMGbb+7DgAFhJZZeJSIielEcsRuJvLwiTJy4B0eO3IOjow20WkHqSEREZIJY7EYgM7MA\nQUE7cebMI1Stao/wcF+0alVN6lhERGSCWOwSS0rKRWBgDOLiUuDh4YTIyBFo1MhV6lhERGSiWOwS\n0moFXal7erogKmoEatVyljoWERGZMF48JyErKxk+/bQb2rWrgd27A1jqRERUbhyxSyAnpxCOjjYA\ngF696qFHj7qwsuLEM0REVH4csRvYsWPxaNfuvzh6NF73HEudiIgqCovdgPbsuYGgoJ1ITy9AbOxN\nqeMQEZEZYrEbSGjoJUyevBeFhRpMmtQaS5e+KnUkIiIyQzzHbgCrV5/F/Pk/AwA++qgzPvywExdz\nISIiUbDYRbZs2WksWXISABAS0hOTJrWROBEREZkzFrvIOnXyQKVK1li69FX4+TWXOg4REZk50yn2\nZTIopc7wggRB0B1q9/GpjbNnJ6FqVXuJUxERkSUw24vnVB59JXnf3NwijBmzEz/8cEf3HEudiIgM\nxXRG7ABSxmZJHeG50tPzERS0E2fPPsa1a0/wyit1YGtrUruYiIhMHFungiQl5cDffzuuXn2CWrWK\nF3NhqRMRkaGxeSrAvXsZ8PPbjvj4TDRq5IrIyBHw8HCSOhYREVkgFns5XbmSgoCAGCQl5aJ162rY\nts2X59SJiEgyZnvxnKHk5BQhK0uFrl1rIybGj6VORESS4oi9nDp0qImdO/3RrJkb7Oy4O4mISFps\nojLYs+cGAGDw4MYAgDZtqksZh4iISIfF/pK2bLmIjz46AoXCCs2auaFhQ1epIxEREenwHPtLWLny\nDKZPPwytVsD06Z3g6ekidSQiIqISOGJ/AYIgYMGC4/j667OQyYDFi1/F+PGtpI5FRET0Dyx2PTQa\nLT766DC2br0MhcIKX3/dH76+TaWORURE9Ewsdj3u3s3Ajh3XYW+vwPr1g9C7dwOpIxEREZWKxa5H\nw4au2LJlKBQKOTp18pA6DhER0XOx2J8hPT0f58491o3Ou3atI3EiIiKiF8Or4v8mMTEHw4ZFIjh4\nF3788Z7UcYiIiF4KR+x/cedOOvz9Y3D/fiaaNKmKZs2qSh2JiIjopbDY/xQXlwJ//+1ISclD27bV\nERY2HK6unPediIhMCw/FA/j114cYOjQSKSl56NatDqKjR7LUiYjIJFl8sRcUqDF5ciyyslQYOLAh\nwsKGwdHRRupYREREZWLxh+Lt7BRYt24QYmKuYdGinlAoLP6zDhERmTCLLfZbt9J0C7h07OiBjh15\njzoREZk+ixueCoKA5ct/RbdumxAbe1PqOERERBXKokbsgiBg3ryf8c035yCTAWlp+VJHIiIqt8eP\nH2Hs2EA0aVK8jkVRUREaNGiIDz+cBblcjoKCAqxa9SWuXLkMhUIBF5eqmD59JqpVqw4ASEi4j5Ur\nlyEjIx0ajRYtWrTEW2+9Bxsb6a430mg0mDnzfbz//gx4eNSSLEdOTg7mz/8EOTk5sLd3wLx5C+Hs\nXFn3+smTJxAWtln3+MaN6wgLi0Zi4mOsXr0CCoUC1tY2+PTTz3HlymWcPXsG06ZNFzWzxYzY1Wot\n3n//EL755hwUCiusXTsQY8e2lDoWEVGFqFOnLr7++jt8/fV3WLt2I9TqIvzwwwEAwKpVX8LNTYmN\nG8Owbt1mjBkzDtOnvwu1Wg2NRoM5c2Zg9OixWLduM9av3wIA2LhxnZTfDnbujEarVm0kLXUAiIwM\nQ5s27fDNN+vRvXtPbN26qcTrXbp01e33WbM+Rbt27eHmpkR4eCjmzJmPVavWwtu7Bfbs2QEfn25I\nTHyEq1fjRM1sESP2ggI13nhjH/btuwV7ewU2bhyMXr3qSx2LiEg0zZt748GDBOTl5eL06ZOIiNip\ne61ly9Zo3twLx48fhb29A+rUqYc2bdoBAGQyGaZOfRcyWclxn1qtxsKFc5GU9Bg2Nrb46qtlOHDg\nCO7cuY23334PeXl5GDs2ANHRexAYOBydOvnAxcUF+/fvRXh4DABg//5Y3Lp1A6NGBeOLLxZArS6C\nlZUVZs78FNWrVy/xftHREVi7diMA4NCh/YiOjoBcboV69Twxc+Yn2LdvD06fPonU1BTMnx+Cn38+\nisOHD0Ams0K3bj0watQYJCcnYcGCz3T558yZX+KDwt9H2wAwZIgv+vbtr3t87txv+Pjj4m34+LyC\nGTPeK3Wfb9jwHcaPnwwAWLhwCYDiI8UpKSlo2bJ4qW9fX39ERYXjs88WPPfPrzwsotjfffcg9u27\nhcqVbbF16zBeKEdEonE+MhK2Dw9V6DZVHn2R9Wr0C3+9Wq3G8ePHMGzYCDx8+AB169aDQlHyx32j\nRk1w/3487O3t0ahR4xKv2dra/WOb+/fHomrVqpg3bxEOHz6II0eOPPf9O3Xqgk6duuD338/izp3b\naNDAE8ePH8OoUWOwbt03CAwMwr/+1RGnTp3Apk3/xcyZc3S/PzExETY2NrpD3vn5+Vi2bBWcnJzw\n1luTcfv2LQBAUlIivv12Ax4/foSjR49gzZr1AIA335yInj17Iz39CcaPn4y2bdsjNnYXYmKi8M47\n7+vep0uXrujSpetz9+WTJ09QpYoLAMDFxQVPnqQ+8+tSU1Pw5MkTNG78v2W9T58+ieXL/4N69eqh\nX78BAICWLVvhiy8+fw9ekuoAABFRSURBVO57lpdFFPvUqe1w8WIS1q8fDC8vpdRxiIgq3P378Xj7\n7SkAgNu3byEoaCxeeaUHbt68AY1G+4+vFwQBVlZyADJotf98/e+uX7+G9u3/BQDo3bsflEonbNoU\nVurXN2/uBQB45ZWe+OWX4/DwqIW7d2/D27slFi9egPv347Fp03potVpdcT6VmpoCpdJd99jZ2Rkf\nf1x8Xjo+/i4yMzMAAM2aNYdMJsPVq3F48CAB77zzOgAgLy8XiYmPUKNGTSxf/h+sX78W2dlZaNKk\nmd7v83kEQSj1tf37Y9Gv32slnuvUqQu2bduOb75Zha1bv8fYsRNga2unOwUil8vLlac0ZlvsBQVq\n2NkVf3utW1fHiRP/5j3qRCS6lxlZV6Sn59gBYM6cGahduy4AwMPDAwkJ8SgqKoK1tbXu62/duoFX\nXukBa2sbbN8eWWJbhYWFePDgPho0aKh7Ti63glZbsthkMpnu12q1usRrCkXxe3Xv3hOffjoLDRp4\nomPHzpDJZFAorLFgwRK4ubmV+v083XZRURG+/HIpvv8+DFWrupU4FP70PRQKa3Tu7IMZMz4psY2Q\nkPno2LEThg0biZ9+OoyTJ0+UeP1FDsW7ubkhLS0Vjo6OSE1NgZvbsweHJ0+ewPz5IbrHx479hO7d\ne0Imk6FHj17YsOG7Ur/XimaWTXfnTjq6dt2E7duv6p5jqRPR/7d379Ex3f0ex99jIhQRQi5EVB+L\nx+2pukSFoCHRuNVyVlZGyKVJmjQRLWrVEqHjFtekVMrDaRdalKiTnqccQnmkSi6lQUjahqhbELmU\nJuQ2ss8fjtScMCQVkxnf11r+ML/Ze3/zXeKz9+w9v9+LYsqUaaxfH0dZWRnNmjVn0KAhesFy5sxp\nsrN/xcXFFWfn18nLu87Ro0cAqKqq4p//jOPQoe/09tmtWw/S048DcOzYD6xfv55mzZpXfzSdkXHq\nkbW0bWuLSqXi4MH9vPHGCOD+/f8ffkgC7t/DPnAgscY2N2/eBO5ffavVatq0aUte3g1++eXnGicR\nf/97d9LTf6KsrOz/vtIcQ3l5Gbdu3cLRsQOKonD06PdUVlbqbffwg28P/jwc6gADBgzk3/8+CEBS\n0iFef93lkT/ntWu52NnZV/9948b/5Ny5XwHIyjpLx473T7TKy8uwsLCot6t1MMNgP3PmJmPHxnP5\n8m2++CKjxhmmEEKYu/btHXnjjRF88cX9e87Tps2koqKcgAAfQkL8+fLLjSxatAy1Wk2jRo2Ijf2U\nb7/9huBgP6ZMeYcWLVoQHPyu3j7d3d+ktLSUqVND2blzOxMmTKB/f+fqWwCXL1+s8cDdA66uQzl1\nKp1XX30NgODgUH74IYmIiBA2bfqMXr3+ofd+BwcHysvL+eOPP7C2boWz8+u8844/mzZ9xqRJfqxZ\n87FeuDs4OODt7UNERAihoW/Tpk0bmjRpyvjx/8GqVSuZOfN9Rox4k1On0vnxx9Ra9dLLayK//voz\nU6a8Q3r6T0ya5A/AJ5/Ecu1aLgC3b9+iRYsWettFRs4jNnY5EREhJCcfxc8vEIAzZzLo3btPrWqo\nLZVi6KZBQxKrIt//D4NvSU29yuTJ/01xcQXDhr3Mpk3jZN73WrC1tSI/v9jYZZg96XP9kx7Xv/ru\n8ddf76C8vAxf37fr7RjGMGfOh/j6BtCjR6+ner+trVWtj2E2V+zffXcBb+//ori4gnHjurB163gJ\ndSGEMFETJnhx6lQ6ublXjV3KM5OcfBQ7O/unDvW6MouH53bvzubdd/ei01Xh69uLlSvdUavN5pxF\nCCFeOBYWFsTErDF2Gc/U03y97lkwi2D/299a06xZY/z9/8G8eUP0ntQUQgghXiRmEew9e9py5Ig/\n7dvX/l6EEEIIYU5M8vPqqiqFefOS+Oqrs9WvSagLIYQQJnjF/mAxl/j4LF56yYIRI17B3r65scsS\nQgghGoR6DfYlS5Zw+vRpVCoVc+bM4dVX/1xNLTk5mY8//hi1Ws3QoUOJiIh44v7KynSEhv4PiYk5\nNGtmwaZNb0moCyGEEA+pt4/if/zxRy5dukR8fDzR0dFER0frjS9evJi4uDi2b9/OsWPHOH/+vMH9\n/VHWhEmTviExMYdWrZrw9ddeuLl1qq/yhRBCCJNUb8GekpKCu7s7AJ07d+b27duUlJQAcOXKFayt\nrWnXrh2NGjVi2LBhpKSkGNzfiPX+HD16BXv75vzrXxqcndvXV+lCCCGEyaq3YC8oKKB16z9X7LGx\nsSE/Px+A/Px8bGxsHjn2OL8Vtebll63ZvVtD9+6PXzhACCGEeJE9t4fn/urMtQV3lj+jSoQhdZm+\nUNSe9Ln+SY/rn/S4Yaq3K3Y7OzsKCv5ckP7mzZvY2to+ciwvLw87O7sa+xBCCCFE7dRbsA8ePJj9\n+/cDkJmZiZ2dXfXqNx06dKCkpISrV6+i0+k4fPgwgwcPrq9ShBBCiBdGva7uFhMTw4kTJ1CpVGi1\nWrKysrCyssLDw4Pjx48TExMDwMiRIwkODq6vMoQQQogXhuks2yqEEEKIJzLJKWWFEEII8WgS7EII\nIYQZaZDBvmTJEjQaDRMnTiQjI0NvLDk5GS8vLzQaDWvXrjVShabPUI9TU1Px9vZm4sSJREZGUlVV\nZaQqTZuhHj8QGxuLn5/fc67MfBjq8fXr1/Hx8cHLy4uPPvrISBWaB0N93rZtGxqNBh8fnxozjIqn\nl52djbu7O1u3bq0xVuvcUxqYtLQ0JTQ0VFEURTl//rzi7e2tNz5q1Cjl2rVryr179xQfHx/l3Llz\nxijTpD2pxx4eHsr169cVRVGU9957T0lKSnruNZq6J/VYURTl3LlzikajUXx9fZ93eWbhST1+//33\nlQMHDiiKoijz589XcnNzn3uN5sBQn4uLixU3NzelsrJSURRFCQwMVE6ePGmUOk3ZnTt3FF9fX2Xu\n3LnKli1baozXNvca3BX7s56KVtRkqMcACQkJODg4APdnBfz999+NUqcpe1KPAZYtW8aMGTOMUZ5Z\nMNTjqqoqfvrpJ4YPHw6AVqulfXuZhrouDPW5cePGNG7cmLt376LT6SgtLcXa2tqY5ZokS0tLPvvs\ns0fO51KX3Gtwwf6sp6IVNRnqMVA938DNmzc5duwYw4YNe+41mron9TghIYEBAwbg6OhojPLMgqEe\nFxUV0bx5c5YuXYqPjw+xsbHGKtPkGepzkyZNiIiIwN3dHTc3N3r37s0rr7xirFJNloWFBU2bNn3k\nWF1yr8EF+/+nyLfx6t2jelxYWEhYWBharVbvl1rUzcM9vnXrFgkJCQQGBhqxIvPzcI8VRSEvLw9/\nf3+2bt1KVlYWSUlJxivOjDzc55KSEjZs2EBiYiKHDh3i9OnT/PLLL0asTkADDHaZirb+Geox3P9l\nDQkJYfr06bi6uhqjRJNnqMepqakUFRUxefJkpk6dSmZmJkuWLDFWqSbLUI9bt25N+/bt6dixI2q1\nGhcXF86dO2esUk2aoT7n5OTg5OSEjY0NlpaW9O/fn7NnzxqrVLNUl9xrcMEuU9HWP0M9hvv3fgMC\nAhg6dKixSjR5hnrs6enJ3r172blzJ59++ik9e/Zkzpw5xizXJBnqsYWFBU5OTly8eLF6XD4irhtD\nfXZ0dCQnJ4eysjIAzp49S6dOnYxVqlmqS+41yJnnZCra+ve4Hru6uuLs7EyfPn2q3zt27Fg0Go0R\nqzVNhv4dP3D16lUiIyPZsmWLESs1XYZ6fOnSJWbPno2iKHTt2pX58+fTqFGDu5YxCYb6vGPHDhIS\nElCr1fTp04dZs2YZu1yTc/bsWZYvX05ubi4WFhbY29szfPhwOnToUKfca5DBLoQQQoi6kdNXIYQQ\nwoxIsAshhBBmRIJdCCGEMCMS7EIIIYQZkWAXQgghzIiFsQsQ4kVw9epVPD099b5GCDBnzhy6d+/+\nyG3i4uLQ6XR/aT75tLQ0pkyZQo8ePQAoLy+nR48eREVF0bhx41rt68iRI2RmZhIeHk56ejq2trY4\nOTkRHR3N+PHj6dWrV53rjIuLIyEhgQ4dOgCg0+lwcHBg4cKFWFlZPXa7vLw8Lly4gIuLS52PLYS5\nkWAX4jmxsbExyvfVu3btWn1cRVGYMWMG8fHx+Pr61mo/Q4cOrZ60KCEhgdGjR+Pk5ERUVNQzqfOt\nt97SO4lZuXIl69ev58MPP3zsNmlpaeTk5EiwC/EQCXYhjCwnJwetVotaraakpITp06czZMiQ6nGd\nTsfcuXP57bffUKlUdO/eHa1WS0VFBQsXLuTSpUvcuXOHsWPHEhQUZPBYKpWKfv36ceHCBQCSkpJY\nu3YtTZs25aWXXmLRokXY29sTExNDamoqlpaW2Nvbs3z5cvbs2UNycjJvvvkmiYmJZGRkEBkZybp1\n6wgPDyc2NpaoqCj69u0LwNtvv01gYCBdunRhwYIFlJaWcvfuXT744AMGDRr0xL706dOHnTt3AnDi\nxAliYmKwtLSkrKwMrVZLy5YtWb16NYqi0KpVKyZPnlzrfghhjiTYhTCygoICpk2bhrOzMydPnmTR\nokV6wZ6dnc3p06fZt28fADt37qS4uJj4+Hjs7OxYvHgx9+7dw9vbm0GDBtGtW7fHHqu8vJzDhw/j\n5eVFaWkpc+fOZdeuXTg4OLB161ZWr17N7Nmz2bZtGydOnECtVrN37169uao9PDz48ssvCQ8Px8XF\nhXXr1gEwbtw49u/fT9++fSksLCQnJwdXV1fCw8MJCgpi4MCB5Ofno9FoOHDgABYWj//vR6fTsWfP\nHl577TXg/sI58+fPp1u3buzZs4cNGzawZs0aJkyYgE6nIzAwkM8//7zW/RDCHEmwC/GcFBUV4efn\np/faJ598gq2tLStWrGDVqlVUVlZy69Ytvfd07tyZ1q1bExISgpubG6NGjcLKyoq0tDRu3LjB8ePH\nAaioqODy5cs1giw7O1vvuG5ubowePZqff/6ZNm3a4ODgAMCAAQPYsWMH1tbWDBkyBF9fXzw8PBg9\nenT1ewwZM2YMPj4+REZGkpiYiKenJ2q1mrS0NO7cucPatWuB+/O4FxYWYm9vr7f9t99+S3p6Ooqi\nkJWVhb+/P6GhoQC0bduWFStWUF5eTnFx8SPX/H7afghh7iTYhXhOHnePfebMmYwZMwYvLy+ys7MJ\nCwvTG2/SpAlfffUVmZmZ1Vfb27dvx9LSkoiICDw9PQ0e9+F77A9TqVR6f1cUpfq1NWvWkJOTw/ff\nf4+vry9xcXFP/PkePEyXkZHBvn37mD17NgCWlpbExcXprSn9KA/fYw8LC8PR0bH6qn7WrFksWLAA\nFxcXDh8+zMaNG2ts/7T9EMLcydfdhDCygoICunTpAsDevXupqKjQGz9z5gzffPMNPXv2ZOrUqfTs\n2ZOLFy/Sr1+/6o/nq6qqWLp0aY2rfUM6depEYWEh165dAyAlJYXevXtz5coVNm/eTOfOnQkKCsLD\nw6PGGtsqlYrKysoa+xw3bhy7du3i9u3b1U/JP1xnUVER0dHRT6xNq9USFxfHjRs39Hp07949EhMT\nq3ukUqnQ6XQ1jlOXfghhLiTYhTCyoKAgZs2aRXBwMP369cPa2pply5ZVj3fs2JH9+/czceJE/P39\nadmyJX379mXy5Mk0a9YMjUaDt7c3VlZWtGrV6qmP27RpU6Kjo5kxYwZ+fn6kpKQwffp07O3tycrK\nwsvLi4CAAHJzcxk5cqTetoMHD0ar1XLgwAG910eOHMnu3bsZM2ZM9WtRUVEcPHiQSZMmERoaysCB\nA59YW7t27QgJCWHevHkAhISEEBAQQFhYGBMmTOD69ets3ryZ/v37k5CQwOrVq/9yP4QwF7K6mxBC\nCGFG5IpdCCGEMCMS7EIIIYQZkWAXQgghzIgEuxBCCGFGJNiFEEIIMyLBLoQQQpgRCXYhhBDCjEiw\nCyGEEGbkfwGiRObD8QJ2UQAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<Figure size 576x576 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "pTaflteNiSUG",
|
|
"colab_type": "code",
|
|
"outputId": "82f7537b-0b44-4476-e202-79db2f7fa96f",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 581
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# Feature importance dataframe\n",
|
|
"imp_df = pd.DataFrame({'feature': X_train.columns.values,\n",
|
|
" 'importance': model.feature_importances_})\n",
|
|
" \n",
|
|
"# Reorder by importance\n",
|
|
"ordered_df = imp_df.sort_values(by='importance')\n",
|
|
"imp_range=range(1,len(imp_df.index)+1)\n",
|
|
" \n",
|
|
"## Barplot with confidence intervals\n",
|
|
"height = ordered_df['importance']\n",
|
|
"bars = ordered_df['feature']\n",
|
|
"y_pos = np.arange(len(bars))\n",
|
|
"\n",
|
|
"# Create horizontal bars\n",
|
|
"plt.barh(y_pos, height)\n",
|
|
" \n",
|
|
"# Create names on the y-axis\n",
|
|
"plt.yticks(y_pos, bars)\n",
|
|
"\n",
|
|
"plt.xlabel(\"Mean reduction in tree impurity in random forest\")\n",
|
|
"\n",
|
|
"plt.tight_layout()\n",
|
|
"# Show graphic\n",
|
|
"plt.show()\n"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAI0CAYAAAAKi7MDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XeYleWZwOFnYECkKMUBS2zrqlGx\ngRqxQxDLqqirERTcRDcKii0YGVBKxIYlFjRiCTEL6hoRFVt0bVeMwlgvEGKCxgYqODTpZeDbP7g4\nYQTmDDiFF+77r5lTvvOcd84MP75TvoIsy7IAAEhYndoeAADghxI0AEDyBA0AkDxBAwAkT9AAAMkT\nNABA8gqreoNlZctj9uyFVb3ZTUazZg2tTx7WKD9rVDHrk581qpj1ya821qioqMk6z6vyPTSFhXWr\nepObFOuTnzXKzxpVzPrkZ40qZn3y29jWyFNOAEDyBA0AkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMA\nJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMA\nJE/QAADJEzQAQPIKq3qDJ/d+uqo3CQBs5IYXd6jV27eHBgBInqABAJInaACA5AkaACB5ggYASJ6g\nAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6g\nAQCSJ2gAgOQJGgAgeYX5LlBSUhKXXXZZ7L777hERsccee0T//v2rfTAAgMrKGzQREYccckjcdddd\n1T0LAMAG8ZQTAJC8SgXNJ598Ej169IiuXbvGm2++Wd0zAQCsl7xPOe2yyy7Rq1evOOGEE2LKlClx\n7rnnxksvvRT169evifkAgAQUFTWp1dvPGzStWrWKE088MSIidtppp9hmm21i+vTpseOOO1b7cABA\nGkpL51X7bVQUTXmfchozZkz8/ve/j4iI0tLSmDlzZrRq1arqpgMA+IHy7qHp0KFDXHnllfHKK6/E\nsmXLYtCgQZ5uAgA2KnmDpnHjxjFs2LCamAUAYIN42zYAkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMA\nJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMA\nJE/QAADJK8iyLKvqjZaWzqvqTW4yioqaWJ88rFF+1qhi1ic/a1Qx65NfbaxRUVGTdZ5nDw0AkDxB\nAwAkT9AAAMkTNABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAySus6g2e3Pvpqt4k\nAFSJ4cUdansEqok9NABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0A\nkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACSvMN8FHn/88RgzZkzu\n+4kTJ8YHH3xQrUMBAKyPvEFz5plnxplnnhkREW+//Xa88MIL1T4UAMD6WK+nnO6555646KKLqmsW\nAIANUumgmTBhQmy33XZRVFRUnfMAAKy3vE85rTJq1Kg47bTTqnMWAKhWRUVNquWym6uNaY0qHTQl\nJSVxzTXXVOcsAFCtSkvnVepyRUVNKn3ZzVVtrFFFAVWpp5ymT58ejRo1ivr161fZUAAAVaVSQVNa\nWhrNmzev7lkAADZIpYKmdevW8eCDD1b3LAAAG8QnBQMAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA\n8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA\n8gQNAJC8wqre4DO3dY7S0nlVvdlNRlFRE+uThzXKzxpVzPrkZ43Y1NhDAwAkT9AAAMkTNABA8gQN\nAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyqvxYTif3frqqNwkAMby4Q22PwEbM\nHhoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDk\nCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgORVKmgmT54cHTt2jJEjR1b3PAAA\n6y1v0CxcuDAGDx4c7dq1q4l5AADWW96gqV+/fjzwwAPRsmXLmpgHAGC9Fea9QGFhFBbmvRgAQK1R\nKgAkoaioySZ9eynamNZI0ACQhNLSeTV2W0VFTWr09lJUG2tUUUB52zYAkLy8e2gmTpwYQ4YMia++\n+ioKCwvjxRdfjKFDh0bTpk1rYj4AgLzyBk3r1q1jxIgRNTELAMAG8ZQTAJA8QQMAJE/QAADJEzQA\nQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMAJE/QAADJEzQA\nQPIEDQCQPEEDACRP0AAAySus6g0+c1vnKC2dV9Wb3WQUFTWxPnlYo/ysUcWsT37WiE2NPTQAQPIE\nDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA8gQNAJA8QQMAJK/Kj+V0cu+nq3qT\nAGwEhhd3qO0RYJ3soQEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gA\ngOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5lQqaMWPGxCmnnBKn\nn356vP7669U8EgDA+skbNLNnz4577rknHnnkkRg2bFi88sorNTEXAEClFea7wNixY6Ndu3bRuHHj\naNy4cQwePLgm5gIAqLS8e2imTp0aixcvjh49esTZZ58dY8eOrYm5AAAqLe8emoiIOXPmxN133x1f\nf/11nHvuufHaa69FQUFBdc8GwEakqKhJbY9Qoza3+7shNqY1yhs0LVq0iAMPPDAKCwtjp512ikaN\nGsWsWbOiRYsWNTEfABuJ0tJ5tT1CjSkqarJZ3d8NURtrVFFA5X3K6Ygjjohx48bFihUrYvbs2bFw\n4cJo1qxZlQ4IAPBD5N1D06pVqzjuuOPiZz/7WUREXHPNNVGnjo+vAQA2HpV6DU2XLl2iS5cu1T0L\nAMAGsasFAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJ\nGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5BVW9Qafua1zlJbOq+rNbjKKippY\nnzysUX7WqGLWJz9rxKbGHhoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAg\neYIGAEieoAEAklflx3I6uffTVb1JgKQNL+5Q2yPAJs8eGgAgeYIGAEieoAEAkidoAIDkCRoAIHmC\nBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmC\nBgBInqABAJInaACA5BVW5kI33HBDjB8/PgoKCqJfv36x3377VfdcAACVljdo3n777fjiiy/iscce\ni3/+85/Rr1+/eOyxx2piNgCASsn7lNPYsWOjY8eOERGx2267xXfffRfz58+v9sEAACorb9DMmDEj\nmjVrlvu+efPmUVpaWq1DAQCsj0q9hmZ1WZZVxxwAm6yioia1PcJabaxzbSysT34b0xrlDZqWLVvG\njBkzct9/++23UVRUVK1DAWxKSkvn1fYIaygqarJRzrWxsD751cYaVRRQeZ9yOvzww+PFF1+MiIhJ\nkyZFy5Yto3HjxlU3HQDAD5R3D02bNm1in332iS5dukRBQUEMHDiwJuYCAKi0Sr2G5sorr6zuOQAA\nNphPCgYAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIG\nAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5hVW9wWdu6xylpfOqerObjKKiJtYn\nD2uUnzWqmPWBzY89NABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0A\nkDxBAwAkr8qP5XRy76erepMAtWJ4cYfaHgGoJHtoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5\nggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5\nggYASF5hvgssWrQoiouLY+bMmbFkyZK46KKLon379jUxGwBApeQNmtdeey1at24dv/zlL+Orr76K\n8847T9AAABuVvEFz4okn5r7+5ptvolWrVtU6EADA+sobNKt06dIlpk2bFsOGDavOeQAA1lulg+Z/\n//d/46OPPopf//rXMWbMmCgoKKjOuQBqXVFRk9oeoVpt6vfvh7I++W1Ma5Q3aCZOnBgtWrSI7bbb\nLvbaa69Yvnx5zJo1K1q0aFET8wHUmtLSebU9QrUpKmqySd+/H8r65Fcba1RRQOV92/a7774bw4cP\nj4iIGTNmxMKFC6NZs2ZVNx0AwA+UN2i6dOkSs2bNirPPPjsuuOCCGDBgQNSp4+NrAICNR96nnBo0\naBC33XZbTcwCALBB7GoBAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkido\nAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYVVvcFnbuscpaXz\nqnqzm4yioibWJw9rlJ81qpj1gc2PPTQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AA\nAMkTNABA8gQNAJA8QQMAJK/Kj+V0cu+nq3qTAJUyvLhDbY8A1BJ7aACA5AkaACB5ggYASJ6gAQCS\nJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCS\nJ2gAgOQJGgAgeYIGAEieoAEAkldYmQvdfPPN8d5770VZWVlceOGF0alTp+qeCwCg0vIGzbhx4+Lj\njz+Oxx57LGbPnh2nnXaaoAEANip5g+bggw+O/fbbLyIittpqq1i0aFEsX7486tatW+3DAQBURt7X\n0NStWzcaNmwYERGjRo2Ko446SswAABuVSr2GJiLi5ZdfjlGjRsXw4cOrcx6ADVZU1GStX7N21qhi\n1ie/jWmNKhU0b7zxRgwbNiwefPDBaNJk4xkeYHWlpfMiYuUf2VVfs3bWqGLWJ7/aWKOKAipv0Myb\nNy9uvvnmeOihh6Jp06ZVOhgAQFXIGzTPP/98zJ49Oy6//PLcaUOGDIntt9++WgcDAKisvEFz1lln\nxVlnnVUTswAAbBCfFAwAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AA\nAMkTNABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyCqt6g8/c1jlKS+dV\n9WY3GUVFTaxPHtYoP2sEUJ49NABA8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0\nAEDyBA0AkDxBAwAkr8qP5XRy76erepNAQoYXd6jtEYDNkD00AEDyBA0AkDxBAwAkT9AAAMkTNABA\n8gQNAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACRP0AAAyRM0AEDyBA0AkDxBAwAkT9AAAMkTNABA\n8gQNAJA8QQMAJK9SQbN48eLo2LFjjB49urrnAQBYb5UKmnvvvTe23nrr6p4FAGCD5A2af/7zn/HJ\nJ5/EMcccUwPjAACsv7xBM2TIkCguLq6JWQAANkhhRWc+9dRTccABB8SOO+5YU/MAiSsqalLbI0TE\nxjPHxswaVcz65LcxrVGFQfP666/HlClT4vXXX49p06ZF/fr1Y9ttt43DDjuspuYDElNaOq+2R4ii\noiYbxRwbM2tUMeuTX22sUUUBVWHQ3HHHHbmvhw4dGjvssIOYAQA2Oj6HBgBIXoV7aFZ3ySWXVOcc\nAAAbzB4aACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDkCRoAIHmCBgBInqABAJIn\naACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkldY1Rt85rbOUVo6r6o3u8koKmpi\nffKwRvlZI4Dy7KEBAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDk\nCRoAIHmCBgBInqABAJInaACA5AkaACB5ggYASJ6gAQCSJ2gAgOQJGgAgeYIGAEieoAEAkidoAIDk\nCRoAIHkFWZZltT0EAMAPYQ8NAJA8QQMAJE/QAADJEzQAQPIEDQCQPEEDACSvcEOveMMNN8T48eOj\noKAg+vXrF/vtt1/uvLfeeit++9vfRt26deOoo46Kiy++uEqGTc3NN98c7733XpSVlcWFF14YnTp1\nyp3XoUOH2HbbbaNu3boREXHrrbdGq1atamvUGldSUhKXXXZZ7L777hERsccee0T//v1z53sMRTz+\n+OMxZsyY3PcTJ06MDz74IPf9PvvsE23atMl9/9BDD+UeT5u6yZMnx0UXXRQ///nPo1u3bvHNN9/E\nVVddFcuXL4+ioqK45ZZbon79+uWuU9HfrE3R2taob9++UVZWFoWFhXHLLbdEUVFR7vL5fic3Nd9f\nn+Li4pg0aVI0bdo0IiLOP//8OOaYY8pdZ3N/DF166aUxe/bsiIiYM2dOHHDAATF48ODc5UePHh13\n3nln7LTTThERcdhhh0XPnj1rbuBsA5SUlGQXXHBBlmVZ9sknn2Q/+9nPyp1/wgknZF9//XW2fPny\nrGvXrtnHH3+8ITeTtLFjx2b//d//nWVZls2aNSs7+uijy53fvn37bP78+bUw2cZh3Lhx2SWXXLLO\n8z2GyispKckGDRpU7rRDDjmklqapXQsWLMi6deuWXXPNNdmIESOyLMuy4uLi7Pnnn8+yLMtuu+22\n7OGHHy53nXx/szY1a1ujq666KnvuueeyLMuykSNHZkOGDCl3nXy/k5uSta1Pnz59sldffXWd1/EY\nKq+4uDgbP358udOeeOKJ7KabbqqpEdewQU85jR07Njp27BgREbvttlt89913MX/+/IiImDJlSmy9\n9dax3XbbRZ06deLoo4+OsWPHVl2BJeLggw+OO++8MyIittpqq1i0aFEsX768lqdKg8fQmu655564\n6KKLanuMjUL9+vXjgQceiJYtW+ZOKykpiZ/+9KcREdG+ffs1Hi8V/c3aFK1tjQYOHBjHHXdcREQ0\na9Ys5syZU1vj1bq1rU8+HkP/8umnn8a8efM2uj1UGxQ0M2bMiGbNmuW+b968eZSWlkZERGlpaTRv\n3nyt521O6tatGw0bNoyIiFGjRsVRRx21xtMBAwcOjK5du8att94a2Wb4gc2ffPJJ9OjRI7p27Rpv\nvvlm7nSPofImTJgQ2223XbmnByIili5dGr17944uXbrEH/7wh1qaruYVFhZGgwYNyp22aNGi3FNM\nLVq0WOPxUtHfrE3R2taoYcOGUbdu3Vi+fHk88sgjcfLJJ69xvXX9Tm5q1rY+EREjR46Mc889N664\n4oqYNWtWufM8hv7lf/7nf6Jbt25rPe/tt9+O888/P/7rv/4r/va3v1XniGvY4NfQrG5z/Me4sl5+\n+eUYNWpUDB8+vNzpl156aRx55JGx9dZbx8UXXxwvvvhiHH/88bU0Zc3bZZddolevXnHCCSfElClT\n4txzz42XXnppjdc9sDKITzvttDVOv+qqq+KUU06JgoKC6NatWxx00EGx77771sKEG5fK/D3aXP9m\nLV++PK666qo49NBDo127duXO29x/Jzt37hxNmzaNvfbaK+6///64++67Y8CAAeu8/Ob6GFq6dGm8\n9957MWjQoDXO23///aN58+ZxzDHHxAcffBB9+vSJZ555psZm26A9NC1btowZM2bkvv/2229z/3v8\n/nnTp09fr916m5I33ngjhg0bFg888EA0adKk3HmnnnpqtGjRIgoLC+Ooo46KyZMn19KUtaNVq1Zx\n4oknRkFBQey0006xzTbbxPTp0yPCY+j7SkpK4sADD1zj9K5du0ajRo2iYcOGceihh252j6HVNWzY\nMBYvXhwRa3+8VPQ3a3PSt2/f2HnnnaNXr15rnFfR7+TmoF27drHXXntFxMo3bXz/98ljaKV33nln\nnU817bbbbrkXUh944IExa9asGn2pxQYFzeGHHx4vvvhiRERMmjQpWrZsGY0bN46IiB/96Ecxf/78\nmDp1apSVlcVrr70Whx9+eNVNnIh58+bFzTffHPfdd1/uVfOrn3f++efH0qVLI2LlA2TVOws2F2PG\njInf//73EbHyKaaZM2fm3uXlMfQv06dPj0aNGq3xv+RPP/00evfuHVmWRVlZWbz//vub3WNodYcd\ndljub9JLL70URx55ZLnzK/qbtbkYM2ZM1KtXLy699NJ1nr+u38nNwSWXXBJTpkyJiJX/ifj+75PH\n0Eoffvhh/PjHP17reQ888EA8++yzEbHyHVLNmzev0XdebvDRtm+99dZ49913o6CgIAYOHBh/+9vf\nokmTJnHsscfGO++8E7feemtERHTq1CnOP//8Kh06BY899lgMHTo0dt1119xpP/nJT2LPPfeMY489\nNv74xz/GU089FVtssUXsvffe0b9//ygoKKjFiWvW/Pnz48orr4y5c+fGsmXLolevXjFz5kyPoe+Z\nOHFi3HHHHfHggw9GRMT9998fBx98cBx44IFxyy23xLhx46JOnTrRoUOHmn17ZC2aOHFiDBkyJL76\n6qsoLCyMVq1axa233hrFxcWxZMmS2H777ePGG2+MevXqxRVXXBE33nhjNGjQYI2/Wev6o7wpWNsa\nzZw5M7bYYovcP8K77bZbDBo0KLdGZWVla/xOHn300bV8T6rH2tanW7ducf/998eWW24ZDRs2jBtv\nvDFatGjhMbTaGg0dOjSGDh0abdu2jRNPPDF32Z49e8a9994b06ZNi1//+te5/2jV9FvbNzhoAAA2\nFj4pGABInqABAJInaACA5AkaACB5ggYASJ6gIRlTp06NPffcMx599NFyp7/77rux5557RklJSS1N\ntnZvvfVWdO/efYOu+8wzz8SKFSsiIqJ79+4/+MOpPvroo3JHxc1n+vTp1XL8rNGjR8fjjz9e5dtd\nl+uvvz4mTpwYERFPP/10pa93//33x+uvv15NU1Xs8ccfj+Li4ird5ty5c+Okk06q1uOBvf/++7nP\ncYHaIGhIyi677BKjR48ud9ro0aPLfd7PpmDo0KG5oBkxYsQP/nCqvfbaK/r371/py5eUlMS4ceN+\n0G2uzemnnx5nnnlmlW93Xa6++upo3bp1LF++PH73u99V+noXXHBB7hNPNwWTJ0+OLbfccr3WYH2N\nHj1a0FCrquRYTlBTWrZsGUuWLImPP/44dt9991i0aFG89957sf/+++cu8/zzz8fIkSMjy7Jo3rx5\nXHfdddGsWbN45JFH4umnn4569erFFltsEbfffntstdVW0aFDhzj33HPjL3/5S0ydOjV+85vfrHGc\nm+7du8ePf/zj+Oijj+KPf/xjvPPOO3HPPfdElmVRWFgYgwcPjh133DFefvnluP3222PbbbeNnXfe\nudz1e/bsGYcddlhMnTo1zj777PjLX/4SM2fOjL59+8a8efOibt26MWDAgPjzn/8cX3zxRfz85z+P\nu+++O37yk5/EpEmTYunSpdG/f/+YNm1alJWVRefOnePss8+O0aNHx1tvvRUrVqyIzz77LHbYYYcY\nOnRouQ9qLCkpiTvuuCMeffTR6N69e7Rr1y4++OCD+Pzzz+OSSy6JU045JXfZKVOmxB133BFZlkXT\npk1zn9r89ddfR58+faJ58+bxm9/8JhYtWhQLFy6MX/3qV3HYYYfFd999FwMHDoxZs2bF/Pnz4xe/\n+MUaB0AcOnRolJWVxRVXXBEHHnhg9OzZM1599dVYtmxZ9OjRI/70pz/FZ599FoMGDYojjjgiunfv\nHnvvvXd8/PHHUVpaGhdeeGGcdNJJUVxcHG3bts3F0Z577hmTJk2Ke++9t9ysQ4YMiZ49e8bTTz8d\nX331VZx33nnRrFmzOPzww+P000+PiJUHid1jjz3inHPOyc25avvt2rWLnj17xhFHHBETJkyIBQsW\nxH333bfGJ+i2adMmzjjjjFixYkX069cvBg4cGJ9++mksXbo09t9//7jmmmti6tSp69zWww8/HI8+\n+mhsu+225Q7bMH78+LjpppuisLAwCgoKYsCAAfHv//7v0b179zjooINiwoQJ8fnnn0e/fv3iqaee\nismTJ8epp55a7kMWFyxYEIMHD46pU6dGr1694s4774wbbrghJk2aFBERhx56aFx++eVRUlISv/vd\n72KLLbaIY489Njp37hzXXnttfPHFF7FgwYI46aST4rzzzovJkyfHgAEDol69erF48eK4+OKLY9my\nZfHnP/85JkyYEH379l3j9wdqRAaJmDJlStatW7ds5MiR2Y033phlWZY9+eST2XXXXZf16dMnGzdu\nXPb1119nJ598crZkyZIsy7LsoYceyl12+PDh2bx587Isy7L+/ftnI0aMyLIsy9q3b5898sgjWZZl\n2ejRo7MePXqscdvdunXLfvvb32ZZlmULFy7MOnXqlM2ePTvLsiz7v//7v6xXr15ZlmXZkUcemX3y\nySdZlmXZ4MGDs27duuWu/+abb+bux5FHHpllWZb17ds3GzlyZJZlWVZSUpLdfPPNWZZl2R577JEt\nW7as3NfDhg3LBg0alGVZli1atChr37599uWXX2ZPPPFE1qFDh2zRokXZihUrsp/+9KfZpEmTys0/\nbty4rEuXLrlZbrnlltxtnnzyyWvc37vuuit3f++6667s7LPPzlasWJFlWZb98pe/zMaOHZtlWZZ9\n++23Wfv27bNly5ZlgwYNykb7QYxdAAAH+UlEQVSNGpVlWZYtWLAg69ixYzZz5sx1bnePPfbIrUm3\nbt2y4uLiLMuy7Iknnsh69uyZO/3aa6/NsizLPv/886xdu3bZ8uXLsz59+mR/+tOfcttdtUbfn3XV\nuq++5m+//Xbu51JWVpa1b98+mzt3brk5V21/ypQp2V577ZVNnjw5y7IsKy4uzv7whz+ssV577rln\n9te//jXLsiybNWtW7rGVZVl23HHHZf/4xz/Wua25c+dmhxxySDZr1qwsy7KsR48eWZ8+fbIsy7JO\nnTpl48ePz7Isy1599dVyj6fbb789t6bHH398tmTJkmzKlClZ27Zt15hv9Z//M888k11wwQXZihUr\nsrKysuyMM87ISkpKsnHjxmVt2rTJPa4feOCB7M4778yt0+mnn5599NFH2eDBg7P77rsvy7IsmzFj\nRvbkk0+WW2uoLfbQkJwTTjghTjvttLjyyivjySefjCuvvDIefvjhiIj44IMPorS0NHeohKVLl8aP\nfvSjiIho2rRpXHDBBVGnTp346quvyh1Y7pBDDomIiO233z6+++67td5umzZtIiJyewsuueSSiFh5\nBOOCgoKYPXt2LFmyJHbbbbeIWPk/33/84x8V3pcJEybEL37xi9wMq+ZYm/Hjx+f2KjRo0CBat26d\n+1/2fvvtFw0aNIiIiO22226d92F97u/q9t9//9wen5KSkliwYEHcc889ERFRWFgYM2fOjJKSkvjw\nww/jqaeeyp0+derUaN68+Tq327Zt24hYeWDEVeu77bbbxrx583KXOeKIIyIiYuedd46CgoKYOXNm\npWddm4MPPjhmzZoVU6ZMialTp0bbtm3XOHjs6po1a5Y7rs/2228fc+bMWeMyWZbl5t9qq63im2++\nibPOOivq168fpaWlMXv27GjYsOFat/XFF1/EDjvsEM2aNYuIlYdI+fvf/x5z586NmTNn5j46/pBD\nDolf/epXudtcfb322WefqF+//hprtzbjx4+Pdu3aRUFBQdStWzcOOuig+PDDD6N169ax66675o49\nV1JSEtOmTYt33nknIlb+Ln355Zdx3HHHRXFxcXz99dfRvn376Ny5c4W3BzVF0JCc5s2bx9577x2j\nRo2K0tLS2HfffXPn1a9fP/bbb7+47777yl1n2rRpMWTIkHjuueeiRYsWMWTIkHLnFxb+61chW8fR\nQOrVq5e7je233z5GjBhR7vxZs2aV+4d0XS/kXbZsWe7rgoKC3Gtl8vn+P9JZluVO+/5rbNZ1H1ap\nzP1d3ar7HrHy/g8dOnSNUKlfv34MHDiw3M8jn9XnXtfrhFZfn1X3efW1WHWQ17XNui5nnnlmjBkz\nJqZPn573NT2VXdtVt/vcc8/Fhx9+GA8//HAUFhbmInRd21r95xjxr/u7tp/36lb/Ga7+dT4VPY6+\n/3O++OKL4/jjj19jG88++2yMHTs2Ro8eHWPGjInbbrut0rcP1cWLgklS586d4/bbb4//+I//KHf6\nvvvuGxMmTIjS0tKIiHjhhRfi5ZdfjpkzZ0azZs2iRYsWMWfOnPjrX/+6xj+ElbXLLrvE7NmzY/Lk\nyRGx8mjpjz32WDRr1izq1q0bn3/+eUSsfJfTKo0bN45vvvkmIqLci20PPPDAeOONNyJi5bu1+vTp\nExEr/9EpKysrd7v7779/7rILFy6MSZMmxT777LNB9yGftd3+Km3bto0XXnghIlZG3PXXX7/G6YsX\nL45BgwatcxvrY9V6ffbZZ1GnTp1o3rx5NGrUKLeeY8eOzXtg1zp16pSb5dRTT41XXnkl/v73v1e4\nV2xDzJw5M3bdddcoLCyMiRMnxpdfflnhY22nnXaKqVOnxty5cyPLsty7y5o0aRJFRUUxfvz4iFh5\nPw844IAfPN8BBxwQb731Vu4Agm+//Xa516CtsvrPc8WKFXHjjTfGnDlzYsSIETFt2rTo0KFDXH/9\n9bn5CgoKysU61DR7aEhShw4dYsCAAeVezBqx8qmLq6++Oi688MLYcssto0GDBjFkyJBo3rx57Lzz\nznHGGWfETjvtFJdeemkMGjRog44m3KBBg7jlllvi6quvji222CIiIq699tooKCiIfv36xcUXXxw7\n7rhjuRcFd+vWLQYOHBjPPvtsHHnkkbnTL7vssujbt2+89tprERG5dyIdeeSR8Z//+Z9x77335i7b\nvXv36N+/f5xzzjmxdOnSuOiii+JHP/pRvP322+t9H/I56KCD4oorroh69eqtsVfh6quvjgEDBsRz\nzz0XS5cuzb0AtVevXnHNNddE165dY+nSpXHWWWet156DdSkrK4uePXvG1KlTo3///lGnTp0444wz\n4rLLLot33nknjjjiiAqfMopY+WLybbbZJk4//fQYOXJkNG3aNHbcccdqCcLjjz8+evToEd26dYs2\nbdrEeeedF9ddd13cfvvta7381ltvHT169Ihzzjkndthhh9hhhx1i8eLFERExZMiQuOmmm6Ju3bpR\np06dGDRoUJXM9/7770fXrl1jxYoV0bFjx2jbtu0aH3twzjnnxMcffxxnnXVWLF++PI455pho2rRp\n/Nu//Vv07t07GjVqFCtWrIjevXtHRMThhx8eAwcOjH79+kWnTp1+8JywvhxtG9horf7usKo0d+7c\n6NKlSzz88MO5164AafOUE7BZGTVqVJxzzjlx+eWXixnYhNhDAwAkzx4aACB5ggYASJ6gAQCSJ2gA\ngOQJGgAgeYIGAEje/wPIYR5Ga4ET/wAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<Figure size 576x576 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"metadata": {
|
|
"id": "WPWUeYTTiT-m",
|
|
"colab_type": "code",
|
|
"outputId": "017b16b4-bee5-4ec5-b9d4-5b890def50b0",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 581
|
|
}
|
|
},
|
|
"cell_type": "code",
|
|
"source": [
|
|
"# Feature importance based on TRAINING set\n",
|
|
"\n",
|
|
"perm_test = PermutationImportance(model, scoring=make_scorer(roc_auc_score),\n",
|
|
" n_iter=50, random_state=RANDOM_STATE, cv=\"prefit\")\n",
|
|
"\n",
|
|
"# fit and see the permuation importances\n",
|
|
"perm_test.fit(X_train, y_train)\n",
|
|
"\n",
|
|
"imp_df = eli5.explain_weights_df(perm_test)\n",
|
|
"label_df = pd.DataFrame({'feature': [ \"x\" + str(i) for i in range(len(X_test.columns))], 'feature_name': X_test.columns.values})\n",
|
|
"imp_df = pd.merge(label_df, imp_df, on='feature', how='inner', validate=\"one_to_one\")\n",
|
|
" \n",
|
|
"# Reorder by importance\n",
|
|
"ordered_df = imp_df.sort_values(by='weight')\n",
|
|
"imp_range=range(1,len(imp_df.index)+1)\n",
|
|
" \n",
|
|
"\n",
|
|
"## Barplot with confidence intervals\n",
|
|
"\n",
|
|
"height = ordered_df['weight']\n",
|
|
"bars = ordered_df['feature_name']\n",
|
|
"ci = 1.96 * ordered_df['std']\n",
|
|
"y_pos = np.arange(len(bars))\n",
|
|
"\n",
|
|
"# Create horizontal bars\n",
|
|
"plt.barh(y_pos, height, xerr=ci)\n",
|
|
" \n",
|
|
"# Create names on the y-axis\n",
|
|
"plt.yticks(y_pos, bars)\n",
|
|
"\n",
|
|
"plt.xlabel(\"Permutation feature importance training set (decrease in AUC)\")\n",
|
|
"plt.tight_layout()\n",
|
|
"\n",
|
|
"# Show graphic\n",
|
|
"plt.show()\n"
|
|
],
|
|
"execution_count": 0,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAI0CAYAAADoV6h6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XmczvX+//HnNXOZMkwMZgaldDrR\nohLKkTZTaTnhEIVwHKUojoobc1pMJ5VdQgsxOPJFaKGjlTqnBZVCpKPFnmUwGMYyy/v3h9tcvxmz\nXDPjWuY1Pe63W7dbZq7rc70+7/nMZx4+12Uuj3POCQAAwKiIcA8AAABwOogZAABgGjEDAABMI2YA\nAIBpxAwAADCNmAEAAKZ5A73B1NT0QG8y6GJjo5WWlhHuMcoN1qMg1iQ/1iM/1qMg1iQ/1qOgotYk\nLi6m1Nviyowkrzcy3COUK6xHQaxJfqxHfqxHQaxJfqxHQYFcE2IGAACYRswAAADTiBkAAGAaMQMA\nAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAA\nMI2YAQAAphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnecA+A8qfNwHfCPQIABEVK\nUmK4R0AQcGUGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANGIGAACY\nRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANGIGAACYRswAAADTiBkAAGAa\nMQMAAEzz+rvBypUrNWDAAF144YWSpAYNGuipp54K+mAAAAAl4TdmJOnqq6/WhAkTgj0LAABAqfE0\nEwAAMK1EV2Z+/vln9enTRwcPHlS/fv3UsmXLYM8FADjF0qm9wz2CeU3nVw7L40ZEeJST48Ly2IG2\natW6cI9QgN+YqV+/vvr166fbb79d27ZtU48ePfThhx8qKiqq0NvHxkbL640M+KDBFhcXE+4RAABB\nFhHh+V0+diAF8udloLblN2YSEhJ0xx13SJLOPfdc1apVS7t371a9evUKvX1aWkZABguluLgYpaam\nh3sMACjWTfe/Fu4RzEtJSgzL41aknzOB2o+i1qQsgeP3NTOLFi3StGnTJEmpqanat2+fEhISSv1A\nAAAAweD3ykxiYqIGDRqkpUuXKjMzU08//XSRTzEBAACEmt+YqVq1ql599dVQzAIAAFBq/NNsAABg\nGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBp\nxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBp3nAPgPJn8dh2Sk1N\nD/cY5UpcXAxrkgfrkR/rURBrglDiygwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjED\nAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDTemwkFtBn4TrhHAFDBpCQlhnsEVGBcmQEAAKYRMwAA\nwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA\n04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmFaimNm4caNuvvlmvf7668Ge\nBwAAoFT8xkxGRoaGDRumFi1ahGIeAACAUvEbM1FRUXrttdcUHx8finkAAABKxev3Bl6vvF6/NwOA\n35WlU3uHewRTms6vHO4RwioiwqOcHFeq+6xatS5I01Q8Aa+U2Nhoeb2Rgd5s0MXFxYR7BACosCIi\nPOEeIexKuwa/h59LgdrHgMdMWlpGoDcZdHFxMUpNTQ/3GAAMuen+18I9gikpSYnhHiGsyvJzpqL/\nXCpqTcoSOPzTbAAAYJrfKzPr1q3TyJEjtWPHDnm9Xn3wwQeaOHGiqlevHor5AAAAiuU3Zho1aqRZ\ns2aFYhYAAIBS42kmAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZ\nAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YA\nAIBp3nAPgPJn8dh2Sk1ND/cY5UpcXAxrkgfrkR/rURBrglDiygwAADCNmAEAAKYRMwAAwDRiBgAA\nmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDTemwkFtBn4TrhHAHCKlKTE\ncI8AlFtcmQEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYR\nMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbM\nAAAA00oUM4sWLVLbtm3VoUMHffrpp0EeCQAAoOT8xkxaWppeeukl/d///Z9effVVLV26NBRzAQAA\nlIjX3w2WL1+uFi1aqGrVqqpataqGDRsWirkAAABKxG/MbN++XceOHVOfPn106NAh9e/fXy1atAjF\nbABQqKVTe4d7hJBrOr9yuEcolYgIj3Jy3GlvZ9WqdQGYBhWd35iRpAMHDmjSpEn67bff1KNHD33y\nySfyeDyF3jY2Nlpeb2RAhwyFuLiYcI8AAEWKiCj8nFueBWLminRurkj7EiiBWhO/MVOzZk1deeWV\n8nq9Ovfcc1WlShXt379fNWvWLPT2aWkZARkslOLiYpSamh7uMQCU0E33vxbuEUIuJSkx3COUSqDO\nqxXl3MzPmYKKWpOyBI7fFwBfe+21WrFihXJycpSWlqaMjAzFxsaW+oEAAACCwe+VmYSEBN166626\n++67JUlPPvmkIiL49TQAAKB8KNFrZjp37qzOnTsHexYAAIBS4xILAAAwjZgBAACmETMAAMA0YgYA\nAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYAAJhGzAAAANOIGQAA\nYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0b7gHQPmzeGw7paamh3uMciUuLoY1yYP1yI/1\nAMKLKzMAAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYA\nAJhGzAAAANN4byYU0GbgO+EeAQiYlKTEcI8AIMi4MgMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADA\nNGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANGIGAACYRswAAADT\niBkAAGAaMQMAAEwjZgAAgGnEDAAAMM3r7wbz58/XokWLfH9et26dvvvuu6AOBQAAUFJ+Y6ZTp07q\n1KmTJOmrr77Se++9F/ShAAAASqpUTzO99NJLeuihh4I1CwAAQKn5vTKTa+3atapTp47i4uKCOQ+A\nMlo6tXe4RyiXms6vHPTHiIjwKCfHBf1xAm3VqnXhHgEIiBLHzIIFC9S+fXu/t4uNjZbXG3laQ4VD\nXFxMuEcAEAQREZ4K9TiBFOzzHufV/FiPggK1Jh7nXIn+OnHrrbdq8eLFioqKKvZ2qanpARkslOLi\nYkzOHSy9RiwL9whAwKQkJQb9MTiHFMSa5Md6FFTUmpQlcEr0mpndu3erSpUqfkMGAAAg1EoUM6mp\nqapRo0awZwEAACi1EsVMo0aNNHXq1GDPAgAAUGr8BmAAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAA\nphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANGIGAACY\nRswAAADTiBkAAGAaMQMAAEwjZgAAgGnecA+A8mfx2HZKTU0P9xjlSlxcDGuSB+sBoDzhygwAADCN\nmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDTe\nmwkFtBn4TrhHCIqUpMRwjwAACAKuzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMA\nAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYAAJhGzAAA\nANOIGQAAYBoxAwAATCNmAACAaSWKmWPHjunmm2/Wm2++Gex5AAAASqVEMfPKK6+oWrVqwZ4FAACg\n1PzGzC+//KKff/5ZN954YwjGAQAAKB2vvxuMHDlSTz31lN5+++1QzIMAadq0UZnvu/fg0QBOUn40\nnV+5zPeNiPAoJ8cFcJryY9WqdeEeAQBOS7Ex8/bbb6tx48aqV69eiTcYGxstrzfytAcLtbi4mHCP\nEFAREZ5wj1DunO6aVNQ1LeuxX9G+Z04X61EQa5If61FQoNak2Jj59NNPtW3bNn366afatWuXoqKi\nVLt2bV1zzTVF3ictLSMgg4VSXFyMUlPTwz1GQH399fdlvm+vEcsCOEn5kZKUWOb7VsRjJFdZ9qsi\nr0dZsB4FsSb5sR4FFbUmZQmcYmNm/Pjxvv+fOHGizj777GJDBgAAINT4PTMAAMA0vy8AztW/f/9g\nzgEAAFAmXJkBAACmETMAAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACm\nETMAAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYAAJjm\nDfcAKH8Wj22n1NT0cI8BAECJcGUGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAA\nphEzAADANGIGAACYRswAAADTiBkAAGAa782EAtoMfCfcIwRESlJiuEcAAIQAV2YAAIBpxAwAADCN\nmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRi\nBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKZ5S3Kj559/XmvWrJHH49Hjjz+u\nyy+/PNhzAQAAlIjfmPnqq6+0ZcsWzZs3T7/88osef/xxzZs3LxSzAQAA+OX3aably5fr5ptvliRd\ncMEFOnjwoA4fPhz0wQAAAErC75WZvXv36tJLL/X9uUaNGkpNTVXVqlWDOhiCr2nTRoV+fO/BoyGe\nJDiazq8csG1FRHiUk+MCtr1AWLVqXbhHAIByoUSvmcnLueJP6LGx0fJ6I8s8ULjExcWEe4SQi4jw\nhHuEoAr0/pW39Qr3MRvuxy9vWI+CWJP8WI+CArUmfmMmPj5ee/fu9f15z549iouLK/L2aWkZARks\nlOLiYpSamh7uMULu66+/L/TjvUYsC/EkwZGSlBiwbZXHYySc85TH9Qgn1qMg1iQ/1qOgotakLIHj\n9zUzLVu21AcffCBJWr9+veLj43mKCQAAlBt+r8w0adJEl156qTp37iyPx6Pk5ORQzAUAAFAiJXrN\nzKBBg4I9BwAAQJnwG4ABAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABM\nI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCN\nmAEAAKZ5wz0Ayp/FY9spNTU93GMAAFAiXJkBAACmETMAAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAA\nTCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYAAJjGezMZ0mvEspA8zuKx7ULyOAAABAJXZgAAgGnE\nDAAAMI2YAQAAphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEz\nAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAAphEzAADANG9JbjRq1Cit\nWrVKWVlZevDBB9W6detgzwUAAFAifmNmxYoV+umnnzRv3jylpaWpffv2xAwAACg3/MbMVVddpcsv\nv1ySdNZZZ+no0aPKzs5WZGRk0IcDAADwx2/MREZGKjo6WpK0YMECXX/99RUuZOrXr6+cHBfuMfza\ne/BoSB6n/sIBp7Ueq1atC+A0AAAUz+OcK9FPrY8//liTJ09WSkqKYmJiirxdVla2vF5bsVO/fv1w\nj1Aie9IyQvI48bHRp3X/zZs3B2YQAABKoEQx89lnn+nFF1/U1KlTVb169WJvm5qaHrDhQiUuLsbE\n3L1GLAvJ4ywe287EeoSSlWMkVFiP/FiPgliT/FiPgopak7i4oi+YFMXv00zp6ekaNWqUZsyY4Tdk\nAAAAQs1vzCxZskRpaWl65JFHfB8bOXKk6tatG9TBAAAASsJvzNxzzz265557QjELAABAqfEbgAEA\ngGnEDAAAMI2YAQAAphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAA\nphEzAADANGIGAACYRswAAADTiBkAAGAaMQMAAEwjZgAAgGnEDAAAMI2YAQAApnnDPQBKLiUpMdwj\nAABQ7nBlBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbM\nAAAA04gZAABgGu/NFCa9RiwL9whFWjy2XbhHAACgxLgyAwAATCNmAACAacQMAAAwjZgBAACmETMA\nAMA0YgYAAJhGzAAAANOIGQAAYBoxAwAATCNmAACAacQMAAAwjZgBAACmETMAAMA0YgYAAJhGzAAA\nANOIGQAAYBoxAwAATCNmAACAacQMAAAwzevvBkePHlVSUpL27dun48eP66GHHlKrVq1CMRsAAIBf\nfmPmk08+UaNGjdS7d2/t2LFDvXr1ImYAAEC54Tdm7rjjDt//79y5UwkJCUEdCAAAoDT8xkyuzp07\na9euXXr11VeDOY9fTZs2Cvg2IyI8yslxAd9ucfYePBrSxyuN+gsHlGg9Vq1aF4JpAAAonsc5V+Kf\n4hs2bNDgwYO1aNEieTyeQm+TlZUtrzcyYAOeqn79+kHbdijtScsI9whFio+NLtHtNm/eHNxBAAAo\nAb9XZtatW6eaNWuqTp06uvjii5Wdna39+/erZs2ahd4+Lcg/pL/++vuAbzMuLkapqekB325xeo1Y\nFtLHK43FY9uVaD1CvWbhFI5jpDxjPfJjPQpiTfJjPQoqak3i4mJKvS2//zT7m2++UUpKiiRp7969\nysjIUGxsbKkfCAAAIBj8xkznzp21f/9+de3aVQ888ICGDh2qiAh+PQ0AACgf/D7NdOaZZ2rs2LGh\nmAUAAKDUuMQCAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABM\nI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwAADDN\nG+4Bfq9SkhLDPQIAABUCV2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjED\nAABMI2YAAIBpxAwAADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgGjEDAABMI2YAAIBpxAwA\nADCNmAEAAKYRMwAAwDRiBgAAmEbMAAAA04gZAABgmsc558I9BAAAQFlxZQYAAJhGzAAAANOIGQAA\nYBoxAwAATCNmAACAacQMAAAwzRvuAYIpMzNTSUlJ+u233xQZGanhw4erXr16+W6zaNEizZw5UxER\nEbr77rvVqVMnZWVl6YknntDWrVuVnZ2twYMHq1mzZurevbsyMjIUHR0tSRoyZIgaNWoUjl0rteef\nf15r1qyRx+PR448/rssvv9z3uS+//FLjxo1TZGSkrr/+ej388MNF3mfnzp0aPHiwsrOzFRcXp9Gj\nRysqKipcu1VmZVmPUaNGadWqVcrKytKDDz6o1q1bKykpSevXr1f16tUlSffdd59uvPHGcOzSaSvt\nmqxcuVIDBgzQhRdeKElq0KCBnnrqqd/tMTJ//nwtWrTId5t169bpu+++M33eyKu49Th+/LiGDh2q\nn376SW+++Wax96kox4dUtjWpyOeR0q5HQM8hrgJ788033dNPP+2cc+6zzz5zAwYMyPf5I0eOuNat\nW7tDhw65o0ePuj//+c8uLS3NLViwwCUnJzvnnNu4caO76667nHPOdevWzf3vf/8L6T4EwsqVK90D\nDzzgnHPu559/dnfffXe+z99+++3ut99+c9nZ2a5Lly7up59+KvI+SUlJbsmSJc4558aOHetmz54d\nwj0JjLKsx/Lly93999/vnHNu//797oYbbnDOOTdkyBC3bNmykM4fDGVZkxUrVrj+/fsX2Nbv9Rg5\n9f655x6r5428/K3HM88846ZPn+7at2/v9z4V4fhwrmxrUpHPI2VZj0CeQyr000zLly/XLbfcIkm6\n5ppr9O233+b7/Jo1a3TZZZcpJiZGZ555ppo0aaJvv/1Wbdu21T/+8Q9JUo0aNXTgwIGQzx5Iy5cv\n18033yxJuuCCC3Tw4EEdPnxYkrRt2zZVq1ZNderUUUREhG644QYtX768yPusXLlSN910kySpVatW\nWr58eXh26jSUZT2uuuoqvfjii5Kks846S0ePHlV2dnbY9iHQyrImRfm9HiN5vfTSS3rooYdCPnew\nFLcekvToo4/6Pu/vPhXh+JDKtiYV+TxSlvUoSlmOkQodM3v37lWNGjUkSREREfJ4PDpx4kShn5dO\nhktqaqoqVaqkM844Q5I0c+ZM3Xnnnb7bTJgwQffee6+GDh2qY8eOhWhPTs/evXsVGxvr+3PufkpS\nampqoWtQ1H2OHj3qu9xXs2ZN33YsKct6REZG+p4mWLBgga6//npFRkZKkl5//XX16NFDjz76qPbv\n3x/CPQmcsqyJJP3888/q06ePunTpoi+++EKSfrfHSK61a9eqTp06iouL833M4nkjr+LWQ5KqVq1a\n4vtUhONDKtuaVOTzSFnWQwrcOaTCvGZm/vz5mj9/fr6PrVmzJt+fnZ93bjj187Nnz9b69ev16quv\nSpJ69Oihhg0b6txzz1VycrJmz56t++67LwDTh5a/dSjpfcqynfKoNPvx8ccfa8GCBUpJSZEktWvX\nTtWrV9fFF1+sKVOmaNKkSRo6dGiwRg2ZkqxJ/fr11a9fP91+++3atm2bevTooQ8//LDU27GgNPux\nYMECtW/f3vfninLeyItzSEGcR/IL9TmkwlyZ6dSpk9544418/7Vv395XdJmZmXLO5XsRUXx8vPbu\n3ev78549exQfHy/pZBwtW7ZML7/8sipVqiRJuuWWW3TuuedKkhITE7Vx48ZQ7d5pKWw/c//WeOrn\ndu/erfj4+CLvEx0d7fubZe5trSnLekjSZ599pldffVWvvfaaYmJiJEktWrTQxRdfLMnWMXGqsqxJ\nQkKC7rjjDnk8Hp177rmqVauWdu/e/bs+RqSTl8ivvPJK35+tnjfyKm49SnufinB8SGVbE6ninkfK\nsh6BPIdUmJgpTMuWLfX+++9Lkj755BM1b9483+evuOIKff/99zp06JCOHDmib7/9Vs2aNdO2bds0\nd+5cTZo0yfd0k3NOPXv21KFDhySdPGHlvgK7vGvZsqU++OADSdL69esVHx/vu+R3zjnn6PDhw9q+\nfbuysrL0ySefqGXLlkXe55prrvF9/MMPP9R1110Xnp06DWVZj/T0dI0aNUqTJ0/2/YsDSerfv7+2\nbdsmydYxcaqyrMmiRYs0bdo0SSefetm3b58SEhJ+t8eIdPLEW6VKFd9fmiyfN/Iqbj1Ke5+KcHxI\nZVuTinweKct6BPIcUqHfNTs7O1tPPvmkNm/erKioKI0YMUJ16tTRlClTdNVVV+nKK6/U+++/r2nT\npsnj8ahbt25q27atxo0bp3//+9+qW7eub1vTpk3Txx9/rKlTp6py5cpKSEjQc889p8qVK4dxD0tu\nzJgx+uabb+TxeJScnKwffvhBMTExuuWWW/T1119rzJgxkqTWrVv7LoGfep+LLrpIe/bs0ZAhQ3T8\n+HHVrVtXw4cP9125sqS06zFv3jxNnDhR559/vm8bI0eO1NatWzV69GhVrlxZ0dHRGj58uGrWrBmu\n3TotpV2Tw4cPa9CgQTp06JAyMzPVr18/3XDDDb/bY0Q6+c+xx48fr6lTp/q2s2TJErPnjbyKW4+/\n//3v2rVrl3766Sc1atRId999t9q0aVOhzyFS6dckIyOjQp9HSrserVq1Ctg5pELHDAAAqPgq9NNM\nAACg4iNmAACAacQMAAAwjZgBAACmETMAAMA0Ygb5bN++XY0aNVL37t3VvXt3de7cWQMHDvT9noxQ\n2L17d4nei+Odd96RJG3YsEHDhg077cc9dOiQ7rzzzjK/p87ixYuVk5Nz2nOcqnv37iF9/5bcdQ21\n0j5uSb7uU6ZM0aeffnoaU5VNccfCpEmTfL9bI68uXbpo5cqVwR4toMpybK5du1YNGzbUv//973wf\nT0xM1JYtW/J9bNCgQb53WM7MzNQLL7ygNm3aqEuXLurQoYNmzZolSZoxY4bGjx9/GnsC64gZFFCj\nRg3NmjVLs2bN0ty5cxUfH69XXnklZI+/cuVKrVixotjb7N69W3PnzpUkXXzxxXrqqadO+3E3btyo\nypUr6+WXXy7T/SdOnBiUmJk1a5bv/VuCLTs7u8z7H+rHLcnX/YEHHtCNN954GpOVTVHHwtq1a/XF\nF1+YfzuDXGU5NhcsWKAGDRr4IqWkxo0bpx07dmjhwoWaM2eOpk+frsWLF+vtt99Wz549tXLlSq1e\nvbpU20TFUWHemwnBc9VVV2nevHmSpB9//FEjR45UVlaWMjMzNXToUF1yySXq3r27LrroIm3YsEEz\nZ85Us2bN1LdvXy1btkyZmZnq06eP3njjDW3atElPP/20rr32WnXv3l19+/bVNddco+3bt6tr166a\nPXu2xo8fL+ecqlevrjZt2mjXhc4tAAAO5UlEQVTw4MHKysrS4cOH1aNHD/3lL3/RwIEDtXHjRg0e\nPFh33XWXxo8frzlz5mjTpk1KTk6Wc05ZWVkaOHCgmjVrpqSkJMXHx2vjxo3atGmTOnbsqN69e/v2\n8ciRIxo2bJi2b9+ufv36adKkSRo3bpy+/fZbHTt2TFdddZUGDx4s55ySk5P166+/6sSJE7riiiv0\n5JNPasKECdqyZYt69uypSZMmqXnz5lq/fr28Xq/efPNNffnllxozZowSExN970MyYcIELVmyRK+/\n/rqcc6pRo4aeffbZfG/WJkkNGzbU+vXr9corr/jeBPTHH39U7969tWHDBq1bt84XnF999ZXGjx+v\nunXraseOHYqJidELL7ygqlWrasGCBZo7d64qV66smjVr6tlnn1XVqlXVpEkTdezYUTk5OUpPT9eO\nHTvUq1cvpaSk6MUXX/RdJatdu7ZGjx6tSpUqqWnTpurTp48+++wzpaamavz48WrYsKHWrFmj559/\nXpUqVVK1atU0cuRIVa1atdC19Hg8vn18/PHHfY/7zDPPqG/fvmrQoIEuvPBC9ejRQ0OGDNGBAwd0\n5MgR3XbbbXrggQe0cuVK39e9e/fuatGihb777jtt3rxZ/fv3V9u2bZWUlKSmTZuqRYsW6tu3r669\n9lqtXbtWR44c0eTJk5WQkKAFCxZo5syZqlGjhpo1a6Yvv/xSc+bMyfc1mDlzphYtWqTKlSvrzDPP\n1OjRoxUbG6tZs2bpvffeU3Z2tv7whz8oOTlZU6ZMyXcs5P1Nr6+88op69uwp6eSb6T366KNKS0vT\neeedp+PHj/tuV9h2zzzzTM2fP19z5sxRpUqV1Lx5cz322GNKSkpSVFSUNm3apDFjxigtLa3Q79Fv\nvvlGY8aMUVRUlI4dO6bk5GRdeumlWrJkiaZNm6bo6Gg55zR8+HDVq1ev1MfmgQMHtGvXLm3ZskXN\nmzcvNDSPHj2qJUuWaNasWeratat27dql2rVr+z0HZWRkaP78+Vq6dKnvtytXq1ZN06ZNU5UqVSRJ\n9913n6ZMmRKWGEc54IA8tm3b5q677jrfn7OyslxSUpKbPHmyc865O++8023ZssU559yGDRtc+/bt\nnXPOdevWzY0bN853vwYNGrgvvvjC97mkpCTnnHMLFy50ffv29X089zZ5H3fChAm+ba1fv959/PHH\nzjnndu/e7a6++mrnnHMrVqxwnTt3LvD/vXr1ckuWLHHOOffjjz+6xMRE55xzQ4YMcY888ohzzrnt\n27e7Jk2aFNj3vNtZsmSJGzx4sO9zDz30kFu6dKnbv3+/mzVrlu/jt956q/vf//7n2+fMzMwC/79w\n4UI3cOBA55xzrVq1cm+88YZzzrnffvvNtWnTxh0/ftw559yMGTPc8OHDC8yVu60JEya4e++91+Xk\n5LgVK1a4Sy65xG3ZssXl5OS4Vq1auR9++MGtWLHCXXbZZW7Xrl3OOecGDRrkZs6c6Xbs2OGuv/56\nl56e7pxzbsSIEW7ixInOOecaNmzoPv/88wJfh8zMTDd58mSXnZ3tW9tly5b5Zvr000+dc85NnDjR\nDRs2zDnn3C233OJbj+nTp7t33323yLXMK+/jbtu2zV188cXul19+cc45t3XrVvfWW28555w7fvy4\na9KkiUtPT8/39erWrZsbPXq0c865lStXujZt2jjnTn7d33jjDd82N27c6JxzLikpyU2fPt2lp6e7\nq6++2qWmpjrnnHvsscd828yrSZMmvtv897//dT/++KNbs2aN6969u8vJyXHOOffcc8+5f/3rXwW+\n/rmysrJc48aNfV+DuXPnugEDBjjnTh7bjRo1citWrChyu9u3b3eJiYnu6NGjvn375Zdf3JAhQ3zH\nl3NFf49+9NFHbsOGDc455xYvXuz69+/vnHOuTZs2bvXq1c4551avXu2+/vrrMh2bnTt3dllZWe7o\n0aOucePG7sCBAwVu/9Zbb7lu3br51vrll1/2fa5Vq1Zu8+bN+W4/cOBAt3DhQrdhwwZ35513Fthe\nXunp6a5x48YuKyur2NuhYuLKDArYv3+/unfvLknKyclRs2bN1LNnT+3bt0+bNm3SE0884bvt4cOH\nfZfTmzRpkm87TZs2lXTyzcRyP1e7dm2lp6eXeJb4+HhNnTpVU6dOVWRkpA4cOFDs7desWaMXXnhB\n0sm/NR4+fFj79++XJF199dWSpLPPPluHDx9WdnZ2kZfIcy9Z565Denq6tm/frhtuuEE7d+7UPffc\no6ioKKWmpiotLa3E+yPJ9yaE3333nVJTU31POZw4cULnnHNOsfdt3LixPB6PateurZo1a/rewDAh\nIcG3rn/84x+VkJAg6eTXZMOGDapbt64uvfRS33ulXH311b6n6ZxzBb52kuT1ehUREaGuXbvK6/Xq\n119/zbevf/rTnyRJdevW1ZYtW7R//34dOnRIDRo0kCTfFYinn3660LUsTrVq1fSHP/xBklSzZk2t\nWrVKc+fOVaVKlXT8+PFCj4Pcr2/dunV18ODBAp+PjY31vedN3bp1deDAAW3atEl169ZVrVq1JJ18\na4IZM2YUuG/Hjh11//3369Zbb9Vtt92m888/X6+99pq2bt2qHj16SDp59cDrLfqUeuDAAVWqVMn3\nNdi4caPveyQ+Pt63vytXrix0u99//70uvfRSnXnmmZKkESNG+Lade0wV9z1aq1YtjRo1SsePH1d6\nerqqVasmSerQoYOSkpLUunVrtW7dWldccYWWLFlS6mOzadOmioyMVGRkpGJjY3Xw4EHfY+RasGCB\nOnbs6FvT5ORk9e3bt9jtejweRURE+H1tTtWqVRUVFaX9+/eX6A0fUbEQMygg9zUzp4qKilKlSpUK\n/ZykAu+dkTcU/D2vnpmZWejHx48fr/POO0/jxo3TkSNHCv2hm1fepy5O/dipP2hcMe/kERUVpbvv\nvrvAaxsWLVqk77//XrNnz5bX61WHDh2KnUcquG+56xQVFaXLL79ckydP9ruNXHnXsaj9ybtfzrlC\n1+TUjxf2vierVq3SwoULtXDhQkVHR+vvf/97kbPkbq+wNS1qLYuTd56ZM2fqxIkTmjNnjjweT4E3\njM2Vdz0Km+PUY9A5V2AdijpO//GPf2jHjh36z3/+o4cfflhDhgxRVFSUEhMTNXTo0BLv16mPHxHx\n/1+2mPuXgqK2+8EHHxR5zOY+9VLc9+jgwYP1z3/+Uy1atNAnn3yilJQUSSej884779Rnn32moUOH\nqlOnTqpVq9ZpHZu5+5fX5s2btXr1ah08eFDTp0+Xc047d+7UN998o2bNmqlKlSoFInTfvn2KiYnR\neeedpz179mjv3r2+8JROvnbOOVeip6pQsfECYJRYTEyMzjnnHP3nP/+RJG3atEmTJk0q8/aqVq2q\nnTt3SlK+F/x6PB5lZWVJkvbu3ev72/S7776riIgInThxQhEREb7b5HXFFVfo888/lyT98MMPql69\neoHn+UuiadOm+uijj3yPMWnSJG3evFn79u3T+eefL6/Xq3Xr1mnr1q06ceJEgbnz7ltR/0Llsssu\n09q1a5WamipJeu+99/Txxx+XetZT/frrr9qzZ4+kk0HSsGFDNWrUSOvXr9fhw4clSV9++aWuuOKK\nAvfNu6779u3T2WefrejoaO3YsUOrV6/27WthYmNjVb16da1du1aSlJKSotmzZxe5lkU97qn27dun\nCy64QB6PR0uXLtWxY8eKnaM06tWrp23btvl+iH700UcFbnPw4EFNnDhRderUUdeuXXXvvffq+++/\nV5MmTfTf//5XR44ckSTNnj1b3333naT8x0Ku6tWrKzMz0/c1uOCCC3y337lzpzZt2iRJRW4393jJ\nvf+AAQO0bt26fI9R3Pdo7vdSdna23n//fZ04cULZ2dkaM2aMYmJi1L59e/Xv319r1qwJyrG5cOFC\nderUSYsXL9Y777yjRYsW6eGHH9bChQslSbfeeqvmz5/vi7r169dr69atat68uc444wzde++9Sk5O\n1rFjxySd/NeHjzzyiO/cceTIEZ04cUI1atQ4rTlhE1dmUCojR47Us88+qylTpigrK0tJSUll3la3\nbt2UnJysd999N99bvDdr1kyPPvqoKlWqpG7dumnYsGGaP3++7rrrLrVo0UIDBw7UM888o3379ulv\nf/ub+vTp47vvU089peTkZM2ZM0dZWVkaNWpUmWZr3bq1Vq9erc6dOysyMlKXXHKJ6tWrp9tuu019\n+vRRt27d1KRJE/Xq1UvPPvus3njjDV133XW666679Morr+iBBx7Qfffdp/POO08XXXSRL2zySkhI\n0BNPPKEHH3zQ98LSkSNHlmnevP74xz9q3Lhx2rJli6pVq6a//OUvio6O1oABA/S3v/1NUVFRql27\nth577LEC942Pj1etWrXUoUMHzZw5UykpKerSpYsuvPBC9e/fXy+99FKRV0YkafTo0Xr++efl9XoV\nExOj0aNHq0qVKoWuZVGPe+oa3HXXXXrsscf0+eef66abblKbNm00aNAgDRky5LTXKjY2Vn369FGX\nLl18T8X99ttv+W5TrVo1HTlyRB07dtRZZ50lr9er5557TgkJCbr33nvVvXt3nXHGGYqPj/ddqct7\nLOQ+FRgZGak//elP+vLLL9W6dWu1a9dOy5YtU9euXXXOOefosssuk3QycgvbbuXKldWvXz/17NlT\nXq9XTZo0UaNGjQrsU1Hfo71799Zf//pX1a1bV/fdd58GDx6sWbNmKTY2Vp07d9ZZZ50lSXryyScD\nfmxmZ2frrbfe8l0NytWxY0f9+c9/VkZGhvr06aMXXnhBXbp0UVRUlKKiovTSSy8pJiZGkvTII49o\n2rRpvq+Dc05dunRR27ZtJUnLly9XixYtQvYv/1C+8K7ZQAWS91/4oGTefvtt3XjjjapevbqmT5+u\nTZs26ZlnngnKY61du1bDhw/n6xMEXbp00ZAhQ9S4ceNwj4Iw4MoMgN+1jIwM/fWvf1VMTIy8Xq+G\nDx8etMe6/PLL1bJlS02bNq3C/K6Z8mDGjBlq3rw5IfM7xpUZAABgGi8ABgAAphEzAADANGIGAACY\nRswAAADTiBkAAGAaMQMAAEz7f8NBhvmBa9yqAAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<Figure size 576x576 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |